tabby-agentdeck 1.2.6 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("rxjs"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal"));else if("function"==typeof define&&define.amd)define(["@angular/common","@angular/core","@angular/forms","rxjs","tabby-core","tabby-settings","tabby-terminal"],t);else{var i="object"==typeof exports?t(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("rxjs"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal")):t(e["@angular/common"],e["@angular/core"],e["@angular/forms"],e.rxjs,e["tabby-core"],e["tabby-settings"],e["tabby-terminal"]);for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(global,(e,t,i,n,o,a,s)=>(()=>{"use strict";var r={6100(e,t,i){var n=i(1601),o=i.n(n),a=i(6314),s=i.n(a)()(o());s.push([e.id,'agentdeck-settings-tab{display:grid;grid-template-columns:repeat(auto-fill, minmax(560px, 1fr));gap:0 32px;align-items:start}agentdeck-settings-tab>.form-line{min-width:0}agentdeck-settings-tab>.form-line>.header{min-width:0;overflow-wrap:anywhere}agentdeck-settings-tab>.form-line>.btn{flex-shrink:0;white-space:nowrap}agentdeck-settings-tab>h3,agentdeck-settings-tab>.text-muted{grid-column:1/-1}body.agentdeck-active.ad-bg-clip .content-tab-active::before{left:var(--ad-bg-left) !important;top:var(--ad-bg-top) !important;right:auto !important;bottom:auto !important;width:var(--ad-bg-width) !important;height:var(--ad-bg-height) !important}#agentdeck-sidebar{display:flex;flex-direction:column;z-index:5;overflow:hidden;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127));font-size:12px;user-select:none;-webkit-app-region:no-drag}#agentdeck-sidebar.ad-dock-right{border-left:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-left{border-right:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-top{border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-bottom{border-top:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-top .ad-list,#agentdeck-sidebar.ad-dock-bottom .ad-list{display:flex;flex-wrap:wrap;align-content:flex-start;gap:0 6px;overflow-y:auto}#agentdeck-sidebar.ad-dock-top .ad-tab,#agentdeck-sidebar.ad-dock-bottom .ad-tab{flex:0 0 220px;min-width:0}#agentdeck-sidebar.ad-dock-top .ad-group-head,#agentdeck-sidebar.ad-dock-bottom .ad-group-head{flex:0 0 100%;margin-top:2px}#agentdeck-sidebar.ad-dock-top .ad-resume-drawer,#agentdeck-sidebar.ad-dock-bottom .ad-resume-drawer{display:none}#agentdeck-sidebar .ad-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;letter-spacing:.12em;font-size:10px;font-weight:700;color:rgba(255,255,255,.4);-webkit-app-region:no-drag;cursor:grab}#agentdeck-sidebar .ad-head:active{cursor:grabbing}#agentdeck-sidebar .ad-resize{position:absolute;z-index:6;background:rgba(0,0,0,0);transition:background .12s ease}#agentdeck-sidebar .ad-resize:hover,body.ad-resizing #agentdeck-sidebar .ad-resize{background:rgba(97,175,239,.5)}#agentdeck-sidebar .ad-resize-right,#agentdeck-sidebar .ad-resize-left{top:0;bottom:0;width:6px;cursor:col-resize}#agentdeck-sidebar .ad-resize-right{left:0}#agentdeck-sidebar .ad-resize-left{right:0}#agentdeck-sidebar .ad-resize-top,#agentdeck-sidebar .ad-resize-bottom{left:0;right:0;height:6px;cursor:row-resize}#agentdeck-sidebar .ad-resize-bottom{top:0}#agentdeck-sidebar .ad-resize-top{bottom:0}#agentdeck-sidebar .ad-head-title{white-space:nowrap}#agentdeck-sidebar .ad-head-version{margin-left:4px;letter-spacing:0;font-weight:400}#agentdeck-sidebar .ad-head-count{-webkit-app-region:no-drag;display:flex;align-items:center;gap:6px;flex:0 0 auto;white-space:nowrap;letter-spacing:0;color:rgba(255,255,255,.55)}#agentdeck-sidebar .ad-cnt{padding:1px 6px;border-radius:8px;background:rgba(255,255,255,.08);color:var(--ad-color, rgba(255, 255, 255, 0.55));font-size:10px;line-height:1.3;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-list{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;padding:2px 6px 8px;scroll-behavior:auto}#agentdeck-sidebar .ad-list::-webkit-scrollbar{width:8px}#agentdeck-sidebar .ad-list::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:4px}#agentdeck-sidebar .ad-list::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.24)}#agentdeck-sidebar .ad-group-head{display:flex;align-items:center;gap:5px;margin:7px 0 2px;padding:2px 4px;border-radius:4px;color:rgba(255,255,255,.42);font-size:10px;font-weight:700;letter-spacing:.06em;cursor:pointer;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-group-head:first-child{margin-top:1px}#agentdeck-sidebar .ad-group-head:hover{background:rgba(255,255,255,.05);color:rgba(255,255,255,.7)}#agentdeck-sidebar .ad-group-head.collapsed .ad-group-count{background:rgba(255,255,255,.14);color:rgba(255,255,255,.75)}#agentdeck-sidebar .ad-group-caret{flex:0 0 auto;width:9px;font-size:9px;line-height:1;opacity:.75}#agentdeck-sidebar .ad-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#agentdeck-sidebar .ad-group-head.filter-open .ad-group-caret{opacity:.45}#agentdeck-sidebar .ad-group-count{flex:0 0 auto;padding:0 5px;border-radius:8px;background:rgba(255,255,255,.08);color:rgba(255,255,255,.55);font-size:9.5px;line-height:1.5;letter-spacing:0;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-tab{position:relative;display:flex;align-items:stretch;gap:8px;margin-bottom:3px;padding:7px 6px 7px 0;border-radius:5px;cursor:pointer;transition:background .1s ease}#agentdeck-sidebar .ad-tab:hover{background:rgba(255,255,255,.05)}#agentdeck-sidebar .ad-tab:hover .ad-close{opacity:.65}#agentdeck-sidebar .ad-tab.active{background:rgba(255,255,255,.1)}#agentdeck-sidebar .ad-tab.active .ad-title{color:#fff}#agentdeck-sidebar .ad-bar{flex:0 0 3px;border-radius:2px;background:var(--ad-color, #6b727d)}#agentdeck-sidebar .ad-body{flex:1 1 auto;min-width:0}#agentdeck-sidebar .ad-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.82);font-size:12.5px;line-height:1.35}#agentdeck-sidebar .ad-agent{display:inline-block;flex:none;margin-right:5px;vertical-align:-2px;opacity:.92}#agentdeck-sidebar .ad-agent svg{display:block}#agentdeck-sidebar .ad-meta{display:flex;align-items:center;gap:6px;margin-top:2px;font-size:10.5px;line-height:1.4;color:rgba(255,255,255,.45)}#agentdeck-sidebar .ad-badge{flex:0 1 auto;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ad-color, #6b727d);font-weight:600}#agentdeck-sidebar .ad-badge.pinned{text-decoration:underline dotted;text-underline-offset:2px}#agentdeck-sidebar .ad-subagents{flex:0 0 auto;padding:0 4px;border-radius:7px;background:rgba(86,182,194,.18);color:#56b6c2;font-weight:600;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-prompt{display:flex;align-items:center;margin-top:2px;min-width:0;font-size:11px;line-height:1.4}#agentdeck-sidebar .ad-label{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.6)}#agentdeck-sidebar .ad-label.empty{color:rgba(255,255,255,.25)}#agentdeck-sidebar .ad-elapsed{flex:0 0 auto;margin-left:auto;font-variant-numeric:tabular-nums;opacity:.55}#agentdeck-sidebar .ad-resume-drawer{flex:0 0 auto;display:flex;flex-direction:column;min-height:0;border-top:1px solid rgba(255,255,255,.07)}#agentdeck-sidebar .ad-resume-rows{max-height:200px;overflow-y:auto;overscroll-behavior:contain;padding:4px 4px 0}#agentdeck-sidebar .ad-resume-empty{padding:6px 8px;color:rgba(255,255,255,.3);font-size:11px}#agentdeck-sidebar .ad-resume-head{display:flex;align-items:center;gap:5px;margin:0;padding:6px 8px;border-radius:4px;color:rgba(255,255,255,.34);font-size:10px;font-weight:700;letter-spacing:.06em;cursor:pointer;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-resume-head:hover{background:rgba(255,255,255,.05);color:rgba(255,255,255,.6)}#agentdeck-sidebar .ad-resume-head .ad-group-count{background:rgba(255,255,255,.06);color:rgba(255,255,255,.45)}#agentdeck-sidebar .ad-resume-head .ad-group-caret{margin-left:auto}#agentdeck-sidebar .ad-resume{display:flex;align-items:stretch;gap:8px;margin:0 0 3px;padding:5px 6px 5px 0;border-radius:5px;cursor:pointer;opacity:.66;transition:background .1s ease,opacity .1s ease}#agentdeck-sidebar .ad-resume:hover{background:rgba(255,255,255,.05);opacity:1}#agentdeck-sidebar .ad-resume .ad-bar{background:#3a404b;background-image:linear-gradient(var(--ad-panel-bg, var(--bs-body-bg, #1e2127)) 50%, transparent 0);background-size:100% 5px}#agentdeck-sidebar .ad-resume .ad-title{font-size:12px;color:rgba(255,255,255,.72)}#agentdeck-sidebar .ad-resume .ad-meta{gap:5px;margin-top:1px;font-size:10px;color:rgba(255,255,255,.36)}#agentdeck-sidebar .re-was{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}#agentdeck-sidebar .re-was.s-done{color:rgba(152,195,121,.62)}#agentdeck-sidebar .re-was.s-error{color:rgba(224,108,117,.68)}#agentdeck-sidebar .re-was.s-limited{color:rgba(198,120,221,.62)}#agentdeck-sidebar .re-was.s-waiting{color:rgba(97,175,239,.62)}#agentdeck-sidebar .re-was.s-running{color:rgba(229,192,123,.62)}#agentdeck-sidebar .re-was.s-idle{color:rgba(255,255,255,.3)}#agentdeck-sidebar .re-was.live{padding:0 4px;border-radius:7px;background:rgba(229,192,123,.16);color:#e5c07b}#agentdeck-sidebar .re-when{flex:0 0 auto;margin-left:auto;padding-left:6px;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-resume.open{opacity:.9}#agentdeck-sidebar .ad-resume.open .ad-bar{background:#e5c07b;background-image:none}#agentdeck-sidebar .ad-label-input{flex:1 1 auto;min-width:0;padding:0 4px;border:1px solid rgba(255,255,255,.25);border-radius:3px;background:rgba(0,0,0,.35);color:#fff;font-size:10.5px;outline:none}#agentdeck-sidebar .ad-label-input:focus{border-color:var(--ad-color, #61afef)}#agentdeck-sidebar .ad-close{flex:0 0 auto;align-self:center;width:18px;height:18px;padding:0;border:0;border-radius:3px;opacity:0;background:rgba(0,0,0,0);color:rgba(255,255,255,.8);font-size:15px;line-height:1;cursor:pointer;transition:opacity .1s ease,background .1s ease}#agentdeck-sidebar .ad-close:hover{opacity:1 !important;background:rgba(255,80,80,.35)}#agentdeck-sidebar .ad-now{--ad-now-font: 18px;flex:0 0 auto;padding:12px 14px 14px;border-top:1px solid rgba(255,255,255,.07);font-size:var(--ad-now-font);line-height:1.5;min-width:0;overflow:hidden}#agentdeck-sidebar .ad-now-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.88);font-size:19px;font-weight:600}#agentdeck-sidebar .ad-now-account{display:block;width:100%;text-align:left;background:rgba(0,0,0,0);border:0;padding:3px 0;cursor:pointer}#agentdeck-sidebar .ad-now-account:hover,#agentdeck-sidebar .ad-now-account:focus-visible{color:#fff;outline:1px solid #61afef}#agentdeck-sidebar .ad-now-account:not(:disabled)::after{content:" ▾"}#agentdeck-sidebar .ad-now-account{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.45);font-size:16px}#agentdeck-sidebar .ad-now-gauges,.ad-account-picker .ad-now-gauges{display:flex;flex-direction:column;gap:6px;margin-top:9px}#agentdeck-sidebar .ad-now-gauge,.ad-account-picker .ad-now-gauge{--ad-gauge: rgba(97, 175, 239, 0.85);display:flex;align-items:center;gap:9px;color:rgba(255,255,255,.62);font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-now-gauge.ad-now-warn,.ad-account-picker .ad-now-gauge.ad-now-warn{--ad-gauge: #e5c07b;color:rgba(229,192,123,.9)}#agentdeck-sidebar .ad-now-gauge.ad-now-hot,.ad-account-picker .ad-now-gauge.ad-now-hot{--ad-gauge: #e06c75;color:#e06c75;font-weight:600}#agentdeck-sidebar .ad-now-gauge-key,.ad-account-picker .ad-now-gauge-key{flex:0 0 52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;letter-spacing:.02em}#agentdeck-sidebar .ad-now-bar,.ad-account-picker .ad-now-bar{position:relative;flex:1 1 auto;min-width:0;height:12px;border-radius:6px;background:rgba(255,255,255,.1);overflow:hidden}#agentdeck-sidebar .ad-now-bar-fill,.ad-account-picker .ad-now-bar-fill{display:block;height:100%;border-radius:6px;background:var(--ad-gauge);transition:width .3s ease}#agentdeck-sidebar .ad-now-gauge-pct,.ad-account-picker .ad-now-gauge-pct{flex:0 0 auto;min-width:46px;text-align:right;font-size:16px}#agentdeck-sidebar .ad-now-reset,.ad-account-picker .ad-now-reset{margin:-1px 0 4px;color:rgba(255,255,255,.4);font-size:14px;white-space:nowrap}#agentdeck-sidebar .ad-foot{display:flex;gap:6px;padding:8px;border-top:1px solid rgba(255,255,255,.07)}#agentdeck-sidebar .ad-btn{flex:1 1 auto;padding:5px 8px;border:1px solid rgba(255,255,255,.12);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.6);font-size:11px;cursor:pointer}#agentdeck-sidebar .ad-btn:hover{background:rgba(255,255,255,.08);color:#fff}#agentdeck-sidebar .ad-repair,#agentdeck-sidebar .ad-viewtoggle{flex:0 0 auto;min-width:28px;font-size:13px;line-height:1}#agentdeck-sidebar .ad-search{display:flex;flex:0 0 auto;gap:4px;align-items:center;padding:0 8px 6px;-webkit-app-region:no-drag}#agentdeck-sidebar .ad-search-input{flex:1 1 auto;min-width:0;padding:3px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;outline:none;background:rgba(0,0,0,.28);color:rgba(255,255,255,.85);font-size:11px;line-height:1.4}#agentdeck-sidebar .ad-search-input::placeholder{color:rgba(255,255,255,.3)}#agentdeck-sidebar .ad-search-input:focus{border-color:rgba(97,175,239,.7);color:#fff}#agentdeck-sidebar .ad-search-clear{display:none;flex:0 0 auto;width:18px;height:18px;padding:0;border:0;border-radius:3px;background:rgba(0,0,0,0);color:rgba(255,255,255,.45);font-size:14px;line-height:1;cursor:pointer}#agentdeck-sidebar .ad-search-clear:hover{background:rgba(255,255,255,.12);color:#fff}#agentdeck-sidebar .ad-search.has-query .ad-search-clear{display:block}#agentdeck-sidebar .ad-cnt{cursor:pointer;user-select:none;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-cnt:hover{background:rgba(255,255,255,.16)}#agentdeck-sidebar .ad-cnt.active{box-shadow:inset 0 0 0 1px var(--ad-color, #61afef);background:rgba(255,255,255,.2);color:var(--ad-color, #fff)}#agentdeck-sidebar .ad-empty{padding:10px 8px;color:rgba(255,255,255,.42);text-align:center;word-break:break-all;font-size:11px;line-height:1.5}#agentdeck-sidebar .ad-tab.ad-nav-focus,#agentdeck-sidebar .ad-group-head.ad-nav-focus{box-shadow:inset 0 0 0 1px rgba(97,175,239,.85);background:rgba(97,175,239,.1)}#agentdeck-sidebar .ad-tab.active.ad-nav-focus{background:rgba(255,255,255,.14)}#agentdeck-sidebar .ad-list:focus,#agentdeck-sidebar .ad-list:focus-visible{outline:none}#agentdeck-sidebar .ad-tab.ad-dragging{opacity:.45;background:rgba(255,255,255,.06);outline:1px dashed rgba(255,255,255,.28);outline-offset:-1px}#agentdeck-sidebar .ad-reorder-note{position:absolute;left:8px;right:8px;bottom:34px;z-index:3;padding:7px 9px;border:1px solid rgba(255,255,255,.12);border-radius:5px;background:rgba(38,42,49,.96);box-shadow:0 4px 14px rgba(0,0,0,.45);color:rgba(255,255,255,.78);font-size:11px;line-height:1.45;pointer-events:none}#agentdeck-sidebar.ad-dock-top .ad-search,#agentdeck-sidebar.ad-dock-bottom .ad-search{padding:0 8px 4px}#agentdeck-sidebar.ad-dock-top .ad-list .ad-empty,#agentdeck-sidebar.ad-dock-bottom .ad-list .ad-empty{flex:0 0 100%}#agentdeck-view{display:flex;flex-direction:column;z-index:5;overflow:hidden;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127));font-size:12px;-webkit-app-region:no-drag}#agentdeck-view.ad-view-right{border-left:1px solid rgba(255,255,255,.08)}#agentdeck-view.ad-view-left{border-right:1px solid rgba(255,255,255,.08)}#agentdeck-view.ad-view-dropping{outline:1px dashed rgba(97,175,239,.8);outline-offset:-3px}#agentdeck-view .ad-view-head{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:8px 8px 6px 12px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-title{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:rgba(255,255,255,.82);font-weight:600}#agentdeck-view .ad-view-tools{display:flex;flex:0 0 auto;gap:2px}#agentdeck-view .ad-view-btn{min-width:24px;padding:2px 5px;border:0;border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.5);font-size:12px;line-height:1.2;cursor:pointer}#agentdeck-view .ad-view-btn:hover{background:rgba(255,255,255,.1);color:#fff}#agentdeck-view .ad-view-btn.ad-view-btn-on{background:rgba(97,175,239,.22);color:#9ecbff}#agentdeck-view .ad-view-path{display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-path input{width:100%;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-path input:focus{outline:0;border-color:rgba(97,175,239,.7)}#agentdeck-view .ad-view-path-note{width:100%;overflow:hidden;color:rgba(229,192,123,.9);font-size:11px;text-overflow:ellipsis;white-space:nowrap}#agentdeck-view .ad-view-path-note:empty{display:none}#agentdeck-view .ad-view-find{display:flex;align-items:center;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-find input{flex:1 1 auto;min-width:0;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-find input:focus{outline:0;border-color:rgba(97,175,239,.7)}#agentdeck-view .ad-view-find-count{flex:0 0 auto;min-width:44px;color:rgba(255,255,255,.45);font-size:11px;text-align:right}#agentdeck-view mark.ad-find-hit{border-radius:2px;background:rgba(229,192,123,.35);color:inherit}#agentdeck-view mark.ad-find-cur{background:rgba(229,192,123,.85);color:#1a1a1a}#agentdeck-view .ad-view-editbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 8px;border-top:1px solid rgba(255,255,255,.06);background:rgba(0,0,0,.18)}#agentdeck-view .ad-view-edit-note{overflow:hidden;color:rgba(255,255,255,.5);font-size:11px;text-overflow:ellipsis;white-space:nowrap}#agentdeck-view .ad-view-edit-btns{display:flex;flex:0 0 auto;gap:4px}#agentdeck-view .ad-view-edit-save,#agentdeck-view .ad-view-edit-cancel{padding:2px 10px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.75);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-edit-save:hover:not(:disabled),#agentdeck-view .ad-view-edit-cancel:hover:not(:disabled){border-color:rgba(255,255,255,.3);background:rgba(255,255,255,.08);color:#fff}#agentdeck-view .ad-view-edit-save:disabled,#agentdeck-view .ad-view-edit-cancel:disabled{opacity:.35;cursor:default}#agentdeck-view .ad-view-edit-save{border-color:rgba(97,175,239,.5);color:#9ecbff}#agentdeck-view textarea.ad-view-edit{display:block;box-sizing:border-box;width:100%;height:100%;min-height:200px;padding:6px 8px;border:0;background:rgba(0,0,0,.22);color:#e6e6e6;font-family:monospace;font-size:12px;line-height:1.5;resize:none;tab-size:4}#agentdeck-view textarea.ad-view-edit:focus{outline:0}#agentdeck-view .ad-view-tabs{display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-tab{max-width:100%;overflow:hidden;padding:2px 7px;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);white-space:nowrap;text-overflow:ellipsis;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-tab:hover{color:#fff;border-color:rgba(255,255,255,.25)}#agentdeck-view .ad-view-tab.ad-view-tab-on{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-body{flex:1 1 auto;overflow:auto;padding:10px 12px 16px;color:rgba(255,255,255,.85);user-select:text}#agentdeck-view .ad-view-foot{flex:0 0 auto;overflow:hidden;padding:5px 10px;border-top:1px solid rgba(255,255,255,.06);color:rgba(255,255,255,.35);white-space:nowrap;text-overflow:ellipsis;font-size:10px}#agentdeck-view .ad-view-resize{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;z-index:6}#agentdeck-view.ad-view-right .ad-view-resize{left:-2px}#agentdeck-view.ad-view-left .ad-view-resize{right:-2px}#agentdeck-view .ad-view-empty{padding:8px 2px;color:rgba(255,255,255,.55);line-height:1.7}#agentdeck-view .ad-view-empty ul{padding-left:18px;margin:6px 0 0}#agentdeck-view .ad-view-empty li{margin:2px 0}#agentdeck-view .ad-view-dim{color:rgba(255,255,255,.35);font-size:11px}#agentdeck-view .ad-view-image{display:flex;align-items:flex-start;justify-content:center}#agentdeck-view .ad-view-image img{max-width:100%;height:auto;background:rgba(255,255,255,.04)}#agentdeck-view .ad-view-code{display:flex;gap:8px;font-family:monospace;font-size:11px;line-height:1.5}#agentdeck-view .ad-view-code pre{margin:0;white-space:pre}#agentdeck-view .ad-view-code .ad-view-gutter{flex:0 0 auto;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-view-code .ad-view-src{flex:1 1 auto;overflow-x:auto;color:rgba(255,255,255,.85)}#agentdeck-view .ad-view-table{overflow-x:auto}#agentdeck-view .ad-view-table table{border-collapse:collapse;font-size:11px}#agentdeck-view .ad-view-table th,#agentdeck-view .ad-view-table td{max-width:260px;overflow:hidden;padding:3px 6px;border:1px solid rgba(255,255,255,.08);white-space:nowrap;text-overflow:ellipsis}#agentdeck-view .ad-view-table th{position:sticky;top:0;background:#262a31;color:rgba(255,255,255,.7)}#agentdeck-view .ad-view-table .ad-view-rownum{color:rgba(255,255,255,.3);text-align:right}#agentdeck-view .ad-view-md{line-height:1.65;word-break:break-word}#agentdeck-view .ad-view-md h1,#agentdeck-view .ad-view-md h2,#agentdeck-view .ad-view-md h3,#agentdeck-view .ad-view-md h4,#agentdeck-view .ad-view-md h5,#agentdeck-view .ad-view-md h6{margin:1.1em 0 .5em;color:#fff;line-height:1.3}#agentdeck-view .ad-view-md h1{font-size:18px}#agentdeck-view .ad-view-md h2{font-size:16px;padding-bottom:3px;border-bottom:1px solid rgba(255,255,255,.1)}#agentdeck-view .ad-view-md h3{font-size:14px}#agentdeck-view .ad-view-md h4,#agentdeck-view .ad-view-md h5,#agentdeck-view .ad-view-md h6{font-size:13px}#agentdeck-view .ad-view-md p{margin:.6em 0}#agentdeck-view .ad-view-md a{color:#61afef;text-decoration:none;cursor:pointer}#agentdeck-view .ad-view-md a:hover{text-decoration:underline}#agentdeck-view .ad-view-md code{padding:1px 4px;border-radius:3px;background:rgba(255,255,255,.08);font-family:monospace;font-size:11px}#agentdeck-view .ad-view-md pre{overflow-x:auto;margin:.7em 0;padding:8px 10px;border:1px solid rgba(255,255,255,.07);border-radius:5px;background:rgba(0,0,0,.28)}#agentdeck-view .ad-view-md pre code{padding:0;background:rgba(0,0,0,0);line-height:1.5}#agentdeck-view .ad-view-md ul,#agentdeck-view .ad-view-md ol{padding-left:20px;margin:.5em 0}#agentdeck-view .ad-view-md li{margin:.15em 0}#agentdeck-view .ad-view-md .ad-md-task{list-style:none;margin-left:-14px}#agentdeck-view .ad-view-md .ad-md-check{color:rgba(255,255,255,.6)}#agentdeck-view .ad-view-md blockquote{margin:.7em 0;padding:2px 0 2px 10px;border-left:3px solid rgba(255,255,255,.18);color:rgba(255,255,255,.6)}#agentdeck-view .ad-view-md hr{margin:1.2em 0;border:0;border-top:1px solid rgba(255,255,255,.12)}#agentdeck-view .ad-view-md table{display:block;overflow-x:auto;border-collapse:collapse;margin:.7em 0;font-size:11px}#agentdeck-view .ad-view-md th,#agentdeck-view .ad-view-md td{padding:4px 8px;border:1px solid rgba(255,255,255,.1);text-align:left}#agentdeck-view .ad-view-md th{background:rgba(255,255,255,.05);color:#fff}#agentdeck-view .ad-view-md img{max-width:100%;border-radius:4px}#agentdeck-view .ad-view-md .ad-md-noimg{padding:1px 5px;border-radius:3px;background:rgba(255,255,255,.06);color:rgba(255,255,255,.45);font-size:11px}#agentdeck-view .ad-view-modes{display:flex;flex:0 0 auto;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-mode{flex:0 0 auto;padding:3px 12px;border:1px solid rgba(255,255,255,.1);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-mode:hover{border-color:rgba(255,255,255,.25);color:#fff}#agentdeck-view .ad-view-mode.ad-view-mode-on{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-scope{flex:0 0 auto;margin-left:auto;padding:3px 10px;border:1px dashed rgba(255,255,255,.18);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-scope:hover{border-color:rgba(255,255,255,.35);color:#fff}#agentdeck-view .ad-view-scope.ad-view-scope-all{border-style:solid;border-color:rgba(229,192,123,.5);color:#e5c07b}#agentdeck-view .ad-view-diff .ad-plus{color:#98c379}#agentdeck-view .ad-view-diff .ad-minus{color:#e06c75}#agentdeck-view .ad-view-diff-sum{padding-bottom:6px;color:rgba(255,255,255,.8);font-weight:600}#agentdeck-view .ad-view-diff-list{margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-view .ad-view-diff-item{display:flex;align-items:center;gap:6px;width:100%;padding:2px 4px;border:0;border-radius:3px;background:rgba(0,0,0,0);color:rgba(255,255,255,.7);text-align:left;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-diff-item:hover{background:rgba(255,255,255,.07)}#agentdeck-view .ad-view-diff-item .ad-view-diff-st{flex:0 0 auto;min-width:40px;color:rgba(255,255,255,.4);text-align:center;font-size:10px}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-added{color:#98c379}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-deleted{color:#e06c75}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-renamed{color:#61afef}#agentdeck-view .ad-view-diff-item .ad-view-diff-name{flex:1 1 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-family:monospace}#agentdeck-view .ad-view-diff-item .ad-view-diff-num{flex:0 0 auto}#agentdeck-view .ad-view-diff-item .ad-view-diff-num b{margin-left:5px;font-weight:500}#agentdeck-view .ad-view-diff-sub{margin:4px 0;color:rgba(255,255,255,.4);font-size:11px}#agentdeck-view .ad-view-diff-untracked{margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u{overflow:hidden;padding:1px 4px;color:rgba(255,255,255,.5);white-space:nowrap;text-overflow:ellipsis;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u[data-ad-open]{cursor:pointer}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u[data-ad-open]:hover{background:rgba(255,255,255,.07);color:#fff}#agentdeck-view .ad-view-diff-file{margin-bottom:14px}#agentdeck-view .ad-view-diff-fhead{position:sticky;top:0;z-index:1;overflow:hidden;padding:4px 6px;border:1px solid rgba(255,255,255,.08);border-radius:4px 4px 0 0;background:#262a31;color:rgba(255,255,255,.8);white-space:nowrap;text-overflow:ellipsis;font-family:monospace;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-diff-fhead:hover{color:#fff}#agentdeck-view .ad-view-diff-note{padding:4px 6px;border:1px solid rgba(255,255,255,.08);border-top:0;color:rgba(255,255,255,.35);font-size:11px}#agentdeck-view .ad-view-diff-lines{overflow-x:auto;border:1px solid rgba(255,255,255,.08);border-top:0;font-family:monospace;font-size:11px;line-height:1.5}#agentdeck-view .ad-dl{display:flex;min-width:100%;min-height:17px;white-space:pre}#agentdeck-view .ad-dl .ad-dl-no{flex:0 0 auto;width:38px;padding-right:6px;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-dl .ad-dl-tx{flex:1 0 auto;padding-right:8px;color:rgba(255,255,255,.8)}#agentdeck-view .ad-dl-add{background:rgba(152,195,121,.12)}#agentdeck-view .ad-dl-add .ad-dl-tx{color:#b7d99b}#agentdeck-view .ad-dl-del{background:rgba(224,108,117,.12)}#agentdeck-view .ad-dl-del .ad-dl-tx{color:#eda3a9}#agentdeck-view .ad-dl-hunk{background:rgba(97,175,239,.1)}#agentdeck-view .ad-dl-hunk .ad-dl-tx{color:rgba(97,175,239,.85)}#agentdeck-view .ad-view-stage{flex:0 0 auto;min-width:44px;padding:0 4px;border:1px solid rgba(255,255,255,.14);border-radius:3px;color:rgba(255,255,255,.45);text-align:center;font-size:10px;cursor:pointer}#agentdeck-view .ad-view-stage:hover{border-color:rgba(255,255,255,.4);color:#fff}#agentdeck-view .ad-view-stage-staged{border-color:rgba(152,195,121,.5);background:rgba(152,195,121,.14);color:#b7d99b}#agentdeck-view .ad-view-stage-both{border-color:rgba(229,192,123,.5);background:rgba(229,192,123,.12);color:#e5c07b}#agentdeck-view .ad-view-stage-conflict{border-color:rgba(224,108,117,.6);background:rgba(224,108,117,.14);color:#eda3a9}#agentdeck-view .ad-dl[data-ad-ref-line],#agentdeck-view .ad-dl[data-ad-ref-del],#agentdeck-view .ad-cl[data-ad-ref-line]{cursor:pointer}#agentdeck-view .ad-dl[data-ad-ref-line]:hover,#agentdeck-view .ad-cl[data-ad-ref-line]:hover{box-shadow:inset 2px 0 0 rgba(97,175,239,.55)}#agentdeck-view .ad-dl.ad-ref-sel,#agentdeck-view .ad-cl.ad-ref-sel{box-shadow:inset 2px 0 0 #61afef;background:rgba(97,175,239,.22)}#agentdeck-view .ad-dl.ad-ref-sel .ad-dl-no,#agentdeck-view .ad-dl.ad-ref-sel .ad-cl-no,#agentdeck-view .ad-cl.ad-ref-sel .ad-dl-no,#agentdeck-view .ad-cl.ad-ref-sel .ad-cl-no{color:rgba(255,255,255,.6)}#agentdeck-view .ad-dl.ad-ref-sel .ad-dl-tx,#agentdeck-view .ad-dl.ad-ref-sel .ad-cl-tx,#agentdeck-view .ad-cl.ad-ref-sel .ad-dl-tx,#agentdeck-view .ad-cl.ad-ref-sel .ad-cl-tx{color:#fff}#agentdeck-view .ad-view-code.ad-view-code-rows{display:block;overflow-x:auto}#agentdeck-view .ad-cl{display:flex;min-width:100%;min-height:17px;white-space:pre}#agentdeck-view .ad-cl .ad-cl-no{flex:0 0 auto;width:44px;padding-right:8px;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-cl .ad-cl-tx{flex:1 0 auto;padding-right:8px;color:rgba(255,255,255,.85)}#agentdeck-view .ad-view-ref{flex:0 0 auto;overflow:hidden;padding:4px 10px;border-top:1px solid rgba(255,255,255,.06);color:rgba(255,255,255,.5);white-space:nowrap;text-overflow:ellipsis;font-size:10px}#agentdeck-view .ad-view-ref-on{background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-commit{flex:0 0 auto;padding:6px 8px;border-top:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-commit-sum{margin-bottom:4px;color:rgba(255,255,255,.55);font-size:11px}#agentdeck-view .ad-view-commit-row{display:flex;gap:6px;align-items:center}#agentdeck-view .ad-view-commit-msg{flex:1 1 auto;min-width:0;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-commit-msg:focus{border-color:rgba(97,175,239,.6);outline:0}#agentdeck-view .ad-view-commit-go{flex:0 0 auto;padding:4px 10px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.7);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-commit-go:hover:not(:disabled){border-color:rgba(255,255,255,.35);color:#fff}#agentdeck-view .ad-view-commit-go:disabled{opacity:.45;cursor:default}#agentdeck-view .ad-view-commit-go.ad-view-commit-armed{border-color:rgba(224,108,117,.7);background:rgba(224,108,117,.18);color:#ffd7da}#agentdeck-view .ad-view-commit-note{margin-top:4px;overflow:hidden;color:rgba(255,255,255,.4);white-space:nowrap;text-overflow:ellipsis;font-size:11px}.ad-menu{position:fixed;z-index:10000;min-width:130px;padding:4px;border:1px solid rgba(255,255,255,.12);border-radius:6px;background:#262a31;box-shadow:0 6px 24px rgba(0,0,0,.5);font-size:12px;user-select:none}.ad-menu .ad-menu-item{padding:6px 10px;border-radius:4px;color:rgba(255,255,255,.75);cursor:pointer}.ad-menu .ad-menu-item:hover{background:rgba(255,255,255,.1);color:#fff}.ad-dock-overlay{position:fixed;inset:0;z-index:9998;pointer-events:none}.ad-dock-preview{position:fixed;display:none;border:1px solid rgba(97,175,239,.9);background:rgba(97,175,239,.22);box-shadow:0 0 0 9999px rgba(0,0,0,.18);transition:left .08s ease,top .08s ease,width .08s ease,height .08s ease}.ad-dock-zone{position:fixed;width:46px;height:46px;margin:-23px 0 0 -23px;border:1px solid rgba(255,255,255,.35);border-radius:6px;background:rgba(38,42,49,.92);box-shadow:0 4px 16px rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center}.ad-dock-zone .ad-dock-mark{width:26px;height:26px;border:1px solid rgba(255,255,255,.45);border-radius:3px}.ad-dock-zone.active{border-color:rgba(97,175,239,.95);background:rgba(97,175,239,.35)}.ad-dock-zone.ad-dock-zone-left .ad-dock-mark{border-left:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-right .ad-dock-mark{border-right:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-top .ad-dock-mark{border-top:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-bottom .ad-dock-mark{border-bottom:4px solid rgba(97,175,239,.95)}.ad-reorder-line{position:fixed;z-index:9997;border-radius:1px;background:rgba(97,175,239,.95);box-shadow:0 0 5px rgba(97,175,239,.6);pointer-events:none}body.ad-reordering{cursor:grabbing}body.ad-reordering #agentdeck-sidebar,body.ad-reordering #agentdeck-sidebar *{cursor:grabbing !important}body.ad-reordering .content.main{pointer-events:none}body.ad-resizing{cursor:inherit}body.ad-resizing .content.main{pointer-events:none}.ad-window-drag{display:none}body.agentdeck-active.ad-native-titlebar .ad-window-drag{display:block;position:fixed;top:0;left:0;right:0;height:32px;padding-left:12px;line-height:32px;font-size:11px;user-select:none;-webkit-app-region:drag;z-index:100;color:var(--bs-secondary-color, #a0a0a0);background:var(--bs-body-bg, #1e2127)}body.agentdeck-active.ad-native-titlebar .window{margin-top:32px;height:calc(100% - 32px) !important}body.agentdeck-active .content.main>.tab-bar{display:none !important}body.agentdeck-active .window{display:flex;flex-direction:row;position:relative;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127))}.ad-drop-ask{position:fixed;right:16px;bottom:16px;z-index:10000;min-width:260px;max-width:420px;padding:10px 12px;border:1px solid rgba(255,255,255,.16);border-radius:6px;background:rgba(24,26,30,.97);box-shadow:0 6px 24px rgba(0,0,0,.45);color:#e6e6e6;font-size:12px}.ad-drop-ask .ad-drop-ask-msg{overflow:hidden;margin-bottom:8px;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.ad-drop-ask .ad-drop-ask-row{display:flex;gap:6px;align-items:center}.ad-drop-ask button{flex:1 1 auto;padding:5px 8px;border:1px solid rgba(255,255,255,.16);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.85);font-size:12px;cursor:pointer}.ad-drop-ask button:hover{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#fff}.ad-drop-ask .ad-drop-ask-close{flex:0 0 auto;min-width:26px;padding:5px 6px;color:rgba(255,255,255,.45)}.ad-drop-ask .ad-drop-ask-again{display:flex;gap:5px;align-items:center;margin-top:8px;margin-bottom:0;color:rgba(255,255,255,.5);font-size:11px;cursor:pointer}.ad-account-picker .ad-account-add{position:absolute;top:16px;right:52px;width:28px;height:28px;border:1px solid #687586;border-radius:4px;background:rgba(0,0,0,0);color:inherit;font-size:22px;line-height:1;cursor:pointer}.ad-account-picker .ad-account-add:hover,.ad-account-picker .ad-account-add:focus-visible{background:rgba(255,255,255,.0941176471)}.ad-account-picker .ad-account-form{margin-top:14px;padding:12px;border:1px solid #687586;border-radius:5px}.ad-account-picker .ad-account-form label{display:block;margin-bottom:10px}.ad-account-picker .ad-account-form input{display:block;width:100%;margin-top:5px;padding:7px;color:inherit;background:#181c23;border:1px solid #687586;border-radius:3px}.ad-account-picker .ad-account-form .ad-account-plaintext{color:inherit}.ad-account-picker .ad-account-form button{margin-right:8px;padding:5px 12px;color:inherit;background:#303846;border:1px solid #687586;border-radius:4px;cursor:pointer}.ad-account-picker{position:fixed;z-index:100000;left:50%;top:50%;transform:translate(-50%, -50%);width:min(440px,90vw);max-height:75vh;overflow-y:auto;padding:18px;color:var(--bs-body-color, #eee);background:var(--ad-panel-bg, var(--bs-body-bg, #252a33));border:1px solid var(--bs-border-color, #687586);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.5333333333)}.ad-account-picker .ad-account-close{float:right;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;border-radius:3px;color:inherit;background:rgba(0,0,0,0);font:inherit;font-size:22px;line-height:1;opacity:.7;cursor:pointer}.ad-account-picker .ad-account-close:hover,.ad-account-picker .ad-account-close:focus-visible{opacity:1;background:rgba(255,255,255,.0941176471)}.ad-account-picker p{font-size:13px;color:#bbc4d0;clear:both}.ad-account-picker .ad-account-row{margin-top:10px}.ad-account-picker .ad-account-email{font-size:12px;opacity:.8;overflow-wrap:anywhere}.ad-account-picker .ad-account-remove{float:none;display:block;margin:4px 0 0 auto;padding:3px 7px;color:inherit;background:rgba(0,0,0,0);border:1px solid #59677b;border-radius:3px;font:inherit;font-size:12px;cursor:pointer}.ad-account-picker .ad-account-remove:hover,.ad-account-picker .ad-account-remove:focus-visible{border-color:#e06c75}.ad-account-picker .ad-account-option{float:none;display:flex;flex-direction:column;gap:7px;width:100%;margin-top:10px;padding:12px;text-align:left;color:inherit;background:#303846;border:1px solid #59677b;border-radius:5px;cursor:pointer}.ad-account-picker .ad-account-option:hover,.ad-account-picker .ad-account-option:focus-visible{border-color:#61afef}.ad-account-picker .ad-account-option:disabled{opacity:.6;cursor:wait}.ad-account-picker .ad-account-option .ad-now-gauges{width:100%}.ad-account-picker .ad-account-option .ad-now-gauge{gap:7px}.ad-account-picker .ad-account-option .ad-now-gauge-key{flex-basis:40px;font-size:13px}.ad-account-picker .ad-account-option .ad-now-gauge-pct{min-width:35px;font-size:13px}.ad-account-picker .ad-account-option .ad-now-bar{height:9px}.ad-account-picker .ad-account-option .ad-now-reset{font-size:11px}.ad-meta .ad-identity{flex:0 0 auto;border:1px solid rgba(104,123,149,.4);border-radius:4px;background:rgba(53,69,91,.4);color:inherit;font:inherit;font-size:11px;padding:1px 4px}.ad-meta .ad-identity[hidden]{display:none}.ad-history-search{display:flex;flex-direction:column;gap:6px;min-height:0;padding:6px;max-height:45vh}.ad-history-search[hidden]{display:none}.ad-history-search input,.ad-history-search select,.ad-history-search button{color:#e3e7ef;background:#242833;border:1px solid #475164;border-radius:4px;font:inherit;min-width:0;padding:5px}.ad-history-search input:focus,.ad-history-search select:focus,.ad-history-search button:focus-visible{outline:2px solid #69b7ff}.ad-history-search .ad-history-status{font-size:11px;color:#aab6c8}.ad-history-search .ad-history-results{overflow-y:auto;min-height:0}.ad-history-search .ad-history-hit{display:flex;flex-direction:column;gap:4px;text-align:left;width:100%;margin-bottom:5px;cursor:pointer}.ad-history-search .ad-history-hit strong,.ad-history-search .ad-history-hit small,.ad-history-search .ad-history-hit span{overflow-wrap:anywhere}.ad-history-search .ad-history-hit small{color:#acb9ca}.ad-history-search .ad-history-hit:hover{background:#303c4d}.ad-history-overlay{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;-webkit-app-region:no-drag}.ad-history-overlay .ad-history-dialog{display:flex;flex-direction:column;width:min(900px,90vw);max-height:85vh;color:#e3e7ef;background:#202630;border:1px solid #526277;border-radius:8px;box-shadow:0 12px 50px rgba(0,0,0,.5333333333)}.ad-history-overlay header,.ad-history-overlay footer{display:flex;align-items:center;gap:10px;padding:12px}.ad-history-overlay header strong{flex:1;overflow-wrap:anywhere}.ad-history-overlay footer{flex-wrap:wrap}.ad-history-overlay button{background:#35455b;color:#fff;border:1px solid #687b95;border-radius:4px;padding:6px 12px;cursor:pointer}.ad-history-overlay button:focus-visible{outline:2px solid #69b7ff}.ad-history-overlay .ad-history-conversation{overflow:auto;min-height:0;padding:0 16px}.ad-history-overlay article{border-bottom:1px solid #435064;padding:14px 8px}.ad-history-overlay article.ad-history-match{border-left:3px solid #69b7ff}.ad-history-overlay pre{color:inherit;font:13px/1.6 Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0}.ad-history-search mark,.ad-history-overlay mark{background:#dec566;color:#171b22;border-radius:2px}',""]);const r=s;i.d(t,["A",0,r])},6314(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i}).join("")},t.i=function(e,i,n,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(n)for(var r=0;r<this.length;r++){var d=this[r][0];null!=d&&(s[d]=!0)}for(var l=0;l<e.length;l++){var c=[].concat(e[l]);n&&s[c[0]]||(void 0!==a&&(void 0===c[5]||(c[1]="@layer".concat(c[5].length>0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=a),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),o&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=o):c[4]="".concat(o)),t.push(c))}},t}},1601(e){e.exports=function(e){return e[1]}},3396(e,t,i){var n=i.cw(function(e,t){var i=[];function n(e){for(var t=-1,n=0;n<i.length;n++)if(i[n].identifier===e){t=n;break}return t}function o(e,t){for(var o={},s=[],r=0;r<e.length;r++){var d=e[r],l=t.base?d[0]+t.base:d[0],c=o[l]||0,u="".concat(l," ").concat(c);o[l]=c+1;var p=n(u),h={css:d[1],media:d[2],sourceMap:d[3],supports:d[4],layer:d[5]};if(-1!==p)i[p].references++,i[p].updater(h);else{var g=a(h,t);t.byIndex=r,i.splice(r,0,{identifier:u,updater:g,references:1})}s.push(u)}return s}function a(e,t){var i=t.domAPI(t);return i.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;i.update(e=t)}else i.remove()}}e.exports=function(e,t){var a=o(e=e||[],t=t||{});return function(e){e=e||[];for(var s=0;s<a.length;s++){var r=n(a[s]);i[r].references--}for(var d=o(e,t),l=0;l<a.length;l++){var c=n(a[l]);0===i[c].references&&(i[c].updater(),i.splice(c,1))}a=d}}}),o=i.cw(function(e,t){var i={};e.exports=function(e,t){var n=function(e){if(void 0===i[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}i[e]=t}return i[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(t)}}),a=i.cw(function(e,t){e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}}),s=i.cw(function(e,t){e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}}),r=i.cw(function(e,t){e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var o=void 0!==i.layer;o&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,o&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var a=i.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}}),d=i.cw(function(e,t){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}});n(),r(),o(),s(),a(),d();var l=i(6100),c={};c.styleTagTransform=function e(){return e.c||(e.c=i.n(d()))}()(),c.setAttributes=function e(){return e.c||(e.c=i.n(s()))}()(),c.insert=function e(){return e.c||(e.c=i.n(o()))}()().bind(null,"head"),c.domAPI=function e(){return e.c||(e.c=i.n(r()))}()(),c.insertStyleElement=function e(){return e.c||(e.c=i.n(a()))}()(),function e(){return e.c||(e.c=i.n(n()))}()()(l.A,c),l.A&&l.A.locals&&l.A.locals},2839(e,t,i){t.openAccountBrowser=void 0,t.openAccountBrowser=async(e,t)=>{if(!function(e,t){try{const i=new URL(t),n="codex"===e?["auth.openai.com","auth0.openai.com"]:["claude.ai","console.anthropic.com","platform.claude.com"];return"https:"===i.protocol&&!i.port&&n.includes(i.hostname)}catch{return!1}}(t.provider,e))throw new Error("지원하지 않는 로그인 주소입니다.");const n=new URL(e);n.searchParams.has("login_hint")||n.searchParams.set("login_hint",t.id);try{await i(4157).shell.openExternal(n.toString())}catch{throw new Error("로그인 브라우저를 열지 못했습니다.")}return()=>{}}},8066(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.resetAccountRefreshAfterLogin=t.recordRefreshSuccess=t.recordRefreshFailure=t.accountRefreshState=t.REFRESH_RETRY_MS=t.REFRESH_WINDOW_MS=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(6982);function l(e){return r.join(e,"agentdeck-refresh-state.json")}function c(e,t){s.mkdirSync(e,{recursive:!0});const i=l(e)+"."+process.pid+".tmp";s.writeFileSync(i,JSON.stringify(t),{mode:384}),s.renameSync(i,l(e))}function u(e,i=Date.now()){let n={generation:""};try{const t=JSON.parse(s.readFileSync(l(e),"utf8"));if("string"!=typeof t.generation)throw new Error("Invalid refresh state");n=t}catch(e){if("ENOENT"!==e.code)return{generation:"",blocked:!0}}return!n.blocked&&"number"==typeof n.firstFailureAt&&i-n.firstFailureAt>=t.REFRESH_WINDOW_MS&&(n.blocked=!0,c(e,n)),n}t.REFRESH_WINDOW_MS=3e5,t.REFRESH_RETRY_MS=6e4,t.accountRefreshState=u,t.recordRefreshFailure=function(e,i,n=Date.now()){var o;const a=u(e,n);return a.generation!==i||a.blocked||(null!==(o=a.firstFailureAt)&&void 0!==o||(a.firstFailureAt=n),a.nextAttemptAt=n+t.REFRESH_RETRY_MS,a.blocked=n-a.firstFailureAt>=t.REFRESH_WINDOW_MS,c(e,a)),a},t.recordRefreshSuccess=function(e,t){const i=u(e);i.generation!==t||i.blocked||void 0===i.firstFailureAt||c(e,{generation:t})},t.resetAccountRefreshAfterLogin=function(e){c(e,{generation:(0,d.randomBytes)(16).toString("hex")})}},2007(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.maintainAccountSessions=t.getAccountQuotas=t.recordAccountUsage=t.cachedAccountQuotas=t.ensureAccountSession=t.codexRefreshDeadline=t.synchronizeClaudeAuth=t.registerAccountSource=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=a(i(5692)),c=i(6982),u=i(3090),p=i(7025),h=i(8066);function g(e){try{return JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""))}catch{return null}}function f(e,t){s.mkdirSync(d.dirname(e),{recursive:!0});const i=e+"."+process.pid+".tmp";s.writeFileSync(i,JSON.stringify(t),{mode:384}),s.renameSync(i,e)}const m=new Map,v=new Map,b=new Map,k=new Map,y=new Map;function w(e,t){if(!t)return;const i=m.get(e.key)||new Set;i.add(d.resolve(t)),m.set(e.key,i)}function x(e){var t,i;return(null===(t=g(d.join(e,".claude.json")))||void 0===t?void 0:t.oauthAccount)||(d.resolve(e)===d.resolve(d.join(r.homedir(),".claude"))?null===(i=g(d.join(r.homedir(),".claude.json")))||void 0===i?void 0:i.oauthAccount:null)}function S(e){var t,i;const n=(0,u.accountHome)(e);if("claude"!==e.provider)return n;const o=[...new Set([n,...m.get(e.key)||[],(0,p.agentHome)("claude"),...process.env.CLAUDE_CONFIG_DIR?[process.env.CLAUDE_CONFIG_DIR]:[],d.join(r.homedir(),".claude")])].map(e=>({home:e,profile:x(e),credentials:g(d.join(e,".credentials.json"))})).filter(t=>{var i,n,o;return String((null===(i=t.profile)||void 0===i?void 0:i.emailAddress)||"").toLowerCase()===e.id.toLowerCase()&&(null===(o=null===(n=t.credentials)||void 0===n?void 0:n.claudeAiOauth)||void 0===o?void 0:o.accessToken)}).sort((e,t)=>Number(t.credentials.claudeAiOauth.expiresAt||0)-Number(e.credentials.claudeAiOauth.expiresAt||0)),a=o[0];if(!a)return n;const s=g(d.join(n,".credentials.json"));if(JSON.stringify(s)!==JSON.stringify(a.credentials)&&f(d.join(n,".credentials.json"),a.credentials),String((null===(t=x(n))||void 0===t?void 0:t.emailAddress)||"").toLowerCase()!==e.id.toLowerCase()){const e=g(d.join(n,".claude.json"))||{};e.oauthAccount=a.profile,f(d.join(n,".claude.json"),e)}return(null===(i=o.find(e=>d.resolve(e.home)!==d.resolve(n)&&e.credentials.claudeAiOauth.accessToken===a.credentials.claudeAiOauth.accessToken))||void 0===i?void 0:i.home)||a.home}async function C(e){const t=g(d.join((0,u.accountHome)(e),"claude"===e.provider?".credentials.json":"auth.json"));if(!t)return;const i=(0,c.createHash)("sha256").update(JSON.stringify(t)).digest("hex");b.get(e.key)!==i&&(await(0,u.saveAccountAuth)(e),b.set(e.key,i))}function j(e){var t,i;try{const n=JSON.parse(Buffer.from((null===(i=null===(t=null==e?void 0:e.tokens)||void 0===t?void 0:t.access_token)||void 0===i?void 0:i.split(".")[1])||"","base64").toString("utf8"));if("number"==typeof n.exp&&Number.isFinite(n.exp)&&n.exp>0)return 1e3*n.exp}catch{}const n=Date.parse(null==e?void 0:e.last_refresh);return Number.isFinite(n)?n+6912e5:0}function A(){return new u.AccountRequestError("auth","재로그인 필요 · 인증 갱신에 계속 실패하여 자동 점검을 중단했습니다.")}function E(e,t=!1){const i=v.get(e.key);if(i)return i;const n=(0,u.accountHome)(e),o=(0,h.accountRefreshState)(n);if(o.blocked)return Promise.reject(A());if((o.nextAttemptAt||0)>Date.now())return Promise.reject(new u.AccountRequestError("temporary","인증 갱신 대기 중 · 잠시 후 자동으로 다시 시도합니다."));const a=(async()=>{var i,n,o,a,r;if("claude"===e.provider&&S(e),await(0,u.restoreAccountAuth)(e),"codex"===e.provider)return await async function(e,t){var i;const n=(0,u.accountHome)(e),o=d.join(n,"auth.json");let a=g(o);if((0,u.accountEmail)("codex",n).toLowerCase()!==e.id.toLowerCase()||!(null===(i=null==a?void 0:a.tokens)||void 0===i?void 0:i.access_token))throw new u.AccountRequestError("auth","저장된 로그인 정보가 없습니다.");if(!j(a))throw new u.AccountRequestError("auth","로그인 만료 정보를 확인할 수 없습니다. 다시 로그인하세요.");if(!t&&j(a)>Date.now()+h.REFRESH_WINDOW_MS)return;const r=d.join(n,".agentdeck-auth-refresh.lock");let l;try{l=s.openSync(r,"wx")}catch{try{Date.now()-s.statSync(r).mtimeMs>6e4&&s.unlinkSync(r)}catch{}throw new u.AccountRequestError("temporary","인증 갱신 중입니다. 잠시 후 다시 시도합니다.")}try{if(a=g(o),!t&&j(a)>Date.now()+h.REFRESH_WINDOW_MS)return;await(0,u.authenticateAccount)(e,!0);const i=g(o);if((0,u.accountEmail)("codex",n).toLowerCase()!==e.id.toLowerCase()||j(i)<=Date.now()+h.REFRESH_WINDOW_MS)throw new u.AccountRequestError("auth","로그인 정보를 갱신하지 못했습니다.")}finally{s.closeSync(l);try{s.unlinkSync(r)}catch{}}}(e,t),void await C(e);let c=S(e),p=d.join(c,".credentials.json"),m=g(p),v=null==m?void 0:m.claudeAiOauth;if(!(null==v?void 0:v.accessToken)||(0,u.accountEmail)("claude",(0,u.accountHome)(e)).toLowerCase()!==e.id.toLowerCase())throw new u.AccountRequestError("auth","저장된 로그인 정보가 없습니다.");if(t||Number(v.expiresAt)<=Date.now()+3e5){const h=d.join(c,".agentdeck-auth-refresh.lock");let k;try{k=s.openSync(h,"wx")}catch{try{Date.now()-s.statSync(h).mtimeMs>6e4&&s.unlinkSync(h)}catch{}throw new u.AccountRequestError("temporary","인증 갱신 중입니다. 잠시 후 다시 시도합니다.")}try{if(c=S(e),p=d.join(c,".credentials.json"),m=g(p),v=null==m?void 0:m.claudeAiOauth,t||Number(null==v?void 0:v.expiresAt)<=Date.now()+3e5){if(!(null==v?void 0:v.refreshToken))throw new u.AccountRequestError("auth","갱신 가능한 로그인 정보가 없습니다.");const t=await(b=v.refreshToken,new Promise((e,t)=>{const i=JSON.stringify({grant_type:"refresh_token",refresh_token:b,client_id:"9d1c250a-e61b-44d9-88ed-5944d1962f5e"}),n=l.request("https://platform.claude.com/v1/oauth/token",{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(i)},timeout:15e3},i=>{let o="";i.on("data",e=>{o+=e,o.length>1048576&&n.destroy()}),i.on("end",()=>{let n;try{n=JSON.parse(o)}catch{return void t(new u.AccountRequestError("temporary","인증 갱신 응답을 읽지 못했습니다."))}200===i.statusCode?"string"==typeof n.access_token&&n.access_token&&Number(n.expires_in)>0?e(n):t(new u.AccountRequestError("temporary","인증 갱신 응답이 올바르지 않습니다.")):t(new u.AccountRequestError("invalid_grant"===(null==n?void 0:n.error)||401===i.statusCode?"auth":"temporary","저장된 인증정보를 갱신하지 못했습니다.",i.statusCode))})});n.on("timeout",()=>n.destroy()),n.on("error",()=>t(new u.AccountRequestError("temporary","인증 갱신 연결 실패"))),n.on("close",()=>t(new u.AccountRequestError("temporary","인증 갱신 연결 종료"))),n.end(i)}));if((null===(i=t.account)||void 0===i?void 0:i.email_address)&&String(t.account.email_address).toLowerCase()!==e.id.toLowerCase())throw new u.AccountRequestError("auth","갱신 응답의 계정이 일치하지 않습니다.");const s=g(p);(null===(n=null==s?void 0:s.claudeAiOauth)||void 0===n?void 0:n.accessToken)===v.accessToken&&(null===(o=null==s?void 0:s.claudeAiOauth)||void 0===o?void 0:o.refreshToken)===v.refreshToken&&String((null===(a=x(c))||void 0===a?void 0:a.emailAddress)||"").toLowerCase()===e.id.toLowerCase()&&(s.claudeAiOauth={...v,accessToken:t.access_token,refreshToken:t.refresh_token||v.refreshToken,expiresAt:Date.now()+1e3*Number(t.expires_in)},f(p,s)),S(e)}}catch(t){S(e);const i=null===(r=g(d.join((0,u.accountHome)(e),".credentials.json")))||void 0===r?void 0:r.claudeAiOauth;if(!i||i.accessToken===(null==v?void 0:v.accessToken)||Number(i.expiresAt)<=Date.now())throw t}finally{s.closeSync(k);try{s.unlinkSync(h)}catch{}}}var b;await C(e)})().then(()=>{(0,h.recordRefreshSuccess)(n,o.generation)},e=>{if((0,h.recordRefreshFailure)(n,o.generation).blocked)throw A();throw e}).finally(()=>v.delete(e.key));return v.set(e.key,a),a}function P(e){return d.join((0,u.accountHome)(e),"usage.json")}function z(e){const t=g(P(e));return(null==t?void 0:t.id)===e.id.toLowerCase()&&(null==t?void 0:t.provider)===e.provider&&Array.isArray(t.values)?{values:t.values,ts:t.ts,stale:Date.now()-t.ts>12e4}:null}function D(e,t,i=Date.now()){const n=z(e);return n&&n.ts>i?n:(f(P(e),{provider:e.provider,id:e.id.toLowerCase(),values:t,ts:i}),{values:t,ts:i,stale:Date.now()-i>12e4})}function T(e,t){var i,n;if(t.agent!==e.provider||(null===(i=t.account)||void 0===i?void 0:i.toLowerCase())!==e.id.toLowerCase())return;w(e,t.configDir);const o=Number(t.ts);if(!Number.isFinite(o)||o<=0||o>Date.now()+6e4||((null===(n=z(e))||void 0===n?void 0:n.ts)||0)>=o)return;const a=t.limits,s=[];for(const[e,t,i]of[["5시간",null==a?void 0:a.fiveHourPct,null==a?void 0:a.fiveHourResetsAt],["주간",null==a?void 0:a.sevenDayPct,null==a?void 0:a.sevenDayResetsAt],[null==a?void 0:a.scopedName,null==a?void 0:a.scopedPct,null==a?void 0:a.scopedResetsAt]])e&&"number"==typeof t&&Number.isFinite(t)&&s.push({label:e,remaining:100-Math.max(0,Math.min(100,t)),...i?{resetsAt:i}:{}});s.length&&D(e,s,o)}t.registerAccountSource=w,t.synchronizeClaudeAuth=S,t.codexRefreshDeadline=j,t.ensureAccountSession=E,t.cachedAccountQuotas=z,t.recordAccountUsage=T,t.getAccountQuotas=function(e){const t=k.get(e.key);if(t)return t;const i=(async()=>{var t;try{await E(e)}catch(t){const i=z(e);if(i&&!(t instanceof u.AccountRequestError&&"auth"===t.kind))return{...i,stale:!0};throw t}const i=z(e);if(i&&!i.stale)return i;const n=d.join((0,u.accountHome)(e),"usage-retry.json"),o=Math.max(y.get(e.key)||0,Number(null===(t=g(n))||void 0===t?void 0:t.until)||0);if(o>Date.now()){if(i)return{...i,stale:!0};throw new u.AccountRequestError("temporary","사용량 조회 제한 · 잠시 후 자동 갱신",429,o-Date.now())}try{let t;try{t=await(0,u.fetchAccountQuotas)(e)}catch(i){if(!(i instanceof u.AccountRequestError)||401!==i.status||"claude"!==e.provider)throw i;await E(e,!0),t=await(0,u.fetchAccountQuotas)(e)}return D(e,t)}catch(t){if(t instanceof u.AccountRequestError&&"auth"===t.kind)throw t;const o=Date.now()+(t instanceof u.AccountRequestError?t.retryAfterMs:6e4);if(y.set(e.key,o),f(n,{until:o}),i)return{...i,stale:!0};throw t}})().finally(()=>k.delete(e.key));return k.set(e.key,i),i},t.maintainAccountSessions=async function(e=[]){let t;try{t=(0,u.readAccounts)()}catch{return}for(const i of t)try{if((0,h.accountRefreshState)((0,u.accountHome)(i)).blocked)continue;for(const t of e)T(i,t);await E(i)}catch{}}},3090(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.loginAccount=t.fetchAccountQuotas=t.authenticateAccount=t.parseCodexUsage=t.parseQuotas=t.accountCliRoots=t.seedCodexMarketplaces=t.pendingMarketplaceSeed=t.prepareAccount=t.restoreAccountAuth=t.saveAccountAuth=t.protectAccountAuth=t.accountEmail=t.accountEnv=t.accountHome=t.removeAccount=t.addAccount=t.readAccounts=t.ACCOUNTS_FILE=t.AccountRequestError=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=a(i(5692)),c=i(6982),u=i(5317),p=i(7025),h=i(8066);class g extends Error{constructor(e,t,i=0,n=6e4){super(t),this.kind=e,this.status=i,this.retryAfterMs=n}}function f(e=(0,p.accountsFile)()){return function(e){let t;try{t=JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""))}catch(e){if("ENOENT"===e.code)return[];throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}const i=[];for(const e of["claude","codex"])if(Array.isArray(null==t?void 0:t[e]))for(const n of t[e]){if("string"!=typeof(null==n?void 0:n.id)||!n.id.trim())continue;const t=n.id.trim(),o=(0,c.createHash)("sha256").update(e+":"+t.toLowerCase()).digest("hex").slice(0,24);i.some(e=>e.key===o)||i.push({provider:e,key:o,id:t,name:"string"==typeof n.name&&n.name.trim()?n.name.trim():t,password:"string"==typeof n.password?n.password:""})}return i}(e).map(({password:e,...t})=>t)}function m(e){return d.join(d.dirname((0,p.accountsFile)()),"accounts",e.key)}function v(e){const t={...process.env};for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY"])delete t[e];return delete t.CLAUDECODE,t["claude"===e.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]=m(e),t}function b(e){try{return JSON.parse(s.readFileSync(e,"utf8"))}catch{return null}}function k(e,t){var i,n,o,a;return"codex"===e?function(e){try{return JSON.parse(Buffer.from(String(e).split(".")[1],"base64").toString("utf8")).email||""}catch{return""}}(null===(n=null===(i=b(d.join(t,"auth.json")))||void 0===i?void 0:i.tokens)||void 0===n?void 0:n.id_token):String((null===(a=null===(o=b(d.join(t,".claude.json")))||void 0===o?void 0:o.oauthAccount)||void 0===a?void 0:a.emailAddress)||"")}function y(e,t=!1){if("win32"!==process.platform)return Promise.reject(new Error("인증정보 저장은 현재 Windows에서 지원합니다."));const i=`$ErrorActionPreference="Stop"; Add-Type -AssemblyName System.Security; $bytes=[Convert]::FromBase64String([Console]::In.ReadToEnd()); $result=[Security.Cryptography.ProtectedData]::${t?"Unprotect":"Protect"}($bytes,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([Convert]::ToBase64String($result))`;return new Promise((n,o)=>{const a=(0,u.spawn)("powershell.exe",["-NoProfile","-NonInteractive","-Command",i],{windowsHide:!0,stdio:"pipe"});let s="";const r=()=>o(new Error("인증정보 암호화 저장소에 접근하지 못했습니다.")),d=setTimeout(()=>{a.kill(),r()},15e3);a.stdout.on("data",e=>{s+=e,s.length>1048576&&(a.kill(),r())}),a.stderr.resume(),a.stdin.on("error",r),a.on("error",()=>{clearTimeout(d),r()}),a.on("exit",e=>{clearTimeout(d),0===e&&s.trim()?n(t?Buffer.from(s.trim(),"base64").toString("utf8"):s.trim()):r()}),a.stdin.end(t?e:Buffer.from(e,"utf8").toString("base64"))})}t.AccountRequestError=g,t.ACCOUNTS_FILE=process.env.AGENTDECK_ACCOUNTS_FILE||d.join(r.homedir(),".agentdeck","accounts.json"),t.readAccounts=f,t.addAccount=function(e,t,i,n=(0,p.accountsFile)(),o=""){if(!(t=t.trim())||!i)throw new Error("계정과 비밀번호를 입력하세요.");if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t))throw new Error("이메일 주소 전체를 입력하세요.");let a={};try{if(s.existsSync(n)&&(a=JSON.parse(s.readFileSync(n,"utf8").replace(/^\uFEFF/,""))),!a||"object"!=typeof a||Array.isArray(a)||void 0!==a[e]&&!Array.isArray(a[e]))throw new Error}catch{throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}const r=a[e]||[];if(r.some(e=>"string"==typeof(null==e?void 0:e.id)&&e.id.trim().toLowerCase()===t.toLowerCase()))throw new Error("이미 등록된 계정입니다.");a[e]=[...r,{name:o.trim()||t,id:t,password:i}];const l=n+"."+process.pid+".add.tmp";try{s.mkdirSync(d.dirname(n),{recursive:!0}),s.writeFileSync(l,JSON.stringify(a,null,2)+"\n",{mode:384}),s.renameSync(l,n)}catch{try{s.unlinkSync(l)}catch{}throw new Error("계정을 저장하지 못했습니다. 다시 시도하세요.")}},t.removeAccount=function(e,t=(0,p.accountsFile)()){let i;try{if(i=JSON.parse(s.readFileSync(t,"utf8").replace(/^\uFEFF/,"")),!Array.isArray(null==i?void 0:i[e.provider]))throw new Error}catch{throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}i[e.provider]=i[e.provider].filter(t=>"string"!=typeof(null==t?void 0:t.id)||t.id.trim().toLowerCase()!==e.id.toLowerCase());const n=t+"."+process.pid+".remove.tmp";try{s.writeFileSync(n,JSON.stringify(i,null,2)+"\n",{mode:384}),s.renameSync(n,t)}catch{try{s.unlinkSync(n)}catch{}throw new Error("계정을 저장하지 못했습니다. 다시 시도하세요.")}},t.accountHome=m,t.accountEnv=v,t.accountEmail=k,t.protectAccountAuth=y;let w=Promise.resolve();function x(e){const t=w.catch(()=>{}).then(async()=>{var t,i;const n=m(e);if(k(e.provider,n).toLowerCase()!==e.id.toLowerCase())throw new Error("인증정보의 계정이 일치하지 않습니다.");const o=b(d.join(n,"claude"===e.provider?".credentials.json":"auth.json"));if(!o)throw new Error("저장할 인증정보가 없습니다.");const a={provider:e.provider,id:e.id.toLowerCase(),credentials:o,profile:"claude"===e.provider?null===(t=b(d.join(n,".claude.json")))||void 0===t?void 0:t.oauthAccount:void 0},r=await y(JSON.stringify(a)),l=(0,p.accountsFile)(),c=b(l),u=null===(i=null==c?void 0:c[e.provider])||void 0===i?void 0:i.find(t=>"string"==typeof t.id&&t.id.trim().toLowerCase()===e.id.toLowerCase());if(!u)throw new Error("계정 파일이 변경되어 인증정보를 저장하지 못했습니다.");u.auth={version:1,protection:"windows-dpapi",data:r,updatedAt:(new Date).toISOString()};const h=l+"."+process.pid+".tmp";try{s.writeFileSync(h,JSON.stringify(c,null,2)+"\n",{mode:384}),s.renameSync(h,l)}catch{throw new Error("계정 파일에 인증정보를 저장하지 못했습니다.")}});return w=t,t}async function S(e){var t,i;const n=m(e),o=d.join(n,"claude"===e.provider?".credentials.json":"auth.json");if(s.existsSync(o)&&k(e.provider,n).toLowerCase()===e.id.toLowerCase())return;const a=b((0,p.accountsFile)()),r=null===(i=null===(t=null==a?void 0:a[e.provider])||void 0===t?void 0:t.find(t=>"string"==typeof t.id&&t.id.trim().toLowerCase()===e.id.toLowerCase()))||void 0===i?void 0:i.auth;if(!r)return;if("windows-dpapi"!==r.protection||1!==r.version||"string"!=typeof r.data)throw new Error("저장된 인증정보 형식을 확인할 수 없습니다. 다시 로그인하세요.");let l;try{l=JSON.parse(await y(r.data,!0))}catch{throw new Error("저장된 인증정보를 복원하지 못했습니다. 다시 로그인하세요.")}if(l.provider!==e.provider||l.id!==e.id.toLowerCase()||!l.credentials)throw new Error("저장된 인증정보의 계정이 일치하지 않습니다.");if(s.mkdirSync(n,{recursive:!0,mode:448}),s.writeFileSync(o,JSON.stringify(l.credentials),{mode:384}),"claude"===e.provider){const e=d.join(n,".claude.json"),t=b(e)||{};t.oauthAccount=l.profile,s.writeFileSync(e,JSON.stringify(t),{mode:384})}}t.saveAccountAuth=x,t.restoreAccountAuth=S,t.prepareAccount=function(e,t){var i;const n=m(e),o=(0,p.hasConfiguredAgentHome)(e.provider)?(0,p.agentHome)(e.provider):t||(0,p.agentHome)(e.provider);if(s.mkdirSync(n,{recursive:!0,mode:448}),d.resolve(o)===d.resolve(n))return;if("claude"===e.provider&&s.existsSync(d.join(n,".claude.json"))){const e=b(d.join(o,".claude.json"))||b(d.join(r.homedir(),".claude.json"))||{};delete e.oauthAccount;const t=b(d.join(n,".claude.json"))||{};s.writeFileSync(d.join(n,".claude.json"),JSON.stringify({...e,...t}),{mode:384})}const a="claude"===e.provider?["settings.json","settings.local.json","CLAUDE.md"]:["config.toml","hooks.json","AGENTS.md"];for(const e of a){const t=d.join(n,e);s.existsSync(d.join(o,e))&&!s.existsSync(t)&&s.copyFileSync(d.join(o,e),t,s.constants.COPYFILE_EXCL)}const l="claude"===e.provider?["projects","skills","commands","plugins","hooks"]:["sessions","archived_sessions","skills","plugins","rules","claude-compat"];for(const t of l){const i=d.join(n,t);if((0,p.hasConfiguredAgentHome)(e.provider)&&["projects","sessions","archived_sessions"].includes(t)){let e;s.mkdirSync(d.join(o,t),{recursive:!0});try{e=s.lstatSync(i)}catch(e){if("ENOENT"!==e.code)throw e}if((null==e?void 0:e.isSymbolicLink())&&d.resolve(s.readlinkSync(i))!==d.resolve(o,t))s.unlinkSync(i);else if(e&&!e.isSymbolicLink())throw new Error("계정 폴더에 별도 대화 기록이 있습니다. 기록을 옮긴 뒤 다시 시도하세요.")}s.existsSync(d.join(o,t))&&!s.existsSync(i)&&s.symlinkSync(d.resolve(o,t),i,"win32"===process.platform?"junction":"dir")}if("claude"===e.provider&&!s.existsSync(d.join(n,".claude.json"))){const t=b(d.join(o,".claude.json"))||b(d.join(r.homedir(),".claude.json"))||{},a=String((null===(i=t.oauthAccount)||void 0===i?void 0:i.emailAddress)||"").toLowerCase()===e.id.toLowerCase();a||delete t.oauthAccount,s.writeFileSync(d.join(n,".claude.json"),JSON.stringify(t),{mode:384}),a&&s.existsSync(d.join(o,".credentials.json"))&&s.copyFileSync(d.join(o,".credentials.json"),d.join(n,".credentials.json"),s.constants.COPYFILE_EXCL)}"codex"!==e.provider||s.existsSync(d.join(n,"auth.json"))||k("codex",o).toLowerCase()!==e.id.toLowerCase()||s.copyFileSync(d.join(o,"auth.json"),d.join(n,"auth.json"),s.constants.COPYFILE_EXCL),"codex"===e.provider&&j(o,n).catch(()=>{})};const C=new Map;function j(e,t){const i=d.resolve(t),n=C.get(i);if(n)return n;const o=(async()=>{const i=d.join(e,".tmp","marketplaces"),n=d.join(t,".tmp","marketplaces");let o;try{o=(await s.promises.readdir(i,{withFileTypes:!0})).filter(e=>e.isDirectory()&&!e.name.startsWith(".")).map(e=>e.name)}catch{return}for(const e of o){const t=d.join(n,e);if(s.existsSync(t)||!s.existsSync(d.join(i,e,".git")))continue;const o=d.join(n,".agentdeck-seed-"+e+"-"+process.pid);try{await s.promises.rm(o,{recursive:!0,force:!0}),await s.promises.mkdir(n,{recursive:!0}),await s.promises.cp(d.join(i,e),o,{recursive:!0,verbatimSymlinks:!0}),s.existsSync(t)||await s.promises.rename(o,t)}finally{await s.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}})().finally(()=>C.delete(i));return C.set(i,o),o}t.pendingMarketplaceSeed=function(e){return C.get(d.resolve(e))||Promise.resolve()},t.seedCodexMarketplaces=j;let A={at:0,value:""};function E(){if("win32"===process.platform&&Date.now()-A.at>6e4)try{const e=d.join(process.env.SystemRoot||"C:\\Windows","System32/WindowsPowerShell/v1.0/powershell.exe"),t=(0,u.execFileSync)(e,["-NoProfile","-NonInteractive","-Command","[Environment]::GetEnvironmentVariable('Path','User') + ';' + [Environment]::GetEnvironmentVariable('Path','Machine')"],{encoding:"utf8",windowsHide:!0,timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();A={at:Date.now(),value:t}}catch{A.at=Date.now()}return[...new Set(((process.env.PATH||"")+d.delimiter+A.value).split(d.delimiter).map(e=>e.trim()).filter(Boolean))]}function P(e,t,i={}){const n=E(),o={...v(e),...i};for(const e of Object.keys(o))"path"===e.toLowerCase()&&delete o[e];o.PATH=n.join(d.delimiter);for(const i of n){if("codex"===e.provider&&"win32"===process.platform){const e="arm64"===process.arch?"arm64":"x64",n="arm64"===process.arch?"aarch64":"x86_64",a=d.join(i,"node_modules/@openai/codex/node_modules/@openai",`codex-win32-${e}`,"vendor",`${n}-pc-windows-msvc`,"bin/codex.exe");if(s.existsSync(a))return(0,u.spawn)(a,t,{env:o,windowsHide:!0,stdio:"pipe"})}const n=d.join(i,"node_modules","claude"===e.provider?"@anthropic-ai/claude-code/bin/claude.exe":"@openai/codex/bin/codex.js");if(s.existsSync(n))return(0,u.spawn)("claude"===e.provider?n:"node","claude"===e.provider?t:[n,...t],{env:o,windowsHide:!0,stdio:"pipe"})}return(0,u.spawn)(e.provider,t,{env:o,windowsHide:!0,stdio:"pipe"})}t.accountCliRoots=E;class z{constructor(e){this.closed=!1,this.next=0,this.pending=new Map,this.onNotification=()=>{},this.child=P(e,["-c",'cli_auth_credentials_store="file"',"app-server"],{GIT_ALLOW_PROTOCOL:"file"});let t="";this.child.stdout.on("data",e=>{let i;for(t+=e.toString();(i=t.indexOf("\n"))>=0;){const e=t.slice(0,i);let n;t=t.slice(i+1);try{n=JSON.parse(e)}catch{continue}const o=this.pending.get(n.id);o?(clearTimeout(o.timer),this.pending.delete(n.id),n.error?o.reject(new Error("Codex 인증 또는 사용량 조회에 실패했습니다. 다시 로그인하세요.")):o.resolve(n.result)):n.method&&this.onNotification(n.method,n.params)}t.length>1048576&&this.close()}),this.child.stderr.resume(),this.child.stdin.on("error",()=>this.close()),this.child.on("error",()=>this.close()),this.child.on("exit",()=>this.close())}async init(){await this.request("initialize",{clientInfo:{name:"agentdeck_accounts",version:"1.0.0"},capabilities:{experimentalApi:!0}}),this.child.stdin.write(JSON.stringify({method:"initialized"})+"\n")}request(e,t={}){const i=++this.next;return new Promise((n,o)=>{const a=setTimeout(()=>{this.pending.delete(i),o(new Error("Codex 응답 시간이 초과되었습니다."))},25e3);this.pending.set(i,{resolve:n,reject:o,timer:a}),this.child.stdin.write(JSON.stringify({id:i,method:e,params:t})+"\n",e=>{e&&(clearTimeout(a),this.pending.delete(i),o(new Error("Codex에 연결할 수 없습니다.")))})})}close(){if(!this.closed){this.closed=!0;for(const e of this.pending.values())clearTimeout(e.timer),e.reject(new Error("Codex 연결이 종료되었습니다."));this.pending.clear(),this.child.stdin.destroy(),this.child.stdout.destroy(),this.child.stderr.destroy(),this.child.killed||this.child.kill()}}}function D(e,t){var i,n,o,a,s,r,d,l,c,u,p,h,g,f;const m=[],v=(e,t,i)=>{if("number"==typeof t&&Number.isFinite(t)&&!m.some(t=>t.label===e)){const n={label:e,remaining:Math.max(0,Math.min(100,Math.round(100-t)))},o="number"==typeof i?i:"string"==typeof i?Date.parse(i)/1e3:0;Number.isFinite(o)&&o>0&&(n.resetsAt=o),m.push(n)}};if("claude"===e){v("5시간",null===(i=null==t?void 0:t.five_hour)||void 0===i?void 0:i.utilization,null===(n=null==t?void 0:t.five_hour)||void 0===n?void 0:n.resets_at),v("주간",null===(o=null==t?void 0:t.seven_day)||void 0===o?void 0:o.utilization,null===(a=null==t?void 0:t.seven_day)||void 0===a?void 0:a.resets_at);for(const e of Array.isArray(null==t?void 0:t.limits)?t.limits:[])"weekly_scoped"===e.kind&&v(String((null===(r=null===(s=e.scope)||void 0===s?void 0:s.model)||void 0===r?void 0:r.display_name)||(null===(l=null===(d=e.scope)||void 0===d?void 0:d.model)||void 0===l?void 0:l.id)||"Fable"),e.percent,e.resets_at),"weekly"===e.kind&&v("주간",e.percent,e.resets_at),"session"===e.kind&&v("5시간",e.percent,e.resets_at)}else{const e=null==t?void 0:t.rateLimits;for(const t of[null==e?void 0:e.primary,null==e?void 0:e.secondary])300===(null==t?void 0:t.windowDurationMins)&&v("5시간",t.usedPercent,t.resetsAt),10080===(null==t?void 0:t.windowDurationMins)&&v("주간",t.usedPercent,t.resetsAt);for(const[e,i]of Object.entries((null==t?void 0:t.rateLimitsByLimitId)||{})){const t=i,n=String(t.limitName||t.normalModelSlug||e);/astra/i.test(n+e+(t.normalModelSlug||""))&&v("Astra",null!==(u=null===(c=t.secondary)||void 0===c?void 0:c.usedPercent)&&void 0!==u?u:null===(p=t.primary)||void 0===p?void 0:p.usedPercent,null!==(g=null===(h=t.secondary)||void 0===h?void 0:h.resetsAt)&&void 0!==g?g:null===(f=t.primary)||void 0===f?void 0:f.resetsAt)}}return m}function T(e){var t,i,n,o,a;const s=e=>e?{usedPercent:e.used_percent,windowDurationMins:e.limit_window_seconds/60,resetsAt:e.reset_at}:null,r={};for(const n of Array.isArray(null==e?void 0:e.additional_rate_limits)?e.additional_rate_limits:[])r[String(n.metered_feature)]={limitName:n.limit_name,normalModelSlug:n.normal_model_slug,primary:s(null===(t=n.rate_limit)||void 0===t?void 0:t.primary_window),secondary:s(null===(i=n.rate_limit)||void 0===i?void 0:i.secondary_window)};const d=D("codex",{rateLimits:{primary:s(null===(n=null==e?void 0:e.rate_limit)||void 0===n?void 0:n.primary_window),secondary:s(null===(o=null==e?void 0:e.rate_limit)||void 0===o?void 0:o.secondary_window)},rateLimitsByLimitId:r});if(!d.some(e=>"Astra"===e.label)){const t=null===(a=Object.entries((null==e?void 0:e.model_usage)||{}).find(([e])=>/astra/i.test(e)))||void 0===a?void 0:a[1];"boolean"==typeof(null==t?void 0:t.available)&&d.push({label:"Astra",status:t.available?"사용 가능":"현재 사용 불가"})}return d}async function O(e,t=!1){var i,n;if(await S(e),k(e.provider,m(e)).toLowerCase()!==e.id.toLowerCase())throw new g("auth","저장된 로그인 정보가 없습니다.");if("codex"===e.provider&&t){const t=new z(e);try{if(await t.init(),(null===(n=null===(i=(await t.request("account/read",{refreshToken:!0})).account)||void 0===i?void 0:i.email)||void 0===n?void 0:n.toLowerCase())!==e.id.toLowerCase())throw new g("auth","계정 확인이 필요합니다.")}finally{t.close()}}}t.parseQuotas=D,t.parseCodexUsage=T,t.authenticateAccount=O,t.fetchAccountQuotas=async function(e){var t,i;if(await O(e),"codex"===e.provider)return function(e){const t=b(d.join(m(e),"auth.json"));return new Promise((e,i)=>{var n,o;const a=l.get("https://chatgpt.com/backend-api/wham/usage",{headers:{authorization:`Bearer ${(null===(n=null==t?void 0:t.tokens)||void 0===n?void 0:n.access_token)||""}`,"ChatGPT-Account-Id":(null===(o=null==t?void 0:t.tokens)||void 0===o?void 0:o.account_id)||""},timeout:1e4},n=>{let o="";n.on("data",e=>{o+=e,o.length>1048576&&a.destroy()}),n.on("end",()=>{var a;if(200===n.statusCode)try{const n=JSON.parse(o);if(n.account_id&&n.account_id!==(null===(a=null==t?void 0:t.tokens)||void 0===a?void 0:a.account_id))return void i(new Error("잔량 응답의 계정이 일치하지 않습니다."));e(T(n))}catch{i(new Error("Codex 잔량 응답을 읽지 못했습니다."))}else i(new Error("Codex 잔량 조회 실패"))})});a.on("timeout",()=>a.destroy()),a.on("error",()=>i(new Error("Codex 잔량 조회 연결 실패"))),a.on("close",()=>i(new Error("Codex 잔량 조회 연결 종료")))})}(e);const n=null===(i=null===(t=b(d.join(m(e),".credentials.json")))||void 0===t?void 0:t.claudeAiOauth)||void 0===i?void 0:i.accessToken;if(!n)throw new g("auth","저장된 로그인 정보가 없습니다.");return new Promise((e,t)=>{const i=l.get("https://api.anthropic.com/api/oauth/usage",{headers:{authorization:`Bearer ${n}`,"anthropic-beta":"oauth-2025-04-20"},timeout:1e4},n=>{let o="";n.on("data",e=>{o+=e,o.length>1048576&&i.destroy()}),n.on("end",()=>{if(200!==n.statusCode){const e=Number(n.headers["retry-after"]);return void t(new g(401===n.statusCode?"auth":"temporary",429===n.statusCode?"사용량 조회 제한 · 잠시 후 자동 갱신":"사용량 조회 일시 실패",n.statusCode,Number.isFinite(e)?Math.max(3e4,1e3*e):6e4))}try{e(D("claude",JSON.parse(o)))}catch{t(new Error("잔량 응답을 읽지 못했습니다."))}})});i.on("timeout",()=>i.destroy()),i.on("error",()=>t(new Error("잔량 조회 연결 실패"))),i.on("close",()=>t(new Error("잔량 조회 연결 종료")))})},t.loginAccount=async function(e,t){var i,n;if(!f().some(t=>t.key===e.key))throw new Error("계정 파일에서 이 계정이 제거되었습니다.");let o=()=>{};if("codex"===e.provider){const a=new z(e);let s;try{await a.init();let r=()=>{},d=()=>{};const l=new Promise((e,t)=>{r=e,d=t});l.catch(()=>{}),a.onNotification=(e,t)=>{"account/login/completed"===e&&(t.success?r():d(new Error("로그인에 실패했습니다.")))},s=setTimeout(()=>d(new Error("로그인 시간이 초과되었습니다. 다시 선택하세요.")),3e5);const c=await a.request("account/login/start",{type:"chatgpt"});if(o=await t(c.authUrl,e,()=>d(new Error("로그인을 취소했습니다."))),await l,(null===(n=null===(i=(await a.request("account/read",{refreshToken:!1})).account)||void 0===i?void 0:i.email)||void 0===n?void 0:n.toLowerCase())!==e.id.toLowerCase())throw await a.request("account/logout"),new Error("선택한 계정과 로그인된 계정이 다릅니다. 다시 선택하세요.")}finally{clearTimeout(s),o(),a.close()}}else{const i=P(e,["auth","login","--claudeai","--email",e.id]);try{if(await new Promise((n,a)=>{let s=!1,r="";const d=setTimeout(()=>{i.kill(),a(new Error("로그인 시간이 초과되었습니다."))},3e5),l=n=>{r=(r+n.toString()).slice(-32e3);const a=r.match(/https:\/\/(?:claude\.ai|console\.anthropic\.com|platform\.claude\.com)\/[^\s\x1b]+/);a&&!s&&(s=!0,t(a[0],e,()=>i.kill()).then(e=>{o=e},()=>{i.kill()}))};i.stdout.on("data",l),i.stderr.on("data",l),i.on("error",()=>{clearTimeout(d),a(new Error("Claude 로그인을 실행하지 못했습니다."))}),i.on("exit",e=>{clearTimeout(d),0===e?n():a(new Error("Claude 로그인이 완료되지 않았습니다."))})}),k("claude",m(e)).toLowerCase()!==e.id.toLowerCase())throw new Error("선택한 계정과 로그인된 계정이 다릅니다. 다시 로그인하세요.")}finally{o(),i.killed||i.kill()}}await x(e),(0,h.resetAccountRefreshAfterLogin)(m(e))}},3532(e,t){t.identifyAgent=t.detectProfileFor=t.profileFor=t.unionProfile=t.d=t.AGENT_PROFILES=t.CODEX_BUSY_TITLE=t.CODEX_WAITING_TITLE=t.CODEX_APPROVAL_PATTERNS=void 0;const i=/\(y\/n\)/i,n=/\[y\/N\]/i,o=/Press Enter to continue/i,a=/ctrl\+c to (?:interrupt|cancel|stop)/i,s=[">","❯","›","❭","➜"],r={id:"claude",label:"Claude Code",icon:'<svg viewBox="0 0 16 16" width="12" height="12" fill="none" aria-hidden="true"><g stroke="#d97757" stroke-width="2.1" stroke-linecap="round"><path d="M8 1.7V14.3"/><path d="M2.55 4.85 13.45 11.15"/><path d="M2.55 11.15 13.45 4.85"/></g></svg>',processHints:["claude"],titleHints:["claude"],waitingPatterns:[/Do you want to\b/i,/❯\s*1\.\s*Yes/,i,n,o],busyPatterns:[/esc to interrupt/i,a,/\btokens?\b.{0,20}\besc\b/i],limitedPatterns:[],busyTitleMarks:["✳","✻","✽","✶","✢","◐","◓","◑","◒"],imagePasteKey:"alt-v",promptHeads:["❯",">"],patternsProven:!0};t.CODEX_APPROVAL_PATTERNS=[/^[\t ]*Allow the [^\r\n]+ MCP server to run tool [^\r\n]+\?[\t ]*$/im,/^[\t ]*(?:[›>][\t ]*)?\d+\.[\t ]*(?:Always allow|Allow(?: for this session)?)[\t ]+Run the tool\b/im],t.CODEX_WAITING_TITLE=/^\s*\[\s*!\s*\]\s*Action Required\s*\|/i,t.CODEX_BUSY_TITLE=/^\s*[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+/;const d={id:"codex",label:"Codex CLI",icon:'<svg viewBox="0 0 16 16" width="12" height="12" fill="none" aria-hidden="true"><path d="M8 1.4 13.7 4.7v6.6L8 14.6 2.3 11.3V4.7z" stroke="#10a37f" stroke-width="1.7" stroke-linejoin="round"/></svg>',processHints:["codex"],titleHints:["codex"],waitingPatterns:[...t.CODEX_APPROVAL_PATTERNS,i,n,o],busyPatterns:[a],limitedPatterns:[/usage limit reached/i,/reached your usage limit/i],busyTitleMarks:[],imagePasteKey:"ctrl-v",promptHeads:s,patternsProven:!1},l={id:"gemini",label:"Gemini CLI",icon:'<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><path fill="#4285f4" d="M8 0c0 4.418 3.582 8 8 8-4.418 0-8 3.582-8 8 0-4.418-3.582-8-8-8 4.418 0 8-3.582 8-8z"/></svg>',processHints:["gemini"],titleHints:["gemini"],waitingPatterns:[/Allow execution of\b/i,/●\s*\d+\.\s*Allow once/],busyPatterns:[/esc to cancel/i],limitedPatterns:[],busyTitleMarks:["✦"],imagePasteKey:"config",promptHeads:s,promptShape:{ruleChars:["▄","▀","─","━","═","-"]},screenShape:{ruleChars:["▄","▀","─","━","═"]},patternsProven:!0};t.AGENT_PROFILES=[r,d,l];const c=["codex","gemini","claude"];function u(e){const t=new Set,i=[];for(const n of e){const e=`${n.source}\0${n.flags}`;t.has(e)||(t.add(e),i.push(n))}return i}function p(e){return[...new Set(e)]}function h(e){var i;return null!==(i=t.AGENT_PROFILES.find(t=>t.id===e))&&void 0!==i?i:t.d}t.d={id:"unknown",label:"알 수 없음",icon:"",processHints:p(t.AGENT_PROFILES.flatMap(e=>e.processHints)),titleHints:p(t.AGENT_PROFILES.flatMap(e=>e.titleHints)),waitingPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.waitingPatterns)),busyPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.busyPatterns)),limitedPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.limitedPatterns)),busyTitleMarks:p(t.AGENT_PROFILES.flatMap(e=>e.busyTitleMarks)),imagePasteKey:"config",promptHeads:p([...s,...t.AGENT_PROFILES.flatMap(e=>e.promptHeads)]),patternsProven:!0},t.unionProfile=function(){return t.d},t.profileFor=h,t.detectProfileFor=function(e){const i=h(e);if(i.patternsProven)return i;const n=t.d;return{...i,waitingPatterns:n.waitingPatterns,busyPatterns:n.busyPatterns,limitedPatterns:n.limitedPatterns,busyTitleMarks:n.busyTitleMarks,promptShape:void 0,screenShape:void 0}},t.identifyAgent=function(e,t){const i=(null!=e?e:"").toLowerCase();for(const e of c)if(h(e).processHints.some(e=>i.includes(e)))return e;const n=(null!=t?t:"").toLowerCase();for(const e of c)if(h(e).titleHints.some(e=>n.includes(e)))return e;return"unknown"}},4883(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckAlertService=void 0;const a=i(860),s=i(7650),r=i(6021),d=i(4300),l=i(7797),c=["waiting","error","limited"];let u=class{constructor(e,t,i,n){this.app=e,this.config=t,this.zone=i,this.status=n,this.last=new WeakMap,this.flashing=!1,this.badgeShown=0,this.badgeCache=new Map,this.debug={flashes:0,badgeCount:0,badgeDraws:0,toasts:0,transitions:0,lastFocused:null,forceUnfocused:!1}}init(){this.app.ready$.subscribe(()=>{var e;try{this.setup()}catch(t){this.diag(`alert setup ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}})}setup(){var e;for(const e of this.app.tabs)this.last.set(e,this.status.get(e).status);this.status.changed$.subscribe(()=>{var e;try{this.onChanged()}catch(t){this.diag(`alert onChanged ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}}),this.app.tabClosed$.subscribe(e=>{var t;this.last.delete(e);try{this.updateBadge(this.countAlerting())}catch(e){this.diag(`alert tabClosed ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}),window.addEventListener("focus",()=>this.stopFlash());const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.alert=this.debug,this.diag(`alert ready tabs=${this.app.tabs.length}`)}onChanged(){const e=[];let t=0;for(const i of this.app.tabs){const n=this.status.get(i).status,o=this.last.get(i);this.last.set(i,n),c.includes(n)&&(t++,o!==n&&e.push(i))}if(this.updateBadge(t),0===e.length)return;this.debug.transitions+=e.length;const i=this.isFocused();if(this.debug.lastFocused=i,!i&&(this.diag(`alert enter=${e.length} count=${t} focused=${i}`),this.config.store.agentDeck.alertFlash&&this.flash(),this.config.store.agentDeck.alertToast))for(const t of e)this.toast(t)}countAlerting(){let e=0;for(const t of this.app.tabs)c.includes(this.status.get(t).status)&&e++;return e}win(){var e,t,i,n;try{const o=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(n=null===(i=null===(t=null==o?void 0:o("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===i?void 0:i.call(t))&&void 0!==n?n:null}catch{return null}}nativeImage(){var e,t,i;try{const n=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(i=null===(t=null==n?void 0:n("electron"))||void 0===t?void 0:t.nativeImage)&&void 0!==i?i:null}catch{return null}}isFocused(){if(this.debug.forceUnfocused)return!1;try{const e=this.win();if(null==e?void 0:e.isFocused)return!!e.isFocused()}catch{}return document.hasFocus()}flash(){var e;try{const e=this.win();if(!(null==e?void 0:e.flashFrame))return;e.flashFrame(!0),this.flashing=!0,this.debug.flashes++}catch(t){this.diag(`alert flash ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}}stopFlash(){var e,t;if(this.flashing){this.flashing=!1;try{null===(t=null===(e=this.win())||void 0===e?void 0:e.flashFrame)||void 0===t||t.call(e,!1)}catch{}}}updateBadge(e){var t;this.debug.badgeCount=e;const i=this.config.store.agentDeck.alertBadge?e:0;if(i!==this.badgeShown)try{const e=this.win();if(!(null==e?void 0:e.setOverlayIcon))return;if(0===i)return e.setOverlayIcon(null,""),this.badgeShown=0,void this.stopFlash();const t=this.badgeImage(i);if(!t)return;e.setOverlayIcon(t,`승인대기/오류 ${i}개`),this.badgeShown=i,this.debug.badgeDraws++}catch(e){this.diag(`alert badge ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}badgeImage(e){var t;const i=this.app.tabs.some(e=>"error"===this.status.get(e).status)?d.STATUS_STYLES.error.color:d.STATUS_STYLES.waiting.color,n=`${e}:${i}`,o=this.badgeCache.get(n);if(o)return o;const a=this.nativeImage();if(!a)return null;const s=e>9?"9+":String(e);let r;try{if(r=a.createEmpty(),r.addRepresentation({scaleFactor:1,width:16,height:16,dataURL:this.drawBadge(16,s,i)}),r.addRepresentation({scaleFactor:2,width:32,height:32,dataURL:this.drawBadge(32,s,i)}),null===(t=r.isEmpty)||void 0===t?void 0:t.call(r))throw new Error("empty after addRepresentation")}catch{r=a.createFromDataURL(this.drawBadge(32,s,i))}return this.badgeCache.set(n,r),r}drawBadge(e,t,i){const n=document.createElement("canvas");n.width=e,n.height=e;const o=n.getContext("2d");if(!o)throw new Error("canvas 2d 미지원");const a=e/2;return o.clearRect(0,0,e,e),o.beginPath(),o.arc(a,a,a-.5,0,2*Math.PI),o.fillStyle=i,o.fill(),o.lineWidth=Math.max(1,e/16),o.strokeStyle="rgba(255,255,255,0.85)",o.stroke(),o.fillStyle="#ffffff",o.font=`bold ${Math.round(e*(t.length>1?.55:.7))}px "Segoe UI", sans-serif`,o.textAlign="center",o.textBaseline="middle",o.fillText(t,a,a+.04*e),n.toDataURL("image/png")}toast(e){var t;try{if("undefined"==typeof Notification)return;const t=this.status.get(e),i=t.label||e.title||"(제목 없음)",n=d.STATUS_STYLES[t.status],o=new Notification("AgentDeck",{body:`${i} — ${n.label}`,tag:`agentdeck-${this.tabKey(e)}`});this.debug.toasts++,o.onclick=()=>{var t,i;try{const e=this.win();null===(t=null==e?void 0:e.show)||void 0===t||t.call(e),null===(i=null==e?void 0:e.focus)||void 0===i||i.call(e)}catch{}this.zone.run(()=>{this.app.tabs.includes(e)&&this.app.selectTab(e)}),o.close()}}catch(e){this.diag(`alert toast ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}tabKey(e){const t=this.app.tabs.indexOf(e);return t>=0?String(t):"x"}diag(e){(0,l.diag)(e)}};u=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService,a.NgZone,r.WorkStatusService])],u),t.AgentDeckAlertService=u},4300(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.STATUS_STYLES=void 0,t.STATUS_STYLES={running:{icon:"●",label:"진행중",color:"#e5c07b"},waiting:{icon:"⏸",label:"승인대기",color:"#61afef"},limited:{icon:"⛔",label:"한도 도달",color:"#c678dd"},done:{icon:"✔",label:"완료",color:"#98c379"},error:{icon:"✖",label:"오류",color:"#e06c75"},idle:{icon:"○",label:"대기",color:"#6b727d"}}},5929(e,t){t.pickTabByPids=void 0,t.pickTabByPids=function(e,t){const i=(null!=e?e:[]).filter(e=>Number.isInteger(e)&&e>0);let n=!1;for(const e of t.values())if(e.length){n=!0;break}if(!i.length||!n)return{tab:null,mode:"legacy"};const o=new Set(i);for(const[e,i]of t)if(i.some(e=>o.has(e)))return{tab:e,mode:"pid"};return{tab:null,mode:"pid-miss"}}},1786(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.uninstallHooks=t.installHooks=t.hooksInstalled=t.stripHooks=t.mergeHooks=t.isMerged=t.hooksSupported=t.notifyScriptPath=t.claudeSettingsPath=void 0;const s=a(i(9896)),r=i(7025),d=a(i(6928)),l="agentdeck-notify",c=[{event:"UserPromptSubmit",args:"-Status running"},{event:"Notification",args:"-Status waiting"},{event:"PostToolUse",args:"-Status running"},{event:"PostToolUseFailure",args:"-Status running"},{event:"PermissionDenied",args:"-Status running"},{event:"SubagentStart",args:"-Subagent start"},{event:"SubagentStop",args:"-Subagent stop"},{event:"Stop",args:"-Status done"},{event:"StopFailure",args:"-Status error"}];function u(){return d.join((0,r.agentHome)("claude"),"settings.json")}function p(){return d.join(__dirname,"..","hooks","agentdeck-notify.ps1")}function h(){try{const e=s.readFileSync(u(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function g(e){return(Array.isArray(e)?e:[]).filter(e=>!JSON.stringify(null!=e?e:"").includes(l))}function f(e){var t;const i=null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{};return c.every(e=>(Array.isArray(i[e.event])?i[e.event]:[]).some(e=>JSON.stringify(null!=e?e:"").includes(l)))}function m(e,t){var i;const n={...null!=e?e:{}};n.hooks={...null!==(i=n.hooks)&&void 0!==i?i:{}};for(const e of c){const i=`powershell -NoProfile -ExecutionPolicy Bypass -File "${t}" ${e.args}`;n.hooks[e.event]=[...g(n.hooks[e.event]),{matcher:"*",hooks:[{type:"command",command:i,timeout:5}]}]}return n}function v(e){const t={...null!=e?e:{}};if(!t.hooks)return t;t.hooks={...t.hooks};for(const e of c){const i=g(t.hooks[e.event]);i.length?t.hooks[e.event]=i:delete t.hooks[e.event]}return t}function b(e){const t=u();s.mkdirSync(d.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,t+".agentdeck-backup"),s.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}t.claudeSettingsPath=u,t.notifyScriptPath=p,t.hooksSupported=function(){return"win32"===process.platform&&s.existsSync(p())},t.isMerged=f,t.mergeHooks=m,t.stripHooks=v,t.hooksInstalled=function(){return f(h())},t.installHooks=function(){const e=p();if(!s.existsSync(e))throw new Error(`훅 스크립트를 찾지 못했다: ${e}`);b(m(h(),e))},t.uninstallHooks=function(){b(v(h()))}},2627(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.setCodexHooks=t.codexHooksInstalled=t.mergeCodexHooks=t.stripCodexHooks=t.codexEventLabel=t.codexDisabledEvents=t.codexConfigPath=t.codexHooksPath=t.CODEX_EVENTS=void 0;const s=a(i(9896)),r=i(7025),d=a(i(6928)),l="agentdeck-codex-notify.ps1";function c(){return d.join((0,r.agentHome)("codex"),"hooks.json")}function u(){return d.join((0,r.agentHome)("codex"),"config.toml")}function p(e){const t=/^\[hooks\.state\.'([^']*)'\]/.exec(e);if(t)return t[1];const i=/^\[hooks\.state\."((?:[^"\\]|\\.)*)"\]/.exec(e);return i?i[1].replace(/\\(.)/g,"$1"):null}function h(e){const i=e.replace(/(^|_)([a-z])/g,(e,t,i)=>i.toUpperCase());return t.CODEX_EVENTS.includes(i)?i:e}function g(e){return"string"==typeof(null==e?void 0:e.command)&&e.command.includes(l)}function f(e){var t;const i={...null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{}};for(const e of Object.keys(i)){if(!Array.isArray(i[e]))throw new Error(`Invalid hooks.${e}: expected an array`);i[e]=i[e].map(t=>{if(!Array.isArray(null==t?void 0:t.hooks))throw new Error(`Invalid hooks.${e} group`);return{...t,hooks:t.hooks.filter(e=>!g(e))}}).filter(e=>e.hooks.length),i[e].length||delete i[e]}return{...e,hooks:i}}function m(e,i){var n;const o=f(e),a=`powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${i}"`;for(const e of t.CODEX_EVENTS)o.hooks[e]=[...null!==(n=o.hooks[e])&&void 0!==n?n:[],{hooks:[{type:"command",command:a,timeout:3}]}];return o}function v(){const e=c();if(!s.existsSync(e))return{};const t=JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""));if(!t||"object"!=typeof t||Array.isArray(t)||null!=t.hooks&&("object"!=typeof t.hooks||Array.isArray(t.hooks)))throw new Error("Invalid Codex hooks.json; existing configuration was not changed");return t}t.CODEX_EVENTS=["UserPromptSubmit","PreToolUse","PermissionRequest","PostToolUse","Stop","Interrupt","SessionEnd"],t.codexHooksPath=c,t.codexConfigPath=u,t.codexDisabledEvents=function(){let e;try{e=s.readFileSync(u(),"utf8")}catch{return[]}const i=[],n=e=>e.toLowerCase().replace(/\\/g,"/"),o=n(c());for(const a of e.split(/\n(?=\[)/)){const e=p(a);if(!e)continue;const s=e.split(":");if(s.length<4)continue;s.pop(),s.pop();const r=s.pop();n(s.join(":"))===o&&t.CODEX_EVENTS.includes(h(r))&&/^\s*enabled\s*=\s*false\s*$/m.test(a)&&i.push(r)}return i},t.codexEventLabel=h,t.stripCodexHooks=f,t.mergeCodexHooks=m,t.codexHooksInstalled=function(){const e=v();return t.CODEX_EVENTS.every(t=>{var i,n;return null===(n=null===(i=e.hooks)||void 0===i?void 0:i[t])||void 0===n?void 0:n.some(e=>{var t;return null===(t=e.hooks)||void 0===t?void 0:t.some(g)})})},t.setCodexHooks=function(e){const t=c(),i=d.join(__dirname,"..","hooks",l);if(e&&!s.existsSync(i))throw new Error(`Missing hook: ${i}`);const n=v(),o=e?m(n,i):f(n);s.mkdirSync(d.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,`${t}.agentdeck-backup-${Date.now()}`),s.writeFileSync(t,JSON.stringify(o,null,2)+"\n","utf8")}},6743(e,t){t.installCodexKeys=void 0,t.installCodexKeys=function(e,t,i){var n;const o=null===(n=null==e?void 0:e.xterm)||void 0===n?void 0:n.element;o&&!e.__adCodexKeys&&(e.__adCodexKeys=!0,o.addEventListener("keydown",e=>{!t()||"ArrowUp"!==e.key||!e.altKey||e.ctrlKey||e.shiftKey||e.metaKey||e.isComposing||(e.preventDefault(),e.stopImmediatePropagation(),i(""))},{capture:!0}))}},102(e,t){function i(e){const t=Number(e);return Number.isFinite(t)?t:0}function n(e){if(!e||"object"!=typeof e)return null;const t=Number(e.used_percent);return Number.isFinite(t)?{pct:Math.max(0,Math.min(100,Math.round(t))),windowMinutes:i(e.window_minutes),resetsAt:i(e.resets_at)}:null}function o(e,t){var o,a,s,r,d,l,c,u,p,h,g;const f=t.trim();if(!f)return;let m;try{m=JSON.parse(f)}catch{return void e.skipped++}e.lines++;const v=null!==(o=null==m?void 0:m.payload)&&void 0!==o?o:{},b=String(null!==(a=null==m?void 0:m.type)&&void 0!==a?a:"");if("session_meta"===b)return e.cwd=String(null!==(s=v.cwd)&&void 0!==s?s:e.cwd),e.cliVersion=String(null!==(r=v.cli_version)&&void 0!==r?r:e.cliVersion),void(e.contextWindow=i(v.context_window)||e.contextWindow);if("turn_context"===b)return e.model=String(null!==(d=v.model)&&void 0!==d?d:e.model),v.effort&&(e.effort=String(v.effort)),void(e.cwd=String(null!==(l=v.cwd)&&void 0!==l?l:e.cwd));if("token_count"===(null==v?void 0:v.type)){const t=v.rate_limits;t&&(e.primary=null!==(c=n(t.primary))&&void 0!==c?c:e.primary,e.secondary=null!==(u=n(t.secondary))&&void 0!==u?u:e.secondary);const o=i(null===(p=v.info)||void 0===p?void 0:p.model_context_window);o>0&&(e.contextWindow=o);const a=null===(g=null===(h=v.info)||void 0===h?void 0:h.last_token_usage)||void 0===g?void 0:g.total_tokens;Number.isFinite(Number(a))&&(e.lastTokens=Number(a))}}t.emailFromIdToken=t.codexLimits=t.codexContextPct=t.feedCodexChunk=t.createCodexState=void 0,t.createCodexState=function(){return{model:"",effort:"",cwd:"",cliVersion:"",contextWindow:0,lastTokens:0,primary:null,secondary:null,pending:"",lines:0,skipped:0,dropped:0}},t.feedCodexChunk=function(e,t){var i;const n="string"==typeof t?t:"";if(!n)return;const a=(e.pending+n).split("\n");e.pending=null!==(i=a.pop())&&void 0!==i?i:"",e.pending.length>2097152&&(e.dropped++,e.pending="");for(const t of a)o(e,t)},t.codexContextPct=function(e){return e.contextWindow<=0||e.lastTokens<=0?null:Math.max(0,Math.min(100,Math.round(e.lastTokens/e.contextWindow*100)))},t.codexLimits=function(e){const t=t=>{var i;return null!==(i=[e.primary,e.secondary].find(e=>e&&e.windowMinutes===t))&&void 0!==i?i:null},i=t(300),n=t(10080);return{fiveHourPct:i?i.pct:null,fiveHourResetsAt:i?i.resetsAt:0,sevenDayPct:n?n.pct:null,sevenDayResetsAt:n?n.resetsAt:0}},t.emailFromIdToken=function(e){var t,i;const n=String(null!=e?e:"").split(".")[1];if(!n)return"";try{const e=n.length%4?"=".repeat(4-n.length%4):"",o=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/")+e,"base64").toString("utf8");return String(null!==(i=null===(t=JSON.parse(o))||void 0===t?void 0:t.email)&&void 0!==i?i:"")}catch{return""}}},160(e,t){function i(e){var t;return/^\s*\/ T R A N S C R I P T\b/.test(null!==(t=e[0])&&void 0!==t?t:"")&&e.slice(-4).some(e=>/q close/.test(e))}t.installCodexWheel=void 0,t.installCodexWheel=function(e,t,n){const o=null==e?void 0:e.xterm,a=null==o?void 0:o.element;if(!a||e.__adCodexWheel)return;e.__adCodexWheel=!0;let s=!1,r=0;const d=()=>{const e=o.buffer.active;return Array.from({length:o.rows},(t,i)=>{var n,o;return null!==(o=null===(n=e.getLine(e.baseY+i))||void 0===n?void 0:n.translateToString(!0))&&void 0!==o?o:""})},l=e=>{e&&n((e<0?"":"").repeat(Math.min(12,Math.abs(e))))};a.addEventListener("wheel",e=>{if(!t()||e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||!e.deltaY||Math.abs(e.deltaX)>Math.abs(e.deltaY))return;const a=d(),c=i(a),u=o.buffer.active,p=a.reduce((e,t,i)=>t.trim()?i+1:e,0),h=a.slice(Math.max(0,p-4),p).some(e=>/Context \d+% left/.test(e));if(!c&&!s&&("normal"!==u.type||u.baseY>0||!h||e.deltaY>0))return;e.preventDefault(),e.stopImmediatePropagation();const g=Math.sign(e.deltaY)*Math.max(1,Math.min(12,Math.ceil(Math.abs(e.deltaY)/(1===e.deltaMode?1:40))));if(c)return void l(g);if(r=Math.max(-12,Math.min(12,r+g)),s)return;s=!0,n("");let f=0;const m=()=>{if(!t()||++f>20)return s=!1,void(r=0);i(d())?(s=!1,l(r),r=0):setTimeout(m,50)};setTimeout(m,50)},{capture:!0,passive:!1})}},7028(e,t,i){t.defaultHotkeys=t.AgentDeckConfigProvider=t.LAYOUT_DEFAULTS=void 0;const n=i(7650);t.LAYOUT_DEFAULTS={sidebarDock:"right",sidebarWidth:0,sidebarHeight:200,viewerDock:"right",viewerWidth:420};class o extends n.ConfigProvider{constructor(){super(...arguments),this.defaults={agentDeck:{sessionIdentities:[],aliasProjects:[],accountStorageDir:"",claudeStorageDir:"",codexStorageDir:"",enabled:!0,mailboxWake:{enabled:!0,typingGuardMs:3e3,text:"[agentdeck] 새 메시지 {N}건 도착 receive 로 확인하고 acknowledge 할 것"},aspectW:4,aspectH:3,sidebarMin:200,sidebarMax:560,...t.LAYOUT_DEFAULTS,viewerOpen:!1,viewerScrape:!0,viewerPreload:!0,viewerAutoOpen:!1,viewerFollowMode:"",viewerFollow:!0,viewerDropOpen:"ask",viewerRecentMax:12,notifyPort:47500,notifyChannel:!0,hookPromptDismissed:!1,noTabRecovery:!1,devMode:!0,autoUpdate:!0,updateCheckIntervalHours:0,lastUpdateCheck:0,updateRegistry:"https://registry.npmjs.org",idleAfterMs:2500,staleAfterMs:3e5,autoDetect:!0,showElapsed:!0,subagentCount:!0,metaLine:!0,sortByStatus:!1,searchBox:!0,keyboardNav:!0,keyboardNavWrap:!1,keyboardCloseTab:!0,dragAutoScroll:!0,collapsedGroups:[],resumeList:!0,resumeListLimit:0,resumeListDays:0,resumeExpanded:[],resumeHidden:[],keepRenderingWhenHidden:!0,enterAsLabel:!0,claimCtrlV:!0,claimNewTabKey:!0,claimRepairKey:!0,closePaneKey:"Ctrl-Q",claimShiftEnter:!0,releaseHomeEnd:!0,imeOrderGuard:!0,pasteImageWithCtrlV:!0,imagePasteKey:"alt-v",claimRightClick:!0,rightClickMenuMs:250,terminalOpacity:75,sidebarOpacity:75,clipBackgroundToTerminal:!0,autoRepairScreen:!0,screenWatch:!0,autoRepairCooldownMs:1e4,autoRepairMinStreak:2,autoRepairMaxPerTab:3,repairHard:!1,repairSendRedrawKey:!1,rootProfile:!1,rootProfiles:[],rootProfileName:"Agent Root",rootProfileCwd:"",rootProfileCommand:"powershell.exe",rootProfileArgs:["-NoLogo","-ExecutionPolicy","Bypass"],rootProfileEnv:{TERM:"xterm-256color",COLORTERM:"truecolor",FORCE_COLOR:"3"},rootProfileClaimed:!1,alertFlash:!0,alertBadge:!0,alertToast:!1},hotkeys:{"agentdeck-toggle":[],"agentdeck-newline":["Ctrl-Enter","Shift-Enter"],"agentdeck-paste":["Ctrl-V"],"agentdeck-focus-list":["Ctrl-L"],"agentdeck-jump-1":["Ctrl-1"],"agentdeck-jump-2":["Ctrl-2"],"agentdeck-jump-3":["Ctrl-3"],"agentdeck-jump-4":["Ctrl-4"],"agentdeck-jump-5":["Ctrl-5"],"agentdeck-jump-6":["Ctrl-6"],"agentdeck-jump-7":["Ctrl-7"],"agentdeck-jump-8":["Ctrl-8"],"agentdeck-jump-9":["Ctrl-9"],"agentdeck-new-tab":["Ctrl-T","⌘-T"],"agentdeck-view":["Ctrl-O"],"agentdeck-view-mode":[],"agentdeck-repair":["Ctrl-R"]}}}}t.AgentDeckConfigProvider=o,t.defaultHotkeys=function(){var e;const t=new o,i={...t.defaults.hotkeys};i["split-right"]=["Ctrl-S"],i["split-bottom"]=["Ctrl-D"];const n=String(null!==(e=t.defaults.agentDeck.closePaneKey)&&void 0!==e?e:"").trim();return i["close-pane"]=n?[n]:[],i}},5140(e,t,i){t.installCursorVisibilityFix=void 0;const n=i(673);class o{constructor(){this.pending="",this.corrections=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;for(let e=4;e>0;e--)if(i.endsWith("[25".slice(0,e))){this.pending=i.slice(-e),i=i.slice(0,-e);break}return i.replace(/\x1b\[25([lh])/g,(e,t)=>(this.corrections++,`[?25${t}`))}}class a{constructor(){this.pending="",this.changes=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;const n=/\x1b(?:\[[0-9]*\x20?)?$/.exec(i);return n&&(this.pending=n[0],i=i.slice(0,-n[0].length)),i.replace(/\x1b\[([0-9]*)\x20q/g,(e,t)=>{const i=""===t?0:Number(t);if(!Number.isFinite(i)||i>6)return e;const n=i<=1?2:i%2==1?i+1:i;return n!==i&&this.changes++,`[${n} q`})}}t.installCursorVisibilityFix=function(e,t,i,r){if(!e||"function"!=typeof e.write||e.__adCursorVisibilityFix)return;const d={calls:0,active:0,forwarded:0,buffered:0,timeouts:0,deferredShows:0},l=e.write.bind(e),c=new o,u=new a,p=new n.SynchronizedOutputStream,h=new s;let g,f;const m=e=>e?(d.forwarded++,l(e)):Promise.resolve();let v=null;const b=()=>{f&&(clearTimeout(f),f=void 0),p.waiting||h.visible===v||(f=setTimeout(()=>{f=void 0,h.visible!==v&&(v=h.visible,Promise.resolve(m(v?"[?25h":"[?25l")).catch(()=>{}))},50))};let k,y="",w=0;const x=(e,t)=>{k&&(clearTimeout(k),k=void 0);const i=y+e,n=y?w:0;return y="",t&&i?n&&Date.now()-n>=48?i:(y=i,w=n||Date.now(),k=setTimeout(()=>{k=void 0;const e=y;y="",e&&Promise.resolve(m(e)).catch(()=>{})},24),""):i};let S;if(e.__adCursorVisibilityFix=!0,r){r("installed stable-cursor");for(const e of[5e3,15e3,3e4])setTimeout(()=>r(JSON.stringify({...d,corrections:c.corrections,steadied:u.changes,waiting:p.waiting,elapsedMs:e})),e)}e.write=n=>{const o=c.corrections,a=t(n);d.calls++,a&&d.active++,f&&(clearTimeout(f),f=void 0),(t=>{const i=e.xterm;i&&i.options&&(t?(void 0===S&&(S=!!i.options.cursorBlink),i.options.cursorBlink&&(i.options.cursorBlink=!1)):void 0!==S&&(i.options.cursorBlink=S,S=void 0))})(a),a||null===v||(v=null);const s=u.write(c.write(n,a),a),l=h.deferredShows,k=p.write(h.write(s,a),a);d.deferredShows+=h.deferredShows-l,r&&0===l&&h.deferredShows>0&&r(`stable-cursor engaged active=${a} deferredShows=${h.deferredShows}`),p.waiting&&d.buffered++,!p.waiting&&g&&(clearTimeout(g),g=void 0),p.waiting&&!g&&(g=setTimeout(()=>{g=void 0,d.timeouts++,Promise.resolve(m(x(p.flush(),!0))).catch(()=>{}),b()},200)),!o&&c.corrections&&i();const y=m(x(k,a));return a&&b(),y}};class s{constructor(){this.pending="",this.visible=!0,this.deferredShows=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;for(let e=5;e>0;e--)if(i.endsWith("[?25".slice(0,e))){this.pending=i.slice(-e),i=i.slice(0,-e);break}return i.replace(/\x1b\[\?25([lh])/g,(e,t)=>(this.visible="h"===t,this.deferredShows++,""))}}},4494(e,t,i){var n,o=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&o(t,e,i);return a(t,e),t},d=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},l=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckService=t.matchesSearchTokens=t.searchTokens=t.foldSearchText=void 0;const c=r(i(9896)),u=i(3496),p=i(6570),h=i(860),g=i(7650),f=i(3438),m=i(1836),v=i(568),b=i(5140),k=i(5633),y=i(160),w=i(6743),x=i(7650),S=i(3700),C=i(6021),j=i(7110),A=i(4867),E=i(7838),P=i(9888),z=i(3824),D=i(1385),T=i(3532),O=i(4300),_=i(9660),I=i(9851),R=i(3090),N=i(7025),M=i(2007),L=i(2839),$=i(8066),F=i(9306),H=i(1481),B=i(7617),q=i(7144),W=i(6879),K=i(4086),U=i(9137),G=i(1424),V=i(5916),J=i(2425),Y=i(3097),Z=i(7604),X=i(7797),Q="agentdeck-sidebar",ee="ad-bg-clip",te=320,ie=1500,ne=[150,400,900,1800,3e3],oe=[250,800,1800];let ae;function se(){var e,t,n,o,a;if(void 0!==ae)return ae;try{ae=null!==(t=null===(e=i(4157))||void 0===e?void 0:e.clipboard)&&void 0!==t?t:null}catch(e){ae=null,(0,X.diagCatch)("clipboard require(electron)",e)}if(!ae)try{const e=null!==(n=window.require)&&void 0!==n?n:globalThis.require;ae=null!==(a=null===(o=null==e?void 0:e("electron"))||void 0===o?void 0:o.clipboard)&&void 0!==a?a:null}catch(e){ae=null,(0,X.diagCatch)("clipboard window.require",e)}return ae||(0,X.diagOnce)("clipboard-missing","clipboard 없음 — 이미지 붙여넣기 불가"),ae}function re(e){const t="number"==typeof e&&isFinite(e)?e:100;return Math.min(100,Math.max(0,Math.round(t)))}function de(e){if("string"!=typeof e||!e)return"";let t=e;try{t=t.normalize("NFC")}catch{}return t.toLowerCase().replace(/\\/g,"/")}function le(e){return de(e).split(/\s+/).filter(e=>e.length>0)}function ce(e,t){if(!t.length)return!0;const i=[];for(const t of e){const e=de(t);e&&i.push(e)}return t.every(e=>i.some(t=>t.includes(e)))}t.foldSearchText=de,t.searchTokens=le,t.matchesSearchTokens=ce;let ue=n=class{setupMailboxWake(){this.notify.setMailboxWake(e=>this.mailboxWake.enqueue(e));const e=e=>{var t,i;for(const n of this.app.tabs){const o=n,a="function"==typeof o.getAllTabs?o.getAllTabs():[o];for(const n of a){const o=null===(i=null===(t=n.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea;if(o&&e.target===o)return this.mailboxLastInput.set(n,Date.now()),"compositionstart"===e.type&&this.mailboxComposing.add(n),"compositionend"===e.type&&this.mailboxComposing.delete(n),void("compositionend"===e.type?setTimeout(()=>this.mailboxWake.flushAll(),0):this.mailboxWake.flushAll())}}};for(const t of["keydown","paste","input","compositionstart","compositionupdate","compositionend"])document.addEventListener(t,e,!0)}identityOf(e){var t,i,n,o,a,s;const r=this.config.store.agentDeck,d=null!==(t=r.sessionIdentities)&&void 0!==t?t:r.sessionIdentities=[],l="function"==typeof e.getAllTabs?e.getAllTabs():[e];if(!l.some(e=>{var t;return null===(t=e.profile)||void 0===t?void 0:t.options}))return{id:"",letter:"",alias:""};let c=this.identityIds.get(e);if(!c){if(c=l.map(e=>{var t,i,n;return null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n.AGENTDECK_IDENTITY}).find(Boolean),!c||this.app.tabs.some(t=>t!==e&&this.identityIds.get(t)===c))do{c=(0,P.newTabId)()}while(d.some(e=>e.id===c));this.identityIds.set(e,c)}for(const e of l)(null===(i=e.profile)||void 0===i?void 0:i.options)&&(null===(n=e.profile.options.env)||void 0===n?void 0:n.AGENTDECK_IDENTITY)!==c&&(e.profile={...e.profile,options:{...e.profile.options,env:{...e.profile.options.env,AGENTDECK_IDENTITY:c}}});const u=d.length,p=!!(null===(o=d.find(e=>e.id===c))||void 0===o?void 0:o.alias),h=`${(0,D.stripTitleMarker)(e.customTitle||e.title||"")} ${this.status.get(e).label||""}`.trim(),g=this.notify.cwdOf(e)||(null===(a=this.cwdCache.get(e))||void 0===a?void 0:a.dir)||l.map(e=>{var t,i;return null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.cwd}).find(Boolean)||"",f=null!==(s=r.aliasProjects)&&void 0!==s?s:r.aliasProjects=[],m=JSON.stringify(f),v=(0,E.adaptiveAliasBase)(h,g,f,(0,K.projectRootOf)(g)||"");if(!v&&!p)return{id:c,letter:"",alias:""};const b=new E.SessionIdentities(d).ensure(c,v);return u===d.length&&p&&JSON.stringify(f)===m||this.config.save(),b}syncSessionSlots(){var e,t,i;this.notify.setNavigationRefresh(()=>this.syncSessionSlots());const n=this.app.tabs.filter(e=>!(e instanceof S.SettingsTabComponent)),o=e=>"function"==typeof e.getAllTabs?e.getAllTabs():[e];this.sessionSlots.reconcile(n,e=>{const t=o(e).map(e=>{var t,i,n;return null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n.AGENTDECK_SLOT}).find(Boolean);return t?Number(t):null});for(const i of n){const n=this.sessionSlots.numberOf(i);if(null!==n)for(const a of o(i))(null===(e=a.profile)||void 0===e?void 0:e.options)&&(null===(t=a.profile.options.env)||void 0===t?void 0:t.AGENTDECK_SLOT)!==String(n)&&(a.profile={...a.profile,options:{...a.profile.options,env:{...a.profile.options.env,AGENTDECK_SLOT:String(n)}}})}this.notify.publishNavigationContext(n.map(e=>{const t=this.identityOf(e),i=this.notify.sessionIdsOf(e);return`Tab alias=${JSON.stringify(t.alias)}: `+(i.length?`session IDs ${i.join(", ")}`:"tab open; session not registered (not addressable yet)")+`; title=${JSON.stringify(String(e.customTitle||e.title||"").slice(0,160))}`+`; ${this.notify.mailboxConnectionState(e)}`+(i.length>1?" (split panes: ask which session; never choose by last activity)":"")}).filter(Boolean).join("\n"));const a=null===(i=this.sidebar)||void 0===i?void 0:i.querySelector(".ad-new");a&&(a.disabled=this.sessionSlots.full,this.sessionSlots.full&&(a.title="ko"===this.sidebarLang?"세션 9개가 열려 있습니다. 하나를 닫아 주세요.":"All 9 session slots are occupied. Close a session first."))}constructor(e,t,i,n,o,a,s,r,d,l,c=null){this.app=e,this.config=t,this.status=i,this.hotkeys=n,this.profiles=o,this.hostWindow=a,this.platform=s,this.notify=r,this.ledger=d,this.zone=l,this.locale=c,this.mailboxLastInput=new WeakMap,this.mailboxComposing=new WeakSet,this.mailboxWakeDisabled=new WeakSet,this.mailboxWake=new z.MailboxWake(e=>{var t,i,n;const o=this.notify.mailboxTarget(e);if(!o)return null;const{tab:a,pane:s}=o,r=null!==(t=this.config.store.agentDeck.mailboxWake)&&void 0!==t?t:{},d=Number(null!==(i=r.typingGuardMs)&&void 0!==i?i:3e3),l=this.status.get(a).status;return{identity:s,enabled:!1!==r.enabled&&!this.mailboxWakeDisabled.has(a),idle:"idle"===l||"done"===l,lastInput:null!==(n=this.mailboxLastInput.get(s))&&void 0!==n?n:0,composing:this.mailboxComposing.has(s)||"composing"===(0,H.readCompositionState)(this.compositionHelper(s)),typingGuardMs:Number.isFinite(d)?Math.max(0,Math.min(d,2147483647)):3e3,text:"string"==typeof r.text?r.text:z.MAILBOX_WAKE_TEXT,send:e=>this.sendToPane(s,"mailbox-wake",()=>e(e=>{var t;if(!(null===(t=s.session)||void 0===t?void 0:t.open))throw new Error("Closed mailbox pane");s.sendInput(e),this.status.setManual(a,"running")}))}},e=>this.diag(e)),this.sessionSlots=new A.SessionSlots,this.identityIds=new WeakMap,this.pendingSessionOpens=0,this.sidebar=null,this.listEl=null,this.nowEl=null,this.accountPopup=null,this.accountPopupTab=null,this.accountSwitchBusy=!1,this.resumeEl=null,this.historySearchPanel=null,this.windowEl=null,this.mainEl=null,this.observer=null,this.editing=null,this.drag=null,this.dragClickGuard=!1,this.lastDragEnd=null,this.dropReject=null,this.searchEl=null,this.searchQuery="",this.statusFilter=null,this.searchComposing=!1,this.navFocus=null,this.renderQueued=!1,this.shiftDownAt=0,this.renderTimer=null,this.listPointerActive=!1,this.lastTermW=-1,this.lastSidebarW=-1,this.lastDock=null,this.profileMemo=new WeakMap,this.pinnedAgents=new WeakMap,this.pinnedCount=0,this.lastBoxKey="",this.dock=null,this.refitQueued=!1,this.view=null,this.lastViewW=-1,this.lastViewSide=null,this.cwdCache=new WeakMap,this.resumeTabs=new Map,this.resumeOpening=new Set,this.resumeStarting=new Map,this.repairInProgress=!1,this.ptyResizeGeneration=new WeakMap,this.outputHits=0,this.tabAgents=new WeakMap,this.paneAgents=new WeakMap,this.agentProbedAt=new WeakMap,this.watched=new WeakSet,this.watchedPanes=new WeakSet,this.screenCheckTimers=new WeakMap,this.emptyTabRetries=new WeakMap,this.screenObs=new WeakMap,this.autoRepairAt=new WeakMap,this.autoRepairCount=new WeakMap,this.autoRepairHealthySince=new WeakMap,this.rightDownAt=0,this.lastRightHandledAt=0,this.nativePasteAt=0,this.lastPasteAt=0,this.pasteProbeUntil=0}get sidebarLang(){var e;return(0,f.pickLang)((null===(e=this.locale)||void 0===e?void 0:e.getLocale())||this.config.store.language||navigator.language)}ui(e,t){return(0,m.sidebarText)(e,this.sidebarLang,t)}uiMarkup(e){return(0,m.sidebarMarkup)(e,this.sidebarLang)}refreshSidebarLanguage(){const e=document.getElementById(Q);if(!e)return;const t=e.querySelector(".ad-search-input");t&&(t.placeholder=this.ui("세션 검색 (제목 · 작업이름 · 폴더)"));for(const[t,i,n]of[[".ad-search-clear","검색·필터 지우기 (Esc)",""],[".ad-now-account","계정 선택",""],[".ad-new","새 탭","+ 새 탭"],[".ad-settings","설정","설정"],[".ad-repair","화면 복구 (모든 탭 다시 그리기)",""],[".ad-viewtoggle","미리보기 패널 (md · 이미지 · 표)",""]]){const o=e.querySelector(t);o&&(o.title=this.ui(i),n&&(o.textContent=this.ui(n)))}}init(){const e=()=>{(0,M.maintainAccountSessions)(this.app.tabs.map(e=>this.notify.metaOf(e)).filter(Boolean)).catch(()=>{})};e();const t=setInterval(e,6e4);window.addEventListener("beforeunload",()=>clearInterval(t),{once:!0}),this.app.ready$.subscribe(()=>this.zone.runOutsideAngular(()=>{var e,t,i,n,o;(0,X.startDiagSession)({tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(n=(i=this.platform).getOSRelease)||void 0===n?void 0:n.call(i),config:this.diagConfig()}),(0,X.installErrorCapture)(),this.ledger.onChange=()=>this.scheduleRender();try{this.setup()}catch(e){throw this.diag(`setup ERROR ${null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e}`),e}}))}diagOnce(e,t){(0,X.diagOnce)(e,t)}diag(e){(0,X.diag)(e)}diagConfig(){return(0,X.configStamp)(this.config.store)}setup(){var e;if(this.windowEl=document.querySelector(".window"),this.mainEl=document.querySelector(".content.main"),!this.windowEl)return void console.warn("[agentdeck] .window 를 찾지 못해 레이아웃을 적용하지 않는다");this.diag(`setup start tabs=${this.app.tabs.length}`),this.setupMailboxWake(),this.migrateFollowConfig(),this.buildSidebar(),this.buildView(),this.applyEnabled(),this.applyOpacity(),this.disableBackgroundThrottling(),this.ensurePasteHotkey(),this.ensureSplitHotkeys(),this.ensureNewTabHotkey(),this.ensureRepairHotkey(),this.ensureClosePaneHotkey(),this.ensureNewlineHotkey(),this.releaseHomeEndHotkey(),this.guardHomeEndComposition(),this.claimCtrlVKey(),this.claimCtrlWKey(),this.claimShiftEnterKey(),this.claimEnterLabel(),this.claimRightClick(),this.claimFileDrop(),document.addEventListener("paste",()=>{this.nativePasteAt=Date.now(),this.diag("native-paste")},!0),this.app.tabsChanged$.subscribe(()=>{for(const e of this.app.tabs)this.watchTab(e);this.scheduleRender()}),this.app.activeTabChange$.subscribe(()=>{var e,t;null===(e=this.view)||void 0===e||e.setActiveTab(null!==(t=this.app.activeTab)&&void 0!==t?t:null),this.scheduleRender(),this.scheduleRefit()}),this.app.tabOpened$.subscribe(e=>{this.watchTab(e),this.scheduleRefit(),this.scheduleRender()}),this.app.tabClosed$.subscribe(()=>{this.status.sweep(this.app.tabs),this.mailboxWake.flushAll(),this.scheduleRender()});for(const e of this.app.tabs)this.watchTab(e);this.status.changed$.subscribe(()=>{this.mailboxWake.flushAll(),this.scheduleRender()}),this.status.idled$.subscribe(()=>this.mailboxWake.flushAll()),this.notify.onMetaChange=()=>this.scheduleRender(),this.config.changed$.subscribe(()=>{var e;this.mailboxWake.flushAll(),this.applyEnabled(),this.applyOpacity(),this.applySearchBox(),null===(e=this.view)||void 0===e||e.setOpen(!!this.config.store.agentDeck.viewerOpen,!1),this.relayout(),this.scheduleRender()}),setInterval(()=>this.sweepScreens(),2e3),this.observer=new ResizeObserver(()=>this.relayout()),this.observer.observe(this.windowEl),window.addEventListener("resize",()=>this.relayout()),this.hotkeys.hotkey$.subscribe(e=>{var t,i;"agentdeck-toggle"===e&&(this.config.store.agentDeck.enabled=!this.config.store.agentDeck.enabled,this.config.save()),"agentdeck-newline"===e&&this.sendNewline(),"agentdeck-paste"===e&&this.doPaste("hotkey"),"agentdeck-repair"===e&&!1!==this.config.store.agentDeck.claimRepairKey&&this.repair("all"),"agentdeck-view"===e&&(null===(t=this.view)||void 0===t||t.toggle()),"agentdeck-new-tab"===e&&!1!==this.config.store.agentDeck.claimNewTabKey&&this.zone.run(()=>{this.openNewTab()}),"agentdeck-focus-list"===e&&this.toggleKeyboardNav(),"agentdeck-view-mode"===e&&(null===(i=this.view)||void 0===i||i.toggleMode());const n=/^agentdeck-jump-(\d+)$/.exec(e);n&&this.jumpToRow(Number(n[1]))}),setInterval(()=>this.tick(),1e3),(0,p.monitorEventLoop)(),this.relayout(),this.render(),this.diag(`setup done tabs=${this.app.tabs.length} enabled=${this.enabled} mainEl=${!!this.mainEl}`);const t=window;t.__agentdeck=Object.assign(null!==(e=t.__agentdeck)&&void 0!==e?e:{},{app:this.app,config:this.config,status:this.status,relayout:()=>this.relayout(),render:()=>this.render(),setFilter:(e,t)=>(this.searchQuery="string"==typeof e?e:"",this.statusFilter=null!=t?t:null,this.searchEl&&(this.searchEl.value=this.searchQuery),this.syncSearchUi(),this.render(),{query:this.searchQuery,status:this.statusFilter}),repair:(e="all")=>this.repair(e),reorder:(e,t,i="before")=>{const n=[...this.app.tabs],o=n[e],a=n[t];if(!o||!a)return{ok:!1,reason:"없는 탭 인덱스",order:n.map((e,t)=>t)};if("before"!==i&&"after"!==i)return{ok:!1,reason:`place 가 before/after 가 아니다: ${String(i)}`,order:n.map((e,t)=>t)};const s=this.applyReorder(o,a,i);return this.render(),{ok:s,order:this.app.tabs.map(e=>n.indexOf(e))}},lastDrag:()=>({end:this.lastDragEnd,flowsSideways:this.listFlowsSideways(),dock:this.dockSide,clickGuard:this.dragClickGuard,scrollAxis:this.listScrollAxis(),autoScroll:this.config.store.agentDeck.dragAutoScroll}),reorderDrag:()=>{const e=this.drag;if(!e)return null;const t=this.listScrollAxis();return{moved:e.moved,from:this.app.tabs.indexOf(e.tab),target:e.target?{index:this.app.tabs.indexOf(e.target.tab),place:e.target.place}:null,line:!!e.line,scroll:{axis:t,active:!!e.scroll,speed:t?Math.round(this.dragScrollSpeed(t)):0,px:Math.round(e.scrolled.px),at:{x:e.at.x,y:e.at.y}}}},focusNav:e=>{var t,i;"list"===e&&this.focusList("keep"),"search"===e&&this.focusSearch(),"off"===e&&this.releaseKeyboard();const n=this.app.tabs,{rows:o,index:a}=this.navPlan(),s=e=>"head"===e.kind?{kind:"head",key:e.key,tabIndex:-1}:{kind:"tab",key:null,tabIndex:n.indexOf(e.tab)},r=document.activeElement,d=null===(t=this.listEl)||void 0===t?void 0:t.querySelector(".ad-nav-focus");return{mode:this.navMode,index:a,count:o.length,focused:this.navFocus?s(this.navFocus):null,rows:o.map(s),activeTabIndex:this.app.activeTab?n.indexOf(this.app.activeTab):-1,ring:d?{tab:d.classList.contains("ad-tab"),adIndex:null!==(i=d.dataset.adIndex)&&void 0!==i?i:null}:null,owner:r===this.listEl?"list":r===this.searchEl?"search":(null==r?void 0:r.className)||"other",searchVisible:this.navSearchVisible(),wrap:!!this.config.store.agentDeck.keyboardNavWrap,enabled:!1!==this.config.store.agentDeck.keyboardNav}},jump:e=>{var t,i;this.jumpToRow(e);const n=this.app.tabs,{rows:o}=this.navPlan();return{slot:e,slots:Array.from({length:U.JUMP_SLOTS},(e,t)=>{const i=(0,U.pickJumpTarget)(o,t+1);return{number:t+1,tabIndex:i?n.indexOf(i):-1}}),activeTabIndex:this.app.activeTab?n.indexOf(this.app.activeTab):-1,focusedTabIndex:this.navFocus&&"tab"===this.navFocus.kind?n.indexOf(this.navFocus.tab):-1,navMode:this.navMode,tabRows:o.filter(e=>"tab"===e.kind).map(e=>n.indexOf(e.tab)),bound:null!==(i=(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{})[`agentdeck-jump-${e}`])&&void 0!==i?i:null}},view:()=>this.view,openFile:e=>{var t;return null===(t=this.view)||void 0===t?void 0:t.openFile(e)},rescanPasteHotkey:()=>this.ensurePasteHotkey(),groups:()=>{const e=this.app.tabs,t=this.renderPlan(),i=t=>t.tabs.map(t=>e.indexOf(t));return{cwdCache:e.map((e,t)=>{var i,n,o,a,s,r,d;return{index:t,title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),dir:null!==(o=null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.dir)&&void 0!==o?o:null,at:null!==(s=null===(a=this.cwdCache.get(e))||void 0===a?void 0:a.at)&&void 0!==s?s:null,projectRoot:(0,K.projectRootOf)(null!==(d=null===(r=this.cwdCache.get(e))||void 0===r?void 0:r.dir)&&void 0!==d?d:null)}}),projectRoots:(0,K.projectRootCacheSnapshot)(),list:t.groups.map(e=>({key:e.key,label:e.label,collapsed:this.isGroupCollapsed(e.key),collapsedEffective:t.collapseOf(e).collapsed,collapseReason:t.collapseOf(e).reason,tabIndexes:i(e)})),withHeads:t.withHeads,plan:t.plan.map(e=>({key:e.key,label:e.label,collapsed:t.withHeads&&t.collapseOf(e).collapsed,collapseReason:t.collapseOf(e).reason,tabIndexes:i(e)})),tabsUsedByRender:t.visible.map(t=>e.indexOf(t)),tabsForCounts:t.tabs.map(t=>e.indexOf(t)),filter:{query:this.searchQuery,status:this.statusFilter,active:t.filtering},sortByStatus:!!this.config.store.agentDeck.sortByStatus,fold:e=>(0,W.foldGroupKey)(e)}},sessions:()=>{const e=this.config.store.agentDeck,t=this.liveSessionIds(),i=this.ledger.records();return{ledger:this.ledger.snapshot(),records:i.map(e=>({...e})),live:[...t.keys()],enabled:!1!==e.resumeList,expanded:this.isResumeExpanded(null),rows:(0,J.resumeRowsFor)(i,{groupKeys:null,keyOf:e=>(0,W.groupKeyOf)(e,K.projectRootOf),fold:W.foldGroupKey,live:t,days:Number(e.resumeListDays)||0,limit:Number(e.resumeListLimit)||0,hidden:new Set(Array.isArray(e.resumeHidden)?e.resumeHidden:[]),now:Date.now()}).map(e=>({sessionId:e.sessionId,label:e.label,cwd:e.cwd,lastStatus:e.lastStatus,openTabId:e.openTabId}))}},rescanSessions:()=>this.ledger.refresh(!0),debug:()=>({outputHits:this.outputHits,decorator:this.status.debug}),profiles:()=>{const e=e=>{var t,i;return{id:e.id,label:e.label,icon:e.icon,processHints:e.processHints,titleHints:e.titleHints,waitingPatterns:e.waitingPatterns.map(e=>({source:e.source,flags:e.flags})),busyPatterns:e.busyPatterns.map(e=>({source:e.source,flags:e.flags})),busyTitleMarks:e.busyTitleMarks,imagePasteKey:e.imagePasteKey,promptHeads:e.promptHeads,promptShape:null!==(t=e.promptShape)&&void 0!==t?t:null,screenShape:null!==(i=e.screenShape)&&void 0!==i?i:null,patternsProven:e.patternsProven}};return{list:T.AGENT_PROFILES.map(e),union:e((0,T.unionProfile)()),effective:T.AGENT_PROFILES.map(t=>e((0,T.detectProfileFor)(t.id))),identify:(e,t)=>(0,T.identifyAgent)(e,t),fallback:T.AGENT_PROFILES.map(e=>{const t=(0,T.detectProfileFor)(e.id),i=(0,T.unionProfile)();return{id:e.id,patternsProven:e.patternsProven,usesUnionPatterns:t.waitingPatterns===i.waitingPatterns&&t.busyPatterns===i.busyPatterns&&t.busyTitleMarks===i.busyTitleMarks,usesOwnPatterns:t.waitingPatterns===e.waitingPatterns&&t.busyPatterns===e.busyPatterns&&t.busyTitleMarks===e.busyTitleMarks,shapesDropped:!t.promptShape&&!t.screenShape,imagePasteKeyKept:t.imagePasteKey===e.imagePasteKey,catchesClaudeBusy:t.busyPatterns.some(e=>e.test("esc to interrupt"))}})}},judge:e=>{var t;const i=null!=e?e:this.focusedPane(),n=i?this.readScreen(i):null;return n?{...(0,F.judgeScreen)(n.lines,n.cols,null===(t=this.profileForPane(i))||void 0===t?void 0:t.screenShape),cols:n.cols}:null},pinAgent:(e,t)=>{const i=null!=e?e:this.focusedPane();if(!i)return{pinned:!1,why:"pane 을 못 찾았다"};const n=this.pinnedAgents.has(i);return t?(this.pinnedAgents.set(i,String(t)),n||this.pinnedCount++):(this.pinnedAgents.delete(i),n&&(this.pinnedCount=Math.max(0,this.pinnedCount-1))),{pinned:!!t,size:this.pinnedCount}},agentOf:e=>{var t,i,n,o,a,s,r,d;const l=null!=e?e:this.app.activeTab,c=l?this.firstPane(l):void 0,u=c?this.paneAgents.get(c):void 0;return l?{id:null!==(t=this.tabAgents.get(l))&&void 0!==t?t:null,hookId:null!==(o=null===(n=null===(i=this.notify)||void 0===i?void 0:i.agentOf)||void 0===n?void 0:n.call(i,l))&&void 0!==o?o:null,effectiveId:c&&null!==(s=null===(a=this.profileForPane(c))||void 0===a?void 0:a.id)&&void 0!==s?s:"unknown",streamId:(null==u?void 0:u.session)===(null==c?void 0:c.session)&&null!==(r=null==u?void 0:u.tracker.id)&&void 0!==r?r:null,probedAt:null!==(d=this.agentProbedAt.get(l))&&void 0!==d?d:0}:null},probeAgent:e=>{const t=null!=e?e:this.app.activeTab;t&&(this.agentProbedAt.delete(t),this.probeAgent(t,"manual"))},kickLog:(0,X.diagMemory)(),diagPaths:()=>({diag:X.DIAG_PATH,prev:X.DIAG_PREV_PATH,screen:X.SCREEN_PATH}),collectDiag:(e=!1)=>{var t,i,n,o;return(0,X.collectDiagBundle)({includeScreen:e,stamp:{tabby:null===(i=(t=this.platform).getAppVersion)||void 0===i?void 0:i.call(t),osRelease:null===(o=(n=this.platform).getOSRelease)||void 0===o?void 0:o.call(n),config:(0,X.configStamp)(this.config.store)}})}})}repair(e="all"){if(this.repairInProgress)return void this.diag("repair already in progress");this.repairInProgress=!0;const t=new p.PerformanceTrace("repair"),i="active"===e&&this.app.activeTab?[this.app.activeTab]:[...this.app.tabs];this.diag(`repair scope=${e} tabs=${i.length}`);try{t.step("layout",()=>this.relayout())}catch(e){return this.repairInProgress=!1,void(0,X.diagCatch)("repair layout",e)}requestAnimationFrame(()=>requestAnimationFrame(()=>{try{t.mark("frames-ready",`scope=${e} tabs=${i.length}`);for(const e of i){if(!this.app.tabs.includes(e))continue;const i=e,n="function"==typeof i.getAllTabs?i.getAllTabs():[e];for(const e of n)try{this.repairPane(e,t)}catch(e){(0,X.diagCatch)("repair pane",e)}}}finally{setTimeout(()=>{this.repairInProgress=!1},ie)}}))}repairPane(e,t){var i,n,o,a,s,r,d;const l=this.config.store.agentDeck,c=e,u=c.frontend,p=null==u?void 0:u.xterm,h=null===(i=null==p?void 0:p.element)||void 0===i?void 0:i.parentElement;if(!(null==h?void 0:h.clientWidth)||!(null==h?void 0:h.clientHeight))return;const g=this.readScreen(e);null==t||t.mark("screen-read");const f=g?(0,F.judgeScreen)(g.lines,g.cols,null===(n=this.profileForPane(e))||void 0===n?void 0:n.screenShape):null;this.snapshot(e,`manual-before ${f?f.broken?f.reasons.join(" / "):"판정=정상":"읽을 수 없음"}`);try{null===(a=null===(o=null==u?void 0:u.fitAddon)||void 0===o?void 0:o.fit)||void 0===a||a.call(o)}catch{}if(this.syncPtySize(e,u),null==t||t.mark("fit-and-sync"),g&&this.clearInputArea(e,g),!0===l.repairHard)try{null===(s=null==p?void 0:p.reset)||void 0===s||s.call(p)}catch{}try{null===(r=null==p?void 0:p.refresh)||void 0===r||r.call(p,0,(null!==(d=p.rows)&&void 0!==d?d:1)-1)}catch{}if(null==t||t.mark("clear-and-refresh"),this.nudgePtyRedraw(e,t),!0===l.repairSendRedrawKey){const t=c.session;setTimeout(()=>{(null==t?void 0:t.open)&&c.session===t&&this.sendRedrawKey(e)},180)}setTimeout(()=>{var i;const n=this.readScreen(e),o=n?(0,F.judgeScreen)(n.lines,n.cols,null===(i=this.profileForPane(e))||void 0===i?void 0:i.screenShape):null;this.snapshot(e,"manual-after "+(o?o.broken?"아직 깨짐: "+o.reasons.join(" / "):"복구됨":"읽을 수 없음")),null==t||t.mark("after-snapshot")},ie)}sendRedrawKey(e){var t;const i=e;"function"==typeof i.sendInput&&(null===(t=i.session)||void 0===t?void 0:t.open)&&(this.diag("repair redraw-key ctrl-l"),this.sendToPane(i,"redraw-key",()=>i.sendInput("\f")))}clearInputArea(e,t){var i,n,o;if(!(0,v.canRepairComposer)(null===(i=this.profileForPane(e))||void 0===i?void 0:i.id))return!1;const a=null===(n=e.frontend)||void 0===n?void 0:n.xterm;if(!a||"function"!=typeof a.write)return!1;const s=t.lines,r=null===(o=this.profileForPane(e))||void 0===o?void 0:o.screenShape,d=Math.max(0,s.length-F.INPUT_TAIL),l=e=>(0,F.isRuleRow)(s[e].text,r)||(0,F.isGhostRuleRow)(s[e].text,t.cols,r);let c=-1;for(let e=s.length-1;e>=d;e--)if(l(e)){c=e;break}if(c<0)return!1;let u=c;for(let e=c-1;e>=Math.max(d,c-12);e--)l(e)&&(u=e);const p=u+1;this.diag(`clear input area row=${p}/${s.length}`);try{a.write(`7[${p};1H8`)}catch{return!1}return!0}scheduleScreenCheck(e){if(!this.screenObservingEnabled())return;const t=this.screenCheckTimers.get(e);t&&clearTimeout(t),this.screenCheckTimers.set(e,setTimeout(()=>{this.screenCheckTimers.delete(e),this.checkScreen(e)},700))}screenObservingEnabled(){const e=this.config.store.agentDeck;return!1!==e.screenWatch||!!e.autoRepairScreen}checkScreen(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;if(!(0,v.canRepairComposer)(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id))return;const m=this.config.store.agentDeck,b=this.readScreen(e);if(!b)return;const k=(0,F.judgeScreen)(b.lines,b.cols,null===(i=this.profileForPane(e))||void 0===i?void 0:i.screenShape),y=this.screenObs.get(e),w=k.reasons.join(" / "),x=k.broken?((null==y?void 0:y.broken)&&null!==(n=y.streak)&&void 0!==n?n:0)+1:0,S=!y||y.broken!==k.broken||y.reason!==w;if(this.screenObs.set(e,{broken:k.broken,reason:w,streak:x}),S&&(k.broken?this.snapshot(e,`detect 깨짐 ${w}`):(null==y?void 0:y.broken)&&this.snapshot(e,"detect 스스로 복구됨")),!k.broken)return void this.refillAutoRepairBudget(e);if(this.autoRepairHealthySince.delete(e),!m.autoRepairScreen)return;if(x<(null!==(o=m.autoRepairMinStreak)&&void 0!==o?o:2))return;const C=e,j=Date.now(),A=null!==(a=this.autoRepairAt.get(e))&&void 0!==a?a:0,E=null!==(s=this.autoRepairCount.get(e))&&void 0!==s?s:0,P=null!==(r=m.autoRepairMaxPerTab)&&void 0!==r?r:5;if(j-A<(null!==(d=m.autoRepairCooldownMs)&&void 0!==d?d:4e3))return;if(P>0&&E>=P)return void this.diagOnce("auto-repair-cap",`screen auto-repair 한도 도달 (${E}/${P}) — 더 고치지 않는다. 사이드바 ↻ 로 직접 복구할 것. 마지막 판정: ${k.reasons.join(" / ")}`);const z=null===(l=C.frontend)||void 0===l?void 0:l.xterm,D=null==z?void 0:z.cols,T=null==z?void 0:z.rows;(0,F.sizeInSync)(D,T,null===(c=C.size)||void 0===c?void 0:c.columns,null===(u=C.size)||void 0===u?void 0:u.rows)?(this.diag(`screen BROKEN cols=${b.cols} sent=${null===(g=C.size)||void 0===g?void 0:g.columns}x${null===(f=C.size)||void 0===f?void 0:f.rows} ${k.reasons.join(" / ")}`),this.snapshot(e,`auto-before ${k.reasons.join(" / ")}`),this.autoRepairAt.set(e,j),this.autoRepairCount.set(e,E+1),this.diag(`screen auto-repair #${E+1}`),this.clearInputArea(e,b),!0===m.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const i=this.readScreen(e),n=i?(0,F.judgeScreen)(i.lines,i.cols,null===(t=this.profileForPane(e))||void 0===t?void 0:t.screenShape):null;this.snapshot(e,"auto-after "+(n?n.broken?"아직 깨짐: "+n.reasons.join(" / "):"복구됨":"읽을 수 없음"))},ie)):this.diagOnce("auto-repair-resizing",`screen 자동복구 보류 — 크기가 어긋나 있다 (xterm ${D}x${T} vs pty ${null===(p=C.size)||void 0===p?void 0:p.columns}x${null===(h=C.size)||void 0===h?void 0:h.rows}). 리사이즈 중간 프레임은 순정이 곧 맞춘다 — 이 줄은 처음 한 번만 남긴다`)}refillAutoRepairBudget(e){if(!this.autoRepairCount.get(e))return void this.autoRepairHealthySince.delete(e);const t=Date.now(),i=this.autoRepairHealthySince.get(e);i?t-i<6e4||(this.autoRepairCount.delete(e),this.autoRepairHealthySince.delete(e),(0,X.resetDiagOnce)("auto-repair-cap"),this.diag(`screen auto-repair 예산 회복 (화면이 ${Math.round((t-i)/1e3)}초 동안 온전했다)`)):this.autoRepairHealthySince.set(e,t)}sweepScreens(){if(!this.enabled||!this.screenObservingEnabled())return;const e=this.app.activeTab;if(!e)return;const t=e,i="function"==typeof t.getAllTabs?t.getAllTabs():[e];for(const e of i)this.checkScreen(e)}readScreen(e){var t,i,n,o;const a=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(i=null==a?void 0:a.buffer)||void 0===i?void 0:i.active;if(!(s&&"function"==typeof s.getLine&&a.cols>1))return null;const r=null===(n=a.element)||void 0===n?void 0:n.parentElement;if(!(null==r?void 0:r.clientWidth))return null;const d=[];try{for(let e=s.baseY;e<=s.baseY+a.rows-1;e++){const t=s.getLine(e);d.push({text:null!==(o=null==t?void 0:t.translateToString(!1))&&void 0!==o?o:"",wrapped:!!(null==t?void 0:t.isWrapped)})}}catch{return null}return{lines:d,cols:a.cols}}snapshot(e,t){var i,n,o,a;const s=this.readScreen(e);if(!s)return;const r=e,d=null===(i=r.frontend)||void 0===i?void 0:i.xterm,l=`\n===== ${(new Date).toISOString()} ${t} cols=${s.cols} rows=${null==d?void 0:d.rows} sent=${null===(n=r.size)||void 0===n?void 0:n.columns}x${null===(o=r.size)||void 0===o?void 0:o.rows} title=${JSON.stringify(null!==(a=e.title)&&void 0!==a?a:"")} =====`,c=s.lines.map((e,t)=>({i:t,t:e.text.replace(/\s+$/,""),w:e.wrapped})).filter(e=>e.t).map(e=>`${String(e.i).padStart(3)} w=${e.w?1:0} len=${e.t.length} ${JSON.stringify(e.t)}`);(0,X.appendScreenLog)([l,...c,""].join("\n"))}watchTab(e){var t;const i=e;this.watched.has(e)||(this.watched.add(e),i.titleChange$&&i.titleChange$.subscribe(t=>{this.probeAgent(e,"title-change"),(0,D.applyTitle)(this.status,e,t,this.config.store.agentDeck.autoDetect,this.profileForTab(e))}),i.title&&(0,D.applyTitle)(this.status,e,i.title,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),i.tabAdded$&&i.tabAdded$.subscribe(t=>this.watchPane(e,t)));const n="function"==typeof i.getAllTabs?i.getAllTabs():[e];this.diag(`watchTab panes=${n.length}`);for(const t of n)this.watchPane(e,t);if(!n.length){const i=(null!==(t=this.emptyTabRetries.get(e))&&void 0!==t?t:0)+1;this.emptyTabRetries.set(e,i),i<=20&&setTimeout(()=>{this.app.tabs.includes(e)&&this.watchTab(e)},400)}}watchPane(e,t){var i;if(this.watchedPanes.has(t))return;this.watchedPanes.add(t),this.diag(`watchPane ${null===(i=t.constructor)||void 0===i?void 0:i.name}`);const n=t,o=i=>{var o,a,s,r,d,l;this.installCodexCursorFix(t),i&&i.output$&&(this.diag(`session bind xterm=${null===(a=null===(o=n.frontend)||void 0===o?void 0:o.xterm)||void 0===a?void 0:a.cols}x${null===(r=null===(s=n.frontend)||void 0===s?void 0:s.xterm)||void 0===r?void 0:r.rows} paneSize=${null===(d=n.size)||void 0===d?void 0:d.columns}x${null===(l=n.size)||void 0===l?void 0:l.rows}`),this.probeAgent(e,"session-bind"),i.output$.subscribe(i=>{var o;this.outputHits++;const a=this.paneAgents.get(t);("unknown"===(null!==(o=this.tabAgents.get(e))&&void 0!==o?o:"unknown")||(null==a?void 0:a.session)===n.session&&"unknown"===(null==a?void 0:a.tracker.id))&&this.probeAgent(e,"output"),(0,D.applyOutput)(this.status,e,t,i,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),this.view&&this.config.store.agentDeck.viewerScrape&&this.view.noteOutput(e,i),this.touchCwd(e,t),this.scheduleScreenCheck(t)}))};o(n.session),n.sessionChanged$&&n.sessionChanged$.subscribe(e=>o(e)),n.frontendReady$&&n.frontendReady$.subscribe(()=>{this.installCodexCursorFix(t),this.scheduleRefit(),this.announceSizeOnOpen(t),this.touchCwd(e,t)}),this.announceSizeOnOpen(t)}installCodexCursorFix(e){(0,w.installCodexKeys)(e.frontend,()=>{var t;return"win32"===process.platform&&"codex"===(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id)},t=>this.sendToPane(e,"codex-question-key",()=>e.sendInput(t))),(0,y.installCodexWheel)(e.frontend,()=>{var t;return"win32"===process.platform&&"codex"===(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id)},t=>e.sendInput(t)),(0,b.installCursorVisibilityFix)(e.frontend,t=>{var i;return this.observePaneAgent(e,t),"win32"===process.platform&&"codex"===(null===(i=this.profileForPane(e))||void 0===i?void 0:i.id)},()=>this.diag("codex cursor: repaired non-private CSI 25 visibility sequence"),t=>this.diag(`cursor-path tab=${JSON.stringify(e.title)} ${t}`))}observePaneAgent(e,t){let i=this.paneAgents.get(e);i&&i.session===e.session||(i={session:e.session,tracker:new k.TerminalAgentTracker},this.paneAgents.set(e,i)),i.tracker.write(t)}announceSizeOnOpen(e){const t=e;for(const e of oe)setTimeout(()=>{var i;const n=null===(i=t.frontend)||void 0===i?void 0:i.xterm,o=t.session;if(!((null==o?void 0:o.open)&&"function"==typeof o.resize&&(null==n?void 0:n.cols)>1))return;const a=t.size;(null==a?void 0:a.columns)===n.cols&&(null==a?void 0:a.rows)===n.rows||this.diag(`announce size ${null==a?void 0:a.columns}x${null==a?void 0:a.rows} -> ${n.cols}x${n.rows} (+${e}ms)`);try{o.resize(n.cols,n.rows),t.size={columns:n.cols,rows:n.rows}}catch(e){(0,X.diagCatch)("announce-size resize",e)}},e)}ensureNewTabHotkey(){const e=this.config.store.hotkeys;if(!e||!1===this.config.store.agentDeck.claimNewTabKey)return;const t=Array.isArray(e["agentdeck-new-tab"])?e["agentdeck-new-tab"]:[],i=Array.isArray(e["new-tab"])?e["new-tab"]:[],n=i.filter(e=>!t.includes(e));n.length!==i.length&&(e["new-tab"]=n,this.config.save(),this.diag(`hotkeys new-tab claimed: theirs=${JSON.stringify(i)} -> ${JSON.stringify(n)} ours=${JSON.stringify(t)}`))}ensureSplitHotkeys(){const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const[i,n,o]of[["split-right","Ctrl-Shift-S","Ctrl-S"],["split-bottom","Ctrl-Shift-D","Ctrl-D"]]){const a=e[i];Array.isArray(a)&&1===a.length&&a[0]===n&&(e[i]=[o],t=!0)}t&&this.config.save()}ensureClosePaneHotkey(){var e;const t=this.config.store.hotkeys,i=String(null!==(e=this.config.store.agentDeck.closePaneKey)&&void 0!==e?e:"").trim();t&&i&&((Array.isArray(t["close-pane"])?t["close-pane"]:[]).length>0||(t["close-pane"]=[i],this.config.save(),this.diag(`hotkeys close-pane filled: ${JSON.stringify(t["close-pane"])}`)))}ensureRepairHotkey(){const e=this.config.store.hotkeys;if(!e||!1===this.config.store.agentDeck.claimRepairKey)return;let t=!1;const i=Array.isArray(e["agentdeck-repair"])?e["agentdeck-repair"]:[];1===i.length&&"Ctrl-Shift-U"===i[0]&&(e["agentdeck-repair"]=["Ctrl-R"],t=!0);const n=Array.isArray(e["agentdeck-repair"])?e["agentdeck-repair"]:[],o=Array.isArray(e["rename-tab"])?e["rename-tab"]:[],a=o.filter(e=>!n.includes(e));a.length!==o.length&&(e["rename-tab"]=a,t=!0),t&&(this.config.save(),this.diag(`hotkeys repair claimed: ours=${JSON.stringify(n)} rename-tab=${JSON.stringify(o)} -> ${JSON.stringify(a)}`))}ensurePasteHotkey(){const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const i of["workdeck-paste","workdeck-newline","workdeck-toggle"])i in e&&(delete e[i],t=!0);for(const i of["agentdeck-paste","paste"]){const n=Array.isArray(e[i])?e[i]:[];n.includes("Ctrl-V")&&(e[i]=n.filter(e=>"Ctrl-V"!==e),t=!0)}t&&this.config.save(),this.diag(`hotkeys paste=${JSON.stringify(e.paste)} agentdeck-paste=${JSON.stringify(e["agentdeck-paste"])} legacy=${Object.keys(e).filter(e=>e.startsWith("workdeck")).join(",")||"none"}`)}claimCtrlVKey(){document.addEventListener("keydown",e=>{this.config.store.agentDeck.claimCtrlV&&(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey||"v"!==(e.key||"").toLowerCase()&&"KeyV"!==e.code||this.isPlainInput(e.target)||this.isDeckUiKey(e.target)||(e.preventDefault(),e.stopPropagation(),this.zone.runOutsideAngular(()=>this.doPaste("ctrl-v"))))},!0)}claimCtrlWKey(){document.addEventListener("keydown",e=>{var t,i,n;const o=this.config.store.agentDeck;if(!this.enabled||!1===o.keyboardNav||!1===o.keyboardCloseTab)return;if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)return;if("w"!==(e.key||"").toLowerCase()&&"KeyW"!==e.code)return;if(this.isPlainInput(e.target))return;const a="list"===this.navMode;if(!a&&this.isDeckUiKey(e.target))return;const s=(0,U.pickCloseTarget)({inList:a,focus:this.navFocus,active:null!==(t=this.app.activeTab)&&void 0!==t?t:null,tabs:this.app.tabs});s?(e.preventDefault(),e.stopPropagation(),this.diag(`ctrl-w close inList=${a} tabs=${this.app.tabs.length}`),this.zone.run(()=>{this.app.closeTab(s,!0)})):this.diag(`ctrl-w skip inList=${a} focus=${null!==(n=null===(i=this.navFocus)||void 0===i?void 0:i.kind)&&void 0!==n?n:"none"}`)},!0)}releaseHomeEndHotkey(){if(!this.config.store.agentDeck.releaseHomeEnd)return;const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const i of["home","end"]){const n=Array.isArray(e[i])?e[i]:[],o=n.filter(e=>"Home"!==e&&"End"!==e);o.length!==n.length&&(e[i]=o,t=!0)}t&&this.config.save(),this.diag(`hotkeys home=${JSON.stringify(e.home)} end=${JSON.stringify(e.end)}`)}guardHomeEndComposition(){document.addEventListener("keydown",e=>{if(!this.config.store.agentDeck.imeOrderGuard)return;const t=e.key;if("Home"!==t&&"End"!==t&&"Home"!==e.code&&"End"!==e.code)return;if(this.isPlainInput(e.target)||this.isDeckUiKey(e.target))return;const i=this.focusedPane(),n=this.compositionHelper(i),o=(0,H.readCompositionState)(n),a=(0,H.planSend)(o);this.diag(`ime home-end key=${t} keyCode=${e.keyCode} ${this.describeComposition(n)} evComposing=${e.isComposing} state=${o} plan=${a}`)},!0)}sendToPane(e,t,i){const n=()=>{try{i()}catch{}};if(!this.config.store.agentDeck.imeOrderGuard)return void n();const o=this.compositionHelper(e),a=(0,H.readCompositionState)(o),s=(0,H.planSend)(a);this.diag(`ime send=${t} ${this.describeComposition(o)} state=${a} plan=${s}`),"defer"!==s?"after-composition"!==s?n():this.writeAfterComposition(e,t,n):setTimeout(n,0)}writeAfterComposition(e,t,i){const n=(()=>{var t,i,n;try{return null!==(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea)&&void 0!==n?n:null}catch{return null}})();if(!n){const n=(0,H.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));return this.diag(`ime send=${t} no-textarea flushed=${n}`),void i()}let o=!1;const a=e=>{o||(o=!0,n.removeEventListener("compositionend",s),clearTimeout(r),this.diag(`ime send=${t} wrote-after=${e}`),setTimeout(i,0))},s=()=>a("compositionend"),r=setTimeout(()=>{const i=(0,H.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));this.diag(`ime send=${t} timeout flushed=${i}`),a("timeout")},400);n.addEventListener("compositionend",s,{once:!0})}compositionHelper(e){var t,i,n,o;try{return null!==(o=null===(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i._core)||void 0===n?void 0:n._compositionHelper)&&void 0!==o?o:null}catch{return null}}compositionTextLength(e){var t,i,n;try{const o=null===(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea)||void 0===n?void 0:n.value;return"string"==typeof o?o.length:0}catch{return 0}}describeComposition(e){if(!e)return"helper=none";try{return`isComposing=${e.isComposing} sending=${e._isSendingComposition}`}catch{return"helper=unreadable"}}claimShiftEnterKey(){const e=()=>{this.shiftDownAt=0},t=e=>"Shift"===e.key||(e.code||"").startsWith("Shift");window.addEventListener("blur",e),document.addEventListener("keyup",i=>{t(i)&&e()},!0),document.addEventListener("keydown",i=>{if(t(i))return void(this.shiftDownAt=Date.now());if(!this.config.store.agentDeck.claimShiftEnter)return;const n="Enter"===i.key||"Enter"===i.code||"NumpadEnter"===i.code;if(!n&&!i.shiftKey&&!i.getModifierState("Shift"))return void e();if(!n||i.altKey||i.metaKey)return;if(i.isComposing||229===i.keyCode)return;const o=this.shiftDownAt>0&&Date.now()-this.shiftDownAt<5e3;(i.shiftKey||i.getModifierState("Shift")||o||i.ctrlKey)&&(this.isPlainInput(i.target)||this.isDeckUiKey(i.target)||(i.preventDefault(),i.stopPropagation(),this.diag(`newline (capture) shiftKey=${i.shiftKey} modState=${i.getModifierState("Shift")} tracked=${o} ctrl=${i.ctrlKey}`),this.sendNewline()))},!0)}claimEnterLabel(){document.addEventListener("keydown",e=>{var t,i;if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)return;if("Enter"!==e.key&&"Enter"!==e.code&&"NumpadEnter"!==e.code)return;if(e.isComposing||229===e.keyCode)return;if(this.isPlainInput(e.target)||this.isDeckUiKey(e.target))return;const n=this.app.activeTab;if(n&&(0,D.releaseLimited)(this.status,n),!this.config.store.agentDeck.enterAsLabel)return;const o=this.focusedPane();if(!o)return void this.diag("enter-label skipped (no pane)");const a=this.readPromptLine(o),s=this.app.activeTab;this.diag(`enter-label text="${a}" tab=${s?"yes":"no"} profile=${null!==(i=null===(t=this.profileForPane(o))||void 0===t?void 0:t.id)&&void 0!==i?i:"default"}`),a&&s&&this.status.setLabel(s,a)},!0)}readPromptLine(e){var t,i,n,o;const a=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(i=null==a?void 0:a.buffer)||void 0===i?void 0:i.active;if(!s||"function"!=typeof s.getLine)return this.diag(`enter-label no-buffer frontend=${e.frontend?"yes":"no"} xterm=${a?"yes":"no"}`),"";const r=(e,t)=>{var i,n;const o=[];for(let a=Math.max(0,e);a<=t;a++)o.push(null!==(n=null===(i=s.getLine(a))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:"");return o},d=s.baseY+(null!==(n=s.cursorY)&&void 0!==n?n:0),l=r(d-14,d),c=null===(o=this.profileForPane(e))||void 0===o?void 0:o.promptShape,u=(0,_.extractPrompt)(l,c);if(u)return u;const p=(0,_.extractPrompt)(r(s.baseY,s.baseY+a.rows-1),c);if(!p){const e=l.slice(-4).map(e=>JSON.stringify(e.slice(0,60))).join(" | ");this.diag(`enter-label miss baseY=${s.baseY} cursorY=${s.cursorY} rows=${a.rows} tail=${e}`)}return p}isPlainInput(e){var t;const i=e;return!(!i||"function"!=typeof i.closest)&&!(null===(t=i.classList)||void 0===t?void 0:t.contains("xterm-helper-textarea"))&&!i.closest(".xterm")&&(i.isContentEditable||["INPUT","TEXTAREA"].includes(i.tagName))}isDeckUiKey(e){const t=e;return!(!t||"function"!=typeof t.closest||!t.closest("#"+Q))}doPaste(e){const t=Date.now();if(t-this.lastPasteAt<80)return void this.diag(`paste ignored (dup ${t-this.lastPasteAt}ms, ${e})`);this.lastPasteAt=t;const i=this.focusedPane();if(!i)return;const n=this.clipboardHasImageOnly();if(this.diag(`paste probe enabled=${this.config.store.agentDeck.pasteImageWithCtrlV} imageOnly=${n} sendInput=${typeof i.sendInput}`),this.config.store.agentDeck.pasteImageWithCtrlV&&n&&"function"==typeof i.sendInput)return void this.sendImagePasteKey(i);if("function"!=typeof i.paste)return;if(this.pasteProbeUntil=Date.now()+5e3,this.probeSendInput(i),this.probeWrite(i),this.diag(`paste (${e})`),"ctrl-v"===e)return void this.sendToPane(i,"paste-ctrl-v",()=>{i.paste()});const o=Date.now();setTimeout(()=>{this.nativePasteAt>=o?this.diag("paste skipped (native handled)"):(this.diag("paste fallback"),this.sendToPane(i,"paste-fallback",()=>{i.paste()}))},60)}async sendImagePasteKey(e){const t=await this.detectAgentApp(e),i=(0,T.profileFor)(t.id),n=this.config.store.agentDeck.imagePasteKey,o="config"===i.imagePasteKey?n:i.imagePasteKey,a="ctrl-v"===o?"":"v";this.diag(`paste image app=${t.id} via=${t.via} mode=${o} bytes=${[...a].map(e=>e.charCodeAt(0)).join(",")}`),this.sendToPane(e,"paste-image",()=>e.sendInput(a))}claimFileDrop(){const e=e=>{var t;const i=e;return!!(null===(t=null==i?void 0:i.closest)||void 0===t?void 0:t.call(i,"#agentdeck-view, #agentdeck-sidebar"))};document.addEventListener("dragover",t=>{var i,n;"never"===this.config.store.agentDeck.viewerDropOpen||e(t.target)||Array.from(null!==(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.types)&&void 0!==n?n:[]).includes("Files")&&t.preventDefault()},!0),document.addEventListener("drop",t=>{var i,n,o;const a=this.config.store.agentDeck.viewerDropOpen;if("never"===a||e(t.target))return;const s=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],r=(null==s?void 0:s.path)||(null===(o=t.dataTransfer)||void 0===o?void 0:o.getData("text/plain"))||"",d=String(r).trim().replace(/^"|"$/g,"");d&&(t.preventDefault(),t.stopPropagation(),"always"!==a?"paste"!==a?this.askFileDrop(d):this.pasteDroppedPath(d):this.openDroppedInPanel(d))},!0)}openDroppedInPanel(e){var t,i;null===(t=this.view)||void 0===t||t.setOpen(!0,!1),null===(i=this.view)||void 0===i||i.openFile(e)}pasteDroppedPath(e){const t=this.firstPane(this.app.activeTab);if(!t)return;const i=/\s/.test(e)?`"${e}"`:e;this.sendToPane(t,"drop-paste",()=>t.sendInput(i))}askFileDrop(e){var t,i,n,o;null===(t=document.getElementById("agentdeck-drop-ask"))||void 0===t||t.remove();const a=e.split(/[\\/]/).pop()||e,s=document.createElement("div");s.id="agentdeck-drop-ask",s.className="ad-drop-ask",s.innerHTML=['<div class="ad-drop-ask-msg"></div>','<div class="ad-drop-ask-row">',this.uiMarkup(' <button class="ad-drop-ask-view">패널에 띄우기</button>'),this.uiMarkup(' <button class="ad-drop-ask-paste">경로 붙여넣기</button>'),this.uiMarkup(' <button class="ad-drop-ask-close" title="아무것도 하지 않는다">✕</button>'),"</div>",'<label class="ad-drop-ask-again">',this.uiMarkup(' <input type="checkbox" class="ad-drop-ask-again-box"> 다시 묻지 않기'),"</label>"].join("");const r=s.querySelector(".ad-drop-ask-msg");r.textContent=this.ui("{name} 을 어떻게 할까요?",{name:a}),r.title=e;const d=e=>{(()=>{var e;return!0===(null===(e=s.querySelector(".ad-drop-ask-again-box"))||void 0===e?void 0:e.checked)})()&&(this.config.store.agentDeck.viewerDropOpen=e,this.config.save())},l=()=>s.remove();null===(i=s.querySelector(".ad-drop-ask-view"))||void 0===i||i.addEventListener("click",()=>{d("always"),this.openDroppedInPanel(e),l()}),null===(n=s.querySelector(".ad-drop-ask-paste"))||void 0===n||n.addEventListener("click",()=>{d("paste"),this.pasteDroppedPath(e),l()}),null===(o=s.querySelector(".ad-drop-ask-close"))||void 0===o||o.addEventListener("click",l),document.body.appendChild(s),setTimeout(()=>{document.getElementById("agentdeck-drop-ask")===s&&l()},15e3)}async detectAgentApp(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;const m=null!==(n=null===(i=(t=this.app).getParentTab)||void 0===i?void 0:i.call(t,e))&&void 0!==n?n:e,v=null!==(s=null===(a=null===(o=this.notify)||void 0===o?void 0:o.agentOf)||void 0===a?void 0:a.call(o,m))&&void 0!==s?s:null;let b=[];try{const t=null!==(l=await(null===(d=null===(r=e.session)||void 0===r?void 0:r.getChildProcesses)||void 0===d?void 0:d.call(r)))&&void 0!==l?l:[],i=t.map(e=>{var t,i;return`${null!==(t=null==e?void 0:e.command)&&void 0!==t?t:""} ${null!==(i=null==e?void 0:e.name)&&void 0!==i?i:""}`}).join(" "),n=(0,T.identifyAgent)(i,"");if("unknown"!==n)return v&&v!==n&&(null===(u=null===(c=this.notify)||void 0===c?void 0:c.forgetAgent)||void 0===u||u.call(c,m),this.forgetHookStatus(m),this.diag(`agent hook stale hook=${v} proc=${n}`)),{id:n,via:"proc"};if(b=t.map(e=>Number(null==e?void 0:e.pid)).filter(e=>Number.isInteger(e)&&e>0),v&&!b.length)return{id:v,via:"hook"}}catch{if(v)return{id:v,via:"hook"}}const k=await this.commandLinesOf(b);if(k){const e=(0,T.identifyAgent)(k,"");if("unknown"!==e)return v&&v!==e&&(null===(h=null===(p=this.notify)||void 0===p?void 0:p.forgetAgent)||void 0===h||h.call(p,m),this.forgetHookStatus(m),this.diag(`agent hook stale hook=${v} cmdline=${e}`)),{id:e,via:"cmdline"}}const y=`${null!==(g=e.title)&&void 0!==g?g:""} ${null!==(f=e.customTitle)&&void 0!==f?f:""}`,w=(0,T.identifyAgent)("",y);return{id:w,via:"unknown"===w?"none":"title"}}forgetHookStatus(e){this.status.get(e).pinned&&this.status.unpin(e)}async commandLinesOf(e){const t=e.filter(e=>Number.isInteger(e)&&e>0).slice(0,8);if(!t.length)return null;try{const{execFile:e}=i(5317),n="win32"===process.platform,o=n?"powershell":"ps",a=n?["-NoProfile","-NonInteractive","-Command",`Get-CimInstance Win32_Process -Filter "${t.map(e=>`ProcessId=${e}`).join(" or ")}" | Select-Object -ExpandProperty CommandLine`]:["-o","args=","-p",t.join(",")];return await new Promise(t=>{e(o,a,{timeout:4e3,windowsHide:!0},(e,i)=>t(e&&!i?null:String(null!=i?i:""))).on("error",()=>t(null))})}catch{return null}}async probeAgent(e,t){var i,n;const o=Date.now();if(o-(null!==(i=this.agentProbedAt.get(e))&&void 0!==i?i:0)<1e4)return;this.agentProbedAt.set(e,o);const a=this.firstPane(e);if(!a)return;const s=a.session,r=this.paneAgents.get(a),d=await this.detectAgentApp(a);if(a.session!==s)return;"unknown"===d.id||"proc"!==d.via&&"cmdline"!==d.via||!r||this.paneAgents.get(a)!==r||r.session!==s||"unknown"!==r.tracker.id||(r.tracker.id=d.id,this.diag(`agent stream recovered id=${d.id} via=${d.via}`));const l=this.tabAgents.get(e);"unknown"===d.id&&l&&"unknown"!==l||(this.tabAgents.set(e,d.id),d.id!==l&&this.diag(`agent tab=${JSON.stringify(null!==(n=e.title)&&void 0!==n?n:"")} id=${d.id} via=${d.via} (${t})`))}firstPane(e){var t;const i=e;return null!==(t=("function"==typeof i.getAllTabs?i.getAllTabs():[e])[0])&&void 0!==t?t:null}profileForPane(e){const t=n.prototype.resolveProfileForPane;if(!this.profileMemo)return t.call(this,e);const i=this.profileMemo.get(e),o=Date.now(),a=!!i&&i.session===(null==e?void 0:e.session);if(a&&o-i.at<250)return i.profile;let s=t.call(this,e);return!s&&a&&(s=i.known),this.profileMemo.set(e,{at:o,session:null==e?void 0:e.session,profile:s,known:null!=s?s:a?i.known:void 0}),s}resolveProfileForPane(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;try{const m=null!==(n=null===(i=(t=this.app).getParentTab)||void 0===i?void 0:i.call(t,e))&&void 0!==n?n:e;if(this.pinnedCount>0){const t=null!==(o=this.pinnedAgents.get(e))&&void 0!==o?o:this.pinnedAgents.get(m);if(t)return(0,T.detectProfileFor)(t)}const v=null===(s=null===(a=this.notify)||void 0===a?void 0:a.agentOf)||void 0===s?void 0:s.call(a,m);if(v)return(0,T.detectProfileFor)(v);const b=null===(r=this.paneAgents)||void 0===r?void 0:r.get(e),y=null===(d=null==e?void 0:e.frontend)||void 0===d?void 0:d.xterm,w=null===(l=null==y?void 0:y.buffer)||void 0===l?void 0:l.active,x=(null==b?void 0:b.session)===e.session?b:void 0;if(w&&(!b||x)&&(!(null==x?void 0:x.tracker.id)||"unknown"===x.tracker.id)){const t=Array.from({length:y.rows},(e,t)=>{var i,n;return null!==(n=null===(i=w.getLine(w.baseY+t))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:""});if((0,k.isLiveCodexScreen)(t)){const t=null!==(c=null==x?void 0:x.tracker)&&void 0!==c?c:new k.TerminalAgentTracker;return t.id="codex",null===(u=this.paneAgents)||void 0===u||u.set(e,{session:e.session,tracker:t}),null===(p=this.tabAgents)||void 0===p||p.set(m,"codex"),null===(h=this.diag)||void 0===h||h.call(this,"agent stream recovered id=codex via=live-screen"),(0,T.detectProfileFor)("codex")}}if((null==b?void 0:b.session)===e.session&&(null==b?void 0:b.tracker.id)&&"unknown"!==b.tracker.id)return(0,T.detectProfileFor)(b.tracker.id);const S=this.profileForTab(m);if(S&&"codex"!==S.id)return S;if(!w)return S;const C=Math.max(0,w.baseY-60),j=[];for(let e=C;e<w.baseY+y.rows;e++)j.push(null!==(f=null===(g=w.getLine(e))||void 0===g?void 0:g.translateToString(!0))&&void 0!==f?f:"");const A=(0,k.identifyScreenAgent)(j);return"claude"===A?(0,T.detectProfileFor)("claude"):S||("unknown"===A?void 0:(0,T.detectProfileFor)(A))}catch{return}}profileForTab(e){var t,i;const n=null===(i=null===(t=this.notify)||void 0===t?void 0:t.agentOf)||void 0===i?void 0:i.call(t,e);if(n)return(0,T.detectProfileFor)(n);const o=this.tabAgents.get(e);return o&&"unknown"!==o?(0,T.detectProfileFor)(o):void 0}probeSendInput(e){if(!e||e.__adSendInputProbe||"function"!=typeof e.sendInput)return;const t=e.sendInput.bind(e);e.__adSendInputProbe=!0,e.sendInput=(e,...i)=>{if(Date.now()<this.pasteProbeUntil){const t="string"==typeof e?e:String(e);this.diag(`sendInput len=${t.length} head=${JSON.stringify(t.slice(0,24))} from=${this.callSite()}`)}return t(e,...i)}}probeWrite(e){const t=null==e?void 0:e.session;if(!t||t.__adWriteProbe||"function"!=typeof t.write)return;const i=t.write.bind(t);t.__adWriteProbe=!0,t.write=(e,...t)=>{if(Date.now()<this.pasteProbeUntil){const t="string"==typeof e?e:String(e);this.diag(`write len=${t.length} head=${JSON.stringify(t.slice(0,24))} from=${this.callSite()}`)}return i(e,...t)}}callSite(){var e;return(null!==(e=(new Error).stack)&&void 0!==e?e:"").split(String.fromCharCode(10)).slice(3,7).map(e=>e.trim().replace(/^at\s+/,"")).join(" <- ")}clipboardHasImageOnly(){const e=se();if(!e)return this.diag("clipboard unavailable"),!1;try{const t=!e.readImage().isEmpty(),i=e.readText();return this.diag(`clipboard hasImage=${t} textLen=${i.length}`),t&&""===i.trim()}catch(e){return this.diag(`clipboard read failed: ${e}`),!1}}focusedPane(){var e;const t=this.app.activeTab;return t?"function"==typeof t.getFocusedTab&&null!==(e=t.getFocusedTab())&&void 0!==e?e:t:null}ensureNewlineHotkey(){const e=this.config.store.hotkeys;if(!e||!Array.isArray(e["agentdeck-newline"]))return;const t=e["agentdeck-newline"];t.includes("Shift-Enter")||(e["agentdeck-newline"]=[...t,"Shift-Enter"],this.config.save())}claimRightClick(){this.config.store.agentDeck.claimRightClick&&(this.config.store.terminal&&"off"!==this.config.store.terminal.rightClick&&(this.config.store.terminal.rightClick="off",this.config.save()),document.addEventListener("mousedown",e=>{2===e.button&&this.inTerminalArea(e)&&(this.rightDownAt=Date.now(),e.preventDefault(),e.stopPropagation())},{capture:!0}),document.addEventListener("contextmenu",e=>{this.inTerminalArea(e)&&(e.preventDefault(),e.stopPropagation())},{capture:!0}),document.addEventListener("mouseup",e=>{if(2!==e.button||!this.inTerminalArea(e))return;e.preventDefault(),e.stopPropagation();const t=Date.now();if(t-this.lastRightHandledAt<150)return;this.lastRightHandledAt=t;const i=t-this.rightDownAt;this.handleRightClick(e,i)},{capture:!0}))}inTerminalArea(e){const t=e.target;return!(!t||"function"!=typeof t.closest||!t.closest(".content.main")||t.closest(`#${Q}`))}async handleRightClick(e,t){var i,n;const o=this.focusedPane();o&&(t>=(null!==(i=this.config.store.agentDeck.rightClickMenuMs)&&void 0!==i?i:250)?"function"==typeof o.buildContextMenu&&o.platform&&o.platform.popupContextMenu(await o.buildContextMenu(),e):"function"==typeof(null===(n=o.frontend)||void 0===n?void 0:n.getSelection)&&o.frontend.getSelection()?(o.frontend.copySelection(),o.frontend.clearSelection()):this.doPaste("rightclick"))}sendNewline(){var e,t,i;const n=this.focusedPane();if(n&&"function"==typeof n.sendInput){const o=(0,v.newlineSequence)(null===(e=this.profileForPane(n))||void 0===e?void 0:e.id);this.diag(`newline agent=${null!==(i=null===(t=this.profileForPane(n))||void 0===t?void 0:t.id)&&void 0!==i?i:"unknown"} sequence=${JSON.stringify(o)}`),this.sendToPane(n,"newline",()=>n.sendInput(o))}}get enabled(){return this.config.store.agentDeck.enabled}applyEnabled(){var e;if(document.body.classList.toggle("agentdeck-active",this.enabled),this.sidebar&&(this.sidebar.style.display=this.enabled?"":"none"),null===(e=this.view)||void 0===e||e.setVisible(this.enabled),!this.enabled&&this.mainEl){for(const e of["flex","width","max-width","height","margin-left","margin-right","margin-top","margin-bottom"])this.mainEl.style.removeProperty(e);this.lastTermW=-1,this.lastSidebarW=-1,this.lastViewW=-1,this.lastViewSide=null,this.lastDock=null,this.lastBoxKey="",this.scheduleRefit()}this.syncBackgroundClip()}syncBackgroundClip(){const e=document.documentElement,t=()=>{document.body.classList.remove(ee);for(const t of["--ad-bg-left","--ad-bg-top","--ad-bg-width","--ad-bg-height"])e.style.removeProperty(t)};this.enabled&&this.config.store.agentDeck.clipBackgroundToTerminal&&this.mainEl?requestAnimationFrame(()=>{if(!this.enabled||!this.mainEl)return void t();const i=this.mainEl.getBoundingClientRect();i.width<=0||i.height<=0||(e.style.setProperty("--ad-bg-left",Math.round(i.left)+"px"),e.style.setProperty("--ad-bg-top",Math.round(i.top)+"px"),e.style.setProperty("--ad-bg-width",Math.round(i.width)+"px"),e.style.setProperty("--ad-bg-height",Math.round(i.height)+"px"),document.body.classList.add(ee))}):t()}applyOpacity(){var e;const t=this.config.store.agentDeck,i=re(t.terminalOpacity),n=re(t.sidebarOpacity),o=document.documentElement;n>=100?o.style.removeProperty("--ad-panel-bg"):o.style.setProperty("--ad-panel-bg",`rgba(30, 33, 39, ${n/100})`);const a=null===(e=this.config.store.terminal)||void 0===e?void 0:e.colorScheme;if(!(null==a?void 0:a.background))return;const s=function(e,t){const i=/^#([0-9a-fA-F]{6})(?:[0-9a-fA-F]{2})?$/.exec(e.trim());if(!i)return e;const n="#"+i[1];return t>=100?n:n+Math.round(255*t/100).toString(16).padStart(2,"0")}(a.background,i),r=i<100?"colorScheme":this.config.store.terminal.background;s===a.background&&r===this.config.store.terminal.background||(a.background=s,this.config.store.terminal.background=r,this.config.save())}get dockSide(){const e=this.config.store.agentDeck.sidebarDock;return(0,B.isDockSide)(e)?e:"right"}visibleBox(){const e=this.windowEl.getBoundingClientRect(),t=document.documentElement.clientWidth||window.innerWidth||e.width,i=document.documentElement.clientHeight||window.innerHeight||e.height,n=Math.max(e.left,0),o=Math.max(e.top,0);return{left:n,top:o,width:Math.max(0,Math.round(Math.min(e.right,t)-n)),height:Math.max(0,Math.round(Math.min(e.bottom,i)-o))}}anchorOrigin(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.offsetParent;if(!t||"static"===getComputedStyle(t).position)return{left:0,top:0};const i=t.getBoundingClientRect(),n=getComputedStyle(t);return{left:i.left+(parseFloat(n.borderLeftWidth)||0),top:i.top+(parseFloat(n.borderTopWidth)||0)}}sidebarExtent(e,t,i){const n=this.config.store.agentDeck;if((0,B.isHorizontalDock)(this.dockSide)){const i=n.sidebarMin||200,o=Math.max(n.sidebarMax||560,i);let a=n.sidebarWidth||0;if(!a){const o=(n.aspectW||4)/(n.aspectH||3);let s=Math.round(t*o);s=Math.min(s,e-i),s=Math.max(s,te),a=e-s}const s=n.sidebarWidth?140:i,r=Math.max(e-te,s),d=n.sidebarWidth?Math.max(o,n.sidebarWidth):o;return Math.min(Math.max(a,s),d,r)}const o=n.sidebarHeight||200;return Math.min(Math.max(o,90),Math.max(i-160,90))}relayout(){var e,t,i,n,o;if(document.body.classList.toggle("ad-native-titlebar","win32"===process.platform&&"thin"===(null===(e=this.config.store.appearance)||void 0===e?void 0:e.frame)&&!this.hostWindow.isFullscreen),!this.enabled||!this.windowEl)return void this.diagOnce("relayout-skip-enabled",`relayout skipped enabled=${this.enabled} windowEl=${!!this.windowEl}`);if(this.mainEl||(this.mainEl=document.querySelector(".content.main")),!this.mainEl)return void this.diagOnce("relayout-skip-mainel","relayout skipped mainEl=null");const a=this.visibleBox(),s=a.width,r=this.mainEl.clientHeight||a.height;if(!s||!r)return;const d=this.dockSide,l=(0,B.isHorizontalDock)(d),c=this.viewSide,u=s-te-(l?140:0),p=Math.round(null!==(i=null===(t=this.view)||void 0===t?void 0:t.extent(u))&&void 0!==i?i:0),h=Math.max(s-p,te);let g=Math.round(this.sidebarExtent(h,r,a.height));const f=l?g:0,m=("left"===d?f:0)+("left"===c?p:0),v=("right"===d?f:0)+("right"===c?p:0);let b=s-m-v;g=Math.round(g),b=Math.round(b);const k=a.left+":"+a.top;if(b===this.lastTermW&&g===this.lastSidebarW&&d===this.lastDock&&p===this.lastViewW&&c===this.lastViewSide&&k===this.lastBoxKey)return;this.lastBoxKey=k,this.lastTermW=b,this.lastSidebarW=g,this.lastDock=d,this.lastViewW=p,this.lastViewSide=c;const y=this.anchorOrigin();if(this.sidebar){const e=this.sidebar.style;e.position="absolute",e.left=Math.round(a.left-y.left+("right"===d?a.width-g:0))+"px",e.top=Math.round(a.top-y.top+("bottom"===d?a.height-g:0))+"px",e.right="auto",e.bottom="auto",e.width=(l?g:a.width)+"px",e.height=(l?a.height:g)+"px";for(const e of B.DOCK_SIDES)this.sidebar.classList.toggle("ad-dock-"+e,e===d)}const w=d===c?f:0;null===(n=this.view)||void 0===n||n.layout(c,{left:Math.round(a.left-y.left+("left"===c?w:a.width-p-w)),top:Math.round(a.top-y.top),width:p,height:a.height});const x=this.mainEl.style;if(l||p>0){x.marginLeft=m+"px",x.marginRight="0";const e=this.mainEl.getBoundingClientRect().left;b=Math.max(te,Math.round(a.left+a.width-v-e)),x.flex="0 0 "+b+"px",x.width=b+"px",x.maxWidth=b+"px"}else x.removeProperty("flex"),x.removeProperty("width"),x.removeProperty("max-width"),x.marginLeft="0",x.marginRight="0";l?(x.removeProperty("height"),x.marginTop="0",x.marginBottom="0"):(x.marginTop="top"===d?g+"px":"0",x.marginBottom="bottom"===d?g+"px":"0",x.setProperty("height","calc(100% - "+g+"px)","important")),null===(o=this.dock)||void 0===o||o.syncHandle(),this.syncBackgroundClip(),this.scheduleRefit(),this.diag(`relayout dock=${d} avail=${s}x${r} extent=${g} termW=${b} mainW=${this.mainEl.clientWidth}`)}scheduleRefit(){this.refitQueued||(this.refitQueued=!0,requestAnimationFrame(()=>requestAnimationFrame(()=>{this.refitQueued=!1,this.refitTerminals()})),setTimeout(()=>this.refitTerminals(),500))}refitTerminals(){var e,t;for(const i of this.app.tabs){const n=i,o="function"==typeof n.getAllTabs?n.getAllTabs():[i];for(const i of o){const n=i.frontend,o=null==n?void 0:n.fitAddon;if(!o||"function"!=typeof o.fit)continue;const a=null===(t=null===(e=n.xterm)||void 0===e?void 0:e.element)||void 0===t?void 0:t.parentElement;if(a&&a.clientWidth&&a.clientHeight)try{o.fit()}catch{}}}}syncPtySize(e,t,i=!0){var n,o,a,s;const r=null===(n=null==t?void 0:t.xterm)||void 0===n?void 0:n.cols,d=null===(o=null==t?void 0:t.xterm)||void 0===o?void 0:o.rows;if(!r||!d)return;const l=e,c=l.session;if(!c||!c.open||"function"!=typeof c.resize)return;const u=null!==(a=this.ptyResizeGeneration)&&void 0!==a?a:this.ptyResizeGeneration=new WeakMap,p=(null!==(s=u.get(e))&&void 0!==s?s:0)+1;u.set(e,p);const h=l.size;(null==h?void 0:h.columns)===r&&(null==h?void 0:h.rows)===d||this.diag(`pty resize ${null==h?void 0:h.columns}x${null==h?void 0:h.rows} -> ${r}x${d}`);try{c.resize(r,d),l.size={columns:r,rows:d}}catch(e){return void(0,X.diagCatch)("pty resize",e)}if(i&&((null==h?void 0:h.columns)!==r||(null==h?void 0:h.rows)!==d))for(const t of ne)setTimeout(()=>{var t;const i=null===(t=l.frontend)||void 0===t?void 0:t.xterm;if(l.session===c&&c.open&&u.get(e)===p&&(null==i?void 0:i.cols)===r&&(null==i?void 0:i.rows)===d)try{l.session.resize(r,d)}catch(e){(0,X.diagCatch)("pty resize retry",e)}},t)}nudgePtyRedraw(e,t){var i,n,o,a,s;const r=e,d=r.session,l=null===(n=null===(i=r.frontend)||void 0===i?void 0:i.xterm)||void 0===n?void 0:n.cols,c=null===(a=null===(o=r.frontend)||void 0===o?void 0:o.xterm)||void 0===a?void 0:a.rows;if(!((null==d?void 0:d.open)&&"function"==typeof d.resize&&l>1&&c>1))return;const u="win32"===process.platform&&"codex"===(null===(s=this.profileForPane(e))||void 0===s?void 0:s.id),h=u?l:l-1,g=u?c-1:c;this.diag(`redraw nudge ${l}x${c} -> ${h}x${g}`);try{d.resize(h,g),r.size={columns:h,rows:g};const i=(0,p.perfNow)()+60;setTimeout(()=>{r.session===d&&d.open&&(this.syncPtySize(e,r.frontend,!1),null==t||t.mark("pty-restored",`timerLagMs=${Math.max(0,(0,p.perfNow)()-i).toFixed(1)}`))},60)}catch{}}buildSidebar(){const e=document.createElement("div");e.id=Q,e.innerHTML=['<div class="ad-head">',' <span class="ad-head-title">AGENT DECK <span class="ad-head-version"></span></span>',' <span class="ad-head-count"></span>',"</div>",'<div class="ad-search">',' <input class="ad-search-input" type="text" spellcheck="false"',' placeholder="'+this.ui("세션 검색 (제목 · 작업이름 · 폴더)")+'">',this.uiMarkup(' <button class="ad-search-clear" type="button" title="검색·필터 지우기 (Esc)">&times;</button>'),"</div>",'<div class="ad-list"></div>','<div class="ad-resume-drawer" hidden>',' <div class="ad-resume-rows"></div>',' <div class="ad-resume-head"></div>',"</div>",'<div class="ad-now" hidden>',' <div class="ad-now-title"></div>',this.uiMarkup(' <button type="button" class="ad-now-account" title="계정 선택" aria-haspopup="dialog"></button>'),' <div class="ad-now-gauges"></div>',"</div>",'<div class="ad-foot">',this.uiMarkup(' <button class="ad-btn ad-new" title="새 탭">+ 새 탭</button>'),this.uiMarkup(' <button class="ad-btn ad-settings" title="설정">설정</button>'),this.uiMarkup(' <button class="ad-btn ad-repair" title="화면 복구 (모든 탭 다시 그리기)">↻</button>'),this.uiMarkup(' <button class="ad-btn ad-viewtoggle" title="미리보기 패널 (md · 이미지 · 표)">▤</button>'),"</div>"].join("\n"),e.querySelector(".ad-head-version").textContent=`v${(0,X.pluginVersion)()}`,this.windowEl.appendChild(e);const t=document.createElement("div");t.className="ad-window-drag",t.textContent="AgentDeck",t.title="ko"===this.sidebarLang?"드래그하여 창 이동 · 더블 클릭하여 최대화/복원":"Drag to move window · Double-click to maximize/restore",document.body.appendChild(t),this.sidebar=e,this.listEl=e.querySelector(".ad-list"),this.listEl.addEventListener("pointerdown",e=>{if(0!==e.button||this.listPointerActive)return;this.listPointerActive=!0;const t=()=>{document.removeEventListener("pointerup",t,!0),document.removeEventListener("pointercancel",t,!0),window.removeEventListener("blur",t),setTimeout(()=>{this.listPointerActive=!1,this.scheduleRender()},0)};document.addEventListener("pointerup",t,!0),document.addEventListener("pointercancel",t,!0),window.addEventListener("blur",t)}),this.nowEl=e.querySelector(".ad-now"),this.resumeEl=e.querySelector(".ad-resume-drawer"),this.wireSearch(e),this.wireListKeys(this.listEl),e.querySelector(".ad-new").addEventListener("click",()=>{this.zone.run(()=>{this.openNewTab()})}),e.querySelector(".ad-repair").addEventListener("click",()=>{this.zone.run(()=>this.repair("all"))}),e.querySelector(".ad-settings").addEventListener("click",()=>{this.zone.run(()=>this.openSettings())}),e.querySelector(".ad-viewtoggle").addEventListener("click",()=>{this.zone.run(()=>{var e;return null===(e=this.view)||void 0===e?void 0:e.toggle()})}),this.dock=new B.DockController({sidebar:e,windowEl:this.windowEl,getBox:()=>this.visibleBox(),getDock:()=>this.dockSide,setDock:e=>{this.config.store.agentDeck.sidebarDock=e},getSize:e=>{const t=this.config.store.agentDeck;return(0,B.isHorizontalDock)(e)?(0,B.isHorizontalDock)(this.dockSide)&&this.lastSidebarW>0?this.lastSidebarW:t.sidebarWidth||0:t.sidebarHeight||0},setSize:e=>{const t=this.config.store.agentDeck;(0,B.isHorizontalDock)(this.dockSide)?t.sidebarWidth=e:t.sidebarHeight=e},commit:()=>this.zone.run(()=>this.config.save()),relayout:()=>this.relayout()}),this.dock.install()}wireSearch(e){const t=e.querySelector(".ad-search-input"),i=e.querySelector(".ad-search-clear");t&&(this.searchEl=t,t.addEventListener("input",()=>{this.searchQuery=t.value,this.syncSearchUi(),this.render()}),t.addEventListener("compositionstart",()=>{this.searchComposing=!0}),t.addEventListener("compositionend",()=>{this.searchComposing=!1}),t.addEventListener("keydown",e=>{if(e.stopPropagation(),"ArrowDown"===e.key||"ArrowDown"===e.code){if(this.searchComposing||e.isComposing||!this.navReady)return;return e.preventDefault(),void this.focusList("first")}"Escape"!==e.key&&"Escape"!==e.code||this.searchComposing||e.isComposing||(e.preventDefault(),this.navEscape())}),null==i||i.addEventListener("click",()=>{var e;this.clearFilters(),null===(e=this.searchEl)||void 0===e||e.focus()}),this.applySearchBox())}clearFilters(){this.searchQuery="",this.statusFilter=null,this.searchEl&&(this.searchEl.value=""),this.syncSearchUi(),this.render()}syncSearchUi(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.querySelector(".ad-search");null==t||t.classList.toggle("has-query",!!this.searchQuery.trim()||!!this.statusFilter)}applySearchBox(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.querySelector(".ad-search"),i=!1!==this.config.store.agentDeck.searchBox;t&&(t.style.display=i?"":"none"),i||!this.searchQuery&&!this.statusFilter||this.clearFilters()}toggleStatusFilter(e){this.statusFilter=this.statusFilter===e?null:e,this.syncSearchUi(),this.render()}tabMatchesFilter(e,t,i){var n,o;if(this.statusFilter&&i!==this.statusFilter)return!1;if(!t.length)return!0;const a=null!==(o=null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.dir)&&void 0!==o?o:null;return ce([this.identityOf(e).letter,this.identityOf(e).alias,(0,D.stripTitleMarker)(e.customTitle||e.title||""),this.status.get(e).label,a,a?null:this.ui(W.UNGROUPED_LABEL)],t)}migrateFollowConfig(){const e=this.config.store.agentDeck,t=(0,Z.migrateFollow)(e.viewerFollowMode,e.viewerFollow);t&&(e.viewerPreload=t.preload,e.viewerAutoOpen=t.autoOpen,e.viewerFollowMode="",e.viewerFollow=!0,this.config.save(),this.diag(`migrate follow -> preload=${t.preload} autoOpen=${t.autoOpen}`))}buildView(){var e;if(!this.windowEl)return;const t=()=>this.config.store.agentDeck;this.view=new Y.ViewPanel({windowEl:this.windowEl,getSide:()=>this.viewSide,getWidth:()=>t().viewerWidth||420,setWidth:e=>{t().viewerWidth=e},getRecentMax:()=>t().viewerRecentMax||12,getFollowMode:()=>(0,Z.followModeOf)(t().viewerPreload,t().viewerAutoOpen),cwdFor:e=>{var i;return this.notify.cwdOf(e)||(null===(i=this.cwdCache.get(e))||void 0===i?void 0:i.dir)||t().rootProfileCwd||null},touchedFor:e=>this.notify.touchedOf(e),commit:()=>this.zone.run(()=>this.config.save()),relayout:()=>this.relayout(),setOpen:e=>this.zone.run(()=>{t().viewerOpen=e,this.config.save()}),openExternal:e=>this.platform.openExternal(e),sendText:e=>{const t=this.app.activeTab,i=t?this.firstPane(t):null;return!(!i||!e||(this.sendToPane(i,"ref-paste",()=>i.sendInput(e)),0))}}),this.view.install(),this.view.setActiveTab(null!==(e=this.app.activeTab)&&void 0!==e?e:null),t().viewerOpen&&this.view.setOpen(!0,!1)}get viewSide(){return"left"===this.config.store.agentDeck.viewerDock?"left":"right"}touchCwd(e,t){var i,n;const o=Date.now(),a=this.cwdCache.get(e),s=this.notify.cwdOf(e);if(s)return void((null==a?void 0:a.dir)!==s&&(this.cwdCache.set(e,{dir:s,at:o,misses:0}),this.scheduleRender()));const r=(null==a?void 0:a.dir)?3e3:400;if(a&&o-a.at<r)return;const d=(null==a?void 0:a.dir)?0:(null!==(i=null==a?void 0:a.misses)&&void 0!==i?i:0)+1;this.cwdCache.set(e,{dir:null!==(n=null==a?void 0:a.dir)&&void 0!==n?n:null,at:o,misses:d});const l=t.session;(null==l?void 0:l.getWorkingDirectory)&&Promise.resolve(l.getWorkingDirectory()).then(t=>{t&&function(e){try{return c.statSync(e).isDirectory()}catch{return!1}}(t)&&(this.cwdCache.set(e,{dir:t,at:Date.now(),misses:0}),this.scheduleRender())}).catch(()=>{})}async openNewTab(){var e;if(this.syncSessionSlots(),!(this.pendingSessionOpens||this.sessionSlots.occupied+this.pendingSessionOpens>=U.JUMP_SLOTS)){this.pendingSessionOpens++;try{const t=this.config.store.terminal.profile,i=await this.profiles.getProfiles(),n=this.config.store.agentDeck,o=new Set((n.rootProfiles||[]).filter(e=>{var t;return null===(t=null==e?void 0:e.cwd)||void 0===t?void 0:t.trim()}).map(e=>e.id));n.rootProfile&&n.rootProfileCwd&&o.add(u.ROOT_PROFILE_ID);const a=i.filter(e=>o.has(e.id));let s=null!==(e=i.find(e=>e.id===t))&&void 0!==e?e:i[0];if(1===a.length)s=a[0];else if(a.length>1)try{s=await this.app.showSelector("ko"===this.sidebarLang?"작업 루트 선택":"Choose work root",a.map(e=>{var t;return{name:e.name,description:null===(t=e.options)||void 0===t?void 0:t.cwd,result:e}}))}catch{return}if(s){const e=s.options||{};await this.profiles.openNewTabForProfile({...s,options:{...e,env:(0,N.storageEnvironment)(e.env)}})}}finally{this.pendingSessionOpens--}}}openSettings(){this.app.openNewTabRaw({type:S.SettingsTabComponent})}scheduleRender(){if(this.renderQueued)return;this.renderQueued=!0;const e=()=>{this.renderQueued&&(this.renderQueued=!1,this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=null),this.render(),this.relayout())};requestAnimationFrame(e),this.renderTimer=setTimeout(e,50)}disableBackgroundThrottling(){var e,t,i,n,o;if(this.config.store.agentDeck.keepRenderingWhenHidden)try{const a=null!==(e=window.require)&&void 0!==e?e:globalThis.require,s=null===(i=null===(t=null==a?void 0:a("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===i?void 0:i.call(t);null===(o=null===(n=null==s?void 0:s.webContents)||void 0===n?void 0:n.setBackgroundThrottling)||void 0===o||o.call(n,!1)}catch{}}tick(){var e,t,i;if(!this.enabled)return;let n=!1;const o=this.config.store.agentDeck.idleAfterMs||2500,a=null!==(e=this.config.store.agentDeck.staleAfterMs)&&void 0!==e?e:3e5;for(const e of this.app.tabs){this.status.tickIdle(e,o,a)&&(n=!0);const s=this.notify.cwdOf(e);if(s&&(null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)!==s&&(this.cwdCache.set(e,{dir:s,at:Date.now(),misses:0}),n=!0),e===this.app.activeTab)try{const t=this.cwdCache.get(e);if(!(null==t?void 0:t.dir)&&(null!==(i=null==t?void 0:t.misses)&&void 0!==i?i:0)<20){const t=this.firstPane(e);t&&this.touchCwd(e,t)}}catch{}}this.syncLedger(),(n||this.config.store.agentDeck.showElapsed||!1!==this.config.store.agentDeck.subagentCount)&&this.render()}syncLedger(){var e,t;if(!1===this.config.store.agentDeck.resumeList)return;let i;try{i=this.notify.liveSessions()}catch{return}for(const[n,o]of i){if(!this.app.tabs.includes(o))continue;const i=this.status.get(o);this.ledger.note(n,{cwd:null!==(t=null===(e=this.cwdCache.get(o))||void 0===e?void 0:e.dir)&&void 0!==t?t:null,label:i.label,status:i.status})}}renderPlan(){const e=e=>this.status.get(e).status;this.syncSessionSlots();const t=[...this.app.tabs],i=le(this.searchQuery),n=i.length>0||!!this.statusFilter,o=n?t.filter(t=>this.tabMatchesFilter(t,i,e(t))):t;return{tabs:t,visible:o,groups:this.groupsFor(o),withHeads:!1,plan:[{key:null,label:W.UNGROUPED_LABEL,tabs:[...o]}],statusOf:e,filtering:n,collapseOf:e=>(0,W.resolveGroupCollapseFor)(e,this.config.store.agentDeck.collapsedGroups,n)}}render(){var e;if(this.refreshSidebarLanguage(),!this.listEl||!this.enabled||this.editing||(null===(e=this.drag)||void 0===e?void 0:e.moved)||this.listPointerActive)return;this.pruneNavFocus();const{tabs:t,visible:i,withHeads:n,plan:o,statusOf:a,filtering:s,collapseOf:r}=this.renderPlan();if(this.renderHeadCount(t,a),this.renderNow(),this.renderResumeDrawer(),this.listEl.innerHTML="",!s||i.length)for(const e of o){const t=n?r(e):{collapsed:!1,reason:"open"},i=t.collapsed;if(n&&this.listEl.appendChild(this.renderGroupHead(e,t)),!i)for(const t of e.tabs)this.listEl.appendChild(this.renderTab(t))}else this.listEl.appendChild(this.renderEmpty(t.length))}async showAccountPicker(){if(this.accountPopup)return this.accountPopup.remove(),void(this.accountPopup=null);const e=this.app.activeTab,t=this.notify.metaOf(e);if(!e||!t||"claude"!==t.agent&&"codex"!==t.agent)return;const i=t.agent,n=document.createElement("div");n.className="ad-account-picker",n.setAttribute("role","dialog"),n.setAttribute("aria-label",this.ui("{provider} 계정 선택",{provider:"claude"===i?"Claude":"Codex"}));const o=document.createElement("strong");o.textContent=this.ui("{provider} 계정",{provider:"claude"===i?"Claude":"Codex"});const a=document.createElement("button");a.type="button",a.textContent="×",a.className="ad-account-close",a.title=this.ui("닫기"),a.setAttribute("aria-label",this.ui("닫기"));const s=[],r=()=>{s.forEach(clearInterval),n.remove(),this.accountPopup===n&&(this.accountPopup=null)};a.onclick=r,n.addEventListener("keydown",e=>{"Escape"===e.key&&(e.stopPropagation(),r())}),n.append(o,a);const d=document.createElement("p");d.textContent=this.ui("현재 탭에서 선택한 계정으로 전환합니다."),n.appendChild(d);const l=document.createElement("p");l.setAttribute("role","status"),n.appendChild(l);const c=document.createElement("button");let u;c.type="button",c.className="ad-account-add",c.textContent="+",c.title=this.ui("계정 추가"),c.setAttribute("aria-label",this.ui("계정 추가")),n.appendChild(c),c.onclick=()=>{if(n.querySelector(".ad-account-form"))return;const t=document.createElement("form");t.className="ad-account-form";const o=document.createElement("label");o.textContent=this.ui("계정 이름 (선택)");const a=document.createElement("input");a.type="text",a.name="name",a.autocomplete="off",o.appendChild(a);const s=document.createElement("label");s.textContent=this.ui("계정 (이메일)");const d=document.createElement("input");d.type="email",d.name="account",d.autocomplete="username",d.required=!0,s.appendChild(d);const u=document.createElement("label");u.textContent=this.ui("비밀번호");const p=document.createElement("input");p.type="password",p.name="password",p.autocomplete="new-password",p.required=!0,u.appendChild(p);const h=document.createElement("p");h.className="ad-account-plaintext",h.textContent=this.ui("계정과 비밀번호가 이 PC에 평문으로 저장됩니다.");const g=document.createElement("p");g.setAttribute("role","alert");const f=document.createElement("button");f.type="submit",f.textContent=this.ui("저장");const m=document.createElement("button");m.type="button",m.textContent=this.ui("취소"),m.onclick=()=>{p.value="",t.remove(),c.focus()},t.append(o,s,u,h,g,f,m),t.onsubmit=t=>{if(t.preventDefault(),!this.accountSwitchBusy)try{(0,R.addAccount)(i,d.value,p.value,void 0,a.value),p.value="",r(),this.app.activeTab===e&&this.showAccountPicker()}catch(e){g.textContent=this.ui(e.message)}},n.insertBefore(t,l),a.focus()},document.body.appendChild(n),this.accountPopup=n,this.accountPopupTab=e,a.focus();try{u=(0,R.readAccounts)().filter(e=>e.provider===i)}catch(e){return void(l.textContent=this.ui(e.message))}if(u.length)for(const o of u){const a=document.createElement("button");a.type="button",a.className="ad-account-option";const d=document.createElement("strong"),c=t.account.toLowerCase()===o.id.toLowerCase();d.textContent=o.name+(c?this.ui(" · 현재 계정"):"");const u=document.createElement("span");u.className="ad-now-gauges",u.textContent=this.ui("잔량 조회 중…");const p=document.createElement("span");p.className="ad-account-email",p.textContent=o.id,a.append(d,p,u);const h=document.createElement("div");h.className="ad-account-row";const g=document.createElement("button");if(g.type="button",g.className="ad-account-remove",g.textContent=this.ui("목록에서 삭제"),g.setAttribute("aria-label",this.ui("목록에서 삭제")+": "+o.name),g.onclick=()=>{if(!this.accountSwitchBusy)try{(0,R.removeAccount)(o),r(),this.app.activeTab===e&&this.showAccountPicker()}catch(e){l.textContent=this.ui(e.message)}},h.append(a,g),n.appendChild(h),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.id)){u.textContent=this.ui("이메일 주소 전체를 입력하세요."),a.disabled=!0;continue}try{(0,R.prepareAccount)(o,t.configDir||void 0)}catch{u.textContent=this.ui("계정 저장 폴더를 준비하지 못했습니다."),a.disabled=!0;continue}(0,M.registerAccountSource)(o,t.configDir);const f=()=>{if(n.isConnected)if((0,$.accountRefreshState)((0,R.accountHome)(o)).blocked)u.textContent="ko"===this.sidebarLang?"재로그인 필요 · 자동 점검 중단":"Sign in again · automatic checks stopped";else{for(const e of this.app.tabs.map(e=>this.notify.metaOf(e)).filter(Boolean))(0,M.recordAccountUsage)(o,e);(0,M.getAccountQuotas)(o).then(e=>{var t,i,o;if(!n.isConnected)return;const a=e.values,s={};for(const e of a){if(void 0===e.remaining)continue;const t=100-e.remaining;"5시간"===e.label?(s.fiveHourPct=t,s.fiveHourResetsAt=e.resetsAt):"주간"===e.label?(s.sevenDayPct=t,s.sevenDayResetsAt=e.resetsAt):(s.scopedName=e.label,s.scopedPct=t,s.scopedResetsAt=e.resetsAt)}const r=(null===(t=(0,I.formatMeta)({model:"account",limits:s},Date.now()))||void 0===t?void 0:t.gauges)||[];this.renderMetaGauges(u,r);for(const e of a.filter(e=>void 0===e.remaining&&e.status)){const t=document.createElement("span");t.className="ad-now-reset";const n=null!==(i=m.RESET_COPY[this.sidebarLang])&&void 0!==i?i:m.RESET_COPY.en;t.textContent=`${e.label.toLowerCase()} · ${n["사용 가능"===e.status?3:4]}`,u.appendChild(t),u.hidden=!1}if(a.length||(u.hidden=!1,u.textContent=this.ui("사용량 정보 없음")),e.stale){const t=document.createElement("span");t.className="ad-now-reset",t.textContent="⏱ "+new Date(e.ts).toLocaleString((null===(o=this.locale)||void 0===o?void 0:o.getLocale())||void 0),u.appendChild(t)}},e=>{u.textContent="ko"===this.sidebarLang?e.message:this.ui("사용량 정보 없음")})}else s.forEach(clearInterval)};f(),s.push(setInterval(f,6e4)),a.onclick=async()=>{if(!this.accountSwitchBusy)if(this.app.tabs.includes(e))if(!c||(0,$.accountRefreshState)((0,R.accountHome)(o)).blocked){this.accountSwitchBusy=!0,n.querySelectorAll(".ad-account-option").forEach(e=>{e.disabled=!0});try{l.textContent=this.ui("{name} 인증 확인 중…",{name:o.name});try{await(0,M.ensureAccountSession)(o)}catch(e){if(!(e instanceof R.AccountRequestError)||"auth"!==e.kind)throw e;l.textContent=this.ui("{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.",{name:o.name}),await(0,R.loginAccount)(o,L.openAccountBrowser)}if(await(0,M.ensureAccountSession)(o),!this.app.tabs.includes(e))return void(l.textContent=this.ui("인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다."));const n=this.notify.metaOf(e)||t;let a=(0,J.resumeCommand)(n.sessionId,!1,i);a||(a=i),"codex"===i&&(a=a.replace(/^codex(?: |$)/,"codex -c 'cli_auth_credentials_store=\"file\"' ")),await this.switchAccountInTab(e,o,a,n.cwd),r()}catch(e){l.textContent="ko"===this.sidebarLang&&e.message?e.message:this.ui("계정 전환에 실패했습니다. 다시 선택하세요.")}finally{this.accountSwitchBusy=!1,n.querySelectorAll(".ad-account-option").forEach(e=>{e.disabled=!1})}}else r();else l.textContent=this.ui("원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.")}}else l.textContent=this.ui("+ 버튼으로 계정을 추가하세요.")}async switchAccountInTab(e,t,i,n){var o,a,s,r,d,l,c;const u=this.firstPane(e);if(!u||"local"!==(null===(o=u.profile)||void 0===o?void 0:o.type)||"function"!=typeof u.initializeSession||!u.session)throw new Error(this.ui("계정 전환에 실패했습니다. 다시 선택하세요."));const p=(await this.profiles.getProfiles()).find(e=>e.id===this.config.store.terminal.profile)||u.profile;if(!this.app.tabs.includes(e)||"local"!==p.type)throw new Error(this.ui("계정 전환에 실패했습니다. 다시 선택하세요."));const h={...p.options,cwd:n||(null===(a=u.profile.options)||void 0===a?void 0:a.cwd),env:{...null===(s=p.options)||void 0===s?void 0:s.env,...null===(r=u.profile.options)||void 0===r?void 0:r.env,["claude"===t.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]:(0,R.accountHome)(t)}};delete h.restoreFromPTYID;for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY","CLAUDECODE"])h.env[e]="";const g=u.session;u.setSession(null),await g.destroy(),this.app.tabs.includes(e)&&(u.profile={...u.profile,options:h},u.sessionOptions=h,null===(l=null===(d=u.frontend)||void 0===d?void 0:d.xterm)||void 0===l||l.reset(),u.initializeSession(u.size.columns,u.size.rows),this.notify.setAccountHome(e,t.provider,(0,R.accountHome)(t),t.id),this.sendResumeCommand(e,i,u.session),null===(c=u.session)||void 0===c||c.releaseInitialDataBuffer(),this.diag("account switched in existing tab"))}renderNow(){var e;this.accountPopup&&this.accountPopupTab!==this.app.activeTab&&(this.accountPopup.remove(),this.accountPopup=null,this.accountPopupTab=null);const t=this.nowEl;if(!t)return;const i=this.notify.metaOf(this.app.activeTab),n=!1===this.config.store.agentDeck.metaLine?null:(0,I.formatMeta)(i,Date.now());if(!n)return void(t.hidden=!0);t.hidden=!1,t.title=[n.title,n.account?this.ui("계정: {value}",{value:n.account+((null==i?void 0:i.org)?` (${i.org})`:"")}):"",(null==i?void 0:i.version)?this.ui("버전: {value}",{value:i.version}):"",(null==i?void 0:i.cwd)?this.ui("폴더: {value}",{value:i.cwd}):"",...n.gauges.map(e=>e.text+(e.resetText?" — "+(0,m.sidebarReset)(e.resetText,this.sidebarLang):""))].filter(Boolean).join("\n"),t.querySelector(".ad-now-title").textContent=n.title;const o=t.querySelector(".ad-now-account"),a=null===(e=this.notify.metaOf(this.app.activeTab))||void 0===e?void 0:e.agent,s="claude"===a||"codex"===a;o.textContent=n.account||this.ui("계정 선택"),o.hidden=!n.account&&!s,o.disabled=!s,o.onclick=()=>{this.showAccountPicker()};const r=t.querySelector(".ad-now-gauges");this.renderMetaGauges(r,n.gauges)}renderMetaGauges(e,t){e.innerHTML="";for(let i=0;i<t.length;i++){const n=t[i],o=document.createElement("div");o.className=`ad-now-gauge ad-now-${n.level}`,o.title=n.resetText?`${n.text} — ${(0,m.sidebarReset)(n.resetText,this.sidebarLang)}`:n.text;const a=document.createElement("span");a.className="ad-now-gauge-key",a.textContent=n.key;const s=document.createElement("span");s.className="ad-now-bar";const r=document.createElement("span");r.className="ad-now-bar-fill",r.style.width=n.pct+"%",s.appendChild(r);const d=document.createElement("span");d.className="ad-now-gauge-pct",d.textContent=n.pct+"%",o.appendChild(a),o.appendChild(s),o.appendChild(d),e.appendChild(o);const l=t[i+1];if(n.resetLine&&(!l||l.resetLine!==n.resetLine)){const t=document.createElement("div");t.className="ad-now-reset",t.textContent=(0,m.sidebarReset)(n.resetLine,this.sidebarLang),e.appendChild(t)}}e.hidden=!t.length}renderResumeDrawer(){const e=this.resumeEl;if(!e)return;const t=this.config.store.agentDeck;if(!1===t.resumeList)return void(e.hidden=!0);this.ledger.refresh();const i=(0,J.resumeRowsFor)(this.ledger.records(),{groupKeys:null,keyOf:e=>(0,W.groupKeyOf)(e,K.projectRootOf),fold:W.foldGroupKey,live:this.liveSessionIds(),days:Number(t.resumeListDays)||0,limit:Number(t.resumeListLimit)||0,hidden:new Set(Array.isArray(t.resumeHidden)?t.resumeHidden:[]),now:Date.now()}),n=i;e.hidden=!1;const o=this.isResumeExpanded(null);e.classList.toggle("expanded",o);const a=e.querySelector(".ad-resume-head");this.fillResumeHead(a,n.length,i.length,o);const s=e.querySelector(".ad-resume-rows");if(this.historySearchPanel||(this.historySearchPanel=new V.SessionSearchPanel({sources:()=>this.ledger.historySources(),korean:()=>"ko"===this.sidebarLang,searchLabel:()=>this.ui("세션 검색 (제목 · 작업이름 · 폴더)"),changed:()=>this.renderResumeDrawer(),resume:e=>{e.openTabId=this.liveSessionIds().get(e.sessionId)||null,this.zone.run(()=>this.activateResume(e,!1))}})),this.historySearchPanel.element.parentElement!==e&&e.insertBefore(this.historySearchPanel.element,s),this.historySearchPanel.update(o),s.innerHTML="",s.hidden=!o||this.historySearchPanel.active,!s.hidden){for(const e of n)s.appendChild(this.renderResumeRow(e));if(!n.length){const e=document.createElement("div");e.className="ad-resume-empty",e.textContent=this.ui("검색어와 맞는 지난 세션이 없다"),s.appendChild(e)}}}liveSessionIds(){var e;this.resumeTabs.clear();const t=new Map;let i;try{i=this.notify.liveSessions()}catch{return t}for(const[e,n]of i)this.app.tabs.includes(n)&&(t.set(e,e),this.resumeTabs.set(e,n));for(const[i,n]of null!==(e=this.resumeStarting)&&void 0!==e?e:[])this.app.tabs.includes(n)&&(t.has(i)||(t.set(i,i),this.resumeTabs.set(i,n)));return t}isResumeExpanded(e){const t=this.config.store.agentDeck.resumeExpanded;if(!Array.isArray(t))return!1;const i=(0,W.collapseIdOf)(e);return t.some(e=>"string"==typeof e&&(0,W.foldGroupKey)(e)===(0,W.foldGroupKey)(i))}toggleResumeExpanded(e){const t=this.config.store.agentDeck,i=(0,W.collapseIdOf)(e),n=Array.isArray(t.resumeExpanded)?t.resumeExpanded.filter(e=>"string"==typeof e):[],o=n.filter(e=>(0,W.foldGroupKey)(e)!==(0,W.foldGroupKey)(i));t.resumeExpanded=o.length===n.length?[...n,i]:o,this.config.save(),this.render()}fillResumeHead(e,t,i,n){e.firstChild||(e.innerHTML=['<span class="ad-resume-glyph">⟲</span>','<span class="ad-group-label"></span>','<span class="ad-group-count"></span>','<span class="ad-group-caret"></span>'].join(""),e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggleResumeExpanded(null)})),e.classList.toggle("collapsed",!n),e.querySelector(".ad-group-label").textContent=this.ui("지난 세션"),e.querySelector(".ad-group-count").textContent=t===i?String(i):`${t}/${i}`,e.querySelector(".ad-group-caret").textContent=n?"▾":"▴",e.title=this.ui("닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다")}renderResumeRow(e){var t;const i=document.createElement("div");i.className="ad-resume"+(e.openTabId?" open":""),i.innerHTML=['<div class="ad-bar"></div>','<div class="ad-body">',' <div class="ad-title"></div>',' <div class="ad-meta">',' <span class="re-was"></span>',' <span class="re-when"></span>'," </div>","</div>"].join("\n");const n=e.label||this.ui("세션 {id}",{id:e.sessionId.slice(0,8)}),o=i.querySelector(".ad-title");o.textContent=n,this.decorateAgent(o,(0,T.profileFor)(null!==(t=e.agent)&&void 0!==t?t:"claude"));const a=i.querySelector(".re-was");if(e.openTabId)a.textContent=this.ui("● 열림"),a.className="re-was live";else{const t=O.STATUS_STYLES[e.lastStatus];a.textContent=t?this.ui(t.label):"",a.className="re-was"+(e.lastStatus?" s-"+e.lastStatus:"")}return a.textContent=`${"codex"===e.agent?"Codex":"Claude"} · ${a.textContent||this.ui("지난 세션")}`,i.querySelector(".re-when").textContent=this.ui((0,J.formatWhen)(e.lastSeen,Date.now())),i.title=n+"\n"+(e.openTabId?this.ui("이미 열려 있다 — 누르면 그 탭으로 이동"):this.ui("누르면 새 탭에서 이어받는다 ({id})",{id:e.sessionId})+"\n"+this.ui("작업 폴더: {cwd}",{cwd:e.cwd||this.ui("모름")})+"\n"+this.ui("※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다")),i.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>{this.activateResume(e,!1)})}),i.addEventListener("contextmenu",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>this.showResumeMenu(e,t))}),i}renderEmpty(e){const t=document.createElement("div");t.className="ad-empty";const i=[],n=this.searchQuery.trim();return n&&i.push('"'+n+'"'),this.statusFilter&&i.push(this.ui(O.STATUS_STYLES[this.statusFilter].label)),t.textContent=this.ui("{filter}에 걸리는 세션이 없다 (전체 {total}개)",{filter:i.join(" · "),total:e}),t.title=this.ui("Esc 또는 ✕ 로 전체 목록으로 돌아간다"),t}groupsFor(e){return(0,W.groupTabs)(e,e=>{var t,i;return null!==(i=null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)&&void 0!==i?i:null},e=>(0,K.projectRootOf)(e,()=>this.scheduleRender()))}collapsedKeys(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.map(e=>(0,W.foldGroupKey)(String(e))):[]}isGroupCollapsed(e){return(0,W.isStoredCollapsed)(e,this.config.store.agentDeck.collapsedGroups)}toggleGroup(e){const t=(0,W.collapseIdOf)(e),i=this.collapsedKeys(),n=i.filter(e=>e!==t);n.length===i.length&&n.push(t),this.zone.run(()=>{this.config.store.agentDeck.collapsedGroups=n,this.config.save()}),this.render()}renderGroupHead(e,t){const i=t.collapsed,n=document.createElement("div");n.className=i?"ad-group-head collapsed":"filter-open"===t.reason?"ad-group-head filter-open":"ad-group-head",n.innerHTML=['<span class="ad-group-caret"></span>','<span class="ad-group-label"></span>','<span class="ad-group-count"></span>'].join("");const o=n.querySelector(".ad-group-caret"),a=n.querySelector(".ad-group-label"),s=n.querySelector(".ad-group-count");o.textContent=i?"▸":"▾",a.textContent=null===e.key?this.ui(W.UNGROUPED_LABEL):e.label,s.textContent=String(e.tabs.length);const r="filter-open"===t.reason?this.ui(" · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)"):"";return n.title=(e.key?this.ui("{folder} (탭 {count}개) — 클릭하면 접기/펴기",{folder:e.key,count:e.tabs.length}):this.ui("작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기",{count:e.tabs.length}))+r,this.isNavFocused({kind:"head",key:e.key})&&n.classList.add("ad-nav-focus"),n.addEventListener("click",()=>this.toggleGroup(e.key)),n}renderHeadCount(e,t){const i=this.sidebar.querySelector(".ad-head-count");if(!i)return;i.innerHTML="",i.title=this.ui("탭 {count}개",{count:e.length});const n=this.statusFilter,o=(0,q.countByStatus)(e,t);n&&!o.some(e=>e.status===n)&&(o.push({status:n,count:0}),o.sort((e,t)=>(0,q.statusRank)(e.status)-(0,q.statusRank)(t.status)));for(const{status:e,count:t}of o){const o=O.STATUS_STYLES[e],a=document.createElement("span");a.className=e===n?"ad-cnt active":"ad-cnt",a.style.setProperty("--ad-color",o.color),a.title=e===n?this.ui("{status} {count} — 클릭하면 필터 해제",{status:this.ui(o.label),count:t}):this.ui("{status} {count} — 클릭하면 이 상태만",{status:this.ui(o.label),count:t}),a.textContent=`${o.icon} ${t}`,a.addEventListener("pointerdown",e=>e.stopPropagation()),a.addEventListener("click",t=>{t.stopPropagation(),this.toggleStatusFilter(e)}),i.appendChild(a)}e.length||(i.textContent="0")}decorateAgent(e,t){if(!e||!(null==t?void 0:t.icon))return;const i=document.createElement("span");i.className="ad-agent",i.title=t.label,i.innerHTML=t.icon,e.insertAdjacentElement("afterbegin",i)}renderTab(e){const t=this.status.get(e),i=O.STATUS_STYLES[t.status],n=e===this.app.activeTab,o=document.createElement("div");o.className=n?"ad-tab active":"ad-tab",o.style.setProperty("--ad-color",i.color),o.dataset.adIndex=String(this.app.tabs.indexOf(e));const a=this.identityOf(e);o.dataset.adIdentity=a.alias,this.isNavFocused({kind:"tab",tab:e})&&o.classList.add("ad-nav-focus");const s=(0,D.stripTitleMarker)(e.customTitle||e.title||"")||this.ui("(제목 없음)"),r=this.config.store.agentDeck.showElapsed?this.formatElapsed(Date.now()-t.since):"";o.innerHTML=['<div class="ad-bar"></div>','<div class="ad-body">',' <div class="ad-title"></div>',' <div class="ad-prompt"><span class="ad-label"></span></div>',' <div class="ad-meta">',' <span class="ad-identity"></span>',' <span class="ad-badge"></span>',' <span class="ad-elapsed"></span>'," </div>","</div>",this.uiMarkup('<button class="ad-close" title="탭 닫기">&times;</button>')].join("\n");const d=o.querySelector(".ad-title");d.textContent=s,d.title=s;const l=o.querySelector(".ad-identity");l.textContent=a.alias||"별명 준비 중",l.hidden=!a.id,l.title="다른 탭에서 부르는 고정 별명 (작업 기준 자동 배정)",l.addEventListener("dblclick",e=>e.stopPropagation()),this.decorateAgent(d,this.profileForTab(e));const c=o.querySelector(".ad-label");c.textContent=t.label||"—",c.classList.toggle("empty",!t.label),o.querySelector(".ad-elapsed").textContent=r;const u=o.querySelector(".ad-badge"),p=(0,m.sidebarReason)(t.reason,this.sidebarLang);u.textContent=i.icon+" "+this.ui(i.label)+(p?" · "+p:""),u.title=p,t.pinned&&u.classList.add("pinned");const h=this.notify.subagentsOf(e);if(h){const e=document.createElement("span");e.className="ad-subagents",e.textContent=`❖${h.running}`,h.tooltip&&(e.title=h.tooltip),u.insertAdjacentElement("afterend",e)}return o.addEventListener("pointerdown",t=>this.armRowDrag(t,e,o)),o.addEventListener("click",t=>{t.target.closest(".ad-close")||(this.dragClickGuard?this.dragClickGuard=!1:(this.navFocus={kind:"tab",tab:e},this.zone.run(()=>this.app.selectTab(e))))}),o.addEventListener("dblclick",t=>{t.preventDefault(),this.startLabelEdit(o,e)}),o.addEventListener("contextmenu",t=>{t.preventDefault(),this.showStatusMenu(t,e)}),o.querySelector(".ad-close").addEventListener("click",t=>{t.stopPropagation(),this.zone.run(()=>{this.app.closeTab(e,!0)})}),o}get navMode(){const e=document.activeElement;return e&&e===this.searchEl?"search":e&&e===this.listEl?"list":"off"}get navReady(){return!!this.listEl&&this.enabled&&!1!==this.config.store.agentDeck.keyboardNav}navSearchVisible(){return!!this.searchEl&&this.enabled&&!1!==this.config.store.agentDeck.searchBox}navPlan(){const{withHeads:e,plan:t,collapseOf:i}=this.renderPlan(),n=(0,U.navRowsOf)(t.map(t=>({key:t.key,tabs:t.tabs,head:e,collapsed:e&&i(t).collapsed})));return{rows:n,index:this.navIndexIn(n)}}sameNavRow(e,t){return"tab"===e.kind&&"tab"===t.kind?e.tab===t.tab:"head"===e.kind&&"head"===t.kind&&(0,W.collapseIdOf)(e.key)===(0,W.collapseIdOf)(t.key)}navIndexIn(e){const t=this.navFocus;if(!t)return-1;for(let i=0;i<e.length;i++)if(this.sameNavRow(e[i],t))return i;return-1}isNavFocused(e){return"list"===this.navMode&&!!this.navFocus&&this.sameNavRow(e,this.navFocus)}pruneNavFocus(){const e=this.navFocus;e&&"tab"===e.kind&&!this.app.tabs.includes(e.tab)&&(this.navFocus=null)}focusList(e="keep"){if(!this.navReady)return!1;const{rows:t,index:i}=this.navPlan();return!!t.length&&("last"===e?this.navFocus=t[t.length-1]:("first"===e||i<0)&&(this.navFocus=t[0]),this.listEl.tabIndex=-1,this.listEl.focus({preventScroll:!0}),this.render(),this.scrollNavIntoView(),!0)}focusSearch(){if(!this.navSearchVisible())return!1;this.searchEl.focus();try{const e=this.searchEl.value.length;this.searchEl.setSelectionRange(e,e)}catch{}return this.render(),!0}releaseKeyboard(){var e,t,i;const n=document.activeElement;n!==this.listEl&&n!==this.searchEl||n.blur();const o=this.focusedPane();"function"==typeof(null===(e=null==o?void 0:o.frontend)||void 0===e?void 0:e.focus)?o.frontend.focus():null===(i=null===(t=this.app.activeTab)||void 0===t?void 0:t.emitFocused)||void 0===i||i.call(t),this.render()}moveNav(e,t){if(!this.navReady)return;const{rows:i,index:n}=this.navPlan();if(!i.length)return void(this.navFocus=null);if(!t&&e<0&&0===n&&this.navSearchVisible())return void this.focusSearch();const o=!!this.config.store.agentDeck.keyboardNavWrap,a="first"===t?0:"last"===t?i.length-1:(0,U.stepNavIndex)(i.length,n,e,o);a<0||(this.navFocus=i[a],this.render(),this.scrollNavIntoView())}activateNav(){const e=this.navFocus;if(e)return"head"===e.kind?(this.toggleGroup(e.key),void this.scrollNavIntoView()):void(this.app.tabs.includes(e.tab)&&(this.zone.run(()=>this.app.selectTab(e.tab)),this.releaseKeyboard()))}jumpToRow(e){if(!this.navReady||!Number.isInteger(e)||e<1||e>U.JUMP_SLOTS)return;const t=(0,U.pickJumpTarget)(this.navPlan().rows,e);t&&this.app.tabs.includes(t)&&(this.navFocus={kind:"tab",tab:t},this.zone.run(()=>this.app.selectTab(t)),this.diag(`jump slot=${e}`))}navEscape(){this.searchQuery.trim()||this.statusFilter?this.clearFilters():this.releaseKeyboard()}toggleKeyboardNav(){this.navReady&&("off"===this.navMode?this.focusList("keep")||this.focusSearch():this.releaseKeyboard())}scrollNavIntoView(){var e;const t=null===(e=this.listEl)||void 0===e?void 0:e.querySelector(".ad-nav-focus");null==t||t.scrollIntoView({block:"nearest",inline:"nearest"})}wireListKeys(e){e.addEventListener("keydown",e=>{if(!this.navReady)return;if(e.ctrlKey||e.altKey||e.metaKey)return;const t=e.key,i=e.code,n=()=>{e.preventDefault(),e.stopPropagation()};if("ArrowDown"===t||"ArrowDown"===i)return n(),void this.moveNav(1);if("ArrowUp"===t||"ArrowUp"===i)return n(),void this.moveNav(-1);if("Home"===t||"Home"===i)return n(),void this.moveNav(0,"first");if("End"===t||"End"===i)return n(),void this.moveNav(0,"last");if("Enter"===t||"Enter"===i||"NumpadEnter"===i){if(e.isComposing||229===e.keyCode)return;return n(),void this.activateNav()}return"Escape"===t||"Escape"===i?(n(),void this.navEscape()):"Tab"===t||"Tab"===i?(n(),void this.focusSearch()):void 0}),e.addEventListener("focus",()=>this.scheduleRender()),e.addEventListener("blur",()=>this.scheduleRender())}armRowDrag(e,t,i){if(this.dragClickGuard=!1,0!==e.button||this.drag||this.editing)return;if(e.target.closest("button, input"))return;const n=e=>this.dragMove(e),o=e=>this.endRowDrag(!0,e),a=()=>this.endRowDrag(!1,void 0,"cancel"),s=e=>{"Escape"!==e.key&&"Escape"!==e.code||(e.preventDefault(),e.stopPropagation(),this.endRowDrag(!1,void 0,"esc"))};document.addEventListener("pointermove",n,!0),document.addEventListener("pointerup",o,!0),document.addEventListener("pointercancel",a,!0),document.addEventListener("keydown",s,!0),this.drag={tab:t,row:i,from:{x:e.clientX,y:e.clientY},at:{x:e.clientX,y:e.clientY},moved:!1,target:null,line:null,scrolled:{px:0,axis:null},scroll:null,detach:()=>{document.removeEventListener("pointermove",n,!0),document.removeEventListener("pointerup",o,!0),document.removeEventListener("pointercancel",a,!0),document.removeEventListener("keydown",s,!0)}}}dragMove(e){const t=this.drag;if(t){if(!t.moved){if(Math.hypot(e.clientX-t.from.x,e.clientY-t.from.y)<5)return;t.moved=!0,t.row.classList.add("ad-dragging"),document.body.classList.add("ad-reordering")}e.preventDefault(),t.at={x:e.clientX,y:e.clientY},this.refreshDropTarget(),this.armDragScroll()}}refreshDropTarget(){const e=this.drag;e&&(e.target=this.dropTargetAt(e.at.x,e.at.y),this.drawReorderLine())}listScrollAxis(){const e=this.listEl;if(!e)return null;const t=e.scrollHeight-e.clientHeight>1,i=e.scrollWidth-e.clientWidth>1;return t&&i?this.listFlowsSideways()?"x":"y":t?"y":i?"x":null}dragScrollSpeed(e){const t=this.listEl,i=this.drag;if(!t||!i)return 0;const n=t.getBoundingClientRect(),o="y"===e;return(0,q.planEdgeScroll)({pos:o?i.at.y:i.at.x,near:o?n.top:n.left,far:o?n.bottom:n.right,cur:o?t.scrollTop:t.scrollLeft,maxScroll:o?t.scrollHeight-t.clientHeight:t.scrollWidth-t.clientWidth,bandPx:32,minPps:150,maxPps:800})}armDragScroll(){const e=this.drag;if(!e||!e.moved)return;if(!this.config.store.agentDeck.dragAutoScroll)return;const t=this.listScrollAxis();if((!t||e.scroll&&e.scroll.axis!==t)&&(this.stopDragScroll(e),!t))return;if(!this.dragScrollSpeed(t))return void this.stopDragScroll(e);if(e.scroll)return;const i={raf:0,prev:performance.now(),axis:t};e.scroll=i,e.scrolled.axis=t,i.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}dragScrollTick(e){const t=this.drag,i=this.listEl;if(!(t&&t.scroll&&t.moved&&i))return;const n=t.scroll,o=this.dragScrollSpeed(n.axis);if(!o)return void this.stopDragScroll(t);const a=Math.min(50,Math.max(0,e-n.prev));n.prev=e;const s=o*a/1e3,r="y"===n.axis?i.scrollTop:i.scrollLeft;"y"===n.axis?i.scrollTop=r+s:i.scrollLeft=r+s,t.scrolled.px+=Math.abs(("y"===n.axis?i.scrollTop:i.scrollLeft)-r),this.refreshDropTarget(),n.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}stopDragScroll(e){e.scroll&&(cancelAnimationFrame(e.scroll.raf),e.scroll=null)}dropTargetAt(e,t){const i=e=>(this.dropReject=e,null),n=this.drag;if(!n||!this.listEl)return i("gone");const o=this.listEl.getBoundingClientRect();if(e<o.left||e>o.right||t<o.top||t>o.bottom)return i("outside-list");const{withHeads:a,plan:s}=this.renderPlan(),r=s.find(e=>e.tabs.includes(n.tab));if(!r||!this.app.tabs.includes(n.tab))return i("gone");const d=document.elementFromPoint(e,t),l=null==d?void 0:d.closest(".ad-tab");if(!l){if(a||(null==d?void 0:d.closest(".ad-list"))!==this.listEl)return i("no-row");const e=r.tabs[r.tabs.length-1];return e&&e!==n.tab?(this.dropReject=null,{tab:e,place:"after"}):i("self")}const c=this.app.tabs[Number(l.dataset.adIndex)];if(!c)return i("gone");if(c===n.tab)return i("self");if(!r.tabs.includes(c))return i("other-group");if(this.rowElOf(c)!==l)return i("stale-index");const u=l.getBoundingClientRect(),p=this.listFlowsSideways()?e>(u.left+u.right)/2:t>(u.top+u.bottom)/2;return this.dropReject=null,{tab:c,place:p?"after":"before"}}listFlowsSideways(){return!(0,B.isHorizontalDock)(this.dockSide)}drawReorderLine(){var e;const t=this.drag;if(!t||!this.listEl)return;if(!t.target)return null===(e=t.line)||void 0===e||e.remove(),void(t.line=null);const i=this.rowElOf(t.target.tab);if(!i)return;if(!t.line){const e=document.createElement("div");e.className="ad-reorder-line",document.body.appendChild(e),t.line=e}const n=i.getBoundingClientRect(),o=this.listEl.getBoundingClientRect(),a=t.line.style,s=(e,t,i)=>Math.min(Math.max(e,t),i);if(this.listFlowsSideways()){const e="after"===t.target.place?n.right:n.left;a.left=Math.round(s(e,o.left,o.right)-1)+"px";const i=s(n.top,o.top,o.bottom),r=s(n.bottom,o.top,o.bottom);a.top=Math.round(i)+"px",a.width="2px",a.height=Math.max(1,Math.round(r-i))+"px"}else{const e="after"===t.target.place?n.bottom:n.top,i=s(n.left,o.left,o.right),r=s(n.right,o.left,o.right);a.left=Math.round(i)+"px",a.top=Math.round(s(e,o.top,o.bottom)-1)+"px",a.width=Math.max(1,Math.round(r-i))+"px",a.height="2px"}}rowElOf(e){const t=this.app.tabs.indexOf(e);return t<0||!this.listEl?null:this.listEl.querySelector(`.ad-tab[data-ad-index="${t}"]`)}endRowDrag(e,t,i){var n;const o=this.drag;if(!o)return;this.dropReject=null,e&&o.moved&&t&&(o.target=this.dropTargetAt(t.clientX,t.clientY));const a=o.moved,s=e&&a?o.target:null;this.drag=null,this.stopDragScroll(o),o.detach(),null===(n=o.line)||void 0===n||n.remove(),o.row.classList.remove("ad-dragging"),document.body.classList.remove("ad-reordering");const r=e=>{this.lastDragEnd={reason:e,drop:this.dropReject,committed:"moved"===e,at:Date.now(),scrolled:{px:Math.round(o.scrolled.px),axis:o.scrolled.axis}}};a?(this.dragClickGuard=!0,r(null!=i?i:s?"moved":"no-target"),s&&this.applyReorder(o.tab,s.tab,s.place),this.render()):r(null!=i?i:"below-threshold")}applyReorder(e,t,i){const n=this.app.tabs,o=n.indexOf(e),a=n.indexOf(t),s=(0,q.planTabMove)(n.length,o,a,i);if(!s)return!1;const r=s.map(e=>n[e]);return this.zone.run(()=>{for(let e=0;e<r.length;e++)n[e]=r[e];this.app.emitTabsChanged()}),this.diag(`reorder ${o} -> ${a} ${i} order=${s.join(",")}`),!0}noteReorderBlocked(){var e;if(!this.sidebar)return;null===(e=this.sidebar.querySelector(".ad-reorder-note"))||void 0===e||e.remove();const t=document.createElement("div");t.className="ad-reorder-note",t.textContent=this.ui("상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다"),this.sidebar.appendChild(t),setTimeout(()=>t.remove(),2600)}startLabelEdit(e,t){this.editing=t;const i=e.querySelector(".ad-label"),n=document.createElement("input");n.className="ad-label-input",n.value=this.status.get(t).label,n.placeholder=this.ui("작업 이름"),i.replaceWith(n),n.focus(),n.select();const o=e=>{this.editing===t&&(this.editing=null,e&&this.status.setLabel(t,n.value.trim()),this.render())};n.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key&&o(!0),"Escape"===e.key&&o(!1)}),n.addEventListener("blur",()=>o(!0))}async activateResume(e,t){var i,n;if(!t&&this.liveSessionIds&&(e={...e,openTabId:this.liveSessionIds().get(e.sessionId)||null}),e.openTabId){const t=this.resumeTabs.get(e.openTabId);if(t&&this.app.tabs.includes(t))return void this.app.selectTab(t)}const o=(0,J.resumeCommand)(e.sessionId,t,e.agent);if(!o)return void this.diag(`resume 거부 sid=${e.sessionId}`);const a=null!==(i=this.resumeOpening)&&void 0!==i?i:this.resumeOpening=new Set,s=`${null!==(n=e.agent)&&void 0!==n?n:"claude"}:${t?"fork":"resume"}:${e.sessionId}`;if(!a.has(s)){a.add(s);try{const i=await this.openResumeTab(e,o);i&&!t&&this.trackResumeStart(e.sessionId,i)}finally{a.delete(s)}}}trackResumeStart(e,t){var i;t=null!==(i=this.app.tabs.find(e=>{var i,n;return e===t||(null===(n=(i=e).getAllTabs)||void 0===n?void 0:n.call(i).includes(t))}))&&void 0!==i?i:t,this.resumeStarting.set(e,t);let n=null,o=null,a="";const s=()=>{var i;clearInterval(r),null===(i=null==n?void 0:n.unsubscribe)||void 0===i||i.call(n),this.resumeStarting.get(e)===t&&this.resumeStarting.delete(e)},r=setInterval(()=>{var i,r;if(!this.app.tabs.includes(t)||this.notify.liveSessions().has(e))return void s();const d=null===(i=this.firstPane(t))||void 0===i?void 0:i.session;!o||o===d&&o.open?!o&&(null==d?void 0:d.open)&&(o=d,n=null===(r=o.output$)||void 0===r?void 0:r.subscribe(e=>{a=(a+e).slice(-4096),/thread-store conflict:|failed to (?:create|resume|load) session|no (?:saved )?session found|is not recognized as|command not found/i.test(a)&&s()})):s()},100)}async openResumeTab(e,t,i){var n,o,a,s,r,d;if(this.syncSessionSlots(),!(this.sessionSlots.occupied+this.pendingSessionOpens>=U.JUMP_SLOTS)){this.pendingSessionOpens++;try{const l=this.config.store.terminal.profile,c=await this.profiles.getProfiles(),u=null!==(n=c.find(e=>e.id===l))&&void 0!==n?n:c[0];if(!u)return void this.diag("resume 프로필 없음");const p={...u,options:{...u.options,cwd:e.cwd||(null===(o=u.options)||void 0===o?void 0:o.cwd),env:(0,N.storageEnvironment)(null===(a=u.options)||void 0===a?void 0:a.env)}};if(i){p.options.env={...null===(s=u.options)||void 0===s?void 0:s.env,["claude"===i.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]:(0,R.accountHome)(i)};for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY"])p.options.env[e]=""}const h=await this.profiles.openNewTabForProfile(p);if(this.diag(`resume 탭 sid=${e.sessionId.slice(0,8)} cwd=${null!==(d=null===(r=p.options)||void 0===r?void 0:r.cwd)&&void 0!==d?d:"?"} tab=${h?"yes":"null"}`),!h){if(i)throw new Error(this.ui("새 계정 탭을 열지 못했습니다."));return}return i&&this.notify.setAccountHome(h,i.provider,(0,R.accountHome)(i),i.id),e.label&&this.status.setLabel(h,e.label),this.sendResumeCommand(h,t),h}catch(e){if(i)throw new Error(this.ui("새 계정 탭을 열지 못했습니다."));(0,X.diagCatch)("resume 탭 열기",e)}finally{this.pendingSessionOpens--}}}sendResumeCommand(e,t,i){let n=!1,o=null;const a=()=>{var a,s;if(n)return;const r=this.firstPane(e);if(i&&(!this.app.tabs.includes(e)||(null==r?void 0:r.session)!==i))return n=!0,void(null===(a=null==o?void 0:o.unsubscribe)||void 0===a||a.call(o));r&&"function"==typeof r.sendInput&&(n=!0,null===(s=null==o?void 0:o.unsubscribe)||void 0===s||s.call(o),this.sendToPane(r,"resume",()=>r.sendInput(t+"\r")),this.diag("resume 명령 전송"))},s=Date.now(),r=()=>{var t,i,d;if(n||o)return;let l=null;try{l=this.firstPane(e),o=null===(d=null===(i=null===(t=null==l?void 0:l.session)||void 0===t?void 0:t.output$)||void 0===i?void 0:i.subscribe)||void 0===d?void 0:d.call(i,()=>setTimeout(a,700))}catch(e){return void(0,X.diagCatch)("resume 출력 구독",e)}o?this.diag(`resume 구독 armed after=${Date.now()-s}ms`):Date.now()-s<6e3&&setTimeout(r,200)};r(),setTimeout(a,6e3)}showResumeMenu(e,t){const i=document.querySelector(".ad-menu");i&&i.remove();const n=document.createElement("div");n.className="ad-menu";const o=[];e.openTabId?o.push([this.ui("이 탭으로 이동"),()=>{this.activateResume(e,!1)}]):(o.push([this.ui("새 탭에서 이어받기"),()=>{this.activateResume(e,!1)}]),o.push([this.ui("분기해서 이어받기"),()=>{this.activateResume(e,!0)}])),o.push([this.ui("세션 ID 복사"),()=>{var t,i;try{null===(i=(t=this.platform).setClipboard)||void 0===i||i.call(t,{text:e.sessionId})}catch(e){(0,X.diagCatch)(this.ui("세션 ID 복사"),e)}}]),o.push([this.ui("목록에서 숨기기"),()=>this.hideResumeRow(e.sessionId)]);for(const[e,t]of o){const i=document.createElement("div");i.className="ad-menu-item",i.textContent=e,i.addEventListener("click",()=>{t(),n.remove()}),n.appendChild(i)}document.body.appendChild(n),n.style.left=t.clientX+"px",n.style.top=Math.min(t.clientY,window.innerHeight-n.offsetHeight-8)+"px";const a=e=>{n.contains(e.target)||(n.remove(),document.removeEventListener("mousedown",a))};setTimeout(()=>document.addEventListener("mousedown",a),0)}hideResumeRow(e){const t=this.config.store.agentDeck,i=Array.isArray(t.resumeHidden)?t.resumeHidden.filter(e=>"string"==typeof e):[];i.includes(e)||(t.resumeHidden=[...i,e],this.config.save()),this.render()}showStatusMenu(e,t){const i=document.querySelector(".ad-menu");i&&i.remove();const n=document.createElement("div");n.className="ad-menu";const o=["running","waiting","limited","done","error","idle"].map(e=>[O.STATUS_STYLES[e].icon+" "+this.ui(O.STATUS_STYLES[e].label),()=>this.status.setManual(t,e)]);o.push([this.ui("↺ 자동 감지로"),()=>this.status.unpin(t)]);const a=this.mailboxWakeDisabled.has(t);o.push(["ko"===this.sidebarLang?a?"메일 wake 켜기":"메일 wake 끄기":a?"Enable mailbox wake":"Disable mailbox wake",()=>{a?this.mailboxWakeDisabled.delete(t):this.mailboxWakeDisabled.add(t),this.mailboxWake.flushAll()}]);for(const e of this.notify.sessionIdsOf(t))o.push([("ko"===this.sidebarLang?"통신 대상 복사: ":"Copy message target: ")+e,()=>{var t;null===(t=se())||void 0===t||t.writeText("AgentDeck target session ID: "+e+"\nUse this exact toSessionId with agentdeck_send; do not resolve a human slot again.")}]);o.push([this.ui("↻ 화면 복구"),()=>{this.app.selectTab(t),this.repair("active")}]);for(const[e,t]of o){const i=document.createElement("div");i.className="ad-menu-item",i.textContent=e,i.addEventListener("click",()=>{t(),n.remove()}),n.appendChild(i)}document.body.appendChild(n),n.style.left=e.clientX+"px",n.style.top=Math.min(e.clientY,window.innerHeight-n.offsetHeight-8)+"px";const s=e=>{n.contains(e.target)||(n.remove(),document.removeEventListener("mousedown",s))};setTimeout(()=>document.addEventListener("mousedown",s),0)}formatElapsed(e){const t=Math.floor(e/1e3);if(t<60)return this.ui("{n}초",{n:t});const i=Math.floor(t/60);return i<60?this.ui("{n}분",{n:i}):this.ui("{h}시간 {m}분",{h:Math.floor(i/60),m:i%60})}};ue=n=s([(0,h.Injectable)({providedIn:"root"}),l(10,(0,h.Optional)()),d("design:paramtypes",[x.AppService,x.ConfigService,C.WorkStatusService,x.HotkeysService,x.ProfilesService,x.HostWindowService,x.PlatformService,j.WorkNotifyService,G.SessionLedgerService,h.NgZone,g.LocaleService])],ue),t.AgentDeckService=ue},7009(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckDecorator=void 0;const a=i(860),s=i(7650),r=i(8349),d=i(6021),l=i(1385);let c=class extends r.TerminalDecorator{constructor(e,t,i){super(),this.status=e,this.config=t,this.app=i}rootOf(e){var t;return null!==(t=this.app.getParentTab(e))&&void 0!==t?t:e}attach(e){this.status.debug.attached++,e.session&&this.attachToSession(e,e.session),this.subscribeUntilDetached(e,e.sessionChanged$.subscribe(t=>{t&&this.attachToSession(e,t)}))}detach(e){const t=this.rootOf(e);super.detach(e),(0,l.forgetOutputBuffer)(e),t!==e&&this.app.tabs.includes(t)||this.status.forget(t)}attachToSession(e,t){this.subscribeUntilDetached(e,t.output$.subscribe(t=>{(0,l.applyOutput)(this.status,this.rootOf(e),e,t,this.config.store.agentDeck.autoDetect)}))}};c=n([(0,a.Injectable)(),o("design:paramtypes",[d.WorkStatusService,s.ConfigService,s.AppService])],c),t.AgentDeckDecorator=c},1385(e,t,i){t.applyTitle=t.stripTitleMarker=t.forgetOutputBuffer=t.applyOutput=t.releaseLimited=void 0;const n=i(3532),o=i(7282),a=/\x1b\]1337;AgentDeck=([a-z]+)(?:;([^\x07\x1b]*))?(?:\x07|\x1b\\)/gi,s=["idle","running","waiting","limited","done","error"],r=new WeakMap,d=new WeakMap,l=new WeakSet;function c(e,t,i="MCP 승인"){l.add(t);const n=e.get(t);n.pinned&&"running"===n.status?e.setManual(t,"waiting",void 0,i):"waiting"!==n.status&&p(e,t,"waiting",i)}function u(e,t){for(const i of e.split(/[\r\n]+/)){if(!i.trim()||!t.some(e=>e.test(i)))continue;const e=(0,o.reasonFromScreen)(i);if(e)return e}return""}function p(e,t,i,n){const o=e.get(t);o.pinned||((o.status!==i||n)&&(o.reason=n),e.setAuto(t,i))}t.releaseLimited=function(e,t){"limited"===e.get(t).status&&e.setAuto(t,"running")},t.applyOutput=function(e,t,i,o,h,g=(0,n.unionProfile)()){var f,m;e.debug.outputs++,e.markOutput(t);const v=(null!==(f=r.get(i))&&void 0!==f?f:"")+o;let b,k=!1,y=0;for(a.lastIndex=0;null!==(b=a.exec(v));){y=a.lastIndex;const i=b[1].toLowerCase();s.includes(i)&&(e.setManual(t,i,b[2]),e.debug.oscHits++,k=!0)}if(r.set(i,v.slice(Math.max(y,v.length-256))),k||!h)return void d.delete(i);const w=(null!==(m=d.get(i))&&void 0!==m?m:"")+o,x=w.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,""),S=("codex"===g.id||"unknown"===g.id)&&n.CODEX_APPROVAL_PATTERNS.some(e=>e.test(x));if(d.set(i,S?"":w.slice(w.lastIndexOf("\n")+1).slice(-1024)),S)return void c(e,t);if(g.waitingPatterns.some(e=>e.test(o)))return void p(e,t,"waiting",u(o,g.waitingPatterns));if(g.limitedPatterns.some(e=>e.test(o)))return void p(e,t,"limited",u(o,g.limitedPatterns));const C="codex"===g.id||l.has(t)?g.busyPatterns.filter(e=>!e.test("esc to cancel")):g.busyPatterns;return"waiting"===e.get(t).status&&C.some(e=>e.test(o))?(e.markBusy(t),e.resume(t),void l.delete(t)):"waiting"!==e.get(t).status&&g.busyTitleMarks.some(e=>o.includes(e))||C.some(e=>e.test(o))?(e.markBusy(t),void e.setAuto(t,"running")):void(e.isBusyMode(t)||"limited"!==e.get(t).status&&"waiting"!==e.get(t).status&&e.setAuto(t,"running"))},t.forgetOutputBuffer=function(e){r.delete(e),d.delete(e)};const h=/\[AD:([a-z]+)\]\s*(.*)$/i;t.stripTitleMarker=function(e){return e.replace(/\[AD:[a-z]+\]\s*/i,"")},t.applyTitle=function(e,t,i,o,a=(0,n.unionProfile)()){const r=h.exec(i);if(r){const i=r[1].toLowerCase();if(s.includes(i))return e.setManual(t,i,r[2].trim()),void e.debug.titleHits++}if(o&&("codex"===a.id||"unknown"===a.id)){if(n.CODEX_WAITING_TITLE.test(i))return void c(e,t,"입력 대기");if(("codex"===a.id||l.has(t))&&n.CODEX_BUSY_TITLE.test(i))return e.markBusy(t),e.resume(t),l.delete(t),void e.setAuto(t,"running")}o&&"waiting"!==e.get(t).status&&a.busyTitleMarks.some(e=>i.includes(e))&&e.setAuto(t,"running")}},5174(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckDevReloadService=t.devHotkeys=t.isDevInstall=void 0;const o=i(860);t.isDevInstall=function(){return!1},t.devHotkeys=function(){return[]};let a=class{constructor(){this.available=!1}init(){}enabled(){return!1}async reload(e){}};a=n([(0,o.Injectable)({providedIn:"root"})],a),t.AgentDeckDevReloadService=a},7797(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.collectDiagBundle=t.appendScreenLog=t.diagCatch=t.diagException=t.installErrorCapture=t.startDiagSession=t.recentDiag=t.diagMemory=t.resetDiagOnce=t.diagOnce=t.diag=t.pluginVersion=t.configStamp=t.SCREEN_PREV_PATH=t.SCREEN_PATH=t.DIAG_PREV_PATH=t.DIAG_PATH=void 0;const s=a(i(5317)),r=a(i(9896)),d=a(i(857)),l=a(i(6928)),c=i(7604);function u(){const e=process.env.AGENTDECK_DIAG_DIR;if(e)try{if(r.existsSync(e))return e}catch{}return d.homedir()}t.DIAG_PATH=l.join(u(),".agentdeck-diag.log"),t.DIAG_PREV_PATH=t.DIAG_PATH+".1",t.SCREEN_PATH=l.join(u(),".agentdeck-screen.log"),t.SCREEN_PREV_PATH=t.SCREEN_PATH+".1";const p=2097152;t.configStamp=function(e){var t,i;const n=null!==(t=null==e?void 0:e.agentDeck)&&void 0!==t?t:{};return{enabled:n.enabled,dock:n.sidebarDock,sidebar:n.sidebarWidth||n.sidebarHeight,aspect:`${n.aspectW}:${n.aspectH}`,viewerOpen:n.viewerOpen,viewerFollow:(0,c.followModeOf)(n.viewerPreload,n.viewerAutoOpen),screenWatch:n.screenWatch,autoRepair:n.autoRepair,notifyChannel:n.notifyChannel,rootProfile:n.rootProfile,useConPTY:null===(i=null==e?void 0:e.terminal)||void 0===i?void 0:i.useConPTY}};const h=[],g=new Set;let f=-1,m=0,v="",b=!1,k=0;const y=new Map;let w=0;const x=new Map;let S=null;function C(){var e;if(null!==S)return S;S="unknown";for(const t of[l.join(__dirname,"..","package.json"),l.join(__dirname,"package.json")])try{const i=r.readFileSync(t,"utf8"),n=null===(e=JSON.parse(i))||void 0===e?void 0:e.version;if(n){S=String(n);break}}catch{}return S}function j(e){try{return r.statSync(e).size}catch{return 0}}function A(e,t,i){try{return!(j(e)<i||(r.renameSync(e,t),0))}catch{return!1}}function E(e){try{(f<0||++m>=500)&&(f=j(t.DIAG_PATH),m=0),f>=p&&A(t.DIAG_PATH,t.DIAG_PREV_PATH,p)&&(f=0,v&&(r.appendFileSync(t.DIAG_PATH,v),f+=Buffer.byteLength(v))),r.appendFileSync(t.DIAG_PATH,e),f+=Buffer.byteLength(e)}catch{}}function P(e){h.push(e),h.length>2e3&&h.splice(0,h.length-2e3)}function z(e){const t=`${(new Date).toISOString()} ${e}`;P(t),E(t+"\n")}function D(e=200){return h.slice(-e)}function T(e,t){z(`EXCEPTION ${e} ${O(t)}`);const i="string"==typeof(null==t?void 0:t.stack)?t.stack.split(/\r?\n/):[];for(const e of i.slice(1,13)){const t=e.trim();t&&(E(` ${t}\n`),P(` ${t}`))}}function O(e){var t;return null==e?"(no error object)":"string"==typeof e?e:`${e.name?`${e.name}: `:""}${null!==(t=e.message)&&void 0!==t?t:N(e)}`}function _(e){const t="undefined"==typeof console?null:console,i=null==t?void 0:t[e];"function"==typeof i&&(t[e]=(...n)=>{try{!function(e,t){if(k>=300)return;const i=t.slice(0,4).map(I).join(" ");if(!i)return;const n=Date.now(),o=y.get(i);void 0!==o&&n-o<5e3||(y.set(i,n),k++,z(`CONSOLE ${e} ${i}`),k>=300&&z("CONSOLE 캡처 상한(300) 도달 — 이 세션에서는 더 적지 않는다"))}(e,n)}catch{}return i.apply(t,n)})}function I(e){var t;if("string"==typeof e)return R(e);if(e instanceof Error){const i="string"==typeof e.stack?null===(t=e.stack.split(/\r?\n/)[1])||void 0===t?void 0:t.trim():"";return R(`${e.name}: ${e.message}${i?" | "+i:""}`)}return R(N(e))}function R(e){const t=e.replace(/\r?\n/g," ");return t.length>400?t.slice(0,400)+"…":t}function N(e){var t;try{return null!==(t=JSON.stringify(e))&&void 0!==t?t:String(e)}catch{return String(e)}}t.pluginVersion=C,t.diag=z,t.diagOnce=function(e,t){g.has(e)||(g.add(e),z(t))},t.resetDiagOnce=function(e){g.delete(e)},t.diagMemory=function(){return h},t.recentDiag=D,t.startDiagSession=function(e={}){var i,n,o,a,s,r;A(t.DIAG_PATH,t.DIAG_PREV_PATH,p),f=-1;const l=["",`===== agentdeck session ${(new Date).toISOString()} =====`,`plugin=${C()} tabby=${null!==(i=e.tabby)&&void 0!==i?i:"?"} platform=${process.platform} arch=${process.arch} node=${null!==(o=null===(n=process.versions)||void 0===n?void 0:n.node)&&void 0!==o?o:"?"} electron=${null!==(s=null===(a=process.versions)||void 0===a?void 0:a.electron)&&void 0!==s?s:"?"} os=${JSON.stringify(null!==(r=e.osRelease)&&void 0!==r?r:d.release())}`];e.config&&l.push(`config=${N(e.config)}`),v=l.join("\n")+"\n";for(const e of l)P(e);E(v)},t.installErrorCapture=function(){if(b)return;b=!0;const e="undefined"==typeof window?null:window;(null==e?void 0:e.addEventListener)&&(e.addEventListener("error",e=>{var t;T("window.onerror"+((null==e?void 0:e.filename)?` at ${e.filename}:${e.lineno}:${e.colno}`:""),null!==(t=null==e?void 0:e.error)&&void 0!==t?t:null==e?void 0:e.message)}),e.addEventListener("unhandledrejection",e=>{T("unhandledrejection",null==e?void 0:e.reason)})),_("error"),_("warn")},t.diagException=T,t.diagCatch=function(e,t){if(w>=200)return;const i=O(t),n=`${e}|${i}`,o=Date.now(),a=x.get(n);void 0!==a&&o-a<6e4||(x.set(n,o),w++,z(`CATCH ${e} ${R(i)}`),w>=200&&z("CATCH 캡처 상한(200) 도달 — 이 세션에서는 더 적지 않는다"))},t.appendScreenLog=function(e){try{A(t.SCREEN_PATH,t.SCREEN_PREV_PATH,4194304),r.appendFileSync(t.SCREEN_PATH,e)}catch{}},t.collectDiagBundle=function(e={}){var i,n,o,a,c,u,p,h,g,f;const m=`agentdeck-diag-${function(e=new Date){const t=e=>String(e).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}_${t(e.getHours())}${t(e.getMinutes())}`}()}`,v=l.join(d.tmpdir(),m);r.mkdirSync(v,{recursive:!0});const b=[],k=[`agentdeck 진단 묶음 ${(new Date).toISOString()}`,`plugin=${C()} tabby=${null!==(n=null===(i=e.stamp)||void 0===i?void 0:i.tabby)&&void 0!==n?n:"?"}`,`platform=${process.platform} arch=${process.arch} node=${null!==(a=null===(o=process.versions)||void 0===o?void 0:o.node)&&void 0!==a?a:"?"} electron=${null!==(u=null===(c=process.versions)||void 0===c?void 0:c.electron)&&void 0!==u?u:"?"}`,`os=${null!==(h=null===(p=e.stamp)||void 0===p?void 0:p.osRelease)&&void 0!==h?h:d.release()}`,`config=${N(null!==(f=null===(g=e.stamp)||void 0===g?void 0:g.config)&&void 0!==f?f:{})}`,`diag=${j(t.DIAG_PATH)}B prev=${j(t.DIAG_PREV_PATH)}B screen=${j(t.SCREEN_PATH)}B (포함=${e.includeScreen?"y":"n"})`,"","--- 이 세션의 최근 진단 (메모리) ---",...D(200),""].join("\n");r.writeFileSync(l.join(v,"report.txt"),k,"utf8"),b.push("report.txt");const y=[t.DIAG_PATH,t.DIAG_PREV_PATH];e.includeScreen&&y.push(t.SCREEN_PATH,t.SCREEN_PREV_PATH);for(const e of y)try{if(r.existsSync(e)){const t=l.basename(e).replace(/^\./,"");r.copyFileSync(e,l.join(v,t)),b.push(t)}}catch{}const w=v+".zip";try{r.rmSync(w,{force:!0})}catch{}return function(e,t){try{return"win32"===process.platform?s.execFileSync("powershell.exe",["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`Compress-Archive -Path '${e}\\*' -DestinationPath '${t}' -Force`],{timeout:3e4,stdio:"ignore"}):s.execFileSync("zip",["-r","-q",t,"."],{cwd:e,timeout:3e4,stdio:"ignore"}),!0}catch{return!1}}(v,w)&&r.existsSync(w)?{path:w,zipped:!0,files:b}:{path:v,zipped:!1,files:b}}},7617(e,t){function i(e){return"left"===e||"right"===e}t.DockController=t.isHorizontalDock=t.isDockSide=t.DOCK_SIDES=void 0,t.DOCK_SIDES=["left","right","top","bottom"],t.isDockSide=function(e){return t.DOCK_SIDES.includes(e)},t.isHorizontalDock=i;t.DockController=class{constructor(e){this.host=e,this.handle=null,this.overlay=null,this.preview=null,this.zones=new Map,this.resizing=!1,this.dragging=!1,this.dragArmed=!1,this.dragFrom={x:0,y:0},this.hoverSide=null}box(){var e,t;const i=null===(t=(e=this.host).getBox)||void 0===t?void 0:t.call(e);if(i)return{...i,right:i.left+i.width,bottom:i.top+i.height};const n=this.host.windowEl.getBoundingClientRect();return{left:n.left,top:n.top,right:n.right,bottom:n.bottom,width:n.width,height:n.height}}install(){this.installResizeHandle(),this.installDockDrag()}syncHandle(){if(!this.handle)return;const e=this.host.getDock();this.handle.className="ad-resize ad-resize-"+e}installResizeHandle(){const e=document.createElement("div");e.className="ad-resize",this.host.sidebar.appendChild(e),this.handle=e,this.syncHandle(),e.addEventListener("pointerdown",t=>{0===t.button&&(t.preventDefault(),t.stopPropagation(),this.resizing=!0,e.setPointerCapture(t.pointerId),document.body.classList.add("ad-resizing"))}),e.addEventListener("pointermove",e=>{if(!this.resizing)return;const t=this.host.getDock(),i=this.box();let n;n="right"===t?i.right-e.clientX:"left"===t?e.clientX-i.left:"bottom"===t?i.bottom-e.clientY:e.clientY-i.top,this.host.setSize(Math.round(n)),this.host.relayout()});const t=t=>{if(this.resizing){this.resizing=!1;try{e.releasePointerCapture(t.pointerId)}catch{}document.body.classList.remove("ad-resizing"),this.host.commit()}};e.addEventListener("pointerup",t),e.addEventListener("pointercancel",t)}installDockDrag(){const e=this.host.sidebar.querySelector(".ad-head");if(!e)return;e.addEventListener("pointerdown",t=>{0===t.button&&(t.target.closest("button, input")||(this.dragArmed=!0,this.dragFrom={x:t.clientX,y:t.clientY},e.setPointerCapture(t.pointerId)))}),e.addEventListener("pointermove",e=>{if(this.dragArmed){if(!this.dragging){const t=e.clientX-this.dragFrom.x,i=e.clientY-this.dragFrom.y;if(Math.hypot(t,i)<5)return;this.dragging=!0,this.showOverlay()}this.updateHover(e.clientX,e.clientY)}});const t=t=>{if(!this.dragArmed)return;this.dragArmed=!1;try{e.releasePointerCapture(t.pointerId)}catch{}if(!this.dragging)return;this.dragging=!1;const i=this.hoverSide;this.hideOverlay(),i&&i!==this.host.getDock()&&(this.host.setDock(i),this.host.relayout(),this.syncHandle(),this.host.commit())};e.addEventListener("pointerup",t),e.addEventListener("pointercancel",t)}showOverlay(){if(this.overlay)return;const e=document.createElement("div");e.className="ad-dock-overlay";const i=document.createElement("div");i.className="ad-dock-preview",e.appendChild(i);for(const i of t.DOCK_SIDES){const t=document.createElement("div");t.className="ad-dock-zone ad-dock-zone-"+i,t.innerHTML='<span class="ad-dock-mark"></span>',e.appendChild(t),this.zones.set(i,t)}document.body.appendChild(e),this.overlay=e,this.preview=i,this.positionZones()}positionZones(){const e=this.box(),i=e.left+e.width/2,n=e.top+e.height/2,o={left:[e.left+56,n],right:[e.right-56,n],top:[i,e.top+56],bottom:[i,e.bottom-56]};for(const e of t.DOCK_SIDES){const t=this.zones.get(e);if(!t)continue;const[i,n]=o[e];t.style.left=i+"px",t.style.top=n+"px"}}updateHover(e,t){const i=this.hitTest(e,t);if(i!==this.hoverSide){this.hoverSide=i;for(const[e,t]of this.zones)t.classList.toggle("active",e===i)}this.drawPreview(i)}hitTest(e,t){for(const[i,n]of this.zones){const o=n.getBoundingClientRect();if(e>=o.left&&e<=o.right&&t>=o.top&&t<=o.bottom)return i}const i=this.box(),n=(e-i.left)/i.width,o=(t-i.top)/i.height;return n<.25&&n<=o&&n<=1-o?"left":n>.75&&1-n<=o&&1-n<=1-o?"right":o<.25?"top":o>.75?"bottom":null}drawPreview(e){if(!this.preview)return;if(!e)return void(this.preview.style.display="none");const t=this.box(),n=i(e),o=this.host.getSize(e),a=n?Math.min(Math.max(o||320,180),.6*t.width):Math.min(Math.max(o||200,120),.6*t.height),s=this.preview.style;s.display="block",s.left=("right"===e?t.right-a:t.left)+"px",s.top=("bottom"===e?t.bottom-a:t.top)+"px",s.width=(n?a:t.width)+"px",s.height=(n?t.height:a)+"px"}hideOverlay(){var e;null===(e=this.overlay)||void 0===e||e.remove(),this.overlay=null,this.preview=null,this.zones.clear(),this.hoverSide=null}}},1933(e,t,i){t.formatStageSummary=t.hasStaged=t.commitArgs=t.validateMessage=t.unstageFallbackArgs=t.unstageArgs=t.stageArgs=t.parseStatus=t.stageLabel=void 0;const n=i(7859),o="\0";function a(e,t){const i=e||" ",n=t||" ";if("?"===i||"?"===n)return"untracked";if(function(e,t){return"U"===e||"U"===t||"D"===e&&"D"===t||"A"===e&&"A"===t}(i,n))return"conflict";const o=" "!==i;return o&&" "!==n?"both":o?"staged":"unstaged"}function s(e){return e.startsWith("## ")}function r(e){return e.length<3?null:{code:e.slice(0,2),rest:e.slice(2).replace(/^ /,"")}}function d(e){return e.indexOf("R")>=0||e.indexOf("C")>=0}function l(e){if(e.startsWith('"')){const t=function(e){for(let t=1;t<e.length;t++)if("\\"!==e[t]){if('"'===e[t])return t+1}else t++;return-1}(e);if(t>0){const i=e.slice(t).replace(/^ -> /,"");return{orig:(0,n.unquotePath)(e.slice(0,t)),next:(0,n.unquotePath)(i)}}}const t=e.indexOf(" -> ");return t<0?{orig:"",next:(0,n.unquotePath)(e)}:{orig:(0,n.unquotePath)(e.slice(0,t)),next:(0,n.unquotePath)(e.slice(t+4))}}function c(e,t,i){var n,o;const s=null!==(n=e[0])&&void 0!==n?n:" ",r=null!==(o=e[1])&&void 0!==o?o:" ",d={path:t,index:s,work:r,state:a(s,r)};return i&&(d.oldPath=i),d}function u(e){const t=new Set;for(const i of null!=e?e:[]){const e="string"==typeof i?i:"";!e||e.indexOf(o)>=0||t.add(e)}return Array.from(t)}function p(e){return"string"!=typeof e||""===e?{ok:!1,reason:"커밋 메시지가 비어 있다 — 무엇을 바꿨는지 한 줄 적어야 커밋한다"}:e.indexOf(o)>=0?{ok:!1,reason:"커밋 메시지에 NUL 문자가 들어 있다 — 그대로 넘기면 git 실행 자체가 실패한다"}:e.trim()?e.length>8e3?{ok:!1,reason:"메시지가 너무 길다 ("+e.length+"자 / 최대 8000자)"}:{ok:!0}:{ok:!1,reason:"공백·줄바꿈만 있다 — git 도 빈 메시지로 보고 커밋을 거절한다"}}t.stageLabel=function(e){switch(e){case"staged":return"올림";case"both":return"일부";case"untracked":return"새파일";case"conflict":return"충돌";default:return"안올림"}},t.parseStatus=function(e){const t=String(null!=e?e:"");if(!t.trim())return[];if(t.indexOf(o)>=0)return function(e){var t;const i=e.split(o),n=[];for(let e=0;e<i.length;e++){const o=i[e];if(!o||s(o))continue;const a=r(o);if(a&&"!!"!==a.code&&" "!==a.code){if(d(a.code)){const o=null!==(t=i[e+1])&&void 0!==t?t:"";e++,n.push(c(a.code,a.rest,o));continue}n.push(c(a.code,a.rest))}}return n}(t);const i=[];for(const e of t.replace(/\r\n?/g,"\n").split("\n")){if(!e.trim()||s(e))continue;const t=r(e);if(t&&"!!"!==t.code&&" "!==t.code){if(d(t.code)){const e=l(t.rest);i.push(c(t.code,e.next,e.orig));continue}i.push(c(t.code,(0,n.unquotePath)(t.rest)))}}return i},t.stageArgs=function(e){const t=u(e);return t.length?["add","--",...t]:[]},t.unstageArgs=function(e){const t=u(e);return t.length?["reset","-q","--",...t]:[]},t.unstageFallbackArgs=function(e){const t=u(e);return t.length?["rm","--cached","-q","--",...t]:[]},t.validateMessage=p,t.commitArgs=function(e,t){if(!p(e).ok)return[];const i=["commit"];return(null==t?void 0:t.amend)&&i.push("--amend"),i.push("-m",e),i},t.hasStaged=function(e){for(const t of null!=e?e:[])if("staged"===t.state||"both"===t.state)return!0;return!1},t.formatStageSummary=function(e){let t=0,i=0,n=0,o=0;for(const a of null!=e?e:[])switch(null==a?void 0:a.state){case"staged":t++;break;case"unstaged":i++;break;case"both":t++,i++;break;case"untracked":n++;break;case"conflict":o++}const a=[];return t&&a.push(t+"개 스테이지"),i&&a.push(i+"개 미스테이지"),n&&a.push(n+"개 추적안됨"),o&&a.push(o+"개 충돌"),a.length?a.join(" · "):"변경 없음"}},7859(e,t){t.parseUntracked=t.filterTouched=t.formatLineRef=t.refPathFrom=t.joinRefPath=t.refLineNo=t.statusLabel=t.formatStat=t.parseUnifiedDiff=t.unquotePath=void 0;const i=/^diff --git (.*)$/,n=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,o=/^Binary files (.*) and (.*) differ$/,a={n:"\n",t:"\t",r:"\r",'"':'"',"\\":"\\",b:"\b",f:"\f",v:"\v",a:""};function s(e){var t,i;let n="",o=[];const s=()=>{o.length&&(n+=function(e){if(!e.length)return"";try{return decodeURIComponent(e.map(e=>"%"+e.toString(16).padStart(2,"0")).join(""))}catch{return e.map(e=>String.fromCharCode(e)).join("")}}(o),o=[])};for(let r=0;r<e.length;r++){const d=e[r];if("\\"!==d){s(),n+=d;continue}const l=null!==(t=e[r+1])&&void 0!==t?t:"";if(l>="0"&&l<="7"){let t="";for(;t.length<3&&e[r+1]>="0"&&e[r+1]<="7";)t+=e[r+1],r++;o.push(parseInt(t,8));continue}s(),n+=null!==(i=a[l])&&void 0!==i?i:l,r++}return s(),n}function r(e){let t=String(null!=e?e:"").replace(/\t.*$/,"").trim();return t.length>=2&&t.startsWith('"')&&t.endsWith('"')&&(t=s(t.slice(1,-1))),t}function d(e){return/^[ab]\//.test(e)?e.slice(2):e}function l(e){if('"'!==e[0])return null;for(let t=1;t<e.length;t++)if("\\"!==e[t]){if('"'===e[t])return{value:s(e.slice(1,t)),end:t+1}}else t++;return null}function c(e){const t=String(null!=e?e:"").trim();if(t.startsWith('"')){const e=l(t);if(e){const i=t.slice(e.end).trim(),n=l(i);return{old:d(e.value),next:d(n?n.value:i)}}}const i=(t.length-5)/2;if(Number.isInteger(i)&&i>0&&"a/"===t.slice(0,2)&&" b/"===t.slice(2+i,5+i)&&t.slice(2,2+i)===t.slice(5+i)){const e=t.slice(2,2+i);return{old:e,next:e}}const n=t.indexOf(" b/");return n>0?{old:d(t.slice(0,n)),next:d(t.slice(n+1))}:{old:d(t),next:d(t)}}function u(){return{path:"",status:"modified",binary:!1,added:0,removed:0,lines:[]}}t.unquotePath=r,t.parseUnifiedDiff=function(e){var t;const a=String(null!=e?e:"").replace(/\r\n?/g,"\n");if(!a.trim())return[];const s=[];let l=null,p=0,h=0,g=0,f=0;for(const e of a.split("\n")){if(null!==l&&(g>0||f>0)){const i=null!==(t=e[0])&&void 0!==t?t:"";if("\\"===i)continue;if("+"===i){l.added++,l.lines.push({kind:"add",text:e.slice(1),newNo:h++}),f--;continue}if("-"===i){l.removed++,l.lines.push({kind:"del",text:e.slice(1),oldNo:p++}),g--;continue}if(" "===i||""===e){l.lines.push({kind:"ctx",text:e.slice(1),oldNo:p++,newNo:h++}),g--,f--;continue}g=0,f=0}const a=i.exec(e);if(a){const e=c(a[1]);l=u(),l.path=e.next,e.old&&e.old!==e.next&&(l.oldPath=e.old),s.push(l),g=0,f=0;continue}if(!l)continue;const m=n.exec(e);if(m)p=Number(m[1]),h=Number(m[3]),g=void 0===m[2]?1:Number(m[2]),f=void 0===m[4]?1:Number(m[4]),l.lines.push({kind:"hunk",text:e});else if(e.startsWith("new file mode"))l.status="added";else if(e.startsWith("deleted file mode"))l.status="deleted";else if(e.startsWith("rename from "))l.status="renamed",l.oldPath=r(e.slice(12));else if(e.startsWith("rename to "))l.status="renamed",l.path=r(e.slice(10));else if(e.startsWith("--- ")){const t=r(e.slice(4));if("/dev/null"===t)l.status="added";else if("renamed"!==l.status){const e=d(t);e!==l.path&&(l.oldPath=e)}}else if(e.startsWith("+++ ")){const t=r(e.slice(4));"/dev/null"===t?l.status="deleted":"renamed"!==l.status&&(l.path=d(t))}else if(e.startsWith("GIT binary patch"))l.binary=!0;else{const t=o.exec(e);if(t){l.binary=!0;const e=r(t[1]),i=r(t[2]);"/dev/null"!==i&&(l.path=d(i)),"/dev/null"===e?l.status="added":"/dev/null"===i&&(l.status="deleted")}}}return s},t.formatStat=function(e){const t=null!=e?e:[];if(!t.length)return"변경 없음";let i=0,n=0;for(const e of t)i+=e.added,n+=e.removed;return t.length+"개 파일 · +"+i+" -"+n},t.statusLabel=function(e){switch(e.status){case"added":return"신규";case"deleted":return"삭제";case"renamed":return"이름변경";default:return"수정"}};const p=/^[A-Za-z]:/;function h(e){return String(null!=e?e:"").replace(/\\/g,"/")}function g(e){return e.length>1?e.replace(/\/+$/,""):e}function f(e,t){const i=h(t);if(!i)return"";const n=g(h(e));return!n||i.startsWith("/")||p.test(i)?i:n+"/"+i}function m(e){const t=g(h(e));return p.test(t)?t.toLowerCase():t}t.refLineNo=function(e){if(!e||"del"===e.kind||"hunk"===e.kind)return null;const t=e.newNo;return"number"==typeof t&&Number.isFinite(t)&&t>0?Math.floor(t):null},t.joinRefPath=f,t.refPathFrom=function(e,t){const i=h(e);if(!i)return"";const n=g(h(t));if(!n)return i;const o=p.test(i)||p.test(n),a=o?i.toLowerCase():i,s=o?n.toLowerCase():n;return a===s?i:a.startsWith(s+"/")?i.slice(n.length+1):i},t.formatLineRef=function(e,t,i){const n=String(null!=e?e:"");if(!n)return"";const o=Number(t),a=Number(null!=i?i:t),s=Number.isFinite(o)&&o>0,r=Number.isFinite(a)&&a>0;let d=n;if(s||r){const e=Math.floor(Math.min(s?o:a,r?a:o)),t=Math.floor(Math.max(s?o:a,r?a:o));d=n+":"+e+(t>e?"-"+t:"")}return/\s/.test(d)?'"'+d+'"':d},t.filterTouched=function(e,t,i,n){const o=null!=e?e:[];if(!n||!n.length)return[...o];const a=new Set(n.map(e=>m(e)));return o.filter(e=>a.has(m(f(i,t(e)))))},t.parseUntracked=function(e){const t=[];for(const i of String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n")){if(!i.startsWith("?? "))continue;const e=r(i.slice(3));e&&t.push(e)}return t}},6879(e,t){function i(e){if("string"!=typeof e)return null;let t=e.trim();if(!t)return null;t=t.replace(/\\/g,"/");const i=t.startsWith("//");for(t=t.replace(/\/{2,}/g,"/"),i&&(t="/"+t);t.length>1&&t.endsWith("/")&&!/^[A-Za-z]:\/$/.test(t);)t=t.slice(0,-1);return t}function n(e){return(null!=e?e:"").toLowerCase()}function o(e){var t;const i=/^\/\/([^/]+)\/([^/]+)(.*)$/.exec(e);if(i)return{prefix:"//"+i[1]+"/"+i[2],abs:!0,segs:a(i[3])};const n=/^([A-Za-z]:)(\/.*)?$/.exec(e);return n?{prefix:n[1],abs:!0,segs:a(null!==(t=n[2])&&void 0!==t?t:"")}:{prefix:"",abs:e.startsWith("/"),segs:a(e)}}function a(e){return e.split("/").filter(e=>e.length>0)}function s(e,t){return e.length===t.length&&e.every((e,i)=>n(e)===n(t[i]))}function r(e,t){const a=i(e);if(!a)return null;const r=t?i(t(a)):null;if(!r)return a;const d=o(a),l=o(r);return n(l.prefix)===n(d.prefix)&&(c=d.segs,u=l.segs,c.length>=u.length&&s(c.slice(0,u.length),u))?r:a;var c,u}function d(e,a){const r=i(e);if(!r)return t.UNGROUPED_LABEL;const d=o(r).segs;if(!d.length)return r;const l=[];for(const e of a){const t=i(e);t&&n(t)!==n(r)&&l.push(o(t).segs)}for(let e=1;e<=d.length;e++){const t=d.slice(-e);if(!l.some(i=>i.length>=e&&s(i.slice(-e),t)))return t.join("/")}return r}function l(e,t){const i=e.label.toLowerCase(),o=t.label.toLowerCase();if(i!==o)return i<o?-1:1;const a=n(e.key),s=n(t.key);return a===s?0:a<s?-1:1}function c(e){return n(null!=e?e:t.QC)}function u(e,t){if(!Array.isArray(t))return!1;const i=c(e);return t.some(e=>null!=e&&n(String(e))===i)}t.resolveGroupCollapseFor=t.isStoredCollapsed=t.collapseIdOf=t.QC=t.groupTabs=t.parentPath=t.groupKeyOf=t.foldGroupKey=t.normalizeCwd=t.UNGROUPED_LABEL=void 0,t.UNGROUPED_LABEL="기타",t.normalizeCwd=i,t.foldGroupKey=n,t.groupKeyOf=r,t.parentPath=function(e){const t=i(e);if(!t)return null;const n=o(t);return n.segs.length?function(e,t){return t.length?e.prefix+(e.abs?"/":"")+t.join("/"):/^[A-Za-z]:$/.test(e.prefix)?e.prefix+"/":e.prefix||(e.abs?"/":"")}(n,n.segs.slice(0,-1)):null},t.groupTabs=function(e,i,o){const a=[],s=new Map,c=[];for(const t of e){const e=r(i(t),o);if(!e){c.push(t);continue}const d=n(e);let l=s.get(d);l||(l={key:e,tabs:[]},s.set(d,l),a.push(d)),l.tabs.push(t)}const u=a.map(e=>s.get(e).key),p=a.map(e=>{const t=s.get(e);return{key:t.key,label:d(t.key,u),tabs:t.tabs}});return p.sort(l),c.length&&p.push({key:null,label:t.UNGROUPED_LABEL,tabs:c}),p},t.QC="(ungrouped)",t.collapseIdOf=c,t.isStoredCollapsed=u,t.resolveGroupCollapseFor=function(e,t,i){return function(e){if(!e.stored)return{collapsed:!1,reason:"open"};const t=e.matches,i="number"==typeof t&&isFinite(t)&&t>0?Math.floor(t):0;return e.filtering&&i>0?{collapsed:!1,reason:"filter-open"}:{collapsed:!0,reason:"stored"}}({stored:u(e.key,t),filtering:i,matches:e.tabs.length})}},9771(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckHotkeyProvider=void 0;const o=i(860),a=i(7650),s=i(5174),r=i(9137);let d=class extends a.HotkeyProvider{async provide(){return[...(0,s.devHotkeys)(),{id:"agentdeck-toggle",name:"AgentDeck 사이드바 / 4:3 전환"},{id:"agentdeck-newline",name:"AgentDeck 줄바꿈 (Ctrl+Enter / Shift+Enter, 0x0A 전송)"},{id:"agentdeck-paste",name:"AgentDeck 붙여넣기 (텍스트는 그대로, 이미지는 Alt+V 로 위임)"},{id:"agentdeck-repair",name:"AgentDeck 화면 복구 (깨진 TUI 다시 그리기)"},{id:"agentdeck-view",name:"AgentDeck 미리보기 패널 (md · 이미지 · 표)"},{id:"agentdeck-view-mode",name:"AgentDeck 미리보기 파일 / 변경 전환"},{id:"agentdeck-focus-list",name:"AgentDeck 사이드바 목록에 포커스 (↑↓ 이동 · Enter 전환 · Esc 복귀)"},{id:"agentdeck-new-tab",name:"AgentDeck 새 탭 (사이드바 + 새 탭 과 같다)"},...Array.from({length:r.JUMP_SLOTS},(e,t)=>({id:`agentdeck-jump-${t+1}`,name:`AgentDeck ${t+1}번째 세션으로 (사이드바에 보이는 순서)`}))]}};d=n([(0,o.Injectable)()],d),t.AgentDeckHotkeyProvider=d},3438(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.LANGUAGES=t.translate=t.pickLang=void 0;const o=n(i(2846)),a=n(i(7474)),s=n(i(1311)),r=n(i(3286)),d=n(i(2858)),l=n(i(8674)),c=n(i(1549)),u=n(i(1017)),p=n(i(159)),h=n(i(8124)),g=n(i(5276)),f=n(i(588)),m=n(i(1675)),v=n(i(1773)),b=n(i(3685)),k=n(i(2904)),y=n(i(4544)),w=n(i(3948)),x=n(i(171)),S=n(i(3893)),C=n(i(6981)),j=n(i(2653)),A={af:o.default,bg:a.default,cs:s.default,da:r.default,de:d.default,en:l.default,es:c.default,fr:u.default,hr:p.default,id:h.default,it:g.default,ja:f.default,ko:m.default,pl:v.default,pt:b.default,ru:k.default,sr:y.default,sv:w.default,tr:x.default,uk:S.default,"zh-CN":C.default,"zh-TW":j.default};t.pickLang=function(e){const t=String(null!=e?e:"").trim().toLowerCase();if(t.startsWith("zh"))return/\b(tw|hk|mo|hant)\b/.test(t)?"zh-TW":"zh-CN";const i=t.split(/[-_]/)[0];return i in A?i:"en"},t.translate=function(e,t,i){var n;const o=null!==(n=A[t][e])&&void 0!==n?n:l.default[e];return void 0===o?e:i?o.replace(/\{(\w+)\}/g,(e,t)=>{const n=i[t];return null==n?e:String(n)}):o},t.LANGUAGES=A},2846(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Bykomende werkprofiele","root.choose.desc":"Stoor verskeie werkvouers en kies ’n profiel wanneer jy ’n nuwe oortjie oopmaak.","root.add":"Voeg profiel by","root.remove":"Verwyder profiel","layout.title":"Gebruik die AgentDeck-uitleg","layout.desc":"Skakel af om die sybalk en die vaste breedte te verwyder en na gewone Tabby terug te keer.","reset.title":"Stel die uitleg terug","reset.desc":"Sit die sybalk terug in sy aanvanklike toestand — regs vasgeheg, met die breedte bereken uit die vensterverhouding.","reset.now":"Nou: {dock} vasgeheg, {size}.","reset.default":"Op die oomblik is alles op die verstekwaardes.","reset.btn":"Stel terug","dock.left":"links","dock.right":"regs","dock.top":"bo","dock.bottom":"onder","size.width":"{px} px breed","size.height":"{px} px hoog","size.auto":"breedte outomaties","norecover.title":"Moenie oortjies met begin herstel nie","norecover.desc":"Tabby begin leeg in plaas daarvan om die ou oortjies terug te bring — al wat terugkom, is in elk geval net die dop, en die Claude-sessie daarbinne is lankal verby. Skakel af vir Tabby se oorspronklike gedrag (<code>recoverTabs</code>). Geld vanaf die volgende begin.","resume.title":"Hervat vorige sessies","resume.desc":"Voeg ’n laai <code>⟲ Vorige sessies</code> aan die einde van elke groep by (by verstek toegevou). Vou dit oop en <b>geslote Claude Code- en Codex-sessies</b> word gelys met die opdrag wat jy werklik getik het; een klik bring die gesprek terug met <code>claude --resume</code> of <code>codex resume</code> in sy eie werkvouer. Dit is die ander helfte van <b>Moenie oortjies herstel nie</b> hierbo — die gewone herstel bring die dop terug, dit bring die gesprek terug. <b>Bedieners en agtergrondprosesse wat toe geloop het, kom nie terug nie.</b>","agents.head":"Agent-integrasie","agents.intro":"Laat elke agent sy eie toestand, model en gebruikslimiete <b>self aanmeld</b>. Dit is die akkuraatste bron wat die sybalk het — daarsonder raai ons uit die teks wat op die skerm geteken word, en die aflees wikkel navenant.","agents.unsupported.title":"Nie op hierdie platform beskikbaar nie","agents.unsupported.desc":"Die kennisgewingskrip is PowerShell en loop dus net op Windows. Die toestand word eerder uit die afvoer geraai.","state.on":"Gekoppel","state.off":"Nie gekoppel nie","state.half":"Half gekoppel","btn.install":"Installeer","btn.remove":"Verwyder","claude.title":"Claude-integrasie","claude.desc":"Claude Code-sessies verskyn in die sybalk met hul <b>toestand</b> (besig · wag vir goedkeuring · klaar) en <b>stawe vir model, rekening en verbruik</b>. Installeer die hake en die <code>statusLine</code> in <code>~/.claude/settings.json</code> saam, en verwyder hulle saam. Ander hake word nie geraak nie, en ’n <code>statusLine</code> wat jy reeds gehad het, word <b>net so uitgevoer</b> — wat jy daar sien, verander nie. ’n Rugsteun word eers langs die lêer geskryf.","codex.title":"Codex-integrasie","codex.desc":"Codex-sessies verskyn in die sybalk met hul <b>toestand</b> (besig · wag vir goedkeuring · klaar · onderbreek) en <b>stawe vir model, rekening en verbruik</b>. Maak Codex ná die installasie weer oop en gaan die AgentDeck-hake onder <code>/hooks</code> na en vertrou hulle.","codex.disabled":"Codex het hierdie hake afgeskakel — niks kom deur voordat jy hulle aanskakel nie: {events}. Maak Codex oop, voer <code>/hooks</code> uit en vertrou hulle.","root.head":"Profiel vir die werkvouer","root.intro":"Skep ’n profiel sodat nuwe oortjies altyd in dieselfde vouer oopmaak. Veranderinge geld ná Tabby herbegin word.","root.use.title":"Gebruik ’n profiel vir die werkvouer","root.use.desc":"Skakel aan en vul die vouer in — die profiel word geskep en word die verstek.","root.name.title":"Profielnaam","root.cwd.title":"Werkvouer","root.cwd.desc":"Laat dit leeg en geen profiel word geskep nie. Gebruik skuinsstrepe wanneer jy dit met die hand tik (bv. D:/Project) om die slaggate met terugskuinsstrepe te vermy.","root.browse":"Blaai","root.command.title":"Opdrag","diag.head":"Meld ’n probleem aan","diag.intro":"Versamel die diagnostiese logs in <b>een enkele zip</b> en maak die vouer oop waar dit beland. Dit bevat: die weergawes van die inprop en Tabby en die bedryfstelsel, die instellings hierbo, en die twee jongste geslagte van <code>{path}</code>. Die logs sluit <b>oortjietitels en die paaie wat jy oopgemaak het</b> in — maak die zip gerus oop en kyk voordat jy dit stuur.","diag.screen.title":"Sluit die rou skerm ook in","diag.screen.desc":"Skakel aan vir probleme met die teken van die skerm. Die terminaalskerm gaan woordeliks in — jou werk en jou kode is daarin leesbaar — daarom is dit by verstek af.","diag.collect.title":"Versamel die logs","diag.collect.desc":"Inprop v{version}.","diag.made":"Geskep: ","diag.btn":"Versamel","dev.head":"Ontwikkelaaropsies","dev.use.title":"Aktiveer ontwikkelaaropsies","dev.use.desc":"Skakel <b>lewendige herlaai</b> aan — sodra <code>npm run build</code> <code>dist/index.js</code> oorskryf, herlaai die venster na die nuwe inprop <b>met jou sessies ongeskonde</b> (die oortjies koppel weer aan dieselfde pty). Die kortpad <b>[dev] Herlaai inprop</b> volg ook hierdie skakelaar. Is dit af, doen ’n veranderde dist niks nie. Wys net by installasies uit die bronboom; die npm-bou het dit nie.","dev.now.title":"Herlaai nou","dev.now.desc":"Herlaai die huidige dist sonder om te bou.","dev.btn":"Herlaai",footer:"Die res — vensterverhouding, breedte van die sybalk, ondeursigtigheid, toestandbespeuring, invoerhantering — is op die verstekwaardes vasgepen. Moet jy een verander, wysig <code>agentDeck.*</code> direk in die konfigurasielêer. Kortpaaie is onder die <b>Kortpaaie</b>-oortjie as <code>agentdeck-*</code>.","keys.head":"Kortpaaie","keys.intro":"Die sleutels van die voorblad. Druk <b>Verander</b>, dan die nuwe sleutel. As dit reeds gebruik word — deur Tabby self of deur AgentDeck — word gesê <b>waarmee dit bots</b>, en jy kan weer kies of die sleutel oorneem. Geld dadelik.","keys.change":"Verander","keys.default":"Verstek","keys.cancel":"Kanselleer","keys.force":"Gebruik dit in elk geval","keys.press":"Druk die nuwe sleutel… (Esc kanselleer)","keys.conflict":"Bots met {names}. Gebruik jy dit in elk geval, word die sleutel daar verwyder.","keys.unbound":"nie toegeken","keys.stock":"Tabby se eie","keys.digit":"Hierdie een moet op 'n syfer 1–9 eindig — die syfer is die sessienommer. Druk bv. Alt+1 en 2…9 volg.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, regsklik en die paneel se <code>Ctrl+F</code> / <code>Ctrl+S</code> is nie kortpaaie nie en word nie hier verander nie.","keys.item.newtab":"Nuwe oortjie in die werkwortel","keys.item.jump":"Spring na die N-de sessie","keys.item.focus":"Fokus op die sessielys / terug na die terminaal","keys.item.view":"Maak die voorskoupaneel oop / toe","keys.item.repair":"Herstel die skerm","keys.item.splitright":"Deel langs mekaar (nuwe paneel regs)","keys.item.splitbottom":"Deel bo / onder (nuwe paneel onder)","keys.item.closepane":"Maak die aktiewe verdeelde paneel toe","keys.item.newline":"Nuwe reël sonder om te stuur","keys.item.toggle":"Kantbalk / 4:3 aan-af","keys.item.viewmode":"Paneel: Lêers ↔ Veranderinge"}},7474(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Допълнителни работни профили","root.choose.desc":"Запазете няколко работни папки и изберете профил при отваряне на нов раздел.","root.add":"Добавяне на профил","root.remove":"Изтриване на профил","layout.title":"Използване на подредбата на AgentDeck","layout.desc":"Изключете и страничната лента и фиксираната ширина изчезват — Tabby се връща към обичайния си вид.","reset.title":"Нулиране на подредбата","reset.desc":"Връща страничната лента в началното ѝ състояние — закачена вдясно, с ширина, изчислена от съотношението на прозореца.","reset.now":"Сега: закачена {dock}, {size}.","reset.default":"В момента всичко е по подразбиране.","reset.btn":"Нулиране","dock.left":"вляво","dock.right":"вдясно","dock.top":"горе","dock.bottom":"долу","size.width":"ширина {px} px","size.height":"височина {px} px","size.auto":"автоматична ширина","norecover.title":"Без възстановяване на разделите при стартиране","norecover.desc":"Tabby стартира празен, вместо да връща старите раздели — връща се само обвивката, а сесията на Claude в нея отдавна е приключила. Изключете за оригиналното поведение (<code>recoverTabs</code>). Важи от следващото стартиране.","resume.title":"Продължаване на минали сесии","resume.desc":"Добавя чекмедже <code>⟲ Минали сесии</code> в края на всяка група (по подразбиране свито). Отворите ли го, вътре са <b>затворените сесии на Claude Code и Codex</b>, обозначени с подсказката, която наистина сте написали; щракване връща разговора с <code>claude --resume</code> или <code>codex resume</code> в собствената му работна папка. Това е другата половина на <b>Без възстановяване на разделите</b> по-горе — оригиналното възстановяване връща обвивката, а това връща разговора. <b>Сървърите и фоновите процеси, които сте имали пуснати тогава, не се връщат.</b>","agents.head":"Свързване на агентите","agents.intro":"Позволява на всеки агент <b>сам да съобщава</b> състоянието си, модела и лимитите на употреба. Това е най-точният източник, с който разполага страничната лента — без него гадаем по текста, изрисуван на екрана, и отчитането съответно се люшка.","agents.unsupported.title":"Не е налично на тази платформа","agents.unsupported.desc":"Скриптът за известия е на PowerShell, затова работи само под Windows. Състоянието вместо това се отгатва от изхода.","state.on":"Свързано","state.off":"Несвързано","state.half":"Свързано наполовина","btn.install":"Инсталиране","btn.remove":"Премахване","claude.title":"Свързване с Claude","claude.desc":"Сесиите на Claude Code се показват в страничната лента със своето <b>състояние</b> (работи · чака одобрение · готово) и <b>ленти за модел, акаунт и употреба</b>. Куките и <code>statusLine</code> в <code>~/.claude/settings.json</code> се поставят заедно и заедно се премахват. Другите куки не се пипат, а вече съществуващ <code>statusLine</code> се <b>изпълнява непроменен</b> — това, което виждате там, не се променя. Преди записа до файла се оставя резервно копие.","codex.title":"Свързване с Codex","codex.desc":"Сесиите на Codex се показват в страничната лента със своето <b>състояние</b> (работи · чака одобрение · готово · прекъснато) и <b>ленти за модел, акаунт и употреба</b>. След инсталирането отворете Codex отново и прегледайте и одобрете куките на AgentDeck в <code>/hooks</code>.","codex.disabled":"Codex е изключил тези куки — докато не ги включите, нищо не пристига: {events}. Отворете Codex, изпълнете <code>/hooks</code> и ги одобрете.","root.head":"Профил за работната папка","root.intro":"Създава профил, така че новите раздели винаги да се отварят в една и съща папка. Промените важат след рестарт на Tabby.","root.use.title":"Използване на профил за работната папка","root.use.desc":"Включете и попълнете папката — профилът се създава и става профил по подразбиране.","root.name.title":"Име на профила","root.cwd.title":"Работна папка","root.cwd.desc":"Оставите ли празно, профил не се създава. Когато пишете на ръка, използвайте наклонени черти (напр. D:/Project), за да избегнете капаните с екраниране на обратните наклонени черти.","root.browse":"Преглед","root.command.title":"Команда","diag.head":"Съобщаване за проблем","diag.intro":"Събира диагностичните дневници в <b>един zip файл</b> и отваря папката, в която той попада. Съдържа: версиите на приставката и Tabby и операционната система, настройките по-горе и двете най-нови поколения на <code>{path}</code>. В дневниците има <b>заглавия на раздели и пътищата, които сте отваряли</b> — спокойно отворете архива и проверете, преди да го изпратите.","diag.screen.title":"Включване и на суровото съдържание на екрана","diag.screen.desc":"Включете при проблеми с изчертаването. Екранът на терминала влиза дословно — работата и кодът ви се виждат в него — затова по подразбиране е изключено.","diag.collect.title":"Събиране на дневниците","diag.collect.desc":"Приставка v{version}.","diag.made":"Създадено: ","diag.btn":"Събиране","dev.head":"Опции за разработчици","dev.use.title":"Включване на опциите за разработчици","dev.use.desc":"Включва <b>презареждане на живо</b> — щом <code>npm run build</code> презапише <code>dist/index.js</code>, прозорецът се презарежда към новата приставка <b>със запазени сесии</b> (разделите се закачат обратно към същия pty). Клавишната комбинация <b>[dev] Презареждане на приставката</b> също следва този превключвател. При изключено променен dist не прави нищо. Вижда се само при инсталация от изходния код; изданието от npm няма това.","dev.now.title":"Презареждане сега","dev.now.desc":"Презарежда текущия dist без компилиране.","dev.btn":"Презареждане",footer:"Останалото — съотношение на прозореца, ширина на страничната лента, непрозрачност, засичане на състояние, обработка на въвеждането — е фиксирано на стойностите по подразбиране. Ако трябва да смените нещо, редактирайте <code>agentDeck.*</code> направо в конфигурационния файл. Клавишните комбинации са в раздела <b>Клавишни комбинации</b> като <code>agentdeck-*</code>.","keys.head":"Клавишни комбинации","keys.intro":"Клавишите от началната страница. Натиснете <b>Промени</b>, после новия клавиш. Ако вече е зает — от самия Tabby или от AgentDeck — ще ви се каже <b>с какво се сблъсква</b> и можете да изберете отново или да го вземете. Важи веднага.","keys.change":"Промени","keys.default":"По подразбиране","keys.cancel":"Отказ","keys.force":"Използвай все пак","keys.press":"Натиснете новия клавиш… (Esc отказва)","keys.conflict":"Сблъсква се с {names}. Ако го използвате все пак, клавишът се маха оттам.","keys.unbound":"не е зададено","keys.stock":"вградено в Tabby","keys.digit":"Тази трябва да завършва с цифра 1–9 — цифрата е номерът на сесията. Натиснете напр. Alt+1 и 2…9 следват.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, десен клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> в панела не са клавишни комбинации и тук не се променят.","keys.item.newtab":"Нов раздел в работния корен","keys.item.jump":"Към N-тата сесия","keys.item.focus":"Фокус върху списъка със сесии / обратно в терминала","keys.item.view":"Отвори / затвори панела за преглед","keys.item.repair":"Поправи екрана","keys.item.splitright":"Раздели едно до друго (нов панел вдясно)","keys.item.splitbottom":"Раздели горе / долу (нов панел долу)","keys.item.closepane":"Затвори активния разделен панел","keys.item.newline":"Нов ред без изпращане","keys.item.toggle":"Странична лента / 4:3 вкл-изкл","keys.item.viewmode":"Панел: Файлове ↔ Промени"}},1311(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Další pracovní profily","root.choose.desc":"Uložte více pracovních složek a při otevření nové karty vyberte profil.","root.add":"Přidat profil","root.remove":"Odstranit profil","layout.title":"Používat rozvržení AgentDeck","layout.desc":"Po vypnutí zmizí postranní panel i pevná šířka a vrátí se původní vzhled Tabby.","reset.title":"Obnovit rozvržení","reset.desc":"Vrátí postranní panel do výchozího stavu — ukotvený vpravo, se šířkou spočítanou z poměru okna.","reset.now":"Nyní: ukotven {dock}, {size}.","reset.default":"Právě teď je vše ve výchozím stavu.","reset.btn":"Obnovit","dock.left":"vlevo","dock.right":"vpravo","dock.top":"nahoře","dock.bottom":"dole","size.width":"šířka {px} px","size.height":"výška {px} px","size.auto":"šířka automaticky","norecover.title":"Neobnovovat karty při spuštění","norecover.desc":"Tabby se spustí prázdný místo obnovení předchozích karet — vrátí se stejně jen shell a relace Claude uvnitř už dávno skončila. Vypnutím se vrátíte k původnímu chování (<code>recoverTabs</code>). Platí od příštího spuštění.","resume.title":"Navázat na minulé relace","resume.desc":"Přidá na konec každé skupiny zásuvku <code>⟲ Minulé relace</code> (ve výchozím stavu sbalenou). Po rozbalení jsou v ní <b>zavřené relace Claude Code a Codex</b> popsané promptem, který jste skutečně napsali; kliknutím se rozhovor vrátí příkazem <code>claude --resume</code> nebo <code>codex resume</code> v jeho vlastní pracovní složce. Je to druhá polovina volby <b>Neobnovovat karty</b> výše — původní obnova vrátí shell, tohle vrátí rozhovor. <b>Servery a procesy na pozadí, které jste tehdy měli spuštěné, se nevrátí.</b>","agents.head":"Napojení agentů","agents.intro":"Nechá každého agenta, aby <b>sám hlásil</b> svůj stav, model a limity využití. To je nejpřesnější zdroj, který postranní panel má — bez toho hádáme z textu vykresleného na obrazovce a odhad podle toho kolísá.","agents.unsupported.title":"Na této platformě nedostupné","agents.unsupported.desc":"Oznamovací skript je v PowerShellu, takže běží jen ve Windows. Stav se odhaduje z výstupu.","state.on":"Připojeno","state.off":"Nepřipojeno","state.half":"Napojeno zpola","btn.install":"Nainstalovat","btn.remove":"Odebrat","claude.title":"Napojení na Claude","claude.desc":"Relace Claude Code se v postranním panelu zobrazí se svým <b>stavem</b> (pracuje · čeká na schválení · hotovo) a <b>ukazateli modelu, účtu a využití</b>. Háky a <code>statusLine</code> v <code>~/.claude/settings.json</code> se instalují společně a společně se i odebírají. Ostatních háků se to nedotkne a <code>statusLine</code>, kterou jste už měli, se <b>spustí beze změny</b> — co tam vidíte, zůstane stejné. Před zápisem se vedle souboru uloží záloha.","codex.title":"Napojení na Codex","codex.desc":"Relace Codex se v postranním panelu zobrazí se svým <b>stavem</b> (pracuje · čeká na schválení · hotovo · přerušeno) a <b>ukazateli modelu, účtu a využití</b>. Po instalaci otevřete Codex znovu a v <code>/hooks</code> zkontrolujte a schvalte háky AgentDeck.","codex.disabled":"Codex má tyto háky vypnuté — dokud je nezapneš, nic nedorazí: {events}. Otevři Codex, spusť <code>/hooks</code> a schval je.","root.head":"Profil pracovní složky","root.intro":"Vytvoří profil, aby se nové karty vždy otevíraly ve stejné složce. Změny se projeví po restartu Tabby.","root.use.title":"Používat profil pracovní složky","root.use.desc":"Zapněte a vyplňte složku — profil se vytvoří a stane se výchozím.","root.name.title":"Název profilu","root.cwd.title":"Pracovní složka","root.cwd.desc":"Necháte-li prázdné, žádný profil nevznikne. Při ručním psaní používejte lomítka (např. D:/Project), vyhnete se tak pastem s escapováním zpětných lomítek.","root.browse":"Procházet","root.command.title":"Příkaz","diag.head":"Nahlásit problém","diag.intro":"Posbírá diagnostické logy <b>do jednoho zipu</b> a otevře složku, kde skončí. Obsahuje: verze pluginu a Tabby a operační systém, nastavení výše a dvě nejnovější generace <code>{path}</code>. V logách jsou <b>názvy karet a cesty, které jste otevřeli</b> — před odesláním klidně zip otevřete a zkontrolujte.","diag.screen.title":"Přiložit i syrovou obrazovku","diag.screen.desc":"Zapněte u problémů s vykreslováním. Obrazovka terminálu se přiloží doslova — je v ní vidět vaše práce i kód — proto je to ve výchozím stavu vypnuté.","diag.collect.title":"Posbírat logy","diag.collect.desc":"Plugin v{version}.","diag.made":"Vytvořeno: ","diag.btn":"Posbírat","dev.head":"Možnosti pro vývojáře","dev.use.title":"Zapnout možnosti pro vývojáře","dev.use.desc":"Zapne <b>živé načítání</b> — jakmile <code>npm run build</code> přepíše <code>dist/index.js</code>, okno se načte na nový plugin <b>se zachovanými relacemi</b> (karty se znovu připojí ke stejnému pty). Klávesová zkratka <b>[dev] Znovu načíst plugin</b> se řídí stejným přepínačem. Když je vypnuto, změna dist neudělá nic. Zobrazuje se jen u instalace ze zdrojů; sestavení z npm tohle nemá.","dev.now.title":"Načíst znovu","dev.now.desc":"Načte aktuální dist bez sestavení.","dev.btn":"Načíst znovu",footer:"Zbytek — poměr okna, šířka postranního panelu, průhlednost, detekce stavu, zpracování vstupu — je napevno na výchozích hodnotách. Pokud potřebujete něco změnit, upravte <code>agentDeck.*</code> přímo v konfiguračním souboru. Klávesové zkratky najdete na kartě <b>Zkratky</b> pod <code>agentdeck-*</code>.","keys.head":"Zkratky","keys.intro":"Klávesy z úvodní stránky. Stiskněte <b>Změnit</b> a pak novou klávesu. Pokud je už obsazená — samotným Tabby nebo AgentDeckem — dozvíte se, <b>s čím koliduje</b>, a můžete vybrat jinou nebo ji převzít. Platí okamžitě.","keys.change":"Změnit","keys.default":"Výchozí","keys.cancel":"Zrušit","keys.force":"Přesto použít","keys.press":"Stiskněte novou klávesu… (Esc zruší)","keys.conflict":"Koliduje s {names}. Pokud ji přesto použijete, bude tam odebrána.","keys.unbound":"nepřiřazeno","keys.stock":"vestavěné v Tabby","keys.digit":"Tato musí končit číslicí 1–9 — číslice je číslo relace. Stiskněte např. Alt+1 a 2…9 se nastaví stejně.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, pravé tlačítko a <code>Ctrl+F</code> / <code>Ctrl+S</code> v panelu nejsou zkratky a tady se nemění.","keys.item.newtab":"Nová karta v pracovním kořeni","keys.item.jump":"Skočit na N-tou relaci","keys.item.focus":"Fokus na seznam relací / zpět do terminálu","keys.item.view":"Otevřít / zavřít panel náhledu","keys.item.repair":"Opravit obrazovku","keys.item.splitright":"Rozdělit vedle sebe (nový panel vpravo)","keys.item.splitbottom":"Rozdělit nad sebe (nový panel dole)","keys.item.closepane":"Zavřít aktivní rozdělený panel","keys.item.newline":"Nový řádek bez odeslání","keys.item.toggle":"Postranní panel / 4:3 zap-vyp","keys.item.viewmode":"Panel: Soubory ↔ Změny"}},3286(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Flere arbejdsprofiler","root.choose.desc":"Gem flere arbejdsmapper, og vælg en profil, når du åbner en ny fane.","root.add":"Tilføj profil","root.remove":"Fjern profil","layout.title":"Brug AgentDeck-layoutet","layout.desc":"Slå fra, så forsvinder sidepanelet og den faste bredde — Tabby ser ud som normalt igen.","reset.title":"Nulstil layoutet","reset.desc":"Sætter sidepanelet tilbage til udgangspunktet — dokket til højre, med bredden beregnet ud fra vinduets forhold.","reset.now":"Nu: dokket {dock}, {size}.","reset.default":"Lige nu er alt på standardindstillingerne.","reset.btn":"Nulstil","dock.left":"til venstre","dock.right":"til højre","dock.top":"øverst","dock.bottom":"nederst","size.width":"{px} px bred","size.height":"{px} px høj","size.auto":"automatisk bredde","norecover.title":"Gendan ikke faner ved opstart","norecover.desc":"Tabby starter tomt i stedet for at hente de gamle faner tilbage — det, der kommer tilbage, er alligevel kun skallen, og Claude-sessionen indeni er for længst slut. Slå fra for Tabbys oprindelige opførsel (<code>recoverTabs</code>). Gælder fra næste opstart.","resume.title":"Genoptag tidligere sessioner","resume.desc":"Tilføjer en skuffe <code>⟲ Tidligere sessioner</code> sidst i hver gruppe (foldet sammen som standard). Fold den ud, og <b>lukkede Claude Code- og Codex-sessioner</b> står der med den prompt, du faktisk skrev; et klik åbner samtalen igen med <code>claude --resume</code> eller <code>codex resume</code> i dens egen arbejdsmappe. Det er den anden halvdel af <b>Gendan ikke faner</b> ovenfor — den almindelige gendannelse henter skallen, denne henter samtalen. <b>Servere og baggrundsprocesser, du havde kørende, kommer ikke tilbage.</b>","agents.head":"Agentintegration","agents.intro":"Lader hver agent <b>selv melde</b> sin tilstand, sin model og sine forbrugsgrænser. Det er den mest præcise kilde, sidepanelet har — uden den gætter vi ud fra teksten, der tegnes på skærmen, og aflæsningen bliver tilsvarende usikker.","agents.unsupported.title":"Ikke tilgængelig på denne platform","agents.unsupported.desc":"Notifikationsscriptet er PowerShell og kører derfor kun på Windows. Tilstanden gættes i stedet ud fra output.","state.on":"Forbundet","state.off":"Ikke forbundet","state.half":"Halvt forbundet","btn.install":"Installér","btn.remove":"Fjern","claude.title":"Claude-integration","claude.desc":"Claude Code-sessioner vises i sidepanelet med deres <b>tilstand</b> (arbejder · venter på godkendelse · færdig) og <b>bjælker for model, konto og forbrug</b>. Installerer hooks og <code>statusLine</code> i <code>~/.claude/settings.json</code> samlet og fjerner dem samlet. Andre hooks røres ikke, og en <code>statusLine</code>, du allerede havde, køres <b>præcis som den er</b> — det, du ser der, ændrer sig ikke. Der skrives en sikkerhedskopi ved siden af filen først.","codex.title":"Codex-integration","codex.desc":"Codex-sessioner vises i sidepanelet med deres <b>tilstand</b> (arbejder · venter på godkendelse · færdig · afbrudt) og <b>bjælker for model, konto og forbrug</b>. Åbn Codex igen efter installationen, og gennemgå og godkend AgentDeck-hooks under <code>/hooks</code>.","codex.disabled":"Codex har slået disse hooks fra — der kommer intet, før du slår dem til: {events}. Åbn Codex, kør <code>/hooks</code>, og godkend dem.","root.head":"Profil til arbejdsmappe","root.intro":"Opretter en profil, så nye faner altid åbner i den samme mappe. Ændringer træder i kraft efter en genstart af Tabby.","root.use.title":"Brug en profil til arbejdsmappen","root.use.desc":"Slå til og udfyld mappen — profilen oprettes og bliver standard.","root.name.title":"Profilnavn","root.cwd.title":"Arbejdsmappe","root.cwd.desc":"Lader du feltet stå tomt, oprettes der ingen profil. Skriver du det i hånden, så brug skråstreger (f.eks. D:/Project) for at undgå fælderne med omvendte skråstreger.","root.browse":"Gennemse","root.command.title":"Kommando","diag.head":"Rapportér et problem","diag.intro":"Samler diagnostikloggene i <b>én enkelt zip</b> og åbner mappen, den havner i. Den indeholder: versioner af pluginnet og Tabby samt styresystem, indstillingerne ovenfor og de to nyeste generationer af <code>{path}</code>. Loggene indeholder <b>fanetitler og de stier, du har åbnet</b> — du må gerne åbne zipfilen og tjekke, før du sender den.","diag.screen.title":"Tag også den rå skærm med","diag.screen.desc":"Slå til ved problemer med optegningen. Terminalskærmen kommer med ordret — dit arbejde og din kode kan læses i den — derfor er det slået fra som standard.","diag.collect.title":"Saml loggene","diag.collect.desc":"Plugin v{version}.","diag.made":"Oprettet: ","diag.btn":"Saml","dev.head":"Udviklerindstillinger","dev.use.title":"Aktivér udviklerindstillinger","dev.use.desc":"Slår <b>live-genindlæsning</b> til — når <code>npm run build</code> skriver <code>dist/index.js</code> om, genindlæses vinduet til det nye plugin <b>med sessionerne i behold</b> (fanerne kobles tilbage til den samme pty). Genvejen <b>[dev] Genindlæs plugin</b> følger også denne kontakt. Er den slået fra, sker der ingenting, selv om dist ændres. Vises kun ved installation fra kildetræet; npm-bygget har ikke dette.","dev.now.title":"Genindlæs nu","dev.now.desc":"Genindlæser den nuværende dist uden at bygge.","dev.btn":"Genindlæs",footer:"Resten — vinduesforhold, sidepanelets bredde, uigennemsigtighed, tilstandsregistrering, inputhåndtering — er låst til standardværdierne. Skal noget ændres, så redigér <code>agentDeck.*</code> direkte i konfigurationsfilen. Genveje findes under fanen <b>Genveje</b> som <code>agentdeck-*</code>.","keys.head":"Genveje","keys.intro":"Tasterne fra forsiden. Tryk <b>Skift</b> og derefter den nye tast. Er den allerede i brug — af Tabby selv eller af AgentDeck — får du at vide, <b>hvad den støder sammen med</b>, og kan vælge om eller overtage tasten. Gælder straks.","keys.change":"Skift","keys.default":"Standard","keys.cancel":"Annuller","keys.force":"Brug den alligevel","keys.press":"Tryk på den nye tast… (Esc annullerer)","keys.conflict":"Støder sammen med {names}. Bruger du den alligevel, fjernes tasten dér.","keys.unbound":"ikke tildelt","keys.stock":"Tabbys egen","keys.digit":"Denne skal ende på et tal 1–9 — tallet er sessionsnummeret. Tryk fx Alt+1, så følger 2…9 med.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, højreklik og panelets <code>Ctrl+F</code> / <code>Ctrl+S</code> er ikke genvejstaster og ændres ikke her.","keys.item.newtab":"Nyt faneblad i arbejdsroden","keys.item.jump":"Spring til session nr. N","keys.item.focus":"Fokus på sessionslisten / tilbage til terminalen","keys.item.view":"Åbn / luk forhåndsvisningspanelet","keys.item.repair":"Reparér skærmen","keys.item.splitright":"Del side om side (ny rude til højre)","keys.item.splitbottom":"Del over / under (ny rude nedenunder)","keys.item.closepane":"Luk den aktive delte rude","keys.item.newline":"Linjeskift uden at sende","keys.item.toggle":"Sidebjælke / 4:3 til-fra","keys.item.viewmode":"Panel: Filer ↔ Ændringer"}},2858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Weitere Arbeitsprofile","root.choose.desc":"Speichere mehrere Arbeitsordner und wähle beim Öffnen eines neuen Tabs ein Profil.","root.add":"Profil hinzufügen","root.remove":"Profil entfernen","layout.title":"AgentDeck-Layout verwenden","layout.desc":"Ausgeschaltet verschwinden Seitenleiste und feste Breite — Tabby sieht wieder aus wie im Original.","reset.title":"Layout zurücksetzen","reset.desc":"Setzt Position und Größe der Seitenleiste auf den Anfangszustand zurück — rechts angedockt, Breite aus dem Fensterverhältnis berechnet.","reset.now":"Aktuell: {dock} angedockt, {size}.","reset.default":"Aktuell ist alles auf Standard.","reset.btn":"Zurücksetzen","dock.left":"links","dock.right":"rechts","dock.top":"oben","dock.bottom":"unten","size.width":"{px}px breit","size.height":"{px}px hoch","size.auto":"Breite automatisch","norecover.title":"Tabs beim Start nicht wiederherstellen","norecover.desc":"Tabby startet leer, statt die alten Tabs zurückzuholen — zurück kommt ohnehin nur die Shell, und die Claude-Sitzung darin ist längst beendet. Ausgeschaltet gilt wieder das Originalverhalten (<code>recoverTabs</code>). Gilt ab dem nächsten Start.","resume.title":"Frühere Sitzungen fortsetzen","resume.desc":"Hängt an jede Gruppe eine Schublade <code>⟲ Frühere Sitzungen</code> an (standardmäßig zugeklappt). Aufgeklappt stehen dort <b>geschlossene Claude-Code- und Codex-Sitzungen</b> mit dem Prompt, den du damals wirklich getippt hast; ein Klick holt das Gespräch mit <code>claude --resume</code> bzw. <code>codex resume</code> im zugehörigen Arbeitsordner zurück. Das ist die andere Hälfte von <b>Tabs nicht wiederherstellen</b> oben — die Originalwiederherstellung bringt die Shell zurück, das hier bringt das Gespräch zurück. <b>Server und Hintergrundprozesse von damals kommen nicht zurück.</b>","agents.head":"Agent-Anbindung","agents.intro":"Lässt jeden Agenten seinen Zustand, sein Modell und seine Nutzungsgrenzen <b>selbst melden</b>. Das ist die genaueste Quelle, die die Seitenleiste hat — ohne sie raten wir anhand des Textes auf dem Bildschirm, und entsprechend wackelig ist das Ergebnis.","agents.unsupported.title":"Auf dieser Plattform nicht verfügbar","agents.unsupported.desc":"Das Benachrichtigungsskript ist PowerShell und läuft daher nur unter Windows. Der Zustand wird stattdessen aus der Ausgabe geraten.","state.on":"Verbunden","state.off":"Nicht verbunden","state.half":"Halb verbunden","btn.install":"Installieren","btn.remove":"Entfernen","claude.title":"Claude-Anbindung","claude.desc":"Claude-Code-Sitzungen erscheinen in der Seitenleiste mit ihrem <b>Zustand</b> (arbeitet · wartet auf Freigabe · fertig) und <b>Modell, Konto und Nutzungsbalken</b>. Installiert die Hooks und die <code>statusLine</code> in <code>~/.claude/settings.json</code> gemeinsam und entfernt sie gemeinsam. Andere Hooks bleiben unangetastet, und eine bereits vorhandene <code>statusLine</code> wird <b>unverändert ausgeführt</b> — was du dort siehst, ändert sich nicht. Vorher wird eine Sicherung neben der Datei abgelegt.","codex.title":"Codex-Anbindung","codex.desc":"Codex-Sitzungen erscheinen in der Seitenleiste mit ihrem <b>Zustand</b> (arbeitet · wartet auf Freigabe · fertig · abgebrochen) und <b>Modell, Konto und Nutzungsbalken</b>. Öffne Codex nach der Installation neu und prüfe und bestätige die AgentDeck-Hooks unter <code>/hooks</code>.","codex.disabled":"Codex hat diese Hooks abgeschaltet — bis du sie einschaltest, kommt nichts an: {events}. Öffne Codex, führe <code>/hooks</code> aus und bestätige sie.","root.head":"Profil für den Arbeitsordner","root.intro":"Legt ein Profil an, damit neue Tabs immer im selben Ordner starten. Änderungen greifen nach einem Neustart von Tabby.","root.use.title":"Profil für den Arbeitsordner verwenden","root.use.desc":"Einschalten und den Ordner eintragen — das Profil wird angelegt und zum Standard.","root.name.title":"Profilname","root.cwd.title":"Arbeitsordner","root.cwd.desc":"Leer lassen und es wird kein Profil angelegt. Beim Tippen Schrägstriche verwenden (z. B. D:/Project), um Escape-Fallen mit Backslashes zu vermeiden.","root.browse":"Durchsuchen","root.command.title":"Befehl","diag.head":"Problem melden","diag.intro":"Sammelt die Diagnoseprotokolle in <b>einer einzigen ZIP-Datei</b> und öffnet den Ordner, in dem sie landet. Enthalten sind: Plugin-/Tabby-Version und Betriebssystem, die Einstellungen oben sowie die zwei jüngsten Generationen von <code>{path}</code>. In den Protokollen stehen <b>Tab-Titel und die Pfade, die du geöffnet hast</b> — du darfst die ZIP vor dem Senden ruhig prüfen.","diag.screen.title":"Rohen Bildschirminhalt mitschicken","diag.screen.desc":"Für Darstellungsfehler einschalten. Der Terminalinhalt geht wortwörtlich mit — deine Arbeit und dein Code sind darin lesbar — deshalb ist es standardmäßig aus.","diag.collect.title":"Protokolle sammeln","diag.collect.desc":"Plugin v{version}.","diag.made":"Erstellt: ","diag.btn":"Sammeln","dev.head":"Entwickleroptionen","dev.use.title":"Entwickleroptionen aktivieren","dev.use.desc":"Schaltet <b>Live-Reload</b> ein — sobald <code>npm run build</code> <code>dist/index.js</code> neu schreibt, lädt das Fenster das neue Plugin <b>mit erhaltenen Sitzungen</b> (die Tabs hängen sich wieder an dieselbe pty). Der Hotkey <b>[dev] Plugin neu laden</b> folgt ebenfalls diesem Schalter. Ausgeschaltet passiert bei geändertem dist gar nichts. Nur bei Installationen aus dem Quellbaum sichtbar; im npm-Build gibt es das nicht.","dev.now.title":"Jetzt neu laden","dev.now.desc":"Lädt ohne Build das aktuelle dist neu.","dev.btn":"Neu laden",footer:"Der Rest — Fensterverhältnis, Breite der Seitenleiste, Deckkraft, Zustandserkennung, Eingabeverarbeitung — steht fest auf den Standardwerten. Bei Bedarf <code>agentDeck.*</code> direkt in der Konfigurationsdatei ändern. Tastenkürzel liegen im Reiter <b>Hotkeys</b> unter <code>agentdeck-*</code>.","keys.head":"Tastenkürzel","keys.intro":"Die Tasten von der Startseite. <b>Ändern</b> drücken, dann die neue Taste. Ist sie schon belegt – von Tabby selbst oder von AgentDeck – wird gesagt, <b>womit sie kollidiert</b>, und man kann neu wählen oder die Taste übernehmen. Gilt sofort.","keys.change":"Ändern","keys.default":"Standard","keys.cancel":"Abbrechen","keys.force":"Trotzdem verwenden","keys.press":"Neue Taste drücken… (Esc bricht ab)","keys.conflict":"Kollidiert mit {names}. Bei „Trotzdem verwenden“ wird die Taste dort entfernt.","keys.unbound":"nicht belegt","keys.stock":"Tabby-eigen","keys.digit":"Dieser Eintrag muss auf eine Ziffer 1–9 enden – die Ziffer ist die Sitzungsnummer. Z. B. Alt+1 drücken, 2…9 folgen.","keys.fixed":"<code>Strg+V</code>, <code>Strg+W</code>, Rechtsklick und <code>Strg+F</code> / <code>Strg+S</code> im Panel sind keine Hotkeys und werden hier nicht geändert.","keys.item.newtab":"Neuer Tab im Arbeitsordner","keys.item.jump":"Zur N-ten Sitzung springen","keys.item.focus":"Sitzungsliste fokussieren / zurück ins Terminal","keys.item.view":"Vorschau-Panel öffnen / schließen","keys.item.repair":"Bildschirm reparieren","keys.item.splitright":"Nebeneinander teilen (neue Ansicht rechts)","keys.item.splitbottom":"Übereinander teilen (neue Ansicht unten)","keys.item.closepane":"Fokussierte Teilansicht schließen","keys.item.newline":"Zeilenumbruch ohne Senden","keys.item.toggle":"Seitenleiste / 4:3 an-aus","keys.item.viewmode":"Panel: Dateien ↔ Änderungen"}},8674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Additional work root profiles","root.choose.desc":"Save multiple working folders and choose a profile when opening a new tab.","root.add":"Add profile","root.remove":"Remove profile","layout.title":"Use the AgentDeck layout","layout.desc":"Turn this off to drop the sidebar and the fixed-width layout and go back to stock Tabby.","reset.title":"Reset the layout","reset.desc":"Puts the sidebar back where it started — docked right, with the width derived from the window ratio.","reset.now":"Now: docked {dock}, {size}.","reset.default":"It is at the default right now.","reset.btn":"Reset","dock.left":"left","dock.right":"right","dock.top":"top","dock.bottom":"bottom","size.width":"{px}px wide","size.height":"{px}px tall","size.auto":"width auto","norecover.title":"Do not restore tabs on start","norecover.desc":"Tabby starts empty instead of bringing the old tabs back — what comes back is only the shell, and the Claude session inside it is long gone. Turn it off for stock behaviour (<code>recoverTabs</code>). Applies from the next start.","resume.title":"Resume past sessions","resume.desc":"Adds a <code>⟲ Past sessions</code> drawer at the end of each group (collapsed by default). Open it and <b>closed Claude Code and Codex sessions</b> are listed by the prompt you actually typed; clicking one reopens the conversation with <code>claude --resume</code> or <code>codex resume</code> in its own working folder. This is the other half of <b>Do not restore tabs</b> above — stock recovery brings back the shell, this brings back the conversation. <b>Servers and background processes you had running do not come back.</b>","agents.head":"Agent integration","agents.intro":"Lets each agent <b>report</b> its own state, model and usage limits. That is the most accurate source the sidebar has — without it we guess from the text drawn on screen, and the reading wobbles accordingly.","agents.unsupported.title":"Not available on this platform","agents.unsupported.desc":"The notification script is PowerShell, so it only runs on Windows. State is guessed from output instead.","state.on":"Connected","state.off":"Not connected","state.half":"Half-connected","btn.install":"Install","btn.remove":"Remove","claude.title":"Claude integration","claude.desc":"Claude Code sessions show up in the sidebar with their <b>state</b> (working · waiting for approval · done) and <b>model, account and usage bars</b>. Installs the hooks and the <code>statusLine</code> in <code>~/.claude/settings.json</code> together, and removes them together. Other hooks are left alone, and a <code>statusLine</code> you already had is <b>run as-is</b>, so what you see there does not change. A backup is written next to the file first.","codex.title":"Codex integration","codex.desc":"Codex sessions show up in the sidebar with their <b>state</b> (working · waiting for approval · done · interrupted) and <b>model, account and usage bars</b>. After installing, reopen Codex and review and trust the AgentDeck hooks under <code>/hooks</code>.","codex.disabled":"Codex has these hooks turned off — nothing arrives until you enable them: {events}. Open Codex, run <code>/hooks</code>, and trust them.","root.head":"Working-folder profile","root.intro":"Creates a profile so new tabs always open in the same folder. Changes apply after restarting Tabby.","root.use.title":"Use a working-folder profile","root.use.desc":"Turn it on and fill in the folder — the profile is created and becomes the default.","root.name.title":"Profile name","root.cwd.title":"Working folder","root.cwd.desc":"Leave it empty and no profile is made. When typing it by hand use forward slashes (e.g. D:/Project) to dodge backslash-escaping traps.","root.browse":"Browse","root.command.title":"Command","diag.head":"Report a problem","diag.intro":"Collects the diagnostic logs into <b>a single zip</b> and opens the folder it lands in. It contains the plugin/Tabby versions and OS, the settings above, and the two most recent generations of <code>{path}</code>. The logs include <b>tab titles and the paths you opened</b> — feel free to open the zip and check before sending it.","diag.screen.title":"Include the raw screen","diag.screen.desc":"Turn this on for rendering problems. The terminal screen goes in verbatim — your work and code are visible in it — so it is off by default.","diag.collect.title":"Collect the logs","diag.collect.desc":"Plugin v{version}.","diag.made":"Created: ","diag.btn":"Collect","dev.head":"Developer options","dev.use.title":"Enable developer options","dev.use.desc":"Turns on <b>live reload</b> — when <code>npm run build</code> rewrites <code>dist/index.js</code>, the window reloads onto the new plugin <b>with your sessions intact</b> (tabs reattach to the same pty). The <b>[dev] Reload plugin</b> hotkey follows this switch too. Turn it off and a changed dist does nothing. Only shown for source-tree installs; the npm build does not have this.","dev.now.title":"Reload now","dev.now.desc":"Reloads onto the current dist without building.","dev.btn":"Reload",footer:"The rest — window ratio, sidebar width, opacity, state detection, input handling — is pinned to its defaults. Edit <code>agentDeck.*</code> in the config file if you need to change one. Hotkeys live under the <b>Hotkeys</b> tab as <code>agentdeck-*</code>.","keys.head":"Shortcuts","keys.intro":"The keys from the front page. Press <b>Change</b>, then the new key. If it is already taken — by Tabby itself or by AgentDeck — you are told <b>what it clashes with</b> and can pick again or take the key over. Applies immediately.","keys.change":"Change","keys.default":"Default","keys.cancel":"Cancel","keys.force":"Use it anyway","keys.press":"Press the new key… (Esc to cancel)","keys.conflict":"Clashes with {names}. Use it anyway and the key is removed there.","keys.unbound":"unbound","keys.stock":"Tabby's own","keys.digit":"This one has to end in a digit 1–9 — the digit is the session number. Press e.g. Alt+1 and 2…9 follow.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, right-click and the panel's <code>Ctrl+F</code> / <code>Ctrl+S</code> are not hotkeys and are not changed here.","keys.item.newtab":"New tab in the work root","keys.item.jump":"Jump to the Nth session","keys.item.focus":"Focus the session list / back to the terminal","keys.item.view":"Open / close the preview panel","keys.item.repair":"Screen repair","keys.item.splitright":"Split side by side (new pane on the right)","keys.item.splitbottom":"Split top / bottom (new pane below)","keys.item.closepane":"Close the focused split pane","keys.item.newline":"Newline without sending","keys.item.toggle":"Sidebar / 4:3 on-off","keys.item.viewmode":"Panel: Files ↔ Changes"}},1549(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Perfiles de trabajo adicionales","root.choose.desc":"Guarda varias carpetas de trabajo y elige un perfil al abrir una pestaña nueva.","root.add":"Añadir perfil","root.remove":"Eliminar perfil","layout.title":"Usar la disposición de AgentDeck","layout.desc":"Desactívalo para quitar la barra lateral y el ancho fijo y volver a Tabby original.","reset.title":"Restablecer la disposición","reset.desc":"Devuelve la barra lateral a su estado inicial: acoplada a la derecha y con el ancho calculado a partir de la proporción de la ventana.","reset.now":"Ahora: acoplada a la {dock}, {size}.","reset.default":"Ahora mismo está en los valores por defecto.","reset.btn":"Restablecer","dock.left":"izquierda","dock.right":"derecha","dock.top":"parte superior","dock.bottom":"parte inferior","size.width":"{px} px de ancho","size.height":"{px} px de alto","size.auto":"ancho automático","norecover.title":"No restaurar las pestañas al iniciar","norecover.desc":"Tabby arranca vacío en lugar de recuperar las pestañas anteriores: lo único que vuelve es el shell, y la sesión de Claude que había dentro terminó hace rato. Desactívalo para el comportamiento original (<code>recoverTabs</code>). Se aplica a partir del próximo arranque.","resume.title":"Retomar sesiones anteriores","resume.desc":"Añade un cajón <code>⟲ Sesiones anteriores</code> al final de cada grupo (plegado por defecto). Al abrirlo aparecen las <b>sesiones cerradas de Claude Code y Codex</b> identificadas por el prompt que escribiste realmente; al pulsar una, la conversación vuelve con <code>claude --resume</code> o <code>codex resume</code> en su propia carpeta de trabajo. Es la otra mitad de <b>No restaurar las pestañas</b>: la recuperación original trae el shell, esto trae la conversación. <b>Los servidores y procesos en segundo plano que tenías en marcha no vuelven.</b>","agents.head":"Integración de agentes","agents.intro":"Hace que cada agente <b>informe por sí mismo</b> de su estado, su modelo y sus límites de uso. Es la fuente más precisa que tiene la barra lateral: sin ella lo adivinamos a partir del texto dibujado en pantalla, y la lectura se vuelve igual de inestable.","agents.unsupported.title":"No disponible en esta plataforma","agents.unsupported.desc":"El script de notificación es de PowerShell, así que solo funciona en Windows. El estado se deduce de la salida.","state.on":"Conectado","state.off":"Sin conectar","state.half":"Conectado a medias","btn.install":"Instalar","btn.remove":"Quitar","claude.title":"Integración con Claude","claude.desc":"Las sesiones de Claude Code aparecen en la barra lateral con su <b>estado</b> (trabajando · esperando aprobación · terminado) y las <b>barras de modelo, cuenta y uso</b>. Instala a la vez los hooks y la <code>statusLine</code> en <code>~/.claude/settings.json</code>, y los quita a la vez. No toca otros hooks, y una <code>statusLine</code> que ya tuvieras se <b>ejecuta tal cual</b>, así que lo que ves ahí no cambia. Antes se escribe una copia de seguridad junto al archivo.","codex.title":"Integración con Codex","codex.desc":"Las sesiones de Codex aparecen en la barra lateral con su <b>estado</b> (trabajando · esperando aprobación · terminado · interrumpido) y las <b>barras de modelo, cuenta y uso</b>. Tras instalar, vuelve a abrir Codex y revisa y confía en los hooks de AgentDeck en <code>/hooks</code>.","codex.disabled":"Codex tiene estos hooks desactivados: hasta que los actives no llega nada: {events}. Abre Codex, ejecuta <code>/hooks</code> y confía en ellos.","root.head":"Perfil de carpeta de trabajo","root.intro":"Crea un perfil para que las pestañas nuevas se abran siempre en la misma carpeta. Los cambios se aplican tras reiniciar Tabby.","root.use.title":"Usar un perfil de carpeta de trabajo","root.use.desc":"Actívalo y rellena la carpeta: el perfil se crea y pasa a ser el predeterminado.","root.name.title":"Nombre del perfil","root.cwd.title":"Carpeta de trabajo","root.cwd.desc":"Si lo dejas vacío no se crea ningún perfil. Al escribirlo a mano usa barras normales (por ejemplo D:/Project) para esquivar los problemas de escape de las barras invertidas.","root.browse":"Examinar","root.command.title":"Comando","diag.head":"Informar de un problema","diag.intro":"Reúne los registros de diagnóstico en <b>un único zip</b> y abre la carpeta donde queda. Contiene: versiones del plugin y de Tabby y el sistema operativo, los ajustes de arriba y las dos generaciones más recientes de <code>{path}</code>. Los registros incluyen <b>los títulos de las pestañas y las rutas que has abierto</b>: puedes abrir el zip y revisarlo antes de enviarlo.","diag.screen.title":"Incluir el contenido en bruto de la pantalla","diag.screen.desc":"Actívalo para problemas de dibujado. La pantalla del terminal entra literalmente —tu trabajo y tu código se ven en ella—, por eso está desactivado por defecto.","diag.collect.title":"Reunir los registros","diag.collect.desc":"Plugin v{version}.","diag.made":"Creado: ","diag.btn":"Reunir","dev.head":"Opciones de desarrollo","dev.use.title":"Activar las opciones de desarrollo","dev.use.desc":"Activa la <b>recarga en caliente</b>: cuando <code>npm run build</code> reescribe <code>dist/index.js</code>, la ventana recarga el nuevo plugin <b>conservando tus sesiones</b> (las pestañas vuelven a engancharse al mismo pty). El atajo <b>[dev] Recargar el plugin</b> también sigue este interruptor. Desactivado, cambiar dist no hace nada. Solo se ve en instalaciones desde el árbol de código; la versión de npm no lo incluye.","dev.now.title":"Recargar ahora","dev.now.desc":"Recarga el dist actual sin compilar.","dev.btn":"Recargar",footer:"El resto —proporción de la ventana, ancho de la barra lateral, opacidad, detección de estado, gestión de la entrada— está fijado en sus valores por defecto. Si necesitas cambiar alguno, edita <code>agentDeck.*</code> directamente en el archivo de configuración. Los atajos están en la pestaña <b>Atajos</b> como <code>agentdeck-*</code>.","keys.head":"Atajos","keys.intro":"Las teclas de la portada. Pulsa <b>Cambiar</b> y luego la tecla nueva. Si ya está ocupada — por Tabby o por AgentDeck — se te dice <b>con qué choca</b> y puedes elegir otra o quedártela. Se aplica al instante.","keys.change":"Cambiar","keys.default":"Predeterminado","keys.cancel":"Cancelar","keys.force":"Usarla de todos modos","keys.press":"Pulsa la tecla nueva… (Esc cancela)","keys.conflict":"Choca con {names}. Si la usas de todos modos, la tecla se quita de ahí.","keys.unbound":"sin asignar","keys.stock":"propio de Tabby","keys.digit":"Este tiene que acabar en un dígito 1–9 — el dígito es el número de sesión. Pulsa p. ej. Alt+1 y 2…9 le siguen.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, el clic derecho y <code>Ctrl+F</code> / <code>Ctrl+S</code> del panel no son atajos y no se cambian aquí.","keys.item.newtab":"Nueva pestaña en la raíz de trabajo","keys.item.jump":"Ir a la sesión N","keys.item.focus":"Foco en la lista de sesiones / volver a la terminal","keys.item.view":"Abrir / cerrar el panel de vista previa","keys.item.repair":"Reparar la pantalla","keys.item.splitright":"Dividir en horizontal (panel nuevo a la derecha)","keys.item.splitbottom":"Dividir en vertical (panel nuevo abajo)","keys.item.closepane":"Cerrar el panel dividido activo","keys.item.newline":"Salto de línea sin enviar","keys.item.toggle":"Barra lateral / 4:3 on-off","keys.item.viewmode":"Panel: Archivos ↔ Cambios"}},1017(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profils de travail supplémentaires","root.choose.desc":"Enregistrez plusieurs dossiers de travail et choisissez un profil en ouvrant un nouvel onglet.","root.add":"Ajouter un profil","root.remove":"Supprimer le profil","layout.title":"Utiliser la disposition AgentDeck","layout.desc":"Désactivez pour supprimer la barre latérale et la largeur fixe, et revenir à Tabby d’origine.","reset.title":"Réinitialiser la disposition","reset.desc":"Remet la barre latérale dans son état initial — ancrée à droite, largeur calculée à partir du rapport de la fenêtre.","reset.now":"Actuellement : ancrée à {dock}, {size}.","reset.default":"Tout est actuellement à la valeur par défaut.","reset.btn":"Réinitialiser","dock.left":"gauche","dock.right":"droite","dock.top":"en haut","dock.bottom":"en bas","size.width":"{px} px de large","size.height":"{px} px de haut","size.auto":"largeur automatique","norecover.title":"Ne pas restaurer les onglets au démarrage","norecover.desc":"Tabby démarre vide au lieu de rouvrir les anciens onglets — ce qui revient n’est que le shell, et la session Claude qu’il contenait est terminée depuis longtemps. Désactivez pour retrouver le comportement d’origine (<code>recoverTabs</code>). Effectif au prochain démarrage.","resume.title":"Reprendre les sessions passées","resume.desc":"Ajoute un tiroir <code>⟲ Sessions passées</code> à la fin de chaque groupe (replié par défaut). Une fois ouvert, les <b>sessions Claude Code et Codex fermées</b> y figurent avec l’invite que vous aviez réellement tapée ; un clic rouvre la conversation via <code>claude --resume</code> ou <code>codex resume</code> dans son propre dossier de travail. C’est le pendant de <b>Ne pas restaurer les onglets</b> ci-dessus — la restauration d’origine ramène le shell, celle-ci ramène la conversation. <b>Les serveurs et processus d’arrière-plan alors lancés ne reviennent pas.</b>","agents.head":"Intégration des agents","agents.intro":"Permet à chaque agent de <b>signaler lui-même</b> son état, son modèle et ses quotas. C’est la source la plus fiable dont dispose la barre latérale — sans cela, nous devinons à partir du texte affiché à l’écran, et la lecture s’en trouve d’autant plus incertaine.","agents.unsupported.title":"Indisponible sur cette plateforme","agents.unsupported.desc":"Le script de notification est en PowerShell : il ne fonctionne que sous Windows. L’état est alors deviné à partir de la sortie.","state.on":"Connecté","state.off":"Non connecté","state.half":"Connecté à moitié","btn.install":"Installer","btn.remove":"Supprimer","claude.title":"Intégration Claude","claude.desc":"Les sessions Claude Code apparaissent dans la barre latérale avec leur <b>état</b> (en cours · en attente d’approbation · terminé) et les <b>barres de modèle, de compte et de quota</b>. Installe ensemble les hooks et la <code>statusLine</code> dans <code>~/.claude/settings.json</code>, et les supprime ensemble. Les autres hooks ne sont pas touchés, et une <code>statusLine</code> déjà présente est <b>exécutée telle quelle</b> : ce que vous y voyez ne change pas. Une sauvegarde est écrite à côté du fichier au préalable.","codex.title":"Intégration Codex","codex.desc":"Les sessions Codex apparaissent dans la barre latérale avec leur <b>état</b> (en cours · en attente d’approbation · terminé · interrompu) et les <b>barres de modèle, de compte et de quota</b>. Après l’installation, rouvrez Codex puis vérifiez et approuvez les hooks AgentDeck sous <code>/hooks</code>.","codex.disabled":"Codex a désactivé ces hooks — rien n’arrive tant que vous ne les activez pas : {events}. Ouvrez Codex, lancez <code>/hooks</code> et approuvez-les.","root.head":"Profil de dossier de travail","root.intro":"Crée un profil pour que les nouveaux onglets s’ouvrent toujours dans le même dossier. Les modifications prennent effet après un redémarrage de Tabby.","root.use.title":"Utiliser un profil de dossier de travail","root.use.desc":"Activez puis renseignez le dossier — le profil est créé et devient celui par défaut.","root.name.title":"Nom du profil","root.cwd.title":"Dossier de travail","root.cwd.desc":"Laissez vide et aucun profil n’est créé. En saisie manuelle, utilisez des barres obliques (par ex. D:/Project) pour éviter les pièges d’échappement des antislashs.","root.browse":"Parcourir","root.command.title":"Commande","diag.head":"Signaler un problème","diag.intro":"Rassemble les journaux de diagnostic dans <b>une seule archive zip</b> et ouvre le dossier où elle est créée. On y trouve : les versions du plugin et de Tabby, le système, les réglages ci-dessus, et les deux générations les plus récentes de <code>{path}</code>. Les journaux contiennent <b>les titres des onglets et les chemins que vous avez ouverts</b> — n’hésitez pas à ouvrir l’archive pour vérifier avant de l’envoyer.","diag.screen.title":"Inclure le contenu brut de l’écran","diag.screen.desc":"À activer pour les problèmes d’affichage. L’écran du terminal est inclus tel quel — votre travail et votre code y sont lisibles — c’est donc désactivé par défaut.","diag.collect.title":"Rassembler les journaux","diag.collect.desc":"Plugin v{version}.","diag.made":"Créé : ","diag.btn":"Rassembler","dev.head":"Options développeur","dev.use.title":"Activer les options développeur","dev.use.desc":"Active le <b>rechargement à chaud</b> — dès que <code>npm run build</code> réécrit <code>dist/index.js</code>, la fenêtre recharge le nouveau plugin <b>en conservant vos sessions</b> (les onglets se rattachent au même pty). Le raccourci <b>[dev] Recharger le plugin</b> suit également cet interrupteur. Désactivé, un dist modifié ne déclenche rien. Visible uniquement pour les installations depuis les sources ; la version npm n’a pas cette fonction.","dev.now.title":"Recharger maintenant","dev.now.desc":"Recharge le dist actuel sans reconstruire.","dev.btn":"Recharger",footer:"Le reste — rapport de la fenêtre, largeur de la barre latérale, opacité, détection d’état, gestion de la saisie — est figé sur les valeurs par défaut. Modifiez <code>agentDeck.*</code> directement dans le fichier de configuration si nécessaire. Les raccourcis se trouvent dans l’onglet <b>Raccourcis</b> sous <code>agentdeck-*</code>.","keys.head":"Raccourcis","keys.intro":"Les touches de la page d'accueil. Appuyez sur <b>Modifier</b>, puis sur la nouvelle touche. Si elle est déjà prise — par Tabby lui-même ou par AgentDeck — on vous dit <b>avec quoi elle entre en conflit</b> et vous pouvez rechoisir ou la reprendre. S'applique immédiatement.","keys.change":"Modifier","keys.default":"Par défaut","keys.cancel":"Annuler","keys.force":"Utiliser quand même","keys.press":"Appuyez sur la nouvelle touche… (Échap pour annuler)","keys.conflict":"En conflit avec {names}. En l'utilisant quand même, la touche y est retirée.","keys.unbound":"non assigné","keys.stock":"natif Tabby","keys.digit":"Celui-ci doit finir par un chiffre 1–9 — le chiffre est le numéro de session. Appuyez par ex. sur Alt+1 et 2…9 suivent.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, le clic droit et <code>Ctrl+F</code> / <code>Ctrl+S</code> du panneau ne sont pas des raccourcis et ne se changent pas ici.","keys.item.newtab":"Nouvel onglet dans la racine de travail","keys.item.jump":"Aller à la N-ième session","keys.item.focus":"Focus sur la liste des sessions / retour au terminal","keys.item.view":"Ouvrir / fermer le panneau d'aperçu","keys.item.repair":"Réparer l'écran","keys.item.splitright":"Diviser côte à côte (nouveau volet à droite)","keys.item.splitbottom":"Diviser haut / bas (nouveau volet en bas)","keys.item.closepane":"Fermer le volet actif","keys.item.newline":"Nouvelle ligne sans envoyer","keys.item.toggle":"Barre latérale / 4:3 on-off","keys.item.viewmode":"Panneau : Fichiers ↔ Modifications"}},159(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Dodatni radni profili","root.choose.desc":"Spremite više radnih mapa i odaberite profil pri otvaranju nove kartice.","root.add":"Dodaj profil","root.remove":"Ukloni profil","layout.title":"Koristi AgentDeck raspored","layout.desc":"Isključite pa nestaju bočna traka i fiksna širina — Tabby se vraća na izvorni izgled.","reset.title":"Vrati raspored na početno","reset.desc":"Vraća bočnu traku u početno stanje — usidrena desno, sa širinom izračunatom iz omjera prozora.","reset.now":"Sada: usidrena {dock}, {size}.","reset.default":"Trenutačno je sve na zadanim vrijednostima.","reset.btn":"Vrati na početno","dock.left":"lijevo","dock.right":"desno","dock.top":"gore","dock.bottom":"dolje","size.width":"širina {px} px","size.height":"visina {px} px","size.auto":"širina automatski","norecover.title":"Ne vraćaj kartice pri pokretanju","norecover.desc":"Tabby se pokreće prazan umjesto da vraća prijašnje kartice — ionako se vraća samo ljuska, a Claude sesija koja je bila u njoj odavno je gotova. Isključite za izvorno ponašanje (<code>recoverTabs</code>). Vrijedi od sljedećeg pokretanja.","resume.title":"Nastavi prijašnje sesije","resume.desc":"Dodaje ladicu <code>⟲ Prijašnje sesije</code> na kraj svake grupe (zadano sklopljenu). Kad je otvorite, u njoj su <b>zatvorene sesije Claude Codea i Codexa</b> označene promptom koji ste doista upisali; klikom se razgovor vraća naredbom <code>claude --resume</code> ili <code>codex resume</code> u vlastitoj radnoj mapi. To je druga polovica opcije <b>Ne vraćaj kartice</b> iznad — izvorno vraćanje vrati ljusku, ovo vrati razgovor. <b>Poslužitelji i pozadinski procesi koje ste tada imali pokrenute ne vraćaju se.</b>","agents.head":"Povezivanje agenata","agents.intro":"Omogućuje da svaki agent <b>sam javlja</b> svoje stanje, model i ograničenja potrošnje. To je najtočniji izvor koji bočna traka ima — bez toga nagađamo iz teksta iscrtanog na zaslonu, pa očitanje odgovarajuće varira.","agents.unsupported.title":"Nije dostupno na ovoj platformi","agents.unsupported.desc":"Skripta za obavijesti pisana je u PowerShellu pa radi samo na Windowsima. Stanje se umjesto toga nagađa iz ispisa.","state.on":"Povezano","state.off":"Nije povezano","state.half":"Napola povezano","btn.install":"Instaliraj","btn.remove":"Ukloni","claude.title":"Povezivanje s Claudeom","claude.desc":"Sesije Claude Codea pojavljuju se u bočnoj traci sa svojim <b>stanjem</b> (radi · čeka odobrenje · gotovo) i <b>trakama modela, računa i potrošnje</b>. Kuke i <code>statusLine</code> u <code>~/.claude/settings.json</code> postavljaju se zajedno i zajedno uklanjaju. Ostale kuke ne diramo, a <code>statusLine</code> koji ste već imali <b>izvodi se nepromijenjen</b> — ono što ondje vidite ostaje isto. Prije zapisivanja uz datoteku se ostavlja sigurnosna kopija.","codex.title":"Povezivanje s Codexom","codex.desc":"Sesije Codexa pojavljuju se u bočnoj traci sa svojim <b>stanjem</b> (radi · čeka odobrenje · gotovo · prekinuto) i <b>trakama modela, računa i potrošnje</b>. Nakon instalacije ponovno otvorite Codex te pregledajte i odobrite AgentDeck kuke pod <code>/hooks</code>.","codex.disabled":"Codex je isključio ove kuke — dok ih ne uključiš, ništa ne stiže: {events}. Otvori Codex, pokreni <code>/hooks</code> i odobri ih.","root.head":"Profil radne mape","root.intro":"Stvara profil kako bi se nove kartice uvijek otvarale u istoj mapi. Promjene vrijede nakon ponovnog pokretanja Tabbyja.","root.use.title":"Koristi profil radne mape","root.use.desc":"Uključite i upišite mapu — profil se stvara i postaje zadani.","root.name.title":"Naziv profila","root.cwd.title":"Radna mapa","root.cwd.desc":"Ostavite li prazno, profil se ne stvara. Kad upisujete ručno, koristite kose crte (npr. D:/Project) da izbjegnete zamke s izbjegavanjem obrnutih kosih crta.","root.browse":"Pregledaj","root.command.title":"Naredba","diag.head":"Prijavi problem","diag.intro":"Skuplja dijagnostičke zapise u <b>jedan zip</b> i otvara mapu u kojoj završi. Sadrži: verzije dodatka i Tabbyja te operativni sustav, postavke iznad i dva najnovija naraštaja datoteke <code>{path}</code>. U zapisima su <b>naslovi kartica i putanje koje ste otvarali</b> — slobodno otvorite zip i provjerite prije slanja.","diag.screen.title":"Uključi i sirovi sadržaj zaslona","diag.screen.desc":"Uključite kod problema s iscrtavanjem. Zaslon terminala ulazi doslovno — u njemu se vide vaš rad i kod — pa je zadano isključeno.","diag.collect.title":"Skupi zapise","diag.collect.desc":"Dodatak v{version}.","diag.made":"Stvoreno: ","diag.btn":"Skupi","dev.head":"Razvojne mogućnosti","dev.use.title":"Uključi razvojne mogućnosti","dev.use.desc":"Uključuje <b>ponovno učitavanje uživo</b> — čim <code>npm run build</code> prepiše <code>dist/index.js</code>, prozor se ponovno učita na novi dodatak <b>uz očuvane sesije</b> (kartice se ponovno vežu na isti pty). Prečac <b>[dev] Ponovno učitaj dodatak</b> također slijedi ovaj prekidač. Kad je isključeno, promjena dist mape ne radi ništa. Vidljivo samo kod instalacije iz izvornog stabla; npm izdanje ovo nema.","dev.now.title":"Učitaj ponovno sada","dev.now.desc":"Ponovno učitava trenutačni dist bez izgradnje.","dev.btn":"Učitaj ponovno",footer:"Ostalo — omjer prozora, širina bočne trake, prozirnost, otkrivanje stanja, obrada unosa — fiksirano je na zadane vrijednosti. Treba li što promijeniti, uredite <code>agentDeck.*</code> izravno u konfiguracijskoj datoteci. Prečaci su na kartici <b>Prečaci</b> pod <code>agentdeck-*</code>.","keys.head":"Prečaci","keys.intro":"Tipke s naslovne stranice. Pritisnite <b>Promijeni</b>, zatim novu tipku. Ako je već zauzeta — od samog Tabbyja ili AgentDecka — bit će vam rečeno <b>s čime se sudara</b> i možete birati ponovno ili je preuzeti. Vrijedi odmah.","keys.change":"Promijeni","keys.default":"Zadano","keys.cancel":"Odustani","keys.force":"Svejedno koristi","keys.press":"Pritisnite novu tipku… (Esc odustaje)","keys.conflict":"Sudara se s {names}. Ako je svejedno koristite, tipka se ondje uklanja.","keys.unbound":"nije dodijeljeno","keys.stock":"ugrađeno u Tabby","keys.digit":"Ovo mora završavati znamenkom 1–9 — znamenka je broj sesije. Pritisnite npr. Alt+1 i 2…9 slijede.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, desni klik i <code>Ctrl+F</code> / <code>Ctrl+S</code> u panelu nisu prečaci i ovdje se ne mijenjaju.","keys.item.newtab":"Nova kartica u radnom korijenu","keys.item.jump":"Skoči na N-tu sesiju","keys.item.focus":"Fokus na popis sesija / natrag u terminal","keys.item.view":"Otvori / zatvori ploču pretpregleda","keys.item.repair":"Popravi zaslon","keys.item.splitright":"Podijeli jedno uz drugo (novo okno desno)","keys.item.splitbottom":"Podijeli gore / dolje (novo okno dolje)","keys.item.closepane":"Zatvori aktivno podijeljeno okno","keys.item.newline":"Novi red bez slanja","keys.item.toggle":"Bočna traka / 4:3 uklj-isklj","keys.item.viewmode":"Ploča: Datoteke ↔ Promjene"}},8124(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profil kerja tambahan","root.choose.desc":"Simpan beberapa folder kerja dan pilih profil saat membuka tab baru.","root.add":"Tambah profil","root.remove":"Hapus profil","layout.title":"Gunakan tata letak AgentDeck","layout.desc":"Matikan untuk menghilangkan bilah sisi dan lebar tetap, kembali ke tampilan asli Tabby.","reset.title":"Atur ulang tata letak","reset.desc":"Mengembalikan bilah sisi ke keadaan awal — menempel di kanan, dengan lebar dihitung dari rasio jendela.","reset.now":"Sekarang: menempel di {dock}, {size}.","reset.default":"Saat ini semuanya dalam keadaan bawaan.","reset.btn":"Atur ulang","dock.left":"kiri","dock.right":"kanan","dock.top":"atas","dock.bottom":"bawah","size.width":"lebar {px} px","size.height":"tinggi {px} px","size.auto":"lebar otomatis","norecover.title":"Jangan pulihkan tab saat mulai","norecover.desc":"Tabby mulai dalam keadaan kosong alih-alih memulihkan tab lama — yang kembali toh hanya shell-nya, dan sesi Claude di dalamnya sudah lama berakhir. Matikan untuk perilaku asli Tabby (<code>recoverTabs</code>). Berlaku sejak menjalankan berikutnya.","resume.title":"Lanjutkan sesi sebelumnya","resume.desc":"Menambahkan laci <code>⟲ Sesi sebelumnya</code> di akhir tiap grup (terlipat secara bawaan). Setelah dibuka, <b>sesi Claude Code dan Codex yang sudah ditutup</b> terdaftar dengan prompt yang benar-benar Anda ketik; sekali klik, percakapan kembali lewat <code>claude --resume</code> atau <code>codex resume</code> di folder kerjanya sendiri. Ini pasangan dari <b>Jangan pulihkan tab</b> di atas — pemulihan asli mengembalikan shell, yang ini mengembalikan percakapan. <b>Server dan proses latar yang tadinya berjalan tidak ikut kembali.</b>","agents.head":"Integrasi agen","agents.intro":"Membuat tiap agen <b>melaporkan sendiri</b> status, model, dan batas pemakaiannya. Itulah sumber paling akurat yang dimiliki bilah sisi — tanpanya kami menebak dari teks yang tergambar di layar, dan pembacaannya jadi goyah.","agents.unsupported.title":"Tidak tersedia di platform ini","agents.unsupported.desc":"Skrip notifikasi ditulis dengan PowerShell sehingga hanya berjalan di Windows. Status ditebak dari keluaran.","state.on":"Terhubung","state.off":"Belum terhubung","state.half":"Terhubung separuh","btn.install":"Pasang","btn.remove":"Hapus","claude.title":"Integrasi Claude","claude.desc":"Sesi Claude Code muncul di bilah sisi dengan <b>statusnya</b> (bekerja · menunggu persetujuan · selesai) serta <b>bilah model, akun, dan pemakaian</b>. Memasang hook dan <code>statusLine</code> di <code>~/.claude/settings.json</code> sekaligus, dan menghapusnya sekaligus. Hook lain tidak disentuh, dan <code>statusLine</code> yang sudah Anda pakai <b>dijalankan apa adanya</b> sehingga tampilannya tidak berubah. Cadangan ditulis di folder yang sama sebelum menulis.","codex.title":"Integrasi Codex","codex.desc":"Sesi Codex muncul di bilah sisi dengan <b>statusnya</b> (bekerja · menunggu persetujuan · selesai · terhenti) serta <b>bilah model, akun, dan pemakaian</b>. Setelah dipasang, buka kembali Codex lalu periksa dan percayai hook AgentDeck di <code>/hooks</code>.","codex.disabled":"Codex mematikan hook berikut — sebelum dinyalakan tidak ada yang masuk: {events}. Buka Codex, jalankan <code>/hooks</code>, lalu percayai hook itu.","root.head":"Profil folder kerja","root.intro":"Membuat profil khusus agar tab baru selalu terbuka di folder yang sama. Perubahan berlaku setelah Tabby dijalankan ulang.","root.use.title":"Gunakan profil folder kerja","root.use.desc":"Nyalakan lalu isi foldernya — profil dibuat dan menjadi profil bawaan.","root.name.title":"Nama profil","root.cwd.title":"Folder kerja","root.cwd.desc":"Dibiarkan kosong berarti tidak ada profil yang dibuat. Saat mengetik manual, pakai garis miring biasa (mis. D:/Project) untuk menghindari jebakan escape garis miring terbalik.","root.browse":"Telusuri","root.command.title":"Perintah","diag.head":"Laporkan masalah","diag.intro":"Mengumpulkan log diagnostik menjadi <b>satu berkas zip</b> lalu membuka folder tempatnya. Isinya: versi plugin dan Tabby serta sistem operasi, pengaturan di atas, dan dua generasi terbaru dari <code>{path}</code>. Log memuat <b>judul tab dan jalur berkas yang Anda buka</b> — silakan buka zip-nya untuk memeriksa sebelum mengirim.","diag.screen.title":"Sertakan isi layar mentah","diag.screen.desc":"Nyalakan untuk masalah tampilan. Layar terminal ikut apa adanya — pekerjaan dan kode Anda terbaca di dalamnya — karena itu bawaannya mati.","diag.collect.title":"Kumpulkan log","diag.collect.desc":"Plugin v{version}.","diag.made":"Dibuat: ","diag.btn":"Kumpulkan","dev.head":"Opsi pengembang","dev.use.title":"Aktifkan opsi pengembang","dev.use.desc":"Menyalakan <b>muat ulang langsung</b> — begitu <code>npm run build</code> menulis ulang <code>dist/index.js</code>, jendela dimuat ulang ke plugin baru <b>dengan sesi tetap utuh</b> (tab menempel kembali ke pty yang sama). Pintasan <b>[dev] Muat ulang plugin</b> juga mengikuti sakelar ini. Jika dimatikan, perubahan dist tidak melakukan apa-apa. Hanya tampil untuk pemasangan dari kode sumber; versi npm tidak memilikinya.","dev.now.title":"Muat ulang sekarang","dev.now.desc":"Memuat ulang dist saat ini tanpa proses build.","dev.btn":"Muat ulang",footer:"Sisanya — rasio jendela, lebar bilah sisi, opasitas, deteksi status, penanganan masukan — dikunci pada nilai bawaan. Bila perlu diubah, sunting <code>agentDeck.*</code> langsung di berkas konfigurasi. Pintasan ada di tab <b>Pintasan</b> sebagai <code>agentdeck-*</code>.","keys.head":"Pintasan","keys.intro":"Tombol-tombol dari halaman depan. Tekan <b>Ubah</b>, lalu tombol barunya. Jika sudah dipakai — oleh Tabby sendiri atau oleh AgentDeck — Anda diberi tahu <b>bertabrakan dengan apa</b> dan bisa memilih lagi atau mengambil alih tombolnya. Berlaku seketika.","keys.change":"Ubah","keys.default":"Bawaan","keys.cancel":"Batal","keys.force":"Tetap pakai","keys.press":"Tekan tombol baru… (Esc untuk batal)","keys.conflict":"Bertabrakan dengan {names}. Jika tetap dipakai, tombol itu dilepas dari sana.","keys.unbound":"belum diatur","keys.stock":"bawaan Tabby","keys.digit":"Yang ini harus diakhiri angka 1–9 — angkanya adalah nomor sesi. Tekan mis. Alt+1, maka 2…9 mengikuti.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, klik kanan, dan <code>Ctrl+F</code> / <code>Ctrl+S</code> di panel bukan hotkey dan tidak diubah di sini.","keys.item.newtab":"Tab baru di akar kerja","keys.item.jump":"Lompat ke sesi ke-N","keys.item.focus":"Fokus ke daftar sesi / kembali ke terminal","keys.item.view":"Buka / tutup panel pratinjau","keys.item.repair":"Perbaiki layar","keys.item.splitright":"Bagi berdampingan (panel baru di kanan)","keys.item.splitbottom":"Bagi atas / bawah (panel baru di bawah)","keys.item.closepane":"Tutup panel terpisah yang aktif","keys.item.newline":"Baris baru tanpa mengirim","keys.item.toggle":"Bilah samping / 4:3 nyala-mati","keys.item.viewmode":"Panel: Berkas ↔ Perubahan"}},5276(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profili di lavoro aggiuntivi","root.choose.desc":"Salva più cartelle di lavoro e scegli un profilo quando apri una nuova scheda.","root.add":"Aggiungi profilo","root.remove":"Rimuovi profilo","layout.title":"Usa il layout di AgentDeck","layout.desc":"Disattivandolo spariscono la barra laterale e la larghezza fissa: si torna a Tabby originale.","reset.title":"Reimposta il layout","reset.desc":"Riporta la barra laterale allo stato iniziale — agganciata a destra, con la larghezza calcolata dalle proporzioni della finestra.","reset.now":"Adesso: agganciata a {dock}, {size}.","reset.default":"Al momento è tutto ai valori predefiniti.","reset.btn":"Reimposta","dock.left":"sinistra","dock.right":"destra","dock.top":"in alto","dock.bottom":"in basso","size.width":"{px} px di larghezza","size.height":"{px} px di altezza","size.auto":"larghezza automatica","norecover.title":"Non ripristinare le schede all’avvio","norecover.desc":"Tabby parte vuoto invece di riportare indietro le vecchie schede: quello che torna è solo la shell, e la sessione di Claude che conteneva è finita da un pezzo. Disattiva per il comportamento originale (<code>recoverTabs</code>). Vale dal prossimo avvio.","resume.title":"Riprendi le sessioni passate","resume.desc":"Aggiunge un cassetto <code>⟲ Sessioni passate</code> in fondo a ogni gruppo (chiuso per impostazione predefinita). Aprendolo compaiono le <b>sessioni chiuse di Claude Code e Codex</b> elencate con il prompt che avevi davvero scritto; un clic riapre la conversazione con <code>claude --resume</code> o <code>codex resume</code> nella sua cartella di lavoro. È l’altra metà di <b>Non ripristinare le schede</b> qui sopra: il ripristino originale riporta la shell, questo riporta la conversazione. <b>I server e i processi in background che avevi avviato non tornano.</b>","agents.head":"Integrazione degli agenti","agents.intro":"Fa in modo che ogni agente <b>comunichi da sé</b> il proprio stato, il modello e i limiti d’uso. È la fonte più precisa di cui dispone la barra laterale: senza, si tira a indovinare dal testo disegnato a schermo, e la lettura traballa di conseguenza.","agents.unsupported.title":"Non disponibile su questa piattaforma","agents.unsupported.desc":"Lo script di notifica è in PowerShell, quindi gira solo su Windows. Lo stato viene dedotto dall’output.","state.on":"Collegato","state.off":"Non collegato","state.half":"Collegato a metà","btn.install":"Installa","btn.remove":"Rimuovi","claude.title":"Integrazione con Claude","claude.desc":"Le sessioni di Claude Code compaiono nella barra laterale con il loro <b>stato</b> (al lavoro · in attesa di approvazione · finito) e le <b>barre di modello, account e consumo</b>. Installa insieme gli hook e la <code>statusLine</code> in <code>~/.claude/settings.json</code>, e li rimuove insieme. Gli altri hook non vengono toccati, e una <code>statusLine</code> che avevi già viene <b>eseguita così com’è</b>: quello che vedi lì non cambia. Prima di scrivere viene lasciato un backup nella stessa cartella.","codex.title":"Integrazione con Codex","codex.desc":"Le sessioni di Codex compaiono nella barra laterale con il loro <b>stato</b> (al lavoro · in attesa di approvazione · finito · interrotto) e le <b>barre di modello, account e consumo</b>. Dopo l’installazione riapri Codex e rivedi e autorizza gli hook di AgentDeck in <code>/hooks</code>.","codex.disabled":"Codex ha questi hook disattivati: finché non li attivi non arriva nulla: {events}. Apri Codex, esegui <code>/hooks</code> e autorizzali.","root.head":"Profilo della cartella di lavoro","root.intro":"Crea un profilo perché le nuove schede si aprano sempre nella stessa cartella. Le modifiche valgono dopo il riavvio di Tabby.","root.use.title":"Usa un profilo per la cartella di lavoro","root.use.desc":"Attivalo e indica la cartella: il profilo viene creato e diventa quello predefinito.","root.name.title":"Nome del profilo","root.cwd.title":"Cartella di lavoro","root.cwd.desc":"Se lo lasci vuoto non viene creato alcun profilo. Scrivendolo a mano usa le barre normali (per es. D:/Project) per evitare le trappole di escape dei backslash.","root.browse":"Sfoglia","root.command.title":"Comando","diag.head":"Segnala un problema","diag.intro":"Raccoglie i log diagnostici in <b>un unico zip</b> e apre la cartella in cui finisce. Contiene: versioni del plugin e di Tabby e sistema operativo, le impostazioni qui sopra e le due generazioni più recenti di <code>{path}</code>. Nei log ci sono <b>i titoli delle schede e i percorsi che hai aperto</b>: puoi aprire lo zip e controllare prima di inviarlo.","diag.screen.title":"Includi anche lo schermo grezzo","diag.screen.desc":"Attivalo per i problemi di disegno a schermo. La schermata del terminale entra testualmente — il tuo lavoro e il tuo codice sono leggibili — perciò è disattivato per impostazione predefinita.","diag.collect.title":"Raccogli i log","diag.collect.desc":"Plugin v{version}.","diag.made":"Creato: ","diag.btn":"Raccogli","dev.head":"Opzioni sviluppatore","dev.use.title":"Attiva le opzioni sviluppatore","dev.use.desc":"Attiva il <b>ricaricamento a caldo</b>: quando <code>npm run build</code> riscrive <code>dist/index.js</code>, la finestra ricarica il nuovo plugin <b>mantenendo le sessioni</b> (le schede si riagganciano allo stesso pty). Anche la scorciatoia <b>[dev] Ricarica il plugin</b> segue questo interruttore. Disattivato, modificare dist non fa nulla. Visibile solo per le installazioni da sorgente; la build npm non ha questa funzione.","dev.now.title":"Ricarica adesso","dev.now.desc":"Ricarica il dist attuale senza compilare.","dev.btn":"Ricarica",footer:"Il resto — proporzioni della finestra, larghezza della barra laterale, opacità, rilevamento dello stato, gestione dell’input — è fissato sui valori predefiniti. Se devi cambiarne uno, modifica <code>agentDeck.*</code> direttamente nel file di configurazione. Le scorciatoie stanno nella scheda <b>Scorciatoie</b> come <code>agentdeck-*</code>.","keys.head":"Scorciatoie","keys.intro":"I tasti della pagina iniziale. Premi <b>Cambia</b>, poi il nuovo tasto. Se è già occupato — da Tabby stesso o da AgentDeck — ti viene detto <b>con cosa va in conflitto</b> e puoi riscegliere o prenderlo comunque. Vale subito.","keys.change":"Cambia","keys.default":"Predefinito","keys.cancel":"Annulla","keys.force":"Usalo comunque","keys.press":"Premi il nuovo tasto… (Esc annulla)","keys.conflict":"In conflitto con {names}. Usandolo comunque, il tasto viene tolto da lì.","keys.unbound":"non assegnato","keys.stock":"nativo di Tabby","keys.digit":"Questo deve finire con una cifra 1–9 — la cifra è il numero della sessione. Premi ad es. Alt+1 e 2…9 seguono.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, il clic destro e <code>Ctrl+F</code> / <code>Ctrl+S</code> del pannello non sono scorciatoie e non si cambiano qui.","keys.item.newtab":"Nuova scheda nella radice di lavoro","keys.item.jump":"Vai alla sessione N","keys.item.focus":"Focus sull'elenco sessioni / torna al terminale","keys.item.view":"Apri / chiudi il pannello anteprima","keys.item.repair":"Ripara lo schermo","keys.item.splitright":"Dividi affiancato (nuovo riquadro a destra)","keys.item.splitbottom":"Dividi sopra / sotto (nuovo riquadro sotto)","keys.item.closepane":"Chiudi il riquadro attivo","keys.item.newline":"A capo senza inviare","keys.item.toggle":"Barra laterale / 4:3 on-off","keys.item.viewmode":"Pannello: File ↔ Modifiche"}},588(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"追加の作業ルートプロファイル","root.choose.desc":"複数の作業フォルダーを保存し、新しいタブを開くときにプロファイルを選択します。","root.add":"プロファイルを追加","root.remove":"プロファイルを削除","layout.title":"AgentDeck のレイアウトを使う","layout.desc":"オフにするとサイドバーと固定幅レイアウトが消え、Tabby 標準の画面に戻る。","reset.title":"レイアウトを初期化","reset.desc":"マウスで変えたサイドバーの位置と大きさを初期状態に戻す — 右ドッキング + 画面比から自動計算した幅。","reset.now":"現在: {dock}にドッキング、{size}。","reset.default":"現在は初期状態。","reset.btn":"初期化","dock.left":"左","dock.right":"右","dock.top":"上","dock.bottom":"下","size.width":"幅 {px}px","size.height":"高さ {px}px","size.auto":"幅 自動","norecover.title":"起動時にタブを復元しない","norecover.desc":"オンにすると Tabby は前回のタブを復元せず空の状態で起動する — 戻ってくるのはシェルだけで、その中の Claude セッションはとっくに終わっている。 オフにすると Tabby 標準の動作(<code>recoverTabs</code>)に戻る。次回の起動から有効。","resume.title":"過去のセッションを再開","resume.desc":"各グループの末尾に <code>⟲ 過去のセッション</code> の引き出しを置く(既定は折りたたみ)。 開くと<b>終了した Claude Code・Codex のセッション</b>が、そのとき実際に入力したプロンプトで並ぶ。 クリックすると、そのセッションの作業フォルダで <code>claude --resume</code> または <code>codex resume</code> により会話が復活する。上の<b>タブを復元しない</b>と対になる設定だ — 標準の復元はシェルだけ、こちらは会話を戻す。 <b>ただし当時起動していたサーバーやバックグラウンドのプロセスは戻らない。</b>","agents.head":"エージェント連携","agents.intro":"エージェント自身に、状態・使用中のモデル・利用量を<b>直接報告させる</b>。 これがサイドバーにとって最も正確な情報源だ — 連携しないと画面に描かれた文字から推測することになり、その分だけ判定がぶれる。","agents.unsupported.title":"この環境では使えない","agents.unsupported.desc":"通知スクリプトが PowerShell なので Windows でのみ動作する。状態は出力から推測する。","state.on":"連携済み","state.off":"未連携","state.half":"連携なかば","btn.install":"インストール","btn.remove":"削除","claude.title":"Claude 連携","claude.desc":"Claude Code のセッションがサイドバーに<b>状態</b>(作業中・承認待ち・完了)と<b>モデル・アカウント・利用量バー</b>付きで表示される。 <code>~/.claude/settings.json</code> のフックと <code>statusLine</code> をまとめて設定し、削除もまとめて行う。他のフックには触れず、すでに使っていた <code>statusLine</code> は<b>そのまま実行する</b>ので表示は変わらない。書き込む前に同じフォルダへバックアップを残す。","codex.title":"Codex 連携","codex.desc":"Codex のセッションがサイドバーに<b>状態</b>(作業中・承認待ち・完了・中断)と<b>モデル・アカウント・利用量バー</b>付きで表示される。 インストール後に Codex を開き直し、<code>/hooks</code> で AgentDeck のフックを確認して信頼する必要がある。","codex.disabled":"Codex がこれらのフックを無効にしている — 有効にするまで何も届かない: {events}。 Codex で <code>/hooks</code> を開いて信頼すること。","root.head":"作業フォルダのプロファイル","root.intro":"新しいタブが常に同じ作業フォルダで開くよう専用プロファイルを作る。変更は Tabby の再起動後に反映される。","root.use.title":"作業フォルダのプロファイルを使う","root.use.desc":"オンにして作業フォルダを入れると、そのプロファイルを作成して既定にする。","root.name.title":"プロファイル名","root.cwd.title":"作業フォルダ","root.cwd.desc":"空にするとプロファイルは作らない。手で書くときはバックスラッシュのエスケープの罠を避けるためスラッシュで書く(例: D:/Project)。","root.browse":"参照","root.command.title":"実行コマンド","diag.head":"問題を報告","diag.intro":"診断ログを<b>ひとつの zip にまとめ</b>、そのファイルがあるフォルダを開く。 入るもの: プラグイン/Tabby のバージョンと OS、上の設定値、そして <code>{path}</code> の直近 2 世代。 ログには<b>タブのタイトルと開いたファイルのパス</b>が含まれる — 送る前に開いて確認してかまわない。","diag.screen.title":"画面の生テキストも入れる","diag.screen.desc":"表示が崩れる問題ならオンにする。崩れた瞬間のターミナル画面がそのまま入り(作業内容やコードが見える)、既定ではオフになっている。","diag.collect.title":"診断ログを集める","diag.collect.desc":"プラグイン v{version}。","diag.made":"作成しました: ","diag.btn":"集める","dev.head":"開発者オプション","dev.use.title":"開発者オプションを使う","dev.use.desc":"オンにすると<b>ライブリロード</b>が動く — <code>npm run build</code> で <code>dist/index.js</code> が変わると、<b>セッションを保ったまま</b>ウィンドウをリロードして新しいプラグインへ差し替える(タブは同じ pty に付き直す)。ショートカットタブの <b>[dev] プラグインをリロード</b> もこのスイッチに従う。 オフにすると dist が変わっても何も起きない。 ソースツリーからのインストールでのみ表示され、npm 配布版にこの機能はない。","dev.now.title":"今すぐリロード","dev.now.desc":"ビルドせずに現在の dist で開き直す。","dev.btn":"リロード",footer:"画面比・サイドバーの幅・不透明度・状態検出・入力処理などの残りの値は既定値で固定されている。 変えたい場合は設定ファイルの <code>agentDeck.*</code> を直接編集する。 ショートカットは<b>ホットキー</b>タブの <code>agentdeck-*</code> で変更する。","keys.head":"ショートカット","keys.intro":"トップページに載せたキー。<b>変更</b>を押してから新しいキーを押す。すでに使われているキーなら — Tabby 本体でも AgentDeck でも — <b>何と重なるか</b>を表示し、選び直すかそのキーを奪える。すぐに反映される。","keys.change":"変更","keys.default":"既定値","keys.cancel":"キャンセル","keys.force":"それでも使う","keys.press":"新しいキーを押してください… (Esc で中止)","keys.conflict":"{names} と重なります。それでも使うと、そちらからこのキーを外します。","keys.unbound":"未割り当て","keys.stock":"Tabby 本体","keys.digit":"この項目は 1〜9 の数字で終わる必要がある — 数字がセッション番号になる。例えば Alt+1 を押せば 2…9 も同じ形になる。","keys.fixed":"<code>Ctrl+V</code>・<code>Ctrl+W</code>・右クリック・パネルの <code>Ctrl+F</code> / <code>Ctrl+S</code> はホットキーではないのでここでは変えない。","keys.item.newtab":"作業ルートに新しいタブ","keys.item.jump":"N 番目のセッションへ","keys.item.focus":"セッション一覧にフォーカス / ターミナルへ戻る","keys.item.view":"プレビューパネルの開閉","keys.item.repair":"画面の修復","keys.item.splitright":"左右に分割 (新しいペインは右)","keys.item.splitbottom":"上下に分割 (新しいペインは下)","keys.item.closepane":"フォーカス中の分割ペインを閉じる","keys.item.newline":"送信せずに改行","keys.item.toggle":"サイドバー / 4:3 の切替","keys.item.viewmode":"パネル: ファイル ↔ 変更"}},1675(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"추가 작업 루트 프로필","root.choose.desc":"작업 폴더를 여러 개 저장할 수 있습니다. 새 탭을 열 때 사용할 프로필을 선택합니다.","root.add":"프로필 추가","root.remove":"프로필 삭제","layout.title":"레이아웃 사용","layout.desc":"끄면 사이드바와 고정폭 레이아웃이 사라지고 Tabby 순정 화면으로 돌아간다.","reset.title":"UI 배치 초기화","reset.desc":"마우스로 바꾼 사이드바 위치와 크기를 처음 상태로 되돌린다 — 오른쪽 도킹 + 화면비로 자동 계산한 폭.","reset.now":"지금: {dock} 도킹, {size}.","reset.default":"지금은 기본 상태다.","reset.btn":"초기화","dock.left":"왼쪽","dock.right":"오른쪽","dock.top":"위쪽","dock.bottom":"아래쪽","size.width":"폭 {px}px","size.height":"높이 {px}px","size.auto":"폭 자동","norecover.title":"기동 시 탭 복원 끄기","norecover.desc":"켜면 Tabby 를 다시 열 때 지난 탭을 되살리지 않고 빈 상태로 시작한다 — 복원되는 건 셸뿐이고 그 안의 Claude 세션은 이미 끝나 있어 의미가 없다. 끄면 Tabby 순정 동작(<code>recoverTabs</code>)으로 돌아간다. 다음 기동부터 적용.","resume.title":"지난 세션 이어받기","resume.desc":"그룹 끝에 <code>⟲ 지난 세션</code> 서랍을 둔다 (기본 접힘). 펴면 <b>닫힌 Claude Code·Codex 세션</b>이 그때 친 프롬프트로 보이고, 누르면 그 세션의 작업 폴더에서 <code>claude --resume</code> 또는 <code>codex resume</code> 으로 대화가 되살아난다. 위의 <b>탭 복원 끄기</b> 와 한 쌍이다 — 순정 복원은 셸만 되살리지만 이건 대화를 되살린다. <b>다만 그때 띄워 둔 서버·백그라운드 프로세스는 돌아오지 않는다.</b>","agents.head":"에이전트 연동","agents.intro":"에이전트가 자기 상태와 지금 쓰는 모델·한도를 <b>직접 알려주게</b> 한다. 이게 사이드바의 가장 정확한 원천이다 — 걸지 않으면 화면에 그려진 글자를 보고 추측하는 방식으로 동작하고, 그만큼 판정이 흔들린다.","agents.unsupported.title":"이 환경에서는 걸 수 없다","agents.unsupported.desc":"통보 스크립트가 PowerShell 이라 Windows 에서만 동작한다. 상태는 출력 패턴으로 추측한다.","state.on":"연동됨","state.off":"연동 안 됨","state.half":"반쪽 연동","btn.install":"설치","btn.remove":"제거","claude.title":"Claude 연동","claude.desc":"Claude Code 세션이 사이드바에서 <b>상태</b>(지시 받음 · 승인 대기 · 완료)와 <b>모델 · 계정 · 한도 막대</b>로 보인다. <code>~/.claude/settings.json</code> 의 훅과 <code>statusLine</code> 을 함께 걸고, 제거도 함께 한다. 다른 훅은 건드리지 않고, 이미 쓰던 <code>statusLine</code> 은 <b>그대로 실행해</b> 화면이 바뀌지 않는다. 쓰기 전에 같은 폴더에 백업을 남긴다.","codex.title":"Codex 연동","codex.desc":"Codex 세션이 사이드바에서 <b>상태</b>(진행 중 · 승인 대기 · 완료 · 중단)와 <b>모델 · 계정 · 한도 막대</b>로 보인다. 설치 후 Codex 를 다시 열고 <code>/hooks</code> 에서 AgentDeck 훅을 검토·신뢰해야 동작한다.","codex.disabled":"Codex 가 이 훅들을 꺼 뒀다 — 켜기 전에는 아무것도 오지 않는다: {events}. Codex 에서 <code>/hooks</code> 로 들어가 신뢰할 것.","root.head":"작업 루트 프로필","root.intro":"새 탭이 항상 같은 작업 폴더에서 뜨도록 전용 프로필을 만든다. 변경은 Tabby 재시작 후 적용된다.","root.use.title":"루트 프로필 사용","root.use.desc":"켜고 작업 폴더를 채우면 해당 프로필을 만들어 기본 프로필로 삼는다.","root.name.title":"프로필 이름","root.cwd.title":"작업 폴더","root.cwd.desc":"비우면 프로필을 만들지 않는다. 직접 적을 때는 백슬래시 이스케이프 함정을 피하려고 슬래시로 적는다 (예: D:/Project).","root.browse":"찾아보기","root.command.title":"실행 명령","diag.head":"문제 신고","diag.intro":"버그를 만났을 때 <b>진단 로그를 모아 zip 하나로 만든다</b> — 만든 뒤 그 파일이 있는 폴더가 열린다. 담기는 것: 플러그인/Tabby 버전·OS, 위에 있는 설정 값, 그리고 <code>{path}</code> 의 최근 두 세대. 로그에는 <b>탭 제목과 열어 본 파일 경로</b>가 들어간다 — 보내기 전에 열어 확인해도 된다.","diag.screen.title":"화면 원문까지 넣기","diag.screen.desc":"화면이 깨지는 문제라면 켠다. 깨진 순간의 터미널 화면이 글자 그대로 들어가므로 (작업 내용·코드가 보인다) 기본은 꺼져 있다.","diag.collect.title":"진단 로그 모으기","diag.collect.desc":"플러그인 v{version}.","diag.made":"만들었다: ","diag.btn":"모으기","dev.head":"개발자 옵션","dev.use.title":"개발자 옵션 사용","dev.use.desc":"켜면 <b>라이브 리로드</b>가 돈다 — <code>npm run build</code> 로 <code>dist/index.js</code> 가 바뀌면 <b>세션을 살린 채</b> 창을 리로드해 새 플러그인으로 갈아탄다 (탭은 같은 pty 에 다시 붙는다). 단축키 탭의 <b>[개발] 플러그인 리로드</b> 도 이 스위치를 따라간다. 끄면 dist 가 바뀌어도 아무 일도 일어나지 않는다. 소스 트리 설치에서만 보이고 npm 배포본에는 이 기능이 없다.","dev.now.title":"지금 리로드","dev.now.desc":"빌드 없이 현재 dist 로 다시 띄운다.","dev.btn":"리로드",footer:"화면비·사이드바 폭·투명도·상태 감지·입력 처리 등 나머지 값은 기본값으로 고정돼 있다. 바꿔야 한다면 설정 파일의 <code>agentDeck.*</code> 를 직접 고친다. 단축키는 <b>단축키</b> 탭의 <code>agentdeck-*</code> 항목에서 바꾼다.","keys.head":"단축키","keys.intro":"첫 화면에 올린 키들이다. <b>바꾸기</b>를 누르고 새 키를 누른다. 이미 쓰는 키면 — Tabby 순정이든 AgentDeck 것이든 — <b>무엇과 겹치는지</b> 알려 주고, 다시 고르거나 그 키를 가져올 수 있다. 바로 적용된다.","keys.change":"바꾸기","keys.default":"기본값","keys.cancel":"취소","keys.force":"그래도 쓰기","keys.press":"새 키를 누르세요… (Esc 취소)","keys.conflict":"{names} 와 겹칩니다. 그래도 쓰면 그쪽에서 이 키를 뗍니다.","keys.unbound":"미배정","keys.stock":"Tabby 순정","keys.digit":"이 항목은 1~9 숫자로 끝나야 한다 — 숫자가 곧 세션 번호다. 예를 들어 Alt+1 을 누르면 2…9 가 따라온다.","keys.fixed":"<code>Ctrl+V</code> · <code>Ctrl+W</code> · 우클릭 · 패널의 <code>Ctrl+F</code> / <code>Ctrl+S</code> 는 핫키가 아니라 여기서 바꾸지 않는다.","keys.item.newtab":"작업 루트에 새 탭","keys.item.jump":"N 번째 세션으로","keys.item.focus":"세션 목록에 포커스 / 터미널 복귀","keys.item.view":"미리보기 패널 여닫기","keys.item.repair":"화면 복구","keys.item.splitright":"좌우로 분할 (새 패널이 오른쪽)","keys.item.splitbottom":"위아래로 분할 (새 패널이 아래)","keys.item.closepane":"포커스된 분할 패널 닫기","keys.item.newline":"전송하지 않고 줄바꿈","keys.item.toggle":"사이드바 / 4:3 즉시 on-off","keys.item.viewmode":"패널: 파일 ↔ 변경"}},1773(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Dodatkowe profile robocze","root.choose.desc":"Zapisz wiele folderów roboczych i wybierz profil podczas otwierania nowej karty.","root.add":"Dodaj profil","root.remove":"Usuń profil","layout.title":"Używaj układu AgentDeck","layout.desc":"Po wyłączeniu znikają panel boczny i stała szerokość — wraca zwykły wygląd Tabby.","reset.title":"Zresetuj układ","reset.desc":"Przywraca panel boczny do stanu początkowego — zadokowany po prawej, szerokość wyliczona z proporcji okna.","reset.now":"Teraz: zadokowany {dock}, {size}.","reset.default":"Aktualnie wszystko jest domyślne.","reset.btn":"Resetuj","dock.left":"po lewej","dock.right":"po prawej","dock.top":"u góry","dock.bottom":"u dołu","size.width":"szerokość {px} px","size.height":"wysokość {px} px","size.auto":"szerokość automatyczna","norecover.title":"Nie przywracaj kart przy starcie","norecover.desc":"Tabby startuje pusty zamiast przywracać poprzednie karty — wraca i tak tylko powłoka, a sesja Claude, która w niej była, dawno się skończyła. Wyłącz, aby wrócić do zachowania oryginalnego (<code>recoverTabs</code>). Działa od następnego startu.","resume.title":"Wznów poprzednie sesje","resume.desc":"Dodaje na końcu każdej grupy szufladę <code>⟲ Poprzednie sesje</code> (domyślnie zwiniętą). Po rozwinięciu są tam <b>zamknięte sesje Claude Code i Codex</b> opisane promptem, który naprawdę wpisałeś; kliknięcie przywraca rozmowę poleceniem <code>claude --resume</code> lub <code>codex resume</code> w jej własnym katalogu roboczym. To druga połowa opcji <b>Nie przywracaj kart</b> powyżej — oryginalne przywracanie odtwarza powłokę, to odtwarza rozmowę. <b>Uruchomione wtedy serwery i procesy w tle nie wracają.</b>","agents.head":"Integracja agentów","agents.intro":"Sprawia, że każdy agent <b>sam zgłasza</b> swój stan, model i limity zużycia. To najdokładniejsze źródło, jakie ma panel boczny — bez tego zgadujemy z tekstu narysowanego na ekranie, a ocena odpowiednio się chwieje.","agents.unsupported.title":"Niedostępne na tej platformie","agents.unsupported.desc":"Skrypt powiadomień jest w PowerShellu, więc działa tylko w Windows. Stan jest zgadywany na podstawie wyjścia.","state.on":"Połączono","state.off":"Nie połączono","state.half":"Połączone połowicznie","btn.install":"Zainstaluj","btn.remove":"Usuń","claude.title":"Integracja z Claude","claude.desc":"Sesje Claude Code pojawiają się w panelu bocznym ze swoim <b>stanem</b> (pracuje · czeka na zatwierdzenie · gotowe) oraz <b>paskami modelu, konta i zużycia</b>. Instaluje razem haki i <code>statusLine</code> w <code>~/.claude/settings.json</code> i razem je usuwa. Innych haków nie rusza, a istniejącą już <code>statusLine</code> <b>uruchamia bez zmian</b> — to, co tam widzisz, pozostaje takie samo. Przed zapisem obok pliku zostaje kopia zapasowa.","codex.title":"Integracja z Codex","codex.desc":"Sesje Codex pojawiają się w panelu bocznym ze swoim <b>stanem</b> (pracuje · czeka na zatwierdzenie · gotowe · przerwane) oraz <b>paskami modelu, konta i zużycia</b>. Po instalacji otwórz Codex ponownie i przejrzyj oraz zatwierdź haki AgentDeck w <code>/hooks</code>.","codex.disabled":"Codex ma te haki wyłączone — dopóki ich nie włączysz, nic nie dociera: {events}. Otwórz Codex, uruchom <code>/hooks</code> i zatwierdź je.","root.head":"Profil katalogu roboczego","root.intro":"Tworzy profil, aby nowe karty zawsze otwierały się w tym samym katalogu. Zmiany działają po ponownym uruchomieniu Tabby.","root.use.title":"Używaj profilu katalogu roboczego","root.use.desc":"Włącz i podaj katalog — profil zostanie utworzony i stanie się domyślny.","root.name.title":"Nazwa profilu","root.cwd.title":"Katalog roboczy","root.cwd.desc":"Puste pole oznacza, że profil nie powstanie. Wpisując ręcznie, używaj ukośników (np. D:/Project), aby ominąć pułapki z ucieczką odwrotnych ukośników.","root.browse":"Przeglądaj","root.command.title":"Polecenie","diag.head":"Zgłoś problem","diag.intro":"Zbiera dzienniki diagnostyczne <b>do jednego pliku zip</b> i otwiera katalog, w którym ląduje. Zawiera: wersje wtyczki i Tabby oraz system, ustawienia powyżej i dwie najnowsze generacje <code>{path}</code>. W dziennikach są <b>tytuły kart i ścieżki, które otwierałeś</b> — przed wysłaniem możesz spokojnie otworzyć archiwum i sprawdzić.","diag.screen.title":"Dołącz surową zawartość ekranu","diag.screen.desc":"Włącz przy problemach z rysowaniem. Ekran terminala trafia tam dosłownie — widać w nim twoją pracę i kod — dlatego domyślnie jest wyłączone.","diag.collect.title":"Zbierz dzienniki","diag.collect.desc":"Wtyczka v{version}.","diag.made":"Utworzono: ","diag.btn":"Zbierz","dev.head":"Opcje dewelopera","dev.use.title":"Włącz opcje dewelopera","dev.use.desc":"Włącza <b>przeładowanie na żywo</b> — gdy <code>npm run build</code> nadpisze <code>dist/index.js</code>, okno przeładuje się na nową wtyczkę <b>z zachowaniem sesji</b> (karty podłączą się z powrotem do tego samego pty). Skrót <b>[dev] Przeładuj wtyczkę</b> również podlega temu przełącznikowi. Po wyłączeniu zmiana dist nic nie robi. Widoczne tylko przy instalacji z drzewa źródeł; wersja z npm tego nie ma.","dev.now.title":"Przeładuj teraz","dev.now.desc":"Przeładowuje bieżący dist bez budowania.","dev.btn":"Przeładuj",footer:"Reszta — proporcje okna, szerokość panelu bocznego, krycie, wykrywanie stanu, obsługa wejścia — jest przypięta do wartości domyślnych. Jeśli musisz coś zmienić, edytuj <code>agentDeck.*</code> bezpośrednio w pliku konfiguracyjnym. Skróty znajdziesz w zakładce <b>Skróty</b> jako <code>agentdeck-*</code>.","keys.head":"Skróty","keys.intro":"Klawisze ze strony głównej. Naciśnij <b>Zmień</b>, a potem nowy klawisz. Jeśli jest już zajęty — przez samego Tabby albo AgentDeck — dowiesz się, <b>z czym koliduje</b>, i możesz wybrać inny albo go przejąć. Działa od razu.","keys.change":"Zmień","keys.default":"Domyślne","keys.cancel":"Anuluj","keys.force":"Użyj mimo to","keys.press":"Naciśnij nowy klawisz… (Esc anuluje)","keys.conflict":"Koliduje z {names}. Jeśli użyjesz mimo to, klawisz zostanie tam usunięty.","keys.unbound":"nieprzypisany","keys.stock":"wbudowany w Tabby","keys.digit":"Ten musi kończyć się cyfrą 1–9 — cyfra to numer sesji. Naciśnij np. Alt+1, a 2…9 pójdą za nim.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, prawy przycisk myszy oraz <code>Ctrl+F</code> / <code>Ctrl+S</code> w panelu nie są skrótami i tu się ich nie zmienia.","keys.item.newtab":"Nowa karta w katalogu roboczym","keys.item.jump":"Skocz do N-tej sesji","keys.item.focus":"Fokus na listę sesji / powrót do terminala","keys.item.view":"Otwórz / zamknij panel podglądu","keys.item.repair":"Napraw ekran","keys.item.splitright":"Podziel obok siebie (nowy panel po prawej)","keys.item.splitbottom":"Podziel góra / dół (nowy panel na dole)","keys.item.closepane":"Zamknij aktywny podzielony panel","keys.item.newline":"Nowa linia bez wysyłania","keys.item.toggle":"Pasek boczny / 4:3 wł-wył","keys.item.viewmode":"Panel: Pliki ↔ Zmiany"}},3685(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Perfis de trabalho adicionais","root.choose.desc":"Guarde várias pastas de trabalho e escolha um perfil ao abrir um novo separador.","root.add":"Adicionar perfil","root.remove":"Remover perfil","layout.title":"Usar o layout do AgentDeck","layout.desc":"Desligue para remover a barra lateral e a largura fixa e voltar ao Tabby original.","reset.title":"Repor o layout","reset.desc":"Devolve a barra lateral ao estado inicial — encostada à direita, com a largura calculada a partir da proporção da janela.","reset.now":"Agora: encostada à {dock}, {size}.","reset.default":"Neste momento está tudo nos valores predefinidos.","reset.btn":"Repor","dock.left":"esquerda","dock.right":"direita","dock.top":"parte superior","dock.bottom":"parte inferior","size.width":"{px} px de largura","size.height":"{px} px de altura","size.auto":"largura automática","norecover.title":"Não restaurar separadores ao iniciar","norecover.desc":"O Tabby arranca vazio em vez de trazer de volta os separadores anteriores — o que volta é apenas a shell, e a sessão do Claude que estava lá dentro já terminou há muito. Desligue para o comportamento original (<code>recoverTabs</code>). Aplica-se a partir do próximo arranque.","resume.title":"Retomar sessões anteriores","resume.desc":"Acrescenta uma gaveta <code>⟲ Sessões anteriores</code> no fim de cada grupo (recolhida por predefinição). Ao abrir, aparecem as <b>sessões fechadas do Claude Code e do Codex</b> identificadas pelo prompt que escreveu de facto; ao clicar numa delas, a conversa volta com <code>claude --resume</code> ou <code>codex resume</code> na respetiva pasta de trabalho. É a outra metade de <b>Não restaurar separadores</b> acima — a recuperação original traz a shell, esta traz a conversa. <b>Os servidores e processos em segundo plano que tinha a correr não voltam.</b>","agents.head":"Integração dos agentes","agents.intro":"Faz com que cada agente <b>comunique ele próprio</b> o seu estado, o modelo e os limites de uso. É a fonte mais fiável que a barra lateral tem — sem ela adivinhamos a partir do texto desenhado no ecrã, e a leitura fica igualmente instável.","agents.unsupported.title":"Indisponível nesta plataforma","agents.unsupported.desc":"O script de notificação é em PowerShell, por isso só corre no Windows. O estado passa a ser deduzido a partir do output.","state.on":"Ligado","state.off":"Não ligado","state.half":"Ligado pela metade","btn.install":"Instalar","btn.remove":"Remover","claude.title":"Integração com o Claude","claude.desc":"As sessões do Claude Code aparecem na barra lateral com o seu <b>estado</b> (a trabalhar · à espera de aprovação · concluído) e as <b>barras de modelo, conta e utilização</b>. Instala em conjunto os hooks e a <code>statusLine</code> em <code>~/.claude/settings.json</code>, e remove-os em conjunto. Não mexe nos outros hooks, e uma <code>statusLine</code> que já tivesse é <b>executada tal como está</b>, pelo que o que vê aí não muda. Antes de escrever, é deixada uma cópia de segurança na mesma pasta.","codex.title":"Integração com o Codex","codex.desc":"As sessões do Codex aparecem na barra lateral com o seu <b>estado</b> (a trabalhar · à espera de aprovação · concluído · interrompido) e as <b>barras de modelo, conta e utilização</b>. Depois de instalar, volte a abrir o Codex e reveja e confie nos hooks do AgentDeck em <code>/hooks</code>.","codex.disabled":"O Codex tem estes hooks desligados — até os ligar não chega nada: {events}. Abra o Codex, execute <code>/hooks</code> e confie neles.","root.head":"Perfil da pasta de trabalho","root.intro":"Cria um perfil para que os separadores novos abram sempre na mesma pasta. As alterações aplicam-se depois de reiniciar o Tabby.","root.use.title":"Usar um perfil de pasta de trabalho","root.use.desc":"Ligue e preencha a pasta — o perfil é criado e passa a ser o predefinido.","root.name.title":"Nome do perfil","root.cwd.title":"Pasta de trabalho","root.cwd.desc":"Se deixar vazio não é criado nenhum perfil. Ao escrever à mão use barras normais (por exemplo D:/Project) para evitar as armadilhas de escape das barras invertidas.","root.browse":"Procurar","root.command.title":"Comando","diag.head":"Comunicar um problema","diag.intro":"Junta os registos de diagnóstico <b>num único zip</b> e abre a pasta onde ele fica. Contém: versões do plugin e do Tabby e o sistema operativo, as definições acima, e as duas gerações mais recentes de <code>{path}</code>. Os registos incluem <b>os títulos dos separadores e os caminhos que abriu</b> — pode abrir o zip e verificar antes de o enviar.","diag.screen.title":"Incluir também o ecrã em bruto","diag.screen.desc":"Ligue para problemas de desenho no ecrã. O ecrã do terminal entra tal e qual — o seu trabalho e o seu código ficam visíveis — por isso está desligado por predefinição.","diag.collect.title":"Juntar os registos","diag.collect.desc":"Plugin v{version}.","diag.made":"Criado: ","diag.btn":"Juntar","dev.head":"Opções de programador","dev.use.title":"Ativar as opções de programador","dev.use.desc":"Liga o <b>recarregamento em direto</b> — quando o <code>npm run build</code> reescreve o <code>dist/index.js</code>, a janela recarrega para o novo plugin <b>mantendo as suas sessões</b> (os separadores voltam a ligar-se ao mesmo pty). O atalho <b>[dev] Recarregar o plugin</b> também segue este interruptor. Desligado, alterar o dist não faz nada. Só aparece em instalações a partir do código-fonte; a versão do npm não tem esta funcionalidade.","dev.now.title":"Recarregar agora","dev.now.desc":"Recarrega o dist atual sem compilar.","dev.btn":"Recarregar",footer:"O resto — proporção da janela, largura da barra lateral, opacidade, deteção de estado, tratamento da entrada — está fixado nos valores predefinidos. Se precisar de mudar algum, edite <code>agentDeck.*</code> diretamente no ficheiro de configuração. Os atalhos estão no separador <b>Atalhos</b> como <code>agentdeck-*</code>.","keys.head":"Atalhos","keys.intro":"As teclas da página inicial. Carregue em <b>Alterar</b> e depois na nova tecla. Se já estiver ocupada — pelo próprio Tabby ou pelo AgentDeck — é-lhe dito <b>com o que colide</b> e pode escolher outra ou ficar com ela. Aplica-se de imediato.","keys.change":"Alterar","keys.default":"Padrão","keys.cancel":"Cancelar","keys.force":"Usar mesmo assim","keys.press":"Carregue na nova tecla… (Esc cancela)","keys.conflict":"Colide com {names}. Se usar mesmo assim, a tecla é retirada de lá.","keys.unbound":"sem atribuição","keys.stock":"nativo do Tabby","keys.digit":"Este tem de terminar num dígito 1–9 — o dígito é o número da sessão. Carregue p. ex. em Alt+1 e 2…9 seguem.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, o clique direito e <code>Ctrl+F</code> / <code>Ctrl+S</code> do painel não são atalhos e não se alteram aqui.","keys.item.newtab":"Novo separador na raiz de trabalho","keys.item.jump":"Ir para a sessão N","keys.item.focus":"Foco na lista de sessões / voltar ao terminal","keys.item.view":"Abrir / fechar o painel de pré-visualização","keys.item.repair":"Reparar o ecrã","keys.item.splitright":"Dividir lado a lado (novo painel à direita)","keys.item.splitbottom":"Dividir em cima / em baixo (novo painel em baixo)","keys.item.closepane":"Fechar o painel dividido ativo","keys.item.newline":"Nova linha sem enviar","keys.item.toggle":"Barra lateral / 4:3 ligar-desligar","keys.item.viewmode":"Painel: Ficheiros ↔ Alterações"}},2904(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Дополнительные рабочие профили","root.choose.desc":"Сохраните несколько рабочих папок и выбирайте профиль при открытии новой вкладки.","root.add":"Добавить профиль","root.remove":"Удалить профиль","layout.title":"Использовать раскладку AgentDeck","layout.desc":"Выключите — исчезнут боковая панель и фиксированная ширина, вернётся обычный вид Tabby.","reset.title":"Сбросить раскладку","reset.desc":"Возвращает боковую панель в исходное состояние — закреплена справа, ширина рассчитана из пропорций окна.","reset.now":"Сейчас: закреплена {dock}, {size}.","reset.default":"Сейчас всё в значениях по умолчанию.","reset.btn":"Сбросить","dock.left":"слева","dock.right":"справа","dock.top":"сверху","dock.bottom":"снизу","size.width":"ширина {px} px","size.height":"высота {px} px","size.auto":"ширина автоматически","norecover.title":"Не восстанавливать вкладки при запуске","norecover.desc":"Tabby запускается пустым вместо возврата прежних вкладок — возвращается только оболочка, а сессия Claude внутри неё давно завершена. Выключите, чтобы вернуть штатное поведение (<code>recoverTabs</code>). Действует со следующего запуска.","resume.title":"Продолжить прошлые сессии","resume.desc":"Добавляет в конец каждой группы ящик <code>⟲ Прошлые сессии</code> (по умолчанию свёрнут). Внутри перечислены <b>закрытые сессии Claude Code и Codex</b> — с тем запросом, который вы на самом деле набирали; по клику разговор возвращается через <code>claude --resume</code> или <code>codex resume</code> в своей рабочей папке. Это вторая половина пункта <b>Не восстанавливать вкладки</b> выше: штатное восстановление возвращает оболочку, а это — разговор. <b>Запущенные тогда серверы и фоновые процессы не возвращаются.</b>","agents.head":"Подключение агентов","agents.intro":"Позволяет каждому агенту <b>самому сообщать</b> своё состояние, модель и лимиты. Это самый точный источник для боковой панели — без него мы угадываем по тексту, нарисованному на экране, и оценка соответственно плывёт.","agents.unsupported.title":"Недоступно на этой платформе","agents.unsupported.desc":"Скрипт уведомлений написан на PowerShell, поэтому работает только в Windows. Состояние определяется по выводу.","state.on":"Подключено","state.off":"Не подключено","state.half":"Подключено наполовину","btn.install":"Установить","btn.remove":"Удалить","claude.title":"Подключение Claude","claude.desc":"Сессии Claude Code появляются в боковой панели с <b>состоянием</b> (работает · ждёт подтверждения · готово) и <b>полосами модели, аккаунта и лимитов</b>. Хуки и <code>statusLine</code> в <code>~/.claude/settings.json</code> ставятся вместе и удаляются вместе. Другие хуки не трогаются, а уже имевшаяся <code>statusLine</code> <b>запускается как есть</b> — то, что вы там видите, не меняется. Перед записью рядом с файлом сохраняется резервная копия.","codex.title":"Подключение Codex","codex.desc":"Сессии Codex появляются в боковой панели с <b>состоянием</b> (работает · ждёт подтверждения · готово · прервано) и <b>полосами модели, аккаунта и лимитов</b>. После установки откройте Codex заново и проверьте и подтвердите хуки AgentDeck в <code>/hooks</code>.","codex.disabled":"Codex отключил эти хуки — пока вы их не включите, ничего не приходит: {events}. Откройте Codex, выполните <code>/hooks</code> и подтвердите их.","root.head":"Профиль рабочей папки","root.intro":"Создаёт профиль, чтобы новые вкладки всегда открывались в одной и той же папке. Изменения вступают в силу после перезапуска Tabby.","root.use.title":"Использовать профиль рабочей папки","root.use.desc":"Включите и укажите папку — профиль будет создан и станет профилем по умолчанию.","root.name.title":"Имя профиля","root.cwd.title":"Рабочая папка","root.cwd.desc":"Оставьте пустым — профиль не создаётся. При вводе вручную используйте прямые слеши (например D:/Project), чтобы не попасть в ловушки экранирования обратных слешей.","root.browse":"Обзор","root.command.title":"Команда","diag.head":"Сообщить о проблеме","diag.intro":"Собирает диагностические журналы <b>в один zip</b> и открывает папку, где он появился. Внутри: версии плагина и Tabby, ОС, настройки выше и два последних поколения <code>{path}</code>. В журналах есть <b>заголовки вкладок и пути, которые вы открывали</b> — перед отправкой архив можно открыть и проверить.","diag.screen.title":"Приложить и сырой экран","diag.screen.desc":"Включайте при проблемах с отрисовкой. Экран терминала попадает дословно — в нём видны ваша работа и код, — поэтому по умолчанию выключено.","diag.collect.title":"Собрать журналы","diag.collect.desc":"Плагин v{version}.","diag.made":"Создано: ","diag.btn":"Собрать","dev.head":"Параметры разработчика","dev.use.title":"Включить параметры разработчика","dev.use.desc":"Включает <b>горячую перезагрузку</b>: как только <code>npm run build</code> перезапишет <code>dist/index.js</code>, окно перезагрузится на новый плагин <b>с сохранением сессий</b> (вкладки снова подцепятся к тому же pty). Горячая клавиша <b>[dev] Перезагрузить плагин</b> тоже подчиняется этому переключателю. При выключенном изменение dist ничего не делает. Видно только при установке из исходников; в сборке с npm этого нет.","dev.now.title":"Перезагрузить сейчас","dev.now.desc":"Перезагружает текущий dist без сборки.","dev.btn":"Перезагрузить",footer:"Остальное — пропорции окна, ширина боковой панели, прозрачность, определение состояния, обработка ввода — закреплено на значениях по умолчанию. Если нужно что-то поменять, правьте <code>agentDeck.*</code> прямо в файле конфигурации. Горячие клавиши — на вкладке <b>Горячие клавиши</b> под именами <code>agentdeck-*</code>.","keys.head":"Горячие клавиши","keys.intro":"Клавиши с главной страницы. Нажмите <b>Изменить</b>, затем новую клавишу. Если она уже занята — самим Tabby или AgentDeck — вам скажут, <b>с чем она конфликтует</b>, и можно выбрать другую или забрать эту. Применяется сразу.","keys.change":"Изменить","keys.default":"По умолчанию","keys.cancel":"Отмена","keys.force":"Всё равно использовать","keys.press":"Нажмите новую клавишу… (Esc — отмена)","keys.conflict":"Конфликтует с {names}. Если использовать всё равно, клавиша будет снята оттуда.","keys.unbound":"не назначено","keys.stock":"встроенная в Tabby","keys.digit":"Здесь сочетание должно заканчиваться цифрой 1–9 — цифра и есть номер сессии. Нажмите, например, Alt+1, и 2…9 подстроятся.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, правый клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> в панели — не горячие клавиши, здесь они не меняются.","keys.item.newtab":"Новая вкладка в рабочем корне","keys.item.jump":"Перейти к N-й сессии","keys.item.focus":"Фокус на список сессий / назад в терминал","keys.item.view":"Открыть / закрыть панель предпросмотра","keys.item.repair":"Починить экран","keys.item.splitright":"Разделить по горизонтали (новая панель справа)","keys.item.splitbottom":"Разделить по вертикали (новая панель снизу)","keys.item.closepane":"Закрыть активную разделённую панель","keys.item.newline":"Перенос строки без отправки","keys.item.toggle":"Боковая панель / 4:3 вкл-выкл","keys.item.viewmode":"Панель: Файлы ↔ Изменения"}},4995(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Rekeningnaam (opsioneel)","목록에서 삭제":"Verwyder uit lys","이메일 주소 전체를 입력하세요.":"Voer die volledige e-posadres in.","계정 추가":"Voeg rekening by","계정 (이메일)":"Rekening (e-pos)",비밀번호:"Wagwoord","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Die rekening en wagwoord word as gewone teks op hierdie rekenaar gestoor.",저장:"Stoor",취소:"Kanselleer","계정과 비밀번호를 입력하세요.":"Voer die rekening en wagwoord in.","이미 등록된 계정입니다.":"Hierdie rekening is reeds gestoor.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kon nie die rekening stoor nie. Probeer weer.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kon nie die rekeninglêer lees nie. Kontroleer die JSON-formaat.","+ 버튼으로 계정을 추가하세요.":"Gebruik die +-knoppie om ’n rekening by te voeg.","현재 탭에서 선택한 계정으로 전환합니다.":"Skakel in hierdie oortjie na die gekose rekening.","세션 검색 (제목 · 작업이름 · 폴더)":"Soek sessies (titel · taak · gids)","검색·필터 지우기 (Esc)":"Vee soektog en filters uit (Esc)","계정 선택":"Kies rekening","새 탭":"Nuwe oortjie","+ 새 탭":"+ Nuwe oortjie",설정:"Instellings","화면 복구 (모든 탭 다시 그리기)":"Herstel vertoning (herteken alle oortjies)","미리보기 패널 (md · 이미지 · 표)":"Voorskoupaneel (Markdown · beelde · tabelle)",진행중:"Besig",승인대기:"Wag op goedkeuring","한도 도달":"Gebruikslimiet bereik",완료:"Klaar",오류:"Fout",대기:"Onaktief",기타:"Ander","지난 세션":"Vorige sessies",어제:"Gister","● 열림":"● Oop","탭 닫기":"Sluit oortjie","(제목 없음)":"(Titelloos)","작업 이름":"Taaknaam",닫기:"Sluit",모름:"Onbekend","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Geslote Claude Code · Codex-sessies — klik om te hervat","검색어와 맞는 지난 세션이 없다":"Geen vorige sessies pas by jou soektog nie","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Druk Esc of ✕ om alle sessies te wys","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Skakel statussortering in Instellings af om oortjies te herrangskik","이 탭으로 이동":"Gaan na oortjie","새 탭에서 이어받기":"Hervat in nuwe oortjie","분기해서 이어받기":"Vertak gesprek","세션 ID 복사":"Kopieer sessie-ID","목록에서 숨기기":"Versteek uit lys","↺ 자동 감지로":"↺ Bespeur outomaties","↻ 화면 복구":"↻ Herstel vertoning","패널에 띄우기":"Maak in paneel oop","경로 붙여넣기":"Plak pad","아무것도 하지 않는다":"Kanselleer","다시 묻지 않기":"Moenie weer vra nie","{name} 을 어떻게 할까요?":"Wat wil jy met {name} doen?","{provider} 계정 선택":"Kies {provider}-rekening","{provider} 계정":"{provider}-rekeninge","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Gaan voort met hierdie gesprek in ’n nuwe oortjie met die gekose rekening.","선택한 계정으로 새 대화를 엽니다.":"Begin ’n nuwe gesprek met die gekose rekening.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Geen gestoorde rekeninge nie. Voeg rekeninge by accounts.json."," · 현재 계정":" · Huidige rekening","잔량 조회 중…":"Laai gebruik…","계정 저장 폴더를 준비하지 못했습니다.":"Kon nie die rekeninggids voorberei nie.","사용량 정보 없음":"Gebruik nie beskikbaar nie","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Die oorspronklike oortjie is gesluit. Maak die rekeninglys weer oop.","{name} 인증 확인 중…":"Kontroleer verifikasie vir {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: meld in die blaaier aan. Verifikasie sal outomaties gestoor word.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Verifikasie gestoor. Die oorspronklike oortjie is gesluit; kies die rekening in ’n nuwe gesprek.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kon nie van rekening verander nie. Probeer weer.","새 계정 탭을 열지 못했습니다.":"Kon nie die rekeningoortjie oopmaak nie.","세션 {id}":"Sessie {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Reeds oop — klik om na die oortjie te gaan","누르면 새 탭에서 이어받는다 ({id})":"Klik om in ’n nuwe oortjie te hervat ({id})","작업 폴더: {cwd}":"Werkgids: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Net die gesprek word hervat; bedieners en agtergrondprosesse word nie herbegin nie.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Geen sessies pas by {filter} nie ({total} in totaal)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Uitgevou vir soekresultate (vee soektog uit om in te vou)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} oortjies) — klik om in/uit te vou","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} oortjies sonder ’n bekende werkgids — klik om in/uit te vou","탭 {count}개":"{count} oortjies","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik om filter uit te vee","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik om te filtreer","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}u {m}min","계정: {value}":"Rekening: {value}","버전: {value}":"Weergawe: {value}","폴더: {value}":"Gids: {value}","{tool} 권한":"{tool}-toestemming","입력 대기":"Wag op invoer","플랜 승인":"Plangoedkeuring","질문 응답":"Antwoord op vraag","{time} 리셋":"Herstel: {time}"}},1771(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Име на акаунта (незадължително)","목록에서 삭제":"Премахване от списъка","이메일 주소 전체를 입력하세요.":"Въведете пълния имейл адрес.","계정 추가":"Добавяне на акаунт","계정 (이메일)":"Акаунт (имейл)",비밀번호:"Парола","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Акаунтът и паролата се записват като обикновен текст на този компютър.",저장:"Запазване",취소:"Отказ","계정과 비밀번호를 입력하세요.":"Въведете акаунт и парола.","이미 등록된 계정입니다.":"Този акаунт вече е запазен.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Акаунтът не може да бъде запазен. Опитайте отново.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Файлът с акаунти не може да бъде прочетен. Проверете JSON формата.","+ 버튼으로 계정을 추가하세요.":"Използвайте бутона +, за да добавите акаунт.","현재 탭에서 선택한 계정으로 전환합니다.":"Превключване към избрания акаунт в текущия раздел.","세션 검색 (제목 · 작업이름 · 폴더)":"Търсене на сесии (заглавие · задача · папка)","검색·필터 지우기 (Esc)":"Изчистване на търсенето и филтрите (Esc)","계정 선택":"Избор на акаунт","새 탭":"Нов раздел","+ 새 탭":"+ Нов раздел",설정:"Настройки","화면 복구 (모든 탭 다시 그리기)":"Поправка на изгледа (прерисуване на всички раздели)","미리보기 패널 (md · 이미지 · 표)":"Панел за преглед (Markdown · изображения · таблици)",진행중:"В процес",승인대기:"Чака одобрение","한도 도달":"Лимитът за използване е достигнат",완료:"Готово",오류:"Грешка",대기:"Неактивно",기타:"Други","지난 세션":"Предишни сесии",어제:"Вчера","● 열림":"● Отворена","탭 닫기":"Затваряне на раздела","(제목 없음)":"(Без заглавие)","작업 이름":"Име на задачата",닫기:"Затваряне",모름:"Неизвестно","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Затворени сесии на Claude Code · Codex — щракнете за продължаване","검색어와 맞는 지난 세션이 없다":"Няма предишни сесии, съответстващи на търсенето","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Натиснете Esc или ✕, за да покажете всички сесии","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Изключете сортирането по състояние в настройките, за да пренаредите разделите","이 탭으로 이동":"Към раздела","새 탭에서 이어받기":"Продължаване в нов раздел","분기해서 이어받기":"Разклоняване на разговора","세션 ID 복사":"Копиране на ID на сесията","목록에서 숨기기":"Скриване от списъка","↺ 자동 감지로":"↺ Автоматично откриване","↻ 화면 복구":"↻ Поправка на изгледа","패널에 띄우기":"Отваряне в панела","경로 붙여넣기":"Поставяне на пътя","아무것도 하지 않는다":"Отказ","다시 묻지 않기":"Без повторно питане","{name} 을 어떻게 할까요?":"Какво искате да направите с {name}?","{provider} 계정 선택":"Избор на акаунт за {provider}","{provider} 계정":"Акаунти за {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продължете този разговор в нов раздел с избрания акаунт.","선택한 계정으로 새 대화를 엽니다.":"Започнете нов разговор с избрания акаунт.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Няма запазени акаунти. Добавете акаунти в accounts.json."," · 현재 계정":" · Текущ акаунт","잔량 조회 중…":"Зареждане на използването…","계정 저장 폴더를 준비하지 못했습니다.":"Папката на акаунта не можа да бъде подготвена.","사용량 정보 없음":"Данните за използването са недостъпни","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Първоначалният раздел е затворен. Отворете отново списъка с акаунти.","{name} 인증 확인 중…":"Проверка на удостоверяването за {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: влезте през браузъра. Удостоверяването ще бъде запазено автоматично.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Удостоверяването е запазено. Първоначалният раздел е затворен; изберете акаунта в нов разговор.","계정 전환에 실패했습니다. 다시 선택하세요.":"Акаунтът не можа да бъде сменен. Опитайте отново.","새 계정 탭을 열지 못했습니다.":"Разделът на акаунта не можа да бъде отворен.","세션 {id}":"Сесия {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Вече е отворена — щракнете, за да отидете в раздела","누르면 새 탭에서 이어받는다 ({id})":"Щракнете за продължаване в нов раздел ({id})","작업 폴더: {cwd}":"Работна папка: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Продължава само разговорът; сървърите и фоновите процеси не се рестартират.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Няма сесии за {filter} (общо {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Разгънато за резултатите (изчистете търсенето за свиване)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} раздела) — щракнете за свиване/разгъване","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} раздела без известна работна папка — щракнете за свиване/разгъване","탭 {count}개":"{count} раздела","{status} {count} — 클릭하면 필터 해제":"{status} {count} — щракнете за изчистване на филтъра","{status} {count} — 클릭하면 이 상태만":"{status} {count} — щракнете за филтриране","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Акаунт: {value}","버전: {value}":"Версия: {value}","폴더: {value}":"Папка: {value}","{tool} 권한":"Разрешение за {tool}","입력 대기":"Чака въвеждане","플랜 승인":"Одобрение на план","질문 응답":"Отговор на въпрос","{time} 리셋":"Нулиране: {time}"}},5758(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Název účtu (volitelné)","목록에서 삭제":"Odebrat ze seznamu","이메일 주소 전체를 입력하세요.":"Zadejte celou e-mailovou adresu.","계정 추가":"Přidat účet","계정 (이메일)":"Účet (e-mail)",비밀번호:"Heslo","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Účet a heslo se v tomto počítači ukládají jako prostý text.",저장:"Uložit",취소:"Zrušit","계정과 비밀번호를 입력하세요.":"Zadejte účet a heslo.","이미 등록된 계정입니다.":"Tento účet je již uložen.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Účet nelze uložit. Zkuste to znovu.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Soubor účtů nelze přečíst. Zkontrolujte formát JSON.","+ 버튼으로 계정을 추가하세요.":"Účet přidáte tlačítkem +.","현재 탭에서 선택한 계정으로 전환합니다.":"Přepnout na vybraný účet v aktuální kartě.","세션 검색 (제목 · 작업이름 · 폴더)":"Hledat relace (název · úkol · složka)","검색·필터 지우기 (Esc)":"Vymazat hledání a filtry (Esc)","계정 선택":"Vybrat účet","새 탭":"Nová karta","+ 새 탭":"+ Nová karta",설정:"Nastavení","화면 복구 (모든 탭 다시 그리기)":"Opravit zobrazení (překreslit všechny karty)","미리보기 패널 (md · 이미지 · 표)":"Panel náhledu (Markdown · obrázky · tabulky)",진행중:"Probíhá",승인대기:"Čeká na schválení","한도 도달":"Dosažen limit využití",완료:"Hotovo",오류:"Chyba",대기:"Nečinné",기타:"Ostatní","지난 세션":"Předchozí relace",어제:"Včera","● 열림":"● Otevřeno","탭 닫기":"Zavřít kartu","(제목 없음)":"(Bez názvu)","작업 이름":"Název úkolu",닫기:"Zavřít",모름:"Neznámé","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zavřené relace Claude Code · Codex — kliknutím pokračujte","검색어와 맞는 지난 세션이 없다":"Hledání neodpovídá žádná předchozí relace","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Stisknutím Esc nebo ✕ zobrazíte všechny relace","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Pro změnu pořadí karet vypněte v nastavení řazení podle stavu","이 탭으로 이동":"Přejít na kartu","새 탭에서 이어받기":"Pokračovat na nové kartě","분기해서 이어받기":"Rozvětvit konverzaci","세션 ID 복사":"Kopírovat ID relace","목록에서 숨기기":"Skrýt ze seznamu","↺ 자동 감지로":"↺ Rozpoznávat automaticky","↻ 화면 복구":"↻ Opravit zobrazení","패널에 띄우기":"Otevřít v panelu","경로 붙여넣기":"Vložit cestu","아무것도 하지 않는다":"Zrušit","다시 묻지 않기":"Příště se neptat","{name} 을 어떻게 할까요?":"Co chcete udělat s {name}?","{provider} 계정 선택":"Vybrat účet {provider}","{provider} 계정":"Účty {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Pokračujte v této konverzaci na nové kartě s vybraným účtem.","선택한 계정으로 새 대화를 엽니다.":"Zahajte novou konverzaci s vybraným účtem.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Žádné uložené účty. Přidejte je do accounts.json."," · 현재 계정":" · Aktuální účet","잔량 조회 중…":"Načítání využití…","계정 저장 폴더를 준비하지 못했습니다.":"Nepodařilo se připravit složku účtu.","사용량 정보 없음":"Údaje o využití nejsou dostupné","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Původní karta byla zavřena. Znovu otevřete seznam účtů.","{name} 인증 확인 중…":"Kontrola ověření pro {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: přihlaste se v prohlížeči. Ověření se automaticky uloží.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Ověření uloženo. Původní karta byla zavřena; vyberte účet v nové konverzaci.","계정 전환에 실패했습니다. 다시 선택하세요.":"Účet se nepodařilo přepnout. Zkuste to znovu.","새 계정 탭을 열지 못했습니다.":"Kartu účtu se nepodařilo otevřít.","세션 {id}":"Relace {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Již otevřeno — kliknutím přejdete na kartu","누르면 새 탭에서 이어받는다 ({id})":"Kliknutím pokračujte na nové kartě ({id})","작업 폴더: {cwd}":"Pracovní složka: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Obnoví se pouze konverzace; servery ani procesy na pozadí se nerestartují.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Žádné relace neodpovídají {filter} (celkem {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Rozbaleno pro výsledky hledání (vymažte hledání pro sbalení)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (karet: {count}) — kliknutím sbalit/rozbalit","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Karty bez známé pracovní složky: {count} — kliknutím sbalit/rozbalit","탭 {count}개":"Karet: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — kliknutím zrušit filtr","{status} {count} — 클릭하면 이 상태만":"{status} {count} — kliknutím filtrovat","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Účet: {value}","버전: {value}":"Verze: {value}","폴더: {value}":"Složka: {value}","{tool} 권한":"Oprávnění pro {tool}","입력 대기":"Čeká na vstup","플랜 승인":"Schválení plánu","질문 응답":"Odpověď na otázku","{time} 리셋":"Obnovení: {time}"}},8459(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontonavn (valgfrit)","목록에서 삭제":"Fjern fra listen","이메일 주소 전체를 입력하세요.":"Indtast hele e-mailadressen.","계정 추가":"Tilføj konto","계정 (이메일)":"Konto (e-mail)",비밀번호:"Adgangskode","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto og adgangskode gemmes som klartekst på denne pc.",저장:"Gem",취소:"Annuller","계정과 비밀번호를 입력하세요.":"Indtast konto og adgangskode.","이미 등록된 계정입니다.":"Denne konto er allerede gemt.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kunne ikke gemme kontoen. Prøv igen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kunne ikke læse kontofilen. Kontrollér JSON-formatet.","+ 버튼으로 계정을 추가하세요.":"Brug knappen + til at tilføje en konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Skift til den valgte konto i denne fane.","세션 검색 (제목 · 작업이름 · 폴더)":"Søg i sessioner (titel · opgave · mappe)","검색·필터 지우기 (Esc)":"Ryd søgning og filtre (Esc)","계정 선택":"Vælg konto","새 탭":"Ny fane","+ 새 탭":"+ Ny fane",설정:"Indstillinger","화면 복구 (모든 탭 다시 그리기)":"Reparer visning (gentegn alle faner)","미리보기 패널 (md · 이미지 · 표)":"Forhåndsvisning (Markdown · billeder · tabeller)",진행중:"Arbejder",승인대기:"Afventer godkendelse","한도 도달":"Forbrugsgrænse nået",완료:"Færdig",오류:"Fejl",대기:"Inaktiv",기타:"Andre","지난 세션":"Tidligere sessioner",어제:"I går","● 열림":"● Åben","탭 닫기":"Luk fane","(제목 없음)":"(Uden titel)","작업 이름":"Opgavenavn",닫기:"Luk",모름:"Ukendt","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Lukkede Claude Code · Codex-sessioner — klik for at fortsætte","검색어와 맞는 지난 세션이 없다":"Ingen tidligere sessioner matcher søgningen","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tryk Esc eller ✕ for at vise alle sessioner","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Slå statussortering fra i Indstillinger for at omarrangere faner","이 탭으로 이동":"Gå til fane","새 탭에서 이어받기":"Fortsæt i ny fane","분기해서 이어받기":"Forgren samtale","세션 ID 복사":"Kopiér sessions-ID","목록에서 숨기기":"Skjul fra listen","↺ 자동 감지로":"↺ Registrer automatisk","↻ 화면 복구":"↻ Reparer visning","패널에 띄우기":"Åbn i panel","경로 붙여넣기":"Indsæt sti","아무것도 하지 않는다":"Annuller","다시 묻지 않기":"Spørg ikke igen","{name} 을 어떻게 할까요?":"Hvad vil du gøre med {name}?","{provider} 계정 선택":"Vælg {provider}-konto","{provider} 계정":"{provider}-konti","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Fortsæt denne samtale i en ny fane med den valgte konto.","선택한 계정으로 새 대화를 엽니다.":"Start en ny samtale med den valgte konto.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Ingen gemte konti. Tilføj konti i accounts.json."," · 현재 계정":" · Aktuel konto","잔량 조회 중…":"Indlæser forbrug…","계정 저장 폴더를 준비하지 못했습니다.":"Kunne ikke klargøre kontomappen.","사용량 정보 없음":"Forbrug er ikke tilgængeligt","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Den oprindelige fane blev lukket. Åbn kontolisten igen.","{name} 인증 확인 중…":"Kontrollerer godkendelse for {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: log ind i browseren. Godkendelsen gemmes automatisk.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Godkendelse gemt. Den oprindelige fane blev lukket; vælg kontoen i en ny samtale.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kunne ikke skifte konto. Prøv igen.","새 계정 탭을 열지 못했습니다.":"Kunne ikke åbne kontofanen.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Allerede åben — klik for at gå til fanen","누르면 새 탭에서 이어받는다 ({id})":"Klik for at fortsætte i en ny fane ({id})","작업 폴더: {cwd}":"Arbejdsmappe: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Kun samtalen genoptages; servere og baggrundsprocesser genstartes ikke.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Ingen sessioner matcher {filter} ({total} i alt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Udvidet for søgeresultater (ryd søgningen for at folde sammen)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} faner) — klik for at folde sammen/ud","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} faner uden kendt arbejdsmappe — klik for at folde sammen/ud","탭 {count}개":"{count} faner","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik for at rydde filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik for at filtrere","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}t {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Mappe: {value}","{tool} 권한":"Tilladelse til {tool}","입력 대기":"Afventer input","플랜 승인":"Godkendelse af plan","질문 응답":"Svar på spørgsmål","{time} 리셋":"Nulstilling: {time}"}},2255(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontoname (optional)","목록에서 삭제":"Aus Liste entfernen","이메일 주소 전체를 입력하세요.":"Geben Sie die vollständige E-Mail-Adresse ein.","계정 추가":"Konto hinzufügen","계정 (이메일)":"Konto (E-Mail)",비밀번호:"Passwort","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto und Passwort werden auf diesem PC im Klartext gespeichert.",저장:"Speichern",취소:"Abbrechen","계정과 비밀번호를 입력하세요.":"Konto und Passwort eingeben.","이미 등록된 계정입니다.":"Dieses Konto ist bereits gespeichert.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Konto konnte nicht gespeichert werden. Erneut versuchen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kontodatei konnte nicht gelesen werden. JSON-Format prüfen.","+ 버튼으로 계정을 추가하세요.":"Mit der Schaltfläche + ein Konto hinzufügen.","현재 탭에서 선택한 계정으로 전환합니다.":"In diesem Tab zum ausgewählten Konto wechseln.","세션 검색 (제목 · 작업이름 · 폴더)":"Sitzungen suchen (Titel · Aufgabe · Ordner)","검색·필터 지우기 (Esc)":"Suche und Filter löschen (Esc)","계정 선택":"Konto auswählen","새 탭":"Neuer Tab","+ 새 탭":"+ Neuer Tab",설정:"Einstellungen","화면 복구 (모든 탭 다시 그리기)":"Anzeige reparieren (alle Tabs neu zeichnen)","미리보기 패널 (md · 이미지 · 표)":"Vorschaufenster (Markdown · Bilder · Tabellen)",진행중:"In Bearbeitung",승인대기:"Wartet auf Genehmigung","한도 도달":"Nutzungslimit erreicht",완료:"Fertig",오류:"Fehler",대기:"Inaktiv",기타:"Sonstige","지난 세션":"Frühere Sitzungen",어제:"Gestern","● 열림":"● Offen","탭 닫기":"Tab schließen","(제목 없음)":"(Ohne Titel)","작업 이름":"Aufgabenname",닫기:"Schließen",모름:"Unbekannt","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Geschlossene Claude Code · Codex-Sitzungen — zum Fortsetzen klicken","검색어와 맞는 지난 세션이 없다":"Keine früheren Sitzungen entsprechen der Suche","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Esc oder ✕ drücken, um alle Sitzungen anzuzeigen","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Zum Umsortieren der Tabs die Statussortierung in den Einstellungen deaktivieren","이 탭으로 이동":"Zum Tab wechseln","새 탭에서 이어받기":"In neuem Tab fortsetzen","분기해서 이어받기":"Gespräch verzweigen","세션 ID 복사":"Sitzungs-ID kopieren","목록에서 숨기기":"Aus Liste ausblenden","↺ 자동 감지로":"↺ Automatisch erkennen","↻ 화면 복구":"↻ Anzeige reparieren","패널에 띄우기":"Im Fenster öffnen","경로 붙여넣기":"Pfad einfügen","아무것도 하지 않는다":"Abbrechen","다시 묻지 않기":"Nicht erneut fragen","{name} 을 어떻게 할까요?":"Was möchten Sie mit {name} tun?","{provider} 계정 선택":"{provider}-Konto auswählen","{provider} 계정":"{provider}-Konten","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Dieses Gespräch mit dem ausgewählten Konto in einem neuen Tab fortsetzen.","선택한 계정으로 새 대화를 엽니다.":"Ein neues Gespräch mit dem ausgewählten Konto beginnen.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Keine gespeicherten Konten. Konten in accounts.json hinzufügen."," · 현재 계정":" · Aktuelles Konto","잔량 조회 중…":"Nutzung wird geladen…","계정 저장 폴더를 준비하지 못했습니다.":"Der Kontoordner konnte nicht vorbereitet werden.","사용량 정보 없음":"Nutzungsdaten nicht verfügbar","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Der ursprüngliche Tab wurde geschlossen. Kontoliste erneut öffnen.","{name} 인증 확인 중…":"Authentifizierung für {name} wird geprüft…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: Im Browser anmelden. Die Authentifizierung wird automatisch gespeichert.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentifizierung gespeichert. Der ursprüngliche Tab wurde geschlossen; das Konto in einem neuen Gespräch auswählen.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kontowechsel fehlgeschlagen. Bitte erneut versuchen.","새 계정 탭을 열지 못했습니다.":"Der Konto-Tab konnte nicht geöffnet werden.","세션 {id}":"Sitzung {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Bereits geöffnet — zum Tab wechseln","누르면 새 탭에서 이어받는다 ({id})":"Klicken, um in neuem Tab fortzusetzen ({id})","작업 폴더: {cwd}":"Arbeitsordner: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Nur das Gespräch wird fortgesetzt; Server und Hintergrundprozesse werden nicht neu gestartet.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Keine Sitzungen für {filter} ({total} insgesamt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Für Suchergebnisse aufgeklappt (Suche löschen zum Einklappen)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} Tabs) — zum Ein-/Ausklappen klicken","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} Tabs ohne bekannten Arbeitsordner — zum Ein-/Ausklappen klicken","탭 {count}개":"{count} Tabs","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klicken, um den Filter zu löschen","{status} {count} — 클릭하면 이 상태만":"{status} {count} — zum Filtern klicken","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Ordner: {value}","{tool} 권한":"Berechtigung für {tool}","입력 대기":"Wartet auf Eingabe","플랜 승인":"Plangenehmigung","질문 응답":"Frage beantworten","{time} 리셋":"Zurücksetzung: {time}"}},1948(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nombre de cuenta (opcional)","목록에서 삭제":"Quitar de la lista","이메일 주소 전체를 입력하세요.":"Introduce la dirección de correo completa.","계정 추가":"Añadir cuenta","계정 (이메일)":"Cuenta (correo)",비밀번호:"Contraseña","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"La cuenta y la contraseña se guardan en texto sin cifrar en este PC.",저장:"Guardar",취소:"Cancelar","계정과 비밀번호를 입력하세요.":"Introduce la cuenta y la contraseña.","이미 등록된 계정입니다.":"Esta cuenta ya está guardada.","계정을 저장하지 못했습니다. 다시 시도하세요.":"No se pudo guardar la cuenta. Inténtalo de nuevo.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"No se pudo leer el archivo de cuentas. Comprueba el formato JSON.","+ 버튼으로 계정을 추가하세요.":"Usa el botón + para añadir una cuenta.","현재 탭에서 선택한 계정으로 전환합니다.":"Cambiar a la cuenta seleccionada en esta pestaña.","세션 검색 (제목 · 작업이름 · 폴더)":"Buscar sesiones (título · tarea · carpeta)","검색·필터 지우기 (Esc)":"Borrar búsqueda y filtros (Esc)","계정 선택":"Seleccionar cuenta","새 탭":"Nueva pestaña","+ 새 탭":"+ Nueva pestaña",설정:"Ajustes","화면 복구 (모든 탭 다시 그리기)":"Reparar pantalla (redibujar todas las pestañas)","미리보기 패널 (md · 이미지 · 표)":"Panel de vista previa (Markdown · imágenes · tablas)",진행중:"En curso",승인대기:"Esperando aprobación","한도 도달":"Límite de uso alcanzado",완료:"Finalizado",오류:"Error",대기:"Inactivo",기타:"Otros","지난 세션":"Sesiones anteriores",어제:"Ayer","● 열림":"● Abierta","탭 닫기":"Cerrar pestaña","(제목 없음)":"(Sin título)","작업 이름":"Nombre de la tarea",닫기:"Cerrar",모름:"Desconocido","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sesiones cerradas de Claude Code · Codex — haz clic para continuar","검색어와 맞는 지난 세션이 없다":"Ninguna sesión anterior coincide con la búsqueda","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pulsa Esc o ✕ para mostrar todas las sesiones","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Desactiva la ordenación por estado en Ajustes para reordenar las pestañas","이 탭으로 이동":"Ir a la pestaña","새 탭에서 이어받기":"Continuar en nueva pestaña","분기해서 이어받기":"Crear una rama de la conversación","세션 ID 복사":"Copiar ID de sesión","목록에서 숨기기":"Ocultar de la lista","↺ 자동 감지로":"↺ Detectar automáticamente","↻ 화면 복구":"↻ Reparar pantalla","패널에 띄우기":"Abrir en el panel","경로 붙여넣기":"Pegar ruta","아무것도 하지 않는다":"Cancelar","다시 묻지 않기":"No volver a preguntar","{name} 을 어떻게 할까요?":"¿Qué quieres hacer con {name}?","{provider} 계정 선택":"Seleccionar cuenta de {provider}","{provider} 계정":"Cuentas de {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continuar esta conversación en una nueva pestaña con la cuenta seleccionada.","선택한 계정으로 새 대화를 엽니다.":"Iniciar una nueva conversación con la cuenta seleccionada.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"No hay cuentas guardadas. Añade cuentas a accounts.json."," · 현재 계정":" · Cuenta actual","잔량 조회 중…":"Cargando uso…","계정 저장 폴더를 준비하지 못했습니다.":"No se pudo preparar la carpeta de la cuenta.","사용량 정보 없음":"Uso no disponible","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"La pestaña original se cerró. Abre de nuevo la lista de cuentas.","{name} 인증 확인 중…":"Comprobando la autenticación de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: inicia sesión en el navegador. La autenticación se guardará automáticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticación guardada. La pestaña original se cerró; selecciona la cuenta en una nueva conversación.","계정 전환에 실패했습니다. 다시 선택하세요.":"No se pudo cambiar de cuenta. Inténtalo de nuevo.","새 계정 탭을 열지 못했습니다.":"No se pudo abrir la pestaña de la cuenta.","세션 {id}":"Sesión {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Ya está abierta — haz clic para ir a la pestaña","누르면 새 탭에서 이어받는다 ({id})":"Haz clic para continuar en una nueva pestaña ({id})","작업 폴더: {cwd}":"Carpeta de trabajo: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Solo se reanuda la conversación; los servidores y procesos en segundo plano no se reinician.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Ninguna sesión coincide con {filter} ({total} en total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expandido para la búsqueda (bórrala para contraer)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} pestañas) — haz clic para contraer/expandir","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} pestañas sin carpeta de trabajo conocida — haz clic para contraer/expandir","탭 {count}개":"{count} pestañas","{status} {count} — 클릭하면 필터 해제":"{status} {count} — haz clic para borrar el filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — haz clic para filtrar","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Cuenta: {value}","버전: {value}":"Versión: {value}","폴더: {value}":"Carpeta: {value}","{tool} 권한":"Permiso de {tool}","입력 대기":"Esperando entrada","플랜 승인":"Aprobación del plan","질문 응답":"Respuesta a pregunta","{time} 리셋":"Restablecimiento: {time}"}},3940(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nom du compte (facultatif)","목록에서 삭제":"Retirer de la liste","이메일 주소 전체를 입력하세요.":"Saisissez l’adresse e-mail complète.","계정 추가":"Ajouter un compte","계정 (이메일)":"Compte (e-mail)",비밀번호:"Mot de passe","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Le compte et le mot de passe sont enregistrés en clair sur ce PC.",저장:"Enregistrer",취소:"Annuler","계정과 비밀번호를 입력하세요.":"Saisissez un compte et un mot de passe.","이미 등록된 계정입니다.":"Ce compte est déjà enregistré.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Impossible d’enregistrer le compte. Réessayez.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Impossible de lire le fichier des comptes. Vérifiez le format JSON.","+ 버튼으로 계정을 추가하세요.":"Utilisez le bouton + pour ajouter un compte.","현재 탭에서 선택한 계정으로 전환합니다.":"Passer au compte sélectionné dans cet onglet.","세션 검색 (제목 · 작업이름 · 폴더)":"Rechercher des sessions (titre · tâche · dossier)","검색·필터 지우기 (Esc)":"Effacer la recherche et les filtres (Échap)","계정 선택":"Choisir un compte","새 탭":"Nouvel onglet","+ 새 탭":"+ Nouvel onglet",설정:"Paramètres","화면 복구 (모든 탭 다시 그리기)":"Réparer l’affichage (redessiner tous les onglets)","미리보기 패널 (md · 이미지 · 표)":"Panneau d’aperçu (Markdown · images · tableaux)",진행중:"En cours",승인대기:"En attente d’approbation","한도 도달":"Limite d’utilisation atteinte",완료:"Terminé",오류:"Erreur",대기:"Inactif",기타:"Autres","지난 세션":"Sessions précédentes",어제:"Hier","● 열림":"● Ouvert","탭 닫기":"Fermer l’onglet","(제목 없음)":"(Sans titre)","작업 이름":"Nom de la tâche",닫기:"Fermer",모름:"Inconnu","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessions Claude Code · Codex fermées — cliquer pour reprendre","검색어와 맞는 지난 세션이 없다":"Aucune session précédente ne correspond à la recherche","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Appuyez sur Échap ou ✕ pour afficher toutes les sessions","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Désactivez le tri par état dans les paramètres pour réordonner les onglets","이 탭으로 이동":"Aller à l’onglet","새 탭에서 이어받기":"Reprendre dans un nouvel onglet","분기해서 이어받기":"Créer une branche de la conversation","세션 ID 복사":"Copier l’ID de session","목록에서 숨기기":"Masquer dans la liste","↺ 자동 감지로":"↺ Détection automatique","↻ 화면 복구":"↻ Réparer l’affichage","패널에 띄우기":"Ouvrir dans le panneau","경로 붙여넣기":"Coller le chemin","아무것도 하지 않는다":"Annuler","다시 묻지 않기":"Ne plus demander","{name} 을 어떻게 할까요?":"Que voulez-vous faire de {name} ?","{provider} 계정 선택":"Choisir un compte {provider}","{provider} 계정":"Comptes {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Poursuivre cette conversation dans un nouvel onglet avec le compte choisi.","선택한 계정으로 새 대화를 엽니다.":"Démarrer une nouvelle conversation avec le compte choisi.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Aucun compte enregistré. Ajoutez des comptes dans accounts.json."," · 현재 계정":" · Compte actuel","잔량 조회 중…":"Chargement de l’utilisation…","계정 저장 폴더를 준비하지 못했습니다.":"Impossible de préparer le dossier du compte.","사용량 정보 없음":"Utilisation indisponible","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"L’onglet d’origine a été fermé. Rouvrez la liste des comptes.","{name} 인증 확인 중…":"Vérification de l’authentification de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name} : connectez-vous dans le navigateur. L’authentification sera enregistrée automatiquement.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentification enregistrée. L’onglet d’origine a été fermé ; choisissez le compte dans une nouvelle conversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Impossible de changer de compte. Réessayez.","새 계정 탭을 열지 못했습니다.":"Impossible d’ouvrir l’onglet du compte.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Déjà ouvert — cliquer pour accéder à l’onglet","누르면 새 탭에서 이어받는다 ({id})":"Cliquer pour reprendre dans un nouvel onglet ({id})","작업 폴더: {cwd}":"Dossier de travail : {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Seule la conversation reprend ; les serveurs et processus en arrière-plan ne sont pas redémarrés.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Aucune session ne correspond à {filter} ({total} au total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Déplié pour la recherche (effacez-la pour replier)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} onglets) — cliquer pour replier/déplier","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} onglets sans dossier de travail connu — cliquer pour replier/déplier","탭 {count}개":"{count} onglets","{status} {count} — 클릭하면 필터 해제":"{status} {count} — cliquer pour effacer le filtre","{status} {count} — 클릭하면 이 상태만":"{status} {count} — cliquer pour filtrer","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Compte : {value}","버전: {value}":"Version : {value}","폴더: {value}":"Dossier : {value}","{tool} 권한":"Autorisation de {tool}","입력 대기":"En attente de saisie","플랜 승인":"Approbation du plan","질문 응답":"Réponse à une question","{time} 리셋":"Réinitialisation : {time}"}},1658(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Naziv računa (neobavezno)","목록에서 삭제":"Ukloni s popisa","이메일 주소 전체를 입력하세요.":"Unesite cijelu adresu e-pošte.","계정 추가":"Dodaj račun","계정 (이메일)":"Račun (e-pošta)",비밀번호:"Lozinka","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Račun i lozinka spremaju se kao običan tekst na ovom računalu.",저장:"Spremi",취소:"Odustani","계정과 비밀번호를 입력하세요.":"Unesite račun i lozinku.","이미 등록된 계정입니다.":"Ovaj je račun već spremljen.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Račun nije moguće spremiti. Pokušajte ponovno.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Datoteku računa nije moguće pročitati. Provjerite format JSON.","+ 버튼으로 계정을 추가하세요.":"Dodajte račun gumbom +.","현재 탭에서 선택한 계정으로 전환합니다.":"Prebacite se na odabrani račun u ovoj kartici.","세션 검색 (제목 · 작업이름 · 폴더)":"Pretraži sesije (naslov · zadatak · mapa)","검색·필터 지우기 (Esc)":"Očisti pretraživanje i filtre (Esc)","계정 선택":"Odaberi račun","새 탭":"Nova kartica","+ 새 탭":"+ Nova kartica",설정:"Postavke","화면 복구 (모든 탭 다시 그리기)":"Popravi prikaz (ponovno iscrtaj sve kartice)","미리보기 패널 (md · 이미지 · 표)":"Panel pretpregleda (Markdown · slike · tablice)",진행중:"U tijeku",승인대기:"Čeka odobrenje","한도 도달":"Dosegnuto ograničenje upotrebe",완료:"Dovršeno",오류:"Pogreška",대기:"Neaktivno",기타:"Ostalo","지난 세션":"Prethodne sesije",어제:"Jučer","● 열림":"● Otvoreno","탭 닫기":"Zatvori karticu","(제목 없음)":"(Bez naslova)","작업 이름":"Naziv zadatka",닫기:"Zatvori",모름:"Nepoznato","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zatvorene sesije Claude Code · Codex — klikni za nastavak","검색어와 맞는 지난 세션이 없다":"Nijedna prethodna sesija ne odgovara pretraživanju","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pritisni Esc ili ✕ za prikaz svih sesija","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Isključi razvrstavanje po stanju u postavkama za promjenu redoslijeda kartica","이 탭으로 이동":"Idi na karticu","새 탭에서 이어받기":"Nastavi u novoj kartici","분기해서 이어받기":"Razgranaj razgovor","세션 ID 복사":"Kopiraj ID sesije","목록에서 숨기기":"Sakrij s popisa","↺ 자동 감지로":"↺ Automatski prepoznaj","↻ 화면 복구":"↻ Popravi prikaz","패널에 띄우기":"Otvori u panelu","경로 붙여넣기":"Zalijepi putanju","아무것도 하지 않는다":"Odustani","다시 묻지 않기":"Ne pitaj ponovno","{name} 을 어떻게 할까요?":"Što želiš učiniti s {name}?","{provider} 계정 선택":"Odaberi račun za {provider}","{provider} 계정":"Računi za {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Nastavi ovaj razgovor u novoj kartici s odabranim računom.","선택한 계정으로 새 대화를 엽니다.":"Započni novi razgovor s odabranim računom.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nema spremljenih računa. Dodaj račune u accounts.json."," · 현재 계정":" · Trenutni račun","잔량 조회 중…":"Učitavanje upotrebe…","계정 저장 폴더를 준비하지 못했습니다.":"Nije moguće pripremiti mapu računa.","사용량 정보 없음":"Podaci o upotrebi nisu dostupni","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Izvorna kartica je zatvorena. Ponovno otvori popis računa.","{name} 인증 확인 중…":"Provjera autentifikacije za {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: prijavi se u pregledniku. Autentifikacija će se automatski spremiti.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentifikacija je spremljena. Izvorna kartica je zatvorena; odaberi račun u novom razgovoru.","계정 전환에 실패했습니다. 다시 선택하세요.":"Nije moguće promijeniti račun. Pokušaj ponovno.","새 계정 탭을 열지 못했습니다.":"Nije moguće otvoriti karticu računa.","세션 {id}":"Sesija {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Već je otvoreno — klikni za prijelaz na karticu","누르면 새 탭에서 이어받는다 ({id})":"Klikni za nastavak u novoj kartici ({id})","작업 폴더: {cwd}":"Radna mapa: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Nastavlja se samo razgovor; poslužitelji i pozadinski procesi ne pokreću se ponovno.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nijedna sesija ne odgovara filtru {filter} (ukupno {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Prošireno za rezultate pretraživanja (očisti pretraživanje za sažimanje)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (kartica: {count}) — klikni za sažimanje/proširenje","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Kartice bez poznate radne mape: {count} — klikni za sažimanje/proširenje","탭 {count}개":"Kartica: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klikni za uklanjanje filtra","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klikni za filtriranje","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Račun: {value}","버전: {value}":"Verzija: {value}","폴더: {value}":"Mapa: {value}","{tool} 권한":"Dopuštenje za {tool}","입력 대기":"Čeka unos","플랜 승인":"Odobrenje plana","질문 응답":"Odgovor na pitanje","{time} 리셋":"Poništavanje: {time}"}},3917(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nama akun (opsional)","목록에서 삭제":"Hapus dari daftar","이메일 주소 전체를 입력하세요.":"Masukkan alamat email lengkap.","계정 추가":"Tambah akun","계정 (이메일)":"Akun (email)",비밀번호:"Kata sandi","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Akun dan kata sandi disimpan sebagai teks biasa di PC ini.",저장:"Simpan",취소:"Batal","계정과 비밀번호를 입력하세요.":"Masukkan akun dan kata sandi.","이미 등록된 계정입니다.":"Akun ini sudah tersimpan.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Tidak dapat menyimpan akun. Coba lagi.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Tidak dapat membaca berkas akun. Periksa format JSON.","+ 버튼으로 계정을 추가하세요.":"Gunakan tombol + untuk menambah akun.","현재 탭에서 선택한 계정으로 전환합니다.":"Beralih ke akun yang dipilih di tab ini.","세션 검색 (제목 · 작업이름 · 폴더)":"Cari sesi (judul · tugas · folder)","검색·필터 지우기 (Esc)":"Hapus pencarian dan filter (Esc)","계정 선택":"Pilih akun","새 탭":"Tab baru","+ 새 탭":"+ Tab baru",설정:"Pengaturan","화면 복구 (모든 탭 다시 그리기)":"Perbaiki tampilan (gambar ulang semua tab)","미리보기 패널 (md · 이미지 · 표)":"Panel pratinjau (Markdown · gambar · tabel)",진행중:"Sedang bekerja",승인대기:"Menunggu persetujuan","한도 도달":"Batas penggunaan tercapai",완료:"Selesai",오류:"Kesalahan",대기:"Siaga",기타:"Lainnya","지난 세션":"Sesi sebelumnya",어제:"Kemarin","● 열림":"● Terbuka","탭 닫기":"Tutup tab","(제목 없음)":"(Tanpa judul)","작업 이름":"Nama tugas",닫기:"Tutup",모름:"Tidak diketahui","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sesi Claude Code · Codex yang ditutup — klik untuk melanjutkan","검색어와 맞는 지난 세션이 없다":"Tidak ada sesi sebelumnya yang cocok dengan pencarian","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tekan Esc atau ✕ untuk menampilkan semua sesi","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Nonaktifkan pengurutan berdasarkan status di Pengaturan untuk mengatur ulang tab","이 탭으로 이동":"Buka tab","새 탭에서 이어받기":"Lanjutkan di tab baru","분기해서 이어받기":"Cabangkan percakapan","세션 ID 복사":"Salin ID sesi","목록에서 숨기기":"Sembunyikan dari daftar","↺ 자동 감지로":"↺ Deteksi otomatis","↻ 화면 복구":"↻ Perbaiki tampilan","패널에 띄우기":"Buka di panel","경로 붙여넣기":"Tempel jalur","아무것도 하지 않는다":"Batal","다시 묻지 않기":"Jangan tanyakan lagi","{name} 을 어떻게 할까요?":"Apa yang ingin Anda lakukan dengan {name}?","{provider} 계정 선택":"Pilih akun {provider}","{provider} 계정":"Akun {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Lanjutkan percakapan ini di tab baru dengan akun yang dipilih.","선택한 계정으로 새 대화를 엽니다.":"Mulai percakapan baru dengan akun yang dipilih.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Tidak ada akun tersimpan. Tambahkan akun ke accounts.json."," · 현재 계정":" · Akun saat ini","잔량 조회 중…":"Memuat penggunaan…","계정 저장 폴더를 준비하지 못했습니다.":"Tidak dapat menyiapkan folder akun.","사용량 정보 없음":"Informasi penggunaan tidak tersedia","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Tab asal telah ditutup. Buka kembali daftar akun.","{name} 인증 확인 중…":"Memeriksa autentikasi {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: masuk melalui browser. Autentikasi akan disimpan otomatis.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentikasi tersimpan. Tab asal telah ditutup; pilih akun dalam percakapan baru.","계정 전환에 실패했습니다. 다시 선택하세요.":"Tidak dapat mengganti akun. Coba lagi.","새 계정 탭을 열지 못했습니다.":"Tidak dapat membuka tab akun.","세션 {id}":"Sesi {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Sudah terbuka — klik untuk membuka tab","누르면 새 탭에서 이어받는다 ({id})":"Klik untuk melanjutkan di tab baru ({id})","작업 폴더: {cwd}":"Folder kerja: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Hanya percakapan yang dilanjutkan; server dan proses latar belakang tidak dimulai ulang.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Tidak ada sesi yang cocok dengan {filter} (total {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Diperluas untuk hasil pencarian (hapus pencarian untuk menciutkan)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} tab) — klik untuk ciutkan/perluas","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} tab tanpa folder kerja yang diketahui — klik untuk ciutkan/perluas","탭 {count}개":"{count} tab","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik untuk menghapus filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik untuk memfilter","{n}초":"{n}dtk","{n}분":"{n}mnt","{h}시간 {m}분":"{h}j {m}mnt","계정: {value}":"Akun: {value}","버전: {value}":"Versi: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"Izin {tool}","입력 대기":"Menunggu masukan","플랜 승인":"Persetujuan rencana","질문 응답":"Jawaban pertanyaan","{time} 리셋":"Reset: {time}"}},541(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nome account (facoltativo)","목록에서 삭제":"Rimuovi dall’elenco","이메일 주소 전체를 입력하세요.":"Inserisci l’indirizzo email completo.","계정 추가":"Aggiungi account","계정 (이메일)":"Account (e-mail)",비밀번호:"Password","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Account e password vengono salvati in chiaro su questo PC.",저장:"Salva",취소:"Annulla","계정과 비밀번호를 입력하세요.":"Inserisci account e password.","이미 등록된 계정입니다.":"Questo account è già salvato.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Impossibile salvare l’account. Riprova.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Impossibile leggere il file degli account. Controlla il formato JSON.","+ 버튼으로 계정을 추가하세요.":"Usa il pulsante + per aggiungere un account.","현재 탭에서 선택한 계정으로 전환합니다.":"Passa all’account selezionato in questa scheda.","세션 검색 (제목 · 작업이름 · 폴더)":"Cerca sessioni (titolo · attività · cartella)","검색·필터 지우기 (Esc)":"Cancella ricerca e filtri (Esc)","계정 선택":"Seleziona account","새 탭":"Nuova scheda","+ 새 탭":"+ Nuova scheda",설정:"Impostazioni","화면 복구 (모든 탭 다시 그리기)":"Ripara visualizzazione (ridisegna tutte le schede)","미리보기 패널 (md · 이미지 · 표)":"Pannello di anteprima (Markdown · immagini · tabelle)",진행중:"In corso",승인대기:"In attesa di approvazione","한도 도달":"Limite di utilizzo raggiunto",완료:"Completato",오류:"Errore",대기:"Inattivo",기타:"Altro","지난 세션":"Sessioni precedenti",어제:"Ieri","● 열림":"● Aperta","탭 닫기":"Chiudi scheda","(제목 없음)":"(Senza titolo)","작업 이름":"Nome attività",닫기:"Chiudi",모름:"Sconosciuto","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessioni Claude Code · Codex chiuse — fai clic per riprendere","검색어와 맞는 지난 세션이 없다":"Nessuna sessione precedente corrisponde alla ricerca","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Premi Esc o ✕ per mostrare tutte le sessioni","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Disattiva l’ordinamento per stato nelle impostazioni per riordinare le schede","이 탭으로 이동":"Vai alla scheda","새 탭에서 이어받기":"Riprendi in una nuova scheda","분기해서 이어받기":"Crea un ramo della conversazione","세션 ID 복사":"Copia ID sessione","목록에서 숨기기":"Nascondi dall’elenco","↺ 자동 감지로":"↺ Rileva automaticamente","↻ 화면 복구":"↻ Ripara visualizzazione","패널에 띄우기":"Apri nel pannello","경로 붙여넣기":"Incolla percorso","아무것도 하지 않는다":"Annulla","다시 묻지 않기":"Non chiedere più","{name} 을 어떻게 할까요?":"Cosa vuoi fare con {name}?","{provider} 계정 선택":"Seleziona account {provider}","{provider} 계정":"Account {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continua questa conversazione in una nuova scheda con l’account selezionato.","선택한 계정으로 새 대화를 엽니다.":"Avvia una nuova conversazione con l’account selezionato.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nessun account salvato. Aggiungi account in accounts.json."," · 현재 계정":" · Account attuale","잔량 조회 중…":"Caricamento utilizzo…","계정 저장 폴더를 준비하지 못했습니다.":"Impossibile preparare la cartella dell’account.","사용량 정보 없음":"Utilizzo non disponibile","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"La scheda originale è stata chiusa. Riapri l’elenco degli account.","{name} 인증 확인 중…":"Verifica dell’autenticazione di {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: accedi nel browser. L’autenticazione verrà salvata automaticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticazione salvata. La scheda originale è stata chiusa; seleziona l’account in una nuova conversazione.","계정 전환에 실패했습니다. 다시 선택하세요.":"Impossibile cambiare account. Riprova.","새 계정 탭을 열지 못했습니다.":"Impossibile aprire la scheda dell’account.","세션 {id}":"Sessione {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Già aperta — fai clic per andare alla scheda","누르면 새 탭에서 이어받는다 ({id})":"Fai clic per riprendere in una nuova scheda ({id})","작업 폴더: {cwd}":"Cartella di lavoro: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Riprende solo la conversazione; server e processi in background non vengono riavviati.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nessuna sessione corrisponde a {filter} ({total} in totale)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Espanso per la ricerca (cancellala per comprimere)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} schede) — fai clic per comprimere/espandere","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} schede senza cartella di lavoro nota — fai clic per comprimere/espandere","탭 {count}개":"{count} schede","{status} {count} — 클릭하면 필터 해제":"{status} {count} — fai clic per rimuovere il filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — fai clic per filtrare","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Account: {value}","버전: {value}":"Versione: {value}","폴더: {value}":"Cartella: {value}","{tool} 권한":"Autorizzazione per {tool}","입력 대기":"In attesa di input","플랜 승인":"Approvazione del piano","질문 응답":"Risposta alla domanda","{time} 리셋":"Ripristino: {time}"}},8281(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"アカウント名(任意)","목록에서 삭제":"一覧から削除","이메일 주소 전체를 입력하세요.":"メールアドレスをすべて入力してください。","계정 추가":"アカウントを追加","계정 (이메일)":"アカウント(メールアドレス)",비밀번호:"パスワード","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"アカウントとパスワードはこのPCに平文で保存されます。",저장:"保存",취소:"キャンセル","계정과 비밀번호를 입력하세요.":"アカウントとパスワードを入力してください。","이미 등록된 계정입니다.":"このアカウントは登録済みです。","계정을 저장하지 못했습니다. 다시 시도하세요.":"アカウントを保存できませんでした。再試行してください。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"アカウントファイルを読み込めません。JSON形式を確認してください。","+ 버튼으로 계정을 추가하세요.":"+ボタンでアカウントを追加してください。","현재 탭에서 선택한 계정으로 전환합니다.":"現在のタブで選択したアカウントに切り替えます。","세션 검색 (제목 · 작업이름 · 폴더)":"セッション検索(タイトル・作業名・フォルダー)","검색·필터 지우기 (Esc)":"検索・絞り込みを解除(Esc)","계정 선택":"アカウントを選択","새 탭":"新しいタブ","+ 새 탭":"+ 新しいタブ",설정:"設定","화면 복구 (모든 탭 다시 그리기)":"表示を修復(すべてのタブを再描画)","미리보기 패널 (md · 이미지 · 표)":"プレビューパネル(Markdown・画像・表)",진행중:"実行中",승인대기:"承認待ち","한도 도달":"使用上限に到達",완료:"完了",오류:"エラー",대기:"待機",기타:"その他","지난 세션":"過去のセッション",어제:"昨日","● 열림":"● 開いています","탭 닫기":"タブを閉じる","(제목 없음)":"(無題)","작업 이름":"作業名",닫기:"閉じる",모름:"不明","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"終了した Claude Code・Codex セッション — クリックして再開","검색어와 맞는 지난 세션이 없다":"検索に一致する過去のセッションはありません","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Esc または ✕ ですべてのセッションを表示","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"タブを並べ替えるには設定で状態順の並べ替えを無効にしてください","이 탭으로 이동":"タブへ移動","새 탭에서 이어받기":"新しいタブで再開","분기해서 이어받기":"会話を分岐","세션 ID 복사":"セッション ID をコピー","목록에서 숨기기":"一覧から非表示","↺ 자동 감지로":"↺ 自動検出","↻ 화면 복구":"↻ 表示を修復","패널에 띄우기":"パネルで開く","경로 붙여넣기":"パスを貼り付け","아무것도 하지 않는다":"キャンセル","다시 묻지 않기":"次回から確認しない","{name} 을 어떻게 할까요?":"{name} をどうしますか?","{provider} 계정 선택":"{provider} のアカウントを選択","{provider} 계정":"{provider} のアカウント","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"選択したアカウントで、この会話を新しいタブで続けます。","선택한 계정으로 새 대화를 엽니다.":"選択したアカウントで新しい会話を始めます。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"保存済みアカウントがありません。accounts.json に追加してください。"," · 현재 계정":" · 現在のアカウント","잔량 조회 중…":"使用量を取得中…","계정 저장 폴더를 준비하지 못했습니다.":"アカウントのフォルダーを準備できませんでした。","사용량 정보 없음":"使用量情報なし","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"元のタブは閉じられました。アカウント一覧を開き直してください。","{name} 인증 확인 중…":"{name} の認証を確認中…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: ブラウザーでログインしてください。認証情報は自動保存されます。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"認証情報を保存しました。元のタブは閉じられたため、新しい会話でアカウントを選択してください。","계정 전환에 실패했습니다. 다시 선택하세요.":"アカウントを切り替えられませんでした。再試行してください。","새 계정 탭을 열지 못했습니다.":"アカウントのタブを開けませんでした。","세션 {id}":"セッション {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"すでに開いています — クリックしてタブへ移動","누르면 새 탭에서 이어받는다 ({id})":"クリックして新しいタブで再開({id})","작업 폴더: {cwd}":"作業フォルダー: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"会話のみ再開します。サーバーやバックグラウンドプロセスは再起動されません。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"{filter} に一致するセッションはありません(全 {total} 件)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 検索結果を展開中(検索を解除すると折りたたみます)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} タブ)— クリックして折りたたみ/展開","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"作業フォルダー不明の {count} タブ — クリックして折りたたみ/展開","탭 {count}개":"{count} タブ","{status} {count} — 클릭하면 필터 해제":"{status} {count} — クリックして絞り込みを解除","{status} {count} — 클릭하면 이 상태만":"{status} {count} — クリックして絞り込み","{n}초":"{n}秒","{n}분":"{n}分","{h}시간 {m}분":"{h}時間 {m}分","계정: {value}":"アカウント: {value}","버전: {value}":"バージョン: {value}","폴더: {value}":"フォルダー: {value}","{tool} 권한":"{tool} の権限","입력 대기":"入力待ち","플랜 승인":"プランの承認","질문 응답":"質問への回答","{time} 리셋":"リセット: {time}"}},1500(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nazwa konta (opcjonalnie)","목록에서 삭제":"Usuń z listy","이메일 주소 전체를 입력하세요.":"Wpisz pełny adres e-mail.","계정 추가":"Dodaj konto","계정 (이메일)":"Konto (e-mail)",비밀번호:"Hasło","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto i hasło są zapisywane na tym komputerze jako zwykły tekst.",저장:"Zapisz",취소:"Anuluj","계정과 비밀번호를 입력하세요.":"Wpisz konto i hasło.","이미 등록된 계정입니다.":"To konto jest już zapisane.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Nie udało się zapisać konta. Spróbuj ponownie.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Nie udało się odczytać pliku kont. Sprawdź format JSON.","+ 버튼으로 계정을 추가하세요.":"Użyj przycisku +, aby dodać konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Przełącz na wybrane konto w tej karcie.","세션 검색 (제목 · 작업이름 · 폴더)":"Szukaj sesji (tytuł · zadanie · folder)","검색·필터 지우기 (Esc)":"Wyczyść wyszukiwanie i filtry (Esc)","계정 선택":"Wybierz konto","새 탭":"Nowa karta","+ 새 탭":"+ Nowa karta",설정:"Ustawienia","화면 복구 (모든 탭 다시 그리기)":"Napraw wyświetlanie (przerysuj wszystkie karty)","미리보기 패널 (md · 이미지 · 표)":"Panel podglądu (Markdown · obrazy · tabele)",진행중:"W toku",승인대기:"Oczekuje na zatwierdzenie","한도 도달":"Osiągnięto limit użycia",완료:"Gotowe",오류:"Błąd",대기:"Bezczynne",기타:"Inne","지난 세션":"Poprzednie sesje",어제:"Wczoraj","● 열림":"● Otwarte","탭 닫기":"Zamknij kartę","(제목 없음)":"(Bez tytułu)","작업 이름":"Nazwa zadania",닫기:"Zamknij",모름:"Nieznane","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zamknięte sesje Claude Code · Codex — kliknij, aby wznowić","검색어와 맞는 지난 세션이 없다":"Brak poprzednich sesji pasujących do wyszukiwania","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Naciśnij Esc lub ✕, aby wyświetlić wszystkie sesje","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Wyłącz sortowanie według stanu w ustawieniach, aby zmienić kolejność kart","이 탭으로 이동":"Przejdź do karty","새 탭에서 이어받기":"Wznów w nowej karcie","분기해서 이어받기":"Utwórz odgałęzienie rozmowy","세션 ID 복사":"Kopiuj ID sesji","목록에서 숨기기":"Ukryj na liście","↺ 자동 감지로":"↺ Wykrywaj automatycznie","↻ 화면 복구":"↻ Napraw wyświetlanie","패널에 띄우기":"Otwórz w panelu","경로 붙여넣기":"Wklej ścieżkę","아무것도 하지 않는다":"Anuluj","다시 묻지 않기":"Nie pytaj ponownie","{name} 을 어떻게 할까요?":"Co chcesz zrobić z {name}?","{provider} 계정 선택":"Wybierz konto {provider}","{provider} 계정":"Konta {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Kontynuuj tę rozmowę w nowej karcie z wybranym kontem.","선택한 계정으로 새 대화를 엽니다.":"Rozpocznij nową rozmowę z wybranym kontem.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Brak zapisanych kont. Dodaj konta do accounts.json."," · 현재 계정":" · Bieżące konto","잔량 조회 중…":"Wczytywanie użycia…","계정 저장 폴더를 준비하지 못했습니다.":"Nie udało się przygotować folderu konta.","사용량 정보 없음":"Dane użycia niedostępne","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Pierwotna karta została zamknięta. Otwórz ponownie listę kont.","{name} 인증 확인 중…":"Sprawdzanie uwierzytelnienia dla {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: zaloguj się w przeglądarce. Uwierzytelnienie zostanie zapisane automatycznie.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Uwierzytelnienie zapisane. Pierwotna karta została zamknięta; wybierz konto w nowej rozmowie.","계정 전환에 실패했습니다. 다시 선택하세요.":"Nie udało się zmienić konta. Spróbuj ponownie.","새 계정 탭을 열지 못했습니다.":"Nie udało się otworzyć karty konta.","세션 {id}":"Sesja {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Już otwarte — kliknij, aby przejść do karty","누르면 새 탭에서 이어받는다 ({id})":"Kliknij, aby wznowić w nowej karcie ({id})","작업 폴더: {cwd}":"Folder roboczy: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Wznawiana jest tylko rozmowa; serwery i procesy w tle nie są uruchamiane ponownie.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Brak sesji pasujących do {filter} (łącznie {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Rozwinięto dla wyników wyszukiwania (wyczyść wyszukiwanie, aby zwinąć)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (karty: {count}) — kliknij, aby zwinąć/rozwinąć","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Karty bez znanego folderu roboczego: {count} — kliknij, aby zwinąć/rozwinąć","탭 {count}개":"Karty: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — kliknij, aby usunąć filtr","{status} {count} — 클릭하면 이 상태만":"{status} {count} — kliknij, aby filtrować","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}godz. {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Wersja: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"Uprawnienie do {tool}","입력 대기":"Oczekuje na dane","플랜 승인":"Zatwierdzenie planu","질문 응답":"Odpowiedź na pytanie","{time} 리셋":"Odnowienie: {time}"}},9940(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nome da conta (opcional)","목록에서 삭제":"Remover da lista","이메일 주소 전체를 입력하세요.":"Introduza o endereço de e-mail completo.","계정 추가":"Adicionar conta","계정 (이메일)":"Conta (e-mail)",비밀번호:"Senha","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"A conta e a senha são salvas em texto simples neste computador.",저장:"Salvar",취소:"Cancelar","계정과 비밀번호를 입력하세요.":"Digite a conta e a senha.","이미 등록된 계정입니다.":"Esta conta já está salva.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Não foi possível salvar a conta. Tente novamente.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Não foi possível ler o arquivo de contas. Verifique o formato JSON.","+ 버튼으로 계정을 추가하세요.":"Use o botão + para adicionar uma conta.","현재 탭에서 선택한 계정으로 전환합니다.":"Mudar para a conta selecionada nesta aba.","세션 검색 (제목 · 작업이름 · 폴더)":"Pesquisar sessões (título · tarefa · pasta)","검색·필터 지우기 (Esc)":"Limpar pesquisa e filtros (Esc)","계정 선택":"Selecionar conta","새 탭":"Nova aba","+ 새 탭":"+ Nova aba",설정:"Configurações","화면 복구 (모든 탭 다시 그리기)":"Reparar exibição (redesenhar todas as abas)","미리보기 패널 (md · 이미지 · 표)":"Painel de prévia (Markdown · imagens · tabelas)",진행중:"Em andamento",승인대기:"Aguardando aprovação","한도 도달":"Limite de uso atingido",완료:"Concluído",오류:"Erro",대기:"Inativo",기타:"Outros","지난 세션":"Sessões anteriores",어제:"Ontem","● 열림":"● Aberta","탭 닫기":"Fechar aba","(제목 없음)":"(Sem título)","작업 이름":"Nome da tarefa",닫기:"Fechar",모름:"Desconhecido","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessões fechadas do Claude Code · Codex — clique para retomar","검색어와 맞는 지난 세션이 없다":"Nenhuma sessão anterior corresponde à pesquisa","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pressione Esc ou ✕ para mostrar todas as sessões","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Desative a ordenação por estado nas configurações para reordenar as abas","이 탭으로 이동":"Ir para a aba","새 탭에서 이어받기":"Retomar em nova aba","분기해서 이어받기":"Criar ramificação da conversa","세션 ID 복사":"Copiar ID da sessão","목록에서 숨기기":"Ocultar da lista","↺ 자동 감지로":"↺ Detectar automaticamente","↻ 화면 복구":"↻ Reparar exibição","패널에 띄우기":"Abrir no painel","경로 붙여넣기":"Colar caminho","아무것도 하지 않는다":"Cancelar","다시 묻지 않기":"Não perguntar novamente","{name} 을 어떻게 할까요?":"O que deseja fazer com {name}?","{provider} 계정 선택":"Selecionar conta {provider}","{provider} 계정":"Contas {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continuar esta conversa em uma nova aba com a conta selecionada.","선택한 계정으로 새 대화를 엽니다.":"Iniciar uma nova conversa com a conta selecionada.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nenhuma conta salva. Adicione contas em accounts.json."," · 현재 계정":" · Conta atual","잔량 조회 중…":"Carregando uso…","계정 저장 폴더를 준비하지 못했습니다.":"Não foi possível preparar a pasta da conta.","사용량 정보 없음":"Uso indisponível","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"A aba original foi fechada. Reabra a lista de contas.","{name} 인증 확인 중…":"Verificando autenticação de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: entre pelo navegador. A autenticação será salva automaticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticação salva. A aba original foi fechada; selecione a conta em uma nova conversa.","계정 전환에 실패했습니다. 다시 선택하세요.":"Não foi possível trocar de conta. Tente novamente.","새 계정 탭을 열지 못했습니다.":"Não foi possível abrir a aba da conta.","세션 {id}":"Sessão {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Já está aberta — clique para ir à aba","누르면 새 탭에서 이어받는다 ({id})":"Clique para retomar em uma nova aba ({id})","작업 폴더: {cwd}":"Pasta de trabalho: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Somente a conversa é retomada; servidores e processos em segundo plano não são reiniciados.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nenhuma sessão corresponde a {filter} ({total} no total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expandido para a pesquisa (limpe-a para recolher)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} abas) — clique para recolher/expandir","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} abas sem pasta de trabalho conhecida — clique para recolher/expandir","탭 {count}개":"{count} abas","{status} {count} — 클릭하면 필터 해제":"{status} {count} — clique para limpar o filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — clique para filtrar","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Conta: {value}","버전: {value}":"Versão: {value}","폴더: {value}":"Pasta: {value}","{tool} 권한":"Permissão de {tool}","입력 대기":"Aguardando entrada","플랜 승인":"Aprovação do plano","질문 응답":"Resposta à pergunta","{time} 리셋":"Reinício: {time}"}},4237(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Название аккаунта (необязательно)","목록에서 삭제":"Удалить из списка","이메일 주소 전체를 입력하세요.":"Введите полный адрес электронной почты.","계정 추가":"Добавить аккаунт","계정 (이메일)":"Аккаунт (почта)",비밀번호:"Пароль","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Аккаунт и пароль сохраняются на этом ПК в открытом виде.",저장:"Сохранить",취소:"Отмена","계정과 비밀번호를 입력하세요.":"Введите аккаунт и пароль.","이미 등록된 계정입니다.":"Этот аккаунт уже сохранён.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Не удалось сохранить аккаунт. Повторите попытку.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Не удалось прочитать файл аккаунтов. Проверьте формат JSON.","+ 버튼으로 계정을 추가하세요.":"Нажмите +, чтобы добавить аккаунт.","현재 탭에서 선택한 계정으로 전환합니다.":"Переключиться на выбранный аккаунт в текущей вкладке.","세션 검색 (제목 · 작업이름 · 폴더)":"Поиск сеансов (заголовок · задача · папка)","검색·필터 지우기 (Esc)":"Очистить поиск и фильтры (Esc)","계정 선택":"Выбрать аккаунт","새 탭":"Новая вкладка","+ 새 탭":"+ Новая вкладка",설정:"Настройки","화면 복구 (모든 탭 다시 그리기)":"Исправить отображение (перерисовать все вкладки)","미리보기 패널 (md · 이미지 · 표)":"Панель просмотра (Markdown · изображения · таблицы)",진행중:"В работе",승인대기:"Ожидает разрешения","한도 도달":"Лимит использования исчерпан",완료:"Готово",오류:"Ошибка",대기:"Ожидание",기타:"Прочее","지난 세션":"Прошлые сеансы",어제:"Вчера","● 열림":"● Открыт","탭 닫기":"Закрыть вкладку","(제목 없음)":"(Без названия)","작업 이름":"Название задачи",닫기:"Закрыть",모름:"Неизвестно","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Закрытые сеансы Claude Code · Codex — нажмите для продолжения","검색어와 맞는 지난 세션이 없다":"Нет прошлых сеансов, соответствующих поиску","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Нажмите Esc или ✕, чтобы показать все сеансы","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Отключите сортировку по состоянию в настройках для изменения порядка вкладок","이 탭으로 이동":"Перейти к вкладке","새 탭에서 이어받기":"Продолжить в новой вкладке","분기해서 이어받기":"Создать ветку беседы","세션 ID 복사":"Копировать ID сеанса","목록에서 숨기기":"Скрыть из списка","↺ 자동 감지로":"↺ Определять автоматически","↻ 화면 복구":"↻ Исправить отображение","패널에 띄우기":"Открыть на панели","경로 붙여넣기":"Вставить путь","아무것도 하지 않는다":"Отмена","다시 묻지 않기":"Больше не спрашивать","{name} 을 어떻게 할까요?":"Что сделать с {name}?","{provider} 계정 선택":"Выбрать аккаунт {provider}","{provider} 계정":"Аккаунты {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продолжить эту беседу в новой вкладке с выбранным аккаунтом.","선택한 계정으로 새 대화를 엽니다.":"Начать новую беседу с выбранным аккаунтом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Нет сохранённых аккаунтов. Добавьте их в accounts.json."," · 현재 계정":" · Текущий аккаунт","잔량 조회 중…":"Загрузка данных об использовании…","계정 저장 폴더를 준비하지 못했습니다.":"Не удалось подготовить папку аккаунта.","사용량 정보 없음":"Данные об использовании недоступны","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Исходная вкладка закрыта. Откройте список аккаунтов заново.","{name} 인증 확인 중…":"Проверка аутентификации {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: войдите через браузер. Данные аутентификации сохранятся автоматически.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Аутентификация сохранена. Исходная вкладка закрыта; выберите аккаунт в новой беседе.","계정 전환에 실패했습니다. 다시 선택하세요.":"Не удалось сменить аккаунт. Повторите попытку.","새 계정 탭을 열지 못했습니다.":"Не удалось открыть вкладку аккаунта.","세션 {id}":"Сеанс {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Уже открыт — нажмите для перехода к вкладке","누르면 새 탭에서 이어받는다 ({id})":"Нажмите для продолжения в новой вкладке ({id})","작업 폴더: {cwd}":"Рабочая папка: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Возобновляется только беседа; серверы и фоновые процессы не перезапускаются.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Нет сеансов для {filter} (всего {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Развёрнуто для результатов поиска (очистите поиск, чтобы свернуть)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (вкладок: {count}) — нажмите, чтобы свернуть/развернуть","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Вкладок без известной рабочей папки: {count} — нажмите, чтобы свернуть/развернуть","탭 {count}개":"Вкладок: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — нажмите, чтобы снять фильтр","{status} {count} — 클릭하면 이 상태만":"{status} {count} — нажмите для фильтрации","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Аккаунт: {value}","버전: {value}":"Версия: {value}","폴더: {value}":"Папка: {value}","{tool} 권한":"Разрешение для {tool}","입력 대기":"Ожидает ввода","플랜 승인":"Утверждение плана","질문 응답":"Ответ на вопрос","{time} 리셋":"Сброс: {time}"}},2085(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Назив налога (опционо)","목록에서 삭제":"Уклони са списка","이메일 주소 전체를 입력하세요.":"Унесите целу адресу е-поште.","계정 추가":"Додај налог","계정 (이메일)":"Налог (е-пошта)",비밀번호:"Лозинка","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Налог и лозинка се чувају као обичан текст на овом рачунару.",저장:"Сачувај",취소:"Откажи","계정과 비밀번호를 입력하세요.":"Унесите налог и лозинку.","이미 등록된 계정입니다.":"Овај налог је већ сачуван.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Налог није могуће сачувати. Покушајте поново.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Датотеку налога није могуће прочитати. Проверите JSON формат.","+ 버튼으로 계정을 추가하세요.":"Додајте налог дугметом +.","현재 탭에서 선택한 계정으로 전환합니다.":"Пређите на изабрани налог у овој картици.","세션 검색 (제목 · 작업이름 · 폴더)":"Претрага сесија (наслов · задатак · фасцикла)","검색·필터 지우기 (Esc)":"Обриши претрагу и филтере (Esc)","계정 선택":"Изабери налог","새 탭":"Нова картица","+ 새 탭":"+ Нова картица",설정:"Подешавања","화면 복구 (모든 탭 다시 그리기)":"Поправи приказ (поново исцртај све картице)","미리보기 패널 (md · 이미지 · 표)":"Панел за преглед (Markdown · слике · табеле)",진행중:"У току",승인대기:"Чека одобрење","한도 도달":"Достигнуто ограничење коришћења",완료:"Завршено",오류:"Грешка",대기:"Неактивно",기타:"Остало","지난 세션":"Претходне сесије",어제:"Јуче","● 열림":"● Отворено","탭 닫기":"Затвори картицу","(제목 없음)":"(Без наслова)","작업 이름":"Назив задатка",닫기:"Затвори",모름:"Непознато","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Затворене Claude Code · Codex сесије — кликни за наставак","검색어와 맞는 지난 세션이 없다":"Нема претходних сесија које одговарају претрази","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Притисни Esc или ✕ за приказ свих сесија","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Искључи сортирање по стању у подешавањима да промениш редослед картица","이 탭으로 이동":"Иди на картицу","새 탭에서 이어받기":"Настави у новој картици","분기해서 이어받기":"Направи грану разговора","세션 ID 복사":"Копирај ID сесије","목록에서 숨기기":"Сакриј са списка","↺ 자동 감지로":"↺ Аутоматски препознај","↻ 화면 복구":"↻ Поправи приказ","패널에 띄우기":"Отвори у панелу","경로 붙여넣기":"Налепи путању","아무것도 하지 않는다":"Откажи","다시 묻지 않기":"Не питај поново","{name} 을 어떻게 할까요?":"Шта желиш да урадиш са {name}?","{provider} 계정 선택":"Изабери налог за {provider}","{provider} 계정":"Налози за {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Настави овај разговор у новој картици са изабраним налогом.","선택한 계정으로 새 대화를 엽니다.":"Започни нови разговор са изабраним налогом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Нема сачуваних налога. Додај налоге у accounts.json."," · 현재 계정":" · Тренутни налог","잔량 조회 중…":"Учитавање коришћења…","계정 저장 폴더를 준비하지 못했습니다.":"Није могуће припремити фасциклу налога.","사용량 정보 없음":"Подаци о коришћењу нису доступни","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Првобитна картица је затворена. Поново отвори списак налога.","{name} 인증 확인 중…":"Провера аутентификације за {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: пријави се у прегледачу. Аутентификација ће се аутоматски сачувати.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Аутентификација је сачувана. Првобитна картица је затворена; изабери налог у новом разговору.","계정 전환에 실패했습니다. 다시 선택하세요.":"Није могуће променити налог. Покушај поново.","새 계정 탭을 열지 못했습니다.":"Није могуће отворити картицу налога.","세션 {id}":"Сесија {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Већ је отворено — кликни за прелазак на картицу","누르면 새 탭에서 이어받는다 ({id})":"Кликни за наставак у новој картици ({id})","작업 폴더: {cwd}":"Радна фасцикла: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Наставља се само разговор; сервери и позадински процеси се не покрећу поново.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Нема сесија за {filter} (укупно {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Проширено за резултате претраге (обриши претрагу за скупљање)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (картица: {count}) — кликни за скупљање/ширење","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Картице без познате радне фасцикле: {count} — кликни за скупљање/ширење","탭 {count}개":"Картица: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — кликни за уклањање филтера","{status} {count} — 클릭하면 이 상태만":"{status} {count} — кликни за филтрирање","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Налог: {value}","버전: {value}":"Верзија: {value}","폴더: {value}":"Фасцикла: {value}","{tool} 권한":"Дозвола за {tool}","입력 대기":"Чека унос","플랜 승인":"Одобрење плана","질문 응답":"Одговор на питање","{time} 리셋":"Поништавање: {time}"}},9865(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontonamn (valfritt)","목록에서 삭제":"Ta bort från listan","이메일 주소 전체를 입력하세요.":"Ange hela e-postadressen.","계정 추가":"Lägg till konto","계정 (이메일)":"Konto (e-post)",비밀번호:"Lösenord","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto och lösenord sparas i klartext på den här datorn.",저장:"Spara",취소:"Avbryt","계정과 비밀번호를 입력하세요.":"Ange konto och lösenord.","이미 등록된 계정입니다.":"Det här kontot är redan sparat.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kunde inte spara kontot. Försök igen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kunde inte läsa kontofilen. Kontrollera JSON-formatet.","+ 버튼으로 계정을 추가하세요.":"Använd knappen + för att lägga till ett konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Byt till det valda kontot i den här fliken.","세션 검색 (제목 · 작업이름 · 폴더)":"Sök sessioner (titel · uppgift · mapp)","검색·필터 지우기 (Esc)":"Rensa sökning och filter (Esc)","계정 선택":"Välj konto","새 탭":"Ny flik","+ 새 탭":"+ Ny flik",설정:"Inställningar","화면 복구 (모든 탭 다시 그리기)":"Reparera visning (rita om alla flikar)","미리보기 패널 (md · 이미지 · 표)":"Förhandsgranskning (Markdown · bilder · tabeller)",진행중:"Arbetar",승인대기:"Väntar på godkännande","한도 도달":"Användningsgränsen nådd",완료:"Klart",오류:"Fel",대기:"Inaktiv",기타:"Övriga","지난 세션":"Tidigare sessioner",어제:"I går","● 열림":"● Öppen","탭 닫기":"Stäng flik","(제목 없음)":"(Utan titel)","작업 이름":"Uppgiftsnamn",닫기:"Stäng",모름:"Okänd","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Stängda Claude Code · Codex-sessioner — klicka för att fortsätta","검색어와 맞는 지난 세션이 없다":"Inga tidigare sessioner matchar sökningen","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tryck Esc eller ✕ för att visa alla sessioner","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Stäng av statussortering i Inställningar för att ändra flikordningen","이 탭으로 이동":"Gå till flik","새 탭에서 이어받기":"Fortsätt i ny flik","분기해서 이어받기":"Förgrena konversation","세션 ID 복사":"Kopiera sessions-ID","목록에서 숨기기":"Dölj från listan","↺ 자동 감지로":"↺ Identifiera automatiskt","↻ 화면 복구":"↻ Reparera visning","패널에 띄우기":"Öppna i panel","경로 붙여넣기":"Klistra in sökväg","아무것도 하지 않는다":"Avbryt","다시 묻지 않기":"Fråga inte igen","{name} 을 어떻게 할까요?":"Vad vill du göra med {name}?","{provider} 계정 선택":"Välj {provider}-konto","{provider} 계정":"{provider}-konton","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Fortsätt denna konversation i en ny flik med det valda kontot.","선택한 계정으로 새 대화를 엽니다.":"Starta en ny konversation med det valda kontot.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Inga sparade konton. Lägg till konton i accounts.json."," · 현재 계정":" · Aktuellt konto","잔량 조회 중…":"Läser in användning…","계정 저장 폴더를 준비하지 못했습니다.":"Det gick inte att förbereda kontomappen.","사용량 정보 없음":"Användningsdata saknas","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Den ursprungliga fliken stängdes. Öppna kontolistan igen.","{name} 인증 확인 중…":"Kontrollerar autentisering för {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: logga in i webbläsaren. Autentiseringen sparas automatiskt.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentisering sparad. Den ursprungliga fliken stängdes; välj kontot i en ny konversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Det gick inte att byta konto. Försök igen.","새 계정 탭을 열지 못했습니다.":"Det gick inte att öppna kontofliken.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Redan öppen — klicka för att gå till fliken","누르면 새 탭에서 이어받는다 ({id})":"Klicka för att fortsätta i en ny flik ({id})","작업 폴더: {cwd}":"Arbetsmapp: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Endast konversationen återupptas; servrar och bakgrundsprocesser startas inte om.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Inga sessioner matchar {filter} ({total} totalt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Utökad för sökresultat (rensa sökningen för att fälla ihop)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} flikar) — klicka för att fälla ihop/ut","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} flikar utan känd arbetsmapp — klicka för att fälla ihop/ut","탭 {count}개":"{count} flikar","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klicka för att rensa filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klicka för att filtrera","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}t {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Mapp: {value}","{tool} 권한":"Behörighet för {tool}","입력 대기":"Väntar på inmatning","플랜 승인":"Godkännande av plan","질문 응답":"Svar på fråga","{time} 리셋":"Återställning: {time}"}},5046(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Hesap adı (isteğe bağlı)","목록에서 삭제":"Listeden kaldır","이메일 주소 전체를 입력하세요.":"Tam e-posta adresini girin.","계정 추가":"Hesap ekle","계정 (이메일)":"Hesap (e-posta)",비밀번호:"Parola","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Hesap ve parola bu bilgisayarda düz metin olarak saklanır.",저장:"Kaydet",취소:"İptal","계정과 비밀번호를 입력하세요.":"Hesap ve parolayı girin.","이미 등록된 계정입니다.":"Bu hesap zaten kayıtlı.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Hesap kaydedilemedi. Tekrar deneyin.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Hesap dosyası okunamadı. JSON biçimini kontrol edin.","+ 버튼으로 계정을 추가하세요.":"Hesap eklemek için + düğmesini kullanın.","현재 탭에서 선택한 계정으로 전환합니다.":"Bu sekmede seçilen hesaba geç.","세션 검색 (제목 · 작업이름 · 폴더)":"Oturum ara (başlık · görev · klasör)","검색·필터 지우기 (Esc)":"Aramayı ve filtreleri temizle (Esc)","계정 선택":"Hesap seç","새 탭":"Yeni sekme","+ 새 탭":"+ Yeni sekme",설정:"Ayarlar","화면 복구 (모든 탭 다시 그리기)":"Görünümü onar (tüm sekmeleri yeniden çiz)","미리보기 패널 (md · 이미지 · 표)":"Önizleme paneli (Markdown · resimler · tablolar)",진행중:"Çalışıyor",승인대기:"Onay bekliyor","한도 도달":"Kullanım sınırına ulaşıldı",완료:"Tamamlandı",오류:"Hata",대기:"Boşta",기타:"Diğer","지난 세션":"Önceki oturumlar",어제:"Dün","● 열림":"● Açık","탭 닫기":"Sekmeyi kapat","(제목 없음)":"(Başlıksız)","작업 이름":"Görev adı",닫기:"Kapat",모름:"Bilinmiyor","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Kapatılmış Claude Code · Codex oturumları — sürdürmek için tıklayın","검색어와 맞는 지난 세션이 없다":"Aramayla eşleşen önceki oturum yok","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tüm oturumları göstermek için Esc veya ✕ tuşuna basın","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Sekmeleri yeniden sıralamak için Ayarlar’da duruma göre sıralamayı kapatın","이 탭으로 이동":"Sekmeye git","새 탭에서 이어받기":"Yeni sekmede sürdür","분기해서 이어받기":"Konuşmayı dallandır","세션 ID 복사":"Oturum kimliğini kopyala","목록에서 숨기기":"Listeden gizle","↺ 자동 감지로":"↺ Otomatik algıla","↻ 화면 복구":"↻ Görünümü onar","패널에 띄우기":"Panelde aç","경로 붙여넣기":"Yolu yapıştır","아무것도 하지 않는다":"İptal","다시 묻지 않기":"Bir daha sorma","{name} 을 어떻게 할까요?":"{name} ile ne yapmak istersiniz?","{provider} 계정 선택":"{provider} hesabı seç","{provider} 계정":"{provider} hesapları","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Bu konuşmayı seçilen hesapla yeni bir sekmede sürdürün.","선택한 계정으로 새 대화를 엽니다.":"Seçilen hesapla yeni bir konuşma başlatın.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Kayıtlı hesap yok. accounts.json dosyasına hesap ekleyin."," · 현재 계정":" · Geçerli hesap","잔량 조회 중…":"Kullanım yükleniyor…","계정 저장 폴더를 준비하지 못했습니다.":"Hesap klasörü hazırlanamadı.","사용량 정보 없음":"Kullanım bilgisi yok","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Asıl sekme kapatıldı. Hesap listesini yeniden açın.","{name} 인증 확인 중…":"{name} için kimlik doğrulama denetleniyor…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: tarayıcıdan oturum açın. Kimlik doğrulama otomatik kaydedilecek.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Kimlik doğrulama kaydedildi. Asıl sekme kapatıldı; yeni bir konuşmada hesabı seçin.","계정 전환에 실패했습니다. 다시 선택하세요.":"Hesap değiştirilemedi. Yeniden deneyin.","새 계정 탭을 열지 못했습니다.":"Hesap sekmesi açılamadı.","세션 {id}":"Oturum {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Zaten açık — sekmeye gitmek için tıklayın","누르면 새 탭에서 이어받는다 ({id})":"Yeni sekmede sürdürmek için tıklayın ({id})","작업 폴더: {cwd}":"Çalışma klasörü: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Yalnızca konuşma sürdürülür; sunucular ve arka plan işlemleri yeniden başlatılmaz.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"{filter} ile eşleşen oturum yok (toplam {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Arama sonuçları için genişletildi (daraltmak için aramayı temizleyin)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} sekme) — daraltmak/genişletmek için tıklayın","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Çalışma klasörü bilinmeyen {count} sekme — daraltmak/genişletmek için tıklayın","탭 {count}개":"{count} sekme","{status} {count} — 클릭하면 필터 해제":"{status} {count} — filtreyi temizlemek için tıklayın","{status} {count} — 클릭하면 이 상태만":"{status} {count} — filtrelemek için tıklayın","{n}초":"{n}sn","{n}분":"{n}dk","{h}시간 {m}분":"{h}sa {m}dk","계정: {value}":"Hesap: {value}","버전: {value}":"Sürüm: {value}","폴더: {value}":"Klasör: {value}","{tool} 권한":"{tool} izni","입력 대기":"Girdi bekleniyor","플랜 승인":"Plan onayı","질문 응답":"Soru yanıtı","{time} 리셋":"Sıfırlama: {time}"}},6020(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Назва облікового запису (необов’язково)","목록에서 삭제":"Видалити зі списку","이메일 주소 전체를 입력하세요.":"Введіть повну адресу електронної пошти.","계정 추가":"Додати обліковий запис","계정 (이메일)":"Обліковий запис (пошта)",비밀번호:"Пароль","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Обліковий запис і пароль зберігаються на цьому ПК у відкритому вигляді.",저장:"Зберегти",취소:"Скасувати","계정과 비밀번호를 입력하세요.":"Введіть обліковий запис і пароль.","이미 등록된 계정입니다.":"Цей обліковий запис уже збережено.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Не вдалося зберегти обліковий запис. Спробуйте знову.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Не вдалося прочитати файл облікових записів. Перевірте формат JSON.","+ 버튼으로 계정을 추가하세요.":"Натисніть +, щоб додати обліковий запис.","현재 탭에서 선택한 계정으로 전환합니다.":"Перемкнутися на вибраний обліковий запис у поточній вкладці.","세션 검색 (제목 · 작업이름 · 폴더)":"Пошук сеансів (заголовок · завдання · тека)","검색·필터 지우기 (Esc)":"Очистити пошук і фільтри (Esc)","계정 선택":"Вибрати обліковий запис","새 탭":"Нова вкладка","+ 새 탭":"+ Нова вкладка",설정:"Налаштування","화면 복구 (모든 탭 다시 그리기)":"Виправити відображення (перемалювати всі вкладки)","미리보기 패널 (md · 이미지 · 표)":"Панель перегляду (Markdown · зображення · таблиці)",진행중:"Виконується",승인대기:"Очікує дозволу","한도 도달":"Ліміт використання вичерпано",완료:"Готово",오류:"Помилка",대기:"Очікування",기타:"Інше","지난 세션":"Попередні сеанси",어제:"Учора","● 열림":"● Відкрито","탭 닫기":"Закрити вкладку","(제목 없음)":"(Без назви)","작업 이름":"Назва завдання",닫기:"Закрити",모름:"Невідомо","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Закриті сеанси Claude Code · Codex — натисніть для продовження","검색어와 맞는 지난 세션이 없다":"Немає попередніх сеансів, що відповідають пошуку","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Натисніть Esc або ✕, щоб показати всі сеанси","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Вимкніть сортування за станом у налаштуваннях, щоб змінити порядок вкладок","이 탭으로 이동":"Перейти до вкладки","새 탭에서 이어받기":"Продовжити в новій вкладці","분기해서 이어받기":"Створити гілку розмови","세션 ID 복사":"Копіювати ID сеансу","목록에서 숨기기":"Приховати зі списку","↺ 자동 감지로":"↺ Визначати автоматично","↻ 화면 복구":"↻ Виправити відображення","패널에 띄우기":"Відкрити на панелі","경로 붙여넣기":"Вставити шлях","아무것도 하지 않는다":"Скасувати","다시 묻지 않기":"Більше не запитувати","{name} 을 어떻게 할까요?":"Що зробити з {name}?","{provider} 계정 선택":"Вибрати обліковий запис {provider}","{provider} 계정":"Облікові записи {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продовжити цю розмову в новій вкладці з вибраним обліковим записом.","선택한 계정으로 새 대화를 엽니다.":"Почати нову розмову з вибраним обліковим записом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Немає збережених облікових записів. Додайте їх до accounts.json."," · 현재 계정":" · Поточний обліковий запис","잔량 조회 중…":"Завантаження даних використання…","계정 저장 폴더를 준비하지 못했습니다.":"Не вдалося підготувати теку облікового запису.","사용량 정보 없음":"Дані використання недоступні","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Початкову вкладку закрито. Знову відкрийте список облікових записів.","{name} 인증 확인 중…":"Перевірка автентифікації {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: увійдіть через браузер. Дані автентифікації збережуться автоматично.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Автентифікацію збережено. Початкову вкладку закрито; виберіть обліковий запис у новій розмові.","계정 전환에 실패했습니다. 다시 선택하세요.":"Не вдалося змінити обліковий запис. Спробуйте ще раз.","새 계정 탭을 열지 못했습니다.":"Не вдалося відкрити вкладку облікового запису.","세션 {id}":"Сеанс {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Уже відкрито — натисніть для переходу до вкладки","누르면 새 탭에서 이어받는다 ({id})":"Натисніть для продовження в новій вкладці ({id})","작업 폴더: {cwd}":"Робоча тека: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Відновлюється лише розмова; сервери й фонові процеси не перезапускаються.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Немає сеансів для {filter} (усього {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Розгорнуто для пошуку (очистіть пошук, щоб згорнути)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (вкладок: {count}) — натисніть, щоб згорнути/розгорнути","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Вкладок без відомої робочої теки: {count} — натисніть, щоб згорнути/розгорнути","탭 {count}개":"Вкладок: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — натисніть, щоб зняти фільтр","{status} {count} — 클릭하면 이 상태만":"{status} {count} — натисніть для фільтрації","{n}초":"{n}с","{n}분":"{n}хв","{h}시간 {m}분":"{h}год {m}хв","계정: {value}":"Обліковий запис: {value}","버전: {value}":"Версія: {value}","폴더: {value}":"Тека: {value}","{tool} 권한":"Дозвіл для {tool}","입력 대기":"Очікує введення","플랜 승인":"Затвердження плану","질문 응답":"Відповідь на запитання","{time} 리셋":"Скидання: {time}"}},710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"账户名称(可选)","목록에서 삭제":"从列表中移除","이메일 주소 전체를 입력하세요.":"请输入完整的电子邮件地址。","계정 추가":"添加账户","계정 (이메일)":"账户(邮箱)",비밀번호:"密码","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"账户和密码将以明文形式保存在此电脑上。",저장:"保存",취소:"取消","계정과 비밀번호를 입력하세요.":"请输入账户和密码。","이미 등록된 계정입니다.":"该账户已添加。","계정을 저장하지 못했습니다. 다시 시도하세요.":"无法保存账户,请重试。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"无法读取账户文件,请检查JSON格式。","+ 버튼으로 계정을 추가하세요.":"点击+按钮添加账户。","현재 탭에서 선택한 계정으로 전환합니다.":"在当前标签页中切换到所选账户。","세션 검색 (제목 · 작업이름 · 폴더)":"搜索会话(标题 · 任务 · 文件夹)","검색·필터 지우기 (Esc)":"清除搜索和筛选(Esc)","계정 선택":"选择账户","새 탭":"新建标签页","+ 새 탭":"+ 新建标签页",설정:"设置","화면 복구 (모든 탭 다시 그리기)":"修复显示(重绘所有标签页)","미리보기 패널 (md · 이미지 · 표)":"预览面板(Markdown · 图片 · 表格)",진행중:"进行中",승인대기:"等待批准","한도 도달":"已达使用上限",완료:"已完成",오류:"错误",대기:"空闲",기타:"其他","지난 세션":"历史会话",어제:"昨天","● 열림":"● 已打开","탭 닫기":"关闭标签页","(제목 없음)":"(无标题)","작업 이름":"任务名称",닫기:"关闭",모름:"未知","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"已关闭的 Claude Code · Codex 会话 — 点击继续","검색어와 맞는 지난 세션이 없다":"没有匹配的历史会话","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"按 Esc 或 ✕ 显示全部会话","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"请在设置中关闭按状态排序后调整标签页顺序","이 탭으로 이동":"转到标签页","새 탭에서 이어받기":"在新标签页中继续","분기해서 이어받기":"创建会话分支","세션 ID 복사":"复制会话 ID","목록에서 숨기기":"从列表中隐藏","↺ 자동 감지로":"↺ 自动检测","↻ 화면 복구":"↻ 修复显示","패널에 띄우기":"在面板中打开","경로 붙여넣기":"粘贴路径","아무것도 하지 않는다":"取消","다시 묻지 않기":"不再询问","{name} 을 어떻게 할까요?":"要如何处理 {name}?","{provider} 계정 선택":"选择 {provider} 账户","{provider} 계정":"{provider} 账户","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"使用所选账户在新标签页中继续此会话。","선택한 계정으로 새 대화를 엽니다.":"使用所选账户开始新会话。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"没有已保存的账户。请在 accounts.json 中添加账户。"," · 현재 계정":" · 当前账户","잔량 조회 중…":"正在加载使用量…","계정 저장 폴더를 준비하지 못했습니다.":"无法准备账户文件夹。","사용량 정보 없음":"使用量信息不可用","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"原标签页已关闭。请重新打开账户列表。","{name} 인증 확인 중…":"正在检查 {name} 的身份验证…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}:请在浏览器中登录。身份验证信息将自动保存。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"身份验证信息已保存。原标签页已关闭,请在新会话中选择账户。","계정 전환에 실패했습니다. 다시 선택하세요.":"无法切换账户。请重试。","새 계정 탭을 열지 못했습니다.":"无法打开账户标签页。","세션 {id}":"会话 {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"已打开 — 点击转到该标签页","누르면 새 탭에서 이어받는다 ({id})":"点击在新标签页中继续({id})","작업 폴더: {cwd}":"工作文件夹:{cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"仅恢复会话,不会重启服务器或后台进程。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"没有匹配 {filter} 的会话(共 {total} 个)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 已展开搜索结果(清除搜索后折叠)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} 个标签页)— 点击折叠/展开","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} 个标签页的工作文件夹未知 — 点击折叠/展开","탭 {count}개":"{count} 个标签页","{status} {count} — 클릭하면 필터 해제":"{status} {count} — 点击清除筛选","{status} {count} — 클릭하면 이 상태만":"{status} {count} — 点击筛选","{n}초":"{n}秒","{n}분":"{n}分钟","{h}시간 {m}분":"{h}小时 {m}分钟","계정: {value}":"账户:{value}","버전: {value}":"版本:{value}","폴더: {value}":"文件夹:{value}","{tool} 권한":"{tool} 权限","입력 대기":"等待输入","플랜 승인":"批准计划","질문 응답":"回答问题","{time} 리셋":"重置:{time}"}},3070(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"帳戶名稱(選填)","목록에서 삭제":"從清單移除","이메일 주소 전체를 입력하세요.":"請輸入完整的電子郵件地址。","계정 추가":"新增帳戶","계정 (이메일)":"帳戶(電子郵件)",비밀번호:"密碼","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"帳戶和密碼將以純文字形式儲存在這台電腦上。",저장:"儲存",취소:"取消","계정과 비밀번호를 입력하세요.":"請輸入帳戶和密碼。","이미 등록된 계정입니다.":"此帳戶已新增。","계정을 저장하지 못했습니다. 다시 시도하세요.":"無法儲存帳戶,請重試。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"無法讀取帳戶檔案,請檢查JSON格式。","+ 버튼으로 계정을 추가하세요.":"點擊+按鈕新增帳戶。","현재 탭에서 선택한 계정으로 전환합니다.":"在目前分頁中切換至所選帳戶。","세션 검색 (제목 · 작업이름 · 폴더)":"搜尋工作階段(標題 · 工作 · 資料夾)","검색·필터 지우기 (Esc)":"清除搜尋與篩選(Esc)","계정 선택":"選擇帳戶","새 탭":"新增分頁","+ 새 탭":"+ 新增分頁",설정:"設定","화면 복구 (모든 탭 다시 그리기)":"修復顯示(重繪所有分頁)","미리보기 패널 (md · 이미지 · 표)":"預覽面板(Markdown · 圖片 · 表格)",진행중:"執行中",승인대기:"等待核准","한도 도달":"已達使用上限",완료:"已完成",오류:"錯誤",대기:"閒置",기타:"其他","지난 세션":"過去的工作階段",어제:"昨天","● 열림":"● 已開啟","탭 닫기":"關閉分頁","(제목 없음)":"(未命名)","작업 이름":"工作名稱",닫기:"關閉",모름:"未知","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"已關閉的 Claude Code · Codex 工作階段 — 點擊繼續","검색어와 맞는 지난 세션이 없다":"沒有符合搜尋的過去工作階段","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"按 Esc 或 ✕ 顯示所有工作階段","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"請在設定中關閉依狀態排序,再調整分頁順序","이 탭으로 이동":"前往分頁","새 탭에서 이어받기":"在新分頁中繼續","분기해서 이어받기":"建立對話分支","세션 ID 복사":"複製工作階段 ID","목록에서 숨기기":"從清單隱藏","↺ 자동 감지로":"↺ 自動偵測","↻ 화면 복구":"↻ 修復顯示","패널에 띄우기":"在面板中開啟","경로 붙여넣기":"貼上路徑","아무것도 하지 않는다":"取消","다시 묻지 않기":"不要再詢問","{name} 을 어떻게 할까요?":"要如何處理 {name}?","{provider} 계정 선택":"選擇 {provider} 帳戶","{provider} 계정":"{provider} 帳戶","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"使用所選帳戶,在新分頁中繼續此對話。","선택한 계정으로 새 대화를 엽니다.":"使用所選帳戶開始新對話。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"沒有已儲存的帳戶。請在 accounts.json 中新增帳戶。"," · 현재 계정":" · 目前帳戶","잔량 조회 중…":"正在載入使用量…","계정 저장 폴더를 준비하지 못했습니다.":"無法準備帳戶資料夾。","사용량 정보 없음":"無使用量資訊","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"原分頁已關閉。請重新開啟帳戶清單。","{name} 인증 확인 중…":"正在檢查 {name} 的驗證…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}:請在瀏覽器中登入。驗證資訊將自動儲存。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"驗證資訊已儲存。原分頁已關閉,請在新對話中選擇帳戶。","계정 전환에 실패했습니다. 다시 선택하세요.":"無法切換帳戶。請再試一次。","새 계정 탭을 열지 못했습니다.":"無法開啟帳戶分頁。","세션 {id}":"工作階段 {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"已開啟 — 點擊前往該分頁","누르면 새 탭에서 이어받는다 ({id})":"點擊在新分頁中繼續({id})","작업 폴더: {cwd}":"工作資料夾:{cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"僅恢復對話,不會重新啟動伺服器或背景程序。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"沒有符合 {filter} 的工作階段(共 {total} 個)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 已展開搜尋結果(清除搜尋後摺疊)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} 個分頁)— 點擊摺疊/展開","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} 個分頁的工作資料夾未知 — 點擊摺疊/展開","탭 {count}개":"{count} 個分頁","{status} {count} — 클릭하면 필터 해제":"{status} {count} — 點擊清除篩選","{status} {count} — 클릭하면 이 상태만":"{status} {count} — 點擊篩選","{n}초":"{n}秒","{n}분":"{n}分鐘","{h}시간 {m}분":"{h}小時 {m}分鐘","계정: {value}":"帳戶:{value}","버전: {value}":"版本:{value}","폴더: {value}":"資料夾:{value}","{tool} 권한":"{tool} 權限","입력 대기":"等待輸入","플랜 승인":"核准計畫","질문 응답":"回答問題","{time} 리셋":"重設:{time}"}},4544(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Додатни радни профили","root.choose.desc":"Сачувајте више радних фасцикли и изаберите профил при отварању нове картице.","root.add":"Додај профил","root.remove":"Уклони профил","layout.title":"Користи AgentDeck распоред","layout.desc":"Искључите па нестају бочна трака и фиксна ширина — Tabby се враћа на изворни изглед.","reset.title":"Врати распоред на почетно","reset.desc":"Враћа бочну траку у почетно стање — усидрена десно, са ширином израчунатом из односа прозора.","reset.now":"Сада: усидрена {dock}, {size}.","reset.default":"Тренутно је све на подразумеваним вредностима.","reset.btn":"Врати на почетно","dock.left":"лево","dock.right":"десно","dock.top":"горе","dock.bottom":"доле","size.width":"ширина {px} px","size.height":"висина {px} px","size.auto":"ширина аутоматски","norecover.title":"Не враћај картице при покретању","norecover.desc":"Tabby се покреће празан уместо да враћа претходне картице — ионако се враћа само љуска, а Claude сесија која је била у њој одавно је завршена. Искључите за изворно понашање (<code>recoverTabs</code>). Важи од следећег покретања.","resume.title":"Настави претходне сесије","resume.desc":"Додаје фиоку <code>⟲ Претходне сесије</code> на крај сваке групе (подразумевано скупљену). Када је отворите, у њој су <b>затворене сесије Claude Code-а и Codex-а</b> означене упитом који сте заиста укуцали; кликом се разговор враћа наредбом <code>claude --resume</code> или <code>codex resume</code> у сопственој радној фасцикли. То је друга половина опције <b>Не враћај картице</b> изнад — изворно враћање врати љуску, ово враћа разговор. <b>Сервери и позадински процеси које сте тада имали покренуте не враћају се.</b>","agents.head":"Повезивање агената","agents.intro":"Омогућава да сваки агент <b>сам јавља</b> своје стање, модел и ограничења потрошње. То је најтачнији извор који бочна трака има — без тога нагађамо из текста исцртаног на екрану, па очитавање сходно томе варира.","agents.unsupported.title":"Није доступно на овој платформи","agents.unsupported.desc":"Скрипта за обавештења писана је у PowerShell-у па ради само на Windows-у. Стање се уместо тога нагађа из исписа.","state.on":"Повезано","state.off":"Није повезано","state.half":"Напола повезано","btn.install":"Инсталирај","btn.remove":"Уклони","claude.title":"Повезивање са Claude-ом","claude.desc":"Сесије Claude Code-а појављују се у бочној траци са својим <b>стањем</b> (ради · чека одобрење · готово) и <b>тракама модела, налога и потрошње</b>. Куке и <code>statusLine</code> у <code>~/.claude/settings.json</code> постављају се заједно и заједно уклањају. Остале куке се не дирају, а <code>statusLine</code> који сте већ имали <b>извршава се непромењен</b> — оно што тамо видите остаје исто. Пре уписа се поред датотеке оставља резервна копија.","codex.title":"Повезивање са Codex-ом","codex.desc":"Сесије Codex-а појављују се у бочној траци са својим <b>стањем</b> (ради · чека одобрење · готово · прекинуто) и <b>тракама модела, налога и потрошње</b>. После инсталације поново отворите Codex па прегледајте и одобрите AgentDeck куке под <code>/hooks</code>.","codex.disabled":"Codex је искључио ове куке — док их не укључиш, ништа не стиже: {events}. Отвори Codex, покрени <code>/hooks</code> и одобри их.","root.head":"Профил радне фасцикле","root.intro":"Прави профил да би се нове картице увек отварале у истој фасцикли. Измене важе после поновног покретања Tabby-ја.","root.use.title":"Користи профил радне фасцикле","root.use.desc":"Укључите и упишите фасциклу — профил се прави и постаје подразумевани.","root.name.title":"Назив профила","root.cwd.title":"Радна фасцикла","root.cwd.desc":"Ако оставите празно, профил се не прави. Када уписујете ручно, користите косе црте (нпр. D:/Project) да избегнете замке са обрнутим косим цртама.","root.browse":"Прегледај","root.command.title":"Наредба","diag.head":"Пријави проблем","diag.intro":"Скупља дијагностичке записе у <b>један zip</b> и отвара фасциклу у којој заврши. Садржи: верзије додатка и Tabby-ја и оперативни систем, подешавања изнад и два најновија нараштаја датотеке <code>{path}</code>. У записима су <b>наслови картица и путање које сте отварали</b> — слободно отворите zip и проверите пре слања.","diag.screen.title":"Укључи и сиров садржај екрана","diag.screen.desc":"Укључите код проблема са исцртавањем. Екран терминала улази дословно — у њему се виде ваш рад и код — па је подразумевано искључено.","diag.collect.title":"Скупи записе","diag.collect.desc":"Додатак v{version}.","diag.made":"Направљено: ","diag.btn":"Скупи","dev.head":"Развојне опције","dev.use.title":"Укључи развојне опције","dev.use.desc":"Укључује <b>поновно учитавање уживо</b> — чим <code>npm run build</code> препише <code>dist/index.js</code>, прозор се поново учита на нови додатак <b>уз очуване сесије</b> (картице се поново вежу на исти pty). Пречица <b>[dev] Поново учитај додатак</b> такође прати овај прекидач. Када је искључено, промена dist фасцикле не ради ништа. Видљиво само код инсталације из изворног стабла; npm издање ово нема.","dev.now.title":"Учитај поново сада","dev.now.desc":"Поново учитава тренутни dist без изградње.","dev.btn":"Учитај поново",footer:"Остало — однос прозора, ширина бочне траке, провидност, откривање стања, обрада уноса — фиксирано је на подразумеване вредности. Ако нешто треба променити, уредите <code>agentDeck.*</code> директно у конфигурационој датотеци. Пречице су на картици <b>Пречице</b> под <code>agentdeck-*</code>.","keys.head":"Пречице","keys.intro":"Тастери са насловне стране. Притисните <b>Промени</b>, затим нови тастер. Ако је већ заузет — од самог Tabby-ја или AgentDeck-а — рећи ће вам се <b>са чиме се судара</b> и можете бирати поново или га преузети. Важи одмах.","keys.change":"Промени","keys.default":"Подразумевано","keys.cancel":"Откажи","keys.force":"Свеједно користи","keys.press":"Притисните нови тастер… (Esc отказује)","keys.conflict":"Судара се са {names}. Ако га свеједно користите, тастер се тамо уклања.","keys.unbound":"није додељено","keys.stock":"уграђено у Tabby","keys.digit":"Ово мора да се завршава цифром 1–9 — цифра је број сесије. Притисните нпр. Alt+1 и 2…9 следе.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, десни клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> у панелу нису пречице и овде се не мењају.","keys.item.newtab":"Нова картица у радном корену","keys.item.jump":"Скочи на N-ту сесију","keys.item.focus":"Фокус на списак сесија / назад у терминал","keys.item.view":"Отвори / затвори панел прегледа","keys.item.repair":"Поправи екран","keys.item.splitright":"Подели једно поред другог (ново окно десно)","keys.item.splitbottom":"Подели горе / доле (ново окно доле)","keys.item.closepane":"Затвори активно подељено окно","keys.item.newline":"Нови ред без слања","keys.item.toggle":"Бочна трака / 4:3 укљ-искљ","keys.item.viewmode":"Панел: Датотеке ↔ Промене"}},3948(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Fler arbetsprofiler","root.choose.desc":"Spara flera arbetsmappar och välj en profil när du öppnar en ny flik.","root.add":"Lägg till profil","root.remove":"Ta bort profil","layout.title":"Använd AgentDecks layout","layout.desc":"Stäng av så försvinner sidopanelen och den fasta bredden — Tabby ser ut som vanligt igen.","reset.title":"Återställ layouten","reset.desc":"Sätter tillbaka sidopanelen till utgångsläget — dockad till höger, med bredden uträknad ur fönstrets proportioner.","reset.now":"Nu: dockad {dock}, {size}.","reset.default":"Just nu är allt i standardläge.","reset.btn":"Återställ","dock.left":"till vänster","dock.right":"till höger","dock.top":"upptill","dock.bottom":"nedtill","size.width":"{px} px bred","size.height":"{px} px hög","size.auto":"automatisk bredd","norecover.title":"Återställ inte flikar vid start","norecover.desc":"Tabby startar tomt i stället för att ta tillbaka de gamla flikarna — det som kommer tillbaka är ändå bara skalet, och Claude-sessionen som fanns i det är sedan länge slut. Stäng av för Tabbys ursprungliga beteende (<code>recoverTabs</code>). Gäller från nästa start.","resume.title":"Återuppta tidigare sessioner","resume.desc":"Lägger till en låda <code>⟲ Tidigare sessioner</code> sist i varje grupp (hopfälld som standard). Fäll ut den så listas <b>stängda Claude Code- och Codex-sessioner</b> med den prompt du faktiskt skrev; ett klick öppnar samtalet igen med <code>claude --resume</code> eller <code>codex resume</code> i dess egen arbetsmapp. Det är andra halvan av <b>Återställ inte flikar</b> ovan — den vanliga återställningen tar tillbaka skalet, den här tar tillbaka samtalet. <b>Servrar och bakgrundsprocesser du hade igång kommer inte tillbaka.</b>","agents.head":"Agentintegration","agents.intro":"Låter varje agent <b>själv rapportera</b> sitt tillstånd, sin modell och sina gränser. Det är den mest tillförlitliga källan sidopanelen har — utan den gissar vi utifrån texten som ritas på skärmen, och avläsningen blir därefter vinglig.","agents.unsupported.title":"Inte tillgängligt på den här plattformen","agents.unsupported.desc":"Aviseringsskriptet är PowerShell och körs därför bara i Windows. Tillståndet gissas i stället utifrån utdata.","state.on":"Ansluten","state.off":"Inte ansluten","state.half":"Halvt ansluten","btn.install":"Installera","btn.remove":"Ta bort","claude.title":"Claude-integration","claude.desc":"Claude Code-sessioner syns i sidopanelen med sitt <b>tillstånd</b> (arbetar · väntar på godkännande · klart) och <b>staplar för modell, konto och förbrukning</b>. Installerar krokarna och <code>statusLine</code> i <code>~/.claude/settings.json</code> tillsammans, och tar bort dem tillsammans. Andra krokar rörs inte, och en <code>statusLine</code> du redan hade körs <b>precis som den är</b> — det du ser där ändras inte. En säkerhetskopia skrivs bredvid filen först.","codex.title":"Codex-integration","codex.desc":"Codex-sessioner syns i sidopanelen med sitt <b>tillstånd</b> (arbetar · väntar på godkännande · klart · avbrutet) och <b>staplar för modell, konto och förbrukning</b>. Öppna Codex igen efter installationen och granska och godkänn AgentDecks krokar under <code>/hooks</code>.","codex.disabled":"Codex har stängt av dessa krokar — inget kommer fram förrän du slår på dem: {events}. Öppna Codex, kör <code>/hooks</code> och godkänn dem.","root.head":"Profil för arbetsmapp","root.intro":"Skapar en profil så att nya flikar alltid öppnas i samma mapp. Ändringar gäller efter omstart av Tabby.","root.use.title":"Använd en profil för arbetsmapp","root.use.desc":"Slå på och fyll i mappen — profilen skapas och blir standard.","root.name.title":"Profilnamn","root.cwd.title":"Arbetsmapp","root.cwd.desc":"Lämnar du det tomt skapas ingen profil. Skriver du för hand, använd snedstreck (t.ex. D:/Project) för att undvika fällorna med omvända snedstreck.","root.browse":"Bläddra","root.command.title":"Kommando","diag.head":"Rapportera ett problem","diag.intro":"Samlar diagnostikloggarna i <b>en enda zip</b> och öppnar mappen där den hamnar. Den innehåller: versioner av insticksmodulen och Tabby samt operativsystem, inställningarna ovan och de två senaste generationerna av <code>{path}</code>. Loggarna innehåller <b>flikrubriker och de sökvägar du öppnat</b> — öppna gärna zipfilen och kontrollera innan du skickar den.","diag.screen.title":"Ta med råa skärminnehållet","diag.screen.desc":"Slå på vid ritproblem. Terminalskärmen följer med ordagrant — ditt arbete och din kod syns i den — därför är det avstängt som standard.","diag.collect.title":"Samla loggarna","diag.collect.desc":"Insticksmodul v{version}.","diag.made":"Skapad: ","diag.btn":"Samla","dev.head":"Utvecklaralternativ","dev.use.title":"Aktivera utvecklaralternativ","dev.use.desc":"Slår på <b>direktomladdning</b> — när <code>npm run build</code> skriver om <code>dist/index.js</code> laddas fönstret om till den nya insticksmodulen <b>med sessionerna i behåll</b> (flikarna kopplas tillbaka till samma pty). Snabbtangenten <b>[dev] Ladda om insticksmodulen</b> följer också den här brytaren. Med den av händer ingenting när dist ändras. Visas bara vid installation från källträdet; npm-bygget har inte det här.","dev.now.title":"Ladda om nu","dev.now.desc":"Laddar om nuvarande dist utan att bygga.","dev.btn":"Ladda om",footer:"Resten — fönsterproportion, sidopanelens bredd, opacitet, tillståndsdetektering, indatahantering — är låst till standardvärdena. Behöver du ändra något, redigera <code>agentDeck.*</code> direkt i konfigurationsfilen. Snabbtangenterna finns under fliken <b>Snabbtangenter</b> som <code>agentdeck-*</code>.","keys.head":"Snabbtangenter","keys.intro":"Tangenterna från startsidan. Tryck <b>Ändra</b> och sedan den nya tangenten. Är den redan upptagen — av Tabby självt eller av AgentDeck — får du veta <b>vad den krockar med</b> och kan välja om eller ta över den. Gäller direkt.","keys.change":"Ändra","keys.default":"Standard","keys.cancel":"Avbryt","keys.force":"Använd ändå","keys.press":"Tryck på den nya tangenten… (Esc avbryter)","keys.conflict":"Krockar med {names}. Använder du den ändå tas tangenten bort där.","keys.unbound":"ej tilldelad","keys.stock":"Tabbys egen","keys.digit":"Den här måste sluta på en siffra 1–9 — siffran är sessionsnumret. Tryck t.ex. Alt+1 så följer 2…9 med.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, högerklick och panelens <code>Ctrl+F</code> / <code>Ctrl+S</code> är inte snabbtangenter och ändras inte här.","keys.item.newtab":"Ny flik i arbetsroten","keys.item.jump":"Hoppa till session N","keys.item.focus":"Fokus på sessionslistan / tillbaka till terminalen","keys.item.view":"Öppna / stäng förhandsvisningspanelen","keys.item.repair":"Reparera skärmen","keys.item.splitright":"Dela sida vid sida (ny ruta till höger)","keys.item.splitbottom":"Dela över / under (ny ruta nedanför)","keys.item.closepane":"Stäng den aktiva delade rutan","keys.item.newline":"Radbrytning utan att skicka","keys.item.toggle":"Sidopanel / 4:3 på-av","keys.item.viewmode":"Panel: Filer ↔ Ändringar"}},171(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Ek çalışma profilleri","root.choose.desc":"Birden fazla çalışma klasörü kaydedin ve yeni sekme açarken bir profil seçin.","root.add":"Profil ekle","root.remove":"Profili kaldır","layout.title":"AgentDeck düzenini kullan","layout.desc":"Kapatırsanız kenar çubuğu ve sabit genişlik kaybolur, Tabby’nin özgün görünümüne dönersiniz.","reset.title":"Düzeni sıfırla","reset.desc":"Kenar çubuğunu ilk hâline döndürür — sağa yaslı ve genişliği pencere oranından hesaplanmış.","reset.now":"Şu an: {dock} yaslı, {size}.","reset.default":"Şu anda her şey varsayılan durumda.","reset.btn":"Sıfırla","dock.left":"sola","dock.right":"sağa","dock.top":"üste","dock.bottom":"alta","size.width":"genişlik {px} px","size.height":"yükseklik {px} px","size.auto":"genişlik otomatik","norecover.title":"Açılışta sekmeleri geri yükleme","norecover.desc":"Tabby eski sekmeleri geri getirmek yerine boş açılır — geri gelen zaten yalnızca kabuk, içindeki Claude oturumu çoktan bitmiş oluyor. Kapatırsanız Tabby’nin özgün davranışına (<code>recoverTabs</code>) dönersiniz. Bir sonraki açılıştan itibaren geçerlidir.","resume.title":"Geçmiş oturumları sürdür","resume.desc":"Her grubun sonuna <code>⟲ Geçmiş oturumlar</code> çekmecesi ekler (varsayılan olarak kapalı). Açtığınızda <b>kapanmış Claude Code ve Codex oturumları</b> gerçekten yazdığınız istemle listelenir; birine tıklayınca konuşma, kendi çalışma klasöründe <code>claude --resume</code> ya da <code>codex resume</code> ile geri gelir. Bu, yukarıdaki <b>Açılışta sekmeleri geri yükleme</b> ayarının diğer yarısıdır — özgün geri yükleme kabuğu getirir, bu ise konuşmayı getirir. <b>O sırada açık olan sunucular ve arka plan süreçleri geri gelmez.</b>","agents.head":"Aracı entegrasyonu","agents.intro":"Her aracının durumunu, kullandığı modeli ve kullanım sınırlarını <b>kendisinin bildirmesini</b> sağlar. Kenar çubuğunun sahip olduğu en doğru kaynak budur — bağlamazsanız ekrana çizilen yazıdan tahmin ederiz ve okuma o ölçüde oynar.","agents.unsupported.title":"Bu platformda kullanılamaz","agents.unsupported.desc":"Bildirim betiği PowerShell olduğundan yalnızca Windows’ta çalışır. Durum bunun yerine çıktıdan tahmin edilir.","state.on":"Bağlı","state.off":"Bağlı değil","state.half":"Yarım bağlı","btn.install":"Kur","btn.remove":"Kaldır","claude.title":"Claude entegrasyonu","claude.desc":"Claude Code oturumları kenar çubuğunda <b>durumuyla</b> (çalışıyor · onay bekliyor · bitti) ve <b>model, hesap ve kullanım çubuklarıyla</b> görünür. <code>~/.claude/settings.json</code> içindeki kancaları ve <code>statusLine</code> ayarını birlikte kurar, birlikte kaldırır. Diğer kancalara dokunmaz ve hâlihazırda kullandığınız <code>statusLine</code> <b>olduğu gibi çalıştırılır</b>, yani orada gördüğünüz değişmez. Yazmadan önce aynı klasöre bir yedek bırakılır.","codex.title":"Codex entegrasyonu","codex.desc":"Codex oturumları kenar çubuğunda <b>durumuyla</b> (çalışıyor · onay bekliyor · bitti · kesildi) ve <b>model, hesap ve kullanım çubuklarıyla</b> görünür. Kurduktan sonra Codex’i yeniden açın ve <code>/hooks</code> altında AgentDeck kancalarını gözden geçirip onaylayın.","codex.disabled":"Codex bu kancaları kapatmış — açmadan hiçbir şey gelmez: {events}. Codex’i açın, <code>/hooks</code> çalıştırın ve onaylayın.","root.head":"Çalışma klasörü profili","root.intro":"Yeni sekmelerin hep aynı klasörde açılması için özel bir profil oluşturur. Değişiklikler Tabby yeniden başlatıldıktan sonra geçerli olur.","root.use.title":"Çalışma klasörü profilini kullan","root.use.desc":"Açıp klasörü doldurun — profil oluşturulur ve varsayılan profil olur.","root.name.title":"Profil adı","root.cwd.title":"Çalışma klasörü","root.cwd.desc":"Boş bırakırsanız profil oluşturulmaz. Elle yazarken ters eğik çizgi kaçış tuzaklarına düşmemek için düz eğik çizgi kullanın (örn. D:/Project).","root.browse":"Gözat","root.command.title":"Komut","diag.head":"Sorun bildir","diag.intro":"Tanılama günlüklerini <b>tek bir zip dosyasında</b> toplar ve dosyanın bulunduğu klasörü açar. İçinde şunlar var: eklenti/Tabby sürümleri ve işletim sistemi, yukarıdaki ayarlar ve <code>{path}</code> yolunun en son iki kuşağı. Günlüklerde <b>sekme başlıkları ve açtığınız dosya yolları</b> yer alır — göndermeden önce zip’i açıp kontrol edebilirsiniz.","diag.screen.title":"Ham ekran içeriğini de ekle","diag.screen.desc":"Çizim bozukluğu sorunlarında açın. Terminal ekranı olduğu gibi girer — çalışmanız ve kodunuz görünür — bu yüzden varsayılan olarak kapalıdır.","diag.collect.title":"Günlükleri topla","diag.collect.desc":"Eklenti v{version}.","diag.made":"Oluşturuldu: ","diag.btn":"Topla","dev.head":"Geliştirici seçenekleri","dev.use.title":"Geliştirici seçeneklerini etkinleştir","dev.use.desc":"<b>Canlı yeniden yükleme</b>yi açar — <code>npm run build</code> <code>dist/index.js</code> dosyasını yeniden yazdığında pencere, <b>oturumlarınız korunarak</b> yeni eklentiye geçer (sekmeler aynı pty’ye yeniden bağlanır). Kısayol sekmesindeki <b>[dev] Eklentiyi yeniden yükle</b> de bu anahtarı izler. Kapalıyken dist değişse bile hiçbir şey olmaz. Yalnızca kaynak ağacından kurulumda görünür; npm sürümünde bu özellik yoktur.","dev.now.title":"Şimdi yeniden yükle","dev.now.desc":"Derlemeden, mevcut dist ile yeniden yükler.","dev.btn":"Yeniden yükle",footer:"Geri kalanlar — pencere oranı, kenar çubuğu genişliği, saydamlık, durum algılama, giriş işleme — varsayılan değerlere sabitlenmiştir. Birini değiştirmeniz gerekirse yapılandırma dosyasındaki <code>agentDeck.*</code> değerlerini doğrudan düzenleyin. Kısayollar <b>Kısayollar</b> sekmesinde <code>agentdeck-*</code> olarak bulunur.","keys.head":"Kısayollar","keys.intro":"Ana sayfadaki tuşlar. <b>Değiştir</b>e basın, sonra yeni tuşa. Tuş zaten kullanılıyorsa — Tabby'nin kendisi ya da AgentDeck tarafından — <b>neyle çakıştığı</b> söylenir; yeniden seçebilir ya da tuşu devralabilirsiniz. Hemen uygulanır.","keys.change":"Değiştir","keys.default":"Varsayılan","keys.cancel":"İptal","keys.force":"Yine de kullan","keys.press":"Yeni tuşa basın… (Esc iptal eder)","keys.conflict":"{names} ile çakışıyor. Yine de kullanırsanız tuş oradan kaldırılır.","keys.unbound":"atanmamış","keys.stock":"Tabby'nin kendi","keys.digit":"Bu, 1–9 arası bir rakamla bitmeli — rakam oturum numarasıdır. Örn. Alt+1'e basın, 2…9 da ona uyar.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, sağ tık ve paneldeki <code>Ctrl+F</code> / <code>Ctrl+S</code> kısayol değildir, burada değiştirilmez.","keys.item.newtab":"Çalışma kökünde yeni sekme","keys.item.jump":"N. oturuma git","keys.item.focus":"Oturum listesine odaklan / terminale dön","keys.item.view":"Önizleme panelini aç / kapat","keys.item.repair":"Ekranı onar","keys.item.splitright":"Yan yana böl (yeni bölme sağda)","keys.item.splitbottom":"Alt alta böl (yeni bölme altta)","keys.item.closepane":"Odaklanılan bölmeyi kapat","keys.item.newline":"Göndermeden yeni satır","keys.item.toggle":"Kenar çubuğu / 4:3 aç-kapat","keys.item.viewmode":"Panel: Dosyalar ↔ Değişiklikler"}},3893(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Додаткові робочі профілі","root.choose.desc":"Збережіть кілька робочих папок і вибирайте профіль, відкриваючи нову вкладку.","root.add":"Додати профіль","root.remove":"Видалити профіль","layout.title":"Використовувати розкладку AgentDeck","layout.desc":"Вимкніть — зникнуть бічна панель і фіксована ширина, повернеться звичайний вигляд Tabby.","reset.title":"Скинути розкладку","reset.desc":"Повертає бічну панель до початкового стану — закріплена праворуч, ширина обчислена із пропорцій вікна.","reset.now":"Зараз: закріплена {dock}, {size}.","reset.default":"Зараз усе на типових значеннях.","reset.btn":"Скинути","dock.left":"ліворуч","dock.right":"праворуч","dock.top":"угорі","dock.bottom":"внизу","size.width":"ширина {px} px","size.height":"висота {px} px","size.auto":"ширина автоматично","norecover.title":"Не відновлювати вкладки під час запуску","norecover.desc":"Tabby запускається порожнім замість повернення попередніх вкладок — повертається лише оболонка, а сеанс Claude усередині неї давно завершився. Вимкніть, щоб повернути штатну поведінку (<code>recoverTabs</code>). Діє з наступного запуску.","resume.title":"Продовжити минулі сеанси","resume.desc":"Додає в кінець кожної групи шухляду <code>⟲ Минулі сеанси</code> (типово згорнуту). Усередині перелічено <b>закриті сеанси Claude Code і Codex</b> — із тим запитом, який ви справді набирали; після кліку розмова повертається через <code>claude --resume</code> або <code>codex resume</code> у власній робочій теці. Це друга половина пункту <b>Не відновлювати вкладки</b> вище: штатне відновлення повертає оболонку, а це — розмову. <b>Запущені тоді сервери та фонові процеси не повертаються.</b>","agents.head":"Підключення агентів","agents.intro":"Дає змогу кожному агентові <b>самому повідомляти</b> свій стан, модель та ліміти. Це найточніше джерело для бічної панелі — без нього ми вгадуємо за текстом, намальованим на екрані, і оцінка відповідно хитається.","agents.unsupported.title":"Недоступно на цій платформі","agents.unsupported.desc":"Скрипт сповіщень написано на PowerShell, тож він працює лише у Windows. Стан визначається з виводу.","state.on":"Підключено","state.off":"Не підключено","state.half":"Підключено наполовину","btn.install":"Встановити","btn.remove":"Вилучити","claude.title":"Підключення Claude","claude.desc":"Сеанси Claude Code з’являються в бічній панелі зі своїм <b>станом</b> (працює · чекає підтвердження · готово) та <b>смугами моделі, облікового запису й лімітів</b>. Хуки та <code>statusLine</code> у <code>~/.claude/settings.json</code> встановлюються разом і вилучаються разом. Інших хуків не чіпаємо, а наявну <code>statusLine</code> <b>запускаємо як є</b> — те, що ви там бачите, не змінюється. Перед записом поруч із файлом зберігається резервна копія.","codex.title":"Підключення Codex","codex.desc":"Сеанси Codex з’являються в бічній панелі зі своїм <b>станом</b> (працює · чекає підтвердження · готово · перервано) та <b>смугами моделі, облікового запису й лімітів</b>. Після встановлення відкрийте Codex знову та перегляньте й довіртеся хукам AgentDeck у <code>/hooks</code>.","codex.disabled":"Codex вимкнув ці хуки — доки ви їх не увімкнете, нічого не надходить: {events}. Відкрийте Codex, виконайте <code>/hooks</code> і довіртеся їм.","root.head":"Профіль робочої теки","root.intro":"Створює профіль, щоб нові вкладки завжди відкривалися в одній теці. Зміни діють після перезапуску Tabby.","root.use.title":"Використовувати профіль робочої теки","root.use.desc":"Увімкніть і вкажіть теку — профіль буде створено й зроблено типовим.","root.name.title":"Назва профілю","root.cwd.title":"Робоча тека","root.cwd.desc":"Залиште порожнім — профіль не створюється. Вписуючи вручну, використовуйте прямі скісні риски (наприклад D:/Project), щоб не потрапити в пастки екранування зворотних скісних.","root.browse":"Огляд","root.command.title":"Команда","diag.head":"Повідомити про проблему","diag.intro":"Збирає діагностичні журнали <b>в один zip</b> і відкриває теку, де він з’явився. Усередині: версії плагіна й Tabby, ОС, налаштування вище та два останні покоління <code>{path}</code>. У журналах є <b>заголовки вкладок і шляхи, які ви відкривали</b> — перед надсиланням архів можна відкрити й перевірити.","diag.screen.title":"Додати й сирий екран","diag.screen.desc":"Вмикайте для проблем із відмальовуванням. Екран термінала потрапляє дослівно — у ньому видно вашу роботу й код, — тому типово вимкнено.","diag.collect.title":"Зібрати журнали","diag.collect.desc":"Плагін v{version}.","diag.made":"Створено: ","diag.btn":"Зібрати","dev.head":"Параметри розробника","dev.use.title":"Увімкнути параметри розробника","dev.use.desc":"Вмикає <b>гаряче перезавантаження</b>: щойно <code>npm run build</code> перезапише <code>dist/index.js</code>, вікно перезавантажиться на новий плагін <b>зі збереженням сеансів</b> (вкладки знову приєднаються до того самого pty). Комбінація <b>[dev] Перезавантажити плагін</b> теж підпорядковується цьому перемикачу. Коли вимкнено, зміна dist нічого не робить. Видно лише при встановленні з вихідних кодів; у збірці з npm цього немає.","dev.now.title":"Перезавантажити зараз","dev.now.desc":"Перезавантажує поточний dist без збирання.","dev.btn":"Перезавантажити",footer:"Решта — пропорції вікна, ширина бічної панелі, непрозорість, визначення стану, обробка вводу — зафіксована на типових значеннях. Якщо треба щось змінити, правте <code>agentDeck.*</code> просто у файлі конфігурації. Гарячі клавіші — на вкладці <b>Гарячі клавіші</b> під іменами <code>agentdeck-*</code>.","keys.head":"Гарячі клавіші","keys.intro":"Клавіші з головної сторінки. Натисніть <b>Змінити</b>, потім нову клавішу. Якщо вона вже зайнята — самим Tabby чи AgentDeck — вам повідомлять, <b>з чим вона конфліктує</b>, і можна обрати іншу або забрати цю. Діє одразу.","keys.change":"Змінити","keys.default":"Типово","keys.cancel":"Скасувати","keys.force":"Усе одно використати","keys.press":"Натисніть нову клавішу… (Esc — скасувати)","keys.conflict":"Конфліктує з {names}. Якщо використати все одно, клавішу буде знято звідти.","keys.unbound":"не призначено","keys.stock":"вбудована в Tabby","keys.digit":"Тут сполучення має закінчуватися цифрою 1–9 — цифра і є номером сесії. Натисніть, наприклад, Alt+1, і 2…9 підлаштуються.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, правий клік і <code>Ctrl+F</code> / <code>Ctrl+S</code> у панелі — не гарячі клавіші, тут вони не змінюються.","keys.item.newtab":"Нова вкладка в робочому корені","keys.item.jump":"Перейти до N-ї сесії","keys.item.focus":"Фокус на список сесій / назад у термінал","keys.item.view":"Відкрити / закрити панель перегляду","keys.item.repair":"Полагодити екран","keys.item.splitright":"Розділити по горизонталі (нова панель праворуч)","keys.item.splitbottom":"Розділити по вертикалі (нова панель знизу)","keys.item.closepane":"Закрити активну розділену панель","keys.item.newline":"Новий рядок без надсилання","keys.item.toggle":"Бічна панель / 4:3 увімк-вимк","keys.item.viewmode":"Панель: Файли ↔ Зміни"}},6981(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"其他工作根目录配置","root.choose.desc":"保存多个工作文件夹,并在打开新标签页时选择配置。","root.add":"添加配置","root.remove":"删除配置","layout.title":"使用 AgentDeck 布局","layout.desc":"关闭后侧边栏和固定宽度布局会消失,回到 Tabby 原版界面。","reset.title":"重置界面布局","reset.desc":"把用鼠标改过的侧边栏位置和大小还原到初始状态 —— 停靠在右侧,宽度按窗口比例自动计算。","reset.now":"当前:停靠在{dock},{size}。","reset.default":"当前就是默认状态。","reset.btn":"重置","dock.left":"左侧","dock.right":"右侧","dock.top":"顶部","dock.bottom":"底部","size.width":"宽 {px}px","size.height":"高 {px}px","size.auto":"宽度自动","norecover.title":"启动时不恢复标签页","norecover.desc":"开启后 Tabby 重新打开时不会恢复上次的标签页,而是从空白开始 —— 能恢复的只有 shell,里面的 Claude 会话早就结束了。 关闭则回到 Tabby 原版行为(<code>recoverTabs</code>)。下次启动生效。","resume.title":"继续过去的会话","resume.desc":"在每个分组末尾放一个 <code>⟲ 过去的会话</code> 抽屉(默认折叠)。 展开后会按你当时实际输入的提示词列出<b>已关闭的 Claude Code 与 Codex 会话</b>; 点击其中一条,就会在那个会话的工作目录里用 <code>claude --resume</code> 或 <code>codex resume</code> 把对话接回来。它与上面的<b>不恢复标签页</b>是一对 —— 原版恢复只找回 shell,这个找回对话。 <b>但当时开着的服务器和后台进程不会回来。</b>","agents.head":"代理集成","agents.intro":"让每个代理<b>自己上报</b>状态、所用模型和用量上限。 这是侧边栏最准确的信息来源 —— 不接入就只能靠屏幕上画出来的文字去猜,判断自然会飘。","agents.unsupported.title":"此平台不支持","agents.unsupported.desc":"通知脚本是 PowerShell,只能在 Windows 上运行。状态改为从输出内容推测。","state.on":"已连接","state.off":"未连接","state.half":"连接不完整","btn.install":"安装","btn.remove":"移除","claude.title":"Claude 集成","claude.desc":"Claude Code 会话会显示在侧边栏,带<b>状态</b>(进行中 · 等待批准 · 已完成)和<b>模型、账号、用量条</b>。 会一并写入 <code>~/.claude/settings.json</code> 里的钩子和 <code>statusLine</code>,移除时也一并移除。 其他钩子不会被动到,你原有的 <code>statusLine</code> 会<b>原样执行</b>,所以显示不会变。 写入前会在同一目录留一份备份。","codex.title":"Codex 集成","codex.desc":"Codex 会话会显示在侧边栏,带<b>状态</b>(进行中 · 等待批准 · 已完成 · 已中断)和<b>模型、账号、用量条</b>。 安装后请重新打开 Codex,在 <code>/hooks</code> 中查看并信任 AgentDeck 的钩子。","codex.disabled":"Codex 关闭了这些钩子 —— 不打开就什么都收不到:{events}。 请在 Codex 中执行 <code>/hooks</code> 并信任它们。","root.head":"工作目录配置","root.intro":"创建一个专用配置,让新标签页总是在同一个工作目录打开。修改在重启 Tabby 后生效。","root.use.title":"使用工作目录配置","root.use.desc":"开启并填好目录后,会创建该配置并设为默认。","root.name.title":"配置名称","root.cwd.title":"工作目录","root.cwd.desc":"留空则不创建配置。手动输入时请用正斜杠(例如 D:/Project),以避开反斜杠转义的坑。","root.browse":"浏览","root.command.title":"启动命令","diag.head":"报告问题","diag.intro":"把诊断日志<b>打包成一个 zip</b>,并打开它所在的文件夹。 里面包含:插件/Tabby 版本与操作系统、上面的设置值,以及 <code>{path}</code> 最近的两代日志。 日志里有<b>标签页标题和你打开过的文件路径</b> —— 发送前可以先打开确认。","diag.screen.title":"连屏幕原文一起打包","diag.screen.desc":"如果是画面错乱的问题就开启。出问题那一刻的终端画面会原样写入(工作内容和代码都能看到),所以默认是关闭的。","diag.collect.title":"收集诊断日志","diag.collect.desc":"插件 v{version}。","diag.made":"已创建:","diag.btn":"收集","dev.head":"开发者选项","dev.use.title":"启用开发者选项","dev.use.desc":"开启后<b>实时重载</b>生效 —— 当 <code>npm run build</code> 改写了 <code>dist/index.js</code>,窗口会<b>在保留会话的情况下</b>重载到新插件(标签页重新接回同一个 pty)。快捷键页的 <b>[dev] 重载插件</b> 也跟随这个开关。 关闭后即使 dist 变了也不会有任何动作。 仅源码安装可见,npm 发布版没有这个功能。","dev.now.title":"立即重载","dev.now.desc":"不重新构建,直接用当前的 dist 重新加载。","dev.btn":"重载",footer:"其余项 —— 窗口比例、侧边栏宽度、不透明度、状态检测、输入处理 —— 都固定为默认值。 确实需要改时请直接编辑配置文件里的 <code>agentDeck.*</code>。 快捷键在<b>快捷键</b>页的 <code>agentdeck-*</code> 项中修改。","keys.head":"快捷键","keys.intro":"首页列出的那些键。点<b>更改</b>,再按新键。若这个键已被占用——无论是 Tabby 自身还是 AgentDeck——会告诉你<b>与什么冲突</b>,可以重选或直接接管。立即生效。","keys.change":"更改","keys.default":"默认值","keys.cancel":"取消","keys.force":"仍然使用","keys.press":"请按新键… (Esc 取消)","keys.conflict":"与 {names} 冲突。仍然使用的话,会从那里移除这个键。","keys.unbound":"未绑定","keys.stock":"Tabby 自带","keys.digit":"这一项必须以数字 1–9 结尾——数字就是会话序号。例如按 Alt+1,2…9 会随之设置。","keys.fixed":"<code>Ctrl+V</code>、<code>Ctrl+W</code>、右键,以及面板内的 <code>Ctrl+F</code> / <code>Ctrl+S</code> 不是热键,这里不改。","keys.item.newtab":"在工作根目录新建标签","keys.item.jump":"跳到第 N 个会话","keys.item.focus":"聚焦会话列表 / 回到终端","keys.item.view":"打开 / 关闭预览面板","keys.item.repair":"修复屏幕","keys.item.splitright":"左右分割(新窗格在右)","keys.item.splitbottom":"上下分割(新窗格在下)","keys.item.closepane":"关闭当前分割窗格","keys.item.newline":"换行而不发送","keys.item.toggle":"侧栏 / 4:3 开关","keys.item.viewmode":"面板:文件 ↔ 更改"}},2653(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"其他工作根目錄設定檔","root.choose.desc":"儲存多個工作資料夾,並在開啟新分頁時選擇設定檔。","root.add":"新增設定檔","root.remove":"刪除設定檔","layout.title":"使用 AgentDeck 版面","layout.desc":"關閉後側邊欄與固定寬度版面會消失,回到 Tabby 原生畫面。","reset.title":"重設介面版面","reset.desc":"把用滑鼠改過的側邊欄位置與大小還原成初始狀態 —— 靠右停駐,寬度依視窗比例自動計算。","reset.now":"目前:停駐在{dock},{size}。","reset.default":"目前就是預設狀態。","reset.btn":"重設","dock.left":"左側","dock.right":"右側","dock.top":"頂端","dock.bottom":"底部","size.width":"寬 {px}px","size.height":"高 {px}px","size.auto":"寬度自動","norecover.title":"啟動時不還原分頁","norecover.desc":"開啟後 Tabby 重新開啟時不會還原上次的分頁,而是從空白開始 —— 能還原的只有 shell,裡面的 Claude 工作階段早就結束了。 關閉則回到 Tabby 原生行為(<code>recoverTabs</code>)。下次啟動生效。","resume.title":"接續過去的工作階段","resume.desc":"在每個群組末端放一個 <code>⟲ 過去的工作階段</code> 抽屜(預設收合)。 展開後會依你當時實際輸入的提示詞列出<b>已關閉的 Claude Code 與 Codex 工作階段</b>; 點其中一筆,就會在該工作階段的工作資料夾裡用 <code>claude --resume</code> 或 <code>codex resume</code> 把對話接回來。它與上面的<b>不還原分頁</b>是一對 —— 原生還原只找回 shell,這個找回對話。 <b>但當時開著的伺服器與背景程序不會回來。</b>","agents.head":"代理整合","agents.intro":"讓每個代理<b>自己回報</b>狀態、使用中的模型與用量上限。 這是側邊欄最準確的來源 —— 不接上就只能從畫面上的文字去猜,判斷自然會飄。","agents.unsupported.title":"此平台不支援","agents.unsupported.desc":"通知指令碼是 PowerShell,只能在 Windows 上執行。狀態改為從輸出內容推測。","state.on":"已連接","state.off":"未連接","state.half":"連接不完整","btn.install":"安裝","btn.remove":"移除","claude.title":"Claude 整合","claude.desc":"Claude Code 工作階段會顯示在側邊欄,附<b>狀態</b>(進行中 · 等待核准 · 已完成)與<b>模型、帳號、用量長條</b>。 會一併寫入 <code>~/.claude/settings.json</code> 裡的掛鉤與 <code>statusLine</code>,移除時也一併移除。 其他掛鉤不會被動到,你原有的 <code>statusLine</code> 會<b>照原樣執行</b>,所以顯示不會變。 寫入前會在同一資料夾留一份備份。","codex.title":"Codex 整合","codex.desc":"Codex 工作階段會顯示在側邊欄,附<b>狀態</b>(進行中 · 等待核准 · 已完成 · 已中斷)與<b>模型、帳號、用量長條</b>。 安裝後請重新開啟 Codex,在 <code>/hooks</code> 中檢視並信任 AgentDeck 的掛鉤。","codex.disabled":"Codex 關閉了這些掛鉤 —— 不開啟就什麼都收不到:{events}。 請在 Codex 中執行 <code>/hooks</code> 並信任它們。","root.head":"工作資料夾設定檔","root.intro":"建立專用設定檔,讓新分頁總是在同一個工作資料夾開啟。變更會在重新啟動 Tabby 後生效。","root.use.title":"使用工作資料夾設定檔","root.use.desc":"開啟並填好資料夾後,就會建立該設定檔並設為預設。","root.name.title":"設定檔名稱","root.cwd.title":"工作資料夾","root.cwd.desc":"留空則不建立設定檔。手動輸入時請用斜線(例如 D:/Project),以避開反斜線跳脫的陷阱。","root.browse":"瀏覽","root.command.title":"執行指令","diag.head":"回報問題","diag.intro":"把診斷記錄<b>打包成一個 zip</b>,並開啟它所在的資料夾。 內容包含:外掛/Tabby 版本與作業系統、上面的設定值,以及 <code>{path}</code> 最近的兩代記錄。 記錄裡有<b>分頁標題與你開啟過的檔案路徑</b> —— 傳送前可以先打開確認。","diag.screen.title":"連畫面原文一起打包","diag.screen.desc":"若是畫面錯亂的問題就開啟。出問題當下的終端機畫面會原樣寫入(工作內容與程式碼都看得到),所以預設是關閉的。","diag.collect.title":"收集診斷記錄","diag.collect.desc":"外掛 v{version}。","diag.made":"已建立:","diag.btn":"收集","dev.head":"開發者選項","dev.use.title":"啟用開發者選項","dev.use.desc":"開啟後<b>即時重新載入</b>生效 —— 當 <code>npm run build</code> 改寫了 <code>dist/index.js</code>,視窗會<b>在保留工作階段的情況下</b>重新載入新的外掛(分頁會重新接回同一個 pty)。快速鍵頁的 <b>[dev] 重新載入外掛</b> 也跟隨這個開關。 關閉後即使 dist 變了也不會有任何動作。 僅原始碼安裝可見,npm 發行版沒有這個功能。","dev.now.title":"立即重新載入","dev.now.desc":"不重新建置,直接用目前的 dist 重新載入。","dev.btn":"重新載入",footer:"其餘項目 —— 視窗比例、側邊欄寬度、不透明度、狀態偵測、輸入處理 —— 都固定為預設值。 確實需要更動時請直接編輯設定檔裡的 <code>agentDeck.*</code>。 快速鍵請在<b>快速鍵</b>頁的 <code>agentdeck-*</code> 項目中修改。","keys.head":"快速鍵","keys.intro":"首頁列出的那些鍵。按<b>變更</b>,再按新鍵。若該鍵已被使用——不論是 Tabby 本身或 AgentDeck——會告訴你<b>與什麼衝突</b>,可以重選或直接接手。立即生效。","keys.change":"變更","keys.default":"預設值","keys.cancel":"取消","keys.force":"仍然使用","keys.press":"請按新鍵… (Esc 取消)","keys.conflict":"與 {names} 衝突。仍然使用的話,會從那裡移除這個鍵。","keys.unbound":"未綁定","keys.stock":"Tabby 內建","keys.digit":"這一項必須以數字 1–9 結尾——數字就是工作階段編號。例如按 Alt+1,2…9 會跟著設定。","keys.fixed":"<code>Ctrl+V</code>、<code>Ctrl+W</code>、右鍵,以及面板內的 <code>Ctrl+F</code> / <code>Ctrl+S</code> 不是快速鍵,這裡不改。","keys.item.newtab":"在工作根目錄開新分頁","keys.item.jump":"跳到第 N 個工作階段","keys.item.focus":"聚焦工作階段清單 / 回到終端機","keys.item.view":"開啟 / 關閉預覽面板","keys.item.repair":"修復畫面","keys.item.splitright":"左右分割(新窗格在右)","keys.item.splitbottom":"上下分割(新窗格在下)","keys.item.closepane":"關閉目前的分割窗格","keys.item.newline":"換行而不送出","keys.item.toggle":"側欄 / 4:3 開關","keys.item.viewmode":"面板:檔案 ↔ 變更"}},1481(e,t){t.flushComposition=t.planSend=t.readCompositionState=void 0,t.readCompositionState=function(e){if(!e||"object"!=typeof e)return"unknown";try{if(!0===e.isComposing)return"composing";if(!0===e._isSendingComposition)return"pending";if("boolean"==typeof e.isComposing||"boolean"==typeof e._isSendingComposition)return"idle"}catch{return"unknown"}return"unknown"},t.planSend=function(e){return"composing"===e?"after-composition":"pending"===e?"defer":"now"},t.flushComposition=function(e,t){if(!e||"function"!=typeof e.keydown)return!1;try{const i=e._compositionPosition;return i&&"number"==typeof i.start&&"number"==typeof i.end&&i.end<=i.start&&"number"==typeof t&&isFinite(t)&&t>i.start&&(i.end=t),e.keydown({keyCode:0}),!0}catch{return!1}}},8156(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)},d=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0});const l=i(860),c=i(4358),u=i(7182),p=s(i(7650)),h=i(7025),g=i(3630),f=i(3700),m=i(8349),v=i(7028),b=i(9771),k=i(7009),y=i(4494),w=i(3496),x=i(7110),S=i(4883),C=i(9980),j=i(9610),A=i(8450),E=i(5174),P=i(1451),z=i(7418);i(3396),r(i(4300),t);let D=class{constructor(e,t,i,n,o,a,s,r,d,l){l.ready$.subscribe(()=>{(0,h.configureStoragePaths)(d.store.agentDeck),(0,g.migrateRuntimeData)(),i.configureStorageRoots()}),e.init(),t.init(),i.init(),n.init(),o.init(),s.init(),a.init(),r.init()}};D=a([(0,l.NgModule)({imports:[c.CommonModule,u.FormsModule,p.default],providers:[{provide:p.ConfigProvider,useClass:v.AgentDeckConfigProvider,multi:!0},{provide:p.HotkeyProvider,useClass:b.AgentDeckHotkeyProvider,multi:!0},{provide:m.TerminalDecorator,useClass:k.AgentDeckDecorator,multi:!0},{provide:f.SettingsTabProvider,useClass:P.AgentDeckSettingsTabProvider,multi:!0}],declarations:[z.AgentDeckSettingsTabComponent]}),d("design:paramtypes",[y.AgentDeckService,w.AgentDeckProfileService,x.WorkNotifyService,S.AgentDeckAlertService,C.AgentDeckRecoveryService,j.AgentDeckUpdateService,A.AgentDeckReloadService,E.AgentDeckDevReloadService,p.ConfigService,p.AppService])],D),t.default=D},9900(e,t,i){t.isDefaultBinding=t.resetBinding=t.applyBinding=t.planBinding=t.displayStrokes=t.KEY_ITEMS=t.RD=t.keystrokeFromEvent=t.iD=t.Gt=void 0;const n=i(9137);t.Gt={darwin:"⌘",win32:"Win",linux:"Super"},t.iD={darwin:"⌥",win32:"Alt",linux:"Alt"};const o={Comma:",",Period:".",Slash:"/",Backslash:"\\",IntlBackslash:"`",Minus:"-",Equal:"=",Semicolon:";",Quote:"'",BracketLeft:"[",BracketRight:"]"},a=new Set(["Control","Meta","Alt","Shift"]);function s(e){var t;if("`"===e.key||"~"===e.key)return e.key;if(/^[A-Za-z]$/.test(e.key))return e.key.toUpperCase();let i=String(e.code||e.key||"");return i=i.replace("Key","").replace("Arrow","").replace("Digit",""),null!==(t=o[i])&&void 0!==t?t:i}function r(e){var t;const i=String(null!=e?e:"");if(i.endsWith("--")){const e=i.slice(0,-2);return{mods:e?e.split("-"):[],key:"-"}}if("-"===i)return{mods:[],key:"-"};const n=i.split("-"),o=null!==(t=n.pop())&&void 0!==t?t:"";return{mods:n,key:o}}function d(e,i){const{mods:n,key:o}=r(e),a=["Ctrl",t.Gt[i],t.iD[i],"Shift"],s=n.map(e=>e.toLowerCase());return[...a.filter(e=>s.includes(e.toLowerCase())),...n.filter(e=>!a.some(t=>t.toLowerCase()===e.toLowerCase())),o].join("-")}function l(e,t,i){return d(e,i).toLowerCase()===d(t,i).toLowerCase()}function c(e,t){const{mods:i,key:n}=r(d(e,t));return[...i,n].join("+")}function u(e){return"string"==typeof e?[[e]]:Array.isArray(e)?e.map(e=>"string"==typeof e?[e]:Array.isArray(e)?e.map(String):null).filter(e=>!!e&&e.length>0):[]}function p(e,t,i,n){const o=[];for(const a of Object.keys(null!=t?t:{}))i.includes(a)||u(t[a]).some(t=>1===t.length&&l(t[0],e,n))&&o.push(a);return o}function h(){return Array.from({length:n.JUMP_SLOTS},(e,t)=>`agentdeck-jump-${t+1}`)}function g(e){return e.jump?h():[e.id]}function f(e){const{mods:t,key:i}=r(e);return/^[1-9]$/.test(i)?{prefix:t.length?t.join("-")+"-":"",digit:Number(i)}:null}t.keystrokeFromEvent=function(e,i){if(a.has(e.key))return null;const n=[];return e.ctrlKey&&n.push("Ctrl"),e.metaKey&&n.push(t.Gt[i]),e.altKey&&n.push(t.iD[i]),e.shiftKey&&n.push("Shift"),[...n,s(e)].join("-")},t.RD="agentdeck-jump",t.KEY_ITEMS=[{id:"agentdeck-new-tab",label:"keys.item.newtab"},{id:t.RD,label:"keys.item.jump",jump:!0},{id:"agentdeck-focus-list",label:"keys.item.focus"},{id:"agentdeck-view",label:"keys.item.view"},{id:"agentdeck-repair",label:"keys.item.repair"},{id:"split-right",label:"keys.item.splitright",stock:!0},{id:"split-bottom",label:"keys.item.splitbottom",stock:!0},{id:"close-pane",label:"keys.item.closepane",stock:!0},{id:"agentdeck-newline",label:"keys.item.newline"},{id:"agentdeck-toggle",label:"keys.item.toggle"},{id:"agentdeck-view-mode",label:"keys.item.viewmode"}],t.displayStrokes=function(e,t,i){var o;if(t.jump){const t=null===(o=u(null==e?void 0:e["agentdeck-jump-1"]).find(e=>1===e.length))||void 0===o?void 0:o[0],a=t?f(t):null;if(!a)return t?[c(t,i)]:[];const s=a.prefix?c(a.prefix+"1",i).slice(0,-1):"";return[`${s}1 … ${s}${n.JUMP_SLOTS}`]}return u(null==e?void 0:e[t.id]).map(e=>e.map(e=>c(e,i)).join(" , "))},t.planBinding=function(e,t,i,n){const o=c(i,n),a={};if(t.jump){const e=f(i);if(!e)return{item:t,writes:a,conflicts:[],display:o,error:"digit"};h().forEach((t,i)=>{a[t]=d(`${e.prefix}${i+1}`,n)})}else a[t.id]=d(i,n);const s=g(t),r=[];for(const t of Object.values(a))for(const i of p(t,e,s,n))r.includes(i)||r.push(i);return{item:t,writes:a,conflicts:r,display:o}},t.applyBinding=function(e,t,i,n){const o=[];for(const[i,n]of Object.entries(t.writes))e[i]=[n],o.push(i);if(i){const i=Object.values(t.writes);for(const a of t.conflicts){const t=u(e[a]).filter(e=>!(1===e.length&&i.some(t=>l(e[0],t,n))));e[a]=t.map(e=>1===e.length?e[0]:e),o.push(a)}}return o},t.resetBinding=function(e,t,i){for(const n of g(t)){const t=i[n];e[n]=Array.isArray(t)?[...t]:"string"==typeof t?[t]:[]}},t.isDefaultBinding=function(e,t,i,n){return g(t).every(t=>{const o=u(null==e?void 0:e[t]).map(e=>e.map(e=>d(e,n).toLowerCase()).join(" ")),a=u(i[t]).map(e=>e.map(e=>d(e,n).toLowerCase()).join(" "));return o.length===a.length&&o.every((e,t)=>e===a[t])})}},3824(e,t){t.MailboxWake=t.MAILBOX_WAKE_TEXT=void 0,t.MAILBOX_WAKE_TEXT="[agentdeck] 새 메시지 {N}건 도착 receive 로 확인하고 acknowledge 할 것",t.MailboxWake=class{constructor(e,t){this.resolve=e,this.log=t,this.pendingWake=new Map,this.results=new Map}enqueue(e){const t=this.results.get(e.id);if(t)return{...t};if(e.completedAt)return{attempted:!1,delivered:!1,reason:"no-tab"};const i={attempted:!1,delivered:!1,reason:"typing-deferred"};this.results.set(e.id,i);let n=this.pendingWake.get(e.toSessionId);return n||(n={ids:new Set,writing:!1},this.pendingWake.set(e.toSessionId,n)),n.ids.add(e.id),this.flush(e.toSessionId),{...i}}flushAll(){for(const e of this.pendingWake.keys())this.flush(e)}reason(e){return e?e.enabled?e.idle?e.composing||Date.now()-e.lastInput<e.typingGuardMs?"typing-deferred":"sent":"busy-deferred":"disabled":"no-tab"}record(e,t,i){for(const e of t.ids)Object.assign(this.results.get(e),{attempted:"sent"===i,delivered:"sent"===i,reason:i});this.log(`mailbox-wake to=${JSON.stringify(e)} n=${t.ids.size} reason=${i}`)}flush(e){const i=this.pendingWake.get(e);if(!i||i.writing)return;i.timer&&(clearTimeout(i.timer),i.timer=void 0);const n=this.resolve(e),o=this.reason(n);if("sent"!==o)return this.record(e,i,o),"no-tab"===o&&this.pendingWake.delete(e),void("typing-deferred"!==o||n.composing||(i.timer=setTimeout(()=>this.flush(e),Math.max(1,n.typingGuardMs-(Date.now()-n.lastInput)))));i.writing=!0;try{n.send(o=>{const a=this.resolve(e),s=(null==a?void 0:a.identity)!==n.identity?"no-tab":this.reason(a);if("sent"!==s)return i.writing=!1,void("no-tab"===s?(this.record(e,i,s),this.pendingWake.delete(e)):this.flush(e));const r=(a.text||t.MAILBOX_WAKE_TEXT).replace(/\{N\}/g,String(i.ids.size)).replace(/[\x00-\x1f\x7f-\x9f\u2028\u2029]/g," ");try{o(r+"\r"),this.record(e,i,"sent")}catch{this.record(e,i,"no-tab")}this.pendingWake.delete(e)})}catch{i.writing=!1,this.record(e,i,"no-tab"),this.pendingWake.delete(e)}}}},8347(e,t){function i(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function n(e){const t=(null!=e?e:"").trim();return t?/^[A-Za-z]:[\\/]/.test(t)?t:/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(t)&&!/^(?:https?|mailto|file):/i.test(t)?null:t:null}function o(e,t){const o=[];let a=e.replace(/(`+)([\s\S]+?)\1(?!`)/g,(e,t,n)=>(o.push("<code>"+i(String(n).replace(/^ | $/g,""))+"</code>"),"\0"+(o.length-1)+"\0"));return a=i(a),a=a.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,i,o)=>{const a=t.resolveImage?t.resolveImage(String(o)):n(String(o));return a?'<img src="'+a+'" alt="'+i+'">':'<span class="ad-md-noimg">🖼 '+(i||o)+"</span>"}),a=a.replace(/\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,t,i)=>{const o=n(String(i));return o?'<a href="'+o+'" data-ad-link="'+o+'">'+t+"</a>":String(t)}),a=a.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),a=a.replace(/__([^_]+)__/g,"<strong>$1</strong>"),a=a.replace(/(^|[\s(\[])\*([^*\n]+)\*/g,"$1<em>$2</em>"),a=a.replace(/(^|[\s(\[])_([^_\n]+)_/g,"$1<em>$2</em>"),a=a.replace(/~~([^~]+)~~/g,"<del>$1</del>"),a.replace(/\u0000(\d+)\u0000/g,(e,t)=>{var i;return null!==(i=o[Number(t)])&&void 0!==i?i:""})}function a(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/.test(e)}function s(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(e=>e.trim())}t.renderMarkdown=t.escapeHtml=void 0,t.escapeHtml=i,t.renderMarkdown=function(e,t={}){var n;const r=String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n"),d=[],l=[];let c=[],u=null;const p=(e=-1)=>{for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>")},h=()=>{c.length&&(d.push("<p>"+o(c.join("\n"),t).replace(/\n/g,"<br>")+"</p>"),c=[])},g=()=>{h(),p()};for(let e=0;e<r.length;e++){const f=r[e];if(u){if(new RegExp("^\\s*"+u.mark+"\\s*$").test(f)){const e=u.lang?' class="ad-md-lang-'+u.lang.replace(/[^\w-]/g,"")+'"':"";d.push("<pre"+e+"><code>"+i(u.body.join("\n"))+"</code></pre>"),u=null}else u.body.push(f);continue}const m=/^\s*(```+|~~~+)\s*([\w+#.-]*)/.exec(f);if(m){g(),u={mark:m[1].slice(0,3),lang:m[2]||"",body:[]};continue}if(!f.trim()){h();continue}const v=/^(#{1,6})\s+(.*)$/.exec(f);if(v){g();const e=v[1].length;d.push("<h"+e+">"+o(v[2].replace(/\s+#+\s*$/,""),t)+"</h"+e+">");continue}if(/^\s*([-*_])\s*(\1\s*){2,}$/.test(f)){g(),d.push("<hr>");continue}if(f.includes("|")&&e+1<r.length&&a(r[e+1])){g();const i=s(f),n=[];let a=e+2;for(;a<r.length&&r[a].includes("|")&&r[a].trim();a++)n.push(s(r[a]));e=a-1,d.push("<table><thead><tr>"+i.map(e=>"<th>"+o(e,t)+"</th>").join("")+"</tr></thead><tbody>"+n.map(e=>"<tr>"+e.map(e=>"<td>"+o(e,t)+"</td>").join("")+"</tr>").join("")+"</tbody></table>");continue}const b=/^\s*>\s?(.*)$/.exec(f);if(b){g();const i=[b[1]];let n=e+1;for(;n<r.length;n++){const e=/^\s*>\s?(.*)$/.exec(r[n]);if(!e)break;i.push(e[1])}e=n-1,d.push("<blockquote>"+o(i.join("\n"),t).replace(/\n/g,"<br>")+"</blockquote>");continue}const k=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/.exec(f);if(k){h();const e=k[1].replace(/\t/g," ").length,i=/\d/.test(k[2]);for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>");const n=l[l.length-1];!n||n.indent<e?(l.push({ordered:i,indent:e}),d.push(i?"<ol>":"<ul>")):n.ordered!==i&&(d.push(l.pop().ordered?"</ol>":"</ul>"),l.push({ordered:i,indent:e}),d.push(i?"<ol>":"<ul>"));const a=/^\[([ xX])\]\s+(.*)$/.exec(k[3]);if(a){const e="x"===a[1].toLowerCase();d.push('<li class="ad-md-task"><span class="ad-md-check">'+(e?"☑":"☐")+"</span> "+o(a[2],t)+"</li>")}else d.push("<li>"+o(k[3],t)+"</li>");continue}l.length&&/^\s{2,}/.test(f)&&(null===(n=d[d.length-1])||void 0===n?void 0:n.startsWith("<li"))?d[d.length-1]=d[d.length-1].replace(/<\/li>$/,"<br>"+o(f.trim(),t)+"</li>"):(p(),c.push(f))}return u&&d.push("<pre><code>"+i(u.body.join("\n"))+"</code></pre>"),g(),d.join("\n")}},9851(e,t){t.formatMeta=void 0;const i={claude:"Claude",codex:"Codex",gemini:"Gemini"};function n(e){return e>=85?"hot":e>=60?"warn":"ok"}function o(e,t){if(!Number.isFinite(e)||e<=0)return"";const i=1e3*e-t;if(i<=0)return"곧 리셋";const n=Math.round(i/6e4);if(n<60)return`${Math.max(1,n)}분 뒤 리셋`;const o=Math.floor(n/60);if(o<24){const e=n%60;return e?`${o}시간 ${e}분 뒤 리셋`:`${o}시간 뒤 리셋`}return`${Math.floor(o/24)}일 ${o%24}시간 뒤 리셋`}function a(e,t){return o(e,t).replace(/\s*리셋$/,"")}function s(e,t,i,s,r){if(null==i||""===i)return null;const d=Number(i);if(!Number.isFinite(d))return null;const l=Math.max(0,Math.min(100,Math.round(d)));return{key:e,text:`${t} ${l}%`,pct:l,level:n(l),resetText:o(s,r),resetLine:a(s,r)}}t.formatMeta=function(e,t){var n,o;if(!e)return null;const a=String(e.model||e.modelId||"").trim();if(!a)return null;const r=[null!==(n=i[String(e.agent||"").toLowerCase()])&&void 0!==n?n:"",a,String(e.effort||"").trim()].filter(Boolean).join(" · ")+(e.fastMode?" ⚡":""),d=null!==(o=e.limits)&&void 0!==o?o:{},l=String(d.scopedName||"").trim().toLowerCase(),c=[s("ctx","ctx",e.contextPct,0,t),s("5h","5h",d.fiveHourPct,Number(d.fiveHourResetsAt)||0,t),s("7d","7d",d.sevenDayPct,Number(d.sevenDayResetsAt)||0,t),l?s(l,l,d.scopedPct,Number(d.scopedResetsAt)||0,t):null].filter(e=>!!e),u=String(e.account||"").trim(),p=[r,u?`계정: ${u}${e.org?` (${e.org})`:""}`:"",e.version?`버전: ${e.version}`:"",e.cwd?`폴더: ${e.cwd}`:"",...c.map(e=>e.resetText?`${e.text} — ${e.resetText}`:e.text)].filter(Boolean).join("\n");return{title:r,account:u,gauges:c,tooltip:p}}},9137(e,t){t.pickJumpTarget=t.stepNavIndex=t.pickCloseTarget=t.navRowsOf=t.JUMP_SLOTS=void 0,t.JUMP_SLOTS=9,t.navRowsOf=function(e){const t=[];for(const i of e)if(i.head&&t.push({kind:"head",key:i.key}),!i.collapsed)for(const e of i.tabs)t.push({kind:"tab",tab:e});return t},t.pickCloseTarget=function(e){const{inList:t,focus:i,active:n,tabs:o}=e;return t?i&&"tab"===i.kind&&o.includes(i.tab)?i.tab:null:n&&o.includes(n)?n:null},t.stepNavIndex=function(e,t,i,n){if(!Number.isInteger(e)||e<=0)return-1;if(!Number.isInteger(t)||t<0||t>=e)return i<0?e-1:0;if(!Number.isInteger(i)||0===i)return t;const o=t+i;return o>=0&&o<e?o:n?(o%e+e)%e:t},t.pickJumpTarget=function(e,t){if(!Number.isInteger(t)||t<1)return null;let i=0;for(const n of e)if("tab"===n.kind&&++i===t)return n.tab;return null}},7110(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkNotifyService=void 0;const d=i(860),l=i(7650),c=s(i(9896)),u=s(i(9278)),p=s(i(857)),h=s(i(6928)),g=i(3193),f=i(6021),m=i(102),v=i(1786),b=i(5929),k=i(7282),y=i(9888),w=i(9174),x=i(7797),S=i(3090),C=i(7025),j=i(7507);function A(e){const t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t}초`;const i=Math.floor(t/60);if(i<60)return`${i}분`;const n=Math.floor(i/60);return n<24?n+"시간"+(i%60?` ${i%60}분`:""):Math.floor(n/24)+"일"+(n%24?` ${n%24}시간`:"")}let E=class{setMailboxWake(e){this.mailboxWake=e}mailboxTarget(e){var t,i;if(!(null===(t=this.mailbox)||void 0===t?void 0:t.isActive(e)))return null;const n=[...this.mailboxOwners.entries()].filter(([,t])=>t.sessionId===e);if(1!==n.length)return null;const[o,a]=n[0];if(!this.app.tabs.includes(a.tab))return null;const s=this.panesOf(a.tab).filter(e=>{var t,i,n;return(null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n[y.TAB_ENV])===o});return 1===s.length&&(null===(i=s[0].session)||void 0===i?void 0:i.open)?{tab:a.tab,pane:s[0]}:null}setNavigationRefresh(e){this.navigationRefresh=e}mailboxConnectionState(e){const t=[...this.mailboxOwners.entries()].filter(([,t])=>t.tab===e);return t.length?t.map(([e,t])=>{let i=!1;try{const n=Number(c.readFileSync(h.join(this.mailboxRoot,"mailbox-connections",e+".client"),"utf8"));n>0&&n===t.clientPid&&(process.kill(n,0),i=!0)}catch{}return`session ${t.sessionId}: mailbox=registered; MCP=${i?"connected":"not connected (CLI transport available)"}`}).join("; "):"mailbox=not registered; MCP=not connected"}publishNavigationContext(e){if(e!==this.navigationContext)try{c.mkdirSync(this.mailboxRoot,{recursive:!0}),c.writeFileSync(h.join(this.mailboxRoot,"navigation-context.txt"),e,"utf8"),this.navigationContext=e}catch(e){(0,x.diagCatch)("navigation context",e)}}sessionIdOf(e){const t=this.sessionIdsOf(e);return 1===t.length?t[0]:null}sessionIdsOf(e){return[...new Set([...this.mailboxOwners.values()].filter(t=>t.tab===e).map(e=>e.sessionId))]}registerMailbox(e,t,i){var n,o;if(!i||!(null!==(n=this.tabIds.get(t))&&void 0!==n?n:[]).includes(i))return;const a=this.mailboxOwners.get(i);let s=0;try{s=Number(c.readFileSync(h.join(this.mailboxRoot,"mailbox-connections",i+".client"),"utf8"))}catch{}if((null==a?void 0:a.sessionId)!==e||a.clientPid!==s)try{null!==(o=this.mailbox)&&void 0!==o||(this.mailbox=new w.SessionMailbox(h.join(this.mailboxRoot,"mailbox.json"),e=>{var t,i;return null!==(i=null===(t=this.mailboxWake)||void 0===t?void 0:t.call(this,e))&&void 0!==i?i:{attempted:!1,delivered:!1,reason:"no-tab"}})),a&&a.sessionId!==e&&this.mailbox.close(a.sessionId);const n=this.mailbox.register(e,t.customTitle||t.title||"",this.cwdOf(t)||""),r=h.join(this.mailboxRoot,"mailbox-connections");c.mkdirSync(r,{recursive:!0});for(const e of[i])/^[a-zA-Z0-9_-]+$/.test(e)&&c.writeFileSync(h.join(r,e+".json"),JSON.stringify({...n,clientPid:s}),{mode:384});this.mailboxOwners.set(i,{sessionId:e,tab:t,clientPid:s})}catch(e){(0,x.diagCatch)("mailbox register",e)}}constructor(e,t,i,n){this.app=e,this.config=t,this.status=i,this.platform=n,this.root=h.join(process.env.LOCALAPPDATA||h.join(p.homedir(),"AppData","Local"),"tabby-agentdeck"),this.dir=h.join(this.root,"status"),this.mailboxRoot=process.env.TABBY_CONFIG_DIRECTORY?h.join(process.env.TABBY_CONFIG_DIRECTORY,"agentdeck-mailbox"):this.root,this.mailbox=null,this.mailboxOwners=new Map,this.navigationContext="",this.navigationRefresh=null,this.mailboxWake=null,this.metaDir=h.join(this.root,"meta"),this.portFile=h.join(this.root,"port"),this.server=null,this.sessionTab=new Map,this.tabSession=new Map,this.applied=new Map,this.timer=null,this.startedAt=0,this.tabPids=new Map,this.pidRefreshing=!1,this.tabIds=new Map,this.hookCwd=new WeakMap,this.hookAgent=new WeakMap,this.rejectedMetaSession=new WeakMap,this.touched=new WeakMap,this.liveAgents=new WeakMap,this.agentHookSeen=new WeakSet,this.watchedSplits=new WeakSet,this.pollCount=0,this.metaBySession=new Map,this.codexScans=new Map,this.codexAuth=null,this.codexHome=process.env.CODEX_HOME||h.join(p.homedir(),".codex"),this.onMetaChange=null,this.lastBindLog=new Map,this.scans=new Map,this.projectsDir=h.join(p.homedir(),".claude","projects"),this.accountHomes=new WeakMap}async promptHooksOnce(){var e;const t=this.config.store.agentDeck;if(t.hookPromptDismissed||!(0,v.hooksSupported)())return;try{if((0,v.hooksInstalled)())return}catch{return}const i=await this.platform.showMessageBox({type:"warning",message:"AgentDeck — Claude Code 상태 통보를 연결할까요?",detail:['연결하면 에이전트가 "지시를 받았다 / 승인을 기다린다 / 끝났다" 를 사이드바에 직접 알려줍니다.',"연결하지 않아도 동작은 하지만, 화면에 그려진 글자를 보고 추측하는 방식이라 상태가 부정확할 수 있습니다.","",`설치 위치: ${(0,v.claudeSettingsPath)()}`,"기존 훅은 건드리지 않고, 쓰기 전에 같은 폴더에 백업을 남깁니다. 설정 창에서 언제든 제거할 수 있습니다."].join("\n"),buttons:["연결한다","나중에","다시 묻지 않기"],defaultId:0,cancelId:1});if(0!==i.response)2===i.response&&(t.hookPromptDismissed=!0,this.config.save());else try{(0,v.installHooks)(),t.notifyChannel||(t.notifyChannel=!0),this.config.save()}catch(t){await this.platform.showMessageBox({type:"error",message:"AgentDeck — 훅을 설치하지 못했습니다.",detail:`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`,buttons:["확인"]})}}configureStorageRoots(){this.root=(0,C.runtimeRoot)(),this.dir=h.join(this.root,"status"),this.metaDir=h.join(this.root,"meta"),this.portFile=h.join(this.root,"port"),this.mailboxRoot=h.join(this.root,"mailbox"),this.codexHome=(0,C.agentHome)("codex"),this.projectsDir=h.join((0,C.agentHome)("claude"),"projects")}init(){var e;const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.runtimePaths=()=>({root:this.root,status:this.dir,meta:this.metaDir,mailbox:this.mailboxRoot}),t.__agentdeck.tabIds=()=>[...this.tabIds].map(([e,t])=>{var i;return{title:null!==(i=e.title)&&void 0!==i?i:"",ids:t}}),t.__agentdeck.hookInfo=()=>this.app.tabs.map((e,t)=>{var i,n,o,a,s,r;return{index:t,title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),sessionId:null!==(n=this.tabSession.get(e))&&void 0!==n?n:null,cwd:null!==(o=this.hookCwd.get(e))&&void 0!==o?o:null,touched:null!==(a=this.touched.get(e))&&void 0!==a?a:[],agentHook:this.agentHookSeen.has(e),agents:[...null!==(r=null===(s=this.liveAgents.get(e))||void 0===s?void 0:s.values())&&void 0!==r?r:[]]}}),t.__agentdeck.meta=()=>({dir:this.metaDir,reports:[...this.metaBySession.values()].map(e=>({sessionId:e.sessionId,model:e.model,effort:e.effort,account:e.account,contextPct:e.contextPct,limits:e.limits,ageMs:Date.now()-e.ts,bound:this.app.tabs.indexOf(this.sessionTab.get(e.sessionId))})),active:this.metaOf(this.app.activeTab)}),t.__agentdeck.subagents=()=>({enabled:this.subagentEnabled,projectsDir:this.projectsDir,tabs:[...this.tabSession].map(([e,t])=>{var i,n,o,a,s,r,d,l,c,u,p;const h=this.scans.get(t),g=null==h?void 0:h.summary;return{index:this.app.tabs.indexOf(e),title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),tabId:null!==(o=null===(n=this.tabIds.get(e))||void 0===n?void 0:n[0])&&void 0!==o?o:null,sessionId:t,transcript:null!==(a=null==h?void 0:h.path)&&void 0!==a?a:null,lastSize:null!==(s=null==h?void 0:h.lastSize)&&void 0!==s?s:0,lines:null!==(r=null==h?void 0:h.state.lines)&&void 0!==r?r:0,skipped:null!==(d=null==h?void 0:h.state.skipped)&&void 0!==d?d:0,running:null!==(l=null==g?void 0:g.running)&&void 0!==l?l:0,calls:null!==(c=null==g?void 0:g.calls)&&void 0!==c?c:0,done:null!==(u=null==g?void 0:g.done)&&void 0!==u?u:0,items:(null!==(p=null==g?void 0:g.items)&&void 0!==p?p:[]).map(e=>({id:e.id,description:e.description,subagentType:e.subagentType,startedAt:e.startedAt})),tooltip:g?this.subagentTooltip(g):""}})}),this.app.ready$.subscribe(()=>{for(const e of[...this.app.tabs])this.stampRoot(e);setTimeout(()=>{this.promptHooksOnce()},3e3),this.config.store.agentDeck.notifyChannel&&(this.startedAt=Date.now(),this.listen(),this.timer=setInterval(()=>this.poll(),400),this.refreshPids())}),this.app.tabOpened$.subscribe(e=>{this.stampRoot(e),setTimeout(()=>{this.refreshPids()},1500)}),this.app.tabClosed$.subscribe(e=>{var t;for(const[i,n]of this.mailboxOwners)n.tab===e&&(null===(t=this.mailbox)||void 0===t||t.close(n.sessionId),this.mailboxOwners.delete(i));this.tabPids.delete(e),this.tabIds.delete(e);const i=this.tabSession.get(e);i&&(this.tabSession.delete(e),this.sessionTab.delete(i),this.scans.delete(i))})}diag(e){(0,x.diag)(e)}tabName(e){const t=e;return JSON.stringify(String(t.customTitle||t.title||"").slice(0,40))}async refreshPids(){var e;if(!this.pidRefreshing){this.pidRefreshing=!0;try{for(const t of[...this.app.tabs]){const i=[];for(const n of this.panesOf(t)){const t=null===(e=null==n?void 0:n.session)||void 0===e?void 0:e.pty;if(t&&"function"==typeof t.getPID)try{const e=await t.getPID();Number.isInteger(e)&&e>0&&i.push(e)}catch{}}const n=this.tabPids.get(t);n&&n.join(",")===i.join(",")||(this.tabPids.set(t,i),this.diag(`pid-map tab=${this.tabName(t)} pids=[${i.join(",")}]`))}}finally{this.pidRefreshing=!1}}}panesOf(e){const t=e;return"function"==typeof t.getAllTabs?t.getAllTabs():[e]}isLocalProfile(e){return!!e&&"local"===e.type&&!!e.options&&"object"==typeof e.options}stampRoot(e){this.stampPanes(e);const t=e;t._recoveredState&&"object"==typeof t._recoveredState&&this.stampRecoveryState(t._recoveredState,e),t.tabAdded$&&"function"==typeof t.tabAdded$.subscribe&&!this.watchedSplits.has(e)&&(this.watchedSplits.add(e),t.tabAdded$.subscribe(()=>this.stampPanes(e)))}stampPanes(e){for(const t of this.panesOf(e))this.stampPane(t,e);this.refreshTabIds()}stampPane(e,t){var i;if(!e||e.session||!this.isLocalProfile(e.profile)||e.profile.options.restoreFromPTYID)return;const n=null!==(i=e.profile.options.env)&&void 0!==i?i:{},o="string"==typeof n[y.TAB_ENV]?n[y.TAB_ENV]:"";if(o&&!this.idTakenElsewhere(o,e))return;const a=(0,y.newTabId)();e.profile={...e.profile,options:{...e.profile.options,env:{...n,[y.TAB_ENV]:a,...(0,C.runtimeEnvironment)()}}},void 0!==e.sessionOptions&&(e.sessionOptions=e.profile.options),this.diag(`tabid stamp tab=${this.tabName(t)} id=${a}${o?` (was ${o}: duplicate)`:""}`)}stampRecoveryState(e,t){var i;if(Array.isArray(e.children)){for(const i of e.children)i&&"object"==typeof i&&this.stampRecoveryState(i,t);return}const n=e.profile;if(!this.isLocalProfile(n)||n.options.restoreFromPTYID)return;const o=(0,y.newTabId)();e.profile={...n,options:{...n.options,env:{...null!==(i=n.options.env)&&void 0!==i?i:{},[y.TAB_ENV]:o,...(0,C.runtimeEnvironment)()}}},this.diag(`tabid stamp tab=${this.tabName(t)} id=${o} (recovery token)`)}idTakenElsewhere(e,t){var i,n,o;for(const a of this.app.tabs)for(const s of this.panesOf(a))if(s!==t&&(null===(o=null===(n=null===(i=null==s?void 0:s.profile)||void 0===i?void 0:i.options)||void 0===n?void 0:n.env)||void 0===o?void 0:o[y.TAB_ENV])===e)return!0;return!1}refreshTabIds(){var e,t,i;const n=new Map,o=new Set,a=new Map;for(const s of[...this.app.tabs]){const r=[];for(const a of this.panesOf(s)){const d=null===(i=null===(t=null===(e=null==a?void 0:a.profile)||void 0===e?void 0:e.options)||void 0===t?void 0:t.env)||void 0===i?void 0:i[y.TAB_ENV];if("string"!=typeof d||!d||r.includes(d))continue;r.push(d);const l=n.get(d);l&&l!==s?o.add(d):n.set(d,s)}a.set(s,r)}for(const e of[...this.tabIds.keys()])a.has(e)||this.tabIds.delete(e);for(const[e,t]of a){const i=t.filter(e=>!o.has(e)),n=this.tabIds.get(e);if(!n||n.join(",")!==i.join(",")){this.tabIds.set(e,i);const n=t.filter(e=>o.has(e));this.diag(`tabid-map tab=${this.tabName(e)} ids=[${i.join(",")}]`+(n.length?` dup-dropped=[${n.join(",")}]`:""))}}}retireMissingMailboxPanes(){var e,t;for(const[i,n]of this.mailboxOwners)(null!==(e=this.tabIds.get(n.tab))&&void 0!==e?e:[]).includes(i)||(null===(t=this.mailbox)||void 0===t||t.close(n.sessionId),this.mailboxOwners.delete(i))}get debugDir(){return this.dir}get debugPort(){var e;const t=null===(e=this.server)||void 0===e?void 0:e.address();return t&&"object"==typeof t?t.port:0}listen(){const e=u.createServer(e=>{let t="";e.setEncoding("utf8"),e.on("data",i=>{if(t+=i,t.length>262144)return void e.destroy();let n;for(;(n=t.indexOf("\n"))>=0;){const i=t.slice(0,n);t=t.slice(n+1),this.acceptMailbox(i,e)||this.accept(i)}}),e.on("end",()=>this.accept(t)),e.on("error",()=>{})});let t=!1;e.on("error",i=>{if(!t)return t=!0,(0,x.diagCatch)("notify channel listen (고정 포트 실패, 임의 포트로 재시도)",i),void e.listen(0,"127.0.0.1");(0,x.diagCatch)("notify channel listen 최종 실패",i),this.server=null;try{c.unlinkSync(this.portFile)}catch{}}),e.on("listening",()=>{this.server=e;try{c.mkdirSync(this.root,{recursive:!0}),c.writeFileSync(this.portFile,String(this.debugPort),"utf8"),c.mkdirSync(this.mailboxRoot,{recursive:!0}),c.writeFileSync(h.join(this.mailboxRoot,"port"),String(this.debugPort),"utf8")}catch(e){(0,x.diagCatch)("notify port 파일 쓰기",e)}}),e.listen(this.config.store.agentDeck.notifyPort||0,"127.0.0.1")}acceptMailbox(e,t){var i;let n;try{n=JSON.parse(e)}catch{return!1}if("agentdeck-navigation"===(null==n?void 0:n.channel)){try{this.retireMissingMailboxPanes(),null===(i=this.navigationRefresh)||void 0===i||i.call(this),t.write(JSON.stringify({result:{capturedAt:(new Date).toISOString(),context:this.navigationContext}})+"\n")}catch{t.write(JSON.stringify({error:"Navigation snapshot unavailable"})+"\n")}return!0}if("agentdeck-mailbox"!==(null==n?void 0:n.channel))return!1;try{if(this.retireMissingMailboxPanes(),!this.mailbox)throw new Error("No connected sessions");const e=this.mailbox.call(n.sessionId,n.token,n.method,n.arguments);t.write(JSON.stringify({result:e})+"\n")}catch(e){t.write(JSON.stringify({error:String(e.message)})+"\n")}return!0}accept(e){const t=e.trim();if(t)try{this.apply(JSON.parse(t))}catch(e){(0,x.diagCatch)("notify 보고 파싱",e)}}poll(){let e;this.refreshTabIds(),++this.pollCount%5==0&&this.refreshPids(),this.pollCount%5==2&&this.scanSubagents(),this.pollMeta(),this.pollCount%5==4&&this.scanCodexMeta();try{e=c.readdirSync(this.dir)}catch{return}for(const t of e){if(!t.endsWith(".json"))continue;const e=h.join(this.dir,t);let i;try{i=JSON.parse(c.readFileSync(e,"utf8"))}catch{continue}if(i.ts<this.startedAt&&!this.sessionTab.has(i.sessionId))try{c.unlinkSync(e)}catch{}else this.apply(i)}}apply(e){var t,i,n,o,a,s,r;if(!e||!e.sessionId)return;const d=!!e.status,l="string"==typeof e.label&&!!e.label.trim(),c="string"==typeof e.file&&!!e.file.trim(),u=void 0!==e.agents&&null!==e.agents;if(!(d||l||c||u))return;if(this.applied.get(e.sessionId)===e.ts)return;const p=this.resolveTab(e.sessionId,e.tabId,e.pids);if(!p)return void((null===(t=e.pids)||void 0===t?void 0:t.length)||e.tabId||this.applied.set(e.sessionId,e.ts));this.applied.set(e.sessionId,e.ts),this.registerMailbox(e.sessionId,p,e.tabId);const h=String(null!==(i=e.agent)&&void 0!==i?i:"").trim().toLowerCase();"claude"!==h&&"codex"!==h&&"gemini"!==h||(this.hookAgent.set(p,h),this.rejectedMetaSession.delete(p));const g="string"==typeof e.cwd?e.cwd.trim():"";if(g&&this.hookCwd.set(p,g),u){const t=Array.isArray(e.agents)?e.agents:[e.agents],i=new Map;for(const e of t){const t=String(null!==(n=null==e?void 0:e.id)&&void 0!==n?n:"").trim();if(!t)continue;const a=Number(null==e?void 0:e.at);i.set(t,{id:t,type:String(null!==(o=null==e?void 0:e.type)&&void 0!==o?o:"").trim(),at:Number.isFinite(a)&&a>0?a:Date.now()})}const r=null!==(s=null===(a=this.liveAgents.get(p))||void 0===a?void 0:a.size)&&void 0!==s?s:0;this.liveAgents.set(p,i),this.agentHookSeen.add(p),r!==i.size&&this.diag(`agents sid=${e.sessionId.slice(0,8)} ${r} -> ${i.size} [${[...i.values()].map(e=>e.type||"?").join(",")}]`)}if(c){const t=e.file.trim(),i=null!==(r=this.touched.get(p))&&void 0!==r?r:[],n=[t,...i.filter(e=>e!==t)];this.touched.set(p,n.length>400?n.slice(0,400):n)}const f=(e.label||"").trim();if(d){const t=(0,k.shortenReason)("string"==typeof e.reason?e.reason:"");this.status.setManual(p,e.status,l?f:void 0,t)}else this.status.setLabel(p,f)}resolveTab(e,t,i){const n=this.sessionTab.get(e),o=n&&this.app.tabs.includes(n)?n:null,a=(0,y.pickTabByTabId)(t,this.tabIds);if(a)return a!==o&&this.bind(e,a,o?"tabid-move":"tabid"),a;const s=(0,b.pickTabByPids)(i,this.tabPids);if("pid"===s.mode&&s.tab)return s.tab!==o&&this.bind(e,s.tab,o?"pid-move":"pid"),s.tab;if(o)return o;if(t){const i=[...this.tabIds.entries()].map(([e,t])=>`${this.tabName(e)}:[${t.join(",")}]`).join(" ");return this.bindLog(e,`unbound (tabid-miss) tabId=${t} tabs=${i}`),null}if("pid-miss"===s.mode){const t=[...this.tabPids.entries()].map(([e,t])=>`${this.tabName(e)}:[${t.join(",")}]`).join(" ");return this.bindLog(e,`unbound (pid-miss) pids=[${(null!=i?i:[]).join(",")}] tabs=${t}`),null}const r=this.app.activeTab;if(!r)return null;const d=this.tabSession.get(r);return d&&d!==e?(this.bindLog(e,`unbound (legacy: active tab owned by ${d.slice(0,8)})`),null):(this.bind(e,r,"legacy"),r)}bind(e,t,i){const n=this.tabSession.get(t);n&&n!==e&&(this.sessionTab.delete(n),this.hookAgent.delete(t),this.touched.delete(t),this.liveAgents.delete(t));const o=this.sessionTab.get(e);o&&o!==t&&this.tabSession.get(o)===e&&(this.tabSession.delete(o),this.hookAgent.delete(o)),this.sessionTab.set(e,t),this.tabSession.set(t,e),this.lastBindLog.delete(e),this.diag(`bind sid=${e.slice(0,8)} via=${i} tab=${this.tabName(t)}`+(n&&n!==e?` (took over from ${n.slice(0,8)})`:""))}bindLog(e,t){this.lastBindLog.get(e)!==t&&(this.lastBindLog.set(e,t),this.diag(`bind sid=${e.slice(0,8)} ${t}`))}get subagentEnabled(){return!1!==this.config.store.agentDeck.subagentCount}cwdOf(e){return e&&this.hookCwd.get(e)||null}agentOf(e){var t,i;if(!e)return null;const n=this.hookAgent.get(e);if(n&&"unknown"!==n)return n;const o=this.tabSession.get(e);if(!o||this.rejectedMetaSession.get(e)===o)return null;const a=null===(i=null===(t=this.metaOf(e))||void 0===t?void 0:t.agent)||void 0===i?void 0:i.trim().toLowerCase();return"codex"===a||"claude"===a||"gemini"===a?a:null}forgetAgent(e){if(e){this.hookAgent.delete(e);const t=this.tabSession.get(e);t&&this.rejectedMetaSession.set(e,t)}}touchedOf(e){return e&&this.touched.get(e)||[]}setAccountHome(e,t,i,n){this.accountHomes.set(e,{provider:t,home:i,email:n})}metaOf(e){var t,i,n;const o=e?this.tabSession.get(e):null,a=o&&this.metaBySession.get(o)||null;if(!a||!e)return a;const s=null===(t=this.accountHomes)||void 0===t?void 0:t.get(e),r=null===(n=null===(i=e.profile)||void 0===i?void 0:i.options)||void 0===n?void 0:n.env,d=(null==s?void 0:s.home)||("codex"===a.agent?null==r?void 0:r.CODEX_HOME:null==r?void 0:r.CLAUDE_CONFIG_DIR);return!d||"codex"!==a.agent&&"claude"!==a.agent?a:{...a,configDir:d,account:(0,S.accountEmail)(a.agent,d)||(null==s?void 0:s.email)||""}}pollMeta(){var e,t;let i;try{i=c.readdirSync(this.metaDir)}catch{return}let n=!1;for(const t of i){if(!t.endsWith(".json"))continue;const i=h.join(this.metaDir,t);let o;try{o=JSON.parse(c.readFileSync(i,"utf8"))}catch{continue}if(null==o?void 0:o.sessionId)if(o.ts<this.startedAt&&!this.sessionTab.has(o.sessionId))try{c.unlinkSync(i)}catch{}else(null===(e=this.metaBySession.get(o.sessionId))||void 0===e?void 0:e.ts)!==o.ts&&(this.metaBySession.set(o.sessionId,o),n=!0)}this.pruneMeta(),n&&(null===(t=this.onMetaChange)||void 0===t||t.call(this))}scanCodexMeta(){var e;for(const[t,i]of this.sessionTab){if(!this.app.tabs.includes(i)||"codex"!==this.hookAgent.get(i))continue;let n,o=this.codexScans.get(t);if(o||(o={sessionId:t,state:(0,m.createCodexState)(),decoder:new g.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0},this.codexScans.set(t,o)),o.busy)continue;if(!o.path){this.findCodexRollout(o);continue}try{n=c.statSync(o.path).size}catch{o.path=null,o.lookupAt=0;continue}if(n<o.lastSize&&(o.state=(0,m.createCodexState)(),o.decoder=new g.StringDecoder("utf8"),o.lastSize=0),n>o.lastSize)try{const e=c.openSync(o.path,"r");try{const t=n-o.lastSize,i=Buffer.allocUnsafe(t),a=c.readSync(e,i,0,t,o.lastSize);(0,m.feedCodexChunk)(o.state,o.decoder.write(i.subarray(0,a))),o.lastSize+=a}finally{c.closeSync(e)}}catch(e){(0,x.diagCatch)("codex 기록 읽기",e);continue}const a=this.codexMetaOf(t,o.state),s=this.metaBySession.get(t);s&&s.model===a.model&&s.effort===a.effort&&s.account===a.account&&s.contextPct===a.contextPct&&s.limits.fiveHourPct===a.limits.fiveHourPct&&s.limits.sevenDayPct===a.limits.sevenDayPct||(this.metaBySession.set(t,a),null===(e=this.onMetaChange)||void 0===e||e.call(this))}}codexMetaOf(e,t){return{sessionId:e,ts:Date.now(),agent:"codex",model:t.model,modelId:t.model,effort:t.effort,version:t.cliVersion,fastMode:!1,account:this.codexAccount(),org:"",configDir:this.codexHome,cwd:t.cwd,contextPct:(0,m.codexContextPct)(t),limits:(0,m.codexLimits)(t)}}codexAccount(){var e,t;const i=h.join(this.codexHome,"auth.json");let n=0;try{n=c.statSync(i).mtimeMs}catch{return""}if(this.codexAuth&&this.codexAuth.mtime===n)return this.codexAuth.email;let o="";try{o=(0,m.emailFromIdToken)(null===(t=null===(e=JSON.parse(c.readFileSync(i,"utf8")))||void 0===e?void 0:e.tokens)||void 0===t?void 0:t.id_token)}catch{o=""}return this.codexAuth={mtime:n,email:o},o}async findCodexRollout(e){const t=Date.now();if(t-e.lookupAt<1e4)return;e.lookupAt=t,e.busy=!0;const i=e.sessionId.toLowerCase(),n=async(e,t)=>{let o;try{o=await c.promises.readdir(e,{withFileTypes:!0})}catch{return null}for(const a of[...o].reverse()){const o=h.join(e,a.name);if(a.isDirectory()&&t<3){const e=await n(o,t+1);if(e)return e;continue}if(a.isFile()&&a.name.toLowerCase().endsWith(`-${i}.jsonl`))return o}return null};try{const t=await n(h.join(this.codexHome,"sessions"),0);t&&(e.path=t,this.diag(`codex meta sid=${e.sessionId.slice(0,8)} file=${t}`))}finally{e.busy=!1}}pruneMeta(){const e=Date.now();for(const e of[...this.codexScans.keys()]){const t=this.sessionTab.get(e);t&&this.app.tabs.includes(t)||this.codexScans.delete(e)}for(const[t,i]of[...this.metaBySession]){const n=this.sessionTab.get(t);n?this.app.tabs.includes(n)||(this.metaBySession.delete(t),this.dropMetaFile(t)):e-i.ts>72e5&&(this.metaBySession.delete(t),this.dropMetaFile(t))}}dropMetaFile(e){try{c.unlinkSync(h.join(this.metaDir,e+".json"))}catch{}}subagentsOf(e){var t;if(!e||!this.subagentEnabled)return null;const i=this.tabSession.get(e);if(this.agentHookSeen.has(e)){const n=(0,j.summarizeLiveAgents)(null===(t=this.liveAgents.get(e))||void 0===t?void 0:t.values());if(n.running<=0)return null;const o=(0,j.formatLiveAgentTooltip)(n);return{sessionId:null!=i?i:"",running:n.running,items:[],tooltip:n.oldestAt?`${o}\n가장 오래된 것: ${A(Date.now()-n.oldestAt)} 전 시작`:o}}const n=i?this.scans.get(i):null;return!n||n.summary.running<=0?null:{sessionId:n.sessionId,running:n.summary.running,items:n.summary.items,tooltip:this.subagentTooltip(n.summary)}}subagentTooltip(e){const t=(0,j.formatSubagentTooltip)(e);if(!t)return"";let i=0;for(const t of e.items){const e=t.startedAt?Date.parse(t.startedAt):NaN;Number.isFinite(e)&&(!i||e<i)&&(i=e)}return i?`${t}\n가장 오래된 것: ${A(Date.now()-i)} 전 시작 (종료 알림을 못 받은 것이면 이 값만 계속 늘어난다)`:t}liveSessions(){return new Map(this.sessionTab)}scanSubagents(){if(this.subagentEnabled){this.pruneScans();for(const[e,t]of this.sessionTab){if(!this.app.tabs.includes(t))continue;let i,n=this.scans.get(e);if(n||(n={sessionId:e,state:(0,j.createSubagentState)(),decoder:new g.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0,summary:(0,j.summarizeSubagents)(null)},this.scans.set(e,n)),!n.busy)if(n.path){try{i=c.statSync(n.path).size}catch{(n.lastSize>0||n.summary.running>0)&&this.diag(`subagent gone sid=${e.slice(0,8)} running=${n.summary.running} -> 0`),this.resetScan(n),n.path=null,n.lookupAt=0;continue}i<n.lastSize&&(this.diag(`subagent reset sid=${e.slice(0,8)} size=${i} < last=${n.lastSize}`),this.resetScan(n)),i!==n.lastSize&&this.readGrowth(n,i)}else this.findTranscript(n)}}else this.scans.size&&this.scans.clear()}pruneScans(){for(const e of[...this.scans.keys()]){const t=this.sessionTab.get(e);t&&this.app.tabs.includes(t)||this.scans.delete(e)}}resetScan(e){e.state=(0,j.createSubagentState)(),e.decoder=new g.StringDecoder("utf8"),e.lastSize=0,e.summary=(0,j.summarizeSubagents)(null)}async findTranscript(e){const t=Date.now();if(!(t-e.lookupAt<1e4)){e.lookupAt=t,e.busy=!0;try{const t=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const i of t){if(!i.isDirectory())continue;const t=h.join(this.projectsDir,i.name);let n;try{n=await c.promises.readdir(t)}catch{continue}const o=n.find(t=>(0,j.matchesSessionTranscript)(t,e.sessionId));if(o)return e.path=h.join(t,o),void this.diag(`subagent transcript sid=${e.sessionId.slice(0,8)} file=${e.path}`)}}catch{}finally{e.busy=!1}}}readGrowth(e,t){const i=e.path;if(!i)return;const n=e.lastSize,o=e.sessionId.slice(0,8);let a;e.busy=!0;try{a=c.createReadStream(i,{start:n,end:t-1})}catch(t){return e.busy=!1,void(0,x.diagCatch)(`subagent 스트림 생성 sid=${o}`,t)}let s=!1;const r=i=>{if(s)return;if(s=!0,e.busy=!1,i)return void(0,x.diagCatch)(`subagent 대화기록 읽기 sid=${o}`,i);e.lastSize=t;const a=e.summary.running;e.summary=(0,j.summarizeSubagents)(e.state),0===n?this.diag(`subagent first-scan sid=${o} bytes=${t} lines=${e.state.lines} calls=${e.summary.calls} done=${e.summary.done} running=${e.summary.running}`):e.summary.running!==a&&this.diag(`subagent sid=${o} running=${a} -> ${e.summary.running} (+${t-n}B)`)};a.on("data",t=>(0,j.feedChunk)(e.state,e.decoder.write(t))),a.on("end",()=>r()),a.on("error",e=>r(e))}};E=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.AppService,l.ConfigService,f.WorkStatusService,l.PlatformService])],E),t.WorkNotifyService=E},7144(e,t){t.planEdgeScroll=t.planTabMove=t.countByStatus=t.statusRank=t.QD=void 0,t.QD=["waiting","error","limited","running","done","idle"],t.statusRank=function(e){const i=t.QD.indexOf(e);return i<0?t.QD.length:i},t.countByStatus=function(e,i){var n,o;const a=new Map;for(const t of e){const e=i(t);a.set(e,(null!==(n=a.get(e))&&void 0!==n?n:0)+1)}const s=[];for(const e of t.QD){const t=null!==(o=a.get(e))&&void 0!==o?o:0;t>0&&s.push({status:e,count:t})}return s},t.planTabMove=function(e,t,i,n){if(!Number.isInteger(e)||e<2)return null;if(!Number.isInteger(t)||!Number.isInteger(i))return null;if(t<0||t>=e||i<0||i>=e||t===i)return null;const o=[];for(let t=0;t<e;t++)o.push(t);o.splice(t,1);const a=o.indexOf(i)+("after"===n?1:0);o.splice(a,0,t);for(let t=0;t<e;t++)if(o[t]!==t)return o;return null},t.planEdgeScroll=function(e){const{pos:t,near:i,far:n,cur:o,maxScroll:a,bandPx:s,minPps:r,maxPps:d}=e;if(t<i||t>n)return 0;const l=Math.min(s,(n-i)/3);if(l<4)return 0;let c=0,u=0;if(t<=i+l)c=-1,u=(i+l-t)/l;else{if(!(t>=n-l))return 0;c=1,u=(t-(n-l))/l}return(c<0?o:a-o)<=.5?0:c*(r+(d-r)*Math.min(1,Math.max(0,u)))}},6570(e,t,i){t.monitorEventLoop=t.PerformanceTrace=t.perfNow=void 0;const n=i(7797);let o=0;t.perfNow=()=>performance.now(),t.PerformanceTrace=class{constructor(e){this.operation=e,this.id=`${Date.now().toString(36)}-${++o}`,this.started=(0,t.perfNow)(),this.previous=this.started,this.mark("begin")}mark(e,i=""){const o=(0,t.perfNow)();(0,n.diag)(`perf op=${this.operation} id=${this.id} stage=${e} stepMs=${(o-this.previous).toFixed(1)} totalMs=${(o-this.started).toFixed(1)}`+(i?` ${i}`:"")),this.previous=(0,t.perfNow)()}step(e,i){const n=(0,t.perfNow)();try{return i()}finally{this.mark(e,`workMs=${((0,t.perfNow)()-n).toFixed(1)}`)}}};let a=!1;t.monitorEventLoop=function(){if(a)return;a=!0;let e=(0,t.perfNow)(),i=-1/0;const o=setInterval(()=>{const o=(0,t.perfNow)(),a=o-e-250;e=o,a>=250&&o-i>=5e3&&(i=o,(0,n.diag)(`perf op=event-loop lagMs=${a.toFixed(1)} visibility=${document.visibilityState}`))},250);window.addEventListener("beforeunload",()=>{clearInterval(o),a=!1},{once:!0})}},3496(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckProfileService=t.ROOT_PROFILE_PREFIX=t.ROOT_PROFILE_ID=void 0;const a=i(860),s=i(7650);t.ROOT_PROFILE_ID="agentdeck:root",t.ROOT_PROFILE_PREFIX="agentdeck:root:";let r=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>{this.ensureProfile(),this.syncAdditionalProfiles()})}applySettings(){const e=this.config.store.agentDeck,i=(this.config.store.profiles||[]).find(e=>e.id===t.ROOT_PROFILE_ID);i&&e.rootProfile&&e.rootProfileCwd&&(i.name=e.rootProfileName||"Agent Root",i.options={...i.options,cwd:e.rootProfileCwd,command:e.rootProfileCommand||"powershell.exe"}),this.ensureProfile(),this.syncAdditionalProfiles(),this.config.save()}syncAdditionalProfiles(){var e,i;const n=this.config.store.agentDeck,o=(Array.isArray(n.rootProfiles)?n.rootProfiles:[]).filter(e=>e&&"string"==typeof e.id&&e.id.startsWith(t.ROOT_PROFILE_PREFIX)&&"string"==typeof e.cwd&&e.cwd.trim()),a=this.config.store.profiles||[],s=JSON.stringify(a),r=new Set(o.map(e=>e.id)),d=a.filter(e=>{var i;return!(null===(i=e.id)||void 0===i?void 0:i.startsWith(t.ROOT_PROFILE_PREFIX))||r.has(e.id)});for(const e of o){let t=d.find(t=>t.id===e.id);t||(t={id:e.id,type:"local",options:{args:[...n.rootProfileArgs||[]],env:{...n.rootProfileEnv||{}}}},d.push(t)),t.name=String(e.name||"").trim()||e.cwd.trim(),t.options={...t.options,cwd:e.cwd.trim(),command:String(e.command||"").trim()||"powershell.exe"}}if(JSON.stringify(d)!==s){this.config.store.profiles=d;const n=this.config.store.terminal.profile;(null==n?void 0:n.startsWith(t.ROOT_PROFILE_PREFIX))&&!r.has(n)&&(this.config.store.terminal.profile=(null===(e=d.find(e=>e.id===t.ROOT_PROFILE_ID))||void 0===e?void 0:e.id)||(null===(i=d[0])||void 0===i?void 0:i.id)||null),this.config.save()}}ensureProfile(){const e=this.config.store.agentDeck;if(!e.rootProfile||!e.rootProfileCwd)return;const i=this.config.store.profiles||[],n=i.find(e=>e.id===t.ROOT_PROFILE_ID),o={id:t.ROOT_PROFILE_ID,type:"local",name:e.rootProfileName||"Agent Root",options:{command:e.rootProfileCommand||"powershell.exe",args:[...e.rootProfileArgs||[]],cwd:e.rootProfileCwd,env:{...e.rootProfileEnv||{}}}};if(n)if(n.options){let e=!1;n.options.cwd||(n.options.cwd=o.options.cwd,e=!0),n.options.args&&0!==n.options.args.length||(n.options.args=[...o.options.args],e=!0),n.options.env=n.options.env||{};for(const[t,i]of Object.entries(o.options.env))void 0===n.options.env[t]&&(n.options.env[t]=i,e=!0);e&&this.config.save()}else n.options=o.options,this.config.save();else i.push(o),this.config.store.profiles=i,e.rootProfileClaimed||(this.config.store.terminal.profile=t.ROOT_PROFILE_ID,e.rootProfileClaimed=!0),this.config.save()}};r=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService])],r),t.AgentDeckProfileService=r},4086(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.projectRootCacheSnapshot=t.clearProjectRootCache=t.projectRootOf=t.findProjectRoot=t.walkUp=t.homeBoundary=t.PROJECT_MARKERS=void 0;const s=a(i(9896)),r=a(i(857)),d=i(6879);function l(){try{return(0,d.normalizeCwd)(r.homedir())}catch{return null}}function c(e,t){let i=(0,d.normalizeCwd)(e);const n=(0,d.normalizeCwd)(t),o=[];for(let e=0;i&&e<64&&(!n||(0,d.foldGroupKey)(i)!==(0,d.foldGroupKey)(n));e++){o.push(i);const e=(0,d.parentPath)(i);if(!e||(0,d.foldGroupKey)(e)===(0,d.foldGroupKey)(i))break;i=e}return o}t.PROJECT_MARKERS=[".git",".hg",".svn",".p4config"],t.homeBoundary=l,t.walkUp=c,t.findProjectRoot=function(e,t,i){for(const n of c(e,i))if(t(n))return n;return null};const u=new Map,p=new Set;async function h(e){for(const i of t.PROJECT_MARKERS)try{return await s.promises.access(e+"/"+i),!0}catch{}return!1}t.projectRootOf=function(e,t){const i=(0,d.normalizeCwd)(e);if(!i)return null;const n=(0,d.foldGroupKey)(i),o=u.get(n);return void 0!==o?o:(p.has(n)||(p.add(n),async function(e){for(const t of c(e,l()))if(await h(t))return t;return null}(i).then(e=>{u.set(n,e),p.delete(n),e&&(null==t||t())}).catch(()=>{u.set(n,null),p.delete(n)})),null)},t.clearProjectRootCache=function(){u.clear(),p.clear()},t.projectRootCacheSnapshot=function(){return[...u.entries()].map(([e,t])=>({cwd:e,root:t}))}},9660(e,t){function i(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function n(e){return e.join("").replace(/[\\\]^-]/g,"\\$&")}function o(e){return[...e].sort((e,t)=>t.length-e.length).map(i).join("|")}function a(e,t){if(!Array.isArray(e))return t;const i=e.filter(e=>"string"==typeof e&&e.length>0);return i.length?i:t}t.extractPrompt=t.yY=t.D0=void 0,t.D0={heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"],ruleChars:["─","━","═","-"]},t.yY=40;const s=new Map;function r(e,t){return e.replace(t.stripLead,"").replace(t.stripTail,"").trim()}t.extractPrompt=function(e,i){const d=function(e){const i=a(e?e.heads:void 0,t.D0.heads),r=a(e?e.choiceWords:void 0,t.D0.choiceWords),d=a(e?e.ruleChars:void 0,t.D0.ruleChars),l=JSON.stringify([i,r,d]),c=s.get(l);if(c)return c;const u=o(i),p=n(d),h=new Set(i.join("")),g=n([..."│┃|╭╰┌└─╮╯┐┘"].filter(e=>!h.has(e))),f=n([..."│┃|╮╯┐┘─"].filter(e=>!h.has(e))),m=n([..."│┃|"].filter(e=>!h.has(e))),v={head:new RegExp(`^(?:${u})\\s*`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${o(r)})(?!\\w))`,"i"),bottom:new RegExp(`^[\\s${m}]*[${p}]{3,}[\\s${m}]*$|[╰└]`),stripLead:new RegExp(`^[\\s${g}]+`),stripTail:new RegExp(`[\\s${f}]+$`)};return s.set(l,v),v}(i);let l=-1;for(let t=e.length-1;t>=0;t--){const i=r(e[t],d);if(d.head.test(i)){if(d.choice.test(i))return"";l=t;break}}if(l<0)return"";const c=[r(e[l],d).replace(d.head,"")];for(let t=l+1;t<e.length&&!d.bottom.test(e[t]);t++){const i=r(e[t],d);i&&c.push(i)}const u=c.join(" ").replace(/\s+/g," ").trim();return u.length<2?"":u.length>t.yY?u.slice(0,t.yY).trimEnd()+"...":u}},7282(e,t){function i(e){const t=(e||"").replace(/\s+/g," ").trim();if(!t)return"";if(/^[^\w가-힣]*\d+\.\s/.test(t))return"";const i=/permission to use ([\w-]+)/i.exec(t);if(i)return i[1]+" 권한";const n=/Allow execution of\s*\[?([\w.:-]+)/i.exec(t);if(n)return n[1]+" 권한";if(/waiting for your input/i.test(t))return"입력 대기";if(/\b(?:hit|reached|exceeded)\b.*\blimit\b|usage limit|limit reached|limit will reset/i.test(t)){const e=/\breset(?:s)?\s+(?:at\s+)?(.+?)\s*(?:\(|\.\s*$|$)/i.exec(t);return e?e[1].trim()+" 리셋":""}return/plan/i.test(t)?"플랜 승인":/question|answer/i.test(t)?"질문 응답":t.slice(0,24).trimEnd()}t.reasonFromScreen=t.shortenReason=void 0,t.shortenReason=i,t.reasonFromScreen=function(e){return i((e||"").replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\u001b[\]P][^\u0007\u001b]*(?:\u0007|\u001b\\)?/g,"").replace(/\u001b/g," ").replace(/[\u2500-\u259f]/g," ").replace(/\s+/g," ").trim())}},9980(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckRecoveryService=void 0;const a=i(860),s=i(7650);let r=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>this.enforce()),this.config.changed$.subscribe(()=>this.enforce())}setNoTabRecovery(e){if(this.config.store.agentDeck.noTabRecovery=e,this.config.store.recoverTabs=!e,e)try{delete window.localStorage.tabsRecovery}catch{}this.config.save()}enforce(){var e;(null===(e=this.config.store.agentDeck)||void 0===e?void 0:e.noTabRecovery)&&!1!==this.config.store.recoverTabs&&(this.config.store.recoverTabs=!1,this.config.save())}};r=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService])],r),t.AgentDeckRecoveryService=r},8450(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckReloadService=void 0;const a=i(860),s=i(7650),r=i(7797),d=i(4494),l=i(6570),c="agentdeck.reloadStash",u="agentdeck.devReload",p=[300,1500,3e3];let h=class{constructor(e,t,i){this.app=e,this.notifications=t,this.deck=i,this.reloading=!1}init(){this.app.ready$.subscribe(()=>{this.restore().catch(e=>(0,r.diagCatch)("reload 복구",e))})}async reload(e){if(this.reloading)return!1;this.reloading=!0;const t=new l.PerformanceTrace("reload-save"),i=Date.now();try{const n=this.app.tabRecovery,o=[];let a=-1;for(const e of this.app.tabs)try{const i=await n.getFullRecoveryToken(e,{includeState:!0});t.mark("token",`index=${o.length}`),i&&(e===this.app.activeTab&&(a=o.length),o.push(i))}catch(e){(0,r.diagCatch)("reload 토큰",e)}const s={v:1,at:Date.now(),tokens:o,activeIndex:a,requestedAt:i},d=t.step("encode",()=>JSON.stringify(s));return t.step("storage",()=>window.localStorage.setItem(c,d)),t.mark("scheduled",`tabs=${o.length} chars=${d.length}`),n.enabled=!1,delete window.localStorage.tabsRecovery,(0,r.diag)(`reload go reason=${e} tabs=${o.length}`),setTimeout(()=>location.reload(),50),!0}catch(e){return this.reloading=!1,(0,r.diagCatch)("reload",e),!1}}async restore(){var e,t,i,n,o;const a=null!==(e=window.localStorage.getItem(c))&&void 0!==e?e:window.localStorage.getItem(u);if(window.localStorage.removeItem(c),window.localStorage.removeItem(u),!a)return;const s=new l.PerformanceTrace("reload-restore"),d=s.step("decode",()=>JSON.parse(a));if(s.mark("renderer-ready",`sinceRequestMs=${Date.now()-(null!==(t=d.requestedAt)&&void 0!==t?t:d.at)} chars=${a.length}`),Date.now()-d.at>6e5)return void(0,r.diag)("reload stash expired age="+(Date.now()-d.at));const p=Date.now(),h=this.app.tabRecovery,f=[],m=new Map;let v=0;for(const[e,t]of(null!==(i=d.tokens)&&void 0!==i?i:[]).entries())if(s.step("pty-check",()=>this.ptysAlive(t)))try{const i=await h.recoverTab(t);if(s.mark("recover-token",`index=${e}`),i){const t=this.app.openNewTabRaw(i);f.push(t),m.set(e,t),s.mark("open-tab",`index=${e}`)}}catch(e){(0,r.diagCatch)("reload recoverTab",e)}else v++;this.sweepStrays(f);for(const e of f)this.app.selectTab(e),await this.waitAttached(e),s.mark("attached",`index=${f.indexOf(e)}`),await g(250),s.mark("settled"),this.deck.repair("active"),s.mark("repair-requested");const b=null!==(n=m.get(d.activeIndex))&&void 0!==n?n:f[f.length-1];b&&this.app.selectTab(b);const k=Date.now()-p;(0,r.diag)(`reload restored tabs=${f.length} dead=${v} ms=${k}`),s.mark("complete",`tabs=${f.length} dead=${v} sinceRequestMs=${Date.now()-(null!==(o=d.requestedAt)&&void 0!==o?o:d.at)}`),this.notifications.info(`AgentDeck 리로드됨 — 탭 ${f.length}개 재부착 (${k}ms)`)}ptysAlive(e){const t=[],i=e=>{var n,o,a;const s=null===(o=null===(n=null==e?void 0:e.profile)||void 0===n?void 0:n.options)||void 0===o?void 0:o.restoreFromPTYID;s&&t.push(s);for(const t of null!==(a=null==e?void 0:e.children)&&void 0!==a?a:[])i(t)};if(i(e),!t.length)return!0;try{const{ipcRenderer:e}=window.require("electron");return t.some(t=>e.sendSync("pty:exists",t))}catch{return!0}}sweepStrays(e){const t=new Set(e),i=Date.now(),n=new Set(this.app.tabs.filter(e=>!t.has(e)));for(const e of p)setTimeout(()=>{const e=Date.now()-i<=1500;for(const i of[...this.app.tabs])if(!t.has(i)){if(e)n.add(i);else if(!n.has(i)){(0,r.diag)(`reload keep user tab "${i.title}" (스윕 유예 뒤에 생겼다)`);continue}(0,r.diag)(`reload close stray ${i.constructor.name} "${i.title}"`),this.app.closeTab(i,!1)}},e)}async waitAttached(e){const t=Date.now()+4e3;for(;Date.now()<t;){const t=e,i=("function"==typeof t.getAllTabs?t.getAllTabs():[e]).filter(e=>"frontend"in e||"session"in e);if(!i.length||i.every(e=>{var t;return null===(t=e.session)||void 0===t?void 0:t.open}))return;await g(100)}(0,r.diag)(`reload attach timeout "${e.title}"`)}};function g(e){return new Promise(t=>setTimeout(t,e))}h=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.NotificationsService,d.AgentDeckService])],h),t.AgentDeckReloadService=h},3630(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.migrateRuntimeData=t.copyRuntimeData=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=i(7025);function c(e,t){if(!s.existsSync(e)||d.resolve(e)===d.resolve(t))return;const i=s.lstatSync(e);if(!i.isSymbolicLink())if(i.isDirectory()){s.mkdirSync(t,{recursive:!0});for(const i of s.readdirSync(e))c(d.join(e,i),d.join(t,i))}else i.isFile()&&!s.existsSync(t)&&(s.mkdirSync(d.dirname(t),{recursive:!0}),s.copyFileSync(e,t,s.constants.COPYFILE_EXCL))}t.copyRuntimeData=c,t.migrateRuntimeData=function(){const e=(0,l.runtimeRoot)(),t=d.join(e,".legacy-imported");if(s.existsSync(t))return;const i=process.env.TABBY_CONFIG_DIRECTORY,n=d.join(process.env.APPDATA||d.join(r.homedir(),"AppData","Roaming"),"tabby");if(i&&d.resolve(i).toLowerCase()!==d.resolve(n).toLowerCase())return;const o=d.join(process.env.LOCALAPPDATA||d.join(r.homedir(),"AppData","Local"),"tabby-agentdeck");for(const t of["sessions.json","statusline-inner.json","scoped-limit.json","status","meta","history-search"])c(d.join(o,t),d.join(e,t));const a=i?d.join(i,"agentdeck-mailbox"):o;for(const t of["mailbox.json","mailbox-connections","navigation-context.txt"])c(d.join(a,t),d.join(e,"mailbox",t));s.mkdirSync(e,{recursive:!0}),s.writeFileSync(t,(new Date).toISOString(),"utf8")}},9306(e,t){function i(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function n(e){return[...e].sort((e,t)=>t.length-e.length).map(i).join("|")}function o(e,t){if(!Array.isArray(e))return t;const i=e.filter(e=>"string"==typeof e&&e.length>0);return i.length?i:t}t.judgeScreen=t.isGhostRuleRow=t.isRuleRow=t.sizeInSync=t.INPUT_TAIL=t.n=void 0,t.n={ruleChars:["─","━","═"],heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"]};const a=new Map;function s(e){const i=o(e?e.ruleChars:void 0,t.n.ruleChars),s=o(e?e.heads:void 0,t.n.heads),r=o(e?e.choiceWords:void 0,t.n.choiceWords),d=JSON.stringify([i,s,r]),l=a.get(d);if(l)return l;const c=i.join("").replace(/[\\\]^-]/g,"\\$&"),u=n(s),p={rule:new RegExp(`^[${c}]{2,}$`),head:new RegExp(`^(?:${u})(?:\\s|$)`),headAnywhere:new RegExp(`(?:${u})(?:\\s|$)`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${n(r)})(?!\\w))`,"i"),ruleChar:new RegExp(`[${c}]`),ruleCharAll:new RegExp(`[${c}]`,"g")};return a.set(d,p),p}function r(e,t,i){const n=s(i),o=e.replace(/\s+$/,"");return t>1&&!(o.length<2)&&!n.rule.test(o)&&(!(!n.ruleChar.test(o[0])||!n.ruleChar.test(o[o.length-1]))&&(o.match(n.ruleCharAll)||[]).length>=.6*t)}t.INPUT_TAIL=16,t.sizeInSync=function(e,t,i,n){return!("number"==typeof e&&e>1)||"number"!=typeof i||"number"!=typeof n||i===e&&n===t},t.isRuleRow=function(e,t){return s(t).rule.test(e.trim())},t.isGhostRuleRow=r,t.judgeScreen=function(e,i,n){const o=s(n),a=[];if(!(i>1&&e.length))return{broken:!1,reasons:[]};const d=[],l=[];for(let s=0;s<e.length;s++){const c=e[s].text.replace(/\s+$/,"");c&&(o.rule.test(c)?(d.push(s),c.length!==i&&a.push(`rule@${s} len=${c.length} != cols=${i}`)):(s>=e.length-t.INPUT_TAIL&&r(c,i,n)&&a.push(`테두리 행에 옛 글자가 남았다@${s} ${JSON.stringify(c.slice(0,40))}`),o.ruleChar.test(c)&&o.headAnywhere.test(c)&&a.push(`mixed@${s} ${JSON.stringify(c.slice(0,40))}`),o.head.test(c)&&!o.choice.test(c)&&l.push(s)))}const c=d.filter(t=>e[t].text.replace(/\s+$/,"").length===i);if(c.length>=2){const e=c[c.length-1],t=c[c.length-2];if(e-t<2)a.push(`입력창에 자리가 없다 (테두리 ${t}·${e} 이 맞붙었다)`);else{const i=l.filter(i=>i>t&&i<e).length;i>1&&a.push(`입력창 안 머리=${i} (기대 1)`)}}if(l.length&&c.length){const e=l[l.length-1],t=c.includes(e-1),i=c.some(t=>t>e);t&&!i&&a.push(`입력창 아래 테두리가 없다 (머리@${e}, 위 테두리@${e-1})`)}if(d.length>1){const t=new Set(d.map(t=>e[t].text.replace(/\s+$/,"").length));t.size>1&&a.push(`rule lens=${[...t].join(",")} (섞임)`)}return{broken:a.length>0,reasons:a}}},5633(e,t){function i(e){var t,i,n,o;const a=(null!==(t=e.match(/"[^"]*"|\S+/g))&&void 0!==t?t:[]).map(e=>e.replace(/^"|"$/g,"")),s=null===(n=(null!==(i=a[0])&&void 0!==i?i:"").split(/[\\/]/).pop())||void 0===n?void 0:n.replace(/\.(exe|cmd|bat)$/i,"").toLowerCase();if("codex"===s||"claude"===s||"gemini"===s)return s;if("node"===s){const e=(null!==(o=a[1])&&void 0!==o?o:"").replace(/\\/g,"/");if(/\/@openai\/codex\/bin\/codex\.js$/i.test(e))return"codex";if(/\/@anthropic-ai\/claude-code\/cli\.js$/i.test(e))return"claude";if(/\/@google\/gemini-cli\/(?:bundle\/gemini|dist\/index)\.js$/i.test(e))return"gemini"}return"unknown"}function n(e){let t="unknown";for(const i of e)/^\s*│\s*>_\s+OpenAI Codex\s+\(v\d+\./.test(i)?t="codex":/^[\s*\u2500-\u259f]*Claude Code v\d+\./.test(i)?t="claude":/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(i)&&(t="unknown");return t}t.TerminalAgentTracker=t.identifyScreenAgent=t.isLiveCodexScreen=void 0,t.isLiveCodexScreen=function(e){var t;const i=e.reduce((e,t,i)=>t.trim()?i+1:e,0),n=e.slice(0,i);if(/^\s*\/ T R A N S C R I P T\b/.test(null!==(t=n[0])&&void 0!==t?t:"")&&n.slice(-4).some(e=>/\bq close\b/.test(e)))return!0;const o=n.findIndex(e=>/^\s*(?:gpt-[\w.-]+|o\d[\w.-]*)\b.*\bContext \d+% left\b/.test(e));return!(o<0||o<i-3)&&!n.slice(o+1).some(e=>/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(e.trim()))&&n.slice(0,o).some(e=>/^\s*›/.test(e))},t.identifyScreenAgent=n,t.TerminalAgentTracker=class{constructor(){this.line="",this.control="",this.shellTitle=!1,this.mode="text"}write(e){for(const t of e)if("osc"!==this.mode&&"osc-escape"!==this.mode)if("escape"!==this.mode)if("csi"!==this.mode)if(""!==t)if("\r"!==t&&"\n"!==t){if(!(t<" ")&&(this.line=(this.line+t).slice(-512),">"===t&&this.shellTitle&&/^(?:PS )?[A-Za-z]:[\\/][^>]*>$/.test(this.line.trim())&&(this.id="unknown",this.shellTitle=!1),"."===t)){const e=n([this.line]);"unknown"===e||this.id&&"unknown"!==this.id||(this.id=e)}}else this.line="";else this.mode="escape";else t>="@"&&t<="~"&&(this.mode="text","HfG".includes(t)&&(this.line=""));else this.mode="["===t?"csi":"]"===t?"osc":"text",this.control="";else if(""===t||"osc-escape"===this.mode&&"\\"===t){const e=this.control.replace(/^[02];/,"");/^[02];/.test(this.control)&&/(?:^|:\s+)(?:[a-z]:[\\/][^\r\n]*[\\/])?(?:cmd|powershell|pwsh)(?:\.exe)?\s*$/i.test(e)&&(this.shellTitle=!0);const t=/^[02];/.test(this.control)&&e.match(/(?:^|:\s+)(?:[a-z]:[\\/][^\r\n]*[\\/])?(?:cmd|powershell|pwsh)(?:\.exe)?\s+-\s+(.+)$/i);if(t){const e=i(t[1]);this.shellTitle="unknown"===e,"unknown"===e&&this.id||(this.id=e)}this.mode="text",this.control="",this.line=""}else this.mode=""===t?"osc-escape":"osc",this.control.length<4096&&""!==t&&(this.control+=t)}}},7838(e,t){t.SessionIdentities=t.adaptiveAliasBase=void 0;const i=/^(?:[a-z]:|root|dev|qa|live|src|source|work|users|project|projects|server|client|bin)$/i,n=e=>{const t=/(?:^|[\s/\\_.-])(?:cn|china|중국)(?=$|[\s/\\_.-])/i.test(e);return t===/(?:^|[\s/\\_.-])(?:global|글로벌)(?=$|[\s/\\_.-])/i.test(e)?"":t?"중국":"글로벌"};function o(e,t){const i=e=>/agent.?deck|tabby|에이전트덱|탭\s*(통신|이동|번호|제목)|리로드/i.test(e)?"에이전트덱":/허브|업무일지|일일보고/i.test(e)?"허브":/infra|인프라/i.test(e)?"인프라":/토큰|모델|스킬|플러그인|codex|claude|클로드|코덱스/i.test(e)?"도구":/게임|어뷰징|길드|전투|던전/i.test(e)?"게임":"",n=/^(?:[\s\W]*)(?:powershell|cmd|bash|zsh|claude code|codex|terminal)(?:\.exe)?\s*$/i.test(e)?"":e,o=i(n)||i(t);if(o)return o;const a=(t.replace(/\\/g,"/").split("/").filter(Boolean).reverse().find(e=>!/^(root|dev|qa|live|src|work|users|project|projects)$/i.test(e))||n.split(/\s+/)[0]||"작업").replace(/[^\p{L}\p{N}_-]/gu,"");return Array.from(a||"작업").slice(0,12).join("")}t.adaptiveAliasBase=function(e,t,a,s=""){const r=!e.trim()||/^(?:[\s\W]*)(?:powershell|cmd|bash|zsh|claude code|codex|terminal)(?:\.exe)?\s*$/i.test(e),d=/(?:^|[/\\])(?:windows|system32|users|appdata)(?:[/\\]|$)/i.test(t);if((!t||d)&&!s&&r)return"";const l=(s||t).replace(/\\/g,"/").split("/").filter(Boolean),c=l.findIndex(e=>/^projects?$/i.test(e)),u=l.map((e,t)=>({name:e,index:t})).filter(e=>!i.test(e.name)&&!n(e.name)),p=c>=0?u.find(e=>e.index>c):u[u.length-1];if(!p)return o(e,t);const h=l.slice(0,p.index+1).join("/").normalize("NFKC").toLowerCase();let g=a.find(e=>e.key===h);const f=e.match(/(?:프로젝트|project)\s*[:=]\s*([\p{L}\p{N}_-]{2,24})/iu)||e.match(/([\p{L}\p{N}_-]{2,24})\s+(?:프로젝트|project)(?:\s|$)/iu),m=null==f?void 0:f[1],v=m&&!/^(?:현재|신규|새로운|다른|해당|이전|기존|new|current)$/i.test(m);g?v&&"path"===g.evidence&&(g.name=m,g.evidence="title"):(g={key:h,name:v?m:p.name,evidence:v?"title":"path"},a.push(g));const b=o(e,"");if(["에이전트덱","허브","인프라","도구"].includes(b))return b;const k=o("",g.name),y=(["에이전트덱","허브","인프라","도구"].includes(k)?k:g.name).replace(/[^\p{L}\p{N}_-]/gu,"")||"작업",w=n(t)||n(e);return y+(w&&!y.includes(w)?w:"")},t.SessionIdentities=class{constructor(e){this.records=e}ensure(e,t="작업"){const i=this.records.find(t=>t.id===e);if(i)return i.alias||(i.alias=this.nextAlias(t)),i;const n={id:e,letter:"",alias:this.nextAlias(t)};return this.records.push(n),n}key(e){return e.normalize("NFKC").trim().toLocaleLowerCase()}nextAlias(e){const t=new Set(this.records.flatMap(e=>[this.key(e.letter),this.key(e.alias)]));for(let i=1;i<=Number.MAX_SAFE_INTEGER;i++){const n=`${e}${i}`;if(!t.has(this.key(n)))return n}throw new Error("사용 가능한 별명이 없습니다.")}}},1424(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionLedgerService=void 0;const d=i(860),l=i(7650),c=s(i(9896)),u=s(i(6928)),p=i(7025),h=i(7797),g=i(2425);let f=class{get root(){return(0,p.runtimeRoot)()}get file(){return u.join(this.root,"sessions.json")}get projectsDir(){return u.join((0,p.agentHome)("claude"),"projects")}constructor(e){this.config=e,this.ledger=new Map,this.scanned=[],this.headCache=new Map,this.loaded=!1,this.saveTimer=null,this.scanning=null,this.lastScan=0,this.historyFiles=[],this.onChange=null}load(){if(!this.loaded){this.loaded=!0;try{const e=c.readFileSync(this.file,"utf8"),t=JSON.parse(e),i=Array.isArray(null==t?void 0:t.records)?t.records:[];for(const e of i)e&&"string"==typeof e.sessionId&&e.sessionId&&this.ledger.set(e.sessionId,{sessionId:e.sessionId,cwd:"string"==typeof e.cwd?e.cwd:null,label:(0,g.clampLabel)(e.label),lastStatus:"string"==typeof e.lastStatus?e.lastStatus:null,lastSeen:Number(e.lastSeen)||0,from:"head"===e.from?"head":"live"})}catch{}}}scheduleSave(){this.saveTimer||(this.saveTimer=setTimeout(()=>{this.saveTimer=null,this.save()},2e3))}save(){try{c.mkdirSync(this.root,{recursive:!0});const e=[...this.ledger.values()];c.writeFileSync(this.file,JSON.stringify({version:1,records:e},null,1)+"\n","utf8")}catch(e){(0,h.diagCatch)("세션 원장 저장",e)}}note(e,t){var i,n,o;if(!e)return;this.load();const a=this.ledger.get(e),s=(0,g.clampLabel)(t.label),r={sessionId:e,cwd:t.cwd||(null==a?void 0:a.cwd)||null,label:s||(null==a?void 0:a.label)||"",lastStatus:null!==(n=null!==(i=t.status)&&void 0!==i?i:null==a?void 0:a.lastStatus)&&void 0!==n?n:null,lastSeen:Date.now(),from:s?"live":null!==(o=null==a?void 0:a.from)&&void 0!==o?o:"live"},d=a&&a.cwd===r.cwd&&a.label===r.label&&a.lastStatus===r.lastStatus;this.ledger.set(e,r),d||this.scheduleSave()}async refresh(e=!1){const t=Date.now();if(e||!(t-this.lastScan<15e3))return this.scanning||(this.scanning=this.scan().finally(()=>{this.scanning=null,this.lastScan=Date.now()})),this.scanning}async scan(){var e;this.load();const t=this.config.store.agentDeck,i=Number(t.resumeListDays)||0,n=i>0?Date.now()-864e5*i:0,o=[],a=new Set;try{const e=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const t of e){if(!t.isDirectory())continue;const e=u.join(this.projectsDir,t.name);let i;try{i=await c.promises.readdir(e)}catch{continue}for(const t of i){const i=(0,g.sessionIdFromFile)(t);if(!i)continue;const n=u.join(e,t);a.add(i);try{const e=await c.promises.stat(n);o.push({sessionId:i,file:n,mtime:e.mtimeMs})}catch{}}}}catch{}const s=async(e,t)=>{let i;try{i=await c.promises.readdir(e,{withFileTypes:!0})}catch{return}for(const n of i){const i=u.join(e,n.name);if(n.isDirectory()&&t<3){await s(i,t+1);continue}const r=/^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i.exec(n.name);if(n.isFile()&&r){a.add(r[1]);try{const e=await c.promises.stat(i);o.push({sessionId:r[1],file:i,mtime:e.mtimeMs,agent:"codex"})}catch{}}}};await s(u.join((0,p.agentHome)("codex"),"sessions"),0),o.sort((e,t)=>t.mtime-e.mtime),this.historyFiles=o.map(e=>({file:e.file,sessionId:e.sessionId,agent:e.agent||"claude"}));const r=o.filter(e=>!n||e.mtime>=n).slice(0,200),d=[];for(const e of r){const t=`${e.sessionId}:${Math.round(e.mtime)}`;let i=this.headCache.get(t);i||(i=await this.readHeadOf(e.file),this.headCache.set(t,i)),i.isSubagent||d.push({agent:e.agent||"claude",sessionId:e.sessionId,cwd:i.cwd,label:i.label,lastStatus:null,lastSeen:e.mtime,from:"head"})}this.scanned=d;const l=this.ledger.size,h=(0,g.pruneLedger)([...this.ledger.values()],a);h.length!==l&&(this.ledger=new Map(h.map(e=>[e.sessionId,e])),this.scheduleSave()),null===(e=this.onChange)||void 0===e||e.call(this)}async readHeadOf(e){let t=null;try{t=await c.promises.open(e,"r");const i=Buffer.alloc(g.HEAD_BYTE_LIMIT),{bytesRead:n}=await t.read(i,0,g.HEAD_BYTE_LIMIT,0),o=i.slice(0,n).toString("utf8").split("\n");return n===g.HEAD_BYTE_LIMIT&&o.pop(),(0,g.readHead)(o.slice(0,g.HEAD_LINE_LIMIT))}catch(t){return(0,h.diagCatch)(`세션 기록 앞부분 읽기 ${u.basename(e)}`,t),{cwd:null,label:"",startedAt:null}}finally{await(null==t?void 0:t.close().catch(()=>{}))}}records(){return this.load(),(0,g.mergeSessions)([...this.ledger.values()],this.scanned)}async historySources(){return await this.refresh(),[...this.historyFiles]}snapshot(){return{ledger:this.ledger.size,scanned:this.scanned.length,file:this.file,lastScan:this.lastScan}}};f=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.ConfigService])],f),t.SessionLedgerService=f},2425(e,t){t.resumeCommand=t.sessionIdFromFile=t.formatWhen=t.resumeRowsFor=t.pruneLedger=t.mergeSessions=t.readHead=t.clampLabel=t.wd=t.HEAD_BYTE_LIMIT=t.HEAD_LINE_LIMIT=void 0,t.HEAD_LINE_LIMIT=400,t.HEAD_BYTE_LIMIT=524288;const i=["<","Caveat:","[Request interrupted","Your claude.ai usage limit"];function n(e){if("string"!=typeof e)return!1;const t=e.trim();return!!t&&!i.some(e=>t.startsWith(e))}function o(e){var t,i,o;if("event_msg"===(null==e?void 0:e.type)&&"user_message"===(null===(t=e.payload)||void 0===t?void 0:t.type))return n(e.payload.message)?e.payload.message.trim():null;if("response_item"===(null==e?void 0:e.type)&&"user"===(null===(i=e.payload)||void 0===i?void 0:i.role)){const t=(Array.isArray(e.payload.content)?e.payload.content:[]).filter(e=>"input_text"===(null==e?void 0:e.type)&&"string"==typeof e.text).map(e=>e.text).join(" ");return n(t)?t.trim():null}if(!e||"user"!==e.type||!0===e.isMeta)return null;const a=null===(o=e.message)||void 0===o?void 0:o.content;let s=null;if("string"==typeof a)s=a;else if(Array.isArray(a)){const e=a.filter(e=>e&&"text"===e.type&&"string"==typeof e.text).map(e=>e.text);s=e.length?e.join(" "):null}return n(s)?s.trim():null}function a(e){if(!e)return"";const i=e.replace(/\s+/g," ").trim();return i.length>t.wd?i.slice(0,t.wd-1)+"…":i}t.wd=140,t.clampLabel=a,t.readHead=function(e){var t,i,n;let s=null,r="",d=null;for(const l of e){if(!l)continue;let e;try{e=JSON.parse(l)}catch{continue}if("session_meta"===(null==e?void 0:e.type)){if(null===(i=null===(t=e.payload)||void 0===t?void 0:t.source)||void 0===i?void 0:i.subagent)return{cwd:null,label:"",startedAt:null,isSubagent:!0};s||"string"!=typeof(null===(n=e.payload)||void 0===n?void 0:n.cwd)||(s=e.payload.cwd)}if(!s&&"string"==typeof(null==e?void 0:e.cwd)&&e.cwd&&(s=e.cwd),null===d&&"string"==typeof(null==e?void 0:e.timestamp)){const t=Date.parse(e.timestamp);Number.isNaN(t)||(d=t)}if(!r){const t=o(e);t&&(r=a(t))}if(s&&r&&null!==d)break}return{cwd:s,label:r,startedAt:d}},t.mergeSessions=function(e,t){var i;const n=new Map;for(const e of t)e.sessionId&&n.set(e.sessionId,{...e});for(const t of e){if(!t.sessionId)continue;const e=n.get(t.sessionId);e&&n.set(t.sessionId,{...e,label:t.label||e.label,from:t.label?t.from:e.from,lastStatus:null!==(i=t.lastStatus)&&void 0!==i?i:e.lastStatus,cwd:e.cwd||t.cwd,lastSeen:Math.max(t.lastSeen||0,e.lastSeen||0)})}return[...n.values()]},t.pruneLedger=function(e,t){return e.filter(e=>e.sessionId&&t.has(e.sessionId))},t.resumeRowsFor=function(e,t){var i;const n=t.groupKeys?new Set(t.groupKeys.map(e=>t.fold(e))):null,o=t.days>0?t.now-864e5*t.days:null,a=[];for(const s of e)s.sessionId&&!t.hidden.has(s.sessionId)&&(n&&!n.has(t.fold(t.keyOf(s.cwd)))||null!==o&&s.lastSeen<o||a.push({...s,openTabId:null!==(i=t.live.get(s.sessionId))&&void 0!==i?i:null}));return a.sort((e,t)=>t.lastSeen-e.lastSeen||e.sessionId.localeCompare(t.sessionId)),t.limit>0?a.slice(0,t.limit):a},t.formatWhen=function(e,t){if(!e||!Number.isFinite(e))return"";const i=new Date(e),n=new Date(t);if(i.getFullYear()===n.getFullYear()&&i.getMonth()===n.getMonth()&&i.getDate()===n.getDate())return`${String(i.getHours()).padStart(2,"0")}:${String(i.getMinutes()).padStart(2,"0")}`;const o=new Date(t);return o.setDate(o.getDate()-1),i.getFullYear()===o.getFullYear()&&i.getMonth()===o.getMonth()&&i.getDate()===o.getDate()?"어제":`${i.getMonth()+1}/${i.getDate()}`};const s=/^([0-9a-fA-F-]{8,64})\.jsonl$/;t.sessionIdFromFile=function(e){const t=s.exec(e||"");return t?t[1]:null},t.resumeCommand=function(e,t,i="claude"){return/^[0-9a-fA-F-]{8,64}$/.test(e||"")?"codex"===i?`codex ${t?"fork":"resume"} ${e}`:`claude --resume ${e}${t?" --fork-session":""}`:""}},9174(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionMailbox=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(6982);t.SessionMailbox=class{constructor(e,t){if(this.file=e,this.wake=t,this.data={version:1,sessions:[],messages:[]},this.committed=JSON.stringify(this.data),s.existsSync(e)){const t=JSON.parse(s.readFileSync(e,"utf8"));if(1!==t.version||!Array.isArray(t.sessions)||!Array.isArray(t.messages))throw new Error("Unsupported mailbox store");this.data=t,this.data.sessions.forEach(e=>{e.active=!1})}this.committed=JSON.stringify(this.data)}save(){try{s.mkdirSync(r.dirname(this.file),{recursive:!0});const e=this.file+".tmp",t=JSON.stringify(this.data);s.writeFileSync(e,t,{encoding:"utf8",mode:384}),s.renameSync(e,this.file),this.committed=t}catch(e){throw this.data=JSON.parse(this.committed),e}}register(e,t,i){if(!e||e.length>256)throw new Error("Invalid session ID");let n=this.data.sessions.find(t=>t.sessionId===e);return n?Object.assign(n,{name:t,cwd:i,active:!0}):(n={sessionId:e,name:t,cwd:i,active:!0,token:(0,d.randomBytes)(32).toString("hex")},this.data.sessions.push(n)),this.save(),{sessionId:e,token:n.token}}close(e){const t=this.data.sessions.find(t=>t.sessionId===e);(null==t?void 0:t.active)&&(t.active=!1,this.save())}call(e,t,i,n={}){var o,a,s;const r=this.data.sessions.find(t=>t.sessionId===e),l=Buffer.from("string"==typeof t?t:""),c=Buffer.from(null!==(o=null==r?void 0:r.token)&&void 0!==o?o:"");if(!r||!r.active||l.length!==c.length||!(0,d.timingSafeEqual)(l,c))throw new Error("Session is inactive or credentials are invalid");if(!n||"object"!=typeof n||Array.isArray(n))throw new Error("Invalid arguments");const u={sessions:[],receive:[],send:["toSessionId","body","requestKey","replyTo"],acknowledge:["messageId","completed"]};if(!u[i]||Object.keys(n).some(e=>!u[i].includes(e)))throw new Error("Unknown method or argument; routing requires actual session IDs");if("sessions"===i)return this.data.sessions.map(({token:e,...t})=>t);if("receive"===i)return this.data.messages.filter(t=>t.toSessionId===e&&!t.completedAt).slice(0,50);if("acknowledge"===i){const t=this.data.messages.find(t=>t.id===n.messageId&&t.toSessionId===e);if(!t)throw new Error("Message not found in this session mailbox");if(void 0!==n.completed&&"boolean"!=typeof n.completed)throw new Error("Invalid completion flag");return null!==(a=t.readAt)&&void 0!==a||(t.readAt=Date.now()),n.completed&&(null!==(s=t.completedAt)&&void 0!==s||(t.completedAt=Date.now())),this.save(),t}if("string"!=typeof n.toSessionId||"string"!=typeof n.body||!n.body.trim()||n.body.length>32768||"string"!=typeof n.requestKey||!n.requestKey||n.requestKey.length>128)throw new Error("Provide toSessionId, body (1–32768 characters), and a stable requestKey (1–128 characters)");const p=this.data.messages.find(t=>t.fromSessionId===e&&t.requestKey===n.requestKey);if(p){if(p.toSessionId!==n.toSessionId||p.body!==n.body||p.replyTo!==n.replyTo)throw new Error("requestKey already belongs to a different message");return this.sendResult(p)}if(!n.toSessionId||n.toSessionId.length>256)throw new Error("Invalid recipient session ID");if(void 0!==n.replyTo&&!this.data.messages.some(t=>t.id===n.replyTo&&t.toSessionId===e&&t.fromSessionId===n.toSessionId))throw new Error("Reply must address the sender of a received message");const h={id:(0,d.randomUUID)(),fromSessionId:e,toSessionId:n.toSessionId,body:n.body,requestKey:n.requestKey,createdAt:Date.now(),...void 0!==n.replyTo?{replyTo:n.replyTo}:{}};return this.data.messages.push(h),this.save(),this.sendResult(h)}isActive(e){return this.data.sessions.some(t=>t.sessionId===e&&t.active)}sendResult(e){let t={attempted:!1,delivered:!1,reason:"no-tab"};try{this.wake&&(t=this.wake(e))}catch{}return{...e,wake:t}}}},8860(e,t,i){t.SessionSearch=void 0;const n=i(8167),o=i(5317),a=String.raw`
1
+ !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("rxjs"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal"));else if("function"==typeof define&&define.amd)define(["@angular/common","@angular/core","@angular/forms","rxjs","tabby-core","tabby-settings","tabby-terminal"],t);else{var i="object"==typeof exports?t(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("rxjs"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal")):t(e["@angular/common"],e["@angular/core"],e["@angular/forms"],e.rxjs,e["tabby-core"],e["tabby-settings"],e["tabby-terminal"]);for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(global,(e,t,i,n,o,a,s)=>(()=>{"use strict";var r={6100(e,t,i){var n=i(1601),o=i.n(n),a=i(6314),s=i.n(a)()(o());s.push([e.id,'agentdeck-settings-tab{display:grid;grid-template-columns:repeat(auto-fill, minmax(560px, 1fr));gap:0 32px;align-items:start}agentdeck-settings-tab>.form-line{min-width:0}agentdeck-settings-tab>.form-line>.header{min-width:0;overflow-wrap:anywhere}agentdeck-settings-tab>.form-line>.btn{flex-shrink:0;white-space:nowrap}agentdeck-settings-tab>h3,agentdeck-settings-tab>.text-muted{grid-column:1/-1}body.agentdeck-active.ad-bg-clip .content-tab-active::before{left:var(--ad-bg-left) !important;top:var(--ad-bg-top) !important;right:auto !important;bottom:auto !important;width:var(--ad-bg-width) !important;height:var(--ad-bg-height) !important}#agentdeck-sidebar{display:flex;flex-direction:column;z-index:5;overflow:hidden;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127));font-size:12px;user-select:none;-webkit-app-region:no-drag}#agentdeck-sidebar.ad-dock-right{border-left:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-left{border-right:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-top{border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-bottom{border-top:1px solid rgba(255,255,255,.08)}#agentdeck-sidebar.ad-dock-top .ad-list,#agentdeck-sidebar.ad-dock-bottom .ad-list{display:flex;flex-wrap:wrap;align-content:flex-start;gap:0 6px;overflow-y:auto}#agentdeck-sidebar.ad-dock-top .ad-tab,#agentdeck-sidebar.ad-dock-bottom .ad-tab{flex:0 0 220px;min-width:0}#agentdeck-sidebar.ad-dock-top .ad-group-head,#agentdeck-sidebar.ad-dock-bottom .ad-group-head{flex:0 0 100%;margin-top:2px}#agentdeck-sidebar.ad-dock-top .ad-resume-drawer,#agentdeck-sidebar.ad-dock-bottom .ad-resume-drawer{display:none}#agentdeck-sidebar .ad-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;letter-spacing:.12em;font-size:10px;font-weight:700;color:rgba(255,255,255,.4);-webkit-app-region:no-drag;cursor:grab}#agentdeck-sidebar .ad-head:active{cursor:grabbing}#agentdeck-sidebar .ad-resize{position:absolute;z-index:6;background:rgba(0,0,0,0);transition:background .12s ease}#agentdeck-sidebar .ad-resize:hover,body.ad-resizing #agentdeck-sidebar .ad-resize{background:rgba(97,175,239,.5)}#agentdeck-sidebar .ad-resize-right,#agentdeck-sidebar .ad-resize-left{top:0;bottom:0;width:6px;cursor:col-resize}#agentdeck-sidebar .ad-resize-right{left:0}#agentdeck-sidebar .ad-resize-left{right:0}#agentdeck-sidebar .ad-resize-top,#agentdeck-sidebar .ad-resize-bottom{left:0;right:0;height:6px;cursor:row-resize}#agentdeck-sidebar .ad-resize-bottom{top:0}#agentdeck-sidebar .ad-resize-top{bottom:0}#agentdeck-sidebar .ad-head-title{white-space:nowrap}#agentdeck-sidebar .ad-head-version{margin-left:4px;letter-spacing:0;font-weight:400}#agentdeck-sidebar .ad-head-count{-webkit-app-region:no-drag;display:flex;align-items:center;gap:6px;flex:0 0 auto;white-space:nowrap;letter-spacing:0;color:rgba(255,255,255,.55)}#agentdeck-sidebar .ad-cnt{padding:1px 6px;border-radius:8px;background:rgba(255,255,255,.08);color:var(--ad-color, rgba(255, 255, 255, 0.55));font-size:10px;line-height:1.3;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-list{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;padding:2px 6px 8px;scroll-behavior:auto}#agentdeck-sidebar .ad-list::-webkit-scrollbar{width:8px}#agentdeck-sidebar .ad-list::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:4px}#agentdeck-sidebar .ad-list::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.24)}#agentdeck-sidebar .ad-group-head{display:flex;align-items:center;gap:5px;margin:7px 0 2px;padding:2px 4px;border-radius:4px;color:rgba(255,255,255,.42);font-size:10px;font-weight:700;letter-spacing:.06em;cursor:pointer;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-group-head:first-child{margin-top:1px}#agentdeck-sidebar .ad-group-head:hover{background:rgba(255,255,255,.05);color:rgba(255,255,255,.7)}#agentdeck-sidebar .ad-group-head.collapsed .ad-group-count{background:rgba(255,255,255,.14);color:rgba(255,255,255,.75)}#agentdeck-sidebar .ad-group-caret{flex:0 0 auto;width:9px;font-size:9px;line-height:1;opacity:.75}#agentdeck-sidebar .ad-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#agentdeck-sidebar .ad-group-head.filter-open .ad-group-caret{opacity:.45}#agentdeck-sidebar .ad-group-count{flex:0 0 auto;padding:0 5px;border-radius:8px;background:rgba(255,255,255,.08);color:rgba(255,255,255,.55);font-size:9.5px;line-height:1.5;letter-spacing:0;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-tab{position:relative;display:flex;align-items:stretch;gap:8px;margin-bottom:3px;padding:7px 6px 7px 0;border-radius:5px;cursor:pointer;transition:background .1s ease}#agentdeck-sidebar .ad-tab:hover{background:rgba(255,255,255,.05)}#agentdeck-sidebar .ad-tab:hover .ad-close{opacity:.65}#agentdeck-sidebar .ad-tab.active{background:rgba(255,255,255,.1)}#agentdeck-sidebar .ad-tab.active .ad-title{color:#fff}#agentdeck-sidebar .ad-bar{flex:0 0 3px;border-radius:2px;background:var(--ad-color, #6b727d)}#agentdeck-sidebar .ad-body{flex:1 1 auto;min-width:0}#agentdeck-sidebar .ad-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.82);font-size:12.5px;line-height:1.35}#agentdeck-sidebar .ad-agent{display:inline-block;flex:none;margin-right:5px;vertical-align:-2px;opacity:.92}#agentdeck-sidebar .ad-agent svg{display:block}#agentdeck-sidebar .ad-meta{display:flex;align-items:center;gap:6px;margin-top:2px;font-size:10.5px;line-height:1.4;color:rgba(255,255,255,.45)}#agentdeck-sidebar .ad-badge{flex:0 1 auto;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ad-color, #6b727d);font-weight:600}#agentdeck-sidebar .ad-badge.pinned{text-decoration:underline dotted;text-underline-offset:2px}#agentdeck-sidebar .ad-subagents{flex:0 0 auto;padding:0 4px;border-radius:7px;background:rgba(86,182,194,.18);color:#56b6c2;font-weight:600;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-prompt{display:flex;align-items:center;margin-top:2px;min-width:0;font-size:11px;line-height:1.4}#agentdeck-sidebar .ad-label{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.6)}#agentdeck-sidebar .ad-label.empty{color:rgba(255,255,255,.25)}#agentdeck-sidebar .ad-elapsed{flex:0 0 auto;margin-left:auto;font-variant-numeric:tabular-nums;opacity:.55}#agentdeck-sidebar .ad-resume-drawer{flex:0 0 auto;display:flex;flex-direction:column;min-height:0;border-top:1px solid rgba(255,255,255,.07)}#agentdeck-sidebar .ad-resume-rows{max-height:200px;overflow-y:auto;overscroll-behavior:contain;padding:4px 4px 0}#agentdeck-sidebar .ad-resume-empty{padding:6px 8px;color:rgba(255,255,255,.3);font-size:11px}#agentdeck-sidebar .ad-resume-head{display:flex;align-items:center;gap:5px;margin:0;padding:6px 8px;border-radius:4px;color:rgba(255,255,255,.34);font-size:10px;font-weight:700;letter-spacing:.06em;cursor:pointer;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-resume-head:hover{background:rgba(255,255,255,.05);color:rgba(255,255,255,.6)}#agentdeck-sidebar .ad-resume-head .ad-group-count{background:rgba(255,255,255,.06);color:rgba(255,255,255,.45)}#agentdeck-sidebar .ad-resume-head .ad-group-caret{margin-left:auto}#agentdeck-sidebar .ad-resume{display:flex;align-items:stretch;gap:8px;margin:0 0 3px;padding:5px 6px 5px 0;border-radius:5px;cursor:pointer;opacity:.66;transition:background .1s ease,opacity .1s ease}#agentdeck-sidebar .ad-resume:hover{background:rgba(255,255,255,.05);opacity:1}#agentdeck-sidebar .ad-resume .ad-bar{background:#3a404b;background-image:linear-gradient(var(--ad-panel-bg, var(--bs-body-bg, #1e2127)) 50%, transparent 0);background-size:100% 5px}#agentdeck-sidebar .ad-resume .ad-title{font-size:12px;color:rgba(255,255,255,.72)}#agentdeck-sidebar .ad-resume .ad-meta{gap:5px;margin-top:1px;font-size:10px;color:rgba(255,255,255,.36)}#agentdeck-sidebar .re-was{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}#agentdeck-sidebar .re-was.s-done{color:rgba(152,195,121,.62)}#agentdeck-sidebar .re-was.s-error{color:rgba(224,108,117,.68)}#agentdeck-sidebar .re-was.s-limited{color:rgba(198,120,221,.62)}#agentdeck-sidebar .re-was.s-waiting{color:rgba(97,175,239,.62)}#agentdeck-sidebar .re-was.s-running{color:rgba(229,192,123,.62)}#agentdeck-sidebar .re-was.s-idle{color:rgba(255,255,255,.3)}#agentdeck-sidebar .re-was.live{padding:0 4px;border-radius:7px;background:rgba(229,192,123,.16);color:#e5c07b}#agentdeck-sidebar .re-when{flex:0 0 auto;margin-left:auto;padding-left:6px;font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-resume.open{opacity:.9}#agentdeck-sidebar .ad-resume.open .ad-bar{background:#e5c07b;background-image:none}#agentdeck-sidebar .ad-label-input{flex:1 1 auto;min-width:0;padding:0 4px;border:1px solid rgba(255,255,255,.25);border-radius:3px;background:rgba(0,0,0,.35);color:#fff;font-size:10.5px;outline:none}#agentdeck-sidebar .ad-label-input:focus{border-color:var(--ad-color, #61afef)}#agentdeck-sidebar .ad-close{flex:0 0 auto;align-self:center;width:18px;height:18px;padding:0;border:0;border-radius:3px;opacity:0;background:rgba(0,0,0,0);color:rgba(255,255,255,.8);font-size:15px;line-height:1;cursor:pointer;transition:opacity .1s ease,background .1s ease}#agentdeck-sidebar .ad-close:hover{opacity:1 !important;background:rgba(255,80,80,.35)}#agentdeck-sidebar .ad-now{--ad-now-font: 18px;flex:0 0 auto;padding:12px 14px 14px;border-top:1px solid rgba(255,255,255,.07);font-size:var(--ad-now-font);line-height:1.5;min-width:0;overflow:hidden}#agentdeck-sidebar .ad-now-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.88);font-size:19px;font-weight:600}#agentdeck-sidebar .ad-now-account{display:block;width:100%;text-align:left;background:rgba(0,0,0,0);border:0;padding:3px 0;cursor:pointer}#agentdeck-sidebar .ad-now-account:hover,#agentdeck-sidebar .ad-now-account:focus-visible{color:#fff;outline:1px solid #61afef}#agentdeck-sidebar .ad-now-account:not(:disabled)::after{content:" ▾"}#agentdeck-sidebar .ad-now-account{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.45);font-size:16px}#agentdeck-sidebar .ad-now-gauges,.ad-account-picker .ad-now-gauges{display:flex;flex-direction:column;gap:6px;margin-top:9px}#agentdeck-sidebar .ad-now-gauge,.ad-account-picker .ad-now-gauge{--ad-gauge: rgba(97, 175, 239, 0.85);display:flex;align-items:center;gap:9px;color:rgba(255,255,255,.62);font-variant-numeric:tabular-nums}#agentdeck-sidebar .ad-now-gauge.ad-now-warn,.ad-account-picker .ad-now-gauge.ad-now-warn{--ad-gauge: #e5c07b;color:rgba(229,192,123,.9)}#agentdeck-sidebar .ad-now-gauge.ad-now-hot,.ad-account-picker .ad-now-gauge.ad-now-hot{--ad-gauge: #e06c75;color:#e06c75;font-weight:600}#agentdeck-sidebar .ad-now-gauge-key,.ad-account-picker .ad-now-gauge-key{flex:0 0 52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;letter-spacing:.02em}#agentdeck-sidebar .ad-now-bar,.ad-account-picker .ad-now-bar{position:relative;flex:1 1 auto;min-width:0;height:12px;border-radius:6px;background:rgba(255,255,255,.1);overflow:hidden}#agentdeck-sidebar .ad-now-bar-fill,.ad-account-picker .ad-now-bar-fill{display:block;height:100%;border-radius:6px;background:var(--ad-gauge);transition:width .3s ease}#agentdeck-sidebar .ad-now-gauge-pct,.ad-account-picker .ad-now-gauge-pct{flex:0 0 auto;min-width:46px;text-align:right;font-size:16px}#agentdeck-sidebar .ad-now-reset,.ad-account-picker .ad-now-reset{margin:-1px 0 4px;color:rgba(255,255,255,.4);font-size:14px;white-space:nowrap}#agentdeck-sidebar .ad-foot{display:flex;gap:6px;padding:8px;border-top:1px solid rgba(255,255,255,.07)}#agentdeck-sidebar .ad-btn{flex:1 1 auto;padding:5px 8px;border:1px solid rgba(255,255,255,.12);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.6);font-size:11px;cursor:pointer}#agentdeck-sidebar .ad-btn:hover{background:rgba(255,255,255,.08);color:#fff}#agentdeck-sidebar .ad-repair,#agentdeck-sidebar .ad-viewtoggle{flex:0 0 auto;min-width:28px;font-size:13px;line-height:1}#agentdeck-sidebar .ad-search{display:flex;flex:0 0 auto;gap:4px;align-items:center;padding:0 8px 6px;-webkit-app-region:no-drag}#agentdeck-sidebar .ad-search-input{flex:1 1 auto;min-width:0;padding:3px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;outline:none;background:rgba(0,0,0,.28);color:rgba(255,255,255,.85);font-size:11px;line-height:1.4}#agentdeck-sidebar .ad-search-input::placeholder{color:rgba(255,255,255,.3)}#agentdeck-sidebar .ad-search-input:focus{border-color:rgba(97,175,239,.7);color:#fff}#agentdeck-sidebar .ad-search-clear{display:none;flex:0 0 auto;width:18px;height:18px;padding:0;border:0;border-radius:3px;background:rgba(0,0,0,0);color:rgba(255,255,255,.45);font-size:14px;line-height:1;cursor:pointer}#agentdeck-sidebar .ad-search-clear:hover{background:rgba(255,255,255,.12);color:#fff}#agentdeck-sidebar .ad-search.has-query .ad-search-clear{display:block}#agentdeck-sidebar .ad-cnt{cursor:pointer;user-select:none;transition:background .1s ease,color .1s ease}#agentdeck-sidebar .ad-cnt:hover{background:rgba(255,255,255,.16)}#agentdeck-sidebar .ad-cnt.active{box-shadow:inset 0 0 0 1px var(--ad-color, #61afef);background:rgba(255,255,255,.2);color:var(--ad-color, #fff)}#agentdeck-sidebar .ad-empty{padding:10px 8px;color:rgba(255,255,255,.42);text-align:center;word-break:break-all;font-size:11px;line-height:1.5}#agentdeck-sidebar .ad-tab.ad-nav-focus,#agentdeck-sidebar .ad-group-head.ad-nav-focus{box-shadow:inset 0 0 0 1px rgba(97,175,239,.85);background:rgba(97,175,239,.1)}#agentdeck-sidebar .ad-tab.active.ad-nav-focus{background:rgba(255,255,255,.14)}#agentdeck-sidebar .ad-list:focus,#agentdeck-sidebar .ad-list:focus-visible{outline:none}#agentdeck-sidebar .ad-tab.ad-dragging{opacity:.45;background:rgba(255,255,255,.06);outline:1px dashed rgba(255,255,255,.28);outline-offset:-1px}#agentdeck-sidebar .ad-reorder-note{position:absolute;left:8px;right:8px;bottom:34px;z-index:3;padding:7px 9px;border:1px solid rgba(255,255,255,.12);border-radius:5px;background:rgba(38,42,49,.96);box-shadow:0 4px 14px rgba(0,0,0,.45);color:rgba(255,255,255,.78);font-size:11px;line-height:1.45;pointer-events:none}#agentdeck-sidebar.ad-dock-top .ad-search,#agentdeck-sidebar.ad-dock-bottom .ad-search{padding:0 8px 4px}#agentdeck-sidebar.ad-dock-top .ad-list .ad-empty,#agentdeck-sidebar.ad-dock-bottom .ad-list .ad-empty{flex:0 0 100%}#agentdeck-view{display:flex;flex-direction:column;z-index:5;overflow:hidden;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127));font-size:12px;-webkit-app-region:no-drag}#agentdeck-view.ad-view-right{border-left:1px solid rgba(255,255,255,.08)}#agentdeck-view.ad-view-left{border-right:1px solid rgba(255,255,255,.08)}#agentdeck-view.ad-view-dropping{outline:1px dashed rgba(97,175,239,.8);outline-offset:-3px}#agentdeck-view .ad-view-head{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:8px 8px 6px 12px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-title{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:rgba(255,255,255,.82);font-weight:600}#agentdeck-view .ad-view-tools{display:flex;flex:0 0 auto;gap:2px}#agentdeck-view .ad-view-btn{min-width:24px;padding:2px 5px;border:0;border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.5);font-size:12px;line-height:1.2;cursor:pointer}#agentdeck-view .ad-view-btn:hover{background:rgba(255,255,255,.1);color:#fff}#agentdeck-view .ad-view-btn.ad-view-btn-on{background:rgba(97,175,239,.22);color:#9ecbff}#agentdeck-view .ad-view-path{display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-path input{width:100%;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-path input:focus{outline:0;border-color:rgba(97,175,239,.7)}#agentdeck-view .ad-view-path-note{width:100%;overflow:hidden;color:rgba(229,192,123,.9);font-size:11px;text-overflow:ellipsis;white-space:nowrap}#agentdeck-view .ad-view-path-note:empty{display:none}#agentdeck-view .ad-view-find{display:flex;align-items:center;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-find input{flex:1 1 auto;min-width:0;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-find input:focus{outline:0;border-color:rgba(97,175,239,.7)}#agentdeck-view .ad-view-find-count{flex:0 0 auto;min-width:44px;color:rgba(255,255,255,.45);font-size:11px;text-align:right}#agentdeck-view mark.ad-find-hit{border-radius:2px;background:rgba(229,192,123,.35);color:inherit}#agentdeck-view mark.ad-find-cur{background:rgba(229,192,123,.85);color:#1a1a1a}#agentdeck-view .ad-view-editbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 8px;border-top:1px solid rgba(255,255,255,.06);background:rgba(0,0,0,.18)}#agentdeck-view .ad-view-edit-note{overflow:hidden;color:rgba(255,255,255,.5);font-size:11px;text-overflow:ellipsis;white-space:nowrap}#agentdeck-view .ad-view-edit-btns{display:flex;flex:0 0 auto;gap:4px}#agentdeck-view .ad-view-edit-save,#agentdeck-view .ad-view-edit-cancel{padding:2px 10px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.75);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-edit-save:hover:not(:disabled),#agentdeck-view .ad-view-edit-cancel:hover:not(:disabled){border-color:rgba(255,255,255,.3);background:rgba(255,255,255,.08);color:#fff}#agentdeck-view .ad-view-edit-save:disabled,#agentdeck-view .ad-view-edit-cancel:disabled{opacity:.35;cursor:default}#agentdeck-view .ad-view-edit-save{border-color:rgba(97,175,239,.5);color:#9ecbff}#agentdeck-view textarea.ad-view-edit{display:block;box-sizing:border-box;width:100%;height:100%;min-height:200px;padding:6px 8px;border:0;background:rgba(0,0,0,.22);color:#e6e6e6;font-family:monospace;font-size:12px;line-height:1.5;resize:none;tab-size:4}#agentdeck-view textarea.ad-view-edit:focus{outline:0}#agentdeck-view .ad-view-tabs{display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-tab{max-width:100%;overflow:hidden;padding:2px 7px;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);white-space:nowrap;text-overflow:ellipsis;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-tab:hover{color:#fff;border-color:rgba(255,255,255,.25)}#agentdeck-view .ad-view-tab.ad-view-tab-on{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-body{flex:1 1 auto;overflow:auto;padding:10px 12px 16px;color:rgba(255,255,255,.85);user-select:text}#agentdeck-view .ad-view-foot{flex:0 0 auto;overflow:hidden;padding:5px 10px;border-top:1px solid rgba(255,255,255,.06);color:rgba(255,255,255,.35);white-space:nowrap;text-overflow:ellipsis;font-size:10px}#agentdeck-view .ad-view-resize{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;z-index:6}#agentdeck-view.ad-view-right .ad-view-resize{left:-2px}#agentdeck-view.ad-view-left .ad-view-resize{right:-2px}#agentdeck-view .ad-view-empty{padding:8px 2px;color:rgba(255,255,255,.55);line-height:1.7}#agentdeck-view .ad-view-empty ul{padding-left:18px;margin:6px 0 0}#agentdeck-view .ad-view-empty li{margin:2px 0}#agentdeck-view .ad-view-dim{color:rgba(255,255,255,.35);font-size:11px}#agentdeck-view .ad-view-image{display:flex;align-items:flex-start;justify-content:center}#agentdeck-view .ad-view-image img{max-width:100%;height:auto;background:rgba(255,255,255,.04)}#agentdeck-view .ad-view-code{display:flex;gap:8px;font-family:monospace;font-size:11px;line-height:1.5}#agentdeck-view .ad-view-code pre{margin:0;white-space:pre}#agentdeck-view .ad-view-code .ad-view-gutter{flex:0 0 auto;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-view-code .ad-view-src{flex:1 1 auto;overflow-x:auto;color:rgba(255,255,255,.85)}#agentdeck-view .ad-view-table{overflow-x:auto}#agentdeck-view .ad-view-table table{border-collapse:collapse;font-size:11px}#agentdeck-view .ad-view-table th,#agentdeck-view .ad-view-table td{max-width:260px;overflow:hidden;padding:3px 6px;border:1px solid rgba(255,255,255,.08);white-space:nowrap;text-overflow:ellipsis}#agentdeck-view .ad-view-table th{position:sticky;top:0;background:#262a31;color:rgba(255,255,255,.7)}#agentdeck-view .ad-view-table .ad-view-rownum{color:rgba(255,255,255,.3);text-align:right}#agentdeck-view .ad-view-md{line-height:1.65;word-break:break-word}#agentdeck-view .ad-view-md h1,#agentdeck-view .ad-view-md h2,#agentdeck-view .ad-view-md h3,#agentdeck-view .ad-view-md h4,#agentdeck-view .ad-view-md h5,#agentdeck-view .ad-view-md h6{margin:1.1em 0 .5em;color:#fff;line-height:1.3}#agentdeck-view .ad-view-md h1{font-size:18px}#agentdeck-view .ad-view-md h2{font-size:16px;padding-bottom:3px;border-bottom:1px solid rgba(255,255,255,.1)}#agentdeck-view .ad-view-md h3{font-size:14px}#agentdeck-view .ad-view-md h4,#agentdeck-view .ad-view-md h5,#agentdeck-view .ad-view-md h6{font-size:13px}#agentdeck-view .ad-view-md p{margin:.6em 0}#agentdeck-view .ad-view-md a{color:#61afef;text-decoration:none;cursor:pointer}#agentdeck-view .ad-view-md a:hover{text-decoration:underline}#agentdeck-view .ad-view-md code{padding:1px 4px;border-radius:3px;background:rgba(255,255,255,.08);font-family:monospace;font-size:11px}#agentdeck-view .ad-view-md pre{overflow-x:auto;margin:.7em 0;padding:8px 10px;border:1px solid rgba(255,255,255,.07);border-radius:5px;background:rgba(0,0,0,.28)}#agentdeck-view .ad-view-md pre code{padding:0;background:rgba(0,0,0,0);line-height:1.5}#agentdeck-view .ad-view-md ul,#agentdeck-view .ad-view-md ol{padding-left:20px;margin:.5em 0}#agentdeck-view .ad-view-md li{margin:.15em 0}#agentdeck-view .ad-view-md .ad-md-task{list-style:none;margin-left:-14px}#agentdeck-view .ad-view-md .ad-md-check{color:rgba(255,255,255,.6)}#agentdeck-view .ad-view-md blockquote{margin:.7em 0;padding:2px 0 2px 10px;border-left:3px solid rgba(255,255,255,.18);color:rgba(255,255,255,.6)}#agentdeck-view .ad-view-md hr{margin:1.2em 0;border:0;border-top:1px solid rgba(255,255,255,.12)}#agentdeck-view .ad-view-md table{display:block;overflow-x:auto;border-collapse:collapse;margin:.7em 0;font-size:11px}#agentdeck-view .ad-view-md th,#agentdeck-view .ad-view-md td{padding:4px 8px;border:1px solid rgba(255,255,255,.1);text-align:left}#agentdeck-view .ad-view-md th{background:rgba(255,255,255,.05);color:#fff}#agentdeck-view .ad-view-md img{max-width:100%;border-radius:4px}#agentdeck-view .ad-view-md .ad-md-noimg{padding:1px 5px;border-radius:3px;background:rgba(255,255,255,.06);color:rgba(255,255,255,.45);font-size:11px}#agentdeck-view .ad-view-modes{display:flex;flex:0 0 auto;gap:4px;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06);user-select:none}#agentdeck-view .ad-view-mode{flex:0 0 auto;padding:3px 12px;border:1px solid rgba(255,255,255,.1);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-mode:hover{border-color:rgba(255,255,255,.25);color:#fff}#agentdeck-view .ad-view-mode.ad-view-mode-on{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-scope{flex:0 0 auto;margin-left:auto;padding:3px 10px;border:1px dashed rgba(255,255,255,.18);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.55);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-scope:hover{border-color:rgba(255,255,255,.35);color:#fff}#agentdeck-view .ad-view-scope.ad-view-scope-all{border-style:solid;border-color:rgba(229,192,123,.5);color:#e5c07b}#agentdeck-view .ad-view-diff .ad-plus{color:#98c379}#agentdeck-view .ad-view-diff .ad-minus{color:#e06c75}#agentdeck-view .ad-view-diff-sum{padding-bottom:6px;color:rgba(255,255,255,.8);font-weight:600}#agentdeck-view .ad-view-diff-list{margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-view .ad-view-diff-item{display:flex;align-items:center;gap:6px;width:100%;padding:2px 4px;border:0;border-radius:3px;background:rgba(0,0,0,0);color:rgba(255,255,255,.7);text-align:left;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-diff-item:hover{background:rgba(255,255,255,.07)}#agentdeck-view .ad-view-diff-item .ad-view-diff-st{flex:0 0 auto;min-width:40px;color:rgba(255,255,255,.4);text-align:center;font-size:10px}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-added{color:#98c379}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-deleted{color:#e06c75}#agentdeck-view .ad-view-diff-item .ad-view-diff-st-renamed{color:#61afef}#agentdeck-view .ad-view-diff-item .ad-view-diff-name{flex:1 1 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-family:monospace}#agentdeck-view .ad-view-diff-item .ad-view-diff-num{flex:0 0 auto}#agentdeck-view .ad-view-diff-item .ad-view-diff-num b{margin-left:5px;font-weight:500}#agentdeck-view .ad-view-diff-sub{margin:4px 0;color:rgba(255,255,255,.4);font-size:11px}#agentdeck-view .ad-view-diff-untracked{margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08)}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u{overflow:hidden;padding:1px 4px;color:rgba(255,255,255,.5);white-space:nowrap;text-overflow:ellipsis;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u[data-ad-open]{cursor:pointer}#agentdeck-view .ad-view-diff-untracked .ad-view-diff-u[data-ad-open]:hover{background:rgba(255,255,255,.07);color:#fff}#agentdeck-view .ad-view-diff-file{margin-bottom:14px}#agentdeck-view .ad-view-diff-fhead{position:sticky;top:0;z-index:1;overflow:hidden;padding:4px 6px;border:1px solid rgba(255,255,255,.08);border-radius:4px 4px 0 0;background:#262a31;color:rgba(255,255,255,.8);white-space:nowrap;text-overflow:ellipsis;font-family:monospace;font-size:11px;cursor:pointer}#agentdeck-view .ad-view-diff-fhead:hover{color:#fff}#agentdeck-view .ad-view-diff-note{padding:4px 6px;border:1px solid rgba(255,255,255,.08);border-top:0;color:rgba(255,255,255,.35);font-size:11px}#agentdeck-view .ad-view-diff-lines{overflow-x:auto;border:1px solid rgba(255,255,255,.08);border-top:0;font-family:monospace;font-size:11px;line-height:1.5}#agentdeck-view .ad-dl{display:flex;min-width:100%;min-height:17px;white-space:pre}#agentdeck-view .ad-dl .ad-dl-no{flex:0 0 auto;width:38px;padding-right:6px;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-dl .ad-dl-tx{flex:1 0 auto;padding-right:8px;color:rgba(255,255,255,.8)}#agentdeck-view .ad-dl-add{background:rgba(152,195,121,.12)}#agentdeck-view .ad-dl-add .ad-dl-tx{color:#b7d99b}#agentdeck-view .ad-dl-del{background:rgba(224,108,117,.12)}#agentdeck-view .ad-dl-del .ad-dl-tx{color:#eda3a9}#agentdeck-view .ad-dl-hunk{background:rgba(97,175,239,.1)}#agentdeck-view .ad-dl-hunk .ad-dl-tx{color:rgba(97,175,239,.85)}#agentdeck-view .ad-view-stage{flex:0 0 auto;min-width:44px;padding:0 4px;border:1px solid rgba(255,255,255,.14);border-radius:3px;color:rgba(255,255,255,.45);text-align:center;font-size:10px;cursor:pointer}#agentdeck-view .ad-view-stage:hover{border-color:rgba(255,255,255,.4);color:#fff}#agentdeck-view .ad-view-stage-staged{border-color:rgba(152,195,121,.5);background:rgba(152,195,121,.14);color:#b7d99b}#agentdeck-view .ad-view-stage-both{border-color:rgba(229,192,123,.5);background:rgba(229,192,123,.12);color:#e5c07b}#agentdeck-view .ad-view-stage-conflict{border-color:rgba(224,108,117,.6);background:rgba(224,108,117,.14);color:#eda3a9}#agentdeck-view .ad-dl[data-ad-ref-line],#agentdeck-view .ad-dl[data-ad-ref-del],#agentdeck-view .ad-cl[data-ad-ref-line]{cursor:pointer}#agentdeck-view .ad-dl[data-ad-ref-line]:hover,#agentdeck-view .ad-cl[data-ad-ref-line]:hover{box-shadow:inset 2px 0 0 rgba(97,175,239,.55)}#agentdeck-view .ad-dl.ad-ref-sel,#agentdeck-view .ad-cl.ad-ref-sel{box-shadow:inset 2px 0 0 #61afef;background:rgba(97,175,239,.22)}#agentdeck-view .ad-dl.ad-ref-sel .ad-dl-no,#agentdeck-view .ad-dl.ad-ref-sel .ad-cl-no,#agentdeck-view .ad-cl.ad-ref-sel .ad-dl-no,#agentdeck-view .ad-cl.ad-ref-sel .ad-cl-no{color:rgba(255,255,255,.6)}#agentdeck-view .ad-dl.ad-ref-sel .ad-dl-tx,#agentdeck-view .ad-dl.ad-ref-sel .ad-cl-tx,#agentdeck-view .ad-cl.ad-ref-sel .ad-dl-tx,#agentdeck-view .ad-cl.ad-ref-sel .ad-cl-tx{color:#fff}#agentdeck-view .ad-view-code.ad-view-code-rows{display:block;overflow-x:auto}#agentdeck-view .ad-cl{display:flex;min-width:100%;min-height:17px;white-space:pre}#agentdeck-view .ad-cl .ad-cl-no{flex:0 0 auto;width:44px;padding-right:8px;color:rgba(255,255,255,.25);text-align:right;user-select:none}#agentdeck-view .ad-cl .ad-cl-tx{flex:1 0 auto;padding-right:8px;color:rgba(255,255,255,.85)}#agentdeck-view .ad-view-ref{flex:0 0 auto;overflow:hidden;padding:4px 10px;border-top:1px solid rgba(255,255,255,.06);color:rgba(255,255,255,.5);white-space:nowrap;text-overflow:ellipsis;font-size:10px}#agentdeck-view .ad-view-ref-on{background:rgba(97,175,239,.14);color:#cfe6ff}#agentdeck-view .ad-view-commit{flex:0 0 auto;padding:6px 8px;border-top:1px solid rgba(255,255,255,.06)}#agentdeck-view .ad-view-commit-sum{margin-bottom:4px;color:rgba(255,255,255,.55);font-size:11px}#agentdeck-view .ad-view-commit-row{display:flex;gap:6px;align-items:center}#agentdeck-view .ad-view-commit-msg{flex:1 1 auto;min-width:0;padding:4px 6px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,.25);color:#e6e6e6;font-family:monospace;font-size:11px}#agentdeck-view .ad-view-commit-msg:focus{border-color:rgba(97,175,239,.6);outline:0}#agentdeck-view .ad-view-commit-go{flex:0 0 auto;padding:4px 10px;border:1px solid rgba(255,255,255,.14);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.7);font-size:11px;cursor:pointer}#agentdeck-view .ad-view-commit-go:hover:not(:disabled){border-color:rgba(255,255,255,.35);color:#fff}#agentdeck-view .ad-view-commit-go:disabled{opacity:.45;cursor:default}#agentdeck-view .ad-view-commit-go.ad-view-commit-armed{border-color:rgba(224,108,117,.7);background:rgba(224,108,117,.18);color:#ffd7da}#agentdeck-view .ad-view-commit-note{margin-top:4px;overflow:hidden;color:rgba(255,255,255,.4);white-space:nowrap;text-overflow:ellipsis;font-size:11px}.ad-menu{position:fixed;z-index:10000;min-width:130px;padding:4px;border:1px solid rgba(255,255,255,.12);border-radius:6px;background:#262a31;box-shadow:0 6px 24px rgba(0,0,0,.5);font-size:12px;user-select:none}.ad-menu .ad-menu-item{padding:6px 10px;border-radius:4px;color:rgba(255,255,255,.75);cursor:pointer}.ad-menu .ad-menu-item:hover{background:rgba(255,255,255,.1);color:#fff}.ad-dock-overlay{position:fixed;inset:0;z-index:9998;pointer-events:none}.ad-dock-preview{position:fixed;display:none;border:1px solid rgba(97,175,239,.9);background:rgba(97,175,239,.22);box-shadow:0 0 0 9999px rgba(0,0,0,.18);transition:left .08s ease,top .08s ease,width .08s ease,height .08s ease}.ad-dock-zone{position:fixed;width:46px;height:46px;margin:-23px 0 0 -23px;border:1px solid rgba(255,255,255,.35);border-radius:6px;background:rgba(38,42,49,.92);box-shadow:0 4px 16px rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center}.ad-dock-zone .ad-dock-mark{width:26px;height:26px;border:1px solid rgba(255,255,255,.45);border-radius:3px}.ad-dock-zone.active{border-color:rgba(97,175,239,.95);background:rgba(97,175,239,.35)}.ad-dock-zone.ad-dock-zone-left .ad-dock-mark{border-left:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-right .ad-dock-mark{border-right:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-top .ad-dock-mark{border-top:4px solid rgba(97,175,239,.95)}.ad-dock-zone.ad-dock-zone-bottom .ad-dock-mark{border-bottom:4px solid rgba(97,175,239,.95)}.ad-reorder-line{position:fixed;z-index:9997;border-radius:1px;background:rgba(97,175,239,.95);box-shadow:0 0 5px rgba(97,175,239,.6);pointer-events:none}body.ad-reordering{cursor:grabbing}body.ad-reordering #agentdeck-sidebar,body.ad-reordering #agentdeck-sidebar *{cursor:grabbing !important}body.ad-reordering .content.main{pointer-events:none}body.ad-resizing{cursor:inherit}body.ad-resizing .content.main{pointer-events:none}.ad-window-drag{display:none}body.agentdeck-active.ad-native-titlebar .ad-window-drag{display:block;position:fixed;top:0;left:0;right:0;height:32px;padding-left:12px;line-height:32px;font-size:11px;user-select:none;-webkit-app-region:drag;z-index:100;color:var(--bs-secondary-color, #a0a0a0);background:var(--bs-body-bg, #1e2127)}body.agentdeck-active.ad-native-titlebar .window{margin-top:32px;height:calc(100% - 32px) !important}body.agentdeck-active .content.main>.tab-bar{display:none !important}body.agentdeck-active .window{display:flex;flex-direction:row;position:relative;background:var(--ad-panel-bg, var(--bs-body-bg, #1e2127))}.ad-drop-ask{position:fixed;right:16px;bottom:16px;z-index:10000;min-width:260px;max-width:420px;padding:10px 12px;border:1px solid rgba(255,255,255,.16);border-radius:6px;background:rgba(24,26,30,.97);box-shadow:0 6px 24px rgba(0,0,0,.45);color:#e6e6e6;font-size:12px}.ad-drop-ask .ad-drop-ask-msg{overflow:hidden;margin-bottom:8px;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.ad-drop-ask .ad-drop-ask-row{display:flex;gap:6px;align-items:center}.ad-drop-ask button{flex:1 1 auto;padding:5px 8px;border:1px solid rgba(255,255,255,.16);border-radius:4px;background:rgba(0,0,0,0);color:rgba(255,255,255,.85);font-size:12px;cursor:pointer}.ad-drop-ask button:hover{border-color:rgba(97,175,239,.6);background:rgba(97,175,239,.14);color:#fff}.ad-drop-ask .ad-drop-ask-close{flex:0 0 auto;min-width:26px;padding:5px 6px;color:rgba(255,255,255,.45)}.ad-drop-ask .ad-drop-ask-again{display:flex;gap:5px;align-items:center;margin-top:8px;margin-bottom:0;color:rgba(255,255,255,.5);font-size:11px;cursor:pointer}.ad-account-picker .ad-account-add{position:absolute;top:16px;right:52px;width:28px;height:28px;border:1px solid #687586;border-radius:4px;background:rgba(0,0,0,0);color:inherit;font-size:22px;line-height:1;cursor:pointer}.ad-account-picker .ad-account-add:hover,.ad-account-picker .ad-account-add:focus-visible{background:rgba(255,255,255,.0941176471)}.ad-account-picker .ad-account-form{margin-top:14px;padding:12px;border:1px solid #687586;border-radius:5px}.ad-account-picker .ad-account-form label{display:block;margin-bottom:10px}.ad-account-picker .ad-account-form input{display:block;width:100%;margin-top:5px;padding:7px;color:inherit;background:#181c23;border:1px solid #687586;border-radius:3px}.ad-account-picker .ad-account-form .ad-account-plaintext{color:inherit}.ad-account-picker .ad-account-form button{margin-right:8px;padding:5px 12px;color:inherit;background:#303846;border:1px solid #687586;border-radius:4px;cursor:pointer}.ad-account-picker{position:fixed;z-index:100000;left:50%;top:50%;transform:translate(-50%, -50%);width:min(440px,90vw);max-height:75vh;overflow-y:auto;padding:18px;color:var(--bs-body-color, #eee);background:var(--ad-panel-bg, var(--bs-body-bg, #252a33));border:1px solid var(--bs-border-color, #687586);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.5333333333)}.ad-account-picker .ad-account-close{float:right;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;border-radius:3px;color:inherit;background:rgba(0,0,0,0);font:inherit;font-size:22px;line-height:1;opacity:.7;cursor:pointer}.ad-account-picker .ad-account-close:hover,.ad-account-picker .ad-account-close:focus-visible{opacity:1;background:rgba(255,255,255,.0941176471)}.ad-account-picker p{font-size:13px;color:#bbc4d0;clear:both}.ad-account-picker .ad-account-row{margin-top:10px}.ad-account-picker .ad-account-email{font-size:12px;opacity:.8;overflow-wrap:anywhere}.ad-account-picker .ad-account-remove{float:none;display:block;margin:4px 0 0 auto;padding:3px 7px;color:inherit;background:rgba(0,0,0,0);border:1px solid #59677b;border-radius:3px;font:inherit;font-size:12px;cursor:pointer}.ad-account-picker .ad-account-remove:hover,.ad-account-picker .ad-account-remove:focus-visible{border-color:#e06c75}.ad-account-picker .ad-account-option{float:none;display:flex;flex-direction:column;gap:7px;width:100%;margin-top:10px;padding:12px;text-align:left;color:inherit;background:#303846;border:1px solid #59677b;border-radius:5px;cursor:pointer}.ad-account-picker .ad-account-option:hover,.ad-account-picker .ad-account-option:focus-visible{border-color:#61afef}.ad-account-picker .ad-account-option:disabled{opacity:.6;cursor:wait}.ad-account-picker .ad-account-option .ad-now-gauges{width:100%}.ad-account-picker .ad-account-option .ad-now-gauge{gap:7px}.ad-account-picker .ad-account-option .ad-now-gauge-key{flex-basis:40px;font-size:13px}.ad-account-picker .ad-account-option .ad-now-gauge-pct{min-width:35px;font-size:13px}.ad-account-picker .ad-account-option .ad-now-bar{height:9px}.ad-account-picker .ad-account-option .ad-now-reset{font-size:11px}.ad-meta .ad-identity{flex:0 0 auto;border:1px solid rgba(104,123,149,.4);border-radius:4px;background:rgba(53,69,91,.4);color:inherit;font:inherit;font-size:11px;padding:1px 4px}.ad-meta .ad-identity[hidden]{display:none}.ad-history-search{display:flex;flex-direction:column;gap:6px;min-height:0;padding:6px;max-height:45vh}.ad-history-search[hidden]{display:none}.ad-history-search input,.ad-history-search select,.ad-history-search button{color:#e3e7ef;background:#242833;border:1px solid #475164;border-radius:4px;font:inherit;min-width:0;padding:5px}.ad-history-search input:focus,.ad-history-search select:focus,.ad-history-search button:focus-visible{outline:2px solid #69b7ff}.ad-history-search .ad-history-status{font-size:11px;color:#aab6c8}.ad-history-search .ad-history-results{overflow-y:auto;min-height:0}.ad-history-search .ad-history-hit{display:flex;flex-direction:column;gap:4px;text-align:left;width:100%;margin-bottom:5px;cursor:pointer}.ad-history-search .ad-history-hit strong,.ad-history-search .ad-history-hit small,.ad-history-search .ad-history-hit span{overflow-wrap:anywhere}.ad-history-search .ad-history-hit small{color:#acb9ca}.ad-history-search .ad-history-hit:hover{background:#303c4d}.ad-history-overlay{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;-webkit-app-region:no-drag}.ad-history-overlay .ad-history-dialog{display:flex;flex-direction:column;width:min(900px,90vw);max-height:85vh;color:#e3e7ef;background:#202630;border:1px solid #526277;border-radius:8px;box-shadow:0 12px 50px rgba(0,0,0,.5333333333)}.ad-history-overlay header,.ad-history-overlay footer{display:flex;align-items:center;gap:10px;padding:12px}.ad-history-overlay header strong{flex:1;overflow-wrap:anywhere}.ad-history-overlay footer{flex-wrap:wrap}.ad-history-overlay button{background:#35455b;color:#fff;border:1px solid #687b95;border-radius:4px;padding:6px 12px;cursor:pointer}.ad-history-overlay button:focus-visible{outline:2px solid #69b7ff}.ad-history-overlay .ad-history-conversation{overflow:auto;min-height:0;padding:0 16px}.ad-history-overlay article{border-bottom:1px solid #435064;padding:14px 8px}.ad-history-overlay article.ad-history-match{border-left:3px solid #69b7ff}.ad-history-overlay pre{color:inherit;font:13px/1.6 Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0}.ad-history-search mark,.ad-history-overlay mark{background:#dec566;color:#171b22;border-radius:2px}',""]);const r=s;i.d(t,["A",0,r])},6314(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i}).join("")},t.i=function(e,i,n,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(n)for(var r=0;r<this.length;r++){var d=this[r][0];null!=d&&(s[d]=!0)}for(var l=0;l<e.length;l++){var c=[].concat(e[l]);n&&s[c[0]]||(void 0!==a&&(void 0===c[5]||(c[1]="@layer".concat(c[5].length>0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=a),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),o&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=o):c[4]="".concat(o)),t.push(c))}},t}},1601(e){e.exports=function(e){return e[1]}},3396(e,t,i){var n=i.cw(function(e,t){var i=[];function n(e){for(var t=-1,n=0;n<i.length;n++)if(i[n].identifier===e){t=n;break}return t}function o(e,t){for(var o={},s=[],r=0;r<e.length;r++){var d=e[r],l=t.base?d[0]+t.base:d[0],c=o[l]||0,u="".concat(l," ").concat(c);o[l]=c+1;var p=n(u),h={css:d[1],media:d[2],sourceMap:d[3],supports:d[4],layer:d[5]};if(-1!==p)i[p].references++,i[p].updater(h);else{var g=a(h,t);t.byIndex=r,i.splice(r,0,{identifier:u,updater:g,references:1})}s.push(u)}return s}function a(e,t){var i=t.domAPI(t);return i.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;i.update(e=t)}else i.remove()}}e.exports=function(e,t){var a=o(e=e||[],t=t||{});return function(e){e=e||[];for(var s=0;s<a.length;s++){var r=n(a[s]);i[r].references--}for(var d=o(e,t),l=0;l<a.length;l++){var c=n(a[l]);0===i[c].references&&(i[c].updater(),i.splice(c,1))}a=d}}}),o=i.cw(function(e,t){var i={};e.exports=function(e,t){var n=function(e){if(void 0===i[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}i[e]=t}return i[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(t)}}),a=i.cw(function(e,t){e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}}),s=i.cw(function(e,t){e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}}),r=i.cw(function(e,t){e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var o=void 0!==i.layer;o&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,o&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var a=i.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}}),d=i.cw(function(e,t){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}});n(),r(),o(),s(),a(),d();var l=i(6100),c={};c.styleTagTransform=function e(){return e.c||(e.c=i.n(d()))}()(),c.setAttributes=function e(){return e.c||(e.c=i.n(s()))}()(),c.insert=function e(){return e.c||(e.c=i.n(o()))}()().bind(null,"head"),c.domAPI=function e(){return e.c||(e.c=i.n(r()))}()(),c.insertStyleElement=function e(){return e.c||(e.c=i.n(a()))}()(),function e(){return e.c||(e.c=i.n(n()))}()()(l.A,c),l.A&&l.A.locals&&l.A.locals},2839(e,t,i){t.openAccountBrowser=void 0,t.openAccountBrowser=async(e,t)=>{if(!function(e,t){try{const i=new URL(t),n="codex"===e?["auth.openai.com","auth0.openai.com"]:["claude.ai","console.anthropic.com","platform.claude.com"];return"https:"===i.protocol&&!i.port&&n.includes(i.hostname)}catch{return!1}}(t.provider,e))throw new Error("지원하지 않는 로그인 주소입니다.");const n=new URL(e);n.searchParams.has("login_hint")||n.searchParams.set("login_hint",t.id);try{await i(4157).shell.openExternal(n.toString())}catch{throw new Error("로그인 브라우저를 열지 못했습니다.")}return()=>{}}},8066(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.resetAccountRefreshAfterLogin=t.recordRefreshSuccess=t.recordRefreshFailure=t.accountRefreshState=t.REFRESH_RETRY_MS=t.REFRESH_WINDOW_MS=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(6982);function l(e){return r.join(e,"agentdeck-refresh-state.json")}function c(e,t){s.mkdirSync(e,{recursive:!0});const i=l(e)+"."+process.pid+".tmp";s.writeFileSync(i,JSON.stringify(t),{mode:384}),s.renameSync(i,l(e))}function u(e,i=Date.now()){let n={generation:""};try{const t=JSON.parse(s.readFileSync(l(e),"utf8"));if("string"!=typeof t.generation)throw new Error("Invalid refresh state");n=t}catch(e){if("ENOENT"!==e.code)return{generation:"",blocked:!0}}return!n.blocked&&"number"==typeof n.firstFailureAt&&i-n.firstFailureAt>=t.REFRESH_WINDOW_MS&&(n.blocked=!0,c(e,n)),n}t.REFRESH_WINDOW_MS=3e5,t.REFRESH_RETRY_MS=6e4,t.accountRefreshState=u,t.recordRefreshFailure=function(e,i,n=Date.now()){var o;const a=u(e,n);return a.generation!==i||a.blocked||(null!==(o=a.firstFailureAt)&&void 0!==o||(a.firstFailureAt=n),a.nextAttemptAt=n+t.REFRESH_RETRY_MS,a.blocked=n-a.firstFailureAt>=t.REFRESH_WINDOW_MS,c(e,a)),a},t.recordRefreshSuccess=function(e,t){const i=u(e);i.generation!==t||i.blocked||void 0===i.firstFailureAt||c(e,{generation:t})},t.resetAccountRefreshAfterLogin=function(e){c(e,{generation:(0,d.randomBytes)(16).toString("hex")})}},2007(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.maintainAccountSessions=t.getAccountQuotas=t.recordAccountUsage=t.cachedAccountQuotas=t.ensureAccountSession=t.codexRefreshDeadline=t.synchronizeClaudeAuth=t.registerAccountSource=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=a(i(5692)),c=i(6982),u=i(3090),p=i(7025),h=i(8066);function g(e){try{return JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""))}catch{return null}}function f(e,t){s.mkdirSync(d.dirname(e),{recursive:!0});const i=e+"."+process.pid+".tmp";s.writeFileSync(i,JSON.stringify(t),{mode:384}),s.renameSync(i,e)}const m=new Map,v=new Map,b=new Map,k=new Map,y=new Map;function w(e,t){if(!t)return;const i=m.get(e.key)||new Set;i.add(d.resolve(t)),m.set(e.key,i)}function x(e){var t,i;return(null===(t=g(d.join(e,".claude.json")))||void 0===t?void 0:t.oauthAccount)||(d.resolve(e)===d.resolve(d.join(r.homedir(),".claude"))?null===(i=g(d.join(r.homedir(),".claude.json")))||void 0===i?void 0:i.oauthAccount:null)}function S(e){var t,i;const n=(0,u.accountHome)(e);if("claude"!==e.provider)return n;const o=[...new Set([n,...m.get(e.key)||[],(0,p.agentHome)("claude"),...process.env.CLAUDE_CONFIG_DIR?[process.env.CLAUDE_CONFIG_DIR]:[],d.join(r.homedir(),".claude")])].map(e=>({home:e,profile:x(e),credentials:g(d.join(e,".credentials.json"))})).filter(t=>{var i,n,o;return String((null===(i=t.profile)||void 0===i?void 0:i.emailAddress)||"").toLowerCase()===e.id.toLowerCase()&&(null===(o=null===(n=t.credentials)||void 0===n?void 0:n.claudeAiOauth)||void 0===o?void 0:o.accessToken)}).sort((e,t)=>Number(t.credentials.claudeAiOauth.expiresAt||0)-Number(e.credentials.claudeAiOauth.expiresAt||0)),a=o[0];if(!a)return n;const s=g(d.join(n,".credentials.json"));if(JSON.stringify(s)!==JSON.stringify(a.credentials)&&f(d.join(n,".credentials.json"),a.credentials),String((null===(t=x(n))||void 0===t?void 0:t.emailAddress)||"").toLowerCase()!==e.id.toLowerCase()){const e=g(d.join(n,".claude.json"))||{};e.oauthAccount=a.profile,f(d.join(n,".claude.json"),e)}return(null===(i=o.find(e=>d.resolve(e.home)!==d.resolve(n)&&e.credentials.claudeAiOauth.accessToken===a.credentials.claudeAiOauth.accessToken))||void 0===i?void 0:i.home)||a.home}async function C(e){const t=g(d.join((0,u.accountHome)(e),"claude"===e.provider?".credentials.json":"auth.json"));if(!t)return;const i=(0,c.createHash)("sha256").update(JSON.stringify(t)).digest("hex");b.get(e.key)!==i&&(await(0,u.saveAccountAuth)(e),b.set(e.key,i))}function j(e){var t,i;try{const n=JSON.parse(Buffer.from((null===(i=null===(t=null==e?void 0:e.tokens)||void 0===t?void 0:t.access_token)||void 0===i?void 0:i.split(".")[1])||"","base64").toString("utf8"));if("number"==typeof n.exp&&Number.isFinite(n.exp)&&n.exp>0)return 1e3*n.exp}catch{}const n=Date.parse(null==e?void 0:e.last_refresh);return Number.isFinite(n)?n+6912e5:0}function A(){return new u.AccountRequestError("auth","재로그인 필요 · 인증 갱신에 계속 실패하여 자동 점검을 중단했습니다.")}function E(e,t=!1){const i=v.get(e.key);if(i)return i;const n=(0,u.accountHome)(e),o=(0,h.accountRefreshState)(n);if(o.blocked)return Promise.reject(A());if((o.nextAttemptAt||0)>Date.now())return Promise.reject(new u.AccountRequestError("temporary","인증 갱신 대기 중 · 잠시 후 자동으로 다시 시도합니다."));const a=(async()=>{var i,n,o,a,r;if("claude"===e.provider&&S(e),await(0,u.restoreAccountAuth)(e),"codex"===e.provider)return await async function(e,t){var i;const n=(0,u.accountHome)(e),o=d.join(n,"auth.json");let a=g(o);if((0,u.accountEmail)("codex",n).toLowerCase()!==e.id.toLowerCase()||!(null===(i=null==a?void 0:a.tokens)||void 0===i?void 0:i.access_token))throw new u.AccountRequestError("auth","저장된 로그인 정보가 없습니다.");if(!j(a))throw new u.AccountRequestError("auth","로그인 만료 정보를 확인할 수 없습니다. 다시 로그인하세요.");if(!t&&j(a)>Date.now()+h.REFRESH_WINDOW_MS)return;const r=d.join(n,".agentdeck-auth-refresh.lock");let l;try{l=s.openSync(r,"wx")}catch{try{Date.now()-s.statSync(r).mtimeMs>6e4&&s.unlinkSync(r)}catch{}throw new u.AccountRequestError("temporary","인증 갱신 중입니다. 잠시 후 다시 시도합니다.")}try{if(a=g(o),!t&&j(a)>Date.now()+h.REFRESH_WINDOW_MS)return;await(0,u.authenticateAccount)(e,!0);const i=g(o);if((0,u.accountEmail)("codex",n).toLowerCase()!==e.id.toLowerCase()||j(i)<=Date.now()+h.REFRESH_WINDOW_MS)throw new u.AccountRequestError("auth","로그인 정보를 갱신하지 못했습니다.")}finally{s.closeSync(l);try{s.unlinkSync(r)}catch{}}}(e,t),void await C(e);let c=S(e),p=d.join(c,".credentials.json"),m=g(p),v=null==m?void 0:m.claudeAiOauth;if(!(null==v?void 0:v.accessToken)||(0,u.accountEmail)("claude",(0,u.accountHome)(e)).toLowerCase()!==e.id.toLowerCase())throw new u.AccountRequestError("auth","저장된 로그인 정보가 없습니다.");if(t||Number(v.expiresAt)<=Date.now()+3e5){const h=d.join(c,".agentdeck-auth-refresh.lock");let k;try{k=s.openSync(h,"wx")}catch{try{Date.now()-s.statSync(h).mtimeMs>6e4&&s.unlinkSync(h)}catch{}throw new u.AccountRequestError("temporary","인증 갱신 중입니다. 잠시 후 다시 시도합니다.")}try{if(c=S(e),p=d.join(c,".credentials.json"),m=g(p),v=null==m?void 0:m.claudeAiOauth,t||Number(null==v?void 0:v.expiresAt)<=Date.now()+3e5){if(!(null==v?void 0:v.refreshToken))throw new u.AccountRequestError("auth","갱신 가능한 로그인 정보가 없습니다.");const t=await(b=v.refreshToken,new Promise((e,t)=>{const i=JSON.stringify({grant_type:"refresh_token",refresh_token:b,client_id:"9d1c250a-e61b-44d9-88ed-5944d1962f5e"}),n=l.request("https://platform.claude.com/v1/oauth/token",{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(i)},timeout:15e3},i=>{let o="";i.on("data",e=>{o+=e,o.length>1048576&&n.destroy()}),i.on("end",()=>{let n;try{n=JSON.parse(o)}catch{return void t(new u.AccountRequestError("temporary","인증 갱신 응답을 읽지 못했습니다."))}200===i.statusCode?"string"==typeof n.access_token&&n.access_token&&Number(n.expires_in)>0?e(n):t(new u.AccountRequestError("temporary","인증 갱신 응답이 올바르지 않습니다.")):t(new u.AccountRequestError("invalid_grant"===(null==n?void 0:n.error)||401===i.statusCode?"auth":"temporary","저장된 인증정보를 갱신하지 못했습니다.",i.statusCode))})});n.on("timeout",()=>n.destroy()),n.on("error",()=>t(new u.AccountRequestError("temporary","인증 갱신 연결 실패"))),n.on("close",()=>t(new u.AccountRequestError("temporary","인증 갱신 연결 종료"))),n.end(i)}));if((null===(i=t.account)||void 0===i?void 0:i.email_address)&&String(t.account.email_address).toLowerCase()!==e.id.toLowerCase())throw new u.AccountRequestError("auth","갱신 응답의 계정이 일치하지 않습니다.");const s=g(p);(null===(n=null==s?void 0:s.claudeAiOauth)||void 0===n?void 0:n.accessToken)===v.accessToken&&(null===(o=null==s?void 0:s.claudeAiOauth)||void 0===o?void 0:o.refreshToken)===v.refreshToken&&String((null===(a=x(c))||void 0===a?void 0:a.emailAddress)||"").toLowerCase()===e.id.toLowerCase()&&(s.claudeAiOauth={...v,accessToken:t.access_token,refreshToken:t.refresh_token||v.refreshToken,expiresAt:Date.now()+1e3*Number(t.expires_in)},f(p,s)),S(e)}}catch(t){S(e);const i=null===(r=g(d.join((0,u.accountHome)(e),".credentials.json")))||void 0===r?void 0:r.claudeAiOauth;if(!i||i.accessToken===(null==v?void 0:v.accessToken)||Number(i.expiresAt)<=Date.now())throw t}finally{s.closeSync(k);try{s.unlinkSync(h)}catch{}}}var b;await C(e)})().then(()=>{(0,h.recordRefreshSuccess)(n,o.generation)},e=>{if((0,h.recordRefreshFailure)(n,o.generation).blocked)throw A();throw e}).finally(()=>v.delete(e.key));return v.set(e.key,a),a}function P(e){return d.join((0,u.accountHome)(e),"usage.json")}function z(e){const t=g(P(e));return(null==t?void 0:t.id)===e.id.toLowerCase()&&(null==t?void 0:t.provider)===e.provider&&Array.isArray(t.values)?{values:t.values,ts:t.ts,stale:Date.now()-t.ts>12e4}:null}function D(e,t,i=Date.now()){const n=z(e);return n&&n.ts>i?n:(f(P(e),{provider:e.provider,id:e.id.toLowerCase(),values:t,ts:i}),{values:t,ts:i,stale:Date.now()-i>12e4})}function T(e,t){var i,n;if(t.agent!==e.provider||(null===(i=t.account)||void 0===i?void 0:i.toLowerCase())!==e.id.toLowerCase())return;w(e,t.configDir);const o=Number(t.ts);if(!Number.isFinite(o)||o<=0||o>Date.now()+6e4||((null===(n=z(e))||void 0===n?void 0:n.ts)||0)>=o)return;const a=t.limits,s=[];for(const[e,t,i]of[["5시간",null==a?void 0:a.fiveHourPct,null==a?void 0:a.fiveHourResetsAt],["주간",null==a?void 0:a.sevenDayPct,null==a?void 0:a.sevenDayResetsAt],[null==a?void 0:a.scopedName,null==a?void 0:a.scopedPct,null==a?void 0:a.scopedResetsAt]])e&&"number"==typeof t&&Number.isFinite(t)&&s.push({label:e,remaining:100-Math.max(0,Math.min(100,t)),...i?{resetsAt:i}:{}});s.length&&D(e,s,o)}t.registerAccountSource=w,t.synchronizeClaudeAuth=S,t.codexRefreshDeadline=j,t.ensureAccountSession=E,t.cachedAccountQuotas=z,t.recordAccountUsage=T,t.getAccountQuotas=function(e){const t=k.get(e.key);if(t)return t;const i=(async()=>{var t;try{await E(e)}catch(t){const i=z(e);if(i&&!(t instanceof u.AccountRequestError&&"auth"===t.kind))return{...i,stale:!0};throw t}const i=z(e);if(i&&!i.stale)return i;const n=d.join((0,u.accountHome)(e),"usage-retry.json"),o=Math.max(y.get(e.key)||0,Number(null===(t=g(n))||void 0===t?void 0:t.until)||0);if(o>Date.now()){if(i)return{...i,stale:!0};throw new u.AccountRequestError("temporary","사용량 조회 제한 · 잠시 후 자동 갱신",429,o-Date.now())}try{let t;try{t=await(0,u.fetchAccountQuotas)(e)}catch(i){if(!(i instanceof u.AccountRequestError)||401!==i.status||"claude"!==e.provider)throw i;await E(e,!0),t=await(0,u.fetchAccountQuotas)(e)}return D(e,t)}catch(t){if(t instanceof u.AccountRequestError&&"auth"===t.kind)throw t;const o=Date.now()+(t instanceof u.AccountRequestError?t.retryAfterMs:6e4);if(y.set(e.key,o),f(n,{until:o}),i)return{...i,stale:!0};throw t}})().finally(()=>k.delete(e.key));return k.set(e.key,i),i},t.maintainAccountSessions=async function(e=[]){let t;try{t=(0,u.readAccounts)()}catch{return}for(const i of t)try{if((0,h.accountRefreshState)((0,u.accountHome)(i)).blocked)continue;for(const t of e)T(i,t);await E(i)}catch{}}},3090(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.loginAccount=t.fetchAccountQuotas=t.authenticateAccount=t.parseCodexUsage=t.parseQuotas=t.accountCliRoots=t.seedCodexMarketplaces=t.pendingMarketplaceSeed=t.prepareAccount=t.restoreAccountAuth=t.saveAccountAuth=t.protectAccountAuth=t.accountEmail=t.accountEnv=t.accountHome=t.removeAccount=t.addAccount=t.readAccounts=t.ACCOUNTS_FILE=t.AccountRequestError=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=a(i(5692)),c=i(6982),u=i(5317),p=i(7025),h=i(8066);class g extends Error{constructor(e,t,i=0,n=6e4){super(t),this.kind=e,this.status=i,this.retryAfterMs=n}}function f(e=(0,p.accountsFile)()){return function(e){let t;try{t=JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""))}catch(e){if("ENOENT"===e.code)return[];throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}const i=[];for(const e of["claude","codex"])if(Array.isArray(null==t?void 0:t[e]))for(const n of t[e]){if("string"!=typeof(null==n?void 0:n.id)||!n.id.trim())continue;const t=n.id.trim(),o=(0,c.createHash)("sha256").update(e+":"+t.toLowerCase()).digest("hex").slice(0,24);i.some(e=>e.key===o)||i.push({provider:e,key:o,id:t,name:"string"==typeof n.name&&n.name.trim()?n.name.trim():t,password:"string"==typeof n.password?n.password:""})}return i}(e).map(({password:e,...t})=>t)}function m(e){return d.join(d.dirname((0,p.accountsFile)()),"accounts",e.key)}function v(e){const t={...process.env};for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY"])delete t[e];return delete t.CLAUDECODE,t["claude"===e.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]=m(e),t}function b(e){try{return JSON.parse(s.readFileSync(e,"utf8"))}catch{return null}}function k(e,t){var i,n,o,a;return"codex"===e?function(e){try{return JSON.parse(Buffer.from(String(e).split(".")[1],"base64").toString("utf8")).email||""}catch{return""}}(null===(n=null===(i=b(d.join(t,"auth.json")))||void 0===i?void 0:i.tokens)||void 0===n?void 0:n.id_token):String((null===(a=null===(o=b(d.join(t,".claude.json")))||void 0===o?void 0:o.oauthAccount)||void 0===a?void 0:a.emailAddress)||"")}function y(e,t=!1){if("win32"!==process.platform)return Promise.reject(new Error("인증정보 저장은 현재 Windows에서 지원합니다."));const i=`$ErrorActionPreference="Stop"; Add-Type -AssemblyName System.Security; $bytes=[Convert]::FromBase64String([Console]::In.ReadToEnd()); $result=[Security.Cryptography.ProtectedData]::${t?"Unprotect":"Protect"}($bytes,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([Convert]::ToBase64String($result))`;return new Promise((n,o)=>{const a=(0,u.spawn)("powershell.exe",["-NoProfile","-NonInteractive","-Command",i],{windowsHide:!0,stdio:"pipe"});let s="";const r=()=>o(new Error("인증정보 암호화 저장소에 접근하지 못했습니다.")),d=setTimeout(()=>{a.kill(),r()},15e3);a.stdout.on("data",e=>{s+=e,s.length>1048576&&(a.kill(),r())}),a.stderr.resume(),a.stdin.on("error",r),a.on("error",()=>{clearTimeout(d),r()}),a.on("exit",e=>{clearTimeout(d),0===e&&s.trim()?n(t?Buffer.from(s.trim(),"base64").toString("utf8"):s.trim()):r()}),a.stdin.end(t?e:Buffer.from(e,"utf8").toString("base64"))})}t.AccountRequestError=g,t.ACCOUNTS_FILE=process.env.AGENTDECK_ACCOUNTS_FILE||d.join(r.homedir(),".agentdeck","accounts.json"),t.readAccounts=f,t.addAccount=function(e,t,i,n=(0,p.accountsFile)(),o=""){if(!(t=t.trim())||!i)throw new Error("계정과 비밀번호를 입력하세요.");if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t))throw new Error("이메일 주소 전체를 입력하세요.");let a={};try{if(s.existsSync(n)&&(a=JSON.parse(s.readFileSync(n,"utf8").replace(/^\uFEFF/,""))),!a||"object"!=typeof a||Array.isArray(a)||void 0!==a[e]&&!Array.isArray(a[e]))throw new Error}catch{throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}const r=a[e]||[];if(r.some(e=>"string"==typeof(null==e?void 0:e.id)&&e.id.trim().toLowerCase()===t.toLowerCase()))throw new Error("이미 등록된 계정입니다.");a[e]=[...r,{name:o.trim()||t,id:t,password:i}];const l=n+"."+process.pid+".add.tmp";try{s.mkdirSync(d.dirname(n),{recursive:!0}),s.writeFileSync(l,JSON.stringify(a,null,2)+"\n",{mode:384}),s.renameSync(l,n)}catch{try{s.unlinkSync(l)}catch{}throw new Error("계정을 저장하지 못했습니다. 다시 시도하세요.")}},t.removeAccount=function(e,t=(0,p.accountsFile)()){let i;try{if(i=JSON.parse(s.readFileSync(t,"utf8").replace(/^\uFEFF/,"")),!Array.isArray(null==i?void 0:i[e.provider]))throw new Error}catch{throw new Error("계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.")}i[e.provider]=i[e.provider].filter(t=>"string"!=typeof(null==t?void 0:t.id)||t.id.trim().toLowerCase()!==e.id.toLowerCase());const n=t+"."+process.pid+".remove.tmp";try{s.writeFileSync(n,JSON.stringify(i,null,2)+"\n",{mode:384}),s.renameSync(n,t)}catch{try{s.unlinkSync(n)}catch{}throw new Error("계정을 저장하지 못했습니다. 다시 시도하세요.")}},t.accountHome=m,t.accountEnv=v,t.accountEmail=k,t.protectAccountAuth=y;let w=Promise.resolve();function x(e){const t=w.catch(()=>{}).then(async()=>{var t,i;const n=m(e);if(k(e.provider,n).toLowerCase()!==e.id.toLowerCase())throw new Error("인증정보의 계정이 일치하지 않습니다.");const o=b(d.join(n,"claude"===e.provider?".credentials.json":"auth.json"));if(!o)throw new Error("저장할 인증정보가 없습니다.");const a={provider:e.provider,id:e.id.toLowerCase(),credentials:o,profile:"claude"===e.provider?null===(t=b(d.join(n,".claude.json")))||void 0===t?void 0:t.oauthAccount:void 0},r=await y(JSON.stringify(a)),l=(0,p.accountsFile)(),c=b(l),u=null===(i=null==c?void 0:c[e.provider])||void 0===i?void 0:i.find(t=>"string"==typeof t.id&&t.id.trim().toLowerCase()===e.id.toLowerCase());if(!u)throw new Error("계정 파일이 변경되어 인증정보를 저장하지 못했습니다.");u.auth={version:1,protection:"windows-dpapi",data:r,updatedAt:(new Date).toISOString()};const h=l+"."+process.pid+".tmp";try{s.writeFileSync(h,JSON.stringify(c,null,2)+"\n",{mode:384}),s.renameSync(h,l)}catch{throw new Error("계정 파일에 인증정보를 저장하지 못했습니다.")}});return w=t,t}async function S(e){var t,i;const n=m(e),o=d.join(n,"claude"===e.provider?".credentials.json":"auth.json");if(s.existsSync(o)&&k(e.provider,n).toLowerCase()===e.id.toLowerCase())return;const a=b((0,p.accountsFile)()),r=null===(i=null===(t=null==a?void 0:a[e.provider])||void 0===t?void 0:t.find(t=>"string"==typeof t.id&&t.id.trim().toLowerCase()===e.id.toLowerCase()))||void 0===i?void 0:i.auth;if(!r)return;if("windows-dpapi"!==r.protection||1!==r.version||"string"!=typeof r.data)throw new Error("저장된 인증정보 형식을 확인할 수 없습니다. 다시 로그인하세요.");let l;try{l=JSON.parse(await y(r.data,!0))}catch{throw new Error("저장된 인증정보를 복원하지 못했습니다. 다시 로그인하세요.")}if(l.provider!==e.provider||l.id!==e.id.toLowerCase()||!l.credentials)throw new Error("저장된 인증정보의 계정이 일치하지 않습니다.");if(s.mkdirSync(n,{recursive:!0,mode:448}),s.writeFileSync(o,JSON.stringify(l.credentials),{mode:384}),"claude"===e.provider){const e=d.join(n,".claude.json"),t=b(e)||{};t.oauthAccount=l.profile,s.writeFileSync(e,JSON.stringify(t),{mode:384})}}t.saveAccountAuth=x,t.restoreAccountAuth=S,t.prepareAccount=function(e,t){var i;const n=m(e),o=(0,p.hasConfiguredAgentHome)(e.provider)?(0,p.agentHome)(e.provider):t||(0,p.agentHome)(e.provider);if(s.mkdirSync(n,{recursive:!0,mode:448}),d.resolve(o)===d.resolve(n))return;if("claude"===e.provider&&s.existsSync(d.join(n,".claude.json"))){const e=b(d.join(o,".claude.json"))||b(d.join(r.homedir(),".claude.json"))||{};delete e.oauthAccount;const t=b(d.join(n,".claude.json"))||{};s.writeFileSync(d.join(n,".claude.json"),JSON.stringify({...e,...t}),{mode:384})}const a="claude"===e.provider?["settings.json","settings.local.json","CLAUDE.md"]:["config.toml","hooks.json","AGENTS.md"];for(const e of a){const t=d.join(n,e);s.existsSync(d.join(o,e))&&!s.existsSync(t)&&s.copyFileSync(d.join(o,e),t,s.constants.COPYFILE_EXCL)}const l="claude"===e.provider?["projects","skills","commands","plugins","hooks"]:["sessions","archived_sessions","skills","plugins","rules","claude-compat"];for(const t of l){const i=d.join(n,t);if((0,p.hasConfiguredAgentHome)(e.provider)&&["projects","sessions","archived_sessions"].includes(t)){let e;s.mkdirSync(d.join(o,t),{recursive:!0});try{e=s.lstatSync(i)}catch(e){if("ENOENT"!==e.code)throw e}if((null==e?void 0:e.isSymbolicLink())&&d.resolve(s.readlinkSync(i))!==d.resolve(o,t))s.unlinkSync(i);else if(e&&!e.isSymbolicLink())throw new Error("계정 폴더에 별도 대화 기록이 있습니다. 기록을 옮긴 뒤 다시 시도하세요.")}s.existsSync(d.join(o,t))&&!s.existsSync(i)&&s.symlinkSync(d.resolve(o,t),i,"win32"===process.platform?"junction":"dir")}if("claude"===e.provider&&!s.existsSync(d.join(n,".claude.json"))){const t=b(d.join(o,".claude.json"))||b(d.join(r.homedir(),".claude.json"))||{},a=String((null===(i=t.oauthAccount)||void 0===i?void 0:i.emailAddress)||"").toLowerCase()===e.id.toLowerCase();a||delete t.oauthAccount,s.writeFileSync(d.join(n,".claude.json"),JSON.stringify(t),{mode:384}),a&&s.existsSync(d.join(o,".credentials.json"))&&s.copyFileSync(d.join(o,".credentials.json"),d.join(n,".credentials.json"),s.constants.COPYFILE_EXCL)}"codex"!==e.provider||s.existsSync(d.join(n,"auth.json"))||k("codex",o).toLowerCase()!==e.id.toLowerCase()||s.copyFileSync(d.join(o,"auth.json"),d.join(n,"auth.json"),s.constants.COPYFILE_EXCL),"codex"===e.provider&&j(o,n).catch(()=>{})};const C=new Map;function j(e,t){const i=d.resolve(t),n=C.get(i);if(n)return n;const o=(async()=>{const i=d.join(e,".tmp","marketplaces"),n=d.join(t,".tmp","marketplaces");let o;try{o=(await s.promises.readdir(i,{withFileTypes:!0})).filter(e=>e.isDirectory()&&!e.name.startsWith(".")).map(e=>e.name)}catch{return}for(const e of o){const t=d.join(n,e);if(s.existsSync(t)||!s.existsSync(d.join(i,e,".git")))continue;const o=d.join(n,".agentdeck-seed-"+e+"-"+process.pid);try{await s.promises.rm(o,{recursive:!0,force:!0}),await s.promises.mkdir(n,{recursive:!0}),await s.promises.cp(d.join(i,e),o,{recursive:!0,verbatimSymlinks:!0}),s.existsSync(t)||await s.promises.rename(o,t)}finally{await s.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}})().finally(()=>C.delete(i));return C.set(i,o),o}t.pendingMarketplaceSeed=function(e){return C.get(d.resolve(e))||Promise.resolve()},t.seedCodexMarketplaces=j;let A={at:0,value:""};function E(){if("win32"===process.platform&&Date.now()-A.at>6e4)try{const e=d.join(process.env.SystemRoot||"C:\\Windows","System32/WindowsPowerShell/v1.0/powershell.exe"),t=(0,u.execFileSync)(e,["-NoProfile","-NonInteractive","-Command","[Environment]::GetEnvironmentVariable('Path','User') + ';' + [Environment]::GetEnvironmentVariable('Path','Machine')"],{encoding:"utf8",windowsHide:!0,timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();A={at:Date.now(),value:t}}catch{A.at=Date.now()}return[...new Set(((process.env.PATH||"")+d.delimiter+A.value).split(d.delimiter).map(e=>e.trim()).filter(Boolean))]}function P(e,t,i={}){const n=E(),o={...v(e),...i};for(const e of Object.keys(o))"path"===e.toLowerCase()&&delete o[e];o.PATH=n.join(d.delimiter);for(const i of n){if("codex"===e.provider&&"win32"===process.platform){const e="arm64"===process.arch?"arm64":"x64",n="arm64"===process.arch?"aarch64":"x86_64",a=d.join(i,"node_modules/@openai/codex/node_modules/@openai",`codex-win32-${e}`,"vendor",`${n}-pc-windows-msvc`,"bin/codex.exe");if(s.existsSync(a))return(0,u.spawn)(a,t,{env:o,windowsHide:!0,stdio:"pipe"})}const n=d.join(i,"node_modules","claude"===e.provider?"@anthropic-ai/claude-code/bin/claude.exe":"@openai/codex/bin/codex.js");if(s.existsSync(n))return(0,u.spawn)("claude"===e.provider?n:"node","claude"===e.provider?t:[n,...t],{env:o,windowsHide:!0,stdio:"pipe"})}return(0,u.spawn)(e.provider,t,{env:o,windowsHide:!0,stdio:"pipe"})}t.accountCliRoots=E;class z{constructor(e){this.closed=!1,this.next=0,this.pending=new Map,this.onNotification=()=>{},this.child=P(e,["-c",'cli_auth_credentials_store="file"',"app-server"],{GIT_ALLOW_PROTOCOL:"file"});let t="";this.child.stdout.on("data",e=>{let i;for(t+=e.toString();(i=t.indexOf("\n"))>=0;){const e=t.slice(0,i);let n;t=t.slice(i+1);try{n=JSON.parse(e)}catch{continue}const o=this.pending.get(n.id);o?(clearTimeout(o.timer),this.pending.delete(n.id),n.error?o.reject(new Error("Codex 인증 또는 사용량 조회에 실패했습니다. 다시 로그인하세요.")):o.resolve(n.result)):n.method&&this.onNotification(n.method,n.params)}t.length>1048576&&this.close()}),this.child.stderr.resume(),this.child.stdin.on("error",()=>this.close()),this.child.on("error",()=>this.close()),this.child.on("exit",()=>this.close())}async init(){await this.request("initialize",{clientInfo:{name:"agentdeck_accounts",version:"1.0.0"},capabilities:{experimentalApi:!0}}),this.child.stdin.write(JSON.stringify({method:"initialized"})+"\n")}request(e,t={}){const i=++this.next;return new Promise((n,o)=>{const a=setTimeout(()=>{this.pending.delete(i),o(new Error("Codex 응답 시간이 초과되었습니다."))},25e3);this.pending.set(i,{resolve:n,reject:o,timer:a}),this.child.stdin.write(JSON.stringify({id:i,method:e,params:t})+"\n",e=>{e&&(clearTimeout(a),this.pending.delete(i),o(new Error("Codex에 연결할 수 없습니다.")))})})}close(){if(!this.closed){this.closed=!0;for(const e of this.pending.values())clearTimeout(e.timer),e.reject(new Error("Codex 연결이 종료되었습니다."));this.pending.clear(),this.child.stdin.destroy(),this.child.stdout.destroy(),this.child.stderr.destroy(),this.child.killed||this.child.kill()}}}function D(e,t){var i,n,o,a,s,r,d,l,c,u,p,h,g,f;const m=[],v=(e,t,i)=>{if("number"==typeof t&&Number.isFinite(t)&&!m.some(t=>t.label===e)){const n={label:e,remaining:Math.max(0,Math.min(100,Math.round(100-t)))},o="number"==typeof i?i:"string"==typeof i?Date.parse(i)/1e3:0;Number.isFinite(o)&&o>0&&(n.resetsAt=o),m.push(n)}};if("claude"===e){v("5시간",null===(i=null==t?void 0:t.five_hour)||void 0===i?void 0:i.utilization,null===(n=null==t?void 0:t.five_hour)||void 0===n?void 0:n.resets_at),v("주간",null===(o=null==t?void 0:t.seven_day)||void 0===o?void 0:o.utilization,null===(a=null==t?void 0:t.seven_day)||void 0===a?void 0:a.resets_at);for(const e of Array.isArray(null==t?void 0:t.limits)?t.limits:[])"weekly_scoped"===e.kind&&v(String((null===(r=null===(s=e.scope)||void 0===s?void 0:s.model)||void 0===r?void 0:r.display_name)||(null===(l=null===(d=e.scope)||void 0===d?void 0:d.model)||void 0===l?void 0:l.id)||"Fable"),e.percent,e.resets_at),"weekly"===e.kind&&v("주간",e.percent,e.resets_at),"session"===e.kind&&v("5시간",e.percent,e.resets_at)}else{const e=null==t?void 0:t.rateLimits;for(const t of[null==e?void 0:e.primary,null==e?void 0:e.secondary])300===(null==t?void 0:t.windowDurationMins)&&v("5시간",t.usedPercent,t.resetsAt),10080===(null==t?void 0:t.windowDurationMins)&&v("주간",t.usedPercent,t.resetsAt);for(const[e,i]of Object.entries((null==t?void 0:t.rateLimitsByLimitId)||{})){const t=i,n=String(t.limitName||t.normalModelSlug||e);/astra/i.test(n+e+(t.normalModelSlug||""))&&v("Astra",null!==(u=null===(c=t.secondary)||void 0===c?void 0:c.usedPercent)&&void 0!==u?u:null===(p=t.primary)||void 0===p?void 0:p.usedPercent,null!==(g=null===(h=t.secondary)||void 0===h?void 0:h.resetsAt)&&void 0!==g?g:null===(f=t.primary)||void 0===f?void 0:f.resetsAt)}}return m}function T(e){var t,i,n,o,a;const s=e=>e?{usedPercent:e.used_percent,windowDurationMins:e.limit_window_seconds/60,resetsAt:e.reset_at}:null,r={};for(const n of Array.isArray(null==e?void 0:e.additional_rate_limits)?e.additional_rate_limits:[])r[String(n.metered_feature)]={limitName:n.limit_name,normalModelSlug:n.normal_model_slug,primary:s(null===(t=n.rate_limit)||void 0===t?void 0:t.primary_window),secondary:s(null===(i=n.rate_limit)||void 0===i?void 0:i.secondary_window)};const d=D("codex",{rateLimits:{primary:s(null===(n=null==e?void 0:e.rate_limit)||void 0===n?void 0:n.primary_window),secondary:s(null===(o=null==e?void 0:e.rate_limit)||void 0===o?void 0:o.secondary_window)},rateLimitsByLimitId:r});if(!d.some(e=>"Astra"===e.label)){const t=null===(a=Object.entries((null==e?void 0:e.model_usage)||{}).find(([e])=>/astra/i.test(e)))||void 0===a?void 0:a[1];"boolean"==typeof(null==t?void 0:t.available)&&d.push({label:"Astra",status:t.available?"사용 가능":"현재 사용 불가"})}return d}async function O(e,t=!1){var i,n;if(await S(e),k(e.provider,m(e)).toLowerCase()!==e.id.toLowerCase())throw new g("auth","저장된 로그인 정보가 없습니다.");if("codex"===e.provider&&t){const t=new z(e);try{if(await t.init(),(null===(n=null===(i=(await t.request("account/read",{refreshToken:!0})).account)||void 0===i?void 0:i.email)||void 0===n?void 0:n.toLowerCase())!==e.id.toLowerCase())throw new g("auth","계정 확인이 필요합니다.")}finally{t.close()}}}t.parseQuotas=D,t.parseCodexUsage=T,t.authenticateAccount=O,t.fetchAccountQuotas=async function(e){var t,i;if(await O(e),"codex"===e.provider)return function(e){const t=b(d.join(m(e),"auth.json"));return new Promise((e,i)=>{var n,o;const a=l.get("https://chatgpt.com/backend-api/wham/usage",{headers:{authorization:`Bearer ${(null===(n=null==t?void 0:t.tokens)||void 0===n?void 0:n.access_token)||""}`,"ChatGPT-Account-Id":(null===(o=null==t?void 0:t.tokens)||void 0===o?void 0:o.account_id)||""},timeout:1e4},n=>{let o="";n.on("data",e=>{o+=e,o.length>1048576&&a.destroy()}),n.on("end",()=>{var a;if(200===n.statusCode)try{const n=JSON.parse(o);if(n.account_id&&n.account_id!==(null===(a=null==t?void 0:t.tokens)||void 0===a?void 0:a.account_id))return void i(new Error("잔량 응답의 계정이 일치하지 않습니다."));e(T(n))}catch{i(new Error("Codex 잔량 응답을 읽지 못했습니다."))}else i(new Error("Codex 잔량 조회 실패"))})});a.on("timeout",()=>a.destroy()),a.on("error",()=>i(new Error("Codex 잔량 조회 연결 실패"))),a.on("close",()=>i(new Error("Codex 잔량 조회 연결 종료")))})}(e);const n=null===(i=null===(t=b(d.join(m(e),".credentials.json")))||void 0===t?void 0:t.claudeAiOauth)||void 0===i?void 0:i.accessToken;if(!n)throw new g("auth","저장된 로그인 정보가 없습니다.");return new Promise((e,t)=>{const i=l.get("https://api.anthropic.com/api/oauth/usage",{headers:{authorization:`Bearer ${n}`,"anthropic-beta":"oauth-2025-04-20"},timeout:1e4},n=>{let o="";n.on("data",e=>{o+=e,o.length>1048576&&i.destroy()}),n.on("end",()=>{if(200!==n.statusCode){const e=Number(n.headers["retry-after"]);return void t(new g(401===n.statusCode?"auth":"temporary",429===n.statusCode?"사용량 조회 제한 · 잠시 후 자동 갱신":"사용량 조회 일시 실패",n.statusCode,Number.isFinite(e)?Math.max(3e4,1e3*e):6e4))}try{e(D("claude",JSON.parse(o)))}catch{t(new Error("잔량 응답을 읽지 못했습니다."))}})});i.on("timeout",()=>i.destroy()),i.on("error",()=>t(new Error("잔량 조회 연결 실패"))),i.on("close",()=>t(new Error("잔량 조회 연결 종료")))})},t.loginAccount=async function(e,t){var i,n;if(!f().some(t=>t.key===e.key))throw new Error("계정 파일에서 이 계정이 제거되었습니다.");let o=()=>{};if("codex"===e.provider){const a=new z(e);let s;try{await a.init();let r=()=>{},d=()=>{};const l=new Promise((e,t)=>{r=e,d=t});l.catch(()=>{}),a.onNotification=(e,t)=>{"account/login/completed"===e&&(t.success?r():d(new Error("로그인에 실패했습니다.")))},s=setTimeout(()=>d(new Error("로그인 시간이 초과되었습니다. 다시 선택하세요.")),3e5);const c=await a.request("account/login/start",{type:"chatgpt"});if(o=await t(c.authUrl,e,()=>d(new Error("로그인을 취소했습니다."))),await l,(null===(n=null===(i=(await a.request("account/read",{refreshToken:!1})).account)||void 0===i?void 0:i.email)||void 0===n?void 0:n.toLowerCase())!==e.id.toLowerCase())throw await a.request("account/logout"),new Error("선택한 계정과 로그인된 계정이 다릅니다. 다시 선택하세요.")}finally{clearTimeout(s),o(),a.close()}}else{const i=P(e,["auth","login","--claudeai","--email",e.id]);try{if(await new Promise((n,a)=>{let s=!1,r="";const d=setTimeout(()=>{i.kill(),a(new Error("로그인 시간이 초과되었습니다."))},3e5),l=n=>{r=(r+n.toString()).slice(-32e3);const a=r.match(/https:\/\/(?:claude\.ai|console\.anthropic\.com|platform\.claude\.com)\/[^\s\x1b]+/);a&&!s&&(s=!0,t(a[0],e,()=>i.kill()).then(e=>{o=e},()=>{i.kill()}))};i.stdout.on("data",l),i.stderr.on("data",l),i.on("error",()=>{clearTimeout(d),a(new Error("Claude 로그인을 실행하지 못했습니다."))}),i.on("exit",e=>{clearTimeout(d),0===e?n():a(new Error("Claude 로그인이 완료되지 않았습니다."))})}),k("claude",m(e)).toLowerCase()!==e.id.toLowerCase())throw new Error("선택한 계정과 로그인된 계정이 다릅니다. 다시 로그인하세요.")}finally{o(),i.killed||i.kill()}}await x(e),(0,h.resetAccountRefreshAfterLogin)(m(e))}},3532(e,t){t.identifyAgent=t.detectProfileFor=t.profileFor=t.unionProfile=t.d=t.AGENT_PROFILES=t.CODEX_BUSY_TITLE=t.CODEX_WAITING_TITLE=t.CODEX_APPROVAL_PATTERNS=void 0;const i=/\(y\/n\)/i,n=/\[y\/N\]/i,o=/Press Enter to continue/i,a=/ctrl\+c to (?:interrupt|cancel|stop)/i,s=[">","❯","›","❭","➜"],r={id:"claude",label:"Claude Code",icon:'<svg viewBox="0 0 16 16" width="12" height="12" fill="none" aria-hidden="true"><g stroke="#d97757" stroke-width="2.1" stroke-linecap="round"><path d="M8 1.7V14.3"/><path d="M2.55 4.85 13.45 11.15"/><path d="M2.55 11.15 13.45 4.85"/></g></svg>',processHints:["claude"],titleHints:["claude"],waitingPatterns:[/Do you want to\b/i,/❯\s*1\.\s*Yes/,i,n,o],busyPatterns:[/esc to interrupt/i,a,/\btokens?\b.{0,20}\besc\b/i],limitedPatterns:[],busyTitleMarks:["✳","✻","✽","✶","✢","◐","◓","◑","◒"],imagePasteKey:"alt-v",promptHeads:["❯",">"],patternsProven:!0};t.CODEX_APPROVAL_PATTERNS=[/^[\t ]*Allow the [^\r\n]+ MCP server to run tool [^\r\n]+\?[\t ]*$/im,/^[\t ]*(?:[›>][\t ]*)?\d+\.[\t ]*(?:Always allow|Allow(?: for this session)?)[\t ]+Run the tool\b/im],t.CODEX_WAITING_TITLE=/^\s*\[\s*!\s*\]\s*Action Required\s*\|/i,t.CODEX_BUSY_TITLE=/^\s*[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+/;const d={id:"codex",label:"Codex CLI",icon:'<svg viewBox="0 0 16 16" width="12" height="12" fill="none" aria-hidden="true"><path d="M8 1.4 13.7 4.7v6.6L8 14.6 2.3 11.3V4.7z" stroke="#10a37f" stroke-width="1.7" stroke-linejoin="round"/></svg>',processHints:["codex"],titleHints:["codex"],waitingPatterns:[...t.CODEX_APPROVAL_PATTERNS,i,n,o],busyPatterns:[a],limitedPatterns:[/usage limit reached/i,/reached your usage limit/i],busyTitleMarks:[],imagePasteKey:"ctrl-v",promptHeads:s,patternsProven:!1},l={id:"gemini",label:"Gemini CLI",icon:'<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><path fill="#4285f4" d="M8 0c0 4.418 3.582 8 8 8-4.418 0-8 3.582-8 8 0-4.418-3.582-8-8-8 4.418 0 8-3.582 8-8z"/></svg>',processHints:["gemini"],titleHints:["gemini"],waitingPatterns:[/Allow execution of\b/i,/●\s*\d+\.\s*Allow once/],busyPatterns:[/esc to cancel/i],limitedPatterns:[],busyTitleMarks:["✦"],imagePasteKey:"config",promptHeads:s,promptShape:{ruleChars:["▄","▀","─","━","═","-"]},screenShape:{ruleChars:["▄","▀","─","━","═"]},patternsProven:!0};t.AGENT_PROFILES=[r,d,l];const c=["codex","gemini","claude"];function u(e){const t=new Set,i=[];for(const n of e){const e=`${n.source}\0${n.flags}`;t.has(e)||(t.add(e),i.push(n))}return i}function p(e){return[...new Set(e)]}function h(e){var i;return null!==(i=t.AGENT_PROFILES.find(t=>t.id===e))&&void 0!==i?i:t.d}t.d={id:"unknown",label:"알 수 없음",icon:"",processHints:p(t.AGENT_PROFILES.flatMap(e=>e.processHints)),titleHints:p(t.AGENT_PROFILES.flatMap(e=>e.titleHints)),waitingPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.waitingPatterns)),busyPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.busyPatterns)),limitedPatterns:u(t.AGENT_PROFILES.flatMap(e=>e.limitedPatterns)),busyTitleMarks:p(t.AGENT_PROFILES.flatMap(e=>e.busyTitleMarks)),imagePasteKey:"config",promptHeads:p([...s,...t.AGENT_PROFILES.flatMap(e=>e.promptHeads)]),patternsProven:!0},t.unionProfile=function(){return t.d},t.profileFor=h,t.detectProfileFor=function(e){const i=h(e);if(i.patternsProven)return i;const n=t.d;return{...i,waitingPatterns:n.waitingPatterns,busyPatterns:n.busyPatterns,limitedPatterns:n.limitedPatterns,busyTitleMarks:n.busyTitleMarks,promptShape:void 0,screenShape:void 0}},t.identifyAgent=function(e,t){const i=(null!=e?e:"").toLowerCase();for(const e of c)if(h(e).processHints.some(e=>i.includes(e)))return e;const n=(null!=t?t:"").toLowerCase();for(const e of c)if(h(e).titleHints.some(e=>n.includes(e)))return e;return"unknown"}},4883(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckAlertService=void 0;const a=i(860),s=i(7650),r=i(6021),d=i(4300),l=i(7797),c=["waiting","error","limited"];let u=class{constructor(e,t,i,n){this.app=e,this.config=t,this.zone=i,this.status=n,this.last=new WeakMap,this.flashing=!1,this.badgeShown=0,this.badgeCache=new Map,this.debug={flashes:0,badgeCount:0,badgeDraws:0,toasts:0,transitions:0,lastFocused:null,forceUnfocused:!1}}init(){this.app.ready$.subscribe(()=>{var e;try{this.setup()}catch(t){this.diag(`alert setup ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}})}setup(){var e;for(const e of this.app.tabs)this.last.set(e,this.status.get(e).status);this.status.changed$.subscribe(()=>{var e;try{this.onChanged()}catch(t){this.diag(`alert onChanged ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}}),this.app.tabClosed$.subscribe(e=>{var t;this.last.delete(e);try{this.updateBadge(this.countAlerting())}catch(e){this.diag(`alert tabClosed ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}),window.addEventListener("focus",()=>this.stopFlash());const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.alert=this.debug,this.diag(`alert ready tabs=${this.app.tabs.length}`)}onChanged(){const e=[];let t=0;for(const i of this.app.tabs){const n=this.status.get(i).status,o=this.last.get(i);this.last.set(i,n),c.includes(n)&&(t++,o!==n&&e.push(i))}if(this.updateBadge(t),0===e.length)return;this.debug.transitions+=e.length;const i=this.isFocused();if(this.debug.lastFocused=i,!i&&(this.diag(`alert enter=${e.length} count=${t} focused=${i}`),this.config.store.agentDeck.alertFlash&&this.flash(),this.config.store.agentDeck.alertToast))for(const t of e)this.toast(t)}countAlerting(){let e=0;for(const t of this.app.tabs)c.includes(this.status.get(t).status)&&e++;return e}win(){var e,t,i,n;try{const o=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(n=null===(i=null===(t=null==o?void 0:o("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===i?void 0:i.call(t))&&void 0!==n?n:null}catch{return null}}nativeImage(){var e,t,i;try{const n=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(i=null===(t=null==n?void 0:n("electron"))||void 0===t?void 0:t.nativeImage)&&void 0!==i?i:null}catch{return null}}isFocused(){if(this.debug.forceUnfocused)return!1;try{const e=this.win();if(null==e?void 0:e.isFocused)return!!e.isFocused()}catch{}return document.hasFocus()}flash(){var e;try{const e=this.win();if(!(null==e?void 0:e.flashFrame))return;e.flashFrame(!0),this.flashing=!0,this.debug.flashes++}catch(t){this.diag(`alert flash ERROR ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`)}}stopFlash(){var e,t;if(this.flashing){this.flashing=!1;try{null===(t=null===(e=this.win())||void 0===e?void 0:e.flashFrame)||void 0===t||t.call(e,!1)}catch{}}}updateBadge(e){var t;this.debug.badgeCount=e;const i=this.config.store.agentDeck.alertBadge?e:0;if(i!==this.badgeShown)try{const e=this.win();if(!(null==e?void 0:e.setOverlayIcon))return;if(0===i)return e.setOverlayIcon(null,""),this.badgeShown=0,void this.stopFlash();const t=this.badgeImage(i);if(!t)return;e.setOverlayIcon(t,`승인대기/오류 ${i}개`),this.badgeShown=i,this.debug.badgeDraws++}catch(e){this.diag(`alert badge ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}badgeImage(e){var t;const i=this.app.tabs.some(e=>"error"===this.status.get(e).status)?d.STATUS_STYLES.error.color:d.STATUS_STYLES.waiting.color,n=`${e}:${i}`,o=this.badgeCache.get(n);if(o)return o;const a=this.nativeImage();if(!a)return null;const s=e>9?"9+":String(e);let r;try{if(r=a.createEmpty(),r.addRepresentation({scaleFactor:1,width:16,height:16,dataURL:this.drawBadge(16,s,i)}),r.addRepresentation({scaleFactor:2,width:32,height:32,dataURL:this.drawBadge(32,s,i)}),null===(t=r.isEmpty)||void 0===t?void 0:t.call(r))throw new Error("empty after addRepresentation")}catch{r=a.createFromDataURL(this.drawBadge(32,s,i))}return this.badgeCache.set(n,r),r}drawBadge(e,t,i){const n=document.createElement("canvas");n.width=e,n.height=e;const o=n.getContext("2d");if(!o)throw new Error("canvas 2d 미지원");const a=e/2;return o.clearRect(0,0,e,e),o.beginPath(),o.arc(a,a,a-.5,0,2*Math.PI),o.fillStyle=i,o.fill(),o.lineWidth=Math.max(1,e/16),o.strokeStyle="rgba(255,255,255,0.85)",o.stroke(),o.fillStyle="#ffffff",o.font=`bold ${Math.round(e*(t.length>1?.55:.7))}px "Segoe UI", sans-serif`,o.textAlign="center",o.textBaseline="middle",o.fillText(t,a,a+.04*e),n.toDataURL("image/png")}toast(e){var t;try{if("undefined"==typeof Notification)return;const t=this.status.get(e),i=t.label||e.title||"(제목 없음)",n=d.STATUS_STYLES[t.status],o=new Notification("AgentDeck",{body:`${i} — ${n.label}`,tag:`agentdeck-${this.tabKey(e)}`});this.debug.toasts++,o.onclick=()=>{var t,i;try{const e=this.win();null===(t=null==e?void 0:e.show)||void 0===t||t.call(e),null===(i=null==e?void 0:e.focus)||void 0===i||i.call(e)}catch{}this.zone.run(()=>{this.app.tabs.includes(e)&&this.app.selectTab(e)}),o.close()}}catch(e){this.diag(`alert toast ERROR ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`)}}tabKey(e){const t=this.app.tabs.indexOf(e);return t>=0?String(t):"x"}diag(e){(0,l.diag)(e)}};u=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService,a.NgZone,r.WorkStatusService])],u),t.AgentDeckAlertService=u},4300(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.STATUS_STYLES=void 0,t.STATUS_STYLES={running:{icon:"●",label:"진행중",color:"#e5c07b"},waiting:{icon:"⏸",label:"승인대기",color:"#61afef"},limited:{icon:"⛔",label:"한도 도달",color:"#c678dd"},done:{icon:"✔",label:"완료",color:"#98c379"},error:{icon:"✖",label:"오류",color:"#e06c75"},idle:{icon:"○",label:"대기",color:"#6b727d"}}},5929(e,t){t.pickTabByPids=void 0,t.pickTabByPids=function(e,t){const i=(null!=e?e:[]).filter(e=>Number.isInteger(e)&&e>0);let n=!1;for(const e of t.values())if(e.length){n=!0;break}if(!i.length||!n)return{tab:null,mode:"legacy"};const o=new Set(i);for(const[e,i]of t)if(i.some(e=>o.has(e)))return{tab:e,mode:"pid"};return{tab:null,mode:"pid-miss"}}},1786(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.uninstallHooks=t.installHooks=t.hooksInstalled=t.stripHooks=t.mergeHooks=t.isMerged=t.hooksSupported=t.notifyScriptPath=t.claudeSettingsPath=void 0;const s=a(i(9896)),r=i(7025),d=a(i(6928)),l="agentdeck-notify",c=[{event:"UserPromptSubmit",args:"-Status running"},{event:"Notification",args:"-Status waiting"},{event:"PostToolUse",args:"-Status running"},{event:"PostToolUseFailure",args:"-Status running"},{event:"PermissionDenied",args:"-Status running"},{event:"SubagentStart",args:"-Subagent start"},{event:"SubagentStop",args:"-Subagent stop"},{event:"Stop",args:"-Status done"},{event:"StopFailure",args:"-Status error"}];function u(){return d.join((0,r.agentHome)("claude"),"settings.json")}function p(){return d.join(__dirname,"..","hooks","agentdeck-notify.ps1")}function h(){try{const e=s.readFileSync(u(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function g(e){return(Array.isArray(e)?e:[]).filter(e=>!JSON.stringify(null!=e?e:"").includes(l))}function f(e){var t;const i=null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{};return c.every(e=>(Array.isArray(i[e.event])?i[e.event]:[]).some(e=>JSON.stringify(null!=e?e:"").includes(l)))}function m(e,t){var i;const n={...null!=e?e:{}};n.hooks={...null!==(i=n.hooks)&&void 0!==i?i:{}};for(const e of c){const i=`powershell -NoProfile -ExecutionPolicy Bypass -File "${t}" ${e.args}`;n.hooks[e.event]=[...g(n.hooks[e.event]),{matcher:"*",hooks:[{type:"command",command:i,timeout:5}]}]}return n}function v(e){const t={...null!=e?e:{}};if(!t.hooks)return t;t.hooks={...t.hooks};for(const e of c){const i=g(t.hooks[e.event]);i.length?t.hooks[e.event]=i:delete t.hooks[e.event]}return t}function b(e){const t=u();s.mkdirSync(d.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,t+".agentdeck-backup"),s.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}t.claudeSettingsPath=u,t.notifyScriptPath=p,t.hooksSupported=function(){return"win32"===process.platform&&s.existsSync(p())},t.isMerged=f,t.mergeHooks=m,t.stripHooks=v,t.hooksInstalled=function(){return f(h())},t.installHooks=function(){const e=p();if(!s.existsSync(e))throw new Error(`훅 스크립트를 찾지 못했다: ${e}`);b(m(h(),e))},t.uninstallHooks=function(){b(v(h()))}},2627(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.setCodexHooks=t.codexHooksInstalled=t.mergeCodexHooks=t.stripCodexHooks=t.codexEventLabel=t.codexDisabledEvents=t.codexConfigPath=t.codexHooksPath=t.CODEX_EVENTS=void 0;const s=a(i(9896)),r=i(7025),d=a(i(6928)),l="agentdeck-codex-notify.ps1";function c(){return d.join((0,r.agentHome)("codex"),"hooks.json")}function u(){return d.join((0,r.agentHome)("codex"),"config.toml")}function p(e){const t=/^\[hooks\.state\.'([^']*)'\]/.exec(e);if(t)return t[1];const i=/^\[hooks\.state\."((?:[^"\\]|\\.)*)"\]/.exec(e);return i?i[1].replace(/\\(.)/g,"$1"):null}function h(e){const i=e.replace(/(^|_)([a-z])/g,(e,t,i)=>i.toUpperCase());return t.CODEX_EVENTS.includes(i)?i:e}function g(e){return"string"==typeof(null==e?void 0:e.command)&&e.command.includes(l)}function f(e){var t;const i={...null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{}};for(const e of Object.keys(i)){if(!Array.isArray(i[e]))throw new Error(`Invalid hooks.${e}: expected an array`);i[e]=i[e].map(t=>{if(!Array.isArray(null==t?void 0:t.hooks))throw new Error(`Invalid hooks.${e} group`);return{...t,hooks:t.hooks.filter(e=>!g(e))}}).filter(e=>e.hooks.length),i[e].length||delete i[e]}return{...e,hooks:i}}function m(e,i){var n;const o=f(e),a=`powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${i}"`;for(const e of t.CODEX_EVENTS)o.hooks[e]=[...null!==(n=o.hooks[e])&&void 0!==n?n:[],{hooks:[{type:"command",command:a,timeout:3}]}];return o}function v(){const e=c();if(!s.existsSync(e))return{};const t=JSON.parse(s.readFileSync(e,"utf8").replace(/^\uFEFF/,""));if(!t||"object"!=typeof t||Array.isArray(t)||null!=t.hooks&&("object"!=typeof t.hooks||Array.isArray(t.hooks)))throw new Error("Invalid Codex hooks.json; existing configuration was not changed");return t}t.CODEX_EVENTS=["UserPromptSubmit","PreToolUse","PermissionRequest","PostToolUse","Stop","Interrupt","SessionEnd"],t.codexHooksPath=c,t.codexConfigPath=u,t.codexDisabledEvents=function(){let e;try{e=s.readFileSync(u(),"utf8")}catch{return[]}const i=[],n=e=>e.toLowerCase().replace(/\\/g,"/"),o=n(c());for(const a of e.split(/\n(?=\[)/)){const e=p(a);if(!e)continue;const s=e.split(":");if(s.length<4)continue;s.pop(),s.pop();const r=s.pop();n(s.join(":"))===o&&t.CODEX_EVENTS.includes(h(r))&&/^\s*enabled\s*=\s*false\s*$/m.test(a)&&i.push(r)}return i},t.codexEventLabel=h,t.stripCodexHooks=f,t.mergeCodexHooks=m,t.codexHooksInstalled=function(){const e=v();return t.CODEX_EVENTS.every(t=>{var i,n;return null===(n=null===(i=e.hooks)||void 0===i?void 0:i[t])||void 0===n?void 0:n.some(e=>{var t;return null===(t=e.hooks)||void 0===t?void 0:t.some(g)})})},t.setCodexHooks=function(e){const t=c(),i=d.join(__dirname,"..","hooks",l);if(e&&!s.existsSync(i))throw new Error(`Missing hook: ${i}`);const n=v(),o=e?m(n,i):f(n);s.mkdirSync(d.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,`${t}.agentdeck-backup-${Date.now()}`),s.writeFileSync(t,JSON.stringify(o,null,2)+"\n","utf8")}},6743(e,t){t.installCodexKeys=void 0,t.installCodexKeys=function(e,t,i){var n;const o=null===(n=null==e?void 0:e.xterm)||void 0===n?void 0:n.element;o&&!e.__adCodexKeys&&(e.__adCodexKeys=!0,o.addEventListener("keydown",e=>{!t()||"ArrowUp"!==e.key||!e.altKey||e.ctrlKey||e.shiftKey||e.metaKey||e.isComposing||(e.preventDefault(),e.stopImmediatePropagation(),i(""))},{capture:!0}))}},102(e,t){function i(e){const t=Number(e);return Number.isFinite(t)?t:0}function n(e){if(!e||"object"!=typeof e)return null;const t=Number(e.used_percent);return Number.isFinite(t)?{pct:Math.max(0,Math.min(100,Math.round(t))),windowMinutes:i(e.window_minutes),resetsAt:i(e.resets_at)}:null}function o(e,t){var o,a,s,r,d,l,c,u,p,h,g;const f=t.trim();if(!f)return;let m;try{m=JSON.parse(f)}catch{return void e.skipped++}e.lines++;const v=null!==(o=null==m?void 0:m.payload)&&void 0!==o?o:{},b=String(null!==(a=null==m?void 0:m.type)&&void 0!==a?a:"");if("session_meta"===b)return e.cwd=String(null!==(s=v.cwd)&&void 0!==s?s:e.cwd),e.cliVersion=String(null!==(r=v.cli_version)&&void 0!==r?r:e.cliVersion),void(e.contextWindow=i(v.context_window)||e.contextWindow);if("turn_context"===b)return e.model=String(null!==(d=v.model)&&void 0!==d?d:e.model),v.effort&&(e.effort=String(v.effort)),void(e.cwd=String(null!==(l=v.cwd)&&void 0!==l?l:e.cwd));if("token_count"===(null==v?void 0:v.type)){const t=v.rate_limits;t&&(e.primary=null!==(c=n(t.primary))&&void 0!==c?c:e.primary,e.secondary=null!==(u=n(t.secondary))&&void 0!==u?u:e.secondary);const o=i(null===(p=v.info)||void 0===p?void 0:p.model_context_window);o>0&&(e.contextWindow=o);const a=null===(g=null===(h=v.info)||void 0===h?void 0:h.last_token_usage)||void 0===g?void 0:g.total_tokens;Number.isFinite(Number(a))&&(e.lastTokens=Number(a))}}t.emailFromIdToken=t.codexLimits=t.codexContextPct=t.feedCodexChunk=t.createCodexState=void 0,t.createCodexState=function(){return{model:"",effort:"",cwd:"",cliVersion:"",contextWindow:0,lastTokens:0,primary:null,secondary:null,pending:"",lines:0,skipped:0,dropped:0}},t.feedCodexChunk=function(e,t){var i;const n="string"==typeof t?t:"";if(!n)return;const a=(e.pending+n).split("\n");e.pending=null!==(i=a.pop())&&void 0!==i?i:"",e.pending.length>2097152&&(e.dropped++,e.pending="");for(const t of a)o(e,t)},t.codexContextPct=function(e){return e.contextWindow<=0||e.lastTokens<=0?null:Math.max(0,Math.min(100,Math.round(e.lastTokens/e.contextWindow*100)))},t.codexLimits=function(e){const t=t=>{var i;return null!==(i=[e.primary,e.secondary].find(e=>e&&e.windowMinutes===t))&&void 0!==i?i:null},i=t(300),n=t(10080);return{fiveHourPct:i?i.pct:null,fiveHourResetsAt:i?i.resetsAt:0,sevenDayPct:n?n.pct:null,sevenDayResetsAt:n?n.resetsAt:0}},t.emailFromIdToken=function(e){var t,i;const n=String(null!=e?e:"").split(".")[1];if(!n)return"";try{const e=n.length%4?"=".repeat(4-n.length%4):"",o=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/")+e,"base64").toString("utf8");return String(null!==(i=null===(t=JSON.parse(o))||void 0===t?void 0:t.email)&&void 0!==i?i:"")}catch{return""}}},160(e,t){function i(e){var t;return/^\s*\/ T R A N S C R I P T\b/.test(null!==(t=e[0])&&void 0!==t?t:"")&&e.slice(-4).some(e=>/q close/.test(e))}t.installCodexWheel=void 0,t.installCodexWheel=function(e,t,n){const o=null==e?void 0:e.xterm,a=null==o?void 0:o.element;if(!a||e.__adCodexWheel)return;e.__adCodexWheel=!0;let s=!1,r=0;const d=()=>{const e=o.buffer.active;return Array.from({length:o.rows},(t,i)=>{var n,o;return null!==(o=null===(n=e.getLine(e.baseY+i))||void 0===n?void 0:n.translateToString(!0))&&void 0!==o?o:""})},l=e=>{e&&n((e<0?"":"").repeat(Math.min(12,Math.abs(e))))};a.addEventListener("wheel",e=>{if(!t()||e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||!e.deltaY||Math.abs(e.deltaX)>Math.abs(e.deltaY))return;const a=d(),c=i(a),u=o.buffer.active,p=a.reduce((e,t,i)=>t.trim()?i+1:e,0),h=a.slice(Math.max(0,p-4),p).some(e=>/Context \d+% left/.test(e));if(!c&&!s&&("normal"!==u.type||u.baseY>0||!h||e.deltaY>0))return;e.preventDefault(),e.stopImmediatePropagation();const g=Math.sign(e.deltaY)*Math.max(1,Math.min(12,Math.ceil(Math.abs(e.deltaY)/(1===e.deltaMode?1:40))));if(c)return void l(g);if(r=Math.max(-12,Math.min(12,r+g)),s)return;s=!0,n("");let f=0;const m=()=>{if(!t()||++f>20)return s=!1,void(r=0);i(d())?(s=!1,l(r),r=0):setTimeout(m,50)};setTimeout(m,50)},{capture:!0,passive:!1})}},7028(e,t,i){t.defaultHotkeys=t.AgentDeckConfigProvider=t.LAYOUT_DEFAULTS=void 0;const n=i(7650);t.LAYOUT_DEFAULTS={sidebarDock:"right",sidebarWidth:0,sidebarHeight:200,viewerDock:"right",viewerWidth:420};class o extends n.ConfigProvider{constructor(){super(...arguments),this.defaults={agentDeck:{sessionIdentities:[],aliasProjects:[],accountStorageDir:"",claudeStorageDir:"",codexStorageDir:"",enabled:!0,mailboxWake:{enabled:!0,typingGuardMs:3e3,text:"[agentdeck] 새 메시지 {N}건 도착 receive 로 확인하고 acknowledge 할 것"},aspectW:4,aspectH:3,sidebarMin:200,sidebarMax:560,...t.LAYOUT_DEFAULTS,viewerOpen:!1,viewerScrape:!0,viewerPreload:!0,viewerAutoOpen:!1,viewerFollowMode:"",viewerFollow:!0,viewerDropOpen:"ask",viewerRecentMax:12,notifyPort:47500,notifyChannel:!0,hookPromptDismissed:!1,noTabRecovery:!1,devMode:!0,autoUpdate:!0,updateCheckIntervalHours:0,lastUpdateCheck:0,updateRegistry:"https://registry.npmjs.org",idleAfterMs:2500,staleAfterMs:3e5,autoDetect:!0,showElapsed:!0,subagentCount:!0,metaLine:!0,sortByStatus:!1,searchBox:!0,keyboardNav:!0,keyboardNavWrap:!1,keyboardCloseTab:!0,dragAutoScroll:!0,collapsedGroups:[],resumeList:!0,resumeListLimit:0,resumeListDays:0,resumeExpanded:[],resumeHidden:[],keepRenderingWhenHidden:!0,enterAsLabel:!0,claimCtrlV:!0,claimNewTabKey:!0,claimRepairKey:!0,closePaneKey:"Ctrl-Q",claimShiftEnter:!0,releaseHomeEnd:!0,imeOrderGuard:!0,pasteImageWithCtrlV:!0,imagePasteKey:"alt-v",claimRightClick:!0,rightClickMenuMs:250,terminalOpacity:75,sidebarOpacity:75,clipBackgroundToTerminal:!0,autoRepairScreen:!0,screenWatch:!0,autoRepairCooldownMs:1e4,autoRepairMinStreak:2,autoRepairMaxPerTab:3,repairHard:!1,repairSendRedrawKey:!1,rootProfile:!1,rootProfiles:[],rootProfileName:"Agent Root",rootProfileCwd:"",rootProfileCommand:"powershell.exe",rootProfileArgs:["-NoLogo","-ExecutionPolicy","Bypass"],rootProfileEnv:{TERM:"xterm-256color",COLORTERM:"truecolor",FORCE_COLOR:"3"},rootProfileClaimed:!1,alertFlash:!0,alertBadge:!0,alertToast:!1},hotkeys:{"agentdeck-toggle":[],"agentdeck-newline":["Ctrl-Enter","Shift-Enter"],"agentdeck-paste":["Ctrl-V"],"agentdeck-focus-list":["Ctrl-L"],"agentdeck-jump-1":["Ctrl-1"],"agentdeck-jump-2":["Ctrl-2"],"agentdeck-jump-3":["Ctrl-3"],"agentdeck-jump-4":["Ctrl-4"],"agentdeck-jump-5":["Ctrl-5"],"agentdeck-jump-6":["Ctrl-6"],"agentdeck-jump-7":["Ctrl-7"],"agentdeck-jump-8":["Ctrl-8"],"agentdeck-jump-9":["Ctrl-9"],"agentdeck-new-tab":["Ctrl-T","⌘-T"],"agentdeck-view":["Ctrl-O"],"agentdeck-view-mode":[],"agentdeck-repair":["Ctrl-R"]}}}}t.AgentDeckConfigProvider=o,t.defaultHotkeys=function(){var e;const t=new o,i={...t.defaults.hotkeys};i["split-right"]=["Ctrl-S"],i["split-bottom"]=["Ctrl-D"];const n=String(null!==(e=t.defaults.agentDeck.closePaneKey)&&void 0!==e?e:"").trim();return i["close-pane"]=n?[n]:[],i}},5140(e,t,i){t.installCursorVisibilityFix=void 0;const n=i(673);class o{constructor(){this.pending="",this.corrections=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;for(let e=4;e>0;e--)if(i.endsWith("[25".slice(0,e))){this.pending=i.slice(-e),i=i.slice(0,-e);break}return i.replace(/\x1b\[25([lh])/g,(e,t)=>(this.corrections++,`[?25${t}`))}}class a{constructor(){this.pending="",this.changes=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;const n=/\x1b(?:\[[0-9]*\x20?)?$/.exec(i);return n&&(this.pending=n[0],i=i.slice(0,-n[0].length)),i.replace(/\x1b\[([0-9]*)\x20q/g,(e,t)=>{const i=""===t?0:Number(t);if(!Number.isFinite(i)||i>6)return e;const n=i<=1?2:i%2==1?i+1:i;return n!==i&&this.changes++,`[${n} q`})}}t.installCursorVisibilityFix=function(e,t,i,r){if(!e||"function"!=typeof e.write||e.__adCursorVisibilityFix)return;const d={calls:0,active:0,forwarded:0,buffered:0,timeouts:0,deferredShows:0},l=e.write.bind(e),c=new o,u=new a,p=new n.SynchronizedOutputStream,h=new s;let g,f;const m=e=>e?(d.forwarded++,l(e)):Promise.resolve();let v=null;const b=()=>{f&&(clearTimeout(f),f=void 0),p.waiting||h.visible===v||(f=setTimeout(()=>{f=void 0,h.visible!==v&&(v=h.visible,Promise.resolve(m(v?"[?25h":"[?25l")).catch(()=>{}))},50))};let k,y="",w=0;const x=(e,t)=>{k&&(clearTimeout(k),k=void 0);const i=y+e,n=y?w:0;return y="",t&&i?n&&Date.now()-n>=48?i:(y=i,w=n||Date.now(),k=setTimeout(()=>{k=void 0;const e=y;y="",e&&Promise.resolve(m(e)).catch(()=>{})},24),""):i};let S;if(e.__adCursorVisibilityFix=!0,r){r("installed stable-cursor");for(const e of[5e3,15e3,3e4])setTimeout(()=>r(JSON.stringify({...d,corrections:c.corrections,steadied:u.changes,waiting:p.waiting,elapsedMs:e})),e)}e.write=n=>{const o=c.corrections,a=t(n);d.calls++,a&&d.active++,f&&(clearTimeout(f),f=void 0),(t=>{const i=e.xterm;i&&i.options&&(t?(void 0===S&&(S=!!i.options.cursorBlink),i.options.cursorBlink&&(i.options.cursorBlink=!1)):void 0!==S&&(i.options.cursorBlink=S,S=void 0))})(a),a||null===v||(v=null);const s=u.write(c.write(n,a),a),l=h.deferredShows,k=p.write(h.write(s,a),a);d.deferredShows+=h.deferredShows-l,r&&0===l&&h.deferredShows>0&&r(`stable-cursor engaged active=${a} deferredShows=${h.deferredShows}`),p.waiting&&d.buffered++,!p.waiting&&g&&(clearTimeout(g),g=void 0),p.waiting&&!g&&(g=setTimeout(()=>{g=void 0,d.timeouts++,Promise.resolve(m(x(p.flush(),!0))).catch(()=>{}),b()},200)),!o&&c.corrections&&i();const y=m(x(k,a));return a&&b(),y}};class s{constructor(){this.pending="",this.visible=!0,this.deferredShows=0}write(e,t){let i=this.pending+e;if(this.pending="",!t)return i;for(let e=5;e>0;e--)if(i.endsWith("[?25".slice(0,e))){this.pending=i.slice(-e),i=i.slice(0,-e);break}return i.replace(/\x1b\[\?25([lh])/g,(e,t)=>(this.visible="h"===t,this.deferredShows++,""))}}},4494(e,t,i){var n,o=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&o(t,e,i);return a(t,e),t},d=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},l=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckService=t.matchesSearchTokens=t.searchTokens=t.foldSearchText=void 0;const c=r(i(9896)),u=i(3496),p=i(6570),h=i(860),g=i(7650),f=i(3438),m=i(1836),v=i(568),b=i(5140),k=i(5633),y=i(160),w=i(6743),x=i(7650),S=i(3700),C=i(6021),j=i(7110),A=i(4867),E=i(7838),P=i(9888),z=i(3824),D=i(1385),T=i(3532),O=i(4300),_=i(9660),I=i(9851),R=i(3090),N=i(7025),M=i(2007),L=i(2839),$=i(8066),F=i(9306),H=i(1481),B=i(7617),q=i(7144),W=i(6879),K=i(4086),U=i(9137),G=i(1424),V=i(5916),J=i(2425),Y=i(3097),Z=i(7604),X=i(7797),Q="agentdeck-sidebar",ee="ad-bg-clip",te=320,ie=1500,ne=[150,400,900,1800,3e3],oe=[250,800,1800];let ae;function se(){var e,t,n,o,a;if(void 0!==ae)return ae;try{ae=null!==(t=null===(e=i(4157))||void 0===e?void 0:e.clipboard)&&void 0!==t?t:null}catch(e){ae=null,(0,X.diagCatch)("clipboard require(electron)",e)}if(!ae)try{const e=null!==(n=window.require)&&void 0!==n?n:globalThis.require;ae=null!==(a=null===(o=null==e?void 0:e("electron"))||void 0===o?void 0:o.clipboard)&&void 0!==a?a:null}catch(e){ae=null,(0,X.diagCatch)("clipboard window.require",e)}return ae||(0,X.diagOnce)("clipboard-missing","clipboard 없음 — 이미지 붙여넣기 불가"),ae}function re(e){const t="number"==typeof e&&isFinite(e)?e:100;return Math.min(100,Math.max(0,Math.round(t)))}function de(e){if("string"!=typeof e||!e)return"";let t=e;try{t=t.normalize("NFC")}catch{}return t.toLowerCase().replace(/\\/g,"/")}function le(e){return de(e).split(/\s+/).filter(e=>e.length>0)}function ce(e,t){if(!t.length)return!0;const i=[];for(const t of e){const e=de(t);e&&i.push(e)}return t.every(e=>i.some(t=>t.includes(e)))}t.foldSearchText=de,t.searchTokens=le,t.matchesSearchTokens=ce;let ue=n=class{setupMailboxWake(){this.notify.setMailboxWake(e=>this.mailboxWake.enqueue(e));const e=e=>{var t,i;for(const n of this.app.tabs){const o=n,a="function"==typeof o.getAllTabs?o.getAllTabs():[o];for(const n of a){const o=null===(i=null===(t=n.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea;if(o&&e.target===o)return this.mailboxLastInput.set(n,Date.now()),"compositionstart"===e.type&&this.mailboxComposing.add(n),"compositionend"===e.type&&this.mailboxComposing.delete(n),void("compositionend"===e.type?setTimeout(()=>this.mailboxWake.flushAll(),0):this.mailboxWake.flushAll())}}};for(const t of["keydown","paste","input","compositionstart","compositionupdate","compositionend"])document.addEventListener(t,e,!0)}identityOf(e){var t,i,n,o,a,s;const r=this.config.store.agentDeck,d=null!==(t=r.sessionIdentities)&&void 0!==t?t:r.sessionIdentities=[],l="function"==typeof e.getAllTabs?e.getAllTabs():[e];if(!l.some(e=>{var t;return null===(t=e.profile)||void 0===t?void 0:t.options}))return{id:"",letter:"",alias:""};let c=this.identityIds.get(e);if(!c){if(c=l.map(e=>{var t,i,n;return null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n.AGENTDECK_IDENTITY}).find(Boolean),!c||this.app.tabs.some(t=>t!==e&&this.identityIds.get(t)===c))do{c=(0,P.newTabId)()}while(d.some(e=>e.id===c));this.identityIds.set(e,c)}for(const e of l)(null===(i=e.profile)||void 0===i?void 0:i.options)&&(null===(n=e.profile.options.env)||void 0===n?void 0:n.AGENTDECK_IDENTITY)!==c&&(e.profile={...e.profile,options:{...e.profile.options,env:{...e.profile.options.env,AGENTDECK_IDENTITY:c}}});const u=d.length,p=!!(null===(o=d.find(e=>e.id===c))||void 0===o?void 0:o.alias),h=`${(0,D.stripTitleMarker)(e.customTitle||e.title||"")} ${this.status.get(e).label||""}`.trim(),g=this.notify.cwdOf(e)||(null===(a=this.cwdCache.get(e))||void 0===a?void 0:a.dir)||l.map(e=>{var t,i;return null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.cwd}).find(Boolean)||"",f=null!==(s=r.aliasProjects)&&void 0!==s?s:r.aliasProjects=[],m=JSON.stringify(f),v=(0,E.adaptiveAliasBase)(h,g,f,(0,K.projectRootOf)(g)||"");if(!v&&!p)return{id:c,letter:"",alias:""};const b=new E.SessionIdentities(d).ensure(c,v);return u===d.length&&p&&JSON.stringify(f)===m||this.config.save(),b}syncSessionSlots(){var e,t,i;this.notify.setNavigationRefresh(()=>this.syncSessionSlots());const n=this.app.tabs.filter(e=>!(e instanceof S.SettingsTabComponent)),o=e=>"function"==typeof e.getAllTabs?e.getAllTabs():[e];this.sessionSlots.reconcile(n,e=>{const t=o(e).map(e=>{var t,i,n;return null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n.AGENTDECK_SLOT}).find(Boolean);return t?Number(t):null});for(const i of n){const n=this.sessionSlots.numberOf(i);if(null!==n)for(const a of o(i))(null===(e=a.profile)||void 0===e?void 0:e.options)&&(null===(t=a.profile.options.env)||void 0===t?void 0:t.AGENTDECK_SLOT)!==String(n)&&(a.profile={...a.profile,options:{...a.profile.options,env:{...a.profile.options.env,AGENTDECK_SLOT:String(n)}}})}this.notify.publishNavigationContext(n.map(e=>{const t=this.identityOf(e),i=this.notify.sessionIdsOf(e);return`Tab alias=${JSON.stringify(t.alias)}: `+(i.length?`session IDs ${i.join(", ")}`:"tab open; session not registered (not addressable yet)")+`; title=${JSON.stringify(String(e.customTitle||e.title||"").slice(0,160))}`+`; ${this.notify.mailboxConnectionState(e)}`+(i.length>1?" (split panes: ask which session; never choose by last activity)":"")}).filter(Boolean).join("\n"));const a=null===(i=this.sidebar)||void 0===i?void 0:i.querySelector(".ad-new");a&&(a.disabled=this.sessionSlots.full,this.sessionSlots.full&&(a.title="ko"===this.sidebarLang?"세션 9개가 열려 있습니다. 하나를 닫아 주세요.":"All 9 session slots are occupied. Close a session first."))}constructor(e,t,i,n,o,a,s,r,d,l,c=null){this.app=e,this.config=t,this.status=i,this.hotkeys=n,this.profiles=o,this.hostWindow=a,this.platform=s,this.notify=r,this.ledger=d,this.zone=l,this.locale=c,this.mailboxLastInput=new WeakMap,this.mailboxComposing=new WeakSet,this.mailboxWakeDisabled=new WeakSet,this.mailboxWake=new z.MailboxWake(e=>{var t,i,n;const o=this.notify.mailboxTarget(e);if(!o)return null;const{tab:a,pane:s}=o,r=null!==(t=this.config.store.agentDeck.mailboxWake)&&void 0!==t?t:{},d=Number(null!==(i=r.typingGuardMs)&&void 0!==i?i:3e3),l=this.status.get(a).status;return{identity:s,enabled:!1!==r.enabled&&!this.mailboxWakeDisabled.has(a),idle:"idle"===l||"done"===l,lastInput:null!==(n=this.mailboxLastInput.get(s))&&void 0!==n?n:0,composing:this.mailboxComposing.has(s)||"composing"===(0,H.readCompositionState)(this.compositionHelper(s)),typingGuardMs:Number.isFinite(d)?Math.max(0,Math.min(d,2147483647)):3e3,text:"string"==typeof r.text?r.text:z.MAILBOX_WAKE_TEXT,send:e=>this.sendToPane(s,"mailbox-wake",()=>e(e=>{var t;if(!(null===(t=s.session)||void 0===t?void 0:t.open))throw new Error("Closed mailbox pane");s.sendInput(e),this.status.setManual(a,"running")}))}},e=>this.diag(e)),this.sessionSlots=new A.SessionSlots,this.identityIds=new WeakMap,this.pendingSessionOpens=0,this.sidebar=null,this.listEl=null,this.nowEl=null,this.accountPopup=null,this.accountPopupTab=null,this.accountSwitchBusy=!1,this.resumeEl=null,this.historySearchPanel=null,this.windowEl=null,this.mainEl=null,this.observer=null,this.editing=null,this.drag=null,this.dragClickGuard=!1,this.lastDragEnd=null,this.dropReject=null,this.searchEl=null,this.searchQuery="",this.statusFilter=null,this.searchComposing=!1,this.navFocus=null,this.renderQueued=!1,this.shiftDownAt=0,this.renderTimer=null,this.listPointerActive=!1,this.lastTermW=-1,this.lastSidebarW=-1,this.lastDock=null,this.profileMemo=new WeakMap,this.pinnedAgents=new WeakMap,this.pinnedCount=0,this.lastBoxKey="",this.dock=null,this.refitQueued=!1,this.view=null,this.lastViewW=-1,this.lastViewSide=null,this.cwdCache=new WeakMap,this.resumeTabs=new Map,this.resumeOpening=new Set,this.resumeStarting=new Map,this.repairInProgress=!1,this.ptyResizeGeneration=new WeakMap,this.outputHits=0,this.tabAgents=new WeakMap,this.paneAgents=new WeakMap,this.agentProbedAt=new WeakMap,this.watched=new WeakSet,this.watchedPanes=new WeakSet,this.screenCheckTimers=new WeakMap,this.emptyTabRetries=new WeakMap,this.screenObs=new WeakMap,this.autoRepairAt=new WeakMap,this.autoRepairCount=new WeakMap,this.autoRepairHealthySince=new WeakMap,this.rightDownAt=0,this.lastRightHandledAt=0,this.nativePasteAt=0,this.lastPasteAt=0,this.pasteProbeUntil=0}get sidebarLang(){var e;return(0,f.pickLang)((null===(e=this.locale)||void 0===e?void 0:e.getLocale())||this.config.store.language||navigator.language)}ui(e,t){return(0,m.sidebarText)(e,this.sidebarLang,t)}uiMarkup(e){return(0,m.sidebarMarkup)(e,this.sidebarLang)}refreshSidebarLanguage(){const e=document.getElementById(Q);if(!e)return;const t=e.querySelector(".ad-search-input");t&&(t.placeholder=this.ui("세션 검색 (제목 · 작업이름 · 폴더)"));for(const[t,i,n]of[[".ad-search-clear","검색·필터 지우기 (Esc)",""],[".ad-now-account","계정 선택",""],[".ad-new","새 탭","+ 새 탭"],[".ad-settings","설정","설정"],[".ad-repair","화면 복구 (모든 탭 다시 그리기)",""],[".ad-viewtoggle","미리보기 패널 (md · 이미지 · 표)",""]]){const o=e.querySelector(t);o&&(o.title=this.ui(i),n&&(o.textContent=this.ui(n)))}}init(){const e=()=>{(0,M.maintainAccountSessions)(this.app.tabs.map(e=>this.notify.metaOf(e)).filter(Boolean)).catch(()=>{})};e();const t=setInterval(e,6e4);window.addEventListener("beforeunload",()=>clearInterval(t),{once:!0}),this.app.ready$.subscribe(()=>this.zone.runOutsideAngular(()=>{var e,t,i,n,o;(0,X.startDiagSession)({tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(n=(i=this.platform).getOSRelease)||void 0===n?void 0:n.call(i),config:this.diagConfig()}),(0,X.installErrorCapture)(),this.ledger.onChange=()=>this.scheduleRender();try{this.setup()}catch(e){throw this.diag(`setup ERROR ${null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e}`),e}}))}diagOnce(e,t){(0,X.diagOnce)(e,t)}diag(e){(0,X.diag)(e)}diagConfig(){return(0,X.configStamp)(this.config.store)}setup(){var e;if(this.windowEl=document.querySelector(".window"),this.mainEl=document.querySelector(".content.main"),!this.windowEl)return void console.warn("[agentdeck] .window 를 찾지 못해 레이아웃을 적용하지 않는다");this.diag(`setup start tabs=${this.app.tabs.length}`),this.setupMailboxWake(),this.migrateFollowConfig(),this.buildSidebar(),this.buildView(),this.applyEnabled(),this.applyOpacity(),this.disableBackgroundThrottling(),this.ensurePasteHotkey(),this.ensureSplitHotkeys(),this.ensureNewTabHotkey(),this.ensureRepairHotkey(),this.ensureClosePaneHotkey(),this.ensureNewlineHotkey(),this.releaseHomeEndHotkey(),this.guardHomeEndComposition(),this.claimCtrlVKey(),this.claimCtrlWKey(),this.claimShiftEnterKey(),this.claimEnterLabel(),this.claimRightClick(),this.claimFileDrop(),document.addEventListener("paste",()=>{this.nativePasteAt=Date.now(),this.diag("native-paste")},!0),this.app.tabsChanged$.subscribe(()=>{for(const e of this.app.tabs)this.watchTab(e);this.scheduleRender()}),this.app.activeTabChange$.subscribe(()=>{var e,t;null===(e=this.view)||void 0===e||e.setActiveTab(null!==(t=this.app.activeTab)&&void 0!==t?t:null),this.scheduleRender(),this.scheduleRefit()}),this.app.tabOpened$.subscribe(e=>{this.watchTab(e),this.scheduleRefit(),this.scheduleRender()}),this.app.tabClosed$.subscribe(()=>{this.status.sweep(this.app.tabs),this.mailboxWake.flushAll(),this.scheduleRender()});for(const e of this.app.tabs)this.watchTab(e);this.status.changed$.subscribe(()=>{this.mailboxWake.flushAll(),this.scheduleRender()}),this.status.idled$.subscribe(()=>this.mailboxWake.flushAll()),this.notify.onMetaChange=()=>this.scheduleRender(),this.config.changed$.subscribe(()=>{var e;this.mailboxWake.flushAll(),this.applyEnabled(),this.applyOpacity(),this.applySearchBox(),null===(e=this.view)||void 0===e||e.setOpen(!!this.config.store.agentDeck.viewerOpen,!1),this.relayout(),this.scheduleRender()}),setInterval(()=>this.sweepScreens(),2e3),this.observer=new ResizeObserver(()=>this.relayout()),this.observer.observe(this.windowEl),window.addEventListener("resize",()=>this.relayout()),this.hotkeys.hotkey$.subscribe(e=>{var t,i;"agentdeck-toggle"===e&&(this.config.store.agentDeck.enabled=!this.config.store.agentDeck.enabled,this.config.save()),"agentdeck-newline"===e&&this.sendNewline(),"agentdeck-paste"===e&&this.doPaste("hotkey"),"agentdeck-repair"===e&&!1!==this.config.store.agentDeck.claimRepairKey&&this.repair("all"),"agentdeck-view"===e&&(null===(t=this.view)||void 0===t||t.toggle()),"agentdeck-new-tab"===e&&!1!==this.config.store.agentDeck.claimNewTabKey&&this.zone.run(()=>{this.openNewTab()}),"agentdeck-focus-list"===e&&this.toggleKeyboardNav(),"agentdeck-view-mode"===e&&(null===(i=this.view)||void 0===i||i.toggleMode());const n=/^agentdeck-jump-(\d+)$/.exec(e);n&&this.jumpToRow(Number(n[1]))}),setInterval(()=>this.tick(),1e3),(0,p.monitorEventLoop)(),this.relayout(),this.render(),this.diag(`setup done tabs=${this.app.tabs.length} enabled=${this.enabled} mainEl=${!!this.mainEl}`);const t=window;t.__agentdeck=Object.assign(null!==(e=t.__agentdeck)&&void 0!==e?e:{},{app:this.app,config:this.config,status:this.status,relayout:()=>this.relayout(),render:()=>this.render(),setFilter:(e,t)=>(this.searchQuery="string"==typeof e?e:"",this.statusFilter=null!=t?t:null,this.searchEl&&(this.searchEl.value=this.searchQuery),this.syncSearchUi(),this.render(),{query:this.searchQuery,status:this.statusFilter}),repair:(e="all")=>this.repair(e),reorder:(e,t,i="before")=>{const n=[...this.app.tabs],o=n[e],a=n[t];if(!o||!a)return{ok:!1,reason:"없는 탭 인덱스",order:n.map((e,t)=>t)};if("before"!==i&&"after"!==i)return{ok:!1,reason:`place 가 before/after 가 아니다: ${String(i)}`,order:n.map((e,t)=>t)};const s=this.applyReorder(o,a,i);return this.render(),{ok:s,order:this.app.tabs.map(e=>n.indexOf(e))}},lastDrag:()=>({end:this.lastDragEnd,flowsSideways:this.listFlowsSideways(),dock:this.dockSide,clickGuard:this.dragClickGuard,scrollAxis:this.listScrollAxis(),autoScroll:this.config.store.agentDeck.dragAutoScroll}),reorderDrag:()=>{const e=this.drag;if(!e)return null;const t=this.listScrollAxis();return{moved:e.moved,from:this.app.tabs.indexOf(e.tab),target:e.target?{index:this.app.tabs.indexOf(e.target.tab),place:e.target.place}:null,line:!!e.line,scroll:{axis:t,active:!!e.scroll,speed:t?Math.round(this.dragScrollSpeed(t)):0,px:Math.round(e.scrolled.px),at:{x:e.at.x,y:e.at.y}}}},focusNav:e=>{var t,i;"list"===e&&this.focusList("keep"),"search"===e&&this.focusSearch(),"off"===e&&this.releaseKeyboard();const n=this.app.tabs,{rows:o,index:a}=this.navPlan(),s=e=>"head"===e.kind?{kind:"head",key:e.key,tabIndex:-1}:{kind:"tab",key:null,tabIndex:n.indexOf(e.tab)},r=document.activeElement,d=null===(t=this.listEl)||void 0===t?void 0:t.querySelector(".ad-nav-focus");return{mode:this.navMode,index:a,count:o.length,focused:this.navFocus?s(this.navFocus):null,rows:o.map(s),activeTabIndex:this.app.activeTab?n.indexOf(this.app.activeTab):-1,ring:d?{tab:d.classList.contains("ad-tab"),adIndex:null!==(i=d.dataset.adIndex)&&void 0!==i?i:null}:null,owner:r===this.listEl?"list":r===this.searchEl?"search":(null==r?void 0:r.className)||"other",searchVisible:this.navSearchVisible(),wrap:!!this.config.store.agentDeck.keyboardNavWrap,enabled:!1!==this.config.store.agentDeck.keyboardNav}},jump:e=>{var t,i;this.jumpToRow(e);const n=this.app.tabs,{rows:o}=this.navPlan();return{slot:e,slots:Array.from({length:U.JUMP_SLOTS},(e,t)=>{const i=(0,U.pickJumpTarget)(o,t+1);return{number:t+1,tabIndex:i?n.indexOf(i):-1}}),activeTabIndex:this.app.activeTab?n.indexOf(this.app.activeTab):-1,focusedTabIndex:this.navFocus&&"tab"===this.navFocus.kind?n.indexOf(this.navFocus.tab):-1,navMode:this.navMode,tabRows:o.filter(e=>"tab"===e.kind).map(e=>n.indexOf(e.tab)),bound:null!==(i=(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{})[`agentdeck-jump-${e}`])&&void 0!==i?i:null}},view:()=>this.view,openFile:e=>{var t;return null===(t=this.view)||void 0===t?void 0:t.openFile(e)},rescanPasteHotkey:()=>this.ensurePasteHotkey(),groups:()=>{const e=this.app.tabs,t=this.renderPlan(),i=t=>t.tabs.map(t=>e.indexOf(t));return{cwdCache:e.map((e,t)=>{var i,n,o,a,s,r,d;return{index:t,title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),dir:null!==(o=null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.dir)&&void 0!==o?o:null,at:null!==(s=null===(a=this.cwdCache.get(e))||void 0===a?void 0:a.at)&&void 0!==s?s:null,projectRoot:(0,K.projectRootOf)(null!==(d=null===(r=this.cwdCache.get(e))||void 0===r?void 0:r.dir)&&void 0!==d?d:null)}}),projectRoots:(0,K.projectRootCacheSnapshot)(),list:t.groups.map(e=>({key:e.key,label:e.label,collapsed:this.isGroupCollapsed(e.key),collapsedEffective:t.collapseOf(e).collapsed,collapseReason:t.collapseOf(e).reason,tabIndexes:i(e)})),withHeads:t.withHeads,plan:t.plan.map(e=>({key:e.key,label:e.label,collapsed:t.withHeads&&t.collapseOf(e).collapsed,collapseReason:t.collapseOf(e).reason,tabIndexes:i(e)})),tabsUsedByRender:t.visible.map(t=>e.indexOf(t)),tabsForCounts:t.tabs.map(t=>e.indexOf(t)),filter:{query:this.searchQuery,status:this.statusFilter,active:t.filtering},sortByStatus:!!this.config.store.agentDeck.sortByStatus,fold:e=>(0,W.foldGroupKey)(e)}},sessions:()=>{const e=this.config.store.agentDeck,t=this.liveSessionIds(),i=this.ledger.records();return{ledger:this.ledger.snapshot(),records:i.map(e=>({...e})),live:[...t.keys()],enabled:!1!==e.resumeList,expanded:this.isResumeExpanded(null),rows:(0,J.resumeRowsFor)(i,{groupKeys:null,keyOf:e=>(0,W.groupKeyOf)(e,K.projectRootOf),fold:W.foldGroupKey,live:t,days:Number(e.resumeListDays)||0,limit:Number(e.resumeListLimit)||0,hidden:new Set(Array.isArray(e.resumeHidden)?e.resumeHidden:[]),now:Date.now()}).map(e=>({sessionId:e.sessionId,label:e.label,cwd:e.cwd,lastStatus:e.lastStatus,openTabId:e.openTabId}))}},rescanSessions:()=>this.ledger.refresh(!0),debug:()=>({outputHits:this.outputHits,decorator:this.status.debug}),profiles:()=>{const e=e=>{var t,i;return{id:e.id,label:e.label,icon:e.icon,processHints:e.processHints,titleHints:e.titleHints,waitingPatterns:e.waitingPatterns.map(e=>({source:e.source,flags:e.flags})),busyPatterns:e.busyPatterns.map(e=>({source:e.source,flags:e.flags})),busyTitleMarks:e.busyTitleMarks,imagePasteKey:e.imagePasteKey,promptHeads:e.promptHeads,promptShape:null!==(t=e.promptShape)&&void 0!==t?t:null,screenShape:null!==(i=e.screenShape)&&void 0!==i?i:null,patternsProven:e.patternsProven}};return{list:T.AGENT_PROFILES.map(e),union:e((0,T.unionProfile)()),effective:T.AGENT_PROFILES.map(t=>e((0,T.detectProfileFor)(t.id))),identify:(e,t)=>(0,T.identifyAgent)(e,t),fallback:T.AGENT_PROFILES.map(e=>{const t=(0,T.detectProfileFor)(e.id),i=(0,T.unionProfile)();return{id:e.id,patternsProven:e.patternsProven,usesUnionPatterns:t.waitingPatterns===i.waitingPatterns&&t.busyPatterns===i.busyPatterns&&t.busyTitleMarks===i.busyTitleMarks,usesOwnPatterns:t.waitingPatterns===e.waitingPatterns&&t.busyPatterns===e.busyPatterns&&t.busyTitleMarks===e.busyTitleMarks,shapesDropped:!t.promptShape&&!t.screenShape,imagePasteKeyKept:t.imagePasteKey===e.imagePasteKey,catchesClaudeBusy:t.busyPatterns.some(e=>e.test("esc to interrupt"))}})}},judge:e=>{var t;const i=null!=e?e:this.focusedPane(),n=i?this.readScreen(i):null;return n?{...(0,F.judgeScreen)(n.lines,n.cols,null===(t=this.profileForPane(i))||void 0===t?void 0:t.screenShape),cols:n.cols}:null},pinAgent:(e,t)=>{const i=null!=e?e:this.focusedPane();if(!i)return{pinned:!1,why:"pane 을 못 찾았다"};const n=this.pinnedAgents.has(i);return t?(this.pinnedAgents.set(i,String(t)),n||this.pinnedCount++):(this.pinnedAgents.delete(i),n&&(this.pinnedCount=Math.max(0,this.pinnedCount-1))),{pinned:!!t,size:this.pinnedCount}},agentOf:e=>{var t,i,n,o,a,s,r,d;const l=null!=e?e:this.app.activeTab,c=l?this.firstPane(l):void 0,u=c?this.paneAgents.get(c):void 0;return l?{id:null!==(t=this.tabAgents.get(l))&&void 0!==t?t:null,hookId:null!==(o=null===(n=null===(i=this.notify)||void 0===i?void 0:i.agentOf)||void 0===n?void 0:n.call(i,l))&&void 0!==o?o:null,effectiveId:c&&null!==(s=null===(a=this.profileForPane(c))||void 0===a?void 0:a.id)&&void 0!==s?s:"unknown",streamId:(null==u?void 0:u.session)===(null==c?void 0:c.session)&&null!==(r=null==u?void 0:u.tracker.id)&&void 0!==r?r:null,probedAt:null!==(d=this.agentProbedAt.get(l))&&void 0!==d?d:0}:null},probeAgent:e=>{const t=null!=e?e:this.app.activeTab;t&&(this.agentProbedAt.delete(t),this.probeAgent(t,"manual"))},kickLog:(0,X.diagMemory)(),diagPaths:()=>({diag:X.DIAG_PATH,prev:X.DIAG_PREV_PATH,screen:X.SCREEN_PATH}),collectDiag:(e=!1)=>{var t,i,n,o;return(0,X.collectDiagBundle)({includeScreen:e,stamp:{tabby:null===(i=(t=this.platform).getAppVersion)||void 0===i?void 0:i.call(t),osRelease:null===(o=(n=this.platform).getOSRelease)||void 0===o?void 0:o.call(n),config:(0,X.configStamp)(this.config.store)}})}})}repair(e="all"){if(this.repairInProgress)return void this.diag("repair already in progress");this.repairInProgress=!0;const t=new p.PerformanceTrace("repair"),i="active"===e&&this.app.activeTab?[this.app.activeTab]:[...this.app.tabs];this.diag(`repair scope=${e} tabs=${i.length}`);try{t.step("layout",()=>this.relayout())}catch(e){return this.repairInProgress=!1,void(0,X.diagCatch)("repair layout",e)}requestAnimationFrame(()=>requestAnimationFrame(()=>{try{t.mark("frames-ready",`scope=${e} tabs=${i.length}`);for(const e of i){if(!this.app.tabs.includes(e))continue;const i=e,n="function"==typeof i.getAllTabs?i.getAllTabs():[e];for(const e of n)try{this.repairPane(e,t)}catch(e){(0,X.diagCatch)("repair pane",e)}}}finally{setTimeout(()=>{this.repairInProgress=!1},ie)}}))}repairPane(e,t){var i,n,o,a,s,r,d;const l=this.config.store.agentDeck,c=e,u=c.frontend,p=null==u?void 0:u.xterm,h=null===(i=null==p?void 0:p.element)||void 0===i?void 0:i.parentElement;if(!(null==h?void 0:h.clientWidth)||!(null==h?void 0:h.clientHeight))return;const g=this.readScreen(e);null==t||t.mark("screen-read");const f=g?(0,F.judgeScreen)(g.lines,g.cols,null===(n=this.profileForPane(e))||void 0===n?void 0:n.screenShape):null;this.snapshot(e,`manual-before ${f?f.broken?f.reasons.join(" / "):"판정=정상":"읽을 수 없음"}`);try{null===(a=null===(o=null==u?void 0:u.fitAddon)||void 0===o?void 0:o.fit)||void 0===a||a.call(o)}catch{}if(this.syncPtySize(e,u),null==t||t.mark("fit-and-sync"),g&&this.clearInputArea(e,g),!0===l.repairHard)try{null===(s=null==p?void 0:p.reset)||void 0===s||s.call(p)}catch{}try{null===(r=null==p?void 0:p.refresh)||void 0===r||r.call(p,0,(null!==(d=p.rows)&&void 0!==d?d:1)-1)}catch{}if(null==t||t.mark("clear-and-refresh"),this.nudgePtyRedraw(e,t),!0===l.repairSendRedrawKey){const t=c.session;setTimeout(()=>{(null==t?void 0:t.open)&&c.session===t&&this.sendRedrawKey(e)},180)}setTimeout(()=>{var i;const n=this.readScreen(e),o=n?(0,F.judgeScreen)(n.lines,n.cols,null===(i=this.profileForPane(e))||void 0===i?void 0:i.screenShape):null;this.snapshot(e,"manual-after "+(o?o.broken?"아직 깨짐: "+o.reasons.join(" / "):"복구됨":"읽을 수 없음")),null==t||t.mark("after-snapshot")},ie)}sendRedrawKey(e){var t;const i=e;"function"==typeof i.sendInput&&(null===(t=i.session)||void 0===t?void 0:t.open)&&(this.diag("repair redraw-key ctrl-l"),this.sendToPane(i,"redraw-key",()=>i.sendInput("\f")))}clearInputArea(e,t){var i,n,o;if(!(0,v.canRepairComposer)(null===(i=this.profileForPane(e))||void 0===i?void 0:i.id))return!1;const a=null===(n=e.frontend)||void 0===n?void 0:n.xterm;if(!a||"function"!=typeof a.write)return!1;const s=t.lines,r=null===(o=this.profileForPane(e))||void 0===o?void 0:o.screenShape,d=Math.max(0,s.length-F.INPUT_TAIL),l=e=>(0,F.isRuleRow)(s[e].text,r)||(0,F.isGhostRuleRow)(s[e].text,t.cols,r);let c=-1;for(let e=s.length-1;e>=d;e--)if(l(e)){c=e;break}if(c<0)return!1;let u=c;for(let e=c-1;e>=Math.max(d,c-12);e--)l(e)&&(u=e);const p=u+1;this.diag(`clear input area row=${p}/${s.length}`);try{a.write(`7[${p};1H8`)}catch{return!1}return!0}scheduleScreenCheck(e){if(!this.screenObservingEnabled())return;const t=this.screenCheckTimers.get(e);t&&clearTimeout(t),this.screenCheckTimers.set(e,setTimeout(()=>{this.screenCheckTimers.delete(e),this.checkScreen(e)},700))}screenObservingEnabled(){const e=this.config.store.agentDeck;return!1!==e.screenWatch||!!e.autoRepairScreen}checkScreen(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;if(!(0,v.canRepairComposer)(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id))return;const m=this.config.store.agentDeck,b=this.readScreen(e);if(!b)return;const k=(0,F.judgeScreen)(b.lines,b.cols,null===(i=this.profileForPane(e))||void 0===i?void 0:i.screenShape),y=this.screenObs.get(e),w=k.reasons.join(" / "),x=k.broken?((null==y?void 0:y.broken)&&null!==(n=y.streak)&&void 0!==n?n:0)+1:0,S=!y||y.broken!==k.broken||y.reason!==w;if(this.screenObs.set(e,{broken:k.broken,reason:w,streak:x}),S&&(k.broken?this.snapshot(e,`detect 깨짐 ${w}`):(null==y?void 0:y.broken)&&this.snapshot(e,"detect 스스로 복구됨")),!k.broken)return void this.refillAutoRepairBudget(e);if(this.autoRepairHealthySince.delete(e),!m.autoRepairScreen)return;if(x<(null!==(o=m.autoRepairMinStreak)&&void 0!==o?o:2))return;const C=e,j=Date.now(),A=null!==(a=this.autoRepairAt.get(e))&&void 0!==a?a:0,E=null!==(s=this.autoRepairCount.get(e))&&void 0!==s?s:0,P=null!==(r=m.autoRepairMaxPerTab)&&void 0!==r?r:5;if(j-A<(null!==(d=m.autoRepairCooldownMs)&&void 0!==d?d:4e3))return;if(P>0&&E>=P)return void this.diagOnce("auto-repair-cap",`screen auto-repair 한도 도달 (${E}/${P}) — 더 고치지 않는다. 사이드바 ↻ 로 직접 복구할 것. 마지막 판정: ${k.reasons.join(" / ")}`);const z=null===(l=C.frontend)||void 0===l?void 0:l.xterm,D=null==z?void 0:z.cols,T=null==z?void 0:z.rows;(0,F.sizeInSync)(D,T,null===(c=C.size)||void 0===c?void 0:c.columns,null===(u=C.size)||void 0===u?void 0:u.rows)?(this.diag(`screen BROKEN cols=${b.cols} sent=${null===(g=C.size)||void 0===g?void 0:g.columns}x${null===(f=C.size)||void 0===f?void 0:f.rows} ${k.reasons.join(" / ")}`),this.snapshot(e,`auto-before ${k.reasons.join(" / ")}`),this.autoRepairAt.set(e,j),this.autoRepairCount.set(e,E+1),this.diag(`screen auto-repair #${E+1}`),this.clearInputArea(e,b),!0===m.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const i=this.readScreen(e),n=i?(0,F.judgeScreen)(i.lines,i.cols,null===(t=this.profileForPane(e))||void 0===t?void 0:t.screenShape):null;this.snapshot(e,"auto-after "+(n?n.broken?"아직 깨짐: "+n.reasons.join(" / "):"복구됨":"읽을 수 없음"))},ie)):this.diagOnce("auto-repair-resizing",`screen 자동복구 보류 — 크기가 어긋나 있다 (xterm ${D}x${T} vs pty ${null===(p=C.size)||void 0===p?void 0:p.columns}x${null===(h=C.size)||void 0===h?void 0:h.rows}). 리사이즈 중간 프레임은 순정이 곧 맞춘다 — 이 줄은 처음 한 번만 남긴다`)}refillAutoRepairBudget(e){if(!this.autoRepairCount.get(e))return void this.autoRepairHealthySince.delete(e);const t=Date.now(),i=this.autoRepairHealthySince.get(e);i?t-i<6e4||(this.autoRepairCount.delete(e),this.autoRepairHealthySince.delete(e),(0,X.resetDiagOnce)("auto-repair-cap"),this.diag(`screen auto-repair 예산 회복 (화면이 ${Math.round((t-i)/1e3)}초 동안 온전했다)`)):this.autoRepairHealthySince.set(e,t)}sweepScreens(){if(!this.enabled||!this.screenObservingEnabled())return;const e=this.app.activeTab;if(!e)return;const t=e,i="function"==typeof t.getAllTabs?t.getAllTabs():[e];for(const e of i)this.checkScreen(e)}readScreen(e){var t,i,n,o;const a=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(i=null==a?void 0:a.buffer)||void 0===i?void 0:i.active;if(!(s&&"function"==typeof s.getLine&&a.cols>1))return null;const r=null===(n=a.element)||void 0===n?void 0:n.parentElement;if(!(null==r?void 0:r.clientWidth))return null;const d=[];try{for(let e=s.baseY;e<=s.baseY+a.rows-1;e++){const t=s.getLine(e);d.push({text:null!==(o=null==t?void 0:t.translateToString(!1))&&void 0!==o?o:"",wrapped:!!(null==t?void 0:t.isWrapped)})}}catch{return null}return{lines:d,cols:a.cols}}snapshot(e,t){var i,n,o,a;const s=this.readScreen(e);if(!s)return;const r=e,d=null===(i=r.frontend)||void 0===i?void 0:i.xterm,l=`\n===== ${(new Date).toISOString()} ${t} cols=${s.cols} rows=${null==d?void 0:d.rows} sent=${null===(n=r.size)||void 0===n?void 0:n.columns}x${null===(o=r.size)||void 0===o?void 0:o.rows} title=${JSON.stringify(null!==(a=e.title)&&void 0!==a?a:"")} =====`,c=s.lines.map((e,t)=>({i:t,t:e.text.replace(/\s+$/,""),w:e.wrapped})).filter(e=>e.t).map(e=>`${String(e.i).padStart(3)} w=${e.w?1:0} len=${e.t.length} ${JSON.stringify(e.t)}`);(0,X.appendScreenLog)([l,...c,""].join("\n"))}watchTab(e){var t;const i=e;this.watched.has(e)||(this.watched.add(e),i.titleChange$&&i.titleChange$.subscribe(t=>{this.probeAgent(e,"title-change"),(0,D.applyTitle)(this.status,e,t,this.config.store.agentDeck.autoDetect,this.profileForTab(e))}),i.title&&(0,D.applyTitle)(this.status,e,i.title,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),i.tabAdded$&&i.tabAdded$.subscribe(t=>this.watchPane(e,t)));const n="function"==typeof i.getAllTabs?i.getAllTabs():[e];this.diag(`watchTab panes=${n.length}`);for(const t of n)this.watchPane(e,t);if(!n.length){const i=(null!==(t=this.emptyTabRetries.get(e))&&void 0!==t?t:0)+1;this.emptyTabRetries.set(e,i),i<=20&&setTimeout(()=>{this.app.tabs.includes(e)&&this.watchTab(e)},400)}}watchPane(e,t){var i;if(this.watchedPanes.has(t))return;this.watchedPanes.add(t),this.diag(`watchPane ${null===(i=t.constructor)||void 0===i?void 0:i.name}`);const n=t,o=i=>{var o,a,s,r,d,l;this.installCodexCursorFix(t),i&&i.output$&&(this.diag(`session bind xterm=${null===(a=null===(o=n.frontend)||void 0===o?void 0:o.xterm)||void 0===a?void 0:a.cols}x${null===(r=null===(s=n.frontend)||void 0===s?void 0:s.xterm)||void 0===r?void 0:r.rows} paneSize=${null===(d=n.size)||void 0===d?void 0:d.columns}x${null===(l=n.size)||void 0===l?void 0:l.rows}`),this.probeAgent(e,"session-bind"),i.output$.subscribe(i=>{var o;this.outputHits++;const a=this.paneAgents.get(t);("unknown"===(null!==(o=this.tabAgents.get(e))&&void 0!==o?o:"unknown")||(null==a?void 0:a.session)===n.session&&"unknown"===(null==a?void 0:a.tracker.id))&&this.probeAgent(e,"output"),(0,D.applyOutput)(this.status,e,t,i,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),this.view&&this.config.store.agentDeck.viewerScrape&&this.view.noteOutput(e,i),this.touchCwd(e,t),this.scheduleScreenCheck(t)}))};o(n.session),n.sessionChanged$&&n.sessionChanged$.subscribe(e=>o(e)),n.frontendReady$&&n.frontendReady$.subscribe(()=>{this.installCodexCursorFix(t),this.scheduleRefit(),this.announceSizeOnOpen(t),this.touchCwd(e,t)}),this.announceSizeOnOpen(t)}installCodexCursorFix(e){(0,w.installCodexKeys)(e.frontend,()=>{var t;return"win32"===process.platform&&"codex"===(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id)},t=>this.sendToPane(e,"codex-question-key",()=>e.sendInput(t))),(0,y.installCodexWheel)(e.frontend,()=>{var t;return"win32"===process.platform&&"codex"===(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id)},t=>e.sendInput(t)),(0,b.installCursorVisibilityFix)(e.frontend,t=>{var i;return this.observePaneAgent(e,t),"win32"===process.platform&&"codex"===(null===(i=this.profileForPane(e))||void 0===i?void 0:i.id)},()=>this.diag("codex cursor: repaired non-private CSI 25 visibility sequence"),t=>this.diag(`cursor-path tab=${JSON.stringify(e.title)} ${t}`))}observePaneAgent(e,t){let i=this.paneAgents.get(e);i&&i.session===e.session||(i={session:e.session,tracker:new k.TerminalAgentTracker},this.paneAgents.set(e,i)),i.tracker.write(t)}announceSizeOnOpen(e){const t=e;for(const e of oe)setTimeout(()=>{var i;const n=null===(i=t.frontend)||void 0===i?void 0:i.xterm,o=t.session;if(!((null==o?void 0:o.open)&&"function"==typeof o.resize&&(null==n?void 0:n.cols)>1))return;const a=t.size;(null==a?void 0:a.columns)===n.cols&&(null==a?void 0:a.rows)===n.rows||this.diag(`announce size ${null==a?void 0:a.columns}x${null==a?void 0:a.rows} -> ${n.cols}x${n.rows} (+${e}ms)`);try{o.resize(n.cols,n.rows),t.size={columns:n.cols,rows:n.rows}}catch(e){(0,X.diagCatch)("announce-size resize",e)}},e)}ensureNewTabHotkey(){const e=this.config.store.hotkeys;if(!e||!1===this.config.store.agentDeck.claimNewTabKey)return;const t=Array.isArray(e["agentdeck-new-tab"])?e["agentdeck-new-tab"]:[],i=Array.isArray(e["new-tab"])?e["new-tab"]:[],n=i.filter(e=>!t.includes(e));n.length!==i.length&&(e["new-tab"]=n,this.config.save(),this.diag(`hotkeys new-tab claimed: theirs=${JSON.stringify(i)} -> ${JSON.stringify(n)} ours=${JSON.stringify(t)}`))}ensureSplitHotkeys(){const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const[i,n,o]of[["split-right","Ctrl-Shift-S","Ctrl-S"],["split-bottom","Ctrl-Shift-D","Ctrl-D"]]){const a=e[i];Array.isArray(a)&&1===a.length&&a[0]===n&&(e[i]=[o],t=!0)}t&&this.config.save()}ensureClosePaneHotkey(){var e;const t=this.config.store.hotkeys,i=String(null!==(e=this.config.store.agentDeck.closePaneKey)&&void 0!==e?e:"").trim();t&&i&&((Array.isArray(t["close-pane"])?t["close-pane"]:[]).length>0||(t["close-pane"]=[i],this.config.save(),this.diag(`hotkeys close-pane filled: ${JSON.stringify(t["close-pane"])}`)))}ensureRepairHotkey(){const e=this.config.store.hotkeys;if(!e||!1===this.config.store.agentDeck.claimRepairKey)return;let t=!1;const i=Array.isArray(e["agentdeck-repair"])?e["agentdeck-repair"]:[];1===i.length&&"Ctrl-Shift-U"===i[0]&&(e["agentdeck-repair"]=["Ctrl-R"],t=!0);const n=Array.isArray(e["agentdeck-repair"])?e["agentdeck-repair"]:[],o=Array.isArray(e["rename-tab"])?e["rename-tab"]:[],a=o.filter(e=>!n.includes(e));a.length!==o.length&&(e["rename-tab"]=a,t=!0),t&&(this.config.save(),this.diag(`hotkeys repair claimed: ours=${JSON.stringify(n)} rename-tab=${JSON.stringify(o)} -> ${JSON.stringify(a)}`))}ensurePasteHotkey(){const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const i of["workdeck-paste","workdeck-newline","workdeck-toggle"])i in e&&(delete e[i],t=!0);for(const i of["agentdeck-paste","paste"]){const n=Array.isArray(e[i])?e[i]:[];n.includes("Ctrl-V")&&(e[i]=n.filter(e=>"Ctrl-V"!==e),t=!0)}t&&this.config.save(),this.diag(`hotkeys paste=${JSON.stringify(e.paste)} agentdeck-paste=${JSON.stringify(e["agentdeck-paste"])} legacy=${Object.keys(e).filter(e=>e.startsWith("workdeck")).join(",")||"none"}`)}claimCtrlVKey(){document.addEventListener("keydown",e=>{this.config.store.agentDeck.claimCtrlV&&(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey||"v"!==(e.key||"").toLowerCase()&&"KeyV"!==e.code||this.isPlainInput(e.target)||this.isDeckUiKey(e.target)||(e.preventDefault(),e.stopPropagation(),this.zone.runOutsideAngular(()=>this.doPaste("ctrl-v"))))},!0)}claimCtrlWKey(){document.addEventListener("keydown",e=>{var t,i,n;const o=this.config.store.agentDeck;if(!this.enabled||!1===o.keyboardNav||!1===o.keyboardCloseTab)return;if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)return;if("w"!==(e.key||"").toLowerCase()&&"KeyW"!==e.code)return;if(this.isPlainInput(e.target))return;const a="list"===this.navMode;if(!a&&this.isDeckUiKey(e.target))return;const s=(0,U.pickCloseTarget)({inList:a,focus:this.navFocus,active:null!==(t=this.app.activeTab)&&void 0!==t?t:null,tabs:this.app.tabs});s?(e.preventDefault(),e.stopPropagation(),this.diag(`ctrl-w close inList=${a} tabs=${this.app.tabs.length}`),this.zone.run(()=>{this.app.closeTab(s,!0)})):this.diag(`ctrl-w skip inList=${a} focus=${null!==(n=null===(i=this.navFocus)||void 0===i?void 0:i.kind)&&void 0!==n?n:"none"}`)},!0)}releaseHomeEndHotkey(){if(!this.config.store.agentDeck.releaseHomeEnd)return;const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const i of["home","end"]){const n=Array.isArray(e[i])?e[i]:[],o=n.filter(e=>"Home"!==e&&"End"!==e);o.length!==n.length&&(e[i]=o,t=!0)}t&&this.config.save(),this.diag(`hotkeys home=${JSON.stringify(e.home)} end=${JSON.stringify(e.end)}`)}guardHomeEndComposition(){document.addEventListener("keydown",e=>{if(!this.config.store.agentDeck.imeOrderGuard)return;const t=e.key;if("Home"!==t&&"End"!==t&&"Home"!==e.code&&"End"!==e.code)return;if(this.isPlainInput(e.target)||this.isDeckUiKey(e.target))return;const i=this.focusedPane(),n=this.compositionHelper(i),o=(0,H.readCompositionState)(n),a=(0,H.planSend)(o);this.diag(`ime home-end key=${t} keyCode=${e.keyCode} ${this.describeComposition(n)} evComposing=${e.isComposing} state=${o} plan=${a}`)},!0)}sendToPane(e,t,i){const n=()=>{try{i()}catch{}};if(!this.config.store.agentDeck.imeOrderGuard)return void n();const o=this.compositionHelper(e),a=(0,H.readCompositionState)(o),s=(0,H.planSend)(a);this.diag(`ime send=${t} ${this.describeComposition(o)} state=${a} plan=${s}`),"defer"!==s?"after-composition"!==s?n():this.writeAfterComposition(e,t,n):setTimeout(n,0)}writeAfterComposition(e,t,i){const n=(()=>{var t,i,n;try{return null!==(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea)&&void 0!==n?n:null}catch{return null}})();if(!n){const n=(0,H.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));return this.diag(`ime send=${t} no-textarea flushed=${n}`),void i()}let o=!1;const a=e=>{o||(o=!0,n.removeEventListener("compositionend",s),clearTimeout(r),this.diag(`ime send=${t} wrote-after=${e}`),setTimeout(i,0))},s=()=>a("compositionend"),r=setTimeout(()=>{const i=(0,H.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));this.diag(`ime send=${t} timeout flushed=${i}`),a("timeout")},400);n.addEventListener("compositionend",s,{once:!0})}compositionHelper(e){var t,i,n,o;try{return null!==(o=null===(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i._core)||void 0===n?void 0:n._compositionHelper)&&void 0!==o?o:null}catch{return null}}compositionTextLength(e){var t,i,n;try{const o=null===(n=null===(i=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.textarea)||void 0===n?void 0:n.value;return"string"==typeof o?o.length:0}catch{return 0}}describeComposition(e){if(!e)return"helper=none";try{return`isComposing=${e.isComposing} sending=${e._isSendingComposition}`}catch{return"helper=unreadable"}}claimShiftEnterKey(){const e=()=>{this.shiftDownAt=0},t=e=>"Shift"===e.key||(e.code||"").startsWith("Shift");window.addEventListener("blur",e),document.addEventListener("keyup",i=>{t(i)&&e()},!0),document.addEventListener("keydown",i=>{if(t(i))return void(this.shiftDownAt=Date.now());if(!this.config.store.agentDeck.claimShiftEnter)return;const n="Enter"===i.key||"Enter"===i.code||"NumpadEnter"===i.code;if(!n&&!i.shiftKey&&!i.getModifierState("Shift"))return void e();if(!n||i.altKey||i.metaKey)return;if(i.isComposing||229===i.keyCode)return;const o=this.shiftDownAt>0&&Date.now()-this.shiftDownAt<5e3;(i.shiftKey||i.getModifierState("Shift")||o||i.ctrlKey)&&(this.isPlainInput(i.target)||this.isDeckUiKey(i.target)||(i.preventDefault(),i.stopPropagation(),this.diag(`newline (capture) shiftKey=${i.shiftKey} modState=${i.getModifierState("Shift")} tracked=${o} ctrl=${i.ctrlKey}`),this.sendNewline()))},!0)}claimEnterLabel(){document.addEventListener("keydown",e=>{var t,i;if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)return;if("Enter"!==e.key&&"Enter"!==e.code&&"NumpadEnter"!==e.code)return;if(e.isComposing||229===e.keyCode)return;if(this.isPlainInput(e.target)||this.isDeckUiKey(e.target))return;const n=this.app.activeTab;if(n&&(0,D.releaseLimited)(this.status,n),!this.config.store.agentDeck.enterAsLabel)return;const o=this.focusedPane();if(!o)return void this.diag("enter-label skipped (no pane)");const a=this.readPromptLine(o),s=this.app.activeTab;this.diag(`enter-label text="${a}" tab=${s?"yes":"no"} profile=${null!==(i=null===(t=this.profileForPane(o))||void 0===t?void 0:t.id)&&void 0!==i?i:"default"}`),a&&s&&this.status.setLabel(s,a)},!0)}readPromptLine(e){var t,i,n,o;const a=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(i=null==a?void 0:a.buffer)||void 0===i?void 0:i.active;if(!s||"function"!=typeof s.getLine)return this.diag(`enter-label no-buffer frontend=${e.frontend?"yes":"no"} xterm=${a?"yes":"no"}`),"";const r=(e,t)=>{var i,n;const o=[];for(let a=Math.max(0,e);a<=t;a++)o.push(null!==(n=null===(i=s.getLine(a))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:"");return o},d=s.baseY+(null!==(n=s.cursorY)&&void 0!==n?n:0),l=r(d-14,d),c=null===(o=this.profileForPane(e))||void 0===o?void 0:o.promptShape,u=(0,_.extractPrompt)(l,c);if(u)return u;const p=(0,_.extractPrompt)(r(s.baseY,s.baseY+a.rows-1),c);if(!p){const e=l.slice(-4).map(e=>JSON.stringify(e.slice(0,60))).join(" | ");this.diag(`enter-label miss baseY=${s.baseY} cursorY=${s.cursorY} rows=${a.rows} tail=${e}`)}return p}isPlainInput(e){var t;const i=e;return!(!i||"function"!=typeof i.closest)&&!(null===(t=i.classList)||void 0===t?void 0:t.contains("xterm-helper-textarea"))&&!i.closest(".xterm")&&(i.isContentEditable||["INPUT","TEXTAREA"].includes(i.tagName))}isDeckUiKey(e){const t=e;return!(!t||"function"!=typeof t.closest||!t.closest("#"+Q))}doPaste(e){const t=Date.now();if(t-this.lastPasteAt<80)return void this.diag(`paste ignored (dup ${t-this.lastPasteAt}ms, ${e})`);this.lastPasteAt=t;const i=this.focusedPane();if(!i)return;const n=this.clipboardHasImageOnly();if(this.diag(`paste probe enabled=${this.config.store.agentDeck.pasteImageWithCtrlV} imageOnly=${n} sendInput=${typeof i.sendInput}`),this.config.store.agentDeck.pasteImageWithCtrlV&&n&&"function"==typeof i.sendInput)return void this.sendImagePasteKey(i);if("function"!=typeof i.paste)return;if(this.pasteProbeUntil=Date.now()+5e3,this.probeSendInput(i),this.probeWrite(i),this.diag(`paste (${e})`),"ctrl-v"===e)return void this.sendToPane(i,"paste-ctrl-v",()=>{i.paste()});const o=Date.now();setTimeout(()=>{this.nativePasteAt>=o?this.diag("paste skipped (native handled)"):(this.diag("paste fallback"),this.sendToPane(i,"paste-fallback",()=>{i.paste()}))},60)}async sendImagePasteKey(e){const t=await this.detectAgentApp(e),i=(0,T.profileFor)(t.id),n=this.config.store.agentDeck.imagePasteKey,o="config"===i.imagePasteKey?n:i.imagePasteKey,a="ctrl-v"===o?"":"v";this.diag(`paste image app=${t.id} via=${t.via} mode=${o} bytes=${[...a].map(e=>e.charCodeAt(0)).join(",")}`),this.sendToPane(e,"paste-image",()=>e.sendInput(a))}claimFileDrop(){const e=e=>{var t;const i=e;return!!(null===(t=null==i?void 0:i.closest)||void 0===t?void 0:t.call(i,"#agentdeck-view, #agentdeck-sidebar"))};document.addEventListener("dragover",t=>{var i,n;"never"===this.config.store.agentDeck.viewerDropOpen||e(t.target)||Array.from(null!==(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.types)&&void 0!==n?n:[]).includes("Files")&&t.preventDefault()},!0),document.addEventListener("drop",t=>{var i,n,o;const a=this.config.store.agentDeck.viewerDropOpen;if("never"===a||e(t.target))return;const s=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],r=(null==s?void 0:s.path)||(null===(o=t.dataTransfer)||void 0===o?void 0:o.getData("text/plain"))||"",d=String(r).trim().replace(/^"|"$/g,"");d&&(t.preventDefault(),t.stopPropagation(),"always"!==a?"paste"!==a?this.askFileDrop(d):this.pasteDroppedPath(d):this.openDroppedInPanel(d))},!0)}openDroppedInPanel(e){var t,i;null===(t=this.view)||void 0===t||t.setOpen(!0,!1),null===(i=this.view)||void 0===i||i.openFile(e)}pasteDroppedPath(e){const t=this.firstPane(this.app.activeTab);if(!t)return;const i=/\s/.test(e)?`"${e}"`:e;this.sendToPane(t,"drop-paste",()=>t.sendInput(i))}askFileDrop(e){var t,i,n,o;null===(t=document.getElementById("agentdeck-drop-ask"))||void 0===t||t.remove();const a=e.split(/[\\/]/).pop()||e,s=document.createElement("div");s.id="agentdeck-drop-ask",s.className="ad-drop-ask",s.innerHTML=['<div class="ad-drop-ask-msg"></div>','<div class="ad-drop-ask-row">',this.uiMarkup(' <button class="ad-drop-ask-view">패널에 띄우기</button>'),this.uiMarkup(' <button class="ad-drop-ask-paste">경로 붙여넣기</button>'),this.uiMarkup(' <button class="ad-drop-ask-close" title="아무것도 하지 않는다">✕</button>'),"</div>",'<label class="ad-drop-ask-again">',this.uiMarkup(' <input type="checkbox" class="ad-drop-ask-again-box"> 다시 묻지 않기'),"</label>"].join("");const r=s.querySelector(".ad-drop-ask-msg");r.textContent=this.ui("{name} 을 어떻게 할까요?",{name:a}),r.title=e;const d=e=>{(()=>{var e;return!0===(null===(e=s.querySelector(".ad-drop-ask-again-box"))||void 0===e?void 0:e.checked)})()&&(this.config.store.agentDeck.viewerDropOpen=e,this.config.save())},l=()=>s.remove();null===(i=s.querySelector(".ad-drop-ask-view"))||void 0===i||i.addEventListener("click",()=>{d("always"),this.openDroppedInPanel(e),l()}),null===(n=s.querySelector(".ad-drop-ask-paste"))||void 0===n||n.addEventListener("click",()=>{d("paste"),this.pasteDroppedPath(e),l()}),null===(o=s.querySelector(".ad-drop-ask-close"))||void 0===o||o.addEventListener("click",l),document.body.appendChild(s),setTimeout(()=>{document.getElementById("agentdeck-drop-ask")===s&&l()},15e3)}async detectAgentApp(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;const m=null!==(n=null===(i=(t=this.app).getParentTab)||void 0===i?void 0:i.call(t,e))&&void 0!==n?n:e,v=null!==(s=null===(a=null===(o=this.notify)||void 0===o?void 0:o.agentOf)||void 0===a?void 0:a.call(o,m))&&void 0!==s?s:null;let b=[];try{const t=null!==(l=await(null===(d=null===(r=e.session)||void 0===r?void 0:r.getChildProcesses)||void 0===d?void 0:d.call(r)))&&void 0!==l?l:[],i=t.map(e=>{var t,i;return`${null!==(t=null==e?void 0:e.command)&&void 0!==t?t:""} ${null!==(i=null==e?void 0:e.name)&&void 0!==i?i:""}`}).join(" "),n=(0,T.identifyAgent)(i,"");if("unknown"!==n)return v&&v!==n&&(null===(u=null===(c=this.notify)||void 0===c?void 0:c.forgetAgent)||void 0===u||u.call(c,m),this.forgetHookStatus(m),this.diag(`agent hook stale hook=${v} proc=${n}`)),{id:n,via:"proc"};if(b=t.map(e=>Number(null==e?void 0:e.pid)).filter(e=>Number.isInteger(e)&&e>0),v&&!b.length)return{id:v,via:"hook"}}catch{if(v)return{id:v,via:"hook"}}const k=await this.commandLinesOf(b);if(k){const e=(0,T.identifyAgent)(k,"");if("unknown"!==e)return v&&v!==e&&(null===(h=null===(p=this.notify)||void 0===p?void 0:p.forgetAgent)||void 0===h||h.call(p,m),this.forgetHookStatus(m),this.diag(`agent hook stale hook=${v} cmdline=${e}`)),{id:e,via:"cmdline"}}const y=`${null!==(g=e.title)&&void 0!==g?g:""} ${null!==(f=e.customTitle)&&void 0!==f?f:""}`,w=(0,T.identifyAgent)("",y);return{id:w,via:"unknown"===w?"none":"title"}}forgetHookStatus(e){this.status.get(e).pinned&&this.status.unpin(e)}async commandLinesOf(e){const t=e.filter(e=>Number.isInteger(e)&&e>0).slice(0,8);if(!t.length)return null;try{const{execFile:e}=i(5317),n="win32"===process.platform,o=n?"powershell":"ps",a=n?["-NoProfile","-NonInteractive","-Command",`Get-CimInstance Win32_Process -Filter "${t.map(e=>`ProcessId=${e}`).join(" or ")}" | Select-Object -ExpandProperty CommandLine`]:["-o","args=","-p",t.join(",")];return await new Promise(t=>{e(o,a,{timeout:4e3,windowsHide:!0},(e,i)=>t(e&&!i?null:String(null!=i?i:""))).on("error",()=>t(null))})}catch{return null}}async probeAgent(e,t){var i,n;const o=Date.now();if(o-(null!==(i=this.agentProbedAt.get(e))&&void 0!==i?i:0)<1e4)return;this.agentProbedAt.set(e,o);const a=this.firstPane(e);if(!a)return;const s=a.session,r=this.paneAgents.get(a),d=await this.detectAgentApp(a);if(a.session!==s)return;"unknown"===d.id||"proc"!==d.via&&"cmdline"!==d.via||!r||this.paneAgents.get(a)!==r||r.session!==s||"unknown"!==r.tracker.id||(r.tracker.id=d.id,this.diag(`agent stream recovered id=${d.id} via=${d.via}`));const l=this.tabAgents.get(e);"unknown"===d.id&&l&&"unknown"!==l||(this.tabAgents.set(e,d.id),d.id!==l&&this.diag(`agent tab=${JSON.stringify(null!==(n=e.title)&&void 0!==n?n:"")} id=${d.id} via=${d.via} (${t})`))}firstPane(e){var t;const i=e;return null!==(t=("function"==typeof i.getAllTabs?i.getAllTabs():[e])[0])&&void 0!==t?t:null}profileForPane(e){const t=n.prototype.resolveProfileForPane;if(!this.profileMemo)return t.call(this,e);const i=this.profileMemo.get(e),o=Date.now(),a=!!i&&i.session===(null==e?void 0:e.session);if(a&&o-i.at<250)return i.profile;let s=t.call(this,e);return!s&&a&&(s=i.known),this.profileMemo.set(e,{at:o,session:null==e?void 0:e.session,profile:s,known:null!=s?s:a?i.known:void 0}),s}resolveProfileForPane(e){var t,i,n,o,a,s,r,d,l,c,u,p,h,g,f;try{const m=null!==(n=null===(i=(t=this.app).getParentTab)||void 0===i?void 0:i.call(t,e))&&void 0!==n?n:e;if(this.pinnedCount>0){const t=null!==(o=this.pinnedAgents.get(e))&&void 0!==o?o:this.pinnedAgents.get(m);if(t)return(0,T.detectProfileFor)(t)}const v=null===(s=null===(a=this.notify)||void 0===a?void 0:a.agentOf)||void 0===s?void 0:s.call(a,m);if(v)return(0,T.detectProfileFor)(v);const b=null===(r=this.paneAgents)||void 0===r?void 0:r.get(e),y=null===(d=null==e?void 0:e.frontend)||void 0===d?void 0:d.xterm,w=null===(l=null==y?void 0:y.buffer)||void 0===l?void 0:l.active,x=(null==b?void 0:b.session)===e.session?b:void 0;if(w&&(!b||x)&&(!(null==x?void 0:x.tracker.id)||"unknown"===x.tracker.id)){const t=Array.from({length:y.rows},(e,t)=>{var i,n;return null!==(n=null===(i=w.getLine(w.baseY+t))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:""});if((0,k.isLiveCodexScreen)(t)){const t=null!==(c=null==x?void 0:x.tracker)&&void 0!==c?c:new k.TerminalAgentTracker;return t.id="codex",null===(u=this.paneAgents)||void 0===u||u.set(e,{session:e.session,tracker:t}),null===(p=this.tabAgents)||void 0===p||p.set(m,"codex"),null===(h=this.diag)||void 0===h||h.call(this,"agent stream recovered id=codex via=live-screen"),(0,T.detectProfileFor)("codex")}}if((null==b?void 0:b.session)===e.session&&(null==b?void 0:b.tracker.id)&&"unknown"!==b.tracker.id)return(0,T.detectProfileFor)(b.tracker.id);const S=this.profileForTab(m);if(S&&"codex"!==S.id)return S;if(!w)return S;const C=Math.max(0,w.baseY-60),j=[];for(let e=C;e<w.baseY+y.rows;e++)j.push(null!==(f=null===(g=w.getLine(e))||void 0===g?void 0:g.translateToString(!0))&&void 0!==f?f:"");const A=(0,k.identifyScreenAgent)(j);return"claude"===A?(0,T.detectProfileFor)("claude"):S||("unknown"===A?void 0:(0,T.detectProfileFor)(A))}catch{return}}profileForTab(e){var t,i;const n=null===(i=null===(t=this.notify)||void 0===t?void 0:t.agentOf)||void 0===i?void 0:i.call(t,e);if(n)return(0,T.detectProfileFor)(n);const o=this.tabAgents.get(e);return o&&"unknown"!==o?(0,T.detectProfileFor)(o):void 0}probeSendInput(e){if(!e||e.__adSendInputProbe||"function"!=typeof e.sendInput)return;const t=e.sendInput.bind(e);e.__adSendInputProbe=!0,e.sendInput=(e,...i)=>{if(Date.now()<this.pasteProbeUntil){const t="string"==typeof e?e:String(e);this.diag(`sendInput len=${t.length} head=${JSON.stringify(t.slice(0,24))} from=${this.callSite()}`)}return t(e,...i)}}probeWrite(e){const t=null==e?void 0:e.session;if(!t||t.__adWriteProbe||"function"!=typeof t.write)return;const i=t.write.bind(t);t.__adWriteProbe=!0,t.write=(e,...t)=>{if(Date.now()<this.pasteProbeUntil){const t="string"==typeof e?e:String(e);this.diag(`write len=${t.length} head=${JSON.stringify(t.slice(0,24))} from=${this.callSite()}`)}return i(e,...t)}}callSite(){var e;return(null!==(e=(new Error).stack)&&void 0!==e?e:"").split(String.fromCharCode(10)).slice(3,7).map(e=>e.trim().replace(/^at\s+/,"")).join(" <- ")}clipboardHasImageOnly(){const e=se();if(!e)return this.diag("clipboard unavailable"),!1;try{const t=!e.readImage().isEmpty(),i=e.readText();return this.diag(`clipboard hasImage=${t} textLen=${i.length}`),t&&""===i.trim()}catch(e){return this.diag(`clipboard read failed: ${e}`),!1}}focusedPane(){var e;const t=this.app.activeTab;return t?"function"==typeof t.getFocusedTab&&null!==(e=t.getFocusedTab())&&void 0!==e?e:t:null}ensureNewlineHotkey(){const e=this.config.store.hotkeys;if(!e||!Array.isArray(e["agentdeck-newline"]))return;const t=e["agentdeck-newline"];t.includes("Shift-Enter")||(e["agentdeck-newline"]=[...t,"Shift-Enter"],this.config.save())}claimRightClick(){this.config.store.agentDeck.claimRightClick&&(this.config.store.terminal&&"off"!==this.config.store.terminal.rightClick&&(this.config.store.terminal.rightClick="off",this.config.save()),document.addEventListener("mousedown",e=>{2===e.button&&this.inTerminalArea(e)&&(this.rightDownAt=Date.now(),e.preventDefault(),e.stopPropagation())},{capture:!0}),document.addEventListener("contextmenu",e=>{this.inTerminalArea(e)&&(e.preventDefault(),e.stopPropagation())},{capture:!0}),document.addEventListener("mouseup",e=>{if(2!==e.button||!this.inTerminalArea(e))return;e.preventDefault(),e.stopPropagation();const t=Date.now();if(t-this.lastRightHandledAt<150)return;this.lastRightHandledAt=t;const i=t-this.rightDownAt;this.handleRightClick(e,i)},{capture:!0}))}inTerminalArea(e){const t=e.target;return!(!t||"function"!=typeof t.closest||!t.closest(".content.main")||t.closest(`#${Q}`))}async handleRightClick(e,t){var i,n;const o=this.focusedPane();o&&(t>=(null!==(i=this.config.store.agentDeck.rightClickMenuMs)&&void 0!==i?i:250)?"function"==typeof o.buildContextMenu&&o.platform&&o.platform.popupContextMenu(await o.buildContextMenu(),e):"function"==typeof(null===(n=o.frontend)||void 0===n?void 0:n.getSelection)&&o.frontend.getSelection()?(o.frontend.copySelection(),o.frontend.clearSelection()):this.doPaste("rightclick"))}sendNewline(){var e,t,i;const n=this.focusedPane();if(n&&"function"==typeof n.sendInput){const o=(0,v.newlineSequence)(null===(e=this.profileForPane(n))||void 0===e?void 0:e.id);this.diag(`newline agent=${null!==(i=null===(t=this.profileForPane(n))||void 0===t?void 0:t.id)&&void 0!==i?i:"unknown"} sequence=${JSON.stringify(o)}`),this.sendToPane(n,"newline",()=>n.sendInput(o))}}get enabled(){return this.config.store.agentDeck.enabled}applyEnabled(){var e;if(document.body.classList.toggle("agentdeck-active",this.enabled),this.sidebar&&(this.sidebar.style.display=this.enabled?"":"none"),null===(e=this.view)||void 0===e||e.setVisible(this.enabled),!this.enabled&&this.mainEl){for(const e of["flex","width","max-width","height","margin-left","margin-right","margin-top","margin-bottom"])this.mainEl.style.removeProperty(e);this.lastTermW=-1,this.lastSidebarW=-1,this.lastViewW=-1,this.lastViewSide=null,this.lastDock=null,this.lastBoxKey="",this.scheduleRefit()}this.syncBackgroundClip()}syncBackgroundClip(){const e=document.documentElement,t=()=>{document.body.classList.remove(ee);for(const t of["--ad-bg-left","--ad-bg-top","--ad-bg-width","--ad-bg-height"])e.style.removeProperty(t)};this.enabled&&this.config.store.agentDeck.clipBackgroundToTerminal&&this.mainEl?requestAnimationFrame(()=>{if(!this.enabled||!this.mainEl)return void t();const i=this.mainEl.getBoundingClientRect();i.width<=0||i.height<=0||(e.style.setProperty("--ad-bg-left",Math.round(i.left)+"px"),e.style.setProperty("--ad-bg-top",Math.round(i.top)+"px"),e.style.setProperty("--ad-bg-width",Math.round(i.width)+"px"),e.style.setProperty("--ad-bg-height",Math.round(i.height)+"px"),document.body.classList.add(ee))}):t()}applyOpacity(){var e;const t=this.config.store.agentDeck,i=re(t.terminalOpacity),n=re(t.sidebarOpacity),o=document.documentElement;n>=100?o.style.removeProperty("--ad-panel-bg"):o.style.setProperty("--ad-panel-bg",`rgba(30, 33, 39, ${n/100})`);const a=null===(e=this.config.store.terminal)||void 0===e?void 0:e.colorScheme;if(!(null==a?void 0:a.background))return;const s=function(e,t){const i=/^#([0-9a-fA-F]{6})(?:[0-9a-fA-F]{2})?$/.exec(e.trim());if(!i)return e;const n="#"+i[1];return t>=100?n:n+Math.round(255*t/100).toString(16).padStart(2,"0")}(a.background,i),r=i<100?"colorScheme":this.config.store.terminal.background;s===a.background&&r===this.config.store.terminal.background||(a.background=s,this.config.store.terminal.background=r,this.config.save())}get dockSide(){const e=this.config.store.agentDeck.sidebarDock;return(0,B.isDockSide)(e)?e:"right"}visibleBox(){const e=this.windowEl.getBoundingClientRect(),t=document.documentElement.clientWidth||window.innerWidth||e.width,i=document.documentElement.clientHeight||window.innerHeight||e.height,n=Math.max(e.left,0),o=Math.max(e.top,0);return{left:n,top:o,width:Math.max(0,Math.round(Math.min(e.right,t)-n)),height:Math.max(0,Math.round(Math.min(e.bottom,i)-o))}}anchorOrigin(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.offsetParent;if(!t||"static"===getComputedStyle(t).position)return{left:0,top:0};const i=t.getBoundingClientRect(),n=getComputedStyle(t);return{left:i.left+(parseFloat(n.borderLeftWidth)||0),top:i.top+(parseFloat(n.borderTopWidth)||0)}}sidebarExtent(e,t,i){const n=this.config.store.agentDeck;if((0,B.isHorizontalDock)(this.dockSide)){const i=n.sidebarMin||200,o=Math.max(n.sidebarMax||560,i);let a=n.sidebarWidth||0;if(!a){const o=(n.aspectW||4)/(n.aspectH||3);let s=Math.round(t*o);s=Math.min(s,e-i),s=Math.max(s,te),a=e-s}const s=n.sidebarWidth?140:i,r=Math.max(e-te,s),d=n.sidebarWidth?Math.max(o,n.sidebarWidth):o;return Math.min(Math.max(a,s),d,r)}const o=n.sidebarHeight||200;return Math.min(Math.max(o,90),Math.max(i-160,90))}relayout(){var e,t,i,n,o;if(document.body.classList.toggle("ad-native-titlebar","win32"===process.platform&&"thin"===(null===(e=this.config.store.appearance)||void 0===e?void 0:e.frame)&&!this.hostWindow.isFullscreen),!this.enabled||!this.windowEl)return void this.diagOnce("relayout-skip-enabled",`relayout skipped enabled=${this.enabled} windowEl=${!!this.windowEl}`);if(this.mainEl||(this.mainEl=document.querySelector(".content.main")),!this.mainEl)return void this.diagOnce("relayout-skip-mainel","relayout skipped mainEl=null");const a=this.visibleBox(),s=a.width,r=this.mainEl.clientHeight||a.height;if(!s||!r)return;const d=this.dockSide,l=(0,B.isHorizontalDock)(d),c=this.viewSide,u=s-te-(l?140:0),p=Math.round(null!==(i=null===(t=this.view)||void 0===t?void 0:t.extent(u))&&void 0!==i?i:0),h=Math.max(s-p,te);let g=Math.round(this.sidebarExtent(h,r,a.height));const f=l?g:0,m=("left"===d?f:0)+("left"===c?p:0),v=("right"===d?f:0)+("right"===c?p:0);let b=s-m-v;g=Math.round(g),b=Math.round(b);const k=a.left+":"+a.top;if(b===this.lastTermW&&g===this.lastSidebarW&&d===this.lastDock&&p===this.lastViewW&&c===this.lastViewSide&&k===this.lastBoxKey)return;this.lastBoxKey=k,this.lastTermW=b,this.lastSidebarW=g,this.lastDock=d,this.lastViewW=p,this.lastViewSide=c;const y=this.anchorOrigin();if(this.sidebar){const e=this.sidebar.style;e.position="absolute",e.left=Math.round(a.left-y.left+("right"===d?a.width-g:0))+"px",e.top=Math.round(a.top-y.top+("bottom"===d?a.height-g:0))+"px",e.right="auto",e.bottom="auto",e.width=(l?g:a.width)+"px",e.height=(l?a.height:g)+"px";for(const e of B.DOCK_SIDES)this.sidebar.classList.toggle("ad-dock-"+e,e===d)}const w=d===c?f:0;null===(n=this.view)||void 0===n||n.layout(c,{left:Math.round(a.left-y.left+("left"===c?w:a.width-p-w)),top:Math.round(a.top-y.top),width:p,height:a.height});const x=this.mainEl.style;if(l||p>0){x.marginLeft=m+"px",x.marginRight="0";const e=this.mainEl.getBoundingClientRect().left;b=Math.max(te,Math.round(a.left+a.width-v-e)),x.flex="0 0 "+b+"px",x.width=b+"px",x.maxWidth=b+"px"}else x.removeProperty("flex"),x.removeProperty("width"),x.removeProperty("max-width"),x.marginLeft="0",x.marginRight="0";l?(x.removeProperty("height"),x.marginTop="0",x.marginBottom="0"):(x.marginTop="top"===d?g+"px":"0",x.marginBottom="bottom"===d?g+"px":"0",x.setProperty("height","calc(100% - "+g+"px)","important")),null===(o=this.dock)||void 0===o||o.syncHandle(),this.syncBackgroundClip(),this.scheduleRefit(),this.diag(`relayout dock=${d} avail=${s}x${r} extent=${g} termW=${b} mainW=${this.mainEl.clientWidth}`)}scheduleRefit(){this.refitQueued||(this.refitQueued=!0,requestAnimationFrame(()=>requestAnimationFrame(()=>{this.refitQueued=!1,this.refitTerminals()})),setTimeout(()=>this.refitTerminals(),500))}refitTerminals(){var e,t;for(const i of this.app.tabs){const n=i,o="function"==typeof n.getAllTabs?n.getAllTabs():[i];for(const i of o){const n=i.frontend,o=null==n?void 0:n.fitAddon;if(!o||"function"!=typeof o.fit)continue;const a=null===(t=null===(e=n.xterm)||void 0===e?void 0:e.element)||void 0===t?void 0:t.parentElement;if(a&&a.clientWidth&&a.clientHeight)try{o.fit()}catch{}}}}syncPtySize(e,t,i=!0){var n,o,a,s;const r=null===(n=null==t?void 0:t.xterm)||void 0===n?void 0:n.cols,d=null===(o=null==t?void 0:t.xterm)||void 0===o?void 0:o.rows;if(!r||!d)return;const l=e,c=l.session;if(!c||!c.open||"function"!=typeof c.resize)return;const u=null!==(a=this.ptyResizeGeneration)&&void 0!==a?a:this.ptyResizeGeneration=new WeakMap,p=(null!==(s=u.get(e))&&void 0!==s?s:0)+1;u.set(e,p);const h=l.size;(null==h?void 0:h.columns)===r&&(null==h?void 0:h.rows)===d||this.diag(`pty resize ${null==h?void 0:h.columns}x${null==h?void 0:h.rows} -> ${r}x${d}`);try{c.resize(r,d),l.size={columns:r,rows:d}}catch(e){return void(0,X.diagCatch)("pty resize",e)}if(i&&((null==h?void 0:h.columns)!==r||(null==h?void 0:h.rows)!==d))for(const t of ne)setTimeout(()=>{var t;const i=null===(t=l.frontend)||void 0===t?void 0:t.xterm;if(l.session===c&&c.open&&u.get(e)===p&&(null==i?void 0:i.cols)===r&&(null==i?void 0:i.rows)===d)try{l.session.resize(r,d)}catch(e){(0,X.diagCatch)("pty resize retry",e)}},t)}nudgePtyRedraw(e,t){var i,n,o,a,s;const r=e,d=r.session,l=null===(n=null===(i=r.frontend)||void 0===i?void 0:i.xterm)||void 0===n?void 0:n.cols,c=null===(a=null===(o=r.frontend)||void 0===o?void 0:o.xterm)||void 0===a?void 0:a.rows;if(!((null==d?void 0:d.open)&&"function"==typeof d.resize&&l>1&&c>1))return;const u="win32"===process.platform&&"codex"===(null===(s=this.profileForPane(e))||void 0===s?void 0:s.id),h=u?l:l-1,g=u?c-1:c;this.diag(`redraw nudge ${l}x${c} -> ${h}x${g}`);try{d.resize(h,g),r.size={columns:h,rows:g};const i=(0,p.perfNow)()+60;setTimeout(()=>{r.session===d&&d.open&&(this.syncPtySize(e,r.frontend,!1),null==t||t.mark("pty-restored",`timerLagMs=${Math.max(0,(0,p.perfNow)()-i).toFixed(1)}`))},60)}catch{}}buildSidebar(){const e=document.createElement("div");e.id=Q,e.innerHTML=['<div class="ad-head">',' <span class="ad-head-title">AGENT DECK <span class="ad-head-version"></span></span>',' <span class="ad-head-count"></span>',"</div>",'<div class="ad-search">',' <input class="ad-search-input" type="text" spellcheck="false"',' placeholder="'+this.ui("세션 검색 (제목 · 작업이름 · 폴더)")+'">',this.uiMarkup(' <button class="ad-search-clear" type="button" title="검색·필터 지우기 (Esc)">&times;</button>'),"</div>",'<div class="ad-list"></div>','<div class="ad-resume-drawer" hidden>',' <div class="ad-resume-rows"></div>',' <div class="ad-resume-head"></div>',"</div>",'<div class="ad-now" hidden>',' <div class="ad-now-title"></div>',this.uiMarkup(' <button type="button" class="ad-now-account" title="계정 선택" aria-haspopup="dialog"></button>'),' <div class="ad-now-gauges"></div>',"</div>",'<div class="ad-foot">',this.uiMarkup(' <button class="ad-btn ad-new" title="새 탭">+ 새 탭</button>'),this.uiMarkup(' <button class="ad-btn ad-settings" title="설정">설정</button>'),this.uiMarkup(' <button class="ad-btn ad-repair" title="화면 복구 (모든 탭 다시 그리기)">↻</button>'),this.uiMarkup(' <button class="ad-btn ad-viewtoggle" title="미리보기 패널 (md · 이미지 · 표)">▤</button>'),"</div>"].join("\n"),e.querySelector(".ad-head-version").textContent=`v${(0,X.pluginVersion)()}`,this.windowEl.appendChild(e);const t=document.createElement("div");t.className="ad-window-drag",t.textContent="AgentDeck",t.title="ko"===this.sidebarLang?"드래그하여 창 이동 · 더블 클릭하여 최대화/복원":"Drag to move window · Double-click to maximize/restore",document.body.appendChild(t),this.sidebar=e,this.listEl=e.querySelector(".ad-list"),this.listEl.addEventListener("pointerdown",e=>{if(0!==e.button||this.listPointerActive)return;this.listPointerActive=!0;const t=()=>{document.removeEventListener("pointerup",t,!0),document.removeEventListener("pointercancel",t,!0),window.removeEventListener("blur",t),setTimeout(()=>{this.listPointerActive=!1,this.scheduleRender()},0)};document.addEventListener("pointerup",t,!0),document.addEventListener("pointercancel",t,!0),window.addEventListener("blur",t)}),this.nowEl=e.querySelector(".ad-now"),this.resumeEl=e.querySelector(".ad-resume-drawer"),this.wireSearch(e),this.wireListKeys(this.listEl),e.querySelector(".ad-new").addEventListener("click",()=>{this.zone.run(()=>{this.openNewTab()})}),e.querySelector(".ad-repair").addEventListener("click",()=>{this.zone.run(()=>this.repair("all"))}),e.querySelector(".ad-settings").addEventListener("click",()=>{this.zone.run(()=>this.openSettings())}),e.querySelector(".ad-viewtoggle").addEventListener("click",()=>{this.zone.run(()=>{var e;return null===(e=this.view)||void 0===e?void 0:e.toggle()})}),this.dock=new B.DockController({sidebar:e,windowEl:this.windowEl,getBox:()=>this.visibleBox(),getDock:()=>this.dockSide,setDock:e=>{this.config.store.agentDeck.sidebarDock=e},getSize:e=>{const t=this.config.store.agentDeck;return(0,B.isHorizontalDock)(e)?(0,B.isHorizontalDock)(this.dockSide)&&this.lastSidebarW>0?this.lastSidebarW:t.sidebarWidth||0:t.sidebarHeight||0},setSize:e=>{const t=this.config.store.agentDeck;(0,B.isHorizontalDock)(this.dockSide)?t.sidebarWidth=e:t.sidebarHeight=e},commit:()=>this.zone.run(()=>this.config.save()),relayout:()=>this.relayout()}),this.dock.install()}wireSearch(e){const t=e.querySelector(".ad-search-input"),i=e.querySelector(".ad-search-clear");t&&(this.searchEl=t,t.addEventListener("input",()=>{this.searchQuery=t.value,this.syncSearchUi(),this.render()}),t.addEventListener("compositionstart",()=>{this.searchComposing=!0}),t.addEventListener("compositionend",()=>{this.searchComposing=!1}),t.addEventListener("keydown",e=>{if(e.stopPropagation(),"ArrowDown"===e.key||"ArrowDown"===e.code){if(this.searchComposing||e.isComposing||!this.navReady)return;return e.preventDefault(),void this.focusList("first")}"Escape"!==e.key&&"Escape"!==e.code||this.searchComposing||e.isComposing||(e.preventDefault(),this.navEscape())}),null==i||i.addEventListener("click",()=>{var e;this.clearFilters(),null===(e=this.searchEl)||void 0===e||e.focus()}),this.applySearchBox())}clearFilters(){this.searchQuery="",this.statusFilter=null,this.searchEl&&(this.searchEl.value=""),this.syncSearchUi(),this.render()}syncSearchUi(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.querySelector(".ad-search");null==t||t.classList.toggle("has-query",!!this.searchQuery.trim()||!!this.statusFilter)}applySearchBox(){var e;const t=null===(e=this.sidebar)||void 0===e?void 0:e.querySelector(".ad-search"),i=!1!==this.config.store.agentDeck.searchBox;t&&(t.style.display=i?"":"none"),i||!this.searchQuery&&!this.statusFilter||this.clearFilters()}toggleStatusFilter(e){this.statusFilter=this.statusFilter===e?null:e,this.syncSearchUi(),this.render()}tabMatchesFilter(e,t,i){var n,o;if(this.statusFilter&&i!==this.statusFilter)return!1;if(!t.length)return!0;const a=null!==(o=null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.dir)&&void 0!==o?o:null;return ce([this.identityOf(e).letter,this.identityOf(e).alias,(0,D.stripTitleMarker)(e.customTitle||e.title||""),this.status.get(e).label,a,a?null:this.ui(W.UNGROUPED_LABEL)],t)}migrateFollowConfig(){const e=this.config.store.agentDeck,t=(0,Z.migrateFollow)(e.viewerFollowMode,e.viewerFollow);t&&(e.viewerPreload=t.preload,e.viewerAutoOpen=t.autoOpen,e.viewerFollowMode="",e.viewerFollow=!0,this.config.save(),this.diag(`migrate follow -> preload=${t.preload} autoOpen=${t.autoOpen}`))}buildView(){var e;if(!this.windowEl)return;const t=()=>this.config.store.agentDeck;this.view=new Y.ViewPanel({windowEl:this.windowEl,getSide:()=>this.viewSide,getWidth:()=>t().viewerWidth||420,setWidth:e=>{t().viewerWidth=e},getRecentMax:()=>t().viewerRecentMax||12,getFollowMode:()=>(0,Z.followModeOf)(t().viewerPreload,t().viewerAutoOpen),cwdFor:e=>{var i;return this.notify.cwdOf(e)||(null===(i=this.cwdCache.get(e))||void 0===i?void 0:i.dir)||t().rootProfileCwd||null},touchedFor:e=>this.notify.touchedOf(e),commit:()=>this.zone.run(()=>this.config.save()),relayout:()=>this.relayout(),setOpen:e=>this.zone.run(()=>{t().viewerOpen=e,this.config.save()}),openExternal:e=>this.platform.openExternal(e),sendText:e=>{const t=this.app.activeTab,i=t?this.firstPane(t):null;return!(!i||!e||(this.sendToPane(i,"ref-paste",()=>i.sendInput(e)),0))}}),this.view.install(),this.view.setActiveTab(null!==(e=this.app.activeTab)&&void 0!==e?e:null),t().viewerOpen&&this.view.setOpen(!0,!1)}get viewSide(){return"left"===this.config.store.agentDeck.viewerDock?"left":"right"}touchCwd(e,t){var i,n;const o=Date.now(),a=this.cwdCache.get(e),s=this.notify.cwdOf(e);if(s)return void((null==a?void 0:a.dir)!==s&&(this.cwdCache.set(e,{dir:s,at:o,misses:0}),this.scheduleRender()));const r=(null==a?void 0:a.dir)?3e3:400;if(a&&o-a.at<r)return;const d=(null==a?void 0:a.dir)?0:(null!==(i=null==a?void 0:a.misses)&&void 0!==i?i:0)+1;this.cwdCache.set(e,{dir:null!==(n=null==a?void 0:a.dir)&&void 0!==n?n:null,at:o,misses:d});const l=t.session;(null==l?void 0:l.getWorkingDirectory)&&Promise.resolve(l.getWorkingDirectory()).then(t=>{t&&function(e){try{return c.statSync(e).isDirectory()}catch{return!1}}(t)&&(this.cwdCache.set(e,{dir:t,at:Date.now(),misses:0}),this.scheduleRender())}).catch(()=>{})}async openNewTab(){var e;if(this.syncSessionSlots(),!(this.pendingSessionOpens||this.sessionSlots.occupied+this.pendingSessionOpens>=U.JUMP_SLOTS)){this.pendingSessionOpens++;try{const t=this.config.store.terminal.profile,i=await this.profiles.getProfiles(),n=this.config.store.agentDeck,o=new Set((n.rootProfiles||[]).filter(e=>{var t;return null===(t=null==e?void 0:e.cwd)||void 0===t?void 0:t.trim()}).map(e=>e.id));n.rootProfile&&n.rootProfileCwd&&o.add(u.ROOT_PROFILE_ID);const a=i.filter(e=>o.has(e.id));let s=null!==(e=i.find(e=>e.id===t))&&void 0!==e?e:i[0];if(1===a.length)s=a[0];else if(a.length>1)try{s=await this.app.showSelector("ko"===this.sidebarLang?"작업 루트 선택":"Choose work root",a.map(e=>{var t;return{name:e.name,description:null===(t=e.options)||void 0===t?void 0:t.cwd,result:e}}))}catch{return}if(s){const e=s.options||{};await this.profiles.openNewTabForProfile({...s,options:{...e,env:(0,N.storageEnvironment)(e.env)}})}}finally{this.pendingSessionOpens--}}}openSettings(){this.app.openNewTabRaw({type:S.SettingsTabComponent})}scheduleRender(){if(this.renderQueued)return;this.renderQueued=!0;const e=()=>{this.renderQueued&&(this.renderQueued=!1,this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=null),this.render(),this.relayout())};requestAnimationFrame(e),this.renderTimer=setTimeout(e,50)}disableBackgroundThrottling(){var e,t,i,n,o;if(this.config.store.agentDeck.keepRenderingWhenHidden)try{const a=null!==(e=window.require)&&void 0!==e?e:globalThis.require,s=null===(i=null===(t=null==a?void 0:a("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===i?void 0:i.call(t);null===(o=null===(n=null==s?void 0:s.webContents)||void 0===n?void 0:n.setBackgroundThrottling)||void 0===o||o.call(n,!1)}catch{}}tick(){var e,t,i;if(!this.enabled)return;let n=!1;const o=this.config.store.agentDeck.idleAfterMs||2500,a=null!==(e=this.config.store.agentDeck.staleAfterMs)&&void 0!==e?e:3e5;for(const e of this.app.tabs){this.status.tickIdle(e,o,a)&&(n=!0);const s=this.notify.cwdOf(e);if(s&&(null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)!==s&&(this.cwdCache.set(e,{dir:s,at:Date.now(),misses:0}),n=!0),e===this.app.activeTab)try{const t=this.cwdCache.get(e);if(!(null==t?void 0:t.dir)&&(null!==(i=null==t?void 0:t.misses)&&void 0!==i?i:0)<20){const t=this.firstPane(e);t&&this.touchCwd(e,t)}}catch{}}this.syncLedger(),(n||this.config.store.agentDeck.showElapsed||!1!==this.config.store.agentDeck.subagentCount)&&this.render()}syncLedger(){var e,t;if(!1===this.config.store.agentDeck.resumeList)return;let i;try{i=this.notify.liveSessions()}catch{return}for(const[n,o]of i){if(!this.app.tabs.includes(o))continue;const i=this.status.get(o);this.ledger.note(n,{cwd:null!==(t=null===(e=this.cwdCache.get(o))||void 0===e?void 0:e.dir)&&void 0!==t?t:null,label:i.label,status:i.status})}}renderPlan(){const e=e=>this.status.get(e).status;this.syncSessionSlots();const t=[...this.app.tabs],i=le(this.searchQuery),n=i.length>0||!!this.statusFilter,o=n?t.filter(t=>this.tabMatchesFilter(t,i,e(t))):t;return{tabs:t,visible:o,groups:this.groupsFor(o),withHeads:!1,plan:[{key:null,label:W.UNGROUPED_LABEL,tabs:[...o]}],statusOf:e,filtering:n,collapseOf:e=>(0,W.resolveGroupCollapseFor)(e,this.config.store.agentDeck.collapsedGroups,n)}}render(){var e;if(this.refreshSidebarLanguage(),!this.listEl||!this.enabled||this.editing||(null===(e=this.drag)||void 0===e?void 0:e.moved)||this.listPointerActive)return;this.pruneNavFocus();const{tabs:t,visible:i,withHeads:n,plan:o,statusOf:a,filtering:s,collapseOf:r}=this.renderPlan();if(this.renderHeadCount(t,a),this.renderNow(),this.renderResumeDrawer(),this.listEl.innerHTML="",!s||i.length)for(const e of o){const t=n?r(e):{collapsed:!1,reason:"open"},i=t.collapsed;if(n&&this.listEl.appendChild(this.renderGroupHead(e,t)),!i)for(const t of e.tabs)this.listEl.appendChild(this.renderTab(t))}else this.listEl.appendChild(this.renderEmpty(t.length))}async showAccountPicker(){if(this.accountPopup)return this.accountPopup.remove(),void(this.accountPopup=null);const e=this.app.activeTab,t=this.notify.metaOf(e);if(!e||!t||"claude"!==t.agent&&"codex"!==t.agent)return;const i=t.agent,n=document.createElement("div");n.className="ad-account-picker",n.setAttribute("role","dialog"),n.setAttribute("aria-label",this.ui("{provider} 계정 선택",{provider:"claude"===i?"Claude":"Codex"}));const o=document.createElement("strong");o.textContent=this.ui("{provider} 계정",{provider:"claude"===i?"Claude":"Codex"});const a=document.createElement("button");a.type="button",a.textContent="×",a.className="ad-account-close",a.title=this.ui("닫기"),a.setAttribute("aria-label",this.ui("닫기"));const s=[],r=()=>{s.forEach(clearInterval),n.remove(),this.accountPopup===n&&(this.accountPopup=null)};a.onclick=r,n.addEventListener("keydown",e=>{"Escape"===e.key&&(e.stopPropagation(),r())}),n.append(o,a);const d=document.createElement("p");d.textContent=this.ui("현재 탭에서 선택한 계정으로 전환합니다."),n.appendChild(d);const l=document.createElement("p");l.setAttribute("role","status"),n.appendChild(l);const c=document.createElement("button");let u;c.type="button",c.className="ad-account-add",c.textContent="+",c.title=this.ui("계정 추가"),c.setAttribute("aria-label",this.ui("계정 추가")),n.appendChild(c),c.onclick=()=>{if(n.querySelector(".ad-account-form"))return;const t=document.createElement("form");t.className="ad-account-form";const o=document.createElement("label");o.textContent=this.ui("계정 이름 (선택)");const a=document.createElement("input");a.type="text",a.name="name",a.autocomplete="off",o.appendChild(a);const s=document.createElement("label");s.textContent=this.ui("계정 (이메일)");const d=document.createElement("input");d.type="email",d.name="account",d.autocomplete="username",d.required=!0,s.appendChild(d);const u=document.createElement("label");u.textContent=this.ui("비밀번호");const p=document.createElement("input");p.type="password",p.name="password",p.autocomplete="new-password",p.required=!0,u.appendChild(p);const h=document.createElement("p");h.className="ad-account-plaintext",h.textContent=this.ui("계정과 비밀번호가 이 PC에 평문으로 저장됩니다.");const g=document.createElement("p");g.setAttribute("role","alert");const f=document.createElement("button");f.type="submit",f.textContent=this.ui("저장");const m=document.createElement("button");m.type="button",m.textContent=this.ui("취소"),m.onclick=()=>{p.value="",t.remove(),c.focus()},t.append(o,s,u,h,g,f,m),t.onsubmit=t=>{if(t.preventDefault(),!this.accountSwitchBusy)try{(0,R.addAccount)(i,d.value,p.value,void 0,a.value),p.value="",r(),this.app.activeTab===e&&this.showAccountPicker()}catch(e){g.textContent=this.ui(e.message)}},n.insertBefore(t,l),a.focus()},document.body.appendChild(n),this.accountPopup=n,this.accountPopupTab=e,a.focus();try{u=(0,R.readAccounts)().filter(e=>e.provider===i)}catch(e){return void(l.textContent=this.ui(e.message))}if(u.length)for(const o of u){const a=document.createElement("button");a.type="button",a.className="ad-account-option";const d=document.createElement("strong"),c=t.account.toLowerCase()===o.id.toLowerCase();d.textContent=o.name+(c?this.ui(" · 현재 계정"):"");const u=document.createElement("span");u.className="ad-now-gauges",u.textContent=this.ui("잔량 조회 중…");const p=document.createElement("span");p.className="ad-account-email",p.textContent=o.id,a.append(d,p,u);const h=document.createElement("div");h.className="ad-account-row";const g=document.createElement("button");if(g.type="button",g.className="ad-account-remove",g.textContent=this.ui("목록에서 삭제"),g.setAttribute("aria-label",this.ui("목록에서 삭제")+": "+o.name),g.onclick=()=>{if(!this.accountSwitchBusy)try{(0,R.removeAccount)(o),r(),this.app.activeTab===e&&this.showAccountPicker()}catch(e){l.textContent=this.ui(e.message)}},h.append(a,g),n.appendChild(h),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.id)){u.textContent=this.ui("이메일 주소 전체를 입력하세요."),a.disabled=!0;continue}try{(0,R.prepareAccount)(o,t.configDir||void 0)}catch{u.textContent=this.ui("계정 저장 폴더를 준비하지 못했습니다."),a.disabled=!0;continue}(0,M.registerAccountSource)(o,t.configDir);const f=()=>{if(n.isConnected)if((0,$.accountRefreshState)((0,R.accountHome)(o)).blocked)u.textContent="ko"===this.sidebarLang?"재로그인 필요 · 자동 점검 중단":"Sign in again · automatic checks stopped";else{for(const e of this.app.tabs.map(e=>this.notify.metaOf(e)).filter(Boolean))(0,M.recordAccountUsage)(o,e);(0,M.getAccountQuotas)(o).then(e=>{var t,i,o;if(!n.isConnected)return;const a=e.values,s={};for(const e of a){if(void 0===e.remaining)continue;const t=100-e.remaining;"5시간"===e.label?(s.fiveHourPct=t,s.fiveHourResetsAt=e.resetsAt):"주간"===e.label?(s.sevenDayPct=t,s.sevenDayResetsAt=e.resetsAt):(s.scopedName=e.label,s.scopedPct=t,s.scopedResetsAt=e.resetsAt)}const r=(null===(t=(0,I.formatMeta)({model:"account",limits:s},Date.now()))||void 0===t?void 0:t.gauges)||[];this.renderMetaGauges(u,r);for(const e of a.filter(e=>void 0===e.remaining&&e.status)){const t=document.createElement("span");t.className="ad-now-reset";const n=null!==(i=m.RESET_COPY[this.sidebarLang])&&void 0!==i?i:m.RESET_COPY.en;t.textContent=`${e.label.toLowerCase()} · ${n["사용 가능"===e.status?3:4]}`,u.appendChild(t),u.hidden=!1}if(a.length||(u.hidden=!1,u.textContent=this.ui("사용량 정보 없음")),e.stale){const t=document.createElement("span");t.className="ad-now-reset",t.textContent="⏱ "+new Date(e.ts).toLocaleString((null===(o=this.locale)||void 0===o?void 0:o.getLocale())||void 0),u.appendChild(t)}},e=>{u.textContent="ko"===this.sidebarLang?e.message:this.ui("사용량 정보 없음")})}else s.forEach(clearInterval)};f(),s.push(setInterval(f,6e4)),a.onclick=async()=>{if(!this.accountSwitchBusy)if(this.app.tabs.includes(e))if(!c||(0,$.accountRefreshState)((0,R.accountHome)(o)).blocked){this.accountSwitchBusy=!0,n.querySelectorAll(".ad-account-option").forEach(e=>{e.disabled=!0});try{l.textContent=this.ui("{name} 인증 확인 중…",{name:o.name});try{await(0,M.ensureAccountSession)(o)}catch(e){if(!(e instanceof R.AccountRequestError)||"auth"!==e.kind)throw e;l.textContent=this.ui("{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.",{name:o.name}),await(0,R.loginAccount)(o,L.openAccountBrowser)}if(await(0,M.ensureAccountSession)(o),!this.app.tabs.includes(e))return void(l.textContent=this.ui("인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다."));const n=this.notify.metaOf(e)||t;let a=(0,J.resumeCommand)(n.sessionId,!1,i);a||(a=i),"codex"===i&&(a=a.replace(/^codex(?: |$)/,"codex -c 'cli_auth_credentials_store=\"file\"' ")),await this.switchAccountInTab(e,o,a,n.cwd),r()}catch(e){l.textContent="ko"===this.sidebarLang&&e.message?e.message:this.ui("계정 전환에 실패했습니다. 다시 선택하세요.")}finally{this.accountSwitchBusy=!1,n.querySelectorAll(".ad-account-option").forEach(e=>{e.disabled=!1})}}else r();else l.textContent=this.ui("원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.")}}else l.textContent=this.ui("+ 버튼으로 계정을 추가하세요.")}async switchAccountInTab(e,t,i,n){var o,a,s,r,d,l,c;const u=this.firstPane(e);if(!u||"local"!==(null===(o=u.profile)||void 0===o?void 0:o.type)||"function"!=typeof u.initializeSession||!u.session)throw new Error(this.ui("계정 전환에 실패했습니다. 다시 선택하세요."));const p=(await this.profiles.getProfiles()).find(e=>e.id===this.config.store.terminal.profile)||u.profile;if(!this.app.tabs.includes(e)||"local"!==p.type)throw new Error(this.ui("계정 전환에 실패했습니다. 다시 선택하세요."));const h={...p.options,cwd:n||(null===(a=u.profile.options)||void 0===a?void 0:a.cwd),env:{...null===(s=p.options)||void 0===s?void 0:s.env,...null===(r=u.profile.options)||void 0===r?void 0:r.env,["claude"===t.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]:(0,R.accountHome)(t)}};delete h.restoreFromPTYID;for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY","CLAUDECODE"])h.env[e]="";const g=u.session;u.setSession(null),await g.destroy(),this.app.tabs.includes(e)&&(u.profile={...u.profile,options:h},u.sessionOptions=h,null===(l=null===(d=u.frontend)||void 0===d?void 0:d.xterm)||void 0===l||l.reset(),u.initializeSession(u.size.columns,u.size.rows),this.notify.setAccountHome(e,t.provider,(0,R.accountHome)(t),t.id),this.sendResumeCommand(e,i,u.session),null===(c=u.session)||void 0===c||c.releaseInitialDataBuffer(),this.diag("account switched in existing tab"))}renderNow(){var e;this.accountPopup&&this.accountPopupTab!==this.app.activeTab&&(this.accountPopup.remove(),this.accountPopup=null,this.accountPopupTab=null);const t=this.nowEl;if(!t)return;const i=this.notify.metaOf(this.app.activeTab),n=!1===this.config.store.agentDeck.metaLine?null:(0,I.formatMeta)(i,Date.now());if(!n)return void(t.hidden=!0);t.hidden=!1,t.title=[n.title,n.account?this.ui("계정: {value}",{value:n.account+((null==i?void 0:i.org)?` (${i.org})`:"")}):"",(null==i?void 0:i.version)?this.ui("버전: {value}",{value:i.version}):"",(null==i?void 0:i.cwd)?this.ui("폴더: {value}",{value:i.cwd}):"",...n.gauges.map(e=>e.text+(e.resetText?" — "+(0,m.sidebarReset)(e.resetText,this.sidebarLang):""))].filter(Boolean).join("\n"),t.querySelector(".ad-now-title").textContent=n.title;const o=t.querySelector(".ad-now-account"),a=null===(e=this.notify.metaOf(this.app.activeTab))||void 0===e?void 0:e.agent,s="claude"===a||"codex"===a;o.textContent=n.account||this.ui("계정 선택"),o.hidden=!n.account&&!s,o.disabled=!s,o.onclick=()=>{this.showAccountPicker()};const r=t.querySelector(".ad-now-gauges");this.renderMetaGauges(r,n.gauges)}renderMetaGauges(e,t){e.innerHTML="";for(let i=0;i<t.length;i++){const n=t[i],o=document.createElement("div");o.className=`ad-now-gauge ad-now-${n.level}`,o.title=n.resetText?`${n.text} — ${(0,m.sidebarReset)(n.resetText,this.sidebarLang)}`:n.text;const a=document.createElement("span");a.className="ad-now-gauge-key",a.textContent=n.key;const s=document.createElement("span");s.className="ad-now-bar";const r=document.createElement("span");r.className="ad-now-bar-fill",r.style.width=n.pct+"%",s.appendChild(r);const d=document.createElement("span");d.className="ad-now-gauge-pct",d.textContent=n.pct+"%",o.appendChild(a),o.appendChild(s),o.appendChild(d),e.appendChild(o);const l=t[i+1];if(n.resetLine&&(!l||l.resetLine!==n.resetLine)){const t=document.createElement("div");t.className="ad-now-reset",t.textContent=(0,m.sidebarReset)(n.resetLine,this.sidebarLang),e.appendChild(t)}}e.hidden=!t.length}renderResumeDrawer(){const e=this.resumeEl;if(!e)return;const t=this.config.store.agentDeck;if(!1===t.resumeList)return void(e.hidden=!0);this.ledger.refresh();const i=(0,J.resumeRowsFor)(this.ledger.records(),{groupKeys:null,keyOf:e=>(0,W.groupKeyOf)(e,K.projectRootOf),fold:W.foldGroupKey,live:this.liveSessionIds(),days:Number(t.resumeListDays)||0,limit:Number(t.resumeListLimit)||0,hidden:new Set(Array.isArray(t.resumeHidden)?t.resumeHidden:[]),now:Date.now()}),n=i;e.hidden=!1;const o=this.isResumeExpanded(null);e.classList.toggle("expanded",o);const a=e.querySelector(".ad-resume-head");this.fillResumeHead(a,n.length,i.length,o);const s=e.querySelector(".ad-resume-rows");if(this.historySearchPanel||(this.historySearchPanel=new V.SessionSearchPanel({sources:()=>this.ledger.historySources(),korean:()=>"ko"===this.sidebarLang,searchLabel:()=>this.ui("세션 검색 (제목 · 작업이름 · 폴더)"),changed:()=>this.renderResumeDrawer(),resume:e=>{e.openTabId=this.liveSessionIds().get(e.sessionId)||null,this.zone.run(()=>this.activateResume(e,!1))}})),this.historySearchPanel.element.parentElement!==e&&e.insertBefore(this.historySearchPanel.element,s),this.historySearchPanel.update(o),s.innerHTML="",s.hidden=!o||this.historySearchPanel.active,!s.hidden){for(const e of n)s.appendChild(this.renderResumeRow(e));if(!n.length){const e=document.createElement("div");e.className="ad-resume-empty",e.textContent=this.ui("검색어와 맞는 지난 세션이 없다"),s.appendChild(e)}}}liveSessionIds(){var e;this.resumeTabs.clear();const t=new Map;let i;try{i=this.notify.liveSessions()}catch{return t}for(const[e,n]of i)this.app.tabs.includes(n)&&(t.set(e,e),this.resumeTabs.set(e,n));for(const[i,n]of null!==(e=this.resumeStarting)&&void 0!==e?e:[])this.app.tabs.includes(n)&&(t.has(i)||(t.set(i,i),this.resumeTabs.set(i,n)));return t}isResumeExpanded(e){const t=this.config.store.agentDeck.resumeExpanded;if(!Array.isArray(t))return!1;const i=(0,W.collapseIdOf)(e);return t.some(e=>"string"==typeof e&&(0,W.foldGroupKey)(e)===(0,W.foldGroupKey)(i))}toggleResumeExpanded(e){const t=this.config.store.agentDeck,i=(0,W.collapseIdOf)(e),n=Array.isArray(t.resumeExpanded)?t.resumeExpanded.filter(e=>"string"==typeof e):[],o=n.filter(e=>(0,W.foldGroupKey)(e)!==(0,W.foldGroupKey)(i));t.resumeExpanded=o.length===n.length?[...n,i]:o,this.config.save(),this.render()}fillResumeHead(e,t,i,n){e.firstChild||(e.innerHTML=['<span class="ad-resume-glyph">⟲</span>','<span class="ad-group-label"></span>','<span class="ad-group-count"></span>','<span class="ad-group-caret"></span>'].join(""),e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggleResumeExpanded(null)})),e.classList.toggle("collapsed",!n),e.querySelector(".ad-group-label").textContent=this.ui("지난 세션"),e.querySelector(".ad-group-count").textContent=t===i?String(i):`${t}/${i}`,e.querySelector(".ad-group-caret").textContent=n?"▾":"▴",e.title=this.ui("닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다")}renderResumeRow(e){var t;const i=document.createElement("div");i.className="ad-resume"+(e.openTabId?" open":""),i.innerHTML=['<div class="ad-bar"></div>','<div class="ad-body">',' <div class="ad-title"></div>',' <div class="ad-meta">',' <span class="re-was"></span>',' <span class="re-when"></span>'," </div>","</div>"].join("\n");const n=e.label||this.ui("세션 {id}",{id:e.sessionId.slice(0,8)}),o=i.querySelector(".ad-title");o.textContent=n,this.decorateAgent(o,(0,T.profileFor)(null!==(t=e.agent)&&void 0!==t?t:"claude"));const a=i.querySelector(".re-was");if(e.openTabId)a.textContent=this.ui("● 열림"),a.className="re-was live";else{const t=O.STATUS_STYLES[e.lastStatus];a.textContent=t?this.ui(t.label):"",a.className="re-was"+(e.lastStatus?" s-"+e.lastStatus:"")}return a.textContent=`${"codex"===e.agent?"Codex":"Claude"} · ${a.textContent||this.ui("지난 세션")}`,i.querySelector(".re-when").textContent=this.ui((0,J.formatWhen)(e.lastSeen,Date.now())),i.title=n+"\n"+(e.openTabId?this.ui("이미 열려 있다 — 누르면 그 탭으로 이동"):this.ui("누르면 새 탭에서 이어받는다 ({id})",{id:e.sessionId})+"\n"+this.ui("작업 폴더: {cwd}",{cwd:e.cwd||this.ui("모름")})+"\n"+this.ui("※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다")),i.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>{this.activateResume(e,!1)})}),i.addEventListener("contextmenu",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>this.showResumeMenu(e,t))}),i}renderEmpty(e){const t=document.createElement("div");t.className="ad-empty";const i=[],n=this.searchQuery.trim();return n&&i.push('"'+n+'"'),this.statusFilter&&i.push(this.ui(O.STATUS_STYLES[this.statusFilter].label)),t.textContent=this.ui("{filter}에 걸리는 세션이 없다 (전체 {total}개)",{filter:i.join(" · "),total:e}),t.title=this.ui("Esc 또는 ✕ 로 전체 목록으로 돌아간다"),t}groupsFor(e){return(0,W.groupTabs)(e,e=>{var t,i;return null!==(i=null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)&&void 0!==i?i:null},e=>(0,K.projectRootOf)(e,()=>this.scheduleRender()))}collapsedKeys(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.map(e=>(0,W.foldGroupKey)(String(e))):[]}isGroupCollapsed(e){return(0,W.isStoredCollapsed)(e,this.config.store.agentDeck.collapsedGroups)}toggleGroup(e){const t=(0,W.collapseIdOf)(e),i=this.collapsedKeys(),n=i.filter(e=>e!==t);n.length===i.length&&n.push(t),this.zone.run(()=>{this.config.store.agentDeck.collapsedGroups=n,this.config.save()}),this.render()}renderGroupHead(e,t){const i=t.collapsed,n=document.createElement("div");n.className=i?"ad-group-head collapsed":"filter-open"===t.reason?"ad-group-head filter-open":"ad-group-head",n.innerHTML=['<span class="ad-group-caret"></span>','<span class="ad-group-label"></span>','<span class="ad-group-count"></span>'].join("");const o=n.querySelector(".ad-group-caret"),a=n.querySelector(".ad-group-label"),s=n.querySelector(".ad-group-count");o.textContent=i?"▸":"▾",a.textContent=null===e.key?this.ui(W.UNGROUPED_LABEL):e.label,s.textContent=String(e.tabs.length);const r="filter-open"===t.reason?this.ui(" · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)"):"";return n.title=(e.key?this.ui("{folder} (탭 {count}개) — 클릭하면 접기/펴기",{folder:e.key,count:e.tabs.length}):this.ui("작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기",{count:e.tabs.length}))+r,this.isNavFocused({kind:"head",key:e.key})&&n.classList.add("ad-nav-focus"),n.addEventListener("click",()=>this.toggleGroup(e.key)),n}renderHeadCount(e,t){const i=this.sidebar.querySelector(".ad-head-count");if(!i)return;i.innerHTML="",i.title=this.ui("탭 {count}개",{count:e.length});const n=this.statusFilter,o=(0,q.countByStatus)(e,t);n&&!o.some(e=>e.status===n)&&(o.push({status:n,count:0}),o.sort((e,t)=>(0,q.statusRank)(e.status)-(0,q.statusRank)(t.status)));for(const{status:e,count:t}of o){const o=O.STATUS_STYLES[e],a=document.createElement("span");a.className=e===n?"ad-cnt active":"ad-cnt",a.style.setProperty("--ad-color",o.color),a.title=e===n?this.ui("{status} {count} — 클릭하면 필터 해제",{status:this.ui(o.label),count:t}):this.ui("{status} {count} — 클릭하면 이 상태만",{status:this.ui(o.label),count:t}),a.textContent=`${o.icon} ${t}`,a.addEventListener("pointerdown",e=>e.stopPropagation()),a.addEventListener("click",t=>{t.stopPropagation(),this.toggleStatusFilter(e)}),i.appendChild(a)}e.length||(i.textContent="0")}decorateAgent(e,t){if(!e||!(null==t?void 0:t.icon))return;const i=document.createElement("span");i.className="ad-agent",i.title=t.label,i.innerHTML=t.icon,e.insertAdjacentElement("afterbegin",i)}renderTab(e){const t=this.status.get(e),i=O.STATUS_STYLES[t.status],n=e===this.app.activeTab,o=document.createElement("div");o.className=n?"ad-tab active":"ad-tab",o.style.setProperty("--ad-color",i.color),o.dataset.adIndex=String(this.app.tabs.indexOf(e));const a=this.identityOf(e);o.dataset.adIdentity=a.alias,this.isNavFocused({kind:"tab",tab:e})&&o.classList.add("ad-nav-focus");const s=(0,D.stripTitleMarker)(e.customTitle||e.title||"")||this.ui("(제목 없음)"),r=this.config.store.agentDeck.showElapsed?this.formatElapsed(Date.now()-t.since):"";o.innerHTML=['<div class="ad-bar"></div>','<div class="ad-body">',' <div class="ad-title"></div>',' <div class="ad-prompt"><span class="ad-label"></span></div>',' <div class="ad-meta">',' <span class="ad-identity"></span>',' <span class="ad-badge"></span>',' <span class="ad-elapsed"></span>'," </div>","</div>",this.uiMarkup('<button class="ad-close" title="탭 닫기">&times;</button>')].join("\n");const d=o.querySelector(".ad-title");d.textContent=s,d.title=s;const l=o.querySelector(".ad-identity");l.textContent=a.alias||"별명 준비 중",l.hidden=!a.id,l.title="다른 탭에서 부르는 고정 별명 (작업 기준 자동 배정)",l.addEventListener("dblclick",e=>e.stopPropagation()),this.decorateAgent(d,this.profileForTab(e));const c=o.querySelector(".ad-label");c.textContent=t.label||"—",c.classList.toggle("empty",!t.label),o.querySelector(".ad-elapsed").textContent=r;const u=o.querySelector(".ad-badge"),p=(0,m.sidebarReason)(t.reason,this.sidebarLang);u.textContent=i.icon+" "+this.ui(i.label)+(p?" · "+p:""),u.title=p,t.pinned&&u.classList.add("pinned");const h=this.notify.subagentsOf(e);if(h){const e=document.createElement("span");e.className="ad-subagents",e.textContent=`❖${h.running}`,h.tooltip&&(e.title=h.tooltip),u.insertAdjacentElement("afterend",e)}return o.addEventListener("pointerdown",t=>this.armRowDrag(t,e,o)),o.addEventListener("click",t=>{t.target.closest(".ad-close")||(this.dragClickGuard?this.dragClickGuard=!1:(this.navFocus={kind:"tab",tab:e},this.zone.run(()=>this.app.selectTab(e))))}),o.addEventListener("dblclick",t=>{t.preventDefault(),this.startLabelEdit(o,e)}),o.addEventListener("contextmenu",t=>{t.preventDefault(),this.showStatusMenu(t,e)}),o.querySelector(".ad-close").addEventListener("click",t=>{t.stopPropagation(),this.zone.run(()=>{this.app.closeTab(e,!0)})}),o}get navMode(){const e=document.activeElement;return e&&e===this.searchEl?"search":e&&e===this.listEl?"list":"off"}get navReady(){return!!this.listEl&&this.enabled&&!1!==this.config.store.agentDeck.keyboardNav}navSearchVisible(){return!!this.searchEl&&this.enabled&&!1!==this.config.store.agentDeck.searchBox}navPlan(){const{withHeads:e,plan:t,collapseOf:i}=this.renderPlan(),n=(0,U.navRowsOf)(t.map(t=>({key:t.key,tabs:t.tabs,head:e,collapsed:e&&i(t).collapsed})));return{rows:n,index:this.navIndexIn(n)}}sameNavRow(e,t){return"tab"===e.kind&&"tab"===t.kind?e.tab===t.tab:"head"===e.kind&&"head"===t.kind&&(0,W.collapseIdOf)(e.key)===(0,W.collapseIdOf)(t.key)}navIndexIn(e){const t=this.navFocus;if(!t)return-1;for(let i=0;i<e.length;i++)if(this.sameNavRow(e[i],t))return i;return-1}isNavFocused(e){return"list"===this.navMode&&!!this.navFocus&&this.sameNavRow(e,this.navFocus)}pruneNavFocus(){const e=this.navFocus;e&&"tab"===e.kind&&!this.app.tabs.includes(e.tab)&&(this.navFocus=null)}focusList(e="keep"){if(!this.navReady)return!1;const{rows:t,index:i}=this.navPlan();return!!t.length&&("last"===e?this.navFocus=t[t.length-1]:("first"===e||i<0)&&(this.navFocus=t[0]),this.listEl.tabIndex=-1,this.listEl.focus({preventScroll:!0}),this.render(),this.scrollNavIntoView(),!0)}focusSearch(){if(!this.navSearchVisible())return!1;this.searchEl.focus();try{const e=this.searchEl.value.length;this.searchEl.setSelectionRange(e,e)}catch{}return this.render(),!0}releaseKeyboard(){var e,t,i;const n=document.activeElement;n!==this.listEl&&n!==this.searchEl||n.blur();const o=this.focusedPane();"function"==typeof(null===(e=null==o?void 0:o.frontend)||void 0===e?void 0:e.focus)?o.frontend.focus():null===(i=null===(t=this.app.activeTab)||void 0===t?void 0:t.emitFocused)||void 0===i||i.call(t),this.render()}moveNav(e,t){if(!this.navReady)return;const{rows:i,index:n}=this.navPlan();if(!i.length)return void(this.navFocus=null);if(!t&&e<0&&0===n&&this.navSearchVisible())return void this.focusSearch();const o=!!this.config.store.agentDeck.keyboardNavWrap,a="first"===t?0:"last"===t?i.length-1:(0,U.stepNavIndex)(i.length,n,e,o);a<0||(this.navFocus=i[a],this.render(),this.scrollNavIntoView())}activateNav(){const e=this.navFocus;if(e)return"head"===e.kind?(this.toggleGroup(e.key),void this.scrollNavIntoView()):void(this.app.tabs.includes(e.tab)&&(this.zone.run(()=>this.app.selectTab(e.tab)),this.releaseKeyboard()))}jumpToRow(e){if(!this.navReady||!Number.isInteger(e)||e<1||e>U.JUMP_SLOTS)return;const t=(0,U.pickJumpTarget)(this.navPlan().rows,e);t&&this.app.tabs.includes(t)&&(this.navFocus={kind:"tab",tab:t},this.zone.run(()=>this.app.selectTab(t)),this.diag(`jump slot=${e}`))}navEscape(){this.searchQuery.trim()||this.statusFilter?this.clearFilters():this.releaseKeyboard()}toggleKeyboardNav(){this.navReady&&("off"===this.navMode?this.focusList("keep")||this.focusSearch():this.releaseKeyboard())}scrollNavIntoView(){var e;const t=null===(e=this.listEl)||void 0===e?void 0:e.querySelector(".ad-nav-focus");null==t||t.scrollIntoView({block:"nearest",inline:"nearest"})}wireListKeys(e){e.addEventListener("keydown",e=>{if(!this.navReady)return;if(e.ctrlKey||e.altKey||e.metaKey)return;const t=e.key,i=e.code,n=()=>{e.preventDefault(),e.stopPropagation()};if("ArrowDown"===t||"ArrowDown"===i)return n(),void this.moveNav(1);if("ArrowUp"===t||"ArrowUp"===i)return n(),void this.moveNav(-1);if("Home"===t||"Home"===i)return n(),void this.moveNav(0,"first");if("End"===t||"End"===i)return n(),void this.moveNav(0,"last");if("Enter"===t||"Enter"===i||"NumpadEnter"===i){if(e.isComposing||229===e.keyCode)return;return n(),void this.activateNav()}return"Escape"===t||"Escape"===i?(n(),void this.navEscape()):"Tab"===t||"Tab"===i?(n(),void this.focusSearch()):void 0}),e.addEventListener("focus",()=>this.scheduleRender()),e.addEventListener("blur",()=>this.scheduleRender())}armRowDrag(e,t,i){if(this.dragClickGuard=!1,0!==e.button||this.drag||this.editing)return;if(e.target.closest("button, input"))return;const n=e=>this.dragMove(e),o=e=>this.endRowDrag(!0,e),a=()=>this.endRowDrag(!1,void 0,"cancel"),s=e=>{"Escape"!==e.key&&"Escape"!==e.code||(e.preventDefault(),e.stopPropagation(),this.endRowDrag(!1,void 0,"esc"))};document.addEventListener("pointermove",n,!0),document.addEventListener("pointerup",o,!0),document.addEventListener("pointercancel",a,!0),document.addEventListener("keydown",s,!0),this.drag={tab:t,row:i,from:{x:e.clientX,y:e.clientY},at:{x:e.clientX,y:e.clientY},moved:!1,target:null,line:null,scrolled:{px:0,axis:null},scroll:null,detach:()=>{document.removeEventListener("pointermove",n,!0),document.removeEventListener("pointerup",o,!0),document.removeEventListener("pointercancel",a,!0),document.removeEventListener("keydown",s,!0)}}}dragMove(e){const t=this.drag;if(t){if(!t.moved){if(Math.hypot(e.clientX-t.from.x,e.clientY-t.from.y)<5)return;t.moved=!0,t.row.classList.add("ad-dragging"),document.body.classList.add("ad-reordering")}e.preventDefault(),t.at={x:e.clientX,y:e.clientY},this.refreshDropTarget(),this.armDragScroll()}}refreshDropTarget(){const e=this.drag;e&&(e.target=this.dropTargetAt(e.at.x,e.at.y),this.drawReorderLine())}listScrollAxis(){const e=this.listEl;if(!e)return null;const t=e.scrollHeight-e.clientHeight>1,i=e.scrollWidth-e.clientWidth>1;return t&&i?this.listFlowsSideways()?"x":"y":t?"y":i?"x":null}dragScrollSpeed(e){const t=this.listEl,i=this.drag;if(!t||!i)return 0;const n=t.getBoundingClientRect(),o="y"===e;return(0,q.planEdgeScroll)({pos:o?i.at.y:i.at.x,near:o?n.top:n.left,far:o?n.bottom:n.right,cur:o?t.scrollTop:t.scrollLeft,maxScroll:o?t.scrollHeight-t.clientHeight:t.scrollWidth-t.clientWidth,bandPx:32,minPps:150,maxPps:800})}armDragScroll(){const e=this.drag;if(!e||!e.moved)return;if(!this.config.store.agentDeck.dragAutoScroll)return;const t=this.listScrollAxis();if((!t||e.scroll&&e.scroll.axis!==t)&&(this.stopDragScroll(e),!t))return;if(!this.dragScrollSpeed(t))return void this.stopDragScroll(e);if(e.scroll)return;const i={raf:0,prev:performance.now(),axis:t};e.scroll=i,e.scrolled.axis=t,i.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}dragScrollTick(e){const t=this.drag,i=this.listEl;if(!(t&&t.scroll&&t.moved&&i))return;const n=t.scroll,o=this.dragScrollSpeed(n.axis);if(!o)return void this.stopDragScroll(t);const a=Math.min(50,Math.max(0,e-n.prev));n.prev=e;const s=o*a/1e3,r="y"===n.axis?i.scrollTop:i.scrollLeft;"y"===n.axis?i.scrollTop=r+s:i.scrollLeft=r+s,t.scrolled.px+=Math.abs(("y"===n.axis?i.scrollTop:i.scrollLeft)-r),this.refreshDropTarget(),n.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}stopDragScroll(e){e.scroll&&(cancelAnimationFrame(e.scroll.raf),e.scroll=null)}dropTargetAt(e,t){const i=e=>(this.dropReject=e,null),n=this.drag;if(!n||!this.listEl)return i("gone");const o=this.listEl.getBoundingClientRect();if(e<o.left||e>o.right||t<o.top||t>o.bottom)return i("outside-list");const{withHeads:a,plan:s}=this.renderPlan(),r=s.find(e=>e.tabs.includes(n.tab));if(!r||!this.app.tabs.includes(n.tab))return i("gone");const d=document.elementFromPoint(e,t),l=null==d?void 0:d.closest(".ad-tab");if(!l){if(a||(null==d?void 0:d.closest(".ad-list"))!==this.listEl)return i("no-row");const e=r.tabs[r.tabs.length-1];return e&&e!==n.tab?(this.dropReject=null,{tab:e,place:"after"}):i("self")}const c=this.app.tabs[Number(l.dataset.adIndex)];if(!c)return i("gone");if(c===n.tab)return i("self");if(!r.tabs.includes(c))return i("other-group");if(this.rowElOf(c)!==l)return i("stale-index");const u=l.getBoundingClientRect(),p=this.listFlowsSideways()?e>(u.left+u.right)/2:t>(u.top+u.bottom)/2;return this.dropReject=null,{tab:c,place:p?"after":"before"}}listFlowsSideways(){return!(0,B.isHorizontalDock)(this.dockSide)}drawReorderLine(){var e;const t=this.drag;if(!t||!this.listEl)return;if(!t.target)return null===(e=t.line)||void 0===e||e.remove(),void(t.line=null);const i=this.rowElOf(t.target.tab);if(!i)return;if(!t.line){const e=document.createElement("div");e.className="ad-reorder-line",document.body.appendChild(e),t.line=e}const n=i.getBoundingClientRect(),o=this.listEl.getBoundingClientRect(),a=t.line.style,s=(e,t,i)=>Math.min(Math.max(e,t),i);if(this.listFlowsSideways()){const e="after"===t.target.place?n.right:n.left;a.left=Math.round(s(e,o.left,o.right)-1)+"px";const i=s(n.top,o.top,o.bottom),r=s(n.bottom,o.top,o.bottom);a.top=Math.round(i)+"px",a.width="2px",a.height=Math.max(1,Math.round(r-i))+"px"}else{const e="after"===t.target.place?n.bottom:n.top,i=s(n.left,o.left,o.right),r=s(n.right,o.left,o.right);a.left=Math.round(i)+"px",a.top=Math.round(s(e,o.top,o.bottom)-1)+"px",a.width=Math.max(1,Math.round(r-i))+"px",a.height="2px"}}rowElOf(e){const t=this.app.tabs.indexOf(e);return t<0||!this.listEl?null:this.listEl.querySelector(`.ad-tab[data-ad-index="${t}"]`)}endRowDrag(e,t,i){var n;const o=this.drag;if(!o)return;this.dropReject=null,e&&o.moved&&t&&(o.target=this.dropTargetAt(t.clientX,t.clientY));const a=o.moved,s=e&&a?o.target:null;this.drag=null,this.stopDragScroll(o),o.detach(),null===(n=o.line)||void 0===n||n.remove(),o.row.classList.remove("ad-dragging"),document.body.classList.remove("ad-reordering");const r=e=>{this.lastDragEnd={reason:e,drop:this.dropReject,committed:"moved"===e,at:Date.now(),scrolled:{px:Math.round(o.scrolled.px),axis:o.scrolled.axis}}};a?(this.dragClickGuard=!0,r(null!=i?i:s?"moved":"no-target"),s&&this.applyReorder(o.tab,s.tab,s.place),this.render()):r(null!=i?i:"below-threshold")}applyReorder(e,t,i){const n=this.app.tabs,o=n.indexOf(e),a=n.indexOf(t),s=(0,q.planTabMove)(n.length,o,a,i);if(!s)return!1;const r=s.map(e=>n[e]);return this.zone.run(()=>{for(let e=0;e<r.length;e++)n[e]=r[e];this.app.emitTabsChanged()}),this.diag(`reorder ${o} -> ${a} ${i} order=${s.join(",")}`),!0}noteReorderBlocked(){var e;if(!this.sidebar)return;null===(e=this.sidebar.querySelector(".ad-reorder-note"))||void 0===e||e.remove();const t=document.createElement("div");t.className="ad-reorder-note",t.textContent=this.ui("상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다"),this.sidebar.appendChild(t),setTimeout(()=>t.remove(),2600)}startLabelEdit(e,t){this.editing=t;const i=e.querySelector(".ad-label"),n=document.createElement("input");n.className="ad-label-input",n.value=this.status.get(t).label,n.placeholder=this.ui("작업 이름"),i.replaceWith(n),n.focus(),n.select();const o=e=>{this.editing===t&&(this.editing=null,e&&this.status.setLabel(t,n.value.trim()),this.render())};n.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key&&o(!0),"Escape"===e.key&&o(!1)}),n.addEventListener("blur",()=>o(!0))}async activateResume(e,t){var i,n;if(!t&&this.liveSessionIds&&(e={...e,openTabId:this.liveSessionIds().get(e.sessionId)||null}),e.openTabId){const t=this.resumeTabs.get(e.openTabId);if(t&&this.app.tabs.includes(t))return void this.app.selectTab(t)}const o=(0,J.resumeCommand)(e.sessionId,t,e.agent);if(!o)return void this.diag(`resume 거부 sid=${e.sessionId}`);const a=null!==(i=this.resumeOpening)&&void 0!==i?i:this.resumeOpening=new Set,s=`${null!==(n=e.agent)&&void 0!==n?n:"claude"}:${t?"fork":"resume"}:${e.sessionId}`;if(!a.has(s)){a.add(s);try{const i=await this.openResumeTab(e,o);i&&!t&&this.trackResumeStart(e.sessionId,i)}finally{a.delete(s)}}}trackResumeStart(e,t){var i;t=null!==(i=this.app.tabs.find(e=>{var i,n;return e===t||(null===(n=(i=e).getAllTabs)||void 0===n?void 0:n.call(i).includes(t))}))&&void 0!==i?i:t,this.resumeStarting.set(e,t);let n=null,o=null,a="";const s=()=>{var i;clearInterval(r),null===(i=null==n?void 0:n.unsubscribe)||void 0===i||i.call(n),this.resumeStarting.get(e)===t&&this.resumeStarting.delete(e)},r=setInterval(()=>{var i,r;if(!this.app.tabs.includes(t)||this.notify.liveSessions().has(e))return void s();const d=null===(i=this.firstPane(t))||void 0===i?void 0:i.session;!o||o===d&&o.open?!o&&(null==d?void 0:d.open)&&(o=d,n=null===(r=o.output$)||void 0===r?void 0:r.subscribe(e=>{a=(a+e).slice(-4096),/thread-store conflict:|failed to (?:create|resume|load) session|no (?:saved )?session found|is not recognized as|command not found/i.test(a)&&s()})):s()},100)}async openResumeTab(e,t,i){var n,o,a,s,r,d;if(this.syncSessionSlots(),!(this.sessionSlots.occupied+this.pendingSessionOpens>=U.JUMP_SLOTS)){this.pendingSessionOpens++;try{const l=this.config.store.terminal.profile,c=await this.profiles.getProfiles(),u=null!==(n=c.find(e=>e.id===l))&&void 0!==n?n:c[0];if(!u)return void this.diag("resume 프로필 없음");const p={...u,options:{...u.options,cwd:e.cwd||(null===(o=u.options)||void 0===o?void 0:o.cwd),env:(0,N.storageEnvironment)(null===(a=u.options)||void 0===a?void 0:a.env)}};if(i){p.options.env={...null===(s=u.options)||void 0===s?void 0:s.env,["claude"===i.provider?"CLAUDE_CONFIG_DIR":"CODEX_HOME"]:(0,R.accountHome)(i)};for(const e of["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","OPENAI_API_KEY","CODEX_API_KEY"])p.options.env[e]=""}const h=await this.profiles.openNewTabForProfile(p);if(this.diag(`resume 탭 sid=${e.sessionId.slice(0,8)} cwd=${null!==(d=null===(r=p.options)||void 0===r?void 0:r.cwd)&&void 0!==d?d:"?"} tab=${h?"yes":"null"}`),!h){if(i)throw new Error(this.ui("새 계정 탭을 열지 못했습니다."));return}return i&&this.notify.setAccountHome(h,i.provider,(0,R.accountHome)(i),i.id),e.label&&this.status.setLabel(h,e.label),this.sendResumeCommand(h,t),h}catch(e){if(i)throw new Error(this.ui("새 계정 탭을 열지 못했습니다."));(0,X.diagCatch)("resume 탭 열기",e)}finally{this.pendingSessionOpens--}}}sendResumeCommand(e,t,i){let n=!1,o=null;const a=()=>{var a,s;if(n)return;const r=this.firstPane(e);if(i&&(!this.app.tabs.includes(e)||(null==r?void 0:r.session)!==i))return n=!0,void(null===(a=null==o?void 0:o.unsubscribe)||void 0===a||a.call(o));r&&"function"==typeof r.sendInput&&(n=!0,null===(s=null==o?void 0:o.unsubscribe)||void 0===s||s.call(o),this.sendToPane(r,"resume",()=>r.sendInput(t+"\r")),this.diag("resume 명령 전송"))},s=Date.now(),r=()=>{var t,i,d;if(n||o)return;let l=null;try{l=this.firstPane(e),o=null===(d=null===(i=null===(t=null==l?void 0:l.session)||void 0===t?void 0:t.output$)||void 0===i?void 0:i.subscribe)||void 0===d?void 0:d.call(i,()=>setTimeout(a,700))}catch(e){return void(0,X.diagCatch)("resume 출력 구독",e)}o?this.diag(`resume 구독 armed after=${Date.now()-s}ms`):Date.now()-s<6e3&&setTimeout(r,200)};r(),setTimeout(a,6e3)}showResumeMenu(e,t){const i=document.querySelector(".ad-menu");i&&i.remove();const n=document.createElement("div");n.className="ad-menu";const o=[];e.openTabId?o.push([this.ui("이 탭으로 이동"),()=>{this.activateResume(e,!1)}]):(o.push([this.ui("새 탭에서 이어받기"),()=>{this.activateResume(e,!1)}]),o.push([this.ui("분기해서 이어받기"),()=>{this.activateResume(e,!0)}])),o.push([this.ui("세션 ID 복사"),()=>{var t,i;try{null===(i=(t=this.platform).setClipboard)||void 0===i||i.call(t,{text:e.sessionId})}catch(e){(0,X.diagCatch)(this.ui("세션 ID 복사"),e)}}]),o.push([this.ui("목록에서 숨기기"),()=>this.hideResumeRow(e.sessionId)]);for(const[e,t]of o){const i=document.createElement("div");i.className="ad-menu-item",i.textContent=e,i.addEventListener("click",()=>{t(),n.remove()}),n.appendChild(i)}document.body.appendChild(n),n.style.left=t.clientX+"px",n.style.top=Math.min(t.clientY,window.innerHeight-n.offsetHeight-8)+"px";const a=e=>{n.contains(e.target)||(n.remove(),document.removeEventListener("mousedown",a))};setTimeout(()=>document.addEventListener("mousedown",a),0)}hideResumeRow(e){const t=this.config.store.agentDeck,i=Array.isArray(t.resumeHidden)?t.resumeHidden.filter(e=>"string"==typeof e):[];i.includes(e)||(t.resumeHidden=[...i,e],this.config.save()),this.render()}showStatusMenu(e,t){const i=document.querySelector(".ad-menu");i&&i.remove();const n=document.createElement("div");n.className="ad-menu";const o=["running","waiting","limited","done","error","idle"].map(e=>[O.STATUS_STYLES[e].icon+" "+this.ui(O.STATUS_STYLES[e].label),()=>this.status.setManual(t,e)]);o.push([this.ui("↺ 자동 감지로"),()=>this.status.unpin(t)]);const a=this.mailboxWakeDisabled.has(t);o.push(["ko"===this.sidebarLang?a?"메일 wake 켜기":"메일 wake 끄기":a?"Enable mailbox wake":"Disable mailbox wake",()=>{a?this.mailboxWakeDisabled.delete(t):this.mailboxWakeDisabled.add(t),this.mailboxWake.flushAll()}]);for(const e of this.notify.sessionIdsOf(t))o.push([("ko"===this.sidebarLang?"통신 대상 복사: ":"Copy message target: ")+e,()=>{var t;null===(t=se())||void 0===t||t.writeText("AgentDeck target session ID: "+e+"\nUse this exact toSessionId with agentdeck_send; do not resolve a human slot again.")}]);o.push([this.ui("↻ 화면 복구"),()=>{this.app.selectTab(t),this.repair("active")}]);for(const[e,t]of o){const i=document.createElement("div");i.className="ad-menu-item",i.textContent=e,i.addEventListener("click",()=>{t(),n.remove()}),n.appendChild(i)}document.body.appendChild(n),n.style.left=e.clientX+"px",n.style.top=Math.min(e.clientY,window.innerHeight-n.offsetHeight-8)+"px";const s=e=>{n.contains(e.target)||(n.remove(),document.removeEventListener("mousedown",s))};setTimeout(()=>document.addEventListener("mousedown",s),0)}formatElapsed(e){const t=Math.floor(e/1e3);if(t<60)return this.ui("{n}초",{n:t});const i=Math.floor(t/60);return i<60?this.ui("{n}분",{n:i}):this.ui("{h}시간 {m}분",{h:Math.floor(i/60),m:i%60})}};ue=n=s([(0,h.Injectable)({providedIn:"root"}),l(10,(0,h.Optional)()),d("design:paramtypes",[x.AppService,x.ConfigService,C.WorkStatusService,x.HotkeysService,x.ProfilesService,x.HostWindowService,x.PlatformService,j.WorkNotifyService,G.SessionLedgerService,h.NgZone,g.LocaleService])],ue),t.AgentDeckService=ue},7009(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckDecorator=void 0;const a=i(860),s=i(7650),r=i(8349),d=i(6021),l=i(1385);let c=class extends r.TerminalDecorator{constructor(e,t,i){super(),this.status=e,this.config=t,this.app=i}rootOf(e){var t;return null!==(t=this.app.getParentTab(e))&&void 0!==t?t:e}attach(e){this.status.debug.attached++,e.session&&this.attachToSession(e,e.session),this.subscribeUntilDetached(e,e.sessionChanged$.subscribe(t=>{t&&this.attachToSession(e,t)}))}detach(e){const t=this.rootOf(e);super.detach(e),(0,l.forgetOutputBuffer)(e),t!==e&&this.app.tabs.includes(t)||this.status.forget(t)}attachToSession(e,t){this.subscribeUntilDetached(e,t.output$.subscribe(t=>{(0,l.applyOutput)(this.status,this.rootOf(e),e,t,this.config.store.agentDeck.autoDetect)}))}};c=n([(0,a.Injectable)(),o("design:paramtypes",[d.WorkStatusService,s.ConfigService,s.AppService])],c),t.AgentDeckDecorator=c},1385(e,t,i){t.applyTitle=t.stripTitleMarker=t.forgetOutputBuffer=t.applyOutput=t.releaseLimited=void 0;const n=i(3532),o=i(7282),a=/\x1b\]1337;AgentDeck=([a-z]+)(?:;([^\x07\x1b]*))?(?:\x07|\x1b\\)/gi,s=["idle","running","waiting","limited","done","error"],r=new WeakMap,d=new WeakMap,l=new WeakSet;function c(e,t,i="MCP 승인"){l.add(t);const n=e.get(t);n.pinned&&"running"===n.status?e.setManual(t,"waiting",void 0,i):"waiting"!==n.status&&p(e,t,"waiting",i)}function u(e,t){for(const i of e.split(/[\r\n]+/)){if(!i.trim()||!t.some(e=>e.test(i)))continue;const e=(0,o.reasonFromScreen)(i);if(e)return e}return""}function p(e,t,i,n){const o=e.get(t);o.pinned||((o.status!==i||n)&&(o.reason=n),e.setAuto(t,i))}t.releaseLimited=function(e,t){"limited"===e.get(t).status&&e.setAuto(t,"running")},t.applyOutput=function(e,t,i,o,h,g=(0,n.unionProfile)()){var f,m;e.debug.outputs++,e.markOutput(t);const v=(null!==(f=r.get(i))&&void 0!==f?f:"")+o;let b,k=!1,y=0;for(a.lastIndex=0;null!==(b=a.exec(v));){y=a.lastIndex;const i=b[1].toLowerCase();s.includes(i)&&(e.setManual(t,i,b[2]),e.debug.oscHits++,k=!0)}if(r.set(i,v.slice(Math.max(y,v.length-256))),k||!h)return void d.delete(i);const w=(null!==(m=d.get(i))&&void 0!==m?m:"")+o,x=w.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,""),S=("codex"===g.id||"unknown"===g.id)&&n.CODEX_APPROVAL_PATTERNS.some(e=>e.test(x));if(d.set(i,S?"":w.slice(w.lastIndexOf("\n")+1).slice(-1024)),S)return void c(e,t);if(g.waitingPatterns.some(e=>e.test(o)))return void p(e,t,"waiting",u(o,g.waitingPatterns));if(g.limitedPatterns.some(e=>e.test(o)))return void p(e,t,"limited",u(o,g.limitedPatterns));const C="codex"===g.id||l.has(t)?g.busyPatterns.filter(e=>!e.test("esc to cancel")):g.busyPatterns;return"waiting"===e.get(t).status&&C.some(e=>e.test(o))?(e.markBusy(t),e.resume(t),void l.delete(t)):"waiting"!==e.get(t).status&&g.busyTitleMarks.some(e=>o.includes(e))||C.some(e=>e.test(o))?(e.markBusy(t),void e.setAuto(t,"running")):void(e.isBusyMode(t)||"limited"!==e.get(t).status&&"waiting"!==e.get(t).status&&e.setAuto(t,"running"))},t.forgetOutputBuffer=function(e){r.delete(e),d.delete(e)};const h=/\[AD:([a-z]+)\]\s*(.*)$/i;t.stripTitleMarker=function(e){return e.replace(/\[AD:[a-z]+\]\s*/i,"")},t.applyTitle=function(e,t,i,o,a=(0,n.unionProfile)()){const r=h.exec(i);if(r){const i=r[1].toLowerCase();if(s.includes(i))return e.setManual(t,i,r[2].trim()),void e.debug.titleHits++}if(o&&("codex"===a.id||"unknown"===a.id)){if(n.CODEX_WAITING_TITLE.test(i))return void c(e,t,"입력 대기");if(("codex"===a.id||l.has(t))&&n.CODEX_BUSY_TITLE.test(i))return e.markBusy(t),e.resume(t),l.delete(t),void e.setAuto(t,"running")}o&&"waiting"!==e.get(t).status&&a.busyTitleMarks.some(e=>i.includes(e))&&e.setAuto(t,"running")}},5174(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckDevReloadService=t.devHotkeys=t.isDevInstall=void 0;const o=i(860);t.isDevInstall=function(){return!1},t.devHotkeys=function(){return[]};let a=class{constructor(){this.available=!1}init(){}enabled(){return!1}async reload(e){}};a=n([(0,o.Injectable)({providedIn:"root"})],a),t.AgentDeckDevReloadService=a},7797(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.collectDiagBundle=t.appendScreenLog=t.diagCatch=t.diagException=t.installErrorCapture=t.startDiagSession=t.recentDiag=t.diagMemory=t.resetDiagOnce=t.diagOnce=t.diag=t.pluginVersion=t.configStamp=t.SCREEN_PREV_PATH=t.SCREEN_PATH=t.DIAG_PREV_PATH=t.DIAG_PATH=void 0;const s=a(i(5317)),r=a(i(9896)),d=a(i(857)),l=a(i(6928)),c=i(7604);function u(){const e=process.env.AGENTDECK_DIAG_DIR;if(e)try{if(r.existsSync(e))return e}catch{}return d.homedir()}t.DIAG_PATH=l.join(u(),".agentdeck-diag.log"),t.DIAG_PREV_PATH=t.DIAG_PATH+".1",t.SCREEN_PATH=l.join(u(),".agentdeck-screen.log"),t.SCREEN_PREV_PATH=t.SCREEN_PATH+".1";const p=2097152;t.configStamp=function(e){var t,i;const n=null!==(t=null==e?void 0:e.agentDeck)&&void 0!==t?t:{};return{enabled:n.enabled,dock:n.sidebarDock,sidebar:n.sidebarWidth||n.sidebarHeight,aspect:`${n.aspectW}:${n.aspectH}`,viewerOpen:n.viewerOpen,viewerFollow:(0,c.followModeOf)(n.viewerPreload,n.viewerAutoOpen),screenWatch:n.screenWatch,autoRepair:n.autoRepair,notifyChannel:n.notifyChannel,rootProfile:n.rootProfile,useConPTY:null===(i=null==e?void 0:e.terminal)||void 0===i?void 0:i.useConPTY}};const h=[],g=new Set;let f=-1,m=0,v="",b=!1,k=0;const y=new Map;let w=0;const x=new Map;let S=null;function C(){var e;if(null!==S)return S;S="unknown";for(const t of[l.join(__dirname,"..","package.json"),l.join(__dirname,"package.json")])try{const i=r.readFileSync(t,"utf8"),n=null===(e=JSON.parse(i))||void 0===e?void 0:e.version;if(n){S=String(n);break}}catch{}return S}function j(e){try{return r.statSync(e).size}catch{return 0}}function A(e,t,i){try{return!(j(e)<i||(r.renameSync(e,t),0))}catch{return!1}}function E(e){try{(f<0||++m>=500)&&(f=j(t.DIAG_PATH),m=0),f>=p&&A(t.DIAG_PATH,t.DIAG_PREV_PATH,p)&&(f=0,v&&(r.appendFileSync(t.DIAG_PATH,v),f+=Buffer.byteLength(v))),r.appendFileSync(t.DIAG_PATH,e),f+=Buffer.byteLength(e)}catch{}}function P(e){h.push(e),h.length>2e3&&h.splice(0,h.length-2e3)}function z(e){const t=`${(new Date).toISOString()} ${e}`;P(t),E(t+"\n")}function D(e=200){return h.slice(-e)}function T(e,t){z(`EXCEPTION ${e} ${O(t)}`);const i="string"==typeof(null==t?void 0:t.stack)?t.stack.split(/\r?\n/):[];for(const e of i.slice(1,13)){const t=e.trim();t&&(E(` ${t}\n`),P(` ${t}`))}}function O(e){var t;return null==e?"(no error object)":"string"==typeof e?e:`${e.name?`${e.name}: `:""}${null!==(t=e.message)&&void 0!==t?t:N(e)}`}function _(e){const t="undefined"==typeof console?null:console,i=null==t?void 0:t[e];"function"==typeof i&&(t[e]=(...n)=>{try{!function(e,t){if(k>=300)return;const i=t.slice(0,4).map(I).join(" ");if(!i)return;const n=Date.now(),o=y.get(i);void 0!==o&&n-o<5e3||(y.set(i,n),k++,z(`CONSOLE ${e} ${i}`),k>=300&&z("CONSOLE 캡처 상한(300) 도달 — 이 세션에서는 더 적지 않는다"))}(e,n)}catch{}return i.apply(t,n)})}function I(e){var t;if("string"==typeof e)return R(e);if(e instanceof Error){const i="string"==typeof e.stack?null===(t=e.stack.split(/\r?\n/)[1])||void 0===t?void 0:t.trim():"";return R(`${e.name}: ${e.message}${i?" | "+i:""}`)}return R(N(e))}function R(e){const t=e.replace(/\r?\n/g," ");return t.length>400?t.slice(0,400)+"…":t}function N(e){var t;try{return null!==(t=JSON.stringify(e))&&void 0!==t?t:String(e)}catch{return String(e)}}t.pluginVersion=C,t.diag=z,t.diagOnce=function(e,t){g.has(e)||(g.add(e),z(t))},t.resetDiagOnce=function(e){g.delete(e)},t.diagMemory=function(){return h},t.recentDiag=D,t.startDiagSession=function(e={}){var i,n,o,a,s,r;A(t.DIAG_PATH,t.DIAG_PREV_PATH,p),f=-1;const l=["",`===== agentdeck session ${(new Date).toISOString()} =====`,`plugin=${C()} tabby=${null!==(i=e.tabby)&&void 0!==i?i:"?"} platform=${process.platform} arch=${process.arch} node=${null!==(o=null===(n=process.versions)||void 0===n?void 0:n.node)&&void 0!==o?o:"?"} electron=${null!==(s=null===(a=process.versions)||void 0===a?void 0:a.electron)&&void 0!==s?s:"?"} os=${JSON.stringify(null!==(r=e.osRelease)&&void 0!==r?r:d.release())}`];e.config&&l.push(`config=${N(e.config)}`),v=l.join("\n")+"\n";for(const e of l)P(e);E(v)},t.installErrorCapture=function(){if(b)return;b=!0;const e="undefined"==typeof window?null:window;(null==e?void 0:e.addEventListener)&&(e.addEventListener("error",e=>{var t;T("window.onerror"+((null==e?void 0:e.filename)?` at ${e.filename}:${e.lineno}:${e.colno}`:""),null!==(t=null==e?void 0:e.error)&&void 0!==t?t:null==e?void 0:e.message)}),e.addEventListener("unhandledrejection",e=>{T("unhandledrejection",null==e?void 0:e.reason)})),_("error"),_("warn")},t.diagException=T,t.diagCatch=function(e,t){if(w>=200)return;const i=O(t),n=`${e}|${i}`,o=Date.now(),a=x.get(n);void 0!==a&&o-a<6e4||(x.set(n,o),w++,z(`CATCH ${e} ${R(i)}`),w>=200&&z("CATCH 캡처 상한(200) 도달 — 이 세션에서는 더 적지 않는다"))},t.appendScreenLog=function(e){try{A(t.SCREEN_PATH,t.SCREEN_PREV_PATH,4194304),r.appendFileSync(t.SCREEN_PATH,e)}catch{}},t.collectDiagBundle=function(e={}){var i,n,o,a,c,u,p,h,g,f;const m=`agentdeck-diag-${function(e=new Date){const t=e=>String(e).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}_${t(e.getHours())}${t(e.getMinutes())}`}()}`,v=l.join(d.tmpdir(),m);r.mkdirSync(v,{recursive:!0});const b=[],k=[`agentdeck 진단 묶음 ${(new Date).toISOString()}`,`plugin=${C()} tabby=${null!==(n=null===(i=e.stamp)||void 0===i?void 0:i.tabby)&&void 0!==n?n:"?"}`,`platform=${process.platform} arch=${process.arch} node=${null!==(a=null===(o=process.versions)||void 0===o?void 0:o.node)&&void 0!==a?a:"?"} electron=${null!==(u=null===(c=process.versions)||void 0===c?void 0:c.electron)&&void 0!==u?u:"?"}`,`os=${null!==(h=null===(p=e.stamp)||void 0===p?void 0:p.osRelease)&&void 0!==h?h:d.release()}`,`config=${N(null!==(f=null===(g=e.stamp)||void 0===g?void 0:g.config)&&void 0!==f?f:{})}`,`diag=${j(t.DIAG_PATH)}B prev=${j(t.DIAG_PREV_PATH)}B screen=${j(t.SCREEN_PATH)}B (포함=${e.includeScreen?"y":"n"})`,"","--- 이 세션의 최근 진단 (메모리) ---",...D(200),""].join("\n");r.writeFileSync(l.join(v,"report.txt"),k,"utf8"),b.push("report.txt");const y=[t.DIAG_PATH,t.DIAG_PREV_PATH];e.includeScreen&&y.push(t.SCREEN_PATH,t.SCREEN_PREV_PATH);for(const e of y)try{if(r.existsSync(e)){const t=l.basename(e).replace(/^\./,"");r.copyFileSync(e,l.join(v,t)),b.push(t)}}catch{}const w=v+".zip";try{r.rmSync(w,{force:!0})}catch{}return function(e,t){try{return"win32"===process.platform?s.execFileSync("powershell.exe",["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`Compress-Archive -Path '${e}\\*' -DestinationPath '${t}' -Force`],{timeout:3e4,stdio:"ignore"}):s.execFileSync("zip",["-r","-q",t,"."],{cwd:e,timeout:3e4,stdio:"ignore"}),!0}catch{return!1}}(v,w)&&r.existsSync(w)?{path:w,zipped:!0,files:b}:{path:v,zipped:!1,files:b}}},7617(e,t){function i(e){return"left"===e||"right"===e}t.DockController=t.isHorizontalDock=t.isDockSide=t.DOCK_SIDES=void 0,t.DOCK_SIDES=["left","right","top","bottom"],t.isDockSide=function(e){return t.DOCK_SIDES.includes(e)},t.isHorizontalDock=i;t.DockController=class{constructor(e){this.host=e,this.handle=null,this.overlay=null,this.preview=null,this.zones=new Map,this.resizing=!1,this.dragging=!1,this.dragArmed=!1,this.dragFrom={x:0,y:0},this.hoverSide=null}box(){var e,t;const i=null===(t=(e=this.host).getBox)||void 0===t?void 0:t.call(e);if(i)return{...i,right:i.left+i.width,bottom:i.top+i.height};const n=this.host.windowEl.getBoundingClientRect();return{left:n.left,top:n.top,right:n.right,bottom:n.bottom,width:n.width,height:n.height}}install(){this.installResizeHandle(),this.installDockDrag()}syncHandle(){if(!this.handle)return;const e=this.host.getDock();this.handle.className="ad-resize ad-resize-"+e}installResizeHandle(){const e=document.createElement("div");e.className="ad-resize",this.host.sidebar.appendChild(e),this.handle=e,this.syncHandle(),e.addEventListener("pointerdown",t=>{0===t.button&&(t.preventDefault(),t.stopPropagation(),this.resizing=!0,e.setPointerCapture(t.pointerId),document.body.classList.add("ad-resizing"))}),e.addEventListener("pointermove",e=>{if(!this.resizing)return;const t=this.host.getDock(),i=this.box();let n;n="right"===t?i.right-e.clientX:"left"===t?e.clientX-i.left:"bottom"===t?i.bottom-e.clientY:e.clientY-i.top,this.host.setSize(Math.round(n)),this.host.relayout()});const t=t=>{if(this.resizing){this.resizing=!1;try{e.releasePointerCapture(t.pointerId)}catch{}document.body.classList.remove("ad-resizing"),this.host.commit()}};e.addEventListener("pointerup",t),e.addEventListener("pointercancel",t)}installDockDrag(){const e=this.host.sidebar.querySelector(".ad-head");if(!e)return;e.addEventListener("pointerdown",t=>{0===t.button&&(t.target.closest("button, input")||(this.dragArmed=!0,this.dragFrom={x:t.clientX,y:t.clientY},e.setPointerCapture(t.pointerId)))}),e.addEventListener("pointermove",e=>{if(this.dragArmed){if(!this.dragging){const t=e.clientX-this.dragFrom.x,i=e.clientY-this.dragFrom.y;if(Math.hypot(t,i)<5)return;this.dragging=!0,this.showOverlay()}this.updateHover(e.clientX,e.clientY)}});const t=t=>{if(!this.dragArmed)return;this.dragArmed=!1;try{e.releasePointerCapture(t.pointerId)}catch{}if(!this.dragging)return;this.dragging=!1;const i=this.hoverSide;this.hideOverlay(),i&&i!==this.host.getDock()&&(this.host.setDock(i),this.host.relayout(),this.syncHandle(),this.host.commit())};e.addEventListener("pointerup",t),e.addEventListener("pointercancel",t)}showOverlay(){if(this.overlay)return;const e=document.createElement("div");e.className="ad-dock-overlay";const i=document.createElement("div");i.className="ad-dock-preview",e.appendChild(i);for(const i of t.DOCK_SIDES){const t=document.createElement("div");t.className="ad-dock-zone ad-dock-zone-"+i,t.innerHTML='<span class="ad-dock-mark"></span>',e.appendChild(t),this.zones.set(i,t)}document.body.appendChild(e),this.overlay=e,this.preview=i,this.positionZones()}positionZones(){const e=this.box(),i=e.left+e.width/2,n=e.top+e.height/2,o={left:[e.left+56,n],right:[e.right-56,n],top:[i,e.top+56],bottom:[i,e.bottom-56]};for(const e of t.DOCK_SIDES){const t=this.zones.get(e);if(!t)continue;const[i,n]=o[e];t.style.left=i+"px",t.style.top=n+"px"}}updateHover(e,t){const i=this.hitTest(e,t);if(i!==this.hoverSide){this.hoverSide=i;for(const[e,t]of this.zones)t.classList.toggle("active",e===i)}this.drawPreview(i)}hitTest(e,t){for(const[i,n]of this.zones){const o=n.getBoundingClientRect();if(e>=o.left&&e<=o.right&&t>=o.top&&t<=o.bottom)return i}const i=this.box(),n=(e-i.left)/i.width,o=(t-i.top)/i.height;return n<.25&&n<=o&&n<=1-o?"left":n>.75&&1-n<=o&&1-n<=1-o?"right":o<.25?"top":o>.75?"bottom":null}drawPreview(e){if(!this.preview)return;if(!e)return void(this.preview.style.display="none");const t=this.box(),n=i(e),o=this.host.getSize(e),a=n?Math.min(Math.max(o||320,180),.6*t.width):Math.min(Math.max(o||200,120),.6*t.height),s=this.preview.style;s.display="block",s.left=("right"===e?t.right-a:t.left)+"px",s.top=("bottom"===e?t.bottom-a:t.top)+"px",s.width=(n?a:t.width)+"px",s.height=(n?t.height:a)+"px"}hideOverlay(){var e;null===(e=this.overlay)||void 0===e||e.remove(),this.overlay=null,this.preview=null,this.zones.clear(),this.hoverSide=null}}},1933(e,t,i){t.formatStageSummary=t.hasStaged=t.commitArgs=t.validateMessage=t.unstageFallbackArgs=t.unstageArgs=t.stageArgs=t.parseStatus=t.stageLabel=void 0;const n=i(7859),o="\0";function a(e,t){const i=e||" ",n=t||" ";if("?"===i||"?"===n)return"untracked";if(function(e,t){return"U"===e||"U"===t||"D"===e&&"D"===t||"A"===e&&"A"===t}(i,n))return"conflict";const o=" "!==i;return o&&" "!==n?"both":o?"staged":"unstaged"}function s(e){return e.startsWith("## ")}function r(e){return e.length<3?null:{code:e.slice(0,2),rest:e.slice(2).replace(/^ /,"")}}function d(e){return e.indexOf("R")>=0||e.indexOf("C")>=0}function l(e){if(e.startsWith('"')){const t=function(e){for(let t=1;t<e.length;t++)if("\\"!==e[t]){if('"'===e[t])return t+1}else t++;return-1}(e);if(t>0){const i=e.slice(t).replace(/^ -> /,"");return{orig:(0,n.unquotePath)(e.slice(0,t)),next:(0,n.unquotePath)(i)}}}const t=e.indexOf(" -> ");return t<0?{orig:"",next:(0,n.unquotePath)(e)}:{orig:(0,n.unquotePath)(e.slice(0,t)),next:(0,n.unquotePath)(e.slice(t+4))}}function c(e,t,i){var n,o;const s=null!==(n=e[0])&&void 0!==n?n:" ",r=null!==(o=e[1])&&void 0!==o?o:" ",d={path:t,index:s,work:r,state:a(s,r)};return i&&(d.oldPath=i),d}function u(e){const t=new Set;for(const i of null!=e?e:[]){const e="string"==typeof i?i:"";!e||e.indexOf(o)>=0||t.add(e)}return Array.from(t)}function p(e){return"string"!=typeof e||""===e?{ok:!1,reason:"커밋 메시지가 비어 있다 — 무엇을 바꿨는지 한 줄 적어야 커밋한다"}:e.indexOf(o)>=0?{ok:!1,reason:"커밋 메시지에 NUL 문자가 들어 있다 — 그대로 넘기면 git 실행 자체가 실패한다"}:e.trim()?e.length>8e3?{ok:!1,reason:"메시지가 너무 길다 ("+e.length+"자 / 최대 8000자)"}:{ok:!0}:{ok:!1,reason:"공백·줄바꿈만 있다 — git 도 빈 메시지로 보고 커밋을 거절한다"}}t.stageLabel=function(e){switch(e){case"staged":return"올림";case"both":return"일부";case"untracked":return"새파일";case"conflict":return"충돌";default:return"안올림"}},t.parseStatus=function(e){const t=String(null!=e?e:"");if(!t.trim())return[];if(t.indexOf(o)>=0)return function(e){var t;const i=e.split(o),n=[];for(let e=0;e<i.length;e++){const o=i[e];if(!o||s(o))continue;const a=r(o);if(a&&"!!"!==a.code&&" "!==a.code){if(d(a.code)){const o=null!==(t=i[e+1])&&void 0!==t?t:"";e++,n.push(c(a.code,a.rest,o));continue}n.push(c(a.code,a.rest))}}return n}(t);const i=[];for(const e of t.replace(/\r\n?/g,"\n").split("\n")){if(!e.trim()||s(e))continue;const t=r(e);if(t&&"!!"!==t.code&&" "!==t.code){if(d(t.code)){const e=l(t.rest);i.push(c(t.code,e.next,e.orig));continue}i.push(c(t.code,(0,n.unquotePath)(t.rest)))}}return i},t.stageArgs=function(e){const t=u(e);return t.length?["add","--",...t]:[]},t.unstageArgs=function(e){const t=u(e);return t.length?["reset","-q","--",...t]:[]},t.unstageFallbackArgs=function(e){const t=u(e);return t.length?["rm","--cached","-q","--",...t]:[]},t.validateMessage=p,t.commitArgs=function(e,t){if(!p(e).ok)return[];const i=["commit"];return(null==t?void 0:t.amend)&&i.push("--amend"),i.push("-m",e),i},t.hasStaged=function(e){for(const t of null!=e?e:[])if("staged"===t.state||"both"===t.state)return!0;return!1},t.formatStageSummary=function(e){let t=0,i=0,n=0,o=0;for(const a of null!=e?e:[])switch(null==a?void 0:a.state){case"staged":t++;break;case"unstaged":i++;break;case"both":t++,i++;break;case"untracked":n++;break;case"conflict":o++}const a=[];return t&&a.push(t+"개 스테이지"),i&&a.push(i+"개 미스테이지"),n&&a.push(n+"개 추적안됨"),o&&a.push(o+"개 충돌"),a.length?a.join(" · "):"변경 없음"}},7859(e,t){t.parseUntracked=t.filterTouched=t.formatLineRef=t.refPathFrom=t.joinRefPath=t.refLineNo=t.statusLabel=t.formatStat=t.parseUnifiedDiff=t.unquotePath=void 0;const i=/^diff --git (.*)$/,n=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,o=/^Binary files (.*) and (.*) differ$/,a={n:"\n",t:"\t",r:"\r",'"':'"',"\\":"\\",b:"\b",f:"\f",v:"\v",a:""};function s(e){var t,i;let n="",o=[];const s=()=>{o.length&&(n+=function(e){if(!e.length)return"";try{return decodeURIComponent(e.map(e=>"%"+e.toString(16).padStart(2,"0")).join(""))}catch{return e.map(e=>String.fromCharCode(e)).join("")}}(o),o=[])};for(let r=0;r<e.length;r++){const d=e[r];if("\\"!==d){s(),n+=d;continue}const l=null!==(t=e[r+1])&&void 0!==t?t:"";if(l>="0"&&l<="7"){let t="";for(;t.length<3&&e[r+1]>="0"&&e[r+1]<="7";)t+=e[r+1],r++;o.push(parseInt(t,8));continue}s(),n+=null!==(i=a[l])&&void 0!==i?i:l,r++}return s(),n}function r(e){let t=String(null!=e?e:"").replace(/\t.*$/,"").trim();return t.length>=2&&t.startsWith('"')&&t.endsWith('"')&&(t=s(t.slice(1,-1))),t}function d(e){return/^[ab]\//.test(e)?e.slice(2):e}function l(e){if('"'!==e[0])return null;for(let t=1;t<e.length;t++)if("\\"!==e[t]){if('"'===e[t])return{value:s(e.slice(1,t)),end:t+1}}else t++;return null}function c(e){const t=String(null!=e?e:"").trim();if(t.startsWith('"')){const e=l(t);if(e){const i=t.slice(e.end).trim(),n=l(i);return{old:d(e.value),next:d(n?n.value:i)}}}const i=(t.length-5)/2;if(Number.isInteger(i)&&i>0&&"a/"===t.slice(0,2)&&" b/"===t.slice(2+i,5+i)&&t.slice(2,2+i)===t.slice(5+i)){const e=t.slice(2,2+i);return{old:e,next:e}}const n=t.indexOf(" b/");return n>0?{old:d(t.slice(0,n)),next:d(t.slice(n+1))}:{old:d(t),next:d(t)}}function u(){return{path:"",status:"modified",binary:!1,added:0,removed:0,lines:[]}}t.unquotePath=r,t.parseUnifiedDiff=function(e){var t;const a=String(null!=e?e:"").replace(/\r\n?/g,"\n");if(!a.trim())return[];const s=[];let l=null,p=0,h=0,g=0,f=0;for(const e of a.split("\n")){if(null!==l&&(g>0||f>0)){const i=null!==(t=e[0])&&void 0!==t?t:"";if("\\"===i)continue;if("+"===i){l.added++,l.lines.push({kind:"add",text:e.slice(1),newNo:h++}),f--;continue}if("-"===i){l.removed++,l.lines.push({kind:"del",text:e.slice(1),oldNo:p++}),g--;continue}if(" "===i||""===e){l.lines.push({kind:"ctx",text:e.slice(1),oldNo:p++,newNo:h++}),g--,f--;continue}g=0,f=0}const a=i.exec(e);if(a){const e=c(a[1]);l=u(),l.path=e.next,e.old&&e.old!==e.next&&(l.oldPath=e.old),s.push(l),g=0,f=0;continue}if(!l)continue;const m=n.exec(e);if(m)p=Number(m[1]),h=Number(m[3]),g=void 0===m[2]?1:Number(m[2]),f=void 0===m[4]?1:Number(m[4]),l.lines.push({kind:"hunk",text:e});else if(e.startsWith("new file mode"))l.status="added";else if(e.startsWith("deleted file mode"))l.status="deleted";else if(e.startsWith("rename from "))l.status="renamed",l.oldPath=r(e.slice(12));else if(e.startsWith("rename to "))l.status="renamed",l.path=r(e.slice(10));else if(e.startsWith("--- ")){const t=r(e.slice(4));if("/dev/null"===t)l.status="added";else if("renamed"!==l.status){const e=d(t);e!==l.path&&(l.oldPath=e)}}else if(e.startsWith("+++ ")){const t=r(e.slice(4));"/dev/null"===t?l.status="deleted":"renamed"!==l.status&&(l.path=d(t))}else if(e.startsWith("GIT binary patch"))l.binary=!0;else{const t=o.exec(e);if(t){l.binary=!0;const e=r(t[1]),i=r(t[2]);"/dev/null"!==i&&(l.path=d(i)),"/dev/null"===e?l.status="added":"/dev/null"===i&&(l.status="deleted")}}}return s},t.formatStat=function(e){const t=null!=e?e:[];if(!t.length)return"변경 없음";let i=0,n=0;for(const e of t)i+=e.added,n+=e.removed;return t.length+"개 파일 · +"+i+" -"+n},t.statusLabel=function(e){switch(e.status){case"added":return"신규";case"deleted":return"삭제";case"renamed":return"이름변경";default:return"수정"}};const p=/^[A-Za-z]:/;function h(e){return String(null!=e?e:"").replace(/\\/g,"/")}function g(e){return e.length>1?e.replace(/\/+$/,""):e}function f(e,t){const i=h(t);if(!i)return"";const n=g(h(e));return!n||i.startsWith("/")||p.test(i)?i:n+"/"+i}function m(e){const t=g(h(e));return p.test(t)?t.toLowerCase():t}t.refLineNo=function(e){if(!e||"del"===e.kind||"hunk"===e.kind)return null;const t=e.newNo;return"number"==typeof t&&Number.isFinite(t)&&t>0?Math.floor(t):null},t.joinRefPath=f,t.refPathFrom=function(e,t){const i=h(e);if(!i)return"";const n=g(h(t));if(!n)return i;const o=p.test(i)||p.test(n),a=o?i.toLowerCase():i,s=o?n.toLowerCase():n;return a===s?i:a.startsWith(s+"/")?i.slice(n.length+1):i},t.formatLineRef=function(e,t,i){const n=String(null!=e?e:"");if(!n)return"";const o=Number(t),a=Number(null!=i?i:t),s=Number.isFinite(o)&&o>0,r=Number.isFinite(a)&&a>0;let d=n;if(s||r){const e=Math.floor(Math.min(s?o:a,r?a:o)),t=Math.floor(Math.max(s?o:a,r?a:o));d=n+":"+e+(t>e?"-"+t:"")}return/\s/.test(d)?'"'+d+'"':d},t.filterTouched=function(e,t,i,n){const o=null!=e?e:[];if(!n||!n.length)return[...o];const a=new Set(n.map(e=>m(e)));return o.filter(e=>a.has(m(f(i,t(e)))))},t.parseUntracked=function(e){const t=[];for(const i of String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n")){if(!i.startsWith("?? "))continue;const e=r(i.slice(3));e&&t.push(e)}return t}},6879(e,t){function i(e){if("string"!=typeof e)return null;let t=e.trim();if(!t)return null;t=t.replace(/\\/g,"/");const i=t.startsWith("//");for(t=t.replace(/\/{2,}/g,"/"),i&&(t="/"+t);t.length>1&&t.endsWith("/")&&!/^[A-Za-z]:\/$/.test(t);)t=t.slice(0,-1);return t}function n(e){return(null!=e?e:"").toLowerCase()}function o(e){var t;const i=/^\/\/([^/]+)\/([^/]+)(.*)$/.exec(e);if(i)return{prefix:"//"+i[1]+"/"+i[2],abs:!0,segs:a(i[3])};const n=/^([A-Za-z]:)(\/.*)?$/.exec(e);return n?{prefix:n[1],abs:!0,segs:a(null!==(t=n[2])&&void 0!==t?t:"")}:{prefix:"",abs:e.startsWith("/"),segs:a(e)}}function a(e){return e.split("/").filter(e=>e.length>0)}function s(e,t){return e.length===t.length&&e.every((e,i)=>n(e)===n(t[i]))}function r(e,t){const a=i(e);if(!a)return null;const r=t?i(t(a)):null;if(!r)return a;const d=o(a),l=o(r);return n(l.prefix)===n(d.prefix)&&(c=d.segs,u=l.segs,c.length>=u.length&&s(c.slice(0,u.length),u))?r:a;var c,u}function d(e,a){const r=i(e);if(!r)return t.UNGROUPED_LABEL;const d=o(r).segs;if(!d.length)return r;const l=[];for(const e of a){const t=i(e);t&&n(t)!==n(r)&&l.push(o(t).segs)}for(let e=1;e<=d.length;e++){const t=d.slice(-e);if(!l.some(i=>i.length>=e&&s(i.slice(-e),t)))return t.join("/")}return r}function l(e,t){const i=e.label.toLowerCase(),o=t.label.toLowerCase();if(i!==o)return i<o?-1:1;const a=n(e.key),s=n(t.key);return a===s?0:a<s?-1:1}function c(e){return n(null!=e?e:t.QC)}function u(e,t){if(!Array.isArray(t))return!1;const i=c(e);return t.some(e=>null!=e&&n(String(e))===i)}t.resolveGroupCollapseFor=t.isStoredCollapsed=t.collapseIdOf=t.QC=t.groupTabs=t.parentPath=t.groupKeyOf=t.foldGroupKey=t.normalizeCwd=t.UNGROUPED_LABEL=void 0,t.UNGROUPED_LABEL="기타",t.normalizeCwd=i,t.foldGroupKey=n,t.groupKeyOf=r,t.parentPath=function(e){const t=i(e);if(!t)return null;const n=o(t);return n.segs.length?function(e,t){return t.length?e.prefix+(e.abs?"/":"")+t.join("/"):/^[A-Za-z]:$/.test(e.prefix)?e.prefix+"/":e.prefix||(e.abs?"/":"")}(n,n.segs.slice(0,-1)):null},t.groupTabs=function(e,i,o){const a=[],s=new Map,c=[];for(const t of e){const e=r(i(t),o);if(!e){c.push(t);continue}const d=n(e);let l=s.get(d);l||(l={key:e,tabs:[]},s.set(d,l),a.push(d)),l.tabs.push(t)}const u=a.map(e=>s.get(e).key),p=a.map(e=>{const t=s.get(e);return{key:t.key,label:d(t.key,u),tabs:t.tabs}});return p.sort(l),c.length&&p.push({key:null,label:t.UNGROUPED_LABEL,tabs:c}),p},t.QC="(ungrouped)",t.collapseIdOf=c,t.isStoredCollapsed=u,t.resolveGroupCollapseFor=function(e,t,i){return function(e){if(!e.stored)return{collapsed:!1,reason:"open"};const t=e.matches,i="number"==typeof t&&isFinite(t)&&t>0?Math.floor(t):0;return e.filtering&&i>0?{collapsed:!1,reason:"filter-open"}:{collapsed:!0,reason:"stored"}}({stored:u(e.key,t),filtering:i,matches:e.tabs.length})}},9771(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckHotkeyProvider=void 0;const o=i(860),a=i(7650),s=i(5174),r=i(9137);let d=class extends a.HotkeyProvider{async provide(){return[...(0,s.devHotkeys)(),{id:"agentdeck-toggle",name:"AgentDeck 사이드바 / 4:3 전환"},{id:"agentdeck-newline",name:"AgentDeck 줄바꿈 (Ctrl+Enter / Shift+Enter, 0x0A 전송)"},{id:"agentdeck-paste",name:"AgentDeck 붙여넣기 (텍스트는 그대로, 이미지는 Alt+V 로 위임)"},{id:"agentdeck-repair",name:"AgentDeck 화면 복구 (깨진 TUI 다시 그리기)"},{id:"agentdeck-view",name:"AgentDeck 미리보기 패널 (md · 이미지 · 표)"},{id:"agentdeck-view-mode",name:"AgentDeck 미리보기 파일 / 변경 전환"},{id:"agentdeck-focus-list",name:"AgentDeck 사이드바 목록에 포커스 (↑↓ 이동 · Enter 전환 · Esc 복귀)"},{id:"agentdeck-new-tab",name:"AgentDeck 새 탭 (사이드바 + 새 탭 과 같다)"},...Array.from({length:r.JUMP_SLOTS},(e,t)=>({id:`agentdeck-jump-${t+1}`,name:`AgentDeck ${t+1}번째 세션으로 (사이드바에 보이는 순서)`}))]}};d=n([(0,o.Injectable)()],d),t.AgentDeckHotkeyProvider=d},3438(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.LANGUAGES=t.translate=t.pickLang=void 0;const o=n(i(2846)),a=n(i(7474)),s=n(i(1311)),r=n(i(3286)),d=n(i(2858)),l=n(i(8674)),c=n(i(1549)),u=n(i(1017)),p=n(i(159)),h=n(i(8124)),g=n(i(5276)),f=n(i(588)),m=n(i(1675)),v=n(i(1773)),b=n(i(3685)),k=n(i(2904)),y=n(i(4544)),w=n(i(3948)),x=n(i(171)),S=n(i(3893)),C=n(i(6981)),j=n(i(2653)),A={af:o.default,bg:a.default,cs:s.default,da:r.default,de:d.default,en:l.default,es:c.default,fr:u.default,hr:p.default,id:h.default,it:g.default,ja:f.default,ko:m.default,pl:v.default,pt:b.default,ru:k.default,sr:y.default,sv:w.default,tr:x.default,uk:S.default,"zh-CN":C.default,"zh-TW":j.default};t.pickLang=function(e){const t=String(null!=e?e:"").trim().toLowerCase();if(t.startsWith("zh"))return/\b(tw|hk|mo|hant)\b/.test(t)?"zh-TW":"zh-CN";const i=t.split(/[-_]/)[0];return i in A?i:"en"},t.translate=function(e,t,i){var n;const o=null!==(n=A[t][e])&&void 0!==n?n:l.default[e];return void 0===o?e:i?o.replace(/\{(\w+)\}/g,(e,t)=>{const n=i[t];return null==n?e:String(n)}):o},t.LANGUAGES=A},2846(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Bykomende werkprofiele","root.choose.desc":"Stoor verskeie werkvouers en kies ’n profiel wanneer jy ’n nuwe oortjie oopmaak.","root.add":"Voeg profiel by","root.remove":"Verwyder profiel","layout.title":"Gebruik die AgentDeck-uitleg","layout.desc":"Skakel af om die sybalk en die vaste breedte te verwyder en na gewone Tabby terug te keer.","reset.title":"Stel die uitleg terug","reset.desc":"Sit die sybalk terug in sy aanvanklike toestand — regs vasgeheg, met die breedte bereken uit die vensterverhouding.","reset.now":"Nou: {dock} vasgeheg, {size}.","reset.default":"Op die oomblik is alles op die verstekwaardes.","reset.btn":"Stel terug","dock.left":"links","dock.right":"regs","dock.top":"bo","dock.bottom":"onder","size.width":"{px} px breed","size.height":"{px} px hoog","size.auto":"breedte outomaties","norecover.title":"Moenie oortjies met begin herstel nie","norecover.desc":"Tabby begin leeg in plaas daarvan om die ou oortjies terug te bring — al wat terugkom, is in elk geval net die dop, en die Claude-sessie daarbinne is lankal verby. Skakel af vir Tabby se oorspronklike gedrag (<code>recoverTabs</code>). Geld vanaf die volgende begin.","resume.title":"Hervat vorige sessies","resume.desc":"Voeg ’n laai <code>⟲ Vorige sessies</code> aan die einde van elke groep by (by verstek toegevou). Vou dit oop en <b>geslote Claude Code- en Codex-sessies</b> word gelys met die opdrag wat jy werklik getik het; een klik bring die gesprek terug met <code>claude --resume</code> of <code>codex resume</code> in sy eie werkvouer. Dit is die ander helfte van <b>Moenie oortjies herstel nie</b> hierbo — die gewone herstel bring die dop terug, dit bring die gesprek terug. <b>Bedieners en agtergrondprosesse wat toe geloop het, kom nie terug nie.</b>","agents.head":"Agent-integrasie","agents.intro":"Laat elke agent sy eie toestand, model en gebruikslimiete <b>self aanmeld</b>. Dit is die akkuraatste bron wat die sybalk het — daarsonder raai ons uit die teks wat op die skerm geteken word, en die aflees wikkel navenant.","agents.unsupported.title":"Nie op hierdie platform beskikbaar nie","agents.unsupported.desc":"Die kennisgewingskrip is PowerShell en loop dus net op Windows. Die toestand word eerder uit die afvoer geraai.","state.on":"Gekoppel","state.off":"Nie gekoppel nie","state.half":"Half gekoppel","btn.install":"Installeer","btn.remove":"Verwyder","claude.title":"Claude-integrasie","claude.desc":"Claude Code-sessies verskyn in die sybalk met hul <b>toestand</b> (besig · wag vir goedkeuring · klaar) en <b>stawe vir model, rekening en verbruik</b>. Installeer die hake en die <code>statusLine</code> in <code>~/.claude/settings.json</code> saam, en verwyder hulle saam. Ander hake word nie geraak nie, en ’n <code>statusLine</code> wat jy reeds gehad het, word <b>net so uitgevoer</b> — wat jy daar sien, verander nie. ’n Rugsteun word eers langs die lêer geskryf.","codex.title":"Codex-integrasie","codex.desc":"Codex-sessies verskyn in die sybalk met hul <b>toestand</b> (besig · wag vir goedkeuring · klaar · onderbreek) en <b>stawe vir model, rekening en verbruik</b>. Maak Codex ná die installasie weer oop en gaan die AgentDeck-hake onder <code>/hooks</code> na en vertrou hulle.","codex.disabled":"Codex het hierdie hake afgeskakel — niks kom deur voordat jy hulle aanskakel nie: {events}. Maak Codex oop, voer <code>/hooks</code> uit en vertrou hulle.","root.head":"Profiel vir die werkvouer","root.intro":"Skep ’n profiel sodat nuwe oortjies altyd in dieselfde vouer oopmaak. Veranderinge geld ná Tabby herbegin word.","root.use.title":"Gebruik ’n profiel vir die werkvouer","root.use.desc":"Skakel aan en vul die vouer in — die profiel word geskep en word die verstek.","root.name.title":"Profielnaam","root.cwd.title":"Werkvouer","root.cwd.desc":"Laat dit leeg en geen profiel word geskep nie. Gebruik skuinsstrepe wanneer jy dit met die hand tik (bv. D:/Project) om die slaggate met terugskuinsstrepe te vermy.","root.browse":"Blaai","root.command.title":"Opdrag","diag.head":"Meld ’n probleem aan","diag.intro":"Versamel die diagnostiese logs in <b>een enkele zip</b> en maak die vouer oop waar dit beland. Dit bevat: die weergawes van die inprop en Tabby en die bedryfstelsel, die instellings hierbo, en die twee jongste geslagte van <code>{path}</code>. Die logs sluit <b>oortjietitels en die paaie wat jy oopgemaak het</b> in — maak die zip gerus oop en kyk voordat jy dit stuur.","diag.screen.title":"Sluit die rou skerm ook in","diag.screen.desc":"Skakel aan vir probleme met die teken van die skerm. Die terminaalskerm gaan woordeliks in — jou werk en jou kode is daarin leesbaar — daarom is dit by verstek af.","diag.collect.title":"Versamel die logs","diag.collect.desc":"Inprop v{version}.","diag.made":"Geskep: ","diag.btn":"Versamel","dev.head":"Ontwikkelaaropsies","dev.use.title":"Aktiveer ontwikkelaaropsies","dev.use.desc":"Skakel <b>lewendige herlaai</b> aan — sodra <code>npm run build</code> <code>dist/index.js</code> oorskryf, herlaai die venster na die nuwe inprop <b>met jou sessies ongeskonde</b> (die oortjies koppel weer aan dieselfde pty). Die kortpad <b>[dev] Herlaai inprop</b> volg ook hierdie skakelaar. Is dit af, doen ’n veranderde dist niks nie. Wys net by installasies uit die bronboom; die npm-bou het dit nie.","dev.now.title":"Herlaai nou","dev.now.desc":"Herlaai die huidige dist sonder om te bou.","dev.btn":"Herlaai",footer:"Die res — vensterverhouding, breedte van die sybalk, ondeursigtigheid, toestandbespeuring, invoerhantering — is op die verstekwaardes vasgepen. Moet jy een verander, wysig <code>agentDeck.*</code> direk in die konfigurasielêer. Kortpaaie is onder die <b>Kortpaaie</b>-oortjie as <code>agentdeck-*</code>.","keys.head":"Kortpaaie","keys.intro":"Die sleutels van die voorblad. Druk <b>Verander</b>, dan die nuwe sleutel. As dit reeds gebruik word — deur Tabby self of deur AgentDeck — word gesê <b>waarmee dit bots</b>, en jy kan weer kies of die sleutel oorneem. Geld dadelik.","keys.change":"Verander","keys.default":"Verstek","keys.cancel":"Kanselleer","keys.force":"Gebruik dit in elk geval","keys.press":"Druk die nuwe sleutel… (Esc kanselleer)","keys.conflict":"Bots met {names}. Gebruik jy dit in elk geval, word die sleutel daar verwyder.","keys.unbound":"nie toegeken","keys.stock":"Tabby se eie","keys.digit":"Hierdie een moet op 'n syfer 1–9 eindig — die syfer is die sessienommer. Druk bv. Alt+1 en 2…9 volg.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, regsklik en die paneel se <code>Ctrl+F</code> / <code>Ctrl+S</code> is nie kortpaaie nie en word nie hier verander nie.","keys.item.newtab":"Nuwe oortjie in die werkwortel","keys.item.jump":"Spring na die N-de sessie","keys.item.focus":"Fokus op die sessielys / terug na die terminaal","keys.item.view":"Maak die voorskoupaneel oop / toe","keys.item.repair":"Herstel die skerm","keys.item.splitright":"Deel langs mekaar (nuwe paneel regs)","keys.item.splitbottom":"Deel bo / onder (nuwe paneel onder)","keys.item.closepane":"Maak die aktiewe verdeelde paneel toe","keys.item.newline":"Nuwe reël sonder om te stuur","keys.item.toggle":"Kantbalk / 4:3 aan-af","keys.item.viewmode":"Paneel: Lêers ↔ Veranderinge"}},7474(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Допълнителни работни профили","root.choose.desc":"Запазете няколко работни папки и изберете профил при отваряне на нов раздел.","root.add":"Добавяне на профил","root.remove":"Изтриване на профил","layout.title":"Използване на подредбата на AgentDeck","layout.desc":"Изключете и страничната лента и фиксираната ширина изчезват — Tabby се връща към обичайния си вид.","reset.title":"Нулиране на подредбата","reset.desc":"Връща страничната лента в началното ѝ състояние — закачена вдясно, с ширина, изчислена от съотношението на прозореца.","reset.now":"Сега: закачена {dock}, {size}.","reset.default":"В момента всичко е по подразбиране.","reset.btn":"Нулиране","dock.left":"вляво","dock.right":"вдясно","dock.top":"горе","dock.bottom":"долу","size.width":"ширина {px} px","size.height":"височина {px} px","size.auto":"автоматична ширина","norecover.title":"Без възстановяване на разделите при стартиране","norecover.desc":"Tabby стартира празен, вместо да връща старите раздели — връща се само обвивката, а сесията на Claude в нея отдавна е приключила. Изключете за оригиналното поведение (<code>recoverTabs</code>). Важи от следващото стартиране.","resume.title":"Продължаване на минали сесии","resume.desc":"Добавя чекмедже <code>⟲ Минали сесии</code> в края на всяка група (по подразбиране свито). Отворите ли го, вътре са <b>затворените сесии на Claude Code и Codex</b>, обозначени с подсказката, която наистина сте написали; щракване връща разговора с <code>claude --resume</code> или <code>codex resume</code> в собствената му работна папка. Това е другата половина на <b>Без възстановяване на разделите</b> по-горе — оригиналното възстановяване връща обвивката, а това връща разговора. <b>Сървърите и фоновите процеси, които сте имали пуснати тогава, не се връщат.</b>","agents.head":"Свързване на агентите","agents.intro":"Позволява на всеки агент <b>сам да съобщава</b> състоянието си, модела и лимитите на употреба. Това е най-точният източник, с който разполага страничната лента — без него гадаем по текста, изрисуван на екрана, и отчитането съответно се люшка.","agents.unsupported.title":"Не е налично на тази платформа","agents.unsupported.desc":"Скриптът за известия е на PowerShell, затова работи само под Windows. Състоянието вместо това се отгатва от изхода.","state.on":"Свързано","state.off":"Несвързано","state.half":"Свързано наполовина","btn.install":"Инсталиране","btn.remove":"Премахване","claude.title":"Свързване с Claude","claude.desc":"Сесиите на Claude Code се показват в страничната лента със своето <b>състояние</b> (работи · чака одобрение · готово) и <b>ленти за модел, акаунт и употреба</b>. Куките и <code>statusLine</code> в <code>~/.claude/settings.json</code> се поставят заедно и заедно се премахват. Другите куки не се пипат, а вече съществуващ <code>statusLine</code> се <b>изпълнява непроменен</b> — това, което виждате там, не се променя. Преди записа до файла се оставя резервно копие.","codex.title":"Свързване с Codex","codex.desc":"Сесиите на Codex се показват в страничната лента със своето <b>състояние</b> (работи · чака одобрение · готово · прекъснато) и <b>ленти за модел, акаунт и употреба</b>. След инсталирането отворете Codex отново и прегледайте и одобрете куките на AgentDeck в <code>/hooks</code>.","codex.disabled":"Codex е изключил тези куки — докато не ги включите, нищо не пристига: {events}. Отворете Codex, изпълнете <code>/hooks</code> и ги одобрете.","root.head":"Профил за работната папка","root.intro":"Създава профил, така че новите раздели винаги да се отварят в една и съща папка. Промените важат след рестарт на Tabby.","root.use.title":"Използване на профил за работната папка","root.use.desc":"Включете и попълнете папката — профилът се създава и става профил по подразбиране.","root.name.title":"Име на профила","root.cwd.title":"Работна папка","root.cwd.desc":"Оставите ли празно, профил не се създава. Когато пишете на ръка, използвайте наклонени черти (напр. D:/Project), за да избегнете капаните с екраниране на обратните наклонени черти.","root.browse":"Преглед","root.command.title":"Команда","diag.head":"Съобщаване за проблем","diag.intro":"Събира диагностичните дневници в <b>един zip файл</b> и отваря папката, в която той попада. Съдържа: версиите на приставката и Tabby и операционната система, настройките по-горе и двете най-нови поколения на <code>{path}</code>. В дневниците има <b>заглавия на раздели и пътищата, които сте отваряли</b> — спокойно отворете архива и проверете, преди да го изпратите.","diag.screen.title":"Включване и на суровото съдържание на екрана","diag.screen.desc":"Включете при проблеми с изчертаването. Екранът на терминала влиза дословно — работата и кодът ви се виждат в него — затова по подразбиране е изключено.","diag.collect.title":"Събиране на дневниците","diag.collect.desc":"Приставка v{version}.","diag.made":"Създадено: ","diag.btn":"Събиране","dev.head":"Опции за разработчици","dev.use.title":"Включване на опциите за разработчици","dev.use.desc":"Включва <b>презареждане на живо</b> — щом <code>npm run build</code> презапише <code>dist/index.js</code>, прозорецът се презарежда към новата приставка <b>със запазени сесии</b> (разделите се закачат обратно към същия pty). Клавишната комбинация <b>[dev] Презареждане на приставката</b> също следва този превключвател. При изключено променен dist не прави нищо. Вижда се само при инсталация от изходния код; изданието от npm няма това.","dev.now.title":"Презареждане сега","dev.now.desc":"Презарежда текущия dist без компилиране.","dev.btn":"Презареждане",footer:"Останалото — съотношение на прозореца, ширина на страничната лента, непрозрачност, засичане на състояние, обработка на въвеждането — е фиксирано на стойностите по подразбиране. Ако трябва да смените нещо, редактирайте <code>agentDeck.*</code> направо в конфигурационния файл. Клавишните комбинации са в раздела <b>Клавишни комбинации</b> като <code>agentdeck-*</code>.","keys.head":"Клавишни комбинации","keys.intro":"Клавишите от началната страница. Натиснете <b>Промени</b>, после новия клавиш. Ако вече е зает — от самия Tabby или от AgentDeck — ще ви се каже <b>с какво се сблъсква</b> и можете да изберете отново или да го вземете. Важи веднага.","keys.change":"Промени","keys.default":"По подразбиране","keys.cancel":"Отказ","keys.force":"Използвай все пак","keys.press":"Натиснете новия клавиш… (Esc отказва)","keys.conflict":"Сблъсква се с {names}. Ако го използвате все пак, клавишът се маха оттам.","keys.unbound":"не е зададено","keys.stock":"вградено в Tabby","keys.digit":"Тази трябва да завършва с цифра 1–9 — цифрата е номерът на сесията. Натиснете напр. Alt+1 и 2…9 следват.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, десен клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> в панела не са клавишни комбинации и тук не се променят.","keys.item.newtab":"Нов раздел в работния корен","keys.item.jump":"Към N-тата сесия","keys.item.focus":"Фокус върху списъка със сесии / обратно в терминала","keys.item.view":"Отвори / затвори панела за преглед","keys.item.repair":"Поправи екрана","keys.item.splitright":"Раздели едно до друго (нов панел вдясно)","keys.item.splitbottom":"Раздели горе / долу (нов панел долу)","keys.item.closepane":"Затвори активния разделен панел","keys.item.newline":"Нов ред без изпращане","keys.item.toggle":"Странична лента / 4:3 вкл-изкл","keys.item.viewmode":"Панел: Файлове ↔ Промени"}},1311(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Další pracovní profily","root.choose.desc":"Uložte více pracovních složek a při otevření nové karty vyberte profil.","root.add":"Přidat profil","root.remove":"Odstranit profil","layout.title":"Používat rozvržení AgentDeck","layout.desc":"Po vypnutí zmizí postranní panel i pevná šířka a vrátí se původní vzhled Tabby.","reset.title":"Obnovit rozvržení","reset.desc":"Vrátí postranní panel do výchozího stavu — ukotvený vpravo, se šířkou spočítanou z poměru okna.","reset.now":"Nyní: ukotven {dock}, {size}.","reset.default":"Právě teď je vše ve výchozím stavu.","reset.btn":"Obnovit","dock.left":"vlevo","dock.right":"vpravo","dock.top":"nahoře","dock.bottom":"dole","size.width":"šířka {px} px","size.height":"výška {px} px","size.auto":"šířka automaticky","norecover.title":"Neobnovovat karty při spuštění","norecover.desc":"Tabby se spustí prázdný místo obnovení předchozích karet — vrátí se stejně jen shell a relace Claude uvnitř už dávno skončila. Vypnutím se vrátíte k původnímu chování (<code>recoverTabs</code>). Platí od příštího spuštění.","resume.title":"Navázat na minulé relace","resume.desc":"Přidá na konec každé skupiny zásuvku <code>⟲ Minulé relace</code> (ve výchozím stavu sbalenou). Po rozbalení jsou v ní <b>zavřené relace Claude Code a Codex</b> popsané promptem, který jste skutečně napsali; kliknutím se rozhovor vrátí příkazem <code>claude --resume</code> nebo <code>codex resume</code> v jeho vlastní pracovní složce. Je to druhá polovina volby <b>Neobnovovat karty</b> výše — původní obnova vrátí shell, tohle vrátí rozhovor. <b>Servery a procesy na pozadí, které jste tehdy měli spuštěné, se nevrátí.</b>","agents.head":"Napojení agentů","agents.intro":"Nechá každého agenta, aby <b>sám hlásil</b> svůj stav, model a limity využití. To je nejpřesnější zdroj, který postranní panel má — bez toho hádáme z textu vykresleného na obrazovce a odhad podle toho kolísá.","agents.unsupported.title":"Na této platformě nedostupné","agents.unsupported.desc":"Oznamovací skript je v PowerShellu, takže běží jen ve Windows. Stav se odhaduje z výstupu.","state.on":"Připojeno","state.off":"Nepřipojeno","state.half":"Napojeno zpola","btn.install":"Nainstalovat","btn.remove":"Odebrat","claude.title":"Napojení na Claude","claude.desc":"Relace Claude Code se v postranním panelu zobrazí se svým <b>stavem</b> (pracuje · čeká na schválení · hotovo) a <b>ukazateli modelu, účtu a využití</b>. Háky a <code>statusLine</code> v <code>~/.claude/settings.json</code> se instalují společně a společně se i odebírají. Ostatních háků se to nedotkne a <code>statusLine</code>, kterou jste už měli, se <b>spustí beze změny</b> — co tam vidíte, zůstane stejné. Před zápisem se vedle souboru uloží záloha.","codex.title":"Napojení na Codex","codex.desc":"Relace Codex se v postranním panelu zobrazí se svým <b>stavem</b> (pracuje · čeká na schválení · hotovo · přerušeno) a <b>ukazateli modelu, účtu a využití</b>. Po instalaci otevřete Codex znovu a v <code>/hooks</code> zkontrolujte a schvalte háky AgentDeck.","codex.disabled":"Codex má tyto háky vypnuté — dokud je nezapneš, nic nedorazí: {events}. Otevři Codex, spusť <code>/hooks</code> a schval je.","root.head":"Profil pracovní složky","root.intro":"Vytvoří profil, aby se nové karty vždy otevíraly ve stejné složce. Změny se projeví po restartu Tabby.","root.use.title":"Používat profil pracovní složky","root.use.desc":"Zapněte a vyplňte složku — profil se vytvoří a stane se výchozím.","root.name.title":"Název profilu","root.cwd.title":"Pracovní složka","root.cwd.desc":"Necháte-li prázdné, žádný profil nevznikne. Při ručním psaní používejte lomítka (např. D:/Project), vyhnete se tak pastem s escapováním zpětných lomítek.","root.browse":"Procházet","root.command.title":"Příkaz","diag.head":"Nahlásit problém","diag.intro":"Posbírá diagnostické logy <b>do jednoho zipu</b> a otevře složku, kde skončí. Obsahuje: verze pluginu a Tabby a operační systém, nastavení výše a dvě nejnovější generace <code>{path}</code>. V logách jsou <b>názvy karet a cesty, které jste otevřeli</b> — před odesláním klidně zip otevřete a zkontrolujte.","diag.screen.title":"Přiložit i syrovou obrazovku","diag.screen.desc":"Zapněte u problémů s vykreslováním. Obrazovka terminálu se přiloží doslova — je v ní vidět vaše práce i kód — proto je to ve výchozím stavu vypnuté.","diag.collect.title":"Posbírat logy","diag.collect.desc":"Plugin v{version}.","diag.made":"Vytvořeno: ","diag.btn":"Posbírat","dev.head":"Možnosti pro vývojáře","dev.use.title":"Zapnout možnosti pro vývojáře","dev.use.desc":"Zapne <b>živé načítání</b> — jakmile <code>npm run build</code> přepíše <code>dist/index.js</code>, okno se načte na nový plugin <b>se zachovanými relacemi</b> (karty se znovu připojí ke stejnému pty). Klávesová zkratka <b>[dev] Znovu načíst plugin</b> se řídí stejným přepínačem. Když je vypnuto, změna dist neudělá nic. Zobrazuje se jen u instalace ze zdrojů; sestavení z npm tohle nemá.","dev.now.title":"Načíst znovu","dev.now.desc":"Načte aktuální dist bez sestavení.","dev.btn":"Načíst znovu",footer:"Zbytek — poměr okna, šířka postranního panelu, průhlednost, detekce stavu, zpracování vstupu — je napevno na výchozích hodnotách. Pokud potřebujete něco změnit, upravte <code>agentDeck.*</code> přímo v konfiguračním souboru. Klávesové zkratky najdete na kartě <b>Zkratky</b> pod <code>agentdeck-*</code>.","keys.head":"Zkratky","keys.intro":"Klávesy z úvodní stránky. Stiskněte <b>Změnit</b> a pak novou klávesu. Pokud je už obsazená — samotným Tabby nebo AgentDeckem — dozvíte se, <b>s čím koliduje</b>, a můžete vybrat jinou nebo ji převzít. Platí okamžitě.","keys.change":"Změnit","keys.default":"Výchozí","keys.cancel":"Zrušit","keys.force":"Přesto použít","keys.press":"Stiskněte novou klávesu… (Esc zruší)","keys.conflict":"Koliduje s {names}. Pokud ji přesto použijete, bude tam odebrána.","keys.unbound":"nepřiřazeno","keys.stock":"vestavěné v Tabby","keys.digit":"Tato musí končit číslicí 1–9 — číslice je číslo relace. Stiskněte např. Alt+1 a 2…9 se nastaví stejně.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, pravé tlačítko a <code>Ctrl+F</code> / <code>Ctrl+S</code> v panelu nejsou zkratky a tady se nemění.","keys.item.newtab":"Nová karta v pracovním kořeni","keys.item.jump":"Skočit na N-tou relaci","keys.item.focus":"Fokus na seznam relací / zpět do terminálu","keys.item.view":"Otevřít / zavřít panel náhledu","keys.item.repair":"Opravit obrazovku","keys.item.splitright":"Rozdělit vedle sebe (nový panel vpravo)","keys.item.splitbottom":"Rozdělit nad sebe (nový panel dole)","keys.item.closepane":"Zavřít aktivní rozdělený panel","keys.item.newline":"Nový řádek bez odeslání","keys.item.toggle":"Postranní panel / 4:3 zap-vyp","keys.item.viewmode":"Panel: Soubory ↔ Změny"}},3286(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Flere arbejdsprofiler","root.choose.desc":"Gem flere arbejdsmapper, og vælg en profil, når du åbner en ny fane.","root.add":"Tilføj profil","root.remove":"Fjern profil","layout.title":"Brug AgentDeck-layoutet","layout.desc":"Slå fra, så forsvinder sidepanelet og den faste bredde — Tabby ser ud som normalt igen.","reset.title":"Nulstil layoutet","reset.desc":"Sætter sidepanelet tilbage til udgangspunktet — dokket til højre, med bredden beregnet ud fra vinduets forhold.","reset.now":"Nu: dokket {dock}, {size}.","reset.default":"Lige nu er alt på standardindstillingerne.","reset.btn":"Nulstil","dock.left":"til venstre","dock.right":"til højre","dock.top":"øverst","dock.bottom":"nederst","size.width":"{px} px bred","size.height":"{px} px høj","size.auto":"automatisk bredde","norecover.title":"Gendan ikke faner ved opstart","norecover.desc":"Tabby starter tomt i stedet for at hente de gamle faner tilbage — det, der kommer tilbage, er alligevel kun skallen, og Claude-sessionen indeni er for længst slut. Slå fra for Tabbys oprindelige opførsel (<code>recoverTabs</code>). Gælder fra næste opstart.","resume.title":"Genoptag tidligere sessioner","resume.desc":"Tilføjer en skuffe <code>⟲ Tidligere sessioner</code> sidst i hver gruppe (foldet sammen som standard). Fold den ud, og <b>lukkede Claude Code- og Codex-sessioner</b> står der med den prompt, du faktisk skrev; et klik åbner samtalen igen med <code>claude --resume</code> eller <code>codex resume</code> i dens egen arbejdsmappe. Det er den anden halvdel af <b>Gendan ikke faner</b> ovenfor — den almindelige gendannelse henter skallen, denne henter samtalen. <b>Servere og baggrundsprocesser, du havde kørende, kommer ikke tilbage.</b>","agents.head":"Agentintegration","agents.intro":"Lader hver agent <b>selv melde</b> sin tilstand, sin model og sine forbrugsgrænser. Det er den mest præcise kilde, sidepanelet har — uden den gætter vi ud fra teksten, der tegnes på skærmen, og aflæsningen bliver tilsvarende usikker.","agents.unsupported.title":"Ikke tilgængelig på denne platform","agents.unsupported.desc":"Notifikationsscriptet er PowerShell og kører derfor kun på Windows. Tilstanden gættes i stedet ud fra output.","state.on":"Forbundet","state.off":"Ikke forbundet","state.half":"Halvt forbundet","btn.install":"Installér","btn.remove":"Fjern","claude.title":"Claude-integration","claude.desc":"Claude Code-sessioner vises i sidepanelet med deres <b>tilstand</b> (arbejder · venter på godkendelse · færdig) og <b>bjælker for model, konto og forbrug</b>. Installerer hooks og <code>statusLine</code> i <code>~/.claude/settings.json</code> samlet og fjerner dem samlet. Andre hooks røres ikke, og en <code>statusLine</code>, du allerede havde, køres <b>præcis som den er</b> — det, du ser der, ændrer sig ikke. Der skrives en sikkerhedskopi ved siden af filen først.","codex.title":"Codex-integration","codex.desc":"Codex-sessioner vises i sidepanelet med deres <b>tilstand</b> (arbejder · venter på godkendelse · færdig · afbrudt) og <b>bjælker for model, konto og forbrug</b>. Åbn Codex igen efter installationen, og gennemgå og godkend AgentDeck-hooks under <code>/hooks</code>.","codex.disabled":"Codex har slået disse hooks fra — der kommer intet, før du slår dem til: {events}. Åbn Codex, kør <code>/hooks</code>, og godkend dem.","root.head":"Profil til arbejdsmappe","root.intro":"Opretter en profil, så nye faner altid åbner i den samme mappe. Ændringer træder i kraft efter en genstart af Tabby.","root.use.title":"Brug en profil til arbejdsmappen","root.use.desc":"Slå til og udfyld mappen — profilen oprettes og bliver standard.","root.name.title":"Profilnavn","root.cwd.title":"Arbejdsmappe","root.cwd.desc":"Lader du feltet stå tomt, oprettes der ingen profil. Skriver du det i hånden, så brug skråstreger (f.eks. D:/Project) for at undgå fælderne med omvendte skråstreger.","root.browse":"Gennemse","root.command.title":"Kommando","diag.head":"Rapportér et problem","diag.intro":"Samler diagnostikloggene i <b>én enkelt zip</b> og åbner mappen, den havner i. Den indeholder: versioner af pluginnet og Tabby samt styresystem, indstillingerne ovenfor og de to nyeste generationer af <code>{path}</code>. Loggene indeholder <b>fanetitler og de stier, du har åbnet</b> — du må gerne åbne zipfilen og tjekke, før du sender den.","diag.screen.title":"Tag også den rå skærm med","diag.screen.desc":"Slå til ved problemer med optegningen. Terminalskærmen kommer med ordret — dit arbejde og din kode kan læses i den — derfor er det slået fra som standard.","diag.collect.title":"Saml loggene","diag.collect.desc":"Plugin v{version}.","diag.made":"Oprettet: ","diag.btn":"Saml","dev.head":"Udviklerindstillinger","dev.use.title":"Aktivér udviklerindstillinger","dev.use.desc":"Slår <b>live-genindlæsning</b> til — når <code>npm run build</code> skriver <code>dist/index.js</code> om, genindlæses vinduet til det nye plugin <b>med sessionerne i behold</b> (fanerne kobles tilbage til den samme pty). Genvejen <b>[dev] Genindlæs plugin</b> følger også denne kontakt. Er den slået fra, sker der ingenting, selv om dist ændres. Vises kun ved installation fra kildetræet; npm-bygget har ikke dette.","dev.now.title":"Genindlæs nu","dev.now.desc":"Genindlæser den nuværende dist uden at bygge.","dev.btn":"Genindlæs",footer:"Resten — vinduesforhold, sidepanelets bredde, uigennemsigtighed, tilstandsregistrering, inputhåndtering — er låst til standardværdierne. Skal noget ændres, så redigér <code>agentDeck.*</code> direkte i konfigurationsfilen. Genveje findes under fanen <b>Genveje</b> som <code>agentdeck-*</code>.","keys.head":"Genveje","keys.intro":"Tasterne fra forsiden. Tryk <b>Skift</b> og derefter den nye tast. Er den allerede i brug — af Tabby selv eller af AgentDeck — får du at vide, <b>hvad den støder sammen med</b>, og kan vælge om eller overtage tasten. Gælder straks.","keys.change":"Skift","keys.default":"Standard","keys.cancel":"Annuller","keys.force":"Brug den alligevel","keys.press":"Tryk på den nye tast… (Esc annullerer)","keys.conflict":"Støder sammen med {names}. Bruger du den alligevel, fjernes tasten dér.","keys.unbound":"ikke tildelt","keys.stock":"Tabbys egen","keys.digit":"Denne skal ende på et tal 1–9 — tallet er sessionsnummeret. Tryk fx Alt+1, så følger 2…9 med.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, højreklik og panelets <code>Ctrl+F</code> / <code>Ctrl+S</code> er ikke genvejstaster og ændres ikke her.","keys.item.newtab":"Nyt faneblad i arbejdsroden","keys.item.jump":"Spring til session nr. N","keys.item.focus":"Fokus på sessionslisten / tilbage til terminalen","keys.item.view":"Åbn / luk forhåndsvisningspanelet","keys.item.repair":"Reparér skærmen","keys.item.splitright":"Del side om side (ny rude til højre)","keys.item.splitbottom":"Del over / under (ny rude nedenunder)","keys.item.closepane":"Luk den aktive delte rude","keys.item.newline":"Linjeskift uden at sende","keys.item.toggle":"Sidebjælke / 4:3 til-fra","keys.item.viewmode":"Panel: Filer ↔ Ændringer"}},2858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Weitere Arbeitsprofile","root.choose.desc":"Speichere mehrere Arbeitsordner und wähle beim Öffnen eines neuen Tabs ein Profil.","root.add":"Profil hinzufügen","root.remove":"Profil entfernen","layout.title":"AgentDeck-Layout verwenden","layout.desc":"Ausgeschaltet verschwinden Seitenleiste und feste Breite — Tabby sieht wieder aus wie im Original.","reset.title":"Layout zurücksetzen","reset.desc":"Setzt Position und Größe der Seitenleiste auf den Anfangszustand zurück — rechts angedockt, Breite aus dem Fensterverhältnis berechnet.","reset.now":"Aktuell: {dock} angedockt, {size}.","reset.default":"Aktuell ist alles auf Standard.","reset.btn":"Zurücksetzen","dock.left":"links","dock.right":"rechts","dock.top":"oben","dock.bottom":"unten","size.width":"{px}px breit","size.height":"{px}px hoch","size.auto":"Breite automatisch","norecover.title":"Tabs beim Start nicht wiederherstellen","norecover.desc":"Tabby startet leer, statt die alten Tabs zurückzuholen — zurück kommt ohnehin nur die Shell, und die Claude-Sitzung darin ist längst beendet. Ausgeschaltet gilt wieder das Originalverhalten (<code>recoverTabs</code>). Gilt ab dem nächsten Start.","resume.title":"Frühere Sitzungen fortsetzen","resume.desc":"Hängt an jede Gruppe eine Schublade <code>⟲ Frühere Sitzungen</code> an (standardmäßig zugeklappt). Aufgeklappt stehen dort <b>geschlossene Claude-Code- und Codex-Sitzungen</b> mit dem Prompt, den du damals wirklich getippt hast; ein Klick holt das Gespräch mit <code>claude --resume</code> bzw. <code>codex resume</code> im zugehörigen Arbeitsordner zurück. Das ist die andere Hälfte von <b>Tabs nicht wiederherstellen</b> oben — die Originalwiederherstellung bringt die Shell zurück, das hier bringt das Gespräch zurück. <b>Server und Hintergrundprozesse von damals kommen nicht zurück.</b>","agents.head":"Agent-Anbindung","agents.intro":"Lässt jeden Agenten seinen Zustand, sein Modell und seine Nutzungsgrenzen <b>selbst melden</b>. Das ist die genaueste Quelle, die die Seitenleiste hat — ohne sie raten wir anhand des Textes auf dem Bildschirm, und entsprechend wackelig ist das Ergebnis.","agents.unsupported.title":"Auf dieser Plattform nicht verfügbar","agents.unsupported.desc":"Das Benachrichtigungsskript ist PowerShell und läuft daher nur unter Windows. Der Zustand wird stattdessen aus der Ausgabe geraten.","state.on":"Verbunden","state.off":"Nicht verbunden","state.half":"Halb verbunden","btn.install":"Installieren","btn.remove":"Entfernen","claude.title":"Claude-Anbindung","claude.desc":"Claude-Code-Sitzungen erscheinen in der Seitenleiste mit ihrem <b>Zustand</b> (arbeitet · wartet auf Freigabe · fertig) und <b>Modell, Konto und Nutzungsbalken</b>. Installiert die Hooks und die <code>statusLine</code> in <code>~/.claude/settings.json</code> gemeinsam und entfernt sie gemeinsam. Andere Hooks bleiben unangetastet, und eine bereits vorhandene <code>statusLine</code> wird <b>unverändert ausgeführt</b> — was du dort siehst, ändert sich nicht. Vorher wird eine Sicherung neben der Datei abgelegt.","codex.title":"Codex-Anbindung","codex.desc":"Codex-Sitzungen erscheinen in der Seitenleiste mit ihrem <b>Zustand</b> (arbeitet · wartet auf Freigabe · fertig · abgebrochen) und <b>Modell, Konto und Nutzungsbalken</b>. Öffne Codex nach der Installation neu und prüfe und bestätige die AgentDeck-Hooks unter <code>/hooks</code>.","codex.disabled":"Codex hat diese Hooks abgeschaltet — bis du sie einschaltest, kommt nichts an: {events}. Öffne Codex, führe <code>/hooks</code> aus und bestätige sie.","root.head":"Profil für den Arbeitsordner","root.intro":"Legt ein Profil an, damit neue Tabs immer im selben Ordner starten. Änderungen greifen nach einem Neustart von Tabby.","root.use.title":"Profil für den Arbeitsordner verwenden","root.use.desc":"Einschalten und den Ordner eintragen — das Profil wird angelegt und zum Standard.","root.name.title":"Profilname","root.cwd.title":"Arbeitsordner","root.cwd.desc":"Leer lassen und es wird kein Profil angelegt. Beim Tippen Schrägstriche verwenden (z. B. D:/Project), um Escape-Fallen mit Backslashes zu vermeiden.","root.browse":"Durchsuchen","root.command.title":"Befehl","diag.head":"Problem melden","diag.intro":"Sammelt die Diagnoseprotokolle in <b>einer einzigen ZIP-Datei</b> und öffnet den Ordner, in dem sie landet. Enthalten sind: Plugin-/Tabby-Version und Betriebssystem, die Einstellungen oben sowie die zwei jüngsten Generationen von <code>{path}</code>. In den Protokollen stehen <b>Tab-Titel und die Pfade, die du geöffnet hast</b> — du darfst die ZIP vor dem Senden ruhig prüfen.","diag.screen.title":"Rohen Bildschirminhalt mitschicken","diag.screen.desc":"Für Darstellungsfehler einschalten. Der Terminalinhalt geht wortwörtlich mit — deine Arbeit und dein Code sind darin lesbar — deshalb ist es standardmäßig aus.","diag.collect.title":"Protokolle sammeln","diag.collect.desc":"Plugin v{version}.","diag.made":"Erstellt: ","diag.btn":"Sammeln","dev.head":"Entwickleroptionen","dev.use.title":"Entwickleroptionen aktivieren","dev.use.desc":"Schaltet <b>Live-Reload</b> ein — sobald <code>npm run build</code> <code>dist/index.js</code> neu schreibt, lädt das Fenster das neue Plugin <b>mit erhaltenen Sitzungen</b> (die Tabs hängen sich wieder an dieselbe pty). Der Hotkey <b>[dev] Plugin neu laden</b> folgt ebenfalls diesem Schalter. Ausgeschaltet passiert bei geändertem dist gar nichts. Nur bei Installationen aus dem Quellbaum sichtbar; im npm-Build gibt es das nicht.","dev.now.title":"Jetzt neu laden","dev.now.desc":"Lädt ohne Build das aktuelle dist neu.","dev.btn":"Neu laden",footer:"Der Rest — Fensterverhältnis, Breite der Seitenleiste, Deckkraft, Zustandserkennung, Eingabeverarbeitung — steht fest auf den Standardwerten. Bei Bedarf <code>agentDeck.*</code> direkt in der Konfigurationsdatei ändern. Tastenkürzel liegen im Reiter <b>Hotkeys</b> unter <code>agentdeck-*</code>.","keys.head":"Tastenkürzel","keys.intro":"Die Tasten von der Startseite. <b>Ändern</b> drücken, dann die neue Taste. Ist sie schon belegt – von Tabby selbst oder von AgentDeck – wird gesagt, <b>womit sie kollidiert</b>, und man kann neu wählen oder die Taste übernehmen. Gilt sofort.","keys.change":"Ändern","keys.default":"Standard","keys.cancel":"Abbrechen","keys.force":"Trotzdem verwenden","keys.press":"Neue Taste drücken… (Esc bricht ab)","keys.conflict":"Kollidiert mit {names}. Bei „Trotzdem verwenden“ wird die Taste dort entfernt.","keys.unbound":"nicht belegt","keys.stock":"Tabby-eigen","keys.digit":"Dieser Eintrag muss auf eine Ziffer 1–9 enden – die Ziffer ist die Sitzungsnummer. Z. B. Alt+1 drücken, 2…9 folgen.","keys.fixed":"<code>Strg+V</code>, <code>Strg+W</code>, Rechtsklick und <code>Strg+F</code> / <code>Strg+S</code> im Panel sind keine Hotkeys und werden hier nicht geändert.","keys.item.newtab":"Neuer Tab im Arbeitsordner","keys.item.jump":"Zur N-ten Sitzung springen","keys.item.focus":"Sitzungsliste fokussieren / zurück ins Terminal","keys.item.view":"Vorschau-Panel öffnen / schließen","keys.item.repair":"Bildschirm reparieren","keys.item.splitright":"Nebeneinander teilen (neue Ansicht rechts)","keys.item.splitbottom":"Übereinander teilen (neue Ansicht unten)","keys.item.closepane":"Fokussierte Teilansicht schließen","keys.item.newline":"Zeilenumbruch ohne Senden","keys.item.toggle":"Seitenleiste / 4:3 an-aus","keys.item.viewmode":"Panel: Dateien ↔ Änderungen"}},8674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Additional work root profiles","root.choose.desc":"Save multiple working folders and choose a profile when opening a new tab.","root.add":"Add profile","root.remove":"Remove profile","layout.title":"Use the AgentDeck layout","layout.desc":"Turn this off to drop the sidebar and the fixed-width layout and go back to stock Tabby.","reset.title":"Reset the layout","reset.desc":"Puts the sidebar back where it started — docked right, with the width derived from the window ratio.","reset.now":"Now: docked {dock}, {size}.","reset.default":"It is at the default right now.","reset.btn":"Reset","dock.left":"left","dock.right":"right","dock.top":"top","dock.bottom":"bottom","size.width":"{px}px wide","size.height":"{px}px tall","size.auto":"width auto","norecover.title":"Do not restore tabs on start","norecover.desc":"Tabby starts empty instead of bringing the old tabs back — what comes back is only the shell, and the Claude session inside it is long gone. Turn it off for stock behaviour (<code>recoverTabs</code>). Applies from the next start.","resume.title":"Resume past sessions","resume.desc":"Adds a <code>⟲ Past sessions</code> drawer at the end of each group (collapsed by default). Open it and <b>closed Claude Code and Codex sessions</b> are listed by the prompt you actually typed; clicking one reopens the conversation with <code>claude --resume</code> or <code>codex resume</code> in its own working folder. This is the other half of <b>Do not restore tabs</b> above — stock recovery brings back the shell, this brings back the conversation. <b>Servers and background processes you had running do not come back.</b>","agents.head":"Agent integration","agents.intro":"Lets each agent <b>report</b> its own state, model and usage limits. That is the most accurate source the sidebar has — without it we guess from the text drawn on screen, and the reading wobbles accordingly.","agents.unsupported.title":"Not available on this platform","agents.unsupported.desc":"The notification script is PowerShell, so it only runs on Windows. State is guessed from output instead.","state.on":"Connected","state.off":"Not connected","state.half":"Half-connected","btn.install":"Install","btn.remove":"Remove","claude.title":"Claude integration","claude.desc":"Claude Code sessions show up in the sidebar with their <b>state</b> (working · waiting for approval · done) and <b>model, account and usage bars</b>. Installs the hooks and the <code>statusLine</code> in <code>~/.claude/settings.json</code> together, and removes them together. Other hooks are left alone, and a <code>statusLine</code> you already had is <b>run as-is</b>, so what you see there does not change. A backup is written next to the file first.","codex.title":"Codex integration","codex.desc":"Codex sessions show up in the sidebar with their <b>state</b> (working · waiting for approval · done · interrupted) and <b>model, account and usage bars</b>. After installing, reopen Codex and review and trust the AgentDeck hooks under <code>/hooks</code>.","codex.disabled":"Codex has these hooks turned off — nothing arrives until you enable them: {events}. Open Codex, run <code>/hooks</code>, and trust them.","root.head":"Working-folder profile","root.intro":"Creates a profile so new tabs always open in the same folder. Changes apply after restarting Tabby.","root.use.title":"Use a working-folder profile","root.use.desc":"Turn it on and fill in the folder — the profile is created and becomes the default.","root.name.title":"Profile name","root.cwd.title":"Working folder","root.cwd.desc":"Leave it empty and no profile is made. When typing it by hand use forward slashes (e.g. D:/Project) to dodge backslash-escaping traps.","root.browse":"Browse","root.command.title":"Command","diag.head":"Report a problem","diag.intro":"Collects the diagnostic logs into <b>a single zip</b> and opens the folder it lands in. It contains the plugin/Tabby versions and OS, the settings above, and the two most recent generations of <code>{path}</code>. The logs include <b>tab titles and the paths you opened</b> — feel free to open the zip and check before sending it.","diag.screen.title":"Include the raw screen","diag.screen.desc":"Turn this on for rendering problems. The terminal screen goes in verbatim — your work and code are visible in it — so it is off by default.","diag.collect.title":"Collect the logs","diag.collect.desc":"Plugin v{version}.","diag.made":"Created: ","diag.btn":"Collect","dev.head":"Developer options","dev.use.title":"Enable developer options","dev.use.desc":"Turns on <b>live reload</b> — when <code>npm run build</code> rewrites <code>dist/index.js</code>, the window reloads onto the new plugin <b>with your sessions intact</b> (tabs reattach to the same pty). The <b>[dev] Reload plugin</b> hotkey follows this switch too. Turn it off and a changed dist does nothing. Only shown for source-tree installs; the npm build does not have this.","dev.now.title":"Reload now","dev.now.desc":"Reloads onto the current dist without building.","dev.btn":"Reload",footer:"The rest — window ratio, sidebar width, opacity, state detection, input handling — is pinned to its defaults. Edit <code>agentDeck.*</code> in the config file if you need to change one. Hotkeys live under the <b>Hotkeys</b> tab as <code>agentdeck-*</code>.","keys.head":"Shortcuts","keys.intro":"The keys from the front page. Press <b>Change</b>, then the new key. If it is already taken — by Tabby itself or by AgentDeck — you are told <b>what it clashes with</b> and can pick again or take the key over. Applies immediately.","keys.change":"Change","keys.default":"Default","keys.cancel":"Cancel","keys.force":"Use it anyway","keys.press":"Press the new key… (Esc to cancel)","keys.conflict":"Clashes with {names}. Use it anyway and the key is removed there.","keys.unbound":"unbound","keys.stock":"Tabby's own","keys.digit":"This one has to end in a digit 1–9 — the digit is the session number. Press e.g. Alt+1 and 2…9 follow.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, right-click and the panel's <code>Ctrl+F</code> / <code>Ctrl+S</code> are not hotkeys and are not changed here.","keys.item.newtab":"New tab in the work root","keys.item.jump":"Jump to the Nth session","keys.item.focus":"Focus the session list / back to the terminal","keys.item.view":"Open / close the preview panel","keys.item.repair":"Screen repair","keys.item.splitright":"Split side by side (new pane on the right)","keys.item.splitbottom":"Split top / bottom (new pane below)","keys.item.closepane":"Close the focused split pane","keys.item.newline":"Newline without sending","keys.item.toggle":"Sidebar / 4:3 on-off","keys.item.viewmode":"Panel: Files ↔ Changes"}},1549(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Perfiles de trabajo adicionales","root.choose.desc":"Guarda varias carpetas de trabajo y elige un perfil al abrir una pestaña nueva.","root.add":"Añadir perfil","root.remove":"Eliminar perfil","layout.title":"Usar la disposición de AgentDeck","layout.desc":"Desactívalo para quitar la barra lateral y el ancho fijo y volver a Tabby original.","reset.title":"Restablecer la disposición","reset.desc":"Devuelve la barra lateral a su estado inicial: acoplada a la derecha y con el ancho calculado a partir de la proporción de la ventana.","reset.now":"Ahora: acoplada a la {dock}, {size}.","reset.default":"Ahora mismo está en los valores por defecto.","reset.btn":"Restablecer","dock.left":"izquierda","dock.right":"derecha","dock.top":"parte superior","dock.bottom":"parte inferior","size.width":"{px} px de ancho","size.height":"{px} px de alto","size.auto":"ancho automático","norecover.title":"No restaurar las pestañas al iniciar","norecover.desc":"Tabby arranca vacío en lugar de recuperar las pestañas anteriores: lo único que vuelve es el shell, y la sesión de Claude que había dentro terminó hace rato. Desactívalo para el comportamiento original (<code>recoverTabs</code>). Se aplica a partir del próximo arranque.","resume.title":"Retomar sesiones anteriores","resume.desc":"Añade un cajón <code>⟲ Sesiones anteriores</code> al final de cada grupo (plegado por defecto). Al abrirlo aparecen las <b>sesiones cerradas de Claude Code y Codex</b> identificadas por el prompt que escribiste realmente; al pulsar una, la conversación vuelve con <code>claude --resume</code> o <code>codex resume</code> en su propia carpeta de trabajo. Es la otra mitad de <b>No restaurar las pestañas</b>: la recuperación original trae el shell, esto trae la conversación. <b>Los servidores y procesos en segundo plano que tenías en marcha no vuelven.</b>","agents.head":"Integración de agentes","agents.intro":"Hace que cada agente <b>informe por sí mismo</b> de su estado, su modelo y sus límites de uso. Es la fuente más precisa que tiene la barra lateral: sin ella lo adivinamos a partir del texto dibujado en pantalla, y la lectura se vuelve igual de inestable.","agents.unsupported.title":"No disponible en esta plataforma","agents.unsupported.desc":"El script de notificación es de PowerShell, así que solo funciona en Windows. El estado se deduce de la salida.","state.on":"Conectado","state.off":"Sin conectar","state.half":"Conectado a medias","btn.install":"Instalar","btn.remove":"Quitar","claude.title":"Integración con Claude","claude.desc":"Las sesiones de Claude Code aparecen en la barra lateral con su <b>estado</b> (trabajando · esperando aprobación · terminado) y las <b>barras de modelo, cuenta y uso</b>. Instala a la vez los hooks y la <code>statusLine</code> en <code>~/.claude/settings.json</code>, y los quita a la vez. No toca otros hooks, y una <code>statusLine</code> que ya tuvieras se <b>ejecuta tal cual</b>, así que lo que ves ahí no cambia. Antes se escribe una copia de seguridad junto al archivo.","codex.title":"Integración con Codex","codex.desc":"Las sesiones de Codex aparecen en la barra lateral con su <b>estado</b> (trabajando · esperando aprobación · terminado · interrumpido) y las <b>barras de modelo, cuenta y uso</b>. Tras instalar, vuelve a abrir Codex y revisa y confía en los hooks de AgentDeck en <code>/hooks</code>.","codex.disabled":"Codex tiene estos hooks desactivados: hasta que los actives no llega nada: {events}. Abre Codex, ejecuta <code>/hooks</code> y confía en ellos.","root.head":"Perfil de carpeta de trabajo","root.intro":"Crea un perfil para que las pestañas nuevas se abran siempre en la misma carpeta. Los cambios se aplican tras reiniciar Tabby.","root.use.title":"Usar un perfil de carpeta de trabajo","root.use.desc":"Actívalo y rellena la carpeta: el perfil se crea y pasa a ser el predeterminado.","root.name.title":"Nombre del perfil","root.cwd.title":"Carpeta de trabajo","root.cwd.desc":"Si lo dejas vacío no se crea ningún perfil. Al escribirlo a mano usa barras normales (por ejemplo D:/Project) para esquivar los problemas de escape de las barras invertidas.","root.browse":"Examinar","root.command.title":"Comando","diag.head":"Informar de un problema","diag.intro":"Reúne los registros de diagnóstico en <b>un único zip</b> y abre la carpeta donde queda. Contiene: versiones del plugin y de Tabby y el sistema operativo, los ajustes de arriba y las dos generaciones más recientes de <code>{path}</code>. Los registros incluyen <b>los títulos de las pestañas y las rutas que has abierto</b>: puedes abrir el zip y revisarlo antes de enviarlo.","diag.screen.title":"Incluir el contenido en bruto de la pantalla","diag.screen.desc":"Actívalo para problemas de dibujado. La pantalla del terminal entra literalmente —tu trabajo y tu código se ven en ella—, por eso está desactivado por defecto.","diag.collect.title":"Reunir los registros","diag.collect.desc":"Plugin v{version}.","diag.made":"Creado: ","diag.btn":"Reunir","dev.head":"Opciones de desarrollo","dev.use.title":"Activar las opciones de desarrollo","dev.use.desc":"Activa la <b>recarga en caliente</b>: cuando <code>npm run build</code> reescribe <code>dist/index.js</code>, la ventana recarga el nuevo plugin <b>conservando tus sesiones</b> (las pestañas vuelven a engancharse al mismo pty). El atajo <b>[dev] Recargar el plugin</b> también sigue este interruptor. Desactivado, cambiar dist no hace nada. Solo se ve en instalaciones desde el árbol de código; la versión de npm no lo incluye.","dev.now.title":"Recargar ahora","dev.now.desc":"Recarga el dist actual sin compilar.","dev.btn":"Recargar",footer:"El resto —proporción de la ventana, ancho de la barra lateral, opacidad, detección de estado, gestión de la entrada— está fijado en sus valores por defecto. Si necesitas cambiar alguno, edita <code>agentDeck.*</code> directamente en el archivo de configuración. Los atajos están en la pestaña <b>Atajos</b> como <code>agentdeck-*</code>.","keys.head":"Atajos","keys.intro":"Las teclas de la portada. Pulsa <b>Cambiar</b> y luego la tecla nueva. Si ya está ocupada — por Tabby o por AgentDeck — se te dice <b>con qué choca</b> y puedes elegir otra o quedártela. Se aplica al instante.","keys.change":"Cambiar","keys.default":"Predeterminado","keys.cancel":"Cancelar","keys.force":"Usarla de todos modos","keys.press":"Pulsa la tecla nueva… (Esc cancela)","keys.conflict":"Choca con {names}. Si la usas de todos modos, la tecla se quita de ahí.","keys.unbound":"sin asignar","keys.stock":"propio de Tabby","keys.digit":"Este tiene que acabar en un dígito 1–9 — el dígito es el número de sesión. Pulsa p. ej. Alt+1 y 2…9 le siguen.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, el clic derecho y <code>Ctrl+F</code> / <code>Ctrl+S</code> del panel no son atajos y no se cambian aquí.","keys.item.newtab":"Nueva pestaña en la raíz de trabajo","keys.item.jump":"Ir a la sesión N","keys.item.focus":"Foco en la lista de sesiones / volver a la terminal","keys.item.view":"Abrir / cerrar el panel de vista previa","keys.item.repair":"Reparar la pantalla","keys.item.splitright":"Dividir en horizontal (panel nuevo a la derecha)","keys.item.splitbottom":"Dividir en vertical (panel nuevo abajo)","keys.item.closepane":"Cerrar el panel dividido activo","keys.item.newline":"Salto de línea sin enviar","keys.item.toggle":"Barra lateral / 4:3 on-off","keys.item.viewmode":"Panel: Archivos ↔ Cambios"}},1017(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profils de travail supplémentaires","root.choose.desc":"Enregistrez plusieurs dossiers de travail et choisissez un profil en ouvrant un nouvel onglet.","root.add":"Ajouter un profil","root.remove":"Supprimer le profil","layout.title":"Utiliser la disposition AgentDeck","layout.desc":"Désactivez pour supprimer la barre latérale et la largeur fixe, et revenir à Tabby d’origine.","reset.title":"Réinitialiser la disposition","reset.desc":"Remet la barre latérale dans son état initial — ancrée à droite, largeur calculée à partir du rapport de la fenêtre.","reset.now":"Actuellement : ancrée à {dock}, {size}.","reset.default":"Tout est actuellement à la valeur par défaut.","reset.btn":"Réinitialiser","dock.left":"gauche","dock.right":"droite","dock.top":"en haut","dock.bottom":"en bas","size.width":"{px} px de large","size.height":"{px} px de haut","size.auto":"largeur automatique","norecover.title":"Ne pas restaurer les onglets au démarrage","norecover.desc":"Tabby démarre vide au lieu de rouvrir les anciens onglets — ce qui revient n’est que le shell, et la session Claude qu’il contenait est terminée depuis longtemps. Désactivez pour retrouver le comportement d’origine (<code>recoverTabs</code>). Effectif au prochain démarrage.","resume.title":"Reprendre les sessions passées","resume.desc":"Ajoute un tiroir <code>⟲ Sessions passées</code> à la fin de chaque groupe (replié par défaut). Une fois ouvert, les <b>sessions Claude Code et Codex fermées</b> y figurent avec l’invite que vous aviez réellement tapée ; un clic rouvre la conversation via <code>claude --resume</code> ou <code>codex resume</code> dans son propre dossier de travail. C’est le pendant de <b>Ne pas restaurer les onglets</b> ci-dessus — la restauration d’origine ramène le shell, celle-ci ramène la conversation. <b>Les serveurs et processus d’arrière-plan alors lancés ne reviennent pas.</b>","agents.head":"Intégration des agents","agents.intro":"Permet à chaque agent de <b>signaler lui-même</b> son état, son modèle et ses quotas. C’est la source la plus fiable dont dispose la barre latérale — sans cela, nous devinons à partir du texte affiché à l’écran, et la lecture s’en trouve d’autant plus incertaine.","agents.unsupported.title":"Indisponible sur cette plateforme","agents.unsupported.desc":"Le script de notification est en PowerShell : il ne fonctionne que sous Windows. L’état est alors deviné à partir de la sortie.","state.on":"Connecté","state.off":"Non connecté","state.half":"Connecté à moitié","btn.install":"Installer","btn.remove":"Supprimer","claude.title":"Intégration Claude","claude.desc":"Les sessions Claude Code apparaissent dans la barre latérale avec leur <b>état</b> (en cours · en attente d’approbation · terminé) et les <b>barres de modèle, de compte et de quota</b>. Installe ensemble les hooks et la <code>statusLine</code> dans <code>~/.claude/settings.json</code>, et les supprime ensemble. Les autres hooks ne sont pas touchés, et une <code>statusLine</code> déjà présente est <b>exécutée telle quelle</b> : ce que vous y voyez ne change pas. Une sauvegarde est écrite à côté du fichier au préalable.","codex.title":"Intégration Codex","codex.desc":"Les sessions Codex apparaissent dans la barre latérale avec leur <b>état</b> (en cours · en attente d’approbation · terminé · interrompu) et les <b>barres de modèle, de compte et de quota</b>. Après l’installation, rouvrez Codex puis vérifiez et approuvez les hooks AgentDeck sous <code>/hooks</code>.","codex.disabled":"Codex a désactivé ces hooks — rien n’arrive tant que vous ne les activez pas : {events}. Ouvrez Codex, lancez <code>/hooks</code> et approuvez-les.","root.head":"Profil de dossier de travail","root.intro":"Crée un profil pour que les nouveaux onglets s’ouvrent toujours dans le même dossier. Les modifications prennent effet après un redémarrage de Tabby.","root.use.title":"Utiliser un profil de dossier de travail","root.use.desc":"Activez puis renseignez le dossier — le profil est créé et devient celui par défaut.","root.name.title":"Nom du profil","root.cwd.title":"Dossier de travail","root.cwd.desc":"Laissez vide et aucun profil n’est créé. En saisie manuelle, utilisez des barres obliques (par ex. D:/Project) pour éviter les pièges d’échappement des antislashs.","root.browse":"Parcourir","root.command.title":"Commande","diag.head":"Signaler un problème","diag.intro":"Rassemble les journaux de diagnostic dans <b>une seule archive zip</b> et ouvre le dossier où elle est créée. On y trouve : les versions du plugin et de Tabby, le système, les réglages ci-dessus, et les deux générations les plus récentes de <code>{path}</code>. Les journaux contiennent <b>les titres des onglets et les chemins que vous avez ouverts</b> — n’hésitez pas à ouvrir l’archive pour vérifier avant de l’envoyer.","diag.screen.title":"Inclure le contenu brut de l’écran","diag.screen.desc":"À activer pour les problèmes d’affichage. L’écran du terminal est inclus tel quel — votre travail et votre code y sont lisibles — c’est donc désactivé par défaut.","diag.collect.title":"Rassembler les journaux","diag.collect.desc":"Plugin v{version}.","diag.made":"Créé : ","diag.btn":"Rassembler","dev.head":"Options développeur","dev.use.title":"Activer les options développeur","dev.use.desc":"Active le <b>rechargement à chaud</b> — dès que <code>npm run build</code> réécrit <code>dist/index.js</code>, la fenêtre recharge le nouveau plugin <b>en conservant vos sessions</b> (les onglets se rattachent au même pty). Le raccourci <b>[dev] Recharger le plugin</b> suit également cet interrupteur. Désactivé, un dist modifié ne déclenche rien. Visible uniquement pour les installations depuis les sources ; la version npm n’a pas cette fonction.","dev.now.title":"Recharger maintenant","dev.now.desc":"Recharge le dist actuel sans reconstruire.","dev.btn":"Recharger",footer:"Le reste — rapport de la fenêtre, largeur de la barre latérale, opacité, détection d’état, gestion de la saisie — est figé sur les valeurs par défaut. Modifiez <code>agentDeck.*</code> directement dans le fichier de configuration si nécessaire. Les raccourcis se trouvent dans l’onglet <b>Raccourcis</b> sous <code>agentdeck-*</code>.","keys.head":"Raccourcis","keys.intro":"Les touches de la page d'accueil. Appuyez sur <b>Modifier</b>, puis sur la nouvelle touche. Si elle est déjà prise — par Tabby lui-même ou par AgentDeck — on vous dit <b>avec quoi elle entre en conflit</b> et vous pouvez rechoisir ou la reprendre. S'applique immédiatement.","keys.change":"Modifier","keys.default":"Par défaut","keys.cancel":"Annuler","keys.force":"Utiliser quand même","keys.press":"Appuyez sur la nouvelle touche… (Échap pour annuler)","keys.conflict":"En conflit avec {names}. En l'utilisant quand même, la touche y est retirée.","keys.unbound":"non assigné","keys.stock":"natif Tabby","keys.digit":"Celui-ci doit finir par un chiffre 1–9 — le chiffre est le numéro de session. Appuyez par ex. sur Alt+1 et 2…9 suivent.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, le clic droit et <code>Ctrl+F</code> / <code>Ctrl+S</code> du panneau ne sont pas des raccourcis et ne se changent pas ici.","keys.item.newtab":"Nouvel onglet dans la racine de travail","keys.item.jump":"Aller à la N-ième session","keys.item.focus":"Focus sur la liste des sessions / retour au terminal","keys.item.view":"Ouvrir / fermer le panneau d'aperçu","keys.item.repair":"Réparer l'écran","keys.item.splitright":"Diviser côte à côte (nouveau volet à droite)","keys.item.splitbottom":"Diviser haut / bas (nouveau volet en bas)","keys.item.closepane":"Fermer le volet actif","keys.item.newline":"Nouvelle ligne sans envoyer","keys.item.toggle":"Barre latérale / 4:3 on-off","keys.item.viewmode":"Panneau : Fichiers ↔ Modifications"}},159(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Dodatni radni profili","root.choose.desc":"Spremite više radnih mapa i odaberite profil pri otvaranju nove kartice.","root.add":"Dodaj profil","root.remove":"Ukloni profil","layout.title":"Koristi AgentDeck raspored","layout.desc":"Isključite pa nestaju bočna traka i fiksna širina — Tabby se vraća na izvorni izgled.","reset.title":"Vrati raspored na početno","reset.desc":"Vraća bočnu traku u početno stanje — usidrena desno, sa širinom izračunatom iz omjera prozora.","reset.now":"Sada: usidrena {dock}, {size}.","reset.default":"Trenutačno je sve na zadanim vrijednostima.","reset.btn":"Vrati na početno","dock.left":"lijevo","dock.right":"desno","dock.top":"gore","dock.bottom":"dolje","size.width":"širina {px} px","size.height":"visina {px} px","size.auto":"širina automatski","norecover.title":"Ne vraćaj kartice pri pokretanju","norecover.desc":"Tabby se pokreće prazan umjesto da vraća prijašnje kartice — ionako se vraća samo ljuska, a Claude sesija koja je bila u njoj odavno je gotova. Isključite za izvorno ponašanje (<code>recoverTabs</code>). Vrijedi od sljedećeg pokretanja.","resume.title":"Nastavi prijašnje sesije","resume.desc":"Dodaje ladicu <code>⟲ Prijašnje sesije</code> na kraj svake grupe (zadano sklopljenu). Kad je otvorite, u njoj su <b>zatvorene sesije Claude Codea i Codexa</b> označene promptom koji ste doista upisali; klikom se razgovor vraća naredbom <code>claude --resume</code> ili <code>codex resume</code> u vlastitoj radnoj mapi. To je druga polovica opcije <b>Ne vraćaj kartice</b> iznad — izvorno vraćanje vrati ljusku, ovo vrati razgovor. <b>Poslužitelji i pozadinski procesi koje ste tada imali pokrenute ne vraćaju se.</b>","agents.head":"Povezivanje agenata","agents.intro":"Omogućuje da svaki agent <b>sam javlja</b> svoje stanje, model i ograničenja potrošnje. To je najtočniji izvor koji bočna traka ima — bez toga nagađamo iz teksta iscrtanog na zaslonu, pa očitanje odgovarajuće varira.","agents.unsupported.title":"Nije dostupno na ovoj platformi","agents.unsupported.desc":"Skripta za obavijesti pisana je u PowerShellu pa radi samo na Windowsima. Stanje se umjesto toga nagađa iz ispisa.","state.on":"Povezano","state.off":"Nije povezano","state.half":"Napola povezano","btn.install":"Instaliraj","btn.remove":"Ukloni","claude.title":"Povezivanje s Claudeom","claude.desc":"Sesije Claude Codea pojavljuju se u bočnoj traci sa svojim <b>stanjem</b> (radi · čeka odobrenje · gotovo) i <b>trakama modela, računa i potrošnje</b>. Kuke i <code>statusLine</code> u <code>~/.claude/settings.json</code> postavljaju se zajedno i zajedno uklanjaju. Ostale kuke ne diramo, a <code>statusLine</code> koji ste već imali <b>izvodi se nepromijenjen</b> — ono što ondje vidite ostaje isto. Prije zapisivanja uz datoteku se ostavlja sigurnosna kopija.","codex.title":"Povezivanje s Codexom","codex.desc":"Sesije Codexa pojavljuju se u bočnoj traci sa svojim <b>stanjem</b> (radi · čeka odobrenje · gotovo · prekinuto) i <b>trakama modela, računa i potrošnje</b>. Nakon instalacije ponovno otvorite Codex te pregledajte i odobrite AgentDeck kuke pod <code>/hooks</code>.","codex.disabled":"Codex je isključio ove kuke — dok ih ne uključiš, ništa ne stiže: {events}. Otvori Codex, pokreni <code>/hooks</code> i odobri ih.","root.head":"Profil radne mape","root.intro":"Stvara profil kako bi se nove kartice uvijek otvarale u istoj mapi. Promjene vrijede nakon ponovnog pokretanja Tabbyja.","root.use.title":"Koristi profil radne mape","root.use.desc":"Uključite i upišite mapu — profil se stvara i postaje zadani.","root.name.title":"Naziv profila","root.cwd.title":"Radna mapa","root.cwd.desc":"Ostavite li prazno, profil se ne stvara. Kad upisujete ručno, koristite kose crte (npr. D:/Project) da izbjegnete zamke s izbjegavanjem obrnutih kosih crta.","root.browse":"Pregledaj","root.command.title":"Naredba","diag.head":"Prijavi problem","diag.intro":"Skuplja dijagnostičke zapise u <b>jedan zip</b> i otvara mapu u kojoj završi. Sadrži: verzije dodatka i Tabbyja te operativni sustav, postavke iznad i dva najnovija naraštaja datoteke <code>{path}</code>. U zapisima su <b>naslovi kartica i putanje koje ste otvarali</b> — slobodno otvorite zip i provjerite prije slanja.","diag.screen.title":"Uključi i sirovi sadržaj zaslona","diag.screen.desc":"Uključite kod problema s iscrtavanjem. Zaslon terminala ulazi doslovno — u njemu se vide vaš rad i kod — pa je zadano isključeno.","diag.collect.title":"Skupi zapise","diag.collect.desc":"Dodatak v{version}.","diag.made":"Stvoreno: ","diag.btn":"Skupi","dev.head":"Razvojne mogućnosti","dev.use.title":"Uključi razvojne mogućnosti","dev.use.desc":"Uključuje <b>ponovno učitavanje uživo</b> — čim <code>npm run build</code> prepiše <code>dist/index.js</code>, prozor se ponovno učita na novi dodatak <b>uz očuvane sesije</b> (kartice se ponovno vežu na isti pty). Prečac <b>[dev] Ponovno učitaj dodatak</b> također slijedi ovaj prekidač. Kad je isključeno, promjena dist mape ne radi ništa. Vidljivo samo kod instalacije iz izvornog stabla; npm izdanje ovo nema.","dev.now.title":"Učitaj ponovno sada","dev.now.desc":"Ponovno učitava trenutačni dist bez izgradnje.","dev.btn":"Učitaj ponovno",footer:"Ostalo — omjer prozora, širina bočne trake, prozirnost, otkrivanje stanja, obrada unosa — fiksirano je na zadane vrijednosti. Treba li što promijeniti, uredite <code>agentDeck.*</code> izravno u konfiguracijskoj datoteci. Prečaci su na kartici <b>Prečaci</b> pod <code>agentdeck-*</code>.","keys.head":"Prečaci","keys.intro":"Tipke s naslovne stranice. Pritisnite <b>Promijeni</b>, zatim novu tipku. Ako je već zauzeta — od samog Tabbyja ili AgentDecka — bit će vam rečeno <b>s čime se sudara</b> i možete birati ponovno ili je preuzeti. Vrijedi odmah.","keys.change":"Promijeni","keys.default":"Zadano","keys.cancel":"Odustani","keys.force":"Svejedno koristi","keys.press":"Pritisnite novu tipku… (Esc odustaje)","keys.conflict":"Sudara se s {names}. Ako je svejedno koristite, tipka se ondje uklanja.","keys.unbound":"nije dodijeljeno","keys.stock":"ugrađeno u Tabby","keys.digit":"Ovo mora završavati znamenkom 1–9 — znamenka je broj sesije. Pritisnite npr. Alt+1 i 2…9 slijede.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, desni klik i <code>Ctrl+F</code> / <code>Ctrl+S</code> u panelu nisu prečaci i ovdje se ne mijenjaju.","keys.item.newtab":"Nova kartica u radnom korijenu","keys.item.jump":"Skoči na N-tu sesiju","keys.item.focus":"Fokus na popis sesija / natrag u terminal","keys.item.view":"Otvori / zatvori ploču pretpregleda","keys.item.repair":"Popravi zaslon","keys.item.splitright":"Podijeli jedno uz drugo (novo okno desno)","keys.item.splitbottom":"Podijeli gore / dolje (novo okno dolje)","keys.item.closepane":"Zatvori aktivno podijeljeno okno","keys.item.newline":"Novi red bez slanja","keys.item.toggle":"Bočna traka / 4:3 uklj-isklj","keys.item.viewmode":"Ploča: Datoteke ↔ Promjene"}},8124(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profil kerja tambahan","root.choose.desc":"Simpan beberapa folder kerja dan pilih profil saat membuka tab baru.","root.add":"Tambah profil","root.remove":"Hapus profil","layout.title":"Gunakan tata letak AgentDeck","layout.desc":"Matikan untuk menghilangkan bilah sisi dan lebar tetap, kembali ke tampilan asli Tabby.","reset.title":"Atur ulang tata letak","reset.desc":"Mengembalikan bilah sisi ke keadaan awal — menempel di kanan, dengan lebar dihitung dari rasio jendela.","reset.now":"Sekarang: menempel di {dock}, {size}.","reset.default":"Saat ini semuanya dalam keadaan bawaan.","reset.btn":"Atur ulang","dock.left":"kiri","dock.right":"kanan","dock.top":"atas","dock.bottom":"bawah","size.width":"lebar {px} px","size.height":"tinggi {px} px","size.auto":"lebar otomatis","norecover.title":"Jangan pulihkan tab saat mulai","norecover.desc":"Tabby mulai dalam keadaan kosong alih-alih memulihkan tab lama — yang kembali toh hanya shell-nya, dan sesi Claude di dalamnya sudah lama berakhir. Matikan untuk perilaku asli Tabby (<code>recoverTabs</code>). Berlaku sejak menjalankan berikutnya.","resume.title":"Lanjutkan sesi sebelumnya","resume.desc":"Menambahkan laci <code>⟲ Sesi sebelumnya</code> di akhir tiap grup (terlipat secara bawaan). Setelah dibuka, <b>sesi Claude Code dan Codex yang sudah ditutup</b> terdaftar dengan prompt yang benar-benar Anda ketik; sekali klik, percakapan kembali lewat <code>claude --resume</code> atau <code>codex resume</code> di folder kerjanya sendiri. Ini pasangan dari <b>Jangan pulihkan tab</b> di atas — pemulihan asli mengembalikan shell, yang ini mengembalikan percakapan. <b>Server dan proses latar yang tadinya berjalan tidak ikut kembali.</b>","agents.head":"Integrasi agen","agents.intro":"Membuat tiap agen <b>melaporkan sendiri</b> status, model, dan batas pemakaiannya. Itulah sumber paling akurat yang dimiliki bilah sisi — tanpanya kami menebak dari teks yang tergambar di layar, dan pembacaannya jadi goyah.","agents.unsupported.title":"Tidak tersedia di platform ini","agents.unsupported.desc":"Skrip notifikasi ditulis dengan PowerShell sehingga hanya berjalan di Windows. Status ditebak dari keluaran.","state.on":"Terhubung","state.off":"Belum terhubung","state.half":"Terhubung separuh","btn.install":"Pasang","btn.remove":"Hapus","claude.title":"Integrasi Claude","claude.desc":"Sesi Claude Code muncul di bilah sisi dengan <b>statusnya</b> (bekerja · menunggu persetujuan · selesai) serta <b>bilah model, akun, dan pemakaian</b>. Memasang hook dan <code>statusLine</code> di <code>~/.claude/settings.json</code> sekaligus, dan menghapusnya sekaligus. Hook lain tidak disentuh, dan <code>statusLine</code> yang sudah Anda pakai <b>dijalankan apa adanya</b> sehingga tampilannya tidak berubah. Cadangan ditulis di folder yang sama sebelum menulis.","codex.title":"Integrasi Codex","codex.desc":"Sesi Codex muncul di bilah sisi dengan <b>statusnya</b> (bekerja · menunggu persetujuan · selesai · terhenti) serta <b>bilah model, akun, dan pemakaian</b>. Setelah dipasang, buka kembali Codex lalu periksa dan percayai hook AgentDeck di <code>/hooks</code>.","codex.disabled":"Codex mematikan hook berikut — sebelum dinyalakan tidak ada yang masuk: {events}. Buka Codex, jalankan <code>/hooks</code>, lalu percayai hook itu.","root.head":"Profil folder kerja","root.intro":"Membuat profil khusus agar tab baru selalu terbuka di folder yang sama. Perubahan berlaku setelah Tabby dijalankan ulang.","root.use.title":"Gunakan profil folder kerja","root.use.desc":"Nyalakan lalu isi foldernya — profil dibuat dan menjadi profil bawaan.","root.name.title":"Nama profil","root.cwd.title":"Folder kerja","root.cwd.desc":"Dibiarkan kosong berarti tidak ada profil yang dibuat. Saat mengetik manual, pakai garis miring biasa (mis. D:/Project) untuk menghindari jebakan escape garis miring terbalik.","root.browse":"Telusuri","root.command.title":"Perintah","diag.head":"Laporkan masalah","diag.intro":"Mengumpulkan log diagnostik menjadi <b>satu berkas zip</b> lalu membuka folder tempatnya. Isinya: versi plugin dan Tabby serta sistem operasi, pengaturan di atas, dan dua generasi terbaru dari <code>{path}</code>. Log memuat <b>judul tab dan jalur berkas yang Anda buka</b> — silakan buka zip-nya untuk memeriksa sebelum mengirim.","diag.screen.title":"Sertakan isi layar mentah","diag.screen.desc":"Nyalakan untuk masalah tampilan. Layar terminal ikut apa adanya — pekerjaan dan kode Anda terbaca di dalamnya — karena itu bawaannya mati.","diag.collect.title":"Kumpulkan log","diag.collect.desc":"Plugin v{version}.","diag.made":"Dibuat: ","diag.btn":"Kumpulkan","dev.head":"Opsi pengembang","dev.use.title":"Aktifkan opsi pengembang","dev.use.desc":"Menyalakan <b>muat ulang langsung</b> — begitu <code>npm run build</code> menulis ulang <code>dist/index.js</code>, jendela dimuat ulang ke plugin baru <b>dengan sesi tetap utuh</b> (tab menempel kembali ke pty yang sama). Pintasan <b>[dev] Muat ulang plugin</b> juga mengikuti sakelar ini. Jika dimatikan, perubahan dist tidak melakukan apa-apa. Hanya tampil untuk pemasangan dari kode sumber; versi npm tidak memilikinya.","dev.now.title":"Muat ulang sekarang","dev.now.desc":"Memuat ulang dist saat ini tanpa proses build.","dev.btn":"Muat ulang",footer:"Sisanya — rasio jendela, lebar bilah sisi, opasitas, deteksi status, penanganan masukan — dikunci pada nilai bawaan. Bila perlu diubah, sunting <code>agentDeck.*</code> langsung di berkas konfigurasi. Pintasan ada di tab <b>Pintasan</b> sebagai <code>agentdeck-*</code>.","keys.head":"Pintasan","keys.intro":"Tombol-tombol dari halaman depan. Tekan <b>Ubah</b>, lalu tombol barunya. Jika sudah dipakai — oleh Tabby sendiri atau oleh AgentDeck — Anda diberi tahu <b>bertabrakan dengan apa</b> dan bisa memilih lagi atau mengambil alih tombolnya. Berlaku seketika.","keys.change":"Ubah","keys.default":"Bawaan","keys.cancel":"Batal","keys.force":"Tetap pakai","keys.press":"Tekan tombol baru… (Esc untuk batal)","keys.conflict":"Bertabrakan dengan {names}. Jika tetap dipakai, tombol itu dilepas dari sana.","keys.unbound":"belum diatur","keys.stock":"bawaan Tabby","keys.digit":"Yang ini harus diakhiri angka 1–9 — angkanya adalah nomor sesi. Tekan mis. Alt+1, maka 2…9 mengikuti.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, klik kanan, dan <code>Ctrl+F</code> / <code>Ctrl+S</code> di panel bukan hotkey dan tidak diubah di sini.","keys.item.newtab":"Tab baru di akar kerja","keys.item.jump":"Lompat ke sesi ke-N","keys.item.focus":"Fokus ke daftar sesi / kembali ke terminal","keys.item.view":"Buka / tutup panel pratinjau","keys.item.repair":"Perbaiki layar","keys.item.splitright":"Bagi berdampingan (panel baru di kanan)","keys.item.splitbottom":"Bagi atas / bawah (panel baru di bawah)","keys.item.closepane":"Tutup panel terpisah yang aktif","keys.item.newline":"Baris baru tanpa mengirim","keys.item.toggle":"Bilah samping / 4:3 nyala-mati","keys.item.viewmode":"Panel: Berkas ↔ Perubahan"}},5276(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Profili di lavoro aggiuntivi","root.choose.desc":"Salva più cartelle di lavoro e scegli un profilo quando apri una nuova scheda.","root.add":"Aggiungi profilo","root.remove":"Rimuovi profilo","layout.title":"Usa il layout di AgentDeck","layout.desc":"Disattivandolo spariscono la barra laterale e la larghezza fissa: si torna a Tabby originale.","reset.title":"Reimposta il layout","reset.desc":"Riporta la barra laterale allo stato iniziale — agganciata a destra, con la larghezza calcolata dalle proporzioni della finestra.","reset.now":"Adesso: agganciata a {dock}, {size}.","reset.default":"Al momento è tutto ai valori predefiniti.","reset.btn":"Reimposta","dock.left":"sinistra","dock.right":"destra","dock.top":"in alto","dock.bottom":"in basso","size.width":"{px} px di larghezza","size.height":"{px} px di altezza","size.auto":"larghezza automatica","norecover.title":"Non ripristinare le schede all’avvio","norecover.desc":"Tabby parte vuoto invece di riportare indietro le vecchie schede: quello che torna è solo la shell, e la sessione di Claude che conteneva è finita da un pezzo. Disattiva per il comportamento originale (<code>recoverTabs</code>). Vale dal prossimo avvio.","resume.title":"Riprendi le sessioni passate","resume.desc":"Aggiunge un cassetto <code>⟲ Sessioni passate</code> in fondo a ogni gruppo (chiuso per impostazione predefinita). Aprendolo compaiono le <b>sessioni chiuse di Claude Code e Codex</b> elencate con il prompt che avevi davvero scritto; un clic riapre la conversazione con <code>claude --resume</code> o <code>codex resume</code> nella sua cartella di lavoro. È l’altra metà di <b>Non ripristinare le schede</b> qui sopra: il ripristino originale riporta la shell, questo riporta la conversazione. <b>I server e i processi in background che avevi avviato non tornano.</b>","agents.head":"Integrazione degli agenti","agents.intro":"Fa in modo che ogni agente <b>comunichi da sé</b> il proprio stato, il modello e i limiti d’uso. È la fonte più precisa di cui dispone la barra laterale: senza, si tira a indovinare dal testo disegnato a schermo, e la lettura traballa di conseguenza.","agents.unsupported.title":"Non disponibile su questa piattaforma","agents.unsupported.desc":"Lo script di notifica è in PowerShell, quindi gira solo su Windows. Lo stato viene dedotto dall’output.","state.on":"Collegato","state.off":"Non collegato","state.half":"Collegato a metà","btn.install":"Installa","btn.remove":"Rimuovi","claude.title":"Integrazione con Claude","claude.desc":"Le sessioni di Claude Code compaiono nella barra laterale con il loro <b>stato</b> (al lavoro · in attesa di approvazione · finito) e le <b>barre di modello, account e consumo</b>. Installa insieme gli hook e la <code>statusLine</code> in <code>~/.claude/settings.json</code>, e li rimuove insieme. Gli altri hook non vengono toccati, e una <code>statusLine</code> che avevi già viene <b>eseguita così com’è</b>: quello che vedi lì non cambia. Prima di scrivere viene lasciato un backup nella stessa cartella.","codex.title":"Integrazione con Codex","codex.desc":"Le sessioni di Codex compaiono nella barra laterale con il loro <b>stato</b> (al lavoro · in attesa di approvazione · finito · interrotto) e le <b>barre di modello, account e consumo</b>. Dopo l’installazione riapri Codex e rivedi e autorizza gli hook di AgentDeck in <code>/hooks</code>.","codex.disabled":"Codex ha questi hook disattivati: finché non li attivi non arriva nulla: {events}. Apri Codex, esegui <code>/hooks</code> e autorizzali.","root.head":"Profilo della cartella di lavoro","root.intro":"Crea un profilo perché le nuove schede si aprano sempre nella stessa cartella. Le modifiche valgono dopo il riavvio di Tabby.","root.use.title":"Usa un profilo per la cartella di lavoro","root.use.desc":"Attivalo e indica la cartella: il profilo viene creato e diventa quello predefinito.","root.name.title":"Nome del profilo","root.cwd.title":"Cartella di lavoro","root.cwd.desc":"Se lo lasci vuoto non viene creato alcun profilo. Scrivendolo a mano usa le barre normali (per es. D:/Project) per evitare le trappole di escape dei backslash.","root.browse":"Sfoglia","root.command.title":"Comando","diag.head":"Segnala un problema","diag.intro":"Raccoglie i log diagnostici in <b>un unico zip</b> e apre la cartella in cui finisce. Contiene: versioni del plugin e di Tabby e sistema operativo, le impostazioni qui sopra e le due generazioni più recenti di <code>{path}</code>. Nei log ci sono <b>i titoli delle schede e i percorsi che hai aperto</b>: puoi aprire lo zip e controllare prima di inviarlo.","diag.screen.title":"Includi anche lo schermo grezzo","diag.screen.desc":"Attivalo per i problemi di disegno a schermo. La schermata del terminale entra testualmente — il tuo lavoro e il tuo codice sono leggibili — perciò è disattivato per impostazione predefinita.","diag.collect.title":"Raccogli i log","diag.collect.desc":"Plugin v{version}.","diag.made":"Creato: ","diag.btn":"Raccogli","dev.head":"Opzioni sviluppatore","dev.use.title":"Attiva le opzioni sviluppatore","dev.use.desc":"Attiva il <b>ricaricamento a caldo</b>: quando <code>npm run build</code> riscrive <code>dist/index.js</code>, la finestra ricarica il nuovo plugin <b>mantenendo le sessioni</b> (le schede si riagganciano allo stesso pty). Anche la scorciatoia <b>[dev] Ricarica il plugin</b> segue questo interruttore. Disattivato, modificare dist non fa nulla. Visibile solo per le installazioni da sorgente; la build npm non ha questa funzione.","dev.now.title":"Ricarica adesso","dev.now.desc":"Ricarica il dist attuale senza compilare.","dev.btn":"Ricarica",footer:"Il resto — proporzioni della finestra, larghezza della barra laterale, opacità, rilevamento dello stato, gestione dell’input — è fissato sui valori predefiniti. Se devi cambiarne uno, modifica <code>agentDeck.*</code> direttamente nel file di configurazione. Le scorciatoie stanno nella scheda <b>Scorciatoie</b> come <code>agentdeck-*</code>.","keys.head":"Scorciatoie","keys.intro":"I tasti della pagina iniziale. Premi <b>Cambia</b>, poi il nuovo tasto. Se è già occupato — da Tabby stesso o da AgentDeck — ti viene detto <b>con cosa va in conflitto</b> e puoi riscegliere o prenderlo comunque. Vale subito.","keys.change":"Cambia","keys.default":"Predefinito","keys.cancel":"Annulla","keys.force":"Usalo comunque","keys.press":"Premi il nuovo tasto… (Esc annulla)","keys.conflict":"In conflitto con {names}. Usandolo comunque, il tasto viene tolto da lì.","keys.unbound":"non assegnato","keys.stock":"nativo di Tabby","keys.digit":"Questo deve finire con una cifra 1–9 — la cifra è il numero della sessione. Premi ad es. Alt+1 e 2…9 seguono.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, il clic destro e <code>Ctrl+F</code> / <code>Ctrl+S</code> del pannello non sono scorciatoie e non si cambiano qui.","keys.item.newtab":"Nuova scheda nella radice di lavoro","keys.item.jump":"Vai alla sessione N","keys.item.focus":"Focus sull'elenco sessioni / torna al terminale","keys.item.view":"Apri / chiudi il pannello anteprima","keys.item.repair":"Ripara lo schermo","keys.item.splitright":"Dividi affiancato (nuovo riquadro a destra)","keys.item.splitbottom":"Dividi sopra / sotto (nuovo riquadro sotto)","keys.item.closepane":"Chiudi il riquadro attivo","keys.item.newline":"A capo senza inviare","keys.item.toggle":"Barra laterale / 4:3 on-off","keys.item.viewmode":"Pannello: File ↔ Modifiche"}},588(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"追加の作業ルートプロファイル","root.choose.desc":"複数の作業フォルダーを保存し、新しいタブを開くときにプロファイルを選択します。","root.add":"プロファイルを追加","root.remove":"プロファイルを削除","layout.title":"AgentDeck のレイアウトを使う","layout.desc":"オフにするとサイドバーと固定幅レイアウトが消え、Tabby 標準の画面に戻る。","reset.title":"レイアウトを初期化","reset.desc":"マウスで変えたサイドバーの位置と大きさを初期状態に戻す — 右ドッキング + 画面比から自動計算した幅。","reset.now":"現在: {dock}にドッキング、{size}。","reset.default":"現在は初期状態。","reset.btn":"初期化","dock.left":"左","dock.right":"右","dock.top":"上","dock.bottom":"下","size.width":"幅 {px}px","size.height":"高さ {px}px","size.auto":"幅 自動","norecover.title":"起動時にタブを復元しない","norecover.desc":"オンにすると Tabby は前回のタブを復元せず空の状態で起動する — 戻ってくるのはシェルだけで、その中の Claude セッションはとっくに終わっている。 オフにすると Tabby 標準の動作(<code>recoverTabs</code>)に戻る。次回の起動から有効。","resume.title":"過去のセッションを再開","resume.desc":"各グループの末尾に <code>⟲ 過去のセッション</code> の引き出しを置く(既定は折りたたみ)。 開くと<b>終了した Claude Code・Codex のセッション</b>が、そのとき実際に入力したプロンプトで並ぶ。 クリックすると、そのセッションの作業フォルダで <code>claude --resume</code> または <code>codex resume</code> により会話が復活する。上の<b>タブを復元しない</b>と対になる設定だ — 標準の復元はシェルだけ、こちらは会話を戻す。 <b>ただし当時起動していたサーバーやバックグラウンドのプロセスは戻らない。</b>","agents.head":"エージェント連携","agents.intro":"エージェント自身に、状態・使用中のモデル・利用量を<b>直接報告させる</b>。 これがサイドバーにとって最も正確な情報源だ — 連携しないと画面に描かれた文字から推測することになり、その分だけ判定がぶれる。","agents.unsupported.title":"この環境では使えない","agents.unsupported.desc":"通知スクリプトが PowerShell なので Windows でのみ動作する。状態は出力から推測する。","state.on":"連携済み","state.off":"未連携","state.half":"連携なかば","btn.install":"インストール","btn.remove":"削除","claude.title":"Claude 連携","claude.desc":"Claude Code のセッションがサイドバーに<b>状態</b>(作業中・承認待ち・完了)と<b>モデル・アカウント・利用量バー</b>付きで表示される。 <code>~/.claude/settings.json</code> のフックと <code>statusLine</code> をまとめて設定し、削除もまとめて行う。他のフックには触れず、すでに使っていた <code>statusLine</code> は<b>そのまま実行する</b>ので表示は変わらない。書き込む前に同じフォルダへバックアップを残す。","codex.title":"Codex 連携","codex.desc":"Codex のセッションがサイドバーに<b>状態</b>(作業中・承認待ち・完了・中断)と<b>モデル・アカウント・利用量バー</b>付きで表示される。 インストール後に Codex を開き直し、<code>/hooks</code> で AgentDeck のフックを確認して信頼する必要がある。","codex.disabled":"Codex がこれらのフックを無効にしている — 有効にするまで何も届かない: {events}。 Codex で <code>/hooks</code> を開いて信頼すること。","root.head":"作業フォルダのプロファイル","root.intro":"新しいタブが常に同じ作業フォルダで開くよう専用プロファイルを作る。変更は Tabby の再起動後に反映される。","root.use.title":"作業フォルダのプロファイルを使う","root.use.desc":"オンにして作業フォルダを入れると、そのプロファイルを作成して既定にする。","root.name.title":"プロファイル名","root.cwd.title":"作業フォルダ","root.cwd.desc":"空にするとプロファイルは作らない。手で書くときはバックスラッシュのエスケープの罠を避けるためスラッシュで書く(例: D:/Project)。","root.browse":"参照","root.command.title":"実行コマンド","diag.head":"問題を報告","diag.intro":"診断ログを<b>ひとつの zip にまとめ</b>、そのファイルがあるフォルダを開く。 入るもの: プラグイン/Tabby のバージョンと OS、上の設定値、そして <code>{path}</code> の直近 2 世代。 ログには<b>タブのタイトルと開いたファイルのパス</b>が含まれる — 送る前に開いて確認してかまわない。","diag.screen.title":"画面の生テキストも入れる","diag.screen.desc":"表示が崩れる問題ならオンにする。崩れた瞬間のターミナル画面がそのまま入り(作業内容やコードが見える)、既定ではオフになっている。","diag.collect.title":"診断ログを集める","diag.collect.desc":"プラグイン v{version}。","diag.made":"作成しました: ","diag.btn":"集める","dev.head":"開発者オプション","dev.use.title":"開発者オプションを使う","dev.use.desc":"オンにすると<b>ライブリロード</b>が動く — <code>npm run build</code> で <code>dist/index.js</code> が変わると、<b>セッションを保ったまま</b>ウィンドウをリロードして新しいプラグインへ差し替える(タブは同じ pty に付き直す)。ショートカットタブの <b>[dev] プラグインをリロード</b> もこのスイッチに従う。 オフにすると dist が変わっても何も起きない。 ソースツリーからのインストールでのみ表示され、npm 配布版にこの機能はない。","dev.now.title":"今すぐリロード","dev.now.desc":"ビルドせずに現在の dist で開き直す。","dev.btn":"リロード",footer:"画面比・サイドバーの幅・不透明度・状態検出・入力処理などの残りの値は既定値で固定されている。 変えたい場合は設定ファイルの <code>agentDeck.*</code> を直接編集する。 ショートカットは<b>ホットキー</b>タブの <code>agentdeck-*</code> で変更する。","keys.head":"ショートカット","keys.intro":"トップページに載せたキー。<b>変更</b>を押してから新しいキーを押す。すでに使われているキーなら — Tabby 本体でも AgentDeck でも — <b>何と重なるか</b>を表示し、選び直すかそのキーを奪える。すぐに反映される。","keys.change":"変更","keys.default":"既定値","keys.cancel":"キャンセル","keys.force":"それでも使う","keys.press":"新しいキーを押してください… (Esc で中止)","keys.conflict":"{names} と重なります。それでも使うと、そちらからこのキーを外します。","keys.unbound":"未割り当て","keys.stock":"Tabby 本体","keys.digit":"この項目は 1〜9 の数字で終わる必要がある — 数字がセッション番号になる。例えば Alt+1 を押せば 2…9 も同じ形になる。","keys.fixed":"<code>Ctrl+V</code>・<code>Ctrl+W</code>・右クリック・パネルの <code>Ctrl+F</code> / <code>Ctrl+S</code> はホットキーではないのでここでは変えない。","keys.item.newtab":"作業ルートに新しいタブ","keys.item.jump":"N 番目のセッションへ","keys.item.focus":"セッション一覧にフォーカス / ターミナルへ戻る","keys.item.view":"プレビューパネルの開閉","keys.item.repair":"画面の修復","keys.item.splitright":"左右に分割 (新しいペインは右)","keys.item.splitbottom":"上下に分割 (新しいペインは下)","keys.item.closepane":"フォーカス中の分割ペインを閉じる","keys.item.newline":"送信せずに改行","keys.item.toggle":"サイドバー / 4:3 の切替","keys.item.viewmode":"パネル: ファイル ↔ 変更"}},1675(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"추가 작업 루트 프로필","root.choose.desc":"작업 폴더를 여러 개 저장할 수 있습니다. 새 탭을 열 때 사용할 프로필을 선택합니다.","root.add":"프로필 추가","root.remove":"프로필 삭제","layout.title":"레이아웃 사용","layout.desc":"끄면 사이드바와 고정폭 레이아웃이 사라지고 Tabby 순정 화면으로 돌아간다.","reset.title":"UI 배치 초기화","reset.desc":"마우스로 바꾼 사이드바 위치와 크기를 처음 상태로 되돌린다 — 오른쪽 도킹 + 화면비로 자동 계산한 폭.","reset.now":"지금: {dock} 도킹, {size}.","reset.default":"지금은 기본 상태다.","reset.btn":"초기화","dock.left":"왼쪽","dock.right":"오른쪽","dock.top":"위쪽","dock.bottom":"아래쪽","size.width":"폭 {px}px","size.height":"높이 {px}px","size.auto":"폭 자동","norecover.title":"기동 시 탭 복원 끄기","norecover.desc":"켜면 Tabby 를 다시 열 때 지난 탭을 되살리지 않고 빈 상태로 시작한다 — 복원되는 건 셸뿐이고 그 안의 Claude 세션은 이미 끝나 있어 의미가 없다. 끄면 Tabby 순정 동작(<code>recoverTabs</code>)으로 돌아간다. 다음 기동부터 적용.","resume.title":"지난 세션 이어받기","resume.desc":"그룹 끝에 <code>⟲ 지난 세션</code> 서랍을 둔다 (기본 접힘). 펴면 <b>닫힌 Claude Code·Codex 세션</b>이 그때 친 프롬프트로 보이고, 누르면 그 세션의 작업 폴더에서 <code>claude --resume</code> 또는 <code>codex resume</code> 으로 대화가 되살아난다. 위의 <b>탭 복원 끄기</b> 와 한 쌍이다 — 순정 복원은 셸만 되살리지만 이건 대화를 되살린다. <b>다만 그때 띄워 둔 서버·백그라운드 프로세스는 돌아오지 않는다.</b>","agents.head":"에이전트 연동","agents.intro":"에이전트가 자기 상태와 지금 쓰는 모델·한도를 <b>직접 알려주게</b> 한다. 이게 사이드바의 가장 정확한 원천이다 — 걸지 않으면 화면에 그려진 글자를 보고 추측하는 방식으로 동작하고, 그만큼 판정이 흔들린다.","agents.unsupported.title":"이 환경에서는 걸 수 없다","agents.unsupported.desc":"통보 스크립트가 PowerShell 이라 Windows 에서만 동작한다. 상태는 출력 패턴으로 추측한다.","state.on":"연동됨","state.off":"연동 안 됨","state.half":"반쪽 연동","btn.install":"설치","btn.remove":"제거","claude.title":"Claude 연동","claude.desc":"Claude Code 세션이 사이드바에서 <b>상태</b>(지시 받음 · 승인 대기 · 완료)와 <b>모델 · 계정 · 한도 막대</b>로 보인다. <code>~/.claude/settings.json</code> 의 훅과 <code>statusLine</code> 을 함께 걸고, 제거도 함께 한다. 다른 훅은 건드리지 않고, 이미 쓰던 <code>statusLine</code> 은 <b>그대로 실행해</b> 화면이 바뀌지 않는다. 쓰기 전에 같은 폴더에 백업을 남긴다.","codex.title":"Codex 연동","codex.desc":"Codex 세션이 사이드바에서 <b>상태</b>(진행 중 · 승인 대기 · 완료 · 중단)와 <b>모델 · 계정 · 한도 막대</b>로 보인다. 설치 후 Codex 를 다시 열고 <code>/hooks</code> 에서 AgentDeck 훅을 검토·신뢰해야 동작한다.","codex.disabled":"Codex 가 이 훅들을 꺼 뒀다 — 켜기 전에는 아무것도 오지 않는다: {events}. Codex 에서 <code>/hooks</code> 로 들어가 신뢰할 것.","root.head":"작업 루트 프로필","root.intro":"새 탭이 항상 같은 작업 폴더에서 뜨도록 전용 프로필을 만든다. 변경은 Tabby 재시작 후 적용된다.","root.use.title":"루트 프로필 사용","root.use.desc":"켜고 작업 폴더를 채우면 해당 프로필을 만들어 기본 프로필로 삼는다.","root.name.title":"프로필 이름","root.cwd.title":"작업 폴더","root.cwd.desc":"비우면 프로필을 만들지 않는다. 직접 적을 때는 백슬래시 이스케이프 함정을 피하려고 슬래시로 적는다 (예: D:/Project).","root.browse":"찾아보기","root.command.title":"실행 명령","diag.head":"문제 신고","diag.intro":"버그를 만났을 때 <b>진단 로그를 모아 zip 하나로 만든다</b> — 만든 뒤 그 파일이 있는 폴더가 열린다. 담기는 것: 플러그인/Tabby 버전·OS, 위에 있는 설정 값, 그리고 <code>{path}</code> 의 최근 두 세대. 로그에는 <b>탭 제목과 열어 본 파일 경로</b>가 들어간다 — 보내기 전에 열어 확인해도 된다.","diag.screen.title":"화면 원문까지 넣기","diag.screen.desc":"화면이 깨지는 문제라면 켠다. 깨진 순간의 터미널 화면이 글자 그대로 들어가므로 (작업 내용·코드가 보인다) 기본은 꺼져 있다.","diag.collect.title":"진단 로그 모으기","diag.collect.desc":"플러그인 v{version}.","diag.made":"만들었다: ","diag.btn":"모으기","dev.head":"개발자 옵션","dev.use.title":"개발자 옵션 사용","dev.use.desc":"켜면 <b>라이브 리로드</b>가 돈다 — <code>npm run build</code> 로 <code>dist/index.js</code> 가 바뀌면 <b>세션을 살린 채</b> 창을 리로드해 새 플러그인으로 갈아탄다 (탭은 같은 pty 에 다시 붙는다). 단축키 탭의 <b>[개발] 플러그인 리로드</b> 도 이 스위치를 따라간다. 끄면 dist 가 바뀌어도 아무 일도 일어나지 않는다. 소스 트리 설치에서만 보이고 npm 배포본에는 이 기능이 없다.","dev.now.title":"지금 리로드","dev.now.desc":"빌드 없이 현재 dist 로 다시 띄운다.","dev.btn":"리로드",footer:"화면비·사이드바 폭·투명도·상태 감지·입력 처리 등 나머지 값은 기본값으로 고정돼 있다. 바꿔야 한다면 설정 파일의 <code>agentDeck.*</code> 를 직접 고친다. 단축키는 <b>단축키</b> 탭의 <code>agentdeck-*</code> 항목에서 바꾼다.","keys.head":"단축키","keys.intro":"첫 화면에 올린 키들이다. <b>바꾸기</b>를 누르고 새 키를 누른다. 이미 쓰는 키면 — Tabby 순정이든 AgentDeck 것이든 — <b>무엇과 겹치는지</b> 알려 주고, 다시 고르거나 그 키를 가져올 수 있다. 바로 적용된다.","keys.change":"바꾸기","keys.default":"기본값","keys.cancel":"취소","keys.force":"그래도 쓰기","keys.press":"새 키를 누르세요… (Esc 취소)","keys.conflict":"{names} 와 겹칩니다. 그래도 쓰면 그쪽에서 이 키를 뗍니다.","keys.unbound":"미배정","keys.stock":"Tabby 순정","keys.digit":"이 항목은 1~9 숫자로 끝나야 한다 — 숫자가 곧 세션 번호다. 예를 들어 Alt+1 을 누르면 2…9 가 따라온다.","keys.fixed":"<code>Ctrl+V</code> · <code>Ctrl+W</code> · 우클릭 · 패널의 <code>Ctrl+F</code> / <code>Ctrl+S</code> 는 핫키가 아니라 여기서 바꾸지 않는다.","keys.item.newtab":"작업 루트에 새 탭","keys.item.jump":"N 번째 세션으로","keys.item.focus":"세션 목록에 포커스 / 터미널 복귀","keys.item.view":"미리보기 패널 여닫기","keys.item.repair":"화면 복구","keys.item.splitright":"좌우로 분할 (새 패널이 오른쪽)","keys.item.splitbottom":"위아래로 분할 (새 패널이 아래)","keys.item.closepane":"포커스된 분할 패널 닫기","keys.item.newline":"전송하지 않고 줄바꿈","keys.item.toggle":"사이드바 / 4:3 즉시 on-off","keys.item.viewmode":"패널: 파일 ↔ 변경"}},1773(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Dodatkowe profile robocze","root.choose.desc":"Zapisz wiele folderów roboczych i wybierz profil podczas otwierania nowej karty.","root.add":"Dodaj profil","root.remove":"Usuń profil","layout.title":"Używaj układu AgentDeck","layout.desc":"Po wyłączeniu znikają panel boczny i stała szerokość — wraca zwykły wygląd Tabby.","reset.title":"Zresetuj układ","reset.desc":"Przywraca panel boczny do stanu początkowego — zadokowany po prawej, szerokość wyliczona z proporcji okna.","reset.now":"Teraz: zadokowany {dock}, {size}.","reset.default":"Aktualnie wszystko jest domyślne.","reset.btn":"Resetuj","dock.left":"po lewej","dock.right":"po prawej","dock.top":"u góry","dock.bottom":"u dołu","size.width":"szerokość {px} px","size.height":"wysokość {px} px","size.auto":"szerokość automatyczna","norecover.title":"Nie przywracaj kart przy starcie","norecover.desc":"Tabby startuje pusty zamiast przywracać poprzednie karty — wraca i tak tylko powłoka, a sesja Claude, która w niej była, dawno się skończyła. Wyłącz, aby wrócić do zachowania oryginalnego (<code>recoverTabs</code>). Działa od następnego startu.","resume.title":"Wznów poprzednie sesje","resume.desc":"Dodaje na końcu każdej grupy szufladę <code>⟲ Poprzednie sesje</code> (domyślnie zwiniętą). Po rozwinięciu są tam <b>zamknięte sesje Claude Code i Codex</b> opisane promptem, który naprawdę wpisałeś; kliknięcie przywraca rozmowę poleceniem <code>claude --resume</code> lub <code>codex resume</code> w jej własnym katalogu roboczym. To druga połowa opcji <b>Nie przywracaj kart</b> powyżej — oryginalne przywracanie odtwarza powłokę, to odtwarza rozmowę. <b>Uruchomione wtedy serwery i procesy w tle nie wracają.</b>","agents.head":"Integracja agentów","agents.intro":"Sprawia, że każdy agent <b>sam zgłasza</b> swój stan, model i limity zużycia. To najdokładniejsze źródło, jakie ma panel boczny — bez tego zgadujemy z tekstu narysowanego na ekranie, a ocena odpowiednio się chwieje.","agents.unsupported.title":"Niedostępne na tej platformie","agents.unsupported.desc":"Skrypt powiadomień jest w PowerShellu, więc działa tylko w Windows. Stan jest zgadywany na podstawie wyjścia.","state.on":"Połączono","state.off":"Nie połączono","state.half":"Połączone połowicznie","btn.install":"Zainstaluj","btn.remove":"Usuń","claude.title":"Integracja z Claude","claude.desc":"Sesje Claude Code pojawiają się w panelu bocznym ze swoim <b>stanem</b> (pracuje · czeka na zatwierdzenie · gotowe) oraz <b>paskami modelu, konta i zużycia</b>. Instaluje razem haki i <code>statusLine</code> w <code>~/.claude/settings.json</code> i razem je usuwa. Innych haków nie rusza, a istniejącą już <code>statusLine</code> <b>uruchamia bez zmian</b> — to, co tam widzisz, pozostaje takie samo. Przed zapisem obok pliku zostaje kopia zapasowa.","codex.title":"Integracja z Codex","codex.desc":"Sesje Codex pojawiają się w panelu bocznym ze swoim <b>stanem</b> (pracuje · czeka na zatwierdzenie · gotowe · przerwane) oraz <b>paskami modelu, konta i zużycia</b>. Po instalacji otwórz Codex ponownie i przejrzyj oraz zatwierdź haki AgentDeck w <code>/hooks</code>.","codex.disabled":"Codex ma te haki wyłączone — dopóki ich nie włączysz, nic nie dociera: {events}. Otwórz Codex, uruchom <code>/hooks</code> i zatwierdź je.","root.head":"Profil katalogu roboczego","root.intro":"Tworzy profil, aby nowe karty zawsze otwierały się w tym samym katalogu. Zmiany działają po ponownym uruchomieniu Tabby.","root.use.title":"Używaj profilu katalogu roboczego","root.use.desc":"Włącz i podaj katalog — profil zostanie utworzony i stanie się domyślny.","root.name.title":"Nazwa profilu","root.cwd.title":"Katalog roboczy","root.cwd.desc":"Puste pole oznacza, że profil nie powstanie. Wpisując ręcznie, używaj ukośników (np. D:/Project), aby ominąć pułapki z ucieczką odwrotnych ukośników.","root.browse":"Przeglądaj","root.command.title":"Polecenie","diag.head":"Zgłoś problem","diag.intro":"Zbiera dzienniki diagnostyczne <b>do jednego pliku zip</b> i otwiera katalog, w którym ląduje. Zawiera: wersje wtyczki i Tabby oraz system, ustawienia powyżej i dwie najnowsze generacje <code>{path}</code>. W dziennikach są <b>tytuły kart i ścieżki, które otwierałeś</b> — przed wysłaniem możesz spokojnie otworzyć archiwum i sprawdzić.","diag.screen.title":"Dołącz surową zawartość ekranu","diag.screen.desc":"Włącz przy problemach z rysowaniem. Ekran terminala trafia tam dosłownie — widać w nim twoją pracę i kod — dlatego domyślnie jest wyłączone.","diag.collect.title":"Zbierz dzienniki","diag.collect.desc":"Wtyczka v{version}.","diag.made":"Utworzono: ","diag.btn":"Zbierz","dev.head":"Opcje dewelopera","dev.use.title":"Włącz opcje dewelopera","dev.use.desc":"Włącza <b>przeładowanie na żywo</b> — gdy <code>npm run build</code> nadpisze <code>dist/index.js</code>, okno przeładuje się na nową wtyczkę <b>z zachowaniem sesji</b> (karty podłączą się z powrotem do tego samego pty). Skrót <b>[dev] Przeładuj wtyczkę</b> również podlega temu przełącznikowi. Po wyłączeniu zmiana dist nic nie robi. Widoczne tylko przy instalacji z drzewa źródeł; wersja z npm tego nie ma.","dev.now.title":"Przeładuj teraz","dev.now.desc":"Przeładowuje bieżący dist bez budowania.","dev.btn":"Przeładuj",footer:"Reszta — proporcje okna, szerokość panelu bocznego, krycie, wykrywanie stanu, obsługa wejścia — jest przypięta do wartości domyślnych. Jeśli musisz coś zmienić, edytuj <code>agentDeck.*</code> bezpośrednio w pliku konfiguracyjnym. Skróty znajdziesz w zakładce <b>Skróty</b> jako <code>agentdeck-*</code>.","keys.head":"Skróty","keys.intro":"Klawisze ze strony głównej. Naciśnij <b>Zmień</b>, a potem nowy klawisz. Jeśli jest już zajęty — przez samego Tabby albo AgentDeck — dowiesz się, <b>z czym koliduje</b>, i możesz wybrać inny albo go przejąć. Działa od razu.","keys.change":"Zmień","keys.default":"Domyślne","keys.cancel":"Anuluj","keys.force":"Użyj mimo to","keys.press":"Naciśnij nowy klawisz… (Esc anuluje)","keys.conflict":"Koliduje z {names}. Jeśli użyjesz mimo to, klawisz zostanie tam usunięty.","keys.unbound":"nieprzypisany","keys.stock":"wbudowany w Tabby","keys.digit":"Ten musi kończyć się cyfrą 1–9 — cyfra to numer sesji. Naciśnij np. Alt+1, a 2…9 pójdą za nim.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, prawy przycisk myszy oraz <code>Ctrl+F</code> / <code>Ctrl+S</code> w panelu nie są skrótami i tu się ich nie zmienia.","keys.item.newtab":"Nowa karta w katalogu roboczym","keys.item.jump":"Skocz do N-tej sesji","keys.item.focus":"Fokus na listę sesji / powrót do terminala","keys.item.view":"Otwórz / zamknij panel podglądu","keys.item.repair":"Napraw ekran","keys.item.splitright":"Podziel obok siebie (nowy panel po prawej)","keys.item.splitbottom":"Podziel góra / dół (nowy panel na dole)","keys.item.closepane":"Zamknij aktywny podzielony panel","keys.item.newline":"Nowa linia bez wysyłania","keys.item.toggle":"Pasek boczny / 4:3 wł-wył","keys.item.viewmode":"Panel: Pliki ↔ Zmiany"}},3685(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Perfis de trabalho adicionais","root.choose.desc":"Guarde várias pastas de trabalho e escolha um perfil ao abrir um novo separador.","root.add":"Adicionar perfil","root.remove":"Remover perfil","layout.title":"Usar o layout do AgentDeck","layout.desc":"Desligue para remover a barra lateral e a largura fixa e voltar ao Tabby original.","reset.title":"Repor o layout","reset.desc":"Devolve a barra lateral ao estado inicial — encostada à direita, com a largura calculada a partir da proporção da janela.","reset.now":"Agora: encostada à {dock}, {size}.","reset.default":"Neste momento está tudo nos valores predefinidos.","reset.btn":"Repor","dock.left":"esquerda","dock.right":"direita","dock.top":"parte superior","dock.bottom":"parte inferior","size.width":"{px} px de largura","size.height":"{px} px de altura","size.auto":"largura automática","norecover.title":"Não restaurar separadores ao iniciar","norecover.desc":"O Tabby arranca vazio em vez de trazer de volta os separadores anteriores — o que volta é apenas a shell, e a sessão do Claude que estava lá dentro já terminou há muito. Desligue para o comportamento original (<code>recoverTabs</code>). Aplica-se a partir do próximo arranque.","resume.title":"Retomar sessões anteriores","resume.desc":"Acrescenta uma gaveta <code>⟲ Sessões anteriores</code> no fim de cada grupo (recolhida por predefinição). Ao abrir, aparecem as <b>sessões fechadas do Claude Code e do Codex</b> identificadas pelo prompt que escreveu de facto; ao clicar numa delas, a conversa volta com <code>claude --resume</code> ou <code>codex resume</code> na respetiva pasta de trabalho. É a outra metade de <b>Não restaurar separadores</b> acima — a recuperação original traz a shell, esta traz a conversa. <b>Os servidores e processos em segundo plano que tinha a correr não voltam.</b>","agents.head":"Integração dos agentes","agents.intro":"Faz com que cada agente <b>comunique ele próprio</b> o seu estado, o modelo e os limites de uso. É a fonte mais fiável que a barra lateral tem — sem ela adivinhamos a partir do texto desenhado no ecrã, e a leitura fica igualmente instável.","agents.unsupported.title":"Indisponível nesta plataforma","agents.unsupported.desc":"O script de notificação é em PowerShell, por isso só corre no Windows. O estado passa a ser deduzido a partir do output.","state.on":"Ligado","state.off":"Não ligado","state.half":"Ligado pela metade","btn.install":"Instalar","btn.remove":"Remover","claude.title":"Integração com o Claude","claude.desc":"As sessões do Claude Code aparecem na barra lateral com o seu <b>estado</b> (a trabalhar · à espera de aprovação · concluído) e as <b>barras de modelo, conta e utilização</b>. Instala em conjunto os hooks e a <code>statusLine</code> em <code>~/.claude/settings.json</code>, e remove-os em conjunto. Não mexe nos outros hooks, e uma <code>statusLine</code> que já tivesse é <b>executada tal como está</b>, pelo que o que vê aí não muda. Antes de escrever, é deixada uma cópia de segurança na mesma pasta.","codex.title":"Integração com o Codex","codex.desc":"As sessões do Codex aparecem na barra lateral com o seu <b>estado</b> (a trabalhar · à espera de aprovação · concluído · interrompido) e as <b>barras de modelo, conta e utilização</b>. Depois de instalar, volte a abrir o Codex e reveja e confie nos hooks do AgentDeck em <code>/hooks</code>.","codex.disabled":"O Codex tem estes hooks desligados — até os ligar não chega nada: {events}. Abra o Codex, execute <code>/hooks</code> e confie neles.","root.head":"Perfil da pasta de trabalho","root.intro":"Cria um perfil para que os separadores novos abram sempre na mesma pasta. As alterações aplicam-se depois de reiniciar o Tabby.","root.use.title":"Usar um perfil de pasta de trabalho","root.use.desc":"Ligue e preencha a pasta — o perfil é criado e passa a ser o predefinido.","root.name.title":"Nome do perfil","root.cwd.title":"Pasta de trabalho","root.cwd.desc":"Se deixar vazio não é criado nenhum perfil. Ao escrever à mão use barras normais (por exemplo D:/Project) para evitar as armadilhas de escape das barras invertidas.","root.browse":"Procurar","root.command.title":"Comando","diag.head":"Comunicar um problema","diag.intro":"Junta os registos de diagnóstico <b>num único zip</b> e abre a pasta onde ele fica. Contém: versões do plugin e do Tabby e o sistema operativo, as definições acima, e as duas gerações mais recentes de <code>{path}</code>. Os registos incluem <b>os títulos dos separadores e os caminhos que abriu</b> — pode abrir o zip e verificar antes de o enviar.","diag.screen.title":"Incluir também o ecrã em bruto","diag.screen.desc":"Ligue para problemas de desenho no ecrã. O ecrã do terminal entra tal e qual — o seu trabalho e o seu código ficam visíveis — por isso está desligado por predefinição.","diag.collect.title":"Juntar os registos","diag.collect.desc":"Plugin v{version}.","diag.made":"Criado: ","diag.btn":"Juntar","dev.head":"Opções de programador","dev.use.title":"Ativar as opções de programador","dev.use.desc":"Liga o <b>recarregamento em direto</b> — quando o <code>npm run build</code> reescreve o <code>dist/index.js</code>, a janela recarrega para o novo plugin <b>mantendo as suas sessões</b> (os separadores voltam a ligar-se ao mesmo pty). O atalho <b>[dev] Recarregar o plugin</b> também segue este interruptor. Desligado, alterar o dist não faz nada. Só aparece em instalações a partir do código-fonte; a versão do npm não tem esta funcionalidade.","dev.now.title":"Recarregar agora","dev.now.desc":"Recarrega o dist atual sem compilar.","dev.btn":"Recarregar",footer:"O resto — proporção da janela, largura da barra lateral, opacidade, deteção de estado, tratamento da entrada — está fixado nos valores predefinidos. Se precisar de mudar algum, edite <code>agentDeck.*</code> diretamente no ficheiro de configuração. Os atalhos estão no separador <b>Atalhos</b> como <code>agentdeck-*</code>.","keys.head":"Atalhos","keys.intro":"As teclas da página inicial. Carregue em <b>Alterar</b> e depois na nova tecla. Se já estiver ocupada — pelo próprio Tabby ou pelo AgentDeck — é-lhe dito <b>com o que colide</b> e pode escolher outra ou ficar com ela. Aplica-se de imediato.","keys.change":"Alterar","keys.default":"Padrão","keys.cancel":"Cancelar","keys.force":"Usar mesmo assim","keys.press":"Carregue na nova tecla… (Esc cancela)","keys.conflict":"Colide com {names}. Se usar mesmo assim, a tecla é retirada de lá.","keys.unbound":"sem atribuição","keys.stock":"nativo do Tabby","keys.digit":"Este tem de terminar num dígito 1–9 — o dígito é o número da sessão. Carregue p. ex. em Alt+1 e 2…9 seguem.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, o clique direito e <code>Ctrl+F</code> / <code>Ctrl+S</code> do painel não são atalhos e não se alteram aqui.","keys.item.newtab":"Novo separador na raiz de trabalho","keys.item.jump":"Ir para a sessão N","keys.item.focus":"Foco na lista de sessões / voltar ao terminal","keys.item.view":"Abrir / fechar o painel de pré-visualização","keys.item.repair":"Reparar o ecrã","keys.item.splitright":"Dividir lado a lado (novo painel à direita)","keys.item.splitbottom":"Dividir em cima / em baixo (novo painel em baixo)","keys.item.closepane":"Fechar o painel dividido ativo","keys.item.newline":"Nova linha sem enviar","keys.item.toggle":"Barra lateral / 4:3 ligar-desligar","keys.item.viewmode":"Painel: Ficheiros ↔ Alterações"}},2904(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Дополнительные рабочие профили","root.choose.desc":"Сохраните несколько рабочих папок и выбирайте профиль при открытии новой вкладки.","root.add":"Добавить профиль","root.remove":"Удалить профиль","layout.title":"Использовать раскладку AgentDeck","layout.desc":"Выключите — исчезнут боковая панель и фиксированная ширина, вернётся обычный вид Tabby.","reset.title":"Сбросить раскладку","reset.desc":"Возвращает боковую панель в исходное состояние — закреплена справа, ширина рассчитана из пропорций окна.","reset.now":"Сейчас: закреплена {dock}, {size}.","reset.default":"Сейчас всё в значениях по умолчанию.","reset.btn":"Сбросить","dock.left":"слева","dock.right":"справа","dock.top":"сверху","dock.bottom":"снизу","size.width":"ширина {px} px","size.height":"высота {px} px","size.auto":"ширина автоматически","norecover.title":"Не восстанавливать вкладки при запуске","norecover.desc":"Tabby запускается пустым вместо возврата прежних вкладок — возвращается только оболочка, а сессия Claude внутри неё давно завершена. Выключите, чтобы вернуть штатное поведение (<code>recoverTabs</code>). Действует со следующего запуска.","resume.title":"Продолжить прошлые сессии","resume.desc":"Добавляет в конец каждой группы ящик <code>⟲ Прошлые сессии</code> (по умолчанию свёрнут). Внутри перечислены <b>закрытые сессии Claude Code и Codex</b> — с тем запросом, который вы на самом деле набирали; по клику разговор возвращается через <code>claude --resume</code> или <code>codex resume</code> в своей рабочей папке. Это вторая половина пункта <b>Не восстанавливать вкладки</b> выше: штатное восстановление возвращает оболочку, а это — разговор. <b>Запущенные тогда серверы и фоновые процессы не возвращаются.</b>","agents.head":"Подключение агентов","agents.intro":"Позволяет каждому агенту <b>самому сообщать</b> своё состояние, модель и лимиты. Это самый точный источник для боковой панели — без него мы угадываем по тексту, нарисованному на экране, и оценка соответственно плывёт.","agents.unsupported.title":"Недоступно на этой платформе","agents.unsupported.desc":"Скрипт уведомлений написан на PowerShell, поэтому работает только в Windows. Состояние определяется по выводу.","state.on":"Подключено","state.off":"Не подключено","state.half":"Подключено наполовину","btn.install":"Установить","btn.remove":"Удалить","claude.title":"Подключение Claude","claude.desc":"Сессии Claude Code появляются в боковой панели с <b>состоянием</b> (работает · ждёт подтверждения · готово) и <b>полосами модели, аккаунта и лимитов</b>. Хуки и <code>statusLine</code> в <code>~/.claude/settings.json</code> ставятся вместе и удаляются вместе. Другие хуки не трогаются, а уже имевшаяся <code>statusLine</code> <b>запускается как есть</b> — то, что вы там видите, не меняется. Перед записью рядом с файлом сохраняется резервная копия.","codex.title":"Подключение Codex","codex.desc":"Сессии Codex появляются в боковой панели с <b>состоянием</b> (работает · ждёт подтверждения · готово · прервано) и <b>полосами модели, аккаунта и лимитов</b>. После установки откройте Codex заново и проверьте и подтвердите хуки AgentDeck в <code>/hooks</code>.","codex.disabled":"Codex отключил эти хуки — пока вы их не включите, ничего не приходит: {events}. Откройте Codex, выполните <code>/hooks</code> и подтвердите их.","root.head":"Профиль рабочей папки","root.intro":"Создаёт профиль, чтобы новые вкладки всегда открывались в одной и той же папке. Изменения вступают в силу после перезапуска Tabby.","root.use.title":"Использовать профиль рабочей папки","root.use.desc":"Включите и укажите папку — профиль будет создан и станет профилем по умолчанию.","root.name.title":"Имя профиля","root.cwd.title":"Рабочая папка","root.cwd.desc":"Оставьте пустым — профиль не создаётся. При вводе вручную используйте прямые слеши (например D:/Project), чтобы не попасть в ловушки экранирования обратных слешей.","root.browse":"Обзор","root.command.title":"Команда","diag.head":"Сообщить о проблеме","diag.intro":"Собирает диагностические журналы <b>в один zip</b> и открывает папку, где он появился. Внутри: версии плагина и Tabby, ОС, настройки выше и два последних поколения <code>{path}</code>. В журналах есть <b>заголовки вкладок и пути, которые вы открывали</b> — перед отправкой архив можно открыть и проверить.","diag.screen.title":"Приложить и сырой экран","diag.screen.desc":"Включайте при проблемах с отрисовкой. Экран терминала попадает дословно — в нём видны ваша работа и код, — поэтому по умолчанию выключено.","diag.collect.title":"Собрать журналы","diag.collect.desc":"Плагин v{version}.","diag.made":"Создано: ","diag.btn":"Собрать","dev.head":"Параметры разработчика","dev.use.title":"Включить параметры разработчика","dev.use.desc":"Включает <b>горячую перезагрузку</b>: как только <code>npm run build</code> перезапишет <code>dist/index.js</code>, окно перезагрузится на новый плагин <b>с сохранением сессий</b> (вкладки снова подцепятся к тому же pty). Горячая клавиша <b>[dev] Перезагрузить плагин</b> тоже подчиняется этому переключателю. При выключенном изменение dist ничего не делает. Видно только при установке из исходников; в сборке с npm этого нет.","dev.now.title":"Перезагрузить сейчас","dev.now.desc":"Перезагружает текущий dist без сборки.","dev.btn":"Перезагрузить",footer:"Остальное — пропорции окна, ширина боковой панели, прозрачность, определение состояния, обработка ввода — закреплено на значениях по умолчанию. Если нужно что-то поменять, правьте <code>agentDeck.*</code> прямо в файле конфигурации. Горячие клавиши — на вкладке <b>Горячие клавиши</b> под именами <code>agentdeck-*</code>.","keys.head":"Горячие клавиши","keys.intro":"Клавиши с главной страницы. Нажмите <b>Изменить</b>, затем новую клавишу. Если она уже занята — самим Tabby или AgentDeck — вам скажут, <b>с чем она конфликтует</b>, и можно выбрать другую или забрать эту. Применяется сразу.","keys.change":"Изменить","keys.default":"По умолчанию","keys.cancel":"Отмена","keys.force":"Всё равно использовать","keys.press":"Нажмите новую клавишу… (Esc — отмена)","keys.conflict":"Конфликтует с {names}. Если использовать всё равно, клавиша будет снята оттуда.","keys.unbound":"не назначено","keys.stock":"встроенная в Tabby","keys.digit":"Здесь сочетание должно заканчиваться цифрой 1–9 — цифра и есть номер сессии. Нажмите, например, Alt+1, и 2…9 подстроятся.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, правый клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> в панели — не горячие клавиши, здесь они не меняются.","keys.item.newtab":"Новая вкладка в рабочем корне","keys.item.jump":"Перейти к N-й сессии","keys.item.focus":"Фокус на список сессий / назад в терминал","keys.item.view":"Открыть / закрыть панель предпросмотра","keys.item.repair":"Починить экран","keys.item.splitright":"Разделить по горизонтали (новая панель справа)","keys.item.splitbottom":"Разделить по вертикали (новая панель снизу)","keys.item.closepane":"Закрыть активную разделённую панель","keys.item.newline":"Перенос строки без отправки","keys.item.toggle":"Боковая панель / 4:3 вкл-выкл","keys.item.viewmode":"Панель: Файлы ↔ Изменения"}},4995(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Rekeningnaam (opsioneel)","목록에서 삭제":"Verwyder uit lys","이메일 주소 전체를 입력하세요.":"Voer die volledige e-posadres in.","계정 추가":"Voeg rekening by","계정 (이메일)":"Rekening (e-pos)",비밀번호:"Wagwoord","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Die rekening en wagwoord word as gewone teks op hierdie rekenaar gestoor.",저장:"Stoor",취소:"Kanselleer","계정과 비밀번호를 입력하세요.":"Voer die rekening en wagwoord in.","이미 등록된 계정입니다.":"Hierdie rekening is reeds gestoor.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kon nie die rekening stoor nie. Probeer weer.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kon nie die rekeninglêer lees nie. Kontroleer die JSON-formaat.","+ 버튼으로 계정을 추가하세요.":"Gebruik die +-knoppie om ’n rekening by te voeg.","현재 탭에서 선택한 계정으로 전환합니다.":"Skakel in hierdie oortjie na die gekose rekening.","세션 검색 (제목 · 작업이름 · 폴더)":"Soek sessies (titel · taak · gids)","검색·필터 지우기 (Esc)":"Vee soektog en filters uit (Esc)","계정 선택":"Kies rekening","새 탭":"Nuwe oortjie","+ 새 탭":"+ Nuwe oortjie",설정:"Instellings","화면 복구 (모든 탭 다시 그리기)":"Herstel vertoning (herteken alle oortjies)","미리보기 패널 (md · 이미지 · 표)":"Voorskoupaneel (Markdown · beelde · tabelle)",진행중:"Besig",승인대기:"Wag op goedkeuring","한도 도달":"Gebruikslimiet bereik",완료:"Klaar",오류:"Fout",대기:"Onaktief",기타:"Ander","지난 세션":"Vorige sessies",어제:"Gister","● 열림":"● Oop","탭 닫기":"Sluit oortjie","(제목 없음)":"(Titelloos)","작업 이름":"Taaknaam",닫기:"Sluit",모름:"Onbekend","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Geslote Claude Code · Codex-sessies — klik om te hervat","검색어와 맞는 지난 세션이 없다":"Geen vorige sessies pas by jou soektog nie","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Druk Esc of ✕ om alle sessies te wys","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Skakel statussortering in Instellings af om oortjies te herrangskik","이 탭으로 이동":"Gaan na oortjie","새 탭에서 이어받기":"Hervat in nuwe oortjie","분기해서 이어받기":"Vertak gesprek","세션 ID 복사":"Kopieer sessie-ID","목록에서 숨기기":"Versteek uit lys","↺ 자동 감지로":"↺ Bespeur outomaties","↻ 화면 복구":"↻ Herstel vertoning","패널에 띄우기":"Maak in paneel oop","경로 붙여넣기":"Plak pad","아무것도 하지 않는다":"Kanselleer","다시 묻지 않기":"Moenie weer vra nie","{name} 을 어떻게 할까요?":"Wat wil jy met {name} doen?","{provider} 계정 선택":"Kies {provider}-rekening","{provider} 계정":"{provider}-rekeninge","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Gaan voort met hierdie gesprek in ’n nuwe oortjie met die gekose rekening.","선택한 계정으로 새 대화를 엽니다.":"Begin ’n nuwe gesprek met die gekose rekening.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Geen gestoorde rekeninge nie. Voeg rekeninge by accounts.json."," · 현재 계정":" · Huidige rekening","잔량 조회 중…":"Laai gebruik…","계정 저장 폴더를 준비하지 못했습니다.":"Kon nie die rekeninggids voorberei nie.","사용량 정보 없음":"Gebruik nie beskikbaar nie","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Die oorspronklike oortjie is gesluit. Maak die rekeninglys weer oop.","{name} 인증 확인 중…":"Kontroleer verifikasie vir {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: meld in die blaaier aan. Verifikasie sal outomaties gestoor word.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Verifikasie gestoor. Die oorspronklike oortjie is gesluit; kies die rekening in ’n nuwe gesprek.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kon nie van rekening verander nie. Probeer weer.","새 계정 탭을 열지 못했습니다.":"Kon nie die rekeningoortjie oopmaak nie.","세션 {id}":"Sessie {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Reeds oop — klik om na die oortjie te gaan","누르면 새 탭에서 이어받는다 ({id})":"Klik om in ’n nuwe oortjie te hervat ({id})","작업 폴더: {cwd}":"Werkgids: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Net die gesprek word hervat; bedieners en agtergrondprosesse word nie herbegin nie.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Geen sessies pas by {filter} nie ({total} in totaal)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Uitgevou vir soekresultate (vee soektog uit om in te vou)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} oortjies) — klik om in/uit te vou","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} oortjies sonder ’n bekende werkgids — klik om in/uit te vou","탭 {count}개":"{count} oortjies","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik om filter uit te vee","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik om te filtreer","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}u {m}min","계정: {value}":"Rekening: {value}","버전: {value}":"Weergawe: {value}","폴더: {value}":"Gids: {value}","{tool} 권한":"{tool}-toestemming","입력 대기":"Wag op invoer","플랜 승인":"Plangoedkeuring","질문 응답":"Antwoord op vraag","{time} 리셋":"Herstel: {time}"}},1771(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Име на акаунта (незадължително)","목록에서 삭제":"Премахване от списъка","이메일 주소 전체를 입력하세요.":"Въведете пълния имейл адрес.","계정 추가":"Добавяне на акаунт","계정 (이메일)":"Акаунт (имейл)",비밀번호:"Парола","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Акаунтът и паролата се записват като обикновен текст на този компютър.",저장:"Запазване",취소:"Отказ","계정과 비밀번호를 입력하세요.":"Въведете акаунт и парола.","이미 등록된 계정입니다.":"Този акаунт вече е запазен.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Акаунтът не може да бъде запазен. Опитайте отново.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Файлът с акаунти не може да бъде прочетен. Проверете JSON формата.","+ 버튼으로 계정을 추가하세요.":"Използвайте бутона +, за да добавите акаунт.","현재 탭에서 선택한 계정으로 전환합니다.":"Превключване към избрания акаунт в текущия раздел.","세션 검색 (제목 · 작업이름 · 폴더)":"Търсене на сесии (заглавие · задача · папка)","검색·필터 지우기 (Esc)":"Изчистване на търсенето и филтрите (Esc)","계정 선택":"Избор на акаунт","새 탭":"Нов раздел","+ 새 탭":"+ Нов раздел",설정:"Настройки","화면 복구 (모든 탭 다시 그리기)":"Поправка на изгледа (прерисуване на всички раздели)","미리보기 패널 (md · 이미지 · 표)":"Панел за преглед (Markdown · изображения · таблици)",진행중:"В процес",승인대기:"Чака одобрение","한도 도달":"Лимитът за използване е достигнат",완료:"Готово",오류:"Грешка",대기:"Неактивно",기타:"Други","지난 세션":"Предишни сесии",어제:"Вчера","● 열림":"● Отворена","탭 닫기":"Затваряне на раздела","(제목 없음)":"(Без заглавие)","작업 이름":"Име на задачата",닫기:"Затваряне",모름:"Неизвестно","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Затворени сесии на Claude Code · Codex — щракнете за продължаване","검색어와 맞는 지난 세션이 없다":"Няма предишни сесии, съответстващи на търсенето","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Натиснете Esc или ✕, за да покажете всички сесии","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Изключете сортирането по състояние в настройките, за да пренаредите разделите","이 탭으로 이동":"Към раздела","새 탭에서 이어받기":"Продължаване в нов раздел","분기해서 이어받기":"Разклоняване на разговора","세션 ID 복사":"Копиране на ID на сесията","목록에서 숨기기":"Скриване от списъка","↺ 자동 감지로":"↺ Автоматично откриване","↻ 화면 복구":"↻ Поправка на изгледа","패널에 띄우기":"Отваряне в панела","경로 붙여넣기":"Поставяне на пътя","아무것도 하지 않는다":"Отказ","다시 묻지 않기":"Без повторно питане","{name} 을 어떻게 할까요?":"Какво искате да направите с {name}?","{provider} 계정 선택":"Избор на акаунт за {provider}","{provider} 계정":"Акаунти за {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продължете този разговор в нов раздел с избрания акаунт.","선택한 계정으로 새 대화를 엽니다.":"Започнете нов разговор с избрания акаунт.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Няма запазени акаунти. Добавете акаунти в accounts.json."," · 현재 계정":" · Текущ акаунт","잔량 조회 중…":"Зареждане на използването…","계정 저장 폴더를 준비하지 못했습니다.":"Папката на акаунта не можа да бъде подготвена.","사용량 정보 없음":"Данните за използването са недостъпни","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Първоначалният раздел е затворен. Отворете отново списъка с акаунти.","{name} 인증 확인 중…":"Проверка на удостоверяването за {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: влезте през браузъра. Удостоверяването ще бъде запазено автоматично.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Удостоверяването е запазено. Първоначалният раздел е затворен; изберете акаунта в нов разговор.","계정 전환에 실패했습니다. 다시 선택하세요.":"Акаунтът не можа да бъде сменен. Опитайте отново.","새 계정 탭을 열지 못했습니다.":"Разделът на акаунта не можа да бъде отворен.","세션 {id}":"Сесия {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Вече е отворена — щракнете, за да отидете в раздела","누르면 새 탭에서 이어받는다 ({id})":"Щракнете за продължаване в нов раздел ({id})","작업 폴더: {cwd}":"Работна папка: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Продължава само разговорът; сървърите и фоновите процеси не се рестартират.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Няма сесии за {filter} (общо {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Разгънато за резултатите (изчистете търсенето за свиване)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} раздела) — щракнете за свиване/разгъване","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} раздела без известна работна папка — щракнете за свиване/разгъване","탭 {count}개":"{count} раздела","{status} {count} — 클릭하면 필터 해제":"{status} {count} — щракнете за изчистване на филтъра","{status} {count} — 클릭하면 이 상태만":"{status} {count} — щракнете за филтриране","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Акаунт: {value}","버전: {value}":"Версия: {value}","폴더: {value}":"Папка: {value}","{tool} 권한":"Разрешение за {tool}","입력 대기":"Чака въвеждане","플랜 승인":"Одобрение на план","질문 응답":"Отговор на въпрос","{time} 리셋":"Нулиране: {time}"}},5758(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Název účtu (volitelné)","목록에서 삭제":"Odebrat ze seznamu","이메일 주소 전체를 입력하세요.":"Zadejte celou e-mailovou adresu.","계정 추가":"Přidat účet","계정 (이메일)":"Účet (e-mail)",비밀번호:"Heslo","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Účet a heslo se v tomto počítači ukládají jako prostý text.",저장:"Uložit",취소:"Zrušit","계정과 비밀번호를 입력하세요.":"Zadejte účet a heslo.","이미 등록된 계정입니다.":"Tento účet je již uložen.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Účet nelze uložit. Zkuste to znovu.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Soubor účtů nelze přečíst. Zkontrolujte formát JSON.","+ 버튼으로 계정을 추가하세요.":"Účet přidáte tlačítkem +.","현재 탭에서 선택한 계정으로 전환합니다.":"Přepnout na vybraný účet v aktuální kartě.","세션 검색 (제목 · 작업이름 · 폴더)":"Hledat relace (název · úkol · složka)","검색·필터 지우기 (Esc)":"Vymazat hledání a filtry (Esc)","계정 선택":"Vybrat účet","새 탭":"Nová karta","+ 새 탭":"+ Nová karta",설정:"Nastavení","화면 복구 (모든 탭 다시 그리기)":"Opravit zobrazení (překreslit všechny karty)","미리보기 패널 (md · 이미지 · 표)":"Panel náhledu (Markdown · obrázky · tabulky)",진행중:"Probíhá",승인대기:"Čeká na schválení","한도 도달":"Dosažen limit využití",완료:"Hotovo",오류:"Chyba",대기:"Nečinné",기타:"Ostatní","지난 세션":"Předchozí relace",어제:"Včera","● 열림":"● Otevřeno","탭 닫기":"Zavřít kartu","(제목 없음)":"(Bez názvu)","작업 이름":"Název úkolu",닫기:"Zavřít",모름:"Neznámé","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zavřené relace Claude Code · Codex — kliknutím pokračujte","검색어와 맞는 지난 세션이 없다":"Hledání neodpovídá žádná předchozí relace","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Stisknutím Esc nebo ✕ zobrazíte všechny relace","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Pro změnu pořadí karet vypněte v nastavení řazení podle stavu","이 탭으로 이동":"Přejít na kartu","새 탭에서 이어받기":"Pokračovat na nové kartě","분기해서 이어받기":"Rozvětvit konverzaci","세션 ID 복사":"Kopírovat ID relace","목록에서 숨기기":"Skrýt ze seznamu","↺ 자동 감지로":"↺ Rozpoznávat automaticky","↻ 화면 복구":"↻ Opravit zobrazení","패널에 띄우기":"Otevřít v panelu","경로 붙여넣기":"Vložit cestu","아무것도 하지 않는다":"Zrušit","다시 묻지 않기":"Příště se neptat","{name} 을 어떻게 할까요?":"Co chcete udělat s {name}?","{provider} 계정 선택":"Vybrat účet {provider}","{provider} 계정":"Účty {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Pokračujte v této konverzaci na nové kartě s vybraným účtem.","선택한 계정으로 새 대화를 엽니다.":"Zahajte novou konverzaci s vybraným účtem.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Žádné uložené účty. Přidejte je do accounts.json."," · 현재 계정":" · Aktuální účet","잔량 조회 중…":"Načítání využití…","계정 저장 폴더를 준비하지 못했습니다.":"Nepodařilo se připravit složku účtu.","사용량 정보 없음":"Údaje o využití nejsou dostupné","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Původní karta byla zavřena. Znovu otevřete seznam účtů.","{name} 인증 확인 중…":"Kontrola ověření pro {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: přihlaste se v prohlížeči. Ověření se automaticky uloží.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Ověření uloženo. Původní karta byla zavřena; vyberte účet v nové konverzaci.","계정 전환에 실패했습니다. 다시 선택하세요.":"Účet se nepodařilo přepnout. Zkuste to znovu.","새 계정 탭을 열지 못했습니다.":"Kartu účtu se nepodařilo otevřít.","세션 {id}":"Relace {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Již otevřeno — kliknutím přejdete na kartu","누르면 새 탭에서 이어받는다 ({id})":"Kliknutím pokračujte na nové kartě ({id})","작업 폴더: {cwd}":"Pracovní složka: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Obnoví se pouze konverzace; servery ani procesy na pozadí se nerestartují.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Žádné relace neodpovídají {filter} (celkem {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Rozbaleno pro výsledky hledání (vymažte hledání pro sbalení)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (karet: {count}) — kliknutím sbalit/rozbalit","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Karty bez známé pracovní složky: {count} — kliknutím sbalit/rozbalit","탭 {count}개":"Karet: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — kliknutím zrušit filtr","{status} {count} — 클릭하면 이 상태만":"{status} {count} — kliknutím filtrovat","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Účet: {value}","버전: {value}":"Verze: {value}","폴더: {value}":"Složka: {value}","{tool} 권한":"Oprávnění pro {tool}","입력 대기":"Čeká na vstup","플랜 승인":"Schválení plánu","질문 응답":"Odpověď na otázku","{time} 리셋":"Obnovení: {time}"}},8459(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontonavn (valgfrit)","목록에서 삭제":"Fjern fra listen","이메일 주소 전체를 입력하세요.":"Indtast hele e-mailadressen.","계정 추가":"Tilføj konto","계정 (이메일)":"Konto (e-mail)",비밀번호:"Adgangskode","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto og adgangskode gemmes som klartekst på denne pc.",저장:"Gem",취소:"Annuller","계정과 비밀번호를 입력하세요.":"Indtast konto og adgangskode.","이미 등록된 계정입니다.":"Denne konto er allerede gemt.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kunne ikke gemme kontoen. Prøv igen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kunne ikke læse kontofilen. Kontrollér JSON-formatet.","+ 버튼으로 계정을 추가하세요.":"Brug knappen + til at tilføje en konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Skift til den valgte konto i denne fane.","세션 검색 (제목 · 작업이름 · 폴더)":"Søg i sessioner (titel · opgave · mappe)","검색·필터 지우기 (Esc)":"Ryd søgning og filtre (Esc)","계정 선택":"Vælg konto","새 탭":"Ny fane","+ 새 탭":"+ Ny fane",설정:"Indstillinger","화면 복구 (모든 탭 다시 그리기)":"Reparer visning (gentegn alle faner)","미리보기 패널 (md · 이미지 · 표)":"Forhåndsvisning (Markdown · billeder · tabeller)",진행중:"Arbejder",승인대기:"Afventer godkendelse","한도 도달":"Forbrugsgrænse nået",완료:"Færdig",오류:"Fejl",대기:"Inaktiv",기타:"Andre","지난 세션":"Tidligere sessioner",어제:"I går","● 열림":"● Åben","탭 닫기":"Luk fane","(제목 없음)":"(Uden titel)","작업 이름":"Opgavenavn",닫기:"Luk",모름:"Ukendt","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Lukkede Claude Code · Codex-sessioner — klik for at fortsætte","검색어와 맞는 지난 세션이 없다":"Ingen tidligere sessioner matcher søgningen","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tryk Esc eller ✕ for at vise alle sessioner","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Slå statussortering fra i Indstillinger for at omarrangere faner","이 탭으로 이동":"Gå til fane","새 탭에서 이어받기":"Fortsæt i ny fane","분기해서 이어받기":"Forgren samtale","세션 ID 복사":"Kopiér sessions-ID","목록에서 숨기기":"Skjul fra listen","↺ 자동 감지로":"↺ Registrer automatisk","↻ 화면 복구":"↻ Reparer visning","패널에 띄우기":"Åbn i panel","경로 붙여넣기":"Indsæt sti","아무것도 하지 않는다":"Annuller","다시 묻지 않기":"Spørg ikke igen","{name} 을 어떻게 할까요?":"Hvad vil du gøre med {name}?","{provider} 계정 선택":"Vælg {provider}-konto","{provider} 계정":"{provider}-konti","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Fortsæt denne samtale i en ny fane med den valgte konto.","선택한 계정으로 새 대화를 엽니다.":"Start en ny samtale med den valgte konto.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Ingen gemte konti. Tilføj konti i accounts.json."," · 현재 계정":" · Aktuel konto","잔량 조회 중…":"Indlæser forbrug…","계정 저장 폴더를 준비하지 못했습니다.":"Kunne ikke klargøre kontomappen.","사용량 정보 없음":"Forbrug er ikke tilgængeligt","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Den oprindelige fane blev lukket. Åbn kontolisten igen.","{name} 인증 확인 중…":"Kontrollerer godkendelse for {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: log ind i browseren. Godkendelsen gemmes automatisk.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Godkendelse gemt. Den oprindelige fane blev lukket; vælg kontoen i en ny samtale.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kunne ikke skifte konto. Prøv igen.","새 계정 탭을 열지 못했습니다.":"Kunne ikke åbne kontofanen.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Allerede åben — klik for at gå til fanen","누르면 새 탭에서 이어받는다 ({id})":"Klik for at fortsætte i en ny fane ({id})","작업 폴더: {cwd}":"Arbejdsmappe: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Kun samtalen genoptages; servere og baggrundsprocesser genstartes ikke.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Ingen sessioner matcher {filter} ({total} i alt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Udvidet for søgeresultater (ryd søgningen for at folde sammen)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} faner) — klik for at folde sammen/ud","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} faner uden kendt arbejdsmappe — klik for at folde sammen/ud","탭 {count}개":"{count} faner","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik for at rydde filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik for at filtrere","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}t {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Mappe: {value}","{tool} 권한":"Tilladelse til {tool}","입력 대기":"Afventer input","플랜 승인":"Godkendelse af plan","질문 응답":"Svar på spørgsmål","{time} 리셋":"Nulstilling: {time}"}},2255(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontoname (optional)","목록에서 삭제":"Aus Liste entfernen","이메일 주소 전체를 입력하세요.":"Geben Sie die vollständige E-Mail-Adresse ein.","계정 추가":"Konto hinzufügen","계정 (이메일)":"Konto (E-Mail)",비밀번호:"Passwort","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto und Passwort werden auf diesem PC im Klartext gespeichert.",저장:"Speichern",취소:"Abbrechen","계정과 비밀번호를 입력하세요.":"Konto und Passwort eingeben.","이미 등록된 계정입니다.":"Dieses Konto ist bereits gespeichert.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Konto konnte nicht gespeichert werden. Erneut versuchen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kontodatei konnte nicht gelesen werden. JSON-Format prüfen.","+ 버튼으로 계정을 추가하세요.":"Mit der Schaltfläche + ein Konto hinzufügen.","현재 탭에서 선택한 계정으로 전환합니다.":"In diesem Tab zum ausgewählten Konto wechseln.","세션 검색 (제목 · 작업이름 · 폴더)":"Sitzungen suchen (Titel · Aufgabe · Ordner)","검색·필터 지우기 (Esc)":"Suche und Filter löschen (Esc)","계정 선택":"Konto auswählen","새 탭":"Neuer Tab","+ 새 탭":"+ Neuer Tab",설정:"Einstellungen","화면 복구 (모든 탭 다시 그리기)":"Anzeige reparieren (alle Tabs neu zeichnen)","미리보기 패널 (md · 이미지 · 표)":"Vorschaufenster (Markdown · Bilder · Tabellen)",진행중:"In Bearbeitung",승인대기:"Wartet auf Genehmigung","한도 도달":"Nutzungslimit erreicht",완료:"Fertig",오류:"Fehler",대기:"Inaktiv",기타:"Sonstige","지난 세션":"Frühere Sitzungen",어제:"Gestern","● 열림":"● Offen","탭 닫기":"Tab schließen","(제목 없음)":"(Ohne Titel)","작업 이름":"Aufgabenname",닫기:"Schließen",모름:"Unbekannt","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Geschlossene Claude Code · Codex-Sitzungen — zum Fortsetzen klicken","검색어와 맞는 지난 세션이 없다":"Keine früheren Sitzungen entsprechen der Suche","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Esc oder ✕ drücken, um alle Sitzungen anzuzeigen","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Zum Umsortieren der Tabs die Statussortierung in den Einstellungen deaktivieren","이 탭으로 이동":"Zum Tab wechseln","새 탭에서 이어받기":"In neuem Tab fortsetzen","분기해서 이어받기":"Gespräch verzweigen","세션 ID 복사":"Sitzungs-ID kopieren","목록에서 숨기기":"Aus Liste ausblenden","↺ 자동 감지로":"↺ Automatisch erkennen","↻ 화면 복구":"↻ Anzeige reparieren","패널에 띄우기":"Im Fenster öffnen","경로 붙여넣기":"Pfad einfügen","아무것도 하지 않는다":"Abbrechen","다시 묻지 않기":"Nicht erneut fragen","{name} 을 어떻게 할까요?":"Was möchten Sie mit {name} tun?","{provider} 계정 선택":"{provider}-Konto auswählen","{provider} 계정":"{provider}-Konten","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Dieses Gespräch mit dem ausgewählten Konto in einem neuen Tab fortsetzen.","선택한 계정으로 새 대화를 엽니다.":"Ein neues Gespräch mit dem ausgewählten Konto beginnen.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Keine gespeicherten Konten. Konten in accounts.json hinzufügen."," · 현재 계정":" · Aktuelles Konto","잔량 조회 중…":"Nutzung wird geladen…","계정 저장 폴더를 준비하지 못했습니다.":"Der Kontoordner konnte nicht vorbereitet werden.","사용량 정보 없음":"Nutzungsdaten nicht verfügbar","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Der ursprüngliche Tab wurde geschlossen. Kontoliste erneut öffnen.","{name} 인증 확인 중…":"Authentifizierung für {name} wird geprüft…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: Im Browser anmelden. Die Authentifizierung wird automatisch gespeichert.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentifizierung gespeichert. Der ursprüngliche Tab wurde geschlossen; das Konto in einem neuen Gespräch auswählen.","계정 전환에 실패했습니다. 다시 선택하세요.":"Kontowechsel fehlgeschlagen. Bitte erneut versuchen.","새 계정 탭을 열지 못했습니다.":"Der Konto-Tab konnte nicht geöffnet werden.","세션 {id}":"Sitzung {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Bereits geöffnet — zum Tab wechseln","누르면 새 탭에서 이어받는다 ({id})":"Klicken, um in neuem Tab fortzusetzen ({id})","작업 폴더: {cwd}":"Arbeitsordner: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Nur das Gespräch wird fortgesetzt; Server und Hintergrundprozesse werden nicht neu gestartet.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Keine Sitzungen für {filter} ({total} insgesamt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Für Suchergebnisse aufgeklappt (Suche löschen zum Einklappen)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} Tabs) — zum Ein-/Ausklappen klicken","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} Tabs ohne bekannten Arbeitsordner — zum Ein-/Ausklappen klicken","탭 {count}개":"{count} Tabs","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klicken, um den Filter zu löschen","{status} {count} — 클릭하면 이 상태만":"{status} {count} — zum Filtern klicken","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Ordner: {value}","{tool} 권한":"Berechtigung für {tool}","입력 대기":"Wartet auf Eingabe","플랜 승인":"Plangenehmigung","질문 응답":"Frage beantworten","{time} 리셋":"Zurücksetzung: {time}"}},1948(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nombre de cuenta (opcional)","목록에서 삭제":"Quitar de la lista","이메일 주소 전체를 입력하세요.":"Introduce la dirección de correo completa.","계정 추가":"Añadir cuenta","계정 (이메일)":"Cuenta (correo)",비밀번호:"Contraseña","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"La cuenta y la contraseña se guardan en texto sin cifrar en este PC.",저장:"Guardar",취소:"Cancelar","계정과 비밀번호를 입력하세요.":"Introduce la cuenta y la contraseña.","이미 등록된 계정입니다.":"Esta cuenta ya está guardada.","계정을 저장하지 못했습니다. 다시 시도하세요.":"No se pudo guardar la cuenta. Inténtalo de nuevo.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"No se pudo leer el archivo de cuentas. Comprueba el formato JSON.","+ 버튼으로 계정을 추가하세요.":"Usa el botón + para añadir una cuenta.","현재 탭에서 선택한 계정으로 전환합니다.":"Cambiar a la cuenta seleccionada en esta pestaña.","세션 검색 (제목 · 작업이름 · 폴더)":"Buscar sesiones (título · tarea · carpeta)","검색·필터 지우기 (Esc)":"Borrar búsqueda y filtros (Esc)","계정 선택":"Seleccionar cuenta","새 탭":"Nueva pestaña","+ 새 탭":"+ Nueva pestaña",설정:"Ajustes","화면 복구 (모든 탭 다시 그리기)":"Reparar pantalla (redibujar todas las pestañas)","미리보기 패널 (md · 이미지 · 표)":"Panel de vista previa (Markdown · imágenes · tablas)",진행중:"En curso",승인대기:"Esperando aprobación","한도 도달":"Límite de uso alcanzado",완료:"Finalizado",오류:"Error",대기:"Inactivo",기타:"Otros","지난 세션":"Sesiones anteriores",어제:"Ayer","● 열림":"● Abierta","탭 닫기":"Cerrar pestaña","(제목 없음)":"(Sin título)","작업 이름":"Nombre de la tarea",닫기:"Cerrar",모름:"Desconocido","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sesiones cerradas de Claude Code · Codex — haz clic para continuar","검색어와 맞는 지난 세션이 없다":"Ninguna sesión anterior coincide con la búsqueda","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pulsa Esc o ✕ para mostrar todas las sesiones","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Desactiva la ordenación por estado en Ajustes para reordenar las pestañas","이 탭으로 이동":"Ir a la pestaña","새 탭에서 이어받기":"Continuar en nueva pestaña","분기해서 이어받기":"Crear una rama de la conversación","세션 ID 복사":"Copiar ID de sesión","목록에서 숨기기":"Ocultar de la lista","↺ 자동 감지로":"↺ Detectar automáticamente","↻ 화면 복구":"↻ Reparar pantalla","패널에 띄우기":"Abrir en el panel","경로 붙여넣기":"Pegar ruta","아무것도 하지 않는다":"Cancelar","다시 묻지 않기":"No volver a preguntar","{name} 을 어떻게 할까요?":"¿Qué quieres hacer con {name}?","{provider} 계정 선택":"Seleccionar cuenta de {provider}","{provider} 계정":"Cuentas de {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continuar esta conversación en una nueva pestaña con la cuenta seleccionada.","선택한 계정으로 새 대화를 엽니다.":"Iniciar una nueva conversación con la cuenta seleccionada.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"No hay cuentas guardadas. Añade cuentas a accounts.json."," · 현재 계정":" · Cuenta actual","잔량 조회 중…":"Cargando uso…","계정 저장 폴더를 준비하지 못했습니다.":"No se pudo preparar la carpeta de la cuenta.","사용량 정보 없음":"Uso no disponible","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"La pestaña original se cerró. Abre de nuevo la lista de cuentas.","{name} 인증 확인 중…":"Comprobando la autenticación de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: inicia sesión en el navegador. La autenticación se guardará automáticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticación guardada. La pestaña original se cerró; selecciona la cuenta en una nueva conversación.","계정 전환에 실패했습니다. 다시 선택하세요.":"No se pudo cambiar de cuenta. Inténtalo de nuevo.","새 계정 탭을 열지 못했습니다.":"No se pudo abrir la pestaña de la cuenta.","세션 {id}":"Sesión {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Ya está abierta — haz clic para ir a la pestaña","누르면 새 탭에서 이어받는다 ({id})":"Haz clic para continuar en una nueva pestaña ({id})","작업 폴더: {cwd}":"Carpeta de trabajo: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Solo se reanuda la conversación; los servidores y procesos en segundo plano no se reinician.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Ninguna sesión coincide con {filter} ({total} en total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expandido para la búsqueda (bórrala para contraer)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} pestañas) — haz clic para contraer/expandir","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} pestañas sin carpeta de trabajo conocida — haz clic para contraer/expandir","탭 {count}개":"{count} pestañas","{status} {count} — 클릭하면 필터 해제":"{status} {count} — haz clic para borrar el filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — haz clic para filtrar","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Cuenta: {value}","버전: {value}":"Versión: {value}","폴더: {value}":"Carpeta: {value}","{tool} 권한":"Permiso de {tool}","입력 대기":"Esperando entrada","플랜 승인":"Aprobación del plan","질문 응답":"Respuesta a pregunta","{time} 리셋":"Restablecimiento: {time}"}},3940(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nom du compte (facultatif)","목록에서 삭제":"Retirer de la liste","이메일 주소 전체를 입력하세요.":"Saisissez l’adresse e-mail complète.","계정 추가":"Ajouter un compte","계정 (이메일)":"Compte (e-mail)",비밀번호:"Mot de passe","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Le compte et le mot de passe sont enregistrés en clair sur ce PC.",저장:"Enregistrer",취소:"Annuler","계정과 비밀번호를 입력하세요.":"Saisissez un compte et un mot de passe.","이미 등록된 계정입니다.":"Ce compte est déjà enregistré.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Impossible d’enregistrer le compte. Réessayez.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Impossible de lire le fichier des comptes. Vérifiez le format JSON.","+ 버튼으로 계정을 추가하세요.":"Utilisez le bouton + pour ajouter un compte.","현재 탭에서 선택한 계정으로 전환합니다.":"Passer au compte sélectionné dans cet onglet.","세션 검색 (제목 · 작업이름 · 폴더)":"Rechercher des sessions (titre · tâche · dossier)","검색·필터 지우기 (Esc)":"Effacer la recherche et les filtres (Échap)","계정 선택":"Choisir un compte","새 탭":"Nouvel onglet","+ 새 탭":"+ Nouvel onglet",설정:"Paramètres","화면 복구 (모든 탭 다시 그리기)":"Réparer l’affichage (redessiner tous les onglets)","미리보기 패널 (md · 이미지 · 표)":"Panneau d’aperçu (Markdown · images · tableaux)",진행중:"En cours",승인대기:"En attente d’approbation","한도 도달":"Limite d’utilisation atteinte",완료:"Terminé",오류:"Erreur",대기:"Inactif",기타:"Autres","지난 세션":"Sessions précédentes",어제:"Hier","● 열림":"● Ouvert","탭 닫기":"Fermer l’onglet","(제목 없음)":"(Sans titre)","작업 이름":"Nom de la tâche",닫기:"Fermer",모름:"Inconnu","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessions Claude Code · Codex fermées — cliquer pour reprendre","검색어와 맞는 지난 세션이 없다":"Aucune session précédente ne correspond à la recherche","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Appuyez sur Échap ou ✕ pour afficher toutes les sessions","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Désactivez le tri par état dans les paramètres pour réordonner les onglets","이 탭으로 이동":"Aller à l’onglet","새 탭에서 이어받기":"Reprendre dans un nouvel onglet","분기해서 이어받기":"Créer une branche de la conversation","세션 ID 복사":"Copier l’ID de session","목록에서 숨기기":"Masquer dans la liste","↺ 자동 감지로":"↺ Détection automatique","↻ 화면 복구":"↻ Réparer l’affichage","패널에 띄우기":"Ouvrir dans le panneau","경로 붙여넣기":"Coller le chemin","아무것도 하지 않는다":"Annuler","다시 묻지 않기":"Ne plus demander","{name} 을 어떻게 할까요?":"Que voulez-vous faire de {name} ?","{provider} 계정 선택":"Choisir un compte {provider}","{provider} 계정":"Comptes {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Poursuivre cette conversation dans un nouvel onglet avec le compte choisi.","선택한 계정으로 새 대화를 엽니다.":"Démarrer une nouvelle conversation avec le compte choisi.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Aucun compte enregistré. Ajoutez des comptes dans accounts.json."," · 현재 계정":" · Compte actuel","잔량 조회 중…":"Chargement de l’utilisation…","계정 저장 폴더를 준비하지 못했습니다.":"Impossible de préparer le dossier du compte.","사용량 정보 없음":"Utilisation indisponible","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"L’onglet d’origine a été fermé. Rouvrez la liste des comptes.","{name} 인증 확인 중…":"Vérification de l’authentification de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name} : connectez-vous dans le navigateur. L’authentification sera enregistrée automatiquement.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentification enregistrée. L’onglet d’origine a été fermé ; choisissez le compte dans une nouvelle conversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Impossible de changer de compte. Réessayez.","새 계정 탭을 열지 못했습니다.":"Impossible d’ouvrir l’onglet du compte.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Déjà ouvert — cliquer pour accéder à l’onglet","누르면 새 탭에서 이어받는다 ({id})":"Cliquer pour reprendre dans un nouvel onglet ({id})","작업 폴더: {cwd}":"Dossier de travail : {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Seule la conversation reprend ; les serveurs et processus en arrière-plan ne sont pas redémarrés.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Aucune session ne correspond à {filter} ({total} au total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Déplié pour la recherche (effacez-la pour replier)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} onglets) — cliquer pour replier/déplier","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} onglets sans dossier de travail connu — cliquer pour replier/déplier","탭 {count}개":"{count} onglets","{status} {count} — 클릭하면 필터 해제":"{status} {count} — cliquer pour effacer le filtre","{status} {count} — 클릭하면 이 상태만":"{status} {count} — cliquer pour filtrer","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Compte : {value}","버전: {value}":"Version : {value}","폴더: {value}":"Dossier : {value}","{tool} 권한":"Autorisation de {tool}","입력 대기":"En attente de saisie","플랜 승인":"Approbation du plan","질문 응답":"Réponse à une question","{time} 리셋":"Réinitialisation : {time}"}},1658(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Naziv računa (neobavezno)","목록에서 삭제":"Ukloni s popisa","이메일 주소 전체를 입력하세요.":"Unesite cijelu adresu e-pošte.","계정 추가":"Dodaj račun","계정 (이메일)":"Račun (e-pošta)",비밀번호:"Lozinka","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Račun i lozinka spremaju se kao običan tekst na ovom računalu.",저장:"Spremi",취소:"Odustani","계정과 비밀번호를 입력하세요.":"Unesite račun i lozinku.","이미 등록된 계정입니다.":"Ovaj je račun već spremljen.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Račun nije moguće spremiti. Pokušajte ponovno.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Datoteku računa nije moguće pročitati. Provjerite format JSON.","+ 버튼으로 계정을 추가하세요.":"Dodajte račun gumbom +.","현재 탭에서 선택한 계정으로 전환합니다.":"Prebacite se na odabrani račun u ovoj kartici.","세션 검색 (제목 · 작업이름 · 폴더)":"Pretraži sesije (naslov · zadatak · mapa)","검색·필터 지우기 (Esc)":"Očisti pretraživanje i filtre (Esc)","계정 선택":"Odaberi račun","새 탭":"Nova kartica","+ 새 탭":"+ Nova kartica",설정:"Postavke","화면 복구 (모든 탭 다시 그리기)":"Popravi prikaz (ponovno iscrtaj sve kartice)","미리보기 패널 (md · 이미지 · 표)":"Panel pretpregleda (Markdown · slike · tablice)",진행중:"U tijeku",승인대기:"Čeka odobrenje","한도 도달":"Dosegnuto ograničenje upotrebe",완료:"Dovršeno",오류:"Pogreška",대기:"Neaktivno",기타:"Ostalo","지난 세션":"Prethodne sesije",어제:"Jučer","● 열림":"● Otvoreno","탭 닫기":"Zatvori karticu","(제목 없음)":"(Bez naslova)","작업 이름":"Naziv zadatka",닫기:"Zatvori",모름:"Nepoznato","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zatvorene sesije Claude Code · Codex — klikni za nastavak","검색어와 맞는 지난 세션이 없다":"Nijedna prethodna sesija ne odgovara pretraživanju","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pritisni Esc ili ✕ za prikaz svih sesija","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Isključi razvrstavanje po stanju u postavkama za promjenu redoslijeda kartica","이 탭으로 이동":"Idi na karticu","새 탭에서 이어받기":"Nastavi u novoj kartici","분기해서 이어받기":"Razgranaj razgovor","세션 ID 복사":"Kopiraj ID sesije","목록에서 숨기기":"Sakrij s popisa","↺ 자동 감지로":"↺ Automatski prepoznaj","↻ 화면 복구":"↻ Popravi prikaz","패널에 띄우기":"Otvori u panelu","경로 붙여넣기":"Zalijepi putanju","아무것도 하지 않는다":"Odustani","다시 묻지 않기":"Ne pitaj ponovno","{name} 을 어떻게 할까요?":"Što želiš učiniti s {name}?","{provider} 계정 선택":"Odaberi račun za {provider}","{provider} 계정":"Računi za {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Nastavi ovaj razgovor u novoj kartici s odabranim računom.","선택한 계정으로 새 대화를 엽니다.":"Započni novi razgovor s odabranim računom.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nema spremljenih računa. Dodaj račune u accounts.json."," · 현재 계정":" · Trenutni račun","잔량 조회 중…":"Učitavanje upotrebe…","계정 저장 폴더를 준비하지 못했습니다.":"Nije moguće pripremiti mapu računa.","사용량 정보 없음":"Podaci o upotrebi nisu dostupni","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Izvorna kartica je zatvorena. Ponovno otvori popis računa.","{name} 인증 확인 중…":"Provjera autentifikacije za {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: prijavi se u pregledniku. Autentifikacija će se automatski spremiti.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentifikacija je spremljena. Izvorna kartica je zatvorena; odaberi račun u novom razgovoru.","계정 전환에 실패했습니다. 다시 선택하세요.":"Nije moguće promijeniti račun. Pokušaj ponovno.","새 계정 탭을 열지 못했습니다.":"Nije moguće otvoriti karticu računa.","세션 {id}":"Sesija {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Već je otvoreno — klikni za prijelaz na karticu","누르면 새 탭에서 이어받는다 ({id})":"Klikni za nastavak u novoj kartici ({id})","작업 폴더: {cwd}":"Radna mapa: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Nastavlja se samo razgovor; poslužitelji i pozadinski procesi ne pokreću se ponovno.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nijedna sesija ne odgovara filtru {filter} (ukupno {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Prošireno za rezultate pretraživanja (očisti pretraživanje za sažimanje)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (kartica: {count}) — klikni za sažimanje/proširenje","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Kartice bez poznate radne mape: {count} — klikni za sažimanje/proširenje","탭 {count}개":"Kartica: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klikni za uklanjanje filtra","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klikni za filtriranje","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Račun: {value}","버전: {value}":"Verzija: {value}","폴더: {value}":"Mapa: {value}","{tool} 권한":"Dopuštenje za {tool}","입력 대기":"Čeka unos","플랜 승인":"Odobrenje plana","질문 응답":"Odgovor na pitanje","{time} 리셋":"Poništavanje: {time}"}},3917(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nama akun (opsional)","목록에서 삭제":"Hapus dari daftar","이메일 주소 전체를 입력하세요.":"Masukkan alamat email lengkap.","계정 추가":"Tambah akun","계정 (이메일)":"Akun (email)",비밀번호:"Kata sandi","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Akun dan kata sandi disimpan sebagai teks biasa di PC ini.",저장:"Simpan",취소:"Batal","계정과 비밀번호를 입력하세요.":"Masukkan akun dan kata sandi.","이미 등록된 계정입니다.":"Akun ini sudah tersimpan.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Tidak dapat menyimpan akun. Coba lagi.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Tidak dapat membaca berkas akun. Periksa format JSON.","+ 버튼으로 계정을 추가하세요.":"Gunakan tombol + untuk menambah akun.","현재 탭에서 선택한 계정으로 전환합니다.":"Beralih ke akun yang dipilih di tab ini.","세션 검색 (제목 · 작업이름 · 폴더)":"Cari sesi (judul · tugas · folder)","검색·필터 지우기 (Esc)":"Hapus pencarian dan filter (Esc)","계정 선택":"Pilih akun","새 탭":"Tab baru","+ 새 탭":"+ Tab baru",설정:"Pengaturan","화면 복구 (모든 탭 다시 그리기)":"Perbaiki tampilan (gambar ulang semua tab)","미리보기 패널 (md · 이미지 · 표)":"Panel pratinjau (Markdown · gambar · tabel)",진행중:"Sedang bekerja",승인대기:"Menunggu persetujuan","한도 도달":"Batas penggunaan tercapai",완료:"Selesai",오류:"Kesalahan",대기:"Siaga",기타:"Lainnya","지난 세션":"Sesi sebelumnya",어제:"Kemarin","● 열림":"● Terbuka","탭 닫기":"Tutup tab","(제목 없음)":"(Tanpa judul)","작업 이름":"Nama tugas",닫기:"Tutup",모름:"Tidak diketahui","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sesi Claude Code · Codex yang ditutup — klik untuk melanjutkan","검색어와 맞는 지난 세션이 없다":"Tidak ada sesi sebelumnya yang cocok dengan pencarian","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tekan Esc atau ✕ untuk menampilkan semua sesi","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Nonaktifkan pengurutan berdasarkan status di Pengaturan untuk mengatur ulang tab","이 탭으로 이동":"Buka tab","새 탭에서 이어받기":"Lanjutkan di tab baru","분기해서 이어받기":"Cabangkan percakapan","세션 ID 복사":"Salin ID sesi","목록에서 숨기기":"Sembunyikan dari daftar","↺ 자동 감지로":"↺ Deteksi otomatis","↻ 화면 복구":"↻ Perbaiki tampilan","패널에 띄우기":"Buka di panel","경로 붙여넣기":"Tempel jalur","아무것도 하지 않는다":"Batal","다시 묻지 않기":"Jangan tanyakan lagi","{name} 을 어떻게 할까요?":"Apa yang ingin Anda lakukan dengan {name}?","{provider} 계정 선택":"Pilih akun {provider}","{provider} 계정":"Akun {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Lanjutkan percakapan ini di tab baru dengan akun yang dipilih.","선택한 계정으로 새 대화를 엽니다.":"Mulai percakapan baru dengan akun yang dipilih.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Tidak ada akun tersimpan. Tambahkan akun ke accounts.json."," · 현재 계정":" · Akun saat ini","잔량 조회 중…":"Memuat penggunaan…","계정 저장 폴더를 준비하지 못했습니다.":"Tidak dapat menyiapkan folder akun.","사용량 정보 없음":"Informasi penggunaan tidak tersedia","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Tab asal telah ditutup. Buka kembali daftar akun.","{name} 인증 확인 중…":"Memeriksa autentikasi {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: masuk melalui browser. Autentikasi akan disimpan otomatis.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentikasi tersimpan. Tab asal telah ditutup; pilih akun dalam percakapan baru.","계정 전환에 실패했습니다. 다시 선택하세요.":"Tidak dapat mengganti akun. Coba lagi.","새 계정 탭을 열지 못했습니다.":"Tidak dapat membuka tab akun.","세션 {id}":"Sesi {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Sudah terbuka — klik untuk membuka tab","누르면 새 탭에서 이어받는다 ({id})":"Klik untuk melanjutkan di tab baru ({id})","작업 폴더: {cwd}":"Folder kerja: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Hanya percakapan yang dilanjutkan; server dan proses latar belakang tidak dimulai ulang.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Tidak ada sesi yang cocok dengan {filter} (total {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Diperluas untuk hasil pencarian (hapus pencarian untuk menciutkan)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} tab) — klik untuk ciutkan/perluas","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} tab tanpa folder kerja yang diketahui — klik untuk ciutkan/perluas","탭 {count}개":"{count} tab","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klik untuk menghapus filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klik untuk memfilter","{n}초":"{n}dtk","{n}분":"{n}mnt","{h}시간 {m}분":"{h}j {m}mnt","계정: {value}":"Akun: {value}","버전: {value}":"Versi: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"Izin {tool}","입력 대기":"Menunggu masukan","플랜 승인":"Persetujuan rencana","질문 응답":"Jawaban pertanyaan","{time} 리셋":"Reset: {time}"}},541(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nome account (facoltativo)","목록에서 삭제":"Rimuovi dall’elenco","이메일 주소 전체를 입력하세요.":"Inserisci l’indirizzo email completo.","계정 추가":"Aggiungi account","계정 (이메일)":"Account (e-mail)",비밀번호:"Password","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Account e password vengono salvati in chiaro su questo PC.",저장:"Salva",취소:"Annulla","계정과 비밀번호를 입력하세요.":"Inserisci account e password.","이미 등록된 계정입니다.":"Questo account è già salvato.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Impossibile salvare l’account. Riprova.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Impossibile leggere il file degli account. Controlla il formato JSON.","+ 버튼으로 계정을 추가하세요.":"Usa il pulsante + per aggiungere un account.","현재 탭에서 선택한 계정으로 전환합니다.":"Passa all’account selezionato in questa scheda.","세션 검색 (제목 · 작업이름 · 폴더)":"Cerca sessioni (titolo · attività · cartella)","검색·필터 지우기 (Esc)":"Cancella ricerca e filtri (Esc)","계정 선택":"Seleziona account","새 탭":"Nuova scheda","+ 새 탭":"+ Nuova scheda",설정:"Impostazioni","화면 복구 (모든 탭 다시 그리기)":"Ripara visualizzazione (ridisegna tutte le schede)","미리보기 패널 (md · 이미지 · 표)":"Pannello di anteprima (Markdown · immagini · tabelle)",진행중:"In corso",승인대기:"In attesa di approvazione","한도 도달":"Limite di utilizzo raggiunto",완료:"Completato",오류:"Errore",대기:"Inattivo",기타:"Altro","지난 세션":"Sessioni precedenti",어제:"Ieri","● 열림":"● Aperta","탭 닫기":"Chiudi scheda","(제목 없음)":"(Senza titolo)","작업 이름":"Nome attività",닫기:"Chiudi",모름:"Sconosciuto","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessioni Claude Code · Codex chiuse — fai clic per riprendere","검색어와 맞는 지난 세션이 없다":"Nessuna sessione precedente corrisponde alla ricerca","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Premi Esc o ✕ per mostrare tutte le sessioni","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Disattiva l’ordinamento per stato nelle impostazioni per riordinare le schede","이 탭으로 이동":"Vai alla scheda","새 탭에서 이어받기":"Riprendi in una nuova scheda","분기해서 이어받기":"Crea un ramo della conversazione","세션 ID 복사":"Copia ID sessione","목록에서 숨기기":"Nascondi dall’elenco","↺ 자동 감지로":"↺ Rileva automaticamente","↻ 화면 복구":"↻ Ripara visualizzazione","패널에 띄우기":"Apri nel pannello","경로 붙여넣기":"Incolla percorso","아무것도 하지 않는다":"Annulla","다시 묻지 않기":"Non chiedere più","{name} 을 어떻게 할까요?":"Cosa vuoi fare con {name}?","{provider} 계정 선택":"Seleziona account {provider}","{provider} 계정":"Account {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continua questa conversazione in una nuova scheda con l’account selezionato.","선택한 계정으로 새 대화를 엽니다.":"Avvia una nuova conversazione con l’account selezionato.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nessun account salvato. Aggiungi account in accounts.json."," · 현재 계정":" · Account attuale","잔량 조회 중…":"Caricamento utilizzo…","계정 저장 폴더를 준비하지 못했습니다.":"Impossibile preparare la cartella dell’account.","사용량 정보 없음":"Utilizzo non disponibile","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"La scheda originale è stata chiusa. Riapri l’elenco degli account.","{name} 인증 확인 중…":"Verifica dell’autenticazione di {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: accedi nel browser. L’autenticazione verrà salvata automaticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticazione salvata. La scheda originale è stata chiusa; seleziona l’account in una nuova conversazione.","계정 전환에 실패했습니다. 다시 선택하세요.":"Impossibile cambiare account. Riprova.","새 계정 탭을 열지 못했습니다.":"Impossibile aprire la scheda dell’account.","세션 {id}":"Sessione {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Già aperta — fai clic per andare alla scheda","누르면 새 탭에서 이어받는다 ({id})":"Fai clic per riprendere in una nuova scheda ({id})","작업 폴더: {cwd}":"Cartella di lavoro: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Riprende solo la conversazione; server e processi in background non vengono riavviati.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nessuna sessione corrisponde a {filter} ({total} in totale)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Espanso per la ricerca (cancellala per comprimere)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} schede) — fai clic per comprimere/espandere","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} schede senza cartella di lavoro nota — fai clic per comprimere/espandere","탭 {count}개":"{count} schede","{status} {count} — 클릭하면 필터 해제":"{status} {count} — fai clic per rimuovere il filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — fai clic per filtrare","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Account: {value}","버전: {value}":"Versione: {value}","폴더: {value}":"Cartella: {value}","{tool} 권한":"Autorizzazione per {tool}","입력 대기":"In attesa di input","플랜 승인":"Approvazione del piano","질문 응답":"Risposta alla domanda","{time} 리셋":"Ripristino: {time}"}},8281(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"アカウント名(任意)","목록에서 삭제":"一覧から削除","이메일 주소 전체를 입력하세요.":"メールアドレスをすべて入力してください。","계정 추가":"アカウントを追加","계정 (이메일)":"アカウント(メールアドレス)",비밀번호:"パスワード","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"アカウントとパスワードはこのPCに平文で保存されます。",저장:"保存",취소:"キャンセル","계정과 비밀번호를 입력하세요.":"アカウントとパスワードを入力してください。","이미 등록된 계정입니다.":"このアカウントは登録済みです。","계정을 저장하지 못했습니다. 다시 시도하세요.":"アカウントを保存できませんでした。再試行してください。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"アカウントファイルを読み込めません。JSON形式を確認してください。","+ 버튼으로 계정을 추가하세요.":"+ボタンでアカウントを追加してください。","현재 탭에서 선택한 계정으로 전환합니다.":"現在のタブで選択したアカウントに切り替えます。","세션 검색 (제목 · 작업이름 · 폴더)":"セッション検索(タイトル・作業名・フォルダー)","검색·필터 지우기 (Esc)":"検索・絞り込みを解除(Esc)","계정 선택":"アカウントを選択","새 탭":"新しいタブ","+ 새 탭":"+ 新しいタブ",설정:"設定","화면 복구 (모든 탭 다시 그리기)":"表示を修復(すべてのタブを再描画)","미리보기 패널 (md · 이미지 · 표)":"プレビューパネル(Markdown・画像・表)",진행중:"実行中",승인대기:"承認待ち","한도 도달":"使用上限に到達",완료:"完了",오류:"エラー",대기:"待機",기타:"その他","지난 세션":"過去のセッション",어제:"昨日","● 열림":"● 開いています","탭 닫기":"タブを閉じる","(제목 없음)":"(無題)","작업 이름":"作業名",닫기:"閉じる",모름:"不明","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"終了した Claude Code・Codex セッション — クリックして再開","검색어와 맞는 지난 세션이 없다":"検索に一致する過去のセッションはありません","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Esc または ✕ ですべてのセッションを表示","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"タブを並べ替えるには設定で状態順の並べ替えを無効にしてください","이 탭으로 이동":"タブへ移動","새 탭에서 이어받기":"新しいタブで再開","분기해서 이어받기":"会話を分岐","세션 ID 복사":"セッション ID をコピー","목록에서 숨기기":"一覧から非表示","↺ 자동 감지로":"↺ 自動検出","↻ 화면 복구":"↻ 表示を修復","패널에 띄우기":"パネルで開く","경로 붙여넣기":"パスを貼り付け","아무것도 하지 않는다":"キャンセル","다시 묻지 않기":"次回から確認しない","{name} 을 어떻게 할까요?":"{name} をどうしますか?","{provider} 계정 선택":"{provider} のアカウントを選択","{provider} 계정":"{provider} のアカウント","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"選択したアカウントで、この会話を新しいタブで続けます。","선택한 계정으로 새 대화를 엽니다.":"選択したアカウントで新しい会話を始めます。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"保存済みアカウントがありません。accounts.json に追加してください。"," · 현재 계정":" · 現在のアカウント","잔량 조회 중…":"使用量を取得中…","계정 저장 폴더를 준비하지 못했습니다.":"アカウントのフォルダーを準備できませんでした。","사용량 정보 없음":"使用量情報なし","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"元のタブは閉じられました。アカウント一覧を開き直してください。","{name} 인증 확인 중…":"{name} の認証を確認中…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: ブラウザーでログインしてください。認証情報は自動保存されます。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"認証情報を保存しました。元のタブは閉じられたため、新しい会話でアカウントを選択してください。","계정 전환에 실패했습니다. 다시 선택하세요.":"アカウントを切り替えられませんでした。再試行してください。","새 계정 탭을 열지 못했습니다.":"アカウントのタブを開けませんでした。","세션 {id}":"セッション {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"すでに開いています — クリックしてタブへ移動","누르면 새 탭에서 이어받는다 ({id})":"クリックして新しいタブで再開({id})","작업 폴더: {cwd}":"作業フォルダー: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"会話のみ再開します。サーバーやバックグラウンドプロセスは再起動されません。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"{filter} に一致するセッションはありません(全 {total} 件)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 検索結果を展開中(検索を解除すると折りたたみます)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} タブ)— クリックして折りたたみ/展開","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"作業フォルダー不明の {count} タブ — クリックして折りたたみ/展開","탭 {count}개":"{count} タブ","{status} {count} — 클릭하면 필터 해제":"{status} {count} — クリックして絞り込みを解除","{status} {count} — 클릭하면 이 상태만":"{status} {count} — クリックして絞り込み","{n}초":"{n}秒","{n}분":"{n}分","{h}시간 {m}분":"{h}時間 {m}分","계정: {value}":"アカウント: {value}","버전: {value}":"バージョン: {value}","폴더: {value}":"フォルダー: {value}","{tool} 권한":"{tool} の権限","입력 대기":"入力待ち","플랜 승인":"プランの承認","질문 응답":"質問への回答","{time} 리셋":"リセット: {time}"}},1500(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nazwa konta (opcjonalnie)","목록에서 삭제":"Usuń z listy","이메일 주소 전체를 입력하세요.":"Wpisz pełny adres e-mail.","계정 추가":"Dodaj konto","계정 (이메일)":"Konto (e-mail)",비밀번호:"Hasło","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto i hasło są zapisywane na tym komputerze jako zwykły tekst.",저장:"Zapisz",취소:"Anuluj","계정과 비밀번호를 입력하세요.":"Wpisz konto i hasło.","이미 등록된 계정입니다.":"To konto jest już zapisane.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Nie udało się zapisać konta. Spróbuj ponownie.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Nie udało się odczytać pliku kont. Sprawdź format JSON.","+ 버튼으로 계정을 추가하세요.":"Użyj przycisku +, aby dodać konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Przełącz na wybrane konto w tej karcie.","세션 검색 (제목 · 작업이름 · 폴더)":"Szukaj sesji (tytuł · zadanie · folder)","검색·필터 지우기 (Esc)":"Wyczyść wyszukiwanie i filtry (Esc)","계정 선택":"Wybierz konto","새 탭":"Nowa karta","+ 새 탭":"+ Nowa karta",설정:"Ustawienia","화면 복구 (모든 탭 다시 그리기)":"Napraw wyświetlanie (przerysuj wszystkie karty)","미리보기 패널 (md · 이미지 · 표)":"Panel podglądu (Markdown · obrazy · tabele)",진행중:"W toku",승인대기:"Oczekuje na zatwierdzenie","한도 도달":"Osiągnięto limit użycia",완료:"Gotowe",오류:"Błąd",대기:"Bezczynne",기타:"Inne","지난 세션":"Poprzednie sesje",어제:"Wczoraj","● 열림":"● Otwarte","탭 닫기":"Zamknij kartę","(제목 없음)":"(Bez tytułu)","작업 이름":"Nazwa zadania",닫기:"Zamknij",모름:"Nieznane","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Zamknięte sesje Claude Code · Codex — kliknij, aby wznowić","검색어와 맞는 지난 세션이 없다":"Brak poprzednich sesji pasujących do wyszukiwania","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Naciśnij Esc lub ✕, aby wyświetlić wszystkie sesje","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Wyłącz sortowanie według stanu w ustawieniach, aby zmienić kolejność kart","이 탭으로 이동":"Przejdź do karty","새 탭에서 이어받기":"Wznów w nowej karcie","분기해서 이어받기":"Utwórz odgałęzienie rozmowy","세션 ID 복사":"Kopiuj ID sesji","목록에서 숨기기":"Ukryj na liście","↺ 자동 감지로":"↺ Wykrywaj automatycznie","↻ 화면 복구":"↻ Napraw wyświetlanie","패널에 띄우기":"Otwórz w panelu","경로 붙여넣기":"Wklej ścieżkę","아무것도 하지 않는다":"Anuluj","다시 묻지 않기":"Nie pytaj ponownie","{name} 을 어떻게 할까요?":"Co chcesz zrobić z {name}?","{provider} 계정 선택":"Wybierz konto {provider}","{provider} 계정":"Konta {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Kontynuuj tę rozmowę w nowej karcie z wybranym kontem.","선택한 계정으로 새 대화를 엽니다.":"Rozpocznij nową rozmowę z wybranym kontem.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Brak zapisanych kont. Dodaj konta do accounts.json."," · 현재 계정":" · Bieżące konto","잔량 조회 중…":"Wczytywanie użycia…","계정 저장 폴더를 준비하지 못했습니다.":"Nie udało się przygotować folderu konta.","사용량 정보 없음":"Dane użycia niedostępne","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Pierwotna karta została zamknięta. Otwórz ponownie listę kont.","{name} 인증 확인 중…":"Sprawdzanie uwierzytelnienia dla {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: zaloguj się w przeglądarce. Uwierzytelnienie zostanie zapisane automatycznie.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Uwierzytelnienie zapisane. Pierwotna karta została zamknięta; wybierz konto w nowej rozmowie.","계정 전환에 실패했습니다. 다시 선택하세요.":"Nie udało się zmienić konta. Spróbuj ponownie.","새 계정 탭을 열지 못했습니다.":"Nie udało się otworzyć karty konta.","세션 {id}":"Sesja {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Już otwarte — kliknij, aby przejść do karty","누르면 새 탭에서 이어받는다 ({id})":"Kliknij, aby wznowić w nowej karcie ({id})","작업 폴더: {cwd}":"Folder roboczy: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Wznawiana jest tylko rozmowa; serwery i procesy w tle nie są uruchamiane ponownie.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Brak sesji pasujących do {filter} (łącznie {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Rozwinięto dla wyników wyszukiwania (wyczyść wyszukiwanie, aby zwinąć)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (karty: {count}) — kliknij, aby zwinąć/rozwinąć","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Karty bez znanego folderu roboczego: {count} — kliknij, aby zwinąć/rozwinąć","탭 {count}개":"Karty: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — kliknij, aby usunąć filtr","{status} {count} — 클릭하면 이 상태만":"{status} {count} — kliknij, aby filtrować","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}godz. {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Wersja: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"Uprawnienie do {tool}","입력 대기":"Oczekuje na dane","플랜 승인":"Zatwierdzenie planu","질문 응답":"Odpowiedź na pytanie","{time} 리셋":"Odnowienie: {time}"}},9940(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Nome da conta (opcional)","목록에서 삭제":"Remover da lista","이메일 주소 전체를 입력하세요.":"Introduza o endereço de e-mail completo.","계정 추가":"Adicionar conta","계정 (이메일)":"Conta (e-mail)",비밀번호:"Senha","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"A conta e a senha são salvas em texto simples neste computador.",저장:"Salvar",취소:"Cancelar","계정과 비밀번호를 입력하세요.":"Digite a conta e a senha.","이미 등록된 계정입니다.":"Esta conta já está salva.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Não foi possível salvar a conta. Tente novamente.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Não foi possível ler o arquivo de contas. Verifique o formato JSON.","+ 버튼으로 계정을 추가하세요.":"Use o botão + para adicionar uma conta.","현재 탭에서 선택한 계정으로 전환합니다.":"Mudar para a conta selecionada nesta aba.","세션 검색 (제목 · 작업이름 · 폴더)":"Pesquisar sessões (título · tarefa · pasta)","검색·필터 지우기 (Esc)":"Limpar pesquisa e filtros (Esc)","계정 선택":"Selecionar conta","새 탭":"Nova aba","+ 새 탭":"+ Nova aba",설정:"Configurações","화면 복구 (모든 탭 다시 그리기)":"Reparar exibição (redesenhar todas as abas)","미리보기 패널 (md · 이미지 · 표)":"Painel de prévia (Markdown · imagens · tabelas)",진행중:"Em andamento",승인대기:"Aguardando aprovação","한도 도달":"Limite de uso atingido",완료:"Concluído",오류:"Erro",대기:"Inativo",기타:"Outros","지난 세션":"Sessões anteriores",어제:"Ontem","● 열림":"● Aberta","탭 닫기":"Fechar aba","(제목 없음)":"(Sem título)","작업 이름":"Nome da tarefa",닫기:"Fechar",모름:"Desconhecido","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Sessões fechadas do Claude Code · Codex — clique para retomar","검색어와 맞는 지난 세션이 없다":"Nenhuma sessão anterior corresponde à pesquisa","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Pressione Esc ou ✕ para mostrar todas as sessões","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Desative a ordenação por estado nas configurações para reordenar as abas","이 탭으로 이동":"Ir para a aba","새 탭에서 이어받기":"Retomar em nova aba","분기해서 이어받기":"Criar ramificação da conversa","세션 ID 복사":"Copiar ID da sessão","목록에서 숨기기":"Ocultar da lista","↺ 자동 감지로":"↺ Detectar automaticamente","↻ 화면 복구":"↻ Reparar exibição","패널에 띄우기":"Abrir no painel","경로 붙여넣기":"Colar caminho","아무것도 하지 않는다":"Cancelar","다시 묻지 않기":"Não perguntar novamente","{name} 을 어떻게 할까요?":"O que deseja fazer com {name}?","{provider} 계정 선택":"Selecionar conta {provider}","{provider} 계정":"Contas {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continuar esta conversa em uma nova aba com a conta selecionada.","선택한 계정으로 새 대화를 엽니다.":"Iniciar uma nova conversa com a conta selecionada.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Nenhuma conta salva. Adicione contas em accounts.json."," · 현재 계정":" · Conta atual","잔량 조회 중…":"Carregando uso…","계정 저장 폴더를 준비하지 못했습니다.":"Não foi possível preparar a pasta da conta.","사용량 정보 없음":"Uso indisponível","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"A aba original foi fechada. Reabra a lista de contas.","{name} 인증 확인 중…":"Verificando autenticação de {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: entre pelo navegador. A autenticação será salva automaticamente.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autenticação salva. A aba original foi fechada; selecione a conta em uma nova conversa.","계정 전환에 실패했습니다. 다시 선택하세요.":"Não foi possível trocar de conta. Tente novamente.","새 계정 탭을 열지 못했습니다.":"Não foi possível abrir a aba da conta.","세션 {id}":"Sessão {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Já está aberta — clique para ir à aba","누르면 새 탭에서 이어받는다 ({id})":"Clique para retomar em uma nova aba ({id})","작업 폴더: {cwd}":"Pasta de trabalho: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Somente a conversa é retomada; servidores e processos em segundo plano não são reiniciados.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Nenhuma sessão corresponde a {filter} ({total} no total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expandido para a pesquisa (limpe-a para recolher)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} abas) — clique para recolher/expandir","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} abas sem pasta de trabalho conhecida — clique para recolher/expandir","탭 {count}개":"{count} abas","{status} {count} — 클릭하면 필터 해제":"{status} {count} — clique para limpar o filtro","{status} {count} — 클릭하면 이 상태만":"{status} {count} — clique para filtrar","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}h {m}min","계정: {value}":"Conta: {value}","버전: {value}":"Versão: {value}","폴더: {value}":"Pasta: {value}","{tool} 권한":"Permissão de {tool}","입력 대기":"Aguardando entrada","플랜 승인":"Aprovação do plano","질문 응답":"Resposta à pergunta","{time} 리셋":"Reinício: {time}"}},4237(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Название аккаунта (необязательно)","목록에서 삭제":"Удалить из списка","이메일 주소 전체를 입력하세요.":"Введите полный адрес электронной почты.","계정 추가":"Добавить аккаунт","계정 (이메일)":"Аккаунт (почта)",비밀번호:"Пароль","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Аккаунт и пароль сохраняются на этом ПК в открытом виде.",저장:"Сохранить",취소:"Отмена","계정과 비밀번호를 입력하세요.":"Введите аккаунт и пароль.","이미 등록된 계정입니다.":"Этот аккаунт уже сохранён.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Не удалось сохранить аккаунт. Повторите попытку.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Не удалось прочитать файл аккаунтов. Проверьте формат JSON.","+ 버튼으로 계정을 추가하세요.":"Нажмите +, чтобы добавить аккаунт.","현재 탭에서 선택한 계정으로 전환합니다.":"Переключиться на выбранный аккаунт в текущей вкладке.","세션 검색 (제목 · 작업이름 · 폴더)":"Поиск сеансов (заголовок · задача · папка)","검색·필터 지우기 (Esc)":"Очистить поиск и фильтры (Esc)","계정 선택":"Выбрать аккаунт","새 탭":"Новая вкладка","+ 새 탭":"+ Новая вкладка",설정:"Настройки","화면 복구 (모든 탭 다시 그리기)":"Исправить отображение (перерисовать все вкладки)","미리보기 패널 (md · 이미지 · 표)":"Панель просмотра (Markdown · изображения · таблицы)",진행중:"В работе",승인대기:"Ожидает разрешения","한도 도달":"Лимит использования исчерпан",완료:"Готово",오류:"Ошибка",대기:"Ожидание",기타:"Прочее","지난 세션":"Прошлые сеансы",어제:"Вчера","● 열림":"● Открыт","탭 닫기":"Закрыть вкладку","(제목 없음)":"(Без названия)","작업 이름":"Название задачи",닫기:"Закрыть",모름:"Неизвестно","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Закрытые сеансы Claude Code · Codex — нажмите для продолжения","검색어와 맞는 지난 세션이 없다":"Нет прошлых сеансов, соответствующих поиску","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Нажмите Esc или ✕, чтобы показать все сеансы","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Отключите сортировку по состоянию в настройках для изменения порядка вкладок","이 탭으로 이동":"Перейти к вкладке","새 탭에서 이어받기":"Продолжить в новой вкладке","분기해서 이어받기":"Создать ветку беседы","세션 ID 복사":"Копировать ID сеанса","목록에서 숨기기":"Скрыть из списка","↺ 자동 감지로":"↺ Определять автоматически","↻ 화면 복구":"↻ Исправить отображение","패널에 띄우기":"Открыть на панели","경로 붙여넣기":"Вставить путь","아무것도 하지 않는다":"Отмена","다시 묻지 않기":"Больше не спрашивать","{name} 을 어떻게 할까요?":"Что сделать с {name}?","{provider} 계정 선택":"Выбрать аккаунт {provider}","{provider} 계정":"Аккаунты {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продолжить эту беседу в новой вкладке с выбранным аккаунтом.","선택한 계정으로 새 대화를 엽니다.":"Начать новую беседу с выбранным аккаунтом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Нет сохранённых аккаунтов. Добавьте их в accounts.json."," · 현재 계정":" · Текущий аккаунт","잔량 조회 중…":"Загрузка данных об использовании…","계정 저장 폴더를 준비하지 못했습니다.":"Не удалось подготовить папку аккаунта.","사용량 정보 없음":"Данные об использовании недоступны","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Исходная вкладка закрыта. Откройте список аккаунтов заново.","{name} 인증 확인 중…":"Проверка аутентификации {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: войдите через браузер. Данные аутентификации сохранятся автоматически.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Аутентификация сохранена. Исходная вкладка закрыта; выберите аккаунт в новой беседе.","계정 전환에 실패했습니다. 다시 선택하세요.":"Не удалось сменить аккаунт. Повторите попытку.","새 계정 탭을 열지 못했습니다.":"Не удалось открыть вкладку аккаунта.","세션 {id}":"Сеанс {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Уже открыт — нажмите для перехода к вкладке","누르면 새 탭에서 이어받는다 ({id})":"Нажмите для продолжения в новой вкладке ({id})","작업 폴더: {cwd}":"Рабочая папка: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Возобновляется только беседа; серверы и фоновые процессы не перезапускаются.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Нет сеансов для {filter} (всего {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Развёрнуто для результатов поиска (очистите поиск, чтобы свернуть)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (вкладок: {count}) — нажмите, чтобы свернуть/развернуть","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Вкладок без известной рабочей папки: {count} — нажмите, чтобы свернуть/развернуть","탭 {count}개":"Вкладок: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — нажмите, чтобы снять фильтр","{status} {count} — 클릭하면 이 상태만":"{status} {count} — нажмите для фильтрации","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Аккаунт: {value}","버전: {value}":"Версия: {value}","폴더: {value}":"Папка: {value}","{tool} 권한":"Разрешение для {tool}","입력 대기":"Ожидает ввода","플랜 승인":"Утверждение плана","질문 응답":"Ответ на вопрос","{time} 리셋":"Сброс: {time}"}},2085(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Назив налога (опционо)","목록에서 삭제":"Уклони са списка","이메일 주소 전체를 입력하세요.":"Унесите целу адресу е-поште.","계정 추가":"Додај налог","계정 (이메일)":"Налог (е-пошта)",비밀번호:"Лозинка","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Налог и лозинка се чувају као обичан текст на овом рачунару.",저장:"Сачувај",취소:"Откажи","계정과 비밀번호를 입력하세요.":"Унесите налог и лозинку.","이미 등록된 계정입니다.":"Овај налог је већ сачуван.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Налог није могуће сачувати. Покушајте поново.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Датотеку налога није могуће прочитати. Проверите JSON формат.","+ 버튼으로 계정을 추가하세요.":"Додајте налог дугметом +.","현재 탭에서 선택한 계정으로 전환합니다.":"Пређите на изабрани налог у овој картици.","세션 검색 (제목 · 작업이름 · 폴더)":"Претрага сесија (наслов · задатак · фасцикла)","검색·필터 지우기 (Esc)":"Обриши претрагу и филтере (Esc)","계정 선택":"Изабери налог","새 탭":"Нова картица","+ 새 탭":"+ Нова картица",설정:"Подешавања","화면 복구 (모든 탭 다시 그리기)":"Поправи приказ (поново исцртај све картице)","미리보기 패널 (md · 이미지 · 표)":"Панел за преглед (Markdown · слике · табеле)",진행중:"У току",승인대기:"Чека одобрење","한도 도달":"Достигнуто ограничење коришћења",완료:"Завршено",오류:"Грешка",대기:"Неактивно",기타:"Остало","지난 세션":"Претходне сесије",어제:"Јуче","● 열림":"● Отворено","탭 닫기":"Затвори картицу","(제목 없음)":"(Без наслова)","작업 이름":"Назив задатка",닫기:"Затвори",모름:"Непознато","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Затворене Claude Code · Codex сесије — кликни за наставак","검색어와 맞는 지난 세션이 없다":"Нема претходних сесија које одговарају претрази","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Притисни Esc или ✕ за приказ свих сесија","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Искључи сортирање по стању у подешавањима да промениш редослед картица","이 탭으로 이동":"Иди на картицу","새 탭에서 이어받기":"Настави у новој картици","분기해서 이어받기":"Направи грану разговора","세션 ID 복사":"Копирај ID сесије","목록에서 숨기기":"Сакриј са списка","↺ 자동 감지로":"↺ Аутоматски препознај","↻ 화면 복구":"↻ Поправи приказ","패널에 띄우기":"Отвори у панелу","경로 붙여넣기":"Налепи путању","아무것도 하지 않는다":"Откажи","다시 묻지 않기":"Не питај поново","{name} 을 어떻게 할까요?":"Шта желиш да урадиш са {name}?","{provider} 계정 선택":"Изабери налог за {provider}","{provider} 계정":"Налози за {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Настави овај разговор у новој картици са изабраним налогом.","선택한 계정으로 새 대화를 엽니다.":"Започни нови разговор са изабраним налогом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Нема сачуваних налога. Додај налоге у accounts.json."," · 현재 계정":" · Тренутни налог","잔량 조회 중…":"Учитавање коришћења…","계정 저장 폴더를 준비하지 못했습니다.":"Није могуће припремити фасциклу налога.","사용량 정보 없음":"Подаци о коришћењу нису доступни","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Првобитна картица је затворена. Поново отвори списак налога.","{name} 인증 확인 중…":"Провера аутентификације за {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: пријави се у прегледачу. Аутентификација ће се аутоматски сачувати.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Аутентификација је сачувана. Првобитна картица је затворена; изабери налог у новом разговору.","계정 전환에 실패했습니다. 다시 선택하세요.":"Није могуће променити налог. Покушај поново.","새 계정 탭을 열지 못했습니다.":"Није могуће отворити картицу налога.","세션 {id}":"Сесија {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Већ је отворено — кликни за прелазак на картицу","누르면 새 탭에서 이어받는다 ({id})":"Кликни за наставак у новој картици ({id})","작업 폴더: {cwd}":"Радна фасцикла: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Наставља се само разговор; сервери и позадински процеси се не покрећу поново.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Нема сесија за {filter} (укупно {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Проширено за резултате претраге (обриши претрагу за скупљање)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (картица: {count}) — кликни за скупљање/ширење","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Картице без познате радне фасцикле: {count} — кликни за скупљање/ширење","탭 {count}개":"Картица: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — кликни за уклањање филтера","{status} {count} — 클릭하면 이 상태만":"{status} {count} — кликни за филтрирање","{n}초":"{n}с","{n}분":"{n}мин","{h}시간 {m}분":"{h}ч {m}мин","계정: {value}":"Налог: {value}","버전: {value}":"Верзија: {value}","폴더: {value}":"Фасцикла: {value}","{tool} 권한":"Дозвола за {tool}","입력 대기":"Чека унос","플랜 승인":"Одобрење плана","질문 응답":"Одговор на питање","{time} 리셋":"Поништавање: {time}"}},9865(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Kontonamn (valfritt)","목록에서 삭제":"Ta bort från listan","이메일 주소 전체를 입력하세요.":"Ange hela e-postadressen.","계정 추가":"Lägg till konto","계정 (이메일)":"Konto (e-post)",비밀번호:"Lösenord","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Konto och lösenord sparas i klartext på den här datorn.",저장:"Spara",취소:"Avbryt","계정과 비밀번호를 입력하세요.":"Ange konto och lösenord.","이미 등록된 계정입니다.":"Det här kontot är redan sparat.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Kunde inte spara kontot. Försök igen.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Kunde inte läsa kontofilen. Kontrollera JSON-formatet.","+ 버튼으로 계정을 추가하세요.":"Använd knappen + för att lägga till ett konto.","현재 탭에서 선택한 계정으로 전환합니다.":"Byt till det valda kontot i den här fliken.","세션 검색 (제목 · 작업이름 · 폴더)":"Sök sessioner (titel · uppgift · mapp)","검색·필터 지우기 (Esc)":"Rensa sökning och filter (Esc)","계정 선택":"Välj konto","새 탭":"Ny flik","+ 새 탭":"+ Ny flik",설정:"Inställningar","화면 복구 (모든 탭 다시 그리기)":"Reparera visning (rita om alla flikar)","미리보기 패널 (md · 이미지 · 표)":"Förhandsgranskning (Markdown · bilder · tabeller)",진행중:"Arbetar",승인대기:"Väntar på godkännande","한도 도달":"Användningsgränsen nådd",완료:"Klart",오류:"Fel",대기:"Inaktiv",기타:"Övriga","지난 세션":"Tidigare sessioner",어제:"I går","● 열림":"● Öppen","탭 닫기":"Stäng flik","(제목 없음)":"(Utan titel)","작업 이름":"Uppgiftsnamn",닫기:"Stäng",모름:"Okänd","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Stängda Claude Code · Codex-sessioner — klicka för att fortsätta","검색어와 맞는 지난 세션이 없다":"Inga tidigare sessioner matchar sökningen","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tryck Esc eller ✕ för att visa alla sessioner","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Stäng av statussortering i Inställningar för att ändra flikordningen","이 탭으로 이동":"Gå till flik","새 탭에서 이어받기":"Fortsätt i ny flik","분기해서 이어받기":"Förgrena konversation","세션 ID 복사":"Kopiera sessions-ID","목록에서 숨기기":"Dölj från listan","↺ 자동 감지로":"↺ Identifiera automatiskt","↻ 화면 복구":"↻ Reparera visning","패널에 띄우기":"Öppna i panel","경로 붙여넣기":"Klistra in sökväg","아무것도 하지 않는다":"Avbryt","다시 묻지 않기":"Fråga inte igen","{name} 을 어떻게 할까요?":"Vad vill du göra med {name}?","{provider} 계정 선택":"Välj {provider}-konto","{provider} 계정":"{provider}-konton","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Fortsätt denna konversation i en ny flik med det valda kontot.","선택한 계정으로 새 대화를 엽니다.":"Starta en ny konversation med det valda kontot.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Inga sparade konton. Lägg till konton i accounts.json."," · 현재 계정":" · Aktuellt konto","잔량 조회 중…":"Läser in användning…","계정 저장 폴더를 준비하지 못했습니다.":"Det gick inte att förbereda kontomappen.","사용량 정보 없음":"Användningsdata saknas","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Den ursprungliga fliken stängdes. Öppna kontolistan igen.","{name} 인증 확인 중…":"Kontrollerar autentisering för {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: logga in i webbläsaren. Autentiseringen sparas automatiskt.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Autentisering sparad. Den ursprungliga fliken stängdes; välj kontot i en ny konversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Det gick inte att byta konto. Försök igen.","새 계정 탭을 열지 못했습니다.":"Det gick inte att öppna kontofliken.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Redan öppen — klicka för att gå till fliken","누르면 새 탭에서 이어받는다 ({id})":"Klicka för att fortsätta i en ny flik ({id})","작업 폴더: {cwd}":"Arbetsmapp: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Endast konversationen återupptas; servrar och bakgrundsprocesser startas inte om.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Inga sessioner matchar {filter} ({total} totalt)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Utökad för sökresultat (rensa sökningen för att fälla ihop)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} flikar) — klicka för att fälla ihop/ut","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} flikar utan känd arbetsmapp — klicka för att fälla ihop/ut","탭 {count}개":"{count} flikar","{status} {count} — 클릭하면 필터 해제":"{status} {count} — klicka för att rensa filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — klicka för att filtrera","{n}초":"{n}s","{n}분":"{n}min","{h}시간 {m}분":"{h}t {m}min","계정: {value}":"Konto: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Mapp: {value}","{tool} 권한":"Behörighet för {tool}","입력 대기":"Väntar på inmatning","플랜 승인":"Godkännande av plan","질문 응답":"Svar på fråga","{time} 리셋":"Återställning: {time}"}},5046(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Hesap adı (isteğe bağlı)","목록에서 삭제":"Listeden kaldır","이메일 주소 전체를 입력하세요.":"Tam e-posta adresini girin.","계정 추가":"Hesap ekle","계정 (이메일)":"Hesap (e-posta)",비밀번호:"Parola","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Hesap ve parola bu bilgisayarda düz metin olarak saklanır.",저장:"Kaydet",취소:"İptal","계정과 비밀번호를 입력하세요.":"Hesap ve parolayı girin.","이미 등록된 계정입니다.":"Bu hesap zaten kayıtlı.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Hesap kaydedilemedi. Tekrar deneyin.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Hesap dosyası okunamadı. JSON biçimini kontrol edin.","+ 버튼으로 계정을 추가하세요.":"Hesap eklemek için + düğmesini kullanın.","현재 탭에서 선택한 계정으로 전환합니다.":"Bu sekmede seçilen hesaba geç.","세션 검색 (제목 · 작업이름 · 폴더)":"Oturum ara (başlık · görev · klasör)","검색·필터 지우기 (Esc)":"Aramayı ve filtreleri temizle (Esc)","계정 선택":"Hesap seç","새 탭":"Yeni sekme","+ 새 탭":"+ Yeni sekme",설정:"Ayarlar","화면 복구 (모든 탭 다시 그리기)":"Görünümü onar (tüm sekmeleri yeniden çiz)","미리보기 패널 (md · 이미지 · 표)":"Önizleme paneli (Markdown · resimler · tablolar)",진행중:"Çalışıyor",승인대기:"Onay bekliyor","한도 도달":"Kullanım sınırına ulaşıldı",완료:"Tamamlandı",오류:"Hata",대기:"Boşta",기타:"Diğer","지난 세션":"Önceki oturumlar",어제:"Dün","● 열림":"● Açık","탭 닫기":"Sekmeyi kapat","(제목 없음)":"(Başlıksız)","작업 이름":"Görev adı",닫기:"Kapat",모름:"Bilinmiyor","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Kapatılmış Claude Code · Codex oturumları — sürdürmek için tıklayın","검색어와 맞는 지난 세션이 없다":"Aramayla eşleşen önceki oturum yok","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Tüm oturumları göstermek için Esc veya ✕ tuşuna basın","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Sekmeleri yeniden sıralamak için Ayarlar’da duruma göre sıralamayı kapatın","이 탭으로 이동":"Sekmeye git","새 탭에서 이어받기":"Yeni sekmede sürdür","분기해서 이어받기":"Konuşmayı dallandır","세션 ID 복사":"Oturum kimliğini kopyala","목록에서 숨기기":"Listeden gizle","↺ 자동 감지로":"↺ Otomatik algıla","↻ 화면 복구":"↻ Görünümü onar","패널에 띄우기":"Panelde aç","경로 붙여넣기":"Yolu yapıştır","아무것도 하지 않는다":"İptal","다시 묻지 않기":"Bir daha sorma","{name} 을 어떻게 할까요?":"{name} ile ne yapmak istersiniz?","{provider} 계정 선택":"{provider} hesabı seç","{provider} 계정":"{provider} hesapları","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Bu konuşmayı seçilen hesapla yeni bir sekmede sürdürün.","선택한 계정으로 새 대화를 엽니다.":"Seçilen hesapla yeni bir konuşma başlatın.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Kayıtlı hesap yok. accounts.json dosyasına hesap ekleyin."," · 현재 계정":" · Geçerli hesap","잔량 조회 중…":"Kullanım yükleniyor…","계정 저장 폴더를 준비하지 못했습니다.":"Hesap klasörü hazırlanamadı.","사용량 정보 없음":"Kullanım bilgisi yok","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Asıl sekme kapatıldı. Hesap listesini yeniden açın.","{name} 인증 확인 중…":"{name} için kimlik doğrulama denetleniyor…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: tarayıcıdan oturum açın. Kimlik doğrulama otomatik kaydedilecek.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Kimlik doğrulama kaydedildi. Asıl sekme kapatıldı; yeni bir konuşmada hesabı seçin.","계정 전환에 실패했습니다. 다시 선택하세요.":"Hesap değiştirilemedi. Yeniden deneyin.","새 계정 탭을 열지 못했습니다.":"Hesap sekmesi açılamadı.","세션 {id}":"Oturum {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Zaten açık — sekmeye gitmek için tıklayın","누르면 새 탭에서 이어받는다 ({id})":"Yeni sekmede sürdürmek için tıklayın ({id})","작업 폴더: {cwd}":"Çalışma klasörü: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Yalnızca konuşma sürdürülür; sunucular ve arka plan işlemleri yeniden başlatılmaz.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"{filter} ile eşleşen oturum yok (toplam {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Arama sonuçları için genişletildi (daraltmak için aramayı temizleyin)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} sekme) — daraltmak/genişletmek için tıklayın","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Çalışma klasörü bilinmeyen {count} sekme — daraltmak/genişletmek için tıklayın","탭 {count}개":"{count} sekme","{status} {count} — 클릭하면 필터 해제":"{status} {count} — filtreyi temizlemek için tıklayın","{status} {count} — 클릭하면 이 상태만":"{status} {count} — filtrelemek için tıklayın","{n}초":"{n}sn","{n}분":"{n}dk","{h}시간 {m}분":"{h}sa {m}dk","계정: {value}":"Hesap: {value}","버전: {value}":"Sürüm: {value}","폴더: {value}":"Klasör: {value}","{tool} 권한":"{tool} izni","입력 대기":"Girdi bekleniyor","플랜 승인":"Plan onayı","질문 응답":"Soru yanıtı","{time} 리셋":"Sıfırlama: {time}"}},6020(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"Назва облікового запису (необов’язково)","목록에서 삭제":"Видалити зі списку","이메일 주소 전체를 입력하세요.":"Введіть повну адресу електронної пошти.","계정 추가":"Додати обліковий запис","계정 (이메일)":"Обліковий запис (пошта)",비밀번호:"Пароль","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Обліковий запис і пароль зберігаються на цьому ПК у відкритому вигляді.",저장:"Зберегти",취소:"Скасувати","계정과 비밀번호를 입력하세요.":"Введіть обліковий запис і пароль.","이미 등록된 계정입니다.":"Цей обліковий запис уже збережено.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Не вдалося зберегти обліковий запис. Спробуйте знову.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Не вдалося прочитати файл облікових записів. Перевірте формат JSON.","+ 버튼으로 계정을 추가하세요.":"Натисніть +, щоб додати обліковий запис.","현재 탭에서 선택한 계정으로 전환합니다.":"Перемкнутися на вибраний обліковий запис у поточній вкладці.","세션 검색 (제목 · 작업이름 · 폴더)":"Пошук сеансів (заголовок · завдання · тека)","검색·필터 지우기 (Esc)":"Очистити пошук і фільтри (Esc)","계정 선택":"Вибрати обліковий запис","새 탭":"Нова вкладка","+ 새 탭":"+ Нова вкладка",설정:"Налаштування","화면 복구 (모든 탭 다시 그리기)":"Виправити відображення (перемалювати всі вкладки)","미리보기 패널 (md · 이미지 · 표)":"Панель перегляду (Markdown · зображення · таблиці)",진행중:"Виконується",승인대기:"Очікує дозволу","한도 도달":"Ліміт використання вичерпано",완료:"Готово",오류:"Помилка",대기:"Очікування",기타:"Інше","지난 세션":"Попередні сеанси",어제:"Учора","● 열림":"● Відкрито","탭 닫기":"Закрити вкладку","(제목 없음)":"(Без назви)","작업 이름":"Назва завдання",닫기:"Закрити",모름:"Невідомо","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Закриті сеанси Claude Code · Codex — натисніть для продовження","검색어와 맞는 지난 세션이 없다":"Немає попередніх сеансів, що відповідають пошуку","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Натисніть Esc або ✕, щоб показати всі сеанси","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Вимкніть сортування за станом у налаштуваннях, щоб змінити порядок вкладок","이 탭으로 이동":"Перейти до вкладки","새 탭에서 이어받기":"Продовжити в новій вкладці","분기해서 이어받기":"Створити гілку розмови","세션 ID 복사":"Копіювати ID сеансу","목록에서 숨기기":"Приховати зі списку","↺ 자동 감지로":"↺ Визначати автоматично","↻ 화면 복구":"↻ Виправити відображення","패널에 띄우기":"Відкрити на панелі","경로 붙여넣기":"Вставити шлях","아무것도 하지 않는다":"Скасувати","다시 묻지 않기":"Більше не запитувати","{name} 을 어떻게 할까요?":"Що зробити з {name}?","{provider} 계정 선택":"Вибрати обліковий запис {provider}","{provider} 계정":"Облікові записи {provider}","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Продовжити цю розмову в новій вкладці з вибраним обліковим записом.","선택한 계정으로 새 대화를 엽니다.":"Почати нову розмову з вибраним обліковим записом.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"Немає збережених облікових записів. Додайте їх до accounts.json."," · 현재 계정":" · Поточний обліковий запис","잔량 조회 중…":"Завантаження даних використання…","계정 저장 폴더를 준비하지 못했습니다.":"Не вдалося підготувати теку облікового запису.","사용량 정보 없음":"Дані використання недоступні","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"Початкову вкладку закрито. Знову відкрийте список облікових записів.","{name} 인증 확인 중…":"Перевірка автентифікації {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: увійдіть через браузер. Дані автентифікації збережуться автоматично.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Автентифікацію збережено. Початкову вкладку закрито; виберіть обліковий запис у новій розмові.","계정 전환에 실패했습니다. 다시 선택하세요.":"Не вдалося змінити обліковий запис. Спробуйте ще раз.","새 계정 탭을 열지 못했습니다.":"Не вдалося відкрити вкладку облікового запису.","세션 {id}":"Сеанс {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Уже відкрито — натисніть для переходу до вкладки","누르면 새 탭에서 이어받는다 ({id})":"Натисніть для продовження в новій вкладці ({id})","작업 폴더: {cwd}":"Робоча тека: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Відновлюється лише розмова; сервери й фонові процеси не перезапускаються.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"Немає сеансів для {filter} (усього {total})"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Розгорнуто для пошуку (очистіть пошук, щоб згорнути)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} (вкладок: {count}) — натисніть, щоб згорнути/розгорнути","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"Вкладок без відомої робочої теки: {count} — натисніть, щоб згорнути/розгорнути","탭 {count}개":"Вкладок: {count}","{status} {count} — 클릭하면 필터 해제":"{status} {count} — натисніть, щоб зняти фільтр","{status} {count} — 클릭하면 이 상태만":"{status} {count} — натисніть для фільтрації","{n}초":"{n}с","{n}분":"{n}хв","{h}시간 {m}분":"{h}год {m}хв","계정: {value}":"Обліковий запис: {value}","버전: {value}":"Версія: {value}","폴더: {value}":"Тека: {value}","{tool} 권한":"Дозвіл для {tool}","입력 대기":"Очікує введення","플랜 승인":"Затвердження плану","질문 응답":"Відповідь на запитання","{time} 리셋":"Скидання: {time}"}},710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"账户名称(可选)","목록에서 삭제":"从列表中移除","이메일 주소 전체를 입력하세요.":"请输入完整的电子邮件地址。","계정 추가":"添加账户","계정 (이메일)":"账户(邮箱)",비밀번호:"密码","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"账户和密码将以明文形式保存在此电脑上。",저장:"保存",취소:"取消","계정과 비밀번호를 입력하세요.":"请输入账户和密码。","이미 등록된 계정입니다.":"该账户已添加。","계정을 저장하지 못했습니다. 다시 시도하세요.":"无法保存账户,请重试。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"无法读取账户文件,请检查JSON格式。","+ 버튼으로 계정을 추가하세요.":"点击+按钮添加账户。","현재 탭에서 선택한 계정으로 전환합니다.":"在当前标签页中切换到所选账户。","세션 검색 (제목 · 작업이름 · 폴더)":"搜索会话(标题 · 任务 · 文件夹)","검색·필터 지우기 (Esc)":"清除搜索和筛选(Esc)","계정 선택":"选择账户","새 탭":"新建标签页","+ 새 탭":"+ 新建标签页",설정:"设置","화면 복구 (모든 탭 다시 그리기)":"修复显示(重绘所有标签页)","미리보기 패널 (md · 이미지 · 표)":"预览面板(Markdown · 图片 · 表格)",진행중:"进行中",승인대기:"等待批准","한도 도달":"已达使用上限",완료:"已完成",오류:"错误",대기:"空闲",기타:"其他","지난 세션":"历史会话",어제:"昨天","● 열림":"● 已打开","탭 닫기":"关闭标签页","(제목 없음)":"(无标题)","작업 이름":"任务名称",닫기:"关闭",모름:"未知","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"已关闭的 Claude Code · Codex 会话 — 点击继续","검색어와 맞는 지난 세션이 없다":"没有匹配的历史会话","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"按 Esc 或 ✕ 显示全部会话","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"请在设置中关闭按状态排序后调整标签页顺序","이 탭으로 이동":"转到标签页","새 탭에서 이어받기":"在新标签页中继续","분기해서 이어받기":"创建会话分支","세션 ID 복사":"复制会话 ID","목록에서 숨기기":"从列表中隐藏","↺ 자동 감지로":"↺ 自动检测","↻ 화면 복구":"↻ 修复显示","패널에 띄우기":"在面板中打开","경로 붙여넣기":"粘贴路径","아무것도 하지 않는다":"取消","다시 묻지 않기":"不再询问","{name} 을 어떻게 할까요?":"要如何处理 {name}?","{provider} 계정 선택":"选择 {provider} 账户","{provider} 계정":"{provider} 账户","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"使用所选账户在新标签页中继续此会话。","선택한 계정으로 새 대화를 엽니다.":"使用所选账户开始新会话。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"没有已保存的账户。请在 accounts.json 中添加账户。"," · 현재 계정":" · 当前账户","잔량 조회 중…":"正在加载使用量…","계정 저장 폴더를 준비하지 못했습니다.":"无法准备账户文件夹。","사용량 정보 없음":"使用量信息不可用","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"原标签页已关闭。请重新打开账户列表。","{name} 인증 확인 중…":"正在检查 {name} 的身份验证…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}:请在浏览器中登录。身份验证信息将自动保存。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"身份验证信息已保存。原标签页已关闭,请在新会话中选择账户。","계정 전환에 실패했습니다. 다시 선택하세요.":"无法切换账户。请重试。","새 계정 탭을 열지 못했습니다.":"无法打开账户标签页。","세션 {id}":"会话 {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"已打开 — 点击转到该标签页","누르면 새 탭에서 이어받는다 ({id})":"点击在新标签页中继续({id})","작업 폴더: {cwd}":"工作文件夹:{cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"仅恢复会话,不会重启服务器或后台进程。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"没有匹配 {filter} 的会话(共 {total} 个)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 已展开搜索结果(清除搜索后折叠)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} 个标签页)— 点击折叠/展开","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} 个标签页的工作文件夹未知 — 点击折叠/展开","탭 {count}개":"{count} 个标签页","{status} {count} — 클릭하면 필터 해제":"{status} {count} — 点击清除筛选","{status} {count} — 클릭하면 이 상태만":"{status} {count} — 点击筛选","{n}초":"{n}秒","{n}분":"{n}分钟","{h}시간 {m}분":"{h}小时 {m}分钟","계정: {value}":"账户:{value}","버전: {value}":"版本:{value}","폴더: {value}":"文件夹:{value}","{tool} 권한":"{tool} 权限","입력 대기":"等待输入","플랜 승인":"批准计划","질문 응답":"回答问题","{time} 리셋":"重置:{time}"}},3070(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"계정 이름 (선택)":"帳戶名稱(選填)","목록에서 삭제":"從清單移除","이메일 주소 전체를 입력하세요.":"請輸入完整的電子郵件地址。","계정 추가":"新增帳戶","계정 (이메일)":"帳戶(電子郵件)",비밀번호:"密碼","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"帳戶和密碼將以純文字形式儲存在這台電腦上。",저장:"儲存",취소:"取消","계정과 비밀번호를 입력하세요.":"請輸入帳戶和密碼。","이미 등록된 계정입니다.":"此帳戶已新增。","계정을 저장하지 못했습니다. 다시 시도하세요.":"無法儲存帳戶,請重試。","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"無法讀取帳戶檔案,請檢查JSON格式。","+ 버튼으로 계정을 추가하세요.":"點擊+按鈕新增帳戶。","현재 탭에서 선택한 계정으로 전환합니다.":"在目前分頁中切換至所選帳戶。","세션 검색 (제목 · 작업이름 · 폴더)":"搜尋工作階段(標題 · 工作 · 資料夾)","검색·필터 지우기 (Esc)":"清除搜尋與篩選(Esc)","계정 선택":"選擇帳戶","새 탭":"新增分頁","+ 새 탭":"+ 新增分頁",설정:"設定","화면 복구 (모든 탭 다시 그리기)":"修復顯示(重繪所有分頁)","미리보기 패널 (md · 이미지 · 표)":"預覽面板(Markdown · 圖片 · 表格)",진행중:"執行中",승인대기:"等待核准","한도 도달":"已達使用上限",완료:"已完成",오류:"錯誤",대기:"閒置",기타:"其他","지난 세션":"過去的工作階段",어제:"昨天","● 열림":"● 已開啟","탭 닫기":"關閉分頁","(제목 없음)":"(未命名)","작업 이름":"工作名稱",닫기:"關閉",모름:"未知","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"已關閉的 Claude Code · Codex 工作階段 — 點擊繼續","검색어와 맞는 지난 세션이 없다":"沒有符合搜尋的過去工作階段","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"按 Esc 或 ✕ 顯示所有工作階段","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"請在設定中關閉依狀態排序,再調整分頁順序","이 탭으로 이동":"前往分頁","새 탭에서 이어받기":"在新分頁中繼續","분기해서 이어받기":"建立對話分支","세션 ID 복사":"複製工作階段 ID","목록에서 숨기기":"從清單隱藏","↺ 자동 감지로":"↺ 自動偵測","↻ 화면 복구":"↻ 修復顯示","패널에 띄우기":"在面板中開啟","경로 붙여넣기":"貼上路徑","아무것도 하지 않는다":"取消","다시 묻지 않기":"不要再詢問","{name} 을 어떻게 할까요?":"要如何處理 {name}?","{provider} 계정 선택":"選擇 {provider} 帳戶","{provider} 계정":"{provider} 帳戶","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"使用所選帳戶,在新分頁中繼續此對話。","선택한 계정으로 새 대화를 엽니다.":"使用所選帳戶開始新對話。","등록된 계정이 없습니다. accounts.json을 채워주세요.":"沒有已儲存的帳戶。請在 accounts.json 中新增帳戶。"," · 현재 계정":" · 目前帳戶","잔량 조회 중…":"正在載入使用量…","계정 저장 폴더를 준비하지 못했습니다.":"無法準備帳戶資料夾。","사용량 정보 없음":"無使用量資訊","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"原分頁已關閉。請重新開啟帳戶清單。","{name} 인증 확인 중…":"正在檢查 {name} 的驗證…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}:請在瀏覽器中登入。驗證資訊將自動儲存。","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"驗證資訊已儲存。原分頁已關閉,請在新對話中選擇帳戶。","계정 전환에 실패했습니다. 다시 선택하세요.":"無法切換帳戶。請再試一次。","새 계정 탭을 열지 못했습니다.":"無法開啟帳戶分頁。","세션 {id}":"工作階段 {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"已開啟 — 點擊前往該分頁","누르면 새 탭에서 이어받는다 ({id})":"點擊在新分頁中繼續({id})","작업 폴더: {cwd}":"工作資料夾:{cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"僅恢復對話,不會重新啟動伺服器或背景程序。","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"沒有符合 {filter} 的工作階段(共 {total} 個)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · 已展開搜尋結果(清除搜尋後摺疊)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder}({count} 個分頁)— 點擊摺疊/展開","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} 個分頁的工作資料夾未知 — 點擊摺疊/展開","탭 {count}개":"{count} 個分頁","{status} {count} — 클릭하면 필터 해제":"{status} {count} — 點擊清除篩選","{status} {count} — 클릭하면 이 상태만":"{status} {count} — 點擊篩選","{n}초":"{n}秒","{n}분":"{n}分鐘","{h}시간 {m}분":"{h}小時 {m}分鐘","계정: {value}":"帳戶:{value}","버전: {value}":"版本:{value}","폴더: {value}":"資料夾:{value}","{tool} 권한":"{tool} 權限","입력 대기":"等待輸入","플랜 승인":"核准計畫","질문 응답":"回答問題","{time} 리셋":"重設:{time}"}},4544(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Додатни радни профили","root.choose.desc":"Сачувајте више радних фасцикли и изаберите профил при отварању нове картице.","root.add":"Додај профил","root.remove":"Уклони профил","layout.title":"Користи AgentDeck распоред","layout.desc":"Искључите па нестају бочна трака и фиксна ширина — Tabby се враћа на изворни изглед.","reset.title":"Врати распоред на почетно","reset.desc":"Враћа бочну траку у почетно стање — усидрена десно, са ширином израчунатом из односа прозора.","reset.now":"Сада: усидрена {dock}, {size}.","reset.default":"Тренутно је све на подразумеваним вредностима.","reset.btn":"Врати на почетно","dock.left":"лево","dock.right":"десно","dock.top":"горе","dock.bottom":"доле","size.width":"ширина {px} px","size.height":"висина {px} px","size.auto":"ширина аутоматски","norecover.title":"Не враћај картице при покретању","norecover.desc":"Tabby се покреће празан уместо да враћа претходне картице — ионако се враћа само љуска, а Claude сесија која је била у њој одавно је завршена. Искључите за изворно понашање (<code>recoverTabs</code>). Важи од следећег покретања.","resume.title":"Настави претходне сесије","resume.desc":"Додаје фиоку <code>⟲ Претходне сесије</code> на крај сваке групе (подразумевано скупљену). Када је отворите, у њој су <b>затворене сесије Claude Code-а и Codex-а</b> означене упитом који сте заиста укуцали; кликом се разговор враћа наредбом <code>claude --resume</code> или <code>codex resume</code> у сопственој радној фасцикли. То је друга половина опције <b>Не враћај картице</b> изнад — изворно враћање врати љуску, ово враћа разговор. <b>Сервери и позадински процеси које сте тада имали покренуте не враћају се.</b>","agents.head":"Повезивање агената","agents.intro":"Омогућава да сваки агент <b>сам јавља</b> своје стање, модел и ограничења потрошње. То је најтачнији извор који бочна трака има — без тога нагађамо из текста исцртаног на екрану, па очитавање сходно томе варира.","agents.unsupported.title":"Није доступно на овој платформи","agents.unsupported.desc":"Скрипта за обавештења писана је у PowerShell-у па ради само на Windows-у. Стање се уместо тога нагађа из исписа.","state.on":"Повезано","state.off":"Није повезано","state.half":"Напола повезано","btn.install":"Инсталирај","btn.remove":"Уклони","claude.title":"Повезивање са Claude-ом","claude.desc":"Сесије Claude Code-а појављују се у бочној траци са својим <b>стањем</b> (ради · чека одобрење · готово) и <b>тракама модела, налога и потрошње</b>. Куке и <code>statusLine</code> у <code>~/.claude/settings.json</code> постављају се заједно и заједно уклањају. Остале куке се не дирају, а <code>statusLine</code> који сте већ имали <b>извршава се непромењен</b> — оно што тамо видите остаје исто. Пре уписа се поред датотеке оставља резервна копија.","codex.title":"Повезивање са Codex-ом","codex.desc":"Сесије Codex-а појављују се у бочној траци са својим <b>стањем</b> (ради · чека одобрење · готово · прекинуто) и <b>тракама модела, налога и потрошње</b>. После инсталације поново отворите Codex па прегледајте и одобрите AgentDeck куке под <code>/hooks</code>.","codex.disabled":"Codex је искључио ове куке — док их не укључиш, ништа не стиже: {events}. Отвори Codex, покрени <code>/hooks</code> и одобри их.","root.head":"Профил радне фасцикле","root.intro":"Прави профил да би се нове картице увек отварале у истој фасцикли. Измене важе после поновног покретања Tabby-ја.","root.use.title":"Користи профил радне фасцикле","root.use.desc":"Укључите и упишите фасциклу — профил се прави и постаје подразумевани.","root.name.title":"Назив профила","root.cwd.title":"Радна фасцикла","root.cwd.desc":"Ако оставите празно, профил се не прави. Када уписујете ручно, користите косе црте (нпр. D:/Project) да избегнете замке са обрнутим косим цртама.","root.browse":"Прегледај","root.command.title":"Наредба","diag.head":"Пријави проблем","diag.intro":"Скупља дијагностичке записе у <b>један zip</b> и отвара фасциклу у којој заврши. Садржи: верзије додатка и Tabby-ја и оперативни систем, подешавања изнад и два најновија нараштаја датотеке <code>{path}</code>. У записима су <b>наслови картица и путање које сте отварали</b> — слободно отворите zip и проверите пре слања.","diag.screen.title":"Укључи и сиров садржај екрана","diag.screen.desc":"Укључите код проблема са исцртавањем. Екран терминала улази дословно — у њему се виде ваш рад и код — па је подразумевано искључено.","diag.collect.title":"Скупи записе","diag.collect.desc":"Додатак v{version}.","diag.made":"Направљено: ","diag.btn":"Скупи","dev.head":"Развојне опције","dev.use.title":"Укључи развојне опције","dev.use.desc":"Укључује <b>поновно учитавање уживо</b> — чим <code>npm run build</code> препише <code>dist/index.js</code>, прозор се поново учита на нови додатак <b>уз очуване сесије</b> (картице се поново вежу на исти pty). Пречица <b>[dev] Поново учитај додатак</b> такође прати овај прекидач. Када је искључено, промена dist фасцикле не ради ништа. Видљиво само код инсталације из изворног стабла; npm издање ово нема.","dev.now.title":"Учитај поново сада","dev.now.desc":"Поново учитава тренутни dist без изградње.","dev.btn":"Учитај поново",footer:"Остало — однос прозора, ширина бочне траке, провидност, откривање стања, обрада уноса — фиксирано је на подразумеване вредности. Ако нешто треба променити, уредите <code>agentDeck.*</code> директно у конфигурационој датотеци. Пречице су на картици <b>Пречице</b> под <code>agentdeck-*</code>.","keys.head":"Пречице","keys.intro":"Тастери са насловне стране. Притисните <b>Промени</b>, затим нови тастер. Ако је већ заузет — од самог Tabby-ја или AgentDeck-а — рећи ће вам се <b>са чиме се судара</b> и можете бирати поново или га преузети. Важи одмах.","keys.change":"Промени","keys.default":"Подразумевано","keys.cancel":"Откажи","keys.force":"Свеједно користи","keys.press":"Притисните нови тастер… (Esc отказује)","keys.conflict":"Судара се са {names}. Ако га свеједно користите, тастер се тамо уклања.","keys.unbound":"није додељено","keys.stock":"уграђено у Tabby","keys.digit":"Ово мора да се завршава цифром 1–9 — цифра је број сесије. Притисните нпр. Alt+1 и 2…9 следе.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, десни клик и <code>Ctrl+F</code> / <code>Ctrl+S</code> у панелу нису пречице и овде се не мењају.","keys.item.newtab":"Нова картица у радном корену","keys.item.jump":"Скочи на N-ту сесију","keys.item.focus":"Фокус на списак сесија / назад у терминал","keys.item.view":"Отвори / затвори панел прегледа","keys.item.repair":"Поправи екран","keys.item.splitright":"Подели једно поред другог (ново окно десно)","keys.item.splitbottom":"Подели горе / доле (ново окно доле)","keys.item.closepane":"Затвори активно подељено окно","keys.item.newline":"Нови ред без слања","keys.item.toggle":"Бочна трака / 4:3 укљ-искљ","keys.item.viewmode":"Панел: Датотеке ↔ Промене"}},3948(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Fler arbetsprofiler","root.choose.desc":"Spara flera arbetsmappar och välj en profil när du öppnar en ny flik.","root.add":"Lägg till profil","root.remove":"Ta bort profil","layout.title":"Använd AgentDecks layout","layout.desc":"Stäng av så försvinner sidopanelen och den fasta bredden — Tabby ser ut som vanligt igen.","reset.title":"Återställ layouten","reset.desc":"Sätter tillbaka sidopanelen till utgångsläget — dockad till höger, med bredden uträknad ur fönstrets proportioner.","reset.now":"Nu: dockad {dock}, {size}.","reset.default":"Just nu är allt i standardläge.","reset.btn":"Återställ","dock.left":"till vänster","dock.right":"till höger","dock.top":"upptill","dock.bottom":"nedtill","size.width":"{px} px bred","size.height":"{px} px hög","size.auto":"automatisk bredd","norecover.title":"Återställ inte flikar vid start","norecover.desc":"Tabby startar tomt i stället för att ta tillbaka de gamla flikarna — det som kommer tillbaka är ändå bara skalet, och Claude-sessionen som fanns i det är sedan länge slut. Stäng av för Tabbys ursprungliga beteende (<code>recoverTabs</code>). Gäller från nästa start.","resume.title":"Återuppta tidigare sessioner","resume.desc":"Lägger till en låda <code>⟲ Tidigare sessioner</code> sist i varje grupp (hopfälld som standard). Fäll ut den så listas <b>stängda Claude Code- och Codex-sessioner</b> med den prompt du faktiskt skrev; ett klick öppnar samtalet igen med <code>claude --resume</code> eller <code>codex resume</code> i dess egen arbetsmapp. Det är andra halvan av <b>Återställ inte flikar</b> ovan — den vanliga återställningen tar tillbaka skalet, den här tar tillbaka samtalet. <b>Servrar och bakgrundsprocesser du hade igång kommer inte tillbaka.</b>","agents.head":"Agentintegration","agents.intro":"Låter varje agent <b>själv rapportera</b> sitt tillstånd, sin modell och sina gränser. Det är den mest tillförlitliga källan sidopanelen har — utan den gissar vi utifrån texten som ritas på skärmen, och avläsningen blir därefter vinglig.","agents.unsupported.title":"Inte tillgängligt på den här plattformen","agents.unsupported.desc":"Aviseringsskriptet är PowerShell och körs därför bara i Windows. Tillståndet gissas i stället utifrån utdata.","state.on":"Ansluten","state.off":"Inte ansluten","state.half":"Halvt ansluten","btn.install":"Installera","btn.remove":"Ta bort","claude.title":"Claude-integration","claude.desc":"Claude Code-sessioner syns i sidopanelen med sitt <b>tillstånd</b> (arbetar · väntar på godkännande · klart) och <b>staplar för modell, konto och förbrukning</b>. Installerar krokarna och <code>statusLine</code> i <code>~/.claude/settings.json</code> tillsammans, och tar bort dem tillsammans. Andra krokar rörs inte, och en <code>statusLine</code> du redan hade körs <b>precis som den är</b> — det du ser där ändras inte. En säkerhetskopia skrivs bredvid filen först.","codex.title":"Codex-integration","codex.desc":"Codex-sessioner syns i sidopanelen med sitt <b>tillstånd</b> (arbetar · väntar på godkännande · klart · avbrutet) och <b>staplar för modell, konto och förbrukning</b>. Öppna Codex igen efter installationen och granska och godkänn AgentDecks krokar under <code>/hooks</code>.","codex.disabled":"Codex har stängt av dessa krokar — inget kommer fram förrän du slår på dem: {events}. Öppna Codex, kör <code>/hooks</code> och godkänn dem.","root.head":"Profil för arbetsmapp","root.intro":"Skapar en profil så att nya flikar alltid öppnas i samma mapp. Ändringar gäller efter omstart av Tabby.","root.use.title":"Använd en profil för arbetsmapp","root.use.desc":"Slå på och fyll i mappen — profilen skapas och blir standard.","root.name.title":"Profilnamn","root.cwd.title":"Arbetsmapp","root.cwd.desc":"Lämnar du det tomt skapas ingen profil. Skriver du för hand, använd snedstreck (t.ex. D:/Project) för att undvika fällorna med omvända snedstreck.","root.browse":"Bläddra","root.command.title":"Kommando","diag.head":"Rapportera ett problem","diag.intro":"Samlar diagnostikloggarna i <b>en enda zip</b> och öppnar mappen där den hamnar. Den innehåller: versioner av insticksmodulen och Tabby samt operativsystem, inställningarna ovan och de två senaste generationerna av <code>{path}</code>. Loggarna innehåller <b>flikrubriker och de sökvägar du öppnat</b> — öppna gärna zipfilen och kontrollera innan du skickar den.","diag.screen.title":"Ta med råa skärminnehållet","diag.screen.desc":"Slå på vid ritproblem. Terminalskärmen följer med ordagrant — ditt arbete och din kod syns i den — därför är det avstängt som standard.","diag.collect.title":"Samla loggarna","diag.collect.desc":"Insticksmodul v{version}.","diag.made":"Skapad: ","diag.btn":"Samla","dev.head":"Utvecklaralternativ","dev.use.title":"Aktivera utvecklaralternativ","dev.use.desc":"Slår på <b>direktomladdning</b> — när <code>npm run build</code> skriver om <code>dist/index.js</code> laddas fönstret om till den nya insticksmodulen <b>med sessionerna i behåll</b> (flikarna kopplas tillbaka till samma pty). Snabbtangenten <b>[dev] Ladda om insticksmodulen</b> följer också den här brytaren. Med den av händer ingenting när dist ändras. Visas bara vid installation från källträdet; npm-bygget har inte det här.","dev.now.title":"Ladda om nu","dev.now.desc":"Laddar om nuvarande dist utan att bygga.","dev.btn":"Ladda om",footer:"Resten — fönsterproportion, sidopanelens bredd, opacitet, tillståndsdetektering, indatahantering — är låst till standardvärdena. Behöver du ändra något, redigera <code>agentDeck.*</code> direkt i konfigurationsfilen. Snabbtangenterna finns under fliken <b>Snabbtangenter</b> som <code>agentdeck-*</code>.","keys.head":"Snabbtangenter","keys.intro":"Tangenterna från startsidan. Tryck <b>Ändra</b> och sedan den nya tangenten. Är den redan upptagen — av Tabby självt eller av AgentDeck — får du veta <b>vad den krockar med</b> och kan välja om eller ta över den. Gäller direkt.","keys.change":"Ändra","keys.default":"Standard","keys.cancel":"Avbryt","keys.force":"Använd ändå","keys.press":"Tryck på den nya tangenten… (Esc avbryter)","keys.conflict":"Krockar med {names}. Använder du den ändå tas tangenten bort där.","keys.unbound":"ej tilldelad","keys.stock":"Tabbys egen","keys.digit":"Den här måste sluta på en siffra 1–9 — siffran är sessionsnumret. Tryck t.ex. Alt+1 så följer 2…9 med.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, högerklick och panelens <code>Ctrl+F</code> / <code>Ctrl+S</code> är inte snabbtangenter och ändras inte här.","keys.item.newtab":"Ny flik i arbetsroten","keys.item.jump":"Hoppa till session N","keys.item.focus":"Fokus på sessionslistan / tillbaka till terminalen","keys.item.view":"Öppna / stäng förhandsvisningspanelen","keys.item.repair":"Reparera skärmen","keys.item.splitright":"Dela sida vid sida (ny ruta till höger)","keys.item.splitbottom":"Dela över / under (ny ruta nedanför)","keys.item.closepane":"Stäng den aktiva delade rutan","keys.item.newline":"Radbrytning utan att skicka","keys.item.toggle":"Sidopanel / 4:3 på-av","keys.item.viewmode":"Panel: Filer ↔ Ändringar"}},171(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Ek çalışma profilleri","root.choose.desc":"Birden fazla çalışma klasörü kaydedin ve yeni sekme açarken bir profil seçin.","root.add":"Profil ekle","root.remove":"Profili kaldır","layout.title":"AgentDeck düzenini kullan","layout.desc":"Kapatırsanız kenar çubuğu ve sabit genişlik kaybolur, Tabby’nin özgün görünümüne dönersiniz.","reset.title":"Düzeni sıfırla","reset.desc":"Kenar çubuğunu ilk hâline döndürür — sağa yaslı ve genişliği pencere oranından hesaplanmış.","reset.now":"Şu an: {dock} yaslı, {size}.","reset.default":"Şu anda her şey varsayılan durumda.","reset.btn":"Sıfırla","dock.left":"sola","dock.right":"sağa","dock.top":"üste","dock.bottom":"alta","size.width":"genişlik {px} px","size.height":"yükseklik {px} px","size.auto":"genişlik otomatik","norecover.title":"Açılışta sekmeleri geri yükleme","norecover.desc":"Tabby eski sekmeleri geri getirmek yerine boş açılır — geri gelen zaten yalnızca kabuk, içindeki Claude oturumu çoktan bitmiş oluyor. Kapatırsanız Tabby’nin özgün davranışına (<code>recoverTabs</code>) dönersiniz. Bir sonraki açılıştan itibaren geçerlidir.","resume.title":"Geçmiş oturumları sürdür","resume.desc":"Her grubun sonuna <code>⟲ Geçmiş oturumlar</code> çekmecesi ekler (varsayılan olarak kapalı). Açtığınızda <b>kapanmış Claude Code ve Codex oturumları</b> gerçekten yazdığınız istemle listelenir; birine tıklayınca konuşma, kendi çalışma klasöründe <code>claude --resume</code> ya da <code>codex resume</code> ile geri gelir. Bu, yukarıdaki <b>Açılışta sekmeleri geri yükleme</b> ayarının diğer yarısıdır — özgün geri yükleme kabuğu getirir, bu ise konuşmayı getirir. <b>O sırada açık olan sunucular ve arka plan süreçleri geri gelmez.</b>","agents.head":"Aracı entegrasyonu","agents.intro":"Her aracının durumunu, kullandığı modeli ve kullanım sınırlarını <b>kendisinin bildirmesini</b> sağlar. Kenar çubuğunun sahip olduğu en doğru kaynak budur — bağlamazsanız ekrana çizilen yazıdan tahmin ederiz ve okuma o ölçüde oynar.","agents.unsupported.title":"Bu platformda kullanılamaz","agents.unsupported.desc":"Bildirim betiği PowerShell olduğundan yalnızca Windows’ta çalışır. Durum bunun yerine çıktıdan tahmin edilir.","state.on":"Bağlı","state.off":"Bağlı değil","state.half":"Yarım bağlı","btn.install":"Kur","btn.remove":"Kaldır","claude.title":"Claude entegrasyonu","claude.desc":"Claude Code oturumları kenar çubuğunda <b>durumuyla</b> (çalışıyor · onay bekliyor · bitti) ve <b>model, hesap ve kullanım çubuklarıyla</b> görünür. <code>~/.claude/settings.json</code> içindeki kancaları ve <code>statusLine</code> ayarını birlikte kurar, birlikte kaldırır. Diğer kancalara dokunmaz ve hâlihazırda kullandığınız <code>statusLine</code> <b>olduğu gibi çalıştırılır</b>, yani orada gördüğünüz değişmez. Yazmadan önce aynı klasöre bir yedek bırakılır.","codex.title":"Codex entegrasyonu","codex.desc":"Codex oturumları kenar çubuğunda <b>durumuyla</b> (çalışıyor · onay bekliyor · bitti · kesildi) ve <b>model, hesap ve kullanım çubuklarıyla</b> görünür. Kurduktan sonra Codex’i yeniden açın ve <code>/hooks</code> altında AgentDeck kancalarını gözden geçirip onaylayın.","codex.disabled":"Codex bu kancaları kapatmış — açmadan hiçbir şey gelmez: {events}. Codex’i açın, <code>/hooks</code> çalıştırın ve onaylayın.","root.head":"Çalışma klasörü profili","root.intro":"Yeni sekmelerin hep aynı klasörde açılması için özel bir profil oluşturur. Değişiklikler Tabby yeniden başlatıldıktan sonra geçerli olur.","root.use.title":"Çalışma klasörü profilini kullan","root.use.desc":"Açıp klasörü doldurun — profil oluşturulur ve varsayılan profil olur.","root.name.title":"Profil adı","root.cwd.title":"Çalışma klasörü","root.cwd.desc":"Boş bırakırsanız profil oluşturulmaz. Elle yazarken ters eğik çizgi kaçış tuzaklarına düşmemek için düz eğik çizgi kullanın (örn. D:/Project).","root.browse":"Gözat","root.command.title":"Komut","diag.head":"Sorun bildir","diag.intro":"Tanılama günlüklerini <b>tek bir zip dosyasında</b> toplar ve dosyanın bulunduğu klasörü açar. İçinde şunlar var: eklenti/Tabby sürümleri ve işletim sistemi, yukarıdaki ayarlar ve <code>{path}</code> yolunun en son iki kuşağı. Günlüklerde <b>sekme başlıkları ve açtığınız dosya yolları</b> yer alır — göndermeden önce zip’i açıp kontrol edebilirsiniz.","diag.screen.title":"Ham ekran içeriğini de ekle","diag.screen.desc":"Çizim bozukluğu sorunlarında açın. Terminal ekranı olduğu gibi girer — çalışmanız ve kodunuz görünür — bu yüzden varsayılan olarak kapalıdır.","diag.collect.title":"Günlükleri topla","diag.collect.desc":"Eklenti v{version}.","diag.made":"Oluşturuldu: ","diag.btn":"Topla","dev.head":"Geliştirici seçenekleri","dev.use.title":"Geliştirici seçeneklerini etkinleştir","dev.use.desc":"<b>Canlı yeniden yükleme</b>yi açar — <code>npm run build</code> <code>dist/index.js</code> dosyasını yeniden yazdığında pencere, <b>oturumlarınız korunarak</b> yeni eklentiye geçer (sekmeler aynı pty’ye yeniden bağlanır). Kısayol sekmesindeki <b>[dev] Eklentiyi yeniden yükle</b> de bu anahtarı izler. Kapalıyken dist değişse bile hiçbir şey olmaz. Yalnızca kaynak ağacından kurulumda görünür; npm sürümünde bu özellik yoktur.","dev.now.title":"Şimdi yeniden yükle","dev.now.desc":"Derlemeden, mevcut dist ile yeniden yükler.","dev.btn":"Yeniden yükle",footer:"Geri kalanlar — pencere oranı, kenar çubuğu genişliği, saydamlık, durum algılama, giriş işleme — varsayılan değerlere sabitlenmiştir. Birini değiştirmeniz gerekirse yapılandırma dosyasındaki <code>agentDeck.*</code> değerlerini doğrudan düzenleyin. Kısayollar <b>Kısayollar</b> sekmesinde <code>agentdeck-*</code> olarak bulunur.","keys.head":"Kısayollar","keys.intro":"Ana sayfadaki tuşlar. <b>Değiştir</b>e basın, sonra yeni tuşa. Tuş zaten kullanılıyorsa — Tabby'nin kendisi ya da AgentDeck tarafından — <b>neyle çakıştığı</b> söylenir; yeniden seçebilir ya da tuşu devralabilirsiniz. Hemen uygulanır.","keys.change":"Değiştir","keys.default":"Varsayılan","keys.cancel":"İptal","keys.force":"Yine de kullan","keys.press":"Yeni tuşa basın… (Esc iptal eder)","keys.conflict":"{names} ile çakışıyor. Yine de kullanırsanız tuş oradan kaldırılır.","keys.unbound":"atanmamış","keys.stock":"Tabby'nin kendi","keys.digit":"Bu, 1–9 arası bir rakamla bitmeli — rakam oturum numarasıdır. Örn. Alt+1'e basın, 2…9 da ona uyar.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, sağ tık ve paneldeki <code>Ctrl+F</code> / <code>Ctrl+S</code> kısayol değildir, burada değiştirilmez.","keys.item.newtab":"Çalışma kökünde yeni sekme","keys.item.jump":"N. oturuma git","keys.item.focus":"Oturum listesine odaklan / terminale dön","keys.item.view":"Önizleme panelini aç / kapat","keys.item.repair":"Ekranı onar","keys.item.splitright":"Yan yana böl (yeni bölme sağda)","keys.item.splitbottom":"Alt alta böl (yeni bölme altta)","keys.item.closepane":"Odaklanılan bölmeyi kapat","keys.item.newline":"Göndermeden yeni satır","keys.item.toggle":"Kenar çubuğu / 4:3 aç-kapat","keys.item.viewmode":"Panel: Dosyalar ↔ Değişiklikler"}},3893(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"Додаткові робочі профілі","root.choose.desc":"Збережіть кілька робочих папок і вибирайте профіль, відкриваючи нову вкладку.","root.add":"Додати профіль","root.remove":"Видалити профіль","layout.title":"Використовувати розкладку AgentDeck","layout.desc":"Вимкніть — зникнуть бічна панель і фіксована ширина, повернеться звичайний вигляд Tabby.","reset.title":"Скинути розкладку","reset.desc":"Повертає бічну панель до початкового стану — закріплена праворуч, ширина обчислена із пропорцій вікна.","reset.now":"Зараз: закріплена {dock}, {size}.","reset.default":"Зараз усе на типових значеннях.","reset.btn":"Скинути","dock.left":"ліворуч","dock.right":"праворуч","dock.top":"угорі","dock.bottom":"внизу","size.width":"ширина {px} px","size.height":"висота {px} px","size.auto":"ширина автоматично","norecover.title":"Не відновлювати вкладки під час запуску","norecover.desc":"Tabby запускається порожнім замість повернення попередніх вкладок — повертається лише оболонка, а сеанс Claude усередині неї давно завершився. Вимкніть, щоб повернути штатну поведінку (<code>recoverTabs</code>). Діє з наступного запуску.","resume.title":"Продовжити минулі сеанси","resume.desc":"Додає в кінець кожної групи шухляду <code>⟲ Минулі сеанси</code> (типово згорнуту). Усередині перелічено <b>закриті сеанси Claude Code і Codex</b> — із тим запитом, який ви справді набирали; після кліку розмова повертається через <code>claude --resume</code> або <code>codex resume</code> у власній робочій теці. Це друга половина пункту <b>Не відновлювати вкладки</b> вище: штатне відновлення повертає оболонку, а це — розмову. <b>Запущені тоді сервери та фонові процеси не повертаються.</b>","agents.head":"Підключення агентів","agents.intro":"Дає змогу кожному агентові <b>самому повідомляти</b> свій стан, модель та ліміти. Це найточніше джерело для бічної панелі — без нього ми вгадуємо за текстом, намальованим на екрані, і оцінка відповідно хитається.","agents.unsupported.title":"Недоступно на цій платформі","agents.unsupported.desc":"Скрипт сповіщень написано на PowerShell, тож він працює лише у Windows. Стан визначається з виводу.","state.on":"Підключено","state.off":"Не підключено","state.half":"Підключено наполовину","btn.install":"Встановити","btn.remove":"Вилучити","claude.title":"Підключення Claude","claude.desc":"Сеанси Claude Code з’являються в бічній панелі зі своїм <b>станом</b> (працює · чекає підтвердження · готово) та <b>смугами моделі, облікового запису й лімітів</b>. Хуки та <code>statusLine</code> у <code>~/.claude/settings.json</code> встановлюються разом і вилучаються разом. Інших хуків не чіпаємо, а наявну <code>statusLine</code> <b>запускаємо як є</b> — те, що ви там бачите, не змінюється. Перед записом поруч із файлом зберігається резервна копія.","codex.title":"Підключення Codex","codex.desc":"Сеанси Codex з’являються в бічній панелі зі своїм <b>станом</b> (працює · чекає підтвердження · готово · перервано) та <b>смугами моделі, облікового запису й лімітів</b>. Після встановлення відкрийте Codex знову та перегляньте й довіртеся хукам AgentDeck у <code>/hooks</code>.","codex.disabled":"Codex вимкнув ці хуки — доки ви їх не увімкнете, нічого не надходить: {events}. Відкрийте Codex, виконайте <code>/hooks</code> і довіртеся їм.","root.head":"Профіль робочої теки","root.intro":"Створює профіль, щоб нові вкладки завжди відкривалися в одній теці. Зміни діють після перезапуску Tabby.","root.use.title":"Використовувати профіль робочої теки","root.use.desc":"Увімкніть і вкажіть теку — профіль буде створено й зроблено типовим.","root.name.title":"Назва профілю","root.cwd.title":"Робоча тека","root.cwd.desc":"Залиште порожнім — профіль не створюється. Вписуючи вручну, використовуйте прямі скісні риски (наприклад D:/Project), щоб не потрапити в пастки екранування зворотних скісних.","root.browse":"Огляд","root.command.title":"Команда","diag.head":"Повідомити про проблему","diag.intro":"Збирає діагностичні журнали <b>в один zip</b> і відкриває теку, де він з’явився. Усередині: версії плагіна й Tabby, ОС, налаштування вище та два останні покоління <code>{path}</code>. У журналах є <b>заголовки вкладок і шляхи, які ви відкривали</b> — перед надсиланням архів можна відкрити й перевірити.","diag.screen.title":"Додати й сирий екран","diag.screen.desc":"Вмикайте для проблем із відмальовуванням. Екран термінала потрапляє дослівно — у ньому видно вашу роботу й код, — тому типово вимкнено.","diag.collect.title":"Зібрати журнали","diag.collect.desc":"Плагін v{version}.","diag.made":"Створено: ","diag.btn":"Зібрати","dev.head":"Параметри розробника","dev.use.title":"Увімкнути параметри розробника","dev.use.desc":"Вмикає <b>гаряче перезавантаження</b>: щойно <code>npm run build</code> перезапише <code>dist/index.js</code>, вікно перезавантажиться на новий плагін <b>зі збереженням сеансів</b> (вкладки знову приєднаються до того самого pty). Комбінація <b>[dev] Перезавантажити плагін</b> теж підпорядковується цьому перемикачу. Коли вимкнено, зміна dist нічого не робить. Видно лише при встановленні з вихідних кодів; у збірці з npm цього немає.","dev.now.title":"Перезавантажити зараз","dev.now.desc":"Перезавантажує поточний dist без збирання.","dev.btn":"Перезавантажити",footer:"Решта — пропорції вікна, ширина бічної панелі, непрозорість, визначення стану, обробка вводу — зафіксована на типових значеннях. Якщо треба щось змінити, правте <code>agentDeck.*</code> просто у файлі конфігурації. Гарячі клавіші — на вкладці <b>Гарячі клавіші</b> під іменами <code>agentdeck-*</code>.","keys.head":"Гарячі клавіші","keys.intro":"Клавіші з головної сторінки. Натисніть <b>Змінити</b>, потім нову клавішу. Якщо вона вже зайнята — самим Tabby чи AgentDeck — вам повідомлять, <b>з чим вона конфліктує</b>, і можна обрати іншу або забрати цю. Діє одразу.","keys.change":"Змінити","keys.default":"Типово","keys.cancel":"Скасувати","keys.force":"Усе одно використати","keys.press":"Натисніть нову клавішу… (Esc — скасувати)","keys.conflict":"Конфліктує з {names}. Якщо використати все одно, клавішу буде знято звідти.","keys.unbound":"не призначено","keys.stock":"вбудована в Tabby","keys.digit":"Тут сполучення має закінчуватися цифрою 1–9 — цифра і є номером сесії. Натисніть, наприклад, Alt+1, і 2…9 підлаштуються.","keys.fixed":"<code>Ctrl+V</code>, <code>Ctrl+W</code>, правий клік і <code>Ctrl+F</code> / <code>Ctrl+S</code> у панелі — не гарячі клавіші, тут вони не змінюються.","keys.item.newtab":"Нова вкладка в робочому корені","keys.item.jump":"Перейти до N-ї сесії","keys.item.focus":"Фокус на список сесій / назад у термінал","keys.item.view":"Відкрити / закрити панель перегляду","keys.item.repair":"Полагодити екран","keys.item.splitright":"Розділити по горизонталі (нова панель праворуч)","keys.item.splitbottom":"Розділити по вертикалі (нова панель знизу)","keys.item.closepane":"Закрити активну розділену панель","keys.item.newline":"Новий рядок без надсилання","keys.item.toggle":"Бічна панель / 4:3 увімк-вимк","keys.item.viewmode":"Панель: Файли ↔ Зміни"}},6981(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"其他工作根目录配置","root.choose.desc":"保存多个工作文件夹,并在打开新标签页时选择配置。","root.add":"添加配置","root.remove":"删除配置","layout.title":"使用 AgentDeck 布局","layout.desc":"关闭后侧边栏和固定宽度布局会消失,回到 Tabby 原版界面。","reset.title":"重置界面布局","reset.desc":"把用鼠标改过的侧边栏位置和大小还原到初始状态 —— 停靠在右侧,宽度按窗口比例自动计算。","reset.now":"当前:停靠在{dock},{size}。","reset.default":"当前就是默认状态。","reset.btn":"重置","dock.left":"左侧","dock.right":"右侧","dock.top":"顶部","dock.bottom":"底部","size.width":"宽 {px}px","size.height":"高 {px}px","size.auto":"宽度自动","norecover.title":"启动时不恢复标签页","norecover.desc":"开启后 Tabby 重新打开时不会恢复上次的标签页,而是从空白开始 —— 能恢复的只有 shell,里面的 Claude 会话早就结束了。 关闭则回到 Tabby 原版行为(<code>recoverTabs</code>)。下次启动生效。","resume.title":"继续过去的会话","resume.desc":"在每个分组末尾放一个 <code>⟲ 过去的会话</code> 抽屉(默认折叠)。 展开后会按你当时实际输入的提示词列出<b>已关闭的 Claude Code 与 Codex 会话</b>; 点击其中一条,就会在那个会话的工作目录里用 <code>claude --resume</code> 或 <code>codex resume</code> 把对话接回来。它与上面的<b>不恢复标签页</b>是一对 —— 原版恢复只找回 shell,这个找回对话。 <b>但当时开着的服务器和后台进程不会回来。</b>","agents.head":"代理集成","agents.intro":"让每个代理<b>自己上报</b>状态、所用模型和用量上限。 这是侧边栏最准确的信息来源 —— 不接入就只能靠屏幕上画出来的文字去猜,判断自然会飘。","agents.unsupported.title":"此平台不支持","agents.unsupported.desc":"通知脚本是 PowerShell,只能在 Windows 上运行。状态改为从输出内容推测。","state.on":"已连接","state.off":"未连接","state.half":"连接不完整","btn.install":"安装","btn.remove":"移除","claude.title":"Claude 集成","claude.desc":"Claude Code 会话会显示在侧边栏,带<b>状态</b>(进行中 · 等待批准 · 已完成)和<b>模型、账号、用量条</b>。 会一并写入 <code>~/.claude/settings.json</code> 里的钩子和 <code>statusLine</code>,移除时也一并移除。 其他钩子不会被动到,你原有的 <code>statusLine</code> 会<b>原样执行</b>,所以显示不会变。 写入前会在同一目录留一份备份。","codex.title":"Codex 集成","codex.desc":"Codex 会话会显示在侧边栏,带<b>状态</b>(进行中 · 等待批准 · 已完成 · 已中断)和<b>模型、账号、用量条</b>。 安装后请重新打开 Codex,在 <code>/hooks</code> 中查看并信任 AgentDeck 的钩子。","codex.disabled":"Codex 关闭了这些钩子 —— 不打开就什么都收不到:{events}。 请在 Codex 中执行 <code>/hooks</code> 并信任它们。","root.head":"工作目录配置","root.intro":"创建一个专用配置,让新标签页总是在同一个工作目录打开。修改在重启 Tabby 后生效。","root.use.title":"使用工作目录配置","root.use.desc":"开启并填好目录后,会创建该配置并设为默认。","root.name.title":"配置名称","root.cwd.title":"工作目录","root.cwd.desc":"留空则不创建配置。手动输入时请用正斜杠(例如 D:/Project),以避开反斜杠转义的坑。","root.browse":"浏览","root.command.title":"启动命令","diag.head":"报告问题","diag.intro":"把诊断日志<b>打包成一个 zip</b>,并打开它所在的文件夹。 里面包含:插件/Tabby 版本与操作系统、上面的设置值,以及 <code>{path}</code> 最近的两代日志。 日志里有<b>标签页标题和你打开过的文件路径</b> —— 发送前可以先打开确认。","diag.screen.title":"连屏幕原文一起打包","diag.screen.desc":"如果是画面错乱的问题就开启。出问题那一刻的终端画面会原样写入(工作内容和代码都能看到),所以默认是关闭的。","diag.collect.title":"收集诊断日志","diag.collect.desc":"插件 v{version}。","diag.made":"已创建:","diag.btn":"收集","dev.head":"开发者选项","dev.use.title":"启用开发者选项","dev.use.desc":"开启后<b>实时重载</b>生效 —— 当 <code>npm run build</code> 改写了 <code>dist/index.js</code>,窗口会<b>在保留会话的情况下</b>重载到新插件(标签页重新接回同一个 pty)。快捷键页的 <b>[dev] 重载插件</b> 也跟随这个开关。 关闭后即使 dist 变了也不会有任何动作。 仅源码安装可见,npm 发布版没有这个功能。","dev.now.title":"立即重载","dev.now.desc":"不重新构建,直接用当前的 dist 重新加载。","dev.btn":"重载",footer:"其余项 —— 窗口比例、侧边栏宽度、不透明度、状态检测、输入处理 —— 都固定为默认值。 确实需要改时请直接编辑配置文件里的 <code>agentDeck.*</code>。 快捷键在<b>快捷键</b>页的 <code>agentdeck-*</code> 项中修改。","keys.head":"快捷键","keys.intro":"首页列出的那些键。点<b>更改</b>,再按新键。若这个键已被占用——无论是 Tabby 自身还是 AgentDeck——会告诉你<b>与什么冲突</b>,可以重选或直接接管。立即生效。","keys.change":"更改","keys.default":"默认值","keys.cancel":"取消","keys.force":"仍然使用","keys.press":"请按新键… (Esc 取消)","keys.conflict":"与 {names} 冲突。仍然使用的话,会从那里移除这个键。","keys.unbound":"未绑定","keys.stock":"Tabby 自带","keys.digit":"这一项必须以数字 1–9 结尾——数字就是会话序号。例如按 Alt+1,2…9 会随之设置。","keys.fixed":"<code>Ctrl+V</code>、<code>Ctrl+W</code>、右键,以及面板内的 <code>Ctrl+F</code> / <code>Ctrl+S</code> 不是热键,这里不改。","keys.item.newtab":"在工作根目录新建标签","keys.item.jump":"跳到第 N 个会话","keys.item.focus":"聚焦会话列表 / 回到终端","keys.item.view":"打开 / 关闭预览面板","keys.item.repair":"修复屏幕","keys.item.splitright":"左右分割(新窗格在右)","keys.item.splitbottom":"上下分割(新窗格在下)","keys.item.closepane":"关闭当前分割窗格","keys.item.newline":"换行而不发送","keys.item.toggle":"侧栏 / 4:3 开关","keys.item.viewmode":"面板:文件 ↔ 更改"}},2653(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"root.more":"其他工作根目錄設定檔","root.choose.desc":"儲存多個工作資料夾,並在開啟新分頁時選擇設定檔。","root.add":"新增設定檔","root.remove":"刪除設定檔","layout.title":"使用 AgentDeck 版面","layout.desc":"關閉後側邊欄與固定寬度版面會消失,回到 Tabby 原生畫面。","reset.title":"重設介面版面","reset.desc":"把用滑鼠改過的側邊欄位置與大小還原成初始狀態 —— 靠右停駐,寬度依視窗比例自動計算。","reset.now":"目前:停駐在{dock},{size}。","reset.default":"目前就是預設狀態。","reset.btn":"重設","dock.left":"左側","dock.right":"右側","dock.top":"頂端","dock.bottom":"底部","size.width":"寬 {px}px","size.height":"高 {px}px","size.auto":"寬度自動","norecover.title":"啟動時不還原分頁","norecover.desc":"開啟後 Tabby 重新開啟時不會還原上次的分頁,而是從空白開始 —— 能還原的只有 shell,裡面的 Claude 工作階段早就結束了。 關閉則回到 Tabby 原生行為(<code>recoverTabs</code>)。下次啟動生效。","resume.title":"接續過去的工作階段","resume.desc":"在每個群組末端放一個 <code>⟲ 過去的工作階段</code> 抽屜(預設收合)。 展開後會依你當時實際輸入的提示詞列出<b>已關閉的 Claude Code 與 Codex 工作階段</b>; 點其中一筆,就會在該工作階段的工作資料夾裡用 <code>claude --resume</code> 或 <code>codex resume</code> 把對話接回來。它與上面的<b>不還原分頁</b>是一對 —— 原生還原只找回 shell,這個找回對話。 <b>但當時開著的伺服器與背景程序不會回來。</b>","agents.head":"代理整合","agents.intro":"讓每個代理<b>自己回報</b>狀態、使用中的模型與用量上限。 這是側邊欄最準確的來源 —— 不接上就只能從畫面上的文字去猜,判斷自然會飄。","agents.unsupported.title":"此平台不支援","agents.unsupported.desc":"通知指令碼是 PowerShell,只能在 Windows 上執行。狀態改為從輸出內容推測。","state.on":"已連接","state.off":"未連接","state.half":"連接不完整","btn.install":"安裝","btn.remove":"移除","claude.title":"Claude 整合","claude.desc":"Claude Code 工作階段會顯示在側邊欄,附<b>狀態</b>(進行中 · 等待核准 · 已完成)與<b>模型、帳號、用量長條</b>。 會一併寫入 <code>~/.claude/settings.json</code> 裡的掛鉤與 <code>statusLine</code>,移除時也一併移除。 其他掛鉤不會被動到,你原有的 <code>statusLine</code> 會<b>照原樣執行</b>,所以顯示不會變。 寫入前會在同一資料夾留一份備份。","codex.title":"Codex 整合","codex.desc":"Codex 工作階段會顯示在側邊欄,附<b>狀態</b>(進行中 · 等待核准 · 已完成 · 已中斷)與<b>模型、帳號、用量長條</b>。 安裝後請重新開啟 Codex,在 <code>/hooks</code> 中檢視並信任 AgentDeck 的掛鉤。","codex.disabled":"Codex 關閉了這些掛鉤 —— 不開啟就什麼都收不到:{events}。 請在 Codex 中執行 <code>/hooks</code> 並信任它們。","root.head":"工作資料夾設定檔","root.intro":"建立專用設定檔,讓新分頁總是在同一個工作資料夾開啟。變更會在重新啟動 Tabby 後生效。","root.use.title":"使用工作資料夾設定檔","root.use.desc":"開啟並填好資料夾後,就會建立該設定檔並設為預設。","root.name.title":"設定檔名稱","root.cwd.title":"工作資料夾","root.cwd.desc":"留空則不建立設定檔。手動輸入時請用斜線(例如 D:/Project),以避開反斜線跳脫的陷阱。","root.browse":"瀏覽","root.command.title":"執行指令","diag.head":"回報問題","diag.intro":"把診斷記錄<b>打包成一個 zip</b>,並開啟它所在的資料夾。 內容包含:外掛/Tabby 版本與作業系統、上面的設定值,以及 <code>{path}</code> 最近的兩代記錄。 記錄裡有<b>分頁標題與你開啟過的檔案路徑</b> —— 傳送前可以先打開確認。","diag.screen.title":"連畫面原文一起打包","diag.screen.desc":"若是畫面錯亂的問題就開啟。出問題當下的終端機畫面會原樣寫入(工作內容與程式碼都看得到),所以預設是關閉的。","diag.collect.title":"收集診斷記錄","diag.collect.desc":"外掛 v{version}。","diag.made":"已建立:","diag.btn":"收集","dev.head":"開發者選項","dev.use.title":"啟用開發者選項","dev.use.desc":"開啟後<b>即時重新載入</b>生效 —— 當 <code>npm run build</code> 改寫了 <code>dist/index.js</code>,視窗會<b>在保留工作階段的情況下</b>重新載入新的外掛(分頁會重新接回同一個 pty)。快速鍵頁的 <b>[dev] 重新載入外掛</b> 也跟隨這個開關。 關閉後即使 dist 變了也不會有任何動作。 僅原始碼安裝可見,npm 發行版沒有這個功能。","dev.now.title":"立即重新載入","dev.now.desc":"不重新建置,直接用目前的 dist 重新載入。","dev.btn":"重新載入",footer:"其餘項目 —— 視窗比例、側邊欄寬度、不透明度、狀態偵測、輸入處理 —— 都固定為預設值。 確實需要更動時請直接編輯設定檔裡的 <code>agentDeck.*</code>。 快速鍵請在<b>快速鍵</b>頁的 <code>agentdeck-*</code> 項目中修改。","keys.head":"快速鍵","keys.intro":"首頁列出的那些鍵。按<b>變更</b>,再按新鍵。若該鍵已被使用——不論是 Tabby 本身或 AgentDeck——會告訴你<b>與什麼衝突</b>,可以重選或直接接手。立即生效。","keys.change":"變更","keys.default":"預設值","keys.cancel":"取消","keys.force":"仍然使用","keys.press":"請按新鍵… (Esc 取消)","keys.conflict":"與 {names} 衝突。仍然使用的話,會從那裡移除這個鍵。","keys.unbound":"未綁定","keys.stock":"Tabby 內建","keys.digit":"這一項必須以數字 1–9 結尾——數字就是工作階段編號。例如按 Alt+1,2…9 會跟著設定。","keys.fixed":"<code>Ctrl+V</code>、<code>Ctrl+W</code>、右鍵,以及面板內的 <code>Ctrl+F</code> / <code>Ctrl+S</code> 不是快速鍵,這裡不改。","keys.item.newtab":"在工作根目錄開新分頁","keys.item.jump":"跳到第 N 個工作階段","keys.item.focus":"聚焦工作階段清單 / 回到終端機","keys.item.view":"開啟 / 關閉預覽面板","keys.item.repair":"修復畫面","keys.item.splitright":"左右分割(新窗格在右)","keys.item.splitbottom":"上下分割(新窗格在下)","keys.item.closepane":"關閉目前的分割窗格","keys.item.newline":"換行而不送出","keys.item.toggle":"側欄 / 4:3 開關","keys.item.viewmode":"面板:檔案 ↔ 變更"}},1481(e,t){t.flushComposition=t.planSend=t.readCompositionState=void 0,t.readCompositionState=function(e){if(!e||"object"!=typeof e)return"unknown";try{if(!0===e.isComposing)return"composing";if(!0===e._isSendingComposition)return"pending";if("boolean"==typeof e.isComposing||"boolean"==typeof e._isSendingComposition)return"idle"}catch{return"unknown"}return"unknown"},t.planSend=function(e){return"composing"===e?"after-composition":"pending"===e?"defer":"now"},t.flushComposition=function(e,t){if(!e||"function"!=typeof e.keydown)return!1;try{const i=e._compositionPosition;return i&&"number"==typeof i.start&&"number"==typeof i.end&&i.end<=i.start&&"number"==typeof t&&isFinite(t)&&t>i.start&&(i.end=t),e.keydown({keyCode:0}),!0}catch{return!1}}},8156(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)},d=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0});const l=i(860),c=i(4358),u=i(7182),p=s(i(7650)),h=i(7025),g=i(3630),f=i(3700),m=i(8349),v=i(7028),b=i(9771),k=i(7009),y=i(4494),w=i(3496),x=i(7110),S=i(4883),C=i(9980),j=i(9610),A=i(8450),E=i(5174),P=i(1451),z=i(7418);i(3396),r(i(4300),t);let D=class{constructor(e,t,i,n,o,a,s,r,d,l){l.ready$.subscribe(()=>{(0,h.configureStoragePaths)(d.store.agentDeck),(0,g.migrateRuntimeData)(),i.configureStorageRoots()}),e.init(),t.init(),i.init(),n.init(),o.init(),s.init(),a.init(),r.init()}};D=a([(0,l.NgModule)({imports:[c.CommonModule,u.FormsModule,p.default],providers:[{provide:p.ConfigProvider,useClass:v.AgentDeckConfigProvider,multi:!0},{provide:p.HotkeyProvider,useClass:b.AgentDeckHotkeyProvider,multi:!0},{provide:m.TerminalDecorator,useClass:k.AgentDeckDecorator,multi:!0},{provide:f.SettingsTabProvider,useClass:P.AgentDeckSettingsTabProvider,multi:!0}],declarations:[z.AgentDeckSettingsTabComponent]}),d("design:paramtypes",[y.AgentDeckService,w.AgentDeckProfileService,x.WorkNotifyService,S.AgentDeckAlertService,C.AgentDeckRecoveryService,j.AgentDeckUpdateService,A.AgentDeckReloadService,E.AgentDeckDevReloadService,p.ConfigService,p.AppService])],D),t.default=D},9900(e,t,i){t.isDefaultBinding=t.resetBinding=t.applyBinding=t.planBinding=t.displayStrokes=t.KEY_ITEMS=t.RD=t.keystrokeFromEvent=t.iD=t.Gt=void 0;const n=i(9137);t.Gt={darwin:"⌘",win32:"Win",linux:"Super"},t.iD={darwin:"⌥",win32:"Alt",linux:"Alt"};const o={Comma:",",Period:".",Slash:"/",Backslash:"\\",IntlBackslash:"`",Minus:"-",Equal:"=",Semicolon:";",Quote:"'",BracketLeft:"[",BracketRight:"]"},a=new Set(["Control","Meta","Alt","Shift"]);function s(e){var t;if("`"===e.key||"~"===e.key)return e.key;if(/^[A-Za-z]$/.test(e.key))return e.key.toUpperCase();let i=String(e.code||e.key||"");return i=i.replace("Key","").replace("Arrow","").replace("Digit",""),null!==(t=o[i])&&void 0!==t?t:i}function r(e){var t;const i=String(null!=e?e:"");if(i.endsWith("--")){const e=i.slice(0,-2);return{mods:e?e.split("-"):[],key:"-"}}if("-"===i)return{mods:[],key:"-"};const n=i.split("-"),o=null!==(t=n.pop())&&void 0!==t?t:"";return{mods:n,key:o}}function d(e,i){const{mods:n,key:o}=r(e),a=["Ctrl",t.Gt[i],t.iD[i],"Shift"],s=n.map(e=>e.toLowerCase());return[...a.filter(e=>s.includes(e.toLowerCase())),...n.filter(e=>!a.some(t=>t.toLowerCase()===e.toLowerCase())),o].join("-")}function l(e,t,i){return d(e,i).toLowerCase()===d(t,i).toLowerCase()}function c(e,t){const{mods:i,key:n}=r(d(e,t));return[...i,n].join("+")}function u(e){return"string"==typeof e?[[e]]:Array.isArray(e)?e.map(e=>"string"==typeof e?[e]:Array.isArray(e)?e.map(String):null).filter(e=>!!e&&e.length>0):[]}function p(e,t,i,n){const o=[];for(const a of Object.keys(null!=t?t:{}))i.includes(a)||u(t[a]).some(t=>1===t.length&&l(t[0],e,n))&&o.push(a);return o}function h(){return Array.from({length:n.JUMP_SLOTS},(e,t)=>`agentdeck-jump-${t+1}`)}function g(e){return e.jump?h():[e.id]}function f(e){const{mods:t,key:i}=r(e);return/^[1-9]$/.test(i)?{prefix:t.length?t.join("-")+"-":"",digit:Number(i)}:null}t.keystrokeFromEvent=function(e,i){if(a.has(e.key))return null;const n=[];return e.ctrlKey&&n.push("Ctrl"),e.metaKey&&n.push(t.Gt[i]),e.altKey&&n.push(t.iD[i]),e.shiftKey&&n.push("Shift"),[...n,s(e)].join("-")},t.RD="agentdeck-jump",t.KEY_ITEMS=[{id:"agentdeck-new-tab",label:"keys.item.newtab"},{id:t.RD,label:"keys.item.jump",jump:!0},{id:"agentdeck-focus-list",label:"keys.item.focus"},{id:"agentdeck-view",label:"keys.item.view"},{id:"agentdeck-repair",label:"keys.item.repair"},{id:"split-right",label:"keys.item.splitright",stock:!0},{id:"split-bottom",label:"keys.item.splitbottom",stock:!0},{id:"close-pane",label:"keys.item.closepane",stock:!0},{id:"agentdeck-newline",label:"keys.item.newline"},{id:"agentdeck-toggle",label:"keys.item.toggle"},{id:"agentdeck-view-mode",label:"keys.item.viewmode"}],t.displayStrokes=function(e,t,i){var o;if(t.jump){const t=null===(o=u(null==e?void 0:e["agentdeck-jump-1"]).find(e=>1===e.length))||void 0===o?void 0:o[0],a=t?f(t):null;if(!a)return t?[c(t,i)]:[];const s=a.prefix?c(a.prefix+"1",i).slice(0,-1):"";return[`${s}1 … ${s}${n.JUMP_SLOTS}`]}return u(null==e?void 0:e[t.id]).map(e=>e.map(e=>c(e,i)).join(" , "))},t.planBinding=function(e,t,i,n){const o=c(i,n),a={};if(t.jump){const e=f(i);if(!e)return{item:t,writes:a,conflicts:[],display:o,error:"digit"};h().forEach((t,i)=>{a[t]=d(`${e.prefix}${i+1}`,n)})}else a[t.id]=d(i,n);const s=g(t),r=[];for(const t of Object.values(a))for(const i of p(t,e,s,n))r.includes(i)||r.push(i);return{item:t,writes:a,conflicts:r,display:o}},t.applyBinding=function(e,t,i,n){const o=[];for(const[i,n]of Object.entries(t.writes))e[i]=[n],o.push(i);if(i){const i=Object.values(t.writes);for(const a of t.conflicts){const t=u(e[a]).filter(e=>!(1===e.length&&i.some(t=>l(e[0],t,n))));e[a]=t.map(e=>1===e.length?e[0]:e),o.push(a)}}return o},t.resetBinding=function(e,t,i){for(const n of g(t)){const t=i[n];e[n]=Array.isArray(t)?[...t]:"string"==typeof t?[t]:[]}},t.isDefaultBinding=function(e,t,i,n){return g(t).every(t=>{const o=u(null==e?void 0:e[t]).map(e=>e.map(e=>d(e,n).toLowerCase()).join(" ")),a=u(i[t]).map(e=>e.map(e=>d(e,n).toLowerCase()).join(" "));return o.length===a.length&&o.every((e,t)=>e===a[t])})}},3824(e,t){t.MailboxWake=t.MAILBOX_WAKE_TEXT=void 0,t.MAILBOX_WAKE_TEXT="[agentdeck] 새 메시지 {N}건 도착 receive 로 확인하고 acknowledge 할 것",t.MailboxWake=class{constructor(e,t){this.resolve=e,this.log=t,this.pendingWake=new Map,this.results=new Map}enqueue(e){const t=this.results.get(e.id);if(t)return{...t};if(e.completedAt)return{attempted:!1,delivered:!1,reason:"no-tab"};const i={attempted:!1,delivered:!1,reason:"typing-deferred"};this.results.set(e.id,i);let n=this.pendingWake.get(e.toSessionId);return n||(n={ids:new Set,writing:!1},this.pendingWake.set(e.toSessionId,n)),n.ids.add(e.id),this.flush(e.toSessionId),{...i}}flushAll(){for(const e of this.pendingWake.keys())this.flush(e)}reason(e){return e?e.enabled?e.idle?e.composing||Date.now()-e.lastInput<e.typingGuardMs?"typing-deferred":"sent":"busy-deferred":"disabled":"no-tab"}record(e,t,i){for(const e of t.ids)Object.assign(this.results.get(e),{attempted:"sent"===i,delivered:"sent"===i,reason:i});this.log(`mailbox-wake to=${JSON.stringify(e)} n=${t.ids.size} reason=${i}`)}flush(e){const i=this.pendingWake.get(e);if(!i||i.writing)return;i.timer&&(clearTimeout(i.timer),i.timer=void 0);const n=this.resolve(e),o=this.reason(n);if("sent"!==o)return this.record(e,i,o),"no-tab"===o&&this.pendingWake.delete(e),void("typing-deferred"!==o||n.composing||(i.timer=setTimeout(()=>this.flush(e),Math.max(1,n.typingGuardMs-(Date.now()-n.lastInput)))));i.writing=!0;try{n.send(o=>{const a=this.resolve(e),s=(null==a?void 0:a.identity)!==n.identity?"no-tab":this.reason(a);if("sent"!==s)return i.writing=!1,void("no-tab"===s?(this.record(e,i,s),this.pendingWake.delete(e)):this.flush(e));const r=(a.text||t.MAILBOX_WAKE_TEXT).replace(/\{N\}/g,String(i.ids.size)).replace(/[\x00-\x1f\x7f-\x9f\u2028\u2029]/g," ");try{o(r+"\r"),this.record(e,i,"sent")}catch{this.record(e,i,"no-tab")}this.pendingWake.delete(e)})}catch{i.writing=!1,this.record(e,i,"no-tab"),this.pendingWake.delete(e)}}}},8347(e,t){function i(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function n(e){const t=(null!=e?e:"").trim();return t?/^[A-Za-z]:[\\/]/.test(t)?t:/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(t)&&!/^(?:https?|mailto|file):/i.test(t)?null:t:null}function o(e,t){const o=[];let a=e.replace(/(`+)([\s\S]+?)\1(?!`)/g,(e,t,n)=>(o.push("<code>"+i(String(n).replace(/^ | $/g,""))+"</code>"),"\0"+(o.length-1)+"\0"));return a=i(a),a=a.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,i,o)=>{const a=t.resolveImage?t.resolveImage(String(o)):n(String(o));return a?'<img src="'+a+'" alt="'+i+'">':'<span class="ad-md-noimg">🖼 '+(i||o)+"</span>"}),a=a.replace(/\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,t,i)=>{const o=n(String(i));return o?'<a href="'+o+'" data-ad-link="'+o+'">'+t+"</a>":String(t)}),a=a.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),a=a.replace(/__([^_]+)__/g,"<strong>$1</strong>"),a=a.replace(/(^|[\s(\[])\*([^*\n]+)\*/g,"$1<em>$2</em>"),a=a.replace(/(^|[\s(\[])_([^_\n]+)_/g,"$1<em>$2</em>"),a=a.replace(/~~([^~]+)~~/g,"<del>$1</del>"),a.replace(/\u0000(\d+)\u0000/g,(e,t)=>{var i;return null!==(i=o[Number(t)])&&void 0!==i?i:""})}function a(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/.test(e)}function s(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(e=>e.trim())}t.renderMarkdown=t.escapeHtml=void 0,t.escapeHtml=i,t.renderMarkdown=function(e,t={}){var n;const r=String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n"),d=[],l=[];let c=[],u=null;const p=(e=-1)=>{for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>")},h=()=>{c.length&&(d.push("<p>"+o(c.join("\n"),t).replace(/\n/g,"<br>")+"</p>"),c=[])},g=()=>{h(),p()};for(let e=0;e<r.length;e++){const f=r[e];if(u){if(new RegExp("^\\s*"+u.mark+"\\s*$").test(f)){const e=u.lang?' class="ad-md-lang-'+u.lang.replace(/[^\w-]/g,"")+'"':"";d.push("<pre"+e+"><code>"+i(u.body.join("\n"))+"</code></pre>"),u=null}else u.body.push(f);continue}const m=/^\s*(```+|~~~+)\s*([\w+#.-]*)/.exec(f);if(m){g(),u={mark:m[1].slice(0,3),lang:m[2]||"",body:[]};continue}if(!f.trim()){h();continue}const v=/^(#{1,6})\s+(.*)$/.exec(f);if(v){g();const e=v[1].length;d.push("<h"+e+">"+o(v[2].replace(/\s+#+\s*$/,""),t)+"</h"+e+">");continue}if(/^\s*([-*_])\s*(\1\s*){2,}$/.test(f)){g(),d.push("<hr>");continue}if(f.includes("|")&&e+1<r.length&&a(r[e+1])){g();const i=s(f),n=[];let a=e+2;for(;a<r.length&&r[a].includes("|")&&r[a].trim();a++)n.push(s(r[a]));e=a-1,d.push("<table><thead><tr>"+i.map(e=>"<th>"+o(e,t)+"</th>").join("")+"</tr></thead><tbody>"+n.map(e=>"<tr>"+e.map(e=>"<td>"+o(e,t)+"</td>").join("")+"</tr>").join("")+"</tbody></table>");continue}const b=/^\s*>\s?(.*)$/.exec(f);if(b){g();const i=[b[1]];let n=e+1;for(;n<r.length;n++){const e=/^\s*>\s?(.*)$/.exec(r[n]);if(!e)break;i.push(e[1])}e=n-1,d.push("<blockquote>"+o(i.join("\n"),t).replace(/\n/g,"<br>")+"</blockquote>");continue}const k=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/.exec(f);if(k){h();const e=k[1].replace(/\t/g," ").length,i=/\d/.test(k[2]);for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>");const n=l[l.length-1];!n||n.indent<e?(l.push({ordered:i,indent:e}),d.push(i?"<ol>":"<ul>")):n.ordered!==i&&(d.push(l.pop().ordered?"</ol>":"</ul>"),l.push({ordered:i,indent:e}),d.push(i?"<ol>":"<ul>"));const a=/^\[([ xX])\]\s+(.*)$/.exec(k[3]);if(a){const e="x"===a[1].toLowerCase();d.push('<li class="ad-md-task"><span class="ad-md-check">'+(e?"☑":"☐")+"</span> "+o(a[2],t)+"</li>")}else d.push("<li>"+o(k[3],t)+"</li>");continue}l.length&&/^\s{2,}/.test(f)&&(null===(n=d[d.length-1])||void 0===n?void 0:n.startsWith("<li"))?d[d.length-1]=d[d.length-1].replace(/<\/li>$/,"<br>"+o(f.trim(),t)+"</li>"):(p(),c.push(f))}return u&&d.push("<pre><code>"+i(u.body.join("\n"))+"</code></pre>"),g(),d.join("\n")}},9851(e,t){t.formatMeta=void 0;const i={claude:"Claude",codex:"Codex",gemini:"Gemini"};function n(e){return e>=85?"hot":e>=60?"warn":"ok"}function o(e,t){if(!Number.isFinite(e)||e<=0)return"";const i=1e3*e-t;if(i<=0)return"곧 리셋";const n=Math.round(i/6e4);if(n<60)return`${Math.max(1,n)}분 뒤 리셋`;const o=Math.floor(n/60);if(o<24){const e=n%60;return e?`${o}시간 ${e}분 뒤 리셋`:`${o}시간 뒤 리셋`}return`${Math.floor(o/24)}일 ${o%24}시간 뒤 리셋`}function a(e,t){return o(e,t).replace(/\s*리셋$/,"")}function s(e,t,i,s,r){if(null==i||""===i)return null;const d=Number(i);if(!Number.isFinite(d))return null;const l=Math.max(0,Math.min(100,Math.round(d)));return{key:e,text:`${t} ${l}%`,pct:l,level:n(l),resetText:o(s,r),resetLine:a(s,r)}}t.formatMeta=function(e,t){var n,o;if(!e)return null;const a=String(e.model||e.modelId||"").trim();if(!a)return null;const r=[null!==(n=i[String(e.agent||"").toLowerCase()])&&void 0!==n?n:"",a,String(e.effort||"").trim()].filter(Boolean).join(" · ")+(e.fastMode?" ⚡":""),d=null!==(o=e.limits)&&void 0!==o?o:{},l=String(d.scopedName||"").trim().toLowerCase(),c=[s("ctx","ctx",e.contextPct,0,t),s("5h","5h",d.fiveHourPct,Number(d.fiveHourResetsAt)||0,t),s("7d","7d",d.sevenDayPct,Number(d.sevenDayResetsAt)||0,t),l?s(l,l,d.scopedPct,Number(d.scopedResetsAt)||0,t):null].filter(e=>!!e),u=String(e.account||"").trim(),p=[r,u?`계정: ${u}${e.org?` (${e.org})`:""}`:"",e.version?`버전: ${e.version}`:"",e.cwd?`폴더: ${e.cwd}`:"",...c.map(e=>e.resetText?`${e.text} — ${e.resetText}`:e.text)].filter(Boolean).join("\n");return{title:r,account:u,gauges:c,tooltip:p}}},9137(e,t){t.pickJumpTarget=t.stepNavIndex=t.pickCloseTarget=t.navRowsOf=t.JUMP_SLOTS=void 0,t.JUMP_SLOTS=9,t.navRowsOf=function(e){const t=[];for(const i of e)if(i.head&&t.push({kind:"head",key:i.key}),!i.collapsed)for(const e of i.tabs)t.push({kind:"tab",tab:e});return t},t.pickCloseTarget=function(e){const{inList:t,focus:i,active:n,tabs:o}=e;return t?i&&"tab"===i.kind&&o.includes(i.tab)?i.tab:null:n&&o.includes(n)?n:null},t.stepNavIndex=function(e,t,i,n){if(!Number.isInteger(e)||e<=0)return-1;if(!Number.isInteger(t)||t<0||t>=e)return i<0?e-1:0;if(!Number.isInteger(i)||0===i)return t;const o=t+i;return o>=0&&o<e?o:n?(o%e+e)%e:t},t.pickJumpTarget=function(e,t){if(!Number.isInteger(t)||t<1)return null;let i=0;for(const n of e)if("tab"===n.kind&&++i===t)return n.tab;return null}},7110(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkNotifyService=void 0;const d=i(860),l=i(7650),c=s(i(9896)),u=s(i(9278)),p=s(i(857)),h=s(i(6928)),g=i(3193),f=i(6021),m=i(102),v=i(1786),b=i(5929),k=i(7282),y=i(9888),w=i(9174),x=i(7797),S=i(3090),C=i(7025),j=i(7507);function A(e){const t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t}초`;const i=Math.floor(t/60);if(i<60)return`${i}분`;const n=Math.floor(i/60);return n<24?n+"시간"+(i%60?` ${i%60}분`:""):Math.floor(n/24)+"일"+(n%24?` ${n%24}시간`:"")}let E=class{setMailboxWake(e){this.mailboxWake=e}mailboxTarget(e){var t,i;if(!(null===(t=this.mailbox)||void 0===t?void 0:t.isActive(e)))return null;const n=[...this.mailboxOwners.entries()].filter(([,t])=>t.sessionId===e);if(1!==n.length)return null;const[o,a]=n[0];if(!this.app.tabs.includes(a.tab))return null;const s=this.panesOf(a.tab).filter(e=>{var t,i,n;return(null===(n=null===(i=null===(t=e.profile)||void 0===t?void 0:t.options)||void 0===i?void 0:i.env)||void 0===n?void 0:n[y.TAB_ENV])===o});return 1===s.length&&(null===(i=s[0].session)||void 0===i?void 0:i.open)?{tab:a.tab,pane:s[0]}:null}setNavigationRefresh(e){this.navigationRefresh=e}mailboxConnectionState(e){const t=[...this.mailboxOwners.entries()].filter(([,t])=>t.tab===e);return t.length?t.map(([e,t])=>{let i=!1;try{const n=Number(c.readFileSync(h.join(this.mailboxRoot,"mailbox-connections",e+".client"),"utf8"));n>0&&n===t.clientPid&&(process.kill(n,0),i=!0)}catch{}return`session ${t.sessionId}: mailbox=registered; MCP=${i?"connected":"not connected (CLI transport available)"}`}).join("; "):"mailbox=not registered; MCP=not connected"}publishNavigationContext(e){if(e!==this.navigationContext)try{c.mkdirSync(this.mailboxRoot,{recursive:!0}),c.writeFileSync(h.join(this.mailboxRoot,"navigation-context.txt"),e,"utf8"),this.navigationContext=e}catch(e){(0,x.diagCatch)("navigation context",e)}}sessionIdOf(e){const t=this.sessionIdsOf(e);return 1===t.length?t[0]:null}sessionIdsOf(e){return[...new Set([...this.mailboxOwners.values()].filter(t=>t.tab===e).map(e=>e.sessionId))]}registerMailbox(e,t,i){var n,o;if(!i||!(null!==(n=this.tabIds.get(t))&&void 0!==n?n:[]).includes(i))return;const a=this.mailboxOwners.get(i);let s=0;try{s=Number(c.readFileSync(h.join(this.mailboxRoot,"mailbox-connections",i+".client"),"utf8"))}catch{}if((null==a?void 0:a.sessionId)!==e||a.clientPid!==s)try{null!==(o=this.mailbox)&&void 0!==o||(this.mailbox=new w.SessionMailbox(h.join(this.mailboxRoot,"mailbox.json"),e=>{var t,i;return null!==(i=null===(t=this.mailboxWake)||void 0===t?void 0:t.call(this,e))&&void 0!==i?i:{attempted:!1,delivered:!1,reason:"no-tab"}})),a&&a.sessionId!==e&&this.mailbox.close(a.sessionId);const n=this.mailbox.register(e,t.customTitle||t.title||"",this.cwdOf(t)||""),r=h.join(this.mailboxRoot,"mailbox-connections");c.mkdirSync(r,{recursive:!0});for(const e of[i])/^[a-zA-Z0-9_-]+$/.test(e)&&c.writeFileSync(h.join(r,e+".json"),JSON.stringify({...n,clientPid:s}),{mode:384});this.mailboxOwners.set(i,{sessionId:e,tab:t,clientPid:s})}catch(e){(0,x.diagCatch)("mailbox register",e)}}constructor(e,t,i,n){this.app=e,this.config=t,this.status=i,this.platform=n,this.root=h.join(process.env.LOCALAPPDATA||h.join(p.homedir(),"AppData","Local"),"tabby-agentdeck"),this.dir=h.join(this.root,"status"),this.mailboxRoot=process.env.TABBY_CONFIG_DIRECTORY?h.join(process.env.TABBY_CONFIG_DIRECTORY,"agentdeck-mailbox"):this.root,this.mailbox=null,this.mailboxOwners=new Map,this.navigationContext="",this.navigationRefresh=null,this.mailboxWake=null,this.metaDir=h.join(this.root,"meta"),this.portFile=h.join(this.root,"port"),this.server=null,this.sessionTab=new Map,this.tabSession=new Map,this.applied=new Map,this.timer=null,this.startedAt=0,this.tabPids=new Map,this.pidRefreshing=!1,this.tabIds=new Map,this.hookCwd=new WeakMap,this.hookAgent=new WeakMap,this.rejectedMetaSession=new WeakMap,this.touched=new WeakMap,this.liveAgents=new WeakMap,this.agentHookSeen=new WeakSet,this.watchedSplits=new WeakSet,this.pollCount=0,this.metaBySession=new Map,this.codexScans=new Map,this.codexAuth=null,this.codexHome=process.env.CODEX_HOME||h.join(p.homedir(),".codex"),this.onMetaChange=null,this.lastBindLog=new Map,this.scans=new Map,this.projectsDir=h.join(p.homedir(),".claude","projects"),this.accountHomes=new WeakMap}async promptHooksOnce(){var e;const t=this.config.store.agentDeck;if(t.hookPromptDismissed||!(0,v.hooksSupported)())return;try{if((0,v.hooksInstalled)())return}catch{return}const i=await this.platform.showMessageBox({type:"warning",message:"AgentDeck — Claude Code 상태 통보를 연결할까요?",detail:['연결하면 에이전트가 "지시를 받았다 / 승인을 기다린다 / 끝났다" 를 사이드바에 직접 알려줍니다.',"연결하지 않아도 동작은 하지만, 화면에 그려진 글자를 보고 추측하는 방식이라 상태가 부정확할 수 있습니다.","",`설치 위치: ${(0,v.claudeSettingsPath)()}`,"기존 훅은 건드리지 않고, 쓰기 전에 같은 폴더에 백업을 남깁니다. 설정 창에서 언제든 제거할 수 있습니다."].join("\n"),buttons:["연결한다","나중에","다시 묻지 않기"],defaultId:0,cancelId:1});if(0!==i.response)2===i.response&&(t.hookPromptDismissed=!0,this.config.save());else try{(0,v.installHooks)(),t.notifyChannel||(t.notifyChannel=!0),this.config.save()}catch(t){await this.platform.showMessageBox({type:"error",message:"AgentDeck — 훅을 설치하지 못했습니다.",detail:`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`,buttons:["확인"]})}}configureStorageRoots(){this.root=(0,C.runtimeRoot)(),this.dir=h.join(this.root,"status"),this.metaDir=h.join(this.root,"meta"),this.portFile=h.join(this.root,"port"),this.mailboxRoot=h.join(this.root,"mailbox"),this.codexHome=(0,C.agentHome)("codex"),this.projectsDir=h.join((0,C.agentHome)("claude"),"projects")}init(){var e;const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.runtimePaths=()=>({root:this.root,status:this.dir,meta:this.metaDir,mailbox:this.mailboxRoot}),t.__agentdeck.tabIds=()=>[...this.tabIds].map(([e,t])=>{var i;return{title:null!==(i=e.title)&&void 0!==i?i:"",ids:t}}),t.__agentdeck.hookInfo=()=>this.app.tabs.map((e,t)=>{var i,n,o,a,s,r;return{index:t,title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),sessionId:null!==(n=this.tabSession.get(e))&&void 0!==n?n:null,cwd:null!==(o=this.hookCwd.get(e))&&void 0!==o?o:null,touched:null!==(a=this.touched.get(e))&&void 0!==a?a:[],agentHook:this.agentHookSeen.has(e),agents:[...null!==(r=null===(s=this.liveAgents.get(e))||void 0===s?void 0:s.values())&&void 0!==r?r:[]]}}),t.__agentdeck.meta=()=>({dir:this.metaDir,reports:[...this.metaBySession.values()].map(e=>({sessionId:e.sessionId,model:e.model,effort:e.effort,account:e.account,contextPct:e.contextPct,limits:e.limits,ageMs:Date.now()-e.ts,bound:this.app.tabs.indexOf(this.sessionTab.get(e.sessionId))})),active:this.metaOf(this.app.activeTab)}),t.__agentdeck.subagents=()=>({enabled:this.subagentEnabled,projectsDir:this.projectsDir,tabs:[...this.tabSession].map(([e,t])=>{var i,n,o,a,s,r,d,l,c,u,p;const h=this.scans.get(t),g=null==h?void 0:h.summary;return{index:this.app.tabs.indexOf(e),title:String(null!==(i=e.title)&&void 0!==i?i:"").slice(0,40),tabId:null!==(o=null===(n=this.tabIds.get(e))||void 0===n?void 0:n[0])&&void 0!==o?o:null,sessionId:t,transcript:null!==(a=null==h?void 0:h.path)&&void 0!==a?a:null,lastSize:null!==(s=null==h?void 0:h.lastSize)&&void 0!==s?s:0,lines:null!==(r=null==h?void 0:h.state.lines)&&void 0!==r?r:0,skipped:null!==(d=null==h?void 0:h.state.skipped)&&void 0!==d?d:0,running:null!==(l=null==g?void 0:g.running)&&void 0!==l?l:0,calls:null!==(c=null==g?void 0:g.calls)&&void 0!==c?c:0,done:null!==(u=null==g?void 0:g.done)&&void 0!==u?u:0,items:(null!==(p=null==g?void 0:g.items)&&void 0!==p?p:[]).map(e=>({id:e.id,description:e.description,subagentType:e.subagentType,startedAt:e.startedAt})),tooltip:g?this.subagentTooltip(g):""}})}),this.app.ready$.subscribe(()=>{for(const e of[...this.app.tabs])this.stampRoot(e);setTimeout(()=>{this.promptHooksOnce()},3e3),this.config.store.agentDeck.notifyChannel&&(this.startedAt=Date.now(),this.listen(),this.timer=setInterval(()=>this.poll(),400),this.refreshPids())}),this.app.tabOpened$.subscribe(e=>{this.stampRoot(e),setTimeout(()=>{this.refreshPids()},1500)}),this.app.tabClosed$.subscribe(e=>{var t;for(const[i,n]of this.mailboxOwners)n.tab===e&&(null===(t=this.mailbox)||void 0===t||t.close(n.sessionId),this.mailboxOwners.delete(i));this.tabPids.delete(e),this.tabIds.delete(e);const i=this.tabSession.get(e);i&&(this.tabSession.delete(e),this.sessionTab.delete(i),this.scans.delete(i))})}diag(e){(0,x.diag)(e)}tabName(e){const t=e;return JSON.stringify(String(t.customTitle||t.title||"").slice(0,40))}async refreshPids(){var e;if(!this.pidRefreshing){this.pidRefreshing=!0;try{for(const t of[...this.app.tabs]){const i=[];for(const n of this.panesOf(t)){const t=null===(e=null==n?void 0:n.session)||void 0===e?void 0:e.pty;if(t&&"function"==typeof t.getPID)try{const e=await t.getPID();Number.isInteger(e)&&e>0&&i.push(e)}catch{}}const n=this.tabPids.get(t);n&&n.join(",")===i.join(",")||(this.tabPids.set(t,i),this.diag(`pid-map tab=${this.tabName(t)} pids=[${i.join(",")}]`))}}finally{this.pidRefreshing=!1}}}panesOf(e){const t=e;return"function"==typeof t.getAllTabs?t.getAllTabs():[e]}isLocalProfile(e){return!!e&&"local"===e.type&&!!e.options&&"object"==typeof e.options}stampRoot(e){this.stampPanes(e);const t=e;t._recoveredState&&"object"==typeof t._recoveredState&&this.stampRecoveryState(t._recoveredState,e),t.tabAdded$&&"function"==typeof t.tabAdded$.subscribe&&!this.watchedSplits.has(e)&&(this.watchedSplits.add(e),t.tabAdded$.subscribe(()=>this.stampPanes(e)))}stampPanes(e){for(const t of this.panesOf(e))this.stampPane(t,e);this.refreshTabIds()}stampPane(e,t){var i;if(!e||e.session||!this.isLocalProfile(e.profile)||e.profile.options.restoreFromPTYID)return;const n=null!==(i=e.profile.options.env)&&void 0!==i?i:{},o="string"==typeof n[y.TAB_ENV]?n[y.TAB_ENV]:"";if(o&&!this.idTakenElsewhere(o,e))return;const a=(0,y.newTabId)();e.profile={...e.profile,options:{...e.profile.options,env:{...n,[y.TAB_ENV]:a,...(0,C.runtimeEnvironment)()}}},void 0!==e.sessionOptions&&(e.sessionOptions=e.profile.options),this.diag(`tabid stamp tab=${this.tabName(t)} id=${a}${o?` (was ${o}: duplicate)`:""}`)}stampRecoveryState(e,t){var i;if(Array.isArray(e.children)){for(const i of e.children)i&&"object"==typeof i&&this.stampRecoveryState(i,t);return}const n=e.profile;if(!this.isLocalProfile(n)||n.options.restoreFromPTYID)return;const o=(0,y.newTabId)();e.profile={...n,options:{...n.options,env:{...null!==(i=n.options.env)&&void 0!==i?i:{},[y.TAB_ENV]:o,...(0,C.runtimeEnvironment)()}}},this.diag(`tabid stamp tab=${this.tabName(t)} id=${o} (recovery token)`)}idTakenElsewhere(e,t){var i,n,o;for(const a of this.app.tabs)for(const s of this.panesOf(a))if(s!==t&&(null===(o=null===(n=null===(i=null==s?void 0:s.profile)||void 0===i?void 0:i.options)||void 0===n?void 0:n.env)||void 0===o?void 0:o[y.TAB_ENV])===e)return!0;return!1}refreshTabIds(){var e,t,i;const n=new Map,o=new Set,a=new Map;for(const s of[...this.app.tabs]){const r=[];for(const a of this.panesOf(s)){const d=null===(i=null===(t=null===(e=null==a?void 0:a.profile)||void 0===e?void 0:e.options)||void 0===t?void 0:t.env)||void 0===i?void 0:i[y.TAB_ENV];if("string"!=typeof d||!d||r.includes(d))continue;r.push(d);const l=n.get(d);l&&l!==s?o.add(d):n.set(d,s)}a.set(s,r)}for(const e of[...this.tabIds.keys()])a.has(e)||this.tabIds.delete(e);for(const[e,t]of a){const i=t.filter(e=>!o.has(e)),n=this.tabIds.get(e);if(!n||n.join(",")!==i.join(",")){this.tabIds.set(e,i);const n=t.filter(e=>o.has(e));this.diag(`tabid-map tab=${this.tabName(e)} ids=[${i.join(",")}]`+(n.length?` dup-dropped=[${n.join(",")}]`:""))}}}retireMissingMailboxPanes(){var e,t;for(const[i,n]of this.mailboxOwners)(null!==(e=this.tabIds.get(n.tab))&&void 0!==e?e:[]).includes(i)||(null===(t=this.mailbox)||void 0===t||t.close(n.sessionId),this.mailboxOwners.delete(i))}get debugDir(){return this.dir}get debugPort(){var e;const t=null===(e=this.server)||void 0===e?void 0:e.address();return t&&"object"==typeof t?t.port:0}listen(){const e=u.createServer(e=>{let t="";e.setEncoding("utf8"),e.on("data",i=>{if(t+=i,t.length>262144)return void e.destroy();let n;for(;(n=t.indexOf("\n"))>=0;){const i=t.slice(0,n);t=t.slice(n+1),this.acceptMailbox(i,e)||this.accept(i)}}),e.on("end",()=>this.accept(t)),e.on("error",()=>{})});let t=!1;e.on("error",i=>{if(!t)return t=!0,(0,x.diagCatch)("notify channel listen (고정 포트 실패, 임의 포트로 재시도)",i),void e.listen(0,"127.0.0.1");(0,x.diagCatch)("notify channel listen 최종 실패",i),this.server=null;try{c.unlinkSync(this.portFile)}catch{}}),e.on("listening",()=>{this.server=e;try{c.mkdirSync(this.root,{recursive:!0}),c.writeFileSync(this.portFile,String(this.debugPort),"utf8"),c.mkdirSync(this.mailboxRoot,{recursive:!0}),c.writeFileSync(h.join(this.mailboxRoot,"port"),String(this.debugPort),"utf8")}catch(e){(0,x.diagCatch)("notify port 파일 쓰기",e)}}),e.listen(this.config.store.agentDeck.notifyPort||0,"127.0.0.1")}acceptMailbox(e,t){var i,n;let o;try{o=JSON.parse(e)}catch{return!1}if("agentdeck-navigation"===(null==o?void 0:o.channel)){try{this.retireMissingMailboxPanes(),null===(i=this.navigationRefresh)||void 0===i||i.call(this),t.write(JSON.stringify({result:{capturedAt:(new Date).toISOString(),context:this.navigationContext}})+"\n")}catch{t.write(JSON.stringify({error:"Navigation snapshot unavailable"})+"\n")}return!0}if(!["agentdeck-mailbox","agentdeck-external-mailbox"].includes(null==o?void 0:o.channel))return!1;try{if(this.retireMissingMailboxPanes(),"agentdeck-external-mailbox"===o.channel){null!==(n=this.mailbox)&&void 0!==n||(this.mailbox=new w.SessionMailbox(h.join(this.mailboxRoot,"mailbox.json"),e=>{var t,i;return null!==(i=null===(t=this.mailboxWake)||void 0===t?void 0:t.call(this,e))&&void 0!==i?i:{attempted:!1,delivered:!1,reason:"no-tab"}}));const e=this.mailbox.callExternal(o.sessionId,o.token,o.method,o.arguments);return t.write(JSON.stringify({result:e})+"\n"),!0}if(!this.mailbox)throw new Error("No connected sessions");const e=this.mailbox.call(o.sessionId,o.token,o.method,o.arguments);t.write(JSON.stringify({result:e})+"\n")}catch(e){t.write(JSON.stringify({error:String(e.message)})+"\n")}return!0}accept(e){const t=e.trim();if(t)try{this.apply(JSON.parse(t))}catch(e){(0,x.diagCatch)("notify 보고 파싱",e)}}poll(){let e;this.refreshTabIds(),++this.pollCount%5==0&&this.refreshPids(),this.pollCount%5==2&&this.scanSubagents(),this.pollMeta(),this.pollCount%5==4&&this.scanCodexMeta();try{e=c.readdirSync(this.dir)}catch{return}for(const t of e){if(!t.endsWith(".json"))continue;const e=h.join(this.dir,t);let i;try{i=JSON.parse(c.readFileSync(e,"utf8"))}catch{continue}if(i.ts<this.startedAt&&!this.sessionTab.has(i.sessionId))try{c.unlinkSync(e)}catch{}else this.apply(i)}}apply(e){var t,i,n,o,a,s,r;if(!e||!e.sessionId)return;const d=!!e.status,l="string"==typeof e.label&&!!e.label.trim(),c="string"==typeof e.file&&!!e.file.trim(),u=void 0!==e.agents&&null!==e.agents;if(!(d||l||c||u))return;if(this.applied.get(e.sessionId)===e.ts)return;const p=this.resolveTab(e.sessionId,e.tabId,e.pids);if(!p)return void((null===(t=e.pids)||void 0===t?void 0:t.length)||e.tabId||this.applied.set(e.sessionId,e.ts));this.applied.set(e.sessionId,e.ts),this.registerMailbox(e.sessionId,p,e.tabId);const h=String(null!==(i=e.agent)&&void 0!==i?i:"").trim().toLowerCase();"claude"!==h&&"codex"!==h&&"gemini"!==h||(this.hookAgent.set(p,h),this.rejectedMetaSession.delete(p));const g="string"==typeof e.cwd?e.cwd.trim():"";if(g&&this.hookCwd.set(p,g),u){const t=Array.isArray(e.agents)?e.agents:[e.agents],i=new Map;for(const e of t){const t=String(null!==(n=null==e?void 0:e.id)&&void 0!==n?n:"").trim();if(!t)continue;const a=Number(null==e?void 0:e.at);i.set(t,{id:t,type:String(null!==(o=null==e?void 0:e.type)&&void 0!==o?o:"").trim(),at:Number.isFinite(a)&&a>0?a:Date.now()})}const r=null!==(s=null===(a=this.liveAgents.get(p))||void 0===a?void 0:a.size)&&void 0!==s?s:0;this.liveAgents.set(p,i),this.agentHookSeen.add(p),r!==i.size&&this.diag(`agents sid=${e.sessionId.slice(0,8)} ${r} -> ${i.size} [${[...i.values()].map(e=>e.type||"?").join(",")}]`)}if(c){const t=e.file.trim(),i=null!==(r=this.touched.get(p))&&void 0!==r?r:[],n=[t,...i.filter(e=>e!==t)];this.touched.set(p,n.length>400?n.slice(0,400):n)}const f=(e.label||"").trim();if(d){const t=(0,k.shortenReason)("string"==typeof e.reason?e.reason:"");this.status.setManual(p,e.status,l?f:void 0,t)}else this.status.setLabel(p,f)}resolveTab(e,t,i){const n=this.sessionTab.get(e),o=n&&this.app.tabs.includes(n)?n:null,a=(0,y.pickTabByTabId)(t,this.tabIds);if(a)return a!==o&&this.bind(e,a,o?"tabid-move":"tabid"),a;const s=(0,b.pickTabByPids)(i,this.tabPids);if("pid"===s.mode&&s.tab)return s.tab!==o&&this.bind(e,s.tab,o?"pid-move":"pid"),s.tab;if(o)return o;if(t){const i=[...this.tabIds.entries()].map(([e,t])=>`${this.tabName(e)}:[${t.join(",")}]`).join(" ");return this.bindLog(e,`unbound (tabid-miss) tabId=${t} tabs=${i}`),null}if("pid-miss"===s.mode){const t=[...this.tabPids.entries()].map(([e,t])=>`${this.tabName(e)}:[${t.join(",")}]`).join(" ");return this.bindLog(e,`unbound (pid-miss) pids=[${(null!=i?i:[]).join(",")}] tabs=${t}`),null}const r=this.app.activeTab;if(!r)return null;const d=this.tabSession.get(r);return d&&d!==e?(this.bindLog(e,`unbound (legacy: active tab owned by ${d.slice(0,8)})`),null):(this.bind(e,r,"legacy"),r)}bind(e,t,i){const n=this.tabSession.get(t);n&&n!==e&&(this.sessionTab.delete(n),this.hookAgent.delete(t),this.touched.delete(t),this.liveAgents.delete(t));const o=this.sessionTab.get(e);o&&o!==t&&this.tabSession.get(o)===e&&(this.tabSession.delete(o),this.hookAgent.delete(o)),this.sessionTab.set(e,t),this.tabSession.set(t,e),this.lastBindLog.delete(e),this.diag(`bind sid=${e.slice(0,8)} via=${i} tab=${this.tabName(t)}`+(n&&n!==e?` (took over from ${n.slice(0,8)})`:""))}bindLog(e,t){this.lastBindLog.get(e)!==t&&(this.lastBindLog.set(e,t),this.diag(`bind sid=${e.slice(0,8)} ${t}`))}get subagentEnabled(){return!1!==this.config.store.agentDeck.subagentCount}cwdOf(e){return e&&this.hookCwd.get(e)||null}agentOf(e){var t,i;if(!e)return null;const n=this.hookAgent.get(e);if(n&&"unknown"!==n)return n;const o=this.tabSession.get(e);if(!o||this.rejectedMetaSession.get(e)===o)return null;const a=null===(i=null===(t=this.metaOf(e))||void 0===t?void 0:t.agent)||void 0===i?void 0:i.trim().toLowerCase();return"codex"===a||"claude"===a||"gemini"===a?a:null}forgetAgent(e){if(e){this.hookAgent.delete(e);const t=this.tabSession.get(e);t&&this.rejectedMetaSession.set(e,t)}}touchedOf(e){return e&&this.touched.get(e)||[]}setAccountHome(e,t,i,n){this.accountHomes.set(e,{provider:t,home:i,email:n})}metaOf(e){var t,i,n;const o=e?this.tabSession.get(e):null,a=o&&this.metaBySession.get(o)||null;if(!a||!e)return a;const s=null===(t=this.accountHomes)||void 0===t?void 0:t.get(e),r=null===(n=null===(i=e.profile)||void 0===i?void 0:i.options)||void 0===n?void 0:n.env,d=(null==s?void 0:s.home)||("codex"===a.agent?null==r?void 0:r.CODEX_HOME:null==r?void 0:r.CLAUDE_CONFIG_DIR);return!d||"codex"!==a.agent&&"claude"!==a.agent?a:{...a,configDir:d,account:(0,S.accountEmail)(a.agent,d)||(null==s?void 0:s.email)||""}}pollMeta(){var e,t;let i;try{i=c.readdirSync(this.metaDir)}catch{return}let n=!1;for(const t of i){if(!t.endsWith(".json"))continue;const i=h.join(this.metaDir,t);let o;try{o=JSON.parse(c.readFileSync(i,"utf8"))}catch{continue}if(null==o?void 0:o.sessionId)if(o.ts<this.startedAt&&!this.sessionTab.has(o.sessionId))try{c.unlinkSync(i)}catch{}else(null===(e=this.metaBySession.get(o.sessionId))||void 0===e?void 0:e.ts)!==o.ts&&(this.metaBySession.set(o.sessionId,o),n=!0)}this.pruneMeta(),n&&(null===(t=this.onMetaChange)||void 0===t||t.call(this))}scanCodexMeta(){var e;for(const[t,i]of this.sessionTab){if(!this.app.tabs.includes(i)||"codex"!==this.hookAgent.get(i))continue;let n,o=this.codexScans.get(t);if(o||(o={sessionId:t,state:(0,m.createCodexState)(),decoder:new g.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0},this.codexScans.set(t,o)),o.busy)continue;if(!o.path){this.findCodexRollout(o);continue}try{n=c.statSync(o.path).size}catch{o.path=null,o.lookupAt=0;continue}if(n<o.lastSize&&(o.state=(0,m.createCodexState)(),o.decoder=new g.StringDecoder("utf8"),o.lastSize=0),n>o.lastSize)try{const e=c.openSync(o.path,"r");try{const t=n-o.lastSize,i=Buffer.allocUnsafe(t),a=c.readSync(e,i,0,t,o.lastSize);(0,m.feedCodexChunk)(o.state,o.decoder.write(i.subarray(0,a))),o.lastSize+=a}finally{c.closeSync(e)}}catch(e){(0,x.diagCatch)("codex 기록 읽기",e);continue}const a=this.codexMetaOf(t,o.state),s=this.metaBySession.get(t);s&&s.model===a.model&&s.effort===a.effort&&s.account===a.account&&s.contextPct===a.contextPct&&s.limits.fiveHourPct===a.limits.fiveHourPct&&s.limits.sevenDayPct===a.limits.sevenDayPct||(this.metaBySession.set(t,a),null===(e=this.onMetaChange)||void 0===e||e.call(this))}}codexMetaOf(e,t){return{sessionId:e,ts:Date.now(),agent:"codex",model:t.model,modelId:t.model,effort:t.effort,version:t.cliVersion,fastMode:!1,account:this.codexAccount(),org:"",configDir:this.codexHome,cwd:t.cwd,contextPct:(0,m.codexContextPct)(t),limits:(0,m.codexLimits)(t)}}codexAccount(){var e,t;const i=h.join(this.codexHome,"auth.json");let n=0;try{n=c.statSync(i).mtimeMs}catch{return""}if(this.codexAuth&&this.codexAuth.mtime===n)return this.codexAuth.email;let o="";try{o=(0,m.emailFromIdToken)(null===(t=null===(e=JSON.parse(c.readFileSync(i,"utf8")))||void 0===e?void 0:e.tokens)||void 0===t?void 0:t.id_token)}catch{o=""}return this.codexAuth={mtime:n,email:o},o}async findCodexRollout(e){const t=Date.now();if(t-e.lookupAt<1e4)return;e.lookupAt=t,e.busy=!0;const i=e.sessionId.toLowerCase(),n=async(e,t)=>{let o;try{o=await c.promises.readdir(e,{withFileTypes:!0})}catch{return null}for(const a of[...o].reverse()){const o=h.join(e,a.name);if(a.isDirectory()&&t<3){const e=await n(o,t+1);if(e)return e;continue}if(a.isFile()&&a.name.toLowerCase().endsWith(`-${i}.jsonl`))return o}return null};try{const t=await n(h.join(this.codexHome,"sessions"),0);t&&(e.path=t,this.diag(`codex meta sid=${e.sessionId.slice(0,8)} file=${t}`))}finally{e.busy=!1}}pruneMeta(){const e=Date.now();for(const e of[...this.codexScans.keys()]){const t=this.sessionTab.get(e);t&&this.app.tabs.includes(t)||this.codexScans.delete(e)}for(const[t,i]of[...this.metaBySession]){const n=this.sessionTab.get(t);n?this.app.tabs.includes(n)||(this.metaBySession.delete(t),this.dropMetaFile(t)):e-i.ts>72e5&&(this.metaBySession.delete(t),this.dropMetaFile(t))}}dropMetaFile(e){try{c.unlinkSync(h.join(this.metaDir,e+".json"))}catch{}}subagentsOf(e){var t;if(!e||!this.subagentEnabled)return null;const i=this.tabSession.get(e);if(this.agentHookSeen.has(e)){const n=(0,j.summarizeLiveAgents)(null===(t=this.liveAgents.get(e))||void 0===t?void 0:t.values());if(n.running<=0)return null;const o=(0,j.formatLiveAgentTooltip)(n);return{sessionId:null!=i?i:"",running:n.running,items:[],tooltip:n.oldestAt?`${o}\n가장 오래된 것: ${A(Date.now()-n.oldestAt)} 전 시작`:o}}const n=i?this.scans.get(i):null;return!n||n.summary.running<=0?null:{sessionId:n.sessionId,running:n.summary.running,items:n.summary.items,tooltip:this.subagentTooltip(n.summary)}}subagentTooltip(e){const t=(0,j.formatSubagentTooltip)(e);if(!t)return"";let i=0;for(const t of e.items){const e=t.startedAt?Date.parse(t.startedAt):NaN;Number.isFinite(e)&&(!i||e<i)&&(i=e)}return i?`${t}\n가장 오래된 것: ${A(Date.now()-i)} 전 시작 (종료 알림을 못 받은 것이면 이 값만 계속 늘어난다)`:t}liveSessions(){return new Map(this.sessionTab)}scanSubagents(){if(this.subagentEnabled){this.pruneScans();for(const[e,t]of this.sessionTab){if(!this.app.tabs.includes(t))continue;let i,n=this.scans.get(e);if(n||(n={sessionId:e,state:(0,j.createSubagentState)(),decoder:new g.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0,summary:(0,j.summarizeSubagents)(null)},this.scans.set(e,n)),!n.busy)if(n.path){try{i=c.statSync(n.path).size}catch{(n.lastSize>0||n.summary.running>0)&&this.diag(`subagent gone sid=${e.slice(0,8)} running=${n.summary.running} -> 0`),this.resetScan(n),n.path=null,n.lookupAt=0;continue}i<n.lastSize&&(this.diag(`subagent reset sid=${e.slice(0,8)} size=${i} < last=${n.lastSize}`),this.resetScan(n)),i!==n.lastSize&&this.readGrowth(n,i)}else this.findTranscript(n)}}else this.scans.size&&this.scans.clear()}pruneScans(){for(const e of[...this.scans.keys()]){const t=this.sessionTab.get(e);t&&this.app.tabs.includes(t)||this.scans.delete(e)}}resetScan(e){e.state=(0,j.createSubagentState)(),e.decoder=new g.StringDecoder("utf8"),e.lastSize=0,e.summary=(0,j.summarizeSubagents)(null)}async findTranscript(e){const t=Date.now();if(!(t-e.lookupAt<1e4)){e.lookupAt=t,e.busy=!0;try{const t=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const i of t){if(!i.isDirectory())continue;const t=h.join(this.projectsDir,i.name);let n;try{n=await c.promises.readdir(t)}catch{continue}const o=n.find(t=>(0,j.matchesSessionTranscript)(t,e.sessionId));if(o)return e.path=h.join(t,o),void this.diag(`subagent transcript sid=${e.sessionId.slice(0,8)} file=${e.path}`)}}catch{}finally{e.busy=!1}}}readGrowth(e,t){const i=e.path;if(!i)return;const n=e.lastSize,o=e.sessionId.slice(0,8);let a;e.busy=!0;try{a=c.createReadStream(i,{start:n,end:t-1})}catch(t){return e.busy=!1,void(0,x.diagCatch)(`subagent 스트림 생성 sid=${o}`,t)}let s=!1;const r=i=>{if(s)return;if(s=!0,e.busy=!1,i)return void(0,x.diagCatch)(`subagent 대화기록 읽기 sid=${o}`,i);e.lastSize=t;const a=e.summary.running;e.summary=(0,j.summarizeSubagents)(e.state),0===n?this.diag(`subagent first-scan sid=${o} bytes=${t} lines=${e.state.lines} calls=${e.summary.calls} done=${e.summary.done} running=${e.summary.running}`):e.summary.running!==a&&this.diag(`subagent sid=${o} running=${a} -> ${e.summary.running} (+${t-n}B)`)};a.on("data",t=>(0,j.feedChunk)(e.state,e.decoder.write(t))),a.on("end",()=>r()),a.on("error",e=>r(e))}};E=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.AppService,l.ConfigService,f.WorkStatusService,l.PlatformService])],E),t.WorkNotifyService=E},7144(e,t){t.planEdgeScroll=t.planTabMove=t.countByStatus=t.statusRank=t.QD=void 0,t.QD=["waiting","error","limited","running","done","idle"],t.statusRank=function(e){const i=t.QD.indexOf(e);return i<0?t.QD.length:i},t.countByStatus=function(e,i){var n,o;const a=new Map;for(const t of e){const e=i(t);a.set(e,(null!==(n=a.get(e))&&void 0!==n?n:0)+1)}const s=[];for(const e of t.QD){const t=null!==(o=a.get(e))&&void 0!==o?o:0;t>0&&s.push({status:e,count:t})}return s},t.planTabMove=function(e,t,i,n){if(!Number.isInteger(e)||e<2)return null;if(!Number.isInteger(t)||!Number.isInteger(i))return null;if(t<0||t>=e||i<0||i>=e||t===i)return null;const o=[];for(let t=0;t<e;t++)o.push(t);o.splice(t,1);const a=o.indexOf(i)+("after"===n?1:0);o.splice(a,0,t);for(let t=0;t<e;t++)if(o[t]!==t)return o;return null},t.planEdgeScroll=function(e){const{pos:t,near:i,far:n,cur:o,maxScroll:a,bandPx:s,minPps:r,maxPps:d}=e;if(t<i||t>n)return 0;const l=Math.min(s,(n-i)/3);if(l<4)return 0;let c=0,u=0;if(t<=i+l)c=-1,u=(i+l-t)/l;else{if(!(t>=n-l))return 0;c=1,u=(t-(n-l))/l}return(c<0?o:a-o)<=.5?0:c*(r+(d-r)*Math.min(1,Math.max(0,u)))}},6570(e,t,i){t.monitorEventLoop=t.PerformanceTrace=t.perfNow=void 0;const n=i(7797);let o=0;t.perfNow=()=>performance.now(),t.PerformanceTrace=class{constructor(e){this.operation=e,this.id=`${Date.now().toString(36)}-${++o}`,this.started=(0,t.perfNow)(),this.previous=this.started,this.mark("begin")}mark(e,i=""){const o=(0,t.perfNow)();(0,n.diag)(`perf op=${this.operation} id=${this.id} stage=${e} stepMs=${(o-this.previous).toFixed(1)} totalMs=${(o-this.started).toFixed(1)}`+(i?` ${i}`:"")),this.previous=(0,t.perfNow)()}step(e,i){const n=(0,t.perfNow)();try{return i()}finally{this.mark(e,`workMs=${((0,t.perfNow)()-n).toFixed(1)}`)}}};let a=!1;t.monitorEventLoop=function(){if(a)return;a=!0;let e=(0,t.perfNow)(),i=-1/0;const o=setInterval(()=>{const o=(0,t.perfNow)(),a=o-e-250;e=o,a>=250&&o-i>=5e3&&(i=o,(0,n.diag)(`perf op=event-loop lagMs=${a.toFixed(1)} visibility=${document.visibilityState}`))},250);window.addEventListener("beforeunload",()=>{clearInterval(o),a=!1},{once:!0})}},3496(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckProfileService=t.ROOT_PROFILE_PREFIX=t.ROOT_PROFILE_ID=void 0;const a=i(860),s=i(7650);t.ROOT_PROFILE_ID="agentdeck:root",t.ROOT_PROFILE_PREFIX="agentdeck:root:";let r=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>{this.ensureProfile(),this.syncAdditionalProfiles()})}applySettings(){const e=this.config.store.agentDeck,i=(this.config.store.profiles||[]).find(e=>e.id===t.ROOT_PROFILE_ID);i&&e.rootProfile&&e.rootProfileCwd&&(i.name=e.rootProfileName||"Agent Root",i.options={...i.options,cwd:e.rootProfileCwd,command:e.rootProfileCommand||"powershell.exe"}),this.ensureProfile(),this.syncAdditionalProfiles(),this.config.save()}syncAdditionalProfiles(){var e,i;const n=this.config.store.agentDeck,o=(Array.isArray(n.rootProfiles)?n.rootProfiles:[]).filter(e=>e&&"string"==typeof e.id&&e.id.startsWith(t.ROOT_PROFILE_PREFIX)&&"string"==typeof e.cwd&&e.cwd.trim()),a=this.config.store.profiles||[],s=JSON.stringify(a),r=new Set(o.map(e=>e.id)),d=a.filter(e=>{var i;return!(null===(i=e.id)||void 0===i?void 0:i.startsWith(t.ROOT_PROFILE_PREFIX))||r.has(e.id)});for(const e of o){let t=d.find(t=>t.id===e.id);t||(t={id:e.id,type:"local",options:{args:[...n.rootProfileArgs||[]],env:{...n.rootProfileEnv||{}}}},d.push(t)),t.name=String(e.name||"").trim()||e.cwd.trim(),t.options={...t.options,cwd:e.cwd.trim(),command:String(e.command||"").trim()||"powershell.exe"}}if(JSON.stringify(d)!==s){this.config.store.profiles=d;const n=this.config.store.terminal.profile;(null==n?void 0:n.startsWith(t.ROOT_PROFILE_PREFIX))&&!r.has(n)&&(this.config.store.terminal.profile=(null===(e=d.find(e=>e.id===t.ROOT_PROFILE_ID))||void 0===e?void 0:e.id)||(null===(i=d[0])||void 0===i?void 0:i.id)||null),this.config.save()}}ensureProfile(){const e=this.config.store.agentDeck;if(!e.rootProfile||!e.rootProfileCwd)return;const i=this.config.store.profiles||[],n=i.find(e=>e.id===t.ROOT_PROFILE_ID),o={id:t.ROOT_PROFILE_ID,type:"local",name:e.rootProfileName||"Agent Root",options:{command:e.rootProfileCommand||"powershell.exe",args:[...e.rootProfileArgs||[]],cwd:e.rootProfileCwd,env:{...e.rootProfileEnv||{}}}};if(n)if(n.options){let e=!1;n.options.cwd||(n.options.cwd=o.options.cwd,e=!0),n.options.args&&0!==n.options.args.length||(n.options.args=[...o.options.args],e=!0),n.options.env=n.options.env||{};for(const[t,i]of Object.entries(o.options.env))void 0===n.options.env[t]&&(n.options.env[t]=i,e=!0);e&&this.config.save()}else n.options=o.options,this.config.save();else i.push(o),this.config.store.profiles=i,e.rootProfileClaimed||(this.config.store.terminal.profile=t.ROOT_PROFILE_ID,e.rootProfileClaimed=!0),this.config.save()}};r=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService])],r),t.AgentDeckProfileService=r},4086(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.projectRootCacheSnapshot=t.clearProjectRootCache=t.projectRootOf=t.findProjectRoot=t.walkUp=t.homeBoundary=t.PROJECT_MARKERS=void 0;const s=a(i(9896)),r=a(i(857)),d=i(6879);function l(){try{return(0,d.normalizeCwd)(r.homedir())}catch{return null}}function c(e,t){let i=(0,d.normalizeCwd)(e);const n=(0,d.normalizeCwd)(t),o=[];for(let e=0;i&&e<64&&(!n||(0,d.foldGroupKey)(i)!==(0,d.foldGroupKey)(n));e++){o.push(i);const e=(0,d.parentPath)(i);if(!e||(0,d.foldGroupKey)(e)===(0,d.foldGroupKey)(i))break;i=e}return o}t.PROJECT_MARKERS=[".git",".hg",".svn",".p4config"],t.homeBoundary=l,t.walkUp=c,t.findProjectRoot=function(e,t,i){for(const n of c(e,i))if(t(n))return n;return null};const u=new Map,p=new Set;async function h(e){for(const i of t.PROJECT_MARKERS)try{return await s.promises.access(e+"/"+i),!0}catch{}return!1}t.projectRootOf=function(e,t){const i=(0,d.normalizeCwd)(e);if(!i)return null;const n=(0,d.foldGroupKey)(i),o=u.get(n);return void 0!==o?o:(p.has(n)||(p.add(n),async function(e){for(const t of c(e,l()))if(await h(t))return t;return null}(i).then(e=>{u.set(n,e),p.delete(n),e&&(null==t||t())}).catch(()=>{u.set(n,null),p.delete(n)})),null)},t.clearProjectRootCache=function(){u.clear(),p.clear()},t.projectRootCacheSnapshot=function(){return[...u.entries()].map(([e,t])=>({cwd:e,root:t}))}},9660(e,t){function i(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function n(e){return e.join("").replace(/[\\\]^-]/g,"\\$&")}function o(e){return[...e].sort((e,t)=>t.length-e.length).map(i).join("|")}function a(e,t){if(!Array.isArray(e))return t;const i=e.filter(e=>"string"==typeof e&&e.length>0);return i.length?i:t}t.extractPrompt=t.yY=t.D0=void 0,t.D0={heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"],ruleChars:["─","━","═","-"]},t.yY=40;const s=new Map;function r(e,t){return e.replace(t.stripLead,"").replace(t.stripTail,"").trim()}t.extractPrompt=function(e,i){const d=function(e){const i=a(e?e.heads:void 0,t.D0.heads),r=a(e?e.choiceWords:void 0,t.D0.choiceWords),d=a(e?e.ruleChars:void 0,t.D0.ruleChars),l=JSON.stringify([i,r,d]),c=s.get(l);if(c)return c;const u=o(i),p=n(d),h=new Set(i.join("")),g=n([..."│┃|╭╰┌└─╮╯┐┘"].filter(e=>!h.has(e))),f=n([..."│┃|╮╯┐┘─"].filter(e=>!h.has(e))),m=n([..."│┃|"].filter(e=>!h.has(e))),v={head:new RegExp(`^(?:${u})\\s*`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${o(r)})(?!\\w))`,"i"),bottom:new RegExp(`^[\\s${m}]*[${p}]{3,}[\\s${m}]*$|[╰└]`),stripLead:new RegExp(`^[\\s${g}]+`),stripTail:new RegExp(`[\\s${f}]+$`)};return s.set(l,v),v}(i);let l=-1;for(let t=e.length-1;t>=0;t--){const i=r(e[t],d);if(d.head.test(i)){if(d.choice.test(i))return"";l=t;break}}if(l<0)return"";const c=[r(e[l],d).replace(d.head,"")];for(let t=l+1;t<e.length&&!d.bottom.test(e[t]);t++){const i=r(e[t],d);i&&c.push(i)}const u=c.join(" ").replace(/\s+/g," ").trim();return u.length<2?"":u.length>t.yY?u.slice(0,t.yY).trimEnd()+"...":u}},7282(e,t){function i(e){const t=(e||"").replace(/\s+/g," ").trim();if(!t)return"";if(/^[^\w가-힣]*\d+\.\s/.test(t))return"";const i=/permission to use ([\w-]+)/i.exec(t);if(i)return i[1]+" 권한";const n=/Allow execution of\s*\[?([\w.:-]+)/i.exec(t);if(n)return n[1]+" 권한";if(/waiting for your input/i.test(t))return"입력 대기";if(/\b(?:hit|reached|exceeded)\b.*\blimit\b|usage limit|limit reached|limit will reset/i.test(t)){const e=/\breset(?:s)?\s+(?:at\s+)?(.+?)\s*(?:\(|\.\s*$|$)/i.exec(t);return e?e[1].trim()+" 리셋":""}return/plan/i.test(t)?"플랜 승인":/question|answer/i.test(t)?"질문 응답":t.slice(0,24).trimEnd()}t.reasonFromScreen=t.shortenReason=void 0,t.shortenReason=i,t.reasonFromScreen=function(e){return i((e||"").replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\u001b[\]P][^\u0007\u001b]*(?:\u0007|\u001b\\)?/g,"").replace(/\u001b/g," ").replace(/[\u2500-\u259f]/g," ").replace(/\s+/g," ").trim())}},9980(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckRecoveryService=void 0;const a=i(860),s=i(7650);let r=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>this.enforce()),this.config.changed$.subscribe(()=>this.enforce())}setNoTabRecovery(e){if(this.config.store.agentDeck.noTabRecovery=e,this.config.store.recoverTabs=!e,e)try{delete window.localStorage.tabsRecovery}catch{}this.config.save()}enforce(){var e;(null===(e=this.config.store.agentDeck)||void 0===e?void 0:e.noTabRecovery)&&!1!==this.config.store.recoverTabs&&(this.config.store.recoverTabs=!1,this.config.save())}};r=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.ConfigService])],r),t.AgentDeckRecoveryService=r},8450(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckReloadService=void 0;const a=i(860),s=i(7650),r=i(7797),d=i(4494),l=i(6570),c="agentdeck.reloadStash",u="agentdeck.devReload",p=[300,1500,3e3];let h=class{constructor(e,t,i){this.app=e,this.notifications=t,this.deck=i,this.reloading=!1}init(){this.app.ready$.subscribe(()=>{this.restore().catch(e=>(0,r.diagCatch)("reload 복구",e))})}async reload(e){if(this.reloading)return!1;this.reloading=!0;const t=new l.PerformanceTrace("reload-save"),i=Date.now();try{const n=this.app.tabRecovery,o=[];let a=-1;for(const e of this.app.tabs)try{const i=await n.getFullRecoveryToken(e,{includeState:!0});t.mark("token",`index=${o.length}`),i&&(e===this.app.activeTab&&(a=o.length),o.push(i))}catch(e){(0,r.diagCatch)("reload 토큰",e)}const s={v:1,at:Date.now(),tokens:o,activeIndex:a,requestedAt:i},d=t.step("encode",()=>JSON.stringify(s));return t.step("storage",()=>window.localStorage.setItem(c,d)),t.mark("scheduled",`tabs=${o.length} chars=${d.length}`),n.enabled=!1,delete window.localStorage.tabsRecovery,(0,r.diag)(`reload go reason=${e} tabs=${o.length}`),setTimeout(()=>location.reload(),50),!0}catch(e){return this.reloading=!1,(0,r.diagCatch)("reload",e),!1}}async restore(){var e,t,i,n,o;const a=null!==(e=window.localStorage.getItem(c))&&void 0!==e?e:window.localStorage.getItem(u);if(window.localStorage.removeItem(c),window.localStorage.removeItem(u),!a)return;const s=new l.PerformanceTrace("reload-restore"),d=s.step("decode",()=>JSON.parse(a));if(s.mark("renderer-ready",`sinceRequestMs=${Date.now()-(null!==(t=d.requestedAt)&&void 0!==t?t:d.at)} chars=${a.length}`),Date.now()-d.at>6e5)return void(0,r.diag)("reload stash expired age="+(Date.now()-d.at));const p=Date.now(),h=this.app.tabRecovery,f=[],m=new Map;let v=0;for(const[e,t]of(null!==(i=d.tokens)&&void 0!==i?i:[]).entries())if(s.step("pty-check",()=>this.ptysAlive(t)))try{const i=await h.recoverTab(t);if(s.mark("recover-token",`index=${e}`),i){const t=this.app.openNewTabRaw(i);f.push(t),m.set(e,t),s.mark("open-tab",`index=${e}`)}}catch(e){(0,r.diagCatch)("reload recoverTab",e)}else v++;this.sweepStrays(f);for(const e of f)this.app.selectTab(e),await this.waitAttached(e),s.mark("attached",`index=${f.indexOf(e)}`),await g(250),s.mark("settled"),this.deck.repair("active"),s.mark("repair-requested");const b=null!==(n=m.get(d.activeIndex))&&void 0!==n?n:f[f.length-1];b&&this.app.selectTab(b);const k=Date.now()-p;(0,r.diag)(`reload restored tabs=${f.length} dead=${v} ms=${k}`),s.mark("complete",`tabs=${f.length} dead=${v} sinceRequestMs=${Date.now()-(null!==(o=d.requestedAt)&&void 0!==o?o:d.at)}`),this.notifications.info(`AgentDeck 리로드됨 — 탭 ${f.length}개 재부착 (${k}ms)`)}ptysAlive(e){const t=[],i=e=>{var n,o,a;const s=null===(o=null===(n=null==e?void 0:e.profile)||void 0===n?void 0:n.options)||void 0===o?void 0:o.restoreFromPTYID;s&&t.push(s);for(const t of null!==(a=null==e?void 0:e.children)&&void 0!==a?a:[])i(t)};if(i(e),!t.length)return!0;try{const{ipcRenderer:e}=window.require("electron");return t.some(t=>e.sendSync("pty:exists",t))}catch{return!0}}sweepStrays(e){const t=new Set(e),i=Date.now(),n=new Set(this.app.tabs.filter(e=>!t.has(e)));for(const e of p)setTimeout(()=>{const e=Date.now()-i<=1500;for(const i of[...this.app.tabs])if(!t.has(i)){if(e)n.add(i);else if(!n.has(i)){(0,r.diag)(`reload keep user tab "${i.title}" (스윕 유예 뒤에 생겼다)`);continue}(0,r.diag)(`reload close stray ${i.constructor.name} "${i.title}"`),this.app.closeTab(i,!1)}},e)}async waitAttached(e){const t=Date.now()+4e3;for(;Date.now()<t;){const t=e,i=("function"==typeof t.getAllTabs?t.getAllTabs():[e]).filter(e=>"frontend"in e||"session"in e);if(!i.length||i.every(e=>{var t;return null===(t=e.session)||void 0===t?void 0:t.open}))return;await g(100)}(0,r.diag)(`reload attach timeout "${e.title}"`)}};function g(e){return new Promise(t=>setTimeout(t,e))}h=n([(0,a.Injectable)({providedIn:"root"}),o("design:paramtypes",[s.AppService,s.NotificationsService,d.AgentDeckService])],h),t.AgentDeckReloadService=h},3630(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.migrateRuntimeData=t.copyRuntimeData=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=i(7025);function c(e,t){if(!s.existsSync(e)||d.resolve(e)===d.resolve(t))return;const i=s.lstatSync(e);if(!i.isSymbolicLink())if(i.isDirectory()){s.mkdirSync(t,{recursive:!0});for(const i of s.readdirSync(e))c(d.join(e,i),d.join(t,i))}else i.isFile()&&!s.existsSync(t)&&(s.mkdirSync(d.dirname(t),{recursive:!0}),s.copyFileSync(e,t,s.constants.COPYFILE_EXCL))}t.copyRuntimeData=c,t.migrateRuntimeData=function(){const e=(0,l.runtimeRoot)(),t=d.join(e,".legacy-imported");if(s.existsSync(t))return;const i=process.env.TABBY_CONFIG_DIRECTORY,n=d.join(process.env.APPDATA||d.join(r.homedir(),"AppData","Roaming"),"tabby");if(i&&d.resolve(i).toLowerCase()!==d.resolve(n).toLowerCase())return;const o=d.join(process.env.LOCALAPPDATA||d.join(r.homedir(),"AppData","Local"),"tabby-agentdeck");for(const t of["sessions.json","statusline-inner.json","scoped-limit.json","status","meta","history-search"])c(d.join(o,t),d.join(e,t));const a=i?d.join(i,"agentdeck-mailbox"):o;for(const t of["mailbox.json","mailbox-connections","navigation-context.txt"])c(d.join(a,t),d.join(e,"mailbox",t));s.mkdirSync(e,{recursive:!0}),s.writeFileSync(t,(new Date).toISOString(),"utf8")}},9306(e,t){function i(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function n(e){return[...e].sort((e,t)=>t.length-e.length).map(i).join("|")}function o(e,t){if(!Array.isArray(e))return t;const i=e.filter(e=>"string"==typeof e&&e.length>0);return i.length?i:t}t.judgeScreen=t.isGhostRuleRow=t.isRuleRow=t.sizeInSync=t.INPUT_TAIL=t.n=void 0,t.n={ruleChars:["─","━","═"],heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"]};const a=new Map;function s(e){const i=o(e?e.ruleChars:void 0,t.n.ruleChars),s=o(e?e.heads:void 0,t.n.heads),r=o(e?e.choiceWords:void 0,t.n.choiceWords),d=JSON.stringify([i,s,r]),l=a.get(d);if(l)return l;const c=i.join("").replace(/[\\\]^-]/g,"\\$&"),u=n(s),p={rule:new RegExp(`^[${c}]{2,}$`),head:new RegExp(`^(?:${u})(?:\\s|$)`),headAnywhere:new RegExp(`(?:${u})(?:\\s|$)`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${n(r)})(?!\\w))`,"i"),ruleChar:new RegExp(`[${c}]`),ruleCharAll:new RegExp(`[${c}]`,"g")};return a.set(d,p),p}function r(e,t,i){const n=s(i),o=e.replace(/\s+$/,"");return t>1&&!(o.length<2)&&!n.rule.test(o)&&(!(!n.ruleChar.test(o[0])||!n.ruleChar.test(o[o.length-1]))&&(o.match(n.ruleCharAll)||[]).length>=.6*t)}t.INPUT_TAIL=16,t.sizeInSync=function(e,t,i,n){return!("number"==typeof e&&e>1)||"number"!=typeof i||"number"!=typeof n||i===e&&n===t},t.isRuleRow=function(e,t){return s(t).rule.test(e.trim())},t.isGhostRuleRow=r,t.judgeScreen=function(e,i,n){const o=s(n),a=[];if(!(i>1&&e.length))return{broken:!1,reasons:[]};const d=[],l=[];for(let s=0;s<e.length;s++){const c=e[s].text.replace(/\s+$/,"");c&&(o.rule.test(c)?(d.push(s),c.length!==i&&a.push(`rule@${s} len=${c.length} != cols=${i}`)):(s>=e.length-t.INPUT_TAIL&&r(c,i,n)&&a.push(`테두리 행에 옛 글자가 남았다@${s} ${JSON.stringify(c.slice(0,40))}`),o.ruleChar.test(c)&&o.headAnywhere.test(c)&&a.push(`mixed@${s} ${JSON.stringify(c.slice(0,40))}`),o.head.test(c)&&!o.choice.test(c)&&l.push(s)))}const c=d.filter(t=>e[t].text.replace(/\s+$/,"").length===i);if(c.length>=2){const e=c[c.length-1],t=c[c.length-2];if(e-t<2)a.push(`입력창에 자리가 없다 (테두리 ${t}·${e} 이 맞붙었다)`);else{const i=l.filter(i=>i>t&&i<e).length;i>1&&a.push(`입력창 안 머리=${i} (기대 1)`)}}if(l.length&&c.length){const e=l[l.length-1],t=c.includes(e-1),i=c.some(t=>t>e);t&&!i&&a.push(`입력창 아래 테두리가 없다 (머리@${e}, 위 테두리@${e-1})`)}if(d.length>1){const t=new Set(d.map(t=>e[t].text.replace(/\s+$/,"").length));t.size>1&&a.push(`rule lens=${[...t].join(",")} (섞임)`)}return{broken:a.length>0,reasons:a}}},5633(e,t){function i(e){var t,i,n,o;const a=(null!==(t=e.match(/"[^"]*"|\S+/g))&&void 0!==t?t:[]).map(e=>e.replace(/^"|"$/g,"")),s=null===(n=(null!==(i=a[0])&&void 0!==i?i:"").split(/[\\/]/).pop())||void 0===n?void 0:n.replace(/\.(exe|cmd|bat)$/i,"").toLowerCase();if("codex"===s||"claude"===s||"gemini"===s)return s;if("node"===s){const e=(null!==(o=a[1])&&void 0!==o?o:"").replace(/\\/g,"/");if(/\/@openai\/codex\/bin\/codex\.js$/i.test(e))return"codex";if(/\/@anthropic-ai\/claude-code\/cli\.js$/i.test(e))return"claude";if(/\/@google\/gemini-cli\/(?:bundle\/gemini|dist\/index)\.js$/i.test(e))return"gemini"}return"unknown"}function n(e){let t="unknown";for(const i of e)/^\s*│\s*>_\s+OpenAI Codex\s+\(v\d+\./.test(i)?t="codex":/^[\s*\u2500-\u259f]*Claude Code v\d+\./.test(i)?t="claude":/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(i)&&(t="unknown");return t}t.TerminalAgentTracker=t.identifyScreenAgent=t.isLiveCodexScreen=void 0,t.isLiveCodexScreen=function(e){var t;const i=e.reduce((e,t,i)=>t.trim()?i+1:e,0),n=e.slice(0,i);if(/^\s*\/ T R A N S C R I P T\b/.test(null!==(t=n[0])&&void 0!==t?t:"")&&n.slice(-4).some(e=>/\bq close\b/.test(e)))return!0;const o=n.findIndex(e=>/^\s*(?:gpt-[\w.-]+|o\d[\w.-]*)\b.*\bContext \d+% left\b/.test(e));return!(o<0||o<i-3)&&!n.slice(o+1).some(e=>/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(e.trim()))&&n.slice(0,o).some(e=>/^\s*›/.test(e))},t.identifyScreenAgent=n,t.TerminalAgentTracker=class{constructor(){this.line="",this.control="",this.shellTitle=!1,this.mode="text"}write(e){for(const t of e)if("osc"!==this.mode&&"osc-escape"!==this.mode)if("escape"!==this.mode)if("csi"!==this.mode)if(""!==t)if("\r"!==t&&"\n"!==t){if(!(t<" ")&&(this.line=(this.line+t).slice(-512),">"===t&&this.shellTitle&&/^(?:PS )?[A-Za-z]:[\\/][^>]*>$/.test(this.line.trim())&&(this.id="unknown",this.shellTitle=!1),"."===t)){const e=n([this.line]);"unknown"===e||this.id&&"unknown"!==this.id||(this.id=e)}}else this.line="";else this.mode="escape";else t>="@"&&t<="~"&&(this.mode="text","HfG".includes(t)&&(this.line=""));else this.mode="["===t?"csi":"]"===t?"osc":"text",this.control="";else if(""===t||"osc-escape"===this.mode&&"\\"===t){const e=this.control.replace(/^[02];/,"");/^[02];/.test(this.control)&&/(?:^|:\s+)(?:[a-z]:[\\/][^\r\n]*[\\/])?(?:cmd|powershell|pwsh)(?:\.exe)?\s*$/i.test(e)&&(this.shellTitle=!0);const t=/^[02];/.test(this.control)&&e.match(/(?:^|:\s+)(?:[a-z]:[\\/][^\r\n]*[\\/])?(?:cmd|powershell|pwsh)(?:\.exe)?\s+-\s+(.+)$/i);if(t){const e=i(t[1]);this.shellTitle="unknown"===e,"unknown"===e&&this.id||(this.id=e)}this.mode="text",this.control="",this.line=""}else this.mode=""===t?"osc-escape":"osc",this.control.length<4096&&""!==t&&(this.control+=t)}}},7838(e,t){t.SessionIdentities=t.adaptiveAliasBase=void 0;const i=/^(?:[a-z]:|root|dev|qa|live|src|source|work|users|project|projects|server|client|bin)$/i,n=e=>{const t=/(?:^|[\s/\\_.-])(?:cn|china|중국)(?=$|[\s/\\_.-])/i.test(e);return t===/(?:^|[\s/\\_.-])(?:global|글로벌)(?=$|[\s/\\_.-])/i.test(e)?"":t?"중국":"글로벌"};function o(e,t){const i=e=>/agent.?deck|tabby|에이전트덱|탭\s*(통신|이동|번호|제목)|리로드/i.test(e)?"에이전트덱":/허브|업무일지|일일보고/i.test(e)?"허브":/infra|인프라/i.test(e)?"인프라":/토큰|모델|스킬|플러그인|codex|claude|클로드|코덱스/i.test(e)?"도구":/게임|어뷰징|길드|전투|던전/i.test(e)?"게임":"",n=/^(?:[\s\W]*)(?:powershell|cmd|bash|zsh|claude code|codex|terminal)(?:\.exe)?\s*$/i.test(e)?"":e,o=i(n)||i(t);if(o)return o;const a=(t.replace(/\\/g,"/").split("/").filter(Boolean).reverse().find(e=>!/^(root|dev|qa|live|src|work|users|project|projects)$/i.test(e))||n.split(/\s+/)[0]||"작업").replace(/[^\p{L}\p{N}_-]/gu,"");return Array.from(a||"작업").slice(0,12).join("")}t.adaptiveAliasBase=function(e,t,a,s=""){const r=!e.trim()||/^(?:[\s\W]*)(?:powershell|cmd|bash|zsh|claude code|codex|terminal)(?:\.exe)?\s*$/i.test(e),d=/(?:^|[/\\])(?:windows|system32|users|appdata)(?:[/\\]|$)/i.test(t);if((!t||d)&&!s&&r)return"";const l=(s||t).replace(/\\/g,"/").split("/").filter(Boolean),c=l.findIndex(e=>/^projects?$/i.test(e)),u=l.map((e,t)=>({name:e,index:t})).filter(e=>!i.test(e.name)&&!n(e.name)),p=c>=0?u.find(e=>e.index>c):u[u.length-1];if(!p)return o(e,t);const h=l.slice(0,p.index+1).join("/").normalize("NFKC").toLowerCase();let g=a.find(e=>e.key===h);const f=e.match(/(?:프로젝트|project)\s*[:=]\s*([\p{L}\p{N}_-]{2,24})/iu)||e.match(/([\p{L}\p{N}_-]{2,24})\s+(?:프로젝트|project)(?:\s|$)/iu),m=null==f?void 0:f[1],v=m&&!/^(?:현재|신규|새로운|다른|해당|이전|기존|new|current)$/i.test(m);g?v&&"path"===g.evidence&&(g.name=m,g.evidence="title"):(g={key:h,name:v?m:p.name,evidence:v?"title":"path"},a.push(g));const b=o(e,"");if(["에이전트덱","허브","인프라","도구"].includes(b))return b;const k=o("",g.name),y=(["에이전트덱","허브","인프라","도구"].includes(k)?k:g.name).replace(/[^\p{L}\p{N}_-]/gu,"")||"작업",w=n(t)||n(e);return y+(w&&!y.includes(w)?w:"")},t.SessionIdentities=class{constructor(e){this.records=e}ensure(e,t="작업"){const i=this.records.find(t=>t.id===e);if(i)return i.alias||(i.alias=this.nextAlias(t)),i;const n={id:e,letter:"",alias:this.nextAlias(t)};return this.records.push(n),n}key(e){return e.normalize("NFKC").trim().toLocaleLowerCase()}nextAlias(e){const t=new Set(this.records.flatMap(e=>[this.key(e.letter),this.key(e.alias)]));for(let i=1;i<=Number.MAX_SAFE_INTEGER;i++){const n=`${e}${i}`;if(!t.has(this.key(n)))return n}throw new Error("사용 가능한 별명이 없습니다.")}}},1424(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionLedgerService=void 0;const d=i(860),l=i(7650),c=s(i(9896)),u=s(i(6928)),p=i(7025),h=i(7797),g=i(2425);let f=class{get root(){return(0,p.runtimeRoot)()}get file(){return u.join(this.root,"sessions.json")}get projectsDir(){return u.join((0,p.agentHome)("claude"),"projects")}constructor(e){this.config=e,this.ledger=new Map,this.scanned=[],this.headCache=new Map,this.loaded=!1,this.saveTimer=null,this.scanning=null,this.lastScan=0,this.historyFiles=[],this.onChange=null}load(){if(!this.loaded){this.loaded=!0;try{const e=c.readFileSync(this.file,"utf8"),t=JSON.parse(e),i=Array.isArray(null==t?void 0:t.records)?t.records:[];for(const e of i)e&&"string"==typeof e.sessionId&&e.sessionId&&this.ledger.set(e.sessionId,{sessionId:e.sessionId,cwd:"string"==typeof e.cwd?e.cwd:null,label:(0,g.clampLabel)(e.label),lastStatus:"string"==typeof e.lastStatus?e.lastStatus:null,lastSeen:Number(e.lastSeen)||0,from:"head"===e.from?"head":"live"})}catch{}}}scheduleSave(){this.saveTimer||(this.saveTimer=setTimeout(()=>{this.saveTimer=null,this.save()},2e3))}save(){try{c.mkdirSync(this.root,{recursive:!0});const e=[...this.ledger.values()];c.writeFileSync(this.file,JSON.stringify({version:1,records:e},null,1)+"\n","utf8")}catch(e){(0,h.diagCatch)("세션 원장 저장",e)}}note(e,t){var i,n,o;if(!e)return;this.load();const a=this.ledger.get(e),s=(0,g.clampLabel)(t.label),r={sessionId:e,cwd:t.cwd||(null==a?void 0:a.cwd)||null,label:s||(null==a?void 0:a.label)||"",lastStatus:null!==(n=null!==(i=t.status)&&void 0!==i?i:null==a?void 0:a.lastStatus)&&void 0!==n?n:null,lastSeen:Date.now(),from:s?"live":null!==(o=null==a?void 0:a.from)&&void 0!==o?o:"live"},d=a&&a.cwd===r.cwd&&a.label===r.label&&a.lastStatus===r.lastStatus;this.ledger.set(e,r),d||this.scheduleSave()}async refresh(e=!1){const t=Date.now();if(e||!(t-this.lastScan<15e3))return this.scanning||(this.scanning=this.scan().finally(()=>{this.scanning=null,this.lastScan=Date.now()})),this.scanning}async scan(){var e;this.load();const t=this.config.store.agentDeck,i=Number(t.resumeListDays)||0,n=i>0?Date.now()-864e5*i:0,o=[],a=new Set;try{const e=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const t of e){if(!t.isDirectory())continue;const e=u.join(this.projectsDir,t.name);let i;try{i=await c.promises.readdir(e)}catch{continue}for(const t of i){const i=(0,g.sessionIdFromFile)(t);if(!i)continue;const n=u.join(e,t);a.add(i);try{const e=await c.promises.stat(n);o.push({sessionId:i,file:n,mtime:e.mtimeMs})}catch{}}}}catch{}const s=async(e,t)=>{let i;try{i=await c.promises.readdir(e,{withFileTypes:!0})}catch{return}for(const n of i){const i=u.join(e,n.name);if(n.isDirectory()&&t<3){await s(i,t+1);continue}const r=/^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i.exec(n.name);if(n.isFile()&&r){a.add(r[1]);try{const e=await c.promises.stat(i);o.push({sessionId:r[1],file:i,mtime:e.mtimeMs,agent:"codex"})}catch{}}}};await s(u.join((0,p.agentHome)("codex"),"sessions"),0),o.sort((e,t)=>t.mtime-e.mtime),this.historyFiles=o.map(e=>({file:e.file,sessionId:e.sessionId,agent:e.agent||"claude"}));const r=o.filter(e=>!n||e.mtime>=n).slice(0,200),d=[];for(const e of r){const t=`${e.sessionId}:${Math.round(e.mtime)}`;let i=this.headCache.get(t);i||(i=await this.readHeadOf(e.file),this.headCache.set(t,i)),i.isSubagent||d.push({agent:e.agent||"claude",sessionId:e.sessionId,cwd:i.cwd,label:i.label,lastStatus:null,lastSeen:e.mtime,from:"head"})}this.scanned=d;const l=this.ledger.size,h=(0,g.pruneLedger)([...this.ledger.values()],a);h.length!==l&&(this.ledger=new Map(h.map(e=>[e.sessionId,e])),this.scheduleSave()),null===(e=this.onChange)||void 0===e||e.call(this)}async readHeadOf(e){let t=null;try{t=await c.promises.open(e,"r");const i=Buffer.alloc(g.HEAD_BYTE_LIMIT),{bytesRead:n}=await t.read(i,0,g.HEAD_BYTE_LIMIT,0),o=i.slice(0,n).toString("utf8").split("\n");return n===g.HEAD_BYTE_LIMIT&&o.pop(),(0,g.readHead)(o.slice(0,g.HEAD_LINE_LIMIT))}catch(t){return(0,h.diagCatch)(`세션 기록 앞부분 읽기 ${u.basename(e)}`,t),{cwd:null,label:"",startedAt:null}}finally{await(null==t?void 0:t.close().catch(()=>{}))}}records(){return this.load(),(0,g.mergeSessions)([...this.ledger.values()],this.scanned)}async historySources(){return await this.refresh(),[...this.historyFiles]}snapshot(){return{ledger:this.ledger.size,scanned:this.scanned.length,file:this.file,lastScan:this.lastScan}}};f=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.ConfigService])],f),t.SessionLedgerService=f},2425(e,t){t.resumeCommand=t.sessionIdFromFile=t.formatWhen=t.resumeRowsFor=t.pruneLedger=t.mergeSessions=t.readHead=t.clampLabel=t.wd=t.HEAD_BYTE_LIMIT=t.HEAD_LINE_LIMIT=void 0,t.HEAD_LINE_LIMIT=400,t.HEAD_BYTE_LIMIT=524288;const i=["<","Caveat:","[Request interrupted","Your claude.ai usage limit"];function n(e){if("string"!=typeof e)return!1;const t=e.trim();return!!t&&!i.some(e=>t.startsWith(e))}function o(e){var t,i,o;if("event_msg"===(null==e?void 0:e.type)&&"user_message"===(null===(t=e.payload)||void 0===t?void 0:t.type))return n(e.payload.message)?e.payload.message.trim():null;if("response_item"===(null==e?void 0:e.type)&&"user"===(null===(i=e.payload)||void 0===i?void 0:i.role)){const t=(Array.isArray(e.payload.content)?e.payload.content:[]).filter(e=>"input_text"===(null==e?void 0:e.type)&&"string"==typeof e.text).map(e=>e.text).join(" ");return n(t)?t.trim():null}if(!e||"user"!==e.type||!0===e.isMeta)return null;const a=null===(o=e.message)||void 0===o?void 0:o.content;let s=null;if("string"==typeof a)s=a;else if(Array.isArray(a)){const e=a.filter(e=>e&&"text"===e.type&&"string"==typeof e.text).map(e=>e.text);s=e.length?e.join(" "):null}return n(s)?s.trim():null}function a(e){if(!e)return"";const i=e.replace(/\s+/g," ").trim();return i.length>t.wd?i.slice(0,t.wd-1)+"…":i}t.wd=140,t.clampLabel=a,t.readHead=function(e){var t,i,n;let s=null,r="",d=null;for(const l of e){if(!l)continue;let e;try{e=JSON.parse(l)}catch{continue}if("session_meta"===(null==e?void 0:e.type)){if(null===(i=null===(t=e.payload)||void 0===t?void 0:t.source)||void 0===i?void 0:i.subagent)return{cwd:null,label:"",startedAt:null,isSubagent:!0};s||"string"!=typeof(null===(n=e.payload)||void 0===n?void 0:n.cwd)||(s=e.payload.cwd)}if(!s&&"string"==typeof(null==e?void 0:e.cwd)&&e.cwd&&(s=e.cwd),null===d&&"string"==typeof(null==e?void 0:e.timestamp)){const t=Date.parse(e.timestamp);Number.isNaN(t)||(d=t)}if(!r){const t=o(e);t&&(r=a(t))}if(s&&r&&null!==d)break}return{cwd:s,label:r,startedAt:d}},t.mergeSessions=function(e,t){var i;const n=new Map;for(const e of t)e.sessionId&&n.set(e.sessionId,{...e});for(const t of e){if(!t.sessionId)continue;const e=n.get(t.sessionId);e&&n.set(t.sessionId,{...e,label:t.label||e.label,from:t.label?t.from:e.from,lastStatus:null!==(i=t.lastStatus)&&void 0!==i?i:e.lastStatus,cwd:e.cwd||t.cwd,lastSeen:Math.max(t.lastSeen||0,e.lastSeen||0)})}return[...n.values()]},t.pruneLedger=function(e,t){return e.filter(e=>e.sessionId&&t.has(e.sessionId))},t.resumeRowsFor=function(e,t){var i;const n=t.groupKeys?new Set(t.groupKeys.map(e=>t.fold(e))):null,o=t.days>0?t.now-864e5*t.days:null,a=[];for(const s of e)s.sessionId&&!t.hidden.has(s.sessionId)&&(n&&!n.has(t.fold(t.keyOf(s.cwd)))||null!==o&&s.lastSeen<o||a.push({...s,openTabId:null!==(i=t.live.get(s.sessionId))&&void 0!==i?i:null}));return a.sort((e,t)=>t.lastSeen-e.lastSeen||e.sessionId.localeCompare(t.sessionId)),t.limit>0?a.slice(0,t.limit):a},t.formatWhen=function(e,t){if(!e||!Number.isFinite(e))return"";const i=new Date(e),n=new Date(t);if(i.getFullYear()===n.getFullYear()&&i.getMonth()===n.getMonth()&&i.getDate()===n.getDate())return`${String(i.getHours()).padStart(2,"0")}:${String(i.getMinutes()).padStart(2,"0")}`;const o=new Date(t);return o.setDate(o.getDate()-1),i.getFullYear()===o.getFullYear()&&i.getMonth()===o.getMonth()&&i.getDate()===o.getDate()?"어제":`${i.getMonth()+1}/${i.getDate()}`};const s=/^([0-9a-fA-F-]{8,64})\.jsonl$/;t.sessionIdFromFile=function(e){const t=s.exec(e||"");return t?t[1]:null},t.resumeCommand=function(e,t,i="claude"){return/^[0-9a-fA-F-]{8,64}$/.test(e||"")?"codex"===i?`codex ${t?"fork":"resume"} ${e}`:`claude --resume ${e}${t?" --fork-session":""}`:""}},9174(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionMailbox=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(6982);t.SessionMailbox=class{constructor(e,t){if(this.file=e,this.wake=t,this.data={version:1,sessions:[],messages:[]},this.committed=JSON.stringify(this.data),s.existsSync(e)){const t=JSON.parse(s.readFileSync(e,"utf8"));if(1!==t.version||!Array.isArray(t.sessions)||!Array.isArray(t.messages))throw new Error("Unsupported mailbox store");this.data=t,this.data.sessions.forEach(e=>{e.active=!1})}this.committed=JSON.stringify(this.data)}save(){try{s.mkdirSync(r.dirname(this.file),{recursive:!0});const e=this.file+".tmp",t=JSON.stringify(this.data);s.writeFileSync(e,t,{encoding:"utf8",mode:384}),s.renameSync(e,this.file),this.committed=t}catch(e){throw this.data=JSON.parse(this.committed),e}}register(e,t,i){if(!e||e.length>256)throw new Error("Invalid session ID");let n=this.data.sessions.find(t=>t.sessionId===e);return n?Object.assign(n,{name:t,cwd:i,active:!0}):(n={sessionId:e,name:t,cwd:i,active:!0,token:(0,d.randomBytes)(32).toString("hex")},this.data.sessions.push(n)),this.save(),{sessionId:e,token:n.token}}close(e){const t=this.data.sessions.find(t=>t.sessionId===e);(null==t?void 0:t.active)&&(t.active=!1,this.save())}callExternal(e,t,i,n={}){if("string"!=typeof e||!e.trim()||e.length>256||"string"!=typeof t||!/^[a-f0-9]{64}$/.test(t))throw new Error("Invalid external session identity");const o=this.data.sessions.find(t=>t.sessionId===e);if(o&&(!o.external||o.token!==t))throw new Error("External session credentials are invalid");if(!o&&"send"!==i)throw new Error("Send the first message from the external session before receiving");const a=JSON.stringify(this.data),l=o&&!o.active;try{if(o)o.active=!0;else{const i=r.join(r.dirname(this.file),"mailbox-external"),n=r.join(i,(0,d.createHash)("sha256").update(e).digest("hex")+".json");if(s.mkdirSync(i,{recursive:!0}),s.existsSync(n)){const i=JSON.parse(s.readFileSync(n,"utf8"));if(i.sessionId!==e||i.token!==t)throw new Error("External session credentials are invalid")}else s.writeFileSync(n+".tmp",JSON.stringify({sessionId:e,token:t}),{mode:384}),s.renameSync(n+".tmp",n);this.data.sessions.push({sessionId:e,token:t,name:"",cwd:"",active:!0,external:!0})}const a=this.call(e,t,i,n);return!l||"receive"!==i&&"sessions"!==i||this.save(),a}catch(e){throw this.data=JSON.parse(a),e}}call(e,t,i,n={}){var o,a,s;const r=this.data.sessions.find(t=>t.sessionId===e),l=Buffer.from("string"==typeof t?t:""),c=Buffer.from(null!==(o=null==r?void 0:r.token)&&void 0!==o?o:"");if(!r||!r.active||l.length!==c.length||!(0,d.timingSafeEqual)(l,c))throw new Error("Session is inactive or credentials are invalid");if(!n||"object"!=typeof n||Array.isArray(n))throw new Error("Invalid arguments");const u={sessions:[],receive:[],send:["toSessionId","body","requestKey","replyTo"],acknowledge:["messageId","completed"],reply:["messageId","body","requestKey"]};if(!u[i]||Object.keys(n).some(e=>!u[i].includes(e)))throw new Error("Unknown method or argument; routing requires actual session IDs");if("sessions"===i)return this.data.sessions.map(({token:e,...t})=>t);if("receive"===i)return this.data.messages.filter(t=>t.toSessionId===e&&!t.completedAt).slice(0,50);if("reply"===i){const i=this.data.messages.find(t=>t.id===n.messageId&&t.toSessionId===e);if(!i)throw new Error("Message not found in this session mailbox");return this.call(e,t,"send",{toSessionId:i.fromSessionId,body:n.body,requestKey:n.requestKey,replyTo:i.id})}if("acknowledge"===i){const t=this.data.messages.find(t=>t.id===n.messageId&&t.toSessionId===e);if(!t)throw new Error("Message not found in this session mailbox");if(void 0!==n.completed&&"boolean"!=typeof n.completed)throw new Error("Invalid completion flag");return null!==(a=t.readAt)&&void 0!==a||(t.readAt=Date.now()),n.completed&&(null!==(s=t.completedAt)&&void 0!==s||(t.completedAt=Date.now())),this.save(),t}if("string"!=typeof n.toSessionId||"string"!=typeof n.body||!n.body.trim()||n.body.length>32768||"string"!=typeof n.requestKey||!n.requestKey||n.requestKey.length>128)throw new Error("Provide toSessionId, body (1–32768 characters), and a stable requestKey (1–128 characters)");const p=this.data.messages.find(t=>t.fromSessionId===e&&t.requestKey===n.requestKey);if(p){if(p.toSessionId!==n.toSessionId||p.body!==n.body||p.replyTo!==n.replyTo)throw new Error("requestKey already belongs to a different message");return this.sendResult(p)}if(!n.toSessionId||n.toSessionId.length>256)throw new Error("Invalid recipient session ID");if(void 0!==n.replyTo&&!this.data.messages.some(t=>t.id===n.replyTo&&t.toSessionId===e&&t.fromSessionId===n.toSessionId))throw new Error("Reply must address the sender of a received message");const h={id:(0,d.randomUUID)(),fromSessionId:e,toSessionId:n.toSessionId,body:n.body,requestKey:n.requestKey,createdAt:Date.now(),...void 0!==n.replyTo?{replyTo:n.replyTo}:{}};return this.data.messages.push(h),this.save(),this.sendResult(h)}isActive(e){return this.data.sessions.some(t=>t.sessionId===e&&t.active)}sendResult(e){if(void 0!==e.replyTo)return{...e,wake:{attempted:!1,delivered:!1,reason:"reply-queued"}};let t={attempted:!1,delivered:!1,reason:"no-tab"};try{this.wake&&(t=this.wake(e))}catch{}return{...e,wake:t}}}},8860(e,t,i){t.SessionSearch=void 0;const n=i(8167),o=i(5317),a=String.raw`
2
2
  const { parentPort, workerData } = require('worker_threads')
3
3
  const fs = require('fs'), path = require('path'), crypto = require('crypto')
4
4
  const readline = require('readline'), zlib = require('zlib'), util = require('util')
@@ -106,4 +106,4 @@ async function run() {
106
106
  parentPort.postMessage({done:true,value:{hits,checked,unreadable,malformed}})
107
107
  }
108
108
  run().catch(e => parentPort.postMessage({error:String(e.message || e)}))
109
- `;t.SessionSearch=class{constructor(e,t="renderer"===process.type){this.cacheDir=e,this.subprocess=t,this.worker=null,this.cancelPending=null}stop(e){e&&("terminate"in e?e.terminate():e.kill())}cancel(){var e;null===(e=this.cancelPending)||void 0===e||e.call(this),this.cancelPending=null,this.stop(this.worker),this.worker=null}run(e,t){return this.cancel(),new Promise((i,s)=>{const r={...e,cacheDir:this.cacheDir},d=this.subprocess?(0,o.spawn)("renderer"===process.type?"node":process.execPath,["-e",a.replace("const { parentPort, workerData } = require('worker_threads')","const parentPort = { postMessage: value => process.send(value) }; process.once('message', workerData => {")+"\n})"],{env:{...process.env},windowsHide:!0,stdio:["ignore","ignore","ignore","ipc"]}):new n.Worker(a,{eval:!0,workerData:r});this.worker=d;const l=()=>{this.worker===d&&(this.worker=null,this.cancelPending=null),this.stop(d)};this.cancelPending=()=>s(new Error("Search cancelled")),d.on("message",e=>{void 0!==e.progress&&(null==t||t(e.progress,e.total)),e.done&&(l(),i(e.value)),e.error&&(l(),s(new Error(e.error)))}),d.on("error",e=>{l(),s(e)}),d.on("exit",e=>{this.worker===d&&(l(),s(new Error(`Search worker stopped (${e})`)))}),"send"in d&&d.send(r,e=>{e&&(l(),s(e))})})}search(e,t,i){return t.trim()?this.run({op:"search",sources:e,query:t.trim()},i):(this.cancel(),Promise.resolve({hits:[],checked:0,unreadable:0,malformed:0}))}preview(e,t){return this.run({op:"preview",sources:[e],line:t})}}},5916(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionSearchPanel=void 0;const s=a(i(6928)),r=i(7025),d=i(8860);t.SessionSearchPanel=class{tr(e,t){return this.host.korean()?e:t}constructor(e){this.host=e,this.element=document.createElement("div"),this.input=document.createElement("input"),this.status=document.createElement("div"),this.results=document.createElement("div"),this.engine=new d.SessionSearch(s.join((0,r.runtimeRoot)(),"history-search")),this.previewEngine=new d.SessionSearch(s.join((0,r.runtimeRoot)(),"history-search")),this.generation=0,this.timer=null,this.hits=[],this.visible=40,this.dialog=null,this.previewGeneration=0,this.errors="",this.element.className="ad-history-search",this.input.type="search",this.input.className="ad-history-query",this.input.placeholder=this.host.searchLabel(),this.input.setAttribute("aria-label",this.input.placeholder),this.input.addEventListener("input",()=>{this.timer&&clearTimeout(this.timer),this.generation++,this.engine.cancel(),this.hits=[],this.results.replaceChildren(),this.status.textContent=this.active?this.tr("검색 준비 중…","Preparing search…"):"",this.host.changed(),this.active&&(this.timer=setTimeout(()=>{this.search()},300))}),this.element.addEventListener("keydown",e=>{e.stopPropagation(),"Escape"===e.key&&this.input.value?(e.preventDefault(),this.input.value="",this.input.dispatchEvent(new Event("input"))):"Enter"===e.key&&e.target===this.input&&(e.preventDefault(),this.timer&&clearTimeout(this.timer),this.search())}),this.status.className="ad-history-status",this.status.setAttribute("aria-live","polite"),this.results.className="ad-history-results",this.element.append(this.input,this.status,this.results),window.addEventListener("beforeunload",()=>this.dispose(),{once:!0})}get active(){return!!this.input.value.trim()}update(e){this.element.hidden=!e,this.input.placeholder=this.host.searchLabel(),this.input.setAttribute("aria-label",this.input.placeholder)}async search(){const e=this.input.value.trim(),t=++this.generation;if(this.errors="",this.visible=40,e){this.status.textContent=this.tr("대화 기록 확인 중…","Finding conversation files…");try{const i=await this.host.sources();if(t!==this.generation)return;const n=await this.engine.search(i,e,(e,i)=>{t===this.generation&&(this.status.textContent=this.tr(`검색 중 ${e}/${i}`,`Searching ${e}/${i}`))});if(t!==this.generation)return;this.hits=n.hits,(n.unreadable||n.malformed)&&(this.errors=this.tr(` · 읽지 못한 파일 ${n.unreadable}, 불완전한 기록 ${n.malformed}`,` · ${n.unreadable} unreadable files, ${n.malformed} incomplete records`)),this.renderResults()}catch(e){t===this.generation&&(this.status.textContent=this.tr("검색 실패: ","Search failed: ")+String(e.message||e))}}}highlight(e,t){const i=this.input.value.trim().toLowerCase();if(!i)return void(e.textContent=t);let n,o=0;const a=t.toLowerCase();for(;(n=a.indexOf(i,o))>=0;){e.append(document.createTextNode(t.slice(o,n)));const a=document.createElement("mark");a.textContent=t.slice(n,n+i.length),e.append(a),o=n+i.length}e.append(document.createTextNode(t.slice(o)))}renderResults(){if(this.results.replaceChildren(),!this.active)return void(this.status.textContent="");const e=this.hits;this.status.textContent=this.tr(`${e.length}개 세션`,`${e.length} sessions`)+this.errors,e.length||(this.status.textContent=this.tr("일치하는 지난 대화가 없습니다","No matching conversations")+this.errors);for(const t of e.slice(0,this.visible)){const e=document.createElement("button");e.type="button",e.className="ad-history-hit",e.dataset.sessionId=t.source.sessionId;const i=document.createElement("strong");this.highlight(i,t.record.label||t.source.sessionId);const n=document.createElement("small");n.textContent=`${"codex"===t.source.agent?"Codex":"Claude"} · ${new Date(t.record.lastSeen).toLocaleDateString()} · ${t.count}`;const o=document.createElement("small");o.textContent=t.record.cwd||"";const a=document.createElement("span");this.highlight(a,t.snippet),e.append(i,n,o,a),e.addEventListener("click",()=>{this.openPreview(t,t.line)}),this.results.append(e)}if(e.length>this.visible){const e=document.createElement("button");e.type="button",e.textContent=this.tr("더 보기","Show more"),e.onclick=()=>{this.visible+=40,this.renderResults()},this.results.append(e)}}async openPreview(e,t){var i,n;const o=++this.previewGeneration;null===(i=this.dialog)||void 0===i||i.remove();const a=document.createElement("div");a.className="ad-history-overlay",this.dialog=a;const s=document.createElement("section");s.className="ad-history-dialog",s.setAttribute("role","dialog"),s.setAttribute("aria-modal","true"),s.setAttribute("aria-label",this.tr("지난 대화 보기","Conversation preview")),s.tabIndex=-1;const r=document.createElement("header"),d=document.createElement("strong"),l=document.createElement("button");d.textContent=e.record.label||e.source.sessionId,l.textContent="×",l.setAttribute("aria-label",this.tr("닫기","Close"));const c=()=>{this.previewGeneration++,this.previewEngine.cancel(),a.remove(),this.dialog===a&&(this.dialog=null),this.input.focus()};l.onclick=c,r.append(d,l);const u=document.createElement("div");u.className="ad-history-conversation",u.textContent=this.tr("불러오는 중…","Loading…");const p=document.createElement("footer"),h=document.createElement("button");h.textContent=this.tr("이어서 대화","Resume conversation"),h.onclick=()=>{c(),this.host.resume({...e.record,openTabId:null})},p.append(h),s.append(r,u,p),a.append(s),document.body.append(a),l.focus(),a.addEventListener("keydown",e=>{if(e.stopPropagation(),"Escape"===e.key&&(e.preventDefault(),c()),"Tab"===e.key){const t=Array.from(s.querySelectorAll('button,input,select,textarea,[tabindex="0"]')),i=t[0],n=t[t.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),null==n||n.focus()):e.shiftKey||document.activeElement!==n||(e.preventDefault(),null==i||i.focus())}}),a.addEventListener("click",e=>{e.target===a&&c()});try{const i=await this.previewEngine.preview(e.source,t);if(o!==this.previewGeneration)return;u.replaceChildren();for(const n of i.messages){const i=document.createElement("article");i.className=n.line===t?"ad-history-match":"";const o=document.createElement("strong");o.textContent="user"===n.role?this.tr("나","You"):e.source.agent;const a=document.createElement("pre");if(this.highlight(a,n.text.slice(0,16e3)),i.append(o,a),n.text.length>16e3){const e=document.createElement("button");e.textContent=this.tr("메시지 전체 보기","Show full message"),e.onclick=()=>{a.replaceChildren(),this.highlight(a,n.text),e.remove()},i.append(e)}u.append(i)}for(const[t,n,o]of[[i.previous,"이전 대화","Previous messages"],[i.next,"다음 대화","Next messages"]])if(null!==t){const i=document.createElement("button");i.textContent=this.tr(n,o),i.onclick=()=>{this.openPreview(e,t)},p.prepend(i)}null===(n=u.querySelector(".ad-history-match"))||void 0===n||n.scrollIntoView({block:"nearest"})}catch(e){o===this.previewGeneration&&(u.textContent=this.tr("기록을 읽지 못했습니다: ","Could not read conversation: ")+String(e.message||e))}}dispose(){var e;this.generation++,this.previewGeneration++,this.timer&&clearTimeout(this.timer),this.engine.cancel(),this.previewEngine.cancel(),null===(e=this.dialog)||void 0===e||e.remove()}}},4867(e,t){t.SessionSlots=void 0,t.SessionSlots=class{constructor(){this.slots=Array(9).fill(null)}reconcile(e,t=()=>null){const i=new Set(e);this.slots=this.slots.map(e=>null!==e&&i.has(e)?e:null);for(const i of e){if(this.slots.includes(i))continue;const e=t(i);null!==e&&Number.isInteger(e)&&e>=1&&e<=9&&null===this.slots[e-1]&&(this.slots[e-1]=i)}for(const t of e){if(this.slots.includes(t))continue;const e=this.slots.indexOf(null);if(e<0)break;this.slots[e]=t}}numberOf(e){const t=this.slots.indexOf(e);return t<0?null:t+1}get(e){return Number.isInteger(e)&&e>=1&&e<=9?this.slots[e-1]:null}get full(){return!this.slots.includes(null)}get occupied(){return this.slots.filter(e=>null!==e).length}}},7418(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},a=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabComponent=void 0;const s=i(860),r=i(7650),d=i(3438),l=i(7028),c=i(9900),u=i(1786),p=i(906),h=i(2627),g=i(9980),f=i(9610),m=i(5174),v=i(7797),b=i(7025),k=i(1584),y=i(8209),w=i(3496),x={disabled:"자동 업데이트가 꺼져 있다","too-soon":"방금 확인했다","dev-install":"새 버전이 있지만 개발 설치라 건드리지 않는다",unknown:"npm 에 물어보지 못했다 (네트워크·프록시)","up-to-date":"최신이다","update-ready":"새 버전이 있다",skipped:"이 버전은 건너뛰기로 했다",postponed:"나중에 하기로 했다",installing:"설치했다 — 창을 새로 고쳐 갈아탄다 (탭·세션 유지)",installed:"설치했다 — Tabby 를 다시 켜면 적용된다 (창을 새로 고치지 못했다)",failed:"업데이트를 시작하지 못했다"},S={left:"dock.left",right:"dock.right",top:"dock.top",bottom:"dock.bottom"};let C=class{get claudeOn(){return this.hooksOn&&(this.statusLineOn||!this.statusLineSupported)}get codexOffLabels(){return this.codexOff.map(h.codexEventLabel).join(" · ")}get claudeError(){return[this.hookError,this.statusLineError].filter(Boolean).join(" / ")}constructor(e,t,i,n,o,a,s,r,l,h){var g,f,m;this.config=e,this.recovery=t,this.update=i,this.platform=n,this.devReload=o,this.host=a,this.locale=s,this.hotkeys=r,this.zone=l,this.rootProfiles=h,this.storageKeys=b.STORAGE_KEYS,this.storageDefault=(0,b.storageDefaults)(),this.hooksSupported=(0,u.hooksSupported)(),this.hooksOn=!1,this.codexHooksOn=!1,this.codexHookError="",this.codexOff=[],this.hookError="",this.statusLineSupported=(0,p.statusLineSupported)(),this.statusLineOn=!1,this.statusLineError="",this.diagPath=v.DIAG_PATH,this.diagVersion=(0,v.pluginVersion)(),this.diagIncludeScreen=!1,this.diagBundlePath="",this.diagError="",this.updateBusy=!1,this.updateMsg="",this.keyItems=c.KEY_ITEMS,this.capturing=null,this.pending=null,this.keyMsg="",this.keyMsgFor="",this.hotkeyNames=new Map,this.captureHandler=null,this.keyPlatform="darwin"===process.platform||"linux"===process.platform?process.platform:"win32",this.widened=null,this.prevMaxWidth="",this.lang="en",this.localeSub=null,this.hooksRefreshTimer=null,this.storageModel=(0,k.storageSettingsFor)(this.config),this.refreshHooks(),this.loadHotkeyNames(),this.lang=(0,d.pickLang)((null===(g=this.locale)||void 0===g?void 0:g.getLocale())||this.config.store.language||navigator.language),this.localeSub=null!==(m=null===(f=this.locale)||void 0===f?void 0:f.localeChanged$.subscribe(e=>{this.lang=(0,d.pickLang)(e)}))&&void 0!==m?m:null}t(e,t){return(0,d.translate)(e,this.lang,t)}ngAfterViewInit(){this.hooksRefreshTimer=setInterval(()=>this.refreshHooks(),2e3);const e=this.host.nativeElement.closest("settings-tab-body");e&&(this.widened=e,this.prevMaxWidth=e.style.maxWidth,e.style.maxWidth="none")}ngOnDestroy(){var e;this.storageModel.flush(),this.hooksRefreshTimer&&(clearInterval(this.hooksRefreshTimer),this.hooksRefreshTimer=null),this.widened&&(this.widened.style.maxWidth=this.prevMaxWidth,this.widened=null),null===(e=this.localeSub)||void 0===e||e.unsubscribe(),this.localeSub=null,this.stopCapture()}keysOf(e){var t;return(0,c.displayStrokes)(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{},e,this.keyPlatform)}isPending(e){return!!this.pending&&this.pending.plan.item.id===e.id}isDefault(e){var t;return(0,c.isDefaultBinding)(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{},e,this.keyDefaults(),this.keyPlatform)}startCapture(e){this.stopCapture(),this.pending=null,this.keyMsg="",this.capturing=e.id,this.captureHandler=t=>{["Control","Meta","Alt","Shift"].includes(t.key)||(t.preventDefault(),t.stopImmediatePropagation(),this.zone.run(()=>{var i;if("Escape"===t.key)return void this.stopCapture();const n=(0,c.keystrokeFromEvent)(t,this.keyPlatform);if(!n)return;this.stopCapture();const o=null!==(i=this.config.store.hotkeys)&&void 0!==i?i:{},a=(0,c.planBinding)(o,e,n,this.keyPlatform);if("digit"===a.error)return this.keyMsg=this.t("keys.digit"),void(this.keyMsgFor=e.id);a.conflicts.length?this.pending={plan:a,names:a.conflicts.map(e=>this.nameOf(e)).join(", ")}:this.commit(a,!1)}))},window.addEventListener("keydown",this.captureHandler,!0)}stopCapture(){this.captureHandler&&(window.removeEventListener("keydown",this.captureHandler,!0),this.captureHandler=null),this.capturing=null}confirmPending(){this.pending&&(this.commit(this.pending.plan,!0),this.pending=null)}resetKeys(e){this.pending=null,this.keyMsg="",(0,c.resetBinding)(this.config.store.hotkeys,e,this.keyDefaults()),this.config.save()}commit(e,t){(0,c.applyBinding)(this.config.store.hotkeys,e,t,this.keyPlatform),this.config.save()}keyDefaults(){var e,t,i,n;let o={};try{o=null!==(n=null===(i=null===(t=(e=this.config).getDefaults)||void 0===t?void 0:t.call(e))||void 0===i?void 0:i.hotkeys)&&void 0!==n?n:{}}catch(e){}return{...o,...(0,l.defaultHotkeys)()}}nameOf(e){var t;return null!==(t=this.hotkeyNames.get(e))&&void 0!==t?t:e}async loadHotkeyNames(){var e;try{const t=await(null===(e=this.hotkeys)||void 0===e?void 0:e.getHotkeyDescriptions());for(const e of null!=t?t:[])(null==e?void 0:e.id)&&e.name&&this.hotkeyNames.set(e.id,e.name)}catch(e){}}async checkUpdate(){var e,t;this.updateBusy=!0,this.updateMsg="";try{this.updateMsg=null!==(e=x[await this.update.run("settings",!0)])&&void 0!==e?e:""}catch(e){this.updateMsg=`확인하지 못했다: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}finally{this.updateBusy=!1}}refreshHooks(){var e,t,i;try{this.codexHooksOn=this.hooksSupported&&(0,h.codexHooksInstalled)(),this.codexOff=this.codexHooksOn?(0,h.codexDisabledEvents)():[]}catch(t){this.codexHooksOn=!1,this.codexOff=[],this.codexHookError=`설정을 읽지 못했다: ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}try{this.hooksOn=this.hooksSupported&&(0,u.hooksInstalled)()}catch(e){this.hooksOn=!1,this.hookError=`설정을 읽지 못했다: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}try{this.statusLineOn=this.statusLineSupported&&(0,p.statusLineInstalled)()}catch(e){this.statusLineOn=!1,this.statusLineError=`설정을 읽지 못했다: ${null!==(i=null==e?void 0:e.message)&&void 0!==i?i:e}`}}toggleClaude(){var e,t;this.hookError="",this.statusLineError="";const i=this.claudeOn;try{i?(0,u.uninstallHooks)():(0,u.installHooks)()}catch(t){this.hookError=`상태 훅: ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}if(this.statusLineSupported)try{i?(0,p.uninstallStatusLine)():this.statusLineOn||(0,p.installStatusLine)()}catch(e){this.statusLineError=`statusLine: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}this.refreshHooks(),this.syncNotifyChannel()}toggleCodexHooks(){var e;this.codexHookError="";try{(0,h.setCodexHooks)(!this.codexHooksOn)}catch(t){this.codexHookError=`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}this.refreshHooks(),this.syncNotifyChannel()}syncNotifyChannel(){const e=this.hooksOn||this.codexHooksOn;this.config.store.agentDeck.notifyChannel!==e&&(this.config.store.agentDeck.notifyChannel=e,this.config.save())}collectDiag(){var e,t,i,n,o;this.diagError="",this.diagBundlePath="";try{const o=(0,v.collectDiagBundle)({includeScreen:this.diagIncludeScreen,stamp:{tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(n=(i=this.platform).getOSRelease)||void 0===n?void 0:n.call(i),config:(0,v.configStamp)(this.config.store)}});this.diagBundlePath=o.path,this.platform.showItemInFolder(o.path)}catch(e){this.diagError=`모으지 못했다: ${null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e}`}}layoutChanged(){const e=this.config.store.agentDeck;return Object.keys(l.LAYOUT_DEFAULTS).some(t=>e[t]!==l.LAYOUT_DEFAULTS[t])}dockLabel(){var e;return this.t(null!==(e=S[this.config.store.agentDeck.sidebarDock])&&void 0!==e?e:"dock.right")}sizeLabel(){const e=this.config.store.agentDeck;return"top"===e.sidebarDock||"bottom"===e.sidebarDock?this.t("size.height",{px:e.sidebarHeight}):e.sidebarWidth?this.t("size.width",{px:e.sidebarWidth}):this.t("size.auto")}resetLayout(){Object.assign(this.config.store.agentDeck,l.LAYOUT_DEFAULTS),this.config.save()}collapsedCount(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.length:0}expandGroups(){this.config.store.agentDeck.collapsedGroups=[],this.config.save()}async pickCwd(){const e=await this.platform.pickDirectory("작업 폴더 선택");e&&(this.config.store.agentDeck.rootProfileCwd=String(e).replace(/\\/g,"/"),this.saveRootProfile())}saveRootProfile(){this.rootProfiles.applySettings()}addRootProfile(){const e=this.config.store.agentDeck;e.rootProfiles=[...e.rootProfiles||[],{id:"agentdeck:root:"+i(6982).randomUUID(),name:"",cwd:"",command:e.rootProfileCommand||"powershell.exe"}],this.saveRootProfile()}removeRootProfile(e){this.config.store.agentDeck.rootProfiles=this.config.store.agentDeck.rootProfiles.filter(t=>t.id!==e.id),this.saveRootProfile()}async pickAdditionalCwd(e){const t=await this.platform.pickDirectory(this.t("root.cwd.title"));t&&(e.cwd=String(t).replace(/\\/g,"/"),this.saveRootProfile())}storageLabel(e){return(0,y.storageText)(e,this.lang)}async pickStorage(e){try{const t=await this.platform.pickDirectory(this.storageLabel(e));t&&(this.storageModel.change(e,String(t)),await this.storageModel.save())}catch{this.storageModel.error=!0,this.storageModel.message="failed"}}resetStorage(){for(const e of b.STORAGE_KEYS)this.storageModel.change(e,"");this.storageModel.save()}async saveStorage(){await this.storageModel.save()}};C=n([(0,s.Component)({selector:"agentdeck-settings-tab",template:'\n<h3 class="mb-3">AgentDeck</h3>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'layout.title\')}}</div>\n <div class="description">{{t(\'layout.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.enabled" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'reset.title\')}}</div>\n <div class="description">\n {{t(\'reset.desc\')}}\n <span *ngIf="layoutChanged()">{{t(\'reset.now\', { dock: dockLabel(), size: sizeLabel() })}}</span>\n <span *ngIf="!layoutChanged()">{{t(\'reset.default\')}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="!layoutChanged()" (click)="resetLayout()">\n <i class="fas fa-undo me-2"></i>{{t(\'reset.btn\')}}\n </button>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'norecover.title\')}}</div>\n <div class="description" [innerHTML]="t(\'norecover.desc\')"></div>\n </div>\n <toggle [ngModel]="config.store.agentDeck.noTabRecovery" (ngModelChange)="recovery.setNoTabRecovery($event)"></toggle>\n</div>\n\n\x3c!-- [설정 화면에서 숨김 자동 업데이트·지금 확인 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<div class="form-line">\n <div class="header">\n <div class="title">자동 업데이트</div>\n <div class="description">\n 기동할 때 npm 을 보고 새 버전이 있으면 <b>물어본 뒤</b> 업데이트한다.\n 승낙하면 Tabby 가 닫히고 → 설치하고 → <b>스스로 다시 켜진다</b> (사람이 할 일은 없다).\n 돌고 있는 플러그인은 갈아끼울 수 없어서 이 방법뿐이다.\n 끊긴 Claude Code·Codex 대화는 <code>⟲ 지난 세션</code> 에서 이어받으면 된다.\n <b>개발 설치(소스 링크)에는 설치하지 않는다</b> — 작업 중인 소스를 덮어쓰기 때문이다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.autoUpdate" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.autoUpdate">\n <div class="header">\n <div class="title">지금 확인</div>\n <div class="description">\n 간격({{config.store.agentDeck.updateCheckIntervalHours}}시간)과 <code>다시 묻지 않기</code> 를 무시하고 한 번 확인한다.\n <span *ngIf="updateMsg">— {{updateMsg}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="updateBusy" (click)="checkUpdate()">\n <i class="fas fa-rotate me-2"></i>{{updateBusy ? \'확인 중…\' : \'확인\'}}\n </button>\n</div>\n\n--\x3e\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'resume.title\')}}</div>\n <div class="description" [innerHTML]="t(\'resume.desc\')"></div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.resumeList" (ngModelChange)="config.save()"></toggle>\n</div>\n\n\x3c!-- [설정 화면에서 숨김 몇 줄까지·며칠치 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<div class="form-line" *ngIf="config.store.agentDeck.resumeList">\n <div class="header">\n <div class="title">몇 줄까지 · 며칠치</div>\n <div class="description">\n 그룹마다 최근 <b>{{config.store.agentDeck.resumeListLimit}}줄</b>까지,\n 최근 <b>{{config.store.agentDeck.resumeListDays}}일</b> 안의 세션만 보여준다.\n 길게 잡으면 살아 있는 탭이 아래로 밀린다. 숨긴 세션은 줄 우클릭으로 되돌릴 수 없고\n <code>config.yaml</code> 의 <code>resumeHidden</code> 을 비우면 다시 나온다.\n </div>\n </div>\n <div class="d-flex align-items-center">\n <input class="form-control text-end me-2" style="width: 5rem" type="number" min="0" max="50"\n [(ngModel)]="config.store.agentDeck.resumeListLimit" (ngModelChange)="config.save()">\n <input class="form-control text-end" style="width: 5rem" type="number" min="0" max="365"\n [(ngModel)]="config.store.agentDeck.resumeListDays" (ngModelChange)="config.save()">\n </div>\n</div>\n\n--\x3e\n\n<h3 class="mt-4 mb-3">{{t(\'keys.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'keys.intro\')"></div>\n\n<div class="form-line ad-keyrow" *ngFor="let it of keyItems">\n <div class="header">\n <div class="title">\n {{t(it.label)}}\n <span class="badge bg-secondary ms-1" *ngIf="it.stock">{{t(\'keys.stock\')}}</span>\n </div>\n <div class="description">\n <ng-container *ngIf="capturing !== it.id && !isPending(it)">\n <kbd class="me-1" *ngFor="let k of keysOf(it)">{{k}}</kbd>\n <span class="text-muted" *ngIf="!keysOf(it).length">{{t(\'keys.unbound\')}}</span>\n </ng-container>\n <span class="text-info" *ngIf="capturing === it.id">{{t(\'keys.press\')}}</span>\n <div class="text-warning" *ngIf="isPending(it)">\n <kbd>{{pending!.plan.display}}</kbd> — {{t(\'keys.conflict\', { names: pending!.names })}}\n <div class="mt-1">\n <button class="btn btn-sm btn-warning me-1" type="button" (click)="confirmPending()">{{t(\'keys.force\')}}</button>\n <button class="btn btn-sm btn-secondary me-1" type="button" (click)="startCapture(it)">{{t(\'keys.change\')}}</button>\n <button class="btn btn-sm btn-link" type="button" (click)="pending = null">{{t(\'keys.cancel\')}}</button>\n </div>\n </div>\n <span class="text-danger d-block mt-1" *ngIf="keyMsgFor === it.id && keyMsg">{{keyMsg}}</span>\n </div>\n </div>\n <div class="d-flex gap-1">\n <button class="btn btn-secondary" type="button"\n (click)="capturing === it.id ? stopCapture() : startCapture(it)">\n {{t(capturing === it.id ? \'keys.cancel\' : \'keys.change\')}}\n </button>\n <button class="btn btn-outline-secondary" type="button" [disabled]="isDefault(it)" (click)="resetKeys(it)">\n {{t(\'keys.default\')}}\n </button>\n </div>\n</div>\n<div class="text-muted mb-3" [innerHTML]="t(\'keys.fixed\')"></div>\n\n\x3c!-- [설정 화면에서 숨김 사이드바 목록·세션 그룹·미리보기 패널 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<h3 class="mt-4 mb-3">사이드바 목록</h3>\n<div class="text-muted mb-3">\n 세션 목록을 마우스 없이 다루는 방법과, 줄에 무엇까지 보일지를 정한다. 바꾸면 곧바로 적용된다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">키보드로 다루기</div>\n <div class="description">\n <code>Ctrl+L</code> 로 목록에 들어가 <code>↑↓</code> 로 훑고 Enter 로 그 탭으로 옮긴다\n (<code>Esc</code> 로 터미널로 돌아온다). <b>훑는 동안 활성 탭은 바뀌지 않는다</b> —\n 줄마다 탭이 바뀌면 그 탭의 출력이 화면을 덮어 훑어보는 것 자체가 안 된다.\n 포커스가 사이드바에 없는 동안은 키를 한 개도 가로채지 않으므로 켜 둬서 잃는 것이 없다.\n 끄면 목록이 포커스를 받지 않는다.\n 키 배정은 <b>단축키</b> 탭의 <code>agentdeck-focus-list</code> 에서 바꾼다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardNav" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.keyboardNav">\n <div class="header">\n <div class="title">끝에서 반대쪽으로 감싸기</div>\n <div class="description">\n 맨 아래에서 <code>↓</code> 를 한 번 더 누르면 맨 위로 넘어간다.\n 기본은 꺼짐 — 끝에서 멈춰야 "맨 아래에 왔다" 가 보이고 목록이 통째로 튀지 않는다.\n 끝에서 끝으로 갈 일은 <code>Home</code> · <code>End</code> 가 받는다.\n 켜도 <b>맨 위의 ↑ 는 검색창으로 나간다</b> — 그 경계까지 감싸기에 내주면\n 목록에서 검색창으로 돌아갈 키가 없어진다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardNavWrap" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.keyboardNav">\n <div class="header">\n <div class="title"><code>Ctrl+W</code> 로 탭 닫기</div>\n <div class="description">\n 터미널에서 누르면 <b>지금 보고 있는 탭</b>, 목록이 키보드를 갖고 있으면\n <b>포커스 줄의 탭</b>을 닫는다 (그룹 헤더에서는 아무 일도 하지 않는다).\n 사이드바 <code>✕</code> 와 같은 경로라 돌아가는 프로세스가 있으면 평소처럼 한 번 물어본다.\n <b>끄면 <code>Ctrl+W</code> 가 터미널로 그대로 간다</b> — 셸·에이전트 CLI 에서\n 그 키는 <b>앞 단어 지우기</b>이고, 우리는 닫을 탭이 정해졌을 때만 키를 가로챈다.\n <code>키보드로 다루기</code> 를 끄면 이 항목도 함께 꺼진다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardCloseTab" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">서브에이전트 개수 보이기</div>\n <div class="description">\n 그 세션이 백그라운드로 돌리고 있는 에이전트 수를 줄에 <b>❖3</b> 으로 보인다\n (툴팁에 무엇을 시켜 놨는지와 가장 오래된 것의 경과 시간).\n 0 개면 아무것도 그리지 않으므로 켜 둬서 잃는 것이 없다.\n 끄면 표시도 멈추고 대화 기록을 <b>읽지도 않는다</b>.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.subagentCount" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="text-muted mb-3">세션은 1~9 고정 번호를 사용합니다. 닫힌 자리는 재사용하며 다른 번호는 바뀌지 않습니다.\nCtrl+숫자로 해당 세션을 선택합니다. 자동 정렬과 끌어서 순서 바꾸기는 지원하지 않습니다.</div>\n\n\x3c!-- Legacy grouping controls are retired: fixed slots never reorder by project.\n<h3 class="mt-4 mb-3">세션 그룹</h3>\n<div class="text-muted mb-3">\n 사이드바의 세션을 <b>프로젝트 단위</b>로 묶고 헤더를 눌러 접는다. 끄고 켜는 값이 없다 —\n 그룹이 하나뿐이면 헤더도 순서도 건드리지 않으므로, 한 프로젝트만 쓸 때는 묶지 않은 화면과 같다.\n <br>\n 묶는 기준은 <b>탭이 태어난 작업 폴더</b>다 — 셸에서 <code>cd</code> 를 해도 따라오지 않으므로\n 세션이 사는 동안 그룹이 흔들리지 않는다. 그룹 안의 순서는 상태 정렬을 그대로 따른다.\n 경계는 <b>저장소 루트</b>(<code>.git</code> 등)를 위로 훑어 자동으로 잡으므로 하위 폴더에서 띄운\n 세션도 같은 프로젝트로 들어오고, 저장소가 아닌 폴더는 그 폴더 자체가 그룹이다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">접어 둔 그룹 펼치기</div>\n <div class="description">\n 헤더를 눌러 접은 그룹은 다음 기동에도 접힌 채로 뜬다.\n <span *ngIf="collapsedCount()">지금 {{collapsedCount()}}개가 접혀 있다.</span>\n <span *ngIf="!collapsedCount()">지금 접힌 그룹은 없다.</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="!collapsedCount()" (click)="expandGroups()">\n <i class="fas fa-angles-down me-2"></i>모두 펼치기\n </button>\n</div>\n\n--\x3e\n<h3 class="mt-4 mb-3">미리보기 패널</h3>\n<div class="text-muted mb-3">\n 터미널 옆에서 에이전트가 만든 md · 이미지 · 표 · 코드를 그대로 본다.\n 글자 파일은 <b>✎</b> 로 고쳐 저장하고(<code>Ctrl+S</code>), <b>🔍</b> 나 <code>Ctrl+F</code> 로 찾는다.\n 여닫기는 사이드바의 <b>▤</b> 버튼(또는 단축키 <code>agentdeck-view</code>)이다.\n 특정 CLI 에 매이지 않는다 — 화면에 찍힌 경로를 주우므로 Claude Code · Codex · Gemini 모두 같이 동작한다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">패널 열기</div>\n <div class="description">\n 지금 여닫는다. 이 상태는 다음 기동에도 그대로 복원된다.\n 사이드바의 <b>▤</b> 버튼·단축키 <code>agentdeck-view</code> 와 같은 값이다 —\n 아래 <b>새 파일을 주우면</b> 을 <b>사람이 열 때만</b> 으로 두면 이 값은\n <b>사람이 바꿀 때만</b> 바뀐다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerOpen" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">경로 자동 수집</div>\n <div class="description">\n 에이전트가 화면에 찍은 파일 경로를 주워 패널 위쪽 최근 목록에 쌓는다.\n 끄면 파일을 끌어다 놓거나 <b>+</b> 로 경로를 넣을 때만 열린다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerScrape" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">문서 패널에 읽어두기</div>\n <div class="description">\n 에이전트가 만진 파일을 <b>닫혀 있는 동안에도</b> 패널에 얹어 둔다 —\n 나중에 <b>▤</b> 를 누르면 그때까지 건드린 파일이 칩으로 쌓여 있고 본문은 가장 최근 파일이다\n (<b>변경</b> 을 보고 있었으면 여는 김에 diff 를 다시 읽는다).\n 끄면 아무것도 자동으로 하지 않는다 — 무엇을 볼지 칩·<b>+</b>·드롭으로 직접 고른다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerPreload" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">패널 자동으로 열기</div>\n <div class="description">\n 새 파일을 주우면 닫힌 패널을 스스로 연다. <b>기본은 꺼짐</b> — 여닫기는 사람 몫이다\n (작업 중에 저절로 열리면 터미널이 좁아진다). 위 <b>읽어두기</b> 가 내용을 채워 두므로\n 열고 싶을 때 열면 이미 최신이다. <b>읽어두기</b> 를 끄면 이 값은 의미가 없다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerAutoOpen"\n [disabled]="!config.store.agentDeck.viewerPreload"\n (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">터미널에 파일을 끌어다 놓으면</div>\n <div class="description">\n 순정 Tabby 는 경로를 터미널에 붙여넣는다. 패널이 닫혀 있으면 그래서 아무것도 안 열린다 —\n 기본은 <b>물어본다</b> — 패널에 띄우기 / 경로 붙여넣기 중에서 고른다. 배너에서 "다시 묻지 않기" 를\n 체크하고 누르면 그 선택이 여기 저장된다.\n </div>\n </div>\n <select class="form-control w-auto"\n [(ngModel)]="config.store.agentDeck.viewerDropOpen"\n (ngModelChange)="config.save()">\n <option value="ask">물어본다 (기본)</option>\n <option value="always">패널에 띄운다</option>\n <option value="paste">경로를 붙여넣는다</option>\n <option value="never">개입하지 않는다 (순정)</option>\n </select>\n</div>\n\n--\x3e\n\n<h3 class="mt-4 mb-3">{{t(\'agents.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'agents.intro\')"></div>\n\n<div class="form-line" *ngIf="!hooksSupported">\n <div class="header">\n <div class="title">{{t(\'agents.unsupported.title\')}}</div>\n <div class="description">{{t(\'agents.unsupported.desc\')}}</div>\n </div>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">{{t(\'claude.title\')}}</div>\n <div class="description">\n <b>{{t(claudeOn ? \'state.on\' : \'state.off\')}}</b> — <span [innerHTML]="t(\'claude.desc\')"></span>\n <span *ngIf="claudeError" class="text-danger d-block mt-1">{{claudeError}}</span>\n </div>\n </div>\n <button class="btn" type="button"\n [class.btn-secondary]="!claudeOn" [class.btn-outline-danger]="claudeOn"\n (click)="toggleClaude()">\n <i class="fas me-2" [class.fa-plug]="!claudeOn" [class.fa-trash]="claudeOn"></i>\n {{t(claudeOn ? \'btn.remove\' : \'btn.install\')}}\n </button>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">{{t(\'codex.title\')}}</div>\n <div class="description">\n <b>{{t(codexOff.length ? \'state.half\' : (codexHooksOn ? \'state.on\' : \'state.off\'))}}</b> — <span [innerHTML]="t(\'codex.desc\')"></span>\n <span *ngIf="codexOff.length" class="text-warning d-block mt-1">\n {{t(\'codex.disabled\', { events: codexOffLabels })}}\n </span>\n <span *ngIf="codexHookError" class="text-danger d-block mt-1">{{codexHookError}}</span>\n </div>\n </div>\n <button class="btn" type="button"\n [class.btn-secondary]="!codexHooksOn" [class.btn-outline-danger]="codexHooksOn"\n (click)="toggleCodexHooks()">\n <i class="fas me-2" [class.fa-plug]="!codexHooksOn" [class.fa-trash]="codexHooksOn"></i>\n {{t(codexHooksOn ? \'btn.remove\' : \'btn.install\')}}\n </button>\n</div>\n\n<section class="ad-storage-settings">\n<h3 class="mt-4 mb-3">{{storageLabel(\'head\')}}</h3>\n<div class="text-muted mb-3">{{storageLabel(\'intro\')}}</div>\n<div class="form-line" *ngFor="let key of storageKeys">\n <div class="header">\n <div class="title">{{storageLabel(key)}}</div>\n <div class="description">{{storageLabel(key === \'accountStorageDir\' ? \'accounts\' : \'agents\')}}</div>\n </div>\n <div class="w-50">\n <div class="input-group">\n <input class="form-control" type="text" [attr.data-storage-key]="key"\n [attr.aria-label]="storageLabel(key)" [placeholder]="storageLabel(\'default\') + \': \' + storageDefault[key]"\n [ngModel]="storageModel.draft[key]" (ngModelChange)="storageModel.change(key, $event)" (change)="saveStorage()">\n <button class="btn btn-secondary" type="button" (click)="pickStorage(key)">{{t(\'root.browse\')}}</button>\n </div>\n <small class="text-muted" style="overflow-wrap:anywhere">{{storageLabel(\'default\')}}: {{storageDefault[key]}}</small>\n </div>\n</div>\n<button class="btn btn-primary ad-storage-save" type="button" [disabled]="storageModel.busy" (click)="saveStorage()">{{storageLabel(\'save\')}}</button>\n<button class="btn btn-secondary ms-2" type="button" [disabled]="storageModel.busy" (click)="resetStorage()">{{storageLabel(\'reset\')}}</button>\n<div class="mt-2 ad-storage-message" role="status" [class.text-danger]="storageModel.error">{{storageModel.message ? storageLabel(storageModel.message) : \'\'}}</div>\n</section>\n<h3 class="mt-4 mb-3">{{t(\'root.head\')}}</h3>\n<div class="text-muted mb-3">{{storageLabel(\'working\')}}</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.use.title\')}}</div>\n <div class="description">{{t(\'root.use.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.rootProfile" (ngModelChange)="saveRootProfile()"></toggle>\n</div>\n\n<ng-container *ngIf="config.store.agentDeck.rootProfile">\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.name.title\')}}</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileName" (change)="saveRootProfile()">\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.cwd.title\')}}</div>\n <div class="description">{{t(\'root.cwd.desc\')}}</div>\n </div>\n <div class="input-group w-50">\n <input class="form-control" type="text" placeholder="D:/Project"\n [(ngModel)]="config.store.agentDeck.rootProfileCwd" (change)="saveRootProfile()">\n <button class="btn btn-secondary" type="button" (click)="pickCwd()">\n <i class="fas fa-folder-open me-2"></i>{{t(\'root.browse\')}}\n </button>\n </div>\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.command.title\')}}</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileCommand" (change)="saveRootProfile()">\n </div>\n\n</ng-container>\n\n<section class="ad-root-profiles">\n <h4>{{t(\'root.more\')}}</h4>\n <p class="text-muted">{{t(\'root.choose.desc\')}}</p>\n <div class="ad-root-profile card p-3 mb-2" *ngFor="let root of config.store.agentDeck.rootProfiles">\n <label>{{t(\'root.name.title\')}}<input class="form-control" [(ngModel)]="root.name" (change)="saveRootProfile()"></label>\n <label>{{t(\'root.cwd.title\')}}<input class="form-control" [(ngModel)]="root.cwd" (change)="saveRootProfile()"></label>\n <button class="btn btn-secondary" (click)="pickAdditionalCwd(root)">{{t(\'root.browse\')}}</button>\n <label>{{t(\'root.command.title\')}}<input class="form-control" [(ngModel)]="root.command" (change)="saveRootProfile()"></label>\n <button class="btn btn-secondary mt-2" (click)="removeRootProfile(root)">{{t(\'root.remove\')}}</button>\n </div>\n <button class="btn btn-secondary" (click)="addRootProfile()">{{t(\'root.add\')}}</button>\n</section>\n\n<h3 class="mt-4 mb-3">{{t(\'diag.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'diag.intro\', { path: diagPath })"></div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'diag.screen.title\')}}</div>\n <div class="description">{{t(\'diag.screen.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="diagIncludeScreen"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'diag.collect.title\')}}</div>\n <div class="description">\n {{t(\'diag.collect.desc\', { version: diagVersion })}}\n <span *ngIf="diagBundlePath" class="d-block mt-1">{{t(\'diag.made\')}}<code>{{diagBundlePath}}</code></span>\n <span *ngIf="diagError" class="text-danger d-block mt-1">{{diagError}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" (click)="collectDiag()">\n <i class="fas fa-folder-open me-2"></i>{{t(\'diag.btn\')}}\n </button>\n</div>\n\n<ng-container *ngIf="devReload.available">\n<h3 class="mt-4 mb-3">{{t(\'dev.head\')}}</h3>\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'dev.use.title\')}}</div>\n <div class="description" [innerHTML]="t(\'dev.use.desc\')"></div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.devMode" (ngModelChange)="config.save()"></toggle>\n</div>\n<div class="form-line" *ngIf="config.store.agentDeck.devMode">\n <div class="header">\n <div class="title">{{t(\'dev.now.title\')}}</div>\n <div class="description">{{t(\'dev.now.desc\')}}</div>\n </div>\n <button class="btn btn-secondary" type="button" (click)="devReload.reload(\'settings\')">\n <i class="fas fa-rotate me-2"></i>{{t(\'dev.btn\')}}\n </button>\n</div>\n</ng-container>\n\n<div class="text-muted mt-4" [innerHTML]="t(\'footer\')"></div>\n'}),a(6,(0,s.Optional)()),a(7,(0,s.Optional)()),o("design:paramtypes",[r.ConfigService,g.AgentDeckRecoveryService,f.AgentDeckUpdateService,r.PlatformService,m.AgentDeckDevReloadService,s.ElementRef,r.LocaleService,r.HotkeysService,s.NgZone,w.AgentDeckProfileService])],C),t.AgentDeckSettingsTabComponent=C},1451(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabProvider=void 0;const o=i(860),a=i(3700),s=i(7418);let r=class extends a.SettingsTabProvider{constructor(){super(...arguments),this.id="agentdeck",this.icon="layer-group",this.title="AgentDeck"}getComponentType(){return s.AgentDeckSettingsTabComponent}};r=n([(0,o.Injectable)()],r),t.AgentDeckSettingsTabProvider=r},1836(e,t,i){t.RESET_COPY=t.sidebarReset=t.sidebarReason=t.sidebarMarkup=t.sidebarText=void 0;const n=i(9169),o={"계정 이름 (선택)":"Account name (optional)","목록에서 삭제":"Remove from list","이메일 주소 전체를 입력하세요.":"Enter the full email address.","계정 추가":"Add account","계정 (이메일)":"Account (email)",비밀번호:"Password","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Your account and password are stored in plain text on this PC.",저장:"Save",취소:"Cancel","계정과 비밀번호를 입력하세요.":"Enter an account and password.","이미 등록된 계정입니다.":"This account is already saved.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Could not save the account. Try again.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Could not read the account file. Check its JSON format.","+ 버튼으로 계정을 추가하세요.":"Use the + button to add an account.","현재 탭에서 선택한 계정으로 전환합니다.":"Switch to the selected account in this tab.","세션 검색 (제목 · 작업이름 · 폴더)":"Search sessions (title · task · folder)","검색·필터 지우기 (Esc)":"Clear search and filters (Esc)","계정 선택":"Select account","새 탭":"New tab","+ 새 탭":"+ New tab",설정:"Settings","화면 복구 (모든 탭 다시 그리기)":"Repair display (redraw all tabs)","미리보기 패널 (md · 이미지 · 표)":"Preview panel (Markdown · images · tables)",진행중:"Working",승인대기:"Awaiting approval","한도 도달":"Usage limit reached",완료:"Done",오류:"Error",대기:"Idle",기타:"Other","지난 세션":"Past sessions",어제:"Yesterday","● 열림":"● Open","탭 닫기":"Close tab","(제목 없음)":"(Untitled)","작업 이름":"Task name",닫기:"Close",모름:"Unknown","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Closed Claude Code · Codex sessions — click to resume","검색어와 맞는 지난 세션이 없다":"No past sessions match your search","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Press Esc or ✕ to show all sessions","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Turn off status sorting in Settings to reorder tabs","이 탭으로 이동":"Go to tab","새 탭에서 이어받기":"Resume in new tab","분기해서 이어받기":"Fork conversation","세션 ID 복사":"Copy session ID","목록에서 숨기기":"Hide from list","↺ 자동 감지로":"↺ Detect automatically","↻ 화면 복구":"↻ Repair display","패널에 띄우기":"Open in panel","경로 붙여넣기":"Paste path","아무것도 하지 않는다":"Cancel","다시 묻지 않기":"Do not ask again","{name} 을 어떻게 할까요?":"What would you like to do with {name}?","{provider} 계정 선택":"Select {provider} account","{provider} 계정":"{provider} accounts","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continue this conversation in a new tab with the selected account.","선택한 계정으로 새 대화를 엽니다.":"Start a new conversation with the selected account.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"No saved accounts. Add accounts to accounts.json."," · 현재 계정":" · Current account","잔량 조회 중…":"Loading usage…","계정 저장 폴더를 준비하지 못했습니다.":"Could not prepare the account folder.","사용량 정보 없음":"Usage unavailable","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"The original tab was closed. Reopen the account list.","{name} 인증 확인 중…":"Checking authentication for {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: Sign in using the browser. Authentication will be saved automatically.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentication saved. The original tab was closed; select the account in a new conversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Could not switch accounts. Please try again.","새 계정 탭을 열지 못했습니다.":"Could not open the account tab.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Already open — click to go to the tab","누르면 새 탭에서 이어받는다 ({id})":"Click to resume in a new tab ({id})","작업 폴더: {cwd}":"Working folder: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Only the conversation resumes; servers and background processes are not restarted.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"No sessions match {filter} ({total} total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expanded for search results (clear search to collapse)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} tabs) — click to collapse/expand","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} tabs without a known working folder — click to collapse/expand","탭 {count}개":"{count} tabs","{status} {count} — 클릭하면 필터 해제":"{status} {count} — click to clear filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — click to filter","{n}초":"{n}s","{n}분":"{n}m","{h}시간 {m}분":"{h}h {m}m","계정: {value}":"Account: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"{tool} permission","입력 대기":"Waiting for input","플랜 승인":"Plan approval","질문 응답":"Answer a question","{time} 리셋":"Reset: {time}"};Object.keys(o);const a={en:o,...n.SIDEBAR_LOCALES};function s(e,t,i){var n,s,r;return("ko"===t?e:null!==(r=null!==(s=null===(n=a[t])||void 0===n?void 0:n[e])&&void 0!==s?s:o[e])&&void 0!==r?r:e).replace(/\{(\w+)\}/g,(e,t)=>{var n;return String(null!==(n=null==i?void 0:i[t])&&void 0!==n?n:e)})}t.sidebarText=s,t.sidebarMarkup=function(e,t){if("ko"===t)return e;for(const i of Object.keys(o).sort((e,t)=>t.length-e.length))i.includes("{")||(e=e.split(i).join(s(i,t)));return e},t.sidebarReason=function(e,t){const i=/^(\w+) 권한$/.exec(e);if(i)return s("{tool} 권한",t,{tool:i[1]});const n=/^(.*) 리셋$/.exec(e);return n?s("{time} 리셋",t,{time:n[1]}):["입력 대기","플랜 승인","질문 응답"].includes(e)?s(e,t):e},t.sidebarReset=function(e,i){var n;if(!e||"ko"===i)return e;const o=null!==(n=t.RESET_COPY[i])&&void 0!==n?n:t.RESET_COPY.en;if("곧 리셋"===e)return o[0];const a=e.replace(/(\d+)(일|시간|분)/g,(e,t,n)=>new Intl.NumberFormat(i,{style:"unit",unit:{일:"day",시간:"hour",분:"minute"}[n],unitDisplay:"narrow"}).format(Number(t))).replace(/ 뒤(?: 리셋)?$/,"");return(e.endsWith("리셋")?o[1]:o[2]).replace("{time}",a)},t.RESET_COPY={en:["Resets soon","Resets in {time}","{time} remaining","Available","Currently unavailable"],ko:["곧 리셋","{time} 뒤 리셋","{time} 뒤","사용 가능","현재 사용 불가"],af:["Herstel binnekort","Herstel oor {time}","{time} oor","Beskikbaar","Tans nie beskikbaar nie"],bg:["Скоро се нулира","Нулиране след {time}","Остават {time}","Налично","В момента недостъпно"],cs:["Brzy se obnoví","Obnovení za {time}","Zbývá {time}","Dostupné","Momentálně nedostupné"],da:["Nulstilles snart","Nulstilles om {time}","{time} tilbage","Tilgængelig","Ikke tilgængelig nu"],de:["Wird bald zurückgesetzt","Zurücksetzung in {time}","Noch {time}","Verfügbar","Derzeit nicht verfügbar"],es:["Se restablece pronto","Se restablece en {time}","Quedan {time}","Disponible","No disponible actualmente"],fr:["Réinitialisation imminente","Réinitialisation dans {time}","Encore {time}","Disponible","Actuellement indisponible"],hr:["Uskoro se poništava","Poništavanje za {time}","Preostaje {time}","Dostupno","Trenutno nedostupno"],id:["Segera direset","Direset dalam {time}","Tersisa {time}","Tersedia","Saat ini tidak tersedia"],it:["Ripristino imminente","Ripristino tra {time}","Mancano {time}","Disponibile","Attualmente non disponibile"],ja:["まもなくリセット","{time}後にリセット","あと{time}","利用可能","現在利用不可"],pl:["Wkrótce odnowienie","Odnowienie za {time}","Pozostało {time}","Dostępne","Obecnie niedostępne"],pt:["Reinicia em breve","Reinicia em {time}","Restam {time}","Disponível","Indisponível no momento"],ru:["Скоро сброс","Сброс через {time}","Осталось {time}","Доступно","Сейчас недоступно"],sr:["Ускоро се поништава","Поништавање за {time}","Преостало {time}","Доступно","Тренутно недоступно"],sv:["Återställs snart","Återställs om {time}","{time} kvar","Tillgänglig","Inte tillgänglig just nu"],tr:["Yakında sıfırlanacak","{time} sonra sıfırlanacak","{time} kaldı","Kullanılabilir","Şu anda kullanılamıyor"],uk:["Незабаром скидання","Скидання через {time}","Залишилося {time}","Доступно","Зараз недоступно"],"zh-CN":["即将重置","{time}后重置","剩余{time}","可用","当前不可用"],"zh-TW":["即將重設","{time}後重設","剩餘{time}","可用","目前無法使用"]}},9169(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.SIDEBAR_LOCALES=void 0;const o=n(i(4995)),a=n(i(1771)),s=n(i(5758)),r=n(i(8459)),d=n(i(1658)),l=n(i(3917)),c=n(i(1500)),u=n(i(2085)),p=n(i(9865)),h=n(i(5046)),g=n(i(8281)),f=n(i(710)),m=n(i(3070)),v=n(i(3940)),b=n(i(2255)),k=n(i(1948)),y=n(i(541)),w=n(i(9940)),x=n(i(4237)),S=n(i(6020));t.SIDEBAR_LOCALES={af:o.default,bg:a.default,cs:s.default,da:r.default,hr:d.default,id:l.default,pl:c.default,sr:u.default,sv:p.default,tr:h.default,ja:g.default,"zh-CN":f.default,"zh-TW":m.default,fr:v.default,de:b.default,es:k.default,it:y.default,pt:w.default,ru:x.default,uk:S.default}},6021(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkStatusService=void 0;const o=i(860),a=i(3961),s=["waiting","limited","error"],r=["running","done","error"];let d=class{constructor(){this.states=new Map,this.changed=new a.Subject,this.idled=new a.Subject,this.debug={attached:0,outputs:0,oscHits:0,titleHits:0}}get changed$(){return this.changed}get idled$(){return this.idled}get(e){let t=this.states.get(e);return t||(t={status:"idle",label:"",reason:"",since:Date.now(),pinned:!1,lastOutput:0,busyMode:!1,lastBusy:0},this.states.set(e,t)),t}setAuto(e,t){const i=this.get(e);i.pinned||i.status===t||(i.status=t,i.since=Date.now(),this.clearReasonUnlessWaiting(i),this.changed.next())}setManual(e,t,i,n){const o=this.get(e);o.status=t,o.since=Date.now(),o.pinned=!0,void 0!==i&&(o.label=i),o.reason=s.includes(t)&&null!=n?n:"",this.changed.next()}resume(e){const t=this.get(e);"waiting"===t.status&&(t.status="running",t.since=Date.now(),t.reason="",this.changed.next())}setLabel(e,t){this.get(e).label=t,this.changed.next()}unpin(e){const t=this.get(e);t.pinned=!1,t.status="idle",t.since=Date.now(),this.clearReasonUnlessWaiting(t),this.changed.next()}clearReasonUnlessWaiting(e){s.includes(e.status)||(e.reason="")}markOutput(e){this.get(e).lastOutput=Date.now()}markBusy(e){const t=this.get(e);t.busyMode=!0,t.lastBusy=Date.now()}isBusyMode(e){return this.get(e).busyMode}forget(e){this.states.delete(e),this.changed.next()}sweep(e){let t=0;for(const i of[...this.states.keys()])e.includes(i)||(this.states.delete(i),t++);return t>0&&this.changed.next(),t}tickIdle(e,t,i=0){const n=this.get(e);if(n.pinned){if(!(r.includes(n.status)&&i>0))return!1;const e=Math.max(n.since||0,n.lastOutput||0,n.lastBusy||0);return!(!e||Date.now()-e<=i||(n.pinned=!1,"running"===n.status&&(n.status="idle",n.since=Date.now(),this.clearReasonUnlessWaiting(n),this.idled.next()),0))}if("running"!==n.status)return!1;const o=n.busyMode?n.lastBusy:n.lastOutput;return!!(o&&Date.now()-o>t)&&(n.status="idle",n.since=Date.now(),this.clearReasonUnlessWaiting(n),this.idled.next(),!0)}};d=n([(0,o.Injectable)({providedIn:"root"})],d),t.WorkStatusService=d},906(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.uninstallStatusLine=t.installStatusLine=t.innerCommand=t.statusLineInstalled=t.unwrapStatusLine=t.wrapStatusLine=t.isWrapped=t.statusLineSupported=t.statusLineScriptPath=t.innerConfigPath=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(7025),l=i(1786);function c(){return r.join((0,d.runtimeRoot)(),"statusline-inner.json")}function u(){return r.join(__dirname,"..","hooks","agentdeck-statusline.mjs")}function p(e){var t;const i=null==e?void 0:e.statusLine;return!!i&&"command"===i.type&&String(null!==(t=i.command)&&void 0!==t?t:"").includes("agentdeck-statusline")}function h(e,t){const i={...null!=e?e:{}},n=i.statusLine,o=p(i)?null:null!=n?n:null;return i.statusLine={type:"command",command:`node "${t.replace(/\\/g,"/")}"`},{next:i,inner:o}}function g(e,t){const i={...null!=e?e:{}};return p(i)?(t?i.statusLine=t:delete i.statusLine,i):i}function f(){try{const e=s.readFileSync((0,l.claudeSettingsPath)(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function m(e){const t=(0,l.claudeSettingsPath)();s.mkdirSync(r.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,t+".agentdeck-backup"),s.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}function v(){try{return JSON.parse(s.readFileSync(c(),"utf8"))}catch{return null}}t.innerConfigPath=c,t.statusLineScriptPath=u,t.statusLineSupported=function(){return s.existsSync(u())},t.isWrapped=p,t.wrapStatusLine=h,t.unwrapStatusLine=g,t.statusLineInstalled=function(){return p(f())},t.innerCommand=function(){var e;const t=v();return"command"===(null==t?void 0:t.type)?String(null!==(e=t.command)&&void 0!==e?e:""):""},t.installStatusLine=function(){const e=u();if(!s.existsSync(e))throw new Error(`statusLine 스크립트를 찾지 못했다: ${e}`);const{next:t,inner:i}=h(f(),e);if(null!==i){const e=c();s.mkdirSync(r.dirname(e),{recursive:!0}),s.writeFileSync(e,JSON.stringify(i,null,2)+"\n","utf8")}m(t)},t.uninstallStatusLine=function(){m(g(f(),v()));try{s.unlinkSync(c())}catch{}}},2348(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.syncStorageEnvironment=t.writeUserStorageEnvironment=void 0;const s=i(5317),r=a(i(857)),d=a(i(6928)),l=["CLAUDE_CONFIG_DIR","CODEX_HOME"];function c(e){return new Promise((t,i)=>{(0,s.execFile)(d.join(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"),["-NoProfile","-NonInteractive","-EncodedCommand",Buffer.from("\n$ErrorActionPreference = 'Stop'\n$values = ConvertFrom-Json $env:AGENTDECK_STORAGE_ENV_PAYLOAD\n$key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')\n$old = @{}\nforeach ($name in @('CLAUDE_CONFIG_DIR','CODEX_HOME')) { $old[$name] = $key.GetValue($name, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) }\ntry {\n foreach ($name in @('CLAUDE_CONFIG_DIR','CODEX_HOME')) {\n $value = $values.$name\n if ($null -eq $value) { $key.DeleteValue($name, $false) }\n else { $key.SetValue($name, [string]$value, [Microsoft.Win32.RegistryValueKind]::String) }\n }\n} catch {\n foreach ($name in $old.Keys) {\n if ($null -eq $old[$name]) { $key.DeleteValue($name, $false) }\n else { $key.SetValue($name, [string]$old[$name]) }\n }\n throw\n} finally { $key.Dispose() }\n$old | ConvertTo-Json -Compress\ntry {\n Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class AgentDeckEnvironmentNotify { [DllImport(\"user32.dll\", CharSet=CharSet.Unicode)] public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, UIntPtr wParam, string lParam, uint flags, uint timeout, out UIntPtr result); }'\n $result = [UIntPtr]::Zero\n [void][AgentDeckEnvironmentNotify]::SendMessageTimeout([IntPtr]0xffff, 0x1a, [UIntPtr]::Zero, 'Environment', 2, 1000, [ref]$result)\n} catch { }\n","utf16le").toString("base64")],{windowsHide:!0,timeout:15e3,env:{...process.env,AGENTDECK_STORAGE_ENV_PAYLOAD:JSON.stringify(e)}},(e,n)=>{if(e)i(new Error("storage.environment"));else try{t(JSON.parse(n.trim()))}catch{i(new Error("storage.environment"))}})})}t.writeUserStorageEnvironment=c,t.syncStorageEnvironment=async function(e){if("win32"!==process.platform)return async()=>{};const t={CLAUDE_CONFIG_DIR:e.claudeStorageDir||null,CODEX_HOME:e.codexStorageDir||null},i=await c(t),n=Object.fromEntries(l.map(e=>[e,process.env[e]]));for(const e of l)process.env[e]=t[e]||d.join(r.homedir(),"CODEX_HOME"===e?".codex":".claude");return async()=>{await c(i);for(const e of l)void 0===n[e]?delete process.env[e]:process.env[e]=n[e]}}},8209(e,t){t.storageText=void 0;const i={head:"Storage locations",intro:"Folder selections and completed edits are saved automatically. Applies after restarting Tabby. Empty fields use the defaults shown below. Existing files are not moved. To keep your accounts and history, close all agent sessions and copy the old folders to the new locations before restarting.",default:"Default",pending:"Unsaved changes — saves when you finish editing or leave this page.",accountStorageDir:"Account data folder",claudeStorageDir:"Claude data folder",codexStorageDir:"Codex data folder",accounts:"Contains the account list and each account’s private sign-in data.",agents:"Contains shared conversations, settings and skills. Generated code and documents stay in the working folder below. Explicit terminal-profile paths take precedence.",save:"Save paths",reset:"Use defaults",saved:"Paths and Windows user environment variables saved. Fully restart Tabby and your agents to apply. Running sessions keep their current folders.",environment:"Could not update the Windows user environment variables. Your input has been kept; retry saving.",environmentRollback:"Saving failed and the environment variables could not be restored. Retry saving before restarting.",absolute:"Enter an absolute folder path.",directory:"The selected path is a file. Choose a folder.",separate:"Use separate, non-nested folders for account, Claude and Codex data.",failed:"Could not save the paths. Your input has been kept. Check disk space and folder access, then retry Save paths.",working:"Changes apply to new tabs. Existing working files are not moved."},n={head:"저장 경로",intro:"폴더를 선택하거나 입력을 마치면 자동 저장됩니다. Tabby를 다시 시작하면 적용됩니다. 빈칸은 표시된 기본 경로를 사용합니다. 기존 파일은 자동 이동하지 않습니다. 계정과 기록을 유지하려면 모든 에이전트 세션을 종료하고 기존 폴더를 새 위치에 복사한 뒤 다시 시작하세요.",default:"기본값",pending:"저장 전 변경사항이 있습니다. 입력을 마치거나 이 화면을 나가면 자동 저장합니다.",accountStorageDir:"계정 데이터 폴더",claudeStorageDir:"Claude 데이터 폴더",codexStorageDir:"Codex 데이터 폴더",accounts:"등록 계정 목록과 계정별 로그인 정보를 저장합니다.",agents:"공유 대화 기록·설정·스킬을 저장합니다. 작성한 코드와 문서는 아래 작업 폴더에 저장됩니다. 터미널 프로필에 직접 지정한 경로가 있으면 그 값을 우선합니다.",save:"경로 저장",reset:"기본값 사용",saved:"경로와 Windows 사용자 환경변수를 저장했습니다. Tabby와 에이전트를 완전히 종료한 뒤 다시 실행하세요. 실행 중인 세션은 현재 폴더를 계속 사용합니다.",environment:"Windows 사용자 환경변수를 저장하지 못했습니다. 입력값은 유지됩니다. 다시 저장하세요.",environmentRollback:"저장 실패 후 환경변수를 복원하지 못했습니다. 다시 시작하기 전에 경로 저장을 재시도하세요.",absolute:"폴더의 절대 경로를 입력하세요.",directory:"파일 경로입니다. 폴더를 선택하세요.",separate:"계정·Claude·Codex 폴더는 서로 겹치거나 포함되지 않는 별도 경로로 지정하세요.",failed:"저장하지 못했습니다. 입력한 경로는 유지했습니다. 디스크 여유 공간과 폴더 권한을 확인한 뒤 경로 저장을 다시 누르세요.",working:"새 탭부터 적용됩니다. 기존 작업 파일은 이동하지 않습니다."};t.storageText=function(e,t){return("ko"===t?n:i)[e.replace(/^storage\./,"")]||e}},7025(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.validateStoragePaths=t.storageEnvironment=t.hasConfiguredAgentHome=t.agentHome=t.runtimeEnvironment=t.runtimeRoot=t.accountsFile=t.storageDefaults=t.configureStoragePaths=t.STORAGE_KEYS=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=i(6982);t.STORAGE_KEYS=["accountStorageDir","claudeStorageDir","codexStorageDir"];const c={accountFile:process.env.AGENTDECK_ACCOUNTS_FILE||d.join(r.homedir(),".agentdeck","accounts.json"),claudeStorageDir:process.env.CLAUDE_CONFIG_DIR||d.join(r.homedir(),".claude"),codexStorageDir:process.env.CODEX_HOME||d.join(r.homedir(),".codex")};let u={accountStorageDir:"",claudeStorageDir:"",codexStorageDir:""};function p(){return{accountStorageDir:d.dirname(c.accountFile),claudeStorageDir:process.env.CLAUDE_CONFIG_DIR||d.join(r.homedir(),".claude"),codexStorageDir:process.env.CODEX_HOME||d.join(r.homedir(),".codex")}}function h(){return u.accountStorageDir?d.join(u.accountStorageDir,"accounts.json"):c.accountFile}function g(){const e=d.join(d.dirname(h()),"runtime"),t=process.env.TABBY_CONFIG_DIRECTORY;return t?d.join(e,(0,l.createHash)("sha256").update(d.resolve(t).toLowerCase()).digest("hex").slice(0,16)):e}t.configureStoragePaths=function(e){u=Object.fromEntries(t.STORAGE_KEYS.map(t=>[t,String(e[t]||"").trim()]))},t.storageDefaults=p,t.accountsFile=h,t.runtimeRoot=g,t.runtimeEnvironment=function(){return{AGENTDECK_RUNTIME_ROOT:g(),AGENTDECK_MAILBOX_ROOT:d.join(g(),"mailbox")}},t.agentHome=function(e){const t="claude"===e?"claudeStorageDir":"codexStorageDir";return u[t]||p()[t]},t.hasConfiguredAgentHome=function(e){return!!u["claude"===e?"claudeStorageDir":"codexStorageDir"]},t.storageEnvironment=function(e={}){return{...u.claudeStorageDir?{CLAUDE_CONFIG_DIR:u.claudeStorageDir}:{},...u.codexStorageDir?{CODEX_HOME:u.codexStorageDir}:{},...e}},t.validateStoragePaths=function(e){const i={};for(const n of t.STORAGE_KEYS){const t=String(e[n]||"").trim();if(t&&(!d.isAbsolute(t)||/[\x00-\x1f]/.test(t)))throw new Error("storage.absolute");if(t){if("win32"===process.platform&&/[<>"|?*]/.test(t))throw new Error("storage.absolute");let e=t;for(;!s.existsSync(e)&&d.dirname(e)!==e;)e=d.dirname(e);if(s.existsSync(e)&&!s.statSync(e).isDirectory())throw new Error("storage.directory")}i[n]=t?d.normalize(t):""}const n=p(),o=t.STORAGE_KEYS.map(e=>d.resolve(i[e]||n[e]));for(let e=0;e<o.length;e++)for(let t=e+1;t<o.length;t++){const i=d.relative(o[e],o[t]),n=d.relative(o[t],o[e]),a=e=>!e||!e.startsWith(".."+d.sep)&&".."!==e&&!d.isAbsolute(e);if(a(i)||a(n))throw new Error("storage.separate")}return i}},1584(e,t,i){t.storageSettingsFor=void 0;const n=i(7025),o=i(2348);class a{constructor(e,t=o.syncStorageEnvironment){this.config=e,this.syncEnvironment=t,this.message="",this.error=!1,this.busy=!1,this.revision=0,this.queuedRevision=-1,this.pending=0,this.queue=Promise.resolve(),this.draft=this.savedPaths()}savedPaths(){return Object.fromEntries(n.STORAGE_KEYS.map(e=>[e,this.config.store.agentDeck[e]||""]))}change(e,t){this.draft[e]=t,this.revision++,this.error=!1,this.message="pending"}save(){if(this.queuedRevision===this.revision&&this.pending)return this.queue;const e=this.revision,t={...this.draft};return this.queuedRevision=e,this.pending++,this.busy=!0,this.queue=this.queue.then(async()=>{const i=this.savedPaths();let o;try{const i=(0,n.validateStoragePaths)(t);o=await this.syncEnvironment(i),Object.assign(this.config.store.agentDeck,i),await this.config.save(),this.revision===e&&(this.draft=i,this.error=!1,this.message="saved")}catch(t){if(Object.assign(this.config.store.agentDeck,i),o)try{await o()}catch{t=new Error("storage.environmentRollback")}this.revision===e&&(this.error=!0,this.message=String((null==t?void 0:t.message)||"").startsWith("storage.")?t.message:"failed")}finally{this.pending--,this.busy=this.pending>0}}),this.queue}flush(){"pending"===this.message&&this.save()}}const s=new WeakMap;t.storageSettingsFor=function(e){let t=s.get(e);return t||(t=new a(e),s.set(e,t)),t}},7507(e,t){t.matchesSessionTranscript=t.formatLiveAgentTooltip=t.summarizeLiveAgents=t.formatSubagentTooltip=t.summarizeSubagents=t.feedChunk=t.createSubagentState=t.oq=void 0,t.oq=["Agent","Task"];const i="<task-notification>",n=/<tool-use-id>([^<]*)<\/tool-use-id>/,o=/<status>([^<]*)<\/status>/,a=/^[A-Za-z0-9_-]{4,200}$/,s=["running","pending","in_progress","in-progress","started","queued"];function r(e,t){let r=0;for(;;){const d=t.indexOf(i,r);if(d<0)return;const l=d+19,c=t.indexOf("</task-notification>",l),u=c<0?t.slice(l):t.slice(l,c);r=c<0?t.length:c+20;const p=n.exec(u);if(!p)continue;const h=p[1].trim();if(!a.test(h))continue;const g=o.exec(u);g&&s.indexOf(g[1].trim().toLowerCase())>=0||e.done.add(h)}}function d(e){if(e.indexOf("tool_use")<0)return!1;for(const i of t.oq)if(e.indexOf(i)>=0)return!0;return!1}function l(e,i){var n,o;let s;try{s=JSON.parse(i)}catch{return void e.skipped++}if(!s||"object"!=typeof s||!0===s.isSidechain)return;const r=null===(n=s.message)||void 0===n?void 0:n.content;if(Array.isArray(r))for(const i of r){if(!i||"object"!=typeof i)continue;if("tool_use"!==i.type||t.oq.indexOf(String(i.name))<0)continue;const n=String(null!==(o=i.id)&&void 0!==o?o:"").trim();if(!a.test(n)||e.calls.has(n))continue;const r=i.input&&"object"==typeof i.input?i.input:{},d="string"==typeof r.description?r.description.trim():"",l="string"==typeof r.subagent_type&&r.subagent_type.trim()?r.subagent_type.trim():null,c="string"==typeof s.timestamp&&s.timestamp?s.timestamp:null;e.calls.set(n,{id:n,description:d,subagentType:l,startedAt:c})}}t.createSubagentState=function(){return{calls:new Map,done:new Set,pending:"",lines:0,skipped:0,dropped:0}},t.feedChunk=function(e,t){var n;const o="string"==typeof t?t:"";if(!o)return e;const a=(e.pending+o).split("\n");return e.pending=null!==(n=a.pop())&&void 0!==n?n:"",e.pending.length>4194304&&(e.dropped++,e.pending=""),function(e,t){for(const n of null!=t?t:[]){if("string"!=typeof n)continue;e.lines++;const t=13===n.charCodeAt(n.length-1)?n.slice(0,-1):n;t&&(t.indexOf(i)>=0&&r(e,t),d(t)&&l(e,t))}return e}(e,a)},t.summarizeSubagents=function(e){const t=e;if(!(t&&t.calls instanceof Map))return{running:0,items:[],calls:0,done:0};const i=[];for(const e of t.calls.values())t.done.has(e.id)||i.push(e);return{running:i.length,items:i,calls:t.calls.size,done:t.done.size}},t.formatSubagentTooltip=function(e,t=8){var i;const n=null!==(i=null==e?void 0:e.items)&&void 0!==i?i:[];if(!n.length)return"";const o=Number.isFinite(t)&&t>0?Math.floor(t):n.length,a="서브에이전트 "+n.length+"개 진행중",s=n.slice(0,o).map(e=>{return"· "+((t=e).description||t.subagentType||"(설명 없음)");var t});return n.length>o&&s.push("· … 외 "+(n.length-o)+"개"),[a,...s].join("\n")},t.summarizeLiveAgents=function(e){var t;const i=new Map;let n=0,o=0;for(const a of null!=e?e:[]){if(!a||!a.id)continue;n++;const e=a.type||"이름 없음";i.set(e,(null!==(t=i.get(e))&&void 0!==t?t:0)+1),Number.isFinite(a.at)&&a.at>0&&(!o||a.at<o)&&(o=a.at)}return{running:n,byType:[...i].map(([e,t])=>({type:e,count:t})).sort((e,t)=>t.count-e.count||e.type.localeCompare(t.type)),oldestAt:o}},t.formatLiveAgentTooltip=function(e){const t=e;return!t||t.running<=0?"":["서브에이전트 "+t.running+"개 진행중",...t.byType.map(e=>"· "+e.type+" "+e.count+"개")].join("\n")},t.matchesSessionTranscript=function(e,t){const i=String(null!=e?e:"").trim().toLowerCase(),n=String(null!=t?t:"").trim().toLowerCase();return!!(i&&n&&a.test(n))&&i===n+".jsonl"}},673(e,t){t.SynchronizedOutputStream=void 0,t.SynchronizedOutputStream=class{constructor(){this.pending=""}write(e,t){if(this.pending+=e,!t||this.pending.length>1048576)return this.flush();const i="[?2026h";if(this.pending.lastIndexOf(i)>this.pending.lastIndexOf("[?2026l"))return"";for(let e=1;e<8;e++)if(this.pending.endsWith(i.slice(0,e)))return"";return this.flush()}get waiting(){return!!this.pending}flush(){const e=this.pending;return this.pending="",e}}},9888(e,t){t.pickTabByTabId=t.newTabId=t.TAB_ENV=void 0,t.TAB_ENV="AGENTDECK_TAB",t.newTabId=function(){const e=new Uint8Array(6),t=globalThis.crypto;if(t&&"function"==typeof t.getRandomValues)t.getRandomValues(e);else for(let t=0;t<e.length;t++)e[t]=Math.floor(256*Math.random());return Array.from(e,e=>e.toString(16).padStart(2,"0")).join("")},t.pickTabByTabId=function(e,t){const i="string"==typeof e?e.trim():"";if(!i)return null;for(const[e,n]of t)if(n.includes(i))return e;return null}},568(e,t){t.canRepairComposer=t.newlineSequence=void 0,t.newlineSequence=function(e){return"codex"===e?"\r":"\n"},t.canRepairComposer=function(e){return"claude"===e}},9610(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckUpdateService=void 0;const d=i(860),l=i(7650),c=i(5317),u=s(i(9896)),p=s(i(8611)),h=s(i(5692)),g=s(i(857)),f=s(i(6928)),m=i(7797),v=i(8450),b=i(2023);let k=class{constructor(e,t,i,n,o){this.app=e,this.config=t,this.platform=i,this.notifications=n,this.reloader=o,this.pending=null,this.notifiedVersions=new Set,this.initialized=!1}init(){this.app.ready$.subscribe(()=>{var e;if(this.initialized)return;this.initialized=!0;const t=globalThis;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.update={run:(e=!0)=>this.run("diag",e),installAndReload:(e,t)=>this.installAndReload((0,m.pluginVersion)(),e,t),installedVersion:()=>this.installedVersion(),marks:()=>this.installMarks(),canSelfUpdate:()=>(0,b.canSelfUpdate)(this.installMarks()),pluginsDir:()=>this.pluginsDir(),version:()=>(0,m.pluginVersion)()},this.run("startup")})}run(e,t=!1){return this.pending||(this.pending=Promise.resolve().then(()=>this.check(e,t)).finally(()=>{this.pending=null})),this.pending}async check(e,t){const i=this.config.store.agentDeck,n=(0,m.pluginVersion)(),o=this.installMarks(),a=!(0,b.canSelfUpdate)(o);if(!1===i.autoUpdate)return(0,m.diag)(`update skip=disabled reason=${e}`),"disabled";let s=null;try{s=(0,b.parseLatestVersion)(await this.fetch((0,b.latestUrl)(i.updateRegistry)))}catch(e){(0,m.diagCatch)("update 레지스트리 조회",e)}null!==s&&(i.lastUpdateCheck=Date.now(),this.config.save());const r=(0,b.decide)({enabled:!0,lastCheckAt:0,now:Date.now(),intervalHours:0,devInstall:a,current:n,latest:s});if((0,m.diag)(`update check=${e} current=${n} latest=${null!=s?s:"?"} outcome=${r} dev=${a} marks=${JSON.stringify(o)}`),("dev-install"===r||"update-ready"===r)&&!t&&this.notifiedVersions.has(s))return"skipped";if("dev-install"===r)return this.notifiedVersions.add(s),this.notifications.info(`AgentDeck ${s} 가 나왔다 (지금 ${n})`,"개발 설치(소스 링크)라 자동으로 갈아끼우지 않는다. 소스에서 직접 올릴 것."),r;if("update-ready"!==r)return r;if(!t&&i.updateSkipVersion===s)return(0,m.diag)(`update skip=asked-not-to version=${s}`),"skipped";this.notifiedVersions.add(s);const d=await this.confirmAndInstall(n,s);return"failed"===d&&this.notifiedVersions.delete(s),d}async confirmAndInstall(e,t){const i=await this.platform.showMessageBox({type:"warning",message:`AgentDeck ${t} 로 업데이트할까요? (지금 ${e})`,detail:["누르면 이렇게 됩니다:"," 1. 백그라운드에서 새 버전을 내려받아 설치합니다"," 2. 창을 한 번 새로 고쳐 새 버전으로 갈아탑니다 (몇 초)","","열린 탭과 돌고 있는 세션은 그대로 유지됩니다 — Tabby 는 닫히지 않습니다."].join("\n"),buttons:["지금 업데이트","나중에","다시 묻지 않기"],defaultId:0,cancelId:1});return 2===i.response?(this.config.store.agentDeck.updateSkipVersion=t,this.config.save(),(0,m.diag)(`update skip-version=${t}`),"skipped"):0!==i.response?"postponed":this.installAndReload(e,t)}async installAndReload(e,t,i){var n;this.notifications.info(`AgentDeck ${t} 를 설치하는 중…`,"끝나면 창을 한 번 새로 고친다");let o=null;try{o=await this.runUpdater(t,i)}catch(e){return(0,m.diagCatch)("update 설치 스크립트 기동",e),this.notifications.error("업데이트를 시작하지 못했다",`${null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e} — 설정 → 플러그인 에서 직접 업데이트할 수 있다.`),"failed"}const a=this.installedVersion();if(!(0,b.installSucceeded)(t,a))return(0,m.diag)(`update install failed exit=${o} onDisk=${null!=a?a:"?"} want=${t}`),this.notifications.error(`AgentDeck ${t} 설치에 실패했다`,`지금도 ${null!=a?a:e} 다 — %LOCALAPPDATA%\\tabby-agentdeck\\update.log 에 npm 출력이 남는다.`),"failed";(0,m.diag)(`update installed ${e} -> ${t}, reloading`);let s=!1;try{s=await this.reloader.reload(`update:${t}`)}catch(e){(0,m.diagCatch)("update 리로드",e)}return s?"installing":((0,m.diag)(`update reload skipped ${t} — 다음 기동에 적용`),this.notifications.info(`AgentDeck ${t} 설치 완료`,"Tabby 를 다시 켜면 적용된다 (창을 새로 고치지 못했다)."),"installed")}runUpdater(e,t){const i=f.join(__dirname,"..","updater","agentdeck-update.ps1");if(!u.existsSync(i))throw new Error(`설치 스크립트를 찾지 못했다: ${i}`);const n=u.mkdtempSync(f.join(g.tmpdir(),"agentdeck-up-")),o=f.join(n,"agentdeck-update.ps1");u.copyFileSync(i,o);const a=this.pluginsDir();if(!a)throw new Error("Tabby 플러그인 폴더를 찾지 못했다");const s=["-NoProfile","-ExecutionPolicy","Bypass","-WindowStyle","Hidden","-File",o,"-Version",e,"-PluginsDir",a,"-TabbyExe",process.execPath,"-InPlace"];t&&s.push("-Spec",t);const r=(0,c.spawn)("powershell.exe",s,{stdio:"ignore"});return(0,m.diag)(`update updater spawned pid=${r.pid} script=${o}`),new Promise((e,t)=>{const i=setTimeout(()=>{r.kill(),t(new Error("설치가 시간 안에 끝나지 않았다"))},3e5);r.on("error",e=>{clearTimeout(i),t(e)}),r.on("exit",t=>{clearTimeout(i),(0,m.diag)(`update updater exit=${t}`),e(t)})})}installedVersion(){var e;try{const t=this.pluginsDir();if(!t)return null;const i=f.join(t,"node_modules",b.PACKAGE_NAME,"package.json");return null!==(e=JSON.parse(u.readFileSync(i,"utf8")).version)&&void 0!==e?e:null}catch{return null}}pluginsDir(){var e,t;try{const i=null===(t=(e=this.platform).getConfigPath)||void 0===t?void 0:t.call(e);return i?f.join(f.dirname(i),"plugins"):null}catch{return null}}installMarks(){const e=f.join(__dirname,".."),t=t=>{try{return u.existsSync(f.join(e,t))}catch{return!1}};return{hasSrc:t("src"),hasGit:t(".git"),hasWebpackConfig:t("webpack.config.js"),isLink:this.pluginEntryIsLink()}}pluginEntryIsLink(){try{const e=this.pluginsDir();return!!e&&u.lstatSync(f.join(e,"node_modules",b.PACKAGE_NAME)).isSymbolicLink()}catch{return!1}}fetch(e){return new Promise((t,i)=>{const n=(e.startsWith("http://")?p:h).get(e,{headers:{accept:"application/json"}},e=>{if(200!==e.statusCode)return e.resume(),void i(new Error(`HTTP ${e.statusCode}`));let o="";e.setEncoding("utf8"),e.on("data",e=>{o+=e,o.length>524288&&n.destroy(new Error("응답이 너무 크다"))}),e.on("end",()=>t(o))});n.setTimeout(6e3,()=>n.destroy(new Error("시간 초과"))),n.on("error",i)})}};k=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.AppService,l.ConfigService,l.PlatformService,l.NotificationsService,v.AgentDeckReloadService])],k),t.AgentDeckUpdateService=k},2023(e,t){function i(e){var t;if("string"!=typeof e)return null;const i=/^\s*v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?\s*$/.exec(e);return i?{nums:[Number(i[1]),Number(i[2]),Number(i[3])],pre:null!==(t=i[4])&&void 0!==t?t:null}:null}function n(e,t){const n=i(e),o=i(t);if(!n||!o)return null;for(let e=0;e<3;e++)if(n.nums[e]!==o.nums[e])return n.nums[e]<o.nums[e]?-1:1;if(n.pre===o.pre)return 0;if(null===n.pre)return 1;if(null===o.pre)return-1;const a=n.pre.split("."),s=o.pre.split(".");for(let e=0;e<Math.max(a.length,s.length);e++){const t=a[e],i=s[e];if(void 0===t)return-1;if(void 0===i)return 1;const n=/^\d+$/.test(t),o=/^\d+$/.test(i);if(n&&o){if(Number(t)!==Number(i))return Number(t)<Number(i)?-1:1}else if(t!==i)return t<i?-1:1}return 0}t.decide=t.installSucceeded=t.canSelfUpdate=t.latestUrl=t.parseLatestVersion=t.PACKAGE_NAME=t.sx=void 0,t.sx="https://registry.npmjs.org",t.PACKAGE_NAME="tabby-agentdeck",t.parseLatestVersion=function(e){var t;try{const n=null===(t=JSON.parse(e))||void 0===t?void 0:t.version;return i(n)?String(n).trim():null}catch{return null}},t.latestUrl=function(e,i=t.PACKAGE_NAME){return`${(e||t.sx).replace(/\/+$/,"")}/${encodeURIComponent(i)}/latest`},t.canSelfUpdate=function(e){return!(e.hasSrc||e.hasGit||e.hasWebpackConfig||e.isLink)},t.installSucceeded=function(e,t){return 0===n(t,e)},t.decide=function(e){return e.enabled?function(e,t,i){const n=Number(e)||0;return n>t||t-n>=36e5*Math.max(0,Number(i)||0)}(e.lastCheckAt,e.now,e.intervalHours)?null===e.latest?"unknown":(t=e.current,i=e.latest,-1===n(t,i)?e.devInstall?"dev-install":"update-ready":"up-to-date"):"too-soon":"disabled";var t,i}},3097(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ViewPanel=t.MIN_VIEW_W=t.VIEW_ID=void 0;const s=i(5317),r=a(i(9896)),d=a(i(6928)),l=i(8347),c=i(7604),u=i(7859),p=i(1933);t.VIEW_ID="agentdeck-view",t.MIN_VIEW_W=260;const h=15e5,g=h,f={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif",svg:"image/svg+xml"};function m(e){var t;const i=null!==(t=String(null!=e?e:"").split("\n").map(e=>e.trim()).filter(e=>e)[0])&&void 0!==t?t:"";return i.length>200?i.slice(0,200)+"…":i}function v(e){try{const t=r.statSync(e);if(t.isDirectory())return"폴더";const i=new Date(t.mtimeMs),n=String(i.getHours()).padStart(2,"0"),o=String(i.getMinutes()).padStart(2,"0");return(0,c.formatBytes)(t.size)+" · "+n+":"+o}catch{return"지금은 없다"}}function b(e,t){try{const i=r.statSync(e);return!i.isFile()||i.size>t?null:"data:"+function(e){var t;return null!==(t=f[d.extname(e).slice(1).toLowerCase()])&&void 0!==t?t:"application/octet-stream"}(e)+";base64,"+r.readFileSync(e).toString("base64")}catch{return null}}function k(e,t){const i=r.readFileSync(e),n=i.length>t;let o=i.slice(0,n?t:i.length).toString("utf8");return 65279===o.charCodeAt(0)&&(o=o.slice(1)),{text:o,truncated:n}}function y(e){try{return r.accessSync(e,r.constants.W_OK),!0}catch{return!1}}t.ViewPanel=class{constructor(e){this.host=e,this.el=null,this.bodyEl=null,this.tabsEl=null,this.titleEl=null,this.footEl=null,this.pathRow=null,this.pathInput=null,this.modesEl=null,this.scopeBtn=null,this.diffScope="session",this.diffHidden=0,this.diffDebug=null,this.commitEl=null,this.commitInput=null,this.commitBtn=null,this.commitSumEl=null,this.commitNoteEl=null,this.refNoteEl=null,this.refSel=null,this.refLastSent=null,this.refFlashTimer=null,this.mode="file",this.diffSeq=0,this.diffAutoAt=0,this.diffRoot=null,this.statusEntries=[],this.statusByPath=new Map,this.commitArmed=!1,this.gitBusy=!1,this.opened=!1,this.visible=!0,this.current=null,this.watching=null,this.recent=new WeakMap,this.lastViewed=new WeakMap,this.activeTab=null,this.editing=!1,this.editArea=null,this.editBarEl=null,this.editNoteEl=null,this.editSaveBtn=null,this.editOrigin=null,this.editForceArmed=!1,this.pathCreateArmed=null,this.editStale=!1,this.editOverwriteArmed=!1,this.findRow=null,this.findInput=null,this.findCountEl=null,this.findHits=[],this.findIndex=-1,this.buffers=new WeakMap,this.scrapeTimers=new WeakMap,this.resizing=!1}get isOpen(){return this.opened}extent(e){if(!this.opened||!this.visible)return 0;const i=this.host.getWidth()||420;return Math.min(Math.max(i,t.MIN_VIEW_W),Math.max(e,t.MIN_VIEW_W))}setOpen(e,t=!0){this.opened!==e&&(this.opened=e,this.syncDisplay(),t&&this.host.setOpen(e),e?(this.renderTabs(),"diff"===this.mode?this.refreshDiff():this.applyTabFile()||(this.current?(this.watch(this.current),this.renderCurrent()):this.renderEmpty())):(this.unwatch(),this.disarmCommit()),this.host.relayout())}toggle(){this.setOpen(!this.opened)}setVisible(e){this.visible!==e&&(this.visible=e,this.syncDisplay(),e||this.unwatch())}syncDisplay(){this.el&&(this.el.style.display=this.opened&&this.visible?"flex":"none")}install(){const e=document.createElement("div");e.id=t.VIEW_ID,e.style.display=this.opened?"flex":"none",e.innerHTML=['<div class="ad-view-head">',' <span class="ad-view-title">미리보기</span>',' <span class="ad-view-tools">',' <button class="ad-view-btn ad-view-findbtn" title="찾기 (Ctrl+F)">🔍</button>',' <button class="ad-view-btn ad-view-editbtn" title="편집 (저장 Ctrl+S)">✎</button>',' <button class="ad-view-btn ad-view-pathbtn" title="경로로 열기">+</button>',' <button class="ad-view-btn ad-view-reload" title="다시 읽기">⟳</button>',' <button class="ad-view-btn ad-view-close" title="패널 닫기">✕</button>'," </span>","</div>",'<div class="ad-view-path" style="display:none">',' <input type="text" spellcheck="false" placeholder="D:/Project/... 또는 상대경로">',' <span class="ad-view-path-note"></span>',"</div>",'<div class="ad-view-modes">',' <button class="ad-view-mode ad-view-mode-on" data-ad-mode="file">파일</button>',' <button class="ad-view-mode" data-ad-mode="diff">변경</button>',' <button class="ad-view-scope" style="display:none" title="변경 목록의 범위">세션</button>',"</div>",'<div class="ad-view-find" style="display:none">',' <input type="text" class="ad-view-find-input" spellcheck="false" placeholder="찾기">',' <span class="ad-view-find-count"></span>',' <button class="ad-view-btn ad-view-find-prev" title="이전 (Shift+Enter)">‹</button>',' <button class="ad-view-btn ad-view-find-next" title="다음 (Enter)">›</button>',' <button class="ad-view-btn ad-view-find-close" title="닫기 (Esc)">✕</button>',"</div>",'<div class="ad-view-tabs"></div>','<div class="ad-view-body" tabindex="0"></div>','<div class="ad-view-editbar" style="display:none">',' <span class="ad-view-edit-note"></span>',' <span class="ad-view-edit-btns">',' <button class="ad-view-edit-save">저장</button>',' <button class="ad-view-edit-cancel">취소</button>'," </span>","</div>",'<div class="ad-view-ref" style="display:none"></div>','<div class="ad-view-commit" style="display:none">',' <div class="ad-view-commit-sum"></div>',' <div class="ad-view-commit-row">',' <input type="text" class="ad-view-commit-msg" spellcheck="false" placeholder="커밋 메시지">',' <button class="ad-view-commit-go" disabled>커밋</button>'," </div>",' <div class="ad-view-commit-note"></div>',"</div>",'<div class="ad-view-foot"></div>','<div class="ad-view-resize"></div>'].join("\n"),this.host.windowEl.appendChild(e),this.el=e,this.bodyEl=e.querySelector(".ad-view-body"),this.tabsEl=e.querySelector(".ad-view-tabs"),this.titleEl=e.querySelector(".ad-view-title"),this.footEl=e.querySelector(".ad-view-foot"),this.pathRow=e.querySelector(".ad-view-path"),this.pathInput=e.querySelector(".ad-view-path input"),this.modesEl=e.querySelector(".ad-view-modes"),this.commitEl=e.querySelector(".ad-view-commit"),this.commitInput=e.querySelector(".ad-view-commit-msg"),this.commitBtn=e.querySelector(".ad-view-commit-go"),this.commitSumEl=e.querySelector(".ad-view-commit-sum"),this.commitNoteEl=e.querySelector(".ad-view-commit-note"),this.refNoteEl=e.querySelector(".ad-view-ref"),this.editBarEl=e.querySelector(".ad-view-editbar"),this.editNoteEl=e.querySelector(".ad-view-edit-note"),this.editSaveBtn=e.querySelector(".ad-view-edit-save"),this.findRow=e.querySelector(".ad-view-find"),this.findInput=e.querySelector(".ad-view-find-input"),this.findCountEl=e.querySelector(".ad-view-find-count"),this.scopeBtn=e.querySelector(".ad-view-scope"),this.modesEl.addEventListener("click",e=>{var t,i;const n=null===(i=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===i?void 0:i.call(t,"[data-ad-mode]");n&&this.setMode("diff"===n.getAttribute("data-ad-mode")?"diff":"file")}),this.scopeBtn.addEventListener("click",()=>this.toggleScope()),this.applyScopeLabel(),e.querySelector(".ad-view-close").addEventListener("click",()=>this.setOpen(!1)),e.querySelector(".ad-view-reload").addEventListener("click",()=>this.reload()),e.querySelector(".ad-view-pathbtn").addEventListener("click",()=>this.togglePathRow()),e.querySelector(".ad-view-editbtn").addEventListener("click",()=>this.toggleEdit()),e.querySelector(".ad-view-findbtn").addEventListener("click",()=>this.openFind()),e.querySelector(".ad-view-edit-save").addEventListener("click",()=>this.saveEdit()),e.querySelector(".ad-view-edit-cancel").addEventListener("click",()=>this.cancelEdit()),e.querySelector(".ad-view-find-next").addEventListener("click",()=>this.stepFind(1)),e.querySelector(".ad-view-find-prev").addEventListener("click",()=>this.stepFind(-1)),e.querySelector(".ad-view-find-close").addEventListener("click",()=>this.closeFind()),this.findInput.addEventListener("input",()=>this.runFind()),this.findInput.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key?(e.preventDefault(),this.stepFind(e.shiftKey?-1:1)):"Escape"===e.key&&(e.preventDefault(),this.closeFind())}),e.addEventListener("keydown",e=>{const t=e.ctrlKey||e.metaKey;!t||"f"!==e.key&&"F"!==e.key?!t||"s"!==e.key&&"S"!==e.key?"Escape"===e.key&&this.editing&&e.target===this.editArea&&(e.preventDefault(),e.stopPropagation(),this.cancelEdit()):this.editing&&(e.preventDefault(),e.stopPropagation(),this.saveEdit()):(e.preventDefault(),e.stopPropagation(),this.openFind())}),this.pathInput.addEventListener("keydown",e=>{if(e.stopPropagation(),"Enter"===e.key){const e=this.pathInput.value.trim();e&&this.openOrCreate(e)}else"Escape"===e.key&&this.togglePathRow(!1)}),this.commitInput.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key?this.pressCommit():"Escape"===e.key&&(this.disarmCommit(),this.setCommitNote(""))}),this.commitInput.addEventListener("input",()=>{this.disarmCommit()}),this.commitBtn.addEventListener("click",()=>this.pressCommit()),this.bodyEl.addEventListener("click",e=>{var t,i,n;const o=null===(i=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===i?void 0:i.call(t,"[data-ad-link]");if(!o)return;e.preventDefault();const a=null!==(n=o.getAttribute("data-ad-link"))&&void 0!==n?n:"";/^https?:/i.test(a)?this.host.openExternal(a):this.openFile(a.replace(/^file:\/\//,""))}),this.bodyEl.addEventListener("click",e=>{var t,i,n,o,a,s;const r=e.target,d=null===(t=null==r?void 0:r.closest)||void 0===t?void 0:t.call(r,"[data-ad-stage]");if(d)return e.preventDefault(),void this.toggleStage(null!==(i=d.getAttribute("data-ad-stage"))&&void 0!==i?i:"","reset"===d.getAttribute("data-ad-stage-act")?"reset":"add");const l=null===(n=null==r?void 0:r.closest)||void 0===n?void 0:n.call(r,"[data-ad-diff]");if(l){e.preventDefault();const t=document.getElementById(null!==(o=l.getAttribute("data-ad-diff"))&&void 0!==o?o:"");return void(null==t||t.scrollIntoView(!0))}const c=null===(a=null==r?void 0:r.closest)||void 0===a?void 0:a.call(r,"[data-ad-open]");if(c){e.preventDefault();const t=null!==(s=c.getAttribute("data-ad-open"))&&void 0!==s?s:"";t&&this.openFile(t)}}),this.bodyEl.addEventListener("click",e=>{const t=e.target;if(!(null==t?void 0:t.closest))return;if(t.closest("[data-ad-stage],[data-ad-diff],[data-ad-open],[data-ad-link]"))return;const i=t.closest("[data-ad-ref-line],[data-ad-ref-del]");i&&this.clickRefLine(i,e.shiftKey)}),this.installDrop(e),this.installResize(e.querySelector(".ad-view-resize")),this.renderEmpty()}installDrop(e){e.addEventListener("dragover",t=>{t.preventDefault(),e.classList.add("ad-view-dropping")}),e.addEventListener("dragleave",()=>e.classList.remove("ad-view-dropping")),e.addEventListener("drop",t=>{var i,n,o;t.preventDefault(),e.classList.remove("ad-view-dropping");const a=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],s=null===(o=t.dataTransfer)||void 0===o?void 0:o.getData("text/plain"),r=(null==a?void 0:a.path)||s;r&&this.openFile(String(r).trim().replace(/^"|"$/g,""))})}installResize(e){e.addEventListener("mousedown",e=>{var i;e.preventDefault(),e.stopPropagation(),this.resizing=!0,document.body.classList.add("ad-resizing");const n=e.clientX,o=(null===(i=this.el)||void 0===i?void 0:i.getBoundingClientRect().width)||this.host.getWidth(),a=e=>{if(!this.resizing)return;const i="right"===this.host.getSide()?n-e.clientX:e.clientX-n;this.host.setWidth(Math.max(t.MIN_VIEW_W,Math.round(o+i))),this.host.relayout()},s=()=>{this.resizing=!1,document.body.classList.remove("ad-resizing"),window.removeEventListener("mousemove",a),window.removeEventListener("mouseup",s),this.host.commit()};window.addEventListener("mousemove",a),window.addEventListener("mouseup",s)})}layout(e,t){if(!this.el)return;const i=this.el.style;i.position="absolute",i.left=t.left+"px",i.top=t.top+"px",i.right="auto",i.bottom="auto",i.width=t.width+"px",i.height=t.height+"px",this.el.classList.toggle("ad-view-left","left"===e),this.el.classList.toggle("ad-view-right","right"===e)}togglePathRow(e){var t;if(!this.pathRow)return;const i=null!=e?e:"none"===this.pathRow.style.display;this.pathRow.style.display=i?"flex":"none",this.pathCreateArmed=null,this.setPathNote(""),i&&(this.pathInput.value=null!==(t=this.current)&&void 0!==t?t:"",this.pathInput.focus(),this.pathInput.select())}setPathNote(e){var t;const i=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-path-note");i&&(i.textContent=e,i.title=e)}openOrCreate(e){var t,i,n,o;const a=this.current?d.dirname(this.current):null,s=null!==(i=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==i?i:a,l=null!==(n=this.resolve(e,s,!1))&&void 0!==n?n:this.resolve(e,a,!1);if(l)return this.pathCreateArmed=null,this.setPathNote(""),void this.openFile(l);const c=d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e);if(!c&&!s)return void this.setPathNote("상대경로를 풀 작업 폴더를 모른다 — 절대경로로 넣는다");const u=d.normalize(c?e:d.join(s,e));if(/[\\/]$/.test(e))this.setPathNote("폴더 경로다 — 파일 이름까지 넣는다");else{try{if(r.statSync(u).isDirectory())return void this.setPathNote("폴더다 — 파일 이름까지 넣는다")}catch{}if(this.pathCreateArmed!==u)return this.pathCreateArmed=u,void this.setPathNote("없는 파일이다 — Enter 를 한 번 더 치면 새로 만든다");try{r.mkdirSync(d.dirname(u),{recursive:!0}),r.writeFileSync(u,"",{encoding:"utf8",flag:"wx"})}catch(e){return void this.setPathNote("만들지 못했다: "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}this.pathCreateArmed=null,this.setPathNote(""),this.openFile(u),this.startEdit()}}get viewMode(){return this.mode}applyMode(e){if(this.mode=e,this.modesEl)for(const t of Array.from(this.modesEl.querySelectorAll("[data-ad-mode]")))t.classList.toggle("ad-view-mode-on",t.getAttribute("data-ad-mode")===e);"diff"===e?this.togglePathRow(!1):this.disarmCommit(),this.commitEl&&(this.commitEl.style.display="diff"===e?"block":"none"),this.scopeBtn&&(this.scopeBtn.style.display="diff"===e?"":"none"),this.renderTabs()}toggleScope(){this.diffScope="session"===this.diffScope?"all":"session",this.applyScopeLabel(),"diff"===this.mode&&this.opened&&this.refreshDiff()}applyScopeLabel(){if(!this.scopeBtn)return;const e="session"===this.diffScope;this.scopeBtn.textContent=e?"세션":"전체",this.scopeBtn.classList.toggle("ad-view-scope-all",!e),this.scopeBtn.title=e?"이 세션이 만진 파일만 보고 있다 — 누르면 저장소 전체":"저장소의 커밋 안 된 변경 전부를 보고 있다 — 누르면 이 세션이 만진 것만"}setMode(e){if(this.mode===e)return;if(this.editing){if(this.editArea&&this.editOrigin&&this.editArea.value!==this.editOrigin.text)return void this.setEditNote("저장하지 않은 편집이 있다 — 저장하거나 취소한 뒤에 모드를 옮긴다");this.cancelEdit()}this.applyMode(e);const t=this.opened;t||this.setOpen(!0),"diff"===e?t&&this.refreshDiff():this.current?this.renderCurrent():this.renderEmpty()}toggleMode(){this.setMode("diff"===this.mode?"file":"diff")}noteOutput(e,t){var i;const n=((null!==(i=this.buffers.get(e))&&void 0!==i?i:"")+t).slice(-16384);this.buffers.set(e,n),this.scrapeTimers.get(e)||this.scrapeTimers.set(e,setTimeout(()=>{this.scrapeTimers.delete(e),this.scrape(e)},400))}scrape(e){var t,i,n,o,a;const s=null!==(t=this.buffers.get(e))&&void 0!==t?t:"";if(this.buffers.set(e,s.slice(s.lastIndexOf("\n")+1).slice(-256)),!s)return;const r=this.host.cwdFor(e);let d=null,l=!1;for(const t of(0,c.extractPaths)(s)){const s=this.resolve(t,r);if(!s)continue;const u=null!==(i=this.recent.get(e))&&void 0!==i?i:[];if((0,c.isInstructionFile)(s)&&!u.includes(s)&&!(null!==(a=null===(o=(n=this.host).touchedFor)||void 0===o?void 0:o.call(n,e))&&void 0!==a?a:[]).some(e=>this.resolve(e,r)===s))continue;if(u[0]===s)continue;const p=u.includes(s);this.recent.set(e,(0,c.pushRecent)(u,s,this.host.getRecentMax())),l=!0,!p&&(0,c.isAutoFollowable)(s)&&(d=s)}if(!l||e!==this.activeTab)return;this.renderTabs();const u=(0,c.planFollow)(this.host.getFollowMode(),this.opened,this.editing);"none"!==u&&("stage"!==u?"diff"===this.mode?("open"===u&&this.setOpen(!0),this.maybeAutoDiff()):d&&this.openFile(d):d&&this.lastViewed.set(e,d))}resolve(e,t,i=!0){if(i&&!(0,c.isKnownExt)(e))return null;const n=[];d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?n.push(e):t&&n.push(d.join(t,e));for(const e of n)try{if(r.statSync(e).isFile())return d.normalize(e)}catch{}return null}setActiveTab(e){this.activeTab!==e&&(this.activeTab=e,this.pathCreateArmed=null,this.refLastSent=null,this.disarmCommit(),this.opened&&(this.renderTabs(),"diff"===this.mode&&(this.setStatus([]),this.refreshDiff())),this.applyTabFile())}applyTabFile(){var e,t,i;if("file"!==this.mode)return!1;if(this.editing)return this.setEditNote("다른 탭으로 옮겼다 — 저장하거나 취소하면 그 탭 파일로 넘어간다"),!0;const n=this.activeTab,o=n&&null!==(i=null!==(e=this.lastViewed.get(n))&&void 0!==e?e:(null!==(t=this.recent.get(n))&&void 0!==t?t:[])[0])&&void 0!==i?i:null;return o!==this.current&&(this.current=o,this.closeFind(),!!this.opened&&(o?(this.watch(o),this.renderCurrent(),!0):(this.unwatch(),this.renderEmpty(),!0)))}noteFile(e,t){var i;const n=this.resolve(t,this.host.cwdFor(e));n&&(this.recent.set(e,(0,c.pushRecent)(null!==(i=this.recent.get(e))&&void 0!==i?i:[],n,this.host.getRecentMax())),e===this.activeTab&&this.opened&&this.renderTabs())}openFile(e){var t,i,n,o;const a=String(null!=e?e:"").trim();if(!a)return;if(this.editing){if(this.editArea&&this.editOrigin&&this.editArea.value!==this.editOrigin.text)return void this.setEditNote("저장하지 않은 편집이 있다 — 저장하거나 취소한 뒤에 다른 파일을 연다");this.cancelEdit()}const s=this.current?d.dirname(this.current):null,r=null!==(i=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==i?i:s,l=null!==(n=this.resolve(a,r,!1))&&void 0!==n?n:this.resolve(a,s,!1);if(this.applyMode("file"),!l)return this.setOpen(!0),void this.renderMessage("파일을 찾지 못했다",a);this.current=l,this.activeTab&&(this.recent.set(this.activeTab,(0,c.pushRecent)(null!==(o=this.recent.get(this.activeTab))&&void 0!==o?o:[],l,this.host.getRecentMax())),this.lastViewed.set(this.activeTab,l)),this.setOpen(!0),this.togglePathRow(!1),this.watch(l),this.renderTabs(),this.renderCurrent()}reload(){"diff"===this.mode?this.refreshDiff():this.current?this.renderCurrent():this.renderEmpty()}watch(e){if(this.watching!==e){this.unwatch(),this.watching=e;try{r.watchFile(e,{interval:1e3},(t,i)=>{"file"===this.mode&&this.watching===e&&t.mtimeMs!==i.mtimeMs&&this.renderCurrent()})}catch{}}}unwatch(){if(this.watching){try{r.unwatchFile(this.watching)}catch{}this.watching=null}}renderTabs(){var e;if(!this.tabsEl)return;const t=this.activeTab&&null!==(e=this.recent.get(this.activeTab))&&void 0!==e?e:[];this.tabsEl.innerHTML="";for(const e of t){const t=document.createElement("button");t.className="ad-view-tab"+(e===this.current?" ad-view-tab-on":""),t.textContent=d.basename(e),t.title=e,t.addEventListener("click",()=>this.openFile(e)),this.tabsEl.appendChild(t)}this.tabsEl.style.display=t.length&&"file"===this.mode?"flex":"none"}renderEmpty(){this.bodyEl&&(this.setTitle("미리보기",""),this.bodyEl.innerHTML=['<div class="ad-view-empty">'," <p>에이전트가 만진 파일이 여기 쌓인다.</p>"," <ul>"," <li>화면에 찍힌 경로를 자동으로 줍는다 (md · 이미지 · 표 · 코드)</li>"," <li>파일을 이 자리에 끌어다 놓아도 된다</li>"," <li><b>+</b> 를 눌러 경로를 직접 넣을 수 있다</li>"," </ul>","</div>"].join(""),this.setFoot(""))}renderMessage(e,t){this.bodyEl&&(this.setTitle(e,t),this.bodyEl.innerHTML='<div class="ad-view-empty"><p>'+(0,l.escapeHtml)(e)+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(t)+"</p></div>",this.setFoot(""))}setTitle(e,t){this.titleEl&&(this.titleEl.textContent=e,this.titleEl.title=t)}setFoot(e){this.footEl&&(this.footEl.textContent=e,this.footEl.title=e)}setFootNote(e){var t;if(this.footEl){const i=null!==(t=this.footEl.textContent)&&void 0!==t?t:"";this.setFoot(i?e+" · "+i:e)}}renderCurrent(){var e;const t=this.current;if(!t||!this.bodyEl)return;if(this.editing)return this.editStale=!0,void this.refreshEditNote();let i;this.findHits=[],this.findIndex=-1;try{i=r.statSync(t)}catch{return void this.renderMessage("파일이 사라졌다",t)}this.setTitle(d.basename(t),t),this.setFoot((0,c.formatBytes)(i.size)+" · "+new Date(i.mtimeMs).toLocaleString()+" · "+t);try{switch((0,c.classify)(t)){case"image":this.renderImage(t,i);break;case"markdown":this.renderMarkdownFile(t);break;case"table":this.renderTable(t);break;case"text":this.renderText(t);break;default:this.renderBinary(t,i)}}catch(t){this.renderMessage("읽지 못했다",String(null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t))}this.bodyEl.scrollTop=0,this.syncEditButton(),this.findRow&&"none"!==this.findRow.style.display&&this.runFind()}renderImage(e,t){const i=b(e,25e6);i?this.bodyEl.innerHTML='<div class="ad-view-image"><img src="'+i+'" alt=""></div>':this.renderMessage("이미지가 너무 크다",(0,c.formatBytes)(t.size)+" — "+e)}renderMarkdownFile(e){const{text:t,truncated:i}=k(e,h),n=d.dirname(e),o=(0,l.renderMarkdown)(t,{resolveImage:e=>/^https?:/i.test(e)?e:b(d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?e:d.join(n,e),4e6)});this.bodyEl.innerHTML='<div class="ad-view-md">'+o+(i?'<p class="ad-view-dim">… 앞부분만 보여준다 ('+(0,c.formatBytes)(h)+")</p>":"")+"</div>"}renderTable(e){const{text:t,truncated:i}=k(e,h),n=(0,c.parseDelimited)(t,(0,c.delimiterFor)(e));if(!n.length)return void this.renderMessage("빈 파일",e);const o=n[0].slice(0,60),a=n.slice(1,401);this.bodyEl.innerHTML='<div class="ad-view-table"><table><thead><tr><th class="ad-view-rownum">#</th>'+o.map(e=>"<th>"+(0,l.escapeHtml)(e)+"</th>").join("")+"</tr></thead><tbody>"+a.map((e,t)=>'<tr><td class="ad-view-rownum">'+(t+1)+"</td>"+o.map((t,i)=>{return n=e[i],"<td>"+(0,l.escapeHtml)(null!=n?n:"")+"</td>";var n}).join("")+"</tr>").join("")+"</tbody></table>"+(n.length>401||i?'<p class="ad-view-dim">400행까지만 보여준다 (전체 '+(n.length-1)+"행)</p>":"")+"</div>"}renderText(e){const{text:t,truncated:i}=k(e,h),n=t.split("\n"),o=n.slice(0,4e3),a=i||n.length>4e3,s=['<div class="ad-view-code ad-view-code-rows" data-ad-ref-file="'+(0,l.escapeHtml)(e)+'">'];o.forEach((e,t)=>{const i=t+1;s.push('<div class="ad-cl" data-ad-ref-line="'+i+'"><span class="ad-cl-no">'+i+'</span><span class="ad-cl-tx">'+(0,l.escapeHtml)(e)+"</span></div>")}),s.push("</div>"),this.bodyEl.innerHTML=s.join("")+(a?'<p class="ad-view-dim">… 4000줄까지만 보여준다 (전체 '+n.length+"줄)</p>":""),this.applyRefSel()}renderBinary(e,t){this.bodyEl.innerHTML='<div class="ad-view-empty"><p>'+(0,l.escapeHtml)(d.basename(e))+'</p><p class="ad-view-dim">미리보기를 지원하지 않는 형식 · '+(0,c.formatBytes)(t.size)+"</p></div>"}canEdit(){if("file"!==this.mode||!this.current)return!1;const e=(0,c.classify)(this.current);return"text"===e||"markdown"===e||"table"===e}syncEditButton(){var e;const t=null===(e=this.el)||void 0===e?void 0:e.querySelector(".ad-view-editbtn");if(!t)return;const i=this.canEdit();t.classList.toggle("ad-view-btn-on",this.editing),t.style.opacity=i||this.editing?"":"0.35",t.title=this.editing?"보기로 (Esc)":i?"편집 (저장 Ctrl+S)":"편집할 수 없는 형식이다"}toggleEdit(){this.editing?this.cancelEdit():this.startEdit()}startEdit(){var e;if(this.editing||!this.bodyEl)return;const t=this.current;if(!t||!this.canEdit())return void this.setEditNote("이 형식은 편집할 수 없다");let i,n;try{n=r.statSync(t),i=function(e,t){const i=r.readFileSync(e);if(i.length>t)return{text:"",truncated:!0,bom:!1,crlf:!1};let n=i.toString("utf8");const o=65279===n.charCodeAt(0);o&&(n=n.slice(1));const a=n.indexOf("\r\n")>=0;return{text:a?n.replace(/\r\n/g,"\n"):n,truncated:!1,bom:o,crlf:a}}(t,g)}catch(t){return void this.setEditNote("읽지 못했다: "+String(null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t))}if(i.truncated)return this.setEditNote("너무 커서 편집할 수 없다 ("+(0,c.formatBytes)(g)+" 넘음) — 보기 전용"),void this.showEditBar(!0);this.closeFind(),this.editing=!0,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.editOrigin={file:t,text:i.text,bom:i.bom,crlf:i.crlf,mtimeMs:n.mtimeMs,readOnly:!y(t)};const o=document.createElement("textarea");o.className="ad-view-edit",o.spellcheck=!1,o.value=i.text,o.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&("s"===e.key||"S"===e.key||"f"===e.key||"F"===e.key)||"Escape"===e.key||e.stopPropagation()}),o.addEventListener("input",()=>this.refreshEditNote()),this.bodyEl.innerHTML="",this.bodyEl.appendChild(o),this.editArea=o,o.focus(),this.showEditBar(!0),this.refreshEditNote(),this.syncEditButton()}cancelEdit(){this.editing?(this.editing=!1,this.editArea=null,this.editOrigin=null,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.showEditBar(!1),this.syncEditButton(),this.renderCurrent()):this.showEditBar(!1)}saveEdit(){var e,t,i;if(!this.editing||!this.editArea||!this.editOrigin)return;const n=this.editOrigin,o=this.editArea.value;if(o===n.text&&!this.editStale)return void this.setEditNote("바뀐 것이 없다");let a=this.editStale;try{a=a||r.statSync(n.file).mtimeMs!==n.mtimeMs}catch{}if(a&&!this.editOverwriteArmed)return this.editOverwriteArmed=!0,void this.setEditNote("밖에서 바뀐 파일이다 — 다시 누르면 덮어쓴다");const s=n.crlf?o.replace(/\n/g,"\r\n"):o,d=()=>r.writeFileSync(n.file,(n.bom?"\ufeff":"")+s,"utf8");try{d()}catch(o){const a=String(null!==(e=null==o?void 0:o.code)&&void 0!==e?e:"");if("EPERM"!==a&&"EACCES"!==a&&"EROFS"!==a)return void this.setEditNote("저장하지 못했다: "+String(null!==(t=null==o?void 0:o.message)&&void 0!==t?t:o));if(!this.editForceArmed)return this.editForceArmed=!0,void this.setEditNote("읽기 전용이다 (P4 면 p4 edit 먼저) — 다시 누르면 속성을 풀고 저장한다");try{r.chmodSync(n.file,438),d()}catch(e){return void this.setEditNote("저장하지 못했다: "+String(null!==(i=null==e?void 0:e.message)&&void 0!==i?i:e))}}this.editing=!1,this.editArea=null,this.editOrigin=null,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.showEditBar(!1),this.setEditNote(""),this.syncEditButton(),this.renderCurrent(),this.setFootNote("저장했다")}showEditBar(e){var t;this.editBarEl&&(this.editBarEl.style.display=e?"flex":"none");const i=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-edit-btns");i&&(i.style.display=this.editing?"":"none")}setEditNote(e){this.editNoteEl&&(this.editNoteEl.textContent=e),!this.editing&&this.editBarEl&&e&&(this.editBarEl.style.display="flex")}refreshEditNote(){if(!this.editing||!this.editArea||!this.editOrigin)return;const e=this.editArea.value!==this.editOrigin.text;this.editSaveBtn&&(this.editSaveBtn.disabled=!e&&!this.editStale),this.editOverwriteArmed=!1,this.editForceArmed=!1;const t=[];t.push(d.basename(this.editOrigin.file)),this.editOrigin.bom&&t.push("BOM"),t.push(this.editOrigin.crlf?"CRLF":"LF"),this.editOrigin.readOnly&&t.push("읽기 전용"),t.push(e?"고침":"그대로"),this.editStale&&t.push("밖에서 바뀜"),this.setEditNote(t.join(" · "))}openFind(){this.findRow&&this.findInput&&(this.findRow.style.display="flex",this.findInput.focus(),this.findInput.select(),this.runFind())}closeFind(){this.findRow&&(this.findRow.style.display="none"),this.clearFindMarks(),this.findCountEl&&(this.findCountEl.textContent="")}runFind(){var e,t;const i=null!==(t=null===(e=this.findInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"";this.clearFindMarks(),i?this.editing&&this.editArea?this.findInTextarea(i,0):(this.markMatches(i),this.findIndex=this.findHits.length?0:-1,this.showFindHit()):this.findCountEl&&(this.findCountEl.textContent="")}stepFind(e){var t,i;const n=null!==(i=null===(t=this.findInput)||void 0===t?void 0:t.value)&&void 0!==i?i:"";n&&(this.editing&&this.editArea?this.findInTextarea(n,e):(this.findHits.length?this.findIndex=(this.findIndex+e+this.findHits.length)%this.findHits.length:(this.markMatches(n),this.findIndex=this.findHits.length?0:-1),this.showFindHit()))}findInTextarea(e,t){const i=this.editArea,n=i.value.toLowerCase(),o=e.toLowerCase(),a=o?n.split(o).length-1:0;if(!a)return void this.setFindCount(0,0);let s;if(t<0){const e=i.selectionStart-1;s=n.lastIndexOf(o,Math.max(e-1,0)),s<0&&(s=n.lastIndexOf(o))}else{const e=t>0?i.selectionStart+1:i.selectionStart;s=n.indexOf(o,e),s<0&&(s=n.indexOf(o))}if(s<0)return void this.setFindCount(0,0);i.focus(),i.setSelectionRange(s,s+e.length);const r=i.value.slice(0,s).split("\n").length-1,d=Math.max(1,Math.round(i.scrollHeight/Math.max(1,i.value.split("\n").length)));i.scrollTop=Math.max(0,r*d-i.clientHeight/2);const l=n.slice(0,s).split(o).length;this.setFindCount(l,a)}markMatches(e){var t;const i=this.bodyEl;if(!i||!e)return;const n=e.toLowerCase(),o=document.createTreeWalker(i,NodeFilter.SHOW_TEXT),a=[];let s;for(;s=o.nextNode();){const e=s;e.data&&e.data.toLowerCase().indexOf(n)>=0&&a.push(e)}for(const i of a){if(this.findHits.length>=2e3)break;const o=[];let a=i.data,s=0;for(;s++<500;){const t=a.toLowerCase().indexOf(n);if(t<0)break;t>0&&o.push(document.createTextNode(a.slice(0,t)));const i=document.createElement("mark");if(i.className="ad-find-hit",i.textContent=a.slice(t,t+e.length),o.push(i),this.findHits.push(i),a=a.slice(t+e.length),this.findHits.length>=2e3)break}if(!o.length)continue;a&&o.push(document.createTextNode(a));const r=document.createDocumentFragment();o.forEach(e=>r.appendChild(e)),null===(t=i.parentNode)||void 0===t||t.replaceChild(r,i)}}clearFindMarks(){var e;for(const t of this.findHits){const i=t.parentNode;i&&(i.replaceChild(document.createTextNode(null!==(e=t.textContent)&&void 0!==e?e:""),t),i.normalize())}this.findHits=[],this.findIndex=-1}showFindHit(){this.findHits.forEach((e,t)=>e.classList.toggle("ad-find-cur",t===this.findIndex));const e=this.findHits[this.findIndex];e&&e.scrollIntoView({block:"center"}),this.setFindCount(this.findIndex+1,this.findHits.length)}setFindCount(e,t){this.findCountEl&&(this.findCountEl.textContent=t?e+"/"+t:"없음")}runGit(e,t){return new Promise(i=>{var n;try{(0,s.execFile)("git",["--no-pager","-C",e,...t],{encoding:"utf8",maxBuffer:33554432,timeout:5e3,windowsHide:!0},(e,t,n)=>{i({ok:!e,out:String(null!=t?t:""),err:String(n||(null==e?void 0:e.message)||"")})})}catch(e){i({ok:!1,out:"",err:String(null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e)})}})}maybeAutoDiff(){const e=Date.now();e-this.diffAutoAt<1500||(this.diffAutoAt=e,this.refreshDiff())}refreshDiff(){var e;if(!this.bodyEl)return;const t=this.host.cwdFor(null!==(e=this.activeTab)&&void 0!==e?e:{});if(this.setTitle("변경",null!=t?t:""),!t)return this.setStatus([]),void this.renderDiffNote("작업 폴더를 모른다","이 탭의 cwd 를 아직 잡지 못했다 — 터미널에서 명령을 한 번 실행하면 잡힌다");if(!function(e){try{return r.statSync(e).isDirectory()}catch{return!1}}(t))return this.setStatus([]),void this.renderDiffNote("작업 폴더가 폴더가 아니다",t);const i=++this.diffSeq;this.diffAutoAt=Date.now(),this.bodyEl.querySelector(".ad-view-diff")||this.renderDiffNote("변경을 읽고 있다",t),Promise.all([this.runGit(t,["diff","HEAD","--no-color"]),this.runGit(t,["status","--porcelain"]),this.runGit(t,["rev-parse","--show-toplevel"])]).then(async([e,n,o])=>{let a=e.out;if(!e.ok){const n=e.err;if(/not a git repository/i.test(n))return void this.noGit(i,"git 저장소가 아니다",t,"이 폴더는 git 으로 관리되지 않는다 — 무엇이 바뀌었는지(diff)는 비교할 기준이 없다");if(/ENOENT|not recognized|command not found/i.test(n))return void this.noGit(i,"git 을 찾지 못했다","PATH 에 git 이 있어야 변경 내용을 비교할 수 있다","git 이 없어 diff 는 만들 수 없다");if(/ambiguous argument .?HEAD|unknown revision|bad revision/i.test(n)){const e=await this.runGit(t,["diff","--no-color"]);if(a=e.out,!e.ok&&!a)return void this.failDiff(i,"변경을 읽지 못했다",e.err)}else if(!a)return void this.failDiff(i,"변경을 읽지 못했다",n)}const s=(0,u.parseUnifiedDiff)(a),r=n.ok?(0,u.parseUntracked)(n.out):[];this.diffRoot=o.ok&&o.out.trim()||t;const d="session"===this.diffScope?this.touchedNow():[],l=(0,u.filterTouched)(s,e=>e.path,this.diffRoot,d),c=(0,u.filterTouched)(r,e=>e,this.diffRoot,d);this.diffHidden=s.length-l.length+(r.length-c.length),this.diffDebug={root:this.diffRoot,scope:this.diffScope,touched:d.slice(0,5),all:s.length,kept:l.length,sample:s.slice(0,5).map(e=>e.path)},this.finishDiff(i,()=>{this.setStatus(n.ok?(0,p.parseStatus)(n.out):[]),this.renderDiff(l,c,t)})}).catch(e=>{var t;this.failDiff(i,"변경을 읽지 못했다",String(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e))})}touchedNow(){var e,t,i,n;return null!==(n=null===(t=(e=this.host).touchedFor)||void 0===t?void 0:t.call(e,null!==(i=this.activeTab)&&void 0!==i?i:{}))&&void 0!==n?n:[]}finishDiff(e,t){e===this.diffSeq&&"diff"===this.mode&&this.bodyEl&&t()}failDiff(e,t,i){this.finishDiff(e,()=>{this.setStatus([]),this.renderDiffNote(t,i)})}noGit(e,t,i,n){var o;const a=this.touchedNow();if(!a.length)return void this.failDiff(e,t,i);const s=this.host.cwdFor(null!==(o=this.activeTab)&&void 0!==o?o:{});this.diffRoot=null,this.diffHidden=0,this.finishDiff(e,()=>{this.setStatus([]),this.setCommitVisible(!1);const e=['<div class="ad-view-diff">'];e.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)("이 세션이 만진 파일 "+a.length+"개")+"</div>"),e.push('<p class="ad-view-dim">'+(0,l.escapeHtml)(t+" — "+n)+"</p>"),e.push('<div class="ad-view-diff-list">');for(const t of a.slice(0,200)){const i=(0,u.refPathFrom)(t,s);e.push('<div class="ad-view-diff-u" data-ad-open="'+(0,l.escapeHtml)(t)+'">'+(0,l.escapeHtml)(i)+' <span class="ad-view-dim">'+(0,l.escapeHtml)(v(t))+"</span></div>")}a.length>200&&e.push('<p class="ad-view-dim">… 이후 생략</p>'),e.push("</div></div>"),this.bodyEl.innerHTML=e.join(""),this.setFoot(i)})}setCommitVisible(e){this.commitEl&&(this.commitEl.style.display=e&&"diff"===this.mode?"block":"none")}renderDiffNote(e,t){this.bodyEl&&(this.bodyEl.innerHTML='<div class="ad-view-diff"><div class="ad-view-empty"><p>'+(0,l.escapeHtml)(e)+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(t)+"</p></div></div>",this.setFoot(t))}renderDiff(e,t,i){this.setCommitVisible(!0);const n=e.slice(0,200),o=['<div class="ad-view-diff">'],a="session"===this.diffScope&&this.diffHidden>0?" · 이 세션이 만진 것만 ("+this.diffHidden+"개 숨김)":"";if(o.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)((0,u.formatStat)(e)+a)+"</div>"),n.length&&(o.push('<div class="ad-view-diff-list">'),n.forEach((e,t)=>{o.push('<button class="ad-view-diff-item" data-ad-diff="ad-diff-'+t+'"><span class="ad-view-diff-st ad-view-diff-st-'+e.status+'">'+(0,l.escapeHtml)((0,u.statusLabel)(e))+"</span>"+this.stageChipHtml(e.path)+'<span class="ad-view-diff-name">'+(0,l.escapeHtml)(e.path)+'</span><span class="ad-view-diff-num"><b class="ad-plus">+'+e.added+'</b><b class="ad-minus">-'+e.removed+"</b></span></button>")}),e.length>n.length&&o.push('<p class="ad-view-dim">… 이후 생략 (전체 '+e.length+"개 파일)</p>"),o.push("</div>")),t.length){const e=t.slice(0,100);o.push('<div class="ad-view-diff-untracked"><div class="ad-view-diff-sub">추적 안 됨 · '+t.length+"개</div>");for(const t of e){const e=t.endsWith("/")?"":' data-ad-open="'+(0,l.escapeHtml)(this.absOf(t))+'"';o.push('<div class="ad-view-diff-u"'+e+">"+this.stageChipHtml(t)+" "+(0,l.escapeHtml)(t)+"</div>")}t.length>e.length&&o.push('<p class="ad-view-dim">… 이후 생략</p>'),o.push("</div>")}if(!n.length&&!t.length){const e="session"===this.diffScope&&this.diffHidden>0;o.push('<div class="ad-view-empty"><p>'+(e?"이 세션이 만진 파일은 아직 없다":"변경 없음")+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(e?"저장소에는 "+this.diffHidden+"개의 변경이 있다 — `전체` 로 보면 나온다":i)+"</p></div>")}let s=2e4;n.forEach((e,t)=>{o.push('<div class="ad-view-diff-file" id="ad-diff-'+t+'">');const i=e.oldPath?e.oldPath+" → "+e.path:e.path;if(o.push('<div class="ad-view-diff-fhead" data-ad-open="'+(0,l.escapeHtml)(this.absOf(e.path))+'" title="'+(0,l.escapeHtml)(i)+'">'+(0,l.escapeHtml)(i)+"</div>"),e.binary)o.push('<div class="ad-view-diff-note">바이너리 · 내용 비교 없음</div>');else if(e.lines.length){const t=Math.min(e.lines.length,4e3,Math.max(s,0));o.push('<div class="ad-view-diff-lines" data-ad-ref-file="'+(0,l.escapeHtml)(e.path)+'">');for(let i=0;i<t;i++)o.push(this.diffLineHtml(e.lines[i]));o.push("</div>"),s-=t,t<e.lines.length&&o.push('<div class="ad-view-diff-note">… 이후 생략 (전체 '+e.lines.length+"줄)</div>")}else o.push('<div class="ad-view-diff-note">내용 변경 없음</div>');o.push("</div>")}),o.push("</div>"),this.bodyEl.innerHTML=o.join(""),this.applyRefSel(),this.setFoot((0,u.formatStat)(e)+" · "+(new Date).toLocaleTimeString()+" 기준 · "+i)}diffLineHtml(e){var t,i;const n="add"===e.kind?"+":"del"===e.kind?"-":" ",o="hunk"===e.kind?e.text:n+e.text,a=(0,u.refLineNo)(e),s=null===a?' data-ad-ref-del="'+("hunk"===e.kind?"hunk":"del")+'"':' data-ad-ref-line="'+a+'"';return'<div class="ad-dl ad-dl-'+e.kind+'"'+s+'><span class="ad-dl-no">'+(null!==(t=e.oldNo)&&void 0!==t?t:"")+'</span><span class="ad-dl-no">'+(null!==(i=e.newNo)&&void 0!==i?i:"")+'</span><span class="ad-dl-tx">'+(0,l.escapeHtml)(o)+"</span></div>"}absOf(e){const t=this.diffRoot;return t?d.join(t,e):e}clickRefLine(e,t){var i;const n="function"==typeof window.getSelection?window.getSelection():null;if(t){if(n&&!n.isCollapsed)try{n.removeAllRanges()}catch{}}else if(n&&!n.isCollapsed&&String(n))return;const o=e.getAttribute("data-ad-ref-del");if(null!==o)return void this.setRefNote("hunk"===o?"헝크 머리줄은 내용이 아니다 — 아래 줄을 고르면 그 자리를 가리킨다":"삭제된 줄은 지금 파일에 없다 — 옆 문맥줄을 고르면 그 자리를 가리킨다");const a=Number(e.getAttribute("data-ad-ref-line"));if(!Number.isFinite(a)||a<=0)return;const s=e.closest("[data-ad-ref-file]"),r=null!==(i=null==s?void 0:s.getAttribute("data-ad-ref-file"))&&void 0!==i?i:"";if(!r)return void this.setRefNote("어느 파일의 줄인지 몰라 참조를 만들지 못했다");const d=this.refSel,l=t&&d&&d.file===r?d.from:a,c=Math.min(l,a),u=Math.max(l,a);this.refSel={file:r,from:c,to:u},this.applyRefSel(),this.sendRef(r,c,u)}applyRefSel(){if(!this.bodyEl)return;for(const e of Array.from(this.bodyEl.querySelectorAll(".ad-ref-sel")))e.classList.remove("ad-ref-sel");const e=this.refSel;if(e)for(const t of Array.from(this.bodyEl.querySelectorAll("[data-ad-ref-file]")))if(t.getAttribute("data-ad-ref-file")===e.file)for(const i of Array.from(t.querySelectorAll("[data-ad-ref-line]"))){const t=Number(i.getAttribute("data-ad-ref-line"));Number.isFinite(t)&&t>=e.from&&t<=e.to&&i.classList.add("ad-ref-sel")}}sendRef(e,t,i){var n,o;const a=this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{}),s=(0,u.formatLineRef)((0,u.refPathFrom)((0,u.joinRefPath)(this.diffRoot,e),a),t,i);if(!s)return void this.setRefNote("참조를 만들지 못했다 — 경로가 비어 있다");if(!this.host.sendText)return void this.setRefNote("터미널에 넣지 못했다 — 넣을 자리가 배선되지 않았다 · "+s);const r=Date.now(),d=this.refLastSent,l=!!d&&r-d.at<15e3&&s.length>d.text.length&&s.startsWith(d.text)&&'"'!==d.text[0]&&'"'!==s[0],c=l?s.slice(d.text.length):s;let p=!1;try{p=!!this.host.sendText(c)}catch(e){return void this.setRefNote("터미널에 넣지 못했다 · "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}p?(this.refLastSent={text:s,at:r},this.setRefNote("넣었다 · "+s+(l?" (꼬리만)":""),!0)):this.setRefNote("터미널에 넣지 못했다 — 넣을 터미널이 없다 · "+s)}setRefNote(e,t=!1){const i=this.refNoteEl;i&&(i.textContent=e,i.title=e,i.style.display=e?"block":"none",this.refFlashTimer&&(clearTimeout(this.refFlashTimer),this.refFlashTimer=null),i.classList.toggle("ad-view-ref-on",!!e&&t),e&&t&&(this.refFlashTimer=setTimeout(()=>{this.refFlashTimer=null,i.classList.remove("ad-view-ref-on")},2500)))}stageChipHtml(e){const t=this.statusByPath.get(e);if(!t)return"";const i="staged"===t.state?"reset":"add";let n;return n="reset"===i?"누르면 스테이지에서 내린다 — git reset -q -- "+e:"conflict"===t.state?"누르면 충돌 해결로 표시한다 — git add -- "+e:"누르면 스테이지에 올린다 — git add -- "+e,'<span class="ad-view-stage ad-view-stage-'+t.state+'" data-ad-stage="'+(0,l.escapeHtml)(e)+'" data-ad-stage-act="'+i+'" title="'+(0,l.escapeHtml)(n)+'">'+(0,l.escapeHtml)((0,p.stageLabel)(t.state))+"</span>"}setStatus(e){this.statusEntries=e,this.statusByPath=new Map;for(const t of e)this.statusByPath.set(t.path,t);this.commitSumEl&&(this.commitSumEl.textContent=(0,p.formatStageSummary)(e)),this.syncCommitButton()}syncCommitButton(){var e,t;const i=this.commitBtn;i&&(i.disabled=!(0,p.validateMessage)(null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"").ok||this.gitBusy,i.textContent=this.commitArmed?"커밋 확인":"커밋",i.classList.toggle("ad-view-commit-armed",this.commitArmed),i.title=this.commitArmed?"한 번 더 누르면 실제로 커밋한다 (Esc 취소)":"메시지를 넣고 두 번 눌러야 커밋된다 — git commit -m")}setCommitNote(e){this.commitNoteEl&&(this.commitNoteEl.textContent=e,this.commitNoteEl.title=e)}disarmCommit(){this.commitArmed=!1,this.syncCommitButton()}async toggleStage(e,t){var i,n,o;if(!e||this.gitBusy)return;const a=null!==(i=this.diffRoot)&&void 0!==i?i:this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{});if(!a)return void this.setCommitNote("작업 폴더를 몰라 스테이지를 바꾸지 못한다");const s="add"===t?(0,p.stageArgs)([e]):(0,p.unstageArgs)([e]);if(s.length){this.gitBusy=!0,this.disarmCommit();try{let i=await this.runGit(a,s);!i.ok&&"reset"===t&&/ambiguous argument .?HEAD|unknown revision|bad revision|HEAD/i.test(i.err)&&(i=await this.runGit(a,(0,p.unstageFallbackArgs)([e]))),this.setCommitNote(i.ok?("add"===t?"스테이지에 올렸다 · ":"스테이지에서 내렸다 · ")+e:"스테이지를 바꾸지 못했다 · "+(m(i.err)||m(i.out)))}catch(e){this.setCommitNote("스테이지를 바꾸지 못했다 · "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}finally{this.gitBusy=!1,this.syncCommitButton()}this.refreshDiff()}}pressCommit(){var e,t,i;if(this.gitBusy)return;const n=null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"",o=(0,p.validateMessage)(n);return o.ok?(0,p.hasStaged)(this.statusEntries)?this.commitArmed?void this.runCommit(n):(this.commitArmed=!0,this.syncCommitButton(),void this.setCommitNote("다시 누르면 커밋한다 (Esc 취소) · "+(0,p.formatStageSummary)(this.statusEntries))):(this.disarmCommit(),void this.setCommitNote("스테이지에 올린 것이 없다 — 파일 목록의 딱지를 눌러 올려라")):(this.disarmCommit(),void this.setCommitNote(null!==(i=o.reason)&&void 0!==i?i:"커밋 메시지를 확인해야 한다"))}async runCommit(e){var t,i,n;const o=(0,p.commitArgs)(e);if(!o.length)return this.disarmCommit(),void this.setCommitNote("커밋 메시지를 확인해야 한다");const a=null!==(t=this.diffRoot)&&void 0!==t?t:this.host.cwdFor(null!==(i=this.activeTab)&&void 0!==i?i:{});if(!a)return this.disarmCommit(),void this.setCommitNote("작업 폴더를 몰라 커밋하지 못한다");this.gitBusy=!0,this.syncCommitButton();try{const e=await this.runGit(a,o);e.ok?(this.commitInput&&(this.commitInput.value=""),this.setCommitNote("커밋했다 · "+(m(e.out)||m(e.err)))):this.setCommitNote("커밋하지 못했다 · "+(m(e.err)||m(e.out)))}catch(e){this.setCommitNote("커밋하지 못했다 · "+String(null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e))}finally{this.gitBusy=!1,this.commitArmed=!1,this.syncCommitButton()}this.refreshDiff()}dispose(){var e;this.unwatch(),this.refFlashTimer&&(clearTimeout(this.refFlashTimer),this.refFlashTimer=null),null===(e=this.el)||void 0===e||e.remove(),this.el=null,this.refNoteEl=null}}},7604(e,t){t.planFollow=t.migrateFollow=t.followModeOf=t.formatBytes=t.delimiterFor=t.parseDelimited=t.pushRecent=t.isAutoFollowable=t.isInstructionFile=t.extractPaths=t.isKnownExt=t.classify=void 0;const i=["png","jpg","jpeg","gif","webp","bmp","svg","ico","avif"],n=["md","markdown","mdx"],o=["csv","tsv"],a=["txt","log","json","jsonc","yml","yaml","toml","ini","cfg","conf","env","ts","tsx","js","jsx","mjs","cjs","cs","py","rb","go","rs","java","kt","c","h","cpp","hpp","cc","php","lua","sql","sh","bash","zsh","ps1","psm1","bat","cmd","html","htm","xml","svelte","vue","css","scss","sass","less","diff","patch","gitignore","editorconfig","dockerfile","makefile","gradle","proto"],s=new Set([...i,...n,...o,...a]);function r(e){var t;const i=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"",n=i.lastIndexOf(".");return n<=0?i.toLowerCase():i.slice(n+1).toLowerCase()}function d(e){return s.has(r(e))}t.classify=function(e){const t=r(e);return i.includes(t)?"image":n.includes(t)?"markdown":o.includes(t)?"table":a.includes(t)?"text":"binary"},t.isKnownExt=d;const l="[\\w\\u00c0-\\uffff.@+~-]",c=new RegExp("(?:[A-Za-z]:[\\\\/]|\\.{0,2}[\\\\/])?(?:"+l+"+[\\\\/])*"+l+"+\\.[A-Za-z0-9]{1,8}","y"),u=/(?:[A-Za-z]:)?[\w\u00c0-\uffff.@+~\/\\-]+/g,p=/[\u2000-\u206f\u2190-\u2bff\u3000-\u303f\uff00-\uffef]/,h=/[),.;:'"`\]}]+$/;t.extractPaths=function(e){var t;const i=function(e){return String(null!=e?e:"").replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b[@-Z\\-_]/g,"").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"").replace(/[\u2500-\u257f\u2580-\u259f]/g," ")}(e),n=[],o=new Set;let a;for(u.lastIndex=0;null!==(a=u.exec(i));){const e=a[0];if(!e.includes("."))continue;c.lastIndex=0;const s=c.exec(e);if(!s)continue;let r=s[0].replace(h,"");if(!r||p.test(r))continue;const l=i.slice(Math.max(0,a.index-3),a.index);/:\/\/?$/.test(l)||/^https?$/i.test(null!==(t=r.split(/[\\/]/)[0])&&void 0!==t?t:"")||d(r)&&(/^[vV]?[\d.]+$/.test(r)||(r=r.replace(/^\.[\\/]/,""),o.has(r)||(o.add(r),n.push(r))))}return n};const g=/^(?:\.?claude\.json|settings(?:\.[\w-]+)?\.json)$/i;t.isInstructionFile=function(e){var t;const i=null!==(t=String(null!=e?e:"").split(/[\\/]/).pop())&&void 0!==t?t:"";return/^(?:claude(?:\.local)?|agents(?:\.override)?|skill)\.md$/i.test(i)},t.isAutoFollowable=function(e){var t;const i=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"";return!!i&&!g.test(i)},t.pushRecent=function(e,t,i){return[t,...e.filter(e=>e!==t)].slice(0,Math.max(1,i))},t.parseDelimited=function(e,t=","){const i=[];let n=[],o="",a=!1;const s=String(null!=e?e:"").replace(/\r\n?/g,"\n");for(let e=0;e<s.length;e++){const r=s[e];a?'"'===r?'"'===s[e+1]?(o+='"',e++):a=!1:o+=r:'"'===r?a=!0:r===t?(n.push(o),o=""):"\n"===r?(n.push(o),i.push(n),n=[],o=""):o+=r}return(o||n.length)&&(n.push(o),i.push(n)),i},t.delimiterFor=function(e){return"tsv"===r(e)?"\t":","},t.formatBytes=function(e){const t=Number(e);return!isFinite(t)||t<0?"?":t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1024/1024).toFixed(1)+" MB"};const f=["open","show","manual"];t.followModeOf=function(e,t){return!1===e?"manual":!0===t?"open":"show"},t.migrateFollow=function(e,t){const i="string"==typeof e&&f.includes(e)?e:!1===t?"manual":null;return i?{preload:"manual"!==i,autoOpen:"open"===i}:null},t.planFollow=function(e,t,i){return i||"manual"===e?"none":t?"show":"open"===e?"open":"stage"}},5317(e){e.exports=require("child_process")},6982(e){e.exports=require("crypto")},4157(e){e.exports=require("electron")},9896(e){e.exports=require("fs")},8611(e){e.exports=require("http")},5692(e){e.exports=require("https")},9278(e){e.exports=require("net")},857(e){e.exports=require("os")},6928(e){e.exports=require("path")},3193(e){e.exports=require("string_decoder")},8167(e){e.exports=require("worker_threads")},4358(t){t.exports=e},860(e){e.exports=t},7182(e){e.exports=i},3961(e){e.exports=n},7650(e){e.exports=o},3700(e){e.exports=a},8349(e){e.exports=s}};const d={};function l(e){const t=d[e];if(void 0!==t)return t.exports;const i=d[e]={id:e,exports:{}};return r[e].call(i.exports,i,i.exports,l),i.exports}return l.n=e=>{const t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},l.cw=e=>{var t;return()=>{if(e){var i=e;e=0,t={exports:{}},i.call(t.exports,t,t.exports)}return t.exports}},l.d=(e,t)=>{if(Array.isArray(t))for(var i=0;i<t.length;){var n=t[i++],o=t[i++],a=0===o?{enumerable:!0,value:t[i++]}:{enumerable:!0,get:o};l.o(e,n)||Object.defineProperty(e,n,a)}else for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.nc=void 0,l(8156)})());
109
+ `;t.SessionSearch=class{constructor(e,t="renderer"===process.type){this.cacheDir=e,this.subprocess=t,this.worker=null,this.cancelPending=null}stop(e){e&&("terminate"in e?e.terminate():e.kill())}cancel(){var e;null===(e=this.cancelPending)||void 0===e||e.call(this),this.cancelPending=null,this.stop(this.worker),this.worker=null}run(e,t){return this.cancel(),new Promise((i,s)=>{const r={...e,cacheDir:this.cacheDir},d=this.subprocess?(0,o.spawn)("renderer"===process.type?"node":process.execPath,["-e",a.replace("const { parentPort, workerData } = require('worker_threads')","const parentPort = { postMessage: value => process.send(value) }; process.once('message', workerData => {")+"\n})"],{env:{...process.env},windowsHide:!0,stdio:["ignore","ignore","ignore","ipc"]}):new n.Worker(a,{eval:!0,workerData:r});this.worker=d;const l=()=>{this.worker===d&&(this.worker=null,this.cancelPending=null),this.stop(d)};this.cancelPending=()=>s(new Error("Search cancelled")),d.on("message",e=>{void 0!==e.progress&&(null==t||t(e.progress,e.total)),e.done&&(l(),i(e.value)),e.error&&(l(),s(new Error(e.error)))}),d.on("error",e=>{l(),s(e)}),d.on("exit",e=>{this.worker===d&&(l(),s(new Error(`Search worker stopped (${e})`)))}),"send"in d&&d.send(r,e=>{e&&(l(),s(e))})})}search(e,t,i){return t.trim()?this.run({op:"search",sources:e,query:t.trim()},i):(this.cancel(),Promise.resolve({hits:[],checked:0,unreadable:0,malformed:0}))}preview(e,t){return this.run({op:"preview",sources:[e],line:t})}}},5916(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionSearchPanel=void 0;const s=a(i(6928)),r=i(7025),d=i(8860);t.SessionSearchPanel=class{tr(e,t){return this.host.korean()?e:t}constructor(e){this.host=e,this.element=document.createElement("div"),this.input=document.createElement("input"),this.status=document.createElement("div"),this.results=document.createElement("div"),this.engine=new d.SessionSearch(s.join((0,r.runtimeRoot)(),"history-search")),this.previewEngine=new d.SessionSearch(s.join((0,r.runtimeRoot)(),"history-search")),this.generation=0,this.timer=null,this.hits=[],this.visible=40,this.dialog=null,this.previewGeneration=0,this.errors="",this.element.className="ad-history-search",this.input.type="search",this.input.className="ad-history-query",this.input.placeholder=this.host.searchLabel(),this.input.setAttribute("aria-label",this.input.placeholder),this.input.addEventListener("input",()=>{this.timer&&clearTimeout(this.timer),this.generation++,this.engine.cancel(),this.hits=[],this.results.replaceChildren(),this.status.textContent=this.active?this.tr("검색 준비 중…","Preparing search…"):"",this.host.changed(),this.active&&(this.timer=setTimeout(()=>{this.search()},300))}),this.element.addEventListener("keydown",e=>{e.stopPropagation(),"Escape"===e.key&&this.input.value?(e.preventDefault(),this.input.value="",this.input.dispatchEvent(new Event("input"))):"Enter"===e.key&&e.target===this.input&&(e.preventDefault(),this.timer&&clearTimeout(this.timer),this.search())}),this.status.className="ad-history-status",this.status.setAttribute("aria-live","polite"),this.results.className="ad-history-results",this.element.append(this.input,this.status,this.results),window.addEventListener("beforeunload",()=>this.dispose(),{once:!0})}get active(){return!!this.input.value.trim()}update(e){this.element.hidden=!e,this.input.placeholder=this.host.searchLabel(),this.input.setAttribute("aria-label",this.input.placeholder)}async search(){const e=this.input.value.trim(),t=++this.generation;if(this.errors="",this.visible=40,e){this.status.textContent=this.tr("대화 기록 확인 중…","Finding conversation files…");try{const i=await this.host.sources();if(t!==this.generation)return;const n=await this.engine.search(i,e,(e,i)=>{t===this.generation&&(this.status.textContent=this.tr(`검색 중 ${e}/${i}`,`Searching ${e}/${i}`))});if(t!==this.generation)return;this.hits=n.hits,(n.unreadable||n.malformed)&&(this.errors=this.tr(` · 읽지 못한 파일 ${n.unreadable}, 불완전한 기록 ${n.malformed}`,` · ${n.unreadable} unreadable files, ${n.malformed} incomplete records`)),this.renderResults()}catch(e){t===this.generation&&(this.status.textContent=this.tr("검색 실패: ","Search failed: ")+String(e.message||e))}}}highlight(e,t){const i=this.input.value.trim().toLowerCase();if(!i)return void(e.textContent=t);let n,o=0;const a=t.toLowerCase();for(;(n=a.indexOf(i,o))>=0;){e.append(document.createTextNode(t.slice(o,n)));const a=document.createElement("mark");a.textContent=t.slice(n,n+i.length),e.append(a),o=n+i.length}e.append(document.createTextNode(t.slice(o)))}renderResults(){if(this.results.replaceChildren(),!this.active)return void(this.status.textContent="");const e=this.hits;this.status.textContent=this.tr(`${e.length}개 세션`,`${e.length} sessions`)+this.errors,e.length||(this.status.textContent=this.tr("일치하는 지난 대화가 없습니다","No matching conversations")+this.errors);for(const t of e.slice(0,this.visible)){const e=document.createElement("button");e.type="button",e.className="ad-history-hit",e.dataset.sessionId=t.source.sessionId;const i=document.createElement("strong");this.highlight(i,t.record.label||t.source.sessionId);const n=document.createElement("small");n.textContent=`${"codex"===t.source.agent?"Codex":"Claude"} · ${new Date(t.record.lastSeen).toLocaleDateString()} · ${t.count}`;const o=document.createElement("small");o.textContent=t.record.cwd||"";const a=document.createElement("span");this.highlight(a,t.snippet),e.append(i,n,o,a),e.addEventListener("click",()=>{this.openPreview(t,t.line)}),this.results.append(e)}if(e.length>this.visible){const e=document.createElement("button");e.type="button",e.textContent=this.tr("더 보기","Show more"),e.onclick=()=>{this.visible+=40,this.renderResults()},this.results.append(e)}}async openPreview(e,t){var i,n;const o=++this.previewGeneration;null===(i=this.dialog)||void 0===i||i.remove();const a=document.createElement("div");a.className="ad-history-overlay",this.dialog=a;const s=document.createElement("section");s.className="ad-history-dialog",s.setAttribute("role","dialog"),s.setAttribute("aria-modal","true"),s.setAttribute("aria-label",this.tr("지난 대화 보기","Conversation preview")),s.tabIndex=-1;const r=document.createElement("header"),d=document.createElement("strong"),l=document.createElement("button");d.textContent=e.record.label||e.source.sessionId,l.textContent="×",l.setAttribute("aria-label",this.tr("닫기","Close"));const c=()=>{this.previewGeneration++,this.previewEngine.cancel(),a.remove(),this.dialog===a&&(this.dialog=null),this.input.focus()};l.onclick=c,r.append(d,l);const u=document.createElement("div");u.className="ad-history-conversation",u.textContent=this.tr("불러오는 중…","Loading…");const p=document.createElement("footer"),h=document.createElement("button");h.textContent=this.tr("이어서 대화","Resume conversation"),h.onclick=()=>{c(),this.host.resume({...e.record,openTabId:null})},p.append(h),s.append(r,u,p),a.append(s),document.body.append(a),l.focus(),a.addEventListener("keydown",e=>{if(e.stopPropagation(),"Escape"===e.key&&(e.preventDefault(),c()),"Tab"===e.key){const t=Array.from(s.querySelectorAll('button,input,select,textarea,[tabindex="0"]')),i=t[0],n=t[t.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),null==n||n.focus()):e.shiftKey||document.activeElement!==n||(e.preventDefault(),null==i||i.focus())}}),a.addEventListener("click",e=>{e.target===a&&c()});try{const i=await this.previewEngine.preview(e.source,t);if(o!==this.previewGeneration)return;u.replaceChildren();for(const n of i.messages){const i=document.createElement("article");i.className=n.line===t?"ad-history-match":"";const o=document.createElement("strong");o.textContent="user"===n.role?this.tr("나","You"):e.source.agent;const a=document.createElement("pre");if(this.highlight(a,n.text.slice(0,16e3)),i.append(o,a),n.text.length>16e3){const e=document.createElement("button");e.textContent=this.tr("메시지 전체 보기","Show full message"),e.onclick=()=>{a.replaceChildren(),this.highlight(a,n.text),e.remove()},i.append(e)}u.append(i)}for(const[t,n,o]of[[i.previous,"이전 대화","Previous messages"],[i.next,"다음 대화","Next messages"]])if(null!==t){const i=document.createElement("button");i.textContent=this.tr(n,o),i.onclick=()=>{this.openPreview(e,t)},p.prepend(i)}null===(n=u.querySelector(".ad-history-match"))||void 0===n||n.scrollIntoView({block:"nearest"})}catch(e){o===this.previewGeneration&&(u.textContent=this.tr("기록을 읽지 못했습니다: ","Could not read conversation: ")+String(e.message||e))}}dispose(){var e;this.generation++,this.previewGeneration++,this.timer&&clearTimeout(this.timer),this.engine.cancel(),this.previewEngine.cancel(),null===(e=this.dialog)||void 0===e||e.remove()}}},4867(e,t){t.SessionSlots=void 0,t.SessionSlots=class{constructor(){this.slots=Array(9).fill(null)}reconcile(e,t=()=>null){const i=new Set(e);this.slots=this.slots.map(e=>null!==e&&i.has(e)?e:null);for(const i of e){if(this.slots.includes(i))continue;const e=t(i);null!==e&&Number.isInteger(e)&&e>=1&&e<=9&&null===this.slots[e-1]&&(this.slots[e-1]=i)}for(const t of e){if(this.slots.includes(t))continue;const e=this.slots.indexOf(null);if(e<0)break;this.slots[e]=t}}numberOf(e){const t=this.slots.indexOf(e);return t<0?null:t+1}get(e){return Number.isInteger(e)&&e>=1&&e<=9?this.slots[e-1]:null}get full(){return!this.slots.includes(null)}get occupied(){return this.slots.filter(e=>null!==e).length}}},7418(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},a=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabComponent=void 0;const s=i(860),r=i(7650),d=i(3438),l=i(7028),c=i(9900),u=i(1786),p=i(906),h=i(2627),g=i(9980),f=i(9610),m=i(5174),v=i(7797),b=i(7025),k=i(1584),y=i(8209),w=i(3496),x={disabled:"자동 업데이트가 꺼져 있다","too-soon":"방금 확인했다","dev-install":"새 버전이 있지만 개발 설치라 건드리지 않는다",unknown:"npm 에 물어보지 못했다 (네트워크·프록시)","up-to-date":"최신이다","update-ready":"새 버전이 있다",skipped:"이 버전은 건너뛰기로 했다",postponed:"나중에 하기로 했다",installing:"설치했다 — 창을 새로 고쳐 갈아탄다 (탭·세션 유지)",installed:"설치했다 — Tabby 를 다시 켜면 적용된다 (창을 새로 고치지 못했다)",failed:"업데이트를 시작하지 못했다"},S={left:"dock.left",right:"dock.right",top:"dock.top",bottom:"dock.bottom"};let C=class{get claudeOn(){return this.hooksOn&&(this.statusLineOn||!this.statusLineSupported)}get codexOffLabels(){return this.codexOff.map(h.codexEventLabel).join(" · ")}get claudeError(){return[this.hookError,this.statusLineError].filter(Boolean).join(" / ")}constructor(e,t,i,n,o,a,s,r,l,h){var g,f,m;this.config=e,this.recovery=t,this.update=i,this.platform=n,this.devReload=o,this.host=a,this.locale=s,this.hotkeys=r,this.zone=l,this.rootProfiles=h,this.storageKeys=b.STORAGE_KEYS,this.storageDefault=(0,b.storageDefaults)(),this.hooksSupported=(0,u.hooksSupported)(),this.hooksOn=!1,this.codexHooksOn=!1,this.codexHookError="",this.codexOff=[],this.hookError="",this.statusLineSupported=(0,p.statusLineSupported)(),this.statusLineOn=!1,this.statusLineError="",this.diagPath=v.DIAG_PATH,this.diagVersion=(0,v.pluginVersion)(),this.diagIncludeScreen=!1,this.diagBundlePath="",this.diagError="",this.updateBusy=!1,this.updateMsg="",this.keyItems=c.KEY_ITEMS,this.capturing=null,this.pending=null,this.keyMsg="",this.keyMsgFor="",this.hotkeyNames=new Map,this.captureHandler=null,this.keyPlatform="darwin"===process.platform||"linux"===process.platform?process.platform:"win32",this.widened=null,this.prevMaxWidth="",this.lang="en",this.localeSub=null,this.hooksRefreshTimer=null,this.storageModel=(0,k.storageSettingsFor)(this.config),this.refreshHooks(),this.loadHotkeyNames(),this.lang=(0,d.pickLang)((null===(g=this.locale)||void 0===g?void 0:g.getLocale())||this.config.store.language||navigator.language),this.localeSub=null!==(m=null===(f=this.locale)||void 0===f?void 0:f.localeChanged$.subscribe(e=>{this.lang=(0,d.pickLang)(e)}))&&void 0!==m?m:null}t(e,t){return(0,d.translate)(e,this.lang,t)}ngAfterViewInit(){this.hooksRefreshTimer=setInterval(()=>this.refreshHooks(),2e3);const e=this.host.nativeElement.closest("settings-tab-body");e&&(this.widened=e,this.prevMaxWidth=e.style.maxWidth,e.style.maxWidth="none")}ngOnDestroy(){var e;this.storageModel.flush(),this.hooksRefreshTimer&&(clearInterval(this.hooksRefreshTimer),this.hooksRefreshTimer=null),this.widened&&(this.widened.style.maxWidth=this.prevMaxWidth,this.widened=null),null===(e=this.localeSub)||void 0===e||e.unsubscribe(),this.localeSub=null,this.stopCapture()}keysOf(e){var t;return(0,c.displayStrokes)(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{},e,this.keyPlatform)}isPending(e){return!!this.pending&&this.pending.plan.item.id===e.id}isDefault(e){var t;return(0,c.isDefaultBinding)(null!==(t=this.config.store.hotkeys)&&void 0!==t?t:{},e,this.keyDefaults(),this.keyPlatform)}startCapture(e){this.stopCapture(),this.pending=null,this.keyMsg="",this.capturing=e.id,this.captureHandler=t=>{["Control","Meta","Alt","Shift"].includes(t.key)||(t.preventDefault(),t.stopImmediatePropagation(),this.zone.run(()=>{var i;if("Escape"===t.key)return void this.stopCapture();const n=(0,c.keystrokeFromEvent)(t,this.keyPlatform);if(!n)return;this.stopCapture();const o=null!==(i=this.config.store.hotkeys)&&void 0!==i?i:{},a=(0,c.planBinding)(o,e,n,this.keyPlatform);if("digit"===a.error)return this.keyMsg=this.t("keys.digit"),void(this.keyMsgFor=e.id);a.conflicts.length?this.pending={plan:a,names:a.conflicts.map(e=>this.nameOf(e)).join(", ")}:this.commit(a,!1)}))},window.addEventListener("keydown",this.captureHandler,!0)}stopCapture(){this.captureHandler&&(window.removeEventListener("keydown",this.captureHandler,!0),this.captureHandler=null),this.capturing=null}confirmPending(){this.pending&&(this.commit(this.pending.plan,!0),this.pending=null)}resetKeys(e){this.pending=null,this.keyMsg="",(0,c.resetBinding)(this.config.store.hotkeys,e,this.keyDefaults()),this.config.save()}commit(e,t){(0,c.applyBinding)(this.config.store.hotkeys,e,t,this.keyPlatform),this.config.save()}keyDefaults(){var e,t,i,n;let o={};try{o=null!==(n=null===(i=null===(t=(e=this.config).getDefaults)||void 0===t?void 0:t.call(e))||void 0===i?void 0:i.hotkeys)&&void 0!==n?n:{}}catch(e){}return{...o,...(0,l.defaultHotkeys)()}}nameOf(e){var t;return null!==(t=this.hotkeyNames.get(e))&&void 0!==t?t:e}async loadHotkeyNames(){var e;try{const t=await(null===(e=this.hotkeys)||void 0===e?void 0:e.getHotkeyDescriptions());for(const e of null!=t?t:[])(null==e?void 0:e.id)&&e.name&&this.hotkeyNames.set(e.id,e.name)}catch(e){}}async checkUpdate(){var e,t;this.updateBusy=!0,this.updateMsg="";try{this.updateMsg=null!==(e=x[await this.update.run("settings",!0)])&&void 0!==e?e:""}catch(e){this.updateMsg=`확인하지 못했다: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}finally{this.updateBusy=!1}}refreshHooks(){var e,t,i;try{this.codexHooksOn=this.hooksSupported&&(0,h.codexHooksInstalled)(),this.codexOff=this.codexHooksOn?(0,h.codexDisabledEvents)():[]}catch(t){this.codexHooksOn=!1,this.codexOff=[],this.codexHookError=`설정을 읽지 못했다: ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}try{this.hooksOn=this.hooksSupported&&(0,u.hooksInstalled)()}catch(e){this.hooksOn=!1,this.hookError=`설정을 읽지 못했다: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}try{this.statusLineOn=this.statusLineSupported&&(0,p.statusLineInstalled)()}catch(e){this.statusLineOn=!1,this.statusLineError=`설정을 읽지 못했다: ${null!==(i=null==e?void 0:e.message)&&void 0!==i?i:e}`}}toggleClaude(){var e,t;this.hookError="",this.statusLineError="";const i=this.claudeOn;try{i?(0,u.uninstallHooks)():(0,u.installHooks)()}catch(t){this.hookError=`상태 훅: ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}if(this.statusLineSupported)try{i?(0,p.uninstallStatusLine)():this.statusLineOn||(0,p.installStatusLine)()}catch(e){this.statusLineError=`statusLine: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}this.refreshHooks(),this.syncNotifyChannel()}toggleCodexHooks(){var e;this.codexHookError="";try{(0,h.setCodexHooks)(!this.codexHooksOn)}catch(t){this.codexHookError=`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}this.refreshHooks(),this.syncNotifyChannel()}syncNotifyChannel(){const e=this.hooksOn||this.codexHooksOn;this.config.store.agentDeck.notifyChannel!==e&&(this.config.store.agentDeck.notifyChannel=e,this.config.save())}collectDiag(){var e,t,i,n,o;this.diagError="",this.diagBundlePath="";try{const o=(0,v.collectDiagBundle)({includeScreen:this.diagIncludeScreen,stamp:{tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(n=(i=this.platform).getOSRelease)||void 0===n?void 0:n.call(i),config:(0,v.configStamp)(this.config.store)}});this.diagBundlePath=o.path,this.platform.showItemInFolder(o.path)}catch(e){this.diagError=`모으지 못했다: ${null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e}`}}layoutChanged(){const e=this.config.store.agentDeck;return Object.keys(l.LAYOUT_DEFAULTS).some(t=>e[t]!==l.LAYOUT_DEFAULTS[t])}dockLabel(){var e;return this.t(null!==(e=S[this.config.store.agentDeck.sidebarDock])&&void 0!==e?e:"dock.right")}sizeLabel(){const e=this.config.store.agentDeck;return"top"===e.sidebarDock||"bottom"===e.sidebarDock?this.t("size.height",{px:e.sidebarHeight}):e.sidebarWidth?this.t("size.width",{px:e.sidebarWidth}):this.t("size.auto")}resetLayout(){Object.assign(this.config.store.agentDeck,l.LAYOUT_DEFAULTS),this.config.save()}collapsedCount(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.length:0}expandGroups(){this.config.store.agentDeck.collapsedGroups=[],this.config.save()}async pickCwd(){const e=await this.platform.pickDirectory("작업 폴더 선택");e&&(this.config.store.agentDeck.rootProfileCwd=String(e).replace(/\\/g,"/"),this.saveRootProfile())}saveRootProfile(){this.rootProfiles.applySettings()}addRootProfile(){const e=this.config.store.agentDeck;e.rootProfiles=[...e.rootProfiles||[],{id:"agentdeck:root:"+i(6982).randomUUID(),name:"",cwd:"",command:e.rootProfileCommand||"powershell.exe"}],this.saveRootProfile()}removeRootProfile(e){this.config.store.agentDeck.rootProfiles=this.config.store.agentDeck.rootProfiles.filter(t=>t.id!==e.id),this.saveRootProfile()}async pickAdditionalCwd(e){const t=await this.platform.pickDirectory(this.t("root.cwd.title"));t&&(e.cwd=String(t).replace(/\\/g,"/"),this.saveRootProfile())}storageLabel(e){return(0,y.storageText)(e,this.lang)}async pickStorage(e){try{const t=await this.platform.pickDirectory(this.storageLabel(e));t&&(this.storageModel.change(e,String(t)),await this.storageModel.save())}catch{this.storageModel.error=!0,this.storageModel.message="failed"}}resetStorage(){for(const e of b.STORAGE_KEYS)this.storageModel.change(e,"");this.storageModel.save()}async saveStorage(){await this.storageModel.save()}};C=n([(0,s.Component)({selector:"agentdeck-settings-tab",template:'\n<h3 class="mb-3">AgentDeck</h3>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'layout.title\')}}</div>\n <div class="description">{{t(\'layout.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.enabled" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'reset.title\')}}</div>\n <div class="description">\n {{t(\'reset.desc\')}}\n <span *ngIf="layoutChanged()">{{t(\'reset.now\', { dock: dockLabel(), size: sizeLabel() })}}</span>\n <span *ngIf="!layoutChanged()">{{t(\'reset.default\')}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="!layoutChanged()" (click)="resetLayout()">\n <i class="fas fa-undo me-2"></i>{{t(\'reset.btn\')}}\n </button>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'norecover.title\')}}</div>\n <div class="description" [innerHTML]="t(\'norecover.desc\')"></div>\n </div>\n <toggle [ngModel]="config.store.agentDeck.noTabRecovery" (ngModelChange)="recovery.setNoTabRecovery($event)"></toggle>\n</div>\n\n\x3c!-- [설정 화면에서 숨김 자동 업데이트·지금 확인 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<div class="form-line">\n <div class="header">\n <div class="title">자동 업데이트</div>\n <div class="description">\n 기동할 때 npm 을 보고 새 버전이 있으면 <b>물어본 뒤</b> 업데이트한다.\n 승낙하면 Tabby 가 닫히고 → 설치하고 → <b>스스로 다시 켜진다</b> (사람이 할 일은 없다).\n 돌고 있는 플러그인은 갈아끼울 수 없어서 이 방법뿐이다.\n 끊긴 Claude Code·Codex 대화는 <code>⟲ 지난 세션</code> 에서 이어받으면 된다.\n <b>개발 설치(소스 링크)에는 설치하지 않는다</b> — 작업 중인 소스를 덮어쓰기 때문이다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.autoUpdate" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.autoUpdate">\n <div class="header">\n <div class="title">지금 확인</div>\n <div class="description">\n 간격({{config.store.agentDeck.updateCheckIntervalHours}}시간)과 <code>다시 묻지 않기</code> 를 무시하고 한 번 확인한다.\n <span *ngIf="updateMsg">— {{updateMsg}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="updateBusy" (click)="checkUpdate()">\n <i class="fas fa-rotate me-2"></i>{{updateBusy ? \'확인 중…\' : \'확인\'}}\n </button>\n</div>\n\n--\x3e\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'resume.title\')}}</div>\n <div class="description" [innerHTML]="t(\'resume.desc\')"></div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.resumeList" (ngModelChange)="config.save()"></toggle>\n</div>\n\n\x3c!-- [설정 화면에서 숨김 몇 줄까지·며칠치 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<div class="form-line" *ngIf="config.store.agentDeck.resumeList">\n <div class="header">\n <div class="title">몇 줄까지 · 며칠치</div>\n <div class="description">\n 그룹마다 최근 <b>{{config.store.agentDeck.resumeListLimit}}줄</b>까지,\n 최근 <b>{{config.store.agentDeck.resumeListDays}}일</b> 안의 세션만 보여준다.\n 길게 잡으면 살아 있는 탭이 아래로 밀린다. 숨긴 세션은 줄 우클릭으로 되돌릴 수 없고\n <code>config.yaml</code> 의 <code>resumeHidden</code> 을 비우면 다시 나온다.\n </div>\n </div>\n <div class="d-flex align-items-center">\n <input class="form-control text-end me-2" style="width: 5rem" type="number" min="0" max="50"\n [(ngModel)]="config.store.agentDeck.resumeListLimit" (ngModelChange)="config.save()">\n <input class="form-control text-end" style="width: 5rem" type="number" min="0" max="365"\n [(ngModel)]="config.store.agentDeck.resumeListDays" (ngModelChange)="config.save()">\n </div>\n</div>\n\n--\x3e\n\n<h3 class="mt-4 mb-3">{{t(\'keys.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'keys.intro\')"></div>\n\n<div class="form-line ad-keyrow" *ngFor="let it of keyItems">\n <div class="header">\n <div class="title">\n {{t(it.label)}}\n <span class="badge bg-secondary ms-1" *ngIf="it.stock">{{t(\'keys.stock\')}}</span>\n </div>\n <div class="description">\n <ng-container *ngIf="capturing !== it.id && !isPending(it)">\n <kbd class="me-1" *ngFor="let k of keysOf(it)">{{k}}</kbd>\n <span class="text-muted" *ngIf="!keysOf(it).length">{{t(\'keys.unbound\')}}</span>\n </ng-container>\n <span class="text-info" *ngIf="capturing === it.id">{{t(\'keys.press\')}}</span>\n <div class="text-warning" *ngIf="isPending(it)">\n <kbd>{{pending!.plan.display}}</kbd> — {{t(\'keys.conflict\', { names: pending!.names })}}\n <div class="mt-1">\n <button class="btn btn-sm btn-warning me-1" type="button" (click)="confirmPending()">{{t(\'keys.force\')}}</button>\n <button class="btn btn-sm btn-secondary me-1" type="button" (click)="startCapture(it)">{{t(\'keys.change\')}}</button>\n <button class="btn btn-sm btn-link" type="button" (click)="pending = null">{{t(\'keys.cancel\')}}</button>\n </div>\n </div>\n <span class="text-danger d-block mt-1" *ngIf="keyMsgFor === it.id && keyMsg">{{keyMsg}}</span>\n </div>\n </div>\n <div class="d-flex gap-1">\n <button class="btn btn-secondary" type="button"\n (click)="capturing === it.id ? stopCapture() : startCapture(it)">\n {{t(capturing === it.id ? \'keys.cancel\' : \'keys.change\')}}\n </button>\n <button class="btn btn-outline-secondary" type="button" [disabled]="isDefault(it)" (click)="resetKeys(it)">\n {{t(\'keys.default\')}}\n </button>\n </div>\n</div>\n<div class="text-muted mb-3" [innerHTML]="t(\'keys.fixed\')"></div>\n\n\x3c!-- [설정 화면에서 숨김 사이드바 목록·세션 그룹·미리보기 패널 — 기본값(config.ts)으로 고정, 바꿀 땐 config.yaml agentDeck.* 직접]\n<h3 class="mt-4 mb-3">사이드바 목록</h3>\n<div class="text-muted mb-3">\n 세션 목록을 마우스 없이 다루는 방법과, 줄에 무엇까지 보일지를 정한다. 바꾸면 곧바로 적용된다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">키보드로 다루기</div>\n <div class="description">\n <code>Ctrl+L</code> 로 목록에 들어가 <code>↑↓</code> 로 훑고 Enter 로 그 탭으로 옮긴다\n (<code>Esc</code> 로 터미널로 돌아온다). <b>훑는 동안 활성 탭은 바뀌지 않는다</b> —\n 줄마다 탭이 바뀌면 그 탭의 출력이 화면을 덮어 훑어보는 것 자체가 안 된다.\n 포커스가 사이드바에 없는 동안은 키를 한 개도 가로채지 않으므로 켜 둬서 잃는 것이 없다.\n 끄면 목록이 포커스를 받지 않는다.\n 키 배정은 <b>단축키</b> 탭의 <code>agentdeck-focus-list</code> 에서 바꾼다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardNav" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.keyboardNav">\n <div class="header">\n <div class="title">끝에서 반대쪽으로 감싸기</div>\n <div class="description">\n 맨 아래에서 <code>↓</code> 를 한 번 더 누르면 맨 위로 넘어간다.\n 기본은 꺼짐 — 끝에서 멈춰야 "맨 아래에 왔다" 가 보이고 목록이 통째로 튀지 않는다.\n 끝에서 끝으로 갈 일은 <code>Home</code> · <code>End</code> 가 받는다.\n 켜도 <b>맨 위의 ↑ 는 검색창으로 나간다</b> — 그 경계까지 감싸기에 내주면\n 목록에서 검색창으로 돌아갈 키가 없어진다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardNavWrap" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line" *ngIf="config.store.agentDeck.keyboardNav">\n <div class="header">\n <div class="title"><code>Ctrl+W</code> 로 탭 닫기</div>\n <div class="description">\n 터미널에서 누르면 <b>지금 보고 있는 탭</b>, 목록이 키보드를 갖고 있으면\n <b>포커스 줄의 탭</b>을 닫는다 (그룹 헤더에서는 아무 일도 하지 않는다).\n 사이드바 <code>✕</code> 와 같은 경로라 돌아가는 프로세스가 있으면 평소처럼 한 번 물어본다.\n <b>끄면 <code>Ctrl+W</code> 가 터미널로 그대로 간다</b> — 셸·에이전트 CLI 에서\n 그 키는 <b>앞 단어 지우기</b>이고, 우리는 닫을 탭이 정해졌을 때만 키를 가로챈다.\n <code>키보드로 다루기</code> 를 끄면 이 항목도 함께 꺼진다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.keyboardCloseTab" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">서브에이전트 개수 보이기</div>\n <div class="description">\n 그 세션이 백그라운드로 돌리고 있는 에이전트 수를 줄에 <b>❖3</b> 으로 보인다\n (툴팁에 무엇을 시켜 놨는지와 가장 오래된 것의 경과 시간).\n 0 개면 아무것도 그리지 않으므로 켜 둬서 잃는 것이 없다.\n 끄면 표시도 멈추고 대화 기록을 <b>읽지도 않는다</b>.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.subagentCount" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="text-muted mb-3">세션은 1~9 고정 번호를 사용합니다. 닫힌 자리는 재사용하며 다른 번호는 바뀌지 않습니다.\nCtrl+숫자로 해당 세션을 선택합니다. 자동 정렬과 끌어서 순서 바꾸기는 지원하지 않습니다.</div>\n\nLegacy grouping controls are retired: fixed slots never reorder by project.\n<h3 class="mt-4 mb-3">세션 그룹</h3>\n<div class="text-muted mb-3">\n 사이드바의 세션을 <b>프로젝트 단위</b>로 묶고 헤더를 눌러 접는다. 끄고 켜는 값이 없다 —\n 그룹이 하나뿐이면 헤더도 순서도 건드리지 않으므로, 한 프로젝트만 쓸 때는 묶지 않은 화면과 같다.\n <br>\n 묶는 기준은 <b>탭이 태어난 작업 폴더</b>다 — 셸에서 <code>cd</code> 를 해도 따라오지 않으므로\n 세션이 사는 동안 그룹이 흔들리지 않는다. 그룹 안의 순서는 상태 정렬을 그대로 따른다.\n 경계는 <b>저장소 루트</b>(<code>.git</code> 등)를 위로 훑어 자동으로 잡으므로 하위 폴더에서 띄운\n 세션도 같은 프로젝트로 들어오고, 저장소가 아닌 폴더는 그 폴더 자체가 그룹이다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">접어 둔 그룹 펼치기</div>\n <div class="description">\n 헤더를 눌러 접은 그룹은 다음 기동에도 접힌 채로 뜬다.\n <span *ngIf="collapsedCount()">지금 {{collapsedCount()}}개가 접혀 있다.</span>\n <span *ngIf="!collapsedCount()">지금 접힌 그룹은 없다.</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" [disabled]="!collapsedCount()" (click)="expandGroups()">\n <i class="fas fa-angles-down me-2"></i>모두 펼치기\n </button>\n</div>\n\n<h3 class="mt-4 mb-3">미리보기 패널</h3>\n<div class="text-muted mb-3">\n 터미널 옆에서 에이전트가 만든 md · 이미지 · 표 · 코드를 그대로 본다.\n 글자 파일은 <b>✎</b> 로 고쳐 저장하고(<code>Ctrl+S</code>), <b>🔍</b> 나 <code>Ctrl+F</code> 로 찾는다.\n 여닫기는 사이드바의 <b>▤</b> 버튼(또는 단축키 <code>agentdeck-view</code>)이다.\n 특정 CLI 에 매이지 않는다 — 화면에 찍힌 경로를 주우므로 Claude Code · Codex · Gemini 모두 같이 동작한다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">패널 열기</div>\n <div class="description">\n 지금 여닫는다. 이 상태는 다음 기동에도 그대로 복원된다.\n 사이드바의 <b>▤</b> 버튼·단축키 <code>agentdeck-view</code> 와 같은 값이다 —\n 아래 <b>새 파일을 주우면</b> 을 <b>사람이 열 때만</b> 으로 두면 이 값은\n <b>사람이 바꿀 때만</b> 바뀐다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerOpen" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">경로 자동 수집</div>\n <div class="description">\n 에이전트가 화면에 찍은 파일 경로를 주워 패널 위쪽 최근 목록에 쌓는다.\n 끄면 파일을 끌어다 놓거나 <b>+</b> 로 경로를 넣을 때만 열린다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerScrape" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">문서 패널에 읽어두기</div>\n <div class="description">\n 에이전트가 만진 파일을 <b>닫혀 있는 동안에도</b> 패널에 얹어 둔다 —\n 나중에 <b>▤</b> 를 누르면 그때까지 건드린 파일이 칩으로 쌓여 있고 본문은 가장 최근 파일이다\n (<b>변경</b> 을 보고 있었으면 여는 김에 diff 를 다시 읽는다).\n 끄면 아무것도 자동으로 하지 않는다 — 무엇을 볼지 칩·<b>+</b>·드롭으로 직접 고른다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerPreload" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">패널 자동으로 열기</div>\n <div class="description">\n 새 파일을 주우면 닫힌 패널을 스스로 연다. <b>기본은 꺼짐</b> — 여닫기는 사람 몫이다\n (작업 중에 저절로 열리면 터미널이 좁아진다). 위 <b>읽어두기</b> 가 내용을 채워 두므로\n 열고 싶을 때 열면 이미 최신이다. <b>읽어두기</b> 를 끄면 이 값은 의미가 없다.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.viewerAutoOpen"\n [disabled]="!config.store.agentDeck.viewerPreload"\n (ngModelChange)="config.save()"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">터미널에 파일을 끌어다 놓으면</div>\n <div class="description">\n 순정 Tabby 는 경로를 터미널에 붙여넣는다. 패널이 닫혀 있으면 그래서 아무것도 안 열린다 —\n 기본은 <b>물어본다</b> — 패널에 띄우기 / 경로 붙여넣기 중에서 고른다. 배너에서 "다시 묻지 않기" 를\n 체크하고 누르면 그 선택이 여기 저장된다.\n </div>\n </div>\n <select class="form-control w-auto"\n [(ngModel)]="config.store.agentDeck.viewerDropOpen"\n (ngModelChange)="config.save()">\n <option value="ask">물어본다 (기본)</option>\n <option value="always">패널에 띄운다</option>\n <option value="paste">경로를 붙여넣는다</option>\n <option value="never">개입하지 않는다 (순정)</option>\n </select>\n</div>\n\n--\x3e\n\n<h3 class="mt-4 mb-3">{{t(\'agents.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'agents.intro\')"></div>\n\n<div class="form-line" *ngIf="!hooksSupported">\n <div class="header">\n <div class="title">{{t(\'agents.unsupported.title\')}}</div>\n <div class="description">{{t(\'agents.unsupported.desc\')}}</div>\n </div>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">{{t(\'claude.title\')}}</div>\n <div class="description">\n <b>{{t(claudeOn ? \'state.on\' : \'state.off\')}}</b> — <span [innerHTML]="t(\'claude.desc\')"></span>\n <span *ngIf="claudeError" class="text-danger d-block mt-1">{{claudeError}}</span>\n </div>\n </div>\n <button class="btn" type="button"\n [class.btn-secondary]="!claudeOn" [class.btn-outline-danger]="claudeOn"\n (click)="toggleClaude()">\n <i class="fas me-2" [class.fa-plug]="!claudeOn" [class.fa-trash]="claudeOn"></i>\n {{t(claudeOn ? \'btn.remove\' : \'btn.install\')}}\n </button>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">{{t(\'codex.title\')}}</div>\n <div class="description">\n <b>{{t(codexOff.length ? \'state.half\' : (codexHooksOn ? \'state.on\' : \'state.off\'))}}</b> — <span [innerHTML]="t(\'codex.desc\')"></span>\n <span *ngIf="codexOff.length" class="text-warning d-block mt-1">\n {{t(\'codex.disabled\', { events: codexOffLabels })}}\n </span>\n <span *ngIf="codexHookError" class="text-danger d-block mt-1">{{codexHookError}}</span>\n </div>\n </div>\n <button class="btn" type="button"\n [class.btn-secondary]="!codexHooksOn" [class.btn-outline-danger]="codexHooksOn"\n (click)="toggleCodexHooks()">\n <i class="fas me-2" [class.fa-plug]="!codexHooksOn" [class.fa-trash]="codexHooksOn"></i>\n {{t(codexHooksOn ? \'btn.remove\' : \'btn.install\')}}\n </button>\n</div>\n\n<section class="ad-storage-settings">\n<h3 class="mt-4 mb-3">{{storageLabel(\'head\')}}</h3>\n<div class="text-muted mb-3">{{storageLabel(\'intro\')}}</div>\n<div class="form-line" *ngFor="let key of storageKeys">\n <div class="header">\n <div class="title">{{storageLabel(key)}}</div>\n <div class="description">{{storageLabel(key === \'accountStorageDir\' ? \'accounts\' : \'agents\')}}</div>\n </div>\n <div class="w-50">\n <div class="input-group">\n <input class="form-control" type="text" [attr.data-storage-key]="key"\n [attr.aria-label]="storageLabel(key)" [placeholder]="storageLabel(\'default\') + \': \' + storageDefault[key]"\n [ngModel]="storageModel.draft[key]" (ngModelChange)="storageModel.change(key, $event)" (change)="saveStorage()">\n <button class="btn btn-secondary" type="button" (click)="pickStorage(key)">{{t(\'root.browse\')}}</button>\n </div>\n <small class="text-muted" style="overflow-wrap:anywhere">{{storageLabel(\'default\')}}: {{storageDefault[key]}}</small>\n </div>\n</div>\n<button class="btn btn-primary ad-storage-save" type="button" [disabled]="storageModel.busy" (click)="saveStorage()">{{storageLabel(\'save\')}}</button>\n<button class="btn btn-secondary ms-2" type="button" [disabled]="storageModel.busy" (click)="resetStorage()">{{storageLabel(\'reset\')}}</button>\n<div class="mt-2 ad-storage-message" role="status" [class.text-danger]="storageModel.error">{{storageModel.message ? storageLabel(storageModel.message) : \'\'}}</div>\n</section>\n<h3 class="mt-4 mb-3">{{t(\'root.head\')}}</h3>\n<div class="text-muted mb-3">{{storageLabel(\'working\')}}</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.use.title\')}}</div>\n <div class="description">{{t(\'root.use.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.rootProfile" (ngModelChange)="saveRootProfile()"></toggle>\n</div>\n\n<ng-container *ngIf="config.store.agentDeck.rootProfile">\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.name.title\')}}</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileName" (change)="saveRootProfile()">\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.cwd.title\')}}</div>\n <div class="description">{{t(\'root.cwd.desc\')}}</div>\n </div>\n <div class="input-group w-50">\n <input class="form-control" type="text" placeholder="D:/Project"\n [(ngModel)]="config.store.agentDeck.rootProfileCwd" (change)="saveRootProfile()">\n <button class="btn btn-secondary" type="button" (click)="pickCwd()">\n <i class="fas fa-folder-open me-2"></i>{{t(\'root.browse\')}}\n </button>\n </div>\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">{{t(\'root.command.title\')}}</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileCommand" (change)="saveRootProfile()">\n </div>\n\n</ng-container>\n\n<section class="ad-root-profiles">\n <h4>{{t(\'root.more\')}}</h4>\n <p class="text-muted">{{t(\'root.choose.desc\')}}</p>\n <div class="ad-root-profile card p-3 mb-2" *ngFor="let root of config.store.agentDeck.rootProfiles">\n <label>{{t(\'root.name.title\')}}<input class="form-control" [(ngModel)]="root.name" (change)="saveRootProfile()"></label>\n <label>{{t(\'root.cwd.title\')}}<input class="form-control" [(ngModel)]="root.cwd" (change)="saveRootProfile()"></label>\n <button class="btn btn-secondary" (click)="pickAdditionalCwd(root)">{{t(\'root.browse\')}}</button>\n <label>{{t(\'root.command.title\')}}<input class="form-control" [(ngModel)]="root.command" (change)="saveRootProfile()"></label>\n <button class="btn btn-secondary mt-2" (click)="removeRootProfile(root)">{{t(\'root.remove\')}}</button>\n </div>\n <button class="btn btn-secondary" (click)="addRootProfile()">{{t(\'root.add\')}}</button>\n</section>\n\n<h3 class="mt-4 mb-3">{{t(\'diag.head\')}}</h3>\n<div class="text-muted mb-3" [innerHTML]="t(\'diag.intro\', { path: diagPath })"></div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'diag.screen.title\')}}</div>\n <div class="description">{{t(\'diag.screen.desc\')}}</div>\n </div>\n <toggle [(ngModel)]="diagIncludeScreen"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'diag.collect.title\')}}</div>\n <div class="description">\n {{t(\'diag.collect.desc\', { version: diagVersion })}}\n <span *ngIf="diagBundlePath" class="d-block mt-1">{{t(\'diag.made\')}}<code>{{diagBundlePath}}</code></span>\n <span *ngIf="diagError" class="text-danger d-block mt-1">{{diagError}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" (click)="collectDiag()">\n <i class="fas fa-folder-open me-2"></i>{{t(\'diag.btn\')}}\n </button>\n</div>\n\n<ng-container *ngIf="devReload.available">\n<h3 class="mt-4 mb-3">{{t(\'dev.head\')}}</h3>\n<div class="form-line">\n <div class="header">\n <div class="title">{{t(\'dev.use.title\')}}</div>\n <div class="description" [innerHTML]="t(\'dev.use.desc\')"></div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.devMode" (ngModelChange)="config.save()"></toggle>\n</div>\n<div class="form-line" *ngIf="config.store.agentDeck.devMode">\n <div class="header">\n <div class="title">{{t(\'dev.now.title\')}}</div>\n <div class="description">{{t(\'dev.now.desc\')}}</div>\n </div>\n <button class="btn btn-secondary" type="button" (click)="devReload.reload(\'settings\')">\n <i class="fas fa-rotate me-2"></i>{{t(\'dev.btn\')}}\n </button>\n</div>\n</ng-container>\n\n<div class="text-muted mt-4" [innerHTML]="t(\'footer\')"></div>\n'}),a(6,(0,s.Optional)()),a(7,(0,s.Optional)()),o("design:paramtypes",[r.ConfigService,g.AgentDeckRecoveryService,f.AgentDeckUpdateService,r.PlatformService,m.AgentDeckDevReloadService,s.ElementRef,r.LocaleService,r.HotkeysService,s.NgZone,w.AgentDeckProfileService])],C),t.AgentDeckSettingsTabComponent=C},1451(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabProvider=void 0;const o=i(860),a=i(3700),s=i(7418);let r=class extends a.SettingsTabProvider{constructor(){super(...arguments),this.id="agentdeck",this.icon="layer-group",this.title="AgentDeck"}getComponentType(){return s.AgentDeckSettingsTabComponent}};r=n([(0,o.Injectable)()],r),t.AgentDeckSettingsTabProvider=r},1836(e,t,i){t.RESET_COPY=t.sidebarReset=t.sidebarReason=t.sidebarMarkup=t.sidebarText=void 0;const n=i(9169),o={"계정 이름 (선택)":"Account name (optional)","목록에서 삭제":"Remove from list","이메일 주소 전체를 입력하세요.":"Enter the full email address.","계정 추가":"Add account","계정 (이메일)":"Account (email)",비밀번호:"Password","계정과 비밀번호가 이 PC에 평문으로 저장됩니다.":"Your account and password are stored in plain text on this PC.",저장:"Save",취소:"Cancel","계정과 비밀번호를 입력하세요.":"Enter an account and password.","이미 등록된 계정입니다.":"This account is already saved.","계정을 저장하지 못했습니다. 다시 시도하세요.":"Could not save the account. Try again.","계정 파일을 읽지 못했습니다. JSON 형식을 확인하세요.":"Could not read the account file. Check its JSON format.","+ 버튼으로 계정을 추가하세요.":"Use the + button to add an account.","현재 탭에서 선택한 계정으로 전환합니다.":"Switch to the selected account in this tab.","세션 검색 (제목 · 작업이름 · 폴더)":"Search sessions (title · task · folder)","검색·필터 지우기 (Esc)":"Clear search and filters (Esc)","계정 선택":"Select account","새 탭":"New tab","+ 새 탭":"+ New tab",설정:"Settings","화면 복구 (모든 탭 다시 그리기)":"Repair display (redraw all tabs)","미리보기 패널 (md · 이미지 · 표)":"Preview panel (Markdown · images · tables)",진행중:"Working",승인대기:"Awaiting approval","한도 도달":"Usage limit reached",완료:"Done",오류:"Error",대기:"Idle",기타:"Other","지난 세션":"Past sessions",어제:"Yesterday","● 열림":"● Open","탭 닫기":"Close tab","(제목 없음)":"(Untitled)","작업 이름":"Task name",닫기:"Close",모름:"Unknown","닫힌 Claude Code · Codex 세션 — 누르면 그 대화를 이어받는다":"Closed Claude Code · Codex sessions — click to resume","검색어와 맞는 지난 세션이 없다":"No past sessions match your search","Esc 또는 ✕ 로 전체 목록으로 돌아간다":"Press Esc or ✕ to show all sessions","상태순 정렬이 켜져 있어 순서를 바꿀 수 없다 — 설정에서 끄면 끌어서 옮길 수 있다":"Turn off status sorting in Settings to reorder tabs","이 탭으로 이동":"Go to tab","새 탭에서 이어받기":"Resume in new tab","분기해서 이어받기":"Fork conversation","세션 ID 복사":"Copy session ID","목록에서 숨기기":"Hide from list","↺ 자동 감지로":"↺ Detect automatically","↻ 화면 복구":"↻ Repair display","패널에 띄우기":"Open in panel","경로 붙여넣기":"Paste path","아무것도 하지 않는다":"Cancel","다시 묻지 않기":"Do not ask again","{name} 을 어떻게 할까요?":"What would you like to do with {name}?","{provider} 계정 선택":"Select {provider} account","{provider} 계정":"{provider} accounts","선택한 계정으로 이 대화를 새 탭에서 이어갑니다.":"Continue this conversation in a new tab with the selected account.","선택한 계정으로 새 대화를 엽니다.":"Start a new conversation with the selected account.","등록된 계정이 없습니다. accounts.json을 채워주세요.":"No saved accounts. Add accounts to accounts.json."," · 현재 계정":" · Current account","잔량 조회 중…":"Loading usage…","계정 저장 폴더를 준비하지 못했습니다.":"Could not prepare the account folder.","사용량 정보 없음":"Usage unavailable","원래 탭이 닫혔습니다. 계정 목록을 다시 여세요.":"The original tab was closed. Reopen the account list.","{name} 인증 확인 중…":"Checking authentication for {name}…","{name}: 열린 브라우저에서 로그인하세요. 인증정보는 자동 저장됩니다.":"{name}: Sign in using the browser. Authentication will be saved automatically.","인증을 저장했습니다. 원래 탭이 닫혀 새 대화에서 계정을 선택해야 합니다.":"Authentication saved. The original tab was closed; select the account in a new conversation.","계정 전환에 실패했습니다. 다시 선택하세요.":"Could not switch accounts. Please try again.","새 계정 탭을 열지 못했습니다.":"Could not open the account tab.","세션 {id}":"Session {id}","이미 열려 있다 — 누르면 그 탭으로 이동":"Already open — click to go to the tab","누르면 새 탭에서 이어받는다 ({id})":"Click to resume in a new tab ({id})","작업 폴더: {cwd}":"Working folder: {cwd}","※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다":"Only the conversation resumes; servers and background processes are not restarted.","{filter}에 걸리는 세션이 없다 (전체 {total}개)":"No sessions match {filter} ({total} total)"," · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":" · Expanded for search results (clear search to collapse)","{folder} (탭 {count}개) — 클릭하면 접기/펴기":"{folder} ({count} tabs) — click to collapse/expand","작업 폴더를 아직 모르는 탭 {count}개 — 클릭하면 접기/펴기":"{count} tabs without a known working folder — click to collapse/expand","탭 {count}개":"{count} tabs","{status} {count} — 클릭하면 필터 해제":"{status} {count} — click to clear filter","{status} {count} — 클릭하면 이 상태만":"{status} {count} — click to filter","{n}초":"{n}s","{n}분":"{n}m","{h}시간 {m}분":"{h}h {m}m","계정: {value}":"Account: {value}","버전: {value}":"Version: {value}","폴더: {value}":"Folder: {value}","{tool} 권한":"{tool} permission","입력 대기":"Waiting for input","플랜 승인":"Plan approval","질문 응답":"Answer a question","{time} 리셋":"Reset: {time}"};Object.keys(o);const a={en:o,...n.SIDEBAR_LOCALES};function s(e,t,i){var n,s,r;return("ko"===t?e:null!==(r=null!==(s=null===(n=a[t])||void 0===n?void 0:n[e])&&void 0!==s?s:o[e])&&void 0!==r?r:e).replace(/\{(\w+)\}/g,(e,t)=>{var n;return String(null!==(n=null==i?void 0:i[t])&&void 0!==n?n:e)})}t.sidebarText=s,t.sidebarMarkup=function(e,t){if("ko"===t)return e;for(const i of Object.keys(o).sort((e,t)=>t.length-e.length))i.includes("{")||(e=e.split(i).join(s(i,t)));return e},t.sidebarReason=function(e,t){const i=/^(\w+) 권한$/.exec(e);if(i)return s("{tool} 권한",t,{tool:i[1]});const n=/^(.*) 리셋$/.exec(e);return n?s("{time} 리셋",t,{time:n[1]}):["입력 대기","플랜 승인","질문 응답"].includes(e)?s(e,t):e},t.sidebarReset=function(e,i){var n;if(!e||"ko"===i)return e;const o=null!==(n=t.RESET_COPY[i])&&void 0!==n?n:t.RESET_COPY.en;if("곧 리셋"===e)return o[0];const a=e.replace(/(\d+)(일|시간|분)/g,(e,t,n)=>new Intl.NumberFormat(i,{style:"unit",unit:{일:"day",시간:"hour",분:"minute"}[n],unitDisplay:"narrow"}).format(Number(t))).replace(/ 뒤(?: 리셋)?$/,"");return(e.endsWith("리셋")?o[1]:o[2]).replace("{time}",a)},t.RESET_COPY={en:["Resets soon","Resets in {time}","{time} remaining","Available","Currently unavailable"],ko:["곧 리셋","{time} 뒤 리셋","{time} 뒤","사용 가능","현재 사용 불가"],af:["Herstel binnekort","Herstel oor {time}","{time} oor","Beskikbaar","Tans nie beskikbaar nie"],bg:["Скоро се нулира","Нулиране след {time}","Остават {time}","Налично","В момента недостъпно"],cs:["Brzy se obnoví","Obnovení za {time}","Zbývá {time}","Dostupné","Momentálně nedostupné"],da:["Nulstilles snart","Nulstilles om {time}","{time} tilbage","Tilgængelig","Ikke tilgængelig nu"],de:["Wird bald zurückgesetzt","Zurücksetzung in {time}","Noch {time}","Verfügbar","Derzeit nicht verfügbar"],es:["Se restablece pronto","Se restablece en {time}","Quedan {time}","Disponible","No disponible actualmente"],fr:["Réinitialisation imminente","Réinitialisation dans {time}","Encore {time}","Disponible","Actuellement indisponible"],hr:["Uskoro se poništava","Poništavanje za {time}","Preostaje {time}","Dostupno","Trenutno nedostupno"],id:["Segera direset","Direset dalam {time}","Tersisa {time}","Tersedia","Saat ini tidak tersedia"],it:["Ripristino imminente","Ripristino tra {time}","Mancano {time}","Disponibile","Attualmente non disponibile"],ja:["まもなくリセット","{time}後にリセット","あと{time}","利用可能","現在利用不可"],pl:["Wkrótce odnowienie","Odnowienie za {time}","Pozostało {time}","Dostępne","Obecnie niedostępne"],pt:["Reinicia em breve","Reinicia em {time}","Restam {time}","Disponível","Indisponível no momento"],ru:["Скоро сброс","Сброс через {time}","Осталось {time}","Доступно","Сейчас недоступно"],sr:["Ускоро се поништава","Поништавање за {time}","Преостало {time}","Доступно","Тренутно недоступно"],sv:["Återställs snart","Återställs om {time}","{time} kvar","Tillgänglig","Inte tillgänglig just nu"],tr:["Yakında sıfırlanacak","{time} sonra sıfırlanacak","{time} kaldı","Kullanılabilir","Şu anda kullanılamıyor"],uk:["Незабаром скидання","Скидання через {time}","Залишилося {time}","Доступно","Зараз недоступно"],"zh-CN":["即将重置","{time}后重置","剩余{time}","可用","当前不可用"],"zh-TW":["即將重設","{time}後重設","剩餘{time}","可用","目前無法使用"]}},9169(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.SIDEBAR_LOCALES=void 0;const o=n(i(4995)),a=n(i(1771)),s=n(i(5758)),r=n(i(8459)),d=n(i(1658)),l=n(i(3917)),c=n(i(1500)),u=n(i(2085)),p=n(i(9865)),h=n(i(5046)),g=n(i(8281)),f=n(i(710)),m=n(i(3070)),v=n(i(3940)),b=n(i(2255)),k=n(i(1948)),y=n(i(541)),w=n(i(9940)),x=n(i(4237)),S=n(i(6020));t.SIDEBAR_LOCALES={af:o.default,bg:a.default,cs:s.default,da:r.default,hr:d.default,id:l.default,pl:c.default,sr:u.default,sv:p.default,tr:h.default,ja:g.default,"zh-CN":f.default,"zh-TW":m.default,fr:v.default,de:b.default,es:k.default,it:y.default,pt:w.default,ru:x.default,uk:S.default}},6021(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkStatusService=void 0;const o=i(860),a=i(3961),s=["waiting","limited","error"],r=["running","done","error"];let d=class{constructor(){this.states=new Map,this.changed=new a.Subject,this.idled=new a.Subject,this.debug={attached:0,outputs:0,oscHits:0,titleHits:0}}get changed$(){return this.changed}get idled$(){return this.idled}get(e){let t=this.states.get(e);return t||(t={status:"idle",label:"",reason:"",since:Date.now(),pinned:!1,lastOutput:0,busyMode:!1,lastBusy:0},this.states.set(e,t)),t}setAuto(e,t){const i=this.get(e);i.pinned||i.status===t||(i.status=t,i.since=Date.now(),this.clearReasonUnlessWaiting(i),this.changed.next())}setManual(e,t,i,n){const o=this.get(e);o.status=t,o.since=Date.now(),o.pinned=!0,void 0!==i&&(o.label=i),o.reason=s.includes(t)&&null!=n?n:"",this.changed.next()}resume(e){const t=this.get(e);"waiting"===t.status&&(t.status="running",t.since=Date.now(),t.reason="",this.changed.next())}setLabel(e,t){this.get(e).label=t,this.changed.next()}unpin(e){const t=this.get(e);t.pinned=!1,t.status="idle",t.since=Date.now(),this.clearReasonUnlessWaiting(t),this.changed.next()}clearReasonUnlessWaiting(e){s.includes(e.status)||(e.reason="")}markOutput(e){this.get(e).lastOutput=Date.now()}markBusy(e){const t=this.get(e);t.busyMode=!0,t.lastBusy=Date.now()}isBusyMode(e){return this.get(e).busyMode}forget(e){this.states.delete(e),this.changed.next()}sweep(e){let t=0;for(const i of[...this.states.keys()])e.includes(i)||(this.states.delete(i),t++);return t>0&&this.changed.next(),t}tickIdle(e,t,i=0){const n=this.get(e);if(n.pinned){if(!(r.includes(n.status)&&i>0))return!1;const e=Math.max(n.since||0,n.lastOutput||0,n.lastBusy||0);return!(!e||Date.now()-e<=i||(n.pinned=!1,"running"===n.status&&(n.status="idle",n.since=Date.now(),this.clearReasonUnlessWaiting(n),this.idled.next()),0))}if("running"!==n.status)return!1;const o=n.busyMode?n.lastBusy:n.lastOutput;return!!(o&&Date.now()-o>t)&&(n.status="idle",n.since=Date.now(),this.clearReasonUnlessWaiting(n),this.idled.next(),!0)}};d=n([(0,o.Injectable)({providedIn:"root"})],d),t.WorkStatusService=d},906(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.uninstallStatusLine=t.installStatusLine=t.innerCommand=t.statusLineInstalled=t.unwrapStatusLine=t.wrapStatusLine=t.isWrapped=t.statusLineSupported=t.statusLineScriptPath=t.innerConfigPath=void 0;const s=a(i(9896)),r=a(i(6928)),d=i(7025),l=i(1786);function c(){return r.join((0,d.runtimeRoot)(),"statusline-inner.json")}function u(){return r.join(__dirname,"..","hooks","agentdeck-statusline.mjs")}function p(e){var t;const i=null==e?void 0:e.statusLine;return!!i&&"command"===i.type&&String(null!==(t=i.command)&&void 0!==t?t:"").includes("agentdeck-statusline")}function h(e,t){const i={...null!=e?e:{}},n=i.statusLine,o=p(i)?null:null!=n?n:null;return i.statusLine={type:"command",command:`node "${t.replace(/\\/g,"/")}"`},{next:i,inner:o}}function g(e,t){const i={...null!=e?e:{}};return p(i)?(t?i.statusLine=t:delete i.statusLine,i):i}function f(){try{const e=s.readFileSync((0,l.claudeSettingsPath)(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function m(e){const t=(0,l.claudeSettingsPath)();s.mkdirSync(r.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,t+".agentdeck-backup"),s.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}function v(){try{return JSON.parse(s.readFileSync(c(),"utf8"))}catch{return null}}t.innerConfigPath=c,t.statusLineScriptPath=u,t.statusLineSupported=function(){return s.existsSync(u())},t.isWrapped=p,t.wrapStatusLine=h,t.unwrapStatusLine=g,t.statusLineInstalled=function(){return p(f())},t.innerCommand=function(){var e;const t=v();return"command"===(null==t?void 0:t.type)?String(null!==(e=t.command)&&void 0!==e?e:""):""},t.installStatusLine=function(){const e=u();if(!s.existsSync(e))throw new Error(`statusLine 스크립트를 찾지 못했다: ${e}`);const{next:t,inner:i}=h(f(),e);if(null!==i){const e=c();s.mkdirSync(r.dirname(e),{recursive:!0}),s.writeFileSync(e,JSON.stringify(i,null,2)+"\n","utf8")}m(t)},t.uninstallStatusLine=function(){m(g(f(),v()));try{s.unlinkSync(c())}catch{}}},2348(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.syncStorageEnvironment=t.writeUserStorageEnvironment=void 0;const s=i(5317),r=a(i(857)),d=a(i(6928)),l=["CLAUDE_CONFIG_DIR","CODEX_HOME"];function c(e){return new Promise((t,i)=>{(0,s.execFile)(d.join(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"),["-NoProfile","-NonInteractive","-EncodedCommand",Buffer.from("\n$ErrorActionPreference = 'Stop'\n$values = ConvertFrom-Json $env:AGENTDECK_STORAGE_ENV_PAYLOAD\n$key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')\n$old = @{}\nforeach ($name in @('CLAUDE_CONFIG_DIR','CODEX_HOME')) { $old[$name] = $key.GetValue($name, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) }\ntry {\n foreach ($name in @('CLAUDE_CONFIG_DIR','CODEX_HOME')) {\n $value = $values.$name\n if ($null -eq $value) { $key.DeleteValue($name, $false) }\n else { $key.SetValue($name, [string]$value, [Microsoft.Win32.RegistryValueKind]::String) }\n }\n} catch {\n foreach ($name in $old.Keys) {\n if ($null -eq $old[$name]) { $key.DeleteValue($name, $false) }\n else { $key.SetValue($name, [string]$old[$name]) }\n }\n throw\n} finally { $key.Dispose() }\n$old | ConvertTo-Json -Compress\ntry {\n Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class AgentDeckEnvironmentNotify { [DllImport(\"user32.dll\", CharSet=CharSet.Unicode)] public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, UIntPtr wParam, string lParam, uint flags, uint timeout, out UIntPtr result); }'\n $result = [UIntPtr]::Zero\n [void][AgentDeckEnvironmentNotify]::SendMessageTimeout([IntPtr]0xffff, 0x1a, [UIntPtr]::Zero, 'Environment', 2, 1000, [ref]$result)\n} catch { }\n","utf16le").toString("base64")],{windowsHide:!0,timeout:15e3,env:{...process.env,AGENTDECK_STORAGE_ENV_PAYLOAD:JSON.stringify(e)}},(e,n)=>{if(e)i(new Error("storage.environment"));else try{t(JSON.parse(n.trim()))}catch{i(new Error("storage.environment"))}})})}t.writeUserStorageEnvironment=c,t.syncStorageEnvironment=async function(e){if("win32"!==process.platform)return async()=>{};const t={CLAUDE_CONFIG_DIR:e.claudeStorageDir||null,CODEX_HOME:e.codexStorageDir||null},i=await c(t),n=Object.fromEntries(l.map(e=>[e,process.env[e]]));for(const e of l)process.env[e]=t[e]||d.join(r.homedir(),"CODEX_HOME"===e?".codex":".claude");return async()=>{await c(i);for(const e of l)void 0===n[e]?delete process.env[e]:process.env[e]=n[e]}}},8209(e,t){t.storageText=void 0;const i={head:"Storage locations",intro:"Folder selections and completed edits are saved automatically. Applies after restarting Tabby. Empty fields use the defaults shown below. Existing files are not moved. To keep your accounts and history, close all agent sessions and copy the old folders to the new locations before restarting.",default:"Default",pending:"Unsaved changes — saves when you finish editing or leave this page.",accountStorageDir:"Account data folder",claudeStorageDir:"Claude data folder",codexStorageDir:"Codex data folder",accounts:"Contains the account list and each account’s private sign-in data.",agents:"Contains shared conversations, settings and skills. Generated code and documents stay in the working folder below. Explicit terminal-profile paths take precedence.",save:"Save paths",reset:"Use defaults",saved:"Paths and Windows user environment variables saved. Fully restart Tabby and your agents to apply. Running sessions keep their current folders.",environment:"Could not update the Windows user environment variables. Your input has been kept; retry saving.",environmentRollback:"Saving failed and the environment variables could not be restored. Retry saving before restarting.",absolute:"Enter an absolute folder path.",directory:"The selected path is a file. Choose a folder.",separate:"Use separate, non-nested folders for account, Claude and Codex data.",failed:"Could not save the paths. Your input has been kept. Check disk space and folder access, then retry Save paths.",working:"Changes apply to new tabs. Existing working files are not moved."},n={head:"저장 경로",intro:"폴더를 선택하거나 입력을 마치면 자동 저장됩니다. Tabby를 다시 시작하면 적용됩니다. 빈칸은 표시된 기본 경로를 사용합니다. 기존 파일은 자동 이동하지 않습니다. 계정과 기록을 유지하려면 모든 에이전트 세션을 종료하고 기존 폴더를 새 위치에 복사한 뒤 다시 시작하세요.",default:"기본값",pending:"저장 전 변경사항이 있습니다. 입력을 마치거나 이 화면을 나가면 자동 저장합니다.",accountStorageDir:"계정 데이터 폴더",claudeStorageDir:"Claude 데이터 폴더",codexStorageDir:"Codex 데이터 폴더",accounts:"등록 계정 목록과 계정별 로그인 정보를 저장합니다.",agents:"공유 대화 기록·설정·스킬을 저장합니다. 작성한 코드와 문서는 아래 작업 폴더에 저장됩니다. 터미널 프로필에 직접 지정한 경로가 있으면 그 값을 우선합니다.",save:"경로 저장",reset:"기본값 사용",saved:"경로와 Windows 사용자 환경변수를 저장했습니다. Tabby와 에이전트를 완전히 종료한 뒤 다시 실행하세요. 실행 중인 세션은 현재 폴더를 계속 사용합니다.",environment:"Windows 사용자 환경변수를 저장하지 못했습니다. 입력값은 유지됩니다. 다시 저장하세요.",environmentRollback:"저장 실패 후 환경변수를 복원하지 못했습니다. 다시 시작하기 전에 경로 저장을 재시도하세요.",absolute:"폴더의 절대 경로를 입력하세요.",directory:"파일 경로입니다. 폴더를 선택하세요.",separate:"계정·Claude·Codex 폴더는 서로 겹치거나 포함되지 않는 별도 경로로 지정하세요.",failed:"저장하지 못했습니다. 입력한 경로는 유지했습니다. 디스크 여유 공간과 폴더 권한을 확인한 뒤 경로 저장을 다시 누르세요.",working:"새 탭부터 적용됩니다. 기존 작업 파일은 이동하지 않습니다."};t.storageText=function(e,t){return("ko"===t?n:i)[e.replace(/^storage\./,"")]||e}},7025(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.validateStoragePaths=t.storageEnvironment=t.hasConfiguredAgentHome=t.agentHome=t.runtimeEnvironment=t.runtimeRoot=t.accountsFile=t.storageDefaults=t.configureStoragePaths=t.STORAGE_KEYS=void 0;const s=a(i(9896)),r=a(i(857)),d=a(i(6928)),l=i(6982);t.STORAGE_KEYS=["accountStorageDir","claudeStorageDir","codexStorageDir"];const c={accountFile:process.env.AGENTDECK_ACCOUNTS_FILE||d.join(r.homedir(),".agentdeck","accounts.json"),claudeStorageDir:process.env.CLAUDE_CONFIG_DIR||d.join(r.homedir(),".claude"),codexStorageDir:process.env.CODEX_HOME||d.join(r.homedir(),".codex")};let u={accountStorageDir:"",claudeStorageDir:"",codexStorageDir:""};function p(){return{accountStorageDir:d.dirname(c.accountFile),claudeStorageDir:process.env.CLAUDE_CONFIG_DIR||d.join(r.homedir(),".claude"),codexStorageDir:process.env.CODEX_HOME||d.join(r.homedir(),".codex")}}function h(){return u.accountStorageDir?d.join(u.accountStorageDir,"accounts.json"):c.accountFile}function g(){const e=d.join(d.dirname(h()),"runtime"),t=process.env.TABBY_CONFIG_DIRECTORY;return t?d.join(e,(0,l.createHash)("sha256").update(d.resolve(t).toLowerCase()).digest("hex").slice(0,16)):e}t.configureStoragePaths=function(e){u=Object.fromEntries(t.STORAGE_KEYS.map(t=>[t,String(e[t]||"").trim()]))},t.storageDefaults=p,t.accountsFile=h,t.runtimeRoot=g,t.runtimeEnvironment=function(){return{AGENTDECK_RUNTIME_ROOT:g(),AGENTDECK_MAILBOX_ROOT:d.join(g(),"mailbox")}},t.agentHome=function(e){const t="claude"===e?"claudeStorageDir":"codexStorageDir";return u[t]||p()[t]},t.hasConfiguredAgentHome=function(e){return!!u["claude"===e?"claudeStorageDir":"codexStorageDir"]},t.storageEnvironment=function(e={}){return{...u.claudeStorageDir?{CLAUDE_CONFIG_DIR:u.claudeStorageDir}:{},...u.codexStorageDir?{CODEX_HOME:u.codexStorageDir}:{},...e}},t.validateStoragePaths=function(e){const i={};for(const n of t.STORAGE_KEYS){const t=String(e[n]||"").trim();if(t&&(!d.isAbsolute(t)||/[\x00-\x1f]/.test(t)))throw new Error("storage.absolute");if(t){if("win32"===process.platform&&/[<>"|?*]/.test(t))throw new Error("storage.absolute");let e=t;for(;!s.existsSync(e)&&d.dirname(e)!==e;)e=d.dirname(e);if(s.existsSync(e)&&!s.statSync(e).isDirectory())throw new Error("storage.directory")}i[n]=t?d.normalize(t):""}const n=p(),o=t.STORAGE_KEYS.map(e=>d.resolve(i[e]||n[e]));for(let e=0;e<o.length;e++)for(let t=e+1;t<o.length;t++){const i=d.relative(o[e],o[t]),n=d.relative(o[t],o[e]),a=e=>!e||!e.startsWith(".."+d.sep)&&".."!==e&&!d.isAbsolute(e);if(a(i)||a(n))throw new Error("storage.separate")}return i}},1584(e,t,i){t.storageSettingsFor=void 0;const n=i(7025),o=i(2348);class a{constructor(e,t=o.syncStorageEnvironment){this.config=e,this.syncEnvironment=t,this.message="",this.error=!1,this.busy=!1,this.revision=0,this.queuedRevision=-1,this.pending=0,this.queue=Promise.resolve(),this.draft=this.savedPaths()}savedPaths(){return Object.fromEntries(n.STORAGE_KEYS.map(e=>[e,this.config.store.agentDeck[e]||""]))}change(e,t){this.draft[e]=t,this.revision++,this.error=!1,this.message="pending"}save(){if(this.queuedRevision===this.revision&&this.pending)return this.queue;const e=this.revision,t={...this.draft};return this.queuedRevision=e,this.pending++,this.busy=!0,this.queue=this.queue.then(async()=>{const i=this.savedPaths();let o;try{const i=(0,n.validateStoragePaths)(t);o=await this.syncEnvironment(i),Object.assign(this.config.store.agentDeck,i),await this.config.save(),this.revision===e&&(this.draft=i,this.error=!1,this.message="saved")}catch(t){if(Object.assign(this.config.store.agentDeck,i),o)try{await o()}catch{t=new Error("storage.environmentRollback")}this.revision===e&&(this.error=!0,this.message=String((null==t?void 0:t.message)||"").startsWith("storage.")?t.message:"failed")}finally{this.pending--,this.busy=this.pending>0}}),this.queue}flush(){"pending"===this.message&&this.save()}}const s=new WeakMap;t.storageSettingsFor=function(e){let t=s.get(e);return t||(t=new a(e),s.set(e,t)),t}},7507(e,t){t.matchesSessionTranscript=t.formatLiveAgentTooltip=t.summarizeLiveAgents=t.formatSubagentTooltip=t.summarizeSubagents=t.feedChunk=t.createSubagentState=t.oq=void 0,t.oq=["Agent","Task"];const i="<task-notification>",n=/<tool-use-id>([^<]*)<\/tool-use-id>/,o=/<status>([^<]*)<\/status>/,a=/^[A-Za-z0-9_-]{4,200}$/,s=["running","pending","in_progress","in-progress","started","queued"];function r(e,t){let r=0;for(;;){const d=t.indexOf(i,r);if(d<0)return;const l=d+19,c=t.indexOf("</task-notification>",l),u=c<0?t.slice(l):t.slice(l,c);r=c<0?t.length:c+20;const p=n.exec(u);if(!p)continue;const h=p[1].trim();if(!a.test(h))continue;const g=o.exec(u);g&&s.indexOf(g[1].trim().toLowerCase())>=0||e.done.add(h)}}function d(e){if(e.indexOf("tool_use")<0)return!1;for(const i of t.oq)if(e.indexOf(i)>=0)return!0;return!1}function l(e,i){var n,o;let s;try{s=JSON.parse(i)}catch{return void e.skipped++}if(!s||"object"!=typeof s||!0===s.isSidechain)return;const r=null===(n=s.message)||void 0===n?void 0:n.content;if(Array.isArray(r))for(const i of r){if(!i||"object"!=typeof i)continue;if("tool_use"!==i.type||t.oq.indexOf(String(i.name))<0)continue;const n=String(null!==(o=i.id)&&void 0!==o?o:"").trim();if(!a.test(n)||e.calls.has(n))continue;const r=i.input&&"object"==typeof i.input?i.input:{},d="string"==typeof r.description?r.description.trim():"",l="string"==typeof r.subagent_type&&r.subagent_type.trim()?r.subagent_type.trim():null,c="string"==typeof s.timestamp&&s.timestamp?s.timestamp:null;e.calls.set(n,{id:n,description:d,subagentType:l,startedAt:c})}}t.createSubagentState=function(){return{calls:new Map,done:new Set,pending:"",lines:0,skipped:0,dropped:0}},t.feedChunk=function(e,t){var n;const o="string"==typeof t?t:"";if(!o)return e;const a=(e.pending+o).split("\n");return e.pending=null!==(n=a.pop())&&void 0!==n?n:"",e.pending.length>4194304&&(e.dropped++,e.pending=""),function(e,t){for(const n of null!=t?t:[]){if("string"!=typeof n)continue;e.lines++;const t=13===n.charCodeAt(n.length-1)?n.slice(0,-1):n;t&&(t.indexOf(i)>=0&&r(e,t),d(t)&&l(e,t))}return e}(e,a)},t.summarizeSubagents=function(e){const t=e;if(!(t&&t.calls instanceof Map))return{running:0,items:[],calls:0,done:0};const i=[];for(const e of t.calls.values())t.done.has(e.id)||i.push(e);return{running:i.length,items:i,calls:t.calls.size,done:t.done.size}},t.formatSubagentTooltip=function(e,t=8){var i;const n=null!==(i=null==e?void 0:e.items)&&void 0!==i?i:[];if(!n.length)return"";const o=Number.isFinite(t)&&t>0?Math.floor(t):n.length,a="서브에이전트 "+n.length+"개 진행중",s=n.slice(0,o).map(e=>{return"· "+((t=e).description||t.subagentType||"(설명 없음)");var t});return n.length>o&&s.push("· … 외 "+(n.length-o)+"개"),[a,...s].join("\n")},t.summarizeLiveAgents=function(e){var t;const i=new Map;let n=0,o=0;for(const a of null!=e?e:[]){if(!a||!a.id)continue;n++;const e=a.type||"이름 없음";i.set(e,(null!==(t=i.get(e))&&void 0!==t?t:0)+1),Number.isFinite(a.at)&&a.at>0&&(!o||a.at<o)&&(o=a.at)}return{running:n,byType:[...i].map(([e,t])=>({type:e,count:t})).sort((e,t)=>t.count-e.count||e.type.localeCompare(t.type)),oldestAt:o}},t.formatLiveAgentTooltip=function(e){const t=e;return!t||t.running<=0?"":["서브에이전트 "+t.running+"개 진행중",...t.byType.map(e=>"· "+e.type+" "+e.count+"개")].join("\n")},t.matchesSessionTranscript=function(e,t){const i=String(null!=e?e:"").trim().toLowerCase(),n=String(null!=t?t:"").trim().toLowerCase();return!!(i&&n&&a.test(n))&&i===n+".jsonl"}},673(e,t){t.SynchronizedOutputStream=void 0,t.SynchronizedOutputStream=class{constructor(){this.pending=""}write(e,t){if(this.pending+=e,!t||this.pending.length>1048576)return this.flush();const i="[?2026h";if(this.pending.lastIndexOf(i)>this.pending.lastIndexOf("[?2026l"))return"";for(let e=1;e<8;e++)if(this.pending.endsWith(i.slice(0,e)))return"";return this.flush()}get waiting(){return!!this.pending}flush(){const e=this.pending;return this.pending="",e}}},9888(e,t){t.pickTabByTabId=t.newTabId=t.TAB_ENV=void 0,t.TAB_ENV="AGENTDECK_TAB",t.newTabId=function(){const e=new Uint8Array(6),t=globalThis.crypto;if(t&&"function"==typeof t.getRandomValues)t.getRandomValues(e);else for(let t=0;t<e.length;t++)e[t]=Math.floor(256*Math.random());return Array.from(e,e=>e.toString(16).padStart(2,"0")).join("")},t.pickTabByTabId=function(e,t){const i="string"==typeof e?e.trim():"";if(!i)return null;for(const[e,n]of t)if(n.includes(i))return e;return null}},568(e,t){t.canRepairComposer=t.newlineSequence=void 0,t.newlineSequence=function(e){return"codex"===e?"\r":"\n"},t.canRepairComposer=function(e){return"claude"===e}},9610(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__decorate||function(e,t,i,n){var o,a=arguments.length,s=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(s=(a<3?o(s):a>3?o(t,i,s):o(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t},r=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckUpdateService=void 0;const d=i(860),l=i(7650),c=i(5317),u=s(i(9896)),p=s(i(8611)),h=s(i(5692)),g=s(i(857)),f=s(i(6928)),m=i(7797),v=i(8450),b=i(2023);let k=class{constructor(e,t,i,n,o){this.app=e,this.config=t,this.platform=i,this.notifications=n,this.reloader=o,this.pending=null,this.notifiedVersions=new Set,this.initialized=!1}init(){this.app.ready$.subscribe(()=>{var e;if(this.initialized)return;this.initialized=!0;const t=globalThis;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.update={run:(e=!0)=>this.run("diag",e),installAndReload:(e,t)=>this.installAndReload((0,m.pluginVersion)(),e,t),installedVersion:()=>this.installedVersion(),marks:()=>this.installMarks(),canSelfUpdate:()=>(0,b.canSelfUpdate)(this.installMarks()),pluginsDir:()=>this.pluginsDir(),version:()=>(0,m.pluginVersion)()},this.run("startup")})}run(e,t=!1){return this.pending||(this.pending=Promise.resolve().then(()=>this.check(e,t)).finally(()=>{this.pending=null})),this.pending}async check(e,t){const i=this.config.store.agentDeck,n=(0,m.pluginVersion)(),o=this.installMarks(),a=!(0,b.canSelfUpdate)(o);if(!1===i.autoUpdate)return(0,m.diag)(`update skip=disabled reason=${e}`),"disabled";let s=null;try{s=(0,b.parseLatestVersion)(await this.fetch((0,b.latestUrl)(i.updateRegistry)))}catch(e){(0,m.diagCatch)("update 레지스트리 조회",e)}null!==s&&(i.lastUpdateCheck=Date.now(),this.config.save());const r=(0,b.decide)({enabled:!0,lastCheckAt:0,now:Date.now(),intervalHours:0,devInstall:a,current:n,latest:s});if((0,m.diag)(`update check=${e} current=${n} latest=${null!=s?s:"?"} outcome=${r} dev=${a} marks=${JSON.stringify(o)}`),("dev-install"===r||"update-ready"===r)&&!t&&this.notifiedVersions.has(s))return"skipped";if("dev-install"===r)return this.notifiedVersions.add(s),this.notifications.info(`AgentDeck ${s} 가 나왔다 (지금 ${n})`,"개발 설치(소스 링크)라 자동으로 갈아끼우지 않는다. 소스에서 직접 올릴 것."),r;if("update-ready"!==r)return r;if(!t&&i.updateSkipVersion===s)return(0,m.diag)(`update skip=asked-not-to version=${s}`),"skipped";this.notifiedVersions.add(s);const d=await this.confirmAndInstall(n,s);return"failed"===d&&this.notifiedVersions.delete(s),d}async confirmAndInstall(e,t){const i=await this.platform.showMessageBox({type:"warning",message:`AgentDeck ${t} 로 업데이트할까요? (지금 ${e})`,detail:["누르면 이렇게 됩니다:"," 1. 백그라운드에서 새 버전을 내려받아 설치합니다"," 2. 창을 한 번 새로 고쳐 새 버전으로 갈아탑니다 (몇 초)","","열린 탭과 돌고 있는 세션은 그대로 유지됩니다 — Tabby 는 닫히지 않습니다."].join("\n"),buttons:["지금 업데이트","나중에","다시 묻지 않기"],defaultId:0,cancelId:1});return 2===i.response?(this.config.store.agentDeck.updateSkipVersion=t,this.config.save(),(0,m.diag)(`update skip-version=${t}`),"skipped"):0!==i.response?"postponed":this.installAndReload(e,t)}async installAndReload(e,t,i){var n;this.notifications.info(`AgentDeck ${t} 를 설치하는 중…`,"끝나면 창을 한 번 새로 고친다");let o=null;try{o=await this.runUpdater(t,i)}catch(e){return(0,m.diagCatch)("update 설치 스크립트 기동",e),this.notifications.error("업데이트를 시작하지 못했다",`${null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e} — 설정 → 플러그인 에서 직접 업데이트할 수 있다.`),"failed"}const a=this.installedVersion();if(!(0,b.installSucceeded)(t,a))return(0,m.diag)(`update install failed exit=${o} onDisk=${null!=a?a:"?"} want=${t}`),this.notifications.error(`AgentDeck ${t} 설치에 실패했다`,`지금도 ${null!=a?a:e} 다 — %LOCALAPPDATA%\\tabby-agentdeck\\update.log 에 npm 출력이 남는다.`),"failed";(0,m.diag)(`update installed ${e} -> ${t}, reloading`);let s=!1;try{s=await this.reloader.reload(`update:${t}`)}catch(e){(0,m.diagCatch)("update 리로드",e)}return s?"installing":((0,m.diag)(`update reload skipped ${t} — 다음 기동에 적용`),this.notifications.info(`AgentDeck ${t} 설치 완료`,"Tabby 를 다시 켜면 적용된다 (창을 새로 고치지 못했다)."),"installed")}runUpdater(e,t){const i=f.join(__dirname,"..","updater","agentdeck-update.ps1");if(!u.existsSync(i))throw new Error(`설치 스크립트를 찾지 못했다: ${i}`);const n=u.mkdtempSync(f.join(g.tmpdir(),"agentdeck-up-")),o=f.join(n,"agentdeck-update.ps1");u.copyFileSync(i,o);const a=this.pluginsDir();if(!a)throw new Error("Tabby 플러그인 폴더를 찾지 못했다");const s=["-NoProfile","-ExecutionPolicy","Bypass","-WindowStyle","Hidden","-File",o,"-Version",e,"-PluginsDir",a,"-TabbyExe",process.execPath,"-InPlace"];t&&s.push("-Spec",t);const r=(0,c.spawn)("powershell.exe",s,{stdio:"ignore"});return(0,m.diag)(`update updater spawned pid=${r.pid} script=${o}`),new Promise((e,t)=>{const i=setTimeout(()=>{r.kill(),t(new Error("설치가 시간 안에 끝나지 않았다"))},3e5);r.on("error",e=>{clearTimeout(i),t(e)}),r.on("exit",t=>{clearTimeout(i),(0,m.diag)(`update updater exit=${t}`),e(t)})})}installedVersion(){var e;try{const t=this.pluginsDir();if(!t)return null;const i=f.join(t,"node_modules",b.PACKAGE_NAME,"package.json");return null!==(e=JSON.parse(u.readFileSync(i,"utf8")).version)&&void 0!==e?e:null}catch{return null}}pluginsDir(){var e,t;try{const i=null===(t=(e=this.platform).getConfigPath)||void 0===t?void 0:t.call(e);return i?f.join(f.dirname(i),"plugins"):null}catch{return null}}installMarks(){const e=f.join(__dirname,".."),t=t=>{try{return u.existsSync(f.join(e,t))}catch{return!1}};return{hasSrc:t("src"),hasGit:t(".git"),hasWebpackConfig:t("webpack.config.js"),isLink:this.pluginEntryIsLink()}}pluginEntryIsLink(){try{const e=this.pluginsDir();return!!e&&u.lstatSync(f.join(e,"node_modules",b.PACKAGE_NAME)).isSymbolicLink()}catch{return!1}}fetch(e){return new Promise((t,i)=>{const n=(e.startsWith("http://")?p:h).get(e,{headers:{accept:"application/json"}},e=>{if(200!==e.statusCode)return e.resume(),void i(new Error(`HTTP ${e.statusCode}`));let o="";e.setEncoding("utf8"),e.on("data",e=>{o+=e,o.length>524288&&n.destroy(new Error("응답이 너무 크다"))}),e.on("end",()=>t(o))});n.setTimeout(6e3,()=>n.destroy(new Error("시간 초과"))),n.on("error",i)})}};k=a([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.AppService,l.ConfigService,l.PlatformService,l.NotificationsService,v.AgentDeckReloadService])],k),t.AgentDeckUpdateService=k},2023(e,t){function i(e){var t;if("string"!=typeof e)return null;const i=/^\s*v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?\s*$/.exec(e);return i?{nums:[Number(i[1]),Number(i[2]),Number(i[3])],pre:null!==(t=i[4])&&void 0!==t?t:null}:null}function n(e,t){const n=i(e),o=i(t);if(!n||!o)return null;for(let e=0;e<3;e++)if(n.nums[e]!==o.nums[e])return n.nums[e]<o.nums[e]?-1:1;if(n.pre===o.pre)return 0;if(null===n.pre)return 1;if(null===o.pre)return-1;const a=n.pre.split("."),s=o.pre.split(".");for(let e=0;e<Math.max(a.length,s.length);e++){const t=a[e],i=s[e];if(void 0===t)return-1;if(void 0===i)return 1;const n=/^\d+$/.test(t),o=/^\d+$/.test(i);if(n&&o){if(Number(t)!==Number(i))return Number(t)<Number(i)?-1:1}else if(t!==i)return t<i?-1:1}return 0}t.decide=t.installSucceeded=t.canSelfUpdate=t.latestUrl=t.parseLatestVersion=t.PACKAGE_NAME=t.sx=void 0,t.sx="https://registry.npmjs.org",t.PACKAGE_NAME="tabby-agentdeck",t.parseLatestVersion=function(e){var t;try{const n=null===(t=JSON.parse(e))||void 0===t?void 0:t.version;return i(n)?String(n).trim():null}catch{return null}},t.latestUrl=function(e,i=t.PACKAGE_NAME){return`${(e||t.sx).replace(/\/+$/,"")}/${encodeURIComponent(i)}/latest`},t.canSelfUpdate=function(e){return!(e.hasSrc||e.hasGit||e.hasWebpackConfig||e.isLink)},t.installSucceeded=function(e,t){return 0===n(t,e)},t.decide=function(e){return e.enabled?function(e,t,i){const n=Number(e)||0;return n>t||t-n>=36e5*Math.max(0,Number(i)||0)}(e.lastCheckAt,e.now,e.intervalHours)?null===e.latest?"unknown":(t=e.current,i=e.latest,-1===n(t,i)?e.devInstall?"dev-install":"update-ready":"up-to-date"):"too-soon":"disabled";var t,i}},3097(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,o)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ViewPanel=t.MIN_VIEW_W=t.VIEW_ID=void 0;const s=i(5317),r=a(i(9896)),d=a(i(6928)),l=i(8347),c=i(7604),u=i(7859),p=i(1933);t.VIEW_ID="agentdeck-view",t.MIN_VIEW_W=260;const h=15e5,g=h,f={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif",svg:"image/svg+xml"};function m(e){var t;const i=null!==(t=String(null!=e?e:"").split("\n").map(e=>e.trim()).filter(e=>e)[0])&&void 0!==t?t:"";return i.length>200?i.slice(0,200)+"…":i}function v(e){try{const t=r.statSync(e);if(t.isDirectory())return"폴더";const i=new Date(t.mtimeMs),n=String(i.getHours()).padStart(2,"0"),o=String(i.getMinutes()).padStart(2,"0");return(0,c.formatBytes)(t.size)+" · "+n+":"+o}catch{return"지금은 없다"}}function b(e,t){try{const i=r.statSync(e);return!i.isFile()||i.size>t?null:"data:"+function(e){var t;return null!==(t=f[d.extname(e).slice(1).toLowerCase()])&&void 0!==t?t:"application/octet-stream"}(e)+";base64,"+r.readFileSync(e).toString("base64")}catch{return null}}function k(e,t){const i=r.readFileSync(e),n=i.length>t;let o=i.slice(0,n?t:i.length).toString("utf8");return 65279===o.charCodeAt(0)&&(o=o.slice(1)),{text:o,truncated:n}}function y(e){try{return r.accessSync(e,r.constants.W_OK),!0}catch{return!1}}t.ViewPanel=class{constructor(e){this.host=e,this.el=null,this.bodyEl=null,this.tabsEl=null,this.titleEl=null,this.footEl=null,this.pathRow=null,this.pathInput=null,this.modesEl=null,this.scopeBtn=null,this.diffScope="session",this.diffHidden=0,this.diffDebug=null,this.commitEl=null,this.commitInput=null,this.commitBtn=null,this.commitSumEl=null,this.commitNoteEl=null,this.refNoteEl=null,this.refSel=null,this.refLastSent=null,this.refFlashTimer=null,this.mode="file",this.diffSeq=0,this.diffAutoAt=0,this.diffRoot=null,this.statusEntries=[],this.statusByPath=new Map,this.commitArmed=!1,this.gitBusy=!1,this.opened=!1,this.visible=!0,this.current=null,this.watching=null,this.recent=new WeakMap,this.lastViewed=new WeakMap,this.activeTab=null,this.editing=!1,this.editArea=null,this.editBarEl=null,this.editNoteEl=null,this.editSaveBtn=null,this.editOrigin=null,this.editForceArmed=!1,this.pathCreateArmed=null,this.editStale=!1,this.editOverwriteArmed=!1,this.findRow=null,this.findInput=null,this.findCountEl=null,this.findHits=[],this.findIndex=-1,this.buffers=new WeakMap,this.scrapeTimers=new WeakMap,this.resizing=!1}get isOpen(){return this.opened}extent(e){if(!this.opened||!this.visible)return 0;const i=this.host.getWidth()||420;return Math.min(Math.max(i,t.MIN_VIEW_W),Math.max(e,t.MIN_VIEW_W))}setOpen(e,t=!0){this.opened!==e&&(this.opened=e,this.syncDisplay(),t&&this.host.setOpen(e),e?(this.renderTabs(),"diff"===this.mode?this.refreshDiff():this.applyTabFile()||(this.current?(this.watch(this.current),this.renderCurrent()):this.renderEmpty())):(this.unwatch(),this.disarmCommit()),this.host.relayout())}toggle(){this.setOpen(!this.opened)}setVisible(e){this.visible!==e&&(this.visible=e,this.syncDisplay(),e||this.unwatch())}syncDisplay(){this.el&&(this.el.style.display=this.opened&&this.visible?"flex":"none")}install(){const e=document.createElement("div");e.id=t.VIEW_ID,e.style.display=this.opened?"flex":"none",e.innerHTML=['<div class="ad-view-head">',' <span class="ad-view-title">미리보기</span>',' <span class="ad-view-tools">',' <button class="ad-view-btn ad-view-findbtn" title="찾기 (Ctrl+F)">🔍</button>',' <button class="ad-view-btn ad-view-editbtn" title="편집 (저장 Ctrl+S)">✎</button>',' <button class="ad-view-btn ad-view-pathbtn" title="경로로 열기">+</button>',' <button class="ad-view-btn ad-view-reload" title="다시 읽기">⟳</button>',' <button class="ad-view-btn ad-view-close" title="패널 닫기">✕</button>'," </span>","</div>",'<div class="ad-view-path" style="display:none">',' <input type="text" spellcheck="false" placeholder="D:/Project/... 또는 상대경로">',' <span class="ad-view-path-note"></span>',"</div>",'<div class="ad-view-modes">',' <button class="ad-view-mode ad-view-mode-on" data-ad-mode="file">파일</button>',' <button class="ad-view-mode" data-ad-mode="diff">변경</button>',' <button class="ad-view-scope" style="display:none" title="변경 목록의 범위">세션</button>',"</div>",'<div class="ad-view-find" style="display:none">',' <input type="text" class="ad-view-find-input" spellcheck="false" placeholder="찾기">',' <span class="ad-view-find-count"></span>',' <button class="ad-view-btn ad-view-find-prev" title="이전 (Shift+Enter)">‹</button>',' <button class="ad-view-btn ad-view-find-next" title="다음 (Enter)">›</button>',' <button class="ad-view-btn ad-view-find-close" title="닫기 (Esc)">✕</button>',"</div>",'<div class="ad-view-tabs"></div>','<div class="ad-view-body" tabindex="0"></div>','<div class="ad-view-editbar" style="display:none">',' <span class="ad-view-edit-note"></span>',' <span class="ad-view-edit-btns">',' <button class="ad-view-edit-save">저장</button>',' <button class="ad-view-edit-cancel">취소</button>'," </span>","</div>",'<div class="ad-view-ref" style="display:none"></div>','<div class="ad-view-commit" style="display:none">',' <div class="ad-view-commit-sum"></div>',' <div class="ad-view-commit-row">',' <input type="text" class="ad-view-commit-msg" spellcheck="false" placeholder="커밋 메시지">',' <button class="ad-view-commit-go" disabled>커밋</button>'," </div>",' <div class="ad-view-commit-note"></div>',"</div>",'<div class="ad-view-foot"></div>','<div class="ad-view-resize"></div>'].join("\n"),this.host.windowEl.appendChild(e),this.el=e,this.bodyEl=e.querySelector(".ad-view-body"),this.tabsEl=e.querySelector(".ad-view-tabs"),this.titleEl=e.querySelector(".ad-view-title"),this.footEl=e.querySelector(".ad-view-foot"),this.pathRow=e.querySelector(".ad-view-path"),this.pathInput=e.querySelector(".ad-view-path input"),this.modesEl=e.querySelector(".ad-view-modes"),this.commitEl=e.querySelector(".ad-view-commit"),this.commitInput=e.querySelector(".ad-view-commit-msg"),this.commitBtn=e.querySelector(".ad-view-commit-go"),this.commitSumEl=e.querySelector(".ad-view-commit-sum"),this.commitNoteEl=e.querySelector(".ad-view-commit-note"),this.refNoteEl=e.querySelector(".ad-view-ref"),this.editBarEl=e.querySelector(".ad-view-editbar"),this.editNoteEl=e.querySelector(".ad-view-edit-note"),this.editSaveBtn=e.querySelector(".ad-view-edit-save"),this.findRow=e.querySelector(".ad-view-find"),this.findInput=e.querySelector(".ad-view-find-input"),this.findCountEl=e.querySelector(".ad-view-find-count"),this.scopeBtn=e.querySelector(".ad-view-scope"),this.modesEl.addEventListener("click",e=>{var t,i;const n=null===(i=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===i?void 0:i.call(t,"[data-ad-mode]");n&&this.setMode("diff"===n.getAttribute("data-ad-mode")?"diff":"file")}),this.scopeBtn.addEventListener("click",()=>this.toggleScope()),this.applyScopeLabel(),e.querySelector(".ad-view-close").addEventListener("click",()=>this.setOpen(!1)),e.querySelector(".ad-view-reload").addEventListener("click",()=>this.reload()),e.querySelector(".ad-view-pathbtn").addEventListener("click",()=>this.togglePathRow()),e.querySelector(".ad-view-editbtn").addEventListener("click",()=>this.toggleEdit()),e.querySelector(".ad-view-findbtn").addEventListener("click",()=>this.openFind()),e.querySelector(".ad-view-edit-save").addEventListener("click",()=>this.saveEdit()),e.querySelector(".ad-view-edit-cancel").addEventListener("click",()=>this.cancelEdit()),e.querySelector(".ad-view-find-next").addEventListener("click",()=>this.stepFind(1)),e.querySelector(".ad-view-find-prev").addEventListener("click",()=>this.stepFind(-1)),e.querySelector(".ad-view-find-close").addEventListener("click",()=>this.closeFind()),this.findInput.addEventListener("input",()=>this.runFind()),this.findInput.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key?(e.preventDefault(),this.stepFind(e.shiftKey?-1:1)):"Escape"===e.key&&(e.preventDefault(),this.closeFind())}),e.addEventListener("keydown",e=>{const t=e.ctrlKey||e.metaKey;!t||"f"!==e.key&&"F"!==e.key?!t||"s"!==e.key&&"S"!==e.key?"Escape"===e.key&&this.editing&&e.target===this.editArea&&(e.preventDefault(),e.stopPropagation(),this.cancelEdit()):this.editing&&(e.preventDefault(),e.stopPropagation(),this.saveEdit()):(e.preventDefault(),e.stopPropagation(),this.openFind())}),this.pathInput.addEventListener("keydown",e=>{if(e.stopPropagation(),"Enter"===e.key){const e=this.pathInput.value.trim();e&&this.openOrCreate(e)}else"Escape"===e.key&&this.togglePathRow(!1)}),this.commitInput.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key?this.pressCommit():"Escape"===e.key&&(this.disarmCommit(),this.setCommitNote(""))}),this.commitInput.addEventListener("input",()=>{this.disarmCommit()}),this.commitBtn.addEventListener("click",()=>this.pressCommit()),this.bodyEl.addEventListener("click",e=>{var t,i,n;const o=null===(i=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===i?void 0:i.call(t,"[data-ad-link]");if(!o)return;e.preventDefault();const a=null!==(n=o.getAttribute("data-ad-link"))&&void 0!==n?n:"";/^https?:/i.test(a)?this.host.openExternal(a):this.openFile(a.replace(/^file:\/\//,""))}),this.bodyEl.addEventListener("click",e=>{var t,i,n,o,a,s;const r=e.target,d=null===(t=null==r?void 0:r.closest)||void 0===t?void 0:t.call(r,"[data-ad-stage]");if(d)return e.preventDefault(),void this.toggleStage(null!==(i=d.getAttribute("data-ad-stage"))&&void 0!==i?i:"","reset"===d.getAttribute("data-ad-stage-act")?"reset":"add");const l=null===(n=null==r?void 0:r.closest)||void 0===n?void 0:n.call(r,"[data-ad-diff]");if(l){e.preventDefault();const t=document.getElementById(null!==(o=l.getAttribute("data-ad-diff"))&&void 0!==o?o:"");return void(null==t||t.scrollIntoView(!0))}const c=null===(a=null==r?void 0:r.closest)||void 0===a?void 0:a.call(r,"[data-ad-open]");if(c){e.preventDefault();const t=null!==(s=c.getAttribute("data-ad-open"))&&void 0!==s?s:"";t&&this.openFile(t)}}),this.bodyEl.addEventListener("click",e=>{const t=e.target;if(!(null==t?void 0:t.closest))return;if(t.closest("[data-ad-stage],[data-ad-diff],[data-ad-open],[data-ad-link]"))return;const i=t.closest("[data-ad-ref-line],[data-ad-ref-del]");i&&this.clickRefLine(i,e.shiftKey)}),this.installDrop(e),this.installResize(e.querySelector(".ad-view-resize")),this.renderEmpty()}installDrop(e){e.addEventListener("dragover",t=>{t.preventDefault(),e.classList.add("ad-view-dropping")}),e.addEventListener("dragleave",()=>e.classList.remove("ad-view-dropping")),e.addEventListener("drop",t=>{var i,n,o;t.preventDefault(),e.classList.remove("ad-view-dropping");const a=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],s=null===(o=t.dataTransfer)||void 0===o?void 0:o.getData("text/plain"),r=(null==a?void 0:a.path)||s;r&&this.openFile(String(r).trim().replace(/^"|"$/g,""))})}installResize(e){e.addEventListener("mousedown",e=>{var i;e.preventDefault(),e.stopPropagation(),this.resizing=!0,document.body.classList.add("ad-resizing");const n=e.clientX,o=(null===(i=this.el)||void 0===i?void 0:i.getBoundingClientRect().width)||this.host.getWidth(),a=e=>{if(!this.resizing)return;const i="right"===this.host.getSide()?n-e.clientX:e.clientX-n;this.host.setWidth(Math.max(t.MIN_VIEW_W,Math.round(o+i))),this.host.relayout()},s=()=>{this.resizing=!1,document.body.classList.remove("ad-resizing"),window.removeEventListener("mousemove",a),window.removeEventListener("mouseup",s),this.host.commit()};window.addEventListener("mousemove",a),window.addEventListener("mouseup",s)})}layout(e,t){if(!this.el)return;const i=this.el.style;i.position="absolute",i.left=t.left+"px",i.top=t.top+"px",i.right="auto",i.bottom="auto",i.width=t.width+"px",i.height=t.height+"px",this.el.classList.toggle("ad-view-left","left"===e),this.el.classList.toggle("ad-view-right","right"===e)}togglePathRow(e){var t;if(!this.pathRow)return;const i=null!=e?e:"none"===this.pathRow.style.display;this.pathRow.style.display=i?"flex":"none",this.pathCreateArmed=null,this.setPathNote(""),i&&(this.pathInput.value=null!==(t=this.current)&&void 0!==t?t:"",this.pathInput.focus(),this.pathInput.select())}setPathNote(e){var t;const i=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-path-note");i&&(i.textContent=e,i.title=e)}openOrCreate(e){var t,i,n,o;const a=this.current?d.dirname(this.current):null,s=null!==(i=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==i?i:a,l=null!==(n=this.resolve(e,s,!1))&&void 0!==n?n:this.resolve(e,a,!1);if(l)return this.pathCreateArmed=null,this.setPathNote(""),void this.openFile(l);const c=d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e);if(!c&&!s)return void this.setPathNote("상대경로를 풀 작업 폴더를 모른다 — 절대경로로 넣는다");const u=d.normalize(c?e:d.join(s,e));if(/[\\/]$/.test(e))this.setPathNote("폴더 경로다 — 파일 이름까지 넣는다");else{try{if(r.statSync(u).isDirectory())return void this.setPathNote("폴더다 — 파일 이름까지 넣는다")}catch{}if(this.pathCreateArmed!==u)return this.pathCreateArmed=u,void this.setPathNote("없는 파일이다 — Enter 를 한 번 더 치면 새로 만든다");try{r.mkdirSync(d.dirname(u),{recursive:!0}),r.writeFileSync(u,"",{encoding:"utf8",flag:"wx"})}catch(e){return void this.setPathNote("만들지 못했다: "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}this.pathCreateArmed=null,this.setPathNote(""),this.openFile(u),this.startEdit()}}get viewMode(){return this.mode}applyMode(e){if(this.mode=e,this.modesEl)for(const t of Array.from(this.modesEl.querySelectorAll("[data-ad-mode]")))t.classList.toggle("ad-view-mode-on",t.getAttribute("data-ad-mode")===e);"diff"===e?this.togglePathRow(!1):this.disarmCommit(),this.commitEl&&(this.commitEl.style.display="diff"===e?"block":"none"),this.scopeBtn&&(this.scopeBtn.style.display="diff"===e?"":"none"),this.renderTabs()}toggleScope(){this.diffScope="session"===this.diffScope?"all":"session",this.applyScopeLabel(),"diff"===this.mode&&this.opened&&this.refreshDiff()}applyScopeLabel(){if(!this.scopeBtn)return;const e="session"===this.diffScope;this.scopeBtn.textContent=e?"세션":"전체",this.scopeBtn.classList.toggle("ad-view-scope-all",!e),this.scopeBtn.title=e?"이 세션이 만진 파일만 보고 있다 — 누르면 저장소 전체":"저장소의 커밋 안 된 변경 전부를 보고 있다 — 누르면 이 세션이 만진 것만"}setMode(e){if(this.mode===e)return;if(this.editing){if(this.editArea&&this.editOrigin&&this.editArea.value!==this.editOrigin.text)return void this.setEditNote("저장하지 않은 편집이 있다 — 저장하거나 취소한 뒤에 모드를 옮긴다");this.cancelEdit()}this.applyMode(e);const t=this.opened;t||this.setOpen(!0),"diff"===e?t&&this.refreshDiff():this.current?this.renderCurrent():this.renderEmpty()}toggleMode(){this.setMode("diff"===this.mode?"file":"diff")}noteOutput(e,t){var i;const n=((null!==(i=this.buffers.get(e))&&void 0!==i?i:"")+t).slice(-16384);this.buffers.set(e,n),this.scrapeTimers.get(e)||this.scrapeTimers.set(e,setTimeout(()=>{this.scrapeTimers.delete(e),this.scrape(e)},400))}scrape(e){var t,i,n,o,a;const s=null!==(t=this.buffers.get(e))&&void 0!==t?t:"";if(this.buffers.set(e,s.slice(s.lastIndexOf("\n")+1).slice(-256)),!s)return;const r=this.host.cwdFor(e);let d=null,l=!1;for(const t of(0,c.extractPaths)(s)){const s=this.resolve(t,r);if(!s)continue;const u=null!==(i=this.recent.get(e))&&void 0!==i?i:[];if((0,c.isInstructionFile)(s)&&!u.includes(s)&&!(null!==(a=null===(o=(n=this.host).touchedFor)||void 0===o?void 0:o.call(n,e))&&void 0!==a?a:[]).some(e=>this.resolve(e,r)===s))continue;if(u[0]===s)continue;const p=u.includes(s);this.recent.set(e,(0,c.pushRecent)(u,s,this.host.getRecentMax())),l=!0,!p&&(0,c.isAutoFollowable)(s)&&(d=s)}if(!l||e!==this.activeTab)return;this.renderTabs();const u=(0,c.planFollow)(this.host.getFollowMode(),this.opened,this.editing);"none"!==u&&("stage"!==u?"diff"===this.mode?("open"===u&&this.setOpen(!0),this.maybeAutoDiff()):d&&this.openFile(d):d&&this.lastViewed.set(e,d))}resolve(e,t,i=!0){if(i&&!(0,c.isKnownExt)(e))return null;const n=[];d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?n.push(e):t&&n.push(d.join(t,e));for(const e of n)try{if(r.statSync(e).isFile())return d.normalize(e)}catch{}return null}setActiveTab(e){this.activeTab!==e&&(this.activeTab=e,this.pathCreateArmed=null,this.refLastSent=null,this.disarmCommit(),this.opened&&(this.renderTabs(),"diff"===this.mode&&(this.setStatus([]),this.refreshDiff())),this.applyTabFile())}applyTabFile(){var e,t,i;if("file"!==this.mode)return!1;if(this.editing)return this.setEditNote("다른 탭으로 옮겼다 — 저장하거나 취소하면 그 탭 파일로 넘어간다"),!0;const n=this.activeTab,o=n&&null!==(i=null!==(e=this.lastViewed.get(n))&&void 0!==e?e:(null!==(t=this.recent.get(n))&&void 0!==t?t:[])[0])&&void 0!==i?i:null;return o!==this.current&&(this.current=o,this.closeFind(),!!this.opened&&(o?(this.watch(o),this.renderCurrent(),!0):(this.unwatch(),this.renderEmpty(),!0)))}noteFile(e,t){var i;const n=this.resolve(t,this.host.cwdFor(e));n&&(this.recent.set(e,(0,c.pushRecent)(null!==(i=this.recent.get(e))&&void 0!==i?i:[],n,this.host.getRecentMax())),e===this.activeTab&&this.opened&&this.renderTabs())}openFile(e){var t,i,n,o;const a=String(null!=e?e:"").trim();if(!a)return;if(this.editing){if(this.editArea&&this.editOrigin&&this.editArea.value!==this.editOrigin.text)return void this.setEditNote("저장하지 않은 편집이 있다 — 저장하거나 취소한 뒤에 다른 파일을 연다");this.cancelEdit()}const s=this.current?d.dirname(this.current):null,r=null!==(i=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==i?i:s,l=null!==(n=this.resolve(a,r,!1))&&void 0!==n?n:this.resolve(a,s,!1);if(this.applyMode("file"),!l)return this.setOpen(!0),void this.renderMessage("파일을 찾지 못했다",a);this.current=l,this.activeTab&&(this.recent.set(this.activeTab,(0,c.pushRecent)(null!==(o=this.recent.get(this.activeTab))&&void 0!==o?o:[],l,this.host.getRecentMax())),this.lastViewed.set(this.activeTab,l)),this.setOpen(!0),this.togglePathRow(!1),this.watch(l),this.renderTabs(),this.renderCurrent()}reload(){"diff"===this.mode?this.refreshDiff():this.current?this.renderCurrent():this.renderEmpty()}watch(e){if(this.watching!==e){this.unwatch(),this.watching=e;try{r.watchFile(e,{interval:1e3},(t,i)=>{"file"===this.mode&&this.watching===e&&t.mtimeMs!==i.mtimeMs&&this.renderCurrent()})}catch{}}}unwatch(){if(this.watching){try{r.unwatchFile(this.watching)}catch{}this.watching=null}}renderTabs(){var e;if(!this.tabsEl)return;const t=this.activeTab&&null!==(e=this.recent.get(this.activeTab))&&void 0!==e?e:[];this.tabsEl.innerHTML="";for(const e of t){const t=document.createElement("button");t.className="ad-view-tab"+(e===this.current?" ad-view-tab-on":""),t.textContent=d.basename(e),t.title=e,t.addEventListener("click",()=>this.openFile(e)),this.tabsEl.appendChild(t)}this.tabsEl.style.display=t.length&&"file"===this.mode?"flex":"none"}renderEmpty(){this.bodyEl&&(this.setTitle("미리보기",""),this.bodyEl.innerHTML=['<div class="ad-view-empty">'," <p>에이전트가 만진 파일이 여기 쌓인다.</p>"," <ul>"," <li>화면에 찍힌 경로를 자동으로 줍는다 (md · 이미지 · 표 · 코드)</li>"," <li>파일을 이 자리에 끌어다 놓아도 된다</li>"," <li><b>+</b> 를 눌러 경로를 직접 넣을 수 있다</li>"," </ul>","</div>"].join(""),this.setFoot(""))}renderMessage(e,t){this.bodyEl&&(this.setTitle(e,t),this.bodyEl.innerHTML='<div class="ad-view-empty"><p>'+(0,l.escapeHtml)(e)+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(t)+"</p></div>",this.setFoot(""))}setTitle(e,t){this.titleEl&&(this.titleEl.textContent=e,this.titleEl.title=t)}setFoot(e){this.footEl&&(this.footEl.textContent=e,this.footEl.title=e)}setFootNote(e){var t;if(this.footEl){const i=null!==(t=this.footEl.textContent)&&void 0!==t?t:"";this.setFoot(i?e+" · "+i:e)}}renderCurrent(){var e;const t=this.current;if(!t||!this.bodyEl)return;if(this.editing)return this.editStale=!0,void this.refreshEditNote();let i;this.findHits=[],this.findIndex=-1;try{i=r.statSync(t)}catch{return void this.renderMessage("파일이 사라졌다",t)}this.setTitle(d.basename(t),t),this.setFoot((0,c.formatBytes)(i.size)+" · "+new Date(i.mtimeMs).toLocaleString()+" · "+t);try{switch((0,c.classify)(t)){case"image":this.renderImage(t,i);break;case"markdown":this.renderMarkdownFile(t);break;case"table":this.renderTable(t);break;case"text":this.renderText(t);break;default:this.renderBinary(t,i)}}catch(t){this.renderMessage("읽지 못했다",String(null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t))}this.bodyEl.scrollTop=0,this.syncEditButton(),this.findRow&&"none"!==this.findRow.style.display&&this.runFind()}renderImage(e,t){const i=b(e,25e6);i?this.bodyEl.innerHTML='<div class="ad-view-image"><img src="'+i+'" alt=""></div>':this.renderMessage("이미지가 너무 크다",(0,c.formatBytes)(t.size)+" — "+e)}renderMarkdownFile(e){const{text:t,truncated:i}=k(e,h),n=d.dirname(e),o=(0,l.renderMarkdown)(t,{resolveImage:e=>/^https?:/i.test(e)?e:b(d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?e:d.join(n,e),4e6)});this.bodyEl.innerHTML='<div class="ad-view-md">'+o+(i?'<p class="ad-view-dim">… 앞부분만 보여준다 ('+(0,c.formatBytes)(h)+")</p>":"")+"</div>"}renderTable(e){const{text:t,truncated:i}=k(e,h),n=(0,c.parseDelimited)(t,(0,c.delimiterFor)(e));if(!n.length)return void this.renderMessage("빈 파일",e);const o=n[0].slice(0,60),a=n.slice(1,401);this.bodyEl.innerHTML='<div class="ad-view-table"><table><thead><tr><th class="ad-view-rownum">#</th>'+o.map(e=>"<th>"+(0,l.escapeHtml)(e)+"</th>").join("")+"</tr></thead><tbody>"+a.map((e,t)=>'<tr><td class="ad-view-rownum">'+(t+1)+"</td>"+o.map((t,i)=>{return n=e[i],"<td>"+(0,l.escapeHtml)(null!=n?n:"")+"</td>";var n}).join("")+"</tr>").join("")+"</tbody></table>"+(n.length>401||i?'<p class="ad-view-dim">400행까지만 보여준다 (전체 '+(n.length-1)+"행)</p>":"")+"</div>"}renderText(e){const{text:t,truncated:i}=k(e,h),n=t.split("\n"),o=n.slice(0,4e3),a=i||n.length>4e3,s=['<div class="ad-view-code ad-view-code-rows" data-ad-ref-file="'+(0,l.escapeHtml)(e)+'">'];o.forEach((e,t)=>{const i=t+1;s.push('<div class="ad-cl" data-ad-ref-line="'+i+'"><span class="ad-cl-no">'+i+'</span><span class="ad-cl-tx">'+(0,l.escapeHtml)(e)+"</span></div>")}),s.push("</div>"),this.bodyEl.innerHTML=s.join("")+(a?'<p class="ad-view-dim">… 4000줄까지만 보여준다 (전체 '+n.length+"줄)</p>":""),this.applyRefSel()}renderBinary(e,t){this.bodyEl.innerHTML='<div class="ad-view-empty"><p>'+(0,l.escapeHtml)(d.basename(e))+'</p><p class="ad-view-dim">미리보기를 지원하지 않는 형식 · '+(0,c.formatBytes)(t.size)+"</p></div>"}canEdit(){if("file"!==this.mode||!this.current)return!1;const e=(0,c.classify)(this.current);return"text"===e||"markdown"===e||"table"===e}syncEditButton(){var e;const t=null===(e=this.el)||void 0===e?void 0:e.querySelector(".ad-view-editbtn");if(!t)return;const i=this.canEdit();t.classList.toggle("ad-view-btn-on",this.editing),t.style.opacity=i||this.editing?"":"0.35",t.title=this.editing?"보기로 (Esc)":i?"편집 (저장 Ctrl+S)":"편집할 수 없는 형식이다"}toggleEdit(){this.editing?this.cancelEdit():this.startEdit()}startEdit(){var e;if(this.editing||!this.bodyEl)return;const t=this.current;if(!t||!this.canEdit())return void this.setEditNote("이 형식은 편집할 수 없다");let i,n;try{n=r.statSync(t),i=function(e,t){const i=r.readFileSync(e);if(i.length>t)return{text:"",truncated:!0,bom:!1,crlf:!1};let n=i.toString("utf8");const o=65279===n.charCodeAt(0);o&&(n=n.slice(1));const a=n.indexOf("\r\n")>=0;return{text:a?n.replace(/\r\n/g,"\n"):n,truncated:!1,bom:o,crlf:a}}(t,g)}catch(t){return void this.setEditNote("읽지 못했다: "+String(null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t))}if(i.truncated)return this.setEditNote("너무 커서 편집할 수 없다 ("+(0,c.formatBytes)(g)+" 넘음) — 보기 전용"),void this.showEditBar(!0);this.closeFind(),this.editing=!0,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.editOrigin={file:t,text:i.text,bom:i.bom,crlf:i.crlf,mtimeMs:n.mtimeMs,readOnly:!y(t)};const o=document.createElement("textarea");o.className="ad-view-edit",o.spellcheck=!1,o.value=i.text,o.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&("s"===e.key||"S"===e.key||"f"===e.key||"F"===e.key)||"Escape"===e.key||e.stopPropagation()}),o.addEventListener("input",()=>this.refreshEditNote()),this.bodyEl.innerHTML="",this.bodyEl.appendChild(o),this.editArea=o,o.focus(),this.showEditBar(!0),this.refreshEditNote(),this.syncEditButton()}cancelEdit(){this.editing?(this.editing=!1,this.editArea=null,this.editOrigin=null,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.showEditBar(!1),this.syncEditButton(),this.renderCurrent()):this.showEditBar(!1)}saveEdit(){var e,t,i;if(!this.editing||!this.editArea||!this.editOrigin)return;const n=this.editOrigin,o=this.editArea.value;if(o===n.text&&!this.editStale)return void this.setEditNote("바뀐 것이 없다");let a=this.editStale;try{a=a||r.statSync(n.file).mtimeMs!==n.mtimeMs}catch{}if(a&&!this.editOverwriteArmed)return this.editOverwriteArmed=!0,void this.setEditNote("밖에서 바뀐 파일이다 — 다시 누르면 덮어쓴다");const s=n.crlf?o.replace(/\n/g,"\r\n"):o,d=()=>r.writeFileSync(n.file,(n.bom?"\ufeff":"")+s,"utf8");try{d()}catch(o){const a=String(null!==(e=null==o?void 0:o.code)&&void 0!==e?e:"");if("EPERM"!==a&&"EACCES"!==a&&"EROFS"!==a)return void this.setEditNote("저장하지 못했다: "+String(null!==(t=null==o?void 0:o.message)&&void 0!==t?t:o));if(!this.editForceArmed)return this.editForceArmed=!0,void this.setEditNote("읽기 전용이다 (P4 면 p4 edit 먼저) — 다시 누르면 속성을 풀고 저장한다");try{r.chmodSync(n.file,438),d()}catch(e){return void this.setEditNote("저장하지 못했다: "+String(null!==(i=null==e?void 0:e.message)&&void 0!==i?i:e))}}this.editing=!1,this.editArea=null,this.editOrigin=null,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.showEditBar(!1),this.setEditNote(""),this.syncEditButton(),this.renderCurrent(),this.setFootNote("저장했다")}showEditBar(e){var t;this.editBarEl&&(this.editBarEl.style.display=e?"flex":"none");const i=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-edit-btns");i&&(i.style.display=this.editing?"":"none")}setEditNote(e){this.editNoteEl&&(this.editNoteEl.textContent=e),!this.editing&&this.editBarEl&&e&&(this.editBarEl.style.display="flex")}refreshEditNote(){if(!this.editing||!this.editArea||!this.editOrigin)return;const e=this.editArea.value!==this.editOrigin.text;this.editSaveBtn&&(this.editSaveBtn.disabled=!e&&!this.editStale),this.editOverwriteArmed=!1,this.editForceArmed=!1;const t=[];t.push(d.basename(this.editOrigin.file)),this.editOrigin.bom&&t.push("BOM"),t.push(this.editOrigin.crlf?"CRLF":"LF"),this.editOrigin.readOnly&&t.push("읽기 전용"),t.push(e?"고침":"그대로"),this.editStale&&t.push("밖에서 바뀜"),this.setEditNote(t.join(" · "))}openFind(){this.findRow&&this.findInput&&(this.findRow.style.display="flex",this.findInput.focus(),this.findInput.select(),this.runFind())}closeFind(){this.findRow&&(this.findRow.style.display="none"),this.clearFindMarks(),this.findCountEl&&(this.findCountEl.textContent="")}runFind(){var e,t;const i=null!==(t=null===(e=this.findInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"";this.clearFindMarks(),i?this.editing&&this.editArea?this.findInTextarea(i,0):(this.markMatches(i),this.findIndex=this.findHits.length?0:-1,this.showFindHit()):this.findCountEl&&(this.findCountEl.textContent="")}stepFind(e){var t,i;const n=null!==(i=null===(t=this.findInput)||void 0===t?void 0:t.value)&&void 0!==i?i:"";n&&(this.editing&&this.editArea?this.findInTextarea(n,e):(this.findHits.length?this.findIndex=(this.findIndex+e+this.findHits.length)%this.findHits.length:(this.markMatches(n),this.findIndex=this.findHits.length?0:-1),this.showFindHit()))}findInTextarea(e,t){const i=this.editArea,n=i.value.toLowerCase(),o=e.toLowerCase(),a=o?n.split(o).length-1:0;if(!a)return void this.setFindCount(0,0);let s;if(t<0){const e=i.selectionStart-1;s=n.lastIndexOf(o,Math.max(e-1,0)),s<0&&(s=n.lastIndexOf(o))}else{const e=t>0?i.selectionStart+1:i.selectionStart;s=n.indexOf(o,e),s<0&&(s=n.indexOf(o))}if(s<0)return void this.setFindCount(0,0);i.focus(),i.setSelectionRange(s,s+e.length);const r=i.value.slice(0,s).split("\n").length-1,d=Math.max(1,Math.round(i.scrollHeight/Math.max(1,i.value.split("\n").length)));i.scrollTop=Math.max(0,r*d-i.clientHeight/2);const l=n.slice(0,s).split(o).length;this.setFindCount(l,a)}markMatches(e){var t;const i=this.bodyEl;if(!i||!e)return;const n=e.toLowerCase(),o=document.createTreeWalker(i,NodeFilter.SHOW_TEXT),a=[];let s;for(;s=o.nextNode();){const e=s;e.data&&e.data.toLowerCase().indexOf(n)>=0&&a.push(e)}for(const i of a){if(this.findHits.length>=2e3)break;const o=[];let a=i.data,s=0;for(;s++<500;){const t=a.toLowerCase().indexOf(n);if(t<0)break;t>0&&o.push(document.createTextNode(a.slice(0,t)));const i=document.createElement("mark");if(i.className="ad-find-hit",i.textContent=a.slice(t,t+e.length),o.push(i),this.findHits.push(i),a=a.slice(t+e.length),this.findHits.length>=2e3)break}if(!o.length)continue;a&&o.push(document.createTextNode(a));const r=document.createDocumentFragment();o.forEach(e=>r.appendChild(e)),null===(t=i.parentNode)||void 0===t||t.replaceChild(r,i)}}clearFindMarks(){var e;for(const t of this.findHits){const i=t.parentNode;i&&(i.replaceChild(document.createTextNode(null!==(e=t.textContent)&&void 0!==e?e:""),t),i.normalize())}this.findHits=[],this.findIndex=-1}showFindHit(){this.findHits.forEach((e,t)=>e.classList.toggle("ad-find-cur",t===this.findIndex));const e=this.findHits[this.findIndex];e&&e.scrollIntoView({block:"center"}),this.setFindCount(this.findIndex+1,this.findHits.length)}setFindCount(e,t){this.findCountEl&&(this.findCountEl.textContent=t?e+"/"+t:"없음")}runGit(e,t){return new Promise(i=>{var n;try{(0,s.execFile)("git",["--no-pager","-C",e,...t],{encoding:"utf8",maxBuffer:33554432,timeout:5e3,windowsHide:!0},(e,t,n)=>{i({ok:!e,out:String(null!=t?t:""),err:String(n||(null==e?void 0:e.message)||"")})})}catch(e){i({ok:!1,out:"",err:String(null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e)})}})}maybeAutoDiff(){const e=Date.now();e-this.diffAutoAt<1500||(this.diffAutoAt=e,this.refreshDiff())}refreshDiff(){var e;if(!this.bodyEl)return;const t=this.host.cwdFor(null!==(e=this.activeTab)&&void 0!==e?e:{});if(this.setTitle("변경",null!=t?t:""),!t)return this.setStatus([]),void this.renderDiffNote("작업 폴더를 모른다","이 탭의 cwd 를 아직 잡지 못했다 — 터미널에서 명령을 한 번 실행하면 잡힌다");if(!function(e){try{return r.statSync(e).isDirectory()}catch{return!1}}(t))return this.setStatus([]),void this.renderDiffNote("작업 폴더가 폴더가 아니다",t);const i=++this.diffSeq;this.diffAutoAt=Date.now(),this.bodyEl.querySelector(".ad-view-diff")||this.renderDiffNote("변경을 읽고 있다",t),Promise.all([this.runGit(t,["diff","HEAD","--no-color"]),this.runGit(t,["status","--porcelain"]),this.runGit(t,["rev-parse","--show-toplevel"])]).then(async([e,n,o])=>{let a=e.out;if(!e.ok){const n=e.err;if(/not a git repository/i.test(n))return void this.noGit(i,"git 저장소가 아니다",t,"이 폴더는 git 으로 관리되지 않는다 — 무엇이 바뀌었는지(diff)는 비교할 기준이 없다");if(/ENOENT|not recognized|command not found/i.test(n))return void this.noGit(i,"git 을 찾지 못했다","PATH 에 git 이 있어야 변경 내용을 비교할 수 있다","git 이 없어 diff 는 만들 수 없다");if(/ambiguous argument .?HEAD|unknown revision|bad revision/i.test(n)){const e=await this.runGit(t,["diff","--no-color"]);if(a=e.out,!e.ok&&!a)return void this.failDiff(i,"변경을 읽지 못했다",e.err)}else if(!a)return void this.failDiff(i,"변경을 읽지 못했다",n)}const s=(0,u.parseUnifiedDiff)(a),r=n.ok?(0,u.parseUntracked)(n.out):[];this.diffRoot=o.ok&&o.out.trim()||t;const d="session"===this.diffScope?this.touchedNow():[],l=(0,u.filterTouched)(s,e=>e.path,this.diffRoot,d),c=(0,u.filterTouched)(r,e=>e,this.diffRoot,d);this.diffHidden=s.length-l.length+(r.length-c.length),this.diffDebug={root:this.diffRoot,scope:this.diffScope,touched:d.slice(0,5),all:s.length,kept:l.length,sample:s.slice(0,5).map(e=>e.path)},this.finishDiff(i,()=>{this.setStatus(n.ok?(0,p.parseStatus)(n.out):[]),this.renderDiff(l,c,t)})}).catch(e=>{var t;this.failDiff(i,"변경을 읽지 못했다",String(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e))})}touchedNow(){var e,t,i,n;return null!==(n=null===(t=(e=this.host).touchedFor)||void 0===t?void 0:t.call(e,null!==(i=this.activeTab)&&void 0!==i?i:{}))&&void 0!==n?n:[]}finishDiff(e,t){e===this.diffSeq&&"diff"===this.mode&&this.bodyEl&&t()}failDiff(e,t,i){this.finishDiff(e,()=>{this.setStatus([]),this.renderDiffNote(t,i)})}noGit(e,t,i,n){var o;const a=this.touchedNow();if(!a.length)return void this.failDiff(e,t,i);const s=this.host.cwdFor(null!==(o=this.activeTab)&&void 0!==o?o:{});this.diffRoot=null,this.diffHidden=0,this.finishDiff(e,()=>{this.setStatus([]),this.setCommitVisible(!1);const e=['<div class="ad-view-diff">'];e.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)("이 세션이 만진 파일 "+a.length+"개")+"</div>"),e.push('<p class="ad-view-dim">'+(0,l.escapeHtml)(t+" — "+n)+"</p>"),e.push('<div class="ad-view-diff-list">');for(const t of a.slice(0,200)){const i=(0,u.refPathFrom)(t,s);e.push('<div class="ad-view-diff-u" data-ad-open="'+(0,l.escapeHtml)(t)+'">'+(0,l.escapeHtml)(i)+' <span class="ad-view-dim">'+(0,l.escapeHtml)(v(t))+"</span></div>")}a.length>200&&e.push('<p class="ad-view-dim">… 이후 생략</p>'),e.push("</div></div>"),this.bodyEl.innerHTML=e.join(""),this.setFoot(i)})}setCommitVisible(e){this.commitEl&&(this.commitEl.style.display=e&&"diff"===this.mode?"block":"none")}renderDiffNote(e,t){this.bodyEl&&(this.bodyEl.innerHTML='<div class="ad-view-diff"><div class="ad-view-empty"><p>'+(0,l.escapeHtml)(e)+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(t)+"</p></div></div>",this.setFoot(t))}renderDiff(e,t,i){this.setCommitVisible(!0);const n=e.slice(0,200),o=['<div class="ad-view-diff">'],a="session"===this.diffScope&&this.diffHidden>0?" · 이 세션이 만진 것만 ("+this.diffHidden+"개 숨김)":"";if(o.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)((0,u.formatStat)(e)+a)+"</div>"),n.length&&(o.push('<div class="ad-view-diff-list">'),n.forEach((e,t)=>{o.push('<button class="ad-view-diff-item" data-ad-diff="ad-diff-'+t+'"><span class="ad-view-diff-st ad-view-diff-st-'+e.status+'">'+(0,l.escapeHtml)((0,u.statusLabel)(e))+"</span>"+this.stageChipHtml(e.path)+'<span class="ad-view-diff-name">'+(0,l.escapeHtml)(e.path)+'</span><span class="ad-view-diff-num"><b class="ad-plus">+'+e.added+'</b><b class="ad-minus">-'+e.removed+"</b></span></button>")}),e.length>n.length&&o.push('<p class="ad-view-dim">… 이후 생략 (전체 '+e.length+"개 파일)</p>"),o.push("</div>")),t.length){const e=t.slice(0,100);o.push('<div class="ad-view-diff-untracked"><div class="ad-view-diff-sub">추적 안 됨 · '+t.length+"개</div>");for(const t of e){const e=t.endsWith("/")?"":' data-ad-open="'+(0,l.escapeHtml)(this.absOf(t))+'"';o.push('<div class="ad-view-diff-u"'+e+">"+this.stageChipHtml(t)+" "+(0,l.escapeHtml)(t)+"</div>")}t.length>e.length&&o.push('<p class="ad-view-dim">… 이후 생략</p>'),o.push("</div>")}if(!n.length&&!t.length){const e="session"===this.diffScope&&this.diffHidden>0;o.push('<div class="ad-view-empty"><p>'+(e?"이 세션이 만진 파일은 아직 없다":"변경 없음")+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(e?"저장소에는 "+this.diffHidden+"개의 변경이 있다 — `전체` 로 보면 나온다":i)+"</p></div>")}let s=2e4;n.forEach((e,t)=>{o.push('<div class="ad-view-diff-file" id="ad-diff-'+t+'">');const i=e.oldPath?e.oldPath+" → "+e.path:e.path;if(o.push('<div class="ad-view-diff-fhead" data-ad-open="'+(0,l.escapeHtml)(this.absOf(e.path))+'" title="'+(0,l.escapeHtml)(i)+'">'+(0,l.escapeHtml)(i)+"</div>"),e.binary)o.push('<div class="ad-view-diff-note">바이너리 · 내용 비교 없음</div>');else if(e.lines.length){const t=Math.min(e.lines.length,4e3,Math.max(s,0));o.push('<div class="ad-view-diff-lines" data-ad-ref-file="'+(0,l.escapeHtml)(e.path)+'">');for(let i=0;i<t;i++)o.push(this.diffLineHtml(e.lines[i]));o.push("</div>"),s-=t,t<e.lines.length&&o.push('<div class="ad-view-diff-note">… 이후 생략 (전체 '+e.lines.length+"줄)</div>")}else o.push('<div class="ad-view-diff-note">내용 변경 없음</div>');o.push("</div>")}),o.push("</div>"),this.bodyEl.innerHTML=o.join(""),this.applyRefSel(),this.setFoot((0,u.formatStat)(e)+" · "+(new Date).toLocaleTimeString()+" 기준 · "+i)}diffLineHtml(e){var t,i;const n="add"===e.kind?"+":"del"===e.kind?"-":" ",o="hunk"===e.kind?e.text:n+e.text,a=(0,u.refLineNo)(e),s=null===a?' data-ad-ref-del="'+("hunk"===e.kind?"hunk":"del")+'"':' data-ad-ref-line="'+a+'"';return'<div class="ad-dl ad-dl-'+e.kind+'"'+s+'><span class="ad-dl-no">'+(null!==(t=e.oldNo)&&void 0!==t?t:"")+'</span><span class="ad-dl-no">'+(null!==(i=e.newNo)&&void 0!==i?i:"")+'</span><span class="ad-dl-tx">'+(0,l.escapeHtml)(o)+"</span></div>"}absOf(e){const t=this.diffRoot;return t?d.join(t,e):e}clickRefLine(e,t){var i;const n="function"==typeof window.getSelection?window.getSelection():null;if(t){if(n&&!n.isCollapsed)try{n.removeAllRanges()}catch{}}else if(n&&!n.isCollapsed&&String(n))return;const o=e.getAttribute("data-ad-ref-del");if(null!==o)return void this.setRefNote("hunk"===o?"헝크 머리줄은 내용이 아니다 — 아래 줄을 고르면 그 자리를 가리킨다":"삭제된 줄은 지금 파일에 없다 — 옆 문맥줄을 고르면 그 자리를 가리킨다");const a=Number(e.getAttribute("data-ad-ref-line"));if(!Number.isFinite(a)||a<=0)return;const s=e.closest("[data-ad-ref-file]"),r=null!==(i=null==s?void 0:s.getAttribute("data-ad-ref-file"))&&void 0!==i?i:"";if(!r)return void this.setRefNote("어느 파일의 줄인지 몰라 참조를 만들지 못했다");const d=this.refSel,l=t&&d&&d.file===r?d.from:a,c=Math.min(l,a),u=Math.max(l,a);this.refSel={file:r,from:c,to:u},this.applyRefSel(),this.sendRef(r,c,u)}applyRefSel(){if(!this.bodyEl)return;for(const e of Array.from(this.bodyEl.querySelectorAll(".ad-ref-sel")))e.classList.remove("ad-ref-sel");const e=this.refSel;if(e)for(const t of Array.from(this.bodyEl.querySelectorAll("[data-ad-ref-file]")))if(t.getAttribute("data-ad-ref-file")===e.file)for(const i of Array.from(t.querySelectorAll("[data-ad-ref-line]"))){const t=Number(i.getAttribute("data-ad-ref-line"));Number.isFinite(t)&&t>=e.from&&t<=e.to&&i.classList.add("ad-ref-sel")}}sendRef(e,t,i){var n,o;const a=this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{}),s=(0,u.formatLineRef)((0,u.refPathFrom)((0,u.joinRefPath)(this.diffRoot,e),a),t,i);if(!s)return void this.setRefNote("참조를 만들지 못했다 — 경로가 비어 있다");if(!this.host.sendText)return void this.setRefNote("터미널에 넣지 못했다 — 넣을 자리가 배선되지 않았다 · "+s);const r=Date.now(),d=this.refLastSent,l=!!d&&r-d.at<15e3&&s.length>d.text.length&&s.startsWith(d.text)&&'"'!==d.text[0]&&'"'!==s[0],c=l?s.slice(d.text.length):s;let p=!1;try{p=!!this.host.sendText(c)}catch(e){return void this.setRefNote("터미널에 넣지 못했다 · "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}p?(this.refLastSent={text:s,at:r},this.setRefNote("넣었다 · "+s+(l?" (꼬리만)":""),!0)):this.setRefNote("터미널에 넣지 못했다 — 넣을 터미널이 없다 · "+s)}setRefNote(e,t=!1){const i=this.refNoteEl;i&&(i.textContent=e,i.title=e,i.style.display=e?"block":"none",this.refFlashTimer&&(clearTimeout(this.refFlashTimer),this.refFlashTimer=null),i.classList.toggle("ad-view-ref-on",!!e&&t),e&&t&&(this.refFlashTimer=setTimeout(()=>{this.refFlashTimer=null,i.classList.remove("ad-view-ref-on")},2500)))}stageChipHtml(e){const t=this.statusByPath.get(e);if(!t)return"";const i="staged"===t.state?"reset":"add";let n;return n="reset"===i?"누르면 스테이지에서 내린다 — git reset -q -- "+e:"conflict"===t.state?"누르면 충돌 해결로 표시한다 — git add -- "+e:"누르면 스테이지에 올린다 — git add -- "+e,'<span class="ad-view-stage ad-view-stage-'+t.state+'" data-ad-stage="'+(0,l.escapeHtml)(e)+'" data-ad-stage-act="'+i+'" title="'+(0,l.escapeHtml)(n)+'">'+(0,l.escapeHtml)((0,p.stageLabel)(t.state))+"</span>"}setStatus(e){this.statusEntries=e,this.statusByPath=new Map;for(const t of e)this.statusByPath.set(t.path,t);this.commitSumEl&&(this.commitSumEl.textContent=(0,p.formatStageSummary)(e)),this.syncCommitButton()}syncCommitButton(){var e,t;const i=this.commitBtn;i&&(i.disabled=!(0,p.validateMessage)(null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"").ok||this.gitBusy,i.textContent=this.commitArmed?"커밋 확인":"커밋",i.classList.toggle("ad-view-commit-armed",this.commitArmed),i.title=this.commitArmed?"한 번 더 누르면 실제로 커밋한다 (Esc 취소)":"메시지를 넣고 두 번 눌러야 커밋된다 — git commit -m")}setCommitNote(e){this.commitNoteEl&&(this.commitNoteEl.textContent=e,this.commitNoteEl.title=e)}disarmCommit(){this.commitArmed=!1,this.syncCommitButton()}async toggleStage(e,t){var i,n,o;if(!e||this.gitBusy)return;const a=null!==(i=this.diffRoot)&&void 0!==i?i:this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{});if(!a)return void this.setCommitNote("작업 폴더를 몰라 스테이지를 바꾸지 못한다");const s="add"===t?(0,p.stageArgs)([e]):(0,p.unstageArgs)([e]);if(s.length){this.gitBusy=!0,this.disarmCommit();try{let i=await this.runGit(a,s);!i.ok&&"reset"===t&&/ambiguous argument .?HEAD|unknown revision|bad revision|HEAD/i.test(i.err)&&(i=await this.runGit(a,(0,p.unstageFallbackArgs)([e]))),this.setCommitNote(i.ok?("add"===t?"스테이지에 올렸다 · ":"스테이지에서 내렸다 · ")+e:"스테이지를 바꾸지 못했다 · "+(m(i.err)||m(i.out)))}catch(e){this.setCommitNote("스테이지를 바꾸지 못했다 · "+String(null!==(o=null==e?void 0:e.message)&&void 0!==o?o:e))}finally{this.gitBusy=!1,this.syncCommitButton()}this.refreshDiff()}}pressCommit(){var e,t,i;if(this.gitBusy)return;const n=null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"",o=(0,p.validateMessage)(n);return o.ok?(0,p.hasStaged)(this.statusEntries)?this.commitArmed?void this.runCommit(n):(this.commitArmed=!0,this.syncCommitButton(),void this.setCommitNote("다시 누르면 커밋한다 (Esc 취소) · "+(0,p.formatStageSummary)(this.statusEntries))):(this.disarmCommit(),void this.setCommitNote("스테이지에 올린 것이 없다 — 파일 목록의 딱지를 눌러 올려라")):(this.disarmCommit(),void this.setCommitNote(null!==(i=o.reason)&&void 0!==i?i:"커밋 메시지를 확인해야 한다"))}async runCommit(e){var t,i,n;const o=(0,p.commitArgs)(e);if(!o.length)return this.disarmCommit(),void this.setCommitNote("커밋 메시지를 확인해야 한다");const a=null!==(t=this.diffRoot)&&void 0!==t?t:this.host.cwdFor(null!==(i=this.activeTab)&&void 0!==i?i:{});if(!a)return this.disarmCommit(),void this.setCommitNote("작업 폴더를 몰라 커밋하지 못한다");this.gitBusy=!0,this.syncCommitButton();try{const e=await this.runGit(a,o);e.ok?(this.commitInput&&(this.commitInput.value=""),this.setCommitNote("커밋했다 · "+(m(e.out)||m(e.err)))):this.setCommitNote("커밋하지 못했다 · "+(m(e.err)||m(e.out)))}catch(e){this.setCommitNote("커밋하지 못했다 · "+String(null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e))}finally{this.gitBusy=!1,this.commitArmed=!1,this.syncCommitButton()}this.refreshDiff()}dispose(){var e;this.unwatch(),this.refFlashTimer&&(clearTimeout(this.refFlashTimer),this.refFlashTimer=null),null===(e=this.el)||void 0===e||e.remove(),this.el=null,this.refNoteEl=null}}},7604(e,t){t.planFollow=t.migrateFollow=t.followModeOf=t.formatBytes=t.delimiterFor=t.parseDelimited=t.pushRecent=t.isAutoFollowable=t.isInstructionFile=t.extractPaths=t.isKnownExt=t.classify=void 0;const i=["png","jpg","jpeg","gif","webp","bmp","svg","ico","avif"],n=["md","markdown","mdx"],o=["csv","tsv"],a=["txt","log","json","jsonc","yml","yaml","toml","ini","cfg","conf","env","ts","tsx","js","jsx","mjs","cjs","cs","py","rb","go","rs","java","kt","c","h","cpp","hpp","cc","php","lua","sql","sh","bash","zsh","ps1","psm1","bat","cmd","html","htm","xml","svelte","vue","css","scss","sass","less","diff","patch","gitignore","editorconfig","dockerfile","makefile","gradle","proto"],s=new Set([...i,...n,...o,...a]);function r(e){var t;const i=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"",n=i.lastIndexOf(".");return n<=0?i.toLowerCase():i.slice(n+1).toLowerCase()}function d(e){return s.has(r(e))}t.classify=function(e){const t=r(e);return i.includes(t)?"image":n.includes(t)?"markdown":o.includes(t)?"table":a.includes(t)?"text":"binary"},t.isKnownExt=d;const l="[\\w\\u00c0-\\uffff.@+~-]",c=new RegExp("(?:[A-Za-z]:[\\\\/]|\\.{0,2}[\\\\/])?(?:"+l+"+[\\\\/])*"+l+"+\\.[A-Za-z0-9]{1,8}","y"),u=/(?:[A-Za-z]:)?[\w\u00c0-\uffff.@+~\/\\-]+/g,p=/[\u2000-\u206f\u2190-\u2bff\u3000-\u303f\uff00-\uffef]/,h=/[),.;:'"`\]}]+$/;t.extractPaths=function(e){var t;const i=function(e){return String(null!=e?e:"").replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b[@-Z\\-_]/g,"").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"").replace(/[\u2500-\u257f\u2580-\u259f]/g," ")}(e),n=[],o=new Set;let a;for(u.lastIndex=0;null!==(a=u.exec(i));){const e=a[0];if(!e.includes("."))continue;c.lastIndex=0;const s=c.exec(e);if(!s)continue;let r=s[0].replace(h,"");if(!r||p.test(r))continue;const l=i.slice(Math.max(0,a.index-3),a.index);/:\/\/?$/.test(l)||/^https?$/i.test(null!==(t=r.split(/[\\/]/)[0])&&void 0!==t?t:"")||d(r)&&(/^[vV]?[\d.]+$/.test(r)||(r=r.replace(/^\.[\\/]/,""),o.has(r)||(o.add(r),n.push(r))))}return n};const g=/^(?:\.?claude\.json|settings(?:\.[\w-]+)?\.json)$/i;t.isInstructionFile=function(e){var t;const i=null!==(t=String(null!=e?e:"").split(/[\\/]/).pop())&&void 0!==t?t:"";return/^(?:claude(?:\.local)?|agents(?:\.override)?|skill)\.md$/i.test(i)},t.isAutoFollowable=function(e){var t;const i=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"";return!!i&&!g.test(i)},t.pushRecent=function(e,t,i){return[t,...e.filter(e=>e!==t)].slice(0,Math.max(1,i))},t.parseDelimited=function(e,t=","){const i=[];let n=[],o="",a=!1;const s=String(null!=e?e:"").replace(/\r\n?/g,"\n");for(let e=0;e<s.length;e++){const r=s[e];a?'"'===r?'"'===s[e+1]?(o+='"',e++):a=!1:o+=r:'"'===r?a=!0:r===t?(n.push(o),o=""):"\n"===r?(n.push(o),i.push(n),n=[],o=""):o+=r}return(o||n.length)&&(n.push(o),i.push(n)),i},t.delimiterFor=function(e){return"tsv"===r(e)?"\t":","},t.formatBytes=function(e){const t=Number(e);return!isFinite(t)||t<0?"?":t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1024/1024).toFixed(1)+" MB"};const f=["open","show","manual"];t.followModeOf=function(e,t){return!1===e?"manual":!0===t?"open":"show"},t.migrateFollow=function(e,t){const i="string"==typeof e&&f.includes(e)?e:!1===t?"manual":null;return i?{preload:"manual"!==i,autoOpen:"open"===i}:null},t.planFollow=function(e,t,i){return i||"manual"===e?"none":t?"show":"open"===e?"open":"stage"}},5317(e){e.exports=require("child_process")},6982(e){e.exports=require("crypto")},4157(e){e.exports=require("electron")},9896(e){e.exports=require("fs")},8611(e){e.exports=require("http")},5692(e){e.exports=require("https")},9278(e){e.exports=require("net")},857(e){e.exports=require("os")},6928(e){e.exports=require("path")},3193(e){e.exports=require("string_decoder")},8167(e){e.exports=require("worker_threads")},4358(t){t.exports=e},860(e){e.exports=t},7182(e){e.exports=i},3961(e){e.exports=n},7650(e){e.exports=o},3700(e){e.exports=a},8349(e){e.exports=s}};const d={};function l(e){const t=d[e];if(void 0!==t)return t.exports;const i=d[e]={id:e,exports:{}};return r[e].call(i.exports,i,i.exports,l),i.exports}return l.n=e=>{const t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},l.cw=e=>{var t;return()=>{if(e){var i=e;e=0,t={exports:{}},i.call(t.exports,t,t.exports)}return t.exports}},l.d=(e,t)=>{if(Array.isArray(t))for(var i=0;i<t.length;){var n=t[i++],o=t[i++],a=0===o?{enumerable:!0,value:t[i++]}:{enumerable:!0,get:o};l.o(e,n)||Object.defineProperty(e,n,a)}else for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.nc=void 0,l(8156)})());