tmux-weblink 2.0.24 → 2.0.26
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.
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
var
|
|
2
|
-
`)}selectRows(t,s){let i=this.terminal.buffer.active,[o,r]=t<=s?[t,s]:[s,t];this.terminal.selectLines(i.viewportY+o,i.viewportY+r)}selectCells(t,s,i,o){let r=this.terminal.buffer.active,d=Math.min(s,o),l=Math.max(s,o);if(d===l){let u=Math.min(t,i),
|
|
3
|
-
`)}getSelection(){return this.terminal.getSelection()}clearSelection(){this.terminal.clearSelection()}hasSelectionSupport(){return!0}};function
|
|
4
|
-
\x1B[31m`+
|
|
5
|
-
`).then(()=>{be();try{o?.close()}catch{}});return}if(a.type==="auth.ok"){a.token&&localStorage.setItem("tmux-web-token",a.token),
|
|
1
|
+
var Xt=/\x1b\](?:10|11|110|111|104)(?:;[^\x07\x1b]*)?\x1b?(?:\\|\x07)/g;function je(e){return e.replace(/\x1b\[\?1049[hl]/g,"")}function ae(e){return e.replace(Xt,"")}var ke;function Jt(){return ke||(document.querySelector("link[data-tmux-web-xterm-css]")?ke=Promise.resolve():(ke=new Promise(e=>{let t=document.createElement("link");t.rel="stylesheet",t.href="/assets/xterm.css",t.setAttribute("data-tmux-web-xterm-css",""),t.addEventListener("load",()=>e(),{once:!0}),t.addEventListener("error",()=>e(),{once:!0}),document.head.appendChild(t)}),ke))}var Zt=class xt{terminal;fitAddon;container;constructor(t,s,i){this.container=t,this.terminal=s,this.fitAddon=i,this.terminal.loadAddon(this.fitAddon),this.terminal.open(t)}static async create(t,s,i){let[{Terminal:o},{FitAddon:r}]=await Promise.all([import("./xterm-BXEES47M.js"),import("./addon-fit-D5N335P2.js"),Jt()]),d=new o({fontSize:14,fontFamily:"'JetBrains Mono', 'SF Mono', 'Menlo', monospace",cursorBlink:!0,cursorStyle:"bar",scrollback:s,convertEol:!1,smoothScrollDuration:120,theme:i});return new xt(t,d,new r)}get cols(){return this.terminal.cols}get rows(){return this.terminal.rows}write(t){return new Promise(s=>this.terminal.write(t,s))}reset(){this.terminal.reset()}scrollToBottom(){this.terminal.scrollToBottom()}scrollToLine(t,s=!1){this.terminal.scrollToLine(Math.max(0,t),s)}scrollLines(t){let s=this.terminal.buffer?.active;this.terminal.scrollLines(t)}isNearScrollbackTop(){return this.terminal.buffer.active.viewportY<=1}viewportY(){return this.terminal.buffer.active.viewportY}baseY(){return this.terminal.buffer.active.baseY}fit(){let t=Gt(this.container);return t.width<=0||t.height<=0?!1:(this.fitAddon.fit(),!0)}focus(){this.terminal.focus()}pasteText(t){this.terminal.paste(t)}input(t){this.terminal.input(t,!1)}onData(t){this.terminal.onData(t),this.terminal.onBinary(t)}onResize(t){this.terminal.onResize(t)}onScroll(t){this.terminal.onScroll(t)}attachCustomKeyEventHandler(t){this.terminal.attachCustomKeyEventHandler(t)}isFocused(){let t=document.activeElement;return t?t===this.container||t===this.terminal.textarea||this.container.contains(t)||!!t.closest?.(".xterm"):!1}getScreenText(){return this.getRowsText(0,this.terminal.rows-1)}getRowsText(t,s){let i=this.terminal.buffer.active,[o,r]=t<=s?[t,s]:[s,t],d=i.viewportY,l=[];for(let u=o;u<=r;u++){let f=i.getLine(d+u);l.push(f?f.translateToString(!0):"")}return l.join(`
|
|
2
|
+
`)}selectRows(t,s){let i=this.terminal.buffer.active,[o,r]=t<=s?[t,s]:[s,t];this.terminal.selectLines(i.viewportY+o,i.viewportY+r)}selectCells(t,s,i,o){let r=this.terminal.buffer.active,d=Math.min(s,o),l=Math.max(s,o);if(d===l){let u=Math.min(t,i),f=Math.max(t,i);this.terminal.select(u,r.viewportY+d,f-u+1)}else this.terminal.selectLines(r.viewportY+d,r.viewportY+l)}getCellsText(t,s,i,o){let r=this.terminal.buffer.active,d=Math.min(s,o),l=Math.max(s,o),u=s<o?t:s>o?i:Math.min(t,i),f=s<o?i:s>o?t:Math.max(t,i),R=r.viewportY,q=[];for(let N=d;N<=l;N++){let ve=r.getLine(R+N);if(!ve){q.push("");continue}let O=N===d?u:0,Pe=N===l?f:this.terminal.cols-1,K="";for(let k=O;k<=Pe;k++){let z=ve.getCell(k);z&&(K+=z.getChars())}q.push(K.replace(/\s+$/,""))}return q.join(`
|
|
3
|
+
`)}getSelection(){return this.terminal.getSelection()}clearSelection(){this.terminal.clearSelection()}hasSelectionSupport(){return!0}};function Gt(e){let t=e.getBoundingClientRect(),s=window.visualViewport;return s?{width:Math.min(t.width,s.width),height:Math.max(0,Math.min(t.height,s.height-Math.max(0,t.top)))}:t}function Qt(e,t,s){return e.innerHTML="",e.classList.add("terminal-pending"),(async()=>{let i=await Zt.create(e,s.scrollback,s.theme),o,r=0,d,l=null,u=0,f=0,R=.2,q=10,N=.95,ve=.04;function O(){u&&(cancelAnimationFrame(u),u=0),f=0}function Pe(n){if(O(),Math.abs(n)<R)return;f=Math.max(-q,Math.min(q,n));let a=()=>{if(A){u=0;return}let c=e.querySelector(".xterm-rows > div"),p=c?c.getBoundingClientRect().height:16,y=p>0?Math.round(f*16/p):f>0?1:-1;y===0&&(y=f>0?1:-1);let B=i.viewportY()-y,Y=i.baseY(),se=Math.max(0,Math.min(B,Y));if(i.scrollToLine(se,!0),f*=N,se!==B){u=0;return}if(Math.abs(f)<ve){u=0;return}u=requestAnimationFrame(a)};u=requestAnimationFrame(a)}let K=0,k="connecting",z=0,he=!1,ye=[],V="",A=!1,G=1e3,kt=location.protocol==="https:"?"wss:":"ws:",Ct=s.wsBase||"/ws",Tt=kt+"//"+location.host+Ct+"/"+encodeURIComponent(t),Mt="/api/session/"+encodeURIComponent(t)+"/upload",Bt=/^((?!chrome|android|crios|fxios|edgios).)*safari/i.test(navigator.userAgent);function It(){return ye.join("")+V}async function St(n,a=0){let c=n?i.viewportY():0,p=n?i.baseY():0,y=ae(It());if(i.reset(),!y){n||i.scrollToBottom();return}await i.write(y),n?i.scrollToLine(p+c+a):i.scrollToBottom()}function F(n){o?.readyState===WebSocket.OPEN&&o.send(JSON.stringify(n))}function Ht(n){let a;try{a=JSON.parse(n)}catch{k==="live"&&(V+=n,i.write(ae(n)));return}if(a.type==="auth.required"){let c=localStorage.getItem("tmux-web-token");c?F({type:"auth.token",token:c}):location.href="/login?returnTo="+encodeURIComponent(location.pathname+location.search);return}if(a.type==="attach_failed"&&typeof a.message=="string"){ge=!0,k="dead",i.reset(),i.write(`\r
|
|
4
|
+
\x1B[31m`+ae(a.message)+`\x1B[0m\r
|
|
5
|
+
`).then(()=>{be();try{o?.close()}catch{}});return}if(a.type==="auth.ok"){a.token&&localStorage.setItem("tmux-web-token",a.token),G=1e3,j(),F({type:"resize",cols:i.cols,rows:i.rows}),C();return}if(a.type==="auth.failed"){if(a.permanentLock||a.retryAfterMs&&a.retryAfterMs>6e4){localStorage.removeItem("tmux-web-token"),location.href="/login?error="+encodeURIComponent(a.message);return}return}if(a.type==="snapshot"&&typeof a.data=="string"){let c=je(ae(a.data));ye=[c],V="",z=typeof a.lines=="number"?a.lines:s.terminal.initialLines,k="live",i.reset(),j(),F({type:"resize",cols:i.cols,rows:i.rows}),i.write(c).then(()=>i.scrollToBottom());return}if(a.type==="window_changed"&&typeof a.activeIndex=="number"){let c=new URL(location.href);c.searchParams.get("window")!==String(a.activeIndex)&&(c.searchParams.set("window",String(a.activeIndex)),history.replaceState(history.state,"",c)),window.dispatchEvent(new CustomEvent("tmux:windows",{detail:a.windows}));return}if(a.type==="history"&&typeof a.data=="string"){he=!1,a.lines>0&&a.data&&(ye.unshift(je(a.data)),z+=a.lines,St(!0,a.lines));return}if(a.type==="data"&&typeof a.data=="string"){let c=je(ae(a.data));if(k==="connecting"){k="live",V=c,i.write(c);return}k==="live"&&(V+=c,i.write(c))}}let ge=!1;function Ve(){if(ge)return;let n=Tt,a=localStorage.getItem("tmux-web-token");a&&(n+=(n.includes("?")?"&":"?")+"token="+encodeURIComponent(a)),n+=(n.includes("?")?"&":"?")+"cols="+i.cols+"&rows="+i.rows,o=new WebSocket(n),o.onopen=()=>{k="connecting",z=0,he=!1,ye=[],V="",i.reset(),G=1e3},o.onmessage=c=>{typeof c.data=="string"&&Ht(c.data)},o.onclose=()=>{A||(k="connecting",!ge&&setTimeout(()=>{G=Math.min(G*2,1e4),!A&&!ge&&Ve()},G))},o.onerror=()=>o?.close()}function we(n){F({type:"input",data:n})}function j(){return i.fit()}function be(){e.classList.remove("terminal-pending")}function C(){r&&cancelAnimationFrame(r),d&&clearTimeout(d),j(),r=requestAnimationFrame(()=>{r=0,j()&&be()}),d=setTimeout(()=>{j()&&be()},120)}function Dt(){C(),setTimeout(C,50),setTimeout(C,150),setTimeout(C,300)}function Xe(n){return typeof n=="string"&&n.startsWith("image/")}function Je(n){return n?.files?.length?n.files[0]??null:null}function Rt(n){if(!n?.items)return null;for(let a=0;a<n.items.length;a++){let c=n.items[a];if(c?.kind==="file"&&Xe(c.type))return c.getAsFile()}return null}async function At(n){let a=new FormData,c=n instanceof File&&n.name?n.name:"upload";a.append("file",n,c);let p=localStorage.getItem("tmux-web-token"),y={};p&&(y.Authorization="Bearer "+p);let B=await fetch(Mt,{method:"POST",body:a,headers:y});if(!B.ok){let se="upload failed";try{let it=await B.json();it.error&&(se=it.error)}catch{}throw new Error(se)}let Y=await B.json();if(!Y.path)throw new Error("no path in response");return Y.path}async function Ne(n){try{let a=await At(n);we(a)}catch{}}i.onData(n=>we(n)),i.onResize(({cols:n,rows:a})=>F({type:"resize",cols:n,rows:a})),i.onScroll(()=>{k!=="live"||he||!i.isNearScrollbackTop()||(he=!0,F({type:"load_history",before:z}))});let Q=!1,ee=!1,b=null,L=null,te=document.createElement("div");te.className="terminal-copy-banner",te.innerHTML='<strong>Copy mode</strong><span class="hint">drag to copy \xB7 Esc exits</span>',te.hidden=!0,e.appendChild(te);let H=document.createElement("div");H.className="terminal-copy-banner terminal-copy-toast",H.textContent="Copied",H.hidden=!0,e.appendChild(H);function Ze(n,a){let c=e.querySelector(".xterm-screen, canvas"),p=(c&&c.getBoundingClientRect().width>0?c:e).getBoundingClientRect(),y=p.height>0&&i.rows>0?p.height/i.rows:18,B=p.width>0&&i.cols>0?p.width/i.cols:9;return{row:Math.max(0,Math.min(i.rows-1,Math.floor((a-p.top)/y))),col:Math.max(0,Math.min(i.cols-1,Math.floor((n-p.left)/B)))}}async function Le(n){if(!n)return;try{if(navigator.clipboard?.writeText){await navigator.clipboard.writeText(n);return}}catch{}let a=document.createElement("textarea");a.value=n,a.style.position="fixed",a.style.opacity="0",a.style.pointerEvents="none",document.body.appendChild(a),a.focus(),a.select();try{document.execCommand("copy")}catch{}a.remove()}let ne;function Ee(){H.hidden=!1,ne&&clearTimeout(ne),ne=setTimeout(()=>{H.hidden=!0},1e3)}function X(n){Q=n,te.hidden=!n,e.classList.toggle("terminal-copy-mode-active",n),n&&i.focus()}function Ge(){X(!Q)}function $t(n){A||n.button!==0||ee||(Q||n.shiftKey)&&(n.preventDefault(),n.stopPropagation(),ee=!0,b=Ze(n.clientX,n.clientY),L=b,i.selectCells(b.col,b.row,L.col,L.row),document.addEventListener("mousemove",ze,!0),document.addEventListener("mouseup",Fe,!0))}function ze(n){A||!ee||!b||(n.preventDefault(),n.stopPropagation(),L=Ze(n.clientX,n.clientY),i.selectCells(b.col,b.row,L.col,L.row))}function Fe(n){if(A||!ee||!b||!L)return;n.preventDefault(),n.stopPropagation(),document.removeEventListener("mousemove",ze,!0),document.removeEventListener("mouseup",Fe,!0),ee=!1;let a=i.getCellsText(b.col,b.row,L.col,L.row);b=null,L=null,i.clearSelection(),X(!1),a&&(H.textContent="\u5DF2\u590D\u5236",Le(a).then(Ee)),i.focus()}e.addEventListener("mousedown",$t,!0),document.addEventListener("keydown",Pt,!0);function Pt(n){if(!(A||!i.isFocused()||n.defaultPrevented||n.isComposing)){if(Q){if(n.key==="Escape"){n.preventDefault(),n.stopPropagation(),b=null,L=null,i.clearSelection(),X(!1);return}if(n.key==="Enter"||(n.ctrlKey||n.metaKey)&&n.code==="KeyC"){n.preventDefault(),n.stopPropagation(),Le(i.getScreenText()).then(Ee),X(!1);return}}if(n.altKey&&n.code==="KeyC"&&!n.ctrlKey&&!n.metaKey){if(n.preventDefault(),n.stopPropagation(),b&&L){let a=i.getCellsText(b.col,b.row,L.col,L.row);b=null,L=null,i.clearSelection(),X(!1),a&&(H.textContent="Copied",Le(a).then(Ee))}else{let a=i.getSelection();a?(i.clearSelection(),H.textContent="Copied",Le(a).then(Ee)):Ge()}return}if((n.ctrlKey||n.metaKey)&&n.code==="KeyV"){n.preventDefault(),n.stopPropagation(),(async()=>{try{if(navigator.clipboard?.read){let a=await navigator.clipboard.read();for(let c of a)for(let p of c.types)if(Xe(p)){let y=await c.getType(p);await Ne(y);return}}}catch{}try{let a=await navigator.clipboard?.readText();a&&i.pasteText(Qe(a))}catch{}})();return}}}let xe=0;function Qe(n){return n.split(`\r
|
|
6
6
|
`).join(`
|
|
7
7
|
`).split(`
|
|
8
|
-
`).join("\r")}async function
|
|
9
|
-
<span>${
|
|
10
|
-
<button class="session-edit-btn" data-session="${
|
|
11
|
-
`,r.addEventListener("click",l=>{l.target.closest(".session-edit-btn")||
|
|
12
|
-
<span>${
|
|
8
|
+
`).join("\r")}async function Nt(n){let a=Rt(n.clipboardData);if(a){n.preventDefault(),n.stopPropagation();let y=Date.now();if(y-xe<50)return;xe=y,await Ne(a);return}let c=n.clipboardData?.getData("text/plain");if(!c)return;n.preventDefault(),n.stopPropagation();let p=Date.now();p-xe<50||(xe=p,i.pasteText(Qe(c)))}let ie=0;function zt(n){n.preventDefault(),ie++,Je(n.dataTransfer)&&e.classList.add("terminal-drag-over")}function Ft(n){n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect="copy")}function jt(n){n.preventDefault(),ie--,ie<=0&&(ie=0,e.classList.remove("terminal-drag-over"))}async function Yt(n){n.preventDefault(),ie=0,e.classList.remove("terminal-drag-over");let a=Je(n.dataTransfer);a&&await Ne(a)}function et(n){!Bt||n.key!=="Escape"||Q||n.defaultPrevented||n.repeat||n.metaKey||n.ctrlKey||n.altKey||i.isFocused()&&(n.preventDefault(),n.stopPropagation(),we("\x1B"))}e.addEventListener("paste",Nt),e.addEventListener("dragenter",zt),e.addEventListener("dragover",Ft),e.addEventListener("dragleave",jt),e.addEventListener("drop",Yt),document.addEventListener("keydown",et,!0);function _t(n){if(n.touches.length!==1){l=null;return}let a=n.touches[0];a&&(O(),l={startX:a.clientX,startY:a.clientY,lastX:a.clientX,lastY:a.clientY,lastT:performance.now(),velocity:0,scrolling:!1},n.stopPropagation())}function Wt(n){if(!l||n.touches.length!==1)return;let a=n.touches[0];if(!a)return;let c=a.clientY-l.startY,p=a.clientX-l.startX;if(!l.scrolling){if(Math.abs(c)<8||Math.abs(c)<Math.abs(p))return;l.scrolling=!0,K=Date.now()+500}n.preventDefault(),n.stopPropagation();let y=performance.now(),B=a.clientY-l.lastY,Y=y-l.lastT;Y>0&&(l.velocity=B/Y),Kt(-B),l.lastX=a.clientX,l.lastY=a.clientY,l.lastT=y}function Ut(n){if(!l)return;let a=l.scrolling,c=l.velocity;if(l=null,n.stopPropagation(),!a){i.focus();return}K=Date.now()+500,n.preventDefault(),c&&Pe(c)}function qt(n){l=null,O(),n.stopPropagation()}function Ot(n){n.pointerType==="touch"&&Date.now()<K&&(n.preventDefault(),n.stopPropagation())}function Kt(n){let a=e.querySelector(".xterm-rows > div"),c=a?a.getBoundingClientRect().height:16,p=c>0?Math.round(n/c):n>0?1:-1;p===0&&(p=n>0?1:-1),i.scrollLines(p)}e.addEventListener("touchstart",_t,{passive:!0,capture:!0}),e.addEventListener("touchmove",Wt,{passive:!1,capture:!0}),e.addEventListener("touchend",Ut,{passive:!1,capture:!0}),e.addEventListener("touchcancel",qt,{passive:!0,capture:!0}),e.addEventListener("pointerup",Ot,!0);function tt(){C()}window.addEventListener("resize",tt),window.visualViewport?.addEventListener("resize",C),window.visualViewport?.addEventListener("scroll",C);let nt=new ResizeObserver(()=>C());nt.observe(e),document.fonts?.ready.then(()=>{C(),setTimeout(C,50),setTimeout(C,200)}),e.addEventListener("focusin",Dt,!0);async function Vt(){if(document.fonts?.ready)try{await Promise.race([document.fonts.ready,new Promise(n=>setTimeout(n,1e3))])}catch{}}return requestAnimationFrame(()=>{j()&&be(),(async()=>(await Vt(),j()&&F({type:"resize",cols:i.cols,rows:i.rows}),Ve(),C()))()}),{destroy(){if(A=!0,O(),X(!1),ne&&clearTimeout(ne),document.removeEventListener("mousemove",ze,!0),document.removeEventListener("mouseup",Fe,!0),o){try{o.close(1e3,"session switch")}catch{}o=void 0}e.innerHTML="",e.classList.remove("terminal-pending"),window.removeEventListener("resize",tt),nt.disconnect(),document.removeEventListener("keydown",et,!0)},focus(){i.focus()},sendInput(n){we(n)},toggleCopyMode(){Ge()}}})()}var oe=window.__TMUX_WEB_SHELL__,h=null,w=null,st=typeof window.__TMUX_WEB_SCOPE__?.agentId=="string"?window.__TMUX_WEB_SCOPE__.agentId:null,x=st;window.__tmuxWebScopeAgent=st;var Ye="sessions",$="",Ce="",Te="",at="";function T(e){return x?"/a/"+encodeURIComponent(x)+e:e}var v=document.getElementById("sidebar-content"),_=document.getElementById("main-placeholder"),M=document.getElementById("terminal-container"),le=document.getElementById("file-editor"),en=document.getElementById("fe-path"),I=document.getElementById("fe-status"),re=document.getElementById("fe-content"),W=document.getElementById("fe-save"),tn=document.getElementById("fe-delete"),nn=document.getElementById("fe-back"),ot=document.getElementById("fe-new-name"),sn=document.getElementById("fe-new-btn"),_e=document.getElementById("settings-backdrop"),lt=document.getElementById("settings-popover"),rt=document.querySelector(".sidebar");function an(){return window.matchMedia("(max-width: 640px)").matches}function We(){an()&&rt.classList.add("collapsed")}function ct(){rt.classList.remove("collapsed")}document.getElementById("mode-sessions").addEventListener("click",()=>{ct(),dt("sessions")}),document.getElementById("mode-files").addEventListener("click",()=>{ct(),dt("files")});function dt(e){Ye=e,document.querySelectorAll(".mode-btn").forEach(s=>s.classList.remove("active"));let t=document.getElementById(e==="sessions"?"mode-sessions":"mode-files");t&&t.classList.add("active"),e==="sessions"?(Ue="",J()):vn()}var Ue="";async function J(){if(Ye!=="sessions")return;try{let t=await(await fetch("/api/sidebar/sessions")).json(),s=JSON.stringify({recent:t.recent,agents:t.agents});if(s===Ue)return;Ue=s,on(t)}catch{v.innerHTML+='<div class="file-tree-empty">Failed to load sessions</div>'}let e=document.getElementById("ns-btn");e&&e.addEventListener("click",()=>document.getElementById("new-session-modal")?.classList.add("open"))}function on(e){v.innerHTML='<button class="new-session-sidebar-btn" id="ns-btn">+ New Session</button>';let t=e.recent||[],s=document.createElement("div");s.className="sidebar-section-label"+(x?" clickable":""),s.textContent=x?"\u2190 \u8FD4\u56DE\u672C\u673A":"\u672C\u673A",x&&(s.title="Back to hub",s.addEventListener("click",()=>{window.location.href="/"})),v.appendChild(s);for(let o of t){let r=document.createElement("div");r.className="session-item"+(o.name===w&&!x?" active":""),r.setAttribute("data-session",o.name),r.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor"><path d="${o.attached?"M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 14H5V6h14v12z":"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"}"></svg>
|
|
9
|
+
<span>${m(o.name)}</span>
|
|
10
|
+
<button class="session-edit-btn" data-session="${m(o.name)}" title="Edit session"><svg viewBox="0 0 24 24" fill="currentColor" width="14" height="14"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1 1 0 000-1.41l-2.34-2.34a1 1 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg></button>
|
|
11
|
+
`,r.addEventListener("click",l=>{l.target.closest(".session-edit-btn")||ce(o.name)}),v.appendChild(r);let d=r.querySelector(".session-edit-btn");d&&d.addEventListener("click",l=>{l.stopPropagation(),bn(o.name,d)})}let i=e.agents||[];for(let o of i){if(!o.sessions||o.sessions.length===0)continue;let r=o.agentId===x,d=document.createElement("div");d.className="sidebar-section-label machine-label"+(o.online?"":" agent-offline-label")+(!r&&o.online?" clickable":""),d.textContent=o.agentName+(o.online?"":" (offline)"),!r&&o.online&&(d.title="\u6253\u5F00 "+o.agentName,d.addEventListener("click",()=>{window.location.href="/a/"+encodeURIComponent(o.agentId)+"/"})),v.appendChild(d);for(let l of o.sessions){let u=document.createElement("div");u.className="session-item"+(l.name===w&&x===o.agentId?" active":"")+(o.online?"":" session-offline"),u.setAttribute("data-session",l.name),u.setAttribute("data-agent",o.agentId),u.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor"><path d="${l.attached?"M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 14H5V6h14v12z":"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"}"></svg>
|
|
12
|
+
<span>${m(l.name)}</span><span class="meta">${o.online?"":"offline"}</span>`,o.online&&u.addEventListener("click",f=>{f.target.closest(".session-edit-btn")||ce(l.name,o.agentId)}),v.appendChild(u)}}}function m(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}async function ce(e,t){if(!(w===e&&h&&x===(t||null))){le.style.display="none",_.style.display="none",M.style.display="",M.classList.add("terminal-pending"),We(),h&&(Ae(),h.destroy(),h=null),w=e,x=t||null,window.__tmuxWebScopeAgent=x;for(let s of v.querySelectorAll(".session-item"))s.classList.toggle("active",s.getAttribute("data-session")===e&&(s.getAttribute("data-agent")||null)===x);try{h=await Qt(M,e,{terminal:oe.terminal,scrollback:oe.scrollback,theme:oe.theme,wsBase:x?"/ws/a/"+encodeURIComponent(x):oe.wsBase||"/ws"}),bt()}catch(s){console.error("[shell] terminal init failed:",s);let i=s&&typeof s=="object"&&"message"in s?s.message:String(s);M.textContent="Failed to open terminal for "+e+": "+i,M.classList.remove("terminal-pending")}}}var Me=[],g=null,ut=!1;function ln(e){if(!g||!g.files.length)return null;let t=g.repoRoot;if(!t||!e.startsWith(t))return null;let s=e.slice(t.length+1);for(let i of g.files)if(i.path===s)return i.status;return null}async function rn(e){ut=!0;try{let t=await fetch(T("/api/git/status?path="+encodeURIComponent(e)));t.ok?g=await t.json():g=null}catch{g=null}finally{ut=!1}}function cn(){if(!g||!g.branch)return"";let{branch:e,linesAdded:t,linesRemoved:s}=g,i=`<div class="sidebar-git"><div class="git-branch-badge">
|
|
13
13
|
<svg viewBox="0 0 16 16" fill="currentColor"><path d="M11.63 1.22a.75.75 0 00-1.06 0L5.99 5.8 4.12 3.93a.75.75 0 10-1.06 1.06L4.93 6.87A3.5 3.5 0 003 10.09v3.16a.75.75 0 001 0v-3.16a2.5 2.5 0 012.5-2.5h.27l-1.06 1.06a.75.75 0 001.06 1.06l2.37-2.38a.75.75 0 000-1.06L7.59 5.27l4.04-4.05a.75.75 0 000-1.06L11.63 1.22zM3.25 13.94a.75.75 0 01-.75-.75v-.69a.75.75 0 011.5 0v.69c0 .414-.336.75-.75.75z"/></svg>
|
|
14
|
-
${
|
|
14
|
+
${m(e)}</div>`;return(t>0||s>0)&&(i+=`<div class="git-diff-stats">+<span class="add">${t}</span> <span class="del">-${s}</span></div>`),i+"</div>"}v.addEventListener("click",e=>{e.target.closest(".sidebar-git")&&Z&&g&&(e.stopPropagation(),ht())});var de=document.getElementById("header-git"),pt=document.getElementById("git-diff-view"),ft=document.getElementById("gd-path"),Be=document.getElementById("gd-status"),Ie=document.getElementById("gd-content"),dn=document.getElementById("gd-back"),Z=null;function ue(e){if(!e||!e.branch){de.style.display="none",Z=null;return}Z=e.repoRoot;let{branch:t,linesAdded:s,linesRemoved:i}=e,o=`<span class="branch">${m(t)}</span>`;(s>0||i>0)&&(o+=`<span class="sep">\xB7</span>+<span class="diff-add">${s}</span> <span class="diff-del">-${i}</span>`),de.innerHTML=o,de.style.display="block"}de.addEventListener("click",e=>{Z&&g&&(e.stopPropagation(),ht())});var E=document.getElementById("git-popover"),Se=document.getElementById("git-popover-backdrop");function qe(){let e=de.getBoundingClientRect();E.style.top=e.bottom+4+"px",E.style.left=Math.max(8,Math.min(e.left,window.innerWidth-400))+"px"}function mt(){let e=Z,t=document.getElementById("git-popover-browse");t&&t.addEventListener("click",()=>{if(De(),e){Ye="files",document.querySelectorAll(".mode-btn").forEach(i=>i.classList.remove("active"));let s=document.getElementById("mode-files");s&&s.classList.add("active"),P(e)}})}var vt="";function ht(){if(!g)return;let e=g.files||[];if(!e.length)E.innerHTML=`<div class="git-popover-header">No changes \u2014 clean working tree</div>
|
|
15
15
|
<div class="git-popover-footer"><button id="git-popover-browse">Browse repository \u2192</button></div>`;else{let t=`<div class="git-popover-header">${e.length} file${e.length>1?"s":""} changed</div>`;for(let s=0;s<e.length;s++){let i=e[s],o=i.additions||0,r=i.deletions||0,d="";switch(i.status){case"M":d='<span class="git-file-status M">M</span>';break;case"A":d='<span class="git-file-status A">A</span>';break;case"D":d='<span class="git-file-status D">D</span>';break;case"?":d='<span class="git-file-status ?">?</span>';break;case"R":d='<span class="git-file-status R">R</span>';break}t+=`<div class="git-popover-item" data-idx="${s}">
|
|
16
|
-
${d}<span class="file-path">${
|
|
16
|
+
${d}<span class="file-path">${m(i.path)}</span>
|
|
17
17
|
<span class="file-add">${o>0?"+"+o:""}</span>
|
|
18
18
|
<span class="file-del">${r>0?"-"+r:""}</span>
|
|
19
|
-
</div>`}t+='<div class="git-popover-footer"><button id="git-popover-browse">Browse repository \u2192</button></div>',
|
|
19
|
+
</div>`}t+='<div class="git-popover-footer"><button id="git-popover-browse">Browse repository \u2192</button></div>',vt=t,E.innerHTML=t,E.querySelectorAll(".git-popover-item").forEach(s=>{let i=parseInt(s.dataset.idx||"0",10),o=e[i];!o||o.status==="D"||(s.classList.add("clickable"),s.style.cursor="pointer",s.addEventListener("click",()=>gt(o.path)))})}qe(),E.classList.add("open"),Se.classList.add("open"),mt()}function un(){return window.innerWidth>=1024}function yt(e,t){let s=(e+(t&&e?`
|
|
20
20
|
`:"")+t).split(`
|
|
21
|
-
`),i="",o=0,r=0;for(let d of s){let l=d;if(l.startsWith("@@")){let u=l.match(/@@\s+-(\d+)[^+]*\+(\d+)/);u&&(o=parseInt(u[1],10)-1,r=parseInt(u[2],10)-1),i+=`<div class="diff-line hunk"><span class="ln-body">${
|
|
21
|
+
`),i="",o=0,r=0;for(let d of s){let l=d;if(l.startsWith("@@")){let u=l.match(/@@\s+-(\d+)[^+]*\+(\d+)/);u&&(o=parseInt(u[1],10)-1,r=parseInt(u[2],10)-1),i+=`<div class="diff-line hunk"><span class="ln-body">${m(l)}</span></div>`;continue}if(l.startsWith("diff --git")||l.startsWith("index ")||l.startsWith("--- ")||l.startsWith("+++ ")||l.startsWith("new file")||l.startsWith("deleted file")){l.startsWith("diff --git")&&(i+=`<div class="diff-line header"><span class="ln-body">${m(l)}</span></div>`);continue}if(l.startsWith("+"))r++,i+=`<div class="diff-line add"><span class="ln-no">${r}</span><span class="ln-body">${m(l)}</span></div>`;else if(l.startsWith("-"))o++,i+=`<div class="diff-line del"><span class="ln-no">${o}</span><span class="ln-body">${m(l)}</span></div>`;else if(l.startsWith("\\"))i+=`<div class="diff-line"><span class="ln-body">${m(l)}</span></div>`;else{if(!l&&!o&&!r)continue;o++,r++,i+=`<div class="diff-line"><span class="ln-no">${o}</span><span class="ln-no" style="margin-right:12px">${r}</span><span class="ln-body">${m(l)}</span></div>`}}return{html:i,lineCount:s.length}}var He=null;async function gt(e){let t=Z;if(t)if(De(),un()){M.style.display="none",h&&(Ae(),h.destroy(),h=null,He=w,w=null),ue(null),le.style.display="none",_.style.display="none",pt.style.display="flex",ft.textContent=e,Be.textContent="Loading\u2026",Ie.innerHTML="";try{let s=await fetch(T("/api/git/diff?path="+encodeURIComponent(t)+"&file="+encodeURIComponent(e)));if(!s.ok)throw new Error(await s.text());let i=await s.json();fn(e,i.diff,i.stagedDiff)}catch(s){let i=s instanceof Error?s.message:String(s);Be.textContent="Error",Ie.innerHTML=`<div class="diff-empty" style="padding:24px;text-align:center;color:var(--panel-muted)">Error: ${m(i)}</div>`}}else{E.innerHTML=`<div class="git-diff-view"><div class="diff-header">
|
|
22
22
|
<button class="diff-back">\u2190 Back</button>
|
|
23
|
-
<span class="diff-filename">${
|
|
23
|
+
<span class="diff-filename">${m(e)}</span>
|
|
24
24
|
<span class="diff-loading">Loading\u2026</span>
|
|
25
|
-
</div></div>`,
|
|
25
|
+
</div></div>`,qe(),E.classList.add("open"),Se.classList.add("open");try{let s=await fetch(T("/api/git/diff?path="+encodeURIComponent(t)+"&file="+encodeURIComponent(e)));if(!s.ok)throw new Error(await s.text());let i=await s.json();pn(e,i.diff,i.stagedDiff)}catch(s){let i=s instanceof Error?s.message:String(s);E.innerHTML=`<div class="git-diff-view"><div class="diff-header">
|
|
26
26
|
<button class="diff-back">\u2190 Back</button>
|
|
27
|
-
<span class="diff-filename">${
|
|
28
|
-
</div><div class="diff-empty">Error loading diff: ${
|
|
27
|
+
<span class="diff-filename">${m(e)}</span>
|
|
28
|
+
</div><div class="diff-empty">Error loading diff: ${m(i)}</div></div>`}}}function pn(e,t,s){if(!t&&!s){E.innerHTML=`<div class="git-diff-view"><div class="diff-header">
|
|
29
29
|
<button class="diff-back">\u2190 Back</button>
|
|
30
|
-
<span class="diff-filename">${
|
|
31
|
-
</div><div class="diff-empty">No diff content available</div></div>`;return}let{html:i,lineCount:o}=
|
|
30
|
+
<span class="diff-filename">${m(e)}</span>
|
|
31
|
+
</div><div class="diff-empty">No diff content available</div></div>`;return}let{html:i,lineCount:o}=yt(t,s);E.innerHTML=`<div class="git-diff-view"><div class="diff-header">
|
|
32
32
|
<button class="diff-back">\u2190 Back</button>
|
|
33
|
-
<span class="diff-filename">${
|
|
33
|
+
<span class="diff-filename">${m(e)}</span>
|
|
34
34
|
<span class="diff-filesize">${o} lines</span>
|
|
35
|
-
</div><div class="diff-content">${i}</div></div>`,E.querySelector(".diff-back")?.addEventListener("click",()=>{E.innerHTML=
|
|
35
|
+
</div><div class="diff-content">${i}</div></div>`,E.querySelector(".diff-back")?.addEventListener("click",()=>{E.innerHTML=vt,qe(),g&&E.querySelectorAll(".git-popover-item").forEach(r=>{let d=parseInt(r.dataset.idx||"0",10),l=g.files[d];!l||l.status==="D"||(r.style.cursor="pointer",r.addEventListener("click",()=>gt(l.path)))}),mt()})}function fn(e,t,s){if(!t&&!s){Be.textContent="No diff",Ie.innerHTML='<div class="diff-empty" style="padding:24px;text-align:center;color:var(--panel-muted)">No diff content available</div>';return}let{html:i,lineCount:o}=yt(t,s);ft.textContent=e,Be.textContent=o+" lines",Ie.innerHTML=i}function mn(){pt.style.display="none",He?(M.style.display="",M.classList.add("terminal-pending"),ce(He),He=null):w?(M.style.display="",M.classList.add("terminal-pending"),bt()):_.style.display="flex"}dn.addEventListener("click",mn);function De(){E.classList.remove("open"),Se.classList.remove("open")}Se.addEventListener("click",De),document.addEventListener("keydown",e=>{e.key==="Escape"&&(De(),$e())});async function wt(e){try{let t=await(await fetch("/api/fs/session-path?session="+encodeURIComponent(e))).json();if(t.path){let s=await fetch("/api/git/status?path="+encodeURIComponent(t.path));if(s.ok){let i=await s.json();g=i,ue(i);return}}}catch{}g=null,ue(null)}var Re=null;function bt(){Ae(),w&&(wt(w),Re=setInterval(()=>{w&&wt(w)},3e4))}function Ae(){Re&&(clearInterval(Re),Re=null)}function vn(){if(Me=oe.fsRoots||[],Me.length===0){if(w){hn(w);return}v.innerHTML='<div class="file-tree-info">Open a session first, then switch to Files to browse its directory.</div>';return}v.innerHTML="";for(let e of Me){let t=document.createElement("div");t.className="file-tree-item",t.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor" class="file-icon"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg> ${m(e)}`,t.addEventListener("click",()=>P(e)),v.appendChild(t)}}async function hn(e){v.innerHTML='<div class="file-tree-empty">Loading...</div>';try{let t=await(await fetch(T("/api/fs/session-path?session="+encodeURIComponent(e)))).json();t.path?P(t.path):v.innerHTML='<div class="file-tree-info">Could not determine session directory.</div>'}catch{v.innerHTML='<div class="file-tree-error">Failed to get session directory</div>'}}async function P(e){$=e,v.innerHTML='<div class="file-tree-empty">Loading...</div>';let t=rn(e);try{let s=await(await fetch(T("/api/fs/list?path="+encodeURIComponent(e)))).json();await t,v.innerHTML="",ue(g),v.innerHTML+=cn();let i=yn(e);if(i&&!Me.some(r=>e===r)){let r=document.createElement("div");r.className="file-tree-item",r.innerHTML="..",r.addEventListener("click",()=>P(i)),v.appendChild(r)}if(s.dirs)for(let r of s.dirs){let d=r.split("/").pop()||r.split("\\").pop(),l=document.createElement("div");l.className="file-tree-item",l.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor" class="file-icon"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg> ${m(d)}`,l.addEventListener("click",()=>P(r)),v.appendChild(l)}else v.innerHTML="";let o=s.files||[];for(let r of o){let d=r.split("/").pop()||r.split("\\").pop(),l=ln(r),u="",f="";if(l)switch(l){case"M":u="git-mod",f='<span class="git-file-status M">M</span>';break;case"A":u="git-add",f='<span class="git-file-status A">A</span>';break;case"D":u="git-del",f='<span class="git-file-status D">D</span>';break;case"?":u="git-untracked",f='<span class="git-file-status ?">?</span>';break;case"R":u="git-mod",f='<span class="git-file-status R">R</span>';break}let R=document.createElement("div");R.className="file-tree-item file"+(u?" "+u:""),R.innerHTML=`<span class="file-icon">\u{1F4C4}</span> ${f}${m(d)}`,R.addEventListener("click",()=>gn(r)),v.appendChild(R)}}catch{v.innerHTML='<div class="file-tree-error">Failed to load directory</div>'}}function yn(e){let t=e.lastIndexOf("/");return t<=0?null:e.substring(0,t)}async function gn(e){Ce=e,M.style.display="none",h&&(Ae(),h.destroy(),h=null,w=null),ue(null),We(),_.style.display="none",le.style.display="flex",en.textContent=e,I.textContent="Loading...",W.style.display="none";try{let t=await fetch(T("/api/file?path="+encodeURIComponent(e)));if(!t.ok){let i=await t.json();I.textContent=i.error||"Failed to load",re.value="";return}let s=await t.json();re.value=s.content,Te=s.content,at=s.content,I.textContent=s.size+" bytes",W.style.display=""}catch{I.textContent="Failed to load",re.value=""}}re.addEventListener("input",()=>{Te=re.value}),W.addEventListener("click",async()=>{W.textContent="Saving...",W.disabled=!0;try{let e=await fetch(T("/api/file"),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:Ce,content:Te})});if(!e.ok){let t=await e.json();I.textContent=t.error||"Save failed";return}at=Te,I.textContent="Saved"}catch{I.textContent="Save failed"}finally{W.disabled=!1,W.textContent="Save"}}),tn.addEventListener("click",async()=>{if(confirm("Delete "+Ce+"?"))try{let e=await fetch(T("/api/file/delete"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:Ce})});if(!e.ok){let t=await e.json();I.textContent=t.error||"Delete failed";return}le.style.display="none",_.style.display="flex",$&&P($)}catch{I.textContent="Delete failed"}}),nn.addEventListener("click",()=>{le.style.display="none",_.style.display="flex",$&&P($)}),sn.addEventListener("click",async()=>{let e=ot.value.trim();if(!e)return;let t=$+"/"+e;try{let s=await fetch(T("/api/file/touch"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t})});if(!s.ok){let i=await s.json();I.textContent=i.error||"Create failed";return}ot.value="",$&&P($)}catch{I.textContent="Create failed"}}),document.getElementById("mode-settings").addEventListener("click",()=>{let e=lt.classList.toggle("open");_e.classList.toggle("open",e)}),_e.addEventListener("click",()=>{lt.classList.remove("open"),_e.classList.remove("open")});var U="",pe=document.createElement("div");pe.className="session-popover-backdrop",document.body.appendChild(pe);var D=document.createElement("div");D.id="session-popover",D.className="session-popover",D.style.display="none",D.innerHTML=`<div class="sp-field">
|
|
36
36
|
<label>Rename session</label>
|
|
37
37
|
<input type="text" id="sp-name" />
|
|
38
38
|
</div>
|
|
@@ -41,5 +41,5 @@ var Jt=/\x1b\](?:10|11|110|111|104)(?:;[^\x07\x1b]*)?\x1b?(?:\\|\x07)/g;function
|
|
|
41
41
|
<button class="btn" id="sp-cancel">Cancel</button>
|
|
42
42
|
</div>
|
|
43
43
|
<hr class="sp-divider" />
|
|
44
|
-
<button class="btn danger" id="sp-delete">Delete session</button>`,document.body.appendChild(
|
|
45
|
-
`).length;S.rows=Math.min(e,4)}),S.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),
|
|
44
|
+
<button class="btn danger" id="sp-delete">Delete session</button>`,document.body.appendChild(D);function wn(e){let t=e.getBoundingClientRect();D.style.top=t.bottom+4+"px",D.style.left=Math.max(8,Math.min(t.left,window.innerWidth-240))+"px"}function bn(e,t){U=e;let s=document.getElementById("sp-name");s.value=e,pe.classList.add("open"),D.style.display="block",wn(t),setTimeout(()=>s.focus(),50)}function fe(){pe.classList.remove("open"),D.style.display="none"}pe.addEventListener("click",fe),document.getElementById("sp-save").addEventListener("click",async()=>{let e=document.getElementById("sp-name").value.trim();if(!e||e===U){fe();return}try{if(!(await fetch(T("/api/sessions/rename"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldName:U,newName:e})})).ok)return;fe(),J(),w===U&&ce(e)}catch{}}),document.getElementById("sp-delete").addEventListener("click",async()=>{if(confirm('Delete session "'+U+'"?'))try{if(!(await fetch(T("/api/sessions/kill"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:U})})).ok)return;fe(),w===U&&(h&&(h.destroy(),h=null),w=null,M.style.display="none",_.style.display="flex"),J()}catch{}}),document.getElementById("sp-cancel").addEventListener("click",fe);var Ln={esc:"\x1B",tab:" ","s-tab":"\x1B[Z",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C",space:" ",enter:"\r","ctrl-r":"","ctrl-c":"",btw:"/btw ",yes:"yes\r"};document.getElementById("mobile-keys").addEventListener("click",e=>{let t=e.target.closest("button[data-key]");if(!t||!h)return;let s=Ln[t.dataset.key];s&&(h.sendInput(s),h.focus())});var S=document.getElementById("mk-input"),Lt=document.getElementById("mk-send");function Et(){if(!S||!h)return;let e=S.value;e&&(h.sendInput(e+"\r"),S.value="",S.rows=1,h.focus())}if(S&&(S.addEventListener("input",()=>{S.rows=1;let e=S.value.split(`
|
|
45
|
+
`).length;S.rows=Math.min(e,4)}),S.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Et())})),Lt&&Lt.addEventListener("click",Et),window.visualViewport){let e=document.querySelector(".app-layout"),t=()=>{e&&(e.style.height=window.visualViewport.height+"px"),window.scrollTo(0,0),document.documentElement.scrollTop=0,document.body.scrollTop=0};window.visualViewport.addEventListener("resize",t),window.addEventListener("orientationchange",()=>setTimeout(t,100)),document.addEventListener("touchstart",()=>{(window.scrollY>0||document.documentElement.scrollTop>0)&&window.scrollTo(0,0)},{passive:!0})}var Oe=document.getElementById("process-panel"),me=document.getElementById("proc-list"),En=document.getElementById("proc-close"),Ke=document.getElementById("proc-backdrop"),xn=document.getElementById("header-ram");function kn(){me.innerHTML='<div class="proc-empty">Loading\u2026</div>',fetch(T("/api/system/processes")).then(e=>e.json()).then(e=>{if(!Array.isArray(e)||!e.length){me.innerHTML='<div class="proc-empty">No processes</div>';return}let t="";for(let s of e){let i=s.rss,o=i<1048576?(i/1024).toFixed(0)+"K":(i/1048576).toFixed(1)+"M";t+='<div class="proc-row" data-pid="'+s.pid+'"><span class="proc-mem">'+s.mem+'%</span><span class="proc-rss">'+o+'</span><span class="proc-cmd" title="'+m(s.command)+'">'+m(s.command)+'</span><button class="proc-kill" title="Kill PID '+s.pid+'">×</button></div>'}me.innerHTML=t;for(let s of me.querySelectorAll(".proc-row")){let i=s.querySelector(".proc-kill");i&&i.addEventListener("click",o=>{let r=o.target.closest(".proc-row");!r||!confirm("Kill PID "+r.dataset.pid+"?")||fetch(T("/api/system/kill"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pid:parseInt(r.dataset.pid,10)})}).then(d=>d.json()).then(d=>{d.ok?r.style.opacity="0.3":alert("Failed: "+(d.error||"unknown"))}).catch(()=>alert("Network error"))})}}).catch(()=>{me.innerHTML='<div class="proc-empty">Failed to load</div>'})}function Cn(){Oe.classList.add("open"),Ke.classList.add("open"),kn()}function $e(){Oe.classList.remove("open"),Ke.classList.remove("open")}xn.addEventListener("click",e=>{e.stopPropagation(),Oe.classList.contains("open")?$e():Cn()}),En.addEventListener("click",$e),Ke.addEventListener("click",$e),window.__openSession=ce,window.__refreshSidebar=J,J(),We(),setInterval(()=>{document.visibilityState==="visible"&&J()},1e4);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const
|
|
2
|
-
`)}selectRows(o,i){const n=this.terminal.buffer.active,[a,f]=o<=i?[o,i]:[i,o];this.terminal.selectLines(n.viewportY+a,n.viewportY+f)}selectCells(o,i,n,a){const f=this.terminal.buffer.active,h=Math.min(i,a),l=Math.max(i,a);if(h===l){const d=Math.min(o,n),g=Math.max(o,n);this.terminal.select(d,f.viewportY+h,g-d+1)}else this.terminal.selectLines(f.viewportY+h,f.viewportY+l)}getCellsText(o,i,n,a){const f=this.terminal.buffer.active,h=Math.min(i,a),l=Math.max(i,a),d=i<a?o:i>a?n:Math.min(o,n),g=i<a?n:i>a?o:Math.max(o,n)
|
|
3
|
-
`)}getSelection(){return this.terminal.getSelection()}clearSelection(){this.terminal.clearSelection()}hasSelectionSupport(){return!0}}function Re(s){const o=s.getBoundingClientRect(),i=window.visualViewport;return i?{width:Math.min(o.width,i.width),height:Math.max(0,Math.min(o.height,i.height-Math.max(0,o.top)))}:o}function
|
|
4
|
-
\x1B[31m`+
|
|
5
|
-
`).then(()=>{H();try{a?.close()}catch{}});return}if(t.type==="auth.ok"){t.token&&localStorage.setItem("tmux-web-token",t.token),Y=1e3,
|
|
1
|
+
const Oe=/\x1b\](?:10|11|110|111|104)(?:;[^\x07\x1b]*)?\x1b?(?:\\|\x07)/g;function ne(s){return s.replace(/\x1b\[\?1049[hl]/g,"")}function N(s){return s.replace(Oe,"")}let R;function Ne(){return R||(document.querySelector("link[data-tmux-web-xterm-css]")?R=Promise.resolve():(R=new Promise(o=>{const i=document.createElement("link");i.rel="stylesheet",i.href="/assets/xterm.css",i.setAttribute("data-tmux-web-xterm-css",""),i.addEventListener("load",()=>o(),{once:!0}),i.addEventListener("error",()=>o(),{once:!0}),document.head.appendChild(i)}),R))}class oe{terminal;fitAddon;container;constructor(o,i,n){this.container=o,this.terminal=i,this.fitAddon=n,this.terminal.loadAddon(this.fitAddon),this.terminal.open(o)}static async create(o,i,n){const[{Terminal:a},{FitAddon:f}]=await Promise.all([import("@xterm/xterm"),import("@xterm/addon-fit"),Ne()]),h=new a({fontSize:14,fontFamily:"'JetBrains Mono', 'SF Mono', 'Menlo', monospace",cursorBlink:!0,cursorStyle:"bar",scrollback:i,convertEol:!1,smoothScrollDuration:120,theme:n});return new oe(o,h,new f)}get cols(){return this.terminal.cols}get rows(){return this.terminal.rows}write(o){return new Promise(i=>this.terminal.write(o,i))}reset(){this.terminal.reset()}scrollToBottom(){this.terminal.scrollToBottom()}scrollToLine(o,i=!1){this.terminal.scrollToLine(Math.max(0,o),i)}scrollLines(o){const i=this.terminal.buffer?.active;this.terminal.scrollLines(o)}isNearScrollbackTop(){return this.terminal.buffer.active.viewportY<=1}viewportY(){return this.terminal.buffer.active.viewportY}baseY(){return this.terminal.buffer.active.baseY}fit(){const o=Re(this.container);return o.width<=0||o.height<=0?!1:(this.fitAddon.fit(),!0)}focus(){this.terminal.focus()}pasteText(o){this.terminal.paste(o)}input(o){this.terminal.input(o,!1)}onData(o){this.terminal.onData(o),this.terminal.onBinary(o)}onResize(o){this.terminal.onResize(o)}onScroll(o){this.terminal.onScroll(o)}attachCustomKeyEventHandler(o){this.terminal.attachCustomKeyEventHandler(o)}isFocused(){const o=document.activeElement;return o?o===this.container||o===this.terminal.textarea||this.container.contains(o)||!!o.closest?.(".xterm"):!1}getScreenText(){return this.getRowsText(0,this.terminal.rows-1)}getRowsText(o,i){const n=this.terminal.buffer.active,[a,f]=o<=i?[o,i]:[i,o],h=n.viewportY,l=[];for(let d=a;d<=f;d++){const g=n.getLine(h+d);l.push(g?g.translateToString(!0):"")}return l.join(`
|
|
2
|
+
`)}selectRows(o,i){const n=this.terminal.buffer.active,[a,f]=o<=i?[o,i]:[i,o];this.terminal.selectLines(n.viewportY+a,n.viewportY+f)}selectCells(o,i,n,a){const f=this.terminal.buffer.active,h=Math.min(i,a),l=Math.max(i,a);if(h===l){const d=Math.min(o,n),g=Math.max(o,n);this.terminal.select(d,f.viewportY+h,g-d+1)}else this.terminal.selectLines(f.viewportY+h,f.viewportY+l)}getCellsText(o,i,n,a){const f=this.terminal.buffer.active,h=Math.min(i,a),l=Math.max(i,a),d=i<a?o:i>a?n:Math.min(o,n),g=i<a?n:i>a?o:Math.max(o,n),$=f.viewportY,S=[];for(let E=h;E<=l;E++){const X=f.getLine($+E);if(!X){S.push("");continue}const D=E===h?d:0,Q=E===l?g:this.terminal.cols-1;let P="";for(let w=D;w<=Q;w++){const L=X.getCell(w);L&&(P+=L.getChars())}S.push(P.replace(/\s+$/,""))}return S.join(`
|
|
3
|
+
`)}getSelection(){return this.terminal.getSelection()}clearSelection(){this.terminal.clearSelection()}hasSelectionSupport(){return!0}}function Re(s){const o=s.getBoundingClientRect(),i=window.visualViewport;return i?{width:Math.min(o.width,i.width),height:Math.max(0,Math.min(o.height,i.height-Math.max(0,o.top)))}:o}function Xe(s,o,i){return s.innerHTML="",s.classList.add("terminal-pending"),(async()=>{const n=await oe.create(s,i.scrollback,i.theme);let a,f=0,h,l=null,d=0,g=0;const $=.2,S=10,E=.95,X=.04;function D(){d&&(cancelAnimationFrame(d),d=0),g=0}function Q(e){if(D(),Math.abs(e)<$)return;g=Math.max(-S,Math.min(S,e));const t=()=>{if(b){d=0;return}const r=s.querySelector(".xterm-rows > div"),u=r?r.getBoundingClientRect().height:16;let c=u>0?Math.round(g*16/u):g>0?1:-1;c===0&&(c=g>0?1:-1);const v=n.viewportY()-c,G=n.baseY(),O=Math.max(0,Math.min(v,G));if(n.scrollToLine(O,!0),g*=E,O!==v){d=0;return}if(Math.abs(g)<X){d=0;return}d=requestAnimationFrame(t)};d=requestAnimationFrame(t)}let P=0,w="connecting",L=0,q=!1,U=[],I="",b=!1,Y=1e3;const me=location.protocol==="https:"?"wss:":"ws:",pe=i.wsBase||"/ws",he=me+"//"+location.host+pe+"/"+encodeURIComponent(o),ge="/api/session/"+encodeURIComponent(o)+"/upload",we=/^((?!chrome|android|crios|fxios|edgios).)*safari/i.test(navigator.userAgent);function ye(){return U.join("")+I}async function ve(e,t=0){const r=e?n.viewportY():0,u=e?n.baseY():0,c=N(ye());if(n.reset(),!c){e||n.scrollToBottom();return}await n.write(c),e?n.scrollToLine(u+r+t):n.scrollToBottom()}function C(e){a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify(e))}function Te(e){let t;try{t=JSON.parse(e)}catch{w==="live"&&(I+=e,n.write(N(e)));return}if(t.type==="auth.required"){const r=localStorage.getItem("tmux-web-token");r?C({type:"auth.token",token:r}):location.href="/login?returnTo="+encodeURIComponent(location.pathname+location.search);return}if(t.type==="attach_failed"&&typeof t.message=="string"){_=!0,w="dead",n.reset(),n.write(`\r
|
|
4
|
+
\x1B[31m`+N(t.message)+`\x1B[0m\r
|
|
5
|
+
`).then(()=>{H();try{a?.close()}catch{}});return}if(t.type==="auth.ok"){t.token&&localStorage.setItem("tmux-web-token",t.token),Y=1e3,M(),C({type:"resize",cols:n.cols,rows:n.rows}),y();return}if(t.type==="auth.failed"){if(t.permanentLock||t.retryAfterMs&&t.retryAfterMs>6e4){localStorage.removeItem("tmux-web-token"),location.href="/login?error="+encodeURIComponent(t.message);return}return}if(t.type==="snapshot"&&typeof t.data=="string"){const r=ne(N(t.data));U=[r],I="",L=typeof t.lines=="number"?t.lines:i.terminal.initialLines,w="live",n.reset(),M(),C({type:"resize",cols:n.cols,rows:n.rows}),n.write(r).then(()=>n.scrollToBottom());return}if(t.type==="window_changed"&&typeof t.activeIndex=="number"){const r=new URL(location.href);r.searchParams.get("window")!==String(t.activeIndex)&&(r.searchParams.set("window",String(t.activeIndex)),history.replaceState(history.state,"",r)),window.dispatchEvent(new CustomEvent("tmux:windows",{detail:t.windows}));return}if(t.type==="history"&&typeof t.data=="string"){q=!1,t.lines>0&&t.data&&(U.unshift(ne(t.data)),L+=t.lines,ve(!0,t.lines));return}if(t.type==="data"&&typeof t.data=="string"){const r=ne(N(t.data));if(w==="connecting"){w="live",I=r,n.write(r);return}w==="live"&&(I+=r,n.write(r))}}let _=!1;function re(){if(_)return;let e=he;const t=localStorage.getItem("tmux-web-token");t&&(e+=(e.includes("?")?"&":"?")+"token="+encodeURIComponent(t)),e+=(e.includes("?")?"&":"?")+"cols="+n.cols+"&rows="+n.rows,a=new WebSocket(e),a.onopen=()=>{w="connecting",L=0,q=!1,U=[],I="",n.reset(),Y=1e3},a.onmessage=r=>{typeof r.data=="string"&&Te(r.data)},a.onclose=()=>{b||(w="connecting",!_&&setTimeout(()=>{Y=Math.min(Y*2,1e4),!b&&!_&&re()},Y))},a.onerror=()=>a?.close()}function j(e){C({type:"input",data:e})}function M(){return n.fit()}function H(){s.classList.remove("terminal-pending")}function y(){f&&cancelAnimationFrame(f),h&&clearTimeout(h),M(),f=requestAnimationFrame(()=>{f=0,M()&&H()}),h=setTimeout(()=>{M()&&H()},120)}function xe(){y(),setTimeout(y,50),setTimeout(y,150),setTimeout(y,300)}function ie(e){return typeof e=="string"&&e.startsWith("image/")}function se(e){return e?.files?.length?e.files[0]??null:null}function be(e){if(!e?.items)return null;for(let t=0;t<e.items.length;t++){const r=e.items[t];if(r?.kind==="file"&&ie(r.type))return r.getAsFile()}return null}async function Ee(e){const t=new FormData,r=e instanceof File&&e.name?e.name:"upload";t.append("file",e,r);const u=localStorage.getItem("tmux-web-token"),c={};u&&(c.Authorization="Bearer "+u);const x=await fetch(ge,{method:"POST",body:t,headers:c});if(!x.ok){let G="upload failed";try{const O=await x.json();O.error&&(G=O.error)}catch{}throw new Error(G)}const v=await x.json();if(!v.path)throw new Error("no path in response");return v.path}async function Z(e){try{const t=await Ee(e);j(t)}catch{}}n.onData(e=>j(e)),n.onResize(({cols:e,rows:t})=>C({type:"resize",cols:e,rows:t})),n.onScroll(()=>{w!=="live"||q||!n.isNearScrollbackTop()||(q=!0,C({type:"load_history",before:L}))});let F=!1,A=!1,m=null,p=null;const K=document.createElement("div");K.className="terminal-copy-banner",K.innerHTML='<strong>Copy mode</strong><span class="hint">drag to copy \xB7 Esc exits</span>',K.hidden=!0,s.appendChild(K);const T=document.createElement("div");T.className="terminal-copy-banner terminal-copy-toast",T.textContent="Copied",T.hidden=!0,s.appendChild(T);function ae(e,t){const r=s.querySelector(".xterm-screen, canvas"),c=(r&&r.getBoundingClientRect().width>0?r:s).getBoundingClientRect(),x=c.height>0&&n.rows>0?c.height/n.rows:18,v=c.width>0&&n.cols>0?c.width/n.cols:9;return{row:Math.max(0,Math.min(n.rows-1,Math.floor((t-c.top)/x))),col:Math.max(0,Math.min(n.cols-1,Math.floor((e-c.left)/v)))}}async function V(e){if(!e)return;try{if(navigator.clipboard?.writeText){await navigator.clipboard.writeText(e);return}}catch{}const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch{}t.remove()}let B;function J(){T.hidden=!1,B&&clearTimeout(B),B=setTimeout(()=>{T.hidden=!0},1e3)}function k(e){F=e,K.hidden=!e,s.classList.toggle("terminal-copy-mode-active",e),e&&n.focus()}function le(){k(!F)}function Le(e){b||e.button!==0||A||(F||e.shiftKey)&&(e.preventDefault(),e.stopPropagation(),A=!0,m=ae(e.clientX,e.clientY),p=m,n.selectCells(m.col,m.row,p.col,p.row),document.addEventListener("mousemove",ee,!0),document.addEventListener("mouseup",te,!0))}function ee(e){b||!A||!m||(e.preventDefault(),e.stopPropagation(),p=ae(e.clientX,e.clientY),n.selectCells(m.col,m.row,p.col,p.row))}function te(e){if(b||!A||!m||!p)return;e.preventDefault(),e.stopPropagation(),document.removeEventListener("mousemove",ee,!0),document.removeEventListener("mouseup",te,!0),A=!1;const t=n.getCellsText(m.col,m.row,p.col,p.row);m=null,p=null,n.clearSelection(),k(!1),t&&(T.textContent="\u5DF2\u590D\u5236",V(t).then(J)),n.focus()}s.addEventListener("mousedown",Le,!0),document.addEventListener("keydown",Ce,!0);function Ce(e){if(!(b||!n.isFocused()||e.defaultPrevented||e.isComposing)){if(F){if(e.key==="Escape"){e.preventDefault(),e.stopPropagation(),m=null,p=null,n.clearSelection(),k(!1);return}if(e.key==="Enter"||(e.ctrlKey||e.metaKey)&&e.code==="KeyC"){e.preventDefault(),e.stopPropagation(),V(n.getScreenText()).then(J),k(!1);return}}if(e.altKey&&e.code==="KeyC"&&!e.ctrlKey&&!e.metaKey){if(e.preventDefault(),e.stopPropagation(),m&&p){const t=n.getCellsText(m.col,m.row,p.col,p.row);m=null,p=null,n.clearSelection(),k(!1),t&&(T.textContent="Copied",V(t).then(J))}else{const t=n.getSelection();t?(n.clearSelection(),T.textContent="Copied",V(t).then(J)):le()}return}if((e.ctrlKey||e.metaKey)&&e.code==="KeyV"){e.preventDefault(),e.stopPropagation(),(async()=>{try{if(navigator.clipboard?.read){const t=await navigator.clipboard.read();for(const r of t)for(const u of r.types)if(ie(u)){const c=await r.getType(u);await Z(c);return}}}catch{}try{const t=await navigator.clipboard?.readText();t&&n.pasteText(ce(t))}catch{}})();return}}}let W=0;function ce(e){return e.split(`\r
|
|
6
6
|
`).join(`
|
|
7
7
|
`).split(`
|
|
8
|
-
`).join("\r")}async function
|
|
8
|
+
`).join("\r")}async function Me(e){const t=be(e.clipboardData);if(t){e.preventDefault(),e.stopPropagation();const c=Date.now();if(c-W<50)return;W=c,await Z(t);return}const r=e.clipboardData?.getData("text/plain");if(!r)return;e.preventDefault(),e.stopPropagation();const u=Date.now();u-W<50||(W=u,n.pasteText(ce(r)))}let z=0;function Se(e){e.preventDefault(),z++,se(e.dataTransfer)&&s.classList.add("terminal-drag-over")}function De(e){e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy")}function Pe(e){e.preventDefault(),z--,z<=0&&(z=0,s.classList.remove("terminal-drag-over"))}async function Ie(e){e.preventDefault(),z=0,s.classList.remove("terminal-drag-over");const t=se(e.dataTransfer);t&&await Z(t)}function ue(e){!we||e.key!=="Escape"||F||e.defaultPrevented||e.repeat||e.metaKey||e.ctrlKey||e.altKey||n.isFocused()&&(e.preventDefault(),e.stopPropagation(),j("\x1B"))}s.addEventListener("paste",Me),s.addEventListener("dragenter",Se),s.addEventListener("dragover",De),s.addEventListener("dragleave",Pe),s.addEventListener("drop",Ie),document.addEventListener("keydown",ue,!0);function ke(e){if(e.touches.length!==1){l=null;return}const t=e.touches[0];t&&(D(),l={startX:t.clientX,startY:t.clientY,lastX:t.clientX,lastY:t.clientY,lastT:performance.now(),velocity:0,scrolling:!1},e.stopPropagation())}function Ye(e){if(!l||e.touches.length!==1)return;const t=e.touches[0];if(!t)return;const r=t.clientY-l.startY,u=t.clientX-l.startX;if(!l.scrolling){if(Math.abs(r)<8||Math.abs(r)<Math.abs(u))return;l.scrolling=!0,P=Date.now()+500}e.preventDefault(),e.stopPropagation();const c=performance.now(),x=t.clientY-l.lastY,v=c-l.lastT;v>0&&(l.velocity=x/v),Be(-x),l.lastX=t.clientX,l.lastY=t.clientY,l.lastT=c}function Fe(e){if(!l)return;const t=l.scrolling,r=l.velocity;if(l=null,e.stopPropagation(),!t){n.focus();return}P=Date.now()+500,e.preventDefault(),r&&Q(r)}function Ae(e){l=null,D(),e.stopPropagation()}function Ke(e){e.pointerType==="touch"&&Date.now()<P&&(e.preventDefault(),e.stopPropagation())}function Be(e){const t=s.querySelector(".xterm-rows > div"),r=t?t.getBoundingClientRect().height:16;let u=r>0?Math.round(e/r):e>0?1:-1;u===0&&(u=e>0?1:-1),n.scrollLines(u)}s.addEventListener("touchstart",ke,{passive:!0,capture:!0}),s.addEventListener("touchmove",Ye,{passive:!1,capture:!0}),s.addEventListener("touchend",Fe,{passive:!1,capture:!0}),s.addEventListener("touchcancel",Ae,{passive:!0,capture:!0}),s.addEventListener("pointerup",Ke,!0);function fe(){y()}window.addEventListener("resize",fe),window.visualViewport?.addEventListener("resize",y),window.visualViewport?.addEventListener("scroll",y);const de=new ResizeObserver(()=>y());de.observe(s),document.fonts?.ready.then(()=>{y(),setTimeout(y,50),setTimeout(y,200)}),s.addEventListener("focusin",xe,!0);async function ze(){if(document.fonts?.ready)try{await Promise.race([document.fonts.ready,new Promise(e=>setTimeout(e,1e3))])}catch{}}return requestAnimationFrame(()=>{M()&&H(),(async()=>(await ze(),M()&&C({type:"resize",cols:n.cols,rows:n.rows}),re(),y()))()}),{destroy(){if(b=!0,D(),k(!1),B&&clearTimeout(B),document.removeEventListener("mousemove",ee,!0),document.removeEventListener("mouseup",te,!0),a){try{a.close(1e3,"session switch")}catch{}a=void 0}s.innerHTML="",s.classList.remove("terminal-pending"),window.removeEventListener("resize",fe),de.disconnect(),document.removeEventListener("keydown",ue,!0)},focus(){n.focus()},sendInput(e){j(e)},toggleCopyMode(){le()}}})()}export{Xe as initTerminal,ne as stripAltScreenSequences};
|
package/dist/lib/pages/shell.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSessionModalHTML as f,newSessionModalScript as g,reducedMotion as b}from"../shared-layout.js";import{icon as i}from"../icons.js";function h(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function o(t="var(--panel-accent)"){return`box-shadow: 0 0 0 2px ${t}; outline: none;`}function y(t){const{theme:e,fsRoots:n,terminalCfg:r,scrollback:a,wsBase:s}=t,
|
|
1
|
+
import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSessionModalHTML as f,newSessionModalScript as g,reducedMotion as b}from"../shared-layout.js";import{icon as i}from"../icons.js";function h(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function o(t="var(--panel-accent)"){return`box-shadow: 0 0 0 2px ${t}; outline: none;`}function y(t){const{theme:e,fsRoots:n,terminalCfg:r,scrollback:a,wsBase:s}=t,l=`
|
|
2
2
|
*, *::before, *::after { box-sizing: border-box; }
|
|
3
3
|
html, body {
|
|
4
4
|
background: var(--page-bg); color: var(--page-fg);
|
|
@@ -497,6 +497,9 @@ import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSes
|
|
|
497
497
|
/* \u2500\u2500 Terminal container \u2500\u2500 */
|
|
498
498
|
#terminal-container {
|
|
499
499
|
flex: 1; overflow: hidden; position: relative;
|
|
500
|
+
/* Disable the browser's touch -> synthetic-wheel path so the custom
|
|
501
|
+
touch drag/inertia in terminal-core handles scrolling exclusively. */
|
|
502
|
+
touch-action: none;
|
|
500
503
|
}
|
|
501
504
|
#terminal-container.terminal-pending { visibility: hidden; }
|
|
502
505
|
#terminal-container.terminal-pending::before {
|
|
@@ -602,7 +605,7 @@ import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSes
|
|
|
602
605
|
.mobile-keys .mk-buttons { display: none; }
|
|
603
606
|
.mobile-keys.mk-focused .mk-buttons { display: flex; flex-wrap: wrap; gap: 4px; }
|
|
604
607
|
}
|
|
605
|
-
`,x=JSON.stringify(e.terminal).replace(/</g,"\\u003c"),
|
|
608
|
+
`,x=JSON.stringify(e.terminal).replace(/</g,"\\u003c"),p=JSON.stringify({terminal:r,scrollback:a,theme:e.terminal,fsRoots:n,wsBase:s||""}).replace(/</g,"\\u003c");return`<!DOCTYPE html>
|
|
606
609
|
<html lang="en">
|
|
607
610
|
<head>
|
|
608
611
|
<meta charset="UTF-8" />
|
|
@@ -616,7 +619,7 @@ import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSes
|
|
|
616
619
|
<title>tmux-weblink</title>
|
|
617
620
|
<style>
|
|
618
621
|
${d(e.shell)}
|
|
619
|
-
${
|
|
622
|
+
${l}
|
|
620
623
|
</style>
|
|
621
624
|
</head>
|
|
622
625
|
<body>
|
|
@@ -760,7 +763,7 @@ import{cssVarsStyle as d}from"../theme.js";import{newSessionModalCSS as c,newSes
|
|
|
760
763
|
${f()}
|
|
761
764
|
|
|
762
765
|
<script>
|
|
763
|
-
window.__TMUX_WEB_SHELL__ = ${
|
|
766
|
+
window.__TMUX_WEB_SHELL__ = ${p};
|
|
764
767
|
</script>
|
|
765
768
|
<script type="module">
|
|
766
769
|
await import('/assets/shell-client.js');
|