fix: 修复安全漏洞与逻辑缺陷并更新前端构建产物 (#24)
追加一次安全更新: - 主要修复由Copilot提出的问题点 Co-authored-by: TanXin <tanxin@example.com>
This commit is contained in:
1 parent
918bd69fbb
commit
dc6fba5ce2
7 files changed
+347
-316
No files matched your search
@@ -14,15 +14,15 @@ marked.use({
|
||||
return `${safeLang}<pre class="agent-md-pre"><code>${escapeHtml(text)}</code></pre>`;
|
||||
},
|
||||
codespan({ text }: Tokens.Codespan) {
|
||||
return `<code class="agent-md-inline-code">${text}</code>`;
|
||||
return `<code class="agent-md-inline-code">${escapeHtml(text)}</code>`;
|
||||
},
|
||||
link({ href, title, text }: Tokens.Link) {
|
||||
const titleAttr = title ? ` title="${escapeHtml(title)}"` : '';
|
||||
return `<a href="${href}"${titleAttr} target="_blank" rel="noopener noreferrer" class="agent-md-link">${text}</a>`;
|
||||
return `<a href="${escapeHtml(href)}"${titleAttr} target="_blank" rel="noopener noreferrer" class="agent-md-link">${text}</a>`;
|
||||
},
|
||||
image({ href, title, text }: Tokens.Image) {
|
||||
const titleAttr = title ? ` title="${escapeHtml(title)}"` : '';
|
||||
return `<img src="${href}"${titleAttr} alt="${escapeHtml(text)}" class="agent-md-img" loading="lazy">`;
|
||||
return `<img src="${escapeHtml(href)}"${titleAttr} alt="${escapeHtml(text)}" class="agent-md-img" loading="lazy">`;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -138,7 +138,12 @@ export class AIConfigPanel {
|
||||
|
||||
const models: Array<{ id: string }> = data.models || [];
|
||||
if (modelListEl) {
|
||||
modelListEl.innerHTML = models.map(m => `<option value="${m.id}">`).join('');
|
||||
modelListEl.innerHTML = '';
|
||||
for (const m of models) {
|
||||
const option = document.createElement('option');
|
||||
option.value = m.id;
|
||||
modelListEl.appendChild(option);
|
||||
}
|
||||
}
|
||||
this.showFetchStatus(`获取到 ${models.length} 个模型`, false);
|
||||
} catch (e) {
|
||||
|
||||
@@ -11,8 +11,8 @@ const htmlTsFile = path.join(workerDir, 'html.ts');
|
||||
console.log('Building frontend...');
|
||||
try {
|
||||
// 1. Install and build frontend
|
||||
execSync('pnpm install', { cwd: frontendDir, stdio: 'inherit' });
|
||||
execSync('pnpm run build', { cwd: frontendDir, stdio: 'inherit' });
|
||||
execSync('npx pnpm install', { cwd: frontendDir, stdio: 'inherit' });
|
||||
execSync('npx pnpm run build', { cwd: frontendDir, stdio: 'inherit' });
|
||||
|
||||
console.log('Inlining assets...');
|
||||
// 2. Read dist/index.html
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// Directly blocked — never executed regardless of user intent
|
||||
const BLOCKED_PATTERNS: Array<{ pattern: RegExp; label: string }> = [
|
||||
// rm -rf / or rm -rf // — match after normalization to prevent bypass via variable expansion
|
||||
{ pattern: /\brm\s+(-[a-z]*\s+)*\/\s*($|[^\/])/, label: '删除根目录' },
|
||||
{ pattern: /\brm\s+(-[a-z]*\s+)*\/\s*($|\s)/, label: '删除根目录' },
|
||||
{ pattern: /\brm\s+(-[a-z]*\s+)*\/\/\s*($|\s)/, label: '删除根目录' },
|
||||
// rm with path variables that could resolve to root
|
||||
{ pattern: /\brm\s+(-[a-z]*\s+)*(~\/\.\.|\/\.\.)\//, label: '删除根目录(路径遍历)' },
|
||||
|
||||
+305
-305
@@ -1,46 +1,46 @@
|
||||
// Automatically generated by scripts/build-html.js. Do not edit directly.
|
||||
export const HTML = `<!DOCTYPE html>
|
||||
<html class="dark" lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzEzMTMxMyIvPgogIDxyZWN0IHg9IjIiIHk9IjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgcng9IjMiIGZpbGw9IiMxYTFhMWEiIHN0cm9rZT0iIzRhZjYyNiIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgPHBhdGggZD0iTTggMTFMMTQgMTZMOCAyMSIgc3Ryb2tlPSIjNGFmNjI2IiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJub25lIi8+CiAgPGxpbmUgeDE9IjE2IiB5MT0iMjEiIHgyPSIyNCIgeTI9IjIxIiBzdHJva2U9IiM0YWY2MjYiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+" />
|
||||
<title>CloudSSH</title>
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet">
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
"background": "var(--bg)",
|
||||
"elevated": "var(--bg-elevated)",
|
||||
"on-surface": "var(--on-surface)",
|
||||
"on-surface-variant": "var(--on-surface-variant)",
|
||||
"outline-variant": "var(--border-strong)",
|
||||
"primary-container": "var(--accent)",
|
||||
"on-primary-fixed": "var(--on-accent)",
|
||||
"surface": "var(--bg-surface)",
|
||||
"surface-variant": "var(--surface-dot)",
|
||||
"secondary-container": "var(--accent-secondary)",
|
||||
"secondary-fixed": "var(--accent-secondary-light)",
|
||||
"error": "var(--error)",
|
||||
"error-container": "var(--error-bg)",
|
||||
"surface-container-lowest": "var(--bg-terminal)"
|
||||
},
|
||||
fontFamily: {
|
||||
"body": ["JetBrains Mono"],
|
||||
"headline": ["JetBrains Mono"],
|
||||
"label": ["JetBrains Mono"],
|
||||
"code": ["JetBrains Mono"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
||||
export const HTML = `<!DOCTYPE html>
|
||||
<html class="dark" lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+DQogIDxyZWN0IHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgcng9IjQiIGZpbGw9IiMxMzEzMTMiLz4NCiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiByeD0iMyIgZmlsbD0iIzFhMWExYSIgc3Ryb2tlPSIjNGFmNjI2IiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgPHBhdGggZD0iTTggMTFMMTQgMTZMOCAyMSIgc3Ryb2tlPSIjNGFmNjI2IiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJub25lIi8+DQogIDxsaW5lIHgxPSIxNiIgeTE9IjIxIiB4Mj0iMjQiIHkyPSIyMSIgc3Ryb2tlPSIjNGFmNjI2IiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+DQo8L3N2Zz4=" />
|
||||
<title>CloudSSH</title>
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet">
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
"background": "var(--bg)",
|
||||
"elevated": "var(--bg-elevated)",
|
||||
"on-surface": "var(--on-surface)",
|
||||
"on-surface-variant": "var(--on-surface-variant)",
|
||||
"outline-variant": "var(--border-strong)",
|
||||
"primary-container": "var(--accent)",
|
||||
"on-primary-fixed": "var(--on-accent)",
|
||||
"surface": "var(--bg-surface)",
|
||||
"surface-variant": "var(--surface-dot)",
|
||||
"secondary-container": "var(--accent-secondary)",
|
||||
"secondary-fixed": "var(--accent-secondary-light)",
|
||||
"error": "var(--error)",
|
||||
"error-container": "var(--error-bg)",
|
||||
"surface-container-lowest": "var(--bg-terminal)"
|
||||
},
|
||||
fontFamily: {
|
||||
"body": ["JetBrains Mono"],
|
||||
"headline": ["JetBrains Mono"],
|
||||
"label": ["JetBrains Mono"],
|
||||
"code": ["JetBrains Mono"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
||||
<script type="module">var dp=Object.defineProperty;var up=(i,e,t)=>e in i?dp(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var R=(i,e,t)=>up(i,typeof e!="symbol"?e+"":e,t);const fp=function(){const e=typeof document<"u"&&document.createElement("link").relList;return e&&e.supports&&e.supports("modulepreload")?"modulepreload":"preload"}(),_p=function(i){return"/"+i},zh={},Oa=function(e,t,s){let r=Promise.resolve();if(t&&t.length>0){let o=function(l){return Promise.all(l.map(c=>Promise.resolve(c).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),h=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));r=o(t.map(l=>{if(l=_p(l),l in zh)return;zh[l]=!0;const c=l.endsWith(".css"),d=c?'[rel="stylesheet"]':"";if(document.querySelector(\`link[href="\${l}"]\${d}\`))return;const u=document.createElement("link");if(u.rel=c?"stylesheet":fp,c||(u.as="script"),u.crossOrigin="",u.href=l,h&&u.setAttribute("nonce",h),document.head.appendChild(u),c)return new Promise((f,_)=>{u.addEventListener("load",f),u.addEventListener("error",()=>_(new Error(\`Unable to preload CSS for \${l}\`)))})}))}function n(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return r.then(o=>{for(const a of o||[])a.status==="rejected"&&n(a.reason);return e().catch(n)})};/**
|
||||
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
@@ -52,21 +52,21 @@ export const HTML = `<!DOCTYPE html>
|
||||
* Fabrice Bellard's javascript vt100 for jslinux:
|
||||
* http://bellard.org/jslinux/
|
||||
* Copyright (c) 2011 Fabrice Bellard
|
||||
*/var Tu=Object.defineProperty,pp=Object.getOwnPropertyDescriptor,gp=(i,e)=>{for(var t in e)Tu(i,t,{get:e[t],enumerable:!0})},Le=(i,e,t,s)=>{for(var r=s>1?void 0:s?pp(e,t):e,n=i.length-1,o;n>=0;n--)(o=i[n])&&(r=(s?o(e,t,r):o(r))||r);return s&&r&&Tu(e,t,r),r},U=(i,e)=>(t,s)=>e(t,s,i),Fh="Terminal input",za={get:()=>Fh,set:i=>Fh=i},Nh="Too much output to announce, navigate to rows manually to read",Fa={get:()=>Nh,set:i=>Nh=i};function mp(i){return i.replace(/\\r?\\n/g,"\\r")}function vp(i,e){return e?"\\x1B[200~"+i+"\\x1B[201~":i}function wp(i,e){i.clipboardData&&i.clipboardData.setData("text/plain",e.selectionText),i.preventDefault()}function bp(i,e,t,s){if(i.stopPropagation(),i.clipboardData){let r=i.clipboardData.getData("text/plain");Au(r,e,t,s)}}function Au(i,e,t,s){i=mp(i),i=vp(i,t.decPrivateModes.bracketedPasteMode&&s.rawOptions.ignoreBracketedPasteMode!==!0),t.triggerDataEvent(i,!0),e.value=""}function Ru(i,e,t){let s=t.getBoundingClientRect(),r=i.clientX-s.left-10,n=i.clientY-s.top-10;e.style.width="20px",e.style.height="20px",e.style.left=\`\${r}px\`,e.style.top=\`\${n}px\`,e.style.zIndex="1000",e.focus()}function Wh(i,e,t,s,r){Ru(i,e,t),r&&s.rightClickSelect(i),e.value=s.selectionText,e.select()}function Fi(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}function co(i,e=0,t=i.length){let s="";for(let r=e;r<t;++r){let n=i[r];n>65535?(n-=65536,s+=String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):s+=String.fromCharCode(n)}return s}var yp=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let s=e.length;if(!s)return 0;let r=0,n=0;if(this._interim){let o=e.charCodeAt(n++);56320<=o&&o<=57343?t[r++]=(this._interim-55296)*1024+o-56320+65536:(t[r++]=this._interim,t[r++]=o),this._interim=0}for(let o=n;o<s;++o){let a=e.charCodeAt(o);if(55296<=a&&a<=56319){if(++o>=s)return this._interim=a,r;let h=e.charCodeAt(o);56320<=h&&h<=57343?t[r++]=(a-55296)*1024+h-56320+65536:(t[r++]=a,t[r++]=h);continue}a!==65279&&(t[r++]=a)}return r}},Sp=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let s=e.length;if(!s)return 0;let r=0,n,o,a,h,l=0,c=0;if(this.interim[0]){let f=!1,_=this.interim[0];_&=(_&224)===192?31:(_&240)===224?15:7;let w=0,v;for(;(v=this.interim[++w]&63)&&w<4;)_<<=6,_|=v;let T=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,M=T-w;for(;c<M;){if(c>=s)return 0;if(v=e[c++],(v&192)!==128){c--,f=!0;break}else this.interim[w++]=v,_<<=6,_|=v&63}f||(T===2?_<128?c--:t[r++]=_:T===3?_<2048||_>=55296&&_<=57343||_===65279||(t[r++]=_):_<65536||_>1114111||(t[r++]=_)),this.interim.fill(0)}let d=s-4,u=c;for(;u<s;){for(;u<d&&!((n=e[u])&128)&&!((o=e[u+1])&128)&&!((a=e[u+2])&128)&&!((h=e[u+3])&128);)t[r++]=n,t[r++]=o,t[r++]=a,t[r++]=h,u+=4;if(n=e[u++],n<128)t[r++]=n;else if((n&224)===192){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(l=(n&31)<<6|o&63,l<128){u--;continue}t[r++]=l}else if((n&240)===224){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,r;if(a=e[u++],(a&192)!==128){u--;continue}if(l=(n&15)<<12|(o&63)<<6|a&63,l<2048||l>=55296&&l<=57343||l===65279)continue;t[r++]=l}else if((n&248)===240){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,r;if(a=e[u++],(a&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,this.interim[2]=a,r;if(h=e[u++],(h&192)!==128){u--;continue}if(l=(n&7)<<18|(o&63)<<12|(a&63)<<6|h&63,l<65536||l>1114111)continue;t[r++]=l}}return r}},Mu="",Hi=" ",Qr=class Bu{constructor(){this.fg=0,this.bg=0,this.extended=new Vn}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new Bu;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&1677
Line truncated
|
||||
*/var Tu=Object.defineProperty,pp=Object.getOwnPropertyDescriptor,gp=(i,e)=>{for(var t in e)Tu(i,t,{get:e[t],enumerable:!0})},Le=(i,e,t,s)=>{for(var r=s>1?void 0:s?pp(e,t):e,n=i.length-1,o;n>=0;n--)(o=i[n])&&(r=(s?o(e,t,r):o(r))||r);return s&&r&&Tu(e,t,r),r},U=(i,e)=>(t,s)=>e(t,s,i),Fh="Terminal input",za={get:()=>Fh,set:i=>Fh=i},Nh="Too much output to announce, navigate to rows manually to read",Fa={get:()=>Nh,set:i=>Nh=i};function mp(i){return i.replace(/\\r?\\n/g,"\\r")}function vp(i,e){return e?"\\x1B[200~"+i+"\\x1B[201~":i}function wp(i,e){i.clipboardData&&i.clipboardData.setData("text/plain",e.selectionText),i.preventDefault()}function bp(i,e,t,s){if(i.stopPropagation(),i.clipboardData){let r=i.clipboardData.getData("text/plain");Au(r,e,t,s)}}function Au(i,e,t,s){i=mp(i),i=vp(i,t.decPrivateModes.bracketedPasteMode&&s.rawOptions.ignoreBracketedPasteMode!==!0),t.triggerDataEvent(i,!0),e.value=""}function Ru(i,e,t){let s=t.getBoundingClientRect(),r=i.clientX-s.left-10,n=i.clientY-s.top-10;e.style.width="20px",e.style.height="20px",e.style.left=\`\${r}px\`,e.style.top=\`\${n}px\`,e.style.zIndex="1000",e.focus()}function Wh(i,e,t,s,r){Ru(i,e,t),r&&s.rightClickSelect(i),e.value=s.selectionText,e.select()}function Fi(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}function co(i,e=0,t=i.length){let s="";for(let r=e;r<t;++r){let n=i[r];n>65535?(n-=65536,s+=String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):s+=String.fromCharCode(n)}return s}var yp=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let s=e.length;if(!s)return 0;let r=0,n=0;if(this._interim){let o=e.charCodeAt(n++);56320<=o&&o<=57343?t[r++]=(this._interim-55296)*1024+o-56320+65536:(t[r++]=this._interim,t[r++]=o),this._interim=0}for(let o=n;o<s;++o){let a=e.charCodeAt(o);if(55296<=a&&a<=56319){if(++o>=s)return this._interim=a,r;let h=e.charCodeAt(o);56320<=h&&h<=57343?t[r++]=(a-55296)*1024+h-56320+65536:(t[r++]=a,t[r++]=h);continue}a!==65279&&(t[r++]=a)}return r}},Sp=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let s=e.length;if(!s)return 0;let r=0,n,o,a,h,l=0,c=0;if(this.interim[0]){let f=!1,_=this.interim[0];_&=(_&224)===192?31:(_&240)===224?15:7;let w=0,v;for(;(v=this.interim[++w]&63)&&w<4;)_<<=6,_|=v;let L=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,M=L-w;for(;c<M;){if(c>=s)return 0;if(v=e[c++],(v&192)!==128){c--,f=!0;break}else this.interim[w++]=v,_<<=6,_|=v&63}f||(L===2?_<128?c--:t[r++]=_:L===3?_<2048||_>=55296&&_<=57343||_===65279||(t[r++]=_):_<65536||_>1114111||(t[r++]=_)),this.interim.fill(0)}let d=s-4,u=c;for(;u<s;){for(;u<d&&!((n=e[u])&128)&&!((o=e[u+1])&128)&&!((a=e[u+2])&128)&&!((h=e[u+3])&128);)t[r++]=n,t[r++]=o,t[r++]=a,t[r++]=h,u+=4;if(n=e[u++],n<128)t[r++]=n;else if((n&224)===192){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(l=(n&31)<<6|o&63,l<128){u--;continue}t[r++]=l}else if((n&240)===224){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,r;if(a=e[u++],(a&192)!==128){u--;continue}if(l=(n&15)<<12|(o&63)<<6|a&63,l<2048||l>=55296&&l<=57343||l===65279)continue;t[r++]=l}else if((n&248)===240){if(u>=s)return this.interim[0]=n,r;if(o=e[u++],(o&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,r;if(a=e[u++],(a&192)!==128){u--;continue}if(u>=s)return this.interim[0]=n,this.interim[1]=o,this.interim[2]=a,r;if(h=e[u++],(h&192)!==128){u--;continue}if(l=(n&7)<<18|(o&63)<<12|(a&63)<<6|h&63,l<65536||l>1114111)continue;t[r++]=l}}return r}},Mu="",Hi=" ",Qr=class Bu{constructor(){this.fg=0,this.bg=0,this.extended=new Vn}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new Bu;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&1677
Line truncated
|
||||
|
||||
WARNING: This link could potentially be dangerous\`)){let t=window.open();if(t){try{t.opener=null}catch{}t.location.href=e}else console.warn("Opening link blocked as opener could not be cleared")}}var uo=Je("CharSizeService"),Ei=Je("CoreBrowserService"),jl=Je("MouseService"),Li=Je("RenderService"),Tp=Je("SelectionService"),zu=Je("CharacterJoinerService"),Ks=Je("ThemeService"),Fu=Je("LinkProviderService"),Ap=class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Uh.isErrorNoTelemetry(e)?new Uh(e.message+\`
|
||||
|
||||
\`+e.stack):new Error(e.message+\`
|
||||
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},Rp=new Ap;function In(i){Mp(i)||Rp.onUnexpectedError(i)}var Ha="Canceled";function Mp(i){return i instanceof Bp?!0:i instanceof Error&&i.name===Ha&&i.message===Ha}var Bp=class extends Error{constructor(){super(Ha),this.name=this.message}};function Dp(i){return new Error(\`Illegal argument: \${i}\`)}var Uh=class Ua extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Ua)return e;let t=new Ua;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},qa=class Nu extends Error{constructor(e){super(e||"An unexpected bug occurred."),Object.setPrototypeOf(this,Nu.prototype)}};function kt(i,e=0){return i[i.length-(1+e)]}var Pp;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(Pp||(Pp={}));function Ip(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var Wu;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*T(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=T;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function L(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=L})(Wu||(Wu={}));function ps(i){if(Wu.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function $p(...i){return we(()=>ps(i))}function we(i){return{dispose:Ip(()=>{i()})}}var Hu=class Uu{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{ps(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Uu.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Hu.DISABLE_DISPOSED_WARNING=!1;var Ui=Hu,Q=class{constructor(){this._store=new Ui,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Q.None=Object.freeze({dispose(){}});var js=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},Ci=typeof window=="object"?window:globalThis,ja=class Ka{constructor(e){this.element=e,this.next=Ka.Undefined,this.prev=Ka.Undefined}};ja.Undefined=new ja(void 0);var be=ja,qh=class{constructor(){this._first=be.Undefined,this._last=be.Undefined,thi
Line truncated
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},Rp=new Ap;function In(i){Mp(i)||Rp.onUnexpectedError(i)}var Ha="Canceled";function Mp(i){return i instanceof Bp?!0:i instanceof Error&&i.name===Ha&&i.message===Ha}var Bp=class extends Error{constructor(){super(Ha),this.name=this.message}};function Dp(i){return new Error(\`Illegal argument: \${i}\`)}var Uh=class Ua extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Ua)return e;let t=new Ua;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},qa=class Nu extends Error{constructor(e){super(e||"An unexpected bug occurred."),Object.setPrototypeOf(this,Nu.prototype)}};function kt(i,e=0){return i[i.length-(1+e)]}var Pp;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(Pp||(Pp={}));function Ip(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var Wu;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*L(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=L;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function T(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=T})(Wu||(Wu={}));function ps(i){if(Wu.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function $p(...i){return we(()=>ps(i))}function we(i){return{dispose:Ip(()=>{i()})}}var Hu=class Uu{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{ps(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Uu.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Hu.DISABLE_DISPOSED_WARNING=!1;var Ui=Hu,Q=class{constructor(){this._store=new Ui,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Q.None=Object.freeze({dispose(){}});var js=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},Ci=typeof window=="object"?window:globalThis,ja=class Ka{constructor(e){this.element=e,this.next=Ka.Undefined,this.prev=Ka.Undefined}};ja.Undefined=new ja(void 0);var be=ja,qh=class{constructor(){this._first=be.Undefined,this._last=be.Undefined,thi
Line truncated
|
||||
\`).slice(2).join(\`
|
||||
\`))}},Up=class extends Error{constructor(i,e){super(i),this.name="ListenerLeakError",this.stack=e}},qp=class extends Error{constructor(i,e){super(i),this.name="ListenerRefusalError",this.stack=e}},jp=0,Fo=class{constructor(e){this.value=e,this.id=jp++}},Kp=2,Vp,z=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new Wp((e==null?void 0:e.onListenerError)??In,((s=this._options)==null?void 0:s.leakWarningThreshold)??Np):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new Fp(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new qp(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||In)(_),Q.None}if(this._disposed)return Q.None;t&&(e=e.bind(t));let r=new Fo(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=Hp.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof Fo?(this._deliveryQueue??(this._deliveryQueue=new Gp),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=we(()=>{n==null||n(),this._removeListener(r)});return s instanceof Ui?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*Kp<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||In;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof Fo)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},Gp=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},Ya=class{constructor(){this.mapWindowIdToZoomLevel=new Map,this._onDidChangeZoomLevel=new z,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this.mapWindowIdToZoomFactor=new Map,this._onDidChangeFullscreen=new z,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this.mapWindowIdToFullScreen=new Map}getZoomLevel(e){return this.mapWindowIdToZoomLevel.get(this.getWindowId(e))??0}setZoomLevel(e,t){if(this.getZoomLevel(t)===e)return;let s=this.getWindowId(t);this.mapWindowIdToZoomLevel.set(s,e),this._onDidChangeZoomLevel.fire(s)}getZoomFactor(e){return this.mapWindowIdToZoomFactor.get(this.getWindowId(e))??1}setZoomFactor(e,t){this.mapWindowIdToZoomFactor.set(this.getWindowId(t),e)}setFullscreen(e,t){if(this.isFullscreen(t)===e)return;let s=this.getWindowId(t);this.mapWindowIdToFullScreen.set(s,e),this._onDidChangeFullscreen.fire(s)}isFullscreen(e){return!!this.mapWindowIdToFullScreen.get(this.getWindowId(e))}getWindowId(e){return e.vscodeWindowId}};Ya.INSTANCE=new Ya;var Kl=Ya;function Yp(i,e,t){typeof e=="string"&&(e=i.matchMedia(e)),e.addEventListener("change",t)}Kl.INSTANCE.onDidChangeZoomLevel;function Zp(i){return Kl.INSTANCE.getZoomFactor(i)}Kl.INSTA
Line truncated
|
||||
\`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._scrollableElement.onScroll(c=>this._handleScroll(c)))}scrollLines(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){var e;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,verticalScrollbarSize:((e=this._optionsService.rawOptions.overviewRuler)==null?void 0:e.width)||14}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){!this._renderService||this._isSyncing||(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1)}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),s=t-this._bufferService.buffer.ydisp;s!==0&&(this._latestYDisp=t,this._onRequestScrollLines.fire(s)),this._isHandlingScroll=!1}};sl=Le([U(2,vt),U(3,Ei),U(4,Iu),U(5,Ks),U(6,wt),U(7,Li)],sl);var rl=class extends Q{constructor(e,t,s,r,n){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=s,this._decorationService=r,this._renderService=n,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this._register(this._renderService.onRenderedViewportChange(()=>this._doRefreshDecorations())),this._register(this._renderService.onDimensionsChange(()=>{this._dimensionsChanged=!0,this._queueRefresh()})),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt})),this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh())),this._register(this._decorationService.onDecorationRemoved(o=>this._removeDecoration(o))),this._register(we(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){var r;let t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer",((r=e==null?void 0:e.options)==null?void 0:r.layer)==="top"),t.style.width=\`\${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px\`,t.style.height=\`\${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px\`,t.style.top=\`\${(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height}px\`,t.style.lineHeight=\`\${this._renderService.dimensions.css.cell.height}px\`;let s=e.options.x??0;return s&&s>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){let t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let s=this._decorationElements.get(e);s||(s=this._createElement(e),e.element=s,this._decorationElements.set(e,s),this._container.appendChild(s),e.onDispose(()=>{this._decorationElements.delete(e),s.remove()})),s.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(s.style.width=\`\${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px\`,s.style.height=\`\${(e.options.height||1)*thiLine truncated
|
||||
\`,i.VT="\\v",i.FF="\\f",i.CR="\\r",i.SO="",i.SI="",i.DLE="",i.DC1="",i.DC2="",i.DC3="",i.DC4="",i.NAK="",i.SYN="",i.ETB="",i.CAN="",i.EM="",i.SUB="",i.ESC="\\x1B",i.FS="",i.GS="",i.RS="",i.US="",i.SP=" ",i.DEL=""))(P||(P={}));var zn;(i=>(i.PAD="",i.HOP="",i.BPH="",i.NBH="",i.IND="",i.NEL="
",i.SSA="",i.ESA="",i.HTS="",i.HTJ="",i.VTS="",i.PLD="",i.PLU="",i.RI="",i.SS2="",i.SS3="",i.DCS="",i.PU1="",i.PU2="",i.STS="",i.CCH="",i.MW="",i.SPA="",i.EPA="",i.SOS="",i.SGCI="",i.SCI="",i.CSI="",i.ST="",i.OSC="",i.PM="",i.APC=""))(zn||(zn={}));var sf;(i=>i.ST=\`\${P.ESC}\\\\\`)(sf||(sf={}));var nl=class{constructor(e,t,s,r,n,o){this._textarea=e,this._compositionView=t,this._bufferService=s,this._optionsService=r,this._coreService=n,this._renderService=o,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}get isComposing(){return this._isComposing}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout(()=>{this._compositionPosition.end=this._textarea.value.length},0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(e.keyCode===20||e.keyCode===229||e.keyCode===16||e.keyCode===17||e.keyCode===18)return!1;this._finalizeComposition(!1)}return e.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){let t={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){this._isSendingComposition=!1;let s;t.start+=this._dataAlreadySent.length,this._isComposing?s=this._textarea.value.substring(t.start,this._compositionPosition.start):s=this._textarea.value.substring(t.start),s.length>0&&this._coreService.triggerDataEvent(s,!0)}},0)}else{this._isSendingComposition=!1;let t=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(t,!0)}}_handleAnyTextareaChanges(){let e=this._textarea.value;setTimeout(()=>{if(!this._isComposing){let t=this._textarea.value,s=t.replace(e,"");this._dataAlreadySent=s,t.length>e.length?this._coreService.triggerDataEvent(s,!0):t.length<e.length?this._coreService.triggerDataEvent(\`\${P.DEL}\`,!0):t.length===e.length&&t!==e&&this._coreService.triggerDataEvent(t,!0)}},0)}updateCompositionElements(e){if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){let t=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),s=this._renderService.dimensions.css.cell.height,r=this._bufferService.buffer.y*this._renderService.dimensions.css.cell.height,n=t*this._renderService.dimensions.css.cell.width;this._compositionView.style.left=n+"px",this._compositionView.style.top=r+"px",this._compositionView.style.height=s+"px",this._compositionView.style.lineHeight=s+"px",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+"px";let o=this._compositionView.getBoundingClientRect();this._textarea.style.left=n+"px",this._textarea.style.top=r+"px",this._textarea.style.width=Math.max(o.width,1)+"px",this._textarea.style.height=Math.max(o.height,1)+"px",this._textarea.style.lineHeight=o.height+"px"}e||setTimeout(()=>this.updateCompositionElements(!0),0)}}};nl=Le([U(2,vt),U(3,wt),U(4,bs),U(5,Li)],nl);var Ke=0,Ve=0,Ge=0,ke=0,nc={css:"#00000000",rgba:0},De;(i=>{function e(r,n,o,a){return a!==void 0?\`#\${Xi(r)}\${Xi(n)}\${Xi(o)}\${Xi(a)}\`:\`#\${Xi(r)}\${Xi(n)}\${Xi(o)}\`}i.toCss=e;function t(r,n,o,a=255){return(r<<24|n<<16|o<<8|a)>>>0}i.toRgba=t;function s(r,n,o,a){return{css:i.toCss(r,n,o,a),rgba:i.toRgba(r,n,o,a)}}i.toColor=s})(De||(De={}));var ge;(i=>{function e(h,l){if(ke=(l.rgba&255)/255,ke===1)return{css:l.css,rgba:l.rgba};let c=l.rgba>>24&255,d=l.rgba>>16&255,u=l.rgba>>8&255,f=h.rgba>>24&255,_=h.rgba>>16&255,w=h.rgba>>8&255;Ke=f+Math.round((c-f)*ke),Ve=_+Math.round((d-_)*ke),Ge=w+Math.round((u-w)*ke);let v=De.toCss(Ke,Ve,Ge),T=De.toRgba(Ke,Ve,Ge);return{css:v,rgba:T}}i.blend=e;function t(h){return(h.rgba&255)===255}i.isOpaque=t;function s(h,l,c){let d=Fn.ensureContrastRatio(h.rgba,l.rgba,c);if(d)return De.toColor(d>>24&255,d>>16&255,d>>8&255)}i.ensureContrastRatio=s;function r(h){let l=(h.rgba|255)>>>0;return[Ke,Ve,Ge]=Fn.toChannels(l),{css:De.toCss(Ke,Ve,Ge),rgba:l}}i.opaque=r;function n(h,l){return ke=Math.round(l*255),[Ke,Ve,Ge]=Fn.toChannels(h.rgba),{css:De.toCss(Ke,Ve,Ge,ke),rgba:De.toRgba(Ke,Ve,Ge,ke)}}i.opacity=n;function o(h,l){return ke=h.rgba&255,n(h,ke*l/255)}i.multip
Line truncated
|
||||
\`))}},Up=class extends Error{constructor(i,e){super(i),this.name="ListenerLeakError",this.stack=e}},qp=class extends Error{constructor(i,e){super(i),this.name="ListenerRefusalError",this.stack=e}},jp=0,Fo=class{constructor(e){this.value=e,this.id=jp++}},Kp=2,Vp,z=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new Wp((e==null?void 0:e.onListenerError)??In,((s=this._options)==null?void 0:s.leakWarningThreshold)??Np):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new Fp(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new qp(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||In)(_),Q.None}if(this._disposed)return Q.None;t&&(e=e.bind(t));let r=new Fo(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=Hp.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof Fo?(this._deliveryQueue??(this._deliveryQueue=new Gp),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=we(()=>{n==null||n(),this._removeListener(r)});return s instanceof Ui?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*Kp<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||In;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof Fo)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},Gp=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},Ya=class{constructor(){this.mapWindowIdToZoomLevel=new Map,this._onDidChangeZoomLevel=new z,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this.mapWindowIdToZoomFactor=new Map,this._onDidChangeFullscreen=new z,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this.mapWindowIdToFullScreen=new Map}getZoomLevel(e){return this.mapWindowIdToZoomLevel.get(this.getWindowId(e))??0}setZoomLevel(e,t){if(this.getZoomLevel(t)===e)return;let s=this.getWindowId(t);this.mapWindowIdToZoomLevel.set(s,e),this._onDidChangeZoomLevel.fire(s)}getZoomFactor(e){return this.mapWindowIdToZoomFactor.get(this.getWindowId(e))??1}setZoomFactor(e,t){this.mapWindowIdToZoomFactor.set(this.getWindowId(t),e)}setFullscreen(e,t){if(this.isFullscreen(t)===e)return;let s=this.getWindowId(t);this.mapWindowIdToFullScreen.set(s,e),this._onDidChangeFullscreen.fire(s)}isFullscreen(e){return!!this.mapWindowIdToFullScreen.get(this.getWindowId(e))}getWindowId(e){return e.vscodeWindowId}};Ya.INSTANCE=new Ya;var Kl=Ya;function Yp(i,e,t){typeof e=="string"&&(e=i.matchMedia(e)),e.addEventListener("change",t)}Kl.INSTANCE.onDidChangeZoomLevel;function Zp(i){return Kl.INSTANCE.getZoomFactor(i)}Kl.INSTA
Line truncated
|
||||
\`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._scrollableElement.onScroll(c=>this._handleScroll(c)))}scrollLines(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){var e;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,verticalScrollbarSize:((e=this._optionsService.rawOptions.overviewRuler)==null?void 0:e.width)||14}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){!this._renderService||this._isSyncing||(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1)}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),s=t-this._bufferService.buffer.ydisp;s!==0&&(this._latestYDisp=t,this._onRequestScrollLines.fire(s)),this._isHandlingScroll=!1}};sl=Le([U(2,wt),U(3,Ei),U(4,Iu),U(5,Ks),U(6,bt),U(7,Li)],sl);var rl=class extends Q{constructor(e,t,s,r,n){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=s,this._decorationService=r,this._renderService=n,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this._register(this._renderService.onRenderedViewportChange(()=>this._doRefreshDecorations())),this._register(this._renderService.onDimensionsChange(()=>{this._dimensionsChanged=!0,this._queueRefresh()})),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt})),this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh())),this._register(this._decorationService.onDecorationRemoved(o=>this._removeDecoration(o))),this._register(we(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){var r;let t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer",((r=e==null?void 0:e.options)==null?void 0:r.layer)==="top"),t.style.width=\`\${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px\`,t.style.height=\`\${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px\`,t.style.top=\`\${(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height}px\`,t.style.lineHeight=\`\${this._renderService.dimensions.css.cell.height}px\`;let s=e.options.x??0;return s&&s>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){let t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let s=this._decorationElements.get(e);s||(s=this._createElement(e),e.element=s,this._decorationElements.set(e,s),this._container.appendChild(s),e.onDispose(()=>{this._decorationElements.delete(e),s.remove()})),s.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(s.style.width=\`\${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px\`,s.style.height=\`\${(e.options.height||1)*thiLine truncated
|
||||
\`,i.VT="\\v",i.FF="\\f",i.CR="\\r",i.SO="",i.SI="",i.DLE="",i.DC1="",i.DC2="",i.DC3="",i.DC4="",i.NAK="",i.SYN="",i.ETB="",i.CAN="",i.EM="",i.SUB="",i.ESC="\\x1B",i.FS="",i.GS="",i.RS="",i.US="",i.SP=" ",i.DEL=""))(P||(P={}));var zn;(i=>(i.PAD="",i.HOP="",i.BPH="",i.NBH="",i.IND="",i.NEL="
",i.SSA="",i.ESA="",i.HTS="",i.HTJ="",i.VTS="",i.PLD="",i.PLU="",i.RI="",i.SS2="",i.SS3="",i.DCS="",i.PU1="",i.PU2="",i.STS="",i.CCH="",i.MW="",i.SPA="",i.EPA="",i.SOS="",i.SGCI="",i.SCI="",i.CSI="",i.ST="",i.OSC="",i.PM="",i.APC=""))(zn||(zn={}));var sf;(i=>i.ST=\`\${P.ESC}\\\\\`)(sf||(sf={}));var nl=class{constructor(e,t,s,r,n,o){this._textarea=e,this._compositionView=t,this._bufferService=s,this._optionsService=r,this._coreService=n,this._renderService=o,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}get isComposing(){return this._isComposing}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout(()=>{this._compositionPosition.end=this._textarea.value.length},0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(e.keyCode===20||e.keyCode===229||e.keyCode===16||e.keyCode===17||e.keyCode===18)return!1;this._finalizeComposition(!1)}return e.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){let t={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){this._isSendingComposition=!1;let s;t.start+=this._dataAlreadySent.length,this._isComposing?s=this._textarea.value.substring(t.start,this._compositionPosition.start):s=this._textarea.value.substring(t.start),s.length>0&&this._coreService.triggerDataEvent(s,!0)}},0)}else{this._isSendingComposition=!1;let t=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(t,!0)}}_handleAnyTextareaChanges(){let e=this._textarea.value;setTimeout(()=>{if(!this._isComposing){let t=this._textarea.value,s=t.replace(e,"");this._dataAlreadySent=s,t.length>e.length?this._coreService.triggerDataEvent(s,!0):t.length<e.length?this._coreService.triggerDataEvent(\`\${P.DEL}\`,!0):t.length===e.length&&t!==e&&this._coreService.triggerDataEvent(t,!0)}},0)}updateCompositionElements(e){if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){let t=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),s=this._renderService.dimensions.css.cell.height,r=this._bufferService.buffer.y*this._renderService.dimensions.css.cell.height,n=t*this._renderService.dimensions.css.cell.width;this._compositionView.style.left=n+"px",this._compositionView.style.top=r+"px",this._compositionView.style.height=s+"px",this._compositionView.style.lineHeight=s+"px",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+"px";let o=this._compositionView.getBoundingClientRect();this._textarea.style.left=n+"px",this._textarea.style.top=r+"px",this._textarea.style.width=Math.max(o.width,1)+"px",this._textarea.style.height=Math.max(o.height,1)+"px",this._textarea.style.lineHeight=o.height+"px"}e||setTimeout(()=>this.updateCompositionElements(!0),0)}}};nl=Le([U(2,wt),U(3,bt),U(4,bs),U(5,Li)],nl);var Ke=0,Ve=0,Ge=0,ke=0,nc={css:"#00000000",rgba:0},De;(i=>{function e(r,n,o,a){return a!==void 0?\`#\${Xi(r)}\${Xi(n)}\${Xi(o)}\${Xi(a)}\`:\`#\${Xi(r)}\${Xi(n)}\${Xi(o)}\`}i.toCss=e;function t(r,n,o,a=255){return(r<<24|n<<16|o<<8|a)>>>0}i.toRgba=t;function s(r,n,o,a){return{css:i.toCss(r,n,o,a),rgba:i.toRgba(r,n,o,a)}}i.toColor=s})(De||(De={}));var ge;(i=>{function e(h,l){if(ke=(l.rgba&255)/255,ke===1)return{css:l.css,rgba:l.rgba};let c=l.rgba>>24&255,d=l.rgba>>16&255,u=l.rgba>>8&255,f=h.rgba>>24&255,_=h.rgba>>16&255,w=h.rgba>>8&255;Ke=f+Math.round((c-f)*ke),Ve=_+Math.round((d-_)*ke),Ge=w+Math.round((u-w)*ke);let v=De.toCss(Ke,Ve,Ge),L=De.toRgba(Ke,Ve,Ge);return{css:v,rgba:L}}i.blend=e;function t(h){return(h.rgba&255)===255}i.isOpaque=t;function s(h,l,c){let d=Fn.ensureContrastRatio(h.rgba,l.rgba,c);if(d)return De.toColor(d>>24&255,d>>16&255,d>>8&255)}i.ensureContrastRatio=s;function r(h){let l=(h.rgba|255)>>>0;return[Ke,Ve,Ge]=Fn.toChannels(l),{css:De.toCss(Ke,Ve,Ge),rgba:l}}i.opaque=r;function n(h,l){return ke=Math.round(l*255),[Ke,Ve,Ge]=Fn.toChannels(h.rgba),{css:De.toCss(Ke,Ve,Ge,ke),rgba:De.toRgba(Ke,Ve,Ge,ke)}}i.opacity=n;function o(h,l){return ke=h.rgba&255,n(h,ke*l/255)}i.multip
Line truncated
|
||||
\`:\`
|
||||
\`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),Ql&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:this._activeSelectionMode===3})}_isClickInSelection(e){let t=this._getMouseBufferCoords(e),s=this._model.finalSelectionStart,r=this._model.finalSelectionEnd;return!s||!r||!t?!1:this._areCoordsInSelection(t,s,r)}isCellInSelection(e,t){let s=this._model.finalSelectionStart,r=this._model.finalSelectionEnd;return!s||!r?!1:this._areCoordsInSelection([e,t],s,r)}_areCoordsInSelection(e,t,s){return e[1]>t[1]&&e[1]<s[1]||t[1]===s[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<s[0]||t[1]<s[1]&&e[1]===s[1]&&e[0]<s[0]||t[1]<s[1]&&e[1]===t[1]&&e[0]>=t[0]}_selectWordAtCursor(e,t){var n,o;let s=(o=(n=this._linkifier.currentLink)==null?void 0:n.link)==null?void 0:o.range;if(s)return this._model.selectionStart=[s.start.x-1,s.start.y-1],this._model.selectionStartLength=lc(s,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let r=this._getMouseBufferCoords(e);return r?(this._selectWordAt(r,t),this._model.selectionEnd=void 0,!0):!1}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){let t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=Jl(this._coreBrowserService.window,e,this._screenElement)[1],s=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=s?0:(t>s&&(t-=s),t=Math.min(Math.max(t,-qo),qo),t/=qo,t/Math.abs(t)+Math.round(t*(Cm-1)))}shouldForceSelection(e){return Zn?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval(()=>this._dragScroll(),xm)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;let t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&t.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(Zn&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:this._activeSelectionMode===1&&this._selectToWordAt(this._model.selectionE
Line truncated
|
||||
\`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),Ql&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:this._activeSelectionMode===3})}_isClickInSelection(e){let t=this._getMouseBufferCoords(e),s=this._model.finalSelectionStart,r=this._model.finalSelectionEnd;return!s||!r||!t?!1:this._areCoordsInSelection(t,s,r)}isCellInSelection(e,t){let s=this._model.finalSelectionStart,r=this._model.finalSelectionEnd;return!s||!r?!1:this._areCoordsInSelection([e,t],s,r)}_areCoordsInSelection(e,t,s){return e[1]>t[1]&&e[1]<s[1]||t[1]===s[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<s[0]||t[1]<s[1]&&e[1]===s[1]&&e[0]<s[0]||t[1]<s[1]&&e[1]===t[1]&&e[0]>=t[0]}_selectWordAtCursor(e,t){var n,o;let s=(o=(n=this._linkifier.currentLink)==null?void 0:n.link)==null?void 0:o.range;if(s)return this._model.selectionStart=[s.start.x-1,s.start.y-1],this._model.selectionStartLength=lc(s,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let r=this._getMouseBufferCoords(e);return r?(this._selectWordAt(r,t),this._model.selectionEnd=void 0,!0):!1}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){let t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=Jl(this._coreBrowserService.window,e,this._screenElement)[1],s=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=s?0:(t>s&&(t-=s),t=Math.min(Math.max(t,-qo),qo),t/=qo,t/Math.abs(t)+Math.round(t*(Cm-1)))}shouldForceSelection(e){return Zn?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval(()=>this._dragScroll(),xm)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;let t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&t.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(Zn&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:this._activeSelectionMode===1&&this._selectToWordAt(this._model.selectionE
Line truncated
|
||||
\`))),this._register(this._terminal.onA11yTab(o=>this._handleTab(o))),this._register(this._terminal.onKey(o=>this._handleKey(o.key))),this._register(this._terminal.onBlur(()=>this._clearLiveRegion())),this._register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._register(Z(n,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register(we(()=>{this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(e){for(let t=0;t<e;t++)this._handleChar(" ")}_handleChar(e){this._liveRegionLineCount<Mc+1&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,e===\`
|
||||
\`&&(this._liveRegionLineCount++,this._liveRegionLineCount===Mc+1&&(this._liveRegion.textContent+=Fa.get())))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),new RegExp("\\\\p{Control}","u").test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){let s=this._terminal.buffer,r=s.lines.length.toString();for(let n=e;n<=t;n++){let o=s.lines.get(s.ydisp+n),a=[],h=(o==null?void 0:o.translateToString(!0,void 0,void 0,a))||"",l=(s.ydisp+n+1).toString(),c=this._rowElements[n];c&&(h.length===0?(c.textContent=" ",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,a)),c.setAttribute("aria-posinset",l),c.setAttribute("aria-setsize",r),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){let s=e.target,r=this._rowElements[t===0?1:this._rowElements.length-2],n=s.getAttribute("aria-posinset"),o=t===0?"1":\`\${this._terminal.buffer.lines.length}\`;if(n===o||e.relatedTarget!==r)return;let a,h;if(t===0?(a=s,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(a=this._rowElements.shift(),h=s,this._rowContainer.removeChild(a)),a.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),t===0){let l=this._createAccessibilityTreeNode();this._rowElements.unshift(l),this._rowContainer.insertAdjacentElement("afterbegin",l)}else{let l=this._createAccessibilityTreeNode();this._rowElements.push(l),this._rowContainer.appendChild(l)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(t===0?-1:1),this._rowElements[t===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){var h;if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let t={node:e.anchorNode,offset:e.anchorOffset},s={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(s.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===s.node&&t.offset>s.offset)&&([t,s]=[s,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;let r=this._rowElements.slice(-1)[0];if(s.node.compareDocumentPosition(r)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(s={node:r,offset:((h=r.textContent)==null?void 0:h.length)??0}),!this._rowContainer.contains(s.node))return;let n=({node:l,offset:c})=>{let d=l instanceof Text?l.parentNode:l,u=parseInt(d==null?void 0:d.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let f=this._rowColumns.get(d);if(!f)return console.warn("columns is null. Race condition?"),null;let _=c<f.length?f[c]:f.slice(-1)[0]+1;return _>=this._terminal.cols&&(++u,_=0),{row:u,column:_}},o=n(t),a=n(s);if(!(!o||!a)){if(o.row>a.row||o.row===a.row&&o.column>=a.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(a.row-o.row)*this._terminal.cols-o.column+a.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let t=this._rowContainer.children.length;t<this._terminal.rows;t++)this._rowElements[t]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[t]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let e=this._coreBrowserService.mainDocument.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){Object.assign(this._accessibilityContainer.style,{width:\`\${this._renderService.dimensions.css.canvas.width}px\`,fontSize:\`\${this._terminal.options.fontSize}px\`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e]),this._alignRowWidth(this._rowElements[e])}}_refreshRowDimensions(e){e.style.height=\`\${this._renderService.dimensions.css.cell.height}px\`}_alignRowWidth(e){var n,o;e.style.tr
Line truncated
|
||||
\`&&(this._liveRegionLineCount++,this._liveRegionLineCount===Mc+1&&(this._liveRegion.textContent+=Fa.get())))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),new RegExp("\\\\p{Control}","u").test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){let s=this._terminal.buffer,r=s.lines.length.toString();for(let n=e;n<=t;n++){let o=s.lines.get(s.ydisp+n),a=[],h=(o==null?void 0:o.translateToString(!0,void 0,void 0,a))||"",l=(s.ydisp+n+1).toString(),c=this._rowElements[n];c&&(h.length===0?(c.textContent=" ",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,a)),c.setAttribute("aria-posinset",l),c.setAttribute("aria-setsize",r),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){let s=e.target,r=this._rowElements[t===0?1:this._rowElements.length-2],n=s.getAttribute("aria-posinset"),o=t===0?"1":\`\${this._terminal.buffer.lines.length}\`;if(n===o||e.relatedTarget!==r)return;let a,h;if(t===0?(a=s,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(a=this._rowElements.shift(),h=s,this._rowContainer.removeChild(a)),a.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),t===0){let l=this._createAccessibilityTreeNode();this._rowElements.unshift(l),this._rowContainer.insertAdjacentElement("afterbegin",l)}else{let l=this._createAccessibilityTreeNode();this._rowElements.push(l),this._rowContainer.appendChild(l)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(t===0?-1:1),this._rowElements[t===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){var h;if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let t={node:e.anchorNode,offset:e.anchorOffset},s={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(s.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===s.node&&t.offset>s.offset)&&([t,s]=[s,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;let r=this._rowElements.slice(-1)[0];if(s.node.compareDocumentPosition(r)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(s={node:r,offset:((h=r.textContent)==null?void 0:h.length)??0}),!this._rowContainer.contains(s.node))return;let n=({node:l,offset:c})=>{let d=l instanceof Text?l.parentNode:l,u=parseInt(d==null?void 0:d.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let f=this._rowColumns.get(d);if(!f)return console.warn("columns is null. Race condition?"),null;let _=c<f.length?f[c]:f.slice(-1)[0]+1;return _>=this._terminal.cols&&(++u,_=0),{row:u,column:_}},o=n(t),a=n(s);if(!(!o||!a)){if(o.row>a.row||o.row===a.row&&o.column>=a.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(a.row-o.row)*this._terminal.cols-o.column+a.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let t=this._rowContainer.children.length;t<this._terminal.rows;t++)this._rowElements[t]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[t]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let e=this._coreBrowserService.mainDocument.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){Object.assign(this._accessibilityContainer.style,{width:\`\${this._renderService.dimensions.css.canvas.width}px\`,fontSize:\`\${this._terminal.options.fontSize}px\`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e]),this._alignRowWidth(this._rowElements[e])}}_refreshRowDimensions(e){e.style.height=\`\${this._renderService.dimensions.css.cell.height}px\`}_alignRowWidth(e){var n,o;e.style.tr
Line truncated
|
||||
\`,e)}paste(i){this._core.paste(i)}refresh(i,e){this._verifyIntegers(i,e),this._core.refresh(i,e)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(i){this._addonManager.loadAddon(this,i)}static get strings(){return{get promptLabel(){return za.get()},set promptLabel(i){za.set(i)},get tooMuchOutput(){return Fa.get()},set tooMuchOutput(i){Fa.set(i)}}}_verifyIntegers(...i){for(Xt of i)if(Xt===1/0||isNaN(Xt)||Xt%1!==0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...i){for(Xt of i)if(Xt&&(Xt===1/0||isNaN(Xt)||Xt%1!==0||Xt<0))throw new Error("This API only accepts positive integers")}};/**
|
||||
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
@@ -104,9 +104,9 @@ WARNING: This link could potentially be dangerous\`)){let t=window.open();if(t){
|
||||
|
||||
\`+e.stack):new Error(e.message+\`
|
||||
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},$v=new Iv;function Xo(i){Ov(i)||$v.onUnexpectedError(i)}var yl="Canceled";function Ov(i){return i instanceof zv?!0:i instanceof Error&&i.name===yl&&i.message===yl}var zv=class extends Error{constructor(){super(yl),this.name=this.message}},Dc=class Sl extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Sl)return e;let t=new Sl;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},Fv;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(Fv||(Fv={}));function Nv(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var wf;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*T(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=T;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function L(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=L})(wf||(wf={}));function bf(i){if(wf.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function yf(...i){return ht(()=>bf(i))}function ht(i){return{dispose:Nv(()=>{i()})}}var Sf=class Cf{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{bf(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Cf.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Sf.DISABLE_DISPOSED_WARNING=!1;var Hs=Sf,Vt=class{constructor(){this._store=new Hs,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Vt.None=Object.freeze({dispose(){}});var hr=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},eh=typeof process<"u"&&"title"in process,po=eh?"node":navigator.userAgent,Wv=eh?"node":navigator.platform,Hv=po.includes("Firefox"),Uv=po.includes("Edge"),xf=/^((?!chrome|android).)*safari/i.test(po);function qv(){if(!xf)return 0;let i=po.match(/Version\\/(\\d+)/);return i===null||i.length<2?0:parseInt(i[1])}Wv.indexOf("Linux")>=0;var jv="",Ye=0,Ze=0,Xe=0,Ee=0,Bt={css:"#00000000",rgba:0},gt;(i=>{function e(r,n,o,a){return a!==void 0?\`#\${Ji(r)}\${Ji(n)}\${Ji(o)}\${Ji(a)}\`:\`#\Line truncated
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},$v=new Iv;function Xo(i){Ov(i)||$v.onUnexpectedError(i)}var yl="Canceled";function Ov(i){return i instanceof zv?!0:i instanceof Error&&i.name===yl&&i.message===yl}var zv=class extends Error{constructor(){super(yl),this.name=this.message}},Dc=class Sl extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Sl)return e;let t=new Sl;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},Fv;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(Fv||(Fv={}));function Nv(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var wf;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*L(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=L;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function T(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=T})(wf||(wf={}));function bf(i){if(wf.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function yf(...i){return ct(()=>bf(i))}function ct(i){return{dispose:Nv(()=>{i()})}}var Sf=class Cf{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{bf(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Cf.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Sf.DISABLE_DISPOSED_WARNING=!1;var Hs=Sf,Vt=class{constructor(){this._store=new Hs,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Vt.None=Object.freeze({dispose(){}});var hr=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},eh=typeof process<"u"&&"title"in process,po=eh?"node":navigator.userAgent,Wv=eh?"node":navigator.platform,Hv=po.includes("Firefox"),Uv=po.includes("Edge"),xf=/^((?!chrome|android).)*safari/i.test(po);function qv(){if(!xf)return 0;let i=po.match(/Version\\/(\\d+)/);return i===null||i.length<2?0:parseInt(i[1])}Wv.indexOf("Linux")>=0;var jv="",Ye=0,Ze=0,Xe=0,Ee=0,Bt={css:"#00000000",rgba:0},mt;(i=>{function e(r,n,o,a){return a!==void 0?\`#\${Ji(r)}\${Ji(n)}\${Ji(o)}\${Ji(a)}\`:\`#\Line truncated
|
||||
\`).slice(2).join(\`
|
||||
\`))}},w0=class extends Error{constructor(e,t){super(e),this.name="ListenerLeakError",this.stack=t}},b0=class extends Error{constructor(e,t){super(e),this.name="ListenerRefusalError",this.stack=t}},y0=0,Qo=class{constructor(e){this.value=e,this.id=y0++}},S0=2,C0,me=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new m0((e==null?void 0:e.onListenerError)??Xo,((s=this._options)==null?void 0:s.leakWarningThreshold)??g0):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new p0(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new b0(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||Xo)(_),Vt.None}if(this._disposed)return Vt.None;t&&(e=e.bind(t));let r=new Qo(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=v0.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof Qo?(this._deliveryQueue??(this._deliveryQueue=new x0),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=ht(()=>{n==null||n(),this._removeListener(r)});return s instanceof Hs?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*S0<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||Xo;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof Qo)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},x0=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},zc={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},cr=2,dr,Oi=class Is{constructor(e,t,s){this._document=e,this._config=t,this._unicodeService=s,this._didWarmUp=!1,this._cacheMap=new Oc,this._cacheMapCombined=new Oc,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new zs,this._textureSize=512,this._onAddTextureAtlasCanvas=new me,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new me,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=Of(e,this._config.deviceCellWidth*4+cr*2,this._config.deviceCellHeight+cr*2),this._tmpCtx=Be(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new u0;for(let t=33;t<126;t++)e.enqueue(()=>{if
Line truncated
|
||||
\`))}},w0=class extends Error{constructor(e,t){super(e),this.name="ListenerLeakError",this.stack=t}},b0=class extends Error{constructor(e,t){super(e),this.name="ListenerRefusalError",this.stack=t}},y0=0,Qo=class{constructor(e){this.value=e,this.id=y0++}},S0=2,C0,me=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new m0((e==null?void 0:e.onListenerError)??Xo,((s=this._options)==null?void 0:s.leakWarningThreshold)??g0):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new p0(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new b0(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||Xo)(_),Vt.None}if(this._disposed)return Vt.None;t&&(e=e.bind(t));let r=new Qo(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=v0.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof Qo?(this._deliveryQueue??(this._deliveryQueue=new x0),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=ct(()=>{n==null||n(),this._removeListener(r)});return s instanceof Hs?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*S0<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||Xo;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof Qo)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},x0=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},zc={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},cr=2,dr,Oi=class Is{constructor(e,t,s){this._document=e,this._config=t,this._unicodeService=s,this._didWarmUp=!1,this._cacheMap=new Oc,this._cacheMapCombined=new Oc,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new zs,this._textureSize=512,this._onAddTextureAtlasCanvas=new me,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new me,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=Of(e,this._config.deviceCellWidth*4+cr*2,this._config.deviceCellHeight+cr*2),this._tmpCtx=Be(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new u0;for(let t=33;t<126;t++)e.enqueue(()=>{if
Line truncated
|
||||
layout (location = 0) in vec2 a_unitquad;
|
||||
layout (location = 1) in vec2 a_cellpos;
|
||||
layout (location = 2) in vec2 a_offset;
|
||||
@@ -140,7 +140,7 @@ void main() {
|
||||
if (v_texpage == 0) {
|
||||
outColor = texture(u_texture[0], v_texcoord);
|
||||
} \${e}
|
||||
}\`}var zi=11,Rs=zi*Float32Array.BYTES_PER_ELEMENT,P0=2,xe=0,pe,ia=0,ur=0,I0=class extends Vt{constructor(e,t,s,r){super(),this._terminal=e,this._gl=t,this._dimensions=s,this._optionsService=r,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};let n=this._gl;Oi.maxAtlasPages===void 0&&(Oi.maxAtlasPages=Math.min(32,Be(n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS))),Oi.maxTextureSize=Be(n.getParameter(n.MAX_TEXTURE_SIZE))),this._program=Be(Wf(n,B0,D0(Oi.maxAtlasPages))),this._register(ht(()=>n.deleteProgram(this._program))),this._projectionLocation=Be(n.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=Be(n.getUniformLocation(this._program,"u_resolution")),this._textureLocation=Be(n.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=n.createVertexArray(),n.bindVertexArray(this._vertexArrayObject);let o=new Float32Array([0,0,1,0,0,1,1,1]),a=n.createBuffer();this._register(ht(()=>n.deleteBuffer(a))),n.bindBuffer(n.ARRAY_BUFFER,a),n.bufferData(n.ARRAY_BUFFER,o,n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);let h=new Uint8Array([0,1,2,3]),l=n.createBuffer();this._register(ht(()=>n.deleteBuffer(l))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l),n.bufferData(n.ELEMENT_ARRAY_BUFFER,h,n.STATIC_DRAW),this._attributesBuffer=Be(n.createBuffer()),this._register(ht(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,2,n.FLOAT,!1,Rs,0),n.vertexAttribDivisor(2,1),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,n.FLOAT,!1,Rs,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(3,1),n.enableVertexAttribArray(4),n.vertexAttribPointer(4,1,n.FLOAT,!1,Rs,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(4,1),n.enableVertexAttribArray(5),n.vertexAttribPointer(5,2,n.FLOAT,!1,Rs,5*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(5,1),n.enableVertexAttribArray(6),n.vertexAttribPointer(6,2,n.FLOAT,!1,Rs,7*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(6,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,Rs,9*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.useProgram(this._program);let c=new Int32Array(Oi.maxAtlasPages);for(let d=0;d<Oi.maxAtlasPages;d++)c[d]=d;n.uniform1iv(this._textureLocation,c),n.uniformMatrix4fv(this._projectionLocation,!1,Nf),this._atlasTextures=[];for(let d=0;d<Oi.maxAtlasPages;d++){let u=new M0(Be(n.createTexture()));this._register(ht(()=>n.deleteTexture(u.texture))),n.activeTexture(n.TEXTURE0+d),n.bindTexture(n.TEXTURE_2D,u.texture),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,1,1,0,n.RGBA,n.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[d]=u}n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return this._atlas?this._atlas.beginFrame():!0}updateCell(e,t,s,r,n,o,a,h,l){this._updateCell(this._vertices.attributes,e,t,s,r,n,o,a,h,l)}_updateCell(e,t,s,r,n,o,a,h,l,c){if(xe=(s*this._terminal.cols+t)*zi,r===0||r===void 0){e.fill(0,xe,xe+zi-1-P0);return}this._atlas&&(h&&h.length>1?pe=this._atlas.getRasterizedGlyphCombinedChar(h,n,o,a,!1,this._terminal.element):pe=this._atlas.getRasterizedGlyph(r,n,o,a,!1,this._terminal.element),ia=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),n!==c&&pe.offset.x>ia?(ur=pe.offset.x-ia,e[xe]=-(pe.offset.x-ur)+this._dimensions.device.char.left,e[xe+1]=-pe.offset.y+this._dimensions.device.char.top,e[xe+2]=(pe.size.x-ur)/this._dimensions.device.canvas.width,e[xe+3]=pe.size.y/this._dimensions.device.canvas.height,e[xe+4]=pe.texturePage,e[xe+5]=pe.texturePositionClipSpace.x+ur/this._atlas.pages[pe.texturePage].canvas.width,e[xe+6]=pe.texturePositionClipSpace.y,e[xe+7]=pe.sizeClipSpace.x-ur/this._atlas.pages[pe.texturePage].canvas.width,e[xe+8]=pe.sizeClipSpace.y):(e[xe]=-pe.offset.x+this._dimensions.device.char.left,e[xe+1]=-pe.offset.y+this._dimensions.device.char.top,e[xe+2]=pe.size.x/this._dimensions.device.canvas.width,e[xe+3]=pe.size.y/this._dimensions.device.canvas.height,e[xe+4]=pe.texturePage,e[xe+5]=pe.texturePositionClipSpace.x,e[xe+6]=pe.texturePositionClipSpace.y,e[xe+7]=pe.sizeClipSpace.x,e[xe+8]=pe.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&Xv(r,l,pe.size.x,this._dimensions.device.cell.width)&&(e[xe+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let e=this._terminal,t=e.cols*e.rows*zi;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let s=0;for(;s<this._vertices.attributesBuffers.length;s++)this._vertices.count!==t?this._vertices.attributesBuffers[s]=new Float32Array(t):this._vertices.attributesBuffers[s].fill(0);this
Line truncated
|
||||
}\`}var zi=11,Rs=zi*Float32Array.BYTES_PER_ELEMENT,P0=2,xe=0,pe,ia=0,ur=0,I0=class extends Vt{constructor(e,t,s,r){super(),this._terminal=e,this._gl=t,this._dimensions=s,this._optionsService=r,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};let n=this._gl;Oi.maxAtlasPages===void 0&&(Oi.maxAtlasPages=Math.min(32,Be(n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS))),Oi.maxTextureSize=Be(n.getParameter(n.MAX_TEXTURE_SIZE))),this._program=Be(Wf(n,B0,D0(Oi.maxAtlasPages))),this._register(ct(()=>n.deleteProgram(this._program))),this._projectionLocation=Be(n.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=Be(n.getUniformLocation(this._program,"u_resolution")),this._textureLocation=Be(n.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=n.createVertexArray(),n.bindVertexArray(this._vertexArrayObject);let o=new Float32Array([0,0,1,0,0,1,1,1]),a=n.createBuffer();this._register(ct(()=>n.deleteBuffer(a))),n.bindBuffer(n.ARRAY_BUFFER,a),n.bufferData(n.ARRAY_BUFFER,o,n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);let h=new Uint8Array([0,1,2,3]),l=n.createBuffer();this._register(ct(()=>n.deleteBuffer(l))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l),n.bufferData(n.ELEMENT_ARRAY_BUFFER,h,n.STATIC_DRAW),this._attributesBuffer=Be(n.createBuffer()),this._register(ct(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,2,n.FLOAT,!1,Rs,0),n.vertexAttribDivisor(2,1),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,n.FLOAT,!1,Rs,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(3,1),n.enableVertexAttribArray(4),n.vertexAttribPointer(4,1,n.FLOAT,!1,Rs,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(4,1),n.enableVertexAttribArray(5),n.vertexAttribPointer(5,2,n.FLOAT,!1,Rs,5*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(5,1),n.enableVertexAttribArray(6),n.vertexAttribPointer(6,2,n.FLOAT,!1,Rs,7*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(6,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,Rs,9*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.useProgram(this._program);let c=new Int32Array(Oi.maxAtlasPages);for(let d=0;d<Oi.maxAtlasPages;d++)c[d]=d;n.uniform1iv(this._textureLocation,c),n.uniformMatrix4fv(this._projectionLocation,!1,Nf),this._atlasTextures=[];for(let d=0;d<Oi.maxAtlasPages;d++){let u=new M0(Be(n.createTexture()));this._register(ct(()=>n.deleteTexture(u.texture))),n.activeTexture(n.TEXTURE0+d),n.bindTexture(n.TEXTURE_2D,u.texture),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,1,1,0,n.RGBA,n.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[d]=u}n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return this._atlas?this._atlas.beginFrame():!0}updateCell(e,t,s,r,n,o,a,h,l){this._updateCell(this._vertices.attributes,e,t,s,r,n,o,a,h,l)}_updateCell(e,t,s,r,n,o,a,h,l,c){if(xe=(s*this._terminal.cols+t)*zi,r===0||r===void 0){e.fill(0,xe,xe+zi-1-P0);return}this._atlas&&(h&&h.length>1?pe=this._atlas.getRasterizedGlyphCombinedChar(h,n,o,a,!1,this._terminal.element):pe=this._atlas.getRasterizedGlyph(r,n,o,a,!1,this._terminal.element),ia=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),n!==c&&pe.offset.x>ia?(ur=pe.offset.x-ia,e[xe]=-(pe.offset.x-ur)+this._dimensions.device.char.left,e[xe+1]=-pe.offset.y+this._dimensions.device.char.top,e[xe+2]=(pe.size.x-ur)/this._dimensions.device.canvas.width,e[xe+3]=pe.size.y/this._dimensions.device.canvas.height,e[xe+4]=pe.texturePage,e[xe+5]=pe.texturePositionClipSpace.x+ur/this._atlas.pages[pe.texturePage].canvas.width,e[xe+6]=pe.texturePositionClipSpace.y,e[xe+7]=pe.sizeClipSpace.x-ur/this._atlas.pages[pe.texturePage].canvas.width,e[xe+8]=pe.sizeClipSpace.y):(e[xe]=-pe.offset.x+this._dimensions.device.char.left,e[xe+1]=-pe.offset.y+this._dimensions.device.char.top,e[xe+2]=pe.size.x/this._dimensions.device.canvas.width,e[xe+3]=pe.size.y/this._dimensions.device.canvas.height,e[xe+4]=pe.texturePage,e[xe+5]=pe.texturePositionClipSpace.x,e[xe+6]=pe.texturePositionClipSpace.y,e[xe+7]=pe.sizeClipSpace.x,e[xe+8]=pe.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&Xv(r,l,pe.size.x,this._dimensions.device.cell.width)&&(e[xe+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let e=this._terminal,t=e.cols*e.rows*zi;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let s=0;for(;s<this._vertices.attributesBuffers.length;s++)this._vertices.count!==t?this._vertices.attributesBuffers[s]=new Float32Array(t):this._vertices.attributesBuffers[s].fill(0);this
Line truncated
|
||||
layout (location = 0) in vec2 a_position;
|
||||
layout (location = 1) in vec2 a_size;
|
||||
layout (location = 2) in vec4 a_color;
|
||||
@@ -163,7 +163,7 @@ out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
outColor = v_color;
|
||||
}\`,bi=8,ra=bi*Float32Array.BYTES_PER_ELEMENT,H0=20*bi,qc=class{constructor(){this.attributes=new Float32Array(H0),this.count=0}},vi=0,jc=0,Kc=0,Vc=0,Gc=0,Yc=0,Zc=0,U0=class extends Vt{constructor(e,t,s,r){super(),this._terminal=e,this._gl=t,this._dimensions=s,this._themeService=r,this._vertices=new qc,this._verticesCursor=new qc;let n=this._gl;this._program=Be(Wf(n,N0,W0)),this._register(ht(()=>n.deleteProgram(this._program))),this._projectionLocation=Be(n.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=n.createVertexArray(),n.bindVertexArray(this._vertexArrayObject);let o=new Float32Array([0,0,1,0,0,1,1,1]),a=n.createBuffer();this._register(ht(()=>n.deleteBuffer(a))),n.bindBuffer(n.ARRAY_BUFFER,a),n.bufferData(n.ARRAY_BUFFER,o,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let h=new Uint8Array([0,1,2,3]),l=n.createBuffer();this._register(ht(()=>n.deleteBuffer(l))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l),n.bufferData(n.ELEMENT_ARRAY_BUFFER,h,n.STATIC_DRAW),this._attributesBuffer=Be(n.createBuffer()),this._register(ht(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,ra,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,ra,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,!1,ra,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(r.colors),this._register(this._themeService.onChangeColors(c=>{this._updateCachedColors(c),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){let t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,Nf),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){let t=this._terminal,s=this._vertices,r=1,n,o,a,h,l,c,d,u,f,_,w;for(n=0;n<t.rows;n++){for(a=-1,h=0,l=0,c=!1,o=0;o<t.cols;o++)d=(n*t.cols+o)*Qn,u=e.cells[d+Hn],f=e.cells[d+Un],_=!!(f&67108864),(u!==h||f!==l&&(c||_))&&((h!==0||c&&l!==0)&&(w=r++*bi,this._updateRectangle(s,w,l,h,a,o,n)),a=o,h=u,l=f,c=_);(h!==0||c&&l!==0)&&(w=r++*bi,this._updateRectangle(s,w,l,h,a,t.cols,n))}s.count=r}updateCursor(e){let t=this._verticesCursor,s=e.cursor;if(!s||s.style==="block"){t.count=0;return}let r,n=0;(s.style==="bar"||s.style==="outline")&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.style==="bar"?s.dpr*s.cursorWidth:s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),(s.style==="underline"||s.style==="outline")&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,(s.y+1)*this._dimensions.device.cell.height-s.dpr,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat)),s.style==="outline"&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat),r=n++*bi,this._addRectangleFloat(t.attributes,r,(s.x+s.width)*this._dimensions.device.cell.width-s.dpr,s.y*this._dimensions.device.cell.height,s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=n}_updateRectangle(e,t,s,r,n,o,a){if(s&67108864)switch(s&50331648){case 16777216:case 33554432:vi=this._themeService.colors.ansi[s&255].rgba;break;case 50331648:vi=(s&16777215)<<8;break;case 0:default:vi=this._themeService.colors.foreground.rgba}else switch(r&50331648){case 16777216:case 33554432:vi=this._themeService.colors.ansi[r&255].rgba;break;case 50331648:vi=(r&16777215)<<8;break;case 0:default:vi=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=R0(e.attributes,this._terminal.rows*this._terminal.cols*bi)),jc=n*this._dimensions.device.cell.width,Kc=a*this._dimensions.device.cell.height,Vc=(vi>>24&255)/255,Gc=(vi>>16&255)/255,Yc=(vi>>8&255)/255,Zc=1,this._addRectangle(e.attributes,t,jc,Kc,(o-n)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,Vc,Gc,Yc,Zc)}_addRectangle(e,t,s,r,n,o,a,h,l,c){e[t]=s/this._dimensions.device.canvas.width,e[t+1]=r/this._dimensions.device.canvas.heig
Line truncated
|
||||
}\`,bi=8,ra=bi*Float32Array.BYTES_PER_ELEMENT,H0=20*bi,qc=class{constructor(){this.attributes=new Float32Array(H0),this.count=0}},vi=0,jc=0,Kc=0,Vc=0,Gc=0,Yc=0,Zc=0,U0=class extends Vt{constructor(e,t,s,r){super(),this._terminal=e,this._gl=t,this._dimensions=s,this._themeService=r,this._vertices=new qc,this._verticesCursor=new qc;let n=this._gl;this._program=Be(Wf(n,N0,W0)),this._register(ct(()=>n.deleteProgram(this._program))),this._projectionLocation=Be(n.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=n.createVertexArray(),n.bindVertexArray(this._vertexArrayObject);let o=new Float32Array([0,0,1,0,0,1,1,1]),a=n.createBuffer();this._register(ct(()=>n.deleteBuffer(a))),n.bindBuffer(n.ARRAY_BUFFER,a),n.bufferData(n.ARRAY_BUFFER,o,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let h=new Uint8Array([0,1,2,3]),l=n.createBuffer();this._register(ct(()=>n.deleteBuffer(l))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l),n.bufferData(n.ELEMENT_ARRAY_BUFFER,h,n.STATIC_DRAW),this._attributesBuffer=Be(n.createBuffer()),this._register(ct(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,ra,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,ra,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,!1,ra,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(r.colors),this._register(this._themeService.onChangeColors(c=>{this._updateCachedColors(c),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){let t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,Nf),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){let t=this._terminal,s=this._vertices,r=1,n,o,a,h,l,c,d,u,f,_,w;for(n=0;n<t.rows;n++){for(a=-1,h=0,l=0,c=!1,o=0;o<t.cols;o++)d=(n*t.cols+o)*Qn,u=e.cells[d+Hn],f=e.cells[d+Un],_=!!(f&67108864),(u!==h||f!==l&&(c||_))&&((h!==0||c&&l!==0)&&(w=r++*bi,this._updateRectangle(s,w,l,h,a,o,n)),a=o,h=u,l=f,c=_);(h!==0||c&&l!==0)&&(w=r++*bi,this._updateRectangle(s,w,l,h,a,t.cols,n))}s.count=r}updateCursor(e){let t=this._verticesCursor,s=e.cursor;if(!s||s.style==="block"){t.count=0;return}let r,n=0;(s.style==="bar"||s.style==="outline")&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.style==="bar"?s.dpr*s.cursorWidth:s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),(s.style==="underline"||s.style==="outline")&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,(s.y+1)*this._dimensions.device.cell.height-s.dpr,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat)),s.style==="outline"&&(r=n++*bi,this._addRectangleFloat(t.attributes,r,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat),r=n++*bi,this._addRectangleFloat(t.attributes,r,(s.x+s.width)*this._dimensions.device.cell.width-s.dpr,s.y*this._dimensions.device.cell.height,s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=n}_updateRectangle(e,t,s,r,n,o,a){if(s&67108864)switch(s&50331648){case 16777216:case 33554432:vi=this._themeService.colors.ansi[s&255].rgba;break;case 50331648:vi=(s&16777215)<<8;break;case 0:default:vi=this._themeService.colors.foreground.rgba}else switch(r&50331648){case 16777216:case 33554432:vi=this._themeService.colors.ansi[r&255].rgba;break;case 50331648:vi=(r&16777215)<<8;break;case 0:default:vi=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=R0(e.attributes,this._terminal.rows*this._terminal.cols*bi)),jc=n*this._dimensions.device.cell.width,Kc=a*this._dimensions.device.cell.height,Vc=(vi>>24&255)/255,Gc=(vi>>16&255)/255,Yc=(vi>>8&255)/255,Zc=1,this._addRectangle(e.attributes,t,jc,Kc,(o-n)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,Vc,Gc,Yc,Zc)}_addRectangle(e,t,s,r,n,o,a,h,l,c){e[t]=s/this._dimensions.device.canvas.width,e[t+1]=r/this._dimensions.device.canvas.heig
Line truncated
|
||||
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*
|
||||
@@ -178,9 +178,9 @@ void main() {
|
||||
|
||||
\`+e.stack):new Error(e.message+\`
|
||||
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},pw=new _w;function ha(i){gw(i)||pw.onUnexpectedError(i)}var Ll="Canceled";function gw(i){return i instanceof mw?!0:i instanceof Error&&i.name===Ll&&i.message===Ll}var mw=class extends Error{constructor(){super(Ll),this.name=this.message}},od=class Tl extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Tl)return e;let t=new Tl;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},vw;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(vw||(vw={}));function ww(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var jf;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*T(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=T;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function L(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=L})(jf||(jf={}));function Br(i){if(jf.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function Kf(...i){return Ys(()=>Br(i))}function Ys(i){return{dispose:ww(()=>{i()})}}var Vf=class Gf{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{Br(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Gf.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Vf.DISABLE_DISPOSED_WARNING=!1;var sh=Vf,Vi=class{constructor(){this._store=new sh,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Vi.None=Object.freeze({dispose(){}});var eo=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},bw=globalThis.performance&&typeof globalThis.performance.now=="function",yw=class Yf{static create(e){return new Yf(e)}constructor(e){this._now=bw&&e===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}},rh;(i=>{i.None=()=>Vi.None;func
Line truncated
|
||||
\`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},pw=new _w;function ha(i){gw(i)||pw.onUnexpectedError(i)}var Ll="Canceled";function gw(i){return i instanceof mw?!0:i instanceof Error&&i.name===Ll&&i.message===Ll}var mw=class extends Error{constructor(){super(Ll),this.name=this.message}},od=class Tl extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof Tl)return e;let t=new Tl;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}},vw;(i=>{function e(n){return n<0}i.isLessThan=e;function t(n){return n<=0}i.isLessThanOrEqual=t;function s(n){return n>0}i.isGreaterThan=s;function r(n){return n===0}i.isNeitherLessOrGreaterThan=r,i.greaterThan=1,i.lessThan=-1,i.neitherLessOrGreaterThan=0})(vw||(vw={}));function ww(i,e){let t=this,s=!1,r;return function(){return s||(s=!0,e||(r=i.apply(t,arguments))),r}}var jf;(i=>{function e(p){return p&&typeof p=="object"&&typeof p[Symbol.iterator]=="function"}i.is=e;let t=Object.freeze([]);function s(){return t}i.empty=s;function*r(p){yield p}i.single=r;function n(p){return e(p)?p:r(p)}i.wrap=n;function o(p){return p||t}i.from=o;function*a(p){for(let E=p.length-1;E>=0;E--)yield p[E]}i.reverse=a;function h(p){return!p||p[Symbol.iterator]().next().done===!0}i.isEmpty=h;function l(p){return p[Symbol.iterator]().next().value}i.first=l;function c(p,E){let C=0;for(let $ of p)if(E($,C++))return!0;return!1}i.some=c;function d(p,E){for(let C of p)if(E(C))return C}i.find=d;function*u(p,E){for(let C of p)E(C)&&(yield C)}i.filter=u;function*f(p,E){let C=0;for(let $ of p)yield E($,C++)}i.map=f;function*_(p,E){let C=0;for(let $ of p)yield*E($,C++)}i.flatMap=_;function*w(...p){for(let E of p)yield*E}i.concat=w;function v(p,E,C){let $=C;for(let H of p)$=E($,H);return $}i.reduce=v;function*L(p,E,C=p.length){for(E<0&&(E+=p.length),C<0?C+=p.length:C>p.length&&(C=p.length);E<C;E++)yield p[E]}i.slice=L;function M(p,E=Number.POSITIVE_INFINITY){let C=[];if(E===0)return[C,p];let $=p[Symbol.iterator]();for(let H=0;H<E;H++){let O=$.next();if(O.done)return[C,i.empty()];C.push(O.value)}return[C,{[Symbol.iterator](){return $}}]}i.consume=M;async function T(p){let E=[];for await(let C of p)E.push(C);return Promise.resolve(E)}i.asyncToArray=T})(jf||(jf={}));function Br(i){if(jf.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(s){e.push(s)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function Kf(...i){return Ys(()=>Br(i))}function Ys(i){return{dispose:ww(()=>{i()})}}var Vf=class Gf{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{Br(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?Gf.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),void 0)}};Vf.DISABLE_DISPOSED_WARNING=!1;var sh=Vf,Vi=class{constructor(){this._store=new sh,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};Vi.None=Object.freeze({dispose(){}});var eo=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e}},bw=globalThis.performance&&typeof globalThis.performance.now=="function",yw=class Yf{static create(e){return new Yf(e)}constructor(e){this._now=bw&&e===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}},rh;(i=>{i.None=()=>Vi.None;func
Line truncated
|
||||
\`).slice(2).join(\`
|
||||
\`))}},Ew=class extends Error{constructor(e,t){super(e),this.name="ListenerLeakError",this.stack=t}},Lw=class extends Error{constructor(e,t){super(e),this.name="ListenerRefusalError",this.stack=t}},Tw=0,ca=class{constructor(e){this.value=e,this.id=Tw++}},Aw=2,Rw,ri=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new xw((e==null?void 0:e.onListenerError)??ha,((s=this._options)==null?void 0:s.leakWarningThreshold)??Cw):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new Sw(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new Lw(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||ha)(_),Vi.None}if(this._disposed)return Vi.None;t&&(e=e.bind(t));let r=new ca(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=kw.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof ca?(this._deliveryQueue??(this._deliveryQueue=new Mw),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=Ys(()=>{n==null||n(),this._removeListener(r)});return s instanceof sh?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*Aw<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||ha;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof ca)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},Mw=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},Qf=Object.freeze(function(i,e){let t=setTimeout(i.bind(e),0);return{dispose(){clearTimeout(t)}}}),Bw;(i=>{function e(t){return t===i.None||t===i.Cancelled||t instanceof Dw?!0:!t||typeof t!="object"?!1:typeof t.isCancellationRequested=="boolean"&&typeof t.onCancellationRequested=="function"}i.isCancellationToken=e,i.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:rh.None}),i.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:Qf})})(Bw||(Bw={}));var Dw=class{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?Qf:(this._emitter||(this._emitter=new ri),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}},Ns="en",da=!1,Cn,jn=Ns,ad=Ns,Pw,qt,_s=globalThis,rt,bu;typeof _s.vscode<"u"&&typeof _s.vscode.process<"u"?rt=_s.vscode.process:typeof process<"u"&&typeof((bu=process==null?void 0:process.versions)==null?void 0:bu.node)=="string"&&(rt=process);var yu,Iw=typeof((yu=rt==n
Line truncated
|
||||
\`))}},Ew=class extends Error{constructor(e,t){super(e),this.name="ListenerLeakError",this.stack=t}},Lw=class extends Error{constructor(e,t){super(e),this.name="ListenerRefusalError",this.stack=t}},Tw=0,ca=class{constructor(e){this.value=e,this.id=Tw++}},Aw=2,Rw,ri=class{constructor(e){var t,s,r,n;this._size=0,this._options=e,this._leakageMon=(t=this._options)!=null&&t.leakWarningThreshold?new xw((e==null?void 0:e.onListenerError)??ha,((s=this._options)==null?void 0:s.leakWarningThreshold)??Cw):void 0,this._perfMon=(r=this._options)!=null&&r._profName?new Sw(this._options._profName):void 0,this._deliveryQueue=(n=this._options)==null?void 0:n.deliveryQueue}dispose(){var e,t,s,r;this._disposed||(this._disposed=!0,((e=this._deliveryQueue)==null?void 0:e.current)===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),(s=(t=this._options)==null?void 0:t.onDidRemoveLastListener)==null||s.call(t),(r=this._leakageMon)==null||r.dispose())}get event(){return this._event??(this._event=(e,t,s)=>{var a,h,l,c,d;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let u=\`[\${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (\${this._size} vs \${this._leakageMon.threshold})\`;console.warn(u);let f=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],_=new Lw(\`\${u}. HINT: Stack shows most frequent listener (\${f[1]}-times)\`,f[0]);return(((a=this._options)==null?void 0:a.onListenerError)||ha)(_),Vi.None}if(this._disposed)return Vi.None;t&&(e=e.bind(t));let r=new ca(e),n;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(r.stack=kw.create(),n=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof ca?(this._deliveryQueue??(this._deliveryQueue=new Mw),this._listeners=[this._listeners,r]):this._listeners.push(r):((l=(h=this._options)==null?void 0:h.onWillAddFirstListener)==null||l.call(h,this),this._listeners=r,(d=(c=this._options)==null?void 0:c.onDidAddFirstListener)==null||d.call(c,this)),this._size++;let o=Ys(()=>{n==null||n(),this._removeListener(r)});return s instanceof sh?s.add(o):Array.isArray(s)&&s.push(o),o}),this._event}_removeListener(e){var n,o,a,h;if((o=(n=this._options)==null?void 0:n.onWillRemoveListener)==null||o.call(n,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(h=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||h.call(a,this),this._size=0;return}let t=this._listeners,s=t.indexOf(e);if(s===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[s]=void 0;let r=this._deliveryQueue.current===this;if(this._size*Aw<=t.length){let l=0;for(let c=0;c<t.length;c++)t[c]?t[l++]=t[c]:r&&(this._deliveryQueue.end--,l<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=l}}_deliver(e,t){var r;if(!e)return;let s=((r=this._options)==null?void 0:r.onListenerError)||ha;if(!s){e.value(t);return}try{e.value(t)}catch(n){s(n)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){var t,s,r,n;if((t=this._deliveryQueue)!=null&&t.current&&(this._deliverQueue(this._deliveryQueue),(s=this._perfMon)==null||s.stop()),(r=this._perfMon)==null||r.start(this._size),this._listeners)if(this._listeners instanceof ca)this._deliver(this._listeners,e);else{let o=this._deliveryQueue;o.enqueue(this,e,this._listeners.length),this._deliverQueue(o)}(n=this._perfMon)==null||n.stop()}hasListeners(){return this._size>0}},Mw=class{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}},Qf=Object.freeze(function(i,e){let t=setTimeout(i.bind(e),0);return{dispose(){clearTimeout(t)}}}),Bw;(i=>{function e(t){return t===i.None||t===i.Cancelled||t instanceof Dw?!0:!t||typeof t!="object"?!1:typeof t.isCancellationRequested=="boolean"&&typeof t.onCancellationRequested=="function"}i.isCancellationToken=e,i.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:rh.None}),i.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:Qf})})(Bw||(Bw={}));var Dw=class{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?Qf:(this._emitter||(this._emitter=new ri),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}},Ns="en",da=!1,Cn,jn=Ns,ad=Ns,Pw,qt,_s=globalThis,rt,bu;typeof _s.vscode<"u"&&typeof _s.vscode.process<"u"?rt=_s.vscode.process:typeof process<"u"&&typeof((bu=process==null?void 0:process.versions)==null?void 0:bu.node)=="string"&&(rt=process);var yu,Iw=typeof((yu=rt==n
Line truncated
|
||||
- \`)}const ue=E_("fs"),ki=E_("path");function E_(i){try{return require(i)}catch{return{}}}(function(i,e){for(const t of e)i[t+"Async"]=(...s)=>new Promise(r=>{i[t](...s,n=>r(!n))})})(ue,["rm","rmdir","unlink","access"]),function(i,e){for(const t of e)i[t+"Async"]=(...s)=>new Promise((r,n)=>{i[t](...s,(o,a)=>{o?n(o):r(a)})})}(ue,["stat","mkdir","readdir","close","open","realpath","write"]);class Dd{constructor(e,t,s,r,n){this.closed=!1,this.fd=null,this.pathId=e,this.absPath=t,this.relPath=s,this.dir=r,this.size=n}getPathId(){return this.pathId}getRelPath(){return this.relPath}isDir(){return this.dir}getSize(){return this.size}readFile(e){return W(this,void 0,void 0,function*(){if(this.closed)throw new G(\`File closed: \${this.absPath}\`,null,!0);this.fd===null&&(this.fd=yield ue.openAsync(this.absPath,"r"));const t=new Uint8Array(e);return function(s,r,n,o,a){return W(this,void 0,void 0,function*(){return new Promise((h,l)=>ue.read(s,r,n,o,a,(c,d,u)=>{c?l(c):h(u.subarray(0,d))}))})}(this.fd,t,0,t.length,null)})}closeFile(){return W(this,void 0,void 0,function*(){this.closed||(this.closed=!0,this.fd!==null&&(yield ue.closeAsync(this.fd),this.fd=null))})}}function L_(i,e,t,s,r,n){return W(this,void 0,void 0,function*(){if(!t.isDirectory()){if(!t.isFile())throw new G(\`Not a regular file: \${e}\`);if(!(yield ue.accessAsync(e,ue.constants.R_OK)))throw new G(\`No permission to read: \${e}\`);return void s.push(new Dd(i,e,r,!1,t.size))}const o=yield ue.realpathAsync(e);if(n.has(o))throw new G(\`Duplicate link: \${e}\`);n.add(o),s.push(new Dd(i,e,r,!0,0));const a=yield ue.readdirAsync(e);for(const h of a){const l=ki.join(e,h),c=yield ue.statAsync(l);yield L_(i,l,c,s,[...r,h],n)}})}function Pd(i){return W(this,arguments,void 0,function*(e,t=!1){if(!e||!e.length)return;const s=[],r=e.entries();for(const[n,o]of r){const a=ki.resolve(o);if(!(yield ue.accessAsync(a)))throw new G(\`No such file: \${a}\`);const h=yield ue.statAsync(a);if(!t&&h.isDirectory())throw new G(\`Is a directory: \${a}\`);const l=new Set;yield L_(n,a,h,s,[ki.basename(a)],l)}return s})}class Ta{constructor(e,t,s,r,n=!1){this.closed=!1,this.absPath=e,this.fileName=t,this.localName=s,this.fd=r,this.dir=n}getFileName(){return this.fileName}getLocalName(){return this.localName}isDir(){return this.dir}writeFile(e){return W(this,void 0,void 0,function*(){yield ue.writeAsync(this.fd,e)})}closeFile(){return W(this,void 0,void 0,function*(){this.closed||(this.closed=!0,this.fd!==null&&(yield ue.closeAsync(this.fd),this.fd=null))})}deleteFile(){return W(this,void 0,void 0,function*(){if(!this.absPath||!(yield ue.accessAsync(this.absPath)))return"";try{if(yield this.closeFile(),typeof ue.rm=="function"){if(yield ue.rmAsync(this.absPath,{recursive:!0}))return this.absPath}else if(this.isDir){if(yield ue.rmdirAsync(this.absPath,{recursive:!0}))return this.absPath}else if(yield ue.unlinkAsync(this.absPath))return this.absPath}catch(e){console.log(\`delete [\${this.absPath}] failed\`,e)}return""})}}function Id(i,e){return W(this,void 0,void 0,function*(){if(!(yield ue.accessAsync(ki.join(i,e))))return e;for(let t=0;t<1e3;t++){const s=\`\${e}.\${t}\`;if(!(yield ue.accessAsync(ki.join(i,s))))return s}throw new G("Fail to assign new file name")})}function $d(i){return W(this,void 0,void 0,function*(){try{return yield ue.openAsync(i,"w")}catch(e){throw e.errno===-13||e.errno===-4048?new G(\`No permission to write: \${i}\`):e.errno===-21||e.errno===-4068?new G(\`Is a directory: \${i}\`):e}})}function Od(i){return W(this,void 0,void 0,function*(){if(!(yield ue.accessAsync(i)))return yield ue.mkdirAsync(i,{recursive:!0,mode:493}),!0;if(!(yield ue.statAsync(i)).isDirectory())throw new G(\`Not a directory: \${i}\`);return!1})}function Z1(i,e,t,s){return W(this,void 0,void 0,function*(){if(!t)return function(h,l,c){return W(this,void 0,void 0,function*(){const d=c?l:yield Id(h,l),u=ki.join(h,d),f=yield $d(u);return new Ta(u,l,d,f)})}(i.path,e,s);const r=JSON.parse(e);if(!r.hasOwnProperty("path_name")||!r.hasOwnProperty("path_id")||!r.hasOwnProperty("is_dir")||r.path_name.length<1)throw new G(\`Invalid name: \${e}\`);let n,o;if(e=r.path_name[r.path_name.length-1],s?n=r.path_name[0]:i.maps.has(r.path_id)?n=i.maps.get(r.path_id):(n=yield Id(i.path,r.path_name[0]),i.maps.set(r.path_id,n)),r.path_name.length>1){const h=ki.join(i.path,n,...r.path_name.slice(1,r.path_name.length-1));yield Od(h),o=ki.join(h,e)}else o=ki.join(i.path,n);if(r.is_dir===!0){let h="";return(yield Od(o))&&(h=o),new Ta(h,e,n,null,!0)}const a=yield $d(o);return new Ta(o,e,n,a)})}class Zr{constructor(e,t,s,r){this.closed=!1,this.pos=0,this.pathId=e,this.relPath=t,this.file=s,this.dir=r}getPathId(){return this.pathId}getRelPath(){return this.relPath}isDir(){return this.dir}getSize(){return this.file.size}readFile(e){return W(this,void 0,void 0,function*(){if(this.pos>=this.file.size)return new Uint8Array(0);try{const t=Math.min(e.byteLength,this.file.size-this.pos),s=this.file.slice(this.pos,this.pos+t);re
Line truncated
|
||||
\`,this.writer=e,this.isWindowsShell=t,this.maxDataChunkSize=s}cleanup(){for(const e of this.openedFiles)e.closeFile()}addReceivedData(e){this.stopped||this.buffer.addBuffer(e),this.lastInputTime=Date.now()}stopTransferring(){return W(this,void 0,void 0,function*(){this.cleanTimeoutInMilliseconds=Math.max(2*this.maxChunkTimeInMilliseconds,500),this.stopped=!0,this.buffer.stopBuffer()})}cleanInput(e){return W(this,void 0,void 0,function*(){for(this.stopped=!0,this.buffer.drainBuffer(),this.lastInputTime=Date.now();;){const t=e-(Date.now()-this.lastInputTime);if(t<=0)return;yield new Promise(s=>setTimeout(s,t))}})}sendLine(e,t){return W(this,void 0,void 0,function*(){this.writer(\`#\${e}:\${t}\${this.protocolNewline}\`)})}recvLine(e){return W(this,arguments,void 0,function*(t,s=!1){if(this.stopped)throw new G("Stopped");if(this.isWindowsShell||this.remoteIsWindows){let n=yield this.buffer.readLineOnWindows();const o=n.lastIndexOf("#"+t+":");if(o>=0)n=n.substring(o);else{const a=n.lastIndexOf("#");a>0&&(n=n.substring(a))}return n}let r=yield this.buffer.readLine();if(this.tmuxOutputJunk||s){if(r.length>0)for(;r[r.length-1]==="\\r";)r=r.substring(0,r.length-1)+(yield this.buffer.readLine());const n=r.lastIndexOf("#"+t+":");if(n>=0)r=r.substring(n);else{const o=r.lastIndexOf("#");o>0&&(r=r.substring(o))}r=function(o){for(;;){const a=o.indexOf("\\x1BP=");if(a<0)return o;let h=a+3;const l=o.substring(h).indexOf("\\x1BP=");if(l<0)return o.substring(0,a);h+=l+3;const c=o.substring(h).indexOf("\\x1B\\\\");if(c<0)return o.substring(0,a);h+=c+2,o=o.substring(0,a)+o.substring(h)}}(r)}return r})}recvCheck(e){return W(this,arguments,void 0,function*(t,s=!1){const r=yield this.recvLine(t,s),n=r.indexOf(":");if(n<1)throw new G(La(r),"colon",!0);const o=r.substring(1,n),a=r.substring(n+1);if(o!=t)throw new G(a,o,!0);return a})}sendInteger(e,t){return W(this,void 0,void 0,function*(){yield this.sendLine(e,t.toString())})}recvInteger(e){return W(this,arguments,void 0,function*(t,s=!1){const r=yield this.recvCheck(t,s);return Number(r)})}checkInteger(e){return W(this,void 0,void 0,function*(){const t=yield this.recvInteger("SUCC");if(t!==e)throw new G(\`Integer check [\${t}] <> [\${e}]\`,null,!0)})}sendString(e,t){return W(this,void 0,void 0,function*(){yield this.sendLine(e,La(t))})}recvString(e){return W(this,arguments,void 0,function*(t,s=!1){return no(Pl(yield this.recvCheck(t,s)),"utf8")})}checkString(e){return W(this,void 0,void 0,function*(){const t=yield this.recvString("SUCC");if(t!==e)throw new G(\`String check [\${t}] <> [\${e}]\`,null,!0)})}sendBinary(e,t){return W(this,void 0,void 0,function*(){yield this.sendLine(e,La(t))})}recvBinary(e){return W(this,arguments,void 0,function*(t,s=!1){return Pl(yield this.recvCheck(t,s))})}checkBinary(e){return W(this,void 0,void 0,function*(){const t=yield this.recvBinary("SUCC");if(t.length!=e.length)throw new G(\`Binary length check [\${t.length}] <> [\${e.length}]\`,null,!0);for(let s=0;s<t.length;s++)if(t[s]!=e[s])throw new G(\`Binary check [\${t[s]}] <> [\${e[s]}]\`,null,!0)})}sendData(e,t,s){return W(this,void 0,void 0,function*(){if(!t)return void(yield this.sendBinary("DATA",e));const r=function(n,o){if(!o.length)return n;const a=new Uint8Array(2*n.length);let h=0;for(let l=0;l<n.length;l++){let c=-1;for(let d=0;d<o.length;d++)if(n[l]==o[d][0]){c=d;break}c<0?a[h++]=n[l]:(a[h++]=o[c][1],a[h++]=o[c][2])}return a.subarray(0,h)}(e,s);this.writer(\`#DATA:\${r.length}
|
||||
\`),this.writer(r)})}recvData(e,t,s){return W(this,void 0,void 0,function*(){return yield Promise.race([new Promise((r,n)=>setTimeout(()=>{this.cleanTimeoutInMilliseconds=3e3,n(new G("Receive data timeout"))},s)),W(this,void 0,void 0,function*(){if(!e)return yield this.recvBinary("DATA");const r=yield this.recvInteger("DATA");return function(n,o){if(!o.length)return n;const a=new Uint8Array(n.length);let h=0;for(let l=0;l<n.length;l++){let c=-1;if(l<n.length-1){for(let d=0;d<o.length;d++)if(n[l]==o[d][1]&&n[l+1]==o[d][2]){c=d;break}}c<0?a[h++]=n[l]:(a[h++]=o[c][0],l++)}return a.subarray(0,h)}(yield this.buffer.readBinary(r),t)})])})}sendAction(e,t){return W(this,void 0,void 0,function*(){const s={lang:"js",confirm:e,version:"1.1.6",support_dir:!0};(this.isWindowsShell||t)&&(s.binary=!1,s.newline=\`!
|
||||
@@ -285,7 +285,7 @@ void main() {
|
||||
<button class="delete-history-btn text-muted hover:text-error flex items-center justify-center p-0.5" title="Remove from history">
|
||||
<span class="material-symbols-outlined" style="font-size: 14px;">close</span>
|
||||
</button>
|
||||
\`,a.addEventListener("click",c=>{c.target.closest(".delete-history-btn")||this.fillConnection(n)}),a.querySelector(".delete-history-btn").addEventListener("click",c=>{c.stopPropagation(),this.deleteConnection(o)}),t.appendChild(a)})}async fillConnection(e){if(document.getElementById("host").value=e.host||"",document.getElementById("port").value=(e.port||22).toString(),document.getElementById("username").value=e.username||"",e.authMethod==="publickey"?this.setAuthMode("key"):this.setAuthMode("password"),e.encryptedCred){const t=await qd(e.encryptedCred);t?(document.getElementById("password").value=t.password||"",document.getElementById("private-key").value=t.privateKey||"",document.getElementById("remember-me").checked=!0):(document.getElementById("password").value="",document.getElementById("private-key").value="",document.getElementById("remember-me").checked=!1)}else document.getElementById("password").value="",document.getElementById("private-key").value="",document.getElementById("remember-me").checked=!1}deleteConnection(e){const t=localStorage.getItem("cloudssh_recent_connections");let s=[];try{s=t?JSON.parse(t):[]}catch{}e>=0&&e<s.length&&(s.splice(e,1),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(s)),this.renderRecentConnections())}async loadSavedCredentials(){const e=localStorage.getItem("cloudssh_recent_connections");let t=[];try{t=e?JSON.parse(e):[],Array.isArray(t)||(t=[])}catch{t=[]}const s=localStorage.getItem("cloudssh_cred");if(t.length===0&&s){const r=await qd(s);if(r){const n={id:\`\${r.username}@\${r.host}:\${r.port}\`,host:r.host,port:parseInt(r.port)||22,username:r.username,authMethod:r.authMethod==="publickey"?"publickey":"password",timestamp:Date.now(),encryptedCred:s};t.push(n),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(t)),localStorage.removeItem("cloudssh_cred")}}this.renderRecentConnections(),t.length>0&&this.fillConnection(t[0])}async handleConnect(){const t=document.getElementById("host").value.replace(/^\\[|\\]$/g,"").trim(),s=parseInt(document.getElementById("port").value||"22"),r=document.getElementById("username").value,n=document.getElementById("password").value,o=document.getElementById("private-key").value,a=document.getElementById("remember-me").checked;if(!t||!r){alert("请填写主机名和用户名");return}if(this.authMode==="password"&&!n){alert("请输入密码");return}if(this.authMode==="key"&&!o){alert("请粘贴私钥内容");return}if(this.turnstileEnabled&&!this.turnstileVerified){alert("请完成人机验证");return}let h;a&&(h=await ob({host:t,port:s.toString(),username:r,password:n,privateKey:this.authMode==="key"?o:void 0,authMethod:this.authMode==="key"?"publickey":"password"}));const l=localStorage.getItem("cloudssh_recent_connections");let c=[];try{c=l?JSON.parse(l):[],Array.isArray(c)||(c=[])}catch{}const d=\`\${r}@\${t}:\${s}\`,u={id:d,host:t,port:s,username:r,authMethod:this.authMode==="key"?"publickey":"password",timestamp:Date.now(),...h?{encryptedCred:h}:{}};c=c.filter(T=>T.id!==d),c.unshift(u),c.length>5&&(c=c.slice(0,5)),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(c)),this.renderRecentConnections();const f=this.options.getTabManager(),_=\`\${r}@\${t}\`;document.getElementById("auth-section").classList.add("hidden"),document.getElementById("terminal-section").classList.remove("hidden"),document.getElementById("terminal-section").classList.add("flex");const w=f.createTab(_,{host:t,port:s,username:r}),v=w.terminal;v.mount();try{const T=await B_(t,s);await v.connect({host:t,port:s,username:r,password:n,authMethod:this.authMode==="key"?"publickey":"password",privateKey:o,expectedFingerprint:T||void 0})}catch{f.closeTab(w.id),document.getElementById("status-text").innerHTML='<span class="w-2 h-2 bg-surface-dot inline-block"></span> STATUS: OFFLINE'}}}class lb{constructor(e,t,s){R(this,"user");R(this,"servers",[]);R(this,"onLogout");R(this,"onConnect");R(this,"editingServerId",null);R(this,"modalAuthMode","password");this.user=e,this.onLogout=t,this.onConnect=s,this.init()}async init(){this.renderUserInfo(),this.bindEvents(),await this.fetchServers();const e=document.getElementById("user-copyright-year");e&&(e.textContent=new Date().getFullYear().toString())}renderUserInfo(){const e=document.getElementById("user-info");if(!e)return;e.innerHTML="";const t=document.createElement("img");t.src=this.user.avatar_url,t.alt=this.user.username,t.className="user-avatar w-8 h-8",e.appendChild(t);const s=document.createElement("span");s.className="text-xs font-bold tracking-[0.1em] text-muted",s.textContent=this.user.username,e.appendChild(s)}bindEvents(){var e,t,s,r,n,o,a,h,l,c;(e=document.getElementById("logout-btn"))==null||e.addEventListener("click",()=>this.logout()),(t=document.getElementById("ai-config-btn"))==null||t.addEventListener("click",()=>{Oa(()=>Promise.resolve().then(()=>Gy),void 0).then(d=>d.showAIConfig())}),(s=document.getElementById("add-server-btn"))==null||s.addEvent
Line truncated
|
||||
\`,a.addEventListener("click",c=>{c.target.closest(".delete-history-btn")||this.fillConnection(n)}),a.querySelector(".delete-history-btn").addEventListener("click",c=>{c.stopPropagation(),this.deleteConnection(o)}),t.appendChild(a)})}async fillConnection(e){if(document.getElementById("host").value=e.host||"",document.getElementById("port").value=(e.port||22).toString(),document.getElementById("username").value=e.username||"",e.authMethod==="publickey"?this.setAuthMode("key"):this.setAuthMode("password"),e.encryptedCred){const t=await qd(e.encryptedCred);t?(document.getElementById("password").value=t.password||"",document.getElementById("private-key").value=t.privateKey||"",document.getElementById("remember-me").checked=!0):(document.getElementById("password").value="",document.getElementById("private-key").value="",document.getElementById("remember-me").checked=!1)}else document.getElementById("password").value="",document.getElementById("private-key").value="",document.getElementById("remember-me").checked=!1}deleteConnection(e){const t=localStorage.getItem("cloudssh_recent_connections");let s=[];try{s=t?JSON.parse(t):[]}catch{}e>=0&&e<s.length&&(s.splice(e,1),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(s)),this.renderRecentConnections())}async loadSavedCredentials(){const e=localStorage.getItem("cloudssh_recent_connections");let t=[];try{t=e?JSON.parse(e):[],Array.isArray(t)||(t=[])}catch{t=[]}const s=localStorage.getItem("cloudssh_cred");if(t.length===0&&s){const r=await qd(s);if(r){const n={id:\`\${r.username}@\${r.host}:\${r.port}\`,host:r.host,port:parseInt(r.port)||22,username:r.username,authMethod:r.authMethod==="publickey"?"publickey":"password",timestamp:Date.now(),encryptedCred:s};t.push(n),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(t)),localStorage.removeItem("cloudssh_cred")}}this.renderRecentConnections(),t.length>0&&this.fillConnection(t[0])}async handleConnect(){const t=document.getElementById("host").value.replace(/^\\[|\\]$/g,"").trim(),s=parseInt(document.getElementById("port").value||"22"),r=document.getElementById("username").value,n=document.getElementById("password").value,o=document.getElementById("private-key").value,a=document.getElementById("remember-me").checked;if(!t||!r){alert("请填写主机名和用户名");return}if(this.authMode==="password"&&!n){alert("请输入密码");return}if(this.authMode==="key"&&!o){alert("请粘贴私钥内容");return}if(this.turnstileEnabled&&!this.turnstileVerified){alert("请完成人机验证");return}let h;a&&(h=await ob({host:t,port:s.toString(),username:r,password:n,privateKey:this.authMode==="key"?o:void 0,authMethod:this.authMode==="key"?"publickey":"password"}));const l=localStorage.getItem("cloudssh_recent_connections");let c=[];try{c=l?JSON.parse(l):[],Array.isArray(c)||(c=[])}catch{}const d=\`\${r}@\${t}:\${s}\`,u={id:d,host:t,port:s,username:r,authMethod:this.authMode==="key"?"publickey":"password",timestamp:Date.now(),...h?{encryptedCred:h}:{}};c=c.filter(L=>L.id!==d),c.unshift(u),c.length>5&&(c=c.slice(0,5)),localStorage.setItem("cloudssh_recent_connections",JSON.stringify(c)),this.renderRecentConnections();const f=this.options.getTabManager(),_=\`\${r}@\${t}\`;document.getElementById("auth-section").classList.add("hidden"),document.getElementById("terminal-section").classList.remove("hidden"),document.getElementById("terminal-section").classList.add("flex");const w=f.createTab(_,{host:t,port:s,username:r}),v=w.terminal;v.mount();try{const L=await B_(t,s);await v.connect({host:t,port:s,username:r,password:n,authMethod:this.authMode==="key"?"publickey":"password",privateKey:o,expectedFingerprint:L||void 0})}catch{f.closeTab(w.id),document.getElementById("status-text").innerHTML='<span class="w-2 h-2 bg-surface-dot inline-block"></span> STATUS: OFFLINE'}}}class lb{constructor(e,t,s){R(this,"user");R(this,"servers",[]);R(this,"onLogout");R(this,"onConnect");R(this,"editingServerId",null);R(this,"modalAuthMode","password");this.user=e,this.onLogout=t,this.onConnect=s,this.init()}async init(){this.renderUserInfo(),this.bindEvents(),await this.fetchServers();const e=document.getElementById("user-copyright-year");e&&(e.textContent=new Date().getFullYear().toString())}renderUserInfo(){const e=document.getElementById("user-info");if(!e)return;e.innerHTML="";const t=document.createElement("img");t.src=this.user.avatar_url,t.alt=this.user.username,t.className="user-avatar w-8 h-8",e.appendChild(t);const s=document.createElement("span");s.className="text-xs font-bold tracking-[0.1em] text-muted",s.textContent=this.user.username,e.appendChild(s)}bindEvents(){var e,t,s,r,n,o,a,h,l,c;(e=document.getElementById("logout-btn"))==null||e.addEventListener("click",()=>this.logout()),(t=document.getElementById("ai-config-btn"))==null||t.addEventListener("click",()=>{Oa(()=>Promise.resolve().then(()=>Gy),void 0).then(d=>d.showAIConfig())}),(s=document.getElementById("add-server-btn"))==null||s.addEvent
Line truncated
|
||||
<div class="server-card p-5 relative group" id="card-\${e.id}">
|
||||
<div class="absolute top-0 left-0 w-full h-[2px] bg-gradient-to-r from-transparent via-[var(--border-strong)] to-transparent group-hover:via-[var(--accent)] transition-all duration-300"></div>
|
||||
|
||||
@@ -436,7 +436,7 @@ void main() {
|
||||
<span id="sftp-item-count"></span>
|
||||
</div>
|
||||
</div>
|
||||
\`,e}bindKeyboard(){document.addEventListener("keydown",this.keydownHandler)}bindEvents(){const e=this.container.querySelector("#sftp-close-btn"),t=this.container.querySelector("#sftp-back-btn"),s=this.container.querySelector("#sftp-home-btn"),r=this.container.querySelector("#sftp-refresh-btn"),n=this.container.querySelector("#sftp-go-btn"),o=this.container.querySelector("#sftp-upload-btn"),a=this.container.querySelector("#sftp-mkdir-btn"),h=this.container.querySelector("#sftp-download-btn"),l=this.container.querySelector("#sftp-delete-btn"),c=this.container.querySelector("#sftp-rename-btn"),d=this.container.querySelector("#sftp-transfer-cancel-btn"),u=this.container.querySelector("#sftp-file-input"),f=this.container.querySelector("#sftp-path-input");e.addEventListener("click",()=>this.hide()),t.addEventListener("click",()=>this.goBack()),s.addEventListener("click",()=>this.navigate("~")),r.addEventListener("click",()=>this.refresh()),n.addEventListener("click",()=>this.navigate(f.value)),f.addEventListener("keydown",w=>{w.key==="Enter"&&this.navigate(f.value)}),o.addEventListener("click",()=>u.click()),a.addEventListener("click",()=>this.showMkdirDialog()),h.addEventListener("click",()=>this.downloadSelected()),l.addEventListener("click",()=>this.deleteSelected()),c.addEventListener("click",()=>this.showRenameDialog()),d.addEventListener("click",()=>this.cancelCurrentTransfer()),u.addEventListener("change",w=>{const v=w.target.files;v&&v.length>0&&this.queueUploadFiles(Array.from(v)),u.value=""});const _=this.container.querySelector("#sftp-file-list");_.addEventListener("dragover",w=>{w.preventDefault(),w.stopPropagation(),_.classList.add("bg-surface-variant")}),_.addEventListener("dragleave",w=>{w.preventDefault(),_.classList.remove("bg-surface-variant")}),_.addEventListener("drop",w=>{var M;const v=w;v.preventDefault(),v.stopPropagation(),_.classList.remove("bg-surface-variant");const T=(M=v.dataTransfer)==null?void 0:M.files;T&&T.length>0&&this.queueUploadFiles(Array.from(T))})}show(){this.visible||(this.visible=!0,this.container.style.transform="translateX(0)",!this.sftpReady&&!this.initializing&&(this.initializing=!0,this.sendJSON({type:"sftp_init"}),this.showLoading()))}hide(){this.resetUploadQueue(),this.resetDownloadQueue(),this.visible=!1,this.container.style.transform="translateX(100%)",this.sendJSON({type:"sftp_close"}),this.closeWebSocket(1e3,"SFTP panel hidden"),this.initializing=!1,this.sftpReady=!1}toggle(){this.visible?this.hide():this.show()}isVisible(){return this.visible}handleSSHReady(){if(this.closeWebSocket(1e3,"SSH session refreshed"),this.resetUploadQueue(),this.resetDownloadQueue(),this.uploadWaiter.reset(),this.sftpReady=!1,this.downloadChunks=[],this.downloadFilename="",this.downloadSize=0,this.hideProgress(),this.hideError(),!this.visible){this.initializing=!1;return}this.initializing=!0,this.showLoading(),this.setStatus("Reconnecting SFTP..."),this.sendJSON({type:"sftp_init"})}sendJSON(e){this.sendRaw(JSON.stringify(e))}sendBinary(e){this.sendRaw(e)}sendRaw(e){var t;if(((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN){this.ws.send(e);return}this.pendingSends.push(e),this.ensureWebSocket()}async ensureWebSocket(){var t;if(((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN){this.flushPendingSends();return}if(this.connectingPromise)return this.connectingPromise;const e=this.getWebSocketUrl();if(!e){this.setStatus("Waiting for SFTP WebSocket..."),this.sftpWsRetryTimer||(this.sftpWsRetryTimer=setTimeout(()=>{this.sftpWsRetryTimer=null,this.ensureWebSocket()},200));return}this.connectingPromise=new Promise((s,r)=>{const n=new WebSocket(e);this.ws=n,n.binaryType="arraybuffer",n.onopen=()=>{this.connectingPromise=null,this.startHeartbeat(),this.flushPendingSends(),s()},n.onmessage=o=>{if(typeof o.data=="string"){try{this.handleMessage(JSON.parse(o.data))}catch{this.showError("Invalid SFTP response")}return}o.data instanceof ArrayBuffer&&this.handleBinaryData(new Uint8Array(o.data))},n.onerror=()=>{this.stopHeartbeat(),this.connectingPromise=null,this.initializing=!1,this.sftpReady=!1,this.pendingSends=[],this.rejectUploadWaiter("SFTP WebSocket error"),this.rejectDownloadWaiter("SFTP WebSocket error"),this.showError("SFTP WebSocket error"),r(new Error("SFTP WebSocket error"))},n.onclose=()=>{this.stopHeartbeat(),this.ws===n&&(this.ws=null),this.connectingPromise=null,this.closedByPanel.has(n)||(this.initializing=!1,this.sftpReady=!1,this.pendingSends=[],this.rejectUploadWaiter("SFTP connection closed"),this.rejectDownloadWaiter("SFTP connection closed"),this.visible&&this.showError("SFTP connection closed"))}});try{await this.connectingPromise}catch{}}startHeartbeat(){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{var e;((e=this.ws)==null?void 0:e.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"ping"}))},db)}stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}flushPendingSends(){var
Line truncated
|
||||
\`,e}bindKeyboard(){document.addEventListener("keydown",this.keydownHandler)}bindEvents(){const e=this.container.querySelector("#sftp-close-btn"),t=this.container.querySelector("#sftp-back-btn"),s=this.container.querySelector("#sftp-home-btn"),r=this.container.querySelector("#sftp-refresh-btn"),n=this.container.querySelector("#sftp-go-btn"),o=this.container.querySelector("#sftp-upload-btn"),a=this.container.querySelector("#sftp-mkdir-btn"),h=this.container.querySelector("#sftp-download-btn"),l=this.container.querySelector("#sftp-delete-btn"),c=this.container.querySelector("#sftp-rename-btn"),d=this.container.querySelector("#sftp-transfer-cancel-btn"),u=this.container.querySelector("#sftp-file-input"),f=this.container.querySelector("#sftp-path-input");e.addEventListener("click",()=>this.hide()),t.addEventListener("click",()=>this.goBack()),s.addEventListener("click",()=>this.navigate("~")),r.addEventListener("click",()=>this.refresh()),n.addEventListener("click",()=>this.navigate(f.value)),f.addEventListener("keydown",w=>{w.key==="Enter"&&this.navigate(f.value)}),o.addEventListener("click",()=>u.click()),a.addEventListener("click",()=>this.showMkdirDialog()),h.addEventListener("click",()=>this.downloadSelected()),l.addEventListener("click",()=>this.deleteSelected()),c.addEventListener("click",()=>this.showRenameDialog()),d.addEventListener("click",()=>this.cancelCurrentTransfer()),u.addEventListener("change",w=>{const v=w.target.files;v&&v.length>0&&this.queueUploadFiles(Array.from(v)),u.value=""});const _=this.container.querySelector("#sftp-file-list");_.addEventListener("dragover",w=>{w.preventDefault(),w.stopPropagation(),_.classList.add("bg-surface-variant")}),_.addEventListener("dragleave",w=>{w.preventDefault(),_.classList.remove("bg-surface-variant")}),_.addEventListener("drop",w=>{var M;const v=w;v.preventDefault(),v.stopPropagation(),_.classList.remove("bg-surface-variant");const L=(M=v.dataTransfer)==null?void 0:M.files;L&&L.length>0&&this.queueUploadFiles(Array.from(L))})}show(){this.visible||(this.visible=!0,this.container.style.transform="translateX(0)",!this.sftpReady&&!this.initializing&&(this.initializing=!0,this.sendJSON({type:"sftp_init"}),this.showLoading()))}hide(){this.resetUploadQueue(),this.resetDownloadQueue(),this.visible=!1,this.container.style.transform="translateX(100%)",this.sendJSON({type:"sftp_close"}),this.closeWebSocket(1e3,"SFTP panel hidden"),this.initializing=!1,this.sftpReady=!1}toggle(){this.visible?this.hide():this.show()}isVisible(){return this.visible}handleSSHReady(){if(this.closeWebSocket(1e3,"SSH session refreshed"),this.resetUploadQueue(),this.resetDownloadQueue(),this.uploadWaiter.reset(),this.sftpReady=!1,this.downloadChunks=[],this.downloadFilename="",this.downloadSize=0,this.hideProgress(),this.hideError(),!this.visible){this.initializing=!1;return}this.initializing=!0,this.showLoading(),this.setStatus("Reconnecting SFTP..."),this.sendJSON({type:"sftp_init"})}sendJSON(e){this.sendRaw(JSON.stringify(e))}sendBinary(e){this.sendRaw(e)}sendRaw(e){var t;if(((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN){this.ws.send(e);return}this.pendingSends.push(e),this.ensureWebSocket()}async ensureWebSocket(){var t;if(((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN){this.flushPendingSends();return}if(this.connectingPromise)return this.connectingPromise;const e=this.getWebSocketUrl();if(!e){this.setStatus("Waiting for SFTP WebSocket..."),this.sftpWsRetryTimer||(this.sftpWsRetryTimer=setTimeout(()=>{this.sftpWsRetryTimer=null,this.ensureWebSocket()},200));return}this.connectingPromise=new Promise((s,r)=>{const n=new WebSocket(e);this.ws=n,n.binaryType="arraybuffer",n.onopen=()=>{this.connectingPromise=null,this.startHeartbeat(),this.flushPendingSends(),s()},n.onmessage=o=>{if(typeof o.data=="string"){try{this.handleMessage(JSON.parse(o.data))}catch{this.showError("Invalid SFTP response")}return}o.data instanceof ArrayBuffer&&this.handleBinaryData(new Uint8Array(o.data))},n.onerror=()=>{this.stopHeartbeat(),this.connectingPromise=null,this.initializing=!1,this.sftpReady=!1,this.pendingSends=[],this.rejectUploadWaiter("SFTP WebSocket error"),this.rejectDownloadWaiter("SFTP WebSocket error"),this.showError("SFTP WebSocket error"),r(new Error("SFTP WebSocket error"))},n.onclose=()=>{this.stopHeartbeat(),this.ws===n&&(this.ws=null),this.connectingPromise=null,this.closedByPanel.has(n)||(this.initializing=!1,this.sftpReady=!1,this.pendingSends=[],this.rejectUploadWaiter("SFTP connection closed"),this.rejectDownloadWaiter("SFTP connection closed"),this.visible&&this.showError("SFTP connection closed"))}});try{await this.connectingPromise}catch{}}startHeartbeat(){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{var e;((e=this.ws)==null?void 0:e.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"ping"}))},db)}stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}flushPendingSends(){var
Line truncated
|
||||
<div class="sftp-entry flex items-center gap-2 px-3 py-1.5 hover:bg-surface-variant cursor-pointer transition-colors border-b border-outline-variant/30 text-[12px]"
|
||||
data-idx="\${n}" data-name="\${this.escapeHtml(r.name)}" data-type="\${r.type}">
|
||||
<span class="material-symbols-outlined shrink-0 \${r.isDir?"text-primary-container":r.isLink?"text-secondary-container":"text-on-surface-variant"}"
|
||||
@@ -455,9 +455,9 @@ void main() {
|
||||
<span class="material-symbols-outlined" style="font-size: 14px;">\${h.icon}</span>
|
||||
\${h.label}
|
||||
</div>
|
||||
\`).join(""),r.querySelectorAll("div").forEach((h,l)=>{h.addEventListener("click",()=>{n[l].action(),this.hideContextMenu()})}),document.body.appendChild(r);const a=h=>{r.contains(h.target)||(this.hideContextMenu(),document.removeEventListener("click",a))};setTimeout(()=>document.addEventListener("click",a),0)}hideContextMenu(){const e=document.getElementById("sftp-context-menu");e&&e.remove()}queueUploadFiles(e){const t=e.slice();if(t.length===0)return;const s=this.currentPath,r=this.uploadQueueGeneration;let n=0;for(const o of t){const a=this.uploadQueuePending>0;this.uploadQueuePending++,a&&(this.uploadQueuedFiles++,n++);const h=this.uploadQueueTail.then(async()=>{a&&(this.uploadQueuedFiles=Math.max(0,this.uploadQueuedFiles-1),this.setQueueStatus()),!(r!==this.uploadQueueGeneration||!this.visible)&&await this.uploadSingleFile(o,s)});this.uploadQueueTail=h.catch(l=>{this.showError("Upload failed: "+(l instanceof Error?l.message:String(l)))}).finally(()=>{r===this.uploadQueueGeneration&&(this.uploadQueuePending=Math.max(0,this.uploadQueuePending-1))})}n>0&&this.setQueueStatus(),this.uploadQueueTail}resetUploadQueue(){const e=this.uploadActive;this.uploadQueueGeneration++,this.uploadQueuePending=0,this.uploadQueuedFiles=0,this.uploadActive=!1,this.uploadCancelRequested=e,this.uploadCancelConfirmed=!0,this.uploadWaiter.reject("Upload cancelled"),this.resolveUploadCancelWaiter(),this.uploadQueueTail=Promise.resolve()}async uploadSingleFile(e,t){const s=t==="/"?\`/\${e.name}\`:\`\${t}/\${e.name}\`;let r=0,n=0;const o=jd*hb,a=e.stream().getReader();let h=null,l=0;this.uploadActive=!0,this.uploadCancelRequested=!1,this.uploadCancelConfirmed=!1,this.uploadCancelWaiter=null,this.setQueueStatus();try{const c=this.uploadWaiter.waitReady();if(this.sendJSON({type:"sftp_upload_start",path:s,size:e.size}),this.showProgress("Uploading: "+e.name,0),await c,this.uploadCancelRequested){await this.waitForUploadCancel();return}const d=async()=>{for(;!h||l>=h.length;){const{done:v,value:T}=await a.read();if(v)return null;h=T,l=0}const _=Math.min(l+jd,h.length),w=h.subarray(l,_);return l=_,w},u=async()=>{if(this.uploadCancelRequested)throw new Error("Upload cancelled");const _=await d();return _?(this.sendBinary(_),r+=_.length,!0):!1};for(;r<e.size&&r-n<o;){if(this.uploadCancelRequested){await this.waitForUploadCancel();return}if(!await u())throw new Error("File stream ended before upload completed")}for(;n<e.size;){if(n=await this.uploadWaiter.waitProgress(),this.uploadCancelRequested){await this.waitForUploadCancel();return}for(;r<e.size&&r-n<o;)if(!await u())throw new Error("File stream ended before upload completed")}const f=this.uploadWaiter.waitComplete();this.sendJSON({type:"sftp_upload_end"}),await f}catch(c){this.uploadCancelRequested?await this.waitForUploadCancel():(this.sendJSON({type:"sftp_upload_cancel"}),this.showError("Upload failed: "+(c instanceof Error?c.message:String(c)))),this.uploadWaiter.reset();return}finally{this.uploadActive=!1,this.uploadCancelRequested=!1,this.uploadCancelConfirmed=!1,this.uploadCancelWaiter=null,a.releaseLock()}}downloadSelected(){if(!this.selectedEntry||this.selectedEntry.isDir)return;const e=this.currentPath==="/"?\`/\${this.selectedEntry.name}\`:\`\${this.currentPath}/\${this.selectedEntry.name}\`;this.queueDownloadFile(e,this.selectedEntry.name)}queueDownloadFile(e,t){const s=this.downloadQueueGeneration,r=this.downloadQueuePending>0;this.downloadQueuePending++,r&&(this.downloadQueuedFiles++,this.setQueueStatus());const n=this.downloadQueueTail.then(async()=>{r&&(this.downloadQueuedFiles=Math.max(0,this.downloadQueuedFiles-1),this.setQueueStatus()),!(s!==this.downloadQueueGeneration||!this.visible)&&await this.downloadFile(e,t)});this.downloadQueueTail=n.catch(o=>{this.showError("Download failed: "+(o instanceof Error?o.message:String(o)))}).finally(()=>{s===this.downloadQueueGeneration&&(this.downloadQueuePending=Math.max(0,this.downloadQueuePending-1))}),this.downloadQueueTail}resetDownloadQueue(){this.downloadQueueGeneration++,this.downloadQueuePending=0,this.downloadQueuedFiles=0,this.downloadActive=!1,this.downloadCancelRequested=!1,this.downloadQueueTail=Promise.resolve(),this.rejectDownloadWaiter("Download cancelled")}async downloadFile(e,t){this.downloadActive=!0,this.downloadCancelRequested=!1,this.setQueueStatus(),this.downloadWaiter=new qs,this.downloadChunks=[],this.downloadFilename=t,this.downloadSize=0,this.sendJSON({type:"sftp_download",path:e}),this.showProgress("Downloading: "+t,0);try{await this.downloadWaiter.promise}catch{}finally{this.downloadActive=!1,this.downloadCancelRequested=!1}}onDownloadStart(e,t){this.downloadFilename=e,this.downloadSize=t,this.downloadChunks=[],this.showProgress("Downloading: "+e,0)}onDownloadProgress(e,t){this.updateProgress(e,t)}onDownloadDone(e){if(this.downloadCancelRequested||!this.downloadWaiter){this.downloadChunks=[],this.downloadFilename="",this.downloadActive=!1,this.downloadCancelRequested=!1,this.hideProgress(),th
Line truncated
|
||||
]\`).replace("lheading",$_).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Lb=/^\\\\([!"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_\`{|}~])/,Tb=/^(\`+)([^\`]|[^\`][\\s\\S]*?[^\`])\\1(?!\`)/,z_=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ab=/^(\`+|[^\`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[\`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,Xs=/[\\p{P}\\p{S}]/u,wo=/[\\s\\p{P}\\p{S}]/u,_h=/[^\\s\\p{P}\\p{S}]/u,Rb=re(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,wo).getRegex(),F_=/(?!~)[\\p{P}\\p{S}]/u,Mb=/(?!~)[\\s\\p{P}\\p{S}]/u,Bb=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Db=re(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]\`]|(?<a>\`+)[^\`]+\\k<a>(?!\`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",_b?"(?<!\`)()":"(^^|[^\`])").replace("code",/(?<b>\`+)[^\`]+\\k<b>(?!\`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),N_=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Pb=re(N_,"u").replace(/punct/g,Xs).getRegex(),Ib=re(N_,"u").replace(/punct/g,F_).getRegex(),W_="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",$b=re(W_,"gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Ob=re(W_,"gu").replace(/notPunctSpace/g,Bb).replace(/punctSpace/g,Mb).replace(/punct/g,F_).getRegex(),zb=re("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Fb=re(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,Xs).getRegex(),Nb="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Wb=re(Nb,"gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Hb=re(/\\\\(punct)/,"gu").replace(/punct/g,Xs).getRegex(),Ub=re(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_\`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),qb=re(uh).replace("(?:-->|$)","-->").getRegex(),jb=re("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",qb).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s"'=<>\`]+)?/).getRegex(),ao=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|\`+(?!\`)[^\`]*?\`+(?!\`)|\`\`+(?=\\])|[^\\[\\]\\\\\`])*?/,Kb=re(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",ao).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),H_=re(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",ao).replace("ref",dh).getRegex(),U_=re(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",dh).getRegex(),Vb=re("reflink|nolink(?!\\\\()","g").replace("reflink",H_).replace("nolink",U_).getRegex(),Vd=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ph={_backpedal:ns,anyPunctuation:Hb,autolink:Ub,blockSkip:Db,br:z_,code:Tb,del:ns,delLDelim:ns,delRDelim:ns,emStrongLDelim:Pb,emStrongRDelimAst:$b,emStrongRDelimUnd:zb,escape:Lb,link:Kb,nolink:U_,punctuation:Rb,reflink:H_,reflinkSearch:Vb,tag:jb,text:Ab,url:ns},Gb={...ph,link:re(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",ao).getRegex(),reflink:re(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",ao).getRegex()},Ol={...ph,emStrongRDelimAst:Ob,emStrongLDelim:Ib,delLDelim:Fb,delRDelim:Wb,url:re(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",Vd).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:re(/^([\`~]+|[^\`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[\`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-]+@)))/).replace("protocol",Vd).getRegex()},Yb={...Ol,br:re(z_).replace("{2,}","*").getRegex(),text:re(Ol.text).replace("\\\\b_","\\\\b_|
Line truncated
|
||||
\`),t=e.length-1;for(;t>=0&&ct.blankLine.test(e[t]);)t--;return e.length-t<=2?i:e.slice(0,t+1).join(\`
|
||||
\`).join(""),r.querySelectorAll("div").forEach((h,l)=>{h.addEventListener("click",()=>{n[l].action(),this.hideContextMenu()})}),document.body.appendChild(r);const a=h=>{r.contains(h.target)||(this.hideContextMenu(),document.removeEventListener("click",a))};setTimeout(()=>document.addEventListener("click",a),0)}hideContextMenu(){const e=document.getElementById("sftp-context-menu");e&&e.remove()}queueUploadFiles(e){const t=e.slice();if(t.length===0)return;const s=this.currentPath,r=this.uploadQueueGeneration;let n=0;for(const o of t){const a=this.uploadQueuePending>0;this.uploadQueuePending++,a&&(this.uploadQueuedFiles++,n++);const h=this.uploadQueueTail.then(async()=>{a&&(this.uploadQueuedFiles=Math.max(0,this.uploadQueuedFiles-1),this.setQueueStatus()),!(r!==this.uploadQueueGeneration||!this.visible)&&await this.uploadSingleFile(o,s)});this.uploadQueueTail=h.catch(l=>{this.showError("Upload failed: "+(l instanceof Error?l.message:String(l)))}).finally(()=>{r===this.uploadQueueGeneration&&(this.uploadQueuePending=Math.max(0,this.uploadQueuePending-1))})}n>0&&this.setQueueStatus(),this.uploadQueueTail}resetUploadQueue(){const e=this.uploadActive;this.uploadQueueGeneration++,this.uploadQueuePending=0,this.uploadQueuedFiles=0,this.uploadActive=!1,this.uploadCancelRequested=e,this.uploadCancelConfirmed=!0,this.uploadWaiter.reject("Upload cancelled"),this.resolveUploadCancelWaiter(),this.uploadQueueTail=Promise.resolve()}async uploadSingleFile(e,t){const s=t==="/"?\`/\${e.name}\`:\`\${t}/\${e.name}\`;let r=0,n=0;const o=jd*hb,a=e.stream().getReader();let h=null,l=0;this.uploadActive=!0,this.uploadCancelRequested=!1,this.uploadCancelConfirmed=!1,this.uploadCancelWaiter=null,this.setQueueStatus();try{const c=this.uploadWaiter.waitReady();if(this.sendJSON({type:"sftp_upload_start",path:s,size:e.size}),this.showProgress("Uploading: "+e.name,0),await c,this.uploadCancelRequested){await this.waitForUploadCancel();return}const d=async()=>{for(;!h||l>=h.length;){const{done:v,value:L}=await a.read();if(v)return null;h=L,l=0}const _=Math.min(l+jd,h.length),w=h.subarray(l,_);return l=_,w},u=async()=>{if(this.uploadCancelRequested)throw new Error("Upload cancelled");const _=await d();return _?(this.sendBinary(_),r+=_.length,!0):!1};for(;r<e.size&&r-n<o;){if(this.uploadCancelRequested){await this.waitForUploadCancel();return}if(!await u())throw new Error("File stream ended before upload completed")}for(;n<e.size;){if(n=await this.uploadWaiter.waitProgress(),this.uploadCancelRequested){await this.waitForUploadCancel();return}for(;r<e.size&&r-n<o;)if(!await u())throw new Error("File stream ended before upload completed")}const f=this.uploadWaiter.waitComplete();this.sendJSON({type:"sftp_upload_end"}),await f}catch(c){this.uploadCancelRequested?await this.waitForUploadCancel():(this.sendJSON({type:"sftp_upload_cancel"}),this.showError("Upload failed: "+(c instanceof Error?c.message:String(c)))),this.uploadWaiter.reset();return}finally{this.uploadActive=!1,this.uploadCancelRequested=!1,this.uploadCancelConfirmed=!1,this.uploadCancelWaiter=null,a.releaseLock()}}downloadSelected(){if(!this.selectedEntry||this.selectedEntry.isDir)return;const e=this.currentPath==="/"?\`/\${this.selectedEntry.name}\`:\`\${this.currentPath}/\${this.selectedEntry.name}\`;this.queueDownloadFile(e,this.selectedEntry.name)}queueDownloadFile(e,t){const s=this.downloadQueueGeneration,r=this.downloadQueuePending>0;this.downloadQueuePending++,r&&(this.downloadQueuedFiles++,this.setQueueStatus());const n=this.downloadQueueTail.then(async()=>{r&&(this.downloadQueuedFiles=Math.max(0,this.downloadQueuedFiles-1),this.setQueueStatus()),!(s!==this.downloadQueueGeneration||!this.visible)&&await this.downloadFile(e,t)});this.downloadQueueTail=n.catch(o=>{this.showError("Download failed: "+(o instanceof Error?o.message:String(o)))}).finally(()=>{s===this.downloadQueueGeneration&&(this.downloadQueuePending=Math.max(0,this.downloadQueuePending-1))}),this.downloadQueueTail}resetDownloadQueue(){this.downloadQueueGeneration++,this.downloadQueuePending=0,this.downloadQueuedFiles=0,this.downloadActive=!1,this.downloadCancelRequested=!1,this.downloadQueueTail=Promise.resolve(),this.rejectDownloadWaiter("Download cancelled")}async downloadFile(e,t){this.downloadActive=!0,this.downloadCancelRequested=!1,this.setQueueStatus(),this.downloadWaiter=new qs,this.downloadChunks=[],this.downloadFilename=t,this.downloadSize=0,this.sendJSON({type:"sftp_download",path:e}),this.showProgress("Downloading: "+t,0);try{await this.downloadWaiter.promise}catch{}finally{this.downloadActive=!1,this.downloadCancelRequested=!1}}onDownloadStart(e,t){this.downloadFilename=e,this.downloadSize=t,this.downloadChunks=[],this.showProgress("Downloading: "+e,0)}onDownloadProgress(e,t){this.updateProgress(e,t)}onDownloadDone(e){if(this.downloadCancelRequested||!this.downloadWaiter){this.downloadChunks=[],this.downloadFilename="",this.downloadActive=!1,this.downloadCancelRequested=!1,this.hideProgress(),th
Line truncated
|
||||
]\`).replace("lheading",$_).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Lb=/^\\\\([!"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_\`{|}~])/,Tb=/^(\`+)([^\`]|[^\`][\\s\\S]*?[^\`])\\1(?!\`)/,z_=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ab=/^(\`+|[^\`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[\`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,Xs=/[\\p{P}\\p{S}]/u,wo=/[\\s\\p{P}\\p{S}]/u,_h=/[^\\s\\p{P}\\p{S}]/u,Rb=re(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,wo).getRegex(),F_=/(?!~)[\\p{P}\\p{S}]/u,Mb=/(?!~)[\\s\\p{P}\\p{S}]/u,Bb=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Db=re(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]\`]|(?<a>\`+)[^\`]+\\k<a>(?!\`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",_b?"(?<!\`)()":"(^^|[^\`])").replace("code",/(?<b>\`+)[^\`]+\\k<b>(?!\`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),N_=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Pb=re(N_,"u").replace(/punct/g,Xs).getRegex(),Ib=re(N_,"u").replace(/punct/g,F_).getRegex(),W_="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",$b=re(W_,"gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Ob=re(W_,"gu").replace(/notPunctSpace/g,Bb).replace(/punctSpace/g,Mb).replace(/punct/g,F_).getRegex(),zb=re("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Fb=re(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,Xs).getRegex(),Nb="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Wb=re(Nb,"gu").replace(/notPunctSpace/g,_h).replace(/punctSpace/g,wo).replace(/punct/g,Xs).getRegex(),Hb=re(/\\\\(punct)/,"gu").replace(/punct/g,Xs).getRegex(),Ub=re(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_\`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),qb=re(uh).replace("(?:-->|$)","-->").getRegex(),jb=re("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",qb).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s"'=<>\`]+)?/).getRegex(),ao=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|\`+(?!\`)[^\`]*?\`+(?!\`)|\`\`+(?=\\])|[^\\[\\]\\\\\`])*?/,Kb=re(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",ao).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),H_=re(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",ao).replace("ref",dh).getRegex(),U_=re(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",dh).getRegex(),Vb=re("reflink|nolink(?!\\\\()","g").replace("reflink",H_).replace("nolink",U_).getRegex(),Vd=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ph={_backpedal:ns,anyPunctuation:Hb,autolink:Ub,blockSkip:Db,br:z_,code:Tb,del:ns,delLDelim:ns,delRDelim:ns,emStrongLDelim:Pb,emStrongRDelimAst:$b,emStrongRDelimUnd:zb,escape:Lb,link:Kb,nolink:U_,punctuation:Rb,reflink:H_,reflinkSearch:Vb,tag:jb,text:Ab,url:ns},Gb={...ph,link:re(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",ao).getRegex(),reflink:re(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",ao).getRegex()},Ol={...ph,emStrongRDelimAst:Ob,emStrongLDelim:Ib,delLDelim:Fb,delRDelim:Wb,url:re(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",Vd).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:re(/^([\`~]+|[^\`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[\`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_\`{\\|}~-]+@)))/).replace("protocol",Vd).getRegex()},Yb={...Ol,br:re(z_).replace("{2,}","*").getRegex(),text:re(Ol.text).replace("\\\\b_","\\\\b_|
Line truncated
|
||||
\`),t=e.length-1;for(;t>=0&&dt.blankLine.test(e[t]);)t--;return e.length-t<=2?i:e.slice(0,t+1).join(\`
|
||||
\`)}function Xb(i,e){if(i.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<i.length;s++)if(i[s]==="\\\\")s++;else if(i[s]===e[0])t++;else if(i[s]===e[1]&&(t--,t<0))return s;return t>0?-2:-1}function Jb(i,e=0){let t=e,s="";for(let r of i)if(r===" "){let n=4-t%4;s+=" ".repeat(n),t+=n}else s+=r,t++;return s}function Jd(i,e,t,s,r){let n=e.href,o=e.title||null,a=i[1].replace(r.other.outputLinkReplace,"$1");s.state.inLink=!0;let h={type:i[0].charAt(0)==="!"?"image":"link",raw:t,href:n,title:o,text:a,tokens:s.inlineTokens(a)};return s.state.inLink=!1,h}function Qb(i,e,t){let s=i.match(t.other.indentCodeCompensation);if(s===null)return e;let r=s[1];return e.split(\`
|
||||
\`).map(n=>{let o=n.match(t.other.beginningSpace);if(o===null)return n;let[a]=o;return a.length>=r.length?n.slice(r.length):n}).join(\`
|
||||
\`)}var lo=class{constructor(i){R(this,"options");R(this,"rules");R(this,"lexer");this.options=i||ys}space(i){let e=this.rules.block.newline.exec(i);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(i){let e=this.rules.block.code.exec(i);if(e){let t=this.options.pedantic?e[0]:Xd(e[0]),s=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:s}}}fences(i){let e=this.rules.block.fences.exec(i);if(e){let t=e[0],s=Qb(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(i){let e=this.rules.block.heading.exec(i);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let s=Ii(t,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(t=s.trim())}return{type:"heading",raw:Ii(e[0],\`
|
||||
@@ -476,17 +476,17 @@ void main() {
|
||||
\`);continue}}return{type:"blockquote",raw:s,tokens:n,text:r}}}list(i){let e=this.rules.block.list.exec(i);if(e){let t=e[1].trim(),s=t.length>1,r={type:"list",raw:"",ordered:s,start:s?+t.slice(0,-1):"",loose:!1,items:[]};t=s?\`\\\\d{1,9}\\\\\${t.slice(-1)}\`:\`\\\\\${t}\`,this.options.pedantic&&(t=s?t:"[*+-]");let n=this.rules.other.listItemRegex(t),o=!1;for(;i;){let h=!1,l="",c="";if(!(e=n.exec(i))||this.rules.block.hr.test(i))break;l=e[0],i=i.substring(l.length);let d=Jb(e[2].split(\`
|
||||
\`,1)[0],e[1].length),u=i.split(\`
|
||||
\`,1)[0],f=!d.trim(),_=0;if(this.options.pedantic?(_=2,c=d.trimStart()):f?_=e[1].length+1:(_=d.search(this.rules.other.nonSpaceChar),_=_>4?1:_,c=d.slice(_),_+=e[1].length),f&&this.rules.other.blankLine.test(u)&&(l+=u+\`
|
||||
\`,i=i.substring(u.length+1),h=!0),!h){let w=this.rules.other.nextBulletRegex(_),v=this.rules.other.hrRegex(_),T=this.rules.other.fencesBeginRegex(_),M=this.rules.other.headingBeginRegex(_),L=this.rules.other.htmlBeginRegex(_),p=this.rules.other.blockquoteBeginRegex(_);for(;i;){let E=i.split(\`
|
||||
\`,1)[0],C;if(u=E,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),C=u):C=u.replace(this.rules.other.tabCharGlobal," "),T.test(u)||M.test(u)||L.test(u)||p.test(u)||w.test(u)||v.test(u))break;if(C.search(this.rules.other.nonSpaceChar)>=_||!u.trim())c+=\`
|
||||
\`+C.slice(_);else{if(f||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||T.test(d)||M.test(d)||v.test(d))break;c+=\`
|
||||
\`,i=i.substring(u.length+1),h=!0),!h){let w=this.rules.other.nextBulletRegex(_),v=this.rules.other.hrRegex(_),L=this.rules.other.fencesBeginRegex(_),M=this.rules.other.headingBeginRegex(_),T=this.rules.other.htmlBeginRegex(_),p=this.rules.other.blockquoteBeginRegex(_);for(;i;){let E=i.split(\`
|
||||
\`,1)[0],C;if(u=E,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),C=u):C=u.replace(this.rules.other.tabCharGlobal," "),L.test(u)||M.test(u)||T.test(u)||p.test(u)||w.test(u)||v.test(u))break;if(C.search(this.rules.other.nonSpaceChar)>=_||!u.trim())c+=\`
|
||||
\`+C.slice(_);else{if(f||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||L.test(d)||M.test(d)||v.test(d))break;c+=\`
|
||||
\`+u}f=!u.trim(),l+=E+\`
|
||||
\`,i=i.substring(E.length+1),d=C.slice(_)}}r.loose||(o?r.loose=!0:this.rules.other.doubleBlankLine.test(l)&&(o=!0)),r.items.push({type:"list_item",raw:l,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=l}let a=r.items.at(-1);if(a)a.raw=a.raw.trimEnd(),a.text=a.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let h of r.items){this.lexer.state.top=!1,h.tokens=this.lexer.blockTokens(h.text,[]);let l=h.tokens[0];if(h.task&&((l==null?void 0:l.type)==="text"||(l==null?void 0:l.type)==="paragraph")){h.text=h.text.replace(this.rules.other.listReplaceTask,""),l.raw=l.raw.replace(this.rules.other.listReplaceTask,""),l.text=l.text.replace(this.rules.other.listReplaceTask,"");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,"");break}let c=this.rules.other.listTaskCheckbox.exec(h.raw);if(c){let d={type:"checkbox",raw:c[0]+" ",checked:c[0]!=="[ ]"};h.checked=d.checked,r.loose?h.tokens[0]&&["paragraph","text"].includes(h.tokens[0].type)&&"tokens"in h.tokens[0]&&h.tokens[0].tokens?(h.tokens[0].raw=d.raw+h.tokens[0].raw,h.tokens[0].text=d.raw+h.tokens[0].text,h.tokens[0].tokens.unshift(d)):h.tokens.unshift({type:"paragraph",raw:d.raw,text:d.raw,tokens:[d]}):h.tokens.unshift(d)}}else h.task&&(h.task=!1);if(!r.loose){let c=h.tokens.filter(u=>u.type==="space"),d=c.length>0&&c.some(u=>this.rules.other.anyLine.test(u.raw));r.loose=d}}if(r.loose)for(let h of r.items){h.loose=!0;for(let l of h.tokens)l.type==="text"&&(l.type="paragraph")}return r}}html(i){let e=this.rules.block.html.exec(i);if(e){let t=Xd(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(i){let e=this.rules.block.def.exec(i);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:Ii(e[0],\`
|
||||
\`),href:s,title:r}}}table(i){var o;let e=this.rules.block.table.exec(i);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=Zd(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),r=(o=e[3])!=null&&o.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(\`
|
||||
\`):[],n={type:"table",raw:Ii(e[0],\`
|
||||
\`),header:[],align:[],rows:[]};if(t.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?n.align.push("right"):this.rules.other.tableAlignCenter.test(a)?n.align.push("center"):this.rules.other.tableAlignLeft.test(a)?n.align.push("left"):n.align.push(null);for(let a=0;a<t.length;a++)n.header.push({text:t[a],tokens:this.lexer.inline(t[a]),header:!0,align:n.align[a]});for(let a of r)n.rows.push(Zd(a,n.header.length).map((h,l)=>({text:h,tokens:this.lexer.inline(h),header:!1,align:n.align[l]})));return n}}lheading(i){let e=this.rules.block.lheading.exec(i);if(e){let t=e[1].trim();return{type:"heading",raw:Ii(e[0],\`
|
||||
\`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(i){let e=this.rules.block.paragraph.exec(i);if(e){let t=e[1].charAt(e[1].length-1)===\`
|
||||
\`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(i){let e=this.rules.block.text.exec(i);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(i){let e=this.rules.inline.escape.exec(i);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(i){let e=this.rules.inline.tag.exec(i);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(i){let e=this.rules.inline.link.exec(i);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let n=Ii(t.slice(0,-1),"\\\\");if((t.length-n.length)%2===0)return}else{let n=Xb(e[2],"()");if(n===-2)return;if(n>-1){let o=(e[0].indexOf("!")===0?5:4)+e[1].length+n;e[2]=e[2].substring(0,n),e[0]=e[0].substring(0,o).trim(),e[3]=""}}let s=e[2],r="";if(this.options.pedantic){let n=this.rules.other.pedanticHrefTitle.exec(s);n&&(s=n[1],r=n[3])}else r=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),Jd(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(i,e){let t;if((t=this.rules.inline.reflink.exec(i))||(t=this.rules.inline.nolink.exec(i))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=e[s.toLowerCase()];if(!r){let n=t[0].charAt(0);return{type:"text",raw:n,text:n}}return Jd(t,r,t[0],this.lexer,this.rules)}}emStrong(i,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(i);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let r=[...s[0]].length-1,n,o,a=r,h=0,l=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*i.length+r);(s=l.exec(e))!==null;){if(n=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!n)continue;if(o=[...n].length,s[3]||s[4]){a+=o;continue}else if((s[5]||s[6])&&r%3&&!((r+o)%3)){h+=o;continue}if(a-=o,a>0)continue;o=Math.min(o,o+a+h);let c=[...s[0]][0].length,d=i.slice(0,r+s.index+c+o);if(Math.min(r,o)%2){let f=d.slice(1,-1);return{type:"em",raw:d,text:f,tokens:this.lexer.inlineTokens(f)}}let u=d.slice(2,-2);return{type:"strong",raw:d,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(i){let e=this.rules.inline.code.exec(i);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),r=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&r&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(i){let e=this.rules.inline.br.exec(i);if(e)return{type:"br",raw:e[0]}}del(i,e,t=""){let s=this.rules.inline.delLDelim.exec(i);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let r=[...s[0]].length-1,n,o,a=r,h=this.rules.inline.delRDelim;for(h.lastIndex=0,e=e.slice(-1*i.length+r);(s=h.exec(e))!==null;){if(n=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!n||(o=[...n].length,o!==r))continue;if(s[3]||s[4]){a+=o;continue}if(a-=o,a>0)continue;o=Math.min(o,o+a);let l=[...s[0]][0].length,c=i.slice(0,r+s.index+l+o),d=c.slice(r,-r);return{type:"del",raw:c,text:d,tokens:this.lexer.inlineTokens(d)}}}}autolink(i){let e=this.rules.inline.autolink.exec(i);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(i){var t;let e;if(e=this.rules.inline.url.exec(i)){let s,r;if(e[2]==="@")s=e[0],r="mailto:"+s;else{let n;do n=e[0],e[0]=((t=this.rules.inline._backpedal.exec(e[0]))==null?void 0:t[0])??"";while(n!==e[0]);s=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:s,href:r,tokens:[{type:"text",raw:s,text:s}]}}}inlineText(i){let e=this.rules.inline.text.exec(i);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},jt=class zl{constructor(e){R(this,"tokens");R(this,"options");R(this,"state");R(this,"inlineQueue");R(this,"tokenizer");this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ys,this.options.tokenizer=this.options.tokenizer||new lo,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:ct,block:Bn.normal,inline:gr.normal};this.options.pedantic?(t.block=Bn.pedantic,t.inline=gr.pedantic)
Line truncated
|
||||
\`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){var n,o,a;this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(ct.tabCharGlobal," ").replace(ct.spaceLine,""));let r=1/0;for(;e;){if(e.length<r)r=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let h;if((o=(n=this.options.extensions)==null?void 0:n.block)!=null&&o.some(c=>(h=c.call({lexer:this},e,t))?(e=e.substring(h.raw.length),t.push(h),!0):!1))continue;if(h=this.tokenizer.space(e)){e=e.substring(h.raw.length);let c=t.at(-1);h.raw.length===1&&c!==void 0?c.raw+=\`
|
||||
\`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(i){let e=this.rules.block.text.exec(i);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(i){let e=this.rules.inline.escape.exec(i);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(i){let e=this.rules.inline.tag.exec(i);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(i){let e=this.rules.inline.link.exec(i);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let n=Ii(t.slice(0,-1),"\\\\");if((t.length-n.length)%2===0)return}else{let n=Xb(e[2],"()");if(n===-2)return;if(n>-1){let o=(e[0].indexOf("!")===0?5:4)+e[1].length+n;e[2]=e[2].substring(0,n),e[0]=e[0].substring(0,o).trim(),e[3]=""}}let s=e[2],r="";if(this.options.pedantic){let n=this.rules.other.pedanticHrefTitle.exec(s);n&&(s=n[1],r=n[3])}else r=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),Jd(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(i,e){let t;if((t=this.rules.inline.reflink.exec(i))||(t=this.rules.inline.nolink.exec(i))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=e[s.toLowerCase()];if(!r){let n=t[0].charAt(0);return{type:"text",raw:n,text:n}}return Jd(t,r,t[0],this.lexer,this.rules)}}emStrong(i,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(i);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let r=[...s[0]].length-1,n,o,a=r,h=0,l=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*i.length+r);(s=l.exec(e))!==null;){if(n=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!n)continue;if(o=[...n].length,s[3]||s[4]){a+=o;continue}else if((s[5]||s[6])&&r%3&&!((r+o)%3)){h+=o;continue}if(a-=o,a>0)continue;o=Math.min(o,o+a+h);let c=[...s[0]][0].length,d=i.slice(0,r+s.index+c+o);if(Math.min(r,o)%2){let f=d.slice(1,-1);return{type:"em",raw:d,text:f,tokens:this.lexer.inlineTokens(f)}}let u=d.slice(2,-2);return{type:"strong",raw:d,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(i){let e=this.rules.inline.code.exec(i);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),r=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&r&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(i){let e=this.rules.inline.br.exec(i);if(e)return{type:"br",raw:e[0]}}del(i,e,t=""){let s=this.rules.inline.delLDelim.exec(i);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let r=[...s[0]].length-1,n,o,a=r,h=this.rules.inline.delRDelim;for(h.lastIndex=0,e=e.slice(-1*i.length+r);(s=h.exec(e))!==null;){if(n=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!n||(o=[...n].length,o!==r))continue;if(s[3]||s[4]){a+=o;continue}if(a-=o,a>0)continue;o=Math.min(o,o+a);let l=[...s[0]][0].length,c=i.slice(0,r+s.index+l+o),d=c.slice(r,-r);return{type:"del",raw:c,text:d,tokens:this.lexer.inlineTokens(d)}}}}autolink(i){let e=this.rules.inline.autolink.exec(i);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(i){var t;let e;if(e=this.rules.inline.url.exec(i)){let s,r;if(e[2]==="@")s=e[0],r="mailto:"+s;else{let n;do n=e[0],e[0]=((t=this.rules.inline._backpedal.exec(e[0]))==null?void 0:t[0])??"";while(n!==e[0]);s=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:s,href:r,tokens:[{type:"text",raw:s,text:s}]}}}inlineText(i){let e=this.rules.inline.text.exec(i);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},jt=class zl{constructor(e){R(this,"tokens");R(this,"options");R(this,"state");R(this,"inlineQueue");R(this,"tokenizer");this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ys,this.options.tokenizer=this.options.tokenizer||new lo,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:dt,block:Bn.normal,inline:gr.normal};this.options.pedantic?(t.block=Bn.pedantic,t.inline=gr.pedantic)
Line truncated
|
||||
\`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){var n,o,a;this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(dt.tabCharGlobal," ").replace(dt.spaceLine,""));let r=1/0;for(;e;){if(e.length<r)r=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let h;if((o=(n=this.options.extensions)==null?void 0:n.block)!=null&&o.some(c=>(h=c.call({lexer:this},e,t))?(e=e.substring(h.raw.length),t.push(h),!0):!1))continue;if(h=this.tokenizer.space(e)){e=e.substring(h.raw.length);let c=t.at(-1);h.raw.length===1&&c!==void 0?c.raw+=\`
|
||||
\`:t.push(h);continue}if(h=this.tokenizer.code(e)){e=e.substring(h.raw.length);let c=t.at(-1);(c==null?void 0:c.type)==="paragraph"||(c==null?void 0:c.type)==="text"?(c.raw+=(c.raw.endsWith(\`
|
||||
\`)?"":\`
|
||||
\`)+h.raw,c.text+=\`
|
||||
@@ -499,7 +499,7 @@ void main() {
|
||||
\`+h.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):t.push(h),s=l.length!==e.length,e=e.substring(h.raw.length);continue}if(h=this.tokenizer.text(e)){e=e.substring(h.raw.length);let c=t.at(-1);(c==null?void 0:c.type)==="text"?(c.raw+=(c.raw.endsWith(\`
|
||||
\`)?"":\`
|
||||
\`)+h.raw,c.text+=\`
|
||||
\`+h.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):t.push(h);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){var l,c,d,u,f;this.tokenizer.lexer=this;let s=e,r=null;if(this.tokens.links){let _=Object.keys(this.tokens.links);if(_.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(s))!==null;)_.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(s))!==null;)s=s.slice(0,r.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let n;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(s))!==null;)n=r[2]?r[2].length:0,s=s.slice(0,r.index+n)+"["+"a".repeat(r[0].length-n-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=((c=(l=this.options.hooks)==null?void 0:l.emStrongMask)==null?void 0:c.call({lexer:this},s))??s;let o=!1,a="",h=1/0;for(;e;){if(e.length<h)h=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}o||(a=""),o=!1;let _;if((u=(d=this.options.extensions)==null?void 0:d.inline)!=null&&u.some(v=>(_=v.call({lexer:this},e,t))?(e=e.substring(_.raw.length),t.push(_),!0):!1))continue;if(_=this.tokenizer.escape(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.tag(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.link(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(_.raw.length);let v=t.at(-1);_.type==="text"&&(v==null?void 0:v.type)==="text"?(v.raw+=_.raw,v.text+=_.text):t.push(_);continue}if(_=this.tokenizer.emStrong(e,s,a)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.codespan(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.br(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.del(e,s,a)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.autolink(e)){e=e.substring(_.raw.length),t.push(_);continue}if(!this.state.inLink&&(_=this.tokenizer.url(e))){e=e.substring(_.raw.length),t.push(_);continue}let w=e;if((f=this.options.extensions)!=null&&f.startInline){let v=1/0,T=e.slice(1),M;this.options.extensions.startInline.forEach(L=>{M=L.call({lexer:this},T),typeof M=="number"&&M>=0&&(v=Math.min(v,M))}),v<1/0&&v>=0&&(w=e.substring(0,v+1))}if(_=this.tokenizer.inlineText(w)){e=e.substring(_.raw.length),_.raw.slice(-1)!=="_"&&(a=_.raw.slice(-1)),o=!0;let v=t.at(-1);(v==null?void 0:v.type)==="text"?(v.raw+=_.raw,v.text+=_.text):t.push(_);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},ho=class{constructor(i){R(this,"options");R(this,"parser");this.options=i||ys}space(i){return""}code({text:i,lang:e,escaped:t}){var n;let s=(n=(e||"").match(ct.notSpaceStart))==null?void 0:n[0],r=i.replace(ct.endingNewline,"")+\`
|
||||
\`+h.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):t.push(h);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){var l,c,d,u,f;this.tokenizer.lexer=this;let s=e,r=null;if(this.tokens.links){let _=Object.keys(this.tokens.links);if(_.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(s))!==null;)_.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(s))!==null;)s=s.slice(0,r.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let n;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(s))!==null;)n=r[2]?r[2].length:0,s=s.slice(0,r.index+n)+"["+"a".repeat(r[0].length-n-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=((c=(l=this.options.hooks)==null?void 0:l.emStrongMask)==null?void 0:c.call({lexer:this},s))??s;let o=!1,a="",h=1/0;for(;e;){if(e.length<h)h=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}o||(a=""),o=!1;let _;if((u=(d=this.options.extensions)==null?void 0:d.inline)!=null&&u.some(v=>(_=v.call({lexer:this},e,t))?(e=e.substring(_.raw.length),t.push(_),!0):!1))continue;if(_=this.tokenizer.escape(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.tag(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.link(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(_.raw.length);let v=t.at(-1);_.type==="text"&&(v==null?void 0:v.type)==="text"?(v.raw+=_.raw,v.text+=_.text):t.push(_);continue}if(_=this.tokenizer.emStrong(e,s,a)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.codespan(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.br(e)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.del(e,s,a)){e=e.substring(_.raw.length),t.push(_);continue}if(_=this.tokenizer.autolink(e)){e=e.substring(_.raw.length),t.push(_);continue}if(!this.state.inLink&&(_=this.tokenizer.url(e))){e=e.substring(_.raw.length),t.push(_);continue}let w=e;if((f=this.options.extensions)!=null&&f.startInline){let v=1/0,L=e.slice(1),M;this.options.extensions.startInline.forEach(T=>{M=T.call({lexer:this},L),typeof M=="number"&&M>=0&&(v=Math.min(v,M))}),v<1/0&&v>=0&&(w=e.substring(0,v+1))}if(_=this.tokenizer.inlineText(w)){e=e.substring(_.raw.length),_.raw.slice(-1)!=="_"&&(a=_.raw.slice(-1)),o=!0;let v=t.at(-1);(v==null?void 0:v.type)==="text"?(v.raw+=_.raw,v.text+=_.text):t.push(_);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},ho=class{constructor(i){R(this,"options");R(this,"parser");this.options=i||ys}space(i){return""}code({text:i,lang:e,escaped:t}){var n;let s=(n=(e||"").match(dt.notSpaceStart))==null?void 0:n[0],r=i.replace(dt.endingNewline,"")+\`
|
||||
\`;return s?'<pre><code class="language-'+ii(s)+'">'+(t?r:ii(r,!0))+\`</code></pre>
|
||||
\`:"<pre><code>"+(t?r:ii(r,!0))+\`</code></pre>
|
||||
\`}blockquote({tokens:i}){return\`<blockquote>
|
||||
@@ -519,8 +519,8 @@ void main() {
|
||||
\`}tablecell(i){let e=this.parser.parseInline(i.tokens),t=i.header?"th":"td";return(i.align?\`<\${t} align="\${i.align}">\`:\`<\${t}>\`)+e+\`</\${t}>
|
||||
\`}strong({tokens:i}){return\`<strong>\${this.parser.parseInline(i)}</strong>\`}em({tokens:i}){return\`<em>\${this.parser.parseInline(i)}</em>\`}codespan({text:i}){return\`<code>\${ii(i,!0)}</code>\`}br(i){return"<br>"}del({tokens:i}){return\`<del>\${this.parser.parseInline(i)}</del>\`}link({href:i,title:e,tokens:t}){let s=this.parser.parseInline(t),r=Yd(i);if(r===null)return s;i=r;let n='<a href="'+i+'"';return e&&(n+=' title="'+ii(e)+'"'),n+=">"+s+"</a>",n}image({href:i,title:e,text:t,tokens:s}){s&&(t=this.parser.parseInline(s,this.parser.textRenderer));let r=Yd(i);if(r===null)return ii(t);i=r;let n=\`<img src="\${i}" alt="\${ii(t)}"\`;return e&&(n+=\` title="\${ii(e)}"\`),n+=">",n}text(i){return"tokens"in i&&i.tokens?this.parser.parseInline(i.tokens):"escaped"in i&&i.escaped?i.text:ii(i.text)}},gh=class{strong({text:i}){return i}em({text:i}){return i}codespan({text:i}){return i}del({text:i}){return i}html({text:i}){return i}text({text:i}){return i}link({text:i}){return""+i}image({text:i}){return""+i}br(){return""}checkbox({raw:i}){return i}},Kt=class Fl{constructor(e){R(this,"options");R(this,"renderer");R(this,"textRenderer");this.options=e||ys,this.options.renderer=this.options.renderer||new ho,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new gh}static parse(e,t){return new Fl(t).parse(e)}static parseInline(e,t){return new Fl(t).parseInline(e)}parse(e){var s,r;this.renderer.parser=this;let t="";for(let n=0;n<e.length;n++){let o=e[n];if((r=(s=this.options.extensions)==null?void 0:s.renderers)!=null&&r[o.type]){let h=o,l=this.options.extensions.renderers[h.type].call({parser:this},h);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(h.type)){t+=l||"";continue}}let a=o;switch(a.type){case"space":{t+=this.renderer.space(a);break}case"hr":{t+=this.renderer.hr(a);break}case"heading":{t+=this.renderer.heading(a);break}case"code":{t+=this.renderer.code(a);break}case"table":{t+=this.renderer.table(a);break}case"blockquote":{t+=this.renderer.blockquote(a);break}case"list":{t+=this.renderer.list(a);break}case"checkbox":{t+=this.renderer.checkbox(a);break}case"html":{t+=this.renderer.html(a);break}case"def":{t+=this.renderer.def(a);break}case"paragraph":{t+=this.renderer.paragraph(a);break}case"text":{t+=this.renderer.text(a);break}default:{let h='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(h),"";throw new Error(h)}}}return t}parseInline(e,t=this.renderer){var r,n;this.renderer.parser=this;let s="";for(let o=0;o<e.length;o++){let a=e[o];if((n=(r=this.options.extensions)==null?void 0:r.renderers)!=null&&n[a.type]){let l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(a.type)){s+=l||"";continue}}let h=a;switch(h.type){case"escape":{s+=t.text(h);break}case"html":{s+=t.html(h);break}case"link":{s+=t.link(h);break}case"image":{s+=t.image(h);break}case"checkbox":{s+=t.checkbox(h);break}case"strong":{s+=t.strong(h);break}case"em":{s+=t.em(h);break}case"codespan":{s+=t.codespan(h);break}case"br":{s+=t.br(h);break}case"del":{s+=t.del(h);break}case"text":{s+=t.text(h);break}default:{let l='Token with "'+h.type+'" type was not found.';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},Pn,Ar=(Pn=class{constructor(i){R(this,"options");R(this,"block");this.options=i||ys}preprocess(i){return i}postprocess(i){return i}processAllTokens(i){return i}emStrongMask(i){return i}provideLexer(i=this.block){return i?jt.lex:jt.lexInline}provideParser(i=this.block){return i?Kt.parse:Kt.parseInline}},R(Pn,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens","emStrongMask"])),R(Pn,"passThroughHooksRespectAsync",new Set(["preprocess","postprocess","processAllTokens"])),Pn),ey=class{constructor(...i){R(this,"defaults",lh());R(this,"options",this.setOptions);R(this,"parse",this.parseMarkdown(!0));R(this,"parseInline",this.parseMarkdown(!1));R(this,"Parser",Kt);R(this,"Renderer",ho);R(this,"TextRenderer",gh);R(this,"Lexer",jt);R(this,"Tokenizer",lo);R(this,"Hooks",Ar);this.use(...i)}walkTokens(i,e){var s,r;let t=[];for(let n of i)switch(t=t.concat(e.call(this,n)),n.type){case"table":{let o=n;for(let a of o.header)t=t.concat(this.walkTokens(a.tokens,e));for(let a of o.rows)for(let h of a)t=t.concat(this.walkTokens(h.tokens,e));break}case"list":{let o=n;t=t.concat(this.walkTokens(o.items,e));break}default:{let o=n;(r=(s=this.defaults.extensions)==null?void 0:s.childTokens)!=null&&r[o.type]?this.defaults.extensions.childTokens[o.type].forEach(a=>{let h=o[a].flat(1/0);t=t.concat(this.walkTokens(h,e))}):o.tokens&&(t=t.concat(this.walkTokens(o.tokens,e)))}}return t}use(...i){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return i.forEach(t=>{let s={...t};if(s.async=this.defaults.async||s.async||!1,t.e
Line truncated
|
||||
Please report this to https://github.com/markedjs/marked.\`,i){let s="<p>An error occurred:</p><pre>"+ii(t.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(t);throw t}}},vs=new ey;function ce(i,e){return vs.parse(i,e)}ce.options=ce.setOptions=function(i){return vs.setOptions(i),ce.defaults=vs.defaults,P_(ce.defaults),ce};ce.getDefaults=lh;ce.defaults=ys;ce.use=function(...i){return vs.use(...i),ce.defaults=vs.defaults,P_(ce.defaults),ce};ce.walkTokens=function(i,e){return vs.walkTokens(i,e)};ce.parseInline=vs.parseInline;ce.Parser=Kt;ce.parser=Kt.parse;ce.Renderer=ho;ce.TextRenderer=gh;ce.Lexer=jt;ce.lexer=jt.lex;ce.Tokenizer=lo;ce.Hooks=Ar;ce.parse=ce;ce.options;ce.setOptions;ce.use;ce.walkTokens;ce.parseInline;Kt.parse;jt.lex;/*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */function Qd(i,e){(e==null||e>i.length)&&(e=i.length);for(var t=0,s=Array(e);t<e;t++)s[t]=i[t];return s}function ty(i){if(Array.isArray(i))return i}function iy(i,e){var t=i==null?null:typeof Symbol<"u"&&i[Symbol.iterator]||i["@@iterator"];if(t!=null){var s,r,n,o,a=[],h=!0,l=!1;try{if(n=(t=t.call(i)).next,e!==0)for(;!(h=(s=n.call(t)).done)&&(a.push(s.value),a.length!==e);h=!0);}catch(c){l=!0,r=c}finally{try{if(!h&&t.return!=null&&(o=t.return(),Object(o)!==o))return}finally{if(l)throw r}}return a}}function sy(){throw new TypeError(\`Invalid attempt to destructure non-iterable instance.
|
||||
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.\`)}function ry(i,e){return ty(i)||iy(i,e)||ny(i,e)||sy()}function ny(i,e){if(i){if(typeof i=="string")return Qd(i,e);var t={}.toString.call(i).slice(8,-1);return t==="Object"&&i.constructor&&(t=i.constructor.name),t==="Map"||t==="Set"?Array.from(i):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Qd(i,e):void 0}}const q_=Object.entries,eu=Object.setPrototypeOf,oy=Object.isFrozen,ay=Object.getPrototypeOf,ly=Object.getOwnPropertyDescriptor;let ot=Object.freeze,at=Object.seal,$s=Object.create,j_=typeof Reflect<"u"&&Reflect,Nl=j_.apply,Wl=j_.construct;ot||(ot=function(e){return e});at||(at=function(e){return e});Nl||(Nl=function(e,t){for(var s=arguments.length,r=new Array(s>2?s-2:0),n=2;n<s;n++)r[n-2]=arguments[n];return e.apply(t,r)});Wl||(Wl=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];return new e(...s)});const mr=Pe(Array.prototype.forEach),hy=Pe(Array.prototype.lastIndexOf),tu=Pe(Array.prototype.pop),Ps=Pe(Array.prototype.push),cy=Pe(Array.prototype.splice),Wi=Array.isArray,Rr=Pe(String.prototype.toLowerCase),Ma=Pe(String.prototype.toString),iu=Pe(String.prototype.match),vr=Pe(String.prototype.replace),su=Pe(String.prototype.indexOf),dy=Pe(String.prototype.trim),uy=Pe(Number.prototype.toString),fy=Pe(Boolean.prototype.toString),ru=typeof BigInt>"u"?null:Pe(BigInt.prototype.toString),nu=typeof Symbol>"u"?null:Pe(Symbol.prototype.toString),Ue=Pe(Object.prototype.hasOwnProperty),wr=Pe(Object.prototype.toString),et=Pe(RegExp.prototype.test),Qi=_y(TypeError);function Pe(i){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var t=arguments.length,s=new Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];return Nl(i,e,s)}}function _y(i){return function(){for(var e=arguments.length,t=new Array(e),s=0;s<e;s++)t[s]=arguments[s];return Wl(i,t)}}function se(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Rr;if(eu&&eu(i,null),!Wi(e))return i;let s=e.length;for(;s--;){let r=e[s];if(typeof r=="string"){const n=t(r);n!==r&&(oy(e)||(e[s]=n),r=n)}i[r]=!0}return i}function py(i){for(let e=0;e<i.length;e++)Ue(i,e)||(i[e]=null);return i}function pt(i){const e=$s(null);for(const s of q_(i)){var t=ry(s,2);const r=t[0],n=t[1];Ue(i,r)&&(Wi(n)?e[r]=py(n):n&&typeof n=="object"&&n.constructor===Object?e[r]=pt(n):e[r]=n)}return e}function gy(i){switch(typeof i){case"string":return i;case"number":return uy(i);case"boolean":return fy(i);case"bigint":return ru?ru(i):"0";case"symbol":return nu?nu(i):"Symbol()";case"undefined":return wr(i);case"function":case"object":{if(i===null)return wr(i);const e=i,t=si(e,"toString");if(typeof t=="function"){const s=t(e);return typeof s=="string"?s:wr(s)}return wr(i)}default:return wr(i)}}function si(i,e){for(;i!==null;){const s=ly(i,e);if(s){if(s.get)return Pe(s.get);if(typeof s.value=="function")return Pe(s.value)}i=ay(i)}function t(){return null}return t}function my(i){try{return et(i,""),!0}catch{return!1}}const ou=ot(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Ba=ot(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Da=ot(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),vy=ot(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","
Line truncated
|
||||
\`+Re),Ti&&(Re=cn(Re)),C&&an?b(Re):Re},e.setConfig=function(){let N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Po(N),So=!0,Co=ae,xo=ie},e.clearConfig=function(){Es=null,So=!1,Co=null,xo=null,C=H,$=""},e.isValidAttribute=function(N,g,A){Es||Po({});const F=Ce(N),K=Ce(g);return Ih(F,K,A)},e.addHook=function(N,g){typeof g=="function"&&Ue(q,N)&&Ps(q[N],g)},e.removeHook=function(N,g){if(Ue(q,N)){if(g!==void 0){const A=hy(q[N],g);return A===-1?void 0:cy(q[N],A,1)[0]}return tu(q[N])}},e.removeHooks=function(N){Ue(q,N)&&(q[N]=[])},e.removeAllHooks=function(){q=uu()},e}var Py=K_();ce.use({gfm:!0,renderer:{code({text:i,lang:e}){return\`\${e&&e.trim()?\`<div class="agent-md-lang">\${St(e.trim())}</div>\`:""}<pre class="agent-md-pre"><code>\${St(i)}</code></pre>\`},codespan({text:i}){return\`<code class="agent-md-inline-code">\${i}</code>\`},link({href:i,title:e,text:t}){const s=e?\` title="\${St(e)}"\`:"";return\`<a href="\${i}"\${s} target="_blank" rel="noopener noreferrer" class="agent-md-link">\${t}</a>\`},image({href:i,title:e,text:t}){const s=e?\` title="\${St(e)}"\`:"";return\`<img src="\${i}"\${s} alt="\${St(t)}" class="agent-md-img" loading="lazy">\`}}});function St(i){return i?i.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}class Iy{constructor(e,t){R(this,"panelEl",null);R(this,"messagesEl",null);R(this,"inputEl",null);R(this,"sendBtn",null);R(this,"isVisible",!1);R(this,"isAgentRunning",!1);R(this,"isWaitingConfirmation",!1);R(this,"wsSend",null);R(this,"onLayoutChange");R(this,"streamingEl",null);R(this,"streamingText","");R(this,"thinkingProcessEl",null);R(this,"thinkingStepsEl",null);R(this,"thinkingCurrentEl",null);R(this,"thinkingStatusEl",null);R(this,"thinkingIsDone",!1);R(this,"thinkingStepCount",0);R(this,"thinkingLiveEl",null);R(this,"thinkingAllSteps",[]);R(this,"livePreviewCache",[]);this.parentEl=e,this.isLoggedIn=t}setLayoutChangeHandler(e){this.onLayoutChange=e}setWebSocketSend(e){this.wsSend=e}render(){this.panelEl||(this.panelEl=document.createElement("div"),this.panelEl.id="agent-panel",this.panelEl.className="w-[560px] shrink-0 border-l border-[var(--border)] flex flex-col bg-[var(--bg)] overflow-hidden",this.panelEl.style.display="none",this.panelEl.innerHTML=\`
|
||||
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.\`)}function ry(i,e){return ty(i)||iy(i,e)||ny(i,e)||sy()}function ny(i,e){if(i){if(typeof i=="string")return Qd(i,e);var t={}.toString.call(i).slice(8,-1);return t==="Object"&&i.constructor&&(t=i.constructor.name),t==="Map"||t==="Set"?Array.from(i):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Qd(i,e):void 0}}const q_=Object.entries,eu=Object.setPrototypeOf,oy=Object.isFrozen,ay=Object.getPrototypeOf,ly=Object.getOwnPropertyDescriptor;let at=Object.freeze,lt=Object.seal,$s=Object.create,j_=typeof Reflect<"u"&&Reflect,Nl=j_.apply,Wl=j_.construct;at||(at=function(e){return e});lt||(lt=function(e){return e});Nl||(Nl=function(e,t){for(var s=arguments.length,r=new Array(s>2?s-2:0),n=2;n<s;n++)r[n-2]=arguments[n];return e.apply(t,r)});Wl||(Wl=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];return new e(...s)});const mr=Pe(Array.prototype.forEach),hy=Pe(Array.prototype.lastIndexOf),tu=Pe(Array.prototype.pop),Ps=Pe(Array.prototype.push),cy=Pe(Array.prototype.splice),Wi=Array.isArray,Rr=Pe(String.prototype.toLowerCase),Ma=Pe(String.prototype.toString),iu=Pe(String.prototype.match),vr=Pe(String.prototype.replace),su=Pe(String.prototype.indexOf),dy=Pe(String.prototype.trim),uy=Pe(Number.prototype.toString),fy=Pe(Boolean.prototype.toString),ru=typeof BigInt>"u"?null:Pe(BigInt.prototype.toString),nu=typeof Symbol>"u"?null:Pe(Symbol.prototype.toString),Ue=Pe(Object.prototype.hasOwnProperty),wr=Pe(Object.prototype.toString),et=Pe(RegExp.prototype.test),Qi=_y(TypeError);function Pe(i){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var t=arguments.length,s=new Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];return Nl(i,e,s)}}function _y(i){return function(){for(var e=arguments.length,t=new Array(e),s=0;s<e;s++)t[s]=arguments[s];return Wl(i,t)}}function se(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Rr;if(eu&&eu(i,null),!Wi(e))return i;let s=e.length;for(;s--;){let r=e[s];if(typeof r=="string"){const n=t(r);n!==r&&(oy(e)||(e[s]=n),r=n)}i[r]=!0}return i}function py(i){for(let e=0;e<i.length;e++)Ue(i,e)||(i[e]=null);return i}function gt(i){const e=$s(null);for(const s of q_(i)){var t=ry(s,2);const r=t[0],n=t[1];Ue(i,r)&&(Wi(n)?e[r]=py(n):n&&typeof n=="object"&&n.constructor===Object?e[r]=gt(n):e[r]=n)}return e}function gy(i){switch(typeof i){case"string":return i;case"number":return uy(i);case"boolean":return fy(i);case"bigint":return ru?ru(i):"0";case"symbol":return nu?nu(i):"Symbol()";case"undefined":return wr(i);case"function":case"object":{if(i===null)return wr(i);const e=i,t=si(e,"toString");if(typeof t=="function"){const s=t(e);return typeof s=="string"?s:wr(s)}return wr(i)}default:return wr(i)}}function si(i,e){for(;i!==null;){const s=ly(i,e);if(s){if(s.get)return Pe(s.get);if(typeof s.value=="function")return Pe(s.value)}i=ay(i)}function t(){return null}return t}function my(i){try{return et(i,""),!0}catch{return!1}}const ou=at(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Ba=at(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Da=at(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),vy=at(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","
Line truncated
|
||||
\`+Re),Ti&&(Re=cn(Re)),C&&an?b(Re):Re},e.setConfig=function(){let N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Po(N),So=!0,Co=ae,xo=ie},e.clearConfig=function(){Es=null,So=!1,Co=null,xo=null,C=H,$=""},e.isValidAttribute=function(N,g,A){Es||Po({});const F=Ce(N),K=Ce(g);return Ih(F,K,A)},e.addHook=function(N,g){typeof g=="function"&&Ue(q,N)&&Ps(q[N],g)},e.removeHook=function(N,g){if(Ue(q,N)){if(g!==void 0){const A=hy(q[N],g);return A===-1?void 0:cy(q[N],A,1)[0]}return tu(q[N])}},e.removeHooks=function(N){Ue(q,N)&&(q[N]=[])},e.removeAllHooks=function(){q=uu()},e}var Py=K_();ce.use({gfm:!0,renderer:{code({text:i,lang:e}){return\`\${e&&e.trim()?\`<div class="agent-md-lang">\${nt(e.trim())}</div>\`:""}<pre class="agent-md-pre"><code>\${nt(i)}</code></pre>\`},codespan({text:i}){return\`<code class="agent-md-inline-code">\${nt(i)}</code>\`},link({href:i,title:e,text:t}){const s=e?\` title="\${nt(e)}"\`:"";return\`<a href="\${nt(i)}"\${s} target="_blank" rel="noopener noreferrer" class="agent-md-link">\${t}</a>\`},image({href:i,title:e,text:t}){const s=e?\` title="\${nt(e)}"\`:"";return\`<img src="\${nt(i)}"\${s} alt="\${nt(t)}" class="agent-md-img" loading="lazy">\`}}});function nt(i){return i?i.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}class Iy{constructor(e,t){R(this,"panelEl",null);R(this,"messagesEl",null);R(this,"inputEl",null);R(this,"sendBtn",null);R(this,"isVisible",!1);R(this,"isAgentRunning",!1);R(this,"isWaitingConfirmation",!1);R(this,"wsSend",null);R(this,"onLayoutChange");R(this,"streamingEl",null);R(this,"streamingText","");R(this,"thinkingProcessEl",null);R(this,"thinkingStepsEl",null);R(this,"thinkingCurrentEl",null);R(this,"thinkingStatusEl",null);R(this,"thinkingIsDone",!1);R(this,"thinkingStepCount",0);R(this,"thinkingLiveEl",null);R(this,"thinkingAllSteps",[]);R(this,"livePreviewCache",[]);this.parentEl=e,this.isLoggedIn=t}setLayoutChangeHandler(e){this.onLayoutChange=e}setWebSocketSend(e){this.wsSend=e}render(){this.panelEl||(this.panelEl=document.createElement("div"),this.panelEl.id="agent-panel",this.panelEl.className="w-[560px] shrink-0 border-l border-[var(--border)] flex flex-col bg-[var(--bg)] overflow-hidden",this.panelEl.style.display="none",this.panelEl.innerHTML=\`
|
||||
<div class="flex items-center justify-between px-4 py-2.5 border-b border-[var(--border)] bg-[var(--bg-elevated)]">
|
||||
<span class="text-xs font-bold tracking-[0.1em] text-[var(--accent-secondary)]">AI_AGENT</span>
|
||||
<button id="agent-close-btn" class="text-muted hover:text-primary transition-colors cursor-pointer">
|
||||
@@ -556,20 +556,20 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
||||
<div class="tp-steps"></div>
|
||||
<div class="tp-current"></div>
|
||||
</div>
|
||||
\`;const t=e.querySelector(".tp-accordion");t==null||t.addEventListener("click",()=>{this.thinkingIsDone&&e.classList.toggle("tp-expanded")}),this.thinkingProcessEl=e,this.thinkingStepsEl=e.querySelector(".tp-steps"),this.thinkingStatusEl=e.querySelector(".tp-status"),this.thinkingCurrentEl=e.querySelector(".tp-current"),this.thinkingLiveEl=e.querySelector(".tp-live-preview"),this.thinkingIsDone=!1,(s=this.messagesEl)==null||s.appendChild(e),this.scrollToBottom()}updateLivePreview(e){if(!this.thinkingLiveEl)return;this.livePreviewCache.push(e),this.livePreviewCache.length>2&&this.livePreviewCache.shift();const t=\`<span class="material-symbols-outlined tp-live-icon" style="font-variation-settings:'FILL' 0;">terminal</span>\`;this.thinkingLiveEl.innerHTML=this.livePreviewCache.map(s=>\`<div class="tp-live-item">\${t}<span>\${St(s)}</span></div>\`).join("")}addThinkingStep(e,t){if(!this.thinkingStepsEl||!this.thinkingCurrentEl)return;if(this.thinkingAllSteps.push({tool:e,label:t}),this.thinkingCurrentEl.childElementCount>0)for(this.thinkingStepsEl.appendChild(this.thinkingCurrentEl.firstElementChild);this.thinkingStepsEl.children.length>2;)this.thinkingStepsEl.removeChild(this.thinkingStepsEl.firstChild);this.thinkingCurrentEl.innerHTML="",this.thinkingStepCount++;const s=document.createElement("div");s.className="tp-step tp-step-active";const r=e==="execute_command"||e==="terminal"?\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 0;">terminal</span>\`:\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 1;">smart_toy</span>\`;if(s.innerHTML=\`\${r}<span class="tp-step-label">\${St(t)}</span>\`,this.thinkingCurrentEl.appendChild(s),this.thinkingStatusEl){const n=this.thinkingIsDone?"已完成":"处理中";this.thinkingStatusEl.textContent=\`\${n}(\${this.thinkingStepCount} 个步骤)\`}this.scrollToBottom()}collapseThinkingProcess(){var s,r;if(!this.thinkingProcessEl||this.thinkingIsDone)return;if(this.thinkingIsDone=!0,(s=this.thinkingCurrentEl)!=null&&s.firstElementChild&&((r=this.thinkingStepsEl)==null||r.appendChild(this.thinkingCurrentEl.firstElementChild)),this.thinkingCurrentEl.innerHTML="",this.thinkingStepsEl){this.thinkingStepsEl.innerHTML="";for(const n of this.thinkingAllSteps){const o=document.createElement("div");o.className="tp-step tp-step-done";const a=n.tool==="execute_command"||n.tool==="terminal"?\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 0;">check_circle</span>\`:\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 1;">check_circle</span>\`;o.innerHTML=\`\${a}<span class="tp-step-label">\${St(n.label)}</span>\`,this.thinkingStepsEl.appendChild(o)}}this.thinkingProcessEl.querySelectorAll(".tp-step-active").forEach(n=>{n.classList.remove("tp-step-active"),n.classList.add("tp-step-done");const o=n.querySelector(".tp-step-icon");o&&(o.textContent="check_circle")}),this.thinkingStatusEl&&(this.thinkingStatusEl.textContent=\`已完成 \${this.thinkingStepCount} 个步骤\`);const e=this.thinkingProcessEl.querySelector(".tp-icon");e&&(e.textContent="check_circle");const t=this.thinkingProcessEl.querySelector(".thinking-dots");t&&(t.style.display="none"),this.thinkingProcessEl.classList.add("tp-done"),this.thinkingLiveEl&&(this.thinkingLiveEl.innerHTML="")}removeThinkingProcess(){this.thinkingProcessEl&&this.thinkingProcessEl.remove(),this.thinkingProcessEl=null,this.thinkingStepsEl=null,this.thinkingCurrentEl=null,this.thinkingStatusEl=null,this.thinkingLiveEl=null,this.thinkingIsDone=!1,this.thinkingAllSteps=[],this.livePreviewCache=[]}addAgentResponse(e){this.collapseThinkingProcess(),this.appendMessage("response",e||"")}handleStreamChunk(e){var s;if(this.streamingEl||this.collapseThinkingProcess(),!this.streamingEl){this.streamingText="";const r=document.createElement("div");r.className="agent-message agent-response";const o=\`<span class="material-symbols-outlined text-[14px]" style="color:var(--agent-agent-color);font-variation-settings:'FILL' 1;">smart_toy</span>\`;r.innerHTML=\`
|
||||
\`;const t=e.querySelector(".tp-accordion");t==null||t.addEventListener("click",()=>{this.thinkingIsDone&&e.classList.toggle("tp-expanded")}),this.thinkingProcessEl=e,this.thinkingStepsEl=e.querySelector(".tp-steps"),this.thinkingStatusEl=e.querySelector(".tp-status"),this.thinkingCurrentEl=e.querySelector(".tp-current"),this.thinkingLiveEl=e.querySelector(".tp-live-preview"),this.thinkingIsDone=!1,(s=this.messagesEl)==null||s.appendChild(e),this.scrollToBottom()}updateLivePreview(e){if(!this.thinkingLiveEl)return;this.livePreviewCache.push(e),this.livePreviewCache.length>2&&this.livePreviewCache.shift();const t=\`<span class="material-symbols-outlined tp-live-icon" style="font-variation-settings:'FILL' 0;">terminal</span>\`;this.thinkingLiveEl.innerHTML=this.livePreviewCache.map(s=>\`<div class="tp-live-item">\${t}<span>\${nt(s)}</span></div>\`).join("")}addThinkingStep(e,t){if(!this.thinkingStepsEl||!this.thinkingCurrentEl)return;if(this.thinkingAllSteps.push({tool:e,label:t}),this.thinkingCurrentEl.childElementCount>0)for(this.thinkingStepsEl.appendChild(this.thinkingCurrentEl.firstElementChild);this.thinkingStepsEl.children.length>2;)this.thinkingStepsEl.removeChild(this.thinkingStepsEl.firstChild);this.thinkingCurrentEl.innerHTML="",this.thinkingStepCount++;const s=document.createElement("div");s.className="tp-step tp-step-active";const r=e==="execute_command"||e==="terminal"?\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 0;">terminal</span>\`:\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 1;">smart_toy</span>\`;if(s.innerHTML=\`\${r}<span class="tp-step-label">\${nt(t)}</span>\`,this.thinkingCurrentEl.appendChild(s),this.thinkingStatusEl){const n=this.thinkingIsDone?"已完成":"处理中";this.thinkingStatusEl.textContent=\`\${n}(\${this.thinkingStepCount} 个步骤)\`}this.scrollToBottom()}collapseThinkingProcess(){var s,r;if(!this.thinkingProcessEl||this.thinkingIsDone)return;if(this.thinkingIsDone=!0,(s=this.thinkingCurrentEl)!=null&&s.firstElementChild&&((r=this.thinkingStepsEl)==null||r.appendChild(this.thinkingCurrentEl.firstElementChild)),this.thinkingCurrentEl.innerHTML="",this.thinkingStepsEl){this.thinkingStepsEl.innerHTML="";for(const n of this.thinkingAllSteps){const o=document.createElement("div");o.className="tp-step tp-step-done";const a=n.tool==="execute_command"||n.tool==="terminal"?\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 0;">check_circle</span>\`:\`<span class="material-symbols-outlined tp-step-icon" style="font-variation-settings:'FILL' 1;">check_circle</span>\`;o.innerHTML=\`\${a}<span class="tp-step-label">\${nt(n.label)}</span>\`,this.thinkingStepsEl.appendChild(o)}}this.thinkingProcessEl.querySelectorAll(".tp-step-active").forEach(n=>{n.classList.remove("tp-step-active"),n.classList.add("tp-step-done");const o=n.querySelector(".tp-step-icon");o&&(o.textContent="check_circle")}),this.thinkingStatusEl&&(this.thinkingStatusEl.textContent=\`已完成 \${this.thinkingStepCount} 个步骤\`);const e=this.thinkingProcessEl.querySelector(".tp-icon");e&&(e.textContent="check_circle");const t=this.thinkingProcessEl.querySelector(".thinking-dots");t&&(t.style.display="none"),this.thinkingProcessEl.classList.add("tp-done"),this.thinkingLiveEl&&(this.thinkingLiveEl.innerHTML="")}removeThinkingProcess(){this.thinkingProcessEl&&this.thinkingProcessEl.remove(),this.thinkingProcessEl=null,this.thinkingStepsEl=null,this.thinkingCurrentEl=null,this.thinkingStatusEl=null,this.thinkingLiveEl=null,this.thinkingIsDone=!1,this.thinkingAllSteps=[],this.livePreviewCache=[]}addAgentResponse(e){this.collapseThinkingProcess(),this.appendMessage("response",e||"")}handleStreamChunk(e){var s;if(this.streamingEl||this.collapseThinkingProcess(),!this.streamingEl){this.streamingText="";const r=document.createElement("div");r.className="agent-message agent-response";const o=\`<span class="material-symbols-outlined text-[14px]" style="color:var(--agent-agent-color);font-variation-settings:'FILL' 1;">smart_toy</span>\`;r.innerHTML=\`
|
||||
<div class="flex gap-2 items-start">
|
||||
<div class="shrink-0 mt-0.5">\${o}</div>
|
||||
<div class="flex-1 min-w-0 text-[13px] whitespace-pre-wrap agent-md-content"></div>
|
||||
</div>
|
||||
\`,this.streamingEl=r,(s=this.messagesEl)==null||s.appendChild(r)}this.streamingText+=e;const t=this.streamingEl.querySelector(".agent-md-content");if(t&&(t.textContent=this.streamingText,!t.querySelector(".streaming-cursor"))){const r=document.createElement("span");r.className="streaming-cursor",t.appendChild(r)}this.scrollToBottom()}handleStreamEnd(e){if(this.streamingEl){const t=this.streamingEl.querySelector(".agent-md-content");if(t){t.classList.remove("whitespace-pre-wrap");const s=document.createElement("div");s.innerHTML=this.renderMarkdown(e||this.streamingText||"");const r=s.querySelector(".agent-md-content");t.innerHTML=r?r.innerHTML:e||this.streamingText||""}this.streamingEl=null,this.streamingText=""}else this.addAgentResponse(e||"")}showError(e){this.streamingEl&&(this.streamingEl.remove(),this.streamingEl=null,this.streamingText=""),this.collapseThinkingProcess(),this.appendMessage("error",e||"未知错误")}showConfirmDialog(e,t){var n,o,a;this.streamingEl&&this.convertStreamToThoughtStep(),this.isWaitingConfirmation=!0,this.updateInputState();const s=document.createElement("div");s.className="agent-confirm p-3 rounded border border-[var(--error)] bg-[var(--error-bg)]",s.innerHTML=\`
|
||||
<div class="text-[11px] font-bold text-[var(--error)] mb-1">⚠ 危险操作确认</div>
|
||||
<div class="text-[12px] mb-1 font-code bg-black/20 p-1 rounded">$ \${St(e)}</div>
|
||||
<div class="text-[11px] text-[var(--on-surface-variant)] mb-2">\${St(t)}</div>
|
||||
<div class="text-[12px] mb-1 font-code bg-black/20 p-1 rounded">$ \${nt(e)}</div>
|
||||
<div class="text-[11px] text-[var(--on-surface-variant)] mb-2">\${nt(t)}</div>
|
||||
<div class="flex gap-2">
|
||||
<button class="agent-confirm-no cyber-button flex-1 py-1 text-[11px] font-bold">取消</button>
|
||||
<button class="agent-confirm-yes cyber-button flex-1 py-1 text-[11px] font-bold bg-[var(--error)] text-white">确认执行</button>
|
||||
</div>
|
||||
\`;const r=()=>{this.isWaitingConfirmation=!1,this.updateInputState()};(n=s.querySelector(".agent-confirm-no"))==null||n.addEventListener("click",()=>{var h;(h=this.wsSend)==null||h.call(this,JSON.stringify({type:"agent_confirm",approved:!1,command:e})),s.remove(),r()}),(o=s.querySelector(".agent-confirm-yes"))==null||o.addEventListener("click",()=>{var h;(h=this.wsSend)==null||h.call(this,JSON.stringify({type:"agent_confirm",approved:!0,command:e})),s.remove(),r()}),(a=this.messagesEl)==null||a.appendChild(s),this.scrollToBottom()}convertStreamToThoughtStep(){if(!this.streamingEl)return;const e=this.streamingText.trim();if(this.streamingEl.remove(),this.streamingEl=null,this.streamingText="",e&&this.thinkingProcessEl){this.thinkingIsDone=!1,this.thinkingProcessEl.classList.remove("tp-done");const t=this.thinkingProcessEl.querySelector(".tp-icon");t&&(t.textContent="smart_toy");const s=this.thinkingProcessEl.querySelector(".thinking-dots");s&&(s.style.display=""),this.addThinkingStep("thought",e)}}appendMessage(e,t){var d;const s=document.createElement("div");s.className=\`agent-message agent-\${e}\`;const r=e==="user",n=e==="response",o=e==="executing",h=r?"var(--agent-user-color)":n?"var(--agent-agent-color)":e==="error"?"var(--error)":"var(--on-surface-variant)",l=r?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">person</span>\`:n?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">smart_toy</span>\`:o?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 0;">terminal</span>\`:\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">error</span>\`;let c;n?c=this.renderMarkdown(t||""):r?c=\`<div style="color:\${h};white-space:pre-wrap;word-break:break-word;">\${St(t)}</div>\`:o?c=\`<div class="font-code text-[11px]" style="color:\${h};white-space:pre-wrap;word-break:break-all;">\${St(t)}</div>\`:c=\`<div style="color:\${h};word-break:break-word;">\${St(t)}</div>\`,r?s.innerHTML=\`
|
||||
\`;const r=()=>{this.isWaitingConfirmation=!1,this.updateInputState()};(n=s.querySelector(".agent-confirm-no"))==null||n.addEventListener("click",()=>{var h;(h=this.wsSend)==null||h.call(this,JSON.stringify({type:"agent_confirm",approved:!1,command:e})),s.remove(),r()}),(o=s.querySelector(".agent-confirm-yes"))==null||o.addEventListener("click",()=>{var h;(h=this.wsSend)==null||h.call(this,JSON.stringify({type:"agent_confirm",approved:!0,command:e})),s.remove(),r()}),(a=this.messagesEl)==null||a.appendChild(s),this.scrollToBottom()}convertStreamToThoughtStep(){if(!this.streamingEl)return;const e=this.streamingText.trim();if(this.streamingEl.remove(),this.streamingEl=null,this.streamingText="",e&&this.thinkingProcessEl){this.thinkingIsDone=!1,this.thinkingProcessEl.classList.remove("tp-done");const t=this.thinkingProcessEl.querySelector(".tp-icon");t&&(t.textContent="smart_toy");const s=this.thinkingProcessEl.querySelector(".thinking-dots");s&&(s.style.display=""),this.addThinkingStep("thought",e)}}appendMessage(e,t){var d;const s=document.createElement("div");s.className=\`agent-message agent-\${e}\`;const r=e==="user",n=e==="response",o=e==="executing",h=r?"var(--agent-user-color)":n?"var(--agent-agent-color)":e==="error"?"var(--error)":"var(--on-surface-variant)",l=r?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">person</span>\`:n?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">smart_toy</span>\`:o?\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 0;">terminal</span>\`:\`<span class="material-symbols-outlined text-[14px]" style="color:\${h};font-variation-settings:'FILL' 1;">error</span>\`;let c;n?c=this.renderMarkdown(t||""):r?c=\`<div style="color:\${h};white-space:pre-wrap;word-break:break-word;">\${nt(t)}</div>\`:o?c=\`<div class="font-code text-[11px]" style="color:\${h};white-space:pre-wrap;word-break:break-all;">\${nt(t)}</div>\`:c=\`<div style="color:\${h};word-break:break-word;">\${nt(t)}</div>\`,r?s.innerHTML=\`
|
||||
<div class="flex justify-end">
|
||||
<div class="max-w-[85%] px-3 py-2 rounded-lg" style="background: color-mix(in srgb, \${h} 12%, transparent); border: 1px solid color-mix(in srgb, \${h} 30%, transparent);">
|
||||
<div class="flex gap-2 items-start">
|
||||
@@ -583,7 +583,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
||||
<div class="shrink-0 mt-0.5">\${l}</div>
|
||||
<div class="flex-1 min-w-0 text-[13px]">\${c}</div>
|
||||
</div>
|
||||
\`,(d=this.messagesEl)==null||d.appendChild(s),this.scrollToBottom()}renderMarkdown(e){let t;try{t=ce.parse(e,{async:!1})}catch{return\`<div class="agent-md-content">\${St(e)}</div>\`}return\`<div class="agent-md-content">\${Py.sanitize(t,{ADD_ATTR:["target","rel","class","loading"],ALLOW_UNKNOWN_PROTOCOLS:!1,USE_PROFILES:{html:!0}})}</div>\`}scrollToBottom(){this.messagesEl&&requestAnimationFrame(()=>{this.messagesEl.scrollTop=this.messagesEl.scrollHeight})}dispose(){var e;(e=this.panelEl)==null||e.remove(),this.panelEl=null,this.messagesEl=null,this.inputEl=null,this.sendBtn=null,this.isVisible=!1}}class $y{constructor(e,t){R(this,"tabs",new Map);R(this,"activeTabId",null);R(this,"tabBarEl");R(this,"terminalAreaEl");R(this,"tabCounter",0);R(this,"_isLoggedIn",!1);R(this,"onAllTabsClosed");this.tabBarEl=document.getElementById(e),this.terminalAreaEl=document.getElementById(t)}setLoggedIn(e){this._isLoggedIn=e}setAllTabsClosedHandler(e){this.onAllTabsClosed=e}createTab(e,t){const s=\`tab-\${++this.tabCounter}-\${Date.now()}\`,r=document.createElement("div");r.id=\`terminal-container-\${s}\`,r.className="absolute inset-0 overflow-hidden flex flex-row",r.style.display="none",this.terminalAreaEl.appendChild(r);const n=document.createElement("div");n.id=\`terminal-inner-\${s}\`,n.className="flex-1 min-w-0 relative overflow-hidden",r.appendChild(n);const o=new M_(n.id);o.setSessionClosedHandler(()=>{const h=this.tabs.get(s);h&&(h.state="disconnected",this.renderTabBar(),this.activeTabId===s&&this.updateStatusBar(h),h.sftpPanel&&(h.sftpPanel.dispose(),h.sftpPanel=null),h.agentPanel&&(h.agentPanel.dispose(),h.agentPanel=null))}),o.setSessionReadyHandler(()=>{const h=this.tabs.get(s);h&&(h.state="connected",this.renderTabBar(),this.activeTabId===s&&this.updateStatusBar(h),h.sftpPanel||(h.sftpPanel=new fb(()=>h.terminal.getSFTPWebSocketUrl()),h.sftpPanel.bindEvents()),h.sftpPanel.handleSSHReady(),this._isLoggedIn&&!h.agentPanel&&(h.agentPanel=new Iy(h.containerEl,!0),h.agentPanel.render(),h.agentPanel.setWebSocketSend(l=>h.terminal.sendWebSocketMessage(l)),h.terminal.setAgentFrameHandler(l=>{var c;(c=h.agentPanel)==null||c.handleAgentFrame(l)}),h.agentPanel.setLayoutChangeHandler(()=>h.terminal.fit())))}),o.setLatencyUpdatedHandler((h,l,c)=>{const d=this.tabs.get(s);d&&(d.cfLatency=h??void 0,d.cfColo=l??void 0,d.wsLatency=c??void 0,this.activeTabId===s&&this.updateStatusBar(d))});const a={id:s,label:e,terminal:o,sftpPanel:null,agentPanel:null,containerEl:r,hostInfo:t,state:"connecting"};return this.tabs.set(s,a),this.switchTab(s),this.renderTabBar(),a}switchTab(e){var s;const t=this.tabs.get(e);if(t){if(this.activeTabId&&this.activeTabId!==e){const r=this.tabs.get(this.activeTabId);r&&(r.containerEl.style.display="none",(s=r.sftpPanel)==null||s.hide())}t.containerEl.style.display="flex",this.activeTabId=e,t.terminal.mount(),this.updateStatusBar(t),this.renderTabBar()}}closeTab(e){var s;const t=this.tabs.get(e);if(t){if(t.sftpPanel&&(t.sftpPanel.dispose(),t.sftpPanel=null),t.agentPanel&&(t.agentPanel.dispose(),t.agentPanel=null),t.terminal.dispose(),t.containerEl.remove(),this.tabs.delete(e),this.activeTabId===e){this.activeTabId=null;const r=Array.from(this.tabs.keys());r.length>0?this.switchTab(r[r.length-1]):(s=this.onAllTabsClosed)==null||s.call(this)}this.renderTabBar()}}getActiveTab(){return this.activeTabId&&this.tabs.get(this.activeTabId)||null}getTabCount(){return this.tabs.size}hasAnyTab(){return this.tabs.size>0}closeActiveTab(){this.activeTabId&&this.closeTab(this.activeTabId)}disconnectActiveTab(){const e=this.getActiveTab();e&&(e.sftpPanel&&e.sftpPanel.hide(),e.terminal.disconnect(),e.state="disconnected",this.renderTabBar())}renderTabBar(){const e=this.tabBarEl.querySelector("#new-tab-btn");if(this.tabBarEl.innerHTML="",this.tabs.forEach(t=>{const s=document.createElement("div");s.className=\`tab-item\${t.id===this.activeTabId?" active":""}\${t.state==="disconnected"?" disconnected":""}\`,s.dataset.tabId=t.id;const r=t.state==="connected"?"tab-dot-connected":t.state==="connecting"?"tab-dot-connecting":"tab-dot-disconnected";s.innerHTML=\`
|
||||
\`,(d=this.messagesEl)==null||d.appendChild(s),this.scrollToBottom()}renderMarkdown(e){let t;try{t=ce.parse(e,{async:!1})}catch{return\`<div class="agent-md-content">\${nt(e)}</div>\`}return\`<div class="agent-md-content">\${Py.sanitize(t,{ADD_ATTR:["target","rel","class","loading"],ALLOW_UNKNOWN_PROTOCOLS:!1,USE_PROFILES:{html:!0}})}</div>\`}scrollToBottom(){this.messagesEl&&requestAnimationFrame(()=>{this.messagesEl.scrollTop=this.messagesEl.scrollHeight})}dispose(){var e;(e=this.panelEl)==null||e.remove(),this.panelEl=null,this.messagesEl=null,this.inputEl=null,this.sendBtn=null,this.isVisible=!1}}class $y{constructor(e,t){R(this,"tabs",new Map);R(this,"activeTabId",null);R(this,"tabBarEl");R(this,"terminalAreaEl");R(this,"tabCounter",0);R(this,"_isLoggedIn",!1);R(this,"onAllTabsClosed");this.tabBarEl=document.getElementById(e),this.terminalAreaEl=document.getElementById(t)}setLoggedIn(e){this._isLoggedIn=e}setAllTabsClosedHandler(e){this.onAllTabsClosed=e}createTab(e,t){const s=\`tab-\${++this.tabCounter}-\${Date.now()}\`,r=document.createElement("div");r.id=\`terminal-container-\${s}\`,r.className="absolute inset-0 overflow-hidden flex flex-row",r.style.display="none",this.terminalAreaEl.appendChild(r);const n=document.createElement("div");n.id=\`terminal-inner-\${s}\`,n.className="flex-1 min-w-0 relative overflow-hidden",r.appendChild(n);const o=new M_(n.id);o.setSessionClosedHandler(()=>{const h=this.tabs.get(s);h&&(h.state="disconnected",this.renderTabBar(),this.activeTabId===s&&this.updateStatusBar(h),h.sftpPanel&&(h.sftpPanel.dispose(),h.sftpPanel=null),h.agentPanel&&(h.agentPanel.dispose(),h.agentPanel=null))}),o.setSessionReadyHandler(()=>{const h=this.tabs.get(s);h&&(h.state="connected",this.renderTabBar(),this.activeTabId===s&&this.updateStatusBar(h),h.sftpPanel||(h.sftpPanel=new fb(()=>h.terminal.getSFTPWebSocketUrl()),h.sftpPanel.bindEvents()),h.sftpPanel.handleSSHReady(),this._isLoggedIn&&!h.agentPanel&&(h.agentPanel=new Iy(h.containerEl,!0),h.agentPanel.render(),h.agentPanel.setWebSocketSend(l=>h.terminal.sendWebSocketMessage(l)),h.terminal.setAgentFrameHandler(l=>{var c;(c=h.agentPanel)==null||c.handleAgentFrame(l)}),h.agentPanel.setLayoutChangeHandler(()=>h.terminal.fit())))}),o.setLatencyUpdatedHandler((h,l,c)=>{const d=this.tabs.get(s);d&&(d.cfLatency=h??void 0,d.cfColo=l??void 0,d.wsLatency=c??void 0,this.activeTabId===s&&this.updateStatusBar(d))});const a={id:s,label:e,terminal:o,sftpPanel:null,agentPanel:null,containerEl:r,hostInfo:t,state:"connecting"};return this.tabs.set(s,a),this.switchTab(s),this.renderTabBar(),a}switchTab(e){var s;const t=this.tabs.get(e);if(t){if(this.activeTabId&&this.activeTabId!==e){const r=this.tabs.get(this.activeTabId);r&&(r.containerEl.style.display="none",(s=r.sftpPanel)==null||s.hide())}t.containerEl.style.display="flex",this.activeTabId=e,t.terminal.mount(),this.updateStatusBar(t),this.renderTabBar()}}closeTab(e){var s;const t=this.tabs.get(e);if(t){if(t.sftpPanel&&(t.sftpPanel.dispose(),t.sftpPanel=null),t.agentPanel&&(t.agentPanel.dispose(),t.agentPanel=null),t.terminal.dispose(),t.containerEl.remove(),this.tabs.delete(e),this.activeTabId===e){this.activeTabId=null;const r=Array.from(this.tabs.keys());r.length>0?this.switchTab(r[r.length-1]):(s=this.onAllTabsClosed)==null||s.call(this)}this.renderTabBar()}}getActiveTab(){return this.activeTabId&&this.tabs.get(this.activeTabId)||null}getTabCount(){return this.tabs.size}hasAnyTab(){return this.tabs.size>0}closeActiveTab(){this.activeTabId&&this.closeTab(this.activeTabId)}disconnectActiveTab(){const e=this.getActiveTab();e&&(e.sftpPanel&&e.sftpPanel.hide(),e.terminal.disconnect(),e.state="disconnected",this.renderTabBar())}renderTabBar(){const e=this.tabBarEl.querySelector("#new-tab-btn");if(this.tabBarEl.innerHTML="",this.tabs.forEach(t=>{const s=document.createElement("div");s.className=\`tab-item\${t.id===this.activeTabId?" active":""}\${t.state==="disconnected"?" disconnected":""}\`,s.dataset.tabId=t.id;const r=t.state==="connected"?"tab-dot-connected":t.state==="connecting"?"tab-dot-connecting":"tab-dot-disconnected";s.innerHTML=\`
|
||||
<span class="tab-dot \${r}"></span>
|
||||
<span class="tab-label">\${this.escapeHtml(t.label)}</span>
|
||||
<button class="tab-close" title="Close">
|
||||
@@ -635,7 +635,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
\`,document.body.appendChild(this.modalEl),(e=this.modalEl.querySelector("#ai-modal-close-btn"))==null||e.addEventListener("click",()=>this.hide()),(t=this.modalEl.querySelector("#ai-modal-backdrop"))==null||t.addEventListener("click",()=>this.hide()),(s=this.modalEl.querySelector("#ai-fetch-models-btn"))==null||s.addEventListener("click",()=>this.fetchModels()),(r=this.modalEl.querySelector("#ai-save-btn"))==null||r.addEventListener("click",()=>this.saveConfig())}async loadConfig(){var e,t,s;try{const r=await fetch("/api/ai/config");if(r.ok){const n=await r.json();if(n.configured){const o=(e=this.modalEl)==null?void 0:e.querySelector("#ai-base-url"),a=(t=this.modalEl)==null?void 0:t.querySelector("#ai-model"),h=(s=this.modalEl)==null?void 0:s.querySelector("#ai-key-hint");o&&(o.value=n.base_url||""),a&&(a.value=n.model||""),h&&n.api_key_last4&&(h.textContent=\`当前 Key: ****\${n.api_key_last4}(留空 = 不修改)\`)}}}catch{}}async fetchModels(){var a,h,l,c,d,u;const e=(a=this.modalEl)==null?void 0:a.querySelector("#ai-base-url"),t=(h=this.modalEl)==null?void 0:h.querySelector("#ai-api-key");(l=this.modalEl)==null||l.querySelector("#ai-fetch-status");const s=(c=this.modalEl)==null?void 0:c.querySelector("#ai-model-list"),r=(d=this.modalEl)==null?void 0:d.querySelector("#ai-fetch-models-btn"),n=e==null?void 0:e.value.trim(),o=t==null?void 0:t.value.trim();if(!n||!o){this.showFetchStatus("请先填写 Base URL 和 API Key",!0);return}r&&(r.disabled=!0),this.showFetchStatus("获取模型列表中...");try{const _=await(await fetch("/api/ai/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({base_url:n,api_key:o})})).json();if(_.error){this.showFetchStatus(_.error,!0);return}if(_.fallback&&((u=_.models)==null?void 0:u.length)===0){this.showFetchStatus("Provider 不支持自动获取,请手动输入模型名称",!1);return}const w=_.models||[];s&&(s.innerHTML=w.map(v=>\`<option value="\${v.id}">\`).join("")),this.showFetchStatus(\`获取到 \${w.length} 个模型\`,!1)}catch(f){this.showFetchStatus("获取失败: "+(f instanceof Error?f.message:"网络错误"),!0)}finally{r&&(r.disabled=!1)}}showFetchStatus(e,t=!1){var r;const s=(r=this.modalEl)==null?void 0:r.querySelector("#ai-fetch-status");s&&(s.textContent=e,s.className=\`text-[10px] mt-1 \${t?"text-[var(--error)]":"text-[var(--accent)]"}\`)}async saveConfig(){var o,a,h,l,c,d,u,f;const e=(a=(o=this.modalEl)==null?void 0:o.querySelector("#ai-base-url"))==null?void 0:a.value.trim(),t=(l=(h=this.modalEl)==null?void 0:h.querySelector("#ai-api-key"))==null?void 0:l.value.trim(),s=(d=(c=this.modalEl)==null?void 0:c.querySelector("#ai-model"))==null?void 0:d.value.trim(),r=(u=this.modalEl)==null?void 0:u.querySelector("#ai-config-error"),n=(f=this.modalEl)==null?void 0:f.querySelector("#ai-config-success");if(r==null||r.classList.add("hidden"),n==null||n.classList.add("hidden"),!e||!s){r&&(r.textContent="Base URL 和 Model 为必填项",r.classList.remove("hidden"));return}try{const _={base_url:e,model:s};t&&(_.api_key=t);const w=await fetch("/api/ai/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(_)});if(w.ok)n&&(n.textContent="配置保存成功",n.classList.remove("hidden")),setTimeout(()=>this.hide(),1500);else{const v=await w.json();r&&(r.textContent=v.error||"保存失败",r.classList.remove("hidden"))}}catch{r&&(r.textContent="网络错误",r.classList.remove("hidden"))}}}let Se=null,fu=null,Jr=!1;function bo(){return Se||(Se=new $y("tab-bar","terminal-area"),Se.setAllTabsClosedHandler(()=>{Hy()}),Se.setLoggedIn(Jr),zy()),Se}function zy(){var i;(i=document.getElementById("tab-bar"))==null||i.addEventListener("click",e=>{e.target.closest("#new-tab-btn")&&Wy()})}function V_(){return new URLSearchParams(window.location.search).has("wsUrl")}function mh(i){try{const e=new URL(i);return e.protocol!=="wss:"&&e.protocol!=="ws:"?!1:e.origin===window.location.origin||e.origin===window.location.origin.replace(/^http/,"ws")}catch{return!1}}function Fy(){const i=new URLSearchParams(window.location.search),e=i.get("wsUrl"),t=i.get("name")||"Server",s=i.get("host")||"",r=parseInt(i.get("port")||"0")||0;if(!mh(e)){document.body.innerHTML='<div style="color:var(--error);padding:2em;font-family:monospace;">Error: Invalid or untrusted WebSocket URL.</div>';return}document.getElementById("auth-section").classList.add("hidden"),document.getElementById("user-space-section").classList.add("hidden"),document.getElementById("user-space-section").classList.remove("flex"),document.getElementById("terminal-section").classList.remove("hidden"),document.getElementById("terminal-section").classList.add("flex");const n=document.getElementById("tab-bar");n&&(n.style.display="none");const a=bo().createTab(t,s&&r?{host:s,port:r}:void 0),h=new WebSocket(e);h.binaryType="arraybuffer";const l=s&&r?{host:s,port:r}:void 0;a.terminal.connectWithWebSocket(h,l)}function yo(){document.getElementById("auth-section"
Line truncated
|
||||
\`,document.body.appendChild(this.modalEl),(e=this.modalEl.querySelector("#ai-modal-close-btn"))==null||e.addEventListener("click",()=>this.hide()),(t=this.modalEl.querySelector("#ai-modal-backdrop"))==null||t.addEventListener("click",()=>this.hide()),(s=this.modalEl.querySelector("#ai-fetch-models-btn"))==null||s.addEventListener("click",()=>this.fetchModels()),(r=this.modalEl.querySelector("#ai-save-btn"))==null||r.addEventListener("click",()=>this.saveConfig())}async loadConfig(){var e,t,s;try{const r=await fetch("/api/ai/config");if(r.ok){const n=await r.json();if(n.configured){const o=(e=this.modalEl)==null?void 0:e.querySelector("#ai-base-url"),a=(t=this.modalEl)==null?void 0:t.querySelector("#ai-model"),h=(s=this.modalEl)==null?void 0:s.querySelector("#ai-key-hint");o&&(o.value=n.base_url||""),a&&(a.value=n.model||""),h&&n.api_key_last4&&(h.textContent=\`当前 Key: ****\${n.api_key_last4}(留空 = 不修改)\`)}}}catch{}}async fetchModels(){var a,h,l,c,d,u;const e=(a=this.modalEl)==null?void 0:a.querySelector("#ai-base-url"),t=(h=this.modalEl)==null?void 0:h.querySelector("#ai-api-key");(l=this.modalEl)==null||l.querySelector("#ai-fetch-status");const s=(c=this.modalEl)==null?void 0:c.querySelector("#ai-model-list"),r=(d=this.modalEl)==null?void 0:d.querySelector("#ai-fetch-models-btn"),n=e==null?void 0:e.value.trim(),o=t==null?void 0:t.value.trim();if(!n||!o){this.showFetchStatus("请先填写 Base URL 和 API Key",!0);return}r&&(r.disabled=!0),this.showFetchStatus("获取模型列表中...");try{const _=await(await fetch("/api/ai/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({base_url:n,api_key:o})})).json();if(_.error){this.showFetchStatus(_.error,!0);return}if(_.fallback&&((u=_.models)==null?void 0:u.length)===0){this.showFetchStatus("Provider 不支持自动获取,请手动输入模型名称",!1);return}const w=_.models||[];if(s){s.innerHTML="";for(const v of w){const L=document.createElement("option");L.value=v.id,s.appendChild(L)}}this.showFetchStatus(\`获取到 \${w.length} 个模型\`,!1)}catch(f){this.showFetchStatus("获取失败: "+(f instanceof Error?f.message:"网络错误"),!0)}finally{r&&(r.disabled=!1)}}showFetchStatus(e,t=!1){var r;const s=(r=this.modalEl)==null?void 0:r.querySelector("#ai-fetch-status");s&&(s.textContent=e,s.className=\`text-[10px] mt-1 \${t?"text-[var(--error)]":"text-[var(--accent)]"}\`)}async saveConfig(){var o,a,h,l,c,d,u,f;const e=(a=(o=this.modalEl)==null?void 0:o.querySelector("#ai-base-url"))==null?void 0:a.value.trim(),t=(l=(h=this.modalEl)==null?void 0:h.querySelector("#ai-api-key"))==null?void 0:l.value.trim(),s=(d=(c=this.modalEl)==null?void 0:c.querySelector("#ai-model"))==null?void 0:d.value.trim(),r=(u=this.modalEl)==null?void 0:u.querySelector("#ai-config-error"),n=(f=this.modalEl)==null?void 0:f.querySelector("#ai-config-success");if(r==null||r.classList.add("hidden"),n==null||n.classList.add("hidden"),!e||!s){r&&(r.textContent="Base URL 和 Model 为必填项",r.classList.remove("hidden"));return}try{const _={base_url:e,model:s};t&&(_.api_key=t);const w=await fetch("/api/ai/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(_)});if(w.ok)n&&(n.textContent="配置保存成功",n.classList.remove("hidden")),setTimeout(()=>this.hide(),1500);else{const v=await w.json();r&&(r.textContent=v.error||"保存失败",r.classList.remove("hidden"))}}catch{r&&(r.textContent="网络错误",r.classList.remove("hidden"))}}}let Se=null,fu=null,Jr=!1;function bo(){return Se||(Se=new $y("tab-bar","terminal-area"),Se.setAllTabsClosedHandler(()=>{Hy()}),Se.setLoggedIn(Jr),zy()),Se}function zy(){var i;(i=document.getElementById("tab-bar"))==null||i.addEventListener("click",e=>{e.target.closest("#new-tab-btn")&&Wy()})}function V_(){return new URLSearchParams(window.location.search).has("wsUrl")}function mh(i){try{const e=new URL(i);return e.protocol!=="wss:"&&e.protocol!=="ws:"?!1:e.origin===window.location.origin||e.origin===window.location.origin.replace(/^http/,"ws")}catch{return!1}}function Fy(){const i=new URLSearchParams(window.location.search),e=i.get("wsUrl"),t=i.get("name")||"Server",s=i.get("host")||"",r=parseInt(i.get("port")||"0")||0;if(!mh(e)){document.body.innerHTML='<div style="color:var(--error);padding:2em;font-family:monospace;">Error: Invalid or untrusted WebSocket URL.</div>';return}document.getElementById("auth-section").classList.add("hidden"),document.getElementById("user-space-section").classList.add("hidden"),document.getElementById("user-space-section").classList.remove("flex"),document.getElementById("terminal-section").classList.remove("hidden"),document.getElementById("terminal-section").classList.add("flex");const n=document.getElementById("tab-bar");n&&(n.style.display="none");const a=bo().createTab(t,s&&r?{host:s,port:r}:void 0),h=new WebSocket(e);h.binaryType="arraybuffer";const l=s&&r?{host:s,port:r}:void 0;a.terminal.connectWithWebSocket(h,l)}functio
Line truncated
|
||||
</script>
|
||||
<style>*{margin:0;padding:0;box-sizing:border-box}:root{--bg: #0a0a0a;--bg-surface: #121212;--bg-elevated: #131313;--bg-terminal: #0e0e0e;--text: #4af626;--text-muted: #bbccb0;--text-dim: #3c4b36;--accent: #4af626;--accent-secondary: #14d1ff;--accent-secondary-light: #b7eaff;--border: #1f1f1f;--border-strong: #3c4b36;--error: #ffb4ab;--error-bg: #93000a;--on-accent: #022100;--surface-dot: #353534;--on-surface: #e5e2e1;--on-surface-variant: #bbccb0;--scrollbar-track: rgba(28, 27, 27, .5);--scrollbar-thumb: rgba(60, 75, 54, .8);--scrollbar-thumb-hover: rgba(134, 149, 125, .8);--scanline-tint: rgba(74, 246, 38, .02);--accent-glow: rgba(74, 246, 38, .08);--modal-overlay: rgba(0, 0, 0, .8)}body{font-family:JetBrains Mono,monospace;background-color:var(--bg);color:var(--text);min-height:100vh;overflow:hidden}.bg-primary{background-color:var(--accent)}.text-primary{color:var(--accent)}.text-on-primary{color:var(--on-accent)}.text-muted{color:var(--text-muted)}.text-dim{color:var(--text-dim)}.border-dim{border-color:var(--border-strong)}.bg-surface{background-color:var(--bg-surface)}.bg-surface-dot{background-color:var(--surface-dot)}.scanlines{position:fixed;top:0;left:0;width:100vw;height:100vh;background:linear-gradient(to bottom,#fff0,#fff0 50%,#0000001a 50%,#0000001a);background-size:100% 4px;pointer-events:none;z-index:50}.flicker{animation:flicker .15s infinite;pointer-events:none;position:fixed;top:0;left:0;width:100%;height:100%;background:var(--scanline-tint);z-index:49}@keyframes flicker{0%{opacity:.8}50%{opacity:1}to{opacity:.9}}.terminal-input{background:transparent;border:none;border-bottom:1px solid var(--border-strong);color:var(--text);font-family:JetBrains Mono,monospace;padding:8px 0;width:100%;outline:none;transition:border-color .2s}.terminal-input:focus{border-bottom:1px solid var(--accent);box-shadow:none}.terminal-input::placeholder{color:var(--text-dim)}.blinking-cursor:after{content:"█";color:var(--accent-secondary);animation:blink 1s step-end infinite;margin-left:4px;font-size:.9em}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}.cyber-box{background-color:var(--bg-surface);border:1px solid var(--border)}.cyber-button{border:1px solid var(--accent);transition:all .2s ease;position:relative;overflow:hidden;cursor:pointer}.cyber-button:hover{background-color:var(--accent);color:var(--on-accent)}.connect-btn{border:1px solid var(--accent);background:var(--accent);color:var(--on-accent);transition:all .2s ease;cursor:pointer}.connect-btn:hover{background:var(--accent-secondary-light);border-color:var(--accent-secondary-light);color:var(--bg)}.cursor-blink{animation:blink 1s step-end infinite}.scanline{background:linear-gradient(to bottom,#fff0,#fff0 50%,#0000001a 50%,#0000001a);background-size:100% 4px}.custom-scrollbar::-webkit-scrollbar{width:8px}.custom-scrollbar::-webkit-scrollbar-track{background:var(--scrollbar-track)}.custom-scrollbar::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:4px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}#agent-input{scrollbar-width:none;-ms-overflow-style:none}#agent-input::-webkit-scrollbar{display:none}.agent-table{border-spacing:0}.agent-table th,.agent-table td{word-break:break-word}.agent-table tbody tr:hover{background:color-mix(in srgb,var(--agent-agent-color) 8%,transparent)}.server-card{background-color:var(--bg-surface);border:1px solid var(--border);transition:all .3s ease;position:relative}.server-card:hover{border-color:var(--accent);transform:translateY(-2px);box-shadow:0 4px 20px var(--accent-glow)}.server-card.removing{animation:fadeOut .3s ease forwards}@keyframes fadeOut{to{opacity:0;transform:translateY(-10px)}}.modal-overlay{background:var(--modal-overlay);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.user-avatar{border:2px solid var(--accent);border-radius:50%;transition:border-color .2s}.user-avatar:hover{border-color:var(--accent-secondary)}.github-login-btn{transition:all .2s ease}.github-login-btn:hover{border-color:var(--accent);color:var(--accent)}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.auth-tab{border:1px solid var(--border-strong);color:var(--text-muted);background:transparent}.auth-tab-active{background:var(--accent)!important;color:var(--on-accent)!important;border-color:var(--accent)!important}.cloudssh-search-box{position:absolute;top:8px;right:8px;z-index:20;display:flex;align-items:center;gap:4px;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:4px;padding:4px 6px;box-shadow:0 2px 12px #00000080}.cloudssh-search-input{background:transparent;border:none;outline:none;color:var(--text);font-family:JetBrains Mono,monospace;font-size:12px;width:200px;padding:2px 4px}.cloudssh-search-input::placeholder{color:var(--text-dim)}.cloudssh-search-btn{background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:2px;displaLine truncated
|
||||
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
||||
@@ -670,235 +670,235 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
||||
* other features.
|
||||
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}
|
||||
</style>
|
||||
</head>
|
||||
<body class="min-h-screen font-body text-sm overflow-hidden">
|
||||
<div id="app">
|
||||
<!-- Login Page (匿名连接) -->
|
||||
<div id="auth-section" class="min-h-screen flex items-center justify-center p-6 relative">
|
||||
<div class="scanlines"></div>
|
||||
<div class="flicker"></div>
|
||||
<main class="w-full max-w-md relative z-10">
|
||||
<div class="mb-8 text-center">
|
||||
<div class="text-3xl font-bold text-primary tracking-tighter mb-2">CloudSSH<span class="blinking-cursor"></span></div>
|
||||
</div>
|
||||
<div class="cyber-box p-6 shadow-2xl relative">
|
||||
<div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-transparent via-[var(--accent)] to-transparent opacity-50"></div>
|
||||
<div class="flex items-center justify-between mb-8 pb-4 border-b border-dim">
|
||||
<span class="text-xs font-bold tracking-[0.1em] text-[var(--accent-secondary)]">CONNECTION_PARAMETERS</span>
|
||||
<span class="material-symbols-outlined text-[var(--accent-secondary)]" style="font-variation-settings: 'FILL' 0;">terminal</span>
|
||||
</div>
|
||||
<div id="connection-form-container"></div>
|
||||
</div>
|
||||
<div class="mt-8 text-center text-[13px] text-muted opacity-60">SYSTEM READY. WAITING FOR INPUT.</div>
|
||||
<div class="mt-4 text-center">
|
||||
<a href="https://github.com/newbietan/CloudSSH" class="text-[13px] text-primary opacity-60 hover:opacity-100 transition-colors tracking-widest uppercase">[ GitHub Open Source ]</a>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- User Space Page (登录后) -->
|
||||
<div id="user-space-section" class="hidden min-h-screen flex-col bg-elevated text-on-surface">
|
||||
<!-- TopAppBar -->
|
||||
<header class="flex justify-between items-center w-full px-6 h-16 bg-elevated border-b border-outline-variant z-50">
|
||||
<div class="flex items-center gap-6">
|
||||
<h1 class="text-2xl font-bold text-primary-container tracking-tighter cursor-pointer" id="user-space-logo">CloudSSH</h1>
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
<div id="user-info" class="flex items-center gap-3">
|
||||
<!-- 动态渲染:头像 + 用户名 -->
|
||||
</div>
|
||||
<button id="ai-config-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="AI Agent Settings">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">psychology</span>
|
||||
</button>
|
||||
<button id="logout-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center text-error" title="Logout">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">logout</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Server List Area -->
|
||||
<main class="flex-1 p-6 relative overflow-auto custom-scrollbar">
|
||||
<div class="scanlines pointer-events-none"></div>
|
||||
<div class="max-w-5xl mx-auto">
|
||||
<!-- 顶部操作栏 -->
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div>
|
||||
<h2 class="text-lg font-bold text-primary tracking-[0.1em]">SERVER_LIST</h2>
|
||||
<p class="text-xs text-muted opacity-60 mt-1">Manage your SSH connections</p>
|
||||
</div>
|
||||
<button id="add-server-btn" class="cyber-button text-primary py-2 px-4 text-xs font-bold tracking-[0.1em] uppercase flex items-center gap-2">
|
||||
<span class="material-symbols-outlined" style="font-size: 16px;">add</span>
|
||||
ADD_SERVER
|
||||
</button>
|
||||
</div>
|
||||
<!-- 服务器卡片网格 -->
|
||||
<div id="server-grid" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
<!-- 由 JS 动态渲染 -->
|
||||
</div>
|
||||
<!-- 空状态 -->
|
||||
<div id="empty-state" class="hidden flex-col items-center justify-center py-20">
|
||||
<span class="material-symbols-outlined text-dim mb-4" style="font-size: 64px; font-variation-settings: 'FILL' 0;">dns</span>
|
||||
<p class="text-muted text-sm tracking-[0.1em] mb-2">NO_SERVERS_CONFIGURED</p>
|
||||
<p class="text-dim text-xs mb-6">Add a server to get started</p>
|
||||
<button id="empty-add-btn" class="cyber-button text-primary py-2 px-6 text-xs font-bold tracking-[0.1em] uppercase flex items-center gap-2">
|
||||
<span class="material-symbols-outlined" style="font-size: 16px;">add</span>
|
||||
ADD_FIRST_SERVER
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="px-6 py-2 flex justify-between items-center z-50 bg-elevated border-t border-outline-variant text-xs h-12">
|
||||
<div class="text-secondary-container opacity-60">© <span id="user-copyright-year"></span> CLOUD_SSH_TERMINAL - https://github.com/newbietan/CloudSSH</div>
|
||||
<div class="flex gap-4">
|
||||
<a class="text-on-surface-variant opacity-60 hover:opacity-100 transition-opacity" href="https://github.com/newbietan/CloudSSH">Documentation</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Server Modal (添加/编辑) -->
|
||||
<div id="server-modal" class="hidden fixed inset-0 z-[100] flex items-center justify-center">
|
||||
<div class="modal-overlay absolute inset-0" id="modal-backdrop"></div>
|
||||
<div class="cyber-box p-6 shadow-2xl relative z-10 w-full max-w-md mx-4">
|
||||
<div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-transparent via-[var(--accent-secondary)] to-transparent opacity-50"></div>
|
||||
<div class="flex items-center justify-between mb-6 pb-4 border-b border-dim">
|
||||
<span id="modal-title" class="text-xs font-bold tracking-[0.1em] text-[var(--accent-secondary)]">ADD_SERVER</span>
|
||||
<button id="modal-close-btn" class="text-muted hover:text-primary transition-colors cursor-pointer">
|
||||
<span class="material-symbols-outlined" style="font-size: 20px;">close</span>
|
||||
</button>
|
||||
</div>
|
||||
<form id="server-form" class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">SERVER_NAME</label>
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">label</span>
|
||||
<input id="server-name" class="terminal-input text-[13px]" placeholder="My Server" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-4 gap-4">
|
||||
<div class="col-span-3">
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">HOST_ADDRESS</label>
|
||||
<div class="flex items-center">
|
||||
<span class="text-muted mr-2">></span>
|
||||
<input id="server-host" class="terminal-input text-[13px]" placeholder="192.168.1.1" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-1">
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">PORT</label>
|
||||
<div class="flex items-center">
|
||||
<span class="text-muted mr-2">:</span>
|
||||
<input id="server-port" class="terminal-input text-[13px]" placeholder="22" type="text" value="22">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">AUTH_USER</label>
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">person</span>
|
||||
<input id="server-username" class="terminal-input text-[13px]" placeholder="root" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">AUTH_METHOD</label>
|
||||
<div class="flex gap-2 mb-3">
|
||||
<button type="button" id="modal-auth-tab-password" class="auth-tab auth-tab-active px-3 py-1 text-[11px] font-bold tracking-[0.1em] cursor-pointer transition-all">PASSWORD</button>
|
||||
<button type="button" id="modal-auth-tab-key" class="auth-tab px-3 py-1 text-[11px] font-bold tracking-[0.1em] cursor-pointer transition-all">PRIVATE_KEY</button>
|
||||
</div>
|
||||
<div id="modal-password-section">
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">key</span>
|
||||
<input id="server-password" class="terminal-input text-[13px]" placeholder="••••••••" type="password">
|
||||
</div>
|
||||
</div>
|
||||
<div id="modal-key-section" style="display:none;">
|
||||
<textarea id="server-private-key" class="terminal-input text-[11px] w-full" rows="4" placeholder="-----BEGIN OPENSSH PRIVATE KEY----- ...粘贴私钥内容... -----END OPENSSH PRIVATE KEY-----" style="resize:vertical;border:1px solid var(--border-strong);padding:8px;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-2">
|
||||
<button id="server-submit-btn" class="cyber-button w-full py-3 px-4 text-xs font-bold tracking-[0.1em] uppercase flex items-center justify-center gap-2 bg-primary text-on-primary" type="button">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px;">save</span>
|
||||
SAVE_SERVER
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Terminal Page -->
|
||||
<div id="terminal-section" class="hidden h-screen flex-col bg-background text-on-surface">
|
||||
<!-- TopAppBar -->
|
||||
<header class="flex justify-between items-center w-full px-6 h-16 bg-background border-b border-outline-variant z-50">
|
||||
<div class="flex items-center gap-6">
|
||||
<h1 class="text-2xl font-bold text-primary-container tracking-tighter cursor-pointer">CloudSSH</h1>
|
||||
</div>
|
||||
<div class="flex items-center gap-4 text-primary-container">
|
||||
<select id="theme-selector" class="bg-surface-variant text-on-surface-variant text-xs py-1 px-2 border-none outline-none cursor-pointer rounded">
|
||||
<option value="cyberpunk">Cyberpunk</option>
|
||||
<option value="glacier">Glacier</option>
|
||||
<option value="gruvbox">Gruvbox</option>
|
||||
</select>
|
||||
<button id="import-theme-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Import Theme">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">upload_file</span>
|
||||
</button>
|
||||
<input type="file" id="import-theme-input" accept=".json" class="hidden">
|
||||
<button id="sftp-toggle-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="SFTP File Manager">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">folder_open</span>
|
||||
</button>
|
||||
<button id="search-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Search (Ctrl+Shift+F)">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">search</span>
|
||||
</button>
|
||||
<button id="export-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Export Terminal Log">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">download</span>
|
||||
</button>
|
||||
<button id="agent-toggle-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center hidden" title="AI Agent Assistant">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">psychology</span>
|
||||
</button>
|
||||
<button id="disconnect-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Disconnect">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">power_settings_new</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Tab Bar(标签栏) -->
|
||||
<div id="tab-bar" class="flex items-center bg-background border-b border-outline-variant px-2 h-9 overflow-x-auto custom-scrollbar gap-0.5"
|
||||
style="scrollbar-width: thin;">
|
||||
<!-- 由 TabManager 动态渲染标签 -->
|
||||
<button id="new-tab-btn" class="tab-new-btn" title="New Connection">
|
||||
<span class="material-symbols-outlined" style="font-size:16px;">add</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Main Terminal -->
|
||||
<main class="flex-1 p-6 pb-14 relative bg-surface-container-lowest overflow-hidden">
|
||||
<div class="absolute inset-0 scanline pointer-events-none z-10 opacity-30"></div>
|
||||
<div id="terminal-wrapper" class="h-full w-full border border-outline-variant bg-[var(--bg)] p-4 overflow-hidden font-code text-[13px] text-primary-container relative z-0 flex flex-col">
|
||||
<!-- Status Bar -->
|
||||
<div class="flex justify-between items-center border-b border-[var(--border)] pb-2 mb-4 text-on-surface-variant opacity-80 text-[11px]">
|
||||
<div class="flex gap-6">
|
||||
<span id="term-status" class="flex items-center gap-1"><div class="w-2 h-2 bg-primary-container"></div> Connected</span>
|
||||
<span id="term-host">Host: -</span>
|
||||
<span id="term-user">User: -</span>
|
||||
<span id="term-port">Port: -</span>
|
||||
</div>
|
||||
<div>
|
||||
<span id="term-info"></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Terminal Area (TabManager 在此动态创建每个标签的容器) -->
|
||||
<div id="terminal-area" class="flex-1 overflow-hidden relative"></div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="fixed bottom-0 left-0 w-full px-6 py-2 flex justify-between items-center z-50 bg-elevated border-t border-outline-variant text-xs h-12">
|
||||
<div class="text-secondary-container opacity-60">© <span id="copyright-year"></span> CLOUD_SSH_TERMINAL - https://github.com/newbietan/CloudSSH</div>
|
||||
<div class="flex gap-4">
|
||||
<a class="text-on-surface-variant opacity-60 hover:opacity-100 transition-opacity" href="https://github.com/newbietan/CloudSSH">Documentation</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</head>
|
||||
<body class="min-h-screen font-body text-sm overflow-hidden">
|
||||
<div id="app">
|
||||
<!-- Login Page (匿名连接) -->
|
||||
<div id="auth-section" class="min-h-screen flex items-center justify-center p-6 relative">
|
||||
<div class="scanlines"></div>
|
||||
<div class="flicker"></div>
|
||||
<main class="w-full max-w-md relative z-10">
|
||||
<div class="mb-8 text-center">
|
||||
<div class="text-3xl font-bold text-primary tracking-tighter mb-2">CloudSSH<span class="blinking-cursor"></span></div>
|
||||
</div>
|
||||
<div class="cyber-box p-6 shadow-2xl relative">
|
||||
<div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-transparent via-[var(--accent)] to-transparent opacity-50"></div>
|
||||
<div class="flex items-center justify-between mb-8 pb-4 border-b border-dim">
|
||||
<span class="text-xs font-bold tracking-[0.1em] text-[var(--accent-secondary)]">CONNECTION_PARAMETERS</span>
|
||||
<span class="material-symbols-outlined text-[var(--accent-secondary)]" style="font-variation-settings: 'FILL' 0;">terminal</span>
|
||||
</div>
|
||||
<div id="connection-form-container"></div>
|
||||
</div>
|
||||
<div class="mt-8 text-center text-[13px] text-muted opacity-60">SYSTEM READY. WAITING FOR INPUT.</div>
|
||||
<div class="mt-4 text-center">
|
||||
<a href="https://github.com/newbietan/CloudSSH" class="text-[13px] text-primary opacity-60 hover:opacity-100 transition-colors tracking-widest uppercase">[ GitHub Open Source ]</a>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- User Space Page (登录后) -->
|
||||
<div id="user-space-section" class="hidden min-h-screen flex-col bg-elevated text-on-surface">
|
||||
<!-- TopAppBar -->
|
||||
<header class="flex justify-between items-center w-full px-6 h-16 bg-elevated border-b border-outline-variant z-50">
|
||||
<div class="flex items-center gap-6">
|
||||
<h1 class="text-2xl font-bold text-primary-container tracking-tighter cursor-pointer" id="user-space-logo">CloudSSH</h1>
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
<div id="user-info" class="flex items-center gap-3">
|
||||
<!-- 动态渲染:头像 + 用户名 -->
|
||||
</div>
|
||||
<button id="ai-config-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="AI Agent Settings">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">psychology</span>
|
||||
</button>
|
||||
<button id="logout-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center text-error" title="Logout">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">logout</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Server List Area -->
|
||||
<main class="flex-1 p-6 relative overflow-auto custom-scrollbar">
|
||||
<div class="scanlines pointer-events-none"></div>
|
||||
<div class="max-w-5xl mx-auto">
|
||||
<!-- 顶部操作栏 -->
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div>
|
||||
<h2 class="text-lg font-bold text-primary tracking-[0.1em]">SERVER_LIST</h2>
|
||||
<p class="text-xs text-muted opacity-60 mt-1">Manage your SSH connections</p>
|
||||
</div>
|
||||
<button id="add-server-btn" class="cyber-button text-primary py-2 px-4 text-xs font-bold tracking-[0.1em] uppercase flex items-center gap-2">
|
||||
<span class="material-symbols-outlined" style="font-size: 16px;">add</span>
|
||||
ADD_SERVER
|
||||
</button>
|
||||
</div>
|
||||
<!-- 服务器卡片网格 -->
|
||||
<div id="server-grid" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
<!-- 由 JS 动态渲染 -->
|
||||
</div>
|
||||
<!-- 空状态 -->
|
||||
<div id="empty-state" class="hidden flex-col items-center justify-center py-20">
|
||||
<span class="material-symbols-outlined text-dim mb-4" style="font-size: 64px; font-variation-settings: 'FILL' 0;">dns</span>
|
||||
<p class="text-muted text-sm tracking-[0.1em] mb-2">NO_SERVERS_CONFIGURED</p>
|
||||
<p class="text-dim text-xs mb-6">Add a server to get started</p>
|
||||
<button id="empty-add-btn" class="cyber-button text-primary py-2 px-6 text-xs font-bold tracking-[0.1em] uppercase flex items-center gap-2">
|
||||
<span class="material-symbols-outlined" style="font-size: 16px;">add</span>
|
||||
ADD_FIRST_SERVER
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="px-6 py-2 flex justify-between items-center z-50 bg-elevated border-t border-outline-variant text-xs h-12">
|
||||
<div class="text-secondary-container opacity-60">© <span id="user-copyright-year"></span> CLOUD_SSH_TERMINAL - https://github.com/newbietan/CloudSSH</div>
|
||||
<div class="flex gap-4">
|
||||
<a class="text-on-surface-variant opacity-60 hover:opacity-100 transition-opacity" href="https://github.com/newbietan/CloudSSH">Documentation</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Server Modal (添加/编辑) -->
|
||||
<div id="server-modal" class="hidden fixed inset-0 z-[100] flex items-center justify-center">
|
||||
<div class="modal-overlay absolute inset-0" id="modal-backdrop"></div>
|
||||
<div class="cyber-box p-6 shadow-2xl relative z-10 w-full max-w-md mx-4">
|
||||
<div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-transparent via-[var(--accent-secondary)] to-transparent opacity-50"></div>
|
||||
<div class="flex items-center justify-between mb-6 pb-4 border-b border-dim">
|
||||
<span id="modal-title" class="text-xs font-bold tracking-[0.1em] text-[var(--accent-secondary)]">ADD_SERVER</span>
|
||||
<button id="modal-close-btn" class="text-muted hover:text-primary transition-colors cursor-pointer">
|
||||
<span class="material-symbols-outlined" style="font-size: 20px;">close</span>
|
||||
</button>
|
||||
</div>
|
||||
<form id="server-form" class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">SERVER_NAME</label>
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">label</span>
|
||||
<input id="server-name" class="terminal-input text-[13px]" placeholder="My Server" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-4 gap-4">
|
||||
<div class="col-span-3">
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">HOST_ADDRESS</label>
|
||||
<div class="flex items-center">
|
||||
<span class="text-muted mr-2">></span>
|
||||
<input id="server-host" class="terminal-input text-[13px]" placeholder="192.168.1.1" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-1">
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">PORT</label>
|
||||
<div class="flex items-center">
|
||||
<span class="text-muted mr-2">:</span>
|
||||
<input id="server-port" class="terminal-input text-[13px]" placeholder="22" type="text" value="22">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">AUTH_USER</label>
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">person</span>
|
||||
<input id="server-username" class="terminal-input text-[13px]" placeholder="root" type="text" required>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold tracking-[0.1em] text-muted mb-2">AUTH_METHOD</label>
|
||||
<div class="flex gap-2 mb-3">
|
||||
<button type="button" id="modal-auth-tab-password" class="auth-tab auth-tab-active px-3 py-1 text-[11px] font-bold tracking-[0.1em] cursor-pointer transition-all">PASSWORD</button>
|
||||
<button type="button" id="modal-auth-tab-key" class="auth-tab px-3 py-1 text-[11px] font-bold tracking-[0.1em] cursor-pointer transition-all">PRIVATE_KEY</button>
|
||||
</div>
|
||||
<div id="modal-password-section">
|
||||
<div class="flex items-center">
|
||||
<span class="material-symbols-outlined text-muted mr-2" style="font-size: 16px;">key</span>
|
||||
<input id="server-password" class="terminal-input text-[13px]" placeholder="••••••••" type="password">
|
||||
</div>
|
||||
</div>
|
||||
<div id="modal-key-section" style="display:none;">
|
||||
<textarea id="server-private-key" class="terminal-input text-[11px] w-full" rows="4" placeholder="-----BEGIN OPENSSH PRIVATE KEY----- ...粘贴私钥内容... -----END OPENSSH PRIVATE KEY-----" style="resize:vertical;border:1px solid var(--border-strong);padding:8px;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-2">
|
||||
<button id="server-submit-btn" class="cyber-button w-full py-3 px-4 text-xs font-bold tracking-[0.1em] uppercase flex items-center justify-center gap-2 bg-primary text-on-primary" type="button">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px;">save</span>
|
||||
SAVE_SERVER
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Terminal Page -->
|
||||
<div id="terminal-section" class="hidden h-screen flex-col bg-background text-on-surface">
|
||||
<!-- TopAppBar -->
|
||||
<header class="flex justify-between items-center w-full px-6 h-16 bg-background border-b border-outline-variant z-50">
|
||||
<div class="flex items-center gap-6">
|
||||
<h1 class="text-2xl font-bold text-primary-container tracking-tighter cursor-pointer">CloudSSH</h1>
|
||||
</div>
|
||||
<div class="flex items-center gap-4 text-primary-container">
|
||||
<select id="theme-selector" class="bg-surface-variant text-on-surface-variant text-xs py-1 px-2 border-none outline-none cursor-pointer rounded">
|
||||
<option value="cyberpunk">Cyberpunk</option>
|
||||
<option value="glacier">Glacier</option>
|
||||
<option value="gruvbox">Gruvbox</option>
|
||||
</select>
|
||||
<button id="import-theme-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Import Theme">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">upload_file</span>
|
||||
</button>
|
||||
<input type="file" id="import-theme-input" accept=".json" class="hidden">
|
||||
<button id="sftp-toggle-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="SFTP File Manager">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">folder_open</span>
|
||||
</button>
|
||||
<button id="search-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Search (Ctrl+Shift+F)">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">search</span>
|
||||
</button>
|
||||
<button id="export-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Export Terminal Log">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">download</span>
|
||||
</button>
|
||||
<button id="agent-toggle-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center hidden" title="AI Agent Assistant">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">psychology</span>
|
||||
</button>
|
||||
<button id="disconnect-btn" class="hover:opacity-80 transition-opacity cursor-pointer p-1 flex items-center justify-center" title="Disconnect">
|
||||
<span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 0;">power_settings_new</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Tab Bar(标签栏) -->
|
||||
<div id="tab-bar" class="flex items-center bg-background border-b border-outline-variant px-2 h-9 overflow-x-auto custom-scrollbar gap-0.5"
|
||||
style="scrollbar-width: thin;">
|
||||
<!-- 由 TabManager 动态渲染标签 -->
|
||||
<button id="new-tab-btn" class="tab-new-btn" title="New Connection">
|
||||
<span class="material-symbols-outlined" style="font-size:16px;">add</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Main Terminal -->
|
||||
<main class="flex-1 p-6 pb-14 relative bg-surface-container-lowest overflow-hidden">
|
||||
<div class="absolute inset-0 scanline pointer-events-none z-10 opacity-30"></div>
|
||||
<div id="terminal-wrapper" class="h-full w-full border border-outline-variant bg-[var(--bg)] p-4 overflow-hidden font-code text-[13px] text-primary-container relative z-0 flex flex-col">
|
||||
<!-- Status Bar -->
|
||||
<div class="flex justify-between items-center border-b border-[var(--border)] pb-2 mb-4 text-on-surface-variant opacity-80 text-[11px]">
|
||||
<div class="flex gap-6">
|
||||
<span id="term-status" class="flex items-center gap-1"><div class="w-2 h-2 bg-primary-container"></div> Connected</span>
|
||||
<span id="term-host">Host: -</span>
|
||||
<span id="term-user">User: -</span>
|
||||
<span id="term-port">Port: -</span>
|
||||
</div>
|
||||
<div>
|
||||
<span id="term-info"></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Terminal Area (TabManager 在此动态创建每个标签的容器) -->
|
||||
<div id="terminal-area" class="flex-1 overflow-hidden relative"></div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="fixed bottom-0 left-0 w-full px-6 py-2 flex justify-between items-center z-50 bg-elevated border-t border-outline-variant text-xs h-12">
|
||||
<div class="text-secondary-container opacity-60">© <span id="copyright-year"></span> CLOUD_SSH_TERMINAL - https://github.com/newbietan/CloudSSH</div>
|
||||
<div class="flex gap-4">
|
||||
<a class="text-on-surface-variant opacity-60 hover:opacity-100 transition-opacity" href="https://github.com/newbietan/CloudSSH">Documentation</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
@@ -1267,13 +1267,21 @@ export class SSHSession {
|
||||
offset += reqTypeLen;
|
||||
offset += 1; // skip want_reply
|
||||
|
||||
if (reqType === 'exit-status' || reqType === 'exit-signal') {
|
||||
if (reqType === 'exit-status') {
|
||||
const execCh = this.activeExecChannels.get(reqChannelID);
|
||||
if (execCh) {
|
||||
const exitCode = (payload[offset] << 24) | (payload[offset+1] << 16) | (payload[offset+2] << 8) | payload[offset+3];
|
||||
execCh.onExitStatus(exitCode);
|
||||
this.sendDebug(`Exec channel exit-status: channelID=${reqChannelID}, exitCode=${exitCode}`);
|
||||
}
|
||||
} else if (reqType === 'exit-signal') {
|
||||
const execCh = this.activeExecChannels.get(reqChannelID);
|
||||
if (execCh) {
|
||||
// According to RFC 4254 §6.10, exit-signal contains: string signal name, boolean core dumped, string error message...
|
||||
// We set a non-zero exit code (e.g., 1) to represent abnormal termination, avoiding incorrect 4-byte parsing.
|
||||
execCh.onExitStatus(1);
|
||||
this.sendDebug(`Exec channel exit-signal received: channelID=${reqChannelID}`);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1686,7 +1694,14 @@ export class SSHSession {
|
||||
return;
|
||||
}
|
||||
|
||||
const effectiveUserId = userId || this.userId;
|
||||
// Securely verify userId. Always use the authenticated session userId (this.userId).
|
||||
// Reject requests if client provides a conflicting userId.
|
||||
if (userId && this.userId && userId !== this.userId) {
|
||||
this.sendAgentFrame({ type: 'agent_frame', subType: 'error', message: '用户身份不匹配,越权操作已被拦截' });
|
||||
return;
|
||||
}
|
||||
|
||||
const effectiveUserId = this.userId;
|
||||
if (!effectiveUserId) {
|
||||
this.sendAgentFrame({ type: 'agent_frame', subType: 'error', message: '需要登录用户才能使用 AI 助手' });
|
||||
return;
|
||||
|
||||
+13
-2
@@ -754,8 +754,19 @@ export class UserDBDO {
|
||||
api_key?: string;
|
||||
}>();
|
||||
|
||||
if (!body.base_url || !body.model) {
|
||||
return Response.json({ error: 'Missing base_url or model' }, { status: 400 });
|
||||
if (!body.user_id || !body.base_url || !body.model) {
|
||||
return Response.json({ error: 'Missing user_id, base_url or model' }, { status: 400 });
|
||||
}
|
||||
|
||||
// Check if an existing configuration exists with a valid API key
|
||||
const existing = this.db.exec(
|
||||
'SELECT api_key_enc FROM ai_configs WHERE user_id = ?',
|
||||
body.user_id
|
||||
).toArray();
|
||||
const hasExistingKey = existing.length > 0 && !!(existing[0] as any).api_key_enc;
|
||||
|
||||
if (!body.api_key && !hasExistingKey) {
|
||||
return Response.json({ error: '首次配置必须填写 API Key' }, { status: 400 });
|
||||
}
|
||||
|
||||
let encrypted: string | null = null;
|
||||
|
||||
Reference in new issue
Block a user