tmux-weblink 2.2.20 → 2.2.21
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.
|
@@ -5,7 +5,7 @@ var mn=/\x1b\](?:10|11|110|111|104)(?:;[^\x07\x1b]*)?\x1b?(?:\\|\x07)/g;function
|
|
|
5
5
|
`).then(()=>{Me();try{l?.close()}catch{}});return}if(o.type==="auth.ok"){o.token&&localStorage.setItem("tmux-web-token",o.token),ae=1e3,K(),q({type:"resize",cols:s.cols,rows:s.rows}),T();return}if(o.type==="auth.failed"){if(o.permanentLock||o.retryAfterMs&&o.retryAfterMs>6e4){localStorage.removeItem("tmux-web-token"),location.href="/login?error="+encodeURIComponent(o.message);return}return}if(o.type==="snapshot"&&typeof o.data=="string"){let d=Xe(pe(o.data));Te=[d],G="",Se=typeof o.lines=="number"?o.lines:n.terminal.initialLines,R="live",s.reset(),K(),q({type:"resize",cols:s.cols,rows:s.rows}),s.write(d).then(()=>s.scrollToBottom());return}if(o.type==="window_changed"&&typeof o.activeIndex=="number"){let d=new URL(location.href);d.searchParams.get("window")!==String(o.activeIndex)&&(d.searchParams.set("window",String(o.activeIndex)),history.replaceState(history.state,"",d)),window.dispatchEvent(new CustomEvent("tmux:windows",{detail:o.windows}));return}if(o.type==="history"&&typeof o.data=="string"){o.lines>0&&o.data?(Te.unshift(Xe(o.data)),Se+=o.lines,Vt(!0,o.lines).finally(()=>{ie=!1})):ie=!1;return}if(o.type==="data"&&typeof o.data=="string"){let d=Xe(pe(o.data));if(R==="connecting"){R="live",G=d,s.write(d);return}R==="live"&&(G+=d,s.write(d))}}let Be=!1;function ot(){if(Be)return;let i=Ot,o=localStorage.getItem("tmux-web-token");o&&(i+=(i.includes("?")?"&":"?")+"token="+encodeURIComponent(o)),i+=(i.includes("?")?"&":"?")+"cols="+s.cols+"&rows="+s.rows,l=new WebSocket(i),l.onopen=()=>{R="connecting",Se=0,ie=!1,Te=[],G="",s.reset(),ae=1e3},l.onmessage=d=>{typeof d.data=="string"&&Xt(d.data)},l.onclose=()=>{j||(R="connecting",!Be&&setTimeout(()=>{ae=Math.min(ae*2,1e4),!j&&!Be&&ot()},ae))},l.onerror=()=>l?.close()}function Q(i){q({type:"input",data:i})}function K(){return s.fit()}function Me(){e.classList.remove("terminal-pending")}function T(){r&&cancelAnimationFrame(r),c&&clearTimeout(c),K(),r=requestAnimationFrame(()=>{r=0,K()&&Me()}),c=setTimeout(()=>{K()&&Me()},120)}function Jt(){T(),setTimeout(T,50),setTimeout(T,150),setTimeout(T,300)}function lt(i){return typeof i=="string"&&i.startsWith("image/")}function rt(i){return i?.files?.length?i.files[0]??null:null}function Zt(i){if(!i?.items)return null;for(let o=0;o<i.items.length;o++){let d=i.items[o];if(d?.kind==="file"&<(d.type))return d.getAsFile()}return null}async function Gt(i){let o=new FormData,d=i instanceof File&&i.name?i.name:"upload";o.append("file",i,d);let p=localStorage.getItem("tmux-web-token"),v={};p&&(v.Authorization="Bearer "+p);let A=await fetch(Wt,{method:"POST",body:o,headers:v});if(!A.ok){let ue="upload failed";try{let ht=await A.json();ht.error&&(ue=ht.error)}catch{}throw new Error(ue)}let V=await A.json();if(!V.path)throw new Error("no path in response");return V.path}async function qe(i){try{let o=await Gt(i);Q(o)}catch{}}s.onData(i=>Q(i)),s.onResize(({cols:i,rows:o})=>q({type:"resize",cols:i,rows:o})),s.onScroll(()=>{R!=="live"||ie||!s.isNearScrollbackTop()||(ie=!0,q({type:"load_history",before:Se}))});let oe=!1,le=!1,E=null,x=null,re=document.createElement("div");re.className="terminal-copy-banner",re.innerHTML='<strong>Copy mode</strong><span class="hint">drag to copy \xB7 Esc exits</span>',re.hidden=!0,e.appendChild(re);let $=document.createElement("div");$.className="terminal-copy-banner terminal-copy-toast",$.textContent="Copied",$.hidden=!0,e.appendChild($);function ct(i,o){let d=e.querySelector(".xterm-screen, canvas"),p=(d&&d.getBoundingClientRect().width>0?d:e).getBoundingClientRect(),v=p.height>0&&s.rows>0?p.height/s.rows:18,A=p.width>0&&s.cols>0?p.width/s.cols:9;return{row:Math.max(0,Math.min(s.rows-1,Math.floor((o-p.top)/v))),col:Math.max(0,Math.min(s.cols-1,Math.floor((i-p.left)/A)))}}async function Ie(i){if(!i)return;try{if(navigator.clipboard?.writeText){await navigator.clipboard.writeText(i);return}}catch{}let o=document.createElement("textarea");o.value=i,o.style.position="fixed",o.style.opacity="0",o.style.pointerEvents="none",document.body.appendChild(o),o.focus(),o.select();try{document.execCommand("copy")}catch{}o.remove()}let ce;function De(){$.hidden=!1,ce&&clearTimeout(ce),ce=setTimeout(()=>{$.hidden=!0},1e3)}function ee(i){oe=i,re.hidden=!i,e.classList.toggle("terminal-copy-mode-active",i),i&&s.focus()}function dt(){ee(!oe)}function Qt(i){j||i.button!==0||le||(oe||i.shiftKey)&&(i.preventDefault(),i.stopPropagation(),le=!0,E=ct(i.clientX,i.clientY),x=E,s.selectCells(E.col,E.row,x.col,x.row),document.addEventListener("mousemove",Ke,!0),document.addEventListener("mouseup",Ve,!0))}function Ke(i){j||!le||!E||(i.preventDefault(),i.stopPropagation(),x=ct(i.clientX,i.clientY),s.selectCells(E.col,E.row,x.col,x.row))}function Ve(i){if(j||!le||!E||!x)return;i.preventDefault(),i.stopPropagation(),document.removeEventListener("mousemove",Ke,!0),document.removeEventListener("mouseup",Ve,!0),le=!1;let o=s.getCellsText(E.col,E.row,x.col,x.row);E=null,x=null,s.clearSelection(),ee(!1),o&&($.textContent="\u5DF2\u590D\u5236",Ie(o).then(De)),s.focus()}e.addEventListener("mousedown",Qt,!0),document.addEventListener("keydown",en,!0);function en(i){if(!(j||!s.isFocused()||i.defaultPrevented||i.isComposing)){if(oe){if(i.key==="Escape"){i.preventDefault(),i.stopPropagation(),E=null,x=null,s.clearSelection(),ee(!1);return}if(i.key==="Enter"||(i.ctrlKey||i.metaKey)&&i.code==="KeyC"){i.preventDefault(),i.stopPropagation(),Ie(s.getScreenText()).then(De),ee(!1);return}}if(i.altKey&&i.code==="KeyC"&&!i.ctrlKey&&!i.metaKey){if(i.preventDefault(),i.stopPropagation(),E&&x){let o=s.getCellsText(E.col,E.row,x.col,x.row);E=null,x=null,s.clearSelection(),ee(!1),o&&($.textContent="Copied",Ie(o).then(De))}else{let o=s.getSelection();o?(s.clearSelection(),$.textContent="Copied",Ie(o).then(De)):dt()}return}if((i.ctrlKey||i.metaKey)&&i.code==="KeyV"){i.preventDefault(),i.stopPropagation(),(async()=>{try{if(navigator.clipboard?.read){let o=await navigator.clipboard.read();for(let d of o)for(let p of d.types)if(lt(p)){let v=await d.getType(p);await qe(v);return}}}catch{}try{let o=await navigator.clipboard?.readText();o&&s.pasteText(ut(o))}catch{}})();return}}}let Fe=0;function ut(i){return i.split(`\r
|
|
6
6
|
`).join(`
|
|
7
7
|
`).split(`
|
|
8
|
-
`).join("\r")}async function tn(i){let o=Zt(i.clipboardData);if(o){i.preventDefault(),i.stopPropagation();let v=Date.now();if(v-Fe<50)return;Fe=v,await qe(o);return}let d=i.clipboardData?.getData("text/plain");if(!d)return;i.preventDefault(),i.stopPropagation();let p=Date.now();p-Fe<50||(Fe=p,s.pasteText(ut(d)))}let de=0;function nn(i){i.preventDefault(),de++,rt(i.dataTransfer)&&e.classList.add("terminal-drag-over")}function sn(i){i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="copy")}function an(i){i.preventDefault(),de--,de<=0&&(de=0,e.classList.remove("terminal-drag-over"))}async function on(i){i.preventDefault(),de=0,e.classList.remove("terminal-drag-over");let o=rt(i.dataTransfer);o&&await qe(o)}function pt(i){!qt||i.key!=="Escape"||oe||i.defaultPrevented||i.repeat||i.metaKey||i.ctrlKey||i.altKey||s.isFocused()&&(i.preventDefault(),i.stopPropagation(),Q("\x1B"))}e.addEventListener("paste",tn),e.addEventListener("dragenter",nn),e.addEventListener("dragover",sn),e.addEventListener("dragleave",an),e.addEventListener("drop",on),document.addEventListener("keydown",pt,!0);function ln(i){if(i.touches.length!==1){a=null;return}let o=i.touches[0];if(!o)return;W();let d=e.getBoundingClientRect(),p=o.clientX-d.left<d.width*.4?"tui":"history",v=o.clientY-d.top<d.height*.5;a={startX:o.clientX,startY:o.clientY,lastX:o.clientX,lastY:o.clientY,lastT:performance.now(),velocity:0,scrolling:!1,zone:p,tuiUp:v,sent:!1},i.stopPropagation()}function rn(i){if(!a||i.touches.length!==1)return;let o=i.touches[0];if(!o)return;let d=o.clientY-a.startY,p=o.clientX-a.startX;if(!a.scrolling){if(Math.abs(d)<8||Math.abs(d)<Math.abs(p))return;a.scrolling=!0,ke=Date.now()+500}i.preventDefault(),i.stopPropagation();let v=performance.now(),A=o.clientY-a.lastY;if(a.zone==="tui"){a.sent||(a.sent=!0,Q(a.tuiUp?"\x1B[5~":"\x1B[6~"),se(a.tuiUp)),a.lastX=o.clientX,a.lastY=o.clientY,a.lastT=v;return}let V=v-a.lastT;V>0&&(a.velocity=A/V),pn(-A),a.lastX=o.clientX,a.lastY=o.clientY,a.lastT=v}function cn(i){if(!a)return;let o=a.scrolling,d=a.zone,p=a.tuiUp,v=a.velocity;if(a=null,i.stopPropagation(),d==="tui"){o||(Q(p?"\x1B[5~":"\x1B[6~"),se(p),ke=Date.now()+500,i.preventDefault())
|
|
8
|
+
`).join("\r")}async function tn(i){let o=Zt(i.clipboardData);if(o){i.preventDefault(),i.stopPropagation();let v=Date.now();if(v-Fe<50)return;Fe=v,await qe(o);return}let d=i.clipboardData?.getData("text/plain");if(!d)return;i.preventDefault(),i.stopPropagation();let p=Date.now();p-Fe<50||(Fe=p,s.pasteText(ut(d)))}let de=0;function nn(i){i.preventDefault(),de++,rt(i.dataTransfer)&&e.classList.add("terminal-drag-over")}function sn(i){i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="copy")}function an(i){i.preventDefault(),de--,de<=0&&(de=0,e.classList.remove("terminal-drag-over"))}async function on(i){i.preventDefault(),de=0,e.classList.remove("terminal-drag-over");let o=rt(i.dataTransfer);o&&await qe(o)}function pt(i){!qt||i.key!=="Escape"||oe||i.defaultPrevented||i.repeat||i.metaKey||i.ctrlKey||i.altKey||s.isFocused()&&(i.preventDefault(),i.stopPropagation(),Q("\x1B"))}e.addEventListener("paste",tn),e.addEventListener("dragenter",nn),e.addEventListener("dragover",sn),e.addEventListener("dragleave",an),e.addEventListener("drop",on),document.addEventListener("keydown",pt,!0);function ln(i){if(i.touches.length!==1){a=null;return}let o=i.touches[0];if(!o)return;W();let d=e.getBoundingClientRect(),p=o.clientX-d.left<d.width*.4?"tui":"history",v=o.clientY-d.top<d.height*.5;a={startX:o.clientX,startY:o.clientY,lastX:o.clientX,lastY:o.clientY,lastT:performance.now(),velocity:0,scrolling:!1,zone:p,tuiUp:v,sent:!1},i.stopPropagation()}function rn(i){if(!a||i.touches.length!==1)return;let o=i.touches[0];if(!o)return;let d=o.clientY-a.startY,p=o.clientX-a.startX;if(!a.scrolling){if(Math.abs(d)<8||Math.abs(d)<Math.abs(p))return;a.scrolling=!0,ke=Date.now()+500}i.preventDefault(),i.stopPropagation();let v=performance.now(),A=o.clientY-a.lastY;if(a.zone==="tui"){a.sent||(a.sent=!0,Q(a.tuiUp?"\x1B[5~":"\x1B[6~"),se(a.tuiUp)),a.lastX=o.clientX,a.lastY=o.clientY,a.lastT=v;return}let V=v-a.lastT;V>0&&(a.velocity=A/V),pn(-A),a.lastX=o.clientX,a.lastY=o.clientY,a.lastT=v}function cn(i){if(!a)return;let o=a.scrolling,d=a.zone,p=a.tuiUp,v=a.velocity;if(a=null,i.stopPropagation(),d==="tui"){o||(Q(p?"\x1B[5~":"\x1B[6~"),se(p),ke=Date.now()+500,i.preventDefault());return}if(!o){s.focus();return}ke=Date.now()+500,i.preventDefault(),v&&Ut(v)}function dn(i){a=null,W(),i.stopPropagation()}function un(i){i.pointerType==="touch"&&Date.now()<ke&&(i.preventDefault(),i.stopPropagation())}function pn(i){let o=e.querySelector(".xterm-rows > div"),d=o?o.getBoundingClientRect().height:16,p=d>0?Math.round(i/d):i>0?1:-1;p===0&&(p=i>0?1:-1),s.scrollLines(p)}e.addEventListener("touchstart",ln,{passive:!0,capture:!0}),e.addEventListener("touchmove",rn,{passive:!1,capture:!0}),e.addEventListener("touchend",cn,{passive:!1,capture:!0}),e.addEventListener("touchcancel",dn,{passive:!0,capture:!0}),e.addEventListener("pointerup",un,!0);function ft(){T()}window.addEventListener("resize",ft),window.visualViewport?.addEventListener("resize",T),window.visualViewport?.addEventListener("scroll",T);let mt=new ResizeObserver(()=>T());mt.observe(e),document.fonts?.ready.then(()=>{T(),setTimeout(T,50),setTimeout(T,200)}),e.addEventListener("focusin",Jt,!0);async function fn(){if(document.fonts?.ready)try{await Promise.race([document.fonts.ready,new Promise(i=>setTimeout(i,1e3))])}catch{}}return requestAnimationFrame(()=>{K()&&Me(),(async()=>(await fn(),K()&&q({type:"resize",cols:s.cols,rows:s.rows}),ot(),T()))()}),{destroy(){if(j=!0,W(),ee(!1),ce&&clearTimeout(ce),document.removeEventListener("mousemove",Ke,!0),document.removeEventListener("mouseup",Ve,!0),l){try{l.close(1e3,"session switch")}catch{}l=void 0}e.innerHTML="",e.classList.remove("terminal-pending"),window.removeEventListener("resize",ft),mt.disconnect(),document.removeEventListener("keydown",pt,!0)},focus(){s.focus()},sendInput(i){Q(i)},toggleCopyMode(){dt()}}})()}var fe=window.__TMUX_WEB_SHELL__,g=null,y=null,me=typeof window.__TMUX_WEB_SCOPE__?.agentId=="string"?window.__TMUX_WEB_SCOPE__.agentId:null,B=me;window.__tmuxWebScopeAgent=me;var Je="sessions",U="",He="",Pe="",vt="";function C(e){return B?"/a/"+encodeURIComponent(B)+e:e}var m=document.getElementById("sidebar-content"),X=document.getElementById("main-placeholder"),I=document.getElementById("terminal-container"),he=document.getElementById("file-editor"),wn=document.getElementById("fe-path"),H=document.getElementById("fe-status"),ve=document.getElementById("fe-content"),J=document.getElementById("fe-save"),bn=document.getElementById("fe-delete"),En=document.getElementById("fe-back"),gt=document.getElementById("fe-new-name"),Ln=document.getElementById("fe-new-btn"),Ze=document.getElementById("settings-backdrop"),yt=document.getElementById("settings-popover"),wt=document.querySelector(".sidebar");function xn(){return window.matchMedia("(max-width: 640px)").matches}function Ge(){xn()&&wt.classList.add("collapsed")}function bt(){wt.classList.remove("collapsed")}document.getElementById("mode-sessions").addEventListener("click",()=>{bt(),Et("sessions")}),document.getElementById("mode-files").addEventListener("click",()=>{bt(),Et("files")});function Et(e){Je=e,document.querySelectorAll(".mode-btn").forEach(n=>n.classList.remove("active"));let t=document.getElementById(e==="sessions"?"mode-sessions":"mode-files");t&&t.classList.add("active"),e==="sessions"?(Qe="",_()):Rn()}var Qe="";async function _(){if(Je!=="sessions")return;try{let t=await(await fetch("/api/sidebar/sessions")).json(),n=JSON.stringify({recent:t.recent,agents:t.agents,tombstones:t.tombstones});if(n===Qe)return;Qe=n,Bn(t)}catch{m.innerHTML+='<div class="file-tree-empty">Failed to load sessions</div>'}let e=document.getElementById("ns-btn");e&&e.addEventListener("click",()=>{let t=window.__openNewSessionModal;typeof t=="function"?t():document.getElementById("new-session-modal")?.classList.add("open")}),at()}var Lt="tmux-web-sidebar-group-collapsed";function xt(){try{return new Set(JSON.parse(localStorage.getItem(Lt)||"[]"))}catch{return new Set}}function Cn(e){try{localStorage.setItem(Lt,JSON.stringify([...e]))}catch{}}function kn(e,t,n){if(!e)return"\u2026";let s=n&&(e===n||e.startsWith(n+"/"))?"~"+e.slice(n.length):e,l=s.split("/").filter(Boolean);if(l.length===0)return e;for(let r=1;r<=l.length;r++){let c=l.slice(-r).join("/");if(!t.some(a=>!a||a===e?!1:(n&&(a===n||a.startsWith(n+"/"))?"~"+a.slice(n.length):a).split("/").filter(Boolean).slice(-r).join("/")===c))return c}return s}function Ct(e,t,n,s=!0){let l=new Map;for(let a of e){let u=a.path||"";l.has(u)||l.set(u,[]),l.get(u).push(a)}let r=[...l.keys()],c=xt();for(let[a,u]of l){let f=kn(a,r,t),S=c.has(a),L=document.createElement("div");L.className="session-group-header"+(S?" collapsed":""),L.title=a||"No working directory",L.innerHTML=`<span class="sg-folder">📁</span><span class="sg-label">${h(f)}</span>`,L.addEventListener("click",()=>{let M=xt(),b=L.nextElementSibling;M.has(a)?(M.delete(a),L.classList.remove("collapsed"),b?.classList.remove("collapsed")):(M.add(a),L.classList.add("collapsed"),b?.classList.add("collapsed")),Cn(M)});let F=document.createElement("div");F.className="session-group-body"+(S?" collapsed":"");for(let M of u)F.appendChild(n?Sn(M,n,s):Tn(M));m.appendChild(L),m.appendChild(F)}}function Sn(e,t,n){let s=document.createElement("div");return s.className="session-item"+(e.name===y&&B===t?" active":"")+(n?"":" session-offline"),s.setAttribute("data-session",e.name),s.setAttribute("data-agent",t),s.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor"><path d="${e.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
9
|
<span>${h(e.name)}</span>${n?"":'<span class="meta">offline</span>'}`,n&&s.addEventListener("click",l=>{l.target.closest(".session-edit-btn")||ge(e.name,t)}),s}function Tn(e){let t=document.createElement("div");t.className="session-item"+(e.name===y&&!B?" active":""),t.setAttribute("data-session",e.name),t.innerHTML=`<svg viewBox="0 0 24 24" fill="currentColor"><path d="${e.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>
|
|
10
10
|
<span>${h(e.name)}</span>
|
|
11
11
|
<button class="session-edit-btn" data-session="${h(e.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>
|
|
@@ -5,4 +5,4 @@ const Ht=/\x1b\](?:10|11|110|111|104)(?:;[^\x07\x1b]*)?\x1b?(?:\\|\x07)/g;functi
|
|
|
5
5
|
`).then(()=>{G();try{l?.close()}catch{}});return}if(e.type==="auth.ok"){e.token&&localStorage.setItem("tmux-web-token",e.token),z=1e3,D(),S({type:"resize",cols:n.cols,rows:n.rows}),y();return}if(e.type==="auth.failed"){if(e.permanentLock||e.retryAfterMs&&e.retryAfterMs>6e4){localStorage.removeItem("tmux-web-token"),location.href="/login?error="+encodeURIComponent(e.message);return}return}if(e.type==="snapshot"&&typeof e.data=="string"){const i=rt(H(e.data));W=[i],k="",V=typeof e.lines=="number"?e.lines:r.terminal.initialLines,x="live",n.reset(),D(),S({type:"resize",cols:n.cols,rows:n.rows}),n.write(i).then(()=>n.scrollToBottom());return}if(e.type==="window_changed"&&typeof e.activeIndex=="number"){const i=new URL(location.href);i.searchParams.get("window")!==String(e.activeIndex)&&(i.searchParams.set("window",String(e.activeIndex)),history.replaceState(history.state,"",i)),window.dispatchEvent(new CustomEvent("tmux:windows",{detail:e.windows}));return}if(e.type==="history"&&typeof e.data=="string"){e.lines>0&&e.data?(W.unshift(rt(e.data)),V+=e.lines,Et(!0,e.lines).finally(()=>{A=!1})):A=!1;return}if(e.type==="data"&&typeof e.data=="string"){const i=rt(H(e.data));if(x==="connecting"){x="live",k=i,n.write(i);return}x==="live"&&(k+=i,n.write(i))}}let J=!1;function at(){if(J)return;let t=vt;const e=localStorage.getItem("tmux-web-token");e&&(t+=(t.includes("?")?"&":"?")+"token="+encodeURIComponent(e)),t+=(t.includes("?")?"&":"?")+"cols="+n.cols+"&rows="+n.rows,l=new WebSocket(t),l.onopen=()=>{x="connecting",V=0,A=!1,W=[],k="",n.reset(),z=1e3},l.onmessage=i=>{typeof i.data=="string"&&Lt(i.data)},l.onclose=()=>{E||(x="connecting",!J&&setTimeout(()=>{z=Math.min(z*2,1e4),!E&&!J&&at()},z))},l.onerror=()=>l?.close()}function I(t){S({type:"input",data:t})}function D(){return n.fit()}function G(){a.classList.remove("terminal-pending")}function y(){d&&cancelAnimationFrame(d),m&&clearTimeout(m),D(),d=requestAnimationFrame(()=>{d=0,D()&&G()}),m=setTimeout(()=>{D()&&G()},120)}function Mt(){y(),setTimeout(y,50),setTimeout(y,150),setTimeout(y,300)}function lt(t){return typeof t=="string"&&t.startsWith("image/")}function ct(t){return t?.files?.length?t.files[0]??null:null}function Ct(t){if(!t?.items)return null;for(let e=0;e<t.items.length;e++){const i=t.items[e];if(i?.kind==="file"&<(i.type))return i.getAsFile()}return null}async function St(t){const e=new FormData,i=t instanceof File&&t.name?t.name:"upload";e.append("file",t,i);const u=localStorage.getItem("tmux-web-token"),c={};u&&(c.Authorization="Bearer "+u);const b=await fetch(xt,{method:"POST",body:e,headers:c});if(!b.ok){let tt="upload failed";try{const R=await b.json();R.error&&(tt=R.error)}catch{}throw new Error(tt)}const v=await b.json();if(!v.path)throw new Error("no path in response");return v.path}async function nt(t){try{const e=await St(t);I(e)}catch{}}n.onData(t=>I(t)),n.onResize(({cols:t,rows:e})=>S({type:"resize",cols:t,rows:e})),n.onScroll(()=>{x!=="live"||A||!n.isNearScrollbackTop()||(A=!0,S({type:"load_history",before:V}))});let B=!1,K=!1,h=null,g=null;const U=document.createElement("div");U.className="terminal-copy-banner",U.innerHTML='<strong>Copy mode</strong><span class="hint">drag to copy \xB7 Esc exits</span>',U.hidden=!0,a.appendChild(U);const T=document.createElement("div");T.className="terminal-copy-banner terminal-copy-toast",T.textContent="Copied",T.hidden=!0,a.appendChild(T);function ut(t,e){const i=a.querySelector(".xterm-screen, canvas"),c=(i&&i.getBoundingClientRect().width>0?i:a).getBoundingClientRect(),b=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((e-c.top)/b))),col:Math.max(0,Math.min(n.cols-1,Math.floor((t-c.left)/v)))}}async function $(t){if(!t)return;try{if(navigator.clipboard?.writeText){await navigator.clipboard.writeText(t);return}}catch{}const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",e.style.pointerEvents="none",document.body.appendChild(e),e.focus(),e.select();try{document.execCommand("copy")}catch{}e.remove()}let X;function Q(){T.hidden=!1,X&&clearTimeout(X),X=setTimeout(()=>{T.hidden=!0},1e3)}function Y(t){B=t,U.hidden=!t,a.classList.toggle("terminal-copy-mode-active",t),t&&n.focus()}function ft(){Y(!B)}function Dt(t){E||t.button!==0||K||(B||t.shiftKey)&&(t.preventDefault(),t.stopPropagation(),K=!0,h=ut(t.clientX,t.clientY),g=h,n.selectCells(h.col,h.row,g.col,g.row),document.addEventListener("mousemove",ot,!0),document.addEventListener("mouseup",it,!0))}function ot(t){E||!K||!h||(t.preventDefault(),t.stopPropagation(),g=ut(t.clientX,t.clientY),n.selectCells(h.col,h.row,g.col,g.row))}function it(t){if(E||!K||!h||!g)return;t.preventDefault(),t.stopPropagation(),document.removeEventListener("mousemove",ot,!0),document.removeEventListener("mouseup",it,!0),K=!1;const e=n.getCellsText(h.col,h.row,g.col,g.row);h=null,g=null,n.clearSelection(),Y(!1),e&&(T.textContent="\u5DF2\u590D\u5236",$(e).then(Q)),n.focus()}a.addEventListener("mousedown",Dt,!0),document.addEventListener("keydown",Pt,!0);function Pt(t){if(!(E||!n.isFocused()||t.defaultPrevented||t.isComposing)){if(B){if(t.key==="Escape"){t.preventDefault(),t.stopPropagation(),h=null,g=null,n.clearSelection(),Y(!1);return}if(t.key==="Enter"||(t.ctrlKey||t.metaKey)&&t.code==="KeyC"){t.preventDefault(),t.stopPropagation(),$(n.getScreenText()).then(Q),Y(!1);return}}if(t.altKey&&t.code==="KeyC"&&!t.ctrlKey&&!t.metaKey){if(t.preventDefault(),t.stopPropagation(),h&&g){const e=n.getCellsText(h.col,h.row,g.col,g.row);h=null,g=null,n.clearSelection(),Y(!1),e&&(T.textContent="Copied",$(e).then(Q))}else{const e=n.getSelection();e?(n.clearSelection(),T.textContent="Copied",$(e).then(Q)):ft()}return}if((t.ctrlKey||t.metaKey)&&t.code==="KeyV"){t.preventDefault(),t.stopPropagation(),(async()=>{try{if(navigator.clipboard?.read){const e=await navigator.clipboard.read();for(const i of e)for(const u of i.types)if(lt(u)){const c=await i.getType(u);await nt(c);return}}}catch{}try{const e=await navigator.clipboard?.readText();e&&n.pasteText(dt(e))}catch{}})();return}}}let Z=0;function dt(t){return t.split(`\r
|
|
6
6
|
`).join(`
|
|
7
7
|
`).split(`
|
|
8
|
-
`).join("\r")}async function kt(t){const e=Ct(t.clipboardData);if(e){t.preventDefault(),t.stopPropagation();const c=Date.now();if(c-Z<50)return;Z=c,await nt(e);return}const i=t.clipboardData?.getData("text/plain");if(!i)return;t.preventDefault(),t.stopPropagation();const u=Date.now();u-Z<50||(Z=u,n.pasteText(dt(i)))}let O=0;function It(t){t.preventDefault(),O++,ct(t.dataTransfer)&&a.classList.add("terminal-drag-over")}function Yt(t){t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect="copy")}function Ft(t){t.preventDefault(),O--,O<=0&&(O=0,a.classList.remove("terminal-drag-over"))}async function At(t){t.preventDefault(),O=0,a.classList.remove("terminal-drag-over");const e=ct(t.dataTransfer);e&&await nt(e)}function mt(t){!Tt||t.key!=="Escape"||B||t.defaultPrevented||t.repeat||t.metaKey||t.ctrlKey||t.altKey||n.isFocused()&&(t.preventDefault(),t.stopPropagation(),I("\x1B"))}a.addEventListener("paste",kt),a.addEventListener("dragenter",It),a.addEventListener("dragover",Yt),a.addEventListener("dragleave",Ft),a.addEventListener("drop",At),document.addEventListener("keydown",mt,!0);function zt(t){if(t.touches.length!==1){s=null;return}const e=t.touches[0];if(!e)return;C();const i=a.getBoundingClientRect(),u=e.clientX-i.left<i.width*.4?"tui":"history",c=e.clientY-i.top<i.height*.5;s={startX:e.clientX,startY:e.clientY,lastX:e.clientX,lastY:e.clientY,lastT:performance.now(),velocity:0,scrolling:!1,zone:u,tuiUp:c,sent:!1},t.stopPropagation()}function Bt(t){if(!s||t.touches.length!==1)return;const e=t.touches[0];if(!e)return;const i=e.clientY-s.startY,u=e.clientX-s.startX;if(!s.scrolling){if(Math.abs(i)<8||Math.abs(i)<Math.abs(u))return;s.scrolling=!0,j=Date.now()+500}t.preventDefault(),t.stopPropagation();const c=performance.now(),b=e.clientY-s.lastY;if(s.zone==="tui"){s.sent||(s.sent=!0,I(s.tuiUp?"\x1B[5~":"\x1B[6~"),F(s.tuiUp)),s.lastX=e.clientX,s.lastY=e.clientY,s.lastT=c;return}const v=c-s.lastT;v>0&&(s.velocity=b/v),Ot(-b),s.lastX=e.clientX,s.lastY=e.clientY,s.lastT=c}function Kt(t){if(!s)return;const e=s.scrolling,i=s.zone,u=s.tuiUp,c=s.velocity;if(s=null,t.stopPropagation(),i==="tui"){e||(I(u?"\x1B[5~":"\x1B[6~"),F(u),j=Date.now()+500,t.preventDefault())
|
|
8
|
+
`).join("\r")}async function kt(t){const e=Ct(t.clipboardData);if(e){t.preventDefault(),t.stopPropagation();const c=Date.now();if(c-Z<50)return;Z=c,await nt(e);return}const i=t.clipboardData?.getData("text/plain");if(!i)return;t.preventDefault(),t.stopPropagation();const u=Date.now();u-Z<50||(Z=u,n.pasteText(dt(i)))}let O=0;function It(t){t.preventDefault(),O++,ct(t.dataTransfer)&&a.classList.add("terminal-drag-over")}function Yt(t){t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect="copy")}function Ft(t){t.preventDefault(),O--,O<=0&&(O=0,a.classList.remove("terminal-drag-over"))}async function At(t){t.preventDefault(),O=0,a.classList.remove("terminal-drag-over");const e=ct(t.dataTransfer);e&&await nt(e)}function mt(t){!Tt||t.key!=="Escape"||B||t.defaultPrevented||t.repeat||t.metaKey||t.ctrlKey||t.altKey||n.isFocused()&&(t.preventDefault(),t.stopPropagation(),I("\x1B"))}a.addEventListener("paste",kt),a.addEventListener("dragenter",It),a.addEventListener("dragover",Yt),a.addEventListener("dragleave",Ft),a.addEventListener("drop",At),document.addEventListener("keydown",mt,!0);function zt(t){if(t.touches.length!==1){s=null;return}const e=t.touches[0];if(!e)return;C();const i=a.getBoundingClientRect(),u=e.clientX-i.left<i.width*.4?"tui":"history",c=e.clientY-i.top<i.height*.5;s={startX:e.clientX,startY:e.clientY,lastX:e.clientX,lastY:e.clientY,lastT:performance.now(),velocity:0,scrolling:!1,zone:u,tuiUp:c,sent:!1},t.stopPropagation()}function Bt(t){if(!s||t.touches.length!==1)return;const e=t.touches[0];if(!e)return;const i=e.clientY-s.startY,u=e.clientX-s.startX;if(!s.scrolling){if(Math.abs(i)<8||Math.abs(i)<Math.abs(u))return;s.scrolling=!0,j=Date.now()+500}t.preventDefault(),t.stopPropagation();const c=performance.now(),b=e.clientY-s.lastY;if(s.zone==="tui"){s.sent||(s.sent=!0,I(s.tuiUp?"\x1B[5~":"\x1B[6~"),F(s.tuiUp)),s.lastX=e.clientX,s.lastY=e.clientY,s.lastT=c;return}const v=c-s.lastT;v>0&&(s.velocity=b/v),Ot(-b),s.lastX=e.clientX,s.lastY=e.clientY,s.lastT=c}function Kt(t){if(!s)return;const e=s.scrolling,i=s.zone,u=s.tuiUp,c=s.velocity;if(s=null,t.stopPropagation(),i==="tui"){e||(I(u?"\x1B[5~":"\x1B[6~"),F(u),j=Date.now()+500,t.preventDefault());return}if(!e){n.focus();return}j=Date.now()+500,t.preventDefault(),c&>(c)}function Ut(t){s=null,C(),t.stopPropagation()}function Xt(t){t.pointerType==="touch"&&Date.now()<j&&(t.preventDefault(),t.stopPropagation())}function Ot(t){const e=a.querySelector(".xterm-rows > div"),i=e?e.getBoundingClientRect().height:16;let u=i>0?Math.round(t/i):t>0?1:-1;u===0&&(u=t>0?1:-1),n.scrollLines(u)}a.addEventListener("touchstart",zt,{passive:!0,capture:!0}),a.addEventListener("touchmove",Bt,{passive:!1,capture:!0}),a.addEventListener("touchend",Kt,{passive:!1,capture:!0}),a.addEventListener("touchcancel",Ut,{passive:!0,capture:!0}),a.addEventListener("pointerup",Xt,!0);function pt(){y()}window.addEventListener("resize",pt),window.visualViewport?.addEventListener("resize",y),window.visualViewport?.addEventListener("scroll",y);const ht=new ResizeObserver(()=>y());ht.observe(a),document.fonts?.ready.then(()=>{y(),setTimeout(y,50),setTimeout(y,200)}),a.addEventListener("focusin",Mt,!0);async function Rt(){if(document.fonts?.ready)try{await Promise.race([document.fonts.ready,new Promise(t=>setTimeout(t,1e3))])}catch{}}return requestAnimationFrame(()=>{D()&&G(),(async()=>(await Rt(),D()&&S({type:"resize",cols:n.cols,rows:n.rows}),at(),y()))()}),{destroy(){if(E=!0,C(),Y(!1),X&&clearTimeout(X),document.removeEventListener("mousemove",ot,!0),document.removeEventListener("mouseup",it,!0),l){try{l.close(1e3,"session switch")}catch{}l=void 0}a.innerHTML="",a.classList.remove("terminal-pending"),window.removeEventListener("resize",pt),ht.disconnect(),document.removeEventListener("keydown",mt,!0)},focus(){n.focus()},sendInput(t){I(t)},toggleCopyMode(){ft()}}})()}export{qt as initTerminal,rt as stripAltScreenSequences};
|