tabby-agentdeck 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README.ko.md +26 -574
  3. package/README.md +25 -545
  4. package/dist/agents.d.ts +15 -0
  5. package/dist/codexHooks.d.ts +23 -0
  6. package/dist/codexMeta.d.ts +87 -0
  7. package/dist/config.d.ts +120 -2
  8. package/dist/cursorVisibility.d.ts +33 -1
  9. package/dist/deck.service.d.ts +182 -19
  10. package/dist/devReload.service.d.ts +48 -0
  11. package/dist/devReload.stub.d.ts +19 -0
  12. package/dist/dock.d.ts +15 -0
  13. package/dist/i18n/af.d.ts +83 -0
  14. package/dist/i18n/bg.d.ts +83 -0
  15. package/dist/i18n/cs.d.ts +83 -0
  16. package/dist/i18n/da.d.ts +83 -0
  17. package/dist/i18n/de.d.ts +83 -0
  18. package/dist/i18n/en.d.ts +83 -0
  19. package/dist/i18n/es.d.ts +83 -0
  20. package/dist/i18n/fr.d.ts +83 -0
  21. package/dist/i18n/hr.d.ts +83 -0
  22. package/dist/i18n/id.d.ts +83 -0
  23. package/dist/i18n/it.d.ts +83 -0
  24. package/dist/i18n/ja.d.ts +83 -0
  25. package/dist/i18n/ko.d.ts +83 -0
  26. package/dist/i18n/pl.d.ts +83 -0
  27. package/dist/i18n/pt.d.ts +83 -0
  28. package/dist/i18n/ru.d.ts +83 -0
  29. package/dist/i18n/sr.d.ts +83 -0
  30. package/dist/i18n/sv.d.ts +83 -0
  31. package/dist/i18n/tr.d.ts +83 -0
  32. package/dist/i18n/uk.d.ts +83 -0
  33. package/dist/i18n/zh-CN.d.ts +83 -0
  34. package/dist/i18n/zh-TW.d.ts +83 -0
  35. package/dist/i18n.d.ts +3618 -0
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.js +1 -2
  38. package/dist/keybind.d.ts +121 -0
  39. package/dist/meta.d.ts +83 -0
  40. package/dist/nav.d.ts +29 -0
  41. package/dist/notify.service.d.ts +149 -1
  42. package/dist/project-root.d.ts +1 -1
  43. package/dist/reload.service.d.ts +57 -0
  44. package/dist/sessionLedger.d.ts +11 -6
  45. package/dist/settings.component.d.ts +133 -8
  46. package/dist/status.service.d.ts +30 -2
  47. package/dist/statusLine.d.ts +27 -0
  48. package/dist/update.d.ts +19 -5
  49. package/dist/update.service.d.ts +29 -20
  50. package/dist/viewPanel.d.ts +13 -3
  51. package/hooks/agentdeck-codex-notify.ps1 +5 -2
  52. package/hooks/agentdeck-label.js +1 -1
  53. package/hooks/agentdeck-notify.ps1 +32 -12
  54. package/hooks/agentdeck-statusline.mjs +351 -0
  55. package/package.json +4 -2
  56. package/updater/agentdeck-update.ps1 +50 -27
  57. package/dist/index.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,2 +1 @@
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 n="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 i in n)("object"==typeof exports?exports:e)[i]=n[i]}}(global,(e,t,n,i,r,o,s)=>(()=>{"use strict";var a={6100(e,t,n){var i=n(1354),r=n.n(i),o=n(6314),s=n.n(o)()(r());s.push([e.id,"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-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-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-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-head{display:flex;align-items:center;gap:5px;margin:5px 0 2px;padding:2px 4px 2px 11px;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 11px;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-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}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}","",{version:3,sources:["webpack://./src/styles.scss"],names:[],mappings:"AAMA,6DACI,iCAAA,CACA,+BAAA,CACA,qBAAA,CACA,sBAAA,CACA,mCAAA,CACA,qCAAA,CAGJ,mBACI,YAAA,CACA,qBAAA,CAEA,SAAA,CACA,eAAA,CAEA,yDAAA,CACA,cAAA,CACA,gBAAA,CACA,0BAAA,CAGA,iCAAA,2CAAA,CACA,gCAAA,4CAAA,CACA,+BAAA,6CAAA,CACA,kCAAA,0CAAA,CAKI,mFACI,YAAA,CACA,cAAA,CACA,wBAAA,CACA,SAAA,CACA,eAAA,CAYJ,iFACI,cAAA,CACA,WAAA,CAKJ,+FACI,aAAA,CACA,cAAA,CAIR,4BACI,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,qBAAA,CACA,oBAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CAEA,0BAAA,CACA,WAAA,CAEA,mCACI,eAAA,CAKR,8BACI,iBAAA,CACA,SAAA,CACA,wBAAA,CACA,+BAAA,CAEA,mFAEI,8BAAA,CAIR,uEAEI,KAAA,CACA,QAAA,CACA,SAAA,CACA,iBAAA,CAGJ,oCAAA,MAAA,CACA,mCAAA,OAAA,CAEA,uEAEI,MAAA,CACA,OAAA,CACA,UAAA,CACA,iBAAA,CAGJ,qCAAA,KAAA,CACA,kCAAA,QAAA,CAGA,kCACI,0BAAA,CACA,YAAA,CACA,kBAAA,CACA,OAAA,CACA,aAAA,CACA,kBAAA,CACA,gBAAA,CACA,2BAAA,CAGJ,2BACI,eAAA,CACA,iBAAA,CACA,gCAAA,CACA,gDAAA,CACA,cAAA,CACA,eAAA,CACA,iCAAA,CAIJ,4BACI,aAAA,CACA,eAAA,CACA,iBAAA,CACA,mBAAA,CAMA,oBAAA,CAEA,+CACI,SAAA,CAGJ,qDACI,gCAAA,CACA,iBAAA,CAEA,2DACI,gCAAA,CAOZ,kCACI,YAAA,CACA,kBAAA,CACA,OAAA,CACA,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,2BAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,cAAA,CACA,6CAAA,CAGA,8CACI,cAAA,CAGJ,wCACI,gCAAA,CACA,0BAAA,CAIJ,4DACI,gCAAA,CACA,2BAAA,CAIR,mCACI,aAAA,CACA,SAAA,CACA,aAAA,CACA,aAAA,CACA,WAAA,CAGJ,mCAEI,aAAA,CACA,WAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAOJ,8DACI,WAAA,CAGJ,mCACI,aAAA,CACA,aAAA,CACA,iBAAA,CACA,gCAAA,CACA,2BAAA,CACA,eAAA,CACA,eAAA,CACA,gBAAA,CACA,iCAAA,CAGJ,2BACI,iBAAA,CACA,YAAA,CACA,mBAAA,CACA,OAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CACA,8BAAA,CAEA,iCACI,gCAAA,CAEA,2CACI,WAAA,CAIR,kCACI,+BAAA,CAEA,4CACI,UAAA,CAMZ,2BACI,YAAA,CACA,iBAAA,CACA,mCAAA,CAGJ,4BACI,aAAA,CACA,WAAA,CAGJ,6BACI,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,2BAAA,CACA,gBAAA,CACA,gBAAA,CAGJ,4BACI,YAAA,CACA,kBAAA,CACA,OAAA,CACA,cAAA,CACA,gBAAA,CACA,eAAA,CACA,2BAAA,CAGJ,6BAEI,aAAA,CACA,WAAA,CACA,cAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,8BAAA,CACA,eAAA,CAGA,oCACI,gCAAA,CACA,yBAAA,CAKR,iCAEI,aAAA,CACA,aAAA,CACA,iBAAA,CAGA,+BAAA,CACA,aAAA,CACA,eAAA,CACA,iCAAA,CAIJ,8BACI,YAAA,CACA,kBAAA,CACA,cAAA,CACA,WAAA,CACA,cAAA,CACA,eAAA,CAGJ,6BACI,aAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,0BAAA,CAGA,mCACI,2BAAA,CAIR,+BACI,aAAA,CACA,gBAAA,CACA,iCAAA,CACA,WAAA,CAQJ,mCACI,YAAA,CACA,kBAAA,CACA,OAAA,CACA,gBAAA,CACA,wBAAA,CACA,iBAAA,CAEA,2BAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,cAAA,CACA,6CAAA,CAEA,yCACI,gCAAA,CACA,0BAAA,CAGJ,mDACI,gCAAA,CACA,2BAAA,CAKJ,mDACI,gBAAA,CAIR,8BACI,YAAA,CACA,mBAAA,CACA,OAAA,CACA,mBAAA,CACA,qBAAA,CACA,iBAAA,CACA,cAAA,CAGA,WAAA,CACA,+CAAA,CAEA,oCACI,gCAAA,CACA,SAAA,CAIJ,sCACI,kBAAA,CACA,mGAAA,CACA,wBAAA,CAGJ,wCACI,cAAA,CACA,2BAAA,CAGJ,uCACI,OAAA,CACA,cAAA,CACA,cAAA,CACA,2BAAA,CAKR,2BACI,aAAA,CACA,WAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAEA,kCAAA,2BAAA,CACA,mCAAA,2BAAA,CACA,qCAAA,2BAAA,CACA,qCAAA,0BAAA,CACA,qCAAA,2BAAA,CACA,kCAAA,0BAAA,CAGA,gCACI,aAAA,CACA,iBAAA,CACA,gCAAA,CACA,aAAA,CAIR,4BACI,aAAA,CACA,gBAAA,CACA,gBAAA,CACA,iCAAA,CAIJ,mCACI,UAAA,CAEA,2CACI,kBAAA,CACA,qBAAA,CAIR,mCACI,aAAA,CACA,WAAA,CACA,aAAA,CACA,sCAAA,CACA,iBAAA,CACA,0BAAA,CACA,UAAA,CACA,gBAAA,CACA,YAAA,CAEA,yCACI,qCAAA,CAIR,6BACI,aAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,QAAA,CACA,iBAAA,CACA,SAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,aAAA,CACA,cAAA,CACA,+CAAA,CAEA,mCACI,oBAAA,CACA,8BAAA,CAIR,4BACI,YAAA,CACA,OAAA,CACA,WAAA,CACA,0CAAA,CAGJ,2BACI,aAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,cAAA,CAEA,iCACI,gCAAA,CACA,UAAA,CAKR,gEAEI,aAAA,CACA,cAAA,CACA,cAAA,CACA,aAAA,CAOJ,8BACI,YAAA,CACA,aAAA,CACA,OAAA,CACA,kBAAA,CACA,iBAAA,CACA,0BAAA,CAGJ,oCAEI,aAAA,CACA,WAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,YAAA,CACA,0BAAA,CACA,2BAAA,CACA,cAAA,CACA,eAAA,CAEA,iDACI,0BAAA,CAGJ,0CACI,gCAAA,CACA,UAAA,CAMR,oCACI,YAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,QAAA,CACA,iBAAA,CACA,wBAAA,CACA,2BAAA,CACA,cAAA,CACA,aAAA,CACA,cAAA,CAEA,0CACI,gCAAA,CACA,UAAA,CAIR,yDACI,aAAA,CAKJ,2BACI,cAAA,CAEA,gBAAA,CACA,6CAAA,CAEA,iCACI,gCAAA,CAKJ,kCACI,mDAAA,CACA,+BAAA,CACA,2BAAA,CAMR,6BACI,gBAAA,CACA,2BAAA,CACA,iBAAA,CACA,oBAAA,CACA,cAAA,CACA,eAAA,CAYJ,uFAEI,+CAAA,CACA,8BAAA,CAKJ,+CACI,gCAAA,CAKJ,4EAEI,YAAA,CAMJ,uCACI,WAAA,CACA,gCAAA,CACA,wCAAA,CACA,mBAAA,CAKJ,oCACI,iBAAA,CACA,QAAA,CACA,SAAA,CACA,WAAA,CACA,SAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,6BAAA,CACA,qCAAA,CACA,2BAAA,CACA,cAAA,CACA,gBAAA,CAEA,mBAAA,CAKJ,uFAEI,iBAAA,CAGJ,uGAEI,aAAA,CAMR,gBACI,YAAA,CACA,qBAAA,CACA,SAAA,CACA,eAAA,CACA,yDAAA,CACA,cAAA,CACA,0BAAA,CAGA,8BAAA,2CAAA,CACA,6BAAA,4CAAA,CAEA,iCACI,sCAAA,CACA,mBAAA,CAGJ,8BACI,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,OAAA,CACA,wBAAA,CACA,6CAAA,CACA,gBAAA,CAGJ,+BACI,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,2BAAA,CACA,eAAA,CAGJ,+BACI,YAAA,CACA,aAAA,CACA,OAAA,CAGJ,6BACI,cAAA,CACA,eAAA,CACA,QAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,eAAA,CACA,cAAA,CAEA,mCACI,+BAAA,CACA,UAAA,CAIJ,4CACI,+BAAA,CACA,aAAA,CAIR,8BACI,YAAA,CACA,cAAA,CACA,OAAA,CACA,eAAA,CACA,6CAAA,CAEA,oCACI,UAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,0BAAA,CACA,aAAA,CACA,qBAAA,CACA,cAAA,CAEA,0CACI,SAAA,CACA,gCAAA,CAMZ,mCACI,UAAA,CACA,eAAA,CACA,0BAAA,CACA,cAAA,CACA,sBAAA,CACA,kBAAA,CAEA,yCACI,YAAA,CAKR,8BACI,YAAA,CACA,kBAAA,CACA,OAAA,CACA,eAAA,CACA,6CAAA,CAEA,oCACI,aAAA,CACA,WAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,0BAAA,CACA,aAAA,CACA,qBAAA,CACA,cAAA,CAEA,0CACI,SAAA,CACA,gCAAA,CAKZ,oCACI,aAAA,CACA,cAAA,CACA,2BAAA,CACA,cAAA,CACA,gBAAA,CAIJ,iCACI,iBAAA,CACA,gCAAA,CACA,aAAA,CAGJ,iCACI,gCAAA,CACA,aAAA,CAIJ,iCACI,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,OAAA,CACA,eAAA,CACA,0CAAA,CACA,0BAAA,CAGJ,mCACI,eAAA,CACA,0BAAA,CACA,cAAA,CACA,sBAAA,CACA,kBAAA,CAGJ,mCACI,YAAA,CACA,aAAA,CACA,OAAA,CAGJ,wEAEI,gBAAA,CACA,sCAAA,CACA,iBAAA,CACA,wBAAA,CACA,2BAAA,CACA,cAAA,CACA,cAAA,CAEA,kHACI,iCAAA,CACA,gCAAA,CACA,UAAA,CAGJ,0FACI,WAAA,CACA,cAAA,CAIR,mCACI,gCAAA,CACA,aAAA,CAKJ,sCACI,aAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,eAAA,CACA,QAAA,CACA,0BAAA,CACA,aAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CACA,WAAA,CACA,UAAA,CAEA,4CACI,SAAA,CAKR,8BACI,YAAA,CACA,cAAA,CACA,OAAA,CACA,eAAA,CACA,6CAAA,CACA,gBAAA,CAGJ,6BACI,cAAA,CACA,eAAA,CACA,eAAA,CACA,qCAAA,CACA,kBAAA,CACA,wBAAA,CACA,2BAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,cAAA,CAEA,mCACI,UAAA,CACA,kCAAA,CAGJ,4CACI,gCAAA,CACA,+BAAA,CACA,aAAA,CAIR,8BACI,aAAA,CACA,aAAA,CACA,sBAAA,CACA,2BAAA,CAEA,gBAAA,CAGJ,8BACI,aAAA,CACA,eAAA,CACA,gBAAA,CACA,0CAAA,CACA,2BAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAIJ,gCACI,iBAAA,CACA,KAAA,CACA,QAAA,CACA,SAAA,CACA,iBAAA,CACA,SAAA,CAGJ,8CAAA,SAAA,CACA,6CAAA,UAAA,CAEA,+BACI,eAAA,CACA,2BAAA,CACA,eAAA,CAEA,kCAAA,iBAAA,CAAA,cAAA,CACA,kCAAA,YAAA,CAGJ,6BACI,2BAAA,CACA,cAAA,CAKJ,+BACI,YAAA,CACA,sBAAA,CACA,sBAAA,CAEA,mCACI,cAAA,CAEA,WAAA,CACA,gCAAA,CAIR,8BACI,YAAA,CACA,OAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAEA,kCACI,QAAA,CACA,eAAA,CAGJ,8CACI,aAAA,CACA,2BAAA,CACA,gBAAA,CACA,gBAAA,CAGJ,2CACI,aAAA,CACA,eAAA,CACA,2BAAA,CAIR,+BACI,eAAA,CAEA,qCACI,wBAAA,CACA,cAAA,CAGJ,oEACI,eAAA,CACA,eAAA,CACA,eAAA,CACA,sCAAA,CACA,kBAAA,CACA,sBAAA,CAGJ,kCACI,eAAA,CACA,KAAA,CACA,kBAAA,CACA,0BAAA,CAGJ,+CACI,0BAAA,CACA,gBAAA,CAKR,4BACI,gBAAA,CACA,qBAAA,CAEA,0LACI,mBAAA,CACA,UAAA,CACA,eAAA,CAEJ,+BAAA,cAAA,CACA,+BAAA,cAAA,CAAA,kBAAA,CAAA,4CAAA,CACA,+BAAA,cAAA,CACA,6FAAA,cAAA,CAEA,8BAAA,aAAA,CAEA,8BACI,aAAA,CACA,oBAAA,CACA,cAAA,CAEA,oCAAA,yBAAA,CAGJ,iCACI,eAAA,CACA,iBAAA,CACA,gCAAA,CACA,qBAAA,CACA,cAAA,CAGJ,gCACI,eAAA,CACA,aAAA,CACA,gBAAA,CACA,sCAAA,CACA,iBAAA,CACA,0BAAA,CAEA,qCACI,SAAA,CACA,wBAAA,CACA,eAAA,CAIR,8DAAA,iBAAA,CAAA,aAAA,CACA,+BAAA,cAAA,CAEA,wCAAA,eAAA,CAAA,iBAAA,CACA,yCAAA,0BAAA,CAEA,uCACI,aAAA,CACA,sBAAA,CACA,2CAAA,CACA,0BAAA,CAGJ,+BACI,cAAA,CACA,QAAA,CACA,0CAAA,CAGJ,kCACI,aAAA,CACA,eAAA,CACA,wBAAA,CACA,aAAA,CACA,cAAA,CAGJ,8DACI,eAAA,CACA,qCAAA,CACA,eAAA,CAGJ,+BAAA,gCAAA,CAAA,UAAA,CAEA,gCACI,cAAA,CACA,iBAAA,CAGJ,yCACI,eAAA,CACA,iBAAA,CACA,gCAAA,CACA,2BAAA,CACA,cAAA,CAMR,+BACI,YAAA,CACA,aAAA,CACA,OAAA,CACA,eAAA,CACA,6CAAA,CACA,gBAAA,CAGJ,8BACI,aAAA,CACA,gBAAA,CACA,qCAAA,CACA,iBAAA,CACA,wBAAA,CACA,2BAAA,CACA,cAAA,CACA,cAAA,CAEA,oCACI,kCAAA,CACA,UAAA,CAGJ,8CACI,gCAAA,CACA,+BAAA,CACA,aAAA,CAOR,+BACI,aAAA,CACA,gBAAA,CACA,gBAAA,CACA,uCAAA,CACA,iBAAA,CACA,wBAAA,CACA,2BAAA,CACA,cAAA,CACA,cAAA,CAEA,qCACI,kCAAA,CACA,UAAA,CAIJ,iDACI,kBAAA,CACA,iCAAA,CACA,aAAA,CAKJ,uCAAA,aAAA,CACA,wCAAA,aAAA,CAIJ,kCACI,kBAAA,CACA,0BAAA,CACA,eAAA,CAGJ,mCACI,kBAAA,CACA,kBAAA,CACA,6CAAA,CAGJ,mCACI,YAAA,CACA,kBAAA,CACA,OAAA,CACA,UAAA,CACA,eAAA,CACA,QAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,eAAA,CACA,cAAA,CACA,cAAA,CAEA,yCAAA,gCAAA,CAEA,oDACI,aAAA,CACA,cAAA,CACA,0BAAA,CACA,iBAAA,CACA,cAAA,CAGJ,0DAAA,aAAA,CACA,4DAAA,aAAA,CACA,4DAAA,aAAA,CAEA,sDACI,aAAA,CACA,eAAA,CACA,kBAAA,CACA,sBAAA,CAEA,qBAAA,CAGJ,qDACI,aAAA,CAEA,uDACI,eAAA,CACA,eAAA,CAKZ,kCACI,YAAA,CACA,0BAAA,CACA,cAAA,CAGJ,wCACI,kBAAA,CACA,kBAAA,CACA,6CAAA,CAEA,wDACI,eAAA,CACA,eAAA,CACA,0BAAA,CACA,kBAAA,CACA,sBAAA,CACA,qBAAA,CACA,cAAA,CAEA,sEACI,cAAA,CAEA,4EAAA,gCAAA,CAAA,UAAA,CAKZ,mCACI,kBAAA,CAIJ,oCACI,eAAA,CACA,KAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,sCAAA,CACA,yBAAA,CACA,kBAAA,CACA,0BAAA,CACA,kBAAA,CACA,sBAAA,CACA,qBAAA,CACA,cAAA,CACA,cAAA,CAEA,0CAAA,UAAA,CAGJ,mCACI,eAAA,CACA,sCAAA,CACA,YAAA,CACA,2BAAA,CACA,cAAA,CAGJ,oCACI,eAAA,CACA,sCAAA,CACA,YAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAIJ,uBACI,YAAA,CAEA,cAAA,CACA,eAAA,CACA,eAAA,CAEA,iCACI,aAAA,CACA,UAAA,CACA,iBAAA,CACA,2BAAA,CACA,gBAAA,CACA,gBAAA,CAGJ,iCACI,aAAA,CACA,iBAAA,CACA,0BAAA,CAIR,2BACI,gCAAA,CAEA,qCAAA,aAAA,CAGJ,2BACI,gCAAA,CAEA,qCAAA,aAAA,CAGJ,4BACI,8BAAA,CAEA,sCAAA,0BAAA,CAMJ,+BACI,aAAA,CACA,cAAA,CACA,aAAA,CACA,sCAAA,CACA,iBAAA,CACA,2BAAA,CACA,iBAAA,CACA,cAAA,CACA,cAAA,CAEA,qCACI,iCAAA,CACA,UAAA,CAIR,sCACI,iCAAA,CACA,gCAAA,CACA,aAAA,CAGJ,oCACI,iCAAA,CACA,gCAAA,CACA,aAAA,CAGJ,wCACI,iCAAA,CACA,gCAAA,CACA,aAAA,CAQJ,0HAGI,cAAA,CAGJ,8FAEI,6CAAA,CAIJ,oEAEI,gCAAA,CACA,+BAAA,CAEA,gLAEI,0BAAA,CAGJ,gLAEI,UAAA,CAOR,gDACI,aAAA,CACA,eAAA,CAGJ,uBACI,YAAA,CAEA,cAAA,CACA,eAAA,CACA,eAAA,CAEA,iCACI,aAAA,CACA,UAAA,CACA,iBAAA,CACA,2BAAA,CACA,gBAAA,CACA,gBAAA,CAGJ,iCACI,aAAA,CACA,iBAAA,CACA,2BAAA,CAKR,6BACI,aAAA,CACA,eAAA,CACA,gBAAA,CACA,0CAAA,CACA,0BAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAIJ,gCACI,+BAAA,CACA,aAAA,CAIJ,gCACI,aAAA,CACA,eAAA,CACA,0CAAA,CAGJ,oCACI,iBAAA,CACA,2BAAA,CACA,cAAA,CAGJ,oCACI,YAAA,CACA,OAAA,CACA,kBAAA,CAGJ,oCACI,aAAA,CACA,WAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,0BAAA,CACA,aAAA,CACA,qBAAA,CACA,cAAA,CAEA,0CACI,gCAAA,CACA,SAAA,CAIR,mCACI,aAAA,CACA,gBAAA,CACA,sCAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,cAAA,CAEA,wDACI,kCAAA,CACA,UAAA,CAIJ,4CACI,WAAA,CACA,cAAA,CAIJ,wDACI,iCAAA,CACA,gCAAA,CACA,aAAA,CAIR,qCACI,cAAA,CACA,eAAA,CACA,0BAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAKR,SACI,cAAA,CACA,aAAA,CACA,eAAA,CACA,WAAA,CACA,sCAAA,CACA,iBAAA,CACA,kBAAA,CACA,oCAAA,CACA,cAAA,CACA,gBAAA,CAEA,uBACI,gBAAA,CACA,iBAAA,CACA,2BAAA,CACA,cAAA,CAEA,6BACI,+BAAA,CACA,UAAA,CAMZ,iBACI,cAAA,CACA,OAAA,CACA,YAAA,CAEA,mBAAA,CAIJ,iBACI,cAAA,CACA,YAAA,CACA,oCAAA,CACA,+BAAA,CACA,uCAAA,CACA,wEAAA,CAIJ,cACI,cAAA,CACA,UAAA,CACA,WAAA,CACA,sBAAA,CACA,sCAAA,CACA,iBAAA,CACA,6BAAA,CACA,qCAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,4BACI,UAAA,CACA,WAAA,CACA,sCAAA,CACA,iBAAA,CAGJ,qBACI,iCAAA,CACA,+BAAA,CAIJ,8CAAA,0CAAA,CACA,+CAAA,2CAAA,CACA,6CAAA,yCAAA,CACA,gDAAA,4CAAA,CAOJ,iBACI,cAAA,CACA,YAAA,CACA,iBAAA,CACA,+BAAA,CACA,sCAAA,CAEA,mBAAA,CAIJ,mBACI,eAAA,CAIA,8EAEI,0BAAA,CAGJ,iCACI,mBAAA,CAKR,iBACI,cAAA,CAEA,+BACI,mBAAA,CAMJ,6CACI,uBAAA,CAGJ,8BACI,YAAA,CACA,kBAAA,CAEA,iBAAA,CAGA,yDAAA,CAQR,aACI,cAAA,CACA,UAAA,CACA,WAAA,CACA,aAAA,CACA,eAAA,CACA,eAAA,CACA,iBAAA,CACA,sCAAA,CACA,iBAAA,CACA,6BAAA,CACA,qCAAA,CACA,aAAA,CACA,cAAA,CAEA,8BACI,eAAA,CACA,iBAAA,CACA,kBAAA,CACA,sBAAA,CACA,eAAA,CAGJ,8BACI,YAAA,CACA,OAAA,CACA,kBAAA,CAGJ,oBACI,aAAA,CACA,eAAA,CACA,sCAAA,CACA,iBAAA,CACA,wBAAA,CACA,2BAAA,CACA,cAAA,CACA,cAAA,CAEA,0BACI,gCAAA,CACA,+BAAA,CACA,UAAA,CAKR,gCACI,aAAA,CACA,cAAA,CACA,eAAA,CACA,2BAAA,CAGJ,gCACI,YAAA,CACA,OAAA,CACA,kBAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CACA,cAAA,CACA,cAAA",sourcesContent:['// AgentDeck 사이드바 스타일\r\n// Tabby 테마 변수(--bs-*)를 우선 쓰되, 없을 때를 대비해 폴백 색을 함께 준다.\r\n\r\n// tabby-background 의 배경 이미지 레이어(.content-tab-active::before)를 터미널 영역으로 자른다.\r\n// 좌표 변수(--ad-bg-*)는 deck.service 의 syncBackgroundClip 이 relayout 마다 내려준다.\r\n// 그 플러그인은 런타임에 <style> 을 만들어 head 뒤쪽에 붙이므로 순서로는 못 이긴다 — !important 필수.\r\nbody.agentdeck-active.ad-bg-clip .content-tab-active::before {\r\n left: var(--ad-bg-left) !important;\r\n top: var(--ad-bg-top) !important;\r\n right: auto !important;\r\n bottom: auto !important;\r\n width: var(--ad-bg-width) !important;\r\n height: var(--ad-bg-height) !important;\r\n}\r\n\r\n#agentdeck-sidebar {\r\n display: flex;\r\n flex-direction: column;\r\n // 실제 위치와 크기는 deck.service 의 relayout 이 인라인으로 준다 (도킹 방향에 따라 달라짐)\r\n z-index: 5;\r\n overflow: hidden;\r\n // --ad-panel-bg 는 agentdeck 이 sidebarOpacity 로 내려준다 (배경 이미지가 비치게)\r\n background: var(--ad-panel-bg, var(--bs-body-bg, #1e2127));\r\n font-size: 12px;\r\n user-select: none;\r\n -webkit-app-region: no-drag;\r\n\r\n // 붙어 있는 쪽 반대편에만 경계선을 그린다\r\n &.ad-dock-right { border-left: 1px solid rgba(255, 255, 255, 0.08); }\r\n &.ad-dock-left { border-right: 1px solid rgba(255, 255, 255, 0.08); }\r\n &.ad-dock-top { border-bottom: 1px solid rgba(255, 255, 255, 0.08); }\r\n &.ad-dock-bottom { border-top: 1px solid rgba(255, 255, 255, 0.08); }\r\n\r\n // 상/하 도킹은 세로가 짧으므로 목록을 가로로 흘린다\r\n &.ad-dock-top,\r\n &.ad-dock-bottom {\r\n .ad-list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-content: flex-start;\r\n gap: 0 6px;\r\n overflow-y: auto;\r\n }\r\n\r\n // 한 줄에 여러 탭이 나란히 서므로 폭을 220px 로 못박는다 — 제목 길이에 따라\r\n // 들쭉날쭉하면 어느 칸이 어느 세션인지 눈으로 못 따라가고, 제목이 바뀔 때마다 자리가 밀린다.\r\n //\r\n // **`min-width: 0` 이 있어야 `flex-basis` 가 살아남는다.** flex 아이템은\r\n // `min-width: auto`(초깃값) + `overflow: visible` 이면 **자동 최소 크기**가 걸려\r\n // 최소내용폭(min-content) 밑으로는 줄지 않는다. 그래서 제목이 긴 탭은 220 을 밀어올렸다\r\n // (2026-09-09 CDP 실측: 1700 창·탭 6개에서 220 지정인데 384.7px, 한 줄에 4개 +\r\n // 둘째 줄이 반쯤 잘림). 폭을 못박아도 제목은 읽힌다 — `.ad-title` 이 이미 말줄임을\r\n // 갖고 있고, 220 은 좌/우 도킹의 평소 줄 폭(사이드바 기본 200px)보다 오히려 넓다.\r\n .ad-tab {\r\n flex: 0 0 220px;\r\n min-width: 0;\r\n }\r\n\r\n // 그룹 헤더는 한 줄을 다 차지해 가로 흘림을 끊는다 — 그래야 헤더 아래 줄부터 그 그룹의\r\n // 탭이 흐른다. 헤더를 div 로 감싸는 대신 형제로 두는 이유가 이것이다(deck.service renderGroupHead)\r\n .ad-group-head {\r\n flex: 0 0 100%;\r\n margin-top: 2px;\r\n }\r\n }\r\n\r\n .ad-head {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 10px 12px 8px;\r\n letter-spacing: 0.12em;\r\n font-size: 10px;\r\n font-weight: 700;\r\n color: rgba(255, 255, 255, 0.4);\r\n // 헤더를 잡아 끌면 도킹 방향을 바꾼다 (OS 창 이동에 뺏기면 안 되므로 no-drag)\r\n -webkit-app-region: no-drag;\r\n cursor: grab;\r\n\r\n &:active {\r\n cursor: grabbing;\r\n }\r\n }\r\n\r\n // 경계선 — 잡아 끌면 크기가 바뀐다. 붙어 있는 쪽 반대편 가장자리에 놓는다\r\n .ad-resize {\r\n position: absolute;\r\n z-index: 6;\r\n background: transparent;\r\n transition: background 0.12s ease;\r\n\r\n &:hover,\r\n body.ad-resizing & {\r\n background: rgba(97, 175, 239, 0.5);\r\n }\r\n }\r\n\r\n .ad-resize-right,\r\n .ad-resize-left {\r\n top: 0;\r\n bottom: 0;\r\n width: 6px;\r\n cursor: col-resize;\r\n }\r\n\r\n .ad-resize-right { left: 0; }\r\n .ad-resize-left { right: 0; }\r\n\r\n .ad-resize-top,\r\n .ad-resize-bottom {\r\n left: 0;\r\n right: 0;\r\n height: 6px;\r\n cursor: row-resize;\r\n }\r\n\r\n .ad-resize-bottom { top: 0; }\r\n .ad-resize-top { bottom: 0; }\r\n\r\n // 상태별 집계 칩 한 줄 — `⏸ 2 ● 3 ○ 1`. 헤더 높이는 총 개수만 있던 때와 같게 유지한다\r\n .ad-head-count {\r\n -webkit-app-region: no-drag;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex: 0 0 auto;\r\n white-space: nowrap;\r\n letter-spacing: 0;\r\n color: rgba(255, 255, 255, 0.55);\r\n }\r\n\r\n .ad-cnt {\r\n padding: 1px 6px;\r\n border-radius: 8px;\r\n background: rgba(255, 255, 255, 0.08);\r\n color: var(--ad-color, rgba(255, 255, 255, 0.55));\r\n font-size: 10px;\r\n line-height: 1.3;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n // 요구 2-1: 탭이 많아지면 이 영역만 스크롤된다\r\n .ad-list {\r\n flex: 1 1 auto;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n padding: 2px 6px 8px;\r\n // **못박아 둔다** — 드래그 자동 스크롤(deck.service `dragScrollTick`)이 매 프레임\r\n // `scrollTop` 에 몇 px 를 더하는 식으로 목록을 흘린다. 여기가 `smooth` 면 그 대입마다\r\n // 새 애니메이션이 시작돼 서로를 덮어써서 목록이 기어가거나 아예 멈춘다.\r\n // 지금 이 값을 `smooth` 로 켜는 곳은 없지만(전역 검색 0건), 나중에 누가 켜면\r\n // 그 기능이 **조용히** 못 쓰게 되는 자리라 의도를 여기 남긴다.\r\n scroll-behavior: auto;\r\n\r\n &::-webkit-scrollbar {\r\n width: 8px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.24);\r\n }\r\n }\r\n }\r\n\r\n // 프로젝트(작업 폴더) 그룹 헤더 — `▾ tabby-agentdeck 3`. 그룹이 둘 이상일 때만 그린다.\r\n // 헤더 자체는 탭보다 작고 어둡게 둔다 — 세션 목록이 주인공이고 이건 칸막이다.\r\n .ad-group-head {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n margin: 7px 0 2px;\r\n padding: 2px 4px;\r\n border-radius: 4px;\r\n color: rgba(255, 255, 255, 0.42);\r\n font-size: 10px;\r\n font-weight: 700;\r\n letter-spacing: 0.06em;\r\n cursor: pointer;\r\n transition: background 0.1s ease, color 0.1s ease;\r\n\r\n // 첫 그룹은 목록 맨 위에 붙어야 자연스럽다 (.ad-list 가 이미 위쪽 여백을 준다)\r\n &:first-child {\r\n margin-top: 1px;\r\n }\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n color: rgba(255, 255, 255, 0.7);\r\n }\r\n\r\n // 접힌 그룹은 "여기 뭔가 숨어 있다" 가 보여야 한다 — 개수 칩을 살짝 밝게\r\n &.collapsed .ad-group-count {\r\n background: rgba(255, 255, 255, 0.14);\r\n color: rgba(255, 255, 255, 0.75);\r\n }\r\n }\r\n\r\n .ad-group-caret {\r\n flex: 0 0 auto;\r\n width: 9px;\r\n font-size: 9px;\r\n line-height: 1;\r\n opacity: 0.75;\r\n }\r\n\r\n .ad-group-label {\r\n // 폴더 이름은 길 수 있다(사이드바는 200~560px) — 개수 칩을 밀어내지 않게 줄이고 말줄임\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n // 검색 때문에 임시로 펴 둔 그룹 — 캐럿만 흐리게 해서 "내가 접어 둔 그룹인데 지금은\r\n // 검색 때문에 보이는 중" 임을 알린다. 이유 전문은 헤더 title 에 있다(renderGroupHead).\r\n // 줄 배경이나 라벨 색을 바꾸지 않는 이유: 검색 결과 자체가 이미 강조된 화면이라\r\n // 여기서 또 강조하면 무엇이 걸린 줄인지가 흐려진다.\r\n .ad-group-head.filter-open .ad-group-caret {\r\n opacity: 0.45;\r\n }\r\n\r\n .ad-group-count {\r\n flex: 0 0 auto;\r\n padding: 0 5px;\r\n border-radius: 8px;\r\n background: rgba(255, 255, 255, 0.08);\r\n color: rgba(255, 255, 255, 0.55);\r\n font-size: 9.5px;\r\n line-height: 1.5;\r\n letter-spacing: 0;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n .ad-tab {\r\n position: relative;\r\n display: flex;\r\n align-items: stretch;\r\n gap: 8px;\r\n margin-bottom: 3px;\r\n padding: 7px 6px 7px 0;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n transition: background 0.1s ease;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n\r\n .ad-close {\r\n opacity: 0.65;\r\n }\r\n }\r\n\r\n &.active {\r\n background: rgba(255, 255, 255, 0.1);\r\n\r\n .ad-title {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n // 상태색 표시 바\r\n .ad-bar {\r\n flex: 0 0 3px;\r\n border-radius: 2px;\r\n background: var(--ad-color, #6b727d);\r\n }\r\n\r\n .ad-body {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n }\r\n\r\n .ad-title {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: rgba(255, 255, 255, 0.82);\r\n font-size: 12.5px;\r\n line-height: 1.35;\r\n }\r\n\r\n .ad-meta {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 2px;\r\n font-size: 10.5px;\r\n line-height: 1.4;\r\n color: rgba(255, 255, 255, 0.45);\r\n }\r\n\r\n .ad-badge {\r\n // 이유가 붙으면(승인대기 · Bash 권한) 길어질 수 있다 — 경과시간을 밀어내지 않게 줄이고 말줄임\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n max-width: 100%;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: var(--ad-color, #6b727d);\r\n font-weight: 600;\r\n\r\n // 수동/훅으로 고정된 상태는 밑줄로 구분\r\n &.pinned {\r\n text-decoration: underline dotted;\r\n text-underline-offset: 2px;\r\n }\r\n }\r\n\r\n // 도는 서브에이전트 개수 (`❖3`) — 상태 배지 바로 뒤. 자리 선정 이유는 deck.service `renderTab` 주석\r\n .ad-subagents {\r\n // 배지가 길어져도 이건 줄이지 않는다 — 개수는 한두 글자고, 줄어들면 읽을 수가 없다\r\n flex: 0 0 auto;\r\n padding: 0 4px;\r\n border-radius: 7px;\r\n // 상태색(`--ad-color`)을 쓰지 않는다 — 상태와 다른 축의 정보라 같은 색이면 배지의\r\n // 일부로 읽힌다. 배경까지 넣어 숫자가 상태 문구에 섞이지 않게 칩으로 떼어 둔다\r\n background: rgba(86, 182, 194, 0.18);\r\n color: #56b6c2;\r\n font-weight: 600;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n // 두 번째 줄 — 마지막으로 보낸 프롬프트\r\n .ad-prompt {\r\n display: flex;\r\n align-items: center;\r\n margin-top: 2px;\r\n min-width: 0;\r\n font-size: 11px;\r\n line-height: 1.4;\r\n }\r\n\r\n .ad-label {\r\n flex: 1 1 auto;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: rgba(255, 255, 255, 0.6);\r\n\r\n // 아직 프롬프트가 없는 탭 — 자리는 지키되 눈에 덜 걸리게\r\n &.empty {\r\n color: rgba(255, 255, 255, 0.25);\r\n }\r\n }\r\n\r\n .ad-elapsed {\r\n flex: 0 0 auto;\r\n margin-left: auto;\r\n font-variant-numeric: tabular-nums;\r\n opacity: 0.55;\r\n }\r\n\r\n // ── 지난 세션 (닫힌 Claude Code 세션 이어받기) ─────────────────────────\r\n //\r\n // 그룹의 **서랍**이다 — 살아 있는 탭 뒤에 오고 기본은 접혀 있다.\r\n // 들여쓰기(11px)로 그룹 헤더보다 한 단계 안쪽임을 보인다: 이 줄들은 그룹에 속한\r\n // 목록이지 또 하나의 그룹이 아니다.\r\n .ad-resume-head {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n margin: 5px 0 2px;\r\n padding: 2px 4px 2px 11px;\r\n border-radius: 4px;\r\n // 그룹 헤더(0.42)보다 더 죽인다 — 살아 있는 목록이 먼저 읽혀야 한다\r\n color: rgba(255, 255, 255, 0.34);\r\n font-size: 10px;\r\n font-weight: 700;\r\n letter-spacing: 0.06em;\r\n cursor: pointer;\r\n transition: background 0.1s ease, color 0.1s ease;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n color: rgba(255, 255, 255, 0.6);\r\n }\r\n\r\n .ad-group-count {\r\n background: rgba(255, 255, 255, 0.06);\r\n color: rgba(255, 255, 255, 0.45);\r\n }\r\n\r\n // 캐럿은 오른쪽 끝으로 — 그룹 헤더는 캐럿이 앞에 있는데, 이 줄은 그룹의 하위라\r\n // 같은 자리에 두면 두 헤더가 같은 층으로 읽힌다\r\n .ad-group-caret {\r\n margin-left: auto;\r\n }\r\n }\r\n\r\n .ad-resume {\r\n display: flex;\r\n align-items: stretch;\r\n gap: 8px;\r\n margin: 0 0 3px 11px;\r\n padding: 5px 6px 5px 0;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n // 죽은 세션은 **색이 아니라 형태**로 구분한다. 상태 6색(api.ts STATUS_STYLES)이 이미\r\n // 꽉 차 있어 일곱 번째 색을 들이면 배지가 뜻하는 바가 흐려진다\r\n opacity: 0.66;\r\n transition: background 0.1s ease, opacity 0.1s ease;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n opacity: 1;\r\n }\r\n\r\n // 좌측 바를 점선으로 끊는다 — 살아 있는 줄의 실선 상태바와 한눈에 갈린다\r\n .ad-bar {\r\n background: #3a404b;\r\n background-image: linear-gradient(var(--ad-panel-bg, var(--bs-body-bg, #1e2127)) 50%, transparent 0);\r\n background-size: 100% 5px;\r\n }\r\n\r\n .ad-title {\r\n font-size: 12px;\r\n color: rgba(255, 255, 255, 0.72);\r\n }\r\n\r\n .ad-meta {\r\n gap: 5px;\r\n margin-top: 1px;\r\n font-size: 10px;\r\n color: rgba(255, 255, 255, 0.36);\r\n }\r\n }\r\n\r\n // 끝난 상태의 흔적 — 살아 있는 배지와 같은 세기로 칠하지 않는다(그러면 도는 줄로 읽힌다)\r\n .re-was {\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n font-weight: 600;\r\n\r\n &.s-done { color: rgba(152, 195, 121, 0.62); }\r\n &.s-error { color: rgba(224, 108, 117, 0.68); }\r\n &.s-limited { color: rgba(198, 120, 221, 0.62); }\r\n &.s-waiting { color: rgba(97, 175, 239, 0.62); }\r\n &.s-running { color: rgba(229, 192, 123, 0.62); }\r\n &.s-idle { color: rgba(255, 255, 255, 0.3); }\r\n\r\n // 이미 열려 있는 세션 — 이건 죽지 않았으므로 상태색을 그대로 쓴다\r\n &.live {\r\n padding: 0 4px;\r\n border-radius: 7px;\r\n background: rgba(229, 192, 123, 0.16);\r\n color: #e5c07b;\r\n }\r\n }\r\n\r\n .re-when {\r\n flex: 0 0 auto;\r\n margin-left: auto;\r\n padding-left: 6px;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n // 열려 있는 세션은 흐리게 두지 않는다 — 지금 도는 작업이라 목록에서도 살아 보여야 한다\r\n .ad-resume.open {\r\n opacity: 0.9;\r\n\r\n .ad-bar {\r\n background: #e5c07b;\r\n background-image: none;\r\n }\r\n }\r\n\r\n .ad-label-input {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n padding: 0 4px;\r\n border: 1px solid rgba(255, 255, 255, 0.25);\r\n border-radius: 3px;\r\n background: rgba(0, 0, 0, 0.35);\r\n color: #fff;\r\n font-size: 10.5px;\r\n outline: none;\r\n\r\n &:focus {\r\n border-color: var(--ad-color, #61afef);\r\n }\r\n }\r\n\r\n .ad-close {\r\n flex: 0 0 auto;\r\n align-self: center;\r\n width: 18px;\r\n height: 18px;\r\n padding: 0;\r\n border: 0;\r\n border-radius: 3px;\r\n opacity: 0;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.8);\r\n font-size: 15px;\r\n line-height: 1;\r\n cursor: pointer;\r\n transition: opacity 0.1s ease, background 0.1s ease;\r\n\r\n &:hover {\r\n opacity: 1 !important;\r\n background: rgba(255, 80, 80, 0.35);\r\n }\r\n }\r\n\r\n .ad-foot {\r\n display: flex;\r\n gap: 6px;\r\n padding: 8px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.07);\r\n }\r\n\r\n .ad-btn {\r\n flex: 1 1 auto;\r\n padding: 5px 8px;\r\n border: 1px solid rgba(255, 255, 255, 0.12);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.6);\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n color: #fff;\r\n }\r\n }\r\n\r\n // 글자가 한 자뿐인 버튼들은 나머지와 같은 비율로 늘어나면 허전하다\r\n .ad-repair,\r\n .ad-viewtoggle {\r\n flex: 0 0 auto;\r\n min-width: 28px;\r\n font-size: 13px;\r\n line-height: 1;\r\n }\r\n // ---------- 세션 검색 / 상태 필터 (deck.service buildSidebar · wireSearch) ----------\r\n // 유닛 T 가 넘긴 CSS — 그 유닛은 이 파일을 소유하지 않아 배리어에서 메인이 넣는다.\r\n //\r\n // 검색 줄은 헤더와 목록 사이의 별도 flex 아이템이다. `.ad-list` 안에 두면 `render()` 의\r\n // innerHTML 초기화에 입력창이 매 글자마다 새로 만들어져 포커스·IME 조합이 날아간다.\r\n .ad-search {\r\n display: flex;\r\n flex: 0 0 auto;\r\n gap: 4px;\r\n align-items: center;\r\n padding: 0 8px 6px;\r\n -webkit-app-region: no-drag;\r\n }\r\n\r\n .ad-search-input {\r\n // 사이드바는 200~560px — 입력창이 남는 폭을 다 쓰되 줄어들 때 버튼을 밀지 않게\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n padding: 3px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n outline: none;\r\n background: rgba(0, 0, 0, 0.28);\r\n color: rgba(255, 255, 255, 0.85);\r\n font-size: 11px;\r\n line-height: 1.4;\r\n\r\n &::placeholder {\r\n color: rgba(255, 255, 255, 0.3);\r\n }\r\n\r\n &:focus {\r\n border-color: rgba(97, 175, 239, 0.7);\r\n color: #fff;\r\n }\r\n }\r\n\r\n // 지우기 버튼은 **걸린 필터가 있을 때만** 보인다 (deck.service syncSearchUi 가 `.has-query`).\r\n // 늘 자리를 잡으면 입력창이 그만큼 좁아지고, 빈 칸 옆의 ✕ 는 무엇을 지우는지 알 수 없다.\r\n .ad-search-clear {\r\n display: none;\r\n flex: 0 0 auto;\r\n width: 18px;\r\n height: 18px;\r\n padding: 0;\r\n border: 0;\r\n border-radius: 3px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.45);\r\n font-size: 14px;\r\n line-height: 1;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.12);\r\n color: #fff;\r\n }\r\n }\r\n\r\n .ad-search.has-query .ad-search-clear {\r\n display: block;\r\n }\r\n\r\n // 집계 칩은 상태 필터의 조작부다 (renderHeadCount → toggleStatusFilter).\r\n // 위쪽 `.ad-cnt` 규칙에 "누를 수 있다" 와 "지금 걸려 있다" 만 덧붙인다.\r\n .ad-cnt {\r\n cursor: pointer;\r\n // 헤더는 도킹 드래그 핸들이라 글자가 잡히면 드래그가 지저분해진다\r\n user-select: none;\r\n transition: background 0.1s ease, color 0.1s ease;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.16);\r\n }\r\n\r\n // 걸려 있는 필터 — 배경 알파는 SCSS 가 var() 를 계산할 수 없으니\r\n // 상태색은 안쪽 테두리와 글자색으로만 쓴다\r\n &.active {\r\n box-shadow: inset 0 0 0 1px var(--ad-color, #61afef);\r\n background: rgba(255, 255, 255, 0.2);\r\n color: var(--ad-color, #fff);\r\n }\r\n }\r\n\r\n // 필터에 아무것도 안 걸렸을 때의 한 줄 (deck.service renderEmpty).\r\n // 빈 목록만 남기면 "탭이 다 닫혔다" 로 읽히므로 이유를 글로 남긴다.\r\n .ad-empty {\r\n padding: 10px 8px;\r\n color: rgba(255, 255, 255, 0.42);\r\n text-align: center;\r\n word-break: break-all;\r\n font-size: 11px;\r\n line-height: 1.5;\r\n }\r\n\r\n // 키보드 포커스 링 (deck.service `isNavFocused`) — **활성 탭 표시와 다른 것이어야 한다.**\r\n // 활성(선택)은 배경으로, 키보드 포커스는 테두리로 말한다. 둘을 같은 모양으로 그리면\r\n // "지금 보고 있는 줄" 과 "지금 쓰고 있는 탭" 이 화면에서 구별되지 않고, 그 구별이 이\r\n // 기능의 전부다(이동만으로는 탭이 바뀌지 않는다, `navFocus` 주석).\r\n //\r\n // outline 대신 inset box-shadow 를 쓰는 이유 둘 — outline 은 `.ad-list` 의\r\n // `overflow-y: auto` 경계에서 잘리고, border 는 줄 높이를 1px 밀어 포커스가 지나갈 때마다\r\n // 목록 전체가 흔들린다. 상태색(`--ad-color`)을 쓰지 않는 것도 일부러다: 포커스는 세션 상태와\r\n // 무관한 "내 손이 어디 있나" 라서, 상태색으로 그리면 배지 색과 섞여 읽힌다.\r\n .ad-tab.ad-nav-focus,\r\n .ad-group-head.ad-nav-focus {\r\n box-shadow: inset 0 0 0 1px rgba(97, 175, 239, 0.85);\r\n background: rgba(97, 175, 239, 0.1);\r\n }\r\n\r\n // 포커스가 활성 탭 위에 있을 때 — 배경은 활성 쪽(밝은 회색)을 유지하고 테두리만 얹는다.\r\n // 그래야 "이 줄이 지금 쓰는 탭이고, 포커스도 여기 있다" 가 한 줄에서 다 읽힌다\r\n .ad-tab.active.ad-nav-focus {\r\n background: rgba(255, 255, 255, 0.14);\r\n }\r\n\r\n // 목록 자체가 포커스를 받는다(tabindex=-1) — 브라우저 기본 outline 은 지운다.\r\n // 사각형이 목록 전체에 둘러쳐지면 어느 **줄**에 있는지가 오히려 안 보인다\r\n .ad-list:focus,\r\n .ad-list:focus-visible {\r\n outline: none;\r\n }\r\n\r\n // 끌고 있는 줄 — 원래 자리에 흐릿하게 남긴다. 줄을 실제로 옮겨 그리지 않는 이유는\r\n // deck.service `render` 의 드래그 가드에 있다(목록을 다시 만들면 끌던 DOM 이 사라진다).\r\n // "무엇을 들고 있나" 는 이 흐릿한 줄이, "어디에 놓이나" 는 삽입선(.ad-reorder-line)이 말한다.\r\n .ad-tab.ad-dragging {\r\n opacity: 0.45;\r\n background: rgba(255, 255, 255, 0.06);\r\n outline: 1px dashed rgba(255, 255, 255, 0.28);\r\n outline-offset: -1px;\r\n }\r\n\r\n // 순서를 바꿀 수 없는 상태에서 끌었을 때의 한 줄 (deck.service noteReorderBlocked).\r\n // 목록 위에 겹쳐 띄운다 — flex 자식으로 흐르면 줄들이 밀려 드래그하던 자리가 움직인다.\r\n .ad-reorder-note {\r\n position: absolute;\r\n left: 8px;\r\n right: 8px;\r\n bottom: 34px;\r\n z-index: 3;\r\n padding: 7px 9px;\r\n border: 1px solid rgba(255, 255, 255, 0.12);\r\n border-radius: 5px;\r\n background: rgba(38, 42, 49, 0.96);\r\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);\r\n color: rgba(255, 255, 255, 0.78);\r\n font-size: 11px;\r\n line-height: 1.45;\r\n // 안내를 누르려는 손짓이 아래 줄의 클릭(탭 선택)으로 가지 않게\r\n pointer-events: none;\r\n }\r\n\r\n // 상/하 도킹 — 세로가 짧다(기본 sidebarHeight 200px). 검색 줄 높이를 줄이고,\r\n // 가로로 흐르는 목록에서 안내 한 줄은 폭을 다 차지하게 한다 (`.ad-group-head` 와 같은 이유)\r\n &.ad-dock-top .ad-search,\r\n &.ad-dock-bottom .ad-search {\r\n padding: 0 8px 4px;\r\n }\r\n\r\n &.ad-dock-top .ad-list .ad-empty,\r\n &.ad-dock-bottom .ad-list .ad-empty {\r\n flex: 0 0 100%;\r\n }\r\n}\r\n\r\n// ---------- 결과물 미리보기 패널 (viewPanel.ts) ----------\r\n// 사이드바와 같은 규칙을 따른다 — 위치·폭은 deck.service 의 relayout 이 인라인으로 준다.\r\n#agentdeck-view {\r\n display: flex;\r\n flex-direction: column;\r\n z-index: 5;\r\n overflow: hidden;\r\n background: var(--ad-panel-bg, var(--bs-body-bg, #1e2127));\r\n font-size: 12px;\r\n -webkit-app-region: no-drag;\r\n\r\n // 터미널과 닿는 쪽에만 경계선\r\n &.ad-view-right { border-left: 1px solid rgba(255, 255, 255, 0.08); }\r\n &.ad-view-left { border-right: 1px solid rgba(255, 255, 255, 0.08); }\r\n\r\n &.ad-view-dropping {\r\n outline: 1px dashed rgba(97, 175, 239, 0.8);\r\n outline-offset: -3px;\r\n }\r\n\r\n .ad-view-head {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 6px;\r\n padding: 8px 8px 6px 12px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\r\n user-select: none;\r\n }\r\n\r\n .ad-view-title {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n color: rgba(255, 255, 255, 0.82);\r\n font-weight: 600;\r\n }\r\n\r\n .ad-view-tools {\r\n display: flex;\r\n flex: 0 0 auto;\r\n gap: 2px;\r\n }\r\n\r\n .ad-view-btn {\r\n min-width: 24px;\r\n padding: 2px 5px;\r\n border: 0;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 12px;\r\n line-height: 1.2;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n }\r\n\r\n // 켜져 있는 도구(편집 중의 ✎) — 지금 어떤 상태인지 버튼만 보고 알 수 있어야 한다\r\n &.ad-view-btn-on {\r\n background: rgba(97, 175, 239, 0.22);\r\n color: #9ecbff;\r\n }\r\n }\r\n\r\n .ad-view-path {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n padding: 6px 8px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\r\n\r\n input {\r\n width: 100%;\r\n padding: 4px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #e6e6e6;\r\n font-family: monospace;\r\n font-size: 11px;\r\n\r\n &:focus {\r\n outline: 0;\r\n border-color: rgba(97, 175, 239, 0.7);\r\n }\r\n }\r\n }\r\n\r\n // 경로 줄 안내 — "없는 파일이다, 한 번 더 Enter" 같은 말이 여기 뜬다\r\n .ad-view-path-note {\r\n width: 100%;\r\n overflow: hidden;\r\n color: rgba(229, 192, 123, 0.9);\r\n font-size: 11px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n\r\n &:empty {\r\n display: none;\r\n }\r\n }\r\n\r\n // 찾기 줄 (Ctrl+F). 경로 줄과 같은 자리·같은 옷을 입힌다 — 둘 다 헤더 아래 한 줄짜리 도구다\r\n .ad-view-find {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 6px 8px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\r\n\r\n input {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n padding: 4px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #e6e6e6;\r\n font-family: monospace;\r\n font-size: 11px;\r\n\r\n &:focus {\r\n outline: 0;\r\n border-color: rgba(97, 175, 239, 0.7);\r\n }\r\n }\r\n }\r\n\r\n .ad-view-find-count {\r\n flex: 0 0 auto;\r\n min-width: 44px;\r\n color: rgba(255, 255, 255, 0.45);\r\n font-size: 11px;\r\n text-align: right;\r\n }\r\n\r\n // 일치 표시. 지금 보고 있는 것 하나만 진하게 — 개수가 많아도 어디에 있는지 눈에 든다\r\n mark.ad-find-hit {\r\n border-radius: 2px;\r\n background: rgba(229, 192, 123, 0.35);\r\n color: inherit;\r\n }\r\n\r\n mark.ad-find-cur {\r\n background: rgba(229, 192, 123, 0.85);\r\n color: #1a1a1a;\r\n }\r\n\r\n // 편집 줄 — 저장/취소는 본문 밖에 둔다 (본문은 갱신마다 다시 그려진다)\r\n .ad-view-editbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding: 5px 8px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.06);\r\n background: rgba(0, 0, 0, 0.18);\r\n }\r\n\r\n .ad-view-edit-note {\r\n overflow: hidden;\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 11px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .ad-view-edit-btns {\r\n display: flex;\r\n flex: 0 0 auto;\r\n gap: 4px;\r\n }\r\n\r\n .ad-view-edit-save,\r\n .ad-view-edit-cancel {\r\n padding: 2px 10px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.75);\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover:not(:disabled) {\r\n border-color: rgba(255, 255, 255, 0.3);\r\n background: rgba(255, 255, 255, 0.08);\r\n color: #fff;\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.35;\r\n cursor: default;\r\n }\r\n }\r\n\r\n .ad-view-edit-save {\r\n border-color: rgba(97, 175, 239, 0.5);\r\n color: #9ecbff;\r\n }\r\n\r\n // 편집기 — 본문 자리를 그대로 채운다. 글꼴·줄간격을 코드 보기와 맞춰야 편집 전후로\r\n // 글자가 튀지 않는다\r\n textarea.ad-view-edit {\r\n display: block;\r\n box-sizing: border-box;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 200px;\r\n padding: 6px 8px;\r\n border: 0;\r\n background: rgba(0, 0, 0, 0.22);\r\n color: #e6e6e6;\r\n font-family: monospace;\r\n font-size: 12px;\r\n line-height: 1.5;\r\n resize: none;\r\n tab-size: 4;\r\n\r\n &:focus {\r\n outline: 0;\r\n }\r\n }\r\n\r\n // 최근 파일 칩 — Codex 앱의 결과물 탭 자리\r\n .ad-view-tabs {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n padding: 6px 8px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\r\n user-select: none;\r\n }\r\n\r\n .ad-view-tab {\r\n max-width: 100%;\r\n overflow: hidden;\r\n padding: 2px 7px;\r\n border: 1px solid rgba(255, 255, 255, 0.1);\r\n border-radius: 10px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.55);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n color: #fff;\r\n border-color: rgba(255, 255, 255, 0.25);\r\n }\r\n\r\n &.ad-view-tab-on {\r\n border-color: rgba(97, 175, 239, 0.6);\r\n background: rgba(97, 175, 239, 0.14);\r\n color: #cfe6ff;\r\n }\r\n }\r\n\r\n .ad-view-body {\r\n flex: 1 1 auto;\r\n overflow: auto;\r\n padding: 10px 12px 16px;\r\n color: rgba(255, 255, 255, 0.85);\r\n // 문서를 읽는 자리라 글자 선택은 열어 둔다 (사이드바는 막아 둔다)\r\n user-select: text;\r\n }\r\n\r\n .ad-view-foot {\r\n flex: 0 0 auto;\r\n overflow: hidden;\r\n padding: 5px 10px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.06);\r\n color: rgba(255, 255, 255, 0.35);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 10px;\r\n }\r\n\r\n // 폭 조절 손잡이 — 터미널과 닿는 쪽 경계선\r\n .ad-view-resize {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: 6px;\r\n cursor: col-resize;\r\n z-index: 6;\r\n }\r\n\r\n &.ad-view-right .ad-view-resize { left: -2px; }\r\n &.ad-view-left .ad-view-resize { right: -2px; }\r\n\r\n .ad-view-empty {\r\n padding: 8px 2px;\r\n color: rgba(255, 255, 255, 0.55);\r\n line-height: 1.7;\r\n\r\n ul { padding-left: 18px; margin: 6px 0 0; }\r\n li { margin: 2px 0; }\r\n }\r\n\r\n .ad-view-dim {\r\n color: rgba(255, 255, 255, 0.35);\r\n font-size: 11px;\r\n }\r\n\r\n // ---------- 종류별 본문 ----------\r\n\r\n .ad-view-image {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: center;\r\n\r\n img {\r\n max-width: 100%;\r\n // 원본보다 키우지 않는다 — 확대하면 스크린샷 글자가 뭉개진다\r\n height: auto;\r\n background: rgba(255, 255, 255, 0.04);\r\n }\r\n }\r\n\r\n .ad-view-code {\r\n display: flex;\r\n gap: 8px;\r\n font-family: monospace;\r\n font-size: 11px;\r\n line-height: 1.5;\r\n\r\n pre {\r\n margin: 0;\r\n white-space: pre;\r\n }\r\n\r\n .ad-view-gutter {\r\n flex: 0 0 auto;\r\n color: rgba(255, 255, 255, 0.25);\r\n text-align: right;\r\n user-select: none;\r\n }\r\n\r\n .ad-view-src {\r\n flex: 1 1 auto;\r\n overflow-x: auto;\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n }\r\n\r\n .ad-view-table {\r\n overflow-x: auto;\r\n\r\n table {\r\n border-collapse: collapse;\r\n font-size: 11px;\r\n }\r\n\r\n th, td {\r\n max-width: 260px;\r\n overflow: hidden;\r\n padding: 3px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.08);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n th {\r\n position: sticky;\r\n top: 0;\r\n background: #262a31;\r\n color: rgba(255, 255, 255, 0.7);\r\n }\r\n\r\n .ad-view-rownum {\r\n color: rgba(255, 255, 255, 0.3);\r\n text-align: right;\r\n }\r\n }\r\n\r\n // ---------- 마크다운 ----------\r\n .ad-view-md {\r\n line-height: 1.65;\r\n word-break: break-word;\r\n\r\n h1, h2, h3, h4, h5, h6 {\r\n margin: 1.1em 0 0.5em;\r\n color: #fff;\r\n line-height: 1.3;\r\n }\r\n h1 { font-size: 18px; }\r\n h2 { font-size: 16px; padding-bottom: 3px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }\r\n h3 { font-size: 14px; }\r\n h4, h5, h6 { font-size: 13px; }\r\n\r\n p { margin: 0.6em 0; }\r\n\r\n a {\r\n color: #61afef;\r\n text-decoration: none;\r\n cursor: pointer;\r\n\r\n &:hover { text-decoration: underline; }\r\n }\r\n\r\n code {\r\n padding: 1px 4px;\r\n border-radius: 3px;\r\n background: rgba(255, 255, 255, 0.08);\r\n font-family: monospace;\r\n font-size: 11px;\r\n }\r\n\r\n pre {\r\n overflow-x: auto;\r\n margin: 0.7em 0;\r\n padding: 8px 10px;\r\n border: 1px solid rgba(255, 255, 255, 0.07);\r\n border-radius: 5px;\r\n background: rgba(0, 0, 0, 0.28);\r\n\r\n code {\r\n padding: 0;\r\n background: transparent;\r\n line-height: 1.5;\r\n }\r\n }\r\n\r\n ul, ol { padding-left: 20px; margin: 0.5em 0; }\r\n li { margin: 0.15em 0; }\r\n\r\n .ad-md-task { list-style: none; margin-left: -14px; }\r\n .ad-md-check { color: rgba(255, 255, 255, 0.6); }\r\n\r\n blockquote {\r\n margin: 0.7em 0;\r\n padding: 2px 0 2px 10px;\r\n border-left: 3px solid rgba(255, 255, 255, 0.18);\r\n color: rgba(255, 255, 255, 0.6);\r\n }\r\n\r\n hr {\r\n margin: 1.2em 0;\r\n border: 0;\r\n border-top: 1px solid rgba(255, 255, 255, 0.12);\r\n }\r\n\r\n table {\r\n display: block;\r\n overflow-x: auto;\r\n border-collapse: collapse;\r\n margin: 0.7em 0;\r\n font-size: 11px;\r\n }\r\n\r\n th, td {\r\n padding: 4px 8px;\r\n border: 1px solid rgba(255, 255, 255, 0.1);\r\n text-align: left;\r\n }\r\n\r\n th { background: rgba(255, 255, 255, 0.05); color: #fff; }\r\n\r\n img {\r\n max-width: 100%;\r\n border-radius: 4px;\r\n }\r\n\r\n .ad-md-noimg {\r\n padding: 1px 5px;\r\n border-radius: 3px;\r\n background: rgba(255, 255, 255, 0.06);\r\n color: rgba(255, 255, 255, 0.45);\r\n font-size: 11px;\r\n }\r\n }\r\n\r\n // ---------- 변경 탭 (파일/변경 스위치 + git diff) ----------\r\n // 최근 파일 칩과 같은 모양을 쓴다 — 같은 자리에서 같은 방식으로 고르는 것이라서.\r\n .ad-view-modes {\r\n display: flex;\r\n flex: 0 0 auto;\r\n gap: 4px;\r\n padding: 6px 8px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\r\n user-select: none;\r\n }\r\n\r\n .ad-view-mode {\r\n flex: 0 0 auto;\r\n padding: 3px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.1);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.55);\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n border-color: rgba(255, 255, 255, 0.25);\r\n color: #fff;\r\n }\r\n\r\n &.ad-view-mode-on {\r\n border-color: rgba(97, 175, 239, 0.6);\r\n background: rgba(97, 175, 239, 0.14);\r\n color: #cfe6ff;\r\n }\r\n }\r\n\r\n // `변경` 목록의 범위 스위치 (세션 / 전체).\r\n // 모드 버튼과 **다른 모양**이어야 한다 — 같은 줄에 있지만 고르는 대상이 다르다\r\n // (모드는 무엇을 보나, 이건 얼마나 보나). 그래서 오른쪽 끝으로 밀고 테두리를 점선으로 둔다\r\n .ad-view-scope {\r\n flex: 0 0 auto;\r\n margin-left: auto;\r\n padding: 3px 10px;\r\n border: 1px dashed rgba(255, 255, 255, 0.18);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.55);\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n border-color: rgba(255, 255, 255, 0.35);\r\n color: #fff;\r\n }\r\n\r\n // \'전체\' = 저장소의 커밋 안 된 전부. 기본(세션)에서 벗어난 상태라는 것이 보여야 한다\r\n &.ad-view-scope-all {\r\n border-style: solid;\r\n border-color: rgba(229, 192, 123, 0.5);\r\n color: #e5c07b;\r\n }\r\n }\r\n\r\n .ad-view-diff {\r\n .ad-plus { color: #98c379; }\r\n .ad-minus { color: #e06c75; }\r\n }\r\n\r\n // `2 files changed +9 -6` 자리\r\n .ad-view-diff-sum {\r\n padding-bottom: 6px;\r\n color: rgba(255, 255, 255, 0.8);\r\n font-weight: 600;\r\n }\r\n\r\n .ad-view-diff-list {\r\n margin-bottom: 10px;\r\n padding-bottom: 6px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n .ad-view-diff-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n width: 100%;\r\n padding: 2px 4px;\r\n border: 0;\r\n border-radius: 3px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.7);\r\n text-align: left;\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover { background: rgba(255, 255, 255, 0.07); }\r\n\r\n .ad-view-diff-st {\r\n flex: 0 0 auto;\r\n min-width: 40px;\r\n color: rgba(255, 255, 255, 0.4);\r\n text-align: center;\r\n font-size: 10px;\r\n }\r\n\r\n .ad-view-diff-st-added { color: #98c379; }\r\n .ad-view-diff-st-deleted { color: #e06c75; }\r\n .ad-view-diff-st-renamed { color: #61afef; }\r\n\r\n .ad-view-diff-name {\r\n flex: 1 1 auto;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n // 경로는 등폭이 읽기 쉽다 — 같은 폴더가 세로로 줄을 맞춘다\r\n font-family: monospace;\r\n }\r\n\r\n .ad-view-diff-num {\r\n flex: 0 0 auto;\r\n\r\n b {\r\n margin-left: 5px;\r\n font-weight: 500;\r\n }\r\n }\r\n }\r\n\r\n .ad-view-diff-sub {\r\n margin: 4px 0;\r\n color: rgba(255, 255, 255, 0.4);\r\n font-size: 11px;\r\n }\r\n\r\n .ad-view-diff-untracked {\r\n margin-bottom: 10px;\r\n padding-bottom: 6px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.08);\r\n\r\n .ad-view-diff-u {\r\n overflow: hidden;\r\n padding: 1px 4px;\r\n color: rgba(255, 255, 255, 0.5);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-family: monospace;\r\n font-size: 11px;\r\n\r\n &[data-ad-open] {\r\n cursor: pointer;\r\n\r\n &:hover { background: rgba(255, 255, 255, 0.07); color: #fff; }\r\n }\r\n }\r\n }\r\n\r\n .ad-view-diff-file {\r\n margin-bottom: 14px;\r\n }\r\n\r\n // 파일명은 스크롤해도 남아 있어야 한다 — 긴 diff 를 내려가다 보면 어느 파일인지 잊는다\r\n .ad-view-diff-fhead {\r\n position: sticky;\r\n top: 0;\r\n z-index: 1;\r\n overflow: hidden;\r\n padding: 4px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.08);\r\n border-radius: 4px 4px 0 0;\r\n background: #262a31;\r\n color: rgba(255, 255, 255, 0.8);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-family: monospace;\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover { color: #fff; }\r\n }\r\n\r\n .ad-view-diff-note {\r\n padding: 4px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.08);\r\n border-top: 0;\r\n color: rgba(255, 255, 255, 0.35);\r\n font-size: 11px;\r\n }\r\n\r\n .ad-view-diff-lines {\r\n overflow-x: auto;\r\n border: 1px solid rgba(255, 255, 255, 0.08);\r\n border-top: 0;\r\n font-family: monospace;\r\n font-size: 11px;\r\n line-height: 1.5;\r\n }\r\n\r\n // 한 줄 = 구 번호 · 신 번호 · 본문. 배경이 줄 전체를 덮어야 추가/삭제가 눈에 띈다\r\n .ad-dl {\r\n display: flex;\r\n // 가로 스크롤 안에서도 배경이 끊기지 않게 (본문이 넘치면 줄이 넓어진다)\r\n min-width: 100%;\r\n min-height: 17px;\r\n white-space: pre;\r\n\r\n .ad-dl-no {\r\n flex: 0 0 auto;\r\n width: 38px;\r\n padding-right: 6px;\r\n color: rgba(255, 255, 255, 0.25);\r\n text-align: right;\r\n user-select: none;\r\n }\r\n\r\n .ad-dl-tx {\r\n flex: 1 0 auto;\r\n padding-right: 8px;\r\n color: rgba(255, 255, 255, 0.8);\r\n }\r\n }\r\n\r\n .ad-dl-add {\r\n background: rgba(152, 195, 121, 0.12);\r\n\r\n .ad-dl-tx { color: #b7d99b; }\r\n }\r\n\r\n .ad-dl-del {\r\n background: rgba(224, 108, 117, 0.12);\r\n\r\n .ad-dl-tx { color: #eda3a9; }\r\n }\r\n\r\n .ad-dl-hunk {\r\n background: rgba(97, 175, 239, 0.1);\r\n\r\n .ad-dl-tx { color: rgba(97, 175, 239, 0.85); }\r\n }\r\n\r\n // ---------- 스테이지 딱지 (파일 목록 / 추적 안 됨 줄) ----------\r\n // 유닛 L 이 넘긴 CSS — 그 유닛은 이 파일을 소유하지 않아 배리어에서 메인이 넣는다.\r\n // 상태 색은 `.ad-view-diff-st-*` 와 같은 팔레트를 쓴다 (같은 줄에서 두 딱지가 싸우지 않게).\r\n .ad-view-stage {\r\n flex: 0 0 auto;\r\n min-width: 44px;\r\n padding: 0 4px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 3px;\r\n color: rgba(255, 255, 255, 0.45);\r\n text-align: center;\r\n font-size: 10px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n border-color: rgba(255, 255, 255, 0.4);\r\n color: #fff;\r\n }\r\n }\r\n\r\n .ad-view-stage-staged {\r\n border-color: rgba(152, 195, 121, 0.5);\r\n background: rgba(152, 195, 121, 0.14);\r\n color: #b7d99b;\r\n }\r\n\r\n .ad-view-stage-both {\r\n border-color: rgba(229, 192, 123, 0.5);\r\n background: rgba(229, 192, 123, 0.12);\r\n color: #e5c07b;\r\n }\r\n\r\n .ad-view-stage-conflict {\r\n border-color: rgba(224, 108, 117, 0.6);\r\n background: rgba(224, 108, 117, 0.14);\r\n color: #eda3a9;\r\n }\r\n\r\n // ---------- `파일:라인` 참조 ----------\r\n // 유닛 U 가 넘긴 CSS — 그 유닛은 이 파일을 소유하지 않아 배리어에서 메인이 넣는다.\r\n //\r\n // 누를 수 있는 줄은 커서와 왼쪽 선으로 알린다. 줄번호 칸은 `user-select: none` 이라\r\n // 거기를 눌러도 글자 선택이 시작되지 않는다 (본문 복사와 싸우지 않게)\r\n .ad-dl[data-ad-ref-line],\r\n .ad-dl[data-ad-ref-del],\r\n .ad-cl[data-ad-ref-line] {\r\n cursor: pointer;\r\n }\r\n\r\n .ad-dl[data-ad-ref-line]:hover,\r\n .ad-cl[data-ad-ref-line]:hover {\r\n box-shadow: inset 2px 0 0 rgba(97, 175, 239, 0.55);\r\n }\r\n\r\n // 고른 줄. 추가/삭제 배경(`.ad-dl-add`/`.ad-dl-del`)을 덮어야 하므로 두 클래스로 특정한다\r\n .ad-dl.ad-ref-sel,\r\n .ad-cl.ad-ref-sel {\r\n box-shadow: inset 2px 0 0 #61afef;\r\n background: rgba(97, 175, 239, 0.22);\r\n\r\n .ad-dl-no,\r\n .ad-cl-no {\r\n color: rgba(255, 255, 255, 0.6);\r\n }\r\n\r\n .ad-dl-tx,\r\n .ad-cl-tx {\r\n color: #fff;\r\n }\r\n }\r\n\r\n // ---------- `파일` 모드 코드 보기: 줄마다 한 칸 ----------\r\n // 원래는 `<pre>` 두 장을 좌우로 놓는 flex 였다. 줄 단위로 그리게 되면서(어느 줄을 눌렀는지\r\n // 알아야 한다) 세로로 쌓아야 하므로 배치만 되돌린다 — 글꼴·크기·줄높이는 그대로 쓴다\r\n .ad-view-code.ad-view-code-rows {\r\n display: block;\r\n overflow-x: auto;\r\n }\r\n\r\n .ad-cl {\r\n display: flex;\r\n // 가로 스크롤 안에서도 강조 배경이 끊기지 않게 (`.ad-dl` 과 같은 사정)\r\n min-width: 100%;\r\n min-height: 17px;\r\n white-space: pre;\r\n\r\n .ad-cl-no {\r\n flex: 0 0 auto;\r\n width: 44px;\r\n padding-right: 8px;\r\n color: rgba(255, 255, 255, 0.25);\r\n text-align: right;\r\n user-select: none;\r\n }\r\n\r\n .ad-cl-tx {\r\n flex: 1 0 auto;\r\n padding-right: 8px;\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n }\r\n\r\n // ---------- 참조 안내줄 (본문 밖 — 자동 갱신에 지워지지 않는 자리) ----------\r\n .ad-view-ref {\r\n flex: 0 0 auto;\r\n overflow: hidden;\r\n padding: 4px 10px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.06);\r\n color: rgba(255, 255, 255, 0.5);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 10px;\r\n }\r\n\r\n // 방금 넣었다 — REF_FLASH_MS(2.5초)만 켜진다\r\n .ad-view-ref-on {\r\n background: rgba(97, 175, 239, 0.14);\r\n color: #cfe6ff;\r\n }\r\n\r\n // ---------- 커밋 줄 (본문 밖 — 자동 갱신에 지워지지 않는 자리) ----------\r\n .ad-view-commit {\r\n flex: 0 0 auto;\r\n padding: 6px 8px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.06);\r\n }\r\n\r\n .ad-view-commit-sum {\r\n margin-bottom: 4px;\r\n color: rgba(255, 255, 255, 0.55);\r\n font-size: 11px;\r\n }\r\n\r\n .ad-view-commit-row {\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n }\r\n\r\n .ad-view-commit-msg {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n padding: 4px 6px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #e6e6e6;\r\n font-family: monospace;\r\n font-size: 11px;\r\n\r\n &:focus {\r\n border-color: rgba(97, 175, 239, 0.6);\r\n outline: 0;\r\n }\r\n }\r\n\r\n .ad-view-commit-go {\r\n flex: 0 0 auto;\r\n padding: 4px 10px;\r\n border: 1px solid rgba(255, 255, 255, 0.14);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.7);\r\n font-size: 11px;\r\n cursor: pointer;\r\n\r\n &:hover:not(:disabled) {\r\n border-color: rgba(255, 255, 255, 0.35);\r\n color: #fff;\r\n }\r\n\r\n // 메시지가 비면 잠긴다 — 잠긴 것이 눈에 보여야 "왜 안 눌리나" 를 묻지 않는다\r\n &:disabled {\r\n opacity: 0.45;\r\n cursor: default;\r\n }\r\n\r\n // 확인 대기: 다음 누름이 실제 커밋이라는 것을 색으로 경고한다\r\n &.ad-view-commit-armed {\r\n border-color: rgba(224, 108, 117, 0.7);\r\n background: rgba(224, 108, 117, 0.18);\r\n color: #ffd7da;\r\n }\r\n }\r\n\r\n .ad-view-commit-note {\r\n margin-top: 4px;\r\n overflow: hidden;\r\n color: rgba(255, 255, 255, 0.4);\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 11px;\r\n }\r\n}\r\n\r\n// 우클릭 상태 메뉴\r\n.ad-menu {\r\n position: fixed;\r\n z-index: 10000;\r\n min-width: 130px;\r\n padding: 4px;\r\n border: 1px solid rgba(255, 255, 255, 0.12);\r\n border-radius: 6px;\r\n background: #262a31;\r\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);\r\n font-size: 12px;\r\n user-select: none;\r\n\r\n .ad-menu-item {\r\n padding: 6px 10px;\r\n border-radius: 4px;\r\n color: rgba(255, 255, 255, 0.75);\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n color: #fff;\r\n }\r\n }\r\n}\r\n\r\n// 도킹 가이드 — 헤더를 끌고 있는 동안만 창 위에 뜬다\r\n.ad-dock-overlay {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9998;\r\n // 커서 판정은 좌표로 직접 하므로 오버레이가 이벤트를 가로채면 안 된다\r\n pointer-events: none;\r\n}\r\n\r\n// 놓으면 사이드바가 자리잡을 영역\r\n.ad-dock-preview {\r\n position: fixed;\r\n display: none;\r\n border: 1px solid rgba(97, 175, 239, 0.9);\r\n background: rgba(97, 175, 239, 0.22);\r\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\r\n transition: left 0.08s ease, top 0.08s ease, width 0.08s ease, height 0.08s ease;\r\n}\r\n\r\n// 네 가장자리에 뜨는 도킹 표적\r\n.ad-dock-zone {\r\n position: fixed;\r\n width: 46px;\r\n height: 46px;\r\n margin: -23px 0 0 -23px;\r\n border: 1px solid rgba(255, 255, 255, 0.35);\r\n border-radius: 6px;\r\n background: rgba(38, 42, 49, 0.92);\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n .ad-dock-mark {\r\n width: 26px;\r\n height: 26px;\r\n border: 1px solid rgba(255, 255, 255, 0.45);\r\n border-radius: 3px;\r\n }\r\n\r\n &.active {\r\n border-color: rgba(97, 175, 239, 0.95);\r\n background: rgba(97, 175, 239, 0.35);\r\n }\r\n\r\n // 표적 안의 작은 사각형이 "어느 쪽 절반에 붙는지" 를 그대로 보여준다\r\n &.ad-dock-zone-left .ad-dock-mark { border-left: 4px solid rgba(97, 175, 239, 0.95); }\r\n &.ad-dock-zone-right .ad-dock-mark { border-right: 4px solid rgba(97, 175, 239, 0.95); }\r\n &.ad-dock-zone-top .ad-dock-mark { border-top: 4px solid rgba(97, 175, 239, 0.95); }\r\n &.ad-dock-zone-bottom .ad-dock-mark { border-bottom: 4px solid rgba(97, 175, 239, 0.95); }\r\n}\r\n\r\n// 놓일 자리를 가리키는 삽입선 — 줄을 끌고 있는 동안만 뜬다 (deck.service drawReorderLine).\r\n// 좌표는 인라인으로 준다(가로 도킹은 세로선, 상/하 도킹은 가로선). `.ad-list` 안이 아니라\r\n// body 에 붙는 이유는 그 함수 주석에 있다 — 목록을 다시 그릴 때 날아가지 않게, 그리고\r\n// 회귀 프로브가 목록의 자식만 훑어 그룹을 읽으므로 낯선 노드를 끼워 넣지 않게.\r\n.ad-reorder-line {\r\n position: fixed;\r\n z-index: 9997;\r\n border-radius: 1px;\r\n background: rgba(97, 175, 239, 0.95);\r\n box-shadow: 0 0 5px rgba(97, 175, 239, 0.6);\r\n // 좌표 판정은 elementFromPoint 로 한다 — 선이 이벤트를 가로채면 자기 자신을 짚는다\r\n pointer-events: none;\r\n}\r\n\r\n// 줄을 끄는 동안 — 커서를 옮기기 모양으로 두고, 커서가 터미널 위로 넘어가도 모양이 유지되게\r\nbody.ad-reordering {\r\n cursor: grabbing;\r\n\r\n // 줄 자신은 `cursor: pointer`(클릭=탭 선택)라 body 것으로는 덮이지 않는다.\r\n // 끌고 있는 동안만 사이드바 안쪽을 통째로 덮어써 손 모양이 도중에 바뀌지 않게 한다.\r\n #agentdeck-sidebar,\r\n #agentdeck-sidebar * {\r\n cursor: grabbing !important;\r\n }\r\n\r\n .content.main {\r\n pointer-events: none;\r\n }\r\n}\r\n\r\n// 경계선을 끄는 동안에는 터미널이 커서를 뺏지 않게 한다\r\nbody.ad-resizing {\r\n cursor: inherit;\r\n\r\n .content.main {\r\n pointer-events: none;\r\n }\r\n}\r\n\r\n// AgentDeck 이 켜져 있을 때만 순정 탭바를 감춘다 (사이드바가 그 역할을 대신함)\r\nbody.agentdeck-active {\r\n .content.main > .tab-bar {\r\n display: none !important;\r\n }\r\n\r\n .window {\r\n display: flex;\r\n flex-direction: row;\r\n // 사이드바를 창 안에 절대 배치하므로 기준점이 필요하다\r\n position: relative;\r\n // 터미널 옆에 남는 여백이 밝은 기본 배경으로 튀지 않게 한다\r\n // (--ad-panel-bg 가 있으면 배경 이미지가 이 여백으로도 비친다)\r\n background: var(--ad-panel-bg, var(--bs-body-bg, #1e2127));\r\n }\r\n}\r\n\r\n// ---------- 드롭 확인 배너 (터미널 위에 파일을 끌어다 놓았을 때) ----------\r\n// OS 모달이 아니라 인라인 카드다 — 모달은 터미널 흐름을 끊고 CDP 로 검증할 수 없다.\r\n// 화면 오른쪽 아래에 띄운다: 입력창(아래 중앙)과 사이드바(좌/우 가장자리)를 둘 다 피하려면\r\n// 그 모서리가 가장 덜 겹친다. `z-index` 는 사이드바(#agentdeck-sidebar)보다 위여야 한다.\r\n.ad-drop-ask {\r\n position: fixed;\r\n right: 16px;\r\n bottom: 16px;\r\n z-index: 10000;\r\n min-width: 260px;\r\n max-width: 420px;\r\n padding: 10px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.16);\r\n border-radius: 6px;\r\n background: rgba(24, 26, 30, 0.97);\r\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.45);\r\n color: #e6e6e6;\r\n font-size: 12px;\r\n\r\n .ad-drop-ask-msg {\r\n overflow: hidden;\r\n margin-bottom: 8px;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-weight: 600;\r\n }\r\n\r\n .ad-drop-ask-row {\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n }\r\n\r\n button {\r\n flex: 1 1 auto;\r\n padding: 5px 8px;\r\n border: 1px solid rgba(255, 255, 255, 0.16);\r\n border-radius: 4px;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.85);\r\n font-size: 12px;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n border-color: rgba(97, 175, 239, 0.6);\r\n background: rgba(97, 175, 239, 0.14);\r\n color: #fff;\r\n }\r\n }\r\n\r\n // 닫기는 강조하지 않는다 — 기본 선택이 아니다\r\n .ad-drop-ask-close {\r\n flex: 0 0 auto;\r\n min-width: 26px;\r\n padding: 5px 6px;\r\n color: rgba(255, 255, 255, 0.45);\r\n }\r\n\r\n .ad-drop-ask-again {\r\n display: flex;\r\n gap: 5px;\r\n align-items: center;\r\n margin-top: 8px;\r\n margin-bottom: 0;\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 11px;\r\n cursor: pointer;\r\n }\r\n}\r\n'],sourceRoot:""}]);const a=s;n.d(t,["A",0,a])},6314(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n="",i=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),i&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),i&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,i,r,o){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(i)for(var a=0;a<this.length;a++){var d=this[a][0];null!=d&&(s[d]=!0)}for(var l=0;l<e.length;l++){var c=[].concat(e[l]);i&&s[c[0]]||(void 0!==o&&(void 0===c[5]||(c[1]="@layer".concat(c[5].length>0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),n&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=n):c[2]=n),r&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=r):c[4]="".concat(r)),t.push(c))}},t}},1354(e){e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var i=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(i),o="/*# ".concat(r," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},3396(e,t,n){var i=n.cw(function(e,t){var n=[];function i(e){for(var t=-1,i=0;i<n.length;i++)if(n[i].identifier===e){t=i;break}return t}function r(e,t){for(var r={},s=[],a=0;a<e.length;a++){var d=e[a],l=t.base?d[0]+t.base:d[0],c=r[l]||0,u="".concat(l," ").concat(c);r[l]=c+1;var A=i(u),p={css:d[1],media:d[2],sourceMap:d[3],supports:d[4],layer:d[5]};if(-1!==A)n[A].references++,n[A].updater(p);else{var h=o(p,t);t.byIndex=a,n.splice(a,0,{identifier:u,updater:h,references:1})}s.push(u)}return s}function o(e,t){var n=t.domAPI(t);return n.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;n.update(e=t)}else n.remove()}}e.exports=function(e,t){var o=r(e=e||[],t=t||{});return function(e){e=e||[];for(var s=0;s<o.length;s++){var a=i(o[s]);n[a].references--}for(var d=r(e,t),l=0;l<o.length;l++){var c=i(o[l]);0===n[c].references&&(n[c].updater(),n.splice(c,1))}o=d}}}),r=n.cw(function(e,t){var n={};e.exports=function(e,t){var i=function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}(e);if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(t)}}),o=n.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=n.cw(function(e,t){e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}}),a=n.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(n){!function(e,t,n){var i="";n.supports&&(i+="@supports (".concat(n.supports,") {")),n.media&&(i+="@media ".concat(n.media," {"));var r=void 0!==n.layer;r&&(i+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),i+=n.css,r&&(i+="}"),n.media&&(i+="}"),n.supports&&(i+="}");var o=n.sourceMap;o&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(i,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}}),d=n.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))}}});i(),a(),r(),s(),o(),d();var l=n(6100),c={};c.styleTagTransform=function e(){return e.c||(e.c=n.n(d()))}()(),c.setAttributes=function e(){return e.c||(e.c=n.n(s()))}()(),c.insert=function e(){return e.c||(e.c=n.n(r()))}()().bind(null,"head"),c.domAPI=function e(){return e.c||(e.c=n.n(a()))}()(),c.insertStyleElement=function e(){return e.c||(e.c=n.n(o()))}()(),function e(){return e.c||(e.c=n.n(i()))}()()(l.A,c),l.A&&l.A.locals&&l.A.locals},3532(e,t){t.identifyAgent=t.detectProfileFor=t.profileFor=t.unionProfile=t.d=t.AGENT_PROFILES=void 0;const n=/\(y\/n\)/i,i=/\[y\/N\]/i,r=/Press Enter to continue/i,o=/ctrl\+c to (?:interrupt|cancel|stop)/i,s=[">","❯","›","❭","➜"],a={id:"claude",label:"Claude Code",processHints:["claude"],titleHints:["claude"],waitingPatterns:[/Do you want to\b/i,/❯\s*1\.\s*Yes/,n,i,r],busyPatterns:[/esc to interrupt/i,o,/\btokens?\b.{0,20}\besc\b/i],limitedPatterns:[],busyTitleMarks:["✳","✻","✽","✶","✢","◐","◓","◑","◒"],imagePasteKey:"alt-v",promptHeads:["❯",">"],patternsProven:!0},d={id:"codex",label:"Codex CLI",processHints:["codex"],titleHints:["codex"],waitingPatterns:[n,i,r],busyPatterns:[o],limitedPatterns:[/usage limit reached/i,/reached your usage limit/i],busyTitleMarks:[],imagePasteKey:"ctrl-v",promptHeads:s,patternsProven:!1},l={id:"gemini",label:"Gemini CLI",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=[a,d,l];const c=["codex","gemini","claude"];function u(e){const t=new Set,n=[];for(const i of e){const e=`${i.source}\0${i.flags}`;t.has(e)||(t.add(e),n.push(i))}return n}function A(e){return[...new Set(e)]}function p(e){var n;return null!==(n=t.AGENT_PROFILES.find(t=>t.id===e))&&void 0!==n?n:t.d}t.d={id:"unknown",label:"알 수 없음",processHints:A(t.AGENT_PROFILES.flatMap(e=>e.processHints)),titleHints:A(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:A(t.AGENT_PROFILES.flatMap(e=>e.busyTitleMarks)),imagePasteKey:"config",promptHeads:A([...s,...t.AGENT_PROFILES.flatMap(e=>e.promptHeads)]),patternsProven:!0},t.unionProfile=function(){return t.d},t.profileFor=p,t.detectProfileFor=function(e){const n=p(e);if(n.patternsProven)return n;const i=t.d;return{...n,waitingPatterns:i.waitingPatterns,busyPatterns:i.busyPatterns,limitedPatterns:i.limitedPatterns,busyTitleMarks:i.busyTitleMarks,promptShape:void 0,screenShape:void 0}},t.identifyAgent=function(e,t){const n=(null!=e?e:"").toLowerCase();for(const e of c)if(p(e).processHints.some(e=>n.includes(e)))return e;const i=(null!=t?t:"").toLowerCase();for(const e of c)if(p(e).titleHints.some(e=>i.includes(e)))return e;return"unknown"}},4883(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},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.AgentDeckAlertService=void 0;const o=n(860),s=n(7650),a=n(6021),d=n(4300),l=n(7797),c=["waiting","error","limited"];let u=class{constructor(e,t,n,i){this.app=e,this.config=t,this.zone=n,this.status=i,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 n of this.app.tabs){const i=this.status.get(n).status,r=this.last.get(n);this.last.set(n,i),c.includes(i)&&(t++,r!==i&&e.push(n))}if(this.updateBadge(t),0===e.length)return;this.debug.transitions+=e.length;const n=this.isFocused();if(this.debug.lastFocused=n,!n&&(this.diag(`alert enter=${e.length} count=${t} focused=${n}`),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,n,i;try{const r=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(i=null===(n=null===(t=null==r?void 0:r("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===n?void 0:n.call(t))&&void 0!==i?i:null}catch{return null}}nativeImage(){var e,t,n;try{const i=null!==(e=window.require)&&void 0!==e?e:globalThis.require;return null!==(n=null===(t=null==i?void 0:i("electron"))||void 0===t?void 0:t.nativeImage)&&void 0!==n?n: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 n=this.config.store.agentDeck.alertBadge?e:0;if(n!==this.badgeShown)try{const e=this.win();if(!(null==e?void 0:e.setOverlayIcon))return;if(0===n)return e.setOverlayIcon(null,""),this.badgeShown=0,void this.stopFlash();const t=this.badgeImage(n);if(!t)return;e.setOverlayIcon(t,`승인대기/오류 ${n}개`),this.badgeShown=n,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 n=this.app.tabs.some(e=>"error"===this.status.get(e).status)?d.STATUS_STYLES.error.color:d.STATUS_STYLES.waiting.color,i=`${e}:${n}`,r=this.badgeCache.get(i);if(r)return r;const o=this.nativeImage();if(!o)return null;const s=e>9?"9+":String(e);let a;try{if(a=o.createEmpty(),a.addRepresentation({scaleFactor:1,width:16,height:16,dataURL:this.drawBadge(16,s,n)}),a.addRepresentation({scaleFactor:2,width:32,height:32,dataURL:this.drawBadge(32,s,n)}),null===(t=a.isEmpty)||void 0===t?void 0:t.call(a))throw new Error("empty after addRepresentation")}catch{a=o.createFromDataURL(this.drawBadge(32,s,n))}return this.badgeCache.set(i,a),a}drawBadge(e,t,n){const i=document.createElement("canvas");i.width=e,i.height=e;const r=i.getContext("2d");if(!r)throw new Error("canvas 2d 미지원");const o=e/2;return r.clearRect(0,0,e,e),r.beginPath(),r.arc(o,o,o-.5,0,2*Math.PI),r.fillStyle=n,r.fill(),r.lineWidth=Math.max(1,e/16),r.strokeStyle="rgba(255,255,255,0.85)",r.stroke(),r.fillStyle="#ffffff",r.font=`bold ${Math.round(e*(t.length>1?.55:.7))}px "Segoe UI", sans-serif`,r.textAlign="center",r.textBaseline="middle",r.fillText(t,o,o+.04*e),i.toDataURL("image/png")}toast(e){var t;try{if("undefined"==typeof Notification)return;const t=this.status.get(e),n=t.label||e.title||"(제목 없음)",i=d.STATUS_STYLES[t.status],r=new Notification("AgentDeck",{body:`${n} — ${i.label}`,tag:`agentdeck-${this.tabKey(e)}`});this.debug.toasts++,r.onclick=()=>{var t,n;try{const e=this.win();null===(t=null==e?void 0:e.show)||void 0===t||t.call(e),null===(n=null==e?void 0:e.focus)||void 0===n||n.call(e)}catch{}this.zone.run(()=>{this.app.tabs.includes(e)&&this.app.selectTab(e)}),r.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=i([(0,o.Injectable)({providedIn:"root"}),r("design:paramtypes",[s.AppService,s.ConfigService,o.NgZone,a.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 n=(null!=e?e:[]).filter(e=>Number.isInteger(e)&&e>0);let i=!1;for(const e of t.values())if(e.length){i=!0;break}if(!n.length||!i)return{tab:null,mode:"legacy"};const r=new Set(n);for(const[e,n]of t)if(n.some(e=>r.has(e)))return{tab:e,mode:"pid"};return{tab:null,mode:"pid-miss"}}},1786(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(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=o(n(9896)),a=o(n(857)),d=o(n(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(a.homedir(),".claude","settings.json")}function A(){return d.join(__dirname,"..","hooks","agentdeck-notify.ps1")}function p(){try{const e=s.readFileSync(u(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function h(e){return(Array.isArray(e)?e:[]).filter(e=>!JSON.stringify(null!=e?e:"").includes(l))}function g(e){var t;const n=null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{};return c.every(e=>(Array.isArray(n[e.event])?n[e.event]:[]).some(e=>JSON.stringify(null!=e?e:"").includes(l)))}function f(e,t){var n;const i={...null!=e?e:{}};i.hooks={...null!==(n=i.hooks)&&void 0!==n?n:{}};for(const e of c){const n=`powershell -NoProfile -ExecutionPolicy Bypass -File "${t}" ${e.args}`;i.hooks[e.event]=[...h(i.hooks[e.event]),{matcher:"*",hooks:[{type:"command",command:n,timeout:5}]}]}return i}function v(e){const t={...null!=e?e:{}};if(!t.hooks)return t;t.hooks={...t.hooks};for(const e of c){const n=h(t.hooks[e.event]);n.length?t.hooks[e.event]=n: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=A,t.hooksSupported=function(){return"win32"===process.platform&&s.existsSync(A())},t.isMerged=g,t.mergeHooks=f,t.stripHooks=v,t.hooksInstalled=function(){return g(p())},t.installHooks=function(){const e=A();if(!s.existsSync(e))throw new Error(`훅 스크립트를 찾지 못했다: ${e}`);b(f(p(),e))},t.uninstallHooks=function(){b(v(p()))}},2627(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.setCodexHooks=t.codexHooksInstalled=t.mergeCodexHooks=t.stripCodexHooks=t.codexHooksPath=t.CODEX_EVENTS=void 0;const s=o(n(9896)),a=o(n(857)),d=o(n(6928)),l="agentdeck-codex-notify.ps1";function c(){return d.join(process.env.CODEX_HOME||d.join(a.homedir(),".codex"),"hooks.json")}function u(e){return"string"==typeof(null==e?void 0:e.command)&&e.command.includes(l)}function A(e){var t;const n={...null!==(t=null==e?void 0:e.hooks)&&void 0!==t?t:{}};for(const e of Object.keys(n)){if(!Array.isArray(n[e]))throw new Error(`Invalid hooks.${e}: expected an array`);n[e]=n[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=>!u(e))}}).filter(e=>e.hooks.length),n[e].length||delete n[e]}return{...e,hooks:n}}function p(e,n){var i;const r=A(e),o=`powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${n}"`;for(const e of t.CODEX_EVENTS)r.hooks[e]=[...null!==(i=r.hooks[e])&&void 0!==i?i:[],{hooks:[{type:"command",command:o,timeout:3}]}];return r}function h(){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.stripCodexHooks=A,t.mergeCodexHooks=p,t.codexHooksInstalled=function(){const e=h();return t.CODEX_EVENTS.every(t=>{var n,i;return null===(i=null===(n=e.hooks)||void 0===n?void 0:n[t])||void 0===i?void 0:i.some(e=>{var t;return null===(t=e.hooks)||void 0===t?void 0:t.some(u)})})},t.setCodexHooks=function(e){const t=c(),n=d.join(__dirname,"..","hooks",l);if(e&&!s.existsSync(n))throw new Error(`Missing hook: ${n}`);const i=h(),r=e?p(i,n):A(i);s.mkdirSync(d.dirname(t),{recursive:!0}),s.existsSync(t)&&s.copyFileSync(t,`${t}.agentdeck-backup-${Date.now()}`),s.writeFileSync(t,JSON.stringify(r,null,2)+"\n","utf8")}},160(e,t){function n(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,i){const r=null==e?void 0:e.xterm,o=null==r?void 0:r.element;if(!o||e.__adCodexWheel)return;e.__adCodexWheel=!0;let s=!1,a=0;const d=()=>{const e=r.buffer.active;return Array.from({length:r.rows},(t,n)=>{var i,r;return null!==(r=null===(i=e.getLine(e.baseY+n))||void 0===i?void 0:i.translateToString(!0))&&void 0!==r?r:""})},l=e=>{e&&i((e<0?"":"").repeat(Math.min(12,Math.abs(e))))};o.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 o=d(),c=n(o),u=r.buffer.active,A=o.reduce((e,t,n)=>t.trim()?n+1:e,0),p=o.slice(Math.max(0,A-4),A).some(e=>/Context \d+% left/.test(e));if(!c&&!s&&("normal"!==u.type||u.baseY>0||!p||e.deltaY>0))return;e.preventDefault(),e.stopImmediatePropagation();const h=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(h);if(a=Math.max(-12,Math.min(12,a+h)),s)return;s=!0,i("");let g=0;const f=()=>{if(!t()||++g>20)return s=!1,void(a=0);n(d())?(s=!1,l(a),a=0):setTimeout(f,50)};setTimeout(f,50)},{capture:!0,passive:!1})}},7028(e,t,n){t.AgentDeckConfigProvider=t.LAYOUT_DEFAULTS=void 0;const i=n(7650);t.LAYOUT_DEFAULTS={sidebarDock:"right",sidebarWidth:0,sidebarHeight:200,viewerDock:"right",viewerWidth:420};class r extends i.ConfigProvider{constructor(){super(...arguments),this.defaults={agentDeck:{enabled:!0,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,autoUpdate:!0,updateCheckIntervalHours:6,lastUpdateCheck:0,updateRegistry:"https://registry.npmjs.org",idleAfterMs:2500,autoDetect:!0,showElapsed:!0,subagentCount:!0,sortByStatus:!1,searchBox:!0,keyboardNav:!0,keyboardNavWrap:!1,keyboardCloseTab:!0,dragAutoScroll:!0,collapsedGroups:[],resumeList:!0,resumeListLimit:5,resumeListDays:7,resumeExpanded:[],resumeHidden:[],keepRenderingWhenHidden:!0,enterAsLabel:!0,claimCtrlV:!0,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,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-Shift-L"]}}}}t.AgentDeckConfigProvider=r},5140(e,t,n){t.installCursorVisibilityFix=void 0;const i=n(673);class r{constructor(){this.pending="",this.corrections=0}write(e,t){let n=this.pending+e;if(this.pending="",!t)return n;for(let e=4;e>0;e--)if(n.endsWith("[25".slice(0,e))){this.pending=n.slice(-e),n=n.slice(0,-e);break}return n.replace(/\x1b\[25([lh])/g,(e,t)=>(this.corrections++,`[?25${t}`))}}t.installCursorVisibilityFix=function(e,t,n){if(!e||"function"!=typeof e.write||e.__adCursorVisibilityFix)return;const o=e.write.bind(e),s=new r,a=new i.SynchronizedOutputStream;let d;e.__adCursorVisibilityFix=!0,e.write=e=>{const i=s.corrections,r=t(e),l=a.write(s.write(e,r),r);return d&&(clearTimeout(d),d=void 0),a.waiting&&(d=setTimeout(()=>{d=void 0;const e=a.flush();e&&Promise.resolve(o(e)).catch(()=>{})},200)),!i&&s.corrections&&n(),l?o(l):Promise.resolve()}}},4494(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t},a=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.AgentDeckService=t.matchesSearchTokens=t.searchTokens=t.foldSearchText=void 0;const d=s(n(9896)),l=n(860),c=n(568),u=n(5140),A=n(5633),p=n(160),h=n(7650),g=n(3700),f=n(6021),v=n(7110),b=n(1385),m=n(3532),C=n(4300),w=n(9660),y=n(9306),x=n(1481),k=n(7617),S=n(7144),E=n(6879),I=n(4086),P=n(9137),D=n(1424),T=n(2425),B=n(3097),O=n(7604),R=n(7797),M="agentdeck-sidebar",$="ad-bg-clip",L=320,_=[150,400,900,1800,3e3],F=[250,800,1800];let z;function j(e){const t="number"==typeof e&&isFinite(e)?e:100;return Math.min(100,Math.max(0,Math.round(t)))}function N(e){if("string"!=typeof e||!e)return"";let t=e;try{t=t.normalize("NFC")}catch{}return t.toLowerCase().replace(/\\/g,"/")}function H(e){return N(e).split(/\s+/).filter(e=>e.length>0)}function q(e,t){if(!t.length)return!0;const n=[];for(const t of e){const e=N(t);e&&n.push(e)}return t.every(e=>n.some(t=>t.includes(e)))}t.foldSearchText=N,t.searchTokens=H,t.matchesSearchTokens=q;let W=class{constructor(e,t,n,i,r,o,s,a,d,l){this.app=e,this.config=t,this.status=n,this.hotkeys=i,this.profiles=r,this.hostWindow=o,this.platform=s,this.notify=a,this.ledger=d,this.zone=l,this.sidebar=null,this.listEl=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.lastTermW=-1,this.lastSidebarW=-1,this.lastDock=null,this.dock=null,this.refitQueued=!1,this.view=null,this.lastViewW=-1,this.lastViewSide=null,this.cwdCache=new WeakMap,this.resumeTabs=new Map,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}init(){this.app.ready$.subscribe(()=>this.zone.runOutsideAngular(()=>{var e,t,n,i,r;(0,R.startDiagSession)({tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(i=(n=this.platform).getOSRelease)||void 0===i?void 0:i.call(n),config:this.diagConfig()}),(0,R.installErrorCapture)(),this.ledger.onChange=()=>this.scheduleRender();try{this.setup()}catch(e){throw this.diag(`setup ERROR ${null!==(r=null==e?void 0:e.message)&&void 0!==r?r:e}`),e}}))}diagOnce(e,t){(0,R.diagOnce)(e,t)}diag(e){(0,R.diag)(e)}diagConfig(){return(0,R.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.migrateFollowConfig(),this.buildSidebar(),this.buildView(),this.applyEnabled(),this.applyOpacity(),this.disableBackgroundThrottling(),this.ensurePasteHotkey(),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.scheduleRender()});for(const e of this.app.tabs)this.watchTab(e);this.status.changed$.subscribe(()=>this.scheduleRender()),this.config.changed$.subscribe(()=>{var e;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,n;"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&&this.repair("all"),"agentdeck-view"===e&&(null===(t=this.view)||void 0===t||t.toggle()),"agentdeck-focus-list"===e&&this.toggleKeyboardNav(),"agentdeck-view-mode"===e&&(null===(n=this.view)||void 0===n||n.toggleMode())}),setInterval(()=>this.tick(),1e3),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,n="before")=>{const i=[...this.app.tabs],r=i[e],o=i[t];if(!r||!o)return{ok:!1,reason:"없는 탭 인덱스",order:i.map((e,t)=>t)};if("before"!==n&&"after"!==n)return{ok:!1,reason:`place 가 before/after 가 아니다: ${String(n)}`,order:i.map((e,t)=>t)};if(this.config.store.agentDeck.sortByStatus)return{ok:!1,reason:"상태순 정렬이 켜져 있어 순서를 바꿀 수 없다",order:i.map((e,t)=>t)};const s=this.applyReorder(r,o,n);return this.render(),{ok:s,order:this.app.tabs.map(e=>i.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,n;"list"===e&&this.focusList("keep"),"search"===e&&this.focusSearch(),"off"===e&&this.releaseKeyboard();const i=this.app.tabs,{rows:r,index:o}=this.navPlan(),s=e=>"head"===e.kind?{kind:"head",key:e.key,tabIndex:-1}:{kind:"tab",key:null,tabIndex:i.indexOf(e.tab)},a=document.activeElement,d=null===(t=this.listEl)||void 0===t?void 0:t.querySelector(".ad-nav-focus");return{mode:this.navMode,index:o,count:r.length,focused:this.navFocus?s(this.navFocus):null,rows:r.map(s),activeTabIndex:this.app.activeTab?i.indexOf(this.app.activeTab):-1,ring:d?{tab:d.classList.contains("ad-tab"),adIndex:null!==(n=d.dataset.adIndex)&&void 0!==n?n:null}:null,owner:a===this.listEl?"list":a===this.searchEl?"search":(null==a?void 0:a.className)||"other",searchVisible:this.navSearchVisible(),wrap:!!this.config.store.agentDeck.keyboardNavWrap,enabled:!1!==this.config.store.agentDeck.keyboardNav}},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(),n=t=>t.tabs.map(t=>e.indexOf(t));return{cwdCache:e.map((e,t)=>{var n,i,r,o,s,a,d;return{index:t,title:String(null!==(n=e.title)&&void 0!==n?n:"").slice(0,40),dir:null!==(r=null===(i=this.cwdCache.get(e))||void 0===i?void 0:i.dir)&&void 0!==r?r:null,at:null!==(s=null===(o=this.cwdCache.get(e))||void 0===o?void 0:o.at)&&void 0!==s?s:null,projectRoot:(0,I.projectRootOf)(null!==(d=null===(a=this.cwdCache.get(e))||void 0===a?void 0:a.dir)&&void 0!==d?d:null)}}),projectRoots:(0,I.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:n(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:n(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,E.foldGroupKey)(e)}},sessions:()=>{const e=this.config.store.agentDeck,t=this.renderPlan(),n=this.liveSessionIds(),i=this.ledger.records();return{ledger:this.ledger.snapshot(),records:i.map(e=>({...e})),live:[...n.keys()],enabled:!1!==e.resumeList,byGroup:t.plan.map(t=>({key:t.key,label:t.label,expanded:this.isResumeExpanded(t.key),rows:(0,T.resumeRowsFor)(i,{groupKeys:this.resumeKeysOf(t),keyOf:e=>(0,E.groupKeyOf)(e,I.projectRootOf),fold:E.foldGroupKey,live:n,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,n;return{id:e.id,label:e.label,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!==(n=e.screenShape)&&void 0!==n?n:null,patternsProven:e.patternsProven}};return{list:m.AGENT_PROFILES.map(e),union:e((0,m.unionProfile)()),effective:m.AGENT_PROFILES.map(t=>e((0,m.detectProfileFor)(t.id))),identify:(e,t)=>(0,m.identifyAgent)(e,t),fallback:m.AGENT_PROFILES.map(e=>{const t=(0,m.detectProfileFor)(e.id),n=(0,m.unionProfile)();return{id:e.id,patternsProven:e.patternsProven,usesUnionPatterns:t.waitingPatterns===n.waitingPatterns&&t.busyPatterns===n.busyPatterns&&t.busyTitleMarks===n.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 n=null!=e?e:this.focusedPane(),i=n?this.readScreen(n):null;return i?{...(0,y.judgeScreen)(i.lines,i.cols,null===(t=this.profileForPane(n))||void 0===t?void 0:t.screenShape),cols:i.cols}:null},agentOf:e=>{var t,n,i,r,o;const s=null!=e?e:this.app.activeTab,a=s?this.firstPane(s):void 0,d=a?this.paneAgents.get(a):void 0;return s?{id:null!==(t=this.tabAgents.get(s))&&void 0!==t?t:null,effectiveId:a&&null!==(i=null===(n=this.profileForPane(a))||void 0===n?void 0:n.id)&&void 0!==i?i:"unknown",streamId:(null==d?void 0:d.session)===(null==a?void 0:a.session)&&null!==(r=null==d?void 0:d.tracker.id)&&void 0!==r?r:null,probedAt:null!==(o=this.agentProbedAt.get(s))&&void 0!==o?o:0}:null},probeAgent:e=>{const t=null!=e?e:this.app.activeTab;t&&(this.agentProbedAt.delete(t),this.probeAgent(t,"manual"))},kickLog:(0,R.diagMemory)(),diagPaths:()=>({diag:R.DIAG_PATH,prev:R.DIAG_PREV_PATH,screen:R.SCREEN_PATH}),collectDiag:(e=!1)=>{var t,n,i,r;return(0,R.collectDiagBundle)({includeScreen:e,stamp:{tabby:null===(n=(t=this.platform).getAppVersion)||void 0===n?void 0:n.call(t),osRelease:null===(r=(i=this.platform).getOSRelease)||void 0===r?void 0:r.call(i),config:(0,R.configStamp)(this.config.store)}})}})}repair(e="all"){const t="active"===e&&this.app.activeTab?[this.app.activeTab]:this.app.tabs;this.diag(`repair scope=${e} tabs=${t.length}`),this.relayout(),requestAnimationFrame(()=>requestAnimationFrame(()=>{for(const e of t){const t=e,n="function"==typeof t.getAllTabs?t.getAllTabs():[e];for(const e of n)this.repairPane(e)}}))}repairPane(e){var t,n,i,r,o,s,a;const d=this.config.store.agentDeck,l=e.frontend,c=null==l?void 0:l.xterm,u=null===(t=null==c?void 0:c.element)||void 0===t?void 0:t.parentElement;if(!(null==u?void 0:u.clientWidth)||!(null==u?void 0:u.clientHeight))return;const A=this.readScreen(e),p=A?(0,y.judgeScreen)(A.lines,A.cols,null===(n=this.profileForPane(e))||void 0===n?void 0:n.screenShape):null;this.snapshot(e,`manual-before ${p?p.broken?p.reasons.join(" / "):"판정=정상":"읽을 수 없음"}`);try{null===(r=null===(i=null==l?void 0:l.fitAddon)||void 0===i?void 0:i.fit)||void 0===r||r.call(i)}catch{}if(this.syncPtySize(e,l),A&&this.clearInputArea(e,A),!0===d.repairHard)try{null===(o=null==c?void 0:c.reset)||void 0===o||o.call(c)}catch{}try{null===(s=null==c?void 0:c.refresh)||void 0===s||s.call(c,0,(null!==(a=c.rows)&&void 0!==a?a:1)-1)}catch{}this.nudgePtyRedraw(e),!0===d.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const n=this.readScreen(e),i=n?(0,y.judgeScreen)(n.lines,n.cols,null===(t=this.profileForPane(e))||void 0===t?void 0:t.screenShape):null;this.snapshot(e,"manual-after "+(i?i.broken?"아직 깨짐: "+i.reasons.join(" / "):"복구됨":"읽을 수 없음"))},1500)}sendRedrawKey(e){var t;const n=e;"function"==typeof n.sendInput&&(null===(t=n.session)||void 0===t?void 0:t.open)&&(this.diag("repair redraw-key ctrl-l"),this.sendToPane(n,"redraw-key",()=>n.sendInput("\f")))}clearInputArea(e,t){var n,i,r;if(!(0,c.canRepairComposer)(null===(n=this.profileForPane(e))||void 0===n?void 0:n.id))return!1;const o=null===(i=e.frontend)||void 0===i?void 0:i.xterm;if(!o||"function"!=typeof o.write)return!1;const s=t.lines,a=null===(r=this.profileForPane(e))||void 0===r?void 0:r.screenShape,d=Math.max(0,s.length-y.INPUT_TAIL),l=e=>(0,y.isRuleRow)(s[e].text,a)||(0,y.isGhostRuleRow)(s[e].text,t.cols,a);let u=-1;for(let e=s.length-1;e>=d;e--)if(l(e)){u=e;break}if(u<0)return!1;let A=u;for(let e=u-1;e>=Math.max(d,u-12);e--)l(e)&&(A=e);const p=A+1;this.diag(`clear input area row=${p}/${s.length}`);try{o.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,n,i,r,o,s,a,d,l,u,A,p,h,g,f;if(!(0,c.canRepairComposer)(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id))return;const v=this.config.store.agentDeck,b=this.readScreen(e);if(!b)return;const m=(0,y.judgeScreen)(b.lines,b.cols,null===(n=this.profileForPane(e))||void 0===n?void 0:n.screenShape),C=this.screenObs.get(e),w=m.reasons.join(" / "),x=m.broken?((null==C?void 0:C.broken)&&null!==(i=C.streak)&&void 0!==i?i:0)+1:0,k=!C||C.broken!==m.broken||C.reason!==w;if(this.screenObs.set(e,{broken:m.broken,reason:w,streak:x}),k&&(m.broken?this.snapshot(e,`detect 깨짐 ${w}`):(null==C?void 0:C.broken)&&this.snapshot(e,"detect 스스로 복구됨")),!m.broken)return void this.refillAutoRepairBudget(e);if(this.autoRepairHealthySince.delete(e),!v.autoRepairScreen)return;if(x<(null!==(r=v.autoRepairMinStreak)&&void 0!==r?r:2))return;const S=e,E=Date.now(),I=null!==(o=this.autoRepairAt.get(e))&&void 0!==o?o:0,P=null!==(s=this.autoRepairCount.get(e))&&void 0!==s?s:0,D=null!==(a=v.autoRepairMaxPerTab)&&void 0!==a?a:5;if(E-I<(null!==(d=v.autoRepairCooldownMs)&&void 0!==d?d:4e3))return;if(D>0&&P>=D)return void this.diagOnce("auto-repair-cap",`screen auto-repair 한도 도달 (${P}/${D}) — 더 고치지 않는다. 사이드바 ↻ 로 직접 복구할 것. 마지막 판정: ${m.reasons.join(" / ")}`);const T=null===(l=S.frontend)||void 0===l?void 0:l.xterm,B=null==T?void 0:T.cols,O=null==T?void 0:T.rows;(0,y.sizeInSync)(B,O,null===(u=S.size)||void 0===u?void 0:u.columns,null===(A=S.size)||void 0===A?void 0:A.rows)?(this.diag(`screen BROKEN cols=${b.cols} sent=${null===(g=S.size)||void 0===g?void 0:g.columns}x${null===(f=S.size)||void 0===f?void 0:f.rows} ${m.reasons.join(" / ")}`),this.snapshot(e,`auto-before ${m.reasons.join(" / ")}`),this.autoRepairAt.set(e,E),this.autoRepairCount.set(e,P+1),this.diag(`screen auto-repair #${P+1}`),this.clearInputArea(e,b),!0===v.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const n=this.readScreen(e),i=n?(0,y.judgeScreen)(n.lines,n.cols,null===(t=this.profileForPane(e))||void 0===t?void 0:t.screenShape):null;this.snapshot(e,"auto-after "+(i?i.broken?"아직 깨짐: "+i.reasons.join(" / "):"복구됨":"읽을 수 없음"))},1500)):this.diagOnce("auto-repair-resizing",`screen 자동복구 보류 — 크기가 어긋나 있다 (xterm ${B}x${O} vs pty ${null===(p=S.size)||void 0===p?void 0:p.columns}x${null===(h=S.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(),n=this.autoRepairHealthySince.get(e);n?t-n<6e4||(this.autoRepairCount.delete(e),this.autoRepairHealthySince.delete(e),(0,R.resetDiagOnce)("auto-repair-cap"),this.diag(`screen auto-repair 예산 회복 (화면이 ${Math.round((t-n)/1e3)}초 동안 온전했다)`)):this.autoRepairHealthySince.set(e,t)}sweepScreens(){if(!this.enabled||!this.screenObservingEnabled())return;const e=this.app.activeTab;if(!e)return;const t=e,n="function"==typeof t.getAllTabs?t.getAllTabs():[e];for(const e of n)this.checkScreen(e)}readScreen(e){var t,n,i,r;const o=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(n=null==o?void 0:o.buffer)||void 0===n?void 0:n.active;if(!(s&&"function"==typeof s.getLine&&o.cols>1))return null;const a=null===(i=o.element)||void 0===i?void 0:i.parentElement;if(!(null==a?void 0:a.clientWidth))return null;const d=[];try{for(let e=s.baseY;e<=s.baseY+o.rows-1;e++){const t=s.getLine(e);d.push({text:null!==(r=null==t?void 0:t.translateToString(!1))&&void 0!==r?r:"",wrapped:!!(null==t?void 0:t.isWrapped)})}}catch{return null}return{lines:d,cols:o.cols}}snapshot(e,t){var n,i,r,o;const s=this.readScreen(e);if(!s)return;const a=e,d=null===(n=a.frontend)||void 0===n?void 0:n.xterm,l=`\n===== ${(new Date).toISOString()} ${t} cols=${s.cols} rows=${null==d?void 0:d.rows} sent=${null===(i=a.size)||void 0===i?void 0:i.columns}x${null===(r=a.size)||void 0===r?void 0:r.rows} title=${JSON.stringify(null!==(o=e.title)&&void 0!==o?o:"")} =====`,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,R.appendScreenLog)([l,...c,""].join("\n"))}watchTab(e){var t;const n=e;this.watched.has(e)||(this.watched.add(e),n.titleChange$&&n.titleChange$.subscribe(t=>{this.probeAgent(e,"title-change"),(0,b.applyTitle)(this.status,e,t,this.config.store.agentDeck.autoDetect,this.profileForTab(e))}),n.title&&(0,b.applyTitle)(this.status,e,n.title,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),n.tabAdded$&&n.tabAdded$.subscribe(t=>this.watchPane(e,t)));const i="function"==typeof n.getAllTabs?n.getAllTabs():[e];this.diag(`watchTab panes=${i.length}`);for(const t of i)this.watchPane(e,t);if(!i.length){const n=(null!==(t=this.emptyTabRetries.get(e))&&void 0!==t?t:0)+1;this.emptyTabRetries.set(e,n),n<=20&&setTimeout(()=>{this.app.tabs.includes(e)&&this.watchTab(e)},400)}}watchPane(e,t){var n;if(this.watchedPanes.has(t))return;this.watchedPanes.add(t),this.diag(`watchPane ${null===(n=t.constructor)||void 0===n?void 0:n.name}`);const i=t,r=n=>{var r,o,s,a,d,l;this.installCodexCursorFix(t),n&&n.output$&&(this.diag(`session bind xterm=${null===(o=null===(r=i.frontend)||void 0===r?void 0:r.xterm)||void 0===o?void 0:o.cols}x${null===(a=null===(s=i.frontend)||void 0===s?void 0:s.xterm)||void 0===a?void 0:a.rows} paneSize=${null===(d=i.size)||void 0===d?void 0:d.columns}x${null===(l=i.size)||void 0===l?void 0:l.rows}`),this.probeAgent(e,"session-bind"),n.output$.subscribe(n=>{var r;this.outputHits++;const o=this.paneAgents.get(t);("unknown"===(null!==(r=this.tabAgents.get(e))&&void 0!==r?r:"unknown")||(null==o?void 0:o.session)===i.session&&"unknown"===(null==o?void 0:o.tracker.id))&&this.probeAgent(e,"output"),(0,b.applyOutput)(this.status,e,t,n,this.config.store.agentDeck.autoDetect,this.profileForTab(e)),this.view&&this.config.store.agentDeck.viewerScrape&&this.view.noteOutput(e,n),this.touchCwd(e,t),this.scheduleScreenCheck(t)}))};r(i.session),i.sessionChanged$&&i.sessionChanged$.subscribe(e=>r(e)),i.frontendReady$&&i.frontendReady$.subscribe(()=>{this.installCodexCursorFix(t),this.scheduleRefit(),this.announceSizeOnOpen(t),this.touchCwd(e,t)}),this.announceSizeOnOpen(t)}installCodexCursorFix(e){(0,p.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,u.installCursorVisibilityFix)(e.frontend,t=>{var n;return this.observePaneAgent(e,t),"win32"===process.platform&&"codex"===(null===(n=this.profileForPane(e))||void 0===n?void 0:n.id)},()=>this.diag("codex cursor: repaired non-private CSI 25 visibility sequence"))}observePaneAgent(e,t){let n=this.paneAgents.get(e);n&&n.session===e.session||(n={session:e.session,tracker:new A.TerminalAgentTracker},this.paneAgents.set(e,n)),n.tracker.write(t)}announceSizeOnOpen(e){const t=e;for(const e of F)setTimeout(()=>{var n;const i=null===(n=t.frontend)||void 0===n?void 0:n.xterm,r=t.session;if(!((null==r?void 0:r.open)&&"function"==typeof r.resize&&(null==i?void 0:i.cols)>1))return;const o=t.size;(null==o?void 0:o.columns)===i.cols&&(null==o?void 0:o.rows)===i.rows||this.diag(`announce size ${null==o?void 0:o.columns}x${null==o?void 0:o.rows} -> ${i.cols}x${i.rows} (+${e}ms)`);try{r.resize(i.cols,i.rows),t.size={columns:i.cols,rows:i.rows}}catch(e){(0,R.diagCatch)("announce-size resize",e)}},e)}ensurePasteHotkey(){const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const n of["workdeck-paste","workdeck-newline","workdeck-toggle"])n in e&&(delete e[n],t=!0);for(const n of["agentdeck-paste","paste"]){const i=Array.isArray(e[n])?e[n]:[];i.includes("Ctrl-V")&&(e[n]=i.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,n,i;const r=this.config.store.agentDeck;if(!this.enabled||!1===r.keyboardNav||!1===r.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 o="list"===this.navMode;if(!o&&this.isDeckUiKey(e.target))return;const s=(0,P.pickCloseTarget)({inList:o,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=${o} tabs=${this.app.tabs.length}`),this.zone.run(()=>{this.app.closeTab(s,!0)})):this.diag(`ctrl-w skip inList=${o} focus=${null!==(i=null===(n=this.navFocus)||void 0===n?void 0:n.kind)&&void 0!==i?i:"none"}`)},!0)}releaseHomeEndHotkey(){if(!this.config.store.agentDeck.releaseHomeEnd)return;const e=this.config.store.hotkeys;if(!e)return;let t=!1;for(const n of["home","end"]){const i=Array.isArray(e[n])?e[n]:[],r=i.filter(e=>"Home"!==e&&"End"!==e);r.length!==i.length&&(e[n]=r,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 n=this.focusedPane(),i=this.compositionHelper(n),r=(0,x.readCompositionState)(i),o=(0,x.planSend)(r);this.diag(`ime home-end key=${t} keyCode=${e.keyCode} ${this.describeComposition(i)} evComposing=${e.isComposing} state=${r} plan=${o}`)},!0)}sendToPane(e,t,n){const i=()=>{try{n()}catch{}};if(!this.config.store.agentDeck.imeOrderGuard)return void i();const r=this.compositionHelper(e),o=(0,x.readCompositionState)(r),s=(0,x.planSend)(o);this.diag(`ime send=${t} ${this.describeComposition(r)} state=${o} plan=${s}`),"defer"!==s?"after-composition"!==s?i():this.writeAfterComposition(e,t,i):setTimeout(i,0)}writeAfterComposition(e,t,n){const i=(()=>{var t,n,i;try{return null!==(i=null===(n=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===n?void 0:n.textarea)&&void 0!==i?i:null}catch{return null}})();if(!i){const i=(0,x.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));return this.diag(`ime send=${t} no-textarea flushed=${i}`),void n()}let r=!1;const o=e=>{r||(r=!0,i.removeEventListener("compositionend",s),clearTimeout(a),this.diag(`ime send=${t} wrote-after=${e}`),setTimeout(n,0))},s=()=>o("compositionend"),a=setTimeout(()=>{const n=(0,x.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));this.diag(`ime send=${t} timeout flushed=${n}`),o("timeout")},400);i.addEventListener("compositionend",s,{once:!0})}compositionHelper(e){var t,n,i,r;try{return null!==(r=null===(i=null===(n=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===n?void 0:n._core)||void 0===i?void 0:i._compositionHelper)&&void 0!==r?r:null}catch{return null}}compositionTextLength(e){var t,n,i;try{const r=null===(i=null===(n=null===(t=null==e?void 0:e.frontend)||void 0===t?void 0:t.xterm)||void 0===n?void 0:n.textarea)||void 0===i?void 0:i.value;return"string"==typeof r?r.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",n=>{t(n)&&e()},!0),document.addEventListener("keydown",n=>{if(t(n))return void(this.shiftDownAt=Date.now());if(!this.config.store.agentDeck.claimShiftEnter)return;const i="Enter"===n.key||"Enter"===n.code||"NumpadEnter"===n.code;if(!i&&!n.shiftKey&&!n.getModifierState("Shift"))return void e();if(!i||n.altKey||n.metaKey)return;if(n.isComposing||229===n.keyCode)return;const r=this.shiftDownAt>0&&Date.now()-this.shiftDownAt<5e3;(n.shiftKey||n.getModifierState("Shift")||r||n.ctrlKey)&&(this.isPlainInput(n.target)||this.isDeckUiKey(n.target)||(n.preventDefault(),n.stopPropagation(),this.diag(`newline (capture) shiftKey=${n.shiftKey} modState=${n.getModifierState("Shift")} tracked=${r} ctrl=${n.ctrlKey}`),this.sendNewline()))},!0)}claimEnterLabel(){document.addEventListener("keydown",e=>{var t,n;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 i=this.app.activeTab;if(i&&(0,b.releaseLimited)(this.status,i),!this.config.store.agentDeck.enterAsLabel)return;const r=this.focusedPane();if(!r)return void this.diag("enter-label skipped (no pane)");const o=this.readPromptLine(r),s=this.app.activeTab;this.diag(`enter-label text="${o}" tab=${s?"yes":"no"} profile=${null!==(n=null===(t=this.profileForPane(r))||void 0===t?void 0:t.id)&&void 0!==n?n:"default"}`),o&&s&&this.status.setLabel(s,o)},!0)}readPromptLine(e){var t,n,i,r;const o=null===(t=e.frontend)||void 0===t?void 0:t.xterm,s=null===(n=null==o?void 0:o.buffer)||void 0===n?void 0:n.active;if(!s||"function"!=typeof s.getLine)return this.diag(`enter-label no-buffer frontend=${e.frontend?"yes":"no"} xterm=${o?"yes":"no"}`),"";const a=(e,t)=>{var n,i;const r=[];for(let o=Math.max(0,e);o<=t;o++)r.push(null!==(i=null===(n=s.getLine(o))||void 0===n?void 0:n.translateToString(!0))&&void 0!==i?i:"");return r},d=s.baseY+(null!==(i=s.cursorY)&&void 0!==i?i:0),l=a(d-14,d),c=null===(r=this.profileForPane(e))||void 0===r?void 0:r.promptShape,u=(0,w.extractPrompt)(l,c);if(u)return u;const A=(0,w.extractPrompt)(a(s.baseY,s.baseY+o.rows-1),c);if(!A){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=${o.rows} tail=${e}`)}return A}isPlainInput(e){var t;const n=e;return!(!n||"function"!=typeof n.closest)&&!(null===(t=n.classList)||void 0===t?void 0:t.contains("xterm-helper-textarea"))&&!n.closest(".xterm")&&(n.isContentEditable||["INPUT","TEXTAREA"].includes(n.tagName))}isDeckUiKey(e){const t=e;return!(!t||"function"!=typeof t.closest||!t.closest("#"+M))}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 n=this.focusedPane();if(!n)return;const i=this.clipboardHasImageOnly();if(this.diag(`paste probe enabled=${this.config.store.agentDeck.pasteImageWithCtrlV} imageOnly=${i} sendInput=${typeof n.sendInput}`),this.config.store.agentDeck.pasteImageWithCtrlV&&i&&"function"==typeof n.sendInput)return void this.sendImagePasteKey(n);if("function"!=typeof n.paste)return;if(this.pasteProbeUntil=Date.now()+5e3,this.probeSendInput(n),this.probeWrite(n),this.diag(`paste (${e})`),"ctrl-v"===e)return void this.sendToPane(n,"paste-ctrl-v",()=>{n.paste()});const r=Date.now();setTimeout(()=>{this.nativePasteAt>=r?this.diag("paste skipped (native handled)"):(this.diag("paste fallback"),this.sendToPane(n,"paste-fallback",()=>{n.paste()}))},60)}async sendImagePasteKey(e){const t=await this.detectAgentApp(e),n=(0,m.profileFor)(t.id),i=this.config.store.agentDeck.imagePasteKey,r="config"===n.imagePasteKey?i:n.imagePasteKey,o="ctrl-v"===r?"":"v";this.diag(`paste image app=${t.id} via=${t.via} mode=${r} bytes=${[...o].map(e=>e.charCodeAt(0)).join(",")}`),this.sendToPane(e,"paste-image",()=>e.sendInput(o))}claimFileDrop(){const e=e=>{var t;const n=e;return!!(null===(t=null==n?void 0:n.closest)||void 0===t?void 0:t.call(n,"#agentdeck-view, #agentdeck-sidebar"))};document.addEventListener("dragover",t=>{var n,i;"never"===this.config.store.agentDeck.viewerDropOpen||e(t.target)||Array.from(null!==(i=null===(n=t.dataTransfer)||void 0===n?void 0:n.types)&&void 0!==i?i:[]).includes("Files")&&t.preventDefault()},!0),document.addEventListener("drop",t=>{var n,i,r;const o=this.config.store.agentDeck.viewerDropOpen;if("never"===o||e(t.target))return;const s=null===(i=null===(n=t.dataTransfer)||void 0===n?void 0:n.files)||void 0===i?void 0:i[0],a=(null==s?void 0:s.path)||(null===(r=t.dataTransfer)||void 0===r?void 0:r.getData("text/plain"))||"",d=String(a).trim().replace(/^"|"$/g,"");d&&(t.preventDefault(),t.stopPropagation(),"always"!==o?"paste"!==o?this.askFileDrop(d):this.pasteDroppedPath(d):this.openDroppedInPanel(d))},!0)}openDroppedInPanel(e){var t,n;null===(t=this.view)||void 0===t||t.setOpen(!0,!1),null===(n=this.view)||void 0===n||n.openFile(e)}pasteDroppedPath(e){const t=this.firstPane(this.app.activeTab);if(!t)return;const n=/\s/.test(e)?`"${e}"`:e;this.sendToPane(t,"drop-paste",()=>t.sendInput(n))}askFileDrop(e){var t,n,i,r;null===(t=document.getElementById("agentdeck-drop-ask"))||void 0===t||t.remove();const o=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">',' <button class="ad-drop-ask-view">패널에 띄우기</button>',' <button class="ad-drop-ask-paste">경로 붙여넣기</button>',' <button class="ad-drop-ask-close" title="아무것도 하지 않는다">✕</button>',"</div>",'<label class="ad-drop-ask-again">',' <input type="checkbox" class="ad-drop-ask-again-box"> 다시 묻지 않기',"</label>"].join("");const a=s.querySelector(".ad-drop-ask-msg");a.textContent=`${o} 을 어떻게 할까요?`,a.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===(n=s.querySelector(".ad-drop-ask-view"))||void 0===n||n.addEventListener("click",()=>{d("always"),this.openDroppedInPanel(e),l()}),null===(i=s.querySelector(".ad-drop-ask-paste"))||void 0===i||i.addEventListener("click",()=>{d("paste"),this.pasteDroppedPath(e),l()}),null===(r=s.querySelector(".ad-drop-ask-close"))||void 0===r||r.addEventListener("click",l),document.body.appendChild(s),setTimeout(()=>{document.getElementById("agentdeck-drop-ask")===s&&l()},15e3)}async detectAgentApp(e){var t,n,i,r,o;let s=[];try{const r=null!==(i=await(null===(n=null===(t=e.session)||void 0===t?void 0:t.getChildProcesses)||void 0===n?void 0:n.call(t)))&&void 0!==i?i:[],o=r.map(e=>{var t,n;return`${null!==(t=null==e?void 0:e.command)&&void 0!==t?t:""} ${null!==(n=null==e?void 0:e.name)&&void 0!==n?n:""}`}).join(" "),a=(0,m.identifyAgent)(o,"");if("unknown"!==a)return{id:a,via:"proc"};s=r.map(e=>Number(null==e?void 0:e.pid)).filter(e=>Number.isInteger(e)&&e>0)}catch{}const a=await this.commandLinesOf(s);if(a){const e=(0,m.identifyAgent)(a,"");if("unknown"!==e)return{id:e,via:"cmdline"}}const d=`${null!==(r=e.title)&&void 0!==r?r:""} ${null!==(o=e.customTitle)&&void 0!==o?o:""}`,l=(0,m.identifyAgent)("",d);return{id:l,via:"unknown"===l?"none":"title"}}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}=n(5317),i="win32"===process.platform,r=i?"powershell":"ps",o=i?["-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(r,o,{timeout:4e3,windowsHide:!0},(e,n)=>t(e&&!n?null:String(null!=n?n:""))).on("error",()=>t(null))})}catch{return null}}async probeAgent(e,t){var n,i;const r=Date.now();if(r-(null!==(n=this.agentProbedAt.get(e))&&void 0!==n?n:0)<1e4)return;this.agentProbedAt.set(e,r);const o=this.firstPane(e);if(!o)return;const s=o.session,a=this.paneAgents.get(o),d=await this.detectAgentApp(o);if(o.session!==s)return;"unknown"===d.id||"proc"!==d.via&&"cmdline"!==d.via||!a||this.paneAgents.get(o)!==a||a.session!==s||"unknown"!==a.tracker.id||(a.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!==(i=e.title)&&void 0!==i?i:"")} id=${d.id} via=${d.via} (${t})`))}firstPane(e){var t;const n=e;return null!==(t=("function"==typeof n.getAllTabs?n.getAllTabs():[e])[0])&&void 0!==t?t:null}profileForPane(e){var t,n,i,r,o,s,a,d,l,c,u,p;try{const h=null!==(i=null===(n=(t=this.app).getParentTab)||void 0===n?void 0:n.call(t,e))&&void 0!==i?i:e,g=null===(r=this.paneAgents)||void 0===r?void 0:r.get(e),f=null===(o=null==e?void 0:e.frontend)||void 0===o?void 0:o.xterm,v=null===(s=null==f?void 0:f.buffer)||void 0===s?void 0:s.active,b=(null==g?void 0:g.session)===e.session?g:void 0;if(v&&(!g||b)&&(!(null==b?void 0:b.tracker.id)||"unknown"===b.tracker.id)){const t=Array.from({length:f.rows},(e,t)=>{var n,i;return null!==(i=null===(n=v.getLine(v.baseY+t))||void 0===n?void 0:n.translateToString(!0))&&void 0!==i?i:""});if((0,A.isLiveCodexScreen)(t)){const t=null!==(a=null==b?void 0:b.tracker)&&void 0!==a?a:new A.TerminalAgentTracker;return t.id="codex",null===(d=this.paneAgents)||void 0===d||d.set(e,{session:e.session,tracker:t}),null===(l=this.tabAgents)||void 0===l||l.set(h,"codex"),null===(c=this.diag)||void 0===c||c.call(this,"agent stream recovered id=codex via=live-screen"),(0,m.detectProfileFor)("codex")}}if((null==g?void 0:g.session)===e.session&&void 0!==(null==g?void 0:g.tracker.id))return"unknown"===g.tracker.id?void 0:(0,m.detectProfileFor)(g.tracker.id);const C=this.profileForTab(h);if(C&&"codex"!==C.id)return C;if(!v)return C;const w=Math.max(0,v.baseY-60),y=[];for(let e=w;e<v.baseY+f.rows;e++)y.push(null!==(p=null===(u=v.getLine(e))||void 0===u?void 0:u.translateToString(!0))&&void 0!==p?p:"");const x=(0,A.identifyScreenAgent)(y);return"claude"===x?(0,m.detectProfileFor)("claude"):C||("unknown"===x?void 0:(0,m.detectProfileFor)(x))}catch{return}}profileForTab(e){const t=this.tabAgents.get(e);return t&&"unknown"!==t?(0,m.detectProfileFor)(t):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,...n)=>{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,...n)}}probeWrite(e){const t=null==e?void 0:e.session;if(!t||t.__adWriteProbe||"function"!=typeof t.write)return;const n=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 n(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=function(){var e,t,i,r,o;if(void 0!==z)return z;try{z=null!==(t=null===(e=n(4157))||void 0===e?void 0:e.clipboard)&&void 0!==t?t:null}catch(e){z=null,(0,R.diagCatch)("clipboard require(electron)",e)}if(!z)try{const e=null!==(i=window.require)&&void 0!==i?i:globalThis.require;z=null!==(o=null===(r=null==e?void 0:e("electron"))||void 0===r?void 0:r.clipboard)&&void 0!==o?o:null}catch(e){z=null,(0,R.diagCatch)("clipboard window.require",e)}return z||(0,R.diagOnce)("clipboard-missing","clipboard 없음 — 이미지 붙여넣기 불가"),z}();if(!e)return this.diag("clipboard unavailable"),!1;try{const t=!e.readImage().isEmpty(),n=e.readText();return this.diag(`clipboard hasImage=${t} textLen=${n.length}`),t&&""===n.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 n=t-this.rightDownAt;this.handleRightClick(e,n)},{capture:!0}))}inTerminalArea(e){const t=e.target;return!(!t||"function"!=typeof t.closest||!t.closest(".content.main")||t.closest(`#${M}`))}async handleRightClick(e,t){var n,i;const r=this.focusedPane();r&&(t>=(null!==(n=this.config.store.agentDeck.rightClickMenuMs)&&void 0!==n?n:250)?"function"==typeof r.buildContextMenu&&r.platform&&r.platform.popupContextMenu(await r.buildContextMenu(),e):"function"==typeof(null===(i=r.frontend)||void 0===i?void 0:i.getSelection)&&r.frontend.getSelection()?(r.frontend.copySelection(),r.frontend.clearSelection()):this.doPaste("rightclick"))}sendNewline(){var e,t,n;const i=this.focusedPane();if(i&&"function"==typeof i.sendInput){const r=(0,c.newlineSequence)(null===(e=this.profileForPane(i))||void 0===e?void 0:e.id);this.diag(`newline agent=${null!==(n=null===(t=this.profileForPane(i))||void 0===t?void 0:t.id)&&void 0!==n?n:"unknown"} sequence=${JSON.stringify(r)}`),this.sendToPane(i,"newline",()=>i.sendInput(r))}}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.scheduleRefit()}this.syncBackgroundClip()}syncBackgroundClip(){const e=document.documentElement,t=()=>{document.body.classList.remove($);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 n=this.mainEl.getBoundingClientRect();n.width<=0||n.height<=0||(e.style.setProperty("--ad-bg-left",Math.round(n.left)+"px"),e.style.setProperty("--ad-bg-top",Math.round(n.top)+"px"),e.style.setProperty("--ad-bg-width",Math.round(n.width)+"px"),e.style.setProperty("--ad-bg-height",Math.round(n.height)+"px"),document.body.classList.add($))}):t()}applyOpacity(){var e;const t=this.config.store.agentDeck,n=j(t.terminalOpacity),i=j(t.sidebarOpacity),r=document.documentElement;i>=100?r.style.removeProperty("--ad-panel-bg"):r.style.setProperty("--ad-panel-bg",`rgba(30, 33, 39, ${i/100})`);const o=null===(e=this.config.store.terminal)||void 0===e?void 0:e.colorScheme;if(!(null==o?void 0:o.background))return;const s=function(e,t){const n=/^#([0-9a-fA-F]{6})(?:[0-9a-fA-F]{2})?$/.exec(e.trim());if(!n)return e;const i="#"+n[1];return t>=100?i:i+Math.round(255*t/100).toString(16).padStart(2,"0")}(o.background,n),a=n<100?"colorScheme":this.config.store.terminal.background;s===o.background&&a===this.config.store.terminal.background||(o.background=s,this.config.store.terminal.background=a,this.config.save())}get dockSide(){const e=this.config.store.agentDeck.sidebarDock;return(0,k.isDockSide)(e)?e:"right"}sidebarExtent(e,t,n){const i=this.config.store.agentDeck;if((0,k.isHorizontalDock)(this.dockSide)){const n=i.sidebarMin||200,r=Math.max(i.sidebarMax||560,n);let o=i.sidebarWidth||0;if(!o){const r=(i.aspectW||4)/(i.aspectH||3);let s=Math.round(t*r);s=Math.min(s,e-n),s=Math.max(s,L),o=e-s}const s=i.sidebarWidth?140:n,a=Math.max(e-L,s),d=i.sidebarWidth?Math.max(r,i.sidebarWidth):r;return Math.min(Math.max(o,s),d,a)}const r=i.sidebarHeight||200;return Math.min(Math.max(r,90),Math.max(n-160,90))}relayout(){var e,t,n,i;if(!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 r=this.windowEl.clientWidth,o=this.mainEl.clientHeight||this.windowEl.clientHeight;if(!r||!o)return;const s=this.dockSide,a=(0,k.isHorizontalDock)(s),d=this.viewSide,l=r-L-(a?140:0),c=Math.round(null!==(t=null===(e=this.view)||void 0===e?void 0:e.extent(l))&&void 0!==t?t:0),u=Math.max(r-c,L);let A=Math.round(this.sidebarExtent(u,o,this.windowEl.clientHeight));const p=a?A:0,h=("left"===s?p:0)+("left"===d?c:0);let g=r-h-(("right"===s?p:0)+("right"===d?c:0));if(A=Math.round(A),g=Math.round(g),g===this.lastTermW&&A===this.lastSidebarW&&s===this.lastDock&&c===this.lastViewW&&d===this.lastViewSide)return;if(this.lastTermW,this.lastTermW=g,this.lastSidebarW=A,this.lastDock=s,this.lastViewW=c,this.lastViewSide=d,this.sidebar){const e=this.sidebar.style;e.position="absolute",e.left="right"===s?"auto":"0",e.right="left"===s?"auto":"0",e.top="bottom"===s?"auto":"0",e.bottom="top"===s?"auto":"0",e.width=a?A+"px":"auto",e.height=a?"auto":A+"px";for(const e of k.DOCK_SIDES)this.sidebar.classList.toggle("ad-dock-"+e,e===s)}null===(n=this.view)||void 0===n||n.layout(d,c,s===d?p:0);const f=this.mainEl.style;a||c>0?(f.flex="0 0 "+g+"px",f.width=g+"px",f.maxWidth=g+"px",f.marginLeft=h+"px",f.marginRight="0"):(f.removeProperty("flex"),f.removeProperty("width"),f.removeProperty("max-width"),f.marginLeft="0",f.marginRight="0"),a?(f.removeProperty("height"),f.marginTop="0",f.marginBottom="0"):(f.marginTop="top"===s?A+"px":"0",f.marginBottom="bottom"===s?A+"px":"0",f.setProperty("height","calc(100% - "+A+"px)","important")),null===(i=this.dock)||void 0===i||i.syncHandle(),this.syncBackgroundClip(),this.scheduleRefit(),this.diag(`relayout dock=${s} avail=${r}x${o} extent=${A} termW=${g} 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 n of this.app.tabs){const i=n,r="function"==typeof i.getAllTabs?i.getAllTabs():[n];for(const n of r){const i=n.frontend,r=null==i?void 0:i.fitAddon;if(!r||"function"!=typeof r.fit)continue;const o=null===(t=null===(e=i.xterm)||void 0===e?void 0:e.element)||void 0===t?void 0:t.parentElement;if(o&&o.clientWidth&&o.clientHeight)try{r.fit()}catch{}}}}syncPtySize(e,t){var n,i;const r=null===(n=null==t?void 0:t.xterm)||void 0===n?void 0:n.cols,o=null===(i=null==t?void 0:t.xterm)||void 0===i?void 0:i.rows;if(!r||!o)return;const s=e,a=s.session;if(!a||!a.open||"function"!=typeof a.resize)return;const d=s.size;(null==d?void 0:d.columns)===r&&(null==d?void 0:d.rows)===o||this.diag(`pty resize ${null==d?void 0:d.columns}x${null==d?void 0:d.rows} -> ${r}x${o}`);try{a.resize(r,o),s.size={columns:r,rows:o}}catch(e){return void(0,R.diagCatch)("pty resize",e)}if((null==d?void 0:d.columns)!==r||(null==d?void 0:d.rows)!==o)for(const e of _)setTimeout(()=>{var e,t;const n=null===(e=s.frontend)||void 0===e?void 0:e.xterm;if((null===(t=s.session)||void 0===t?void 0:t.open)&&(null==n?void 0:n.cols)===r&&(null==n?void 0:n.rows)===o)try{s.session.resize(r,o)}catch(e){(0,R.diagCatch)("pty resize retry",e)}},e)}nudgePtyRedraw(e){var t,n,i,r;const o=e,s=o.session,a=null===(n=null===(t=o.frontend)||void 0===t?void 0:t.xterm)||void 0===n?void 0:n.cols,d=null===(r=null===(i=o.frontend)||void 0===i?void 0:i.xterm)||void 0===r?void 0:r.rows;if((null==s?void 0:s.open)&&"function"==typeof s.resize&&a>1&&d>1){this.diag(`redraw nudge ${a}x${d}`);try{s.resize(a-1,d),o.size={columns:a-1,rows:d},setTimeout(()=>{var t;(null===(t=o.session)||void 0===t?void 0:t.open)&&this.syncPtySize(e,o.frontend)},60)}catch{}}}buildSidebar(){const e=document.createElement("div");e.id=M,e.innerHTML=['<div class="ad-head">',' <span class="ad-head-title">AGENT DECK</span>',' <span class="ad-head-count"></span>',"</div>",'<div class="ad-search">',' <input class="ad-search-input" type="text" spellcheck="false"',' placeholder="세션 검색 (제목 · 작업이름 · 폴더)">',' <button class="ad-search-clear" type="button" title="검색·필터 지우기 (Esc)">&times;</button>',"</div>",'<div class="ad-list"></div>','<div class="ad-foot">',' <button class="ad-btn ad-new" title="새 탭">+ 새 탭</button>',' <button class="ad-btn ad-settings" title="설정">설정</button>',' <button class="ad-btn ad-repair" title="화면 복구 (모든 탭 다시 그리기)">↻</button>',' <button class="ad-btn ad-viewtoggle" title="미리보기 패널 (md · 이미지 · 표)">▤</button>',"</div>"].join("\n"),this.windowEl.appendChild(e),this.sidebar=e,this.listEl=e.querySelector(".ad-list"),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 k.DockController({sidebar:e,windowEl:this.windowEl,getDock:()=>this.dockSide,setDock:e=>{this.config.store.agentDeck.sidebarDock=e},getSize:e=>{const t=this.config.store.agentDeck;return(0,k.isHorizontalDock)(e)?(0,k.isHorizontalDock)(this.dockSide)&&this.lastSidebarW>0?this.lastSidebarW:t.sidebarWidth||0:t.sidebarHeight||0},setSize:e=>{const t=this.config.store.agentDeck;(0,k.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"),n=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==n||n.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"),n=!1!==this.config.store.agentDeck.searchBox;t&&(t.style.display=n?"":"none"),n||!this.searchQuery&&!this.statusFilter||this.clearFilters()}toggleStatusFilter(e){this.statusFilter=this.statusFilter===e?null:e,this.syncSearchUi(),this.render()}tabMatchesFilter(e,t,n){var i,r;if(this.statusFilter&&n!==this.statusFilter)return!1;if(!t.length)return!0;const o=null!==(r=null===(i=this.cwdCache.get(e))||void 0===i?void 0:i.dir)&&void 0!==r?r:null;return q([(0,b.stripTitleMarker)(e.customTitle||e.title||""),this.status.get(e).label,o,o?null:E.UNGROUPED_LABEL],t)}migrateFollowConfig(){const e=this.config.store.agentDeck,t=(0,O.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 B.ViewPanel({windowEl:this.windowEl,getSide:()=>this.viewSide,getWidth:()=>t().viewerWidth||420,setWidth:e=>{t().viewerWidth=e},getRecentMax:()=>t().viewerRecentMax||12,getFollowMode:()=>(0,O.followModeOf)(t().viewerPreload,t().viewerAutoOpen),cwdFor:e=>{var n;return this.notify.cwdOf(e)||(null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.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,n=t?this.firstPane(t):null;return!(!n||!e||(this.sendToPane(n,"ref-paste",()=>n.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 n,i;const r=Date.now(),o=this.cwdCache.get(e),s=this.notify.cwdOf(e);if(s)return void((null==o?void 0:o.dir)!==s&&(this.cwdCache.set(e,{dir:s,at:r,misses:0}),this.scheduleRender()));const a=(null==o?void 0:o.dir)?3e3:400;if(o&&r-o.at<a)return;const l=(null==o?void 0:o.dir)?0:(null!==(n=null==o?void 0:o.misses)&&void 0!==n?n:0)+1;this.cwdCache.set(e,{dir:null!==(i=null==o?void 0:o.dir)&&void 0!==i?i:null,at:r,misses:l});const c=t.session;(null==c?void 0:c.getWorkingDirectory)&&Promise.resolve(c.getWorkingDirectory()).then(t=>{t&&function(e){try{return d.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;const t=this.config.store.terminal.profile,n=await this.profiles.getProfiles(),i=null!==(e=n.find(e=>e.id===t))&&void 0!==e?e:n[0];i&&await this.profiles.openNewTabForProfile(i)}openSettings(){this.app.openNewTabRaw({type:g.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,n,i,r;if(this.config.store.agentDeck.keepRenderingWhenHidden)try{const o=null!==(e=window.require)&&void 0!==e?e:globalThis.require,s=null===(n=null===(t=null==o?void 0:o("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===n?void 0:n.call(t);null===(r=null===(i=null==s?void 0:s.webContents)||void 0===i?void 0:i.setBackgroundThrottling)||void 0===r||r.call(i,!1)}catch{}}tick(){var e,t;if(!this.enabled)return;let n=!1;const i=this.config.store.agentDeck.idleAfterMs||2500;for(const r of this.app.tabs){this.status.tickIdle(r,i)&&(n=!0);const o=this.notify.cwdOf(r);if(o&&(null===(e=this.cwdCache.get(r))||void 0===e?void 0:e.dir)!==o&&(this.cwdCache.set(r,{dir:o,at:Date.now(),misses:0}),n=!0),r===this.app.activeTab)try{const e=this.cwdCache.get(r);if(!(null==e?void 0:e.dir)&&(null!==(t=null==e?void 0:e.misses)&&void 0!==t?t:0)<20){const e=this.firstPane(r);e&&this.touchCwd(r,e)}}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 n;try{n=this.notify.liveSessions()}catch{return}for(const[i,r]of n){if(!this.app.tabs.includes(r))continue;const n=this.status.get(r);this.ledger.note(i,{cwd:null!==(t=null===(e=this.cwdCache.get(r))||void 0===e?void 0:e.dir)&&void 0!==t?t:null,label:n.label,status:n.status})}}renderPlan(){const e=e=>this.status.get(e).status,t=this.config.store.agentDeck.sortByStatus?(0,S.sortTabsByStatus)(this.app.tabs,e):this.app.tabs,n=H(this.searchQuery),i=n.length>0||!!this.statusFilter,r=i?t.filter(t=>this.tabMatchesFilter(t,n,e(t))):t,o=this.groupsFor(r),s=o.filter(e=>null!==e.key).length>1;return{tabs:t,visible:r,groups:o,withHeads:s,plan:s?o:[{key:null,label:E.UNGROUPED_LABEL,tabs:[...r]}],statusOf:e,filtering:i,collapseOf:e=>(0,E.resolveGroupCollapseFor)(e,this.config.store.agentDeck.collapsedGroups,i)}}render(){var e;if(!this.listEl||!this.enabled||this.editing||(null===(e=this.drag)||void 0===e?void 0:e.moved))return;this.pruneNavFocus();const{tabs:t,visible:n,withHeads:i,plan:r,statusOf:o,filtering:s,collapseOf:a}=this.renderPlan();if(this.renderHeadCount(t,o),this.listEl.innerHTML="",!s||n.length)for(const e of r){const t=i?a(e):{collapsed:!1,reason:"open"},n=t.collapsed;if(i&&this.listEl.appendChild(this.renderGroupHead(e,t)),!n){for(const t of e.tabs)this.listEl.appendChild(this.renderTab(t));this.renderResume(e,s)}}else this.listEl.appendChild(this.renderEmpty(t.length))}renderResume(e,t){const n=this.config.store.agentDeck;if(!1===n.resumeList||!this.listEl||t)return;this.ledger.refresh();const i=(0,T.resumeRowsFor)(this.ledger.records(),{groupKeys:this.resumeKeysOf(e),keyOf:e=>(0,E.groupKeyOf)(e,I.projectRootOf),fold:E.foldGroupKey,live:this.liveSessionIds(),days:Number(n.resumeListDays)||0,limit:Number(n.resumeListLimit)||0,hidden:new Set(Array.isArray(n.resumeHidden)?n.resumeHidden:[]),now:Date.now()});if(!i.length)return;const r=this.isResumeExpanded(e.key);if(this.listEl.appendChild(this.renderResumeHead(e,i.length,r)),r)for(const e of i)this.listEl.appendChild(this.renderResumeRow(e))}resumeKeysOf(e){var t,n;if(null!==e.key)return[e.key];const i=new Set;for(const r of e.tabs)i.add((0,E.groupKeyOf)(null!==(n=null===(t=this.cwdCache.get(r))||void 0===t?void 0:t.dir)&&void 0!==n?n:null,I.projectRootOf));return[...i]}liveSessionIds(){this.resumeTabs.clear();const e=new Map;let t;try{t=this.notify.liveSessions()}catch{return e}for(const[n,i]of t)this.app.tabs.includes(i)&&(e.set(n,n),this.resumeTabs.set(n,i));return e}isResumeExpanded(e){const t=this.config.store.agentDeck.resumeExpanded;if(!Array.isArray(t))return!1;const n=(0,E.collapseIdOf)(e);return t.some(e=>"string"==typeof e&&(0,E.foldGroupKey)(e)===(0,E.foldGroupKey)(n))}toggleResumeExpanded(e){const t=this.config.store.agentDeck,n=(0,E.collapseIdOf)(e),i=Array.isArray(t.resumeExpanded)?t.resumeExpanded.filter(e=>"string"==typeof e):[],r=i.filter(e=>(0,E.foldGroupKey)(e)!==(0,E.foldGroupKey)(n));t.resumeExpanded=r.length===i.length?[...i,n]:r,this.config.save(),this.render()}renderResumeHead(e,t,n){const i=document.createElement("div");return i.className="ad-resume-head"+(n?"":" collapsed"),i.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(""),i.querySelector(".ad-group-label").textContent="지난 세션",i.querySelector(".ad-group-count").textContent=String(t),i.querySelector(".ad-group-caret").textContent=n?"▾":"▸",i.title="닫힌 Claude Code 세션 — 누르면 그 대화를 이어받는다",i.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.toggleResumeExpanded(e.key)}),i}renderResumeRow(e){const t=document.createElement("div");t.className="ad-resume"+(e.openTabId?" open":""),t.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||`세션 ${e.sessionId.slice(0,8)}`;t.querySelector(".ad-title").textContent=n;const i=t.querySelector(".re-was");if(e.openTabId)i.textContent="● 열림",i.className="re-was live";else{const t=C.STATUS_STYLES[e.lastStatus];i.textContent=t?t.label:"",i.className="re-was"+(e.lastStatus?" s-"+e.lastStatus:"")}return i.textContent=`${"codex"===e.agent?"Codex":"Claude"} · ${i.textContent||"지난 세션"}`,t.querySelector(".re-when").textContent=(0,T.formatWhen)(e.lastSeen,Date.now()),t.title=e.openTabId?`${n}\n이미 열려 있다 — 누르면 그 탭으로 이동`:`${n}\n누르면 새 탭에서 이어받는다 (${e.sessionId})\n작업 폴더: `+(e.cwd||"모름")+"\n※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다",t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>{this.activateResume(e,!1)})}),t.addEventListener("contextmenu",t=>{t.preventDefault(),t.stopPropagation(),this.zone.run(()=>this.showResumeMenu(e,t))}),t}renderEmpty(e){const t=document.createElement("div");t.className="ad-empty";const n=[],i=this.searchQuery.trim();return i&&n.push('"'+i+'"'),this.statusFilter&&n.push(C.STATUS_STYLES[this.statusFilter].label),t.textContent=n.join(" · ")+"에 걸리는 세션이 없다 (전체 "+e+"개)",t.title="Esc 또는 ✕ 로 전체 목록으로 돌아간다",t}groupsFor(e){return(0,E.groupTabs)(e,e=>{var t,n;return null!==(n=null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)&&void 0!==n?n:null},e=>(0,I.projectRootOf)(e,()=>this.scheduleRender()))}collapsedKeys(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.map(e=>(0,E.foldGroupKey)(String(e))):[]}isGroupCollapsed(e){return(0,E.isStoredCollapsed)(e,this.config.store.agentDeck.collapsedGroups)}toggleGroup(e){const t=(0,E.collapseIdOf)(e),n=this.collapsedKeys(),i=n.filter(e=>e!==t);i.length===n.length&&i.push(t),this.zone.run(()=>{this.config.store.agentDeck.collapsedGroups=i,this.config.save()}),this.render()}renderGroupHead(e,t){const n=t.collapsed,i=document.createElement("div");i.className=n?"ad-group-head collapsed":"filter-open"===t.reason?"ad-group-head filter-open":"ad-group-head",i.innerHTML=['<span class="ad-group-caret"></span>','<span class="ad-group-label"></span>','<span class="ad-group-count"></span>'].join("");const r=i.querySelector(".ad-group-caret"),o=i.querySelector(".ad-group-label"),s=i.querySelector(".ad-group-count");r.textContent=n?"▸":"▾",o.textContent=e.label,s.textContent=String(e.tabs.length);const a="filter-open"===t.reason?" · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":"";return i.title=(e.key?`${e.key} (탭 ${e.tabs.length}개) — 클릭하면 접기/펴기`:`작업 폴더를 아직 모르는 탭 ${e.tabs.length}개 — 클릭하면 접기/펴기`)+a,this.isNavFocused({kind:"head",key:e.key})&&i.classList.add("ad-nav-focus"),i.addEventListener("click",()=>this.toggleGroup(e.key)),i}renderHeadCount(e,t){const n=this.sidebar.querySelector(".ad-head-count");if(!n)return;n.innerHTML="",n.title=`탭 ${e.length}개`;const i=this.statusFilter,r=(0,S.countByStatus)(e,t);i&&!r.some(e=>e.status===i)&&(r.push({status:i,count:0}),r.sort((e,t)=>(0,S.statusRank)(e.status)-(0,S.statusRank)(t.status)));for(const{status:e,count:t}of r){const r=C.STATUS_STYLES[e],o=document.createElement("span");o.className=e===i?"ad-cnt active":"ad-cnt",o.style.setProperty("--ad-color",r.color),o.title=e===i?`${r.label} ${t} — 클릭하면 필터 해제`:`${r.label} ${t} — 클릭하면 이 상태만`,o.textContent=`${r.icon} ${t}`,o.addEventListener("pointerdown",e=>e.stopPropagation()),o.addEventListener("click",t=>{t.stopPropagation(),this.toggleStatusFilter(e)}),n.appendChild(o)}e.length||(n.textContent="0")}renderTab(e){const t=this.status.get(e),n=C.STATUS_STYLES[t.status],i=e===this.app.activeTab,r=document.createElement("div");r.className=i?"ad-tab active":"ad-tab",r.style.setProperty("--ad-color",n.color),r.dataset.adIndex=String(this.app.tabs.indexOf(e)),this.isNavFocused({kind:"tab",tab:e})&&r.classList.add("ad-nav-focus");const o=(0,b.stripTitleMarker)(e.customTitle||e.title||"")||"(제목 없음)",s=this.config.store.agentDeck.showElapsed?this.formatElapsed(Date.now()-t.since):"";r.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-badge"></span>',' <span class="ad-elapsed"></span>'," </div>","</div>",'<button class="ad-close" title="탭 닫기">&times;</button>'].join("\n"),r.querySelector(".ad-title").textContent=o;const a=r.querySelector(".ad-label");a.textContent=t.label||"—",a.classList.toggle("empty",!t.label),r.querySelector(".ad-elapsed").textContent=s;const d=r.querySelector(".ad-badge");d.textContent=n.icon+" "+n.label+(t.reason?" · "+t.reason:""),d.title=t.reason,t.pinned&&d.classList.add("pinned");const l=this.notify.subagentsOf(e);if(l){const e=document.createElement("span");e.className="ad-subagents",e.textContent=`❖${l.running}`,l.tooltip&&(e.title=l.tooltip),d.insertAdjacentElement("afterend",e)}return r.addEventListener("pointerdown",t=>this.armRowDrag(t,e,r)),r.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))))}),r.addEventListener("dblclick",t=>{t.preventDefault(),this.startLabelEdit(r,e)}),r.addEventListener("contextmenu",t=>{t.preventDefault(),this.showStatusMenu(t,e)}),r.querySelector(".ad-close").addEventListener("click",t=>{t.stopPropagation(),this.zone.run(()=>{this.app.closeTab(e,!0)})}),r}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:n}=this.renderPlan(),i=(0,P.navRowsOf)(t.map(t=>({key:t.key,tabs:t.tabs,head:e,collapsed:e&&n(t).collapsed})));return{rows:i,index:this.navIndexIn(i)}}sameNavRow(e,t){return"tab"===e.kind&&"tab"===t.kind?e.tab===t.tab:"head"===e.kind&&"head"===t.kind&&(0,E.collapseIdOf)(e.key)===(0,E.collapseIdOf)(t.key)}navIndexIn(e){const t=this.navFocus;if(!t)return-1;for(let n=0;n<e.length;n++)if(this.sameNavRow(e[n],t))return n;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:n}=this.navPlan();return!!t.length&&("last"===e?this.navFocus=t[t.length-1]:("first"===e||n<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,n;const i=document.activeElement;i!==this.listEl&&i!==this.searchEl||i.blur();const r=this.focusedPane();"function"==typeof(null===(e=null==r?void 0:r.frontend)||void 0===e?void 0:e.focus)?r.frontend.focus():null===(n=null===(t=this.app.activeTab)||void 0===t?void 0:t.emitFocused)||void 0===n||n.call(t),this.render()}moveNav(e,t){if(!this.navReady)return;const{rows:n,index:i}=this.navPlan();if(!n.length)return void(this.navFocus=null);if(!t&&e<0&&0===i&&this.navSearchVisible())return void this.focusSearch();const r=!!this.config.store.agentDeck.keyboardNavWrap,o="first"===t?0:"last"===t?n.length-1:(0,P.stepNavIndex)(n.length,i,e,r);o<0||(this.navFocus=n[o],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()))}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,n=e.code,i=()=>{e.preventDefault(),e.stopPropagation()};if("ArrowDown"===t||"ArrowDown"===n)return i(),void this.moveNav(1);if("ArrowUp"===t||"ArrowUp"===n)return i(),void this.moveNav(-1);if("Home"===t||"Home"===n)return i(),void this.moveNav(0,"first");if("End"===t||"End"===n)return i(),void this.moveNav(0,"last");if("Enter"===t||"Enter"===n||"NumpadEnter"===n){if(e.isComposing||229===e.keyCode)return;return i(),void this.activateNav()}return"Escape"===t||"Escape"===n?(i(),void this.navEscape()):"Tab"===t||"Tab"===n?(i(),void this.focusSearch()):void 0}),e.addEventListener("focus",()=>this.scheduleRender()),e.addEventListener("blur",()=>this.scheduleRender())}armRowDrag(e,t,n){if(this.dragClickGuard=!1,0!==e.button||this.drag||this.editing)return;if(e.target.closest("button, input"))return;const i=e=>this.dragMove(e),r=e=>this.endRowDrag(!0,e),o=()=>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",i,!0),document.addEventListener("pointerup",r,!0),document.addEventListener("pointercancel",o,!0),document.addEventListener("keydown",s,!0),this.drag={tab:t,row:n,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",i,!0),document.removeEventListener("pointerup",r,!0),document.removeEventListener("pointercancel",o,!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;if(this.config.store.agentDeck.sortByStatus)return this.noteReorderBlocked(),this.dragClickGuard=!0,void this.endRowDrag(!1,void 0,"blocked-sort");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,n=e.scrollWidth-e.clientWidth>1;return t&&n?this.listFlowsSideways()?"x":"y":t?"y":n?"x":null}dragScrollSpeed(e){const t=this.listEl,n=this.drag;if(!t||!n)return 0;const i=t.getBoundingClientRect(),r="y"===e;return(0,S.planEdgeScroll)({pos:r?n.at.y:n.at.x,near:r?i.top:i.left,far:r?i.bottom:i.right,cur:r?t.scrollTop:t.scrollLeft,maxScroll:r?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 n={raf:0,prev:performance.now(),axis:t};e.scroll=n,e.scrolled.axis=t,n.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}dragScrollTick(e){const t=this.drag,n=this.listEl;if(!(t&&t.scroll&&t.moved&&n))return;const i=t.scroll,r=this.dragScrollSpeed(i.axis);if(!r)return void this.stopDragScroll(t);const o=Math.min(50,Math.max(0,e-i.prev));i.prev=e;const s=r*o/1e3,a="y"===i.axis?n.scrollTop:n.scrollLeft;"y"===i.axis?n.scrollTop=a+s:n.scrollLeft=a+s,t.scrolled.px+=Math.abs(("y"===i.axis?n.scrollTop:n.scrollLeft)-a),this.refreshDropTarget(),i.raf=requestAnimationFrame(e=>this.dragScrollTick(e))}stopDragScroll(e){e.scroll&&(cancelAnimationFrame(e.scroll.raf),e.scroll=null)}dropTargetAt(e,t){const n=e=>(this.dropReject=e,null),i=this.drag;if(!i||!this.listEl)return n("gone");const r=this.listEl.getBoundingClientRect();if(e<r.left||e>r.right||t<r.top||t>r.bottom)return n("outside-list");const{withHeads:o,plan:s}=this.renderPlan(),a=s.find(e=>e.tabs.includes(i.tab));if(!a||!this.app.tabs.includes(i.tab))return n("gone");const d=document.elementFromPoint(e,t),l=null==d?void 0:d.closest(".ad-tab");if(!l){if(o||(null==d?void 0:d.closest(".ad-list"))!==this.listEl)return n("no-row");const e=a.tabs[a.tabs.length-1];return e&&e!==i.tab?(this.dropReject=null,{tab:e,place:"after"}):n("self")}const c=this.app.tabs[Number(l.dataset.adIndex)];if(!c)return n("gone");if(c===i.tab)return n("self");if(!a.tabs.includes(c))return n("other-group");if(this.rowElOf(c)!==l)return n("stale-index");const u=l.getBoundingClientRect(),A=this.listFlowsSideways()?e>(u.left+u.right)/2:t>(u.top+u.bottom)/2;return this.dropReject=null,{tab:c,place:A?"after":"before"}}listFlowsSideways(){return!(0,k.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 n=this.rowElOf(t.target.tab);if(!n)return;if(!t.line){const e=document.createElement("div");e.className="ad-reorder-line",document.body.appendChild(e),t.line=e}const i=n.getBoundingClientRect(),r=this.listEl.getBoundingClientRect(),o=t.line.style,s=(e,t,n)=>Math.min(Math.max(e,t),n);if(this.listFlowsSideways()){const e="after"===t.target.place?i.right:i.left;o.left=Math.round(s(e,r.left,r.right)-1)+"px";const n=s(i.top,r.top,r.bottom),a=s(i.bottom,r.top,r.bottom);o.top=Math.round(n)+"px",o.width="2px",o.height=Math.max(1,Math.round(a-n))+"px"}else{const e="after"===t.target.place?i.bottom:i.top,n=s(i.left,r.left,r.right),a=s(i.right,r.left,r.right);o.left=Math.round(n)+"px",o.top=Math.round(s(e,r.top,r.bottom)-1)+"px",o.width=Math.max(1,Math.round(a-n))+"px",o.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,n){var i;const r=this.drag;if(!r)return;this.dropReject=null,e&&r.moved&&t&&(r.target=this.dropTargetAt(t.clientX,t.clientY));const o=r.moved,s=e&&o?r.target:null;this.drag=null,this.stopDragScroll(r),r.detach(),null===(i=r.line)||void 0===i||i.remove(),r.row.classList.remove("ad-dragging"),document.body.classList.remove("ad-reordering");const a=e=>{this.lastDragEnd={reason:e,drop:this.dropReject,committed:"moved"===e,at:Date.now(),scrolled:{px:Math.round(r.scrolled.px),axis:r.scrolled.axis}}};o?(this.dragClickGuard=!0,a(null!=n?n:s?"moved":"no-target"),s&&this.applyReorder(r.tab,s.tab,s.place),this.render()):a(null!=n?n:"below-threshold")}applyReorder(e,t,n){const i=this.app.tabs,r=i.indexOf(e),o=i.indexOf(t),s=(0,S.planTabMove)(i.length,r,o,n);if(!s)return!1;const a=s.map(e=>i[e]);return this.zone.run(()=>{for(let e=0;e<a.length;e++)i[e]=a[e];this.app.emitTabsChanged()}),this.diag(`reorder ${r} -> ${o} ${n} 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.sidebar.appendChild(t),setTimeout(()=>t.remove(),2600)}startLabelEdit(e,t){this.editing=t;const n=e.querySelector(".ad-label"),i=document.createElement("input");i.className="ad-label-input",i.value=this.status.get(t).label,i.placeholder="작업 이름",n.replaceWith(i),i.focus(),i.select();const r=e=>{this.editing===t&&(this.editing=null,e&&this.status.setLabel(t,i.value.trim()),this.render())};i.addEventListener("keydown",e=>{e.stopPropagation(),"Enter"===e.key&&r(!0),"Escape"===e.key&&r(!1)}),i.addEventListener("blur",()=>r(!0))}async activateResume(e,t){if(e.openTabId){const t=this.resumeTabs.get(e.openTabId);if(t&&this.app.tabs.includes(t))return void this.app.selectTab(t)}const n=(0,T.resumeCommand)(e.sessionId,t,e.agent);n?await this.openResumeTab(e,n):this.diag(`resume 거부 sid=${e.sessionId}`)}async openResumeTab(e,t){var n,i,r,o;try{const s=this.config.store.terminal.profile,a=await this.profiles.getProfiles(),d=null!==(n=a.find(e=>e.id===s))&&void 0!==n?n:a[0];if(!d)return void this.diag("resume 프로필 없음");const l={...d,options:{...d.options,cwd:e.cwd||(null===(i=d.options)||void 0===i?void 0:i.cwd)}},c=await this.profiles.openNewTabForProfile(l);if(this.diag(`resume 탭 sid=${e.sessionId.slice(0,8)} cwd=${null!==(o=null===(r=l.options)||void 0===r?void 0:r.cwd)&&void 0!==o?o:"?"} tab=${c?"yes":"null"}`),!c)return;e.label&&this.status.setLabel(c,e.label),this.sendResumeCommand(c,t)}catch(e){(0,R.diagCatch)("resume 탭 열기",e)}}sendResumeCommand(e,t){let n=!1,i=null;const r=()=>{var r;if(n)return;const o=this.firstPane(e);o&&"function"==typeof o.sendInput&&(n=!0,null===(r=null==i?void 0:i.unsubscribe)||void 0===r||r.call(i),this.sendToPane(o,"resume",()=>o.sendInput(t+"\r")),this.diag("resume 명령 전송"))},o=Date.now(),s=()=>{var t,a,d;if(n||i)return;let l=null;try{l=this.firstPane(e),i=null===(d=null===(a=null===(t=null==l?void 0:l.session)||void 0===t?void 0:t.output$)||void 0===a?void 0:a.subscribe)||void 0===d?void 0:d.call(a,()=>setTimeout(r,700))}catch(e){return void(0,R.diagCatch)("resume 출력 구독",e)}i?this.diag(`resume 구독 armed after=${Date.now()-o}ms`):Date.now()-o<6e3&&setTimeout(s,200)};s(),setTimeout(r,6e3)}showResumeMenu(e,t){const n=document.querySelector(".ad-menu");n&&n.remove();const i=document.createElement("div");i.className="ad-menu";const r=[];e.openTabId?r.push(["이 탭으로 이동",()=>{this.activateResume(e,!1)}]):(r.push(["새 탭에서 이어받기",()=>{this.activateResume(e,!1)}]),r.push(["분기해서 이어받기",()=>{this.activateResume(e,!0)}])),r.push(["세션 ID 복사",()=>{var t,n;try{null===(n=(t=this.platform).setClipboard)||void 0===n||n.call(t,{text:e.sessionId})}catch(e){(0,R.diagCatch)("세션 ID 복사",e)}}]),r.push(["목록에서 숨기기",()=>this.hideResumeRow(e.sessionId)]);for(const[e,t]of r){const n=document.createElement("div");n.className="ad-menu-item",n.textContent=e,n.addEventListener("click",()=>{t(),i.remove()}),i.appendChild(n)}document.body.appendChild(i),i.style.left=t.clientX+"px",i.style.top=Math.min(t.clientY,window.innerHeight-i.offsetHeight-8)+"px";const o=e=>{i.contains(e.target)||(i.remove(),document.removeEventListener("mousedown",o))};setTimeout(()=>document.addEventListener("mousedown",o),0)}hideResumeRow(e){const t=this.config.store.agentDeck,n=Array.isArray(t.resumeHidden)?t.resumeHidden.filter(e=>"string"==typeof e):[];n.includes(e)||(t.resumeHidden=[...n,e],this.config.save()),this.render()}showStatusMenu(e,t){const n=document.querySelector(".ad-menu");n&&n.remove();const i=document.createElement("div");i.className="ad-menu";const r=["running","waiting","limited","done","error","idle"].map(e=>[C.STATUS_STYLES[e].icon+" "+C.STATUS_STYLES[e].label,()=>this.status.setManual(t,e)]);r.push(["↺ 자동 감지로",()=>this.status.unpin(t)]),r.push(["↻ 화면 복구",()=>{this.app.selectTab(t),this.repair("active")}]);for(const[e,t]of r){const n=document.createElement("div");n.className="ad-menu-item",n.textContent=e,n.addEventListener("click",()=>{t(),i.remove()}),i.appendChild(n)}document.body.appendChild(i),i.style.left=e.clientX+"px",i.style.top=Math.min(e.clientY,window.innerHeight-i.offsetHeight-8)+"px";const o=e=>{i.contains(e.target)||(i.remove(),document.removeEventListener("mousedown",o))};setTimeout(()=>document.addEventListener("mousedown",o),0)}formatElapsed(e){const t=Math.floor(e/1e3);if(t<60)return t+"초";const n=Math.floor(t/60);return n<60?n+"분":Math.floor(n/60)+"시간 "+n%60+"분"}};W=o([(0,l.Injectable)({providedIn:"root"}),a("design:paramtypes",[h.AppService,h.ConfigService,f.WorkStatusService,h.HotkeysService,h.ProfilesService,h.HostWindowService,h.PlatformService,v.WorkNotifyService,D.SessionLedgerService,l.NgZone])],W),t.AgentDeckService=W},7009(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},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.AgentDeckDecorator=void 0;const o=n(860),s=n(7650),a=n(8349),d=n(6021),l=n(1385);let c=class extends a.TerminalDecorator{constructor(e,t,n){super(),this.status=e,this.config=t,this.app=n}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=i([(0,o.Injectable)(),r("design:paramtypes",[d.WorkStatusService,s.ConfigService,s.AppService])],c),t.AgentDeckDecorator=c},1385(e,t,n){t.applyTitle=t.stripTitleMarker=t.forgetOutputBuffer=t.applyOutput=t.releaseLimited=void 0;const i=n(3532),r=n(7282),o=/\x1b\]1337;AgentDeck=([a-z]+)(?:;([^\x07\x1b]*))?(?:\x07|\x1b\\)/gi,s=["idle","running","waiting","limited","done","error"],a=new WeakMap;function d(e,t){for(const n of e.split(/[\r\n]+/)){if(!n.trim()||!t.some(e=>e.test(n)))continue;const e=(0,r.reasonFromScreen)(n);if(e)return e}return""}function l(e,t,n,i){const r=e.get(t);r.pinned||((r.status!==n||i)&&(r.reason=i),e.setAuto(t,n))}t.releaseLimited=function(e,t){"limited"===e.get(t).status&&e.setAuto(t,"running")},t.applyOutput=function(e,t,n,r,c,u=(0,i.unionProfile)()){var A;e.debug.outputs++,e.markOutput(t);const p=(null!==(A=a.get(n))&&void 0!==A?A:"")+r;let h,g=!1,f=0;for(o.lastIndex=0;null!==(h=o.exec(p));){f=o.lastIndex;const n=h[1].toLowerCase();s.includes(n)&&(e.setManual(t,n,h[2]),e.debug.oscHits++,g=!0)}if(a.set(n,p.slice(Math.max(f,p.length-256))),!g&&c)if(u.waitingPatterns.some(e=>e.test(r)))l(e,t,"waiting",d(r,u.waitingPatterns));else{if(!u.limitedPatterns.some(e=>e.test(r)))return"waiting"===e.get(t).status&&u.busyPatterns.some(e=>e.test(r))?(e.markBusy(t),void e.resume(t)):u.busyTitleMarks.some(e=>r.includes(e))||u.busyPatterns.some(e=>e.test(r))?(e.markBusy(t),void e.setAuto(t,"running")):void(e.isBusyMode(t)||"limited"!==e.get(t).status&&e.setAuto(t,"running"));l(e,t,"limited",d(r,u.limitedPatterns))}},t.forgetOutputBuffer=function(e){a.delete(e)};const c=/\[AD:([a-z]+)\]\s*(.*)$/i;t.stripTitleMarker=function(e){return e.replace(/\[AD:[a-z]+\]\s*/i,"")},t.applyTitle=function(e,t,n,r,o=(0,i.unionProfile)()){const a=c.exec(n);if(a){const n=a[1].toLowerCase();if(s.includes(n))return e.setManual(t,n,a[2].trim()),void e.debug.titleHits++}r&&o.busyTitleMarks.some(e=>n.includes(e))&&e.setAuto(t,"running")}},7797(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(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=o(n(5317)),a=o(n(9896)),d=o(n(857)),l=o(n(6928)),c=n(7604);function u(){const e=process.env.AGENTDECK_DIAG_DIR;if(e)try{if(a.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 A=2097152;t.configStamp=function(e){var t,n;const i=null!==(t=null==e?void 0:e.agentDeck)&&void 0!==t?t:{};return{enabled:i.enabled,dock:i.sidebarDock,sidebar:i.sidebarWidth||i.sidebarHeight,aspect:`${i.aspectW}:${i.aspectH}`,viewerOpen:i.viewerOpen,viewerFollow:(0,c.followModeOf)(i.viewerPreload,i.viewerAutoOpen),screenWatch:i.screenWatch,autoRepair:i.autoRepair,notifyChannel:i.notifyChannel,rootProfile:i.rootProfile,useConPTY:null===(n=null==e?void 0:e.terminal)||void 0===n?void 0:n.useConPTY}};const p=[],h=new Set;let g=-1,f=0,v="",b=!1,m=0;const C=new Map;let w=0;const y=new Map;let x=null;function k(){var e;if(null!==x)return x;x="unknown";for(const t of[l.join(__dirname,"..","package.json"),l.join(__dirname,"package.json")])try{const n=a.readFileSync(t,"utf8"),i=null===(e=JSON.parse(n))||void 0===e?void 0:e.version;if(i){x=String(i);break}}catch{}return x}function S(e){try{return a.statSync(e).size}catch{return 0}}function E(e,t,n){try{return!(S(e)<n||(a.renameSync(e,t),0))}catch{return!1}}function I(e){try{(g<0||++f>=500)&&(g=S(t.DIAG_PATH),f=0),g>=A&&E(t.DIAG_PATH,t.DIAG_PREV_PATH,A)&&(g=0,v&&(a.appendFileSync(t.DIAG_PATH,v),g+=Buffer.byteLength(v))),a.appendFileSync(t.DIAG_PATH,e),g+=Buffer.byteLength(e)}catch{}}function P(e){p.push(e),p.length>2e3&&p.splice(0,p.length-2e3)}function D(e){const t=`${(new Date).toISOString()} ${e}`;P(t),I(t+"\n")}function T(e=200){return p.slice(-e)}function B(e,t){D(`EXCEPTION ${e} ${O(t)}`);const n="string"==typeof(null==t?void 0:t.stack)?t.stack.split(/\r?\n/):[];for(const e of n.slice(1,13)){const t=e.trim();t&&(I(` ${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:L(e)}`}function R(e){const t="undefined"==typeof console?null:console,n=null==t?void 0:t[e];"function"==typeof n&&(t[e]=(...i)=>{try{!function(e,t){if(m>=300)return;const n=t.slice(0,4).map(M).join(" ");if(!n)return;const i=Date.now(),r=C.get(n);void 0!==r&&i-r<5e3||(C.set(n,i),m++,D(`CONSOLE ${e} ${n}`),m>=300&&D("CONSOLE 캡처 상한(300) 도달 — 이 세션에서는 더 적지 않는다"))}(e,i)}catch{}return n.apply(t,i)})}function M(e){var t;if("string"==typeof e)return $(e);if(e instanceof Error){const n="string"==typeof e.stack?null===(t=e.stack.split(/\r?\n/)[1])||void 0===t?void 0:t.trim():"";return $(`${e.name}: ${e.message}${n?" | "+n:""}`)}return $(L(e))}function $(e){const t=e.replace(/\r?\n/g," ");return t.length>400?t.slice(0,400)+"…":t}function L(e){var t;try{return null!==(t=JSON.stringify(e))&&void 0!==t?t:String(e)}catch{return String(e)}}t.pluginVersion=k,t.diag=D,t.diagOnce=function(e,t){h.has(e)||(h.add(e),D(t))},t.resetDiagOnce=function(e){h.delete(e)},t.diagMemory=function(){return p},t.recentDiag=T,t.startDiagSession=function(e={}){var n,i,r,o,s,a;E(t.DIAG_PATH,t.DIAG_PREV_PATH,A),g=-1;const l=["",`===== agentdeck session ${(new Date).toISOString()} =====`,`plugin=${k()} tabby=${null!==(n=e.tabby)&&void 0!==n?n:"?"} platform=${process.platform} arch=${process.arch} node=${null!==(r=null===(i=process.versions)||void 0===i?void 0:i.node)&&void 0!==r?r:"?"} electron=${null!==(s=null===(o=process.versions)||void 0===o?void 0:o.electron)&&void 0!==s?s:"?"} os=${JSON.stringify(null!==(a=e.osRelease)&&void 0!==a?a:d.release())}`];e.config&&l.push(`config=${L(e.config)}`),v=l.join("\n")+"\n";for(const e of l)P(e);I(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;B("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=>{B("unhandledrejection",null==e?void 0:e.reason)})),R("error"),R("warn")},t.diagException=B,t.diagCatch=function(e,t){if(w>=200)return;const n=O(t),i=`${e}|${n}`,r=Date.now(),o=y.get(i);void 0!==o&&r-o<6e4||(y.set(i,r),w++,D(`CATCH ${e} ${$(n)}`),w>=200&&D("CATCH 캡처 상한(200) 도달 — 이 세션에서는 더 적지 않는다"))},t.appendScreenLog=function(e){try{E(t.SCREEN_PATH,t.SCREEN_PREV_PATH,4194304),a.appendFileSync(t.SCREEN_PATH,e)}catch{}},t.collectDiagBundle=function(e={}){var n,i,r,o,c,u,A,p,h,g;const f=`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(),f);a.mkdirSync(v,{recursive:!0});const b=[],m=[`agentdeck 진단 묶음 ${(new Date).toISOString()}`,`plugin=${k()} tabby=${null!==(i=null===(n=e.stamp)||void 0===n?void 0:n.tabby)&&void 0!==i?i:"?"}`,`platform=${process.platform} arch=${process.arch} node=${null!==(o=null===(r=process.versions)||void 0===r?void 0:r.node)&&void 0!==o?o:"?"} electron=${null!==(u=null===(c=process.versions)||void 0===c?void 0:c.electron)&&void 0!==u?u:"?"}`,`os=${null!==(p=null===(A=e.stamp)||void 0===A?void 0:A.osRelease)&&void 0!==p?p:d.release()}`,`config=${L(null!==(g=null===(h=e.stamp)||void 0===h?void 0:h.config)&&void 0!==g?g:{})}`,`diag=${S(t.DIAG_PATH)}B prev=${S(t.DIAG_PREV_PATH)}B screen=${S(t.SCREEN_PATH)}B (포함=${e.includeScreen?"y":"n"})`,"","--- 이 세션의 최근 진단 (메모리) ---",...T(200),""].join("\n");a.writeFileSync(l.join(v,"report.txt"),m,"utf8"),b.push("report.txt");const C=[t.DIAG_PATH,t.DIAG_PREV_PATH];e.includeScreen&&C.push(t.SCREEN_PATH,t.SCREEN_PREV_PATH);for(const e of C)try{if(a.existsSync(e)){const t=l.basename(e).replace(/^\./,"");a.copyFileSync(e,l.join(v,t)),b.push(t)}}catch{}const w=v+".zip";try{a.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)&&a.existsSync(w)?{path:w,zipped:!0,files:b}:{path:v,zipped:!1,files:b}}},7617(e,t){function n(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=n;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}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(),n=this.host.windowEl.getBoundingClientRect();let i;i="right"===t?n.right-e.clientX:"left"===t?e.clientX-n.left:"bottom"===t?n.bottom-e.clientY:e.clientY-n.top,this.host.setSize(Math.round(i)),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,n=e.clientY-this.dragFrom.y;if(Math.hypot(t,n)<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 n=this.hoverSide;this.hideOverlay(),n&&n!==this.host.getDock()&&(this.host.setDock(n),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 n=document.createElement("div");n.className="ad-dock-preview",e.appendChild(n);for(const n of t.DOCK_SIDES){const t=document.createElement("div");t.className="ad-dock-zone ad-dock-zone-"+n,t.innerHTML='<span class="ad-dock-mark"></span>',e.appendChild(t),this.zones.set(n,t)}document.body.appendChild(e),this.overlay=e,this.preview=n,this.positionZones()}positionZones(){const e=this.host.windowEl.getBoundingClientRect(),n=e.left+e.width/2,i=e.top+e.height/2,r={left:[e.left+56,i],right:[e.right-56,i],top:[n,e.top+56],bottom:[n,e.bottom-56]};for(const e of t.DOCK_SIDES){const t=this.zones.get(e);if(!t)continue;const[n,i]=r[e];t.style.left=n+"px",t.style.top=i+"px"}}updateHover(e,t){const n=this.hitTest(e,t);if(n!==this.hoverSide){this.hoverSide=n;for(const[e,t]of this.zones)t.classList.toggle("active",e===n)}this.drawPreview(n)}hitTest(e,t){for(const[n,i]of this.zones){const r=i.getBoundingClientRect();if(e>=r.left&&e<=r.right&&t>=r.top&&t<=r.bottom)return n}const n=this.host.windowEl.getBoundingClientRect(),i=(e-n.left)/n.width,r=(t-n.top)/n.height;return i<.25&&i<=r&&i<=1-r?"left":i>.75&&1-i<=r&&1-i<=1-r?"right":r<.25?"top":r>.75?"bottom":null}drawPreview(e){if(!this.preview)return;if(!e)return void(this.preview.style.display="none");const t=this.host.windowEl.getBoundingClientRect(),i=n(e),r=this.host.getSize(e),o=i?Math.min(Math.max(r||320,180),.6*t.width):Math.min(Math.max(r||200,120),.6*t.height),s=this.preview.style;s.display="block",s.left=("right"===e?t.right-o:t.left)+"px",s.top=("bottom"===e?t.bottom-o:t.top)+"px",s.width=(i?o:t.width)+"px",s.height=(i?t.height:o)+"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,n){t.formatStageSummary=t.hasStaged=t.commitArgs=t.validateMessage=t.unstageFallbackArgs=t.unstageArgs=t.stageArgs=t.parseStatus=t.stageLabel=void 0;const i=n(7859),r="\0";function o(e,t){const n=e||" ",i=t||" ";if("?"===n||"?"===i)return"untracked";if(function(e,t){return"U"===e||"U"===t||"D"===e&&"D"===t||"A"===e&&"A"===t}(n,i))return"conflict";const r=" "!==n;return r&&" "!==i?"both":r?"staged":"unstaged"}function s(e){return e.startsWith("## ")}function a(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 n=e.slice(t).replace(/^ -> /,"");return{orig:(0,i.unquotePath)(e.slice(0,t)),next:(0,i.unquotePath)(n)}}}const t=e.indexOf(" -> ");return t<0?{orig:"",next:(0,i.unquotePath)(e)}:{orig:(0,i.unquotePath)(e.slice(0,t)),next:(0,i.unquotePath)(e.slice(t+4))}}function c(e,t,n){var i,r;const s=null!==(i=e[0])&&void 0!==i?i:" ",a=null!==(r=e[1])&&void 0!==r?r:" ",d={path:t,index:s,work:a,state:o(s,a)};return n&&(d.oldPath=n),d}function u(e){const t=new Set;for(const n of null!=e?e:[]){const e="string"==typeof n?n:"";!e||e.indexOf(r)>=0||t.add(e)}return Array.from(t)}function A(e){return"string"!=typeof e||""===e?{ok:!1,reason:"커밋 메시지가 비어 있다 — 무엇을 바꿨는지 한 줄 적어야 커밋한다"}:e.indexOf(r)>=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(r)>=0)return function(e){var t;const n=e.split(r),i=[];for(let e=0;e<n.length;e++){const r=n[e];if(!r||s(r))continue;const o=a(r);if(o&&"!!"!==o.code&&" "!==o.code){if(d(o.code)){const r=null!==(t=n[e+1])&&void 0!==t?t:"";e++,i.push(c(o.code,o.rest,r));continue}i.push(c(o.code,o.rest))}}return i}(t);const n=[];for(const e of t.replace(/\r\n?/g,"\n").split("\n")){if(!e.trim()||s(e))continue;const t=a(e);if(t&&"!!"!==t.code&&" "!==t.code){if(d(t.code)){const e=l(t.rest);n.push(c(t.code,e.next,e.orig));continue}n.push(c(t.code,(0,i.unquotePath)(t.rest)))}}return n},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=A,t.commitArgs=function(e,t){if(!A(e).ok)return[];const n=["commit"];return(null==t?void 0:t.amend)&&n.push("--amend"),n.push("-m",e),n},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,n=0,i=0,r=0;for(const o of null!=e?e:[])switch(null==o?void 0:o.state){case"staged":t++;break;case"unstaged":n++;break;case"both":t++,n++;break;case"untracked":i++;break;case"conflict":r++}const o=[];return t&&o.push(t+"개 스테이지"),n&&o.push(n+"개 미스테이지"),i&&o.push(i+"개 추적안됨"),r&&o.push(r+"개 충돌"),o.length?o.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 n=/^diff --git (.*)$/,i=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,r=/^Binary files (.*) and (.*) differ$/,o={n:"\n",t:"\t",r:"\r",'"':'"',"\\":"\\",b:"\b",f:"\f",v:"\v",a:""};function s(e){var t,n;let i="",r=[];const s=()=>{r.length&&(i+=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("")}}(r),r=[])};for(let a=0;a<e.length;a++){const d=e[a];if("\\"!==d){s(),i+=d;continue}const l=null!==(t=e[a+1])&&void 0!==t?t:"";if(l>="0"&&l<="7"){let t="";for(;t.length<3&&e[a+1]>="0"&&e[a+1]<="7";)t+=e[a+1],a++;r.push(parseInt(t,8));continue}s(),i+=null!==(n=o[l])&&void 0!==n?n:l,a++}return s(),i}function a(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 n=t.slice(e.end).trim(),i=l(n);return{old:d(e.value),next:d(i?i.value:n)}}}const n=(t.length-5)/2;if(Number.isInteger(n)&&n>0&&"a/"===t.slice(0,2)&&" b/"===t.slice(2+n,5+n)&&t.slice(2,2+n)===t.slice(5+n)){const e=t.slice(2,2+n);return{old:e,next:e}}const i=t.indexOf(" b/");return i>0?{old:d(t.slice(0,i)),next:d(t.slice(i+1))}:{old:d(t),next:d(t)}}function u(){return{path:"",status:"modified",binary:!1,added:0,removed:0,lines:[]}}t.unquotePath=a,t.parseUnifiedDiff=function(e){var t;const o=String(null!=e?e:"").replace(/\r\n?/g,"\n");if(!o.trim())return[];const s=[];let l=null,A=0,p=0,h=0,g=0;for(const e of o.split("\n")){if(null!==l&&(h>0||g>0)){const n=null!==(t=e[0])&&void 0!==t?t:"";if("\\"===n)continue;if("+"===n){l.added++,l.lines.push({kind:"add",text:e.slice(1),newNo:p++}),g--;continue}if("-"===n){l.removed++,l.lines.push({kind:"del",text:e.slice(1),oldNo:A++}),h--;continue}if(" "===n||""===e){l.lines.push({kind:"ctx",text:e.slice(1),oldNo:A++,newNo:p++}),h--,g--;continue}h=0,g=0}const o=n.exec(e);if(o){const e=c(o[1]);l=u(),l.path=e.next,e.old&&e.old!==e.next&&(l.oldPath=e.old),s.push(l),h=0,g=0;continue}if(!l)continue;const f=i.exec(e);if(f)A=Number(f[1]),p=Number(f[3]),h=void 0===f[2]?1:Number(f[2]),g=void 0===f[4]?1:Number(f[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=a(e.slice(12));else if(e.startsWith("rename to "))l.status="renamed",l.path=a(e.slice(10));else if(e.startsWith("--- ")){const t=a(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=a(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=r.exec(e);if(t){l.binary=!0;const e=a(t[1]),n=a(t[2]);"/dev/null"!==n&&(l.path=d(n)),"/dev/null"===e?l.status="added":"/dev/null"===n&&(l.status="deleted")}}}return s},t.formatStat=function(e){const t=null!=e?e:[];if(!t.length)return"변경 없음";let n=0,i=0;for(const e of t)n+=e.added,i+=e.removed;return t.length+"개 파일 · +"+n+" -"+i},t.statusLabel=function(e){switch(e.status){case"added":return"신규";case"deleted":return"삭제";case"renamed":return"이름변경";default:return"수정"}};const A=/^[A-Za-z]:/;function p(e){return String(null!=e?e:"").replace(/\\/g,"/")}function h(e){return e.length>1?e.replace(/\/+$/,""):e}function g(e,t){const n=p(t);if(!n)return"";const i=h(p(e));return!i||n.startsWith("/")||A.test(n)?n:i+"/"+n}function f(e){const t=h(p(e));return A.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=g,t.refPathFrom=function(e,t){const n=p(e);if(!n)return"";const i=h(p(t));if(!i)return n;const r=A.test(n)||A.test(i),o=r?n.toLowerCase():n,s=r?i.toLowerCase():i;return o===s?n:o.startsWith(s+"/")?n.slice(i.length+1):n},t.formatLineRef=function(e,t,n){const i=String(null!=e?e:"");if(!i)return"";const r=Number(t),o=Number(null!=n?n:t),s=Number.isFinite(r)&&r>0,a=Number.isFinite(o)&&o>0;let d=i;if(s||a){const e=Math.floor(Math.min(s?r:o,a?o:r)),t=Math.floor(Math.max(s?r:o,a?o:r));d=i+":"+e+(t>e?"-"+t:"")}return/\s/.test(d)?'"'+d+'"':d},t.filterTouched=function(e,t,n,i){const r=null!=e?e:[];if(!i||!i.length)return[...r];const o=new Set(i.map(e=>f(e)));return r.filter(e=>o.has(f(g(n,t(e)))))},t.parseUntracked=function(e){const t=[];for(const n of String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n")){if(!n.startsWith("?? "))continue;const e=a(n.slice(3));e&&t.push(e)}return t}},6879(e,t){function n(e){if("string"!=typeof e)return null;let t=e.trim();if(!t)return null;t=t.replace(/\\/g,"/");const n=t.startsWith("//");for(t=t.replace(/\/{2,}/g,"/"),n&&(t="/"+t);t.length>1&&t.endsWith("/")&&!/^[A-Za-z]:\/$/.test(t);)t=t.slice(0,-1);return t}function i(e){return(null!=e?e:"").toLowerCase()}function r(e){var t;const n=/^\/\/([^/]+)\/([^/]+)(.*)$/.exec(e);if(n)return{prefix:"//"+n[1]+"/"+n[2],abs:!0,segs:o(n[3])};const i=/^([A-Za-z]:)(\/.*)?$/.exec(e);return i?{prefix:i[1],abs:!0,segs:o(null!==(t=i[2])&&void 0!==t?t:"")}:{prefix:"",abs:e.startsWith("/"),segs:o(e)}}function o(e){return e.split("/").filter(e=>e.length>0)}function s(e,t){return e.length===t.length&&e.every((e,n)=>i(e)===i(t[n]))}function a(e,t){const o=n(e);if(!o)return null;const a=t?n(t(o)):null;if(!a)return o;const d=r(o),l=r(a);return i(l.prefix)===i(d.prefix)&&(c=d.segs,u=l.segs,c.length>=u.length&&s(c.slice(0,u.length),u))?a:o;var c,u}function d(e,o){const a=n(e);if(!a)return t.UNGROUPED_LABEL;const d=r(a).segs;if(!d.length)return a;const l=[];for(const e of o){const t=n(e);t&&i(t)!==i(a)&&l.push(r(t).segs)}for(let e=1;e<=d.length;e++){const t=d.slice(-e);if(!l.some(n=>n.length>=e&&s(n.slice(-e),t)))return t.join("/")}return a}function l(e,t){const n=e.label.toLowerCase(),r=t.label.toLowerCase();if(n!==r)return n<r?-1:1;const o=i(e.key),s=i(t.key);return o===s?0:o<s?-1:1}function c(e){return i(null!=e?e:t.QC)}function u(e,t){if(!Array.isArray(t))return!1;const n=c(e);return t.some(e=>null!=e&&i(String(e))===n)}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=n,t.foldGroupKey=i,t.groupKeyOf=a,t.parentPath=function(e){const t=n(e);if(!t)return null;const i=r(t);return i.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?"/":"")}(i,i.segs.slice(0,-1)):null},t.groupTabs=function(e,n,r){const o=[],s=new Map,c=[];for(const t of e){const e=a(n(t),r);if(!e){c.push(t);continue}const d=i(e);let l=s.get(d);l||(l={key:e,tabs:[]},s.set(d,l),o.push(d)),l.tabs.push(t)}const u=o.map(e=>s.get(e).key),A=o.map(e=>{const t=s.get(e);return{key:t.key,label:d(t.key,u),tabs:t.tabs}});return A.sort(l),c.length&&A.push({key:null,label:t.UNGROUPED_LABEL,tabs:c}),A},t.QC="(ungrouped)",t.collapseIdOf=c,t.isStoredCollapsed=u,t.resolveGroupCollapseFor=function(e,t,n){return function(e){if(!e.stored)return{collapsed:!1,reason:"open"};const t=e.matches,n="number"==typeof t&&isFinite(t)&&t>0?Math.floor(t):0;return e.filtering&&n>0?{collapsed:!1,reason:"filter-open"}:{collapsed:!0,reason:"stored"}}({stored:u(e.key,t),filtering:n,matches:e.tabs.length})}},9771(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckHotkeyProvider=void 0;const r=n(860),o=n(7650);let s=class extends o.HotkeyProvider{async provide(){return[{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 복귀)"}]}};s=i([(0,r.Injectable)()],s),t.AgentDeckHotkeyProvider=s},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 n=e._compositionPosition;return n&&"number"==typeof n.start&&"number"==typeof n.end&&n.end<=n.start&&"number"==typeof t&&isFinite(t)&&t>n.start&&(n.end=t),e.keydown({keyCode:0}),!0}catch{return!1}}},8156(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t},a=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||i(t,e,n)},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=n(860),c=n(4358),u=n(7182),A=s(n(7650)),p=n(3700),h=n(8349),g=n(7028),f=n(9771),v=n(7009),b=n(4494),m=n(3496),C=n(7110),w=n(4883),y=n(9980),x=n(9610),k=n(1451),S=n(7418);n(3396),a(n(4300),t);let E=class{constructor(e,t,n,i,r,o){e.init(),t.init(),n.init(),i.init(),r.init(),o.init()}};E=o([(0,l.NgModule)({imports:[c.CommonModule,u.FormsModule,A.default],providers:[{provide:A.ConfigProvider,useClass:g.AgentDeckConfigProvider,multi:!0},{provide:A.HotkeyProvider,useClass:f.AgentDeckHotkeyProvider,multi:!0},{provide:h.TerminalDecorator,useClass:v.AgentDeckDecorator,multi:!0},{provide:p.SettingsTabProvider,useClass:k.AgentDeckSettingsTabProvider,multi:!0}],declarations:[S.AgentDeckSettingsTabComponent]}),d("design:paramtypes",[b.AgentDeckService,m.AgentDeckProfileService,C.WorkNotifyService,w.AgentDeckAlertService,y.AgentDeckRecoveryService,x.AgentDeckUpdateService])],E),t.default=E},8347(e,t){function n(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function i(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 r(e,t){const r=[];let o=e.replace(/(`+)([\s\S]+?)\1(?!`)/g,(e,t,i)=>(r.push("<code>"+n(String(i).replace(/^ | $/g,""))+"</code>"),"\0"+(r.length-1)+"\0"));return o=n(o),o=o.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,n,r)=>{const o=t.resolveImage?t.resolveImage(String(r)):i(String(r));return o?'<img src="'+o+'" alt="'+n+'">':'<span class="ad-md-noimg">🖼 '+(n||r)+"</span>"}),o=o.replace(/\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,t,n)=>{const r=i(String(n));return r?'<a href="'+r+'" data-ad-link="'+r+'">'+t+"</a>":String(t)}),o=o.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),o=o.replace(/__([^_]+)__/g,"<strong>$1</strong>"),o=o.replace(/(^|[\s(\[])\*([^*\n]+)\*/g,"$1<em>$2</em>"),o=o.replace(/(^|[\s(\[])_([^_\n]+)_/g,"$1<em>$2</em>"),o=o.replace(/~~([^~]+)~~/g,"<del>$1</del>"),o.replace(/\u0000(\d+)\u0000/g,(e,t)=>{var n;return null!==(n=r[Number(t)])&&void 0!==n?n:""})}function o(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=n,t.renderMarkdown=function(e,t={}){var i;const a=String(null!=e?e:"").replace(/\r\n?/g,"\n").split("\n"),d=[],l=[];let c=[],u=null;const A=(e=-1)=>{for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>")},p=()=>{c.length&&(d.push("<p>"+r(c.join("\n"),t).replace(/\n/g,"<br>")+"</p>"),c=[])},h=()=>{p(),A()};for(let e=0;e<a.length;e++){const g=a[e];if(u){if(new RegExp("^\\s*"+u.mark+"\\s*$").test(g)){const e=u.lang?' class="ad-md-lang-'+u.lang.replace(/[^\w-]/g,"")+'"':"";d.push("<pre"+e+"><code>"+n(u.body.join("\n"))+"</code></pre>"),u=null}else u.body.push(g);continue}const f=/^\s*(```+|~~~+)\s*([\w+#.-]*)/.exec(g);if(f){h(),u={mark:f[1].slice(0,3),lang:f[2]||"",body:[]};continue}if(!g.trim()){p();continue}const v=/^(#{1,6})\s+(.*)$/.exec(g);if(v){h();const e=v[1].length;d.push("<h"+e+">"+r(v[2].replace(/\s+#+\s*$/,""),t)+"</h"+e+">");continue}if(/^\s*([-*_])\s*(\1\s*){2,}$/.test(g)){h(),d.push("<hr>");continue}if(g.includes("|")&&e+1<a.length&&o(a[e+1])){h();const n=s(g),i=[];let o=e+2;for(;o<a.length&&a[o].includes("|")&&a[o].trim();o++)i.push(s(a[o]));e=o-1,d.push("<table><thead><tr>"+n.map(e=>"<th>"+r(e,t)+"</th>").join("")+"</tr></thead><tbody>"+i.map(e=>"<tr>"+e.map(e=>"<td>"+r(e,t)+"</td>").join("")+"</tr>").join("")+"</tbody></table>");continue}const b=/^\s*>\s?(.*)$/.exec(g);if(b){h();const n=[b[1]];let i=e+1;for(;i<a.length;i++){const e=/^\s*>\s?(.*)$/.exec(a[i]);if(!e)break;n.push(e[1])}e=i-1,d.push("<blockquote>"+r(n.join("\n"),t).replace(/\n/g,"<br>")+"</blockquote>");continue}const m=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/.exec(g);if(m){p();const e=m[1].replace(/\t/g," ").length,n=/\d/.test(m[2]);for(;l.length&&l[l.length-1].indent>e;)d.push(l.pop().ordered?"</ol>":"</ul>");const i=l[l.length-1];!i||i.indent<e?(l.push({ordered:n,indent:e}),d.push(n?"<ol>":"<ul>")):i.ordered!==n&&(d.push(l.pop().ordered?"</ol>":"</ul>"),l.push({ordered:n,indent:e}),d.push(n?"<ol>":"<ul>"));const o=/^\[([ xX])\]\s+(.*)$/.exec(m[3]);if(o){const e="x"===o[1].toLowerCase();d.push('<li class="ad-md-task"><span class="ad-md-check">'+(e?"☑":"☐")+"</span> "+r(o[2],t)+"</li>")}else d.push("<li>"+r(m[3],t)+"</li>");continue}l.length&&/^\s{2,}/.test(g)&&(null===(i=d[d.length-1])||void 0===i?void 0:i.startsWith("<li"))?d[d.length-1]=d[d.length-1].replace(/<\/li>$/,"<br>"+r(g.trim(),t)+"</li>"):(A(),c.push(g))}return u&&d.push("<pre><code>"+n(u.body.join("\n"))+"</code></pre>"),h(),d.join("\n")}},9137(e,t){t.stepNavIndex=t.pickCloseTarget=t.navRowsOf=void 0,t.navRowsOf=function(e){const t=[];for(const n of e)if(n.head&&t.push({kind:"head",key:n.key}),!n.collapsed)for(const e of n.tabs)t.push({kind:"tab",tab:e});return t},t.pickCloseTarget=function(e){const{inList:t,focus:n,active:i,tabs:r}=e;return t?n&&"tab"===n.kind&&r.includes(n.tab)?n.tab:null:i&&r.includes(i)?i:null},t.stepNavIndex=function(e,t,n,i){if(!Number.isInteger(e)||e<=0)return-1;if(!Number.isInteger(t)||t<0||t>=e)return n<0?e-1:0;if(!Number.isInteger(n)||0===n)return t;const r=t+n;return r>=0&&r<e?r:i?(r%e+e)%e:t}},7110(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t},a=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=n(860),l=n(7650),c=s(n(9896)),u=s(n(9278)),A=s(n(857)),p=s(n(6928)),h=n(3193),g=n(6021),f=n(1786),v=n(5929),b=n(7282),m=n(9888),C=n(7797),w=n(7507);function y(e){const t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t}초`;const n=Math.floor(t/60);if(n<60)return`${n}분`;const i=Math.floor(n/60);return i<24?i+"시간"+(n%60?` ${n%60}분`:""):Math.floor(i/24)+"일"+(i%24?` ${i%24}시간`:"")}let x=class{constructor(e,t,n,i){this.app=e,this.config=t,this.status=n,this.platform=i,this.root=p.join(process.env.LOCALAPPDATA||p.join(A.homedir(),"AppData","Local"),"tabby-agentdeck"),this.dir=p.join(this.root,"status"),this.portFile=p.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.touched=new WeakMap,this.liveAgents=new WeakMap,this.agentHookSeen=new WeakSet,this.watchedSplits=new WeakSet,this.pollCount=0,this.lastBindLog=new Map,this.scans=new Map,this.projectsDir=p.join(A.homedir(),".claude","projects")}async promptHooksOnce(){var e;const t=this.config.store.agentDeck;if(t.hookPromptDismissed||!(0,f.hooksSupported)())return;try{if((0,f.hooksInstalled)())return}catch{return}const n=await this.platform.showMessageBox({type:"warning",message:"AgentDeck — Claude Code 상태 통보를 연결할까요?",detail:['연결하면 에이전트가 "지시를 받았다 / 승인을 기다린다 / 끝났다" 를 사이드바에 직접 알려줍니다.',"연결하지 않아도 동작은 하지만, 화면에 그려진 글자를 보고 추측하는 방식이라 상태가 부정확할 수 있습니다.","",`설치 위치: ${(0,f.claudeSettingsPath)()}`,"기존 훅은 건드리지 않고, 쓰기 전에 같은 폴더에 백업을 남깁니다. 설정 창에서 언제든 제거할 수 있습니다."].join("\n"),buttons:["연결한다","나중에","다시 묻지 않기"],defaultId:0,cancelId:1});if(0!==n.response)2===n.response&&(t.hookPromptDismissed=!0,this.config.save());else try{(0,f.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:["확인"]})}}init(){var e;const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.tabIds=()=>[...this.tabIds].map(([e,t])=>{var n;return{title:null!==(n=e.title)&&void 0!==n?n:"",ids:t}}),t.__agentdeck.hookInfo=()=>this.app.tabs.map((e,t)=>{var n,i,r,o,s,a;return{index:t,title:String(null!==(n=e.title)&&void 0!==n?n:"").slice(0,40),sessionId:null!==(i=this.tabSession.get(e))&&void 0!==i?i:null,cwd:null!==(r=this.hookCwd.get(e))&&void 0!==r?r:null,touched:null!==(o=this.touched.get(e))&&void 0!==o?o:[],agentHook:this.agentHookSeen.has(e),agents:[...null!==(a=null===(s=this.liveAgents.get(e))||void 0===s?void 0:s.values())&&void 0!==a?a:[]]}}),t.__agentdeck.subagents=()=>({enabled:this.subagentEnabled,projectsDir:this.projectsDir,tabs:[...this.tabSession].map(([e,t])=>{var n,i,r,o,s,a,d,l,c,u,A;const p=this.scans.get(t),h=null==p?void 0:p.summary;return{index:this.app.tabs.indexOf(e),title:String(null!==(n=e.title)&&void 0!==n?n:"").slice(0,40),tabId:null!==(r=null===(i=this.tabIds.get(e))||void 0===i?void 0:i[0])&&void 0!==r?r:null,sessionId:t,transcript:null!==(o=null==p?void 0:p.path)&&void 0!==o?o:null,lastSize:null!==(s=null==p?void 0:p.lastSize)&&void 0!==s?s:0,lines:null!==(a=null==p?void 0:p.state.lines)&&void 0!==a?a:0,skipped:null!==(d=null==p?void 0:p.state.skipped)&&void 0!==d?d:0,running:null!==(l=null==h?void 0:h.running)&&void 0!==l?l:0,calls:null!==(c=null==h?void 0:h.calls)&&void 0!==c?c:0,done:null!==(u=null==h?void 0:h.done)&&void 0!==u?u:0,items:(null!==(A=null==h?void 0:h.items)&&void 0!==A?A:[]).map(e=>({id:e.id,description:e.description,subagentType:e.subagentType,startedAt:e.startedAt})),tooltip:h?this.subagentTooltip(h):""}})}),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=>{this.tabPids.delete(e),this.tabIds.delete(e);const t=this.tabSession.get(e);t&&(this.tabSession.delete(e),this.sessionTab.delete(t),this.scans.delete(t))})}diag(e){(0,C.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 n=[];for(const i of this.panesOf(t)){const t=null===(e=null==i?void 0:i.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&&n.push(e)}catch{}}const i=this.tabPids.get(t);i&&i.join(",")===n.join(",")||(this.tabPids.set(t,n),this.diag(`pid-map tab=${this.tabName(t)} pids=[${n.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 n;if(!e||e.session||!this.isLocalProfile(e.profile)||e.profile.options.restoreFromPTYID)return;const i=null!==(n=e.profile.options.env)&&void 0!==n?n:{},r="string"==typeof i[m.TAB_ENV]?i[m.TAB_ENV]:"";if(r&&!this.idTakenElsewhere(r,e))return;const o=(0,m.newTabId)();e.profile={...e.profile,options:{...e.profile.options,env:{...i,[m.TAB_ENV]:o}}},void 0!==e.sessionOptions&&(e.sessionOptions=e.profile.options),this.diag(`tabid stamp tab=${this.tabName(t)} id=${o}${r?` (was ${r}: duplicate)`:""}`)}stampRecoveryState(e,t){var n;if(Array.isArray(e.children)){for(const n of e.children)n&&"object"==typeof n&&this.stampRecoveryState(n,t);return}const i=e.profile;if(!this.isLocalProfile(i)||i.options.restoreFromPTYID)return;const r=(0,m.newTabId)();e.profile={...i,options:{...i.options,env:{...null!==(n=i.options.env)&&void 0!==n?n:{},[m.TAB_ENV]:r}}},this.diag(`tabid stamp tab=${this.tabName(t)} id=${r} (recovery token)`)}idTakenElsewhere(e,t){var n,i,r;for(const o of this.app.tabs)for(const s of this.panesOf(o))if(s!==t&&(null===(r=null===(i=null===(n=null==s?void 0:s.profile)||void 0===n?void 0:n.options)||void 0===i?void 0:i.env)||void 0===r?void 0:r[m.TAB_ENV])===e)return!0;return!1}refreshTabIds(){var e,t,n;const i=new Map,r=new Set,o=new Map;for(const s of[...this.app.tabs]){const a=[];for(const o of this.panesOf(s)){const d=null===(n=null===(t=null===(e=null==o?void 0:o.profile)||void 0===e?void 0:e.options)||void 0===t?void 0:t.env)||void 0===n?void 0:n[m.TAB_ENV];if("string"!=typeof d||!d||a.includes(d))continue;a.push(d);const l=i.get(d);l&&l!==s?r.add(d):i.set(d,s)}o.set(s,a)}for(const e of[...this.tabIds.keys()])o.has(e)||this.tabIds.delete(e);for(const[e,t]of o){const n=t.filter(e=>!r.has(e)),i=this.tabIds.get(e);if(!i||i.join(",")!==n.join(",")){this.tabIds.set(e,n);const i=t.filter(e=>r.has(e));this.diag(`tabid-map tab=${this.tabName(e)} ids=[${n.join(",")}]`+(i.length?` dup-dropped=[${i.join(",")}]`:""))}}}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",e=>{let n;for(t+=e;(n=t.indexOf("\n"))>=0;){const e=t.slice(0,n);t=t.slice(n+1),this.accept(e)}}),e.on("end",()=>this.accept(t)),e.on("error",()=>{})});let t=!1;e.on("error",n=>{if(!t)return t=!0,(0,C.diagCatch)("notify channel listen (고정 포트 실패, 임의 포트로 재시도)",n),void e.listen(0,"127.0.0.1");(0,C.diagCatch)("notify channel listen 최종 실패",n),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")}catch(e){(0,C.diagCatch)("notify port 파일 쓰기",e)}}),e.listen(this.config.store.agentDeck.notifyPort||0,"127.0.0.1")}accept(e){const t=e.trim();if(t)try{this.apply(JSON.parse(t))}catch(e){(0,C.diagCatch)("notify 보고 파싱",e)}}poll(){let e;this.refreshTabIds(),++this.pollCount%5==0&&this.refreshPids(),this.pollCount%5==2&&this.scanSubagents();try{e=c.readdirSync(this.dir)}catch{return}for(const t of e){if(!t.endsWith(".json"))continue;const e=p.join(this.dir,t);let n;try{n=JSON.parse(c.readFileSync(e,"utf8"))}catch{continue}if(n.ts<this.startedAt&&!this.sessionTab.has(n.sessionId))try{c.unlinkSync(e)}catch{}else this.apply(n)}}apply(e){var t,n,i,r,o,s;if(!e||!e.sessionId)return;const a=!!e.status,d="string"==typeof e.label&&!!e.label.trim(),l="string"==typeof e.file&&!!e.file.trim(),c=void 0!==e.agents&&null!==e.agents;if(!(a||d||l||c))return;if(this.applied.get(e.sessionId)===e.ts)return;const u=this.resolveTab(e.sessionId,e.tabId,e.pids);if(!u)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);const A="string"==typeof e.cwd?e.cwd.trim():"";if(A&&this.hookCwd.set(u,A),c){const t=Array.isArray(e.agents)?e.agents:[e.agents],s=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 r=Number(null==e?void 0:e.at);s.set(t,{id:t,type:String(null!==(i=null==e?void 0:e.type)&&void 0!==i?i:"").trim(),at:Number.isFinite(r)&&r>0?r:Date.now()})}const a=null!==(o=null===(r=this.liveAgents.get(u))||void 0===r?void 0:r.size)&&void 0!==o?o:0;this.liveAgents.set(u,s),this.agentHookSeen.add(u),a!==s.size&&this.diag(`agents sid=${e.sessionId.slice(0,8)} ${a} -> ${s.size} [${[...s.values()].map(e=>e.type||"?").join(",")}]`)}if(l){const t=e.file.trim(),n=null!==(s=this.touched.get(u))&&void 0!==s?s:[],i=[t,...n.filter(e=>e!==t)];this.touched.set(u,i.length>400?i.slice(0,400):i)}const p=(e.label||"").trim();if(a){const t=(0,b.shortenReason)("string"==typeof e.reason?e.reason:"");this.status.setManual(u,e.status,d?p:void 0,t)}else this.status.setLabel(u,p)}resolveTab(e,t,n){const i=this.sessionTab.get(e),r=i&&this.app.tabs.includes(i)?i:null,o=(0,m.pickTabByTabId)(t,this.tabIds);if(o)return o!==r&&this.bind(e,o,r?"tabid-move":"tabid"),o;const s=(0,v.pickTabByPids)(n,this.tabPids);if("pid"===s.mode&&s.tab)return s.tab!==r&&this.bind(e,s.tab,r?"pid-move":"pid"),s.tab;if(r)return r;if(t){const n=[...this.tabIds.entries()].map(([e,t])=>`${this.tabName(e)}:[${t.join(",")}]`).join(" ");return this.bindLog(e,`unbound (tabid-miss) tabId=${t} tabs=${n}`),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!=n?n:[]).join(",")}] tabs=${t}`),null}const a=this.app.activeTab;if(!a)return null;const d=this.tabSession.get(a);return d&&d!==e?(this.bindLog(e,`unbound (legacy: active tab owned by ${d.slice(0,8)})`),null):(this.bind(e,a,"legacy"),a)}bind(e,t,n){const i=this.tabSession.get(t);i&&i!==e&&(this.sessionTab.delete(i),this.touched.delete(t),this.liveAgents.delete(t));const r=this.sessionTab.get(e);r&&r!==t&&this.tabSession.get(r)===e&&this.tabSession.delete(r),this.sessionTab.set(e,t),this.tabSession.set(t,e),this.lastBindLog.delete(e),this.diag(`bind sid=${e.slice(0,8)} via=${n} tab=${this.tabName(t)}`+(i&&i!==e?` (took over from ${i.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}touchedOf(e){return e&&this.touched.get(e)||[]}subagentsOf(e){var t;if(!e||!this.subagentEnabled)return null;const n=this.tabSession.get(e);if(this.agentHookSeen.has(e)){const i=(0,w.summarizeLiveAgents)(null===(t=this.liveAgents.get(e))||void 0===t?void 0:t.values());if(i.running<=0)return null;const r=(0,w.formatLiveAgentTooltip)(i);return{sessionId:null!=n?n:"",running:i.running,items:[],tooltip:i.oldestAt?`${r}\n가장 오래된 것: ${y(Date.now()-i.oldestAt)} 전 시작`:r}}const i=n?this.scans.get(n):null;return!i||i.summary.running<=0?null:{sessionId:i.sessionId,running:i.summary.running,items:i.summary.items,tooltip:this.subagentTooltip(i.summary)}}subagentTooltip(e){const t=(0,w.formatSubagentTooltip)(e);if(!t)return"";let n=0;for(const t of e.items){const e=t.startedAt?Date.parse(t.startedAt):NaN;Number.isFinite(e)&&(!n||e<n)&&(n=e)}return n?`${t}\n가장 오래된 것: ${y(Date.now()-n)} 전 시작 (종료 알림을 못 받은 것이면 이 값만 계속 늘어난다)`: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 n,i=this.scans.get(e);if(i||(i={sessionId:e,state:(0,w.createSubagentState)(),decoder:new h.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0,summary:(0,w.summarizeSubagents)(null)},this.scans.set(e,i)),!i.busy)if(i.path){try{n=c.statSync(i.path).size}catch{(i.lastSize>0||i.summary.running>0)&&this.diag(`subagent gone sid=${e.slice(0,8)} running=${i.summary.running} -> 0`),this.resetScan(i),i.path=null,i.lookupAt=0;continue}n<i.lastSize&&(this.diag(`subagent reset sid=${e.slice(0,8)} size=${n} < last=${i.lastSize}`),this.resetScan(i)),n!==i.lastSize&&this.readGrowth(i,n)}else this.findTranscript(i)}}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,w.createSubagentState)(),e.decoder=new h.StringDecoder("utf8"),e.lastSize=0,e.summary=(0,w.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 n of t){if(!n.isDirectory())continue;const t=p.join(this.projectsDir,n.name);let i;try{i=await c.promises.readdir(t)}catch{continue}const r=i.find(t=>(0,w.matchesSessionTranscript)(t,e.sessionId));if(r)return e.path=p.join(t,r),void this.diag(`subagent transcript sid=${e.sessionId.slice(0,8)} file=${e.path}`)}}catch{}finally{e.busy=!1}}}readGrowth(e,t){const n=e.path;if(!n)return;const i=e.lastSize,r=e.sessionId.slice(0,8);let o;e.busy=!0;try{o=c.createReadStream(n,{start:i,end:t-1})}catch(t){return e.busy=!1,void(0,C.diagCatch)(`subagent 스트림 생성 sid=${r}`,t)}let s=!1;const a=n=>{if(s)return;if(s=!0,e.busy=!1,n)return void(0,C.diagCatch)(`subagent 대화기록 읽기 sid=${r}`,n);e.lastSize=t;const o=e.summary.running;e.summary=(0,w.summarizeSubagents)(e.state),0===i?this.diag(`subagent first-scan sid=${r} bytes=${t} lines=${e.state.lines} calls=${e.summary.calls} done=${e.summary.done} running=${e.summary.running}`):e.summary.running!==o&&this.diag(`subagent sid=${r} running=${o} -> ${e.summary.running} (+${t-i}B)`)};o.on("data",t=>(0,w.feedChunk)(e.state,e.decoder.write(t))),o.on("end",()=>a()),o.on("error",e=>a(e))}};x=o([(0,d.Injectable)({providedIn:"root"}),a("design:paramtypes",[l.AppService,l.ConfigService,g.WorkStatusService,l.PlatformService])],x),t.WorkNotifyService=x},7144(e,t){function n(e){const n=t.Q.indexOf(e);return n<0?t.Q.length:n}t.planEdgeScroll=t.planTabMove=t.sortTabsByStatus=t.countByStatus=t.statusRank=t.Q=void 0,t.Q=["waiting","error","limited","running","done","idle"],t.statusRank=n,t.countByStatus=function(e,n){var i,r;const o=new Map;for(const t of e){const e=n(t);o.set(e,(null!==(i=o.get(e))&&void 0!==i?i:0)+1)}const s=[];for(const e of t.Q){const t=null!==(r=o.get(e))&&void 0!==r?r:0;t>0&&s.push({status:e,count:t})}return s},t.sortTabsByStatus=function(e,t){return e.map((e,i)=>({tab:e,index:i,rank:n(t(e))})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.tab)},t.planTabMove=function(e,t,n,i){if(!Number.isInteger(e)||e<2)return null;if(!Number.isInteger(t)||!Number.isInteger(n))return null;if(t<0||t>=e||n<0||n>=e||t===n)return null;const r=[];for(let t=0;t<e;t++)r.push(t);r.splice(t,1);const o=r.indexOf(n)+("after"===i?1:0);r.splice(o,0,t);for(let t=0;t<e;t++)if(r[t]!==t)return r;return null},t.planEdgeScroll=function(e){const{pos:t,near:n,far:i,cur:r,maxScroll:o,bandPx:s,minPps:a,maxPps:d}=e;if(t<n||t>i)return 0;const l=Math.min(s,(i-n)/3);if(l<4)return 0;let c=0,u=0;if(t<=n+l)c=-1,u=(n+l-t)/l;else{if(!(t>=i-l))return 0;c=1,u=(t-(i-l))/l}return(c<0?r:o-r)<=.5?0:c*(a+(d-a)*Math.min(1,Math.max(0,u)))}},3496(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},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.AgentDeckProfileService=t.ROOT_PROFILE_ID=void 0;const o=n(860),s=n(7650);t.ROOT_PROFILE_ID="agentdeck:root";let a=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>this.ensureProfile())}ensureProfile(){const e=this.config.store.agentDeck;if(!e.rootProfile||!e.rootProfileCwd)return;const n=this.config.store.profiles||[],i=n.find(e=>e.id===t.ROOT_PROFILE_ID),r={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(i)if(i.options){let e=!1;i.options.cwd||(i.options.cwd=r.options.cwd,e=!0),i.options.args&&0!==i.options.args.length||(i.options.args=[...r.options.args],e=!0),i.options.env=i.options.env||{};for(const[t,n]of Object.entries(r.options.env))void 0===i.options.env[t]&&(i.options.env[t]=n,e=!0);e&&this.config.save()}else i.options=r.options,this.config.save();else n.push(r),this.config.store.profiles=n,e.rootProfileClaimed||(this.config.store.terminal.profile=t.ROOT_PROFILE_ID,e.rootProfileClaimed=!0),this.config.save()}};a=i([(0,o.Injectable)({providedIn:"root"}),r("design:paramtypes",[s.AppService,s.ConfigService])],a),t.AgentDeckProfileService=a},4086(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(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=o(n(9896)),a=o(n(857)),d=n(6879);function l(){try{return(0,d.normalizeCwd)(a.homedir())}catch{return null}}function c(e,t){let n=(0,d.normalizeCwd)(e);const i=(0,d.normalizeCwd)(t),r=[];for(let e=0;n&&e<64&&(!i||(0,d.foldGroupKey)(n)!==(0,d.foldGroupKey)(i));e++){r.push(n);const e=(0,d.parentPath)(n);if(!e||(0,d.foldGroupKey)(e)===(0,d.foldGroupKey)(n))break;n=e}return r}t.PROJECT_MARKERS=[".git",".hg",".svn",".p4config"],t.homeBoundary=l,t.walkUp=c,t.findProjectRoot=function(e,t,n){for(const i of c(e,n))if(t(i))return i;return null};const u=new Map,A=new Set;async function p(e){for(const n of t.PROJECT_MARKERS)try{return await s.promises.access(e+"/"+n),!0}catch{}return!1}t.projectRootOf=function(e,t){const n=(0,d.normalizeCwd)(e);if(!n)return null;const i=(0,d.foldGroupKey)(n),r=u.get(i);return void 0!==r?r:(A.has(i)||(A.add(i),async function(e){for(const t of c(e,l()))if(await p(t))return t;return null}(n).then(e=>{u.set(i,e),A.delete(i),e&&(null==t||t())}).catch(()=>{u.set(i,null),A.delete(i)})),null)},t.clearProjectRootCache=function(){u.clear(),A.clear()},t.projectRootCacheSnapshot=function(){return[...u.entries()].map(([e,t])=>({cwd:e,root:t}))}},9660(e,t){function n(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function i(e){return e.join("").replace(/[\\\]^-]/g,"\\$&")}function r(e){return[...e].sort((e,t)=>t.length-e.length).map(n).join("|")}function o(e,t){if(!Array.isArray(e))return t;const n=e.filter(e=>"string"==typeof e&&e.length>0);return n.length?n:t}t.extractPrompt=t.yY=t.D0=void 0,t.D0={heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"],ruleChars:["─","━","═","-"]},t.yY=40;const s=new Map;function a(e,t){return e.replace(t.stripLead,"").replace(t.stripTail,"").trim()}t.extractPrompt=function(e,n){const d=function(e){const n=o(e?e.heads:void 0,t.D0.heads),a=o(e?e.choiceWords:void 0,t.D0.choiceWords),d=o(e?e.ruleChars:void 0,t.D0.ruleChars),l=JSON.stringify([n,a,d]),c=s.get(l);if(c)return c;const u=r(n),A=i(d),p=new Set(n.join("")),h=i([..."│┃|╭╰┌└─╮╯┐┘"].filter(e=>!p.has(e))),g=i([..."│┃|╮╯┐┘─"].filter(e=>!p.has(e))),f=i([..."│┃|"].filter(e=>!p.has(e))),v={head:new RegExp(`^(?:${u})\\s*`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${r(a)})(?!\\w))`,"i"),bottom:new RegExp(`^[\\s${f}]*[${A}]{3,}[\\s${f}]*$|[╰└]`),stripLead:new RegExp(`^[\\s${h}]+`),stripTail:new RegExp(`[\\s${g}]+$`)};return s.set(l,v),v}(n);let l=-1;for(let t=e.length-1;t>=0;t--){const n=a(e[t],d);if(d.head.test(n)){if(d.choice.test(n))return"";l=t;break}}if(l<0)return"";const c=[a(e[l],d).replace(d.head,"")];for(let t=l+1;t<e.length&&!d.bottom.test(e[t]);t++){const n=a(e[t],d);n&&c.push(n)}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 n(e){const t=(e||"").replace(/\s+/g," ").trim();if(!t)return"";if(/^[^\w가-힣]*\d+\.\s/.test(t))return"";const n=/permission to use ([\w-]+)/i.exec(t);if(n)return n[1]+" 권한";const i=/Allow execution of\s*\[?([\w.:-]+)/i.exec(t);if(i)return i[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=n,t.reasonFromScreen=function(e){return n((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,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},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.AgentDeckRecoveryService=void 0;const o=n(860),s=n(7650);let a=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())}};a=i([(0,o.Injectable)({providedIn:"root"}),r("design:paramtypes",[s.AppService,s.ConfigService])],a),t.AgentDeckRecoveryService=a},9306(e,t){function n(e){return e.replace(/[\\^$.*+?()[\]{}|/]/g,"\\$&")}function i(e){return[...e].sort((e,t)=>t.length-e.length).map(n).join("|")}function r(e,t){if(!Array.isArray(e))return t;const n=e.filter(e=>"string"==typeof e&&e.length>0);return n.length?n:t}t.judgeScreen=t.isGhostRuleRow=t.isRuleRow=t.sizeInSync=t.INPUT_TAIL=t.n=void 0,t.n={ruleChars:["─","━","═"],heads:[">","❯","›","❭","➜"],choiceWords:["Yes","No"]};const o=new Map;function s(e){const n=r(e?e.ruleChars:void 0,t.n.ruleChars),s=r(e?e.heads:void 0,t.n.heads),a=r(e?e.choiceWords:void 0,t.n.choiceWords),d=JSON.stringify([n,s,a]),l=o.get(d);if(l)return l;const c=n.join("").replace(/[\\\]^-]/g,"\\$&"),u=i(s),A={rule:new RegExp(`^[${c}]{2,}$`),head:new RegExp(`^(?:${u})(?:\\s|$)`),headAnywhere:new RegExp(`(?:${u})(?:\\s|$)`),choice:new RegExp(`^(?:${u})\\s*(?:\\d+[.)]\\s|(?:${i(a)})(?!\\w))`,"i"),ruleChar:new RegExp(`[${c}]`),ruleCharAll:new RegExp(`[${c}]`,"g")};return o.set(d,A),A}function a(e,t,n){const i=s(n),r=e.replace(/\s+$/,"");return t>1&&!(r.length<2)&&!i.rule.test(r)&&(!(!i.ruleChar.test(r[0])||!i.ruleChar.test(r[r.length-1]))&&(r.match(i.ruleCharAll)||[]).length>=.6*t)}t.INPUT_TAIL=16,t.sizeInSync=function(e,t,n,i){return!("number"==typeof e&&e>1)||"number"!=typeof n||"number"!=typeof i||n===e&&i===t},t.isRuleRow=function(e,t){return s(t).rule.test(e.trim())},t.isGhostRuleRow=a,t.judgeScreen=function(e,n,i){const r=s(i),o=[];if(!(n>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&&(r.rule.test(c)?(d.push(s),c.length!==n&&o.push(`rule@${s} len=${c.length} != cols=${n}`)):(s>=e.length-t.INPUT_TAIL&&a(c,n,i)&&o.push(`테두리 행에 옛 글자가 남았다@${s} ${JSON.stringify(c.slice(0,40))}`),r.ruleChar.test(c)&&r.headAnywhere.test(c)&&o.push(`mixed@${s} ${JSON.stringify(c.slice(0,40))}`),r.head.test(c)&&!r.choice.test(c)&&l.push(s)))}const c=d.filter(t=>e[t].text.replace(/\s+$/,"").length===n);if(c.length>=2){const e=c[c.length-1],t=c[c.length-2];if(e-t<2)o.push(`입력창에 자리가 없다 (테두리 ${t}·${e} 이 맞붙었다)`);else{const n=l.filter(n=>n>t&&n<e).length;n>1&&o.push(`입력창 안 머리=${n} (기대 1)`)}}if(l.length&&c.length){const e=l[l.length-1],t=c.includes(e-1),n=c.some(t=>t>e);t&&!n&&o.push(`입력창 아래 테두리가 없다 (머리@${e}, 위 테두리@${e-1})`)}if(d.length>1){const t=new Set(d.map(t=>e[t].text.replace(/\s+$/,"").length));t.size>1&&o.push(`rule lens=${[...t].join(",")} (섞임)`)}return{broken:o.length>0,reasons:o}}},5633(e,t){function n(e){var t,n,i,r;const o=(null!==(t=e.match(/"[^"]*"|\S+/g))&&void 0!==t?t:[]).map(e=>e.replace(/^"|"$/g,"")),s=null===(i=(null!==(n=o[0])&&void 0!==n?n:"").split(/[\\/]/).pop())||void 0===i?void 0:i.replace(/\.(exe|cmd|bat)$/i,"").toLowerCase();if("codex"===s||"claude"===s||"gemini"===s)return s;if("node"===s){const e=(null!==(r=o[1])&&void 0!==r?r:"").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 i(e){let t="unknown";for(const n of e)/^\s*│\s*>_\s+OpenAI Codex\s+\(v\d+\./.test(n)?t="codex":/^[\s*\u2500-\u259f]*Claude Code v\d+\./.test(n)?t="claude":/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(n)&&(t="unknown");return t}t.TerminalAgentTracker=t.identifyScreenAgent=t.isLiveCodexScreen=void 0,t.isLiveCodexScreen=function(e){var t;const n=e.reduce((e,t,n)=>t.trim()?n+1:e,0),i=e.slice(0,n);if(/^\s*\/ T R A N S C R I P T\b/.test(null!==(t=i[0])&&void 0!==t?t:"")&&i.slice(-4).some(e=>/\bq close\b/.test(e)))return!0;const r=i.findIndex(e=>/^\s*(?:gpt-[\w.-]+|o\d[\w.-]*)\b.*\bContext \d+% left\b/.test(e));return!(r<0||r<n-3)&&!i.slice(r+1).some(e=>/^(?:PS )?[A-Za-z]:[\\/][^>]*>/.test(e.trim()))&&i.slice(0,r).some(e=>/^\s*›/.test(e))},t.identifyScreenAgent=i,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=i([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=n(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)}}},1424(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t},a=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=n(860),l=n(7650),c=s(n(9896)),u=s(n(857)),A=s(n(6928)),p=n(7797),h=n(2425);let g=class{constructor(e){this.config=e,this.root=A.join(process.env.LOCALAPPDATA||A.join(u.homedir(),"AppData","Local"),"tabby-agentdeck"),this.file=A.join(this.root,"sessions.json"),this.projectsDir=A.join(u.homedir(),".claude","projects"),this.ledger=new Map,this.scanned=[],this.headCache=new Map,this.loaded=!1,this.saveTimer=null,this.scanning=null,this.lastScan=0,this.onChange=null}load(){if(!this.loaded){this.loaded=!0;try{const e=c.readFileSync(this.file,"utf8"),t=JSON.parse(e),n=Array.isArray(null==t?void 0:t.records)?t.records:[];for(const e of n)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,h.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,p.diagCatch)("세션 원장 저장",e)}}note(e,t){var n,i,r;if(!e)return;this.load();const o=this.ledger.get(e),s=(0,h.clampLabel)(t.label),a={sessionId:e,cwd:t.cwd||(null==o?void 0:o.cwd)||null,label:s||(null==o?void 0:o.label)||"",lastStatus:null!==(i=null!==(n=t.status)&&void 0!==n?n:null==o?void 0:o.lastStatus)&&void 0!==i?i:null,lastSeen:Date.now(),from:s?"live":null!==(r=null==o?void 0:o.from)&&void 0!==r?r:"live"},d=o&&o.cwd===a.cwd&&o.label===a.label&&o.lastStatus===a.lastStatus;this.ledger.set(e,a),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,n=Number(t.resumeListDays)||0,i=n>0?Date.now()-864e5*n:0,r=[],o=new Set;try{const e=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const t of e){if(!t.isDirectory())continue;const e=A.join(this.projectsDir,t.name);let n;try{n=await c.promises.readdir(e)}catch{continue}for(const t of n){const n=(0,h.sessionIdFromFile)(t);if(!n)continue;const s=A.join(e,t);o.add(n);try{const e=await c.promises.stat(s);if(i&&e.mtimeMs<i)continue;r.push({sessionId:n,file:s,mtime:e.mtimeMs})}catch{}}}}catch{}const s=async(e,t)=>{let n;try{n=await c.promises.readdir(e,{withFileTypes:!0})}catch{return}for(const a of n){const n=A.join(e,a.name);if(a.isDirectory()&&t<3){await s(n,t+1);continue}const d=/^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i.exec(a.name);if(a.isFile()&&d){o.add(d[1]);try{const e=await c.promises.stat(n);(!i||e.mtimeMs>=i)&&r.push({sessionId:d[1],file:n,mtime:e.mtimeMs,agent:"codex"})}catch{}}}};await s(A.join(process.env.CODEX_HOME||A.join(u.homedir(),".codex"),"sessions"),0),r.sort((e,t)=>t.mtime-e.mtime);const a=r.slice(0,200),d=[];for(const e of a){const t=`${e.sessionId}:${Math.round(e.mtime)}`;let n=this.headCache.get(t);n||(n=await this.readHeadOf(e.file),this.headCache.set(t,n)),n.isSubagent||d.push({agent:e.agent||"claude",sessionId:e.sessionId,cwd:n.cwd,label:n.label,lastStatus:null,lastSeen:e.mtime,from:"head"})}this.scanned=d;const l=this.ledger.size,p=(0,h.pruneLedger)([...this.ledger.values()],o);p.length!==l&&(this.ledger=new Map(p.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 n=Buffer.alloc(h.HEAD_BYTE_LIMIT),{bytesRead:i}=await t.read(n,0,h.HEAD_BYTE_LIMIT,0),r=n.slice(0,i).toString("utf8").split("\n");return i===h.HEAD_BYTE_LIMIT&&r.pop(),(0,h.readHead)(r.slice(0,h.HEAD_LINE_LIMIT))}catch(t){return(0,p.diagCatch)(`세션 기록 앞부분 읽기 ${A.basename(e)}`,t),{cwd:null,label:"",startedAt:null}}finally{await(null==t?void 0:t.close().catch(()=>{}))}}records(){return this.load(),(0,h.mergeSessions)([...this.ledger.values()],this.scanned)}snapshot(){return{ledger:this.ledger.size,scanned:this.scanned.length,file:this.file,lastScan:this.lastScan}}};g=o([(0,d.Injectable)({providedIn:"root"}),a("design:paramtypes",[l.ConfigService])],g),t.SessionLedgerService=g},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 n=["<","Caveat:","[Request interrupted","Your claude.ai usage limit"];function i(e){if("string"!=typeof e)return!1;const t=e.trim();return!!t&&!n.some(e=>t.startsWith(e))}function r(e){var t,n,r;if("event_msg"===(null==e?void 0:e.type)&&"user_message"===(null===(t=e.payload)||void 0===t?void 0:t.type))return i(e.payload.message)?e.payload.message.trim():null;if("response_item"===(null==e?void 0:e.type)&&"user"===(null===(n=e.payload)||void 0===n?void 0:n.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 i(t)?t.trim():null}if(!e||"user"!==e.type||!0===e.isMeta)return null;const o=null===(r=e.message)||void 0===r?void 0:r.content;let s=null;if("string"==typeof o)s=o;else if(Array.isArray(o)){const e=o.filter(e=>e&&"text"===e.type&&"string"==typeof e.text).map(e=>e.text);s=e.length?e.join(" "):null}return i(s)?s.trim():null}function o(e){if(!e)return"";const n=e.replace(/\s+/g," ").trim();return n.length>t.wd?n.slice(0,t.wd-1)+"…":n}t.wd=140,t.clampLabel=o,t.readHead=function(e){var t,n,i;let s=null,a="",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===(n=null===(t=e.payload)||void 0===t?void 0:t.source)||void 0===n?void 0:n.subagent)return{cwd:null,label:"",startedAt:null,isSubagent:!0};s||"string"!=typeof(null===(i=e.payload)||void 0===i?void 0:i.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(!a){const t=r(e);t&&(a=o(t))}if(s&&a&&null!==d)break}return{cwd:s,label:a,startedAt:d}},t.mergeSessions=function(e,t){var n;const i=new Map;for(const e of t)e.sessionId&&i.set(e.sessionId,{...e});for(const t of e){if(!t.sessionId)continue;const e=i.get(t.sessionId);e&&i.set(t.sessionId,{...e,label:t.label||e.label,from:t.label?t.from:e.from,lastStatus:null!==(n=t.lastStatus)&&void 0!==n?n:e.lastStatus,cwd:e.cwd||t.cwd,lastSeen:Math.max(t.lastSeen||0,e.lastSeen||0)})}return[...i.values()]},t.pruneLedger=function(e,t){return e.filter(e=>e.sessionId&&t.has(e.sessionId))},t.resumeRowsFor=function(e,t){var n;const i=new Set(t.groupKeys.map(e=>t.fold(e))),r=t.days>0?t.now-864e5*t.days:null,o=[];for(const s of e)s.sessionId&&!t.hidden.has(s.sessionId)&&i.has(t.fold(t.keyOf(s.cwd)))&&(null!==r&&s.lastSeen<r||o.push({...s,openTabId:null!==(n=t.live.get(s.sessionId))&&void 0!==n?n:null}));return o.sort((e,t)=>t.lastSeen-e.lastSeen||e.sessionId.localeCompare(t.sessionId)),t.limit>0?o.slice(0,t.limit):o},t.formatWhen=function(e,t){if(!e||!Number.isFinite(e))return"";const n=new Date(e),i=new Date(t);if(n.getFullYear()===i.getFullYear()&&n.getMonth()===i.getMonth()&&n.getDate()===i.getDate())return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`;const r=new Date(t);return r.setDate(r.getDate()-1),n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()&&n.getDate()===r.getDate()?"어제":`${n.getMonth()+1}/${n.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,n="claude"){return/^[0-9a-fA-F-]{8,64}$/.test(e||"")?"codex"===n?`codex ${t?"fork":"resume"} ${e}`:`claude --resume ${e}${t?" --fork-session":""}`:""}},7418(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},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.AgentDeckSettingsTabComponent=void 0;const o=n(860),s=n(7650),a=n(7028),d=n(1786),l=n(2627),c=n(9980),u=n(9610),A=n(7797),p={disabled:"자동 업데이트가 꺼져 있다","too-soon":"방금 확인했다","dev-install":"새 버전이 있지만 개발 설치라 건드리지 않는다",unknown:"npm 에 물어보지 못했다 (네트워크·프록시)","up-to-date":"최신이다","update-ready":"새 버전이 있다",skipped:"이 버전은 건너뛰기로 했다",postponed:"나중에 하기로 했다",installing:"설치를 시작했다 — Tabby 가 곧 닫혔다가 다시 켜진다",failed:"업데이트를 시작하지 못했다"},h={left:"왼쪽",right:"오른쪽",top:"위쪽",bottom:"아래쪽"};let g=class{constructor(e,t,n,i){this.config=e,this.recovery=t,this.update=n,this.platform=i,this.hooksSupported=(0,d.hooksSupported)(),this.hooksOn=!1,this.codexHooksOn=!1,this.codexHookError="",this.hookError="",this.diagPath=A.DIAG_PATH,this.diagVersion=(0,A.pluginVersion)(),this.diagIncludeScreen=!1,this.diagBundlePath="",this.diagError="",this.updateBusy=!1,this.updateMsg="",this.refreshHooks()}async checkUpdate(){var e,t;this.updateBusy=!0,this.updateMsg="";try{this.updateMsg=null!==(e=p[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;try{this.codexHooksOn=this.hooksSupported&&(0,l.codexHooksInstalled)()}catch(t){this.codexHooksOn=!1,this.codexHookError=`설정을 읽지 못했다: ${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}try{this.hooksOn=this.hooksSupported&&(0,d.hooksInstalled)()}catch(e){this.hooksOn=!1,this.hookError=`설정을 읽지 못했다: ${null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e}`}}toggleHooks(){var e;this.hookError="";try{this.hooksOn?(0,d.uninstallHooks)():((0,d.installHooks)(),this.config.store.agentDeck.notifyChannel||(this.config.store.agentDeck.notifyChannel=!0,this.config.save()))}catch(t){this.hookError=`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}this.refreshHooks()}toggleCodexHooks(){var e;this.codexHookError="";try{(0,l.setCodexHooks)(!this.codexHooksOn),this.codexHooksOn||this.config.store.agentDeck.notifyChannel||(this.config.store.agentDeck.notifyChannel=!0,this.config.save())}catch(t){this.codexHookError=`${null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t}`}this.refreshHooks()}collectDiag(){var e,t,n,i,r;this.diagError="",this.diagBundlePath="";try{const r=(0,A.collectDiagBundle)({includeScreen:this.diagIncludeScreen,stamp:{tabby:null===(t=(e=this.platform).getAppVersion)||void 0===t?void 0:t.call(e),osRelease:null===(i=(n=this.platform).getOSRelease)||void 0===i?void 0:i.call(n),config:(0,A.configStamp)(this.config.store)}});this.diagBundlePath=r.path,this.platform.showItemInFolder(r.path)}catch(e){this.diagError=`모으지 못했다: ${null!==(r=null==e?void 0:e.message)&&void 0!==r?r:e}`}}layoutChanged(){const e=this.config.store.agentDeck;return Object.keys(a.LAYOUT_DEFAULTS).some(t=>e[t]!==a.LAYOUT_DEFAULTS[t])}dockLabel(){var e;return null!==(e=h[this.config.store.agentDeck.sidebarDock])&&void 0!==e?e:"오른쪽"}sizeLabel(){const e=this.config.store.agentDeck;return"top"===e.sidebarDock||"bottom"===e.sidebarDock?"높이 "+e.sidebarHeight+"px":e.sidebarWidth?"폭 "+e.sidebarWidth+"px":"폭 자동"}resetLayout(){Object.assign(this.config.store.agentDeck,a.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.config.save())}};g=i([(0,o.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">레이아웃 사용</div>\n <div class="description">끄면 사이드바와 고정폭 레이아웃이 사라지고 Tabby 순정 화면으로 돌아간다.</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">UI 배치 초기화</div>\n <div class="description">\n 마우스로 바꾼 사이드바 위치와 크기를 처음 상태로 되돌린다 —\n 오른쪽 도킹 + 화면비로 자동 계산한 폭.\n <span *ngIf="layoutChanged()">지금: {{dockLabel()}} 도킹, {{sizeLabel()}}.</span>\n <span *ngIf="!layoutChanged()">지금은 기본 상태다.</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>초기화\n </button>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">기동 시 탭 복원 끄기</div>\n <div class="description">\n 켜면 Tabby 를 다시 열 때 지난 탭을 되살리지 않고 빈 상태로 시작한다 —\n 복원되는 건 셸뿐이고 그 안의 Claude 세션은 이미 끝나 있어 의미가 없다.\n 끄면 Tabby 순정 동작(<code>recoverTabs</code>)으로 돌아간다. 다음 기동부터 적용.\n </div>\n </div>\n <toggle [ngModel]="config.store.agentDeck.noTabRecovery" (ngModelChange)="recovery.setNoTabRecovery($event)"></toggle>\n</div>\n\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<div class="form-line">\n <div class="header">\n <div class="title">지난 세션 이어받기</div>\n <div class="description">\n 그룹 끝에 <code>⟲ 지난 세션</code> 서랍을 둔다 (기본 접힘). 펴면 <b>닫힌 Claude Code·Codex 세션</b>이\n 그때 친 프롬프트로 보이고, 누르면 그 세션의 작업 폴더에서 <code>claude --resume</code> 또는 <code>codex resume</code> 으로\n 대화가 되살아난다. 위의 <b>탭 복원 끄기</b> 와 한 쌍이다 — 순정 복원은 셸만 되살리지만\n 이건 대화를 되살린다. <b>다만 그때 띄워 둔 서버·백그라운드 프로세스는 돌아오지 않는다.</b>\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.resumeList" (ngModelChange)="config.save()"></toggle>\n</div>\n\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<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+Shift+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="form-line">\n <div class="header">\n <div class="title">끌 때 목록 끝에서 저절로 흐르기</div>\n <div class="description">\n 줄을 끌어 순서를 바꿀 때 목록의 위·아래 끝에 커서를 대고 있으면\n <b>커서를 더 움직이지 않아도</b> 목록이 그 방향으로 흘러간다.\n 그래서 탭이 많아 화면에 안 보이는 자리로도 한 손짓에 옮길 수 있다.\n 끄면 손을 뗀 뒤 스크롤하고 다시 끌어야 하지만, 그 대신\n <b>맨 끝 줄 뒤에 놓는 조작이 미끄러지지 않는다</b>.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.dragAutoScroll" (ngModelChange)="config.save()"></toggle>\n</div>\n\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<h3 class="mt-4 mb-3">에이전트 상태 연동</h3>\n<div class="text-muted mb-3">\n 에이전트가 "지시를 받았다 / 승인을 기다린다 / 끝났다" 를 직접 알려주게 한다.\n 이게 사이드바 상태의 가장 정확한 원천이다 — 걸지 않으면 화면에 그려진 글자를 보고\n 추측하는 방식으로 동작하고, 그만큼 판정이 흔들린다.\n</div>\n\n<div class="form-line" *ngIf="!hooksSupported">\n <div class="header">\n <div class="title">이 환경에서는 걸 수 없다</div>\n <div class="description">통보 스크립트가 PowerShell 이라 Windows 에서만 동작한다. 상태는 출력 패턴으로 추측한다.</div>\n </div>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">Claude Code 상태 통보 훅</div>\n <div class="description">\n {{hooksOn ? \'설치됨\' : \'설치 안 됨\'}} — <code>~/.claude/settings.json</code> 의\n UserPromptSubmit / Notification / PostToolUse / PostToolUseFailure / PermissionDenied / Stop / StopFailure 에 걸린다.\n 다른 훅은 건드리지 않고, 쓰기 전에 같은 폴더에 백업을 남긴다.\n <span *ngIf="hookError" class="text-danger d-block mt-1">{{hookError}}</span>\n </div>\n </div>\n <button class="btn" type="button"\n [class.btn-secondary]="!hooksOn" [class.btn-outline-danger]="hooksOn"\n (click)="toggleHooks()">\n <i class="fas me-2" [class.fa-plug]="!hooksOn" [class.fa-trash]="hooksOn"></i>\n {{hooksOn ? \'제거\' : \'설치\'}}\n </button>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported">\n <div class="header">\n <div class="title">Codex 상태 통보 훅</div>\n <div class="description">\n {{codexHooksOn ? \'설치됨\' : \'설치 안 됨\'}} — 진행 중, 승인 대기, 완료, 중단 상태를 전달한다.\n 설치 후 Codex를 다시 열고 <code>/hooks</code>에서 AgentDeck 훅을 검토하고 신뢰해야 동작한다.\n <span *ngIf="codexHookError" class="text-danger d-block mt-1">{{codexHookError}}</span>\n </div>\n </div>\n <button class="btn btn-secondary" type="button" (click)="toggleCodexHooks()">\n {{codexHooksOn ? \'제거\' : \'설치\'}}\n </button>\n</div>\n\n<div class="form-line" *ngIf="hooksSupported && (hooksOn || codexHooksOn)">\n <div class="header">\n <div class="title">통보 채널</div>\n <div class="description">훅이 보낸 상태를 받는 통로. 꺼져 있으면 훅을 걸어도 전달되지 않는다. 변경은 Tabby 재시작 후 적용된다.</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.notifyChannel" (ngModelChange)="config.save()"></toggle>\n</div>\n\n<h3 class="mt-4 mb-3">작업 루트 프로필</h3>\n<div class="text-muted mb-3">새 탭이 항상 같은 작업 폴더에서 뜨도록 전용 프로필을 만든다. 변경은 Tabby 재시작 후 적용된다.</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">루트 프로필 사용</div>\n <div class="description">켜고 작업 폴더를 채우면 해당 프로필을 만들어 기본 프로필로 삼는다.</div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.rootProfile" (ngModelChange)="config.save()"></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">프로필 이름</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileName" (change)="config.save()">\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">작업 폴더</div>\n <div class="description">비우면 프로필을 만들지 않는다. 직접 적을 때는 백슬래시 이스케이프 함정을 피하려고 슬래시로 적는다 (예: D:/Project).</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)="config.save()">\n <button class="btn btn-secondary" type="button" (click)="pickCwd()">\n <i class="fas fa-folder-open me-2"></i>찾아보기\n </button>\n </div>\n </div>\n\n <div class="form-line">\n <div class="header">\n <div class="title">실행 명령</div>\n </div>\n <input class="form-control w-50" type="text"\n [(ngModel)]="config.store.agentDeck.rootProfileCommand" (change)="config.save()">\n </div>\n\n</ng-container>\n\n<h3 class="mt-4 mb-3">문제 신고</h3>\n<div class="text-muted mb-3">\n 버그를 만났을 때 <b>진단 로그를 모아 zip 하나로 만든다</b> — 만든 뒤 그 파일이 있는 폴더가 열린다.\n 담기는 것: 플러그인/Tabby 버전·OS, 위에 있는 설정 값, 그리고 <code>{{diagPath}}</code> 의 최근 두 세대.\n 로그에는 <b>탭 제목과 열어 본 파일 경로</b>가 들어간다 — 보내기 전에 열어 확인해도 된다.\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">화면 원문까지 넣기</div>\n <div class="description">\n 화면이 깨지는 문제라면 켠다. 깨진 순간의 터미널 화면이 글자 그대로 들어가므로\n (작업 내용·코드가 보인다) 기본은 꺼져 있다.\n </div>\n </div>\n <toggle [(ngModel)]="diagIncludeScreen"></toggle>\n</div>\n\n<div class="form-line">\n <div class="header">\n <div class="title">진단 로그 모으기</div>\n <div class="description">\n 플러그인 v{{diagVersion}}.\n <span *ngIf="diagBundlePath" class="d-block mt-1">만들었다: <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>모으기\n </button>\n</div>\n\n<div class="text-muted mt-4">\n 화면비·사이드바 폭·투명도·상태 감지·입력 처리 등 나머지 값은 기본값으로 고정돼 있다.\n 바꿔야 한다면 설정 파일의 <code>agentDeck.*</code> 를 직접 고친다.\n 단축키는 <b>단축키</b> 탭의 <code>agentdeck-*</code> 항목에서 바꾼다.\n</div>\n'}),r("design:paramtypes",[s.ConfigService,c.AgentDeckRecoveryService,u.AgentDeckUpdateService,s.PlatformService])],g),t.AgentDeckSettingsTabComponent=g},1451(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabProvider=void 0;const r=n(860),o=n(3700),s=n(7418);let a=class extends o.SettingsTabProvider{constructor(){super(...arguments),this.id="agentdeck",this.icon="layer-group",this.title="AgentDeck"}getComponentType(){return s.AgentDeckSettingsTabComponent}};a=i([(0,r.Injectable)()],a),t.AgentDeckSettingsTabProvider=a},6021(e,t,n){var i=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkStatusService=void 0;const r=n(860),o=n(3961),s=["waiting","limited","error"];let a=class{constructor(){this.states=new Map,this.changed=new o.Subject,this.debug={attached:0,outputs:0,oscHits:0,titleHits:0}}get changed$(){return this.changed}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 n=this.get(e);n.pinned||n.status===t||(n.status=t,n.since=Date.now(),this.clearReasonUnlessWaiting(n),this.changed.next())}setManual(e,t,n,i){const r=this.get(e);r.status=t,r.since=Date.now(),r.pinned=!0,void 0!==n&&(r.label=n),r.reason=s.includes(t)&&null!=i?i:"",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 n of[...this.states.keys()])e.includes(n)||(this.states.delete(n),t++);return t>0&&this.changed.next(),t}tickIdle(e,t){const n=this.get(e);if(n.pinned||"running"!==n.status)return!1;const i=n.busyMode?n.lastBusy:n.lastOutput;return!!(i&&Date.now()-i>t)&&(n.status="idle",n.since=Date.now(),this.clearReasonUnlessWaiting(n),!0)}};a=i([(0,r.Injectable)({providedIn:"root"})],a),t.WorkStatusService=a},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 n="<task-notification>",i=/<tool-use-id>([^<]*)<\/tool-use-id>/,r=/<status>([^<]*)<\/status>/,o=/^[A-Za-z0-9_-]{4,200}$/,s=["running","pending","in_progress","in-progress","started","queued"];function a(e,t){let a=0;for(;;){const d=t.indexOf(n,a);if(d<0)return;const l=d+19,c=t.indexOf("</task-notification>",l),u=c<0?t.slice(l):t.slice(l,c);a=c<0?t.length:c+20;const A=i.exec(u);if(!A)continue;const p=A[1].trim();if(!o.test(p))continue;const h=r.exec(u);h&&s.indexOf(h[1].trim().toLowerCase())>=0||e.done.add(p)}}function d(e){if(e.indexOf("tool_use")<0)return!1;for(const n of t.oq)if(e.indexOf(n)>=0)return!0;return!1}function l(e,n){var i,r;let s;try{s=JSON.parse(n)}catch{return void e.skipped++}if(!s||"object"!=typeof s||!0===s.isSidechain)return;const a=null===(i=s.message)||void 0===i?void 0:i.content;if(Array.isArray(a))for(const n of a){if(!n||"object"!=typeof n)continue;if("tool_use"!==n.type||t.oq.indexOf(String(n.name))<0)continue;const i=String(null!==(r=n.id)&&void 0!==r?r:"").trim();if(!o.test(i)||e.calls.has(i))continue;const a=n.input&&"object"==typeof n.input?n.input:{},d="string"==typeof a.description?a.description.trim():"",l="string"==typeof a.subagent_type&&a.subagent_type.trim()?a.subagent_type.trim():null,c="string"==typeof s.timestamp&&s.timestamp?s.timestamp:null;e.calls.set(i,{id:i,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 i;const r="string"==typeof t?t:"";if(!r)return e;const o=(e.pending+r).split("\n");return e.pending=null!==(i=o.pop())&&void 0!==i?i:"",e.pending.length>4194304&&(e.dropped++,e.pending=""),function(e,t){for(const i of null!=t?t:[]){if("string"!=typeof i)continue;e.lines++;const t=13===i.charCodeAt(i.length-1)?i.slice(0,-1):i;t&&(t.indexOf(n)>=0&&a(e,t),d(t)&&l(e,t))}return e}(e,o)},t.summarizeSubagents=function(e){const t=e;if(!(t&&t.calls instanceof Map))return{running:0,items:[],calls:0,done:0};const n=[];for(const e of t.calls.values())t.done.has(e.id)||n.push(e);return{running:n.length,items:n,calls:t.calls.size,done:t.done.size}},t.formatSubagentTooltip=function(e,t=8){var n;const i=null!==(n=null==e?void 0:e.items)&&void 0!==n?n:[];if(!i.length)return"";const r=Number.isFinite(t)&&t>0?Math.floor(t):i.length,o="서브에이전트 "+i.length+"개 진행중",s=i.slice(0,r).map(e=>{return"· "+((t=e).description||t.subagentType||"(설명 없음)");var t});return i.length>r&&s.push("· … 외 "+(i.length-r)+"개"),[o,...s].join("\n")},t.summarizeLiveAgents=function(e){var t;const n=new Map;let i=0,r=0;for(const o of null!=e?e:[]){if(!o||!o.id)continue;i++;const e=o.type||"이름 없음";n.set(e,(null!==(t=n.get(e))&&void 0!==t?t:0)+1),Number.isFinite(o.at)&&o.at>0&&(!r||o.at<r)&&(r=o.at)}return{running:i,byType:[...n].map(([e,t])=>({type:e,count:t})).sort((e,t)=>t.count-e.count||e.type.localeCompare(t.type)),oldestAt:r}},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 n=String(null!=e?e:"").trim().toLowerCase(),i=String(null!=t?t:"").trim().toLowerCase();return!!(n&&i&&o.test(i))&&n===i+".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 n="[?2026h";if(this.pending.lastIndexOf(n)>this.pending.lastIndexOf("[?2026l"))return"";for(let e=1;e<8;e++)if(this.pending.endsWith(n.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 n="string"==typeof e?e.trim():"";if(!n)return null;for(const[e,i]of t)if(i.includes(n))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,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__decorate||function(e,t,n,i){var r,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(o<3?r(s):o>3?r(t,n,s):r(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t},a=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=n(860),l=n(7650),c=n(5317),u=s(n(9896)),A=s(n(8611)),p=s(n(5692)),h=s(n(857)),g=s(n(6928)),f=n(7797),v=n(2023);let b=class{constructor(e,t,n,i){this.app=e,this.config=t,this.platform=n,this.notifications=i}init(){this.app.ready$.subscribe(()=>{var e;const t=globalThis;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},t.__agentdeck.update={run:(e=!0)=>this.run("diag",e),marks:()=>this.installMarks(),canSelfUpdate:()=>(0,v.canSelfUpdate)(this.installMarks()),pluginsDir:()=>this.pluginsDir(),version:()=>(0,f.pluginVersion)()},setTimeout(()=>{this.run("startup")},8e3)})}async run(e,t=!1){const n=this.config.store.agentDeck,i=(0,f.pluginVersion)(),r=this.installMarks(),o=!(0,v.canSelfUpdate)(r);if(!1===n.autoUpdate)return(0,f.diag)(`update skip=disabled reason=${e}`),"disabled";if(!t&&!(0,v.shouldCheck)(n.lastUpdateCheck,Date.now(),Number(n.updateCheckIntervalHours)||v.DEFAULT_INTERVAL_HOURS))return(0,f.diag)(`update skip=too-soon reason=${e}`),"too-soon";let s=null;try{s=(0,v.parseLatestVersion)(await this.fetch((0,v.latestUrl)(n.updateRegistry)))}catch(e){(0,f.diagCatch)("update 레지스트리 조회",e)}n.lastUpdateCheck=Date.now(),this.config.save();const a=(0,v.decide)({enabled:!0,lastCheckAt:0,now:Date.now(),intervalHours:0,devInstall:o,current:i,latest:s});return(0,f.diag)(`update check=${e} current=${i} latest=${null!=s?s:"?"} outcome=${a} dev=${o} marks=${JSON.stringify(r)}`),"dev-install"===a?(this.notifications.info(`AgentDeck ${s} 가 나왔다 (지금 ${i})`,"개발 설치(소스 링크)라 자동으로 갈아끼우지 않는다. 소스에서 직접 올릴 것."),a):"update-ready"!==a?a:t||n.updateSkipVersion!==s?this.confirmAndInstall(i,s):((0,f.diag)(`update skip=asked-not-to version=${s}`),"skipped")}async confirmAndInstall(e,t){var n;const i=await this.platform.showMessageBox({type:"warning",message:`AgentDeck ${t} 로 업데이트할까요? (지금 ${e})`,detail:["업데이트하려면 Tabby 를 닫아야 합니다 — 돌고 있는 플러그인은 갈아끼울 수 없습니다.","","누르면 이렇게 됩니다:"," 1. Tabby 가 닫힙니다 (열린 탭과 돌고 있는 세션이 끊깁니다)"," 2. 백그라운드에서 새 버전을 내려받아 설치합니다"," 3. Tabby 가 다시 켜집니다","","끊긴 Claude Code 대화는 사이드바의 `⟲ 지난 세션` 에서 이어받을 수 있습니다."].join("\n"),buttons:["지금 업데이트","나중에","다시 묻지 않기"],defaultId:1,cancelId:1});if(2===i.response)return this.config.store.agentDeck.updateSkipVersion=t,this.config.save(),(0,f.diag)(`update skip-version=${t}`),"skipped";if(0!==i.response)return"postponed";try{this.launchUpdater(t)}catch(e){return(0,f.diagCatch)("update 설치 스크립트 기동",e),this.notifications.error("업데이트를 시작하지 못했다",`${null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e} — 설정 → 플러그인 에서 직접 업데이트할 수 있다.`),"failed"}return(0,f.diag)(`update quit for install ${e} -> ${t}`),setTimeout(()=>this.platform.quit(),300),"installing"}launchUpdater(e){const t=g.join(__dirname,"..","updater","agentdeck-update.ps1");if(!u.existsSync(t))throw new Error(`설치 스크립트를 찾지 못했다: ${t}`);const n=u.mkdtempSync(g.join(h.tmpdir(),"agentdeck-up-")),i=g.join(n,"agentdeck-update.ps1");u.copyFileSync(t,i);const r=this.pluginsDir();if(!r)throw new Error("Tabby 플러그인 폴더를 찾지 못했다");const o=(0,c.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-WindowStyle","Hidden","-File",i,"-Version",e,"-PluginsDir",r,"-TabbyExe",process.execPath,"-TabbyPid",String(this.mainProcessPid())],{detached:!0,stdio:"ignore"});o.unref(),(0,f.diag)(`update updater spawned pid=${o.pid} script=${i}`)}mainProcessPid(){const e=Number(process.ppid);return Number.isFinite(e)&&e>0?e:0}pluginsDir(){var e,t;try{const n=null===(t=(e=this.platform).getConfigPath)||void 0===t?void 0:t.call(e);return n?g.join(g.dirname(n),"plugins"):null}catch{return null}}installMarks(){const e=g.join(__dirname,".."),t=t=>{try{return u.existsSync(g.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(g.join(e,"node_modules",v.PACKAGE_NAME)).isSymbolicLink()}catch{return!1}}fetch(e){return new Promise((t,n)=>{const i=(e.startsWith("http://")?A:p).get(e,{headers:{accept:"application/json"}},e=>{if(200!==e.statusCode)return e.resume(),void n(new Error(`HTTP ${e.statusCode}`));let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e,r.length>524288&&i.destroy(new Error("응답이 너무 크다"))}),e.on("end",()=>t(r))});i.setTimeout(6e3,()=>i.destroy(new Error("시간 초과"))),i.on("error",n)})}};b=o([(0,d.Injectable)({providedIn:"root"}),a("design:paramtypes",[l.AppService,l.ConfigService,l.PlatformService,l.NotificationsService])],b),t.AgentDeckUpdateService=b},2023(e,t){function n(e){var t;if("string"!=typeof e)return null;const n=/^\s*v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?\s*$/.exec(e);return n?{nums:[Number(n[1]),Number(n[2]),Number(n[3])],pre:null!==(t=n[4])&&void 0!==t?t:null}:null}function i(e,t){return-1===function(e,t){const i=n(e),r=n(t);if(!i||!r)return null;for(let e=0;e<3;e++)if(i.nums[e]!==r.nums[e])return i.nums[e]<r.nums[e]?-1:1;if(i.pre===r.pre)return 0;if(null===i.pre)return 1;if(null===r.pre)return-1;const o=i.pre.split("."),s=r.pre.split(".");for(let e=0;e<Math.max(o.length,s.length);e++){const t=o[e],n=s[e];if(void 0===t)return-1;if(void 0===n)return 1;const i=/^\d+$/.test(t),r=/^\d+$/.test(n);if(i&&r){if(Number(t)!==Number(n))return Number(t)<Number(n)?-1:1}else if(t!==n)return t<n?-1:1}return 0}(e,t)}function r(e,t,n){const i=Number(e)||0;return i>t||t-i>=36e5*Math.max(0,Number(n)||0)}t.decide=t.canSelfUpdate=t.shouldCheck=t.latestUrl=t.parseLatestVersion=t.DEFAULT_INTERVAL_HOURS=t.PACKAGE_NAME=t.sx=void 0,t.sx="https://registry.npmjs.org",t.PACKAGE_NAME="tabby-agentdeck",t.DEFAULT_INTERVAL_HOURS=6,t.parseLatestVersion=function(e){var t;try{const i=null===(t=JSON.parse(e))||void 0===t?void 0:t.version;return n(i)?String(i).trim():null}catch{return null}},t.latestUrl=function(e,n=t.PACKAGE_NAME){return`${(e||t.sx).replace(/\/+$/,"")}/${encodeURIComponent(n)}/latest`},t.shouldCheck=r,t.canSelfUpdate=function(e){return!(e.hasSrc||e.hasGit||e.hasWebpackConfig||e.isLink)},t.decide=function(e){return e.enabled?r(e.lastCheckAt,e.now,e.intervalHours)?null===e.latest?"unknown":i(e.current,e.latest)?e.devInstall?"dev-install":"update-ready":"up-to-date":"too-soon":"disabled"}},3097(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ViewPanel=t.MIN_VIEW_W=t.VIEW_ID=void 0;const s=n(5317),a=o(n(9896)),d=o(n(6928)),l=n(8347),c=n(7604),u=n(7859),A=n(1933);t.VIEW_ID="agentdeck-view",t.MIN_VIEW_W=260;const p=15e5,h=p,g={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 f(e){var t;const n=null!==(t=String(null!=e?e:"").split("\n").map(e=>e.trim()).filter(e=>e)[0])&&void 0!==t?t:"";return n.length>200?n.slice(0,200)+"…":n}function v(e){try{const t=a.statSync(e);if(t.isDirectory())return"폴더";const n=new Date(t.mtimeMs),i=String(n.getHours()).padStart(2,"0"),r=String(n.getMinutes()).padStart(2,"0");return(0,c.formatBytes)(t.size)+" · "+i+":"+r}catch{return"지금은 없다"}}function b(e,t){try{const n=a.statSync(e);return!n.isFile()||n.size>t?null:"data:"+function(e){var t;return null!==(t=g[d.extname(e).slice(1).toLowerCase()])&&void 0!==t?t:"application/octet-stream"}(e)+";base64,"+a.readFileSync(e).toString("base64")}catch{return null}}function m(e,t){const n=a.readFileSync(e),i=n.length>t;let r=n.slice(0,i?t:n.length).toString("utf8");return 65279===r.charCodeAt(0)&&(r=r.slice(1)),{text:r,truncated:i}}function C(e){try{return a.accessSync(e,a.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 n=this.host.getWidth()||420;return Math.min(Math.max(n,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,n;const i=null===(n=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===n?void 0:n.call(t,"[data-ad-mode]");i&&this.setMode("diff"===i.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,n,i;const r=null===(n=null===(t=e.target)||void 0===t?void 0:t.closest)||void 0===n?void 0:n.call(t,"[data-ad-link]");if(!r)return;e.preventDefault();const o=null!==(i=r.getAttribute("data-ad-link"))&&void 0!==i?i:"";/^https?:/i.test(o)?this.host.openExternal(o):this.openFile(o.replace(/^file:\/\//,""))}),this.bodyEl.addEventListener("click",e=>{var t,n,i,r,o,s;const a=e.target,d=null===(t=null==a?void 0:a.closest)||void 0===t?void 0:t.call(a,"[data-ad-stage]");if(d)return e.preventDefault(),void this.toggleStage(null!==(n=d.getAttribute("data-ad-stage"))&&void 0!==n?n:"","reset"===d.getAttribute("data-ad-stage-act")?"reset":"add");const l=null===(i=null==a?void 0:a.closest)||void 0===i?void 0:i.call(a,"[data-ad-diff]");if(l){e.preventDefault();const t=document.getElementById(null!==(r=l.getAttribute("data-ad-diff"))&&void 0!==r?r:"");return void(null==t||t.scrollIntoView(!0))}const c=null===(o=null==a?void 0:a.closest)||void 0===o?void 0:o.call(a,"[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 n=t.closest("[data-ad-ref-line],[data-ad-ref-del]");n&&this.clickRefLine(n,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 n,i,r;t.preventDefault(),e.classList.remove("ad-view-dropping");const o=null===(i=null===(n=t.dataTransfer)||void 0===n?void 0:n.files)||void 0===i?void 0:i[0],s=null===(r=t.dataTransfer)||void 0===r?void 0:r.getData("text/plain"),a=(null==o?void 0:o.path)||s;a&&this.openFile(String(a).trim().replace(/^"|"$/g,""))})}installResize(e){e.addEventListener("mousedown",e=>{var n;e.preventDefault(),e.stopPropagation(),this.resizing=!0,document.body.classList.add("ad-resizing");const i=e.clientX,r=(null===(n=this.el)||void 0===n?void 0:n.getBoundingClientRect().width)||this.host.getWidth(),o=e=>{if(!this.resizing)return;const n="right"===this.host.getSide()?i-e.clientX:e.clientX-i;this.host.setWidth(Math.max(t.MIN_VIEW_W,Math.round(r+n))),this.host.relayout()},s=()=>{this.resizing=!1,document.body.classList.remove("ad-resizing"),window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",s),this.host.commit()};window.addEventListener("mousemove",o),window.addEventListener("mouseup",s)})}layout(e,t,n){if(!this.el)return;const i=this.el.style;i.position="absolute",i.top="0",i.bottom="0",i.width=t+"px",i.left="left"===e?n+"px":"auto",i.right="right"===e?n+"px":"auto",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 n=null!=e?e:"none"===this.pathRow.style.display;this.pathRow.style.display=n?"flex":"none",this.pathCreateArmed=null,this.setPathNote(""),n&&(this.pathInput.value=null!==(t=this.current)&&void 0!==t?t:"",this.pathInput.focus(),this.pathInput.select())}setPathNote(e){var t;const n=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-path-note");n&&(n.textContent=e,n.title=e)}openOrCreate(e){var t,n,i,r;const o=this.current?d.dirname(this.current):null,s=null!==(n=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==n?n:o,l=null!==(i=this.resolve(e,s,!1))&&void 0!==i?i:this.resolve(e,o,!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(a.statSync(u).isDirectory())return void this.setPathNote("폴더다 — 파일 이름까지 넣는다")}catch{}if(this.pathCreateArmed!==u)return this.pathCreateArmed=u,void this.setPathNote("없는 파일이다 — Enter 를 한 번 더 치면 새로 만든다");try{a.mkdirSync(d.dirname(u),{recursive:!0}),a.writeFileSync(u,"",{encoding:"utf8",flag:"wx"})}catch(e){return void this.setPathNote("만들지 못했다: "+String(null!==(r=null==e?void 0:e.message)&&void 0!==r?r: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 n;const i=((null!==(n=this.buffers.get(e))&&void 0!==n?n:"")+t).slice(-16384);this.buffers.set(e,i),this.scrapeTimers.get(e)||this.scrapeTimers.set(e,setTimeout(()=>{this.scrapeTimers.delete(e),this.scrape(e)},400))}scrape(e){var t,n;const i=null!==(t=this.buffers.get(e))&&void 0!==t?t:"";if(this.buffers.set(e,i.slice(i.lastIndexOf("\n")+1).slice(-256)),!i)return;const r=this.host.cwdFor(e);let o=null,s=!1;for(const t of(0,c.extractPaths)(i)){const i=this.resolve(t,r);if(!i)continue;const a=null!==(n=this.recent.get(e))&&void 0!==n?n:[];if(a[0]===i)continue;const d=a.includes(i);this.recent.set(e,(0,c.pushRecent)(a,i,this.host.getRecentMax())),s=!0,!d&&(0,c.isAutoFollowable)(i)&&(o=i)}if(!s||e!==this.activeTab)return;this.renderTabs();const a=(0,c.planFollow)(this.host.getFollowMode(),this.opened,this.editing);"none"!==a&&("stage"!==a?"diff"===this.mode?("open"===a&&this.setOpen(!0),this.maybeAutoDiff()):o&&this.openFile(o):o&&this.lastViewed.set(e,o))}resolve(e,t,n=!0){if(n&&!(0,c.isKnownExt)(e))return null;const i=[];d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?i.push(e):t&&i.push(d.join(t,e));for(const e of i)try{if(a.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,n;if("file"!==this.mode)return!1;if(this.editing)return this.setEditNote("다른 탭으로 옮겼다 — 저장하거나 취소하면 그 탭 파일로 넘어간다"),!0;const i=this.activeTab,r=i&&null!==(n=null!==(e=this.lastViewed.get(i))&&void 0!==e?e:(null!==(t=this.recent.get(i))&&void 0!==t?t:[])[0])&&void 0!==n?n:null;return r!==this.current&&(this.current=r,this.closeFind(),!!this.opened&&(r?(this.watch(r),this.renderCurrent(),!0):(this.unwatch(),this.renderEmpty(),!0)))}noteFile(e,t){var n;const i=this.resolve(t,this.host.cwdFor(e));i&&(this.recent.set(e,(0,c.pushRecent)(null!==(n=this.recent.get(e))&&void 0!==n?n:[],i,this.host.getRecentMax())),e===this.activeTab&&this.opened&&this.renderTabs())}openFile(e){var t,n,i,r;const o=String(null!=e?e:"").trim();if(!o)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,a=null!==(n=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==n?n:s,l=null!==(i=this.resolve(o,a,!1))&&void 0!==i?i:this.resolve(o,s,!1);if(this.applyMode("file"),!l)return this.setOpen(!0),void this.renderMessage("파일을 찾지 못했다",o);this.current=l,this.activeTab&&(this.recent.set(this.activeTab,(0,c.pushRecent)(null!==(r=this.recent.get(this.activeTab))&&void 0!==r?r:[],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{a.watchFile(e,{interval:1e3},(t,n)=>{"file"===this.mode&&this.watching===e&&t.mtimeMs!==n.mtimeMs&&this.renderCurrent()})}catch{}}}unwatch(){if(this.watching){try{a.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 n=null!==(t=this.footEl.textContent)&&void 0!==t?t:"";this.setFoot(n?e+" · "+n:e)}}renderCurrent(){var e;const t=this.current;if(!t||!this.bodyEl)return;if(this.editing)return this.editStale=!0,void this.refreshEditNote();let n;this.findHits=[],this.findIndex=-1;try{n=a.statSync(t)}catch{return void this.renderMessage("파일이 사라졌다",t)}this.setTitle(d.basename(t),t),this.setFoot((0,c.formatBytes)(n.size)+" · "+new Date(n.mtimeMs).toLocaleString()+" · "+t);try{switch((0,c.classify)(t)){case"image":this.renderImage(t,n);break;case"markdown":this.renderMarkdownFile(t);break;case"table":this.renderTable(t);break;case"text":this.renderText(t);break;default:this.renderBinary(t,n)}}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 n=b(e,25e6);n?this.bodyEl.innerHTML='<div class="ad-view-image"><img src="'+n+'" alt=""></div>':this.renderMessage("이미지가 너무 크다",(0,c.formatBytes)(t.size)+" — "+e)}renderMarkdownFile(e){const{text:t,truncated:n}=m(e,p),i=d.dirname(e),r=(0,l.renderMarkdown)(t,{resolveImage:e=>/^https?:/i.test(e)?e:b(d.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)?e:d.join(i,e),4e6)});this.bodyEl.innerHTML='<div class="ad-view-md">'+r+(n?'<p class="ad-view-dim">… 앞부분만 보여준다 ('+(0,c.formatBytes)(p)+")</p>":"")+"</div>"}renderTable(e){const{text:t,truncated:n}=m(e,p),i=(0,c.parseDelimited)(t,(0,c.delimiterFor)(e));if(!i.length)return void this.renderMessage("빈 파일",e);const r=i[0].slice(0,60),o=i.slice(1,401);this.bodyEl.innerHTML='<div class="ad-view-table"><table><thead><tr><th class="ad-view-rownum">#</th>'+r.map(e=>"<th>"+(0,l.escapeHtml)(e)+"</th>").join("")+"</tr></thead><tbody>"+o.map((e,t)=>'<tr><td class="ad-view-rownum">'+(t+1)+"</td>"+r.map((t,n)=>{return i=e[n],"<td>"+(0,l.escapeHtml)(null!=i?i:"")+"</td>";var i}).join("")+"</tr>").join("")+"</tbody></table>"+(i.length>401||n?'<p class="ad-view-dim">400행까지만 보여준다 (전체 '+(i.length-1)+"행)</p>":"")+"</div>"}renderText(e){const{text:t,truncated:n}=m(e,p),i=t.split("\n"),r=i.slice(0,4e3),o=n||i.length>4e3,s=['<div class="ad-view-code ad-view-code-rows" data-ad-ref-file="'+(0,l.escapeHtml)(e)+'">'];r.forEach((e,t)=>{const n=t+1;s.push('<div class="ad-cl" data-ad-ref-line="'+n+'"><span class="ad-cl-no">'+n+'</span><span class="ad-cl-tx">'+(0,l.escapeHtml)(e)+"</span></div>")}),s.push("</div>"),this.bodyEl.innerHTML=s.join("")+(o?'<p class="ad-view-dim">… 4000줄까지만 보여준다 (전체 '+i.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 n=this.canEdit();t.classList.toggle("ad-view-btn-on",this.editing),t.style.opacity=n||this.editing?"":"0.35",t.title=this.editing?"보기로 (Esc)":n?"편집 (저장 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 n,i;try{i=a.statSync(t),n=function(e,t){const n=a.readFileSync(e);if(n.length>t)return{text:"",truncated:!0,bom:!1,crlf:!1};let i=n.toString("utf8");const r=65279===i.charCodeAt(0);r&&(i=i.slice(1));const o=i.indexOf("\r\n")>=0;return{text:o?i.replace(/\r\n/g,"\n"):i,truncated:!1,bom:r,crlf:o}}(t,h)}catch(t){return void this.setEditNote("읽지 못했다: "+String(null!==(e=null==t?void 0:t.message)&&void 0!==e?e:t))}if(n.truncated)return this.setEditNote("너무 커서 편집할 수 없다 ("+(0,c.formatBytes)(h)+" 넘음) — 보기 전용"),void this.showEditBar(!0);this.closeFind(),this.editing=!0,this.editStale=!1,this.editOverwriteArmed=!1,this.editForceArmed=!1,this.editOrigin={file:t,text:n.text,bom:n.bom,crlf:n.crlf,mtimeMs:i.mtimeMs,readOnly:!C(t)};const r=document.createElement("textarea");r.className="ad-view-edit",r.spellcheck=!1,r.value=n.text,r.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&("s"===e.key||"S"===e.key||"f"===e.key||"F"===e.key)||"Escape"===e.key||e.stopPropagation()}),r.addEventListener("input",()=>this.refreshEditNote()),this.bodyEl.innerHTML="",this.bodyEl.appendChild(r),this.editArea=r,r.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,n;if(!this.editing||!this.editArea||!this.editOrigin)return;const i=this.editOrigin,r=this.editArea.value;if(r===i.text&&!this.editStale)return void this.setEditNote("바뀐 것이 없다");let o=this.editStale;try{o=o||a.statSync(i.file).mtimeMs!==i.mtimeMs}catch{}if(o&&!this.editOverwriteArmed)return this.editOverwriteArmed=!0,void this.setEditNote("밖에서 바뀐 파일이다 — 다시 누르면 덮어쓴다");const s=i.crlf?r.replace(/\n/g,"\r\n"):r,d=()=>a.writeFileSync(i.file,(i.bom?"\ufeff":"")+s,"utf8");try{d()}catch(r){const o=String(null!==(e=null==r?void 0:r.code)&&void 0!==e?e:"");if("EPERM"!==o&&"EACCES"!==o&&"EROFS"!==o)return void this.setEditNote("저장하지 못했다: "+String(null!==(t=null==r?void 0:r.message)&&void 0!==t?t:r));if(!this.editForceArmed)return this.editForceArmed=!0,void this.setEditNote("읽기 전용이다 (P4 면 p4 edit 먼저) — 다시 누르면 속성을 풀고 저장한다");try{a.chmodSync(i.file,438),d()}catch(e){return void this.setEditNote("저장하지 못했다: "+String(null!==(n=null==e?void 0:e.message)&&void 0!==n?n: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 n=null===(t=this.el)||void 0===t?void 0:t.querySelector(".ad-view-edit-btns");n&&(n.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 n=null!==(t=null===(e=this.findInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"";this.clearFindMarks(),n?this.editing&&this.editArea?this.findInTextarea(n,0):(this.markMatches(n),this.findIndex=this.findHits.length?0:-1,this.showFindHit()):this.findCountEl&&(this.findCountEl.textContent="")}stepFind(e){var t,n;const i=null!==(n=null===(t=this.findInput)||void 0===t?void 0:t.value)&&void 0!==n?n:"";i&&(this.editing&&this.editArea?this.findInTextarea(i,e):(this.findHits.length?this.findIndex=(this.findIndex+e+this.findHits.length)%this.findHits.length:(this.markMatches(i),this.findIndex=this.findHits.length?0:-1),this.showFindHit()))}findInTextarea(e,t){const n=this.editArea,i=n.value.toLowerCase(),r=e.toLowerCase(),o=r?i.split(r).length-1:0;if(!o)return void this.setFindCount(0,0);let s;if(t<0){const e=n.selectionStart-1;s=i.lastIndexOf(r,Math.max(e-1,0)),s<0&&(s=i.lastIndexOf(r))}else{const e=t>0?n.selectionStart+1:n.selectionStart;s=i.indexOf(r,e),s<0&&(s=i.indexOf(r))}if(s<0)return void this.setFindCount(0,0);n.focus(),n.setSelectionRange(s,s+e.length);const a=n.value.slice(0,s).split("\n").length-1,d=Math.max(1,Math.round(n.scrollHeight/Math.max(1,n.value.split("\n").length)));n.scrollTop=Math.max(0,a*d-n.clientHeight/2);const l=i.slice(0,s).split(r).length;this.setFindCount(l,o)}markMatches(e){var t;const n=this.bodyEl;if(!n||!e)return;const i=e.toLowerCase(),r=document.createTreeWalker(n,NodeFilter.SHOW_TEXT),o=[];let s;for(;s=r.nextNode();){const e=s;e.data&&e.data.toLowerCase().indexOf(i)>=0&&o.push(e)}for(const n of o){if(this.findHits.length>=2e3)break;const r=[];let o=n.data,s=0;for(;s++<500;){const t=o.toLowerCase().indexOf(i);if(t<0)break;t>0&&r.push(document.createTextNode(o.slice(0,t)));const n=document.createElement("mark");if(n.className="ad-find-hit",n.textContent=o.slice(t,t+e.length),r.push(n),this.findHits.push(n),o=o.slice(t+e.length),this.findHits.length>=2e3)break}if(!r.length)continue;o&&r.push(document.createTextNode(o));const a=document.createDocumentFragment();r.forEach(e=>a.appendChild(e)),null===(t=n.parentNode)||void 0===t||t.replaceChild(a,n)}}clearFindMarks(){var e;for(const t of this.findHits){const n=t.parentNode;n&&(n.replaceChild(document.createTextNode(null!==(e=t.textContent)&&void 0!==e?e:""),t),n.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(n=>{var i;try{(0,s.execFile)("git",["--no-pager","-C",e,...t],{encoding:"utf8",maxBuffer:33554432,timeout:5e3,windowsHide:!0},(e,t,i)=>{n({ok:!e,out:String(null!=t?t:""),err:String(i||(null==e?void 0:e.message)||"")})})}catch(e){n({ok:!1,out:"",err:String(null!==(i=null==e?void 0:e.message)&&void 0!==i?i: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 a.statSync(e).isDirectory()}catch{return!1}}(t))return this.setStatus([]),void this.renderDiffNote("작업 폴더가 폴더가 아니다",t);const n=++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,i,r])=>{let o=e.out;if(!e.ok){const i=e.err;if(/not a git repository/i.test(i))return void this.noGit(n,"git 저장소가 아니다",t,"이 폴더는 git 으로 관리되지 않는다 — 무엇이 바뀌었는지(diff)는 비교할 기준이 없다");if(/ENOENT|not recognized|command not found/i.test(i))return void this.noGit(n,"git 을 찾지 못했다","PATH 에 git 이 있어야 변경 내용을 비교할 수 있다","git 이 없어 diff 는 만들 수 없다");if(/ambiguous argument .?HEAD|unknown revision|bad revision/i.test(i)){const e=await this.runGit(t,["diff","--no-color"]);if(o=e.out,!e.ok&&!o)return void this.failDiff(n,"변경을 읽지 못했다",e.err)}else if(!o)return void this.failDiff(n,"변경을 읽지 못했다",i)}const s=(0,u.parseUnifiedDiff)(o),a=i.ok?(0,u.parseUntracked)(i.out):[];this.diffRoot=r.ok&&r.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)(a,e=>e,this.diffRoot,d);this.diffHidden=s.length-l.length+(a.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(n,()=>{this.setStatus(i.ok?(0,A.parseStatus)(i.out):[]),this.renderDiff(l,c,t)})}).catch(e=>{var t;this.failDiff(n,"변경을 읽지 못했다",String(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e))})}touchedNow(){var e,t,n,i;return null!==(i=null===(t=(e=this.host).touchedFor)||void 0===t?void 0:t.call(e,null!==(n=this.activeTab)&&void 0!==n?n:{}))&&void 0!==i?i:[]}finishDiff(e,t){e===this.diffSeq&&"diff"===this.mode&&this.bodyEl&&t()}failDiff(e,t,n){this.finishDiff(e,()=>{this.setStatus([]),this.renderDiffNote(t,n)})}noGit(e,t,n,i){var r;const o=this.touchedNow();if(!o.length)return void this.failDiff(e,t,n);const s=this.host.cwdFor(null!==(r=this.activeTab)&&void 0!==r?r:{});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)("이 세션이 만진 파일 "+o.length+"개")+"</div>"),e.push('<p class="ad-view-dim">'+(0,l.escapeHtml)(t+" — "+i)+"</p>"),e.push('<div class="ad-view-diff-list">');for(const t of o.slice(0,200)){const n=(0,u.refPathFrom)(t,s);e.push('<div class="ad-view-diff-u" data-ad-open="'+(0,l.escapeHtml)(t)+'">'+(0,l.escapeHtml)(n)+' <span class="ad-view-dim">'+(0,l.escapeHtml)(v(t))+"</span></div>")}o.length>200&&e.push('<p class="ad-view-dim">… 이후 생략</p>'),e.push("</div></div>"),this.bodyEl.innerHTML=e.join(""),this.setFoot(n)})}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,n){this.setCommitVisible(!0);const i=e.slice(0,200),r=['<div class="ad-view-diff">'],o="session"===this.diffScope&&this.diffHidden>0?" · 이 세션이 만진 것만 ("+this.diffHidden+"개 숨김)":"";if(r.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)((0,u.formatStat)(e)+o)+"</div>"),i.length&&(r.push('<div class="ad-view-diff-list">'),i.forEach((e,t)=>{r.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>i.length&&r.push('<p class="ad-view-dim">… 이후 생략 (전체 '+e.length+"개 파일)</p>"),r.push("</div>")),t.length){const e=t.slice(0,100);r.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))+'"';r.push('<div class="ad-view-diff-u"'+e+">"+this.stageChipHtml(t)+" "+(0,l.escapeHtml)(t)+"</div>")}t.length>e.length&&r.push('<p class="ad-view-dim">… 이후 생략</p>'),r.push("</div>")}if(!i.length&&!t.length){const e="session"===this.diffScope&&this.diffHidden>0;r.push('<div class="ad-view-empty"><p>'+(e?"이 세션이 만진 파일은 아직 없다":"변경 없음")+'</p><p class="ad-view-dim">'+(0,l.escapeHtml)(e?"저장소에는 "+this.diffHidden+"개의 변경이 있다 — `전체` 로 보면 나온다":n)+"</p></div>")}let s=2e4;i.forEach((e,t)=>{r.push('<div class="ad-view-diff-file" id="ad-diff-'+t+'">');const n=e.oldPath?e.oldPath+" → "+e.path:e.path;if(r.push('<div class="ad-view-diff-fhead" data-ad-open="'+(0,l.escapeHtml)(this.absOf(e.path))+'" title="'+(0,l.escapeHtml)(n)+'">'+(0,l.escapeHtml)(n)+"</div>"),e.binary)r.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));r.push('<div class="ad-view-diff-lines" data-ad-ref-file="'+(0,l.escapeHtml)(e.path)+'">');for(let n=0;n<t;n++)r.push(this.diffLineHtml(e.lines[n]));r.push("</div>"),s-=t,t<e.lines.length&&r.push('<div class="ad-view-diff-note">… 이후 생략 (전체 '+e.lines.length+"줄)</div>")}else r.push('<div class="ad-view-diff-note">내용 변경 없음</div>');r.push("</div>")}),r.push("</div>"),this.bodyEl.innerHTML=r.join(""),this.applyRefSel(),this.setFoot((0,u.formatStat)(e)+" · "+(new Date).toLocaleTimeString()+" 기준 · "+n)}diffLineHtml(e){var t,n;const i="add"===e.kind?"+":"del"===e.kind?"-":" ",r="hunk"===e.kind?e.text:i+e.text,o=(0,u.refLineNo)(e),s=null===o?' data-ad-ref-del="'+("hunk"===e.kind?"hunk":"del")+'"':' data-ad-ref-line="'+o+'"';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!==(n=e.newNo)&&void 0!==n?n:"")+'</span><span class="ad-dl-tx">'+(0,l.escapeHtml)(r)+"</span></div>"}absOf(e){const t=this.diffRoot;return t?d.join(t,e):e}clickRefLine(e,t){var n;const i="function"==typeof window.getSelection?window.getSelection():null;if(t){if(i&&!i.isCollapsed)try{i.removeAllRanges()}catch{}}else if(i&&!i.isCollapsed&&String(i))return;const r=e.getAttribute("data-ad-ref-del");if(null!==r)return void this.setRefNote("hunk"===r?"헝크 머리줄은 내용이 아니다 — 아래 줄을 고르면 그 자리를 가리킨다":"삭제된 줄은 지금 파일에 없다 — 옆 문맥줄을 고르면 그 자리를 가리킨다");const o=Number(e.getAttribute("data-ad-ref-line"));if(!Number.isFinite(o)||o<=0)return;const s=e.closest("[data-ad-ref-file]"),a=null!==(n=null==s?void 0:s.getAttribute("data-ad-ref-file"))&&void 0!==n?n:"";if(!a)return void this.setRefNote("어느 파일의 줄인지 몰라 참조를 만들지 못했다");const d=this.refSel,l=t&&d&&d.file===a?d.from:o,c=Math.min(l,o),u=Math.max(l,o);this.refSel={file:a,from:c,to:u},this.applyRefSel(),this.sendRef(a,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 n of Array.from(t.querySelectorAll("[data-ad-ref-line]"))){const t=Number(n.getAttribute("data-ad-ref-line"));Number.isFinite(t)&&t>=e.from&&t<=e.to&&n.classList.add("ad-ref-sel")}}sendRef(e,t,n){var i,r;const o=this.host.cwdFor(null!==(i=this.activeTab)&&void 0!==i?i:{}),s=(0,u.formatLineRef)((0,u.refPathFrom)((0,u.joinRefPath)(this.diffRoot,e),o),t,n);if(!s)return void this.setRefNote("참조를 만들지 못했다 — 경로가 비어 있다");if(!this.host.sendText)return void this.setRefNote("터미널에 넣지 못했다 — 넣을 자리가 배선되지 않았다 · "+s);const a=Date.now(),d=this.refLastSent,l=!!d&&a-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 A=!1;try{A=!!this.host.sendText(c)}catch(e){return void this.setRefNote("터미널에 넣지 못했다 · "+String(null!==(r=null==e?void 0:e.message)&&void 0!==r?r:e))}A?(this.refLastSent={text:s,at:a},this.setRefNote("넣었다 · "+s+(l?" (꼬리만)":""),!0)):this.setRefNote("터미널에 넣지 못했다 — 넣을 터미널이 없다 · "+s)}setRefNote(e,t=!1){const n=this.refNoteEl;n&&(n.textContent=e,n.title=e,n.style.display=e?"block":"none",this.refFlashTimer&&(clearTimeout(this.refFlashTimer),this.refFlashTimer=null),n.classList.toggle("ad-view-ref-on",!!e&&t),e&&t&&(this.refFlashTimer=setTimeout(()=>{this.refFlashTimer=null,n.classList.remove("ad-view-ref-on")},2500)))}stageChipHtml(e){const t=this.statusByPath.get(e);if(!t)return"";const n="staged"===t.state?"reset":"add";let i;return i="reset"===n?"누르면 스테이지에서 내린다 — 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="'+n+'" title="'+(0,l.escapeHtml)(i)+'">'+(0,l.escapeHtml)((0,A.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,A.formatStageSummary)(e)),this.syncCommitButton()}syncCommitButton(){var e,t;const n=this.commitBtn;n&&(n.disabled=!(0,A.validateMessage)(null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"").ok||this.gitBusy,n.textContent=this.commitArmed?"커밋 확인":"커밋",n.classList.toggle("ad-view-commit-armed",this.commitArmed),n.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 n,i,r;if(!e||this.gitBusy)return;const o=null!==(n=this.diffRoot)&&void 0!==n?n:this.host.cwdFor(null!==(i=this.activeTab)&&void 0!==i?i:{});if(!o)return void this.setCommitNote("작업 폴더를 몰라 스테이지를 바꾸지 못한다");const s="add"===t?(0,A.stageArgs)([e]):(0,A.unstageArgs)([e]);if(s.length){this.gitBusy=!0,this.disarmCommit();try{let n=await this.runGit(o,s);!n.ok&&"reset"===t&&/ambiguous argument .?HEAD|unknown revision|bad revision|HEAD/i.test(n.err)&&(n=await this.runGit(o,(0,A.unstageFallbackArgs)([e]))),this.setCommitNote(n.ok?("add"===t?"스테이지에 올렸다 · ":"스테이지에서 내렸다 · ")+e:"스테이지를 바꾸지 못했다 · "+(f(n.err)||f(n.out)))}catch(e){this.setCommitNote("스테이지를 바꾸지 못했다 · "+String(null!==(r=null==e?void 0:e.message)&&void 0!==r?r:e))}finally{this.gitBusy=!1,this.syncCommitButton()}this.refreshDiff()}}pressCommit(){var e,t,n;if(this.gitBusy)return;const i=null!==(t=null===(e=this.commitInput)||void 0===e?void 0:e.value)&&void 0!==t?t:"",r=(0,A.validateMessage)(i);return r.ok?(0,A.hasStaged)(this.statusEntries)?this.commitArmed?void this.runCommit(i):(this.commitArmed=!0,this.syncCommitButton(),void this.setCommitNote("다시 누르면 커밋한다 (Esc 취소) · "+(0,A.formatStageSummary)(this.statusEntries))):(this.disarmCommit(),void this.setCommitNote("스테이지에 올린 것이 없다 — 파일 목록의 딱지를 눌러 올려라")):(this.disarmCommit(),void this.setCommitNote(null!==(n=r.reason)&&void 0!==n?n:"커밋 메시지를 확인해야 한다"))}async runCommit(e){var t,n,i;const r=(0,A.commitArgs)(e);if(!r.length)return this.disarmCommit(),void this.setCommitNote("커밋 메시지를 확인해야 한다");const o=null!==(t=this.diffRoot)&&void 0!==t?t:this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{});if(!o)return this.disarmCommit(),void this.setCommitNote("작업 폴더를 몰라 커밋하지 못한다");this.gitBusy=!0,this.syncCommitButton();try{const e=await this.runGit(o,r);e.ok?(this.commitInput&&(this.commitInput.value=""),this.setCommitNote("커밋했다 · "+(f(e.out)||f(e.err)))):this.setCommitNote("커밋하지 못했다 · "+(f(e.err)||f(e.out)))}catch(e){this.setCommitNote("커밋하지 못했다 · "+String(null!==(i=null==e?void 0:e.message)&&void 0!==i?i: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.extractPaths=t.isKnownExt=t.classify=void 0;const n=["png","jpg","jpeg","gif","webp","bmp","svg","ico","avif"],i=["md","markdown","mdx"],r=["csv","tsv"],o=["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([...n,...i,...r,...o]);function a(e){var t;const n=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"",i=n.lastIndexOf(".");return i<=0?n.toLowerCase():n.slice(i+1).toLowerCase()}function d(e){return s.has(a(e))}t.classify=function(e){const t=a(e);return n.includes(t)?"image":i.includes(t)?"markdown":r.includes(t)?"table":o.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}","g"),u=/[\u2000-\u206f\u2190-\u2bff\u3000-\u303f\uff00-\uffef]/,A=/[),.;:'"`\]}]+$/;t.extractPaths=function(e){var t;const n=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),i=[],r=new Set;let o;for(c.lastIndex=0;null!==(o=c.exec(n));){let e=o[0].replace(A,"");if(!e||u.test(e))continue;const s=n.slice(Math.max(0,o.index-3),o.index);/:\/\/?$/.test(s)||/^https?$/i.test(null!==(t=e.split(/[\\/]/)[0])&&void 0!==t?t:"")||d(e)&&(/^[vV]?[\d.]+$/.test(e)||(e=e.replace(/^\.[\\/]/,""),r.has(e)||(r.add(e),i.push(e))))}return i};const p=/^(?:\.?claude\.json|settings(?:\.[\w-]+)?\.json)$/i;t.isAutoFollowable=function(e){var t;const n=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"";return!!n&&!p.test(n)},t.pushRecent=function(e,t,n){return[t,...e.filter(e=>e!==t)].slice(0,Math.max(1,n))},t.parseDelimited=function(e,t=","){const n=[];let i=[],r="",o=!1;const s=String(null!=e?e:"").replace(/\r\n?/g,"\n");for(let e=0;e<s.length;e++){const a=s[e];o?'"'===a?'"'===s[e+1]?(r+='"',e++):o=!1:r+=a:'"'===a?o=!0:a===t?(i.push(r),r=""):"\n"===a?(i.push(r),n.push(i),i=[],r=""):r+=a}return(r||i.length)&&(i.push(r),n.push(i)),n},t.delimiterFor=function(e){return"tsv"===a(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 h=["open","show","manual"];t.followModeOf=function(e,t){return!1===e?"manual":!0===t?"open":"show"},t.migrateFollow=function(e,t){const n="string"==typeof e&&h.includes(e)?e:!1===t?"manual":null;return n?{preload:"manual"!==n,autoOpen:"open"===n}:null},t.planFollow=function(e,t,n){return n||"manual"===e?"none":t?"show":"open"===e?"open":"stage"}},5317(e){e.exports=require("child_process")},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")},4358(t){t.exports=e},860(e){e.exports=t},7182(e){e.exports=n},3961(e){e.exports=i},7650(e){e.exports=r},3700(e){e.exports=o},8349(e){e.exports=s}};const d={};function l(e){const t=d[e];if(void 0!==t)return t.exports;const n=d[e]={id:e,exports:{}};return a[e].call(n.exports,n,n.exports,l),n.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 n=e;e=0,t={exports:{}},n.call(t.exports,t,t.exports)}return t.exports}},l.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],r=t[n++],o=0===r?{enumerable:!0,value:t[n++]}:{enumerable:!0,get:r};l.o(e,i)||Object.defineProperty(e,i,o)}else for(var i in t)l.o(t,i)&&!l.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.nc=void 0,l(8156)})());
2
- //# sourceMappingURL=index.js.map
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,s,a)=>(()=>{"use strict";var r={6100(e,t,i){var n=i(1601),o=i.n(n),s=i(6314),a=i.n(s)()(o());a.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>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-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{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.45);font-size:16px}#agentdeck-sidebar .ad-now-gauges{display:flex;flex-direction:column;gap:6px;margin-top:9px}#agentdeck-sidebar .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-gauge: #e5c07b;color:rgba(229,192,123,.9)}#agentdeck-sidebar .ad-now-gauge.ad-now-hot{--ad-gauge: #e06c75;color:#e06c75;font-weight:600}#agentdeck-sidebar .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{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{display:block;height:100%;border-radius:6px;background:var(--ad-gauge);transition:width .3s ease}#agentdeck-sidebar .ad-now-gauge-pct{flex:0 0 auto;min-width:46px;text-align:right;font-size:16px}#agentdeck-sidebar .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}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}",""]);const r=a;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,s){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(n)for(var r=0;r<this.length;r++){var d=this[r][0];null!=d&&(a[d]=!0)}for(var l=0;l<e.length;l++){var c=[].concat(e[l]);n&&a[c[0]]||(void 0!==s&&(void 0===c[5]||(c[1]="@layer".concat(c[5].length>0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),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={},a=[],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=s(h,t);t.byIndex=r,i.splice(r,0,{identifier:u,updater:g,references:1})}a.push(u)}return a}function s(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 s=o(e=e||[],t=t||{});return function(e){e=e||[];for(var a=0;a<s.length;a++){var r=n(s[a]);i[r].references--}for(var d=o(e,t),l=0;l<s.length;l++){var c=n(s[l]);0===i[c].references&&(i[c].updater(),i.splice(c,1))}s=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)}}),s=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}}),a=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 s=i.sourceMap;s&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),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(),a(),s(),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(a()))}()(),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(s()))}()(),function e(){return e.c||(e.c=i.n(n()))}()()(l.A,c),l.A&&l.A.locals&&l.A.locals},3532(e,t){t.identifyAgent=t.detectProfileFor=t.profileFor=t.unionProfile=t.d=t.AGENT_PROFILES=void 0;const i=/\(y\/n\)/i,n=/\[y\/N\]/i,o=/Press Enter to continue/i,s=/ctrl\+c to (?:interrupt|cancel|stop)/i,a=[">","❯","›","❭","➜"],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,s,/\btokens?\b.{0,20}\besc\b/i],limitedPatterns:[],busyTitleMarks:["✳","✻","✽","✶","✢","◐","◓","◑","◒"],imagePasteKey:"alt-v",promptHeads:["❯",">"],patternsProven:!0},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:[i,n,o],busyPatterns:[s],limitedPatterns:[/usage limit reached/i,/reached your usage limit/i],busyTitleMarks:[],imagePasteKey:"ctrl-v",promptHeads:a,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:a,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([...a,...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,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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 s=i(860),a=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 s=this.nativeImage();if(!s)return null;const a=e>9?"9+":String(e);let r;try{if(r=s.createEmpty(),r.addRepresentation({scaleFactor:1,width:16,height:16,dataURL:this.drawBadge(16,a,i)}),r.addRepresentation({scaleFactor:2,width:32,height:32,dataURL:this.drawBadge(32,a,i)}),null===(t=r.isEmpty)||void 0===t?void 0:t.call(r))throw new Error("empty after addRepresentation")}catch{r=s.createFromDataURL(this.drawBadge(32,a,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 s=e/2;return o.clearRect(0,0,e,e),o.beginPath(),o.arc(s,s,s-.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,s,s+.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,s.Injectable)({providedIn:"root"}),o("design:paramtypes",[a.AppService,a.ConfigService,s.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}),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};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 a=s(i(9896)),r=s(i(857)),d=s(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(r.homedir(),".claude","settings.json")}function p(){return d.join(__dirname,"..","hooks","agentdeck-notify.ps1")}function h(){try{const e=a.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 b(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 m(e){const t=u();a.mkdirSync(d.dirname(t),{recursive:!0}),a.existsSync(t)&&a.copyFileSync(t,t+".agentdeck-backup"),a.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}t.claudeSettingsPath=u,t.notifyScriptPath=p,t.hooksSupported=function(){return"win32"===process.platform&&a.existsSync(p())},t.isMerged=f,t.mergeHooks=b,t.stripHooks=v,t.hooksInstalled=function(){return f(h())},t.installHooks=function(){const e=p();if(!a.existsSync(e))throw new Error(`훅 스크립트를 찾지 못했다: ${e}`);m(b(h(),e))},t.uninstallHooks=function(){m(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}),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};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 a=s(i(9896)),r=s(i(857)),d=s(i(6928)),l="agentdeck-codex-notify.ps1";function c(){return d.join(process.env.CODEX_HOME||d.join(r.homedir(),".codex"),"hooks.json")}function u(){return d.join(process.env.CODEX_HOME||d.join(r.homedir(),".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 b(e,i){var n;const o=f(e),s=`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:s,timeout:3}]}];return o}function v(){const e=c();if(!a.existsSync(e))return{};const t=JSON.parse(a.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=a.readFileSync(u(),"utf8")}catch{return[]}const i=[],n=e=>e.toLowerCase().replace(/\\/g,"/"),o=n(c());for(const s of e.split(/\n(?=\[)/)){const e=p(s);if(!e)continue;const a=e.split(":");if(a.length<4)continue;a.pop(),a.pop();const r=a.pop();n(a.join(":"))===o&&t.CODEX_EVENTS.includes(h(r))&&/^\s*enabled\s*=\s*false\s*$/m.test(s)&&i.push(r)}return i},t.codexEventLabel=h,t.stripCodexHooks=f,t.mergeCodexHooks=b,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&&!a.existsSync(i))throw new Error(`Missing hook: ${i}`);const n=v(),o=e?b(n,i):f(n);a.mkdirSync(d.dirname(t),{recursive:!0}),a.existsSync(t)&&a.copyFileSync(t,`${t}.agentdeck-backup-${Date.now()}`),a.writeFileSync(t,JSON.stringify(o,null,2)+"\n","utf8")}},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,s,a,r,d,l,c,u,p,h,g;const f=t.trim();if(!f)return;let b;try{b=JSON.parse(f)}catch{return void e.skipped++}e.lines++;const v=null!==(o=null==b?void 0:b.payload)&&void 0!==o?o:{},m=String(null!==(s=null==b?void 0:b.type)&&void 0!==s?s:"");if("session_meta"===m)return e.cwd=String(null!==(a=v.cwd)&&void 0!==a?a: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"===m)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 s=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(s))&&(e.lastTokens=Number(s))}}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 s=(e.pending+n).split("\n");e.pending=null!==(i=s.pop())&&void 0!==i?i:"",e.pending.length>2097152&&(e.dropped++,e.pending="");for(const t of s)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,s=null==o?void 0:o.element;if(!s||e.__adCodexWheel)return;e.__adCodexWheel=!0;let a=!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))))};s.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 s=d(),c=i(s),u=o.buffer.active,p=s.reduce((e,t,i)=>t.trim()?i+1:e,0),h=s.slice(Math.max(0,p-4),p).some(e=>/Context \d+% left/.test(e));if(!c&&!a&&("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)),a)return;a=!0,n("");let f=0;const b=()=>{if(!t()||++f>20)return a=!1,void(r=0);i(d())?(a=!1,l(r),r=0):setTimeout(b,50)};setTimeout(b,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:{enabled:!0,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:6,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-Shift-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,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-Shift-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-Shift-T","⌘-T"],"agentdeck-view":["Ctrl-Shift-O"],"agentdeck-view-mode":[],"agentdeck-repair":["Ctrl-Shift-R"]}}}}t.AgentDeckConfigProvider=o,t.defaultHotkeys=function(){var e;const t=new o,i={...t.defaults.hotkeys},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 s{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 s,p=new n.SynchronizedOutputStream,h=new a;let g,f;const b=e=>e?(d.forwarded++,l(e)):Promise.resolve();let v=null;const m=()=>{f&&(clearTimeout(f),f=void 0),p.waiting||h.visible===v||(f=setTimeout(()=>{f=void 0,h.visible!==v&&(v=h.visible,Promise.resolve(b(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(b(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,s=t(n);d.calls++,s&&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))})(s),s||null===v||(v=null);const a=u.write(c.write(n,s),s),l=h.deferredShows,k=p.write(h.write(a,s),s);d.deferredShows+=h.deferredShows-l,r&&0===l&&h.deferredShows>0&&r(`stable-cursor engaged active=${s} 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(b(x(p.flush(),!0))).catch(()=>{}),m()},200)),!o&&c.corrections&&i();const y=b(x(k,s));return s&&m(),y}};class a{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]}),s=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,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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 s(t,e),t},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}),t.AgentDeckService=t.matchesSearchTokens=t.searchTokens=t.foldSearchText=void 0;const l=r(i(9896)),c=i(860),u=i(568),p=i(5140),h=i(5633),g=i(160),f=i(7650),b=i(3700),v=i(6021),m=i(7110),k=i(1385),y=i(3532),w=i(4300),x=i(9660),S=i(9851),C=i(9306),j=i(1481),z=i(7617),T=i(7144),A=i(6879),P=i(4086),D=i(9137),E=i(1424),O=i(2425),L=i(3097),M=i(7604),R=i(7797),I="agentdeck-sidebar",$="ad-bg-clip",N=320,_=[150,400,900,1800,3e3],F=[250,800,1800];let H;function B(e){const t="number"==typeof e&&isFinite(e)?e:100;return Math.min(100,Math.max(0,Math.round(t)))}function W(e){if("string"!=typeof e||!e)return"";let t=e;try{t=t.normalize("NFC")}catch{}return t.toLowerCase().replace(/\\/g,"/")}function q(e){return W(e).split(/\s+/).filter(e=>e.length>0)}function K(e,t){if(!t.length)return!0;const i=[];for(const t of e){const e=W(t);e&&i.push(e)}return t.every(e=>i.some(t=>t.includes(e)))}t.foldSearchText=W,t.searchTokens=q,t.matchesSearchTokens=K;let U=n=class{constructor(e,t,i,n,o,s,a,r,d,l){this.app=e,this.config=t,this.status=i,this.hotkeys=n,this.profiles=o,this.hostWindow=s,this.platform=a,this.notify=r,this.ledger=d,this.zone=l,this.sidebar=null,this.listEl=null,this.nowEl=null,this.resumeEl=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.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.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}init(){this.app.ready$.subscribe(()=>this.zone.runOutsideAngular(()=>{var e,t,i,n,o;(0,R.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,R.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,R.diagOnce)(e,t)}diag(e){(0,R.diag)(e)}diagConfig(){return(0,R.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.migrateFollowConfig(),this.buildSidebar(),this.buildView(),this.applyEnabled(),this.applyOpacity(),this.disableBackgroundThrottling(),this.ensurePasteHotkey(),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.scheduleRender()});for(const e of this.app.tabs)this.watchTab(e);this.status.changed$.subscribe(()=>this.scheduleRender()),this.notify.onMetaChange=()=>this.scheduleRender(),this.config.changed$.subscribe(()=>{var e;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),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],s=n[t];if(!o||!s)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)};if(this.config.store.agentDeck.sortByStatus)return{ok:!1,reason:"상태순 정렬이 켜져 있어 순서를 바꿀 수 없다",order:n.map((e,t)=>t)};const a=this.applyReorder(o,s,i);return this.render(),{ok:a,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:s}=this.navPlan(),a=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:s,count:o.length,focused:this.navFocus?a(this.navFocus):null,rows:o.map(a),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,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,s,a,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!==(a=null===(s=this.cwdCache.get(e))||void 0===s?void 0:s.at)&&void 0!==a?a:null,projectRoot:(0,P.projectRootOf)(null!==(d=null===(r=this.cwdCache.get(e))||void 0===r?void 0:r.dir)&&void 0!==d?d:null)}}),projectRoots:(0,P.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,A.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,O.resumeRowsFor)(i,{groupKeys:null,keyOf:e=>(0,A.groupKeyOf)(e,P.projectRootOf),fold:A.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:y.AGENT_PROFILES.map(e),union:e((0,y.unionProfile)()),effective:y.AGENT_PROFILES.map(t=>e((0,y.detectProfileFor)(t.id))),identify:(e,t)=>(0,y.identifyAgent)(e,t),fallback:y.AGENT_PROFILES.map(e=>{const t=(0,y.detectProfileFor)(e.id),i=(0,y.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,C.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,s,a,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!==(a=null===(s=this.profileForPane(c))||void 0===s?void 0:s.id)&&void 0!==a?a:"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,R.diagMemory)(),diagPaths:()=>({diag:R.DIAG_PATH,prev:R.DIAG_PREV_PATH,screen:R.SCREEN_PATH}),collectDiag:(e=!1)=>{var t,i,n,o;return(0,R.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,R.configStamp)(this.config.store)}})}})}repair(e="all"){const t="active"===e&&this.app.activeTab?[this.app.activeTab]:this.app.tabs;this.diag(`repair scope=${e} tabs=${t.length}`),this.relayout(),requestAnimationFrame(()=>requestAnimationFrame(()=>{for(const e of t){const t=e,i="function"==typeof t.getAllTabs?t.getAllTabs():[e];for(const e of i)this.repairPane(e)}}))}repairPane(e){var t,i,n,o,s,a,r;const d=this.config.store.agentDeck,l=e.frontend,c=null==l?void 0:l.xterm,u=null===(t=null==c?void 0:c.element)||void 0===t?void 0:t.parentElement;if(!(null==u?void 0:u.clientWidth)||!(null==u?void 0:u.clientHeight))return;const p=this.readScreen(e),h=p?(0,C.judgeScreen)(p.lines,p.cols,null===(i=this.profileForPane(e))||void 0===i?void 0:i.screenShape):null;this.snapshot(e,`manual-before ${h?h.broken?h.reasons.join(" / "):"판정=정상":"읽을 수 없음"}`);try{null===(o=null===(n=null==l?void 0:l.fitAddon)||void 0===n?void 0:n.fit)||void 0===o||o.call(n)}catch{}if(this.syncPtySize(e,l),p&&this.clearInputArea(e,p),!0===d.repairHard)try{null===(s=null==c?void 0:c.reset)||void 0===s||s.call(c)}catch{}try{null===(a=null==c?void 0:c.refresh)||void 0===a||a.call(c,0,(null!==(r=c.rows)&&void 0!==r?r:1)-1)}catch{}this.nudgePtyRedraw(e),!0===d.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const i=this.readScreen(e),n=i?(0,C.judgeScreen)(i.lines,i.cols,null===(t=this.profileForPane(e))||void 0===t?void 0:t.screenShape):null;this.snapshot(e,"manual-after "+(n?n.broken?"아직 깨짐: "+n.reasons.join(" / "):"복구됨":"읽을 수 없음"))},1500)}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,u.canRepairComposer)(null===(i=this.profileForPane(e))||void 0===i?void 0:i.id))return!1;const s=null===(n=e.frontend)||void 0===n?void 0:n.xterm;if(!s||"function"!=typeof s.write)return!1;const a=t.lines,r=null===(o=this.profileForPane(e))||void 0===o?void 0:o.screenShape,d=Math.max(0,a.length-C.INPUT_TAIL),l=e=>(0,C.isRuleRow)(a[e].text,r)||(0,C.isGhostRuleRow)(a[e].text,t.cols,r);let c=-1;for(let e=a.length-1;e>=d;e--)if(l(e)){c=e;break}if(c<0)return!1;let p=c;for(let e=c-1;e>=Math.max(d,c-12);e--)l(e)&&(p=e);const h=p+1;this.diag(`clear input area row=${h}/${a.length}`);try{s.write(`7[${h};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,s,a,r,d,l,c,p,h,g,f,b;if(!(0,u.canRepairComposer)(null===(t=this.profileForPane(e))||void 0===t?void 0:t.id))return;const v=this.config.store.agentDeck,m=this.readScreen(e);if(!m)return;const k=(0,C.judgeScreen)(m.lines,m.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),!v.autoRepairScreen)return;if(x<(null!==(o=v.autoRepairMinStreak)&&void 0!==o?o:2))return;const j=e,z=Date.now(),T=null!==(s=this.autoRepairAt.get(e))&&void 0!==s?s:0,A=null!==(a=this.autoRepairCount.get(e))&&void 0!==a?a:0,P=null!==(r=v.autoRepairMaxPerTab)&&void 0!==r?r:5;if(z-T<(null!==(d=v.autoRepairCooldownMs)&&void 0!==d?d:4e3))return;if(P>0&&A>=P)return void this.diagOnce("auto-repair-cap",`screen auto-repair 한도 도달 (${A}/${P}) — 더 고치지 않는다. 사이드바 ↻ 로 직접 복구할 것. 마지막 판정: ${k.reasons.join(" / ")}`);const D=null===(l=j.frontend)||void 0===l?void 0:l.xterm,E=null==D?void 0:D.cols,O=null==D?void 0:D.rows;(0,C.sizeInSync)(E,O,null===(c=j.size)||void 0===c?void 0:c.columns,null===(p=j.size)||void 0===p?void 0:p.rows)?(this.diag(`screen BROKEN cols=${m.cols} sent=${null===(f=j.size)||void 0===f?void 0:f.columns}x${null===(b=j.size)||void 0===b?void 0:b.rows} ${k.reasons.join(" / ")}`),this.snapshot(e,`auto-before ${k.reasons.join(" / ")}`),this.autoRepairAt.set(e,z),this.autoRepairCount.set(e,A+1),this.diag(`screen auto-repair #${A+1}`),this.clearInputArea(e,m),!0===v.repairSendRedrawKey&&setTimeout(()=>this.sendRedrawKey(e),180),setTimeout(()=>{var t;const i=this.readScreen(e),n=i?(0,C.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(" / "):"복구됨":"읽을 수 없음"))},1500)):this.diagOnce("auto-repair-resizing",`screen 자동복구 보류 — 크기가 어긋나 있다 (xterm ${E}x${O} vs pty ${null===(h=j.size)||void 0===h?void 0:h.columns}x${null===(g=j.size)||void 0===g?void 0:g.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,R.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 s=null===(t=e.frontend)||void 0===t?void 0:t.xterm,a=null===(i=null==s?void 0:s.buffer)||void 0===i?void 0:i.active;if(!(a&&"function"==typeof a.getLine&&s.cols>1))return null;const r=null===(n=s.element)||void 0===n?void 0:n.parentElement;if(!(null==r?void 0:r.clientWidth))return null;const d=[];try{for(let e=a.baseY;e<=a.baseY+s.rows-1;e++){const t=a.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:s.cols}}snapshot(e,t){var i,n,o,s;const a=this.readScreen(e);if(!a)return;const r=e,d=null===(i=r.frontend)||void 0===i?void 0:i.xterm,l=`\n===== ${(new Date).toISOString()} ${t} cols=${a.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!==(s=e.title)&&void 0!==s?s:"")} =====`,c=a.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,R.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,k.applyTitle)(this.status,e,t,this.config.store.agentDeck.autoDetect,this.profileForTab(e))}),i.title&&(0,k.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,s,a,r,d,l;this.installCodexCursorFix(t),i&&i.output$&&(this.diag(`session bind xterm=${null===(s=null===(o=n.frontend)||void 0===o?void 0:o.xterm)||void 0===s?void 0:s.cols}x${null===(r=null===(a=n.frontend)||void 0===a?void 0:a.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 s=this.paneAgents.get(t);("unknown"===(null!==(o=this.tabAgents.get(e))&&void 0!==o?o:"unknown")||(null==s?void 0:s.session)===n.session&&"unknown"===(null==s?void 0:s.tracker.id))&&this.probeAgent(e,"output"),(0,k.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,g.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,p.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 h.TerminalAgentTracker},this.paneAgents.set(e,i)),i.tracker.write(t)}announceSizeOnOpen(e){const t=e;for(const e of F)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 s=t.size;(null==s?void 0:s.columns)===n.cols&&(null==s?void 0:s.rows)===n.rows||this.diag(`announce size ${null==s?void 0:s.columns}x${null==s?void 0:s.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,R.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)}`))}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-Shift-R"],t=!0);const n=Array.isArray(e["agentdeck-repair"])?e["agentdeck-repair"]:[],o=Array.isArray(e["rename-tab"])?e["rename-tab"]:[],s=o.filter(e=>!n.includes(e));s.length!==o.length&&(e["rename-tab"]=s,t=!0),t&&(this.config.save(),this.diag(`hotkeys repair claimed: ours=${JSON.stringify(n)} rename-tab=${JSON.stringify(o)} -> ${JSON.stringify(s)}`))}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 s="list"===this.navMode;if(!s&&this.isDeckUiKey(e.target))return;const a=(0,D.pickCloseTarget)({inList:s,focus:this.navFocus,active:null!==(t=this.app.activeTab)&&void 0!==t?t:null,tabs:this.app.tabs});a?(e.preventDefault(),e.stopPropagation(),this.diag(`ctrl-w close inList=${s} tabs=${this.app.tabs.length}`),this.zone.run(()=>{this.app.closeTab(a,!0)})):this.diag(`ctrl-w skip inList=${s} 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,j.readCompositionState)(n),s=(0,j.planSend)(o);this.diag(`ime home-end key=${t} keyCode=${e.keyCode} ${this.describeComposition(n)} evComposing=${e.isComposing} state=${o} plan=${s}`)},!0)}sendToPane(e,t,i){const n=()=>{try{i()}catch{}};if(!this.config.store.agentDeck.imeOrderGuard)return void n();const o=this.compositionHelper(e),s=(0,j.readCompositionState)(o),a=(0,j.planSend)(s);this.diag(`ime send=${t} ${this.describeComposition(o)} state=${s} plan=${a}`),"defer"!==a?"after-composition"!==a?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,j.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));return this.diag(`ime send=${t} no-textarea flushed=${n}`),void i()}let o=!1;const s=e=>{o||(o=!0,n.removeEventListener("compositionend",a),clearTimeout(r),this.diag(`ime send=${t} wrote-after=${e}`),setTimeout(i,0))},a=()=>s("compositionend"),r=setTimeout(()=>{const i=(0,j.flushComposition)(this.compositionHelper(e),this.compositionTextLength(e));this.diag(`ime send=${t} timeout flushed=${i}`),s("timeout")},400);n.addEventListener("compositionend",a,{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,k.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 s=this.readPromptLine(o),a=this.app.activeTab;this.diag(`enter-label text="${s}" tab=${a?"yes":"no"} profile=${null!==(i=null===(t=this.profileForPane(o))||void 0===t?void 0:t.id)&&void 0!==i?i:"default"}`),s&&a&&this.status.setLabel(a,s)},!0)}readPromptLine(e){var t,i,n,o;const s=null===(t=e.frontend)||void 0===t?void 0:t.xterm,a=null===(i=null==s?void 0:s.buffer)||void 0===i?void 0:i.active;if(!a||"function"!=typeof a.getLine)return this.diag(`enter-label no-buffer frontend=${e.frontend?"yes":"no"} xterm=${s?"yes":"no"}`),"";const r=(e,t)=>{var i,n;const o=[];for(let s=Math.max(0,e);s<=t;s++)o.push(null!==(n=null===(i=a.getLine(s))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:"");return o},d=a.baseY+(null!==(n=a.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,x.extractPrompt)(l,c);if(u)return u;const p=(0,x.extractPrompt)(r(a.baseY,a.baseY+s.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=${a.baseY} cursorY=${a.cursorY} rows=${s.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("#"+I))}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,y.profileFor)(t.id),n=this.config.store.agentDeck.imagePasteKey,o="config"===i.imagePasteKey?n:i.imagePasteKey,s="ctrl-v"===o?"":"v";this.diag(`paste image app=${t.id} via=${t.via} mode=${o} bytes=${[...s].map(e=>e.charCodeAt(0)).join(",")}`),this.sendToPane(e,"paste-image",()=>e.sendInput(s))}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 s=this.config.store.agentDeck.viewerDropOpen;if("never"===s||e(t.target))return;const a=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],r=(null==a?void 0:a.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"!==s?"paste"!==s?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 s=e.split(/[\\/]/).pop()||e,a=document.createElement("div");a.id="agentdeck-drop-ask",a.className="ad-drop-ask",a.innerHTML=['<div class="ad-drop-ask-msg"></div>','<div class="ad-drop-ask-row">',' <button class="ad-drop-ask-view">패널에 띄우기</button>',' <button class="ad-drop-ask-paste">경로 붙여넣기</button>',' <button class="ad-drop-ask-close" title="아무것도 하지 않는다">✕</button>',"</div>",'<label class="ad-drop-ask-again">',' <input type="checkbox" class="ad-drop-ask-again-box"> 다시 묻지 않기',"</label>"].join("");const r=a.querySelector(".ad-drop-ask-msg");r.textContent=`${s} 을 어떻게 할까요?`,r.title=e;const d=e=>{(()=>{var e;return!0===(null===(e=a.querySelector(".ad-drop-ask-again-box"))||void 0===e?void 0:e.checked)})()&&(this.config.store.agentDeck.viewerDropOpen=e,this.config.save())},l=()=>a.remove();null===(i=a.querySelector(".ad-drop-ask-view"))||void 0===i||i.addEventListener("click",()=>{d("always"),this.openDroppedInPanel(e),l()}),null===(n=a.querySelector(".ad-drop-ask-paste"))||void 0===n||n.addEventListener("click",()=>{d("paste"),this.pasteDroppedPath(e),l()}),null===(o=a.querySelector(".ad-drop-ask-close"))||void 0===o||o.addEventListener("click",l),document.body.appendChild(a),setTimeout(()=>{document.getElementById("agentdeck-drop-ask")===a&&l()},15e3)}async detectAgentApp(e){var t,i,n,o,s,a,r,d,l,c,u,p,h,g,f;const b=null!==(n=null===(i=(t=this.app).getParentTab)||void 0===i?void 0:i.call(t,e))&&void 0!==n?n:e,v=null!==(a=null===(s=null===(o=this.notify)||void 0===o?void 0:o.agentOf)||void 0===s?void 0:s.call(o,b))&&void 0!==a?a:null;let m=[];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,y.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,b),this.forgetHookStatus(b),this.diag(`agent hook stale hook=${v} proc=${n}`)),{id:n,via:"proc"};if(m=t.map(e=>Number(null==e?void 0:e.pid)).filter(e=>Number.isInteger(e)&&e>0),v&&!m.length)return{id:v,via:"hook"}}catch{if(v)return{id:v,via:"hook"}}const k=await this.commandLinesOf(m);if(k){const e=(0,y.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,b),this.forgetHookStatus(b),this.diag(`agent hook stale hook=${v} cmdline=${e}`)),{id:e,via:"cmdline"}}const w=`${null!==(g=e.title)&&void 0!==g?g:""} ${null!==(f=e.customTitle)&&void 0!==f?f:""}`,x=(0,y.identifyAgent)("",w);return{id:x,via:"unknown"===x?"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",s=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,s,{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 s=this.firstPane(e);if(!s)return;const a=s.session,r=this.paneAgents.get(s),d=await this.detectAgentApp(s);if(s.session!==a)return;"unknown"===d.id||"proc"!==d.via&&"cmdline"!==d.via||!r||this.paneAgents.get(s)!==r||r.session!==a||"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(),s=!!i&&i.session===(null==e?void 0:e.session);if(s&&o-i.at<250)return i.profile;let a=t.call(this,e);return!a&&s&&(a=i.known),this.profileMemo.set(e,{at:o,session:null==e?void 0:e.session,profile:a,known:null!=a?a:s?i.known:void 0}),a}resolveProfileForPane(e){var t,i,n,o,s,a,r,d,l,c,u,p,g,f,b;try{const v=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(v);if(t)return(0,y.detectProfileFor)(t)}const m=null===(a=null===(s=this.notify)||void 0===s?void 0:s.agentOf)||void 0===a?void 0:a.call(s,v);if(m)return(0,y.detectProfileFor)(m);const k=null===(r=this.paneAgents)||void 0===r?void 0:r.get(e),w=null===(d=null==e?void 0:e.frontend)||void 0===d?void 0:d.xterm,x=null===(l=null==w?void 0:w.buffer)||void 0===l?void 0:l.active,S=(null==k?void 0:k.session)===e.session?k:void 0;if(x&&(!k||S)&&(!(null==S?void 0:S.tracker.id)||"unknown"===S.tracker.id)){const t=Array.from({length:w.rows},(e,t)=>{var i,n;return null!==(n=null===(i=x.getLine(x.baseY+t))||void 0===i?void 0:i.translateToString(!0))&&void 0!==n?n:""});if((0,h.isLiveCodexScreen)(t)){const t=null!==(c=null==S?void 0:S.tracker)&&void 0!==c?c:new h.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(v,"codex"),null===(g=this.diag)||void 0===g||g.call(this,"agent stream recovered id=codex via=live-screen"),(0,y.detectProfileFor)("codex")}}if((null==k?void 0:k.session)===e.session&&(null==k?void 0:k.tracker.id)&&"unknown"!==k.tracker.id)return(0,y.detectProfileFor)(k.tracker.id);const C=this.profileForTab(v);if(C&&"codex"!==C.id)return C;if(!x)return C;const j=Math.max(0,x.baseY-60),z=[];for(let e=j;e<x.baseY+w.rows;e++)z.push(null!==(b=null===(f=x.getLine(e))||void 0===f?void 0:f.translateToString(!0))&&void 0!==b?b:"");const T=(0,h.identifyScreenAgent)(z);return"claude"===T?(0,y.detectProfileFor)("claude"):C||("unknown"===T?void 0:(0,y.detectProfileFor)(T))}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,y.detectProfileFor)(n);const o=this.tabAgents.get(e);return o&&"unknown"!==o?(0,y.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=function(){var e,t,n,o,s;if(void 0!==H)return H;try{H=null!==(t=null===(e=i(4157))||void 0===e?void 0:e.clipboard)&&void 0!==t?t:null}catch(e){H=null,(0,R.diagCatch)("clipboard require(electron)",e)}if(!H)try{const e=null!==(n=window.require)&&void 0!==n?n:globalThis.require;H=null!==(s=null===(o=null==e?void 0:e("electron"))||void 0===o?void 0:o.clipboard)&&void 0!==s?s:null}catch(e){H=null,(0,R.diagCatch)("clipboard window.require",e)}return H||(0,R.diagOnce)("clipboard-missing","clipboard 없음 — 이미지 붙여넣기 불가"),H}();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(`#${I}`))}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,u.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($);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($))}):t()}applyOpacity(){var e;const t=this.config.store.agentDeck,i=B(t.terminalOpacity),n=B(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 s=null===(e=this.config.store.terminal)||void 0===e?void 0:e.colorScheme;if(!(null==s?void 0:s.background))return;const a=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")}(s.background,i),r=i<100?"colorScheme":this.config.store.terminal.background;a===s.background&&r===this.config.store.terminal.background||(s.background=a,this.config.store.terminal.background=r,this.config.save())}get dockSide(){const e=this.config.store.agentDeck.sidebarDock;return(0,z.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,z.isHorizontalDock)(this.dockSide)){const i=n.sidebarMin||200,o=Math.max(n.sidebarMax||560,i);let s=n.sidebarWidth||0;if(!s){const o=(n.aspectW||4)/(n.aspectH||3);let a=Math.round(t*o);a=Math.min(a,e-i),a=Math.max(a,N),s=e-a}const a=n.sidebarWidth?140:i,r=Math.max(e-N,a),d=n.sidebarWidth?Math.max(o,n.sidebarWidth):o;return Math.min(Math.max(s,a),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;if(!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 o=this.visibleBox(),s=o.width,a=this.mainEl.clientHeight||o.height;if(!s||!a)return;const r=this.dockSide,d=(0,z.isHorizontalDock)(r),l=this.viewSide,c=s-N-(d?140:0),u=Math.round(null!==(t=null===(e=this.view)||void 0===e?void 0:e.extent(c))&&void 0!==t?t:0),p=Math.max(s-u,N);let h=Math.round(this.sidebarExtent(p,a,o.height));const g=d?h:0,f=("left"===r?g:0)+("left"===l?u:0),b=("right"===r?g:0)+("right"===l?u:0);let v=s-f-b;h=Math.round(h),v=Math.round(v);const m=o.left+":"+o.top;if(v===this.lastTermW&&h===this.lastSidebarW&&r===this.lastDock&&u===this.lastViewW&&l===this.lastViewSide&&m===this.lastBoxKey)return;this.lastBoxKey=m,this.lastTermW=v,this.lastSidebarW=h,this.lastDock=r,this.lastViewW=u,this.lastViewSide=l;const k=this.anchorOrigin();if(this.sidebar){const e=this.sidebar.style;e.position="absolute",e.left=Math.round(o.left-k.left+("right"===r?o.width-h:0))+"px",e.top=Math.round(o.top-k.top+("bottom"===r?o.height-h:0))+"px",e.right="auto",e.bottom="auto",e.width=(d?h:o.width)+"px",e.height=(d?o.height:h)+"px";for(const e of z.DOCK_SIDES)this.sidebar.classList.toggle("ad-dock-"+e,e===r)}const y=r===l?g:0;null===(i=this.view)||void 0===i||i.layout(l,{left:Math.round(o.left-k.left+("left"===l?y:o.width-u-y)),top:Math.round(o.top-k.top),width:u,height:o.height});const w=this.mainEl.style;if(d||u>0){w.marginLeft=f+"px",w.marginRight="0";const e=this.mainEl.getBoundingClientRect().left;v=Math.max(N,Math.round(o.left+o.width-b-e)),w.flex="0 0 "+v+"px",w.width=v+"px",w.maxWidth=v+"px"}else w.removeProperty("flex"),w.removeProperty("width"),w.removeProperty("max-width"),w.marginLeft="0",w.marginRight="0";d?(w.removeProperty("height"),w.marginTop="0",w.marginBottom="0"):(w.marginTop="top"===r?h+"px":"0",w.marginBottom="bottom"===r?h+"px":"0",w.setProperty("height","calc(100% - "+h+"px)","important")),null===(n=this.dock)||void 0===n||n.syncHandle(),this.syncBackgroundClip(),this.scheduleRefit(),this.diag(`relayout dock=${r} avail=${s}x${a} extent=${h} termW=${v} 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 s=null===(t=null===(e=n.xterm)||void 0===e?void 0:e.element)||void 0===t?void 0:t.parentElement;if(s&&s.clientWidth&&s.clientHeight)try{o.fit()}catch{}}}}syncPtySize(e,t){var i,n;const o=null===(i=null==t?void 0:t.xterm)||void 0===i?void 0:i.cols,s=null===(n=null==t?void 0:t.xterm)||void 0===n?void 0:n.rows;if(!o||!s)return;const a=e,r=a.session;if(!r||!r.open||"function"!=typeof r.resize)return;const d=a.size;(null==d?void 0:d.columns)===o&&(null==d?void 0:d.rows)===s||this.diag(`pty resize ${null==d?void 0:d.columns}x${null==d?void 0:d.rows} -> ${o}x${s}`);try{r.resize(o,s),a.size={columns:o,rows:s}}catch(e){return void(0,R.diagCatch)("pty resize",e)}if((null==d?void 0:d.columns)!==o||(null==d?void 0:d.rows)!==s)for(const e of _)setTimeout(()=>{var e,t;const i=null===(e=a.frontend)||void 0===e?void 0:e.xterm;if((null===(t=a.session)||void 0===t?void 0:t.open)&&(null==i?void 0:i.cols)===o&&(null==i?void 0:i.rows)===s)try{a.session.resize(o,s)}catch(e){(0,R.diagCatch)("pty resize retry",e)}},e)}nudgePtyRedraw(e){var t,i,n,o;const s=e,a=s.session,r=null===(i=null===(t=s.frontend)||void 0===t?void 0:t.xterm)||void 0===i?void 0:i.cols,d=null===(o=null===(n=s.frontend)||void 0===n?void 0:n.xterm)||void 0===o?void 0:o.rows;if((null==a?void 0:a.open)&&"function"==typeof a.resize&&r>1&&d>1){this.diag(`redraw nudge ${r}x${d}`);try{a.resize(r-1,d),s.size={columns:r-1,rows:d},setTimeout(()=>{var t;(null===(t=s.session)||void 0===t?void 0:t.open)&&this.syncPtySize(e,s.frontend)},60)}catch{}}}buildSidebar(){const e=document.createElement("div");e.id=I,e.innerHTML=['<div class="ad-head">',' <span class="ad-head-title">AGENT DECK</span>',' <span class="ad-head-count"></span>',"</div>",'<div class="ad-search">',' <input class="ad-search-input" type="text" spellcheck="false"',' placeholder="세션 검색 (제목 · 작업이름 · 폴더)">',' <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>',' <div class="ad-now-account"></div>',' <div class="ad-now-gauges"></div>',"</div>",'<div class="ad-foot">',' <button class="ad-btn ad-new" title="새 탭">+ 새 탭</button>',' <button class="ad-btn ad-settings" title="설정">설정</button>',' <button class="ad-btn ad-repair" title="화면 복구 (모든 탭 다시 그리기)">↻</button>',' <button class="ad-btn ad-viewtoggle" title="미리보기 패널 (md · 이미지 · 표)">▤</button>',"</div>"].join("\n"),this.windowEl.appendChild(e),this.sidebar=e,this.listEl=e.querySelector(".ad-list"),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 z.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,z.isHorizontalDock)(e)?(0,z.isHorizontalDock)(this.dockSide)&&this.lastSidebarW>0?this.lastSidebarW:t.sidebarWidth||0:t.sidebarHeight||0},setSize:e=>{const t=this.config.store.agentDeck;(0,z.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 s=null!==(o=null===(n=this.cwdCache.get(e))||void 0===n?void 0:n.dir)&&void 0!==o?o:null;return K([(0,k.stripTitleMarker)(e.customTitle||e.title||""),this.status.get(e).label,s,s?null:A.UNGROUPED_LABEL],t)}migrateFollowConfig(){const e=this.config.store.agentDeck,t=(0,M.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 L.ViewPanel({windowEl:this.windowEl,getSide:()=>this.viewSide,getWidth:()=>t().viewerWidth||420,setWidth:e=>{t().viewerWidth=e},getRecentMax:()=>t().viewerRecentMax||12,getFollowMode:()=>(0,M.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(),s=this.cwdCache.get(e),a=this.notify.cwdOf(e);if(a)return void((null==s?void 0:s.dir)!==a&&(this.cwdCache.set(e,{dir:a,at:o,misses:0}),this.scheduleRender()));const r=(null==s?void 0:s.dir)?3e3:400;if(s&&o-s.at<r)return;const d=(null==s?void 0:s.dir)?0:(null!==(i=null==s?void 0:s.misses)&&void 0!==i?i:0)+1;this.cwdCache.set(e,{dir:null!==(n=null==s?void 0:s.dir)&&void 0!==n?n:null,at:o,misses:d});const c=t.session;(null==c?void 0:c.getWorkingDirectory)&&Promise.resolve(c.getWorkingDirectory()).then(t=>{t&&function(e){try{return l.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;const t=this.config.store.terminal.profile,i=await this.profiles.getProfiles(),n=null!==(e=i.find(e=>e.id===t))&&void 0!==e?e:i[0];n&&await this.profiles.openNewTabForProfile(n)}openSettings(){this.app.openNewTabRaw({type:b.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 s=null!==(e=window.require)&&void 0!==e?e:globalThis.require,a=null===(i=null===(t=null==s?void 0:s("@electron/remote"))||void 0===t?void 0:t.getCurrentWindow)||void 0===i?void 0:i.call(t);null===(o=null===(n=null==a?void 0:a.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,s=null!==(e=this.config.store.agentDeck.staleAfterMs)&&void 0!==e?e:3e5;for(const e of this.app.tabs){this.status.tickIdle(e,o,s)&&(n=!0);const a=this.notify.cwdOf(e);if(a&&(null===(t=this.cwdCache.get(e))||void 0===t?void 0:t.dir)!==a&&(this.cwdCache.set(e,{dir:a,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,t=this.config.store.agentDeck.sortByStatus?(0,T.sortTabsByStatus)(this.app.tabs,e):this.app.tabs,i=q(this.searchQuery),n=i.length>0||!!this.statusFilter,o=n?t.filter(t=>this.tabMatchesFilter(t,i,e(t))):t,s=this.groupsFor(o),a=s.filter(e=>null!==e.key).length>1;return{tabs:t,visible:o,groups:s,withHeads:a,plan:a?s:[{key:null,label:A.UNGROUPED_LABEL,tabs:[...o]}],statusOf:e,filtering:n,collapseOf:e=>(0,A.resolveGroupCollapseFor)(e,this.config.store.agentDeck.collapsedGroups,n)}}render(){var e;if(!this.listEl||!this.enabled||this.editing||(null===(e=this.drag)||void 0===e?void 0:e.moved))return;this.pruneNavFocus();const{tabs:t,visible:i,withHeads:n,plan:o,statusOf:s,filtering:a,collapseOf:r}=this.renderPlan();if(this.renderHeadCount(t,s),this.renderNow(),this.renderResumeDrawer(),this.listEl.innerHTML="",!a||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))}renderNow(){const e=this.nowEl;if(!e)return;const t=!1===this.config.store.agentDeck.metaLine?null:(0,S.formatMeta)(this.notify.metaOf(this.app.activeTab),Date.now());if(!t)return void(e.hidden=!0);e.hidden=!1,e.title=t.tooltip,e.querySelector(".ad-now-title").textContent=t.title;const i=e.querySelector(".ad-now-account");i.textContent=t.account,i.hidden=!t.account;const n=e.querySelector(".ad-now-gauges");n.innerHTML="";for(let e=0;e<t.gauges.length;e++){const i=t.gauges[e],o=document.createElement("div");o.className=`ad-now-gauge ad-now-${i.level}`,o.title=i.resetText?`${i.text} — ${i.resetText}`:i.text;const s=document.createElement("span");s.className="ad-now-gauge-key",s.textContent=i.key;const a=document.createElement("span");a.className="ad-now-bar";const r=document.createElement("span");r.className="ad-now-bar-fill",r.style.width=i.pct+"%",a.appendChild(r);const d=document.createElement("span");d.className="ad-now-gauge-pct",d.textContent=i.pct+"%",o.appendChild(s),o.appendChild(a),o.appendChild(d),n.appendChild(o);const l=t.gauges[e+1];if(i.resetLine&&(!l||l.resetLine!==i.resetLine)){const e=document.createElement("div");e.className="ad-now-reset",e.textContent=i.resetLine,n.appendChild(e)}}n.hidden=!t.gauges.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,O.resumeRowsFor)(this.ledger.records(),{groupKeys:null,keyOf:e=>(0,A.groupKeyOf)(e,P.projectRootOf),fold:A.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=this.searchQuery?i.filter(e=>this.resumeMatchesQuery(e)):i;if(!i.length)return void(e.hidden=!0);e.hidden=!1;const o=this.isResumeExpanded(null);e.classList.toggle("expanded",o);const s=e.querySelector(".ad-resume-head");this.fillResumeHead(s,n.length,i.length,o);const a=e.querySelector(".ad-resume-rows");if(a.innerHTML="",a.hidden=!o,o){for(const e of n)a.appendChild(this.renderResumeRow(e));if(!n.length){const e=document.createElement("div");e.className="ad-resume-empty",e.textContent="검색어와 맞는 지난 세션이 없다",a.appendChild(e)}}}resumeMatchesQuery(e){const t=this.searchQuery.toLowerCase();return(e.label||"").toLowerCase().includes(t)||(e.cwd||"").toLowerCase().includes(t)||e.sessionId.toLowerCase().includes(t)}liveSessionIds(){this.resumeTabs.clear();const e=new Map;let t;try{t=this.notify.liveSessions()}catch{return e}for(const[i,n]of t)this.app.tabs.includes(n)&&(e.set(i,i),this.resumeTabs.set(i,n));return e}isResumeExpanded(e){const t=this.config.store.agentDeck.resumeExpanded;if(!Array.isArray(t))return!1;const i=(0,A.collapseIdOf)(e);return t.some(e=>"string"==typeof e&&(0,A.foldGroupKey)(e)===(0,A.foldGroupKey)(i))}toggleResumeExpanded(e){const t=this.config.store.agentDeck,i=(0,A.collapseIdOf)(e),n=Array.isArray(t.resumeExpanded)?t.resumeExpanded.filter(e=>"string"==typeof e):[],o=n.filter(e=>(0,A.foldGroupKey)(e)!==(0,A.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="지난 세션",e.querySelector(".ad-group-count").textContent=t===i?String(i):`${t}/${i}`,e.querySelector(".ad-group-caret").textContent=n?"▾":"▴",e.title="닫힌 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||`세션 ${e.sessionId.slice(0,8)}`,o=i.querySelector(".ad-title");o.textContent=n,this.decorateAgent(o,(0,y.profileFor)(null!==(t=e.agent)&&void 0!==t?t:"claude"));const s=i.querySelector(".re-was");if(e.openTabId)s.textContent="● 열림",s.className="re-was live";else{const t=w.STATUS_STYLES[e.lastStatus];s.textContent=t?t.label:"",s.className="re-was"+(e.lastStatus?" s-"+e.lastStatus:"")}return s.textContent=`${"codex"===e.agent?"Codex":"Claude"} · ${s.textContent||"지난 세션"}`,i.querySelector(".re-when").textContent=(0,O.formatWhen)(e.lastSeen,Date.now()),i.title=e.openTabId?`${n}\n이미 열려 있다 — 누르면 그 탭으로 이동`:`${n}\n누르면 새 탭에서 이어받는다 (${e.sessionId})\n작업 폴더: `+(e.cwd||"모름")+"\n※ 대화만 돌아온다 — 그때 띄워 둔 서버·백그라운드 프로세스는 되살아나지 않는다",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(w.STATUS_STYLES[this.statusFilter].label),t.textContent=i.join(" · ")+"에 걸리는 세션이 없다 (전체 "+e+"개)",t.title="Esc 또는 ✕ 로 전체 목록으로 돌아간다",t}groupsFor(e){return(0,A.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,P.projectRootOf)(e,()=>this.scheduleRender()))}collapsedKeys(){const e=this.config.store.agentDeck.collapsedGroups;return Array.isArray(e)?e.map(e=>(0,A.foldGroupKey)(String(e))):[]}isGroupCollapsed(e){return(0,A.isStoredCollapsed)(e,this.config.store.agentDeck.collapsedGroups)}toggleGroup(e){const t=(0,A.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"),s=n.querySelector(".ad-group-label"),a=n.querySelector(".ad-group-count");o.textContent=i?"▸":"▾",s.textContent=e.label,a.textContent=String(e.tabs.length);const r="filter-open"===t.reason?" · 검색에 걸린 세션이 있어 임시로 펴 둠 (검색을 지우면 다시 접힌다)":"";return n.title=(e.key?`${e.key} (탭 ${e.tabs.length}개) — 클릭하면 접기/펴기`:`작업 폴더를 아직 모르는 탭 ${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=`탭 ${e.length}개`;const n=this.statusFilter,o=(0,T.countByStatus)(e,t);n&&!o.some(e=>e.status===n)&&(o.push({status:n,count:0}),o.sort((e,t)=>(0,T.statusRank)(e.status)-(0,T.statusRank)(t.status)));for(const{status:e,count:t}of o){const o=w.STATUS_STYLES[e],s=document.createElement("span");s.className=e===n?"ad-cnt active":"ad-cnt",s.style.setProperty("--ad-color",o.color),s.title=e===n?`${o.label} ${t} — 클릭하면 필터 해제`:`${o.label} ${t} — 클릭하면 이 상태만`,s.textContent=`${o.icon} ${t}`,s.addEventListener("pointerdown",e=>e.stopPropagation()),s.addEventListener("click",t=>{t.stopPropagation(),this.toggleStatusFilter(e)}),i.appendChild(s)}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=w.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)),this.isNavFocused({kind:"tab",tab:e})&&o.classList.add("ad-nav-focus");const s=(0,k.stripTitleMarker)(e.customTitle||e.title||"")||"(제목 없음)",a=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-badge"></span>',' <span class="ad-elapsed"></span>'," </div>","</div>",'<button class="ad-close" title="탭 닫기">&times;</button>'].join("\n");const r=o.querySelector(".ad-title");r.textContent=s,this.decorateAgent(r,this.profileForTab(e));const d=o.querySelector(".ad-label");d.textContent=t.label||"—",d.classList.toggle("empty",!t.label),o.querySelector(".ad-elapsed").textContent=a;const l=o.querySelector(".ad-badge");l.textContent=i.icon+" "+i.label+(t.reason?" · "+t.reason:""),l.title=t.reason,t.pinned&&l.classList.add("pinned");const c=this.notify.subagentsOf(e);if(c){const e=document.createElement("span");e.className="ad-subagents",e.textContent=`❖${c.running}`,c.tooltip&&(e.title=c.tooltip),l.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,D.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,A.collapseIdOf)(e.key)===(0,A.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,s="first"===t?0:"last"===t?i.length-1:(0,D.stepNavIndex)(i.length,n,e,o);s<0||(this.navFocus=i[s],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>D.JUMP_SLOTS)return;const{rows:t}=this.navPlan(),i=(0,D.pickJumpTarget)(t,e);i&&this.app.tabs.includes(i)&&(this.navFocus={kind:"tab",tab:i},this.zone.run(()=>this.app.selectTab(i)),this.diag(`jump slot=${e} rows=${t.length}`))}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),s=()=>this.endRowDrag(!1,void 0,"cancel"),a=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",s,!0),document.addEventListener("keydown",a,!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",s,!0),document.removeEventListener("keydown",a,!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;if(this.config.store.agentDeck.sortByStatus)return this.noteReorderBlocked(),this.dragClickGuard=!0,void this.endRowDrag(!1,void 0,"blocked-sort");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,T.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 s=Math.min(50,Math.max(0,e-n.prev));n.prev=e;const a=o*s/1e3,r="y"===n.axis?i.scrollTop:i.scrollLeft;"y"===n.axis?i.scrollTop=r+a:i.scrollLeft=r+a,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:s,plan:a}=this.renderPlan(),r=a.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(s||(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,z.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(),s=t.line.style,a=(e,t,i)=>Math.min(Math.max(e,t),i);if(this.listFlowsSideways()){const e="after"===t.target.place?n.right:n.left;s.left=Math.round(a(e,o.left,o.right)-1)+"px";const i=a(n.top,o.top,o.bottom),r=a(n.bottom,o.top,o.bottom);s.top=Math.round(i)+"px",s.width="2px",s.height=Math.max(1,Math.round(r-i))+"px"}else{const e="after"===t.target.place?n.bottom:n.top,i=a(n.left,o.left,o.right),r=a(n.right,o.left,o.right);s.left=Math.round(i)+"px",s.top=Math.round(a(e,o.top,o.bottom)-1)+"px",s.width=Math.max(1,Math.round(r-i))+"px",s.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 s=o.moved,a=e&&s?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}}};s?(this.dragClickGuard=!0,r(null!=i?i:a?"moved":"no-target"),a&&this.applyReorder(o.tab,a.tab,a.place),this.render()):r(null!=i?i:"below-threshold")}applyReorder(e,t,i){const n=this.app.tabs,o=n.indexOf(e),s=n.indexOf(t),a=(0,T.planTabMove)(n.length,o,s,i);if(!a)return!1;const r=a.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} -> ${s} ${i} order=${a.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.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="작업 이름",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){if(e.openTabId){const t=this.resumeTabs.get(e.openTabId);if(t&&this.app.tabs.includes(t))return void this.app.selectTab(t)}const i=(0,O.resumeCommand)(e.sessionId,t,e.agent);i?await this.openResumeTab(e,i):this.diag(`resume 거부 sid=${e.sessionId}`)}async openResumeTab(e,t){var i,n,o,s;try{const a=this.config.store.terminal.profile,r=await this.profiles.getProfiles(),d=null!==(i=r.find(e=>e.id===a))&&void 0!==i?i:r[0];if(!d)return void this.diag("resume 프로필 없음");const l={...d,options:{...d.options,cwd:e.cwd||(null===(n=d.options)||void 0===n?void 0:n.cwd)}},c=await this.profiles.openNewTabForProfile(l);if(this.diag(`resume 탭 sid=${e.sessionId.slice(0,8)} cwd=${null!==(s=null===(o=l.options)||void 0===o?void 0:o.cwd)&&void 0!==s?s:"?"} tab=${c?"yes":"null"}`),!c)return;e.label&&this.status.setLabel(c,e.label),this.sendResumeCommand(c,t)}catch(e){(0,R.diagCatch)("resume 탭 열기",e)}}sendResumeCommand(e,t){let i=!1,n=null;const o=()=>{var o;if(i)return;const s=this.firstPane(e);s&&"function"==typeof s.sendInput&&(i=!0,null===(o=null==n?void 0:n.unsubscribe)||void 0===o||o.call(n),this.sendToPane(s,"resume",()=>s.sendInput(t+"\r")),this.diag("resume 명령 전송"))},s=Date.now(),a=()=>{var t,r,d;if(i||n)return;let l=null;try{l=this.firstPane(e),n=null===(d=null===(r=null===(t=null==l?void 0:l.session)||void 0===t?void 0:t.output$)||void 0===r?void 0:r.subscribe)||void 0===d?void 0:d.call(r,()=>setTimeout(o,700))}catch(e){return void(0,R.diagCatch)("resume 출력 구독",e)}n?this.diag(`resume 구독 armed after=${Date.now()-s}ms`):Date.now()-s<6e3&&setTimeout(a,200)};a(),setTimeout(o,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.activateResume(e,!1)}]):(o.push(["새 탭에서 이어받기",()=>{this.activateResume(e,!1)}]),o.push(["분기해서 이어받기",()=>{this.activateResume(e,!0)}])),o.push(["세션 ID 복사",()=>{var t,i;try{null===(i=(t=this.platform).setClipboard)||void 0===i||i.call(t,{text:e.sessionId})}catch(e){(0,R.diagCatch)("세션 ID 복사",e)}}]),o.push(["목록에서 숨기기",()=>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 s=e=>{n.contains(e.target)||(n.remove(),document.removeEventListener("mousedown",s))};setTimeout(()=>document.addEventListener("mousedown",s),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=>[w.STATUS_STYLES[e].icon+" "+w.STATUS_STYLES[e].label,()=>this.status.setManual(t,e)]);o.push(["↺ 자동 감지로",()=>this.status.unpin(t)]),o.push(["↻ 화면 복구",()=>{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 t+"초";const i=Math.floor(t/60);return i<60?i+"분":Math.floor(i/60)+"시간 "+i%60+"분"}};U=n=a([(0,c.Injectable)({providedIn:"root"}),d("design:paramtypes",[f.AppService,f.ConfigService,v.WorkStatusService,f.HotkeysService,f.ProfilesService,f.HostWindowService,f.PlatformService,m.WorkNotifyService,E.SessionLedgerService,c.NgZone])],U),t.AgentDeckService=U},7009(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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 s=i(860),a=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,s.Injectable)(),o("design:paramtypes",[d.WorkStatusService,a.ConfigService,a.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),s=/\x1b\]1337;AgentDeck=([a-z]+)(?:;([^\x07\x1b]*))?(?:\x07|\x1b\\)/gi,a=["idle","running","waiting","limited","done","error"],r=new WeakMap;function d(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 l(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,c,u=(0,n.unionProfile)()){var p;e.debug.outputs++,e.markOutput(t);const h=(null!==(p=r.get(i))&&void 0!==p?p:"")+o;let g,f=!1,b=0;for(s.lastIndex=0;null!==(g=s.exec(h));){b=s.lastIndex;const i=g[1].toLowerCase();a.includes(i)&&(e.setManual(t,i,g[2]),e.debug.oscHits++,f=!0)}if(r.set(i,h.slice(Math.max(b,h.length-256))),!f&&c)if(u.waitingPatterns.some(e=>e.test(o)))l(e,t,"waiting",d(o,u.waitingPatterns));else{if(!u.limitedPatterns.some(e=>e.test(o)))return"waiting"===e.get(t).status&&u.busyPatterns.some(e=>e.test(o))?(e.markBusy(t),void e.resume(t)):u.busyTitleMarks.some(e=>o.includes(e))||u.busyPatterns.some(e=>e.test(o))?(e.markBusy(t),void e.setAuto(t,"running")):void(e.isBusyMode(t)||"limited"!==e.get(t).status&&e.setAuto(t,"running"));l(e,t,"limited",d(o,u.limitedPatterns))}},t.forgetOutputBuffer=function(e){r.delete(e)};const c=/\[AD:([a-z]+)\]\s*(.*)$/i;t.stripTitleMarker=function(e){return e.replace(/\[AD:[a-z]+\]\s*/i,"")},t.applyTitle=function(e,t,i,o,s=(0,n.unionProfile)()){const r=c.exec(i);if(r){const i=r[1].toLowerCase();if(a.includes(i))return e.setManual(t,i,r[2].trim()),void e.debug.titleHits++}o&&s.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,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a};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 s=class{constructor(){this.available=!1}init(){}enabled(){return!1}async reload(e){}};s=n([(0,o.Injectable)({providedIn:"root"})],s),t.AgentDeckDevReloadService=s},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}),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};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 a=s(i(5317)),r=s(i(9896)),d=s(i(857)),l=s(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,b=0,v="",m=!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 z(e,t,i){try{return!(j(e)<i||(r.renameSync(e,t),0))}catch{return!1}}function T(e){try{(f<0||++b>=500)&&(f=j(t.DIAG_PATH),b=0),f>=p&&z(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 A(e){h.push(e),h.length>2e3&&h.splice(0,h.length-2e3)}function P(e){const t=`${(new Date).toISOString()} ${e}`;A(t),T(t+"\n")}function D(e=200){return h.slice(-e)}function E(e,t){P(`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&&(T(` ${t}\n`),A(` ${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:I(e)}`}function L(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(M).join(" ");if(!i)return;const n=Date.now(),o=y.get(i);void 0!==o&&n-o<5e3||(y.set(i,n),k++,P(`CONSOLE ${e} ${i}`),k>=300&&P("CONSOLE 캡처 상한(300) 도달 — 이 세션에서는 더 적지 않는다"))}(e,n)}catch{}return i.apply(t,n)})}function M(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(I(e))}function R(e){const t=e.replace(/\r?\n/g," ");return t.length>400?t.slice(0,400)+"…":t}function I(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=P,t.diagOnce=function(e,t){g.has(e)||(g.add(e),P(t))},t.resetDiagOnce=function(e){g.delete(e)},t.diagMemory=function(){return h},t.recentDiag=D,t.startDiagSession=function(e={}){var i,n,o,s,a,r;z(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!==(a=null===(s=process.versions)||void 0===s?void 0:s.electron)&&void 0!==a?a:"?"} os=${JSON.stringify(null!==(r=e.osRelease)&&void 0!==r?r:d.release())}`];e.config&&l.push(`config=${I(e.config)}`),v=l.join("\n")+"\n";for(const e of l)A(e);T(v)},t.installErrorCapture=function(){if(m)return;m=!0;const e="undefined"==typeof window?null:window;(null==e?void 0:e.addEventListener)&&(e.addEventListener("error",e=>{var t;E("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=>{E("unhandledrejection",null==e?void 0:e.reason)})),L("error"),L("warn")},t.diagException=E,t.diagCatch=function(e,t){if(w>=200)return;const i=O(t),n=`${e}|${i}`,o=Date.now(),s=x.get(n);void 0!==s&&o-s<6e4||(x.set(n,o),w++,P(`CATCH ${e} ${R(i)}`),w>=200&&P("CATCH 캡처 상한(200) 도달 — 이 세션에서는 더 적지 않는다"))},t.appendScreenLog=function(e){try{z(t.SCREEN_PATH,t.SCREEN_PREV_PATH,4194304),r.appendFileSync(t.SCREEN_PATH,e)}catch{}},t.collectDiagBundle=function(e={}){var i,n,o,s,c,u,p,h,g,f;const b=`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(),b);r.mkdirSync(v,{recursive:!0});const m=[],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!==(s=null===(o=process.versions)||void 0===o?void 0:o.node)&&void 0!==s?s:"?"} 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=${I(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"),m.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)),m.push(t)}}catch{}const w=v+".zip";try{r.rmSync(w,{force:!0})}catch{}return function(e,t){try{return"win32"===process.platform?a.execFileSync("powershell.exe",["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`Compress-Archive -Path '${e}\\*' -DestinationPath '${t}' -Force`],{timeout:3e4,stdio:"ignore"}):a.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:m}:{path:v,zipped:!1,files:m}}},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),s=n?Math.min(Math.max(o||320,180),.6*t.width):Math.min(Math.max(o||200,120),.6*t.height),a=this.preview.style;a.display="block",a.left=("right"===e?t.right-s:t.left)+"px",a.top=("bottom"===e?t.bottom-s:t.top)+"px",a.width=(n?s:t.width)+"px",a.height=(n?t.height:s)+"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 s(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 a(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 a=null!==(n=e[0])&&void 0!==n?n:" ",r=null!==(o=e[1])&&void 0!==o?o:" ",d={path:t,index:a,work:r,state:s(a,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||a(o))continue;const s=r(o);if(s&&"!!"!==s.code&&" "!==s.code){if(d(s.code)){const o=null!==(t=i[e+1])&&void 0!==t?t:"";e++,n.push(c(s.code,s.rest,o));continue}n.push(c(s.code,s.rest))}}return n}(t);const i=[];for(const e of t.replace(/\r\n?/g,"\n").split("\n")){if(!e.trim()||a(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 s of null!=e?e:[])switch(null==s?void 0:s.state){case"staged":t++;break;case"unstaged":i++;break;case"both":t++,i++;break;case"untracked":n++;break;case"conflict":o++}const s=[];return t&&s.push(t+"개 스테이지"),i&&s.push(i+"개 미스테이지"),n&&s.push(n+"개 추적안됨"),o&&s.push(o+"개 충돌"),s.length?s.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$/,s={n:"\n",t:"\t",r:"\r",'"':'"',"\\":"\\",b:"\b",f:"\f",v:"\v",a:""};function a(e){var t,i;let n="",o=[];const a=()=>{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){a(),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}a(),n+=null!==(i=s[l])&&void 0!==i?i:l,r++}return a(),n}function r(e){let t=String(null!=e?e:"").replace(/\t.*$/,"").trim();return t.length>=2&&t.startsWith('"')&&t.endsWith('"')&&(t=a(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:a(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 s=String(null!=e?e:"").replace(/\r\n?/g,"\n");if(!s.trim())return[];const a=[];let l=null,p=0,h=0,g=0,f=0;for(const e of s.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 s=i.exec(e);if(s){const e=c(s[1]);l=u(),l.path=e.next,e.old&&e.old!==e.next&&(l.oldPath=e.old),a.push(l),g=0,f=0;continue}if(!l)continue;const b=n.exec(e);if(b)p=Number(b[1]),h=Number(b[3]),g=void 0===b[2]?1:Number(b[2]),f=void 0===b[4]?1:Number(b[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 a},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 b(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),s=o?i.toLowerCase():i,a=o?n.toLowerCase():n;return s===a?i:s.startsWith(a+"/")?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),s=Number(null!=i?i:t),a=Number.isFinite(o)&&o>0,r=Number.isFinite(s)&&s>0;let d=n;if(a||r){const e=Math.floor(Math.min(a?o:s,r?s:o)),t=Math.floor(Math.max(a?o:s,r?s: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 s=new Set(n.map(e=>b(e)));return o.filter(e=>s.has(b(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:s(i[3])};const n=/^([A-Za-z]:)(\/.*)?$/.exec(e);return n?{prefix:n[1],abs:!0,segs:s(null!==(t=n[2])&&void 0!==t?t:"")}:{prefix:"",abs:e.startsWith("/"),segs:s(e)}}function s(e){return e.split("/").filter(e=>e.length>0)}function a(e,t){return e.length===t.length&&e.every((e,i)=>n(e)===n(t[i]))}function r(e,t){const s=i(e);if(!s)return null;const r=t?i(t(s)):null;if(!r)return s;const d=o(s),l=o(r);return n(l.prefix)===n(d.prefix)&&(c=d.segs,u=l.segs,c.length>=u.length&&a(c.slice(0,u.length),u))?r:s;var c,u}function d(e,s){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 s){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&&a(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 s=n(e.key),a=n(t.key);return s===a?0:s<a?-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 s=[],a=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=a.get(d);l||(l={key:e,tabs:[]},a.set(d,l),s.push(d)),l.tabs.push(t)}const u=s.map(e=>a.get(e).key),p=s.map(e=>{const t=a.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,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckHotkeyProvider=void 0;const o=i(860),s=i(7650),a=i(5174),r=i(9137);let d=class extends s.HotkeyProvider{async provide(){return[...(0,a.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)),s=n(i(7474)),a=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)),b=n(i(1675)),v=n(i(1773)),m=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)),z={af:o.default,bg:s.default,cs:a.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:b.default,pl:v.default,pt:m.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 z?i:"en"},t.translate=function(e,t,i){var n;const o=null!==(n=z[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=z},2846(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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={"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":"Панель: Файлы ↔ Изменения"}},4544(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={"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={"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={"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={"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={"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={"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}),s=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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},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=a(i(7650)),h=i(3700),g=i(8349),f=i(7028),b=i(9771),v=i(7009),m=i(4494),k=i(3496),y=i(7110),w=i(4883),x=i(9980),S=i(9610),C=i(8450),j=i(5174),z=i(1451),T=i(7418);i(3396),r(i(4300),t);let A=class{constructor(e,t,i,n,o,s,a,r){e.init(),t.init(),i.init(),n.init(),o.init(),a.init(),s.init(),r.init()}};A=s([(0,l.NgModule)({imports:[c.CommonModule,u.FormsModule,p.default],providers:[{provide:p.ConfigProvider,useClass:f.AgentDeckConfigProvider,multi:!0},{provide:p.HotkeyProvider,useClass:b.AgentDeckHotkeyProvider,multi:!0},{provide:g.TerminalDecorator,useClass:v.AgentDeckDecorator,multi:!0},{provide:h.SettingsTabProvider,useClass:z.AgentDeckSettingsTabProvider,multi:!0}],declarations:[T.AgentDeckSettingsTabComponent]}),d("design:paramtypes",[m.AgentDeckService,k.AgentDeckProfileService,y.WorkNotifyService,w.AgentDeckAlertService,x.AgentDeckRecoveryService,S.AgentDeckUpdateService,C.AgentDeckReloadService,j.AgentDeckDevReloadService])],A),t.default=A},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:"]"},s=new Set(["Control","Meta","Alt","Shift"]);function a(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),s=["Ctrl",t.Gt[i],t.iD[i],"Shift"],a=n.map(e=>e.toLowerCase());return[...s.filter(e=>a.includes(e.toLowerCase())),...n.filter(e=>!s.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 s of Object.keys(null!=t?t:{}))i.includes(s)||u(t[s]).some(t=>1===t.length&&l(t[0],e,n))&&o.push(s);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(s.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,a(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],s=t?f(t):null;if(!s)return t?[c(t,i)]:[];const a=s.prefix?c(s.prefix+"1",i).slice(0,-1):"";return[`${a}1 … ${a}${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),s={};if(t.jump){const e=f(i);if(!e)return{item:t,writes:s,conflicts:[],display:o,error:"digit"};h().forEach((t,i)=>{s[t]=d(`${e.prefix}${i+1}`,n)})}else s[t.id]=d(i,n);const a=g(t),r=[];for(const t of Object.values(s))for(const i of p(t,e,a,n))r.includes(i)||r.push(i);return{item:t,writes:s,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 s of t.conflicts){const t=u(e[s]).filter(e=>!(1===e.length&&i.some(t=>l(e[0],t,n))));e[s]=t.map(e=>1===e.length?e[0]:e),o.push(s)}}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(" ")),s=u(i[t]).map(e=>e.map(e=>d(e,n).toLowerCase()).join(" "));return o.length===s.length&&o.every((e,t)=>e===s[t])})}},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 s=e.replace(/(`+)([\s\S]+?)\1(?!`)/g,(e,t,n)=>(o.push("<code>"+i(String(n).replace(/^ | $/g,""))+"</code>"),"\0"+(o.length-1)+"\0"));return s=i(s),s=s.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^&]*&quot;)?\)/g,(e,i,o)=>{const s=t.resolveImage?t.resolveImage(String(o)):n(String(o));return s?'<img src="'+s+'" alt="'+i+'">':'<span class="ad-md-noimg">🖼 '+(i||o)+"</span>"}),s=s.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)}),s=s.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__([^_]+)__/g,"<strong>$1</strong>"),s=s.replace(/(^|[\s(\[])\*([^*\n]+)\*/g,"$1<em>$2</em>"),s=s.replace(/(^|[\s(\[])_([^_\n]+)_/g,"$1<em>$2</em>"),s=s.replace(/~~([^~]+)~~/g,"<del>$1</del>"),s.replace(/\u0000(\d+)\u0000/g,(e,t)=>{var i;return null!==(i=o[Number(t)])&&void 0!==i?i:""})}function s(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/.test(e)}function a(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 b=/^\s*(```+|~~~+)\s*([\w+#.-]*)/.exec(f);if(b){g(),u={mark:b[1].slice(0,3),lang:b[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&&s(r[e+1])){g();const i=a(f),n=[];let s=e+2;for(;s<r.length&&r[s].includes("|")&&r[s].trim();s++)n.push(a(r[s]));e=s-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 m=/^\s*>\s?(.*)$/.exec(f);if(m){g();const i=[m[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 s=/^\[([ xX])\]\s+(.*)$/.exec(k[3]);if(s){const e="x"===s[1].toLowerCase();d.push('<li class="ad-md-task"><span class="ad-md-check">'+(e?"☑":"☐")+"</span> "+o(s[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 s(e,t){return o(e,t).replace(/\s*리셋$/,"")}function a(e,t,i,a,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(a,r),resetLine:s(a,r)}}t.formatMeta=function(e,t){var n,o;if(!e)return null;const s=String(e.model||e.modelId||"").trim();if(!s)return null;const r=[null!==(n=i[String(e.agent||"").toLowerCase()])&&void 0!==n?n:"",s,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=[a("ctx","ctx",e.contextPct,0,t),a("5h","5h",d.fiveHourPct,Number(d.fiveHourResetsAt)||0,t),a("7d","7d",d.sevenDayPct,Number(d.sevenDayResetsAt)||0,t),l?a(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}),s=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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},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=a(i(9896)),u=a(i(9278)),p=a(i(857)),h=a(i(6928)),g=i(3193),f=i(6021),b=i(102),v=i(1786),m=i(5929),k=i(7282),y=i(9888),w=i(7797),x=i(7507);function S(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 C=class{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.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")}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:["확인"]})}}init(){var e;const t=window;t.__agentdeck=null!==(e=t.__agentdeck)&&void 0!==e?e:{},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,s,a,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!==(s=this.touched.get(e))&&void 0!==s?s:[],agentHook:this.agentHookSeen.has(e),agents:[...null!==(r=null===(a=this.liveAgents.get(e))||void 0===a?void 0:a.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,s,a,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!==(s=null==h?void 0:h.path)&&void 0!==s?s:null,lastSize:null!==(a=null==h?void 0:h.lastSize)&&void 0!==a?a: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=>{this.tabPids.delete(e),this.tabIds.delete(e);const t=this.tabSession.get(e);t&&(this.tabSession.delete(e),this.sessionTab.delete(t),this.scans.delete(t))})}diag(e){(0,w.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 s=(0,y.newTabId)();e.profile={...e.profile,options:{...e.profile.options,env:{...n,[y.TAB_ENV]:s}}},void 0!==e.sessionOptions&&(e.sessionOptions=e.profile.options),this.diag(`tabid stamp tab=${this.tabName(t)} id=${s}${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}}},this.diag(`tabid stamp tab=${this.tabName(t)} id=${o} (recovery token)`)}idTakenElsewhere(e,t){var i,n,o;for(const s of this.app.tabs)for(const a of this.panesOf(s))if(a!==t&&(null===(o=null===(n=null===(i=null==a?void 0:a.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,s=new Map;for(const a of[...this.app.tabs]){const r=[];for(const s of this.panesOf(a)){const d=null===(i=null===(t=null===(e=null==s?void 0:s.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!==a?o.add(d):n.set(d,a)}s.set(a,r)}for(const e of[...this.tabIds.keys()])s.has(e)||this.tabIds.delete(e);for(const[e,t]of s){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(",")}]`:""))}}}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",e=>{let i;for(t+=e;(i=t.indexOf("\n"))>=0;){const e=t.slice(0,i);t=t.slice(i+1),this.accept(e)}}),e.on("end",()=>this.accept(t)),e.on("error",()=>{})});let t=!1;e.on("error",i=>{if(!t)return t=!0,(0,w.diagCatch)("notify channel listen (고정 포트 실패, 임의 포트로 재시도)",i),void e.listen(0,"127.0.0.1");(0,w.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")}catch(e){(0,w.diagCatch)("notify port 파일 쓰기",e)}}),e.listen(this.config.store.agentDeck.notifyPort||0,"127.0.0.1")}accept(e){const t=e.trim();if(t)try{this.apply(JSON.parse(t))}catch(e){(0,w.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,s,a,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);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 s=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(s)&&s>0?s:Date.now()})}const r=null!==(a=null===(s=this.liveAgents.get(p))||void 0===s?void 0:s.size)&&void 0!==a?a: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,s=(0,y.pickTabByTabId)(t,this.tabIds);if(s)return s!==o&&this.bind(e,s,o?"tabid-move":"tabid"),s;const a=(0,m.pickTabByPids)(i,this.tabPids);if("pid"===a.mode&&a.tab)return a.tab!==o&&this.bind(e,a.tab,o?"pid-move":"pid"),a.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"===a.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 s=null===(i=null===(t=this.metaOf(e))||void 0===t?void 0:t.agent)||void 0===i?void 0:i.trim().toLowerCase();return"codex"===s||"claude"===s||"gemini"===s?s: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)||[]}metaOf(e){const t=e?this.tabSession.get(e):null;return t&&this.metaBySession.get(t)||null}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,b.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,b.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),s=c.readSync(e,i,0,t,o.lastSize);(0,b.feedCodexChunk)(o.state,o.decoder.write(i.subarray(0,s))),o.lastSize+=s}finally{c.closeSync(e)}}catch(e){(0,w.diagCatch)("codex 기록 읽기",e);continue}const s=this.codexMetaOf(t,o.state),a=this.metaBySession.get(t);a&&a.model===s.model&&a.effort===s.effort&&a.account===s.account&&a.contextPct===s.contextPct&&a.limits.fiveHourPct===s.limits.fiveHourPct&&a.limits.sevenDayPct===s.limits.sevenDayPct||(this.metaBySession.set(t,s),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,b.codexContextPct)(t),limits:(0,b.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,b.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 s of[...o].reverse()){const o=h.join(e,s.name);if(s.isDirectory()&&t<3){const e=await n(o,t+1);if(e)return e;continue}if(s.isFile()&&s.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,x.summarizeLiveAgents)(null===(t=this.liveAgents.get(e))||void 0===t?void 0:t.values());if(n.running<=0)return null;const o=(0,x.formatLiveAgentTooltip)(n);return{sessionId:null!=i?i:"",running:n.running,items:[],tooltip:n.oldestAt?`${o}\n가장 오래된 것: ${S(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,x.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가장 오래된 것: ${S(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,x.createSubagentState)(),decoder:new g.StringDecoder("utf8"),path:null,lastSize:0,busy:!1,lookupAt:0,summary:(0,x.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,x.createSubagentState)(),e.decoder=new g.StringDecoder("utf8"),e.lastSize=0,e.summary=(0,x.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,x.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 s;e.busy=!0;try{s=c.createReadStream(i,{start:n,end:t-1})}catch(t){return e.busy=!1,void(0,w.diagCatch)(`subagent 스트림 생성 sid=${o}`,t)}let a=!1;const r=i=>{if(a)return;if(a=!0,e.busy=!1,i)return void(0,w.diagCatch)(`subagent 대화기록 읽기 sid=${o}`,i);e.lastSize=t;const s=e.summary.running;e.summary=(0,x.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!==s&&this.diag(`subagent sid=${o} running=${s} -> ${e.summary.running} (+${t-n}B)`)};s.on("data",t=>(0,x.feedChunk)(e.state,e.decoder.write(t))),s.on("end",()=>r()),s.on("error",e=>r(e))}};C=s([(0,d.Injectable)({providedIn:"root"}),r("design:paramtypes",[l.AppService,l.ConfigService,f.WorkStatusService,l.PlatformService])],C),t.WorkNotifyService=C},7144(e,t){function i(e){const i=t.Q.indexOf(e);return i<0?t.Q.length:i}t.planEdgeScroll=t.planTabMove=t.sortTabsByStatus=t.countByStatus=t.statusRank=t.Q=void 0,t.Q=["waiting","error","limited","running","done","idle"],t.statusRank=i,t.countByStatus=function(e,i){var n,o;const s=new Map;for(const t of e){const e=i(t);s.set(e,(null!==(n=s.get(e))&&void 0!==n?n:0)+1)}const a=[];for(const e of t.Q){const t=null!==(o=s.get(e))&&void 0!==o?o:0;t>0&&a.push({status:e,count:t})}return a},t.sortTabsByStatus=function(e,t){return e.map((e,n)=>({tab:e,index:n,rank:i(t(e))})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.tab)},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 s=o.indexOf(i)+("after"===n?1:0);o.splice(s,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:s,bandPx:a,minPps:r,maxPps:d}=e;if(t<i||t>n)return 0;const l=Math.min(a,(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:s-o)<=.5?0:c*(r+(d-r)*Math.min(1,Math.max(0,u)))}},3496(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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_ID=void 0;const s=i(860),a=i(7650);t.ROOT_PROFILE_ID="agentdeck:root";let r=class{constructor(e,t){this.app=e,this.config=t}init(){this.app.ready$.subscribe(()=>this.ensureProfile())}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,s.Injectable)({providedIn:"root"}),o("design:paramtypes",[a.AppService,a.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}),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};Object.defineProperty(t,"__esModule",{value:!0}),t.projectRootCacheSnapshot=t.clearProjectRootCache=t.projectRootOf=t.findProjectRoot=t.walkUp=t.homeBoundary=t.PROJECT_MARKERS=void 0;const a=s(i(9896)),r=s(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 a.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 s(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 a=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=s(e?e.heads:void 0,t.D0.heads),r=s(e?e.choiceWords:void 0,t.D0.choiceWords),d=s(e?e.ruleChars:void 0,t.D0.ruleChars),l=JSON.stringify([i,r,d]),c=a.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))),b=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${b}]*[${p}]{3,}[\\s${b}]*$|[╰└]`),stripLead:new RegExp(`^[\\s${g}]+`),stripTail:new RegExp(`[\\s${f}]+$`)};return a.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,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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 s=i(860),a=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,s.Injectable)({providedIn:"root"}),o("design:paramtypes",[a.AppService,a.ConfigService])],r),t.AgentDeckRecoveryService=r},8450(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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 s=i(860),a=i(7650),r=i(7797),d=i(4494),l="agentdeck.reloadStash",c="agentdeck.devReload",u=[300,1500,3e3];let p=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;try{const t=this.app.tabRecovery,i=[];let n=-1;for(const e of this.app.tabs)try{const o=await t.getFullRecoveryToken(e,{includeState:!0});o&&(e===this.app.activeTab&&(n=i.length),i.push(o))}catch(e){(0,r.diagCatch)("reload 토큰",e)}const o={v:1,at:Date.now(),tokens:i,activeIndex:n};return window.localStorage.setItem(l,JSON.stringify(o)),t.enabled=!1,delete window.localStorage.tabsRecovery,(0,r.diag)(`reload go reason=${e} tabs=${i.length}`),setTimeout(()=>location.reload(),50),!0}catch(e){return this.reloading=!1,(0,r.diagCatch)("reload",e),!1}}async restore(){var e,t,i;const n=null!==(e=window.localStorage.getItem(l))&&void 0!==e?e:window.localStorage.getItem(c);if(window.localStorage.removeItem(l),window.localStorage.removeItem(c),!n)return;const o=JSON.parse(n);if(Date.now()-o.at>6e5)return void(0,r.diag)("reload stash expired age="+(Date.now()-o.at));const s=Date.now(),a=this.app.tabRecovery,d=[],u=new Map;let p=0;for(const[e,i]of(null!==(t=o.tokens)&&void 0!==t?t:[]).entries())if(this.ptysAlive(i))try{const t=await a.recoverTab(i);if(t){const i=this.app.openNewTabRaw(t);d.push(i),u.set(e,i)}}catch(e){(0,r.diagCatch)("reload recoverTab",e)}else p++;this.sweepStrays(d);for(const e of d)this.app.selectTab(e),await this.waitAttached(e),await h(250),this.deck.repair("active");const g=null!==(i=u.get(o.activeIndex))&&void 0!==i?i:d[d.length-1];g&&this.app.selectTab(g);const f=Date.now()-s;(0,r.diag)(`reload restored tabs=${d.length} dead=${p} ms=${f}`),this.notifications.info(`AgentDeck 리로드됨 — 탭 ${d.length}개 재부착 (${f}ms)`)}ptysAlive(e){const t=[],i=e=>{var n,o,s;const a=null===(o=null===(n=null==e?void 0:e.profile)||void 0===n?void 0:n.options)||void 0===o?void 0:o.restoreFromPTYID;a&&t.push(a);for(const t of null!==(s=null==e?void 0:e.children)&&void 0!==s?s:[])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 u)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 h(100)}(0,r.diag)(`reload attach timeout "${e.title}"`)}};function h(e){return new Promise(t=>setTimeout(t,e))}p=n([(0,s.Injectable)({providedIn:"root"}),o("design:paramtypes",[a.AppService,a.NotificationsService,d.AgentDeckService])],p),t.AgentDeckReloadService=p},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 s=new Map;function a(e){const i=o(e?e.ruleChars:void 0,t.n.ruleChars),a=o(e?e.heads:void 0,t.n.heads),r=o(e?e.choiceWords:void 0,t.n.choiceWords),d=JSON.stringify([i,a,r]),l=s.get(d);if(l)return l;const c=i.join("").replace(/[\\\]^-]/g,"\\$&"),u=n(a),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 s.set(d,p),p}function r(e,t,i){const n=a(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 a(t).rule.test(e.trim())},t.isGhostRuleRow=r,t.judgeScreen=function(e,i,n){const o=a(n),s=[];if(!(i>1&&e.length))return{broken:!1,reasons:[]};const d=[],l=[];for(let a=0;a<e.length;a++){const c=e[a].text.replace(/\s+$/,"");c&&(o.rule.test(c)?(d.push(a),c.length!==i&&s.push(`rule@${a} len=${c.length} != cols=${i}`)):(a>=e.length-t.INPUT_TAIL&&r(c,i,n)&&s.push(`테두리 행에 옛 글자가 남았다@${a} ${JSON.stringify(c.slice(0,40))}`),o.ruleChar.test(c)&&o.headAnywhere.test(c)&&s.push(`mixed@${a} ${JSON.stringify(c.slice(0,40))}`),o.head.test(c)&&!o.choice.test(c)&&l.push(a)))}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)s.push(`입력창에 자리가 없다 (테두리 ${t}·${e} 이 맞붙었다)`);else{const i=l.filter(i=>i>t&&i<e).length;i>1&&s.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&&s.push(`입력창 아래 테두리가 없다 (머리@${e}, 위 테두리@${e-1})`)}if(d.length>1){const t=new Set(d.map(t=>e[t].text.replace(/\s+$/,"").length));t.size>1&&s.push(`rule lens=${[...t].join(",")} (섞임)`)}return{broken:s.length>0,reasons:s}}},5633(e,t){function i(e){var t,i,n,o;const s=(null!==(t=e.match(/"[^"]*"|\S+/g))&&void 0!==t?t:[]).map(e=>e.replace(/^"|"$/g,"")),a=null===(n=(null!==(i=s[0])&&void 0!==i?i:"").split(/[\\/]/).pop())||void 0===n?void 0:n.replace(/\.(exe|cmd|bat)$/i,"").toLowerCase();if("codex"===a||"claude"===a||"gemini"===a)return a;if("node"===a){const e=(null!==(o=s[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)}}},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}),s=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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},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=a(i(9896)),u=a(i(857)),p=a(i(6928)),h=i(7797),g=i(2425);let f=class{constructor(e){this.config=e,this.root=p.join(process.env.LOCALAPPDATA||p.join(u.homedir(),"AppData","Local"),"tabby-agentdeck"),this.file=p.join(this.root,"sessions.json"),this.projectsDir=p.join(u.homedir(),".claude","projects"),this.ledger=new Map,this.scanned=[],this.headCache=new Map,this.loaded=!1,this.saveTimer=null,this.scanning=null,this.lastScan=0,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 s=this.ledger.get(e),a=(0,g.clampLabel)(t.label),r={sessionId:e,cwd:t.cwd||(null==s?void 0:s.cwd)||null,label:a||(null==s?void 0:s.label)||"",lastStatus:null!==(n=null!==(i=t.status)&&void 0!==i?i:null==s?void 0:s.lastStatus)&&void 0!==n?n:null,lastSeen:Date.now(),from:a?"live":null!==(o=null==s?void 0:s.from)&&void 0!==o?o:"live"},d=s&&s.cwd===r.cwd&&s.label===r.label&&s.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=[],s=new Set;try{const e=await c.promises.readdir(this.projectsDir,{withFileTypes:!0});for(const t of e){if(!t.isDirectory())continue;const e=p.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 a=p.join(e,t);s.add(i);try{const e=await c.promises.stat(a);if(n&&e.mtimeMs<n)continue;o.push({sessionId:i,file:a,mtime:e.mtimeMs})}catch{}}}}catch{}const a=async(e,t)=>{let i;try{i=await c.promises.readdir(e,{withFileTypes:!0})}catch{return}for(const r of i){const i=p.join(e,r.name);if(r.isDirectory()&&t<3){await a(i,t+1);continue}const d=/^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i.exec(r.name);if(r.isFile()&&d){s.add(d[1]);try{const e=await c.promises.stat(i);(!n||e.mtimeMs>=n)&&o.push({sessionId:d[1],file:i,mtime:e.mtimeMs,agent:"codex"})}catch{}}}};await a(p.join(process.env.CODEX_HOME||p.join(u.homedir(),".codex"),"sessions"),0),o.sort((e,t)=>t.mtime-e.mtime);const r=o.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()],s);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)(`세션 기록 앞부분 읽기 ${p.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)}snapshot(){return{ledger:this.ledger.size,scanned:this.scanned.length,file:this.file,lastScan:this.lastScan}}};f=s([(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 s=null===(o=e.message)||void 0===o?void 0:o.content;let a=null;if("string"==typeof s)a=s;else if(Array.isArray(s)){const e=s.filter(e=>e&&"text"===e.type&&"string"==typeof e.text).map(e=>e.text);a=e.length?e.join(" "):null}return n(a)?a.trim():null}function s(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=s,t.readHead=function(e){var t,i,n;let a=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};a||"string"!=typeof(null===(n=e.payload)||void 0===n?void 0:n.cwd)||(a=e.payload.cwd)}if(!a&&"string"==typeof(null==e?void 0:e.cwd)&&e.cwd&&(a=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=s(t))}if(a&&r&&null!==d)break}return{cwd:a,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,s=[];for(const a of e)a.sessionId&&!t.hidden.has(a.sessionId)&&(n&&!n.has(t.fold(t.keyOf(a.cwd)))||null!==o&&a.lastSeen<o||s.push({...a,openTabId:null!==(i=t.live.get(a.sessionId))&&void 0!==i?i:null}));return s.sort((e,t)=>t.lastSeen-e.lastSeen||e.sessionId.localeCompare(t.sessionId)),t.limit>0?s.slice(0,t.limit):s},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 a=/^([0-9a-fA-F-]{8,64})\.jsonl$/;t.sessionIdFromFile=function(e){const t=a.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":""}`:""}},7418(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},o=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},s=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 a=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),b=i(5174),v=i(7797),m={disabled:"자동 업데이트가 꺼져 있다","too-soon":"방금 확인했다","dev-install":"새 버전이 있지만 개발 설치라 건드리지 않는다",unknown:"npm 에 물어보지 못했다 (네트워크·프록시)","up-to-date":"최신이다","update-ready":"새 버전이 있다",skipped:"이 버전은 건너뛰기로 했다",postponed:"나중에 하기로 했다",installing:"설치했다 — 창을 새로 고쳐 갈아탄다 (탭·세션 유지)",installed:"설치했다 — Tabby 를 다시 켜면 적용된다 (창을 새로 고치지 못했다)",failed:"업데이트를 시작하지 못했다"},k={left:"dock.left",right:"dock.right",top:"dock.top",bottom:"dock.bottom"};let y=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,s,a,r,l){var h,g,f;this.config=e,this.recovery=t,this.update=i,this.platform=n,this.devReload=o,this.host=s,this.locale=a,this.hotkeys=r,this.zone=l,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.refreshHooks(),this.loadHotkeyNames(),this.lang=(0,d.pickLang)((null===(h=this.locale)||void 0===h?void 0:h.getLocale())||this.config.store.language||navigator.language),this.localeSub=null!==(f=null===(g=this.locale)||void 0===g?void 0:g.localeChanged$.subscribe(e=>{this.lang=(0,d.pickLang)(e)}))&&void 0!==f?f:null}t(e,t){return(0,d.translate)(e,this.lang,t)}ngAfterViewInit(){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.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:{},s=(0,c.planBinding)(o,e,n,this.keyPlatform);if("digit"===s.error)return this.keyMsg=this.t("keys.digit"),void(this.keyMsgFor=e.id);s.conflicts.length?this.pending={plan:s,names:s.conflicts.map(e=>this.nameOf(e)).join(", ")}:this.commit(s,!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=m[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=k[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.config.save())}};y=n([(0,a.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+Shift+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="form-line">\n <div class="header">\n <div class="title">끌 때 목록 끝에서 저절로 흐르기</div>\n <div class="description">\n 줄을 끌어 순서를 바꿀 때 목록의 위·아래 끝에 커서를 대고 있으면\n <b>커서를 더 움직이지 않아도</b> 목록이 그 방향으로 흘러간다.\n 그래서 탭이 많아 화면에 안 보이는 자리로도 한 손짓에 옮길 수 있다.\n 끄면 손을 뗀 뒤 스크롤하고 다시 끌어야 하지만, 그 대신\n <b>맨 끝 줄 뒤에 놓는 조작이 미끄러지지 않는다</b>.\n </div>\n </div>\n <toggle [(ngModel)]="config.store.agentDeck.dragAutoScroll" (ngModelChange)="config.save()"></toggle>\n</div>\n\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<h3 class="mt-4 mb-3">{{t(\'root.head\')}}</h3>\n<div class="text-muted mb-3">{{t(\'root.intro\')}}</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)="config.save()"></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)="config.save()">\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)="config.save()">\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)="config.save()">\n </div>\n\n</ng-container>\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'}),s(6,(0,a.Optional)()),s(7,(0,a.Optional)()),o("design:paramtypes",[r.ConfigService,g.AgentDeckRecoveryService,f.AgentDeckUpdateService,r.PlatformService,b.AgentDeckDevReloadService,a.ElementRef,r.LocaleService,r.HotkeysService,a.NgZone])],y),t.AgentDeckSettingsTabComponent=y},1451(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a};Object.defineProperty(t,"__esModule",{value:!0}),t.AgentDeckSettingsTabProvider=void 0;const o=i(860),s=i(3700),a=i(7418);let r=class extends s.SettingsTabProvider{constructor(){super(...arguments),this.id="agentdeck",this.icon="layer-group",this.title="AgentDeck"}getComponentType(){return a.AgentDeckSettingsTabComponent}};r=n([(0,o.Injectable)()],r),t.AgentDeckSettingsTabProvider=r},6021(e,t,i){var n=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a};Object.defineProperty(t,"__esModule",{value:!0}),t.WorkStatusService=void 0;const o=i(860),s=i(3961),a=["waiting","limited","error"],r=["running","done","error"];let d=class{constructor(){this.states=new Map,this.changed=new s.Subject,this.debug={attached:0,outputs:0,oscHits:0,titleHits:0}}get changed$(){return this.changed}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=a.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){a.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)),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),!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}),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};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 a=s(i(9896)),r=s(i(857)),d=s(i(6928)),l=i(1786);function c(){return d.join(process.env.LOCALAPPDATA||d.join(r.homedir(),"AppData","Local"),"tabby-agentdeck","statusline-inner.json")}function u(){return d.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=a.readFileSync((0,l.claudeSettingsPath)(),"utf8");return e.trim()?JSON.parse(e):{}}catch{return{}}}function b(e){const t=(0,l.claudeSettingsPath)();a.mkdirSync(d.dirname(t),{recursive:!0}),a.existsSync(t)&&a.copyFileSync(t,t+".agentdeck-backup"),a.writeFileSync(t,JSON.stringify(e,null,2)+"\n","utf8")}function v(){try{return JSON.parse(a.readFileSync(c(),"utf8"))}catch{return null}}t.innerConfigPath=c,t.statusLineScriptPath=u,t.statusLineSupported=function(){return a.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(!a.existsSync(e))throw new Error(`statusLine 스크립트를 찾지 못했다: ${e}`);const{next:t,inner:i}=h(f(),e);if(null!==i){const e=c();a.mkdirSync(d.dirname(e),{recursive:!0}),a.writeFileSync(e,JSON.stringify(i,null,2)+"\n","utf8")}b(t)},t.uninstallStatusLine=function(){b(g(f(),v()));try{a.unlinkSync(c())}catch{}}},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>/,s=/^[A-Za-z0-9_-]{4,200}$/,a=["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(!s.test(h))continue;const g=o.exec(u);g&&a.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 a;try{a=JSON.parse(i)}catch{return void e.skipped++}if(!a||"object"!=typeof a||!0===a.isSidechain)return;const r=null===(n=a.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(!s.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 a.timestamp&&a.timestamp?a.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 s=(e.pending+o).split("\n");return e.pending=null!==(n=s.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,s)},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,s="서브에이전트 "+n.length+"개 진행중",a=n.slice(0,o).map(e=>{return"· "+((t=e).description||t.subagentType||"(설명 없음)");var t});return n.length>o&&a.push("· … 외 "+(n.length-o)+"개"),[s,...a].join("\n")},t.summarizeLiveAgents=function(e){var t;const i=new Map;let n=0,o=0;for(const s of null!=e?e:[]){if(!s||!s.id)continue;n++;const e=s.type||"이름 없음";i.set(e,(null!==(t=i.get(e))&&void 0!==t?t:0)+1),Number.isFinite(s.at)&&s.at>0&&(!o||s.at<o)&&(o=s.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&&s.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}),s=this&&this.__decorate||function(e,t,i,n){var o,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(o=e[r])&&(a=(s<3?o(a):s>3?o(t,i,a):o(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a},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},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=a(i(9896)),p=a(i(8611)),h=a(i(5692)),g=a(i(857)),f=a(i(6928)),b=i(7797),v=i(8450),m=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}init(){this.app.ready$.subscribe(()=>{var e;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,b.pluginVersion)(),e,t),installedVersion:()=>this.installedVersion(),marks:()=>this.installMarks(),canSelfUpdate:()=>(0,m.canSelfUpdate)(this.installMarks()),pluginsDir:()=>this.pluginsDir(),version:()=>(0,b.pluginVersion)()},setTimeout(()=>{this.run("startup")},8e3)})}async run(e,t=!1){const i=this.config.store.agentDeck,n=(0,b.pluginVersion)(),o=this.installMarks(),s=!(0,m.canSelfUpdate)(o);if(!1===i.autoUpdate)return(0,b.diag)(`update skip=disabled reason=${e}`),"disabled";if(!t&&!(0,m.shouldCheck)(i.lastUpdateCheck,Date.now(),Number(i.updateCheckIntervalHours)||m.DEFAULT_INTERVAL_HOURS))return(0,b.diag)(`update skip=too-soon reason=${e}`),"too-soon";let a=null;try{a=(0,m.parseLatestVersion)(await this.fetch((0,m.latestUrl)(i.updateRegistry)))}catch(e){(0,b.diagCatch)("update 레지스트리 조회",e)}i.lastUpdateCheck=Date.now(),this.config.save();const r=(0,m.decide)({enabled:!0,lastCheckAt:0,now:Date.now(),intervalHours:0,devInstall:s,current:n,latest:a});return(0,b.diag)(`update check=${e} current=${n} latest=${null!=a?a:"?"} outcome=${r} dev=${s} marks=${JSON.stringify(o)}`),"dev-install"===r?(this.notifications.info(`AgentDeck ${a} 가 나왔다 (지금 ${n})`,"개발 설치(소스 링크)라 자동으로 갈아끼우지 않는다. 소스에서 직접 올릴 것."),r):"update-ready"!==r?r:t||i.updateSkipVersion!==a?this.confirmAndInstall(n,a):((0,b.diag)(`update skip=asked-not-to version=${a}`),"skipped")}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,b.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,b.diagCatch)("update 설치 스크립트 기동",e),this.notifications.error("업데이트를 시작하지 못했다",`${null!==(n=null==e?void 0:e.message)&&void 0!==n?n:e} — 설정 → 플러그인 에서 직접 업데이트할 수 있다.`),"failed"}const s=this.installedVersion();if(!(0,m.installSucceeded)(t,s))return(0,b.diag)(`update install failed exit=${o} onDisk=${null!=s?s:"?"} want=${t}`),this.notifications.error(`AgentDeck ${t} 설치에 실패했다`,`지금도 ${null!=s?s:e} 다 — %LOCALAPPDATA%\\tabby-agentdeck\\update.log 에 npm 출력이 남는다.`),"failed";(0,b.diag)(`update installed ${e} -> ${t}, reloading`);let a=!1;try{a=await this.reloader.reload(`update:${t}`)}catch(e){(0,b.diagCatch)("update 리로드",e)}return a?"installing":((0,b.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 s=this.pluginsDir();if(!s)throw new Error("Tabby 플러그인 폴더를 찾지 못했다");const a=["-NoProfile","-ExecutionPolicy","Bypass","-WindowStyle","Hidden","-File",o,"-Version",e,"-PluginsDir",s,"-TabbyExe",process.execPath,"-InPlace"];t&&a.push("-Spec",t);const r=(0,c.spawn)("powershell.exe",a,{stdio:"ignore"});return(0,b.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,b.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",m.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",m.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=s([(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 s=n.pre.split("."),a=o.pre.split(".");for(let e=0;e<Math.max(s.length,a.length);e++){const t=s[e],i=a[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}function o(e,t,i){const n=Number(e)||0;return n>t||t-n>=36e5*Math.max(0,Number(i)||0)}t.decide=t.installSucceeded=t.canSelfUpdate=t.shouldCheck=t.latestUrl=t.parseLatestVersion=t.DEFAULT_INTERVAL_HOURS=t.PACKAGE_NAME=t.sx=void 0,t.sx="https://registry.npmjs.org",t.PACKAGE_NAME="tabby-agentdeck",t.DEFAULT_INTERVAL_HOURS=6,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.shouldCheck=o,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?o(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}),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};Object.defineProperty(t,"__esModule",{value:!0}),t.ViewPanel=t.MIN_VIEW_W=t.VIEW_ID=void 0;const a=i(5317),r=s(i(9896)),d=s(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 b(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 m(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 s=null!==(n=o.getAttribute("data-ad-link"))&&void 0!==n?n:"";/^https?:/i.test(s)?this.host.openExternal(s):this.openFile(s.replace(/^file:\/\//,""))}),this.bodyEl.addEventListener("click",e=>{var t,i,n,o,s,a;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===(s=null==r?void 0:r.closest)||void 0===s?void 0:s.call(r,"[data-ad-open]");if(c){e.preventDefault();const t=null!==(a=c.getAttribute("data-ad-open"))&&void 0!==a?a:"";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 s=null===(n=null===(i=t.dataTransfer)||void 0===i?void 0:i.files)||void 0===n?void 0:n[0],a=null===(o=t.dataTransfer)||void 0===o?void 0:o.getData("text/plain"),r=(null==s?void 0:s.path)||a;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(),s=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()},a=()=>{this.resizing=!1,document.body.classList.remove("ad-resizing"),window.removeEventListener("mousemove",s),window.removeEventListener("mouseup",a),this.host.commit()};window.addEventListener("mousemove",s),window.addEventListener("mouseup",a)})}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 s=this.current?d.dirname(this.current):null,a=null!==(i=this.host.cwdFor(null!==(t=this.activeTab)&&void 0!==t?t:{}))&&void 0!==i?i:s,l=null!==(n=this.resolve(e,a,!1))&&void 0!==n?n:this.resolve(e,s,!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&&!a)return void this.setPathNote("상대경로를 풀 작업 폴더를 모른다 — 절대경로로 넣는다");const u=d.normalize(c?e:d.join(a,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;const n=null!==(t=this.buffers.get(e))&&void 0!==t?t:"";if(this.buffers.set(e,n.slice(n.lastIndexOf("\n")+1).slice(-256)),!n)return;const o=this.host.cwdFor(e);let s=null,a=!1;for(const t of(0,c.extractPaths)(n)){const n=this.resolve(t,o);if(!n)continue;const r=null!==(i=this.recent.get(e))&&void 0!==i?i:[];if(r[0]===n)continue;const d=r.includes(n);this.recent.set(e,(0,c.pushRecent)(r,n,this.host.getRecentMax())),a=!0,!d&&(0,c.isAutoFollowable)(n)&&(s=n)}if(!a||e!==this.activeTab)return;this.renderTabs();const r=(0,c.planFollow)(this.host.getFollowMode(),this.opened,this.editing);"none"!==r&&("stage"!==r?"diff"===this.mode?("open"===r&&this.setOpen(!0),this.maybeAutoDiff()):s&&this.openFile(s):s&&this.lastViewed.set(e,s))}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 s=String(null!=e?e:"").trim();if(!s)return;if(this.editing){if(this.editArea&&this.editOrigin&&this.editArea.value!==this.editOrigin.text)return void this.setEditNote("저장하지 않은 편집이 있다 — 저장하거나 취소한 뒤에 다른 파일을 연다");this.cancelEdit()}const a=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:a,l=null!==(n=this.resolve(s,r,!1))&&void 0!==n?n:this.resolve(s,a,!1);if(this.applyMode("file"),!l)return this.setOpen(!0),void this.renderMessage("파일을 찾지 못했다",s);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=m(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:m(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),s=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>"+s.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),s=i||n.length>4e3,a=['<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;a.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>")}),a.push("</div>"),this.bodyEl.innerHTML=a.join("")+(s?'<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 s=n.indexOf("\r\n")>=0;return{text:s?n.replace(/\r\n/g,"\n"):n,truncated:!1,bom:o,crlf:s}}(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 s=this.editStale;try{s=s||r.statSync(n.file).mtimeMs!==n.mtimeMs}catch{}if(s&&!this.editOverwriteArmed)return this.editOverwriteArmed=!0,void this.setEditNote("밖에서 바뀐 파일이다 — 다시 누르면 덮어쓴다");const a=n.crlf?o.replace(/\n/g,"\r\n"):o,d=()=>r.writeFileSync(n.file,(n.bom?"\ufeff":"")+a,"utf8");try{d()}catch(o){const s=String(null!==(e=null==o?void 0:o.code)&&void 0!==e?e:"");if("EPERM"!==s&&"EACCES"!==s&&"EROFS"!==s)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(),s=o?n.split(o).length-1:0;if(!s)return void this.setFindCount(0,0);let a;if(t<0){const e=i.selectionStart-1;a=n.lastIndexOf(o,Math.max(e-1,0)),a<0&&(a=n.lastIndexOf(o))}else{const e=t>0?i.selectionStart+1:i.selectionStart;a=n.indexOf(o,e),a<0&&(a=n.indexOf(o))}if(a<0)return void this.setFindCount(0,0);i.focus(),i.setSelectionRange(a,a+e.length);const r=i.value.slice(0,a).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,a).split(o).length;this.setFindCount(l,s)}markMatches(e){var t;const i=this.bodyEl;if(!i||!e)return;const n=e.toLowerCase(),o=document.createTreeWalker(i,NodeFilter.SHOW_TEXT),s=[];let a;for(;a=o.nextNode();){const e=a;e.data&&e.data.toLowerCase().indexOf(n)>=0&&s.push(e)}for(const i of s){if(this.findHits.length>=2e3)break;const o=[];let s=i.data,a=0;for(;a++<500;){const t=s.toLowerCase().indexOf(n);if(t<0)break;t>0&&o.push(document.createTextNode(s.slice(0,t)));const i=document.createElement("mark");if(i.className="ad-find-hit",i.textContent=s.slice(t,t+e.length),o.push(i),this.findHits.push(i),s=s.slice(t+e.length),this.findHits.length>=2e3)break}if(!o.length)continue;s&&o.push(document.createTextNode(s));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,a.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 s=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(s=e.out,!e.ok&&!s)return void this.failDiff(i,"변경을 읽지 못했다",e.err)}else if(!s)return void this.failDiff(i,"변경을 읽지 못했다",n)}const a=(0,u.parseUnifiedDiff)(s),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)(a,e=>e.path,this.diffRoot,d),c=(0,u.filterTouched)(r,e=>e,this.diffRoot,d);this.diffHidden=a.length-l.length+(r.length-c.length),this.diffDebug={root:this.diffRoot,scope:this.diffScope,touched:d.slice(0,5),all:a.length,kept:l.length,sample:a.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 s=this.touchedNow();if(!s.length)return void this.failDiff(e,t,i);const a=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)("이 세션이 만진 파일 "+s.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 s.slice(0,200)){const i=(0,u.refPathFrom)(t,a);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>")}s.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">'],s="session"===this.diffScope&&this.diffHidden>0?" · 이 세션이 만진 것만 ("+this.diffHidden+"개 숨김)":"";if(o.push('<div class="ad-view-diff-sum">'+(0,l.escapeHtml)((0,u.formatStat)(e)+s)+"</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 a=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(a,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>"),a-=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,s=(0,u.refLineNo)(e),a=null===s?' data-ad-ref-del="'+("hunk"===e.kind?"hunk":"del")+'"':' data-ad-ref-line="'+s+'"';return'<div class="ad-dl ad-dl-'+e.kind+'"'+a+'><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 s=Number(e.getAttribute("data-ad-ref-line"));if(!Number.isFinite(s)||s<=0)return;const a=e.closest("[data-ad-ref-file]"),r=null!==(i=null==a?void 0:a.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:s,c=Math.min(l,s),u=Math.max(l,s);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 s=this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{}),a=(0,u.formatLineRef)((0,u.refPathFrom)((0,u.joinRefPath)(this.diffRoot,e),s),t,i);if(!a)return void this.setRefNote("참조를 만들지 못했다 — 경로가 비어 있다");if(!this.host.sendText)return void this.setRefNote("터미널에 넣지 못했다 — 넣을 자리가 배선되지 않았다 · "+a);const r=Date.now(),d=this.refLastSent,l=!!d&&r-d.at<15e3&&a.length>d.text.length&&a.startsWith(d.text)&&'"'!==d.text[0]&&'"'!==a[0],c=l?a.slice(d.text.length):a;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:a,at:r},this.setRefNote("넣었다 · "+a+(l?" (꼬리만)":""),!0)):this.setRefNote("터미널에 넣지 못했다 — 넣을 터미널이 없다 · "+a)}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 s=null!==(i=this.diffRoot)&&void 0!==i?i:this.host.cwdFor(null!==(n=this.activeTab)&&void 0!==n?n:{});if(!s)return void this.setCommitNote("작업 폴더를 몰라 스테이지를 바꾸지 못한다");const a="add"===t?(0,p.stageArgs)([e]):(0,p.unstageArgs)([e]);if(a.length){this.gitBusy=!0,this.disarmCommit();try{let i=await this.runGit(s,a);!i.ok&&"reset"===t&&/ambiguous argument .?HEAD|unknown revision|bad revision|HEAD/i.test(i.err)&&(i=await this.runGit(s,(0,p.unstageFallbackArgs)([e]))),this.setCommitNote(i.ok?("add"===t?"스테이지에 올렸다 · ":"스테이지에서 내렸다 · ")+e:"스테이지를 바꾸지 못했다 · "+(b(i.err)||b(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 s=null!==(t=this.diffRoot)&&void 0!==t?t:this.host.cwdFor(null!==(i=this.activeTab)&&void 0!==i?i:{});if(!s)return this.disarmCommit(),void this.setCommitNote("작업 폴더를 몰라 커밋하지 못한다");this.gitBusy=!0,this.syncCommitButton();try{const e=await this.runGit(s,o);e.ok?(this.commitInput&&(this.commitInput.value=""),this.setCommitNote("커밋했다 · "+(b(e.out)||b(e.err)))):this.setCommitNote("커밋하지 못했다 · "+(b(e.err)||b(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.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"],s=["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"],a=new Set([...i,...n,...o,...s]);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 a.has(r(e))}t.classify=function(e){const t=r(e);return i.includes(t)?"image":n.includes(t)?"markdown":o.includes(t)?"table":s.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}","g"),u=/[\u2000-\u206f\u2190-\u2bff\u3000-\u303f\uff00-\uffef]/,p=/[),.;:'"`\]}]+$/;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 s;for(c.lastIndex=0;null!==(s=c.exec(i));){let e=s[0].replace(p,"");if(!e||u.test(e))continue;const a=i.slice(Math.max(0,s.index-3),s.index);/:\/\/?$/.test(a)||/^https?$/i.test(null!==(t=e.split(/[\\/]/)[0])&&void 0!==t?t:"")||d(e)&&(/^[vV]?[\d.]+$/.test(e)||(e=e.replace(/^\.[\\/]/,""),o.has(e)||(o.add(e),n.push(e))))}return n};const h=/^(?:\.?claude\.json|settings(?:\.[\w-]+)?\.json)$/i;t.isAutoFollowable=function(e){var t;const i=null!==(t=String(null!=e?e:"").replace(/[\\/]+$/,"").split(/[\\/]/).pop())&&void 0!==t?t:"";return!!i&&!h.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="",s=!1;const a=String(null!=e?e:"").replace(/\r\n?/g,"\n");for(let e=0;e<a.length;e++){const r=a[e];s?'"'===r?'"'===a[e+1]?(o+='"',e++):s=!1:o+=r:'"'===r?s=!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 g=["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&&g.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")},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")},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=s},8349(e){e.exports=a}};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++],s=0===o?{enumerable:!0,value:t[i++]}:{enumerable:!0,get:o};l.o(e,n)||Object.defineProperty(e,n,s)}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)})());