@co0ontty/wand 1.20.4 → 1.21.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/claude-pty-bridge.d.ts +8 -0
- package/dist/claude-pty-bridge.js +34 -11
- package/dist/git-quick-commit.js +12 -4
- package/dist/models.d.ts +3 -1
- package/dist/models.js +45 -7
- package/dist/process-manager.d.ts +2 -0
- package/dist/process-manager.js +80 -17
- package/dist/pty-text-utils.d.ts +25 -1
- package/dist/pty-text-utils.js +158 -2
- package/dist/server-session-routes.d.ts +1 -1
- package/dist/server-session-routes.js +22 -8
- package/dist/server.d.ts +3 -0
- package/dist/server.js +49 -12
- package/dist/session-logger.d.ts +15 -4
- package/dist/session-logger.js +52 -4
- package/dist/structured-session-manager.d.ts +12 -2
- package/dist/structured-session-manager.js +465 -22
- package/dist/types.d.ts +13 -2
- package/dist/web-ui/content/scripts.js +680 -178
- package/dist/web-ui/content/styles.css +137 -41
- package/dist/web-ui/content/vendor/wterm/wterm.bundle.js +1 -1
- package/dist/ws-broadcast.js +74 -12
- package/package.json +1 -1
|
@@ -382,8 +382,9 @@
|
|
|
382
382
|
/* .sidebar-open class toggled for semantic purposes only; sidebar overlays without resizing main layout */
|
|
383
383
|
.sidebar-open:not(.sidebar-pinned) .input-panel {
|
|
384
384
|
opacity: 0;
|
|
385
|
+
visibility: hidden;
|
|
385
386
|
pointer-events: none;
|
|
386
|
-
transition: opacity 0.2s ease;
|
|
387
|
+
transition: opacity 0.2s ease, visibility 0s linear 0.2s;
|
|
387
388
|
}
|
|
388
389
|
|
|
389
390
|
/* ===== 侧边栏常驻 ===== */
|
|
@@ -2236,6 +2237,52 @@
|
|
|
2236
2237
|
gap: 8px;
|
|
2237
2238
|
position: relative;
|
|
2238
2239
|
}
|
|
2240
|
+
|
|
2241
|
+
/* 顶部细进度条:会话运行中时流动 */
|
|
2242
|
+
.main-header-row::after {
|
|
2243
|
+
content: "";
|
|
2244
|
+
position: absolute;
|
|
2245
|
+
left: 0;
|
|
2246
|
+
right: 0;
|
|
2247
|
+
bottom: 0;
|
|
2248
|
+
height: 2px;
|
|
2249
|
+
pointer-events: none;
|
|
2250
|
+
background: linear-gradient(
|
|
2251
|
+
90deg,
|
|
2252
|
+
transparent 0%,
|
|
2253
|
+
rgba(var(--accent-rgb, 197, 101, 61), 0.85) 35%,
|
|
2254
|
+
rgba(var(--accent-rgb, 197, 101, 61), 1) 50%,
|
|
2255
|
+
rgba(var(--accent-rgb, 197, 101, 61), 0.85) 65%,
|
|
2256
|
+
transparent 100%
|
|
2257
|
+
);
|
|
2258
|
+
background-size: 220% 100%;
|
|
2259
|
+
background-position: 100% center;
|
|
2260
|
+
opacity: 0;
|
|
2261
|
+
transition: opacity 0.25s ease;
|
|
2262
|
+
}
|
|
2263
|
+
.main-header-row.is-running::after {
|
|
2264
|
+
opacity: 1;
|
|
2265
|
+
animation: topbarProgressFlow 1.6s linear infinite;
|
|
2266
|
+
}
|
|
2267
|
+
.main-header-row.is-permission-blocked::after {
|
|
2268
|
+
background: linear-gradient(
|
|
2269
|
+
90deg,
|
|
2270
|
+
transparent 0%,
|
|
2271
|
+
rgba(169, 106, 47, 0.85) 35%,
|
|
2272
|
+
rgba(169, 106, 47, 1) 50%,
|
|
2273
|
+
rgba(169, 106, 47, 0.85) 65%,
|
|
2274
|
+
transparent 100%
|
|
2275
|
+
);
|
|
2276
|
+
background-size: 220% 100%;
|
|
2277
|
+
animation-duration: 2.4s;
|
|
2278
|
+
}
|
|
2279
|
+
@keyframes topbarProgressFlow {
|
|
2280
|
+
0% { background-position: 100% center; }
|
|
2281
|
+
100% { background-position: -100% center; }
|
|
2282
|
+
}
|
|
2283
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2284
|
+
.main-header-row.is-running::after { animation: none; opacity: 0.7; }
|
|
2285
|
+
}
|
|
2239
2286
|
.topbar-left {
|
|
2240
2287
|
display: flex;
|
|
2241
2288
|
align-items: center;
|
|
@@ -2381,6 +2428,18 @@
|
|
|
2381
2428
|
}
|
|
2382
2429
|
.session-status-pill.failed .session-status-dot { background: var(--danger); }
|
|
2383
2430
|
.session-status-pill.archived { opacity: 0.7; }
|
|
2431
|
+
/* 运行/思考中状态的累计耗时 */
|
|
2432
|
+
.session-status-pill .session-status-elapsed {
|
|
2433
|
+
flex-shrink: 0;
|
|
2434
|
+
margin-left: 4px;
|
|
2435
|
+
padding-left: 6px;
|
|
2436
|
+
border-left: 1px solid currentColor;
|
|
2437
|
+
opacity: 0.75;
|
|
2438
|
+
font-variant-numeric: tabular-nums;
|
|
2439
|
+
font-family: var(--font-mono, monospace);
|
|
2440
|
+
font-size: 0.65rem;
|
|
2441
|
+
letter-spacing: -0.01em;
|
|
2442
|
+
}
|
|
2384
2443
|
|
|
2385
2444
|
/* Current task indicator(动态活动徽标,由 updateTaskDisplay 管理) */
|
|
2386
2445
|
.current-task {
|
|
@@ -2501,13 +2560,31 @@
|
|
|
2501
2560
|
padding: 12px;
|
|
2502
2561
|
border-radius: 0;
|
|
2503
2562
|
box-shadow: none;
|
|
2563
|
+
/* PC 端(Windows 125%/150% 缩放、Linux 1× DPR 等)字符渲染特别敏感:
|
|
2564
|
+
* 1) 默认子像素抗锯齿在彩色终端背景下视觉发虚 → 强制灰度抗锯齿;
|
|
2565
|
+
* 2) 等宽字体的连字(liga/calt)和 kerning 会让 ">=" / "->" 等
|
|
2566
|
+
* 字符相邻时实际宽度变化,破坏 wterm 用 "W" 单字符测出的等宽
|
|
2567
|
+
* 假设,累积下来就是字符错列;
|
|
2568
|
+
* 3) text-rendering: geometricPrecision 让浏览器按字形几何排版,
|
|
2569
|
+
* 不再做 optimizeSpeed 的整数像素吸附,配合下面的整数 row-height
|
|
2570
|
+
* 让网格对齐稳定。 */
|
|
2571
|
+
-webkit-font-smoothing: antialiased;
|
|
2572
|
+
-moz-osx-font-smoothing: grayscale;
|
|
2573
|
+
text-rendering: geometricPrecision;
|
|
2574
|
+
font-variant-ligatures: none;
|
|
2575
|
+
font-feature-settings: "liga" 0, "clig" 0, "calt" 0, "dlig" 0;
|
|
2576
|
+
font-kerning: none;
|
|
2504
2577
|
--term-fg: #f5eadc;
|
|
2505
2578
|
--term-bg: transparent;
|
|
2506
2579
|
--term-cursor: #d67b52;
|
|
2507
2580
|
--term-font-family: "Geist Mono", "SF Mono", monospace;
|
|
2508
2581
|
--term-font-size: 13px;
|
|
2509
|
-
|
|
2510
|
-
|
|
2582
|
+
/* 行高直接给整数像素,避免 13×1.5=19.5 的亚像素行:PC 端 1× DPR 时
|
|
2583
|
+
* 浏览器把 19.5 四舍五入成 19 或 20,相邻行的吸附方向不一致就会
|
|
2584
|
+
* 出现错位。20px 是 wterm 既定的 cell 高度基线,移动端高 DPR 也
|
|
2585
|
+
* 完全不变。 */
|
|
2586
|
+
--term-line-height: 1.54;
|
|
2587
|
+
--term-row-height: 20px;
|
|
2511
2588
|
--term-color-0: #1f1b17;
|
|
2512
2589
|
--term-color-1: #d27766;
|
|
2513
2590
|
--term-color-2: #7fa36f;
|
|
@@ -4864,6 +4941,7 @@
|
|
|
4864
4941
|
overscroll-behavior: contain;
|
|
4865
4942
|
touch-action: pan-y;
|
|
4866
4943
|
border-top: 1px solid var(--border-subtle);
|
|
4944
|
+
transition: opacity 0.2s ease, visibility 0s;
|
|
4867
4945
|
}
|
|
4868
4946
|
|
|
4869
4947
|
.input-composer {
|
|
@@ -5221,6 +5299,18 @@
|
|
|
5221
5299
|
.input-label { font-size: 0.6875rem; color: var(--text-muted); font-weight: 500; }
|
|
5222
5300
|
.input-textarea-wrap { position: relative; width: 100%; }
|
|
5223
5301
|
|
|
5302
|
+
/* Composer top row: holds todo collapse bar (left) + reply status bar (right) on one line */
|
|
5303
|
+
.composer-top-row {
|
|
5304
|
+
display: flex;
|
|
5305
|
+
align-items: flex-start;
|
|
5306
|
+
gap: 8px;
|
|
5307
|
+
min-width: 0;
|
|
5308
|
+
}
|
|
5309
|
+
.composer-top-row:has(> .todo-progress:not(.hidden)),
|
|
5310
|
+
.composer-top-row:has(> .structured-status-bar) {
|
|
5311
|
+
margin-bottom: 6px;
|
|
5312
|
+
}
|
|
5313
|
+
|
|
5224
5314
|
/* Todo progress bar */
|
|
5225
5315
|
.todo-progress {
|
|
5226
5316
|
margin-bottom: 6px;
|
|
@@ -5229,6 +5319,11 @@
|
|
|
5229
5319
|
transition: all var(--transition-fast);
|
|
5230
5320
|
}
|
|
5231
5321
|
.todo-progress.hidden { display: none; }
|
|
5322
|
+
.composer-top-row > .todo-progress {
|
|
5323
|
+
flex: 1;
|
|
5324
|
+
min-width: 0;
|
|
5325
|
+
margin-bottom: 0;
|
|
5326
|
+
}
|
|
5232
5327
|
.todo-progress-header {
|
|
5233
5328
|
display: flex;
|
|
5234
5329
|
align-items: center;
|
|
@@ -5764,6 +5859,16 @@
|
|
|
5764
5859
|
padding-bottom: 28px;
|
|
5765
5860
|
min-height: 60px;
|
|
5766
5861
|
}
|
|
5862
|
+
/* 终端交互模式下 textarea 设为 readonly,按键透传到 PTY。
|
|
5863
|
+
视觉上给一个降饱和度 + 斜体 placeholder,让用户感知到"这里
|
|
5864
|
+
不再录字、键被直接送到终端",避免疑惑为什么打字没字落下来。 */
|
|
5865
|
+
.input-textarea.is-terminal-passthrough {
|
|
5866
|
+
opacity: 0.7;
|
|
5867
|
+
cursor: default;
|
|
5868
|
+
}
|
|
5869
|
+
.input-textarea.is-terminal-passthrough::placeholder {
|
|
5870
|
+
font-style: italic;
|
|
5871
|
+
}
|
|
5767
5872
|
|
|
5768
5873
|
.input-inline-controls {
|
|
5769
5874
|
}
|
|
@@ -5939,47 +6044,36 @@
|
|
|
5939
6044
|
50% { transform: scale(1.15); opacity: 1; }
|
|
5940
6045
|
}
|
|
5941
6046
|
|
|
5942
|
-
/*
|
|
5943
|
-
|
|
5944
|
-
|
|
5945
|
-
|
|
5946
|
-
|
|
6047
|
+
/* 优化中:输入框整体出现柔和的边框光晕 + textarea 区域
|
|
6048
|
+
的横向流光,文字保持原样,不打扰用户阅读。 */
|
|
6049
|
+
.input-composer.is-optimizing {
|
|
6050
|
+
border-color: rgba(197, 101, 61, 0.42);
|
|
6051
|
+
box-shadow:
|
|
6052
|
+
0 0 0 2px rgba(197, 101, 61, 0.10),
|
|
6053
|
+
0 0 18px rgba(197, 101, 61, 0.14);
|
|
6054
|
+
}
|
|
6055
|
+
.input-composer.is-optimizing .input-textarea-wrap::before {
|
|
6056
|
+
content: "";
|
|
5947
6057
|
position: absolute;
|
|
6058
|
+
inset: 0;
|
|
5948
6059
|
pointer-events: none;
|
|
5949
|
-
|
|
5950
|
-
white-space: pre-wrap;
|
|
5951
|
-
word-wrap: break-word;
|
|
5952
|
-
overflow-wrap: break-word;
|
|
5953
|
-
color: transparent;
|
|
5954
|
-
background-image: linear-gradient(
|
|
6060
|
+
background: linear-gradient(
|
|
5955
6061
|
100deg,
|
|
5956
|
-
|
|
5957
|
-
|
|
5958
|
-
rgba(
|
|
5959
|
-
|
|
5960
|
-
|
|
6062
|
+
transparent 0%,
|
|
6063
|
+
transparent 38%,
|
|
6064
|
+
rgba(214, 123, 82, 0.16) 50%,
|
|
6065
|
+
transparent 62%,
|
|
6066
|
+
transparent 100%
|
|
5961
6067
|
);
|
|
5962
|
-
background-size:
|
|
6068
|
+
background-size: 220% 100%;
|
|
5963
6069
|
background-repeat: no-repeat;
|
|
5964
|
-
background-position:
|
|
5965
|
-
-
|
|
5966
|
-
|
|
5967
|
-
-webkit-text-fill-color: transparent;
|
|
5968
|
-
animation: prompt-optimize-shimmer 1.4s linear infinite;
|
|
5969
|
-
z-index: 2;
|
|
5970
|
-
}
|
|
5971
|
-
@keyframes prompt-optimize-shimmer {
|
|
5972
|
-
from { background-position: 250% 0; }
|
|
5973
|
-
to { background-position: -150% 0; }
|
|
6070
|
+
background-position: 220% 0;
|
|
6071
|
+
animation: prompt-optimize-flow 1.6s linear infinite;
|
|
6072
|
+
z-index: 0;
|
|
5974
6073
|
}
|
|
5975
|
-
|
|
5976
|
-
|
|
5977
|
-
|
|
5978
|
-
animation: prompt-optimize-flash 0.85s ease-out;
|
|
5979
|
-
}
|
|
5980
|
-
@keyframes prompt-optimize-flash {
|
|
5981
|
-
0% { background: rgba(197, 101, 61, 0.18); }
|
|
5982
|
-
100% { background: transparent; }
|
|
6074
|
+
@keyframes prompt-optimize-flow {
|
|
6075
|
+
from { background-position: 220% 0; }
|
|
6076
|
+
to { background-position: -120% 0; }
|
|
5983
6077
|
}
|
|
5984
6078
|
.prompt-optimize-btn.is-shake {
|
|
5985
6079
|
animation: prompt-optimize-shake 0.4s ease-out;
|
|
@@ -10030,20 +10124,22 @@
|
|
|
10030
10124
|
100% { background-position: 100% center; }
|
|
10031
10125
|
}
|
|
10032
10126
|
|
|
10033
|
-
/* ──
|
|
10127
|
+
/* ── 结构化会话状态条(与 todo 折叠栏共处一行,靠右) ── */
|
|
10034
10128
|
.structured-status-bar {
|
|
10035
10129
|
display: flex;
|
|
10036
10130
|
align-items: center;
|
|
10037
10131
|
justify-content: flex-end;
|
|
10038
10132
|
gap: 5px;
|
|
10039
|
-
margin: 0
|
|
10040
|
-
|
|
10133
|
+
margin: 0;
|
|
10134
|
+
margin-left: auto;
|
|
10135
|
+
padding: 4px 8px;
|
|
10041
10136
|
background: transparent;
|
|
10042
10137
|
border: none;
|
|
10043
10138
|
font-size: 0.6875rem;
|
|
10044
10139
|
color: var(--text-muted);
|
|
10045
10140
|
transition: all 0.3s ease;
|
|
10046
10141
|
overflow: hidden;
|
|
10142
|
+
flex-shrink: 0;
|
|
10047
10143
|
}
|
|
10048
10144
|
|
|
10049
10145
|
.structured-status-bar .status-bar-dot {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var WTermLib=(()=>{var u=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var v=(B,A)=>{for(var t in A)u(B,t,{get:A[t],enumerable:!0})},p=(B,A,t,s)=>{if(A&&typeof A=="object"||typeof A=="function")for(let e of x(A))!b.call(B,e)&&e!==t&&u(B,e,{get:()=>A[e],enumerable:!(s=F(A,e))||s.enumerable});return B};var m=B=>p(u({},"__esModule",{value:!0}),B);var N={};v(N,{InputHandler:()=>w,Renderer:()=>c,WTerm:()=>L,WasmBridge:()=>a,WebSocketTransport:()=>d});var G="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";function k(B){let A=atob(B),t=new Uint8Array(A.length);for(let s=0;s<A.length;s++)t[s]=A.charCodeAt(s);return t.buffer}var a=class B{constructor(A){this.gridPtr=0,this.dirtyPtr=0,this.writeBufferPtr=0,this.cellSize=12,this.maxCols=256,this.encoder=new TextEncoder,this.decoder=new TextDecoder,this.exports=A.exports,this.memory=this.exports.memory}static async load(A){let t;if(A){let e=await fetch(A);if(!e.ok)throw new Error(`[wterm] Failed to load WASM from ${A}: ${e.status} ${e.statusText}`);t=await e.arrayBuffer()}else t=k(G);let{instance:s}=await WebAssembly.instantiate(t);return new B(s)}init(A,t){this.exports.init(A,t),this._updatePointers()}_updatePointers(){this.gridPtr=this.exports.getGridPtr(),this.dirtyPtr=this.exports.getDirtyPtr(),this.writeBufferPtr=this.exports.getWriteBuffer(),this.cellSize=this.exports.getCellSize(),this.maxCols=this.exports.getMaxCols(),this._dv=new DataView(this.memory.buffer)}writeString(A){let t=this.encoder.encode(A);this.writeRaw(t)}writeRaw(A){let t=new Uint8Array(this.memory.buffer,this.writeBufferPtr,8192),s=0;for(;s<A.length;){let e=Math.min(A.length-s,8192);t.set(A.subarray(s,s+e)),this.exports.writeBytes(e),s+=e}}getCell(A,t){let s=this.gridPtr+(A*this.maxCols+t)*this.cellSize,e=this._dv;return{char:e.getUint32(s,!0),fg:e.getUint16(s+4,!0),bg:e.getUint16(s+6,!0),flags:e.getUint8(s+8)}}isDirtyRow(A){return new Uint8Array(this.memory.buffer,this.dirtyPtr,256)[A]!==0}clearDirty(){this.exports.clearDirty()}getCursor(){return{row:this.exports.getCursorRow(),col:this.exports.getCursorCol(),visible:this.exports.getCursorVisible()!==0}}getCols(){return this.exports.getCols()}getRows(){return this.exports.getRows()}cursorKeysApp(){return this.exports.getCursorKeysApp()!==0}bracketedPaste(){return this.exports.getBracketedPaste()!==0}usingAltScreen(){return this.exports.getUsingAltScreen()!==0}getTitle(){if(this.exports.getTitleChanged()===0)return null;let A=this.exports.getTitlePtr(),t=this.exports.getTitleLen(),s=new Uint8Array(this.memory.buffer,A,t);return this.decoder.decode(s)}getResponse(){let A=this.exports.getResponseLen();if(A===0)return null;let t=this.exports.getResponsePtr(),s=new Uint8Array(this.memory.buffer,t,A),e=this.decoder.decode(s);return this.exports.clearResponse(),e}getScrollbackCount(){return this.exports.getScrollbackCount()}getScrollbackCell(A,t){let e=this.exports.getScrollbackLine(A)+t*this.cellSize,i=this._dv;return{char:i.getUint32(e,!0),fg:i.getUint16(e+4,!0),bg:i.getUint16(e+6,!0),flags:i.getUint8(e+8)}}getScrollbackLineLen(A){return this.exports.getScrollbackLineLen(A)}resize(A,t){this.exports.resizeTerminal(A,t),this._updatePointers()}};var d=class{constructor(A={}){this._ws=null,this._reconnectTimer=null,this._reconnectDelay=1e3,this._closed=!1,this._buffer=[],this.url=A.url??null,this.reconnect=A.reconnect!==!1,this.maxReconnectDelay=A.maxReconnectDelay??3e4,this.onData=A.onData??null,this.onOpen=A.onOpen??null,this.onClose=A.onClose??null,this.onError=A.onError??null}connect(A){if(A&&(this.url=A),!this.url)throw new Error("No WebSocket URL provided");this._closed=!1,this._ws=new WebSocket(this.url),this._ws.binaryType="arraybuffer",this._ws.onopen=()=>{this._reconnectDelay=1e3,this._flushBuffer(),this.onOpen&&this.onOpen()},this._ws.onmessage=t=>{this.onData&&(t.data instanceof ArrayBuffer?this.onData(new Uint8Array(t.data)):this.onData(t.data))},this._ws.onclose=()=>{this.onClose&&this.onClose(),this.reconnect&&!this._closed&&this._scheduleReconnect()},this._ws.onerror=t=>{this.onError&&this.onError(t),this._ws?.close()}}send(A){this._ws&&this._ws.readyState===WebSocket.OPEN?typeof A=="string"?this._ws.send(new TextEncoder().encode(A)):this._ws.send(A):this._buffer.push(A)}close(){this._closed=!0,this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._ws&&this._ws.close()}get connected(){return this._ws!==null&&this._ws.readyState===WebSocket.OPEN}_flushBuffer(){let A=this._buffer.splice(0);for(let t of A)this.send(t)}_scheduleReconnect(){this._reconnectTimer=setTimeout(()=>{this.connect()},this._reconnectDelay),this._reconnectDelay=Math.min(this._reconnectDelay*2,this.maxReconnectDelay)}};function D(B){if(B===256)return null;if(B<16)return`var(--term-color-${B})`;if(B<232){let t=B-16,s=Math.floor(t/36)*51,e=Math.floor(t/6)%6*51,i=t%6*51;return`rgb(${s},${e},${i})`}let A=(B-232)*10+8;return`rgb(${A},${A},${A})`}function y(B,A,t){let s=B,e=A;if(t&32){let Q=s;s=e,e=Q,s===256&&(s=0),e===256&&(e=7)}let i=D(s),r=D(e),o="";i&&(o+=`color:${i};`),r&&(o+=`background:${r};`),t&1&&(o+="font-weight:bold;"),t&2&&(o+="opacity:0.5;"),t&4&&(o+="font-style:italic;");let E=[];return t&128&&E.push("line-through"),E.length&&(o+=`text-decoration:${E.join(" ")};`),t&64&&(o+="visibility:hidden;"),o}function f(B,A,t){if(t){let s=document.createElement("span");s.style.cssText=t,s.textContent=A,B.appendChild(s)}else B.appendChild(document.createTextNode(A))}function S(B,A,t){let s=B,e=A;return t&32&&([s,e]=[e,s],s===256&&(s=0),e===256&&(e=7)),{fg:D(s)||"var(--term-fg)",bg:D(e)||"var(--term-bg)"}}function R(B,A,t){switch(B){case 9600:return`linear-gradient(${A} 50%,${t} 50%)`;case 9601:return`linear-gradient(${t} 87.5%,${A} 87.5%)`;case 9602:return`linear-gradient(${t} 75%,${A} 75%)`;case 9603:return`linear-gradient(${t} 62.5%,${A} 62.5%)`;case 9604:return`linear-gradient(${t} 50%,${A} 50%)`;case 9605:return`linear-gradient(${t} 37.5%,${A} 37.5%)`;case 9606:return`linear-gradient(${t} 25%,${A} 25%)`;case 9607:return`linear-gradient(${t} 12.5%,${A} 12.5%)`;case 9608:return A;case 9609:return`linear-gradient(to right,${A} 87.5%,${t} 87.5%)`;case 9610:return`linear-gradient(to right,${A} 75%,${t} 75%)`;case 9611:return`linear-gradient(to right,${A} 62.5%,${t} 62.5%)`;case 9612:return`linear-gradient(to right,${A} 50%,${t} 50%)`;case 9613:return`linear-gradient(to right,${A} 37.5%,${t} 37.5%)`;case 9614:return`linear-gradient(to right,${A} 25%,${t} 25%)`;case 9615:return`linear-gradient(to right,${A} 12.5%,${t} 12.5%)`;case 9616:return`linear-gradient(to right,${t} 50%,${A} 50%)`;case 9617:return`color-mix(in srgb,${A} 25%,${t})`;case 9618:return`color-mix(in srgb,${A} 50%,${t})`;case 9619:return`color-mix(in srgb,${A} 75%,${t})`;case 9620:return`linear-gradient(${A} 12.5%,${t} 12.5%)`;case 9621:return`linear-gradient(to right,${t} 87.5%,${A} 87.5%)`;default:{let e={9622:[!1,!1,!0,!1],9623:[!1,!1,!1,!0],9624:[!0,!1,!1,!1],9625:[!0,!1,!0,!0],9626:[!0,!1,!1,!0],9627:[!0,!0,!0,!1],9628:[!0,!0,!1,!0],9629:[!1,!0,!1,!1],9630:[!1,!0,!0,!1],9631:[!1,!0,!0,!0]}[B];if(!e)return A;let[i,r,o,E]=e;if(i&&r&&o&&E)return A;let Q=[],C=["0 0","100% 0","0 100%","100% 100%"];return e.forEach((g,I)=>{g&&Q.push(`linear-gradient(${A},${A}) ${C[I]}/50% 50% no-repeat`)}),Q.push(t),Q.join(",")}}}var c=class{constructor(A){this.rows=0,this.cols=0,this.rowEls=[],this.prevCursorRow=-1,this.prevCursorCol=-1,this._scrollbackRowEls=[],this._renderedScrollbackCount=0,this.container=A}setup(A,t){this.cols=A,this.rows=t,this.container.innerHTML="",this.rowEls=[],this._scrollbackRowEls=[],this._renderedScrollbackCount=0;let s=document.createDocumentFragment();for(let e=0;e<t;e++){let i=document.createElement("div");i.className="term-row",s.appendChild(i),this.rowEls.push(i)}this.container.appendChild(s),this.prevCursorRow=-1,this.prevCursorCol=-1}_buildRowContent(A,t,s,e){A.textContent="";let i="",r="",o=0,E=Q=>{if(r)if(e>=o&&e<Q){let C=e-o,g=r.slice(0,C),I=r[C],h=r.slice(C+1);g&&f(A,g,i);let n=document.createElement("span");n.className="term-cursor",i&&(n.style.cssText=i),n.textContent=I,A.appendChild(n),h&&f(A,h,i)}else f(A,r,i)};for(let Q=0;Q<this.cols;Q++){let C=t(Q),g=Q<s,I=g?C.char:0;if(g&&I>=9600&&I<=9631){E(Q);let h=S(C.fg,C.bg,C.flags),n=document.createElement("span");n.className=Q===e?"term-block term-cursor":"term-block",n.style.background=R(I,h.fg,h.bg),C.flags&2&&(n.style.opacity="0.5"),A.appendChild(n),i="",r="",o=Q+1}else{let h=g&&I>=32?String.fromCodePoint(I):" ",n=g?y(C.fg,C.bg,C.flags):"";n!==i?(E(Q),i=n,r=h,o=Q):r+=h}}E(this.cols)}_buildScrollbackRowEl(A,t){let s=document.createElement("div");s.className="term-row term-scrollback-row";let e=A.getScrollbackLineLen(t);return this._buildRowContent(s,i=>A.getScrollbackCell(t,i),e,-1),s}syncScrollback(A){let t=A.getScrollbackCount();if(t!==this._renderedScrollbackCount){if(t>this._renderedScrollbackCount){let s=t-this._renderedScrollbackCount,e=this.rowEls[0]??null,i=document.createDocumentFragment();for(let r=s-1;r>=0;r--){let o=this._buildScrollbackRowEl(A,r);i.appendChild(o),this._scrollbackRowEls.push(o)}this.container.insertBefore(i,e)}else{let s=this._renderedScrollbackCount-t;for(let e=0;e<s;e++){let i=this._scrollbackRowEls.shift();i&&i.remove()}}this._renderedScrollbackCount=t}}render(A){let t=A.getRows(),s=A.getCols(),e=!1;(t!==this.rows||s!==this.cols)&&(this.setup(s,t),e=!0),this.syncScrollback(A);let i=A.getCursor(),r=i.visible,o=i.row!==this.prevCursorRow||i.col!==this.prevCursorCol;for(let E=0;E<this.rows;E++){let Q=e||A.isDirtyRow(E),C=E===this.prevCursorRow&&o,g=E===i.row;if(Q||C||g&&o){let I=g&&r?i.col:-1;this._buildRowContent(this.rowEls[E],h=>A.getCell(E,h),this.cols,I)}}this.prevCursorRow=i.row,this.prevCursorCol=i.col,A.clearDirty()}};var U={ArrowUp:"\x1B[A",ArrowDown:"\x1B[B",ArrowRight:"\x1B[C",ArrowLeft:"\x1B[D",Home:"\x1B[H",End:"\x1B[F"},H={ArrowUp:"\x1BOA",ArrowDown:"\x1BOB",ArrowRight:"\x1BOC",ArrowLeft:"\x1BOD",Home:"\x1BOH",End:"\x1BOF"},M={Enter:"\r",Backspace:"\x7F",Tab:" ",Escape:"\x1B",Insert:"\x1B[2~",Delete:"\x1B[3~",PageUp:"\x1B[5~",PageDown:"\x1B[6~",F1:"\x1BOP",F2:"\x1BOQ",F3:"\x1BOR",F4:"\x1BOS",F5:"\x1B[15~",F6:"\x1B[17~",F7:"\x1B[18~",F8:"\x1B[19~",F9:"\x1B[20~",F10:"\x1B[21~",F11:"\x1B[23~",F12:"\x1B[24~"},w=class{constructor(A,t,s){this.composing=!1,this.element=A,this.onData=t,this.getBridge=s,this.textarea=document.createElement("textarea"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.setAttribute("enterkeyhint","send"),this.textarea.setAttribute("tabindex","0"),this.textarea.setAttribute("aria-hidden","true");let e=this.textarea.style;e.position="absolute",e.left="-9999px",e.top="0",e.width="1px",e.height="1px",e.opacity="0",e.overflow="hidden",e.border="0",e.padding="0",e.margin="0",e.outline="none",e.resize="none",e.pointerEvents="none",e.caretColor="transparent",e.color="transparent",e.background="transparent",A.appendChild(this.textarea),this._onKeyDown=this.handleKeyDown.bind(this),this._onPaste=this.handlePaste.bind(this),this._onCompositionStart=this.handleCompositionStart.bind(this),this._onCompositionEnd=this.handleCompositionEnd.bind(this),this._onInput=this.handleInput.bind(this),this._onFocus=()=>this.element.classList.add("focused"),this._onBlur=()=>this.element.classList.remove("focused"),this.textarea.addEventListener("keydown",this._onKeyDown),this.textarea.addEventListener("paste",this._onPaste),this.textarea.addEventListener("compositionstart",this._onCompositionStart),this.textarea.addEventListener("compositionend",this._onCompositionEnd),this.textarea.addEventListener("input",this._onInput),this.textarea.addEventListener("focus",this._onFocus),this.textarea.addEventListener("blur",this._onBlur)}focus(){this.textarea.focus({preventScroll:!0})}destroy(){this.textarea.removeEventListener("keydown",this._onKeyDown),this.textarea.removeEventListener("paste",this._onPaste),this.textarea.removeEventListener("compositionstart",this._onCompositionStart),this.textarea.removeEventListener("compositionend",this._onCompositionEnd),this.textarea.removeEventListener("input",this._onInput),this.textarea.removeEventListener("focus",this._onFocus),this.textarea.removeEventListener("blur",this._onBlur),this.element.classList.remove("focused"),this.textarea.remove()}handleKeyDown(A){if(this.composing)return;if((A.metaKey||A.ctrlKey)&&A.key==="c"){let s=window.getSelection();if(s&&s.toString().length>0)return}if((A.metaKey||A.ctrlKey)&&A.key==="v"){this.textarea.focus();return}if(A.metaKey&&!A.ctrlKey){if(A.key==="Backspace")A.preventDefault(),this.onData("");else if(A.key==="a"){A.preventDefault();let s=window.getSelection();if(s){let e=document.createRange();e.selectNodeContents(this.element),s.removeAllRanges(),s.addRange(e)}}return}A.preventDefault();let t=this.keyToSequence(A);t&&this.onData(t)}handlePaste(A){A.preventDefault();let t=A.clipboardData?.getData("text");if(!t)return;let s=this.getBridge();s&&s.bracketedPaste()?this.onData("\x1B[200~"+t+"\x1B[201~"):this.onData(t)}handleCompositionStart(){this.composing=!0}handleCompositionEnd(A){this.composing=!1,A.data&&this.onData(A.data),this.textarea.value=""}handleInput(){if(this.composing)return;let A=this.textarea.value;A&&(this.onData(A),this.textarea.value="")}keyToSequence(A){if(A.ctrlKey&&!A.altKey&&!A.metaKey){if(A.key.length===1){let o=A.key.toLowerCase().charCodeAt(0);if(o>=97&&o<=122)return String.fromCharCode(o-96)}if(A.key==="[")return"\x1B";if(A.key==="\\")return"";if(A.key==="]")return"";if(A.key==="^")return"";if(A.key==="_")return""}if(A.key==="Enter"&&A.shiftKey)return"\x1B[13;2u";if(A.key==="Tab"&&A.shiftKey)return"\x1B[Z";let t=M[A.key];if(t)return A.altKey?"\x1B"+t:t;let s=this.getBridge(),r=(s&&s.cursorKeysApp()?H:U)[A.key];return r?A.altKey?"\x1B"+r:r:A.key.length===1&&!A.ctrlKey&&!A.metaKey?A.altKey?"\x1B"+A.key:A.key:null}};var l=class{constructor(A,t={}){this.bridge=null,this.renderer=null,this.input=null,this.rafId=null,this.resizeObserver=null,this._destroyed=!1,this._shouldScrollToBottom=!1,this.element=A,this.wasmUrl=t.wasmUrl,this.cols=t.cols||80,this.rows=t.rows||24,this.autoResize=t.autoResize!==!1,this.onData=t.onData||null,this.onTitle=t.onTitle||null,this.onResize=t.onResize||null,this._container=document.createElement("div"),this._container.className="term-grid",this.element.appendChild(this._container),this.element.classList.add("wterm"),t.cursorBlink&&this.element.classList.add("cursor-blink"),this._onClickFocus=()=>{let s=window.getSelection();(!s||s.isCollapsed)&&this.input?.focus()},this.element.addEventListener("click",this._onClickFocus)}async init(){try{if(this.bridge=await a.load(this.wasmUrl),this._destroyed)return this;this.bridge.init(this.cols,this.rows),this.renderer=new c(this._container),this.renderer.setup(this.cols,this.rows),this.input=new w(this.element,A=>{this.onData?this.onData(A):this.write(A)},()=>this.bridge),this.autoResize?this._setupResizeObserver():this._lockHeight(),this.input.focus(),this._initialRender()}catch(A){throw this.destroy(),new Error(`wterm: failed to initialize: ${A instanceof Error?A.message:A}`)}return this}_isScrolledToBottom(){let A=this.element;return A.scrollHeight-A.scrollTop-A.clientHeight<5}_scrollToBottom(){this.element.scrollTop=this.element.scrollHeight}write(A){this.bridge&&(this._shouldScrollToBottom=this._isScrolledToBottom(),typeof A=="string"?this.bridge.writeString(A):this.bridge.writeRaw(A),this._scheduleRender())}resize(A,t){this.bridge&&(this._shouldScrollToBottom=this._isScrolledToBottom(),this.cols=A,this.rows=t,this.bridge.resize(A,t),this.renderer?.setup(A,t),this._scheduleRender(),this.onResize&&this.onResize(A,t))}focus(){this.input?this.input.focus():this.element.focus()}_scheduleRender(){this.rafId==null&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null,this._doRender()}))}_initialRender(){this._doRender()}_doRender(){if(!this.bridge||!this.renderer)return;this.renderer.render(this.bridge);let A=this.bridge.getScrollbackCount()>0;this.element.classList.toggle("has-scrollback",A),this._shouldScrollToBottom&&this._scrollToBottom();let t=this.bridge.getTitle();t!==null&&this.onTitle&&this.onTitle(t);let s=this.bridge.getResponse();s!==null&&this.onData&&this.onData(s)}_lockHeight(){let A=getComputedStyle(this.element),t=parseFloat(A.getPropertyValue("--term-row-height"))||17,s=this.rows*t,e=(parseFloat(A.paddingTop)||0)+(parseFloat(A.paddingBottom)||0);A.boxSizing==="border-box"&&(e+=(parseFloat(A.borderTopWidth)||0)+(parseFloat(A.borderBottomWidth)||0)),this.element.style.height=`${s+e}px`}_measureCharSize(){let A=document.createElement("span");A.className="term-cell",A.textContent="W",A.style.position="absolute",A.style.visibility="hidden",this._container.appendChild(A);let t=A.getBoundingClientRect(),s=t.width,e=t.height;return A.remove(),s===0||e===0?null:{width:s,height:e}}_setupResizeObserver(){let A=this._measureCharSize();if(!A)return;let t=A.width,s=A.height;this.resizeObserver=new ResizeObserver(e=>{let i=this._measureCharSize();i&&(t=i.width,s=i.height);for(let r of e){let{width:o,height:E}=r.contentRect,Q=Math.max(1,Math.floor(o/t)),C=Math.max(1,Math.floor(E/s));(Q!==this.cols||C!==this.rows)&&this.resize(Q,C)}}),this.resizeObserver.observe(this.element)}destroy(){this._destroyed=!0,this.rafId!=null&&cancelAnimationFrame(this.rafId),this.resizeObserver&&this.resizeObserver.disconnect(),this.input&&this.input.destroy(),this.element.removeEventListener("click",this._onClickFocus),this.element.innerHTML=""}};var J=/\x1b\[([0-9;]*)m/g,L=class extends l{write(A){typeof A=="string"&&(A=A.replace(J,(t,s)=>{if(!s)return t;let e=s.split(";").filter(i=>i!=="4"&&i!=="24");return e.length?"\x1B["+e.join(";")+"m":""})),super.write(A)}reset(){!this.bridge||!this.renderer||(this.bridge.init(this.cols,this.rows),this.renderer.setup(this.cols,this.rows),this._scheduleRender())}remeasure(){if(!this.bridge||!this.renderer)return;let A=this._measureCharSize();if(!A)return;let t=getComputedStyle(this.element),s=this.element.clientWidth-(parseFloat(t.paddingLeft)||0)-(parseFloat(t.paddingRight)||0),e=this.element.clientHeight-(parseFloat(t.paddingTop)||0)-(parseFloat(t.paddingBottom)||0);if(s<=0||e<=0)return;let i=Math.max(1,Math.floor(s/A.width)),r=Math.max(1,Math.floor(e/A.height));i!==this.cols||r!==this.rows?this.resize(i,r):this._scheduleRender()}};return m(N);})();
|
|
1
|
+
"use strict";var WTermLib=(()=>{var D=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var v=(r,A)=>{for(var t in A)D(r,t,{get:A[t],enumerable:!0})},p=(r,A,t,e)=>{if(A&&typeof A=="object"||typeof A=="function")for(let s of F(A))!x.call(r,s)&&s!==t&&D(r,s,{get:()=>A[s],enumerable:!(e=G(A,s))||e.enumerable});return r};var m=r=>p(D({},"__esModule",{value:!0}),r);var J={};v(J,{InputHandler:()=>l,Renderer:()=>c,WTerm:()=>L,WasmBridge:()=>a,WebSocketTransport:()=>d});var b="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";function k(r){let A=atob(r),t=new Uint8Array(A.length);for(let e=0;e<A.length;e++)t[e]=A.charCodeAt(e);return t.buffer}var a=class r{constructor(A){this.gridPtr=0,this.dirtyPtr=0,this.writeBufferPtr=0,this.cellSize=12,this.maxCols=256,this.encoder=new TextEncoder,this.decoder=new TextDecoder,this.exports=A.exports,this.memory=this.exports.memory}static async load(A){let t;if(A){let s=await fetch(A);if(!s.ok)throw new Error(`[wterm] Failed to load WASM from ${A}: ${s.status} ${s.statusText}`);t=await s.arrayBuffer()}else t=k(b);let{instance:e}=await WebAssembly.instantiate(t);return new r(e)}init(A,t){this.exports.init(A,t),this._updatePointers()}_updatePointers(){this.gridPtr=this.exports.getGridPtr(),this.dirtyPtr=this.exports.getDirtyPtr(),this.writeBufferPtr=this.exports.getWriteBuffer(),this.cellSize=this.exports.getCellSize(),this.maxCols=this.exports.getMaxCols(),this._dv=new DataView(this.memory.buffer)}writeString(A){let t=this.encoder.encode(A);this.writeRaw(t)}writeRaw(A){let t=new Uint8Array(this.memory.buffer,this.writeBufferPtr,8192),e=0;for(;e<A.length;){let s=Math.min(A.length-e,8192);t.set(A.subarray(e,e+s)),this.exports.writeBytes(s),e+=s}}getCell(A,t){let e=this.gridPtr+(A*this.maxCols+t)*this.cellSize,s=this._dv;return{char:s.getUint32(e,!0),fg:s.getUint16(e+4,!0),bg:s.getUint16(e+6,!0),flags:s.getUint8(e+8)}}isDirtyRow(A){return new Uint8Array(this.memory.buffer,this.dirtyPtr,256)[A]!==0}clearDirty(){this.exports.clearDirty()}getCursor(){return{row:this.exports.getCursorRow(),col:this.exports.getCursorCol(),visible:this.exports.getCursorVisible()!==0}}getCols(){return this.exports.getCols()}getRows(){return this.exports.getRows()}cursorKeysApp(){return this.exports.getCursorKeysApp()!==0}bracketedPaste(){return this.exports.getBracketedPaste()!==0}usingAltScreen(){return this.exports.getUsingAltScreen()!==0}getTitle(){if(this.exports.getTitleChanged()===0)return null;let A=this.exports.getTitlePtr(),t=this.exports.getTitleLen(),e=new Uint8Array(this.memory.buffer,A,t);return this.decoder.decode(e)}getResponse(){let A=this.exports.getResponseLen();if(A===0)return null;let t=this.exports.getResponsePtr(),e=new Uint8Array(this.memory.buffer,t,A),s=this.decoder.decode(e);return this.exports.clearResponse(),s}getScrollbackCount(){return this.exports.getScrollbackCount()}getScrollbackCell(A,t){let s=this.exports.getScrollbackLine(A)+t*this.cellSize,i=this._dv;return{char:i.getUint32(s,!0),fg:i.getUint16(s+4,!0),bg:i.getUint16(s+6,!0),flags:i.getUint8(s+8)}}getScrollbackLineLen(A){return this.exports.getScrollbackLineLen(A)}resize(A,t){this.exports.resizeTerminal(A,t),this._updatePointers()}};var d=class{constructor(A={}){this._ws=null,this._reconnectTimer=null,this._reconnectDelay=1e3,this._closed=!1,this._buffer=[],this.url=A.url??null,this.reconnect=A.reconnect!==!1,this.maxReconnectDelay=A.maxReconnectDelay??3e4,this.onData=A.onData??null,this.onOpen=A.onOpen??null,this.onClose=A.onClose??null,this.onError=A.onError??null}connect(A){if(A&&(this.url=A),!this.url)throw new Error("No WebSocket URL provided");this._closed=!1,this._ws=new WebSocket(this.url),this._ws.binaryType="arraybuffer",this._ws.onopen=()=>{this._reconnectDelay=1e3,this._flushBuffer(),this.onOpen&&this.onOpen()},this._ws.onmessage=t=>{this.onData&&(t.data instanceof ArrayBuffer?this.onData(new Uint8Array(t.data)):this.onData(t.data))},this._ws.onclose=()=>{this.onClose&&this.onClose(),this.reconnect&&!this._closed&&this._scheduleReconnect()},this._ws.onerror=t=>{this.onError&&this.onError(t),this._ws?.close()}}send(A){this._ws&&this._ws.readyState===WebSocket.OPEN?typeof A=="string"?this._ws.send(new TextEncoder().encode(A)):this._ws.send(A):this._buffer.push(A)}close(){this._closed=!0,this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._ws&&this._ws.close()}get connected(){return this._ws!==null&&this._ws.readyState===WebSocket.OPEN}_flushBuffer(){let A=this._buffer.splice(0);for(let t of A)this.send(t)}_scheduleReconnect(){this._reconnectTimer=setTimeout(()=>{this.connect()},this._reconnectDelay),this._reconnectDelay=Math.min(this._reconnectDelay*2,this.maxReconnectDelay)}};function u(r){if(r===256)return null;if(r<16)return`var(--term-color-${r})`;if(r<232){let t=r-16,e=Math.floor(t/36)*51,s=Math.floor(t/6)%6*51,i=t%6*51;return`rgb(${e},${s},${i})`}let A=(r-232)*10+8;return`rgb(${A},${A},${A})`}function y(r,A,t){let e=r,s=A;if(t&32){let Q=e;e=s,s=Q,e===256&&(e=0),s===256&&(s=7)}let i=u(e),o=u(s),B="";i&&(B+=`color:${i};`),o&&(B+=`background:${o};`),t&1&&(B+="font-weight:bold;"),t&2&&(B+="opacity:0.5;"),t&4&&(B+="font-style:italic;");let E=[];return t&128&&E.push("line-through"),E.length&&(B+=`text-decoration:${E.join(" ")};`),t&64&&(B+="visibility:hidden;"),B}function f(r,A,t){if(t){let e=document.createElement("span");e.style.cssText=t,e.textContent=A,r.appendChild(e)}else r.appendChild(document.createTextNode(A))}function S(r,A,t){let e=r,s=A;return t&32&&([e,s]=[s,e],e===256&&(e=0),s===256&&(s=7)),{fg:u(e)||"var(--term-fg)",bg:u(s)||"var(--term-bg)"}}function R(r,A,t){switch(r){case 9600:return`linear-gradient(${A} 50%,${t} 50%)`;case 9601:return`linear-gradient(${t} 87.5%,${A} 87.5%)`;case 9602:return`linear-gradient(${t} 75%,${A} 75%)`;case 9603:return`linear-gradient(${t} 62.5%,${A} 62.5%)`;case 9604:return`linear-gradient(${t} 50%,${A} 50%)`;case 9605:return`linear-gradient(${t} 37.5%,${A} 37.5%)`;case 9606:return`linear-gradient(${t} 25%,${A} 25%)`;case 9607:return`linear-gradient(${t} 12.5%,${A} 12.5%)`;case 9608:return A;case 9609:return`linear-gradient(to right,${A} 87.5%,${t} 87.5%)`;case 9610:return`linear-gradient(to right,${A} 75%,${t} 75%)`;case 9611:return`linear-gradient(to right,${A} 62.5%,${t} 62.5%)`;case 9612:return`linear-gradient(to right,${A} 50%,${t} 50%)`;case 9613:return`linear-gradient(to right,${A} 37.5%,${t} 37.5%)`;case 9614:return`linear-gradient(to right,${A} 25%,${t} 25%)`;case 9615:return`linear-gradient(to right,${A} 12.5%,${t} 12.5%)`;case 9616:return`linear-gradient(to right,${t} 50%,${A} 50%)`;case 9617:return`color-mix(in srgb,${A} 25%,${t})`;case 9618:return`color-mix(in srgb,${A} 50%,${t})`;case 9619:return`color-mix(in srgb,${A} 75%,${t})`;case 9620:return`linear-gradient(${A} 12.5%,${t} 12.5%)`;case 9621:return`linear-gradient(to right,${t} 87.5%,${A} 87.5%)`;default:{let s={9622:[!1,!1,!0,!1],9623:[!1,!1,!1,!0],9624:[!0,!1,!1,!1],9625:[!0,!1,!0,!0],9626:[!0,!1,!1,!0],9627:[!0,!0,!0,!1],9628:[!0,!0,!1,!0],9629:[!1,!0,!1,!1],9630:[!1,!0,!0,!1],9631:[!1,!0,!0,!0]}[r];if(!s)return A;let[i,o,B,E]=s;if(i&&o&&B&&E)return A;let Q=[],C=["0 0","100% 0","0 100%","100% 100%"];return s.forEach((g,I)=>{g&&Q.push(`linear-gradient(${A},${A}) ${C[I]}/50% 50% no-repeat`)}),Q.push(t),Q.join(",")}}}var c=class{constructor(A){this.rows=0,this.cols=0,this.rowEls=[],this.prevCursorRow=-1,this.prevCursorCol=-1,this._scrollbackRowEls=[],this._renderedScrollbackCount=0,this.container=A}setup(A,t){this.cols=A,this.rows=t,this.container.innerHTML="",this.rowEls=[],this._scrollbackRowEls=[],this._renderedScrollbackCount=0;let e=document.createDocumentFragment();for(let s=0;s<t;s++){let i=document.createElement("div");i.className="term-row",e.appendChild(i),this.rowEls.push(i)}this.container.appendChild(e),this.prevCursorRow=-1,this.prevCursorCol=-1}_buildRowContent(A,t,e,s){A.textContent="";let i="",o="",B=0,E=Q=>{if(o)if(s>=B&&s<Q){let C=s-B,g=o.slice(0,C),I=o[C],h=o.slice(C+1);g&&f(A,g,i);let n=document.createElement("span");n.className="term-cursor",i&&(n.style.cssText=i),n.textContent=I,A.appendChild(n),h&&f(A,h,i)}else f(A,o,i)};for(let Q=0;Q<this.cols;Q++){let C=t(Q),g=Q<e,I=g?C.char:0;if(g&&I>=9600&&I<=9631){E(Q);let h=S(C.fg,C.bg,C.flags),n=document.createElement("span");n.className=Q===s?"term-block term-cursor":"term-block",n.style.background=R(I,h.fg,h.bg),C.flags&2&&(n.style.opacity="0.5"),A.appendChild(n),i="",o="",B=Q+1}else{let h=g&&I>=32?String.fromCodePoint(I):" ",n=g?y(C.fg,C.bg,C.flags):"";n!==i?(E(Q),i=n,o=h,B=Q):o+=h}}E(this.cols)}_buildScrollbackRowEl(A,t){let e=document.createElement("div");e.className="term-row term-scrollback-row";let s=A.getScrollbackLineLen(t);return this._buildRowContent(e,i=>A.getScrollbackCell(t,i),s,-1),e}syncScrollback(A){let t=A.getScrollbackCount();if(t!==this._renderedScrollbackCount){if(t>this._renderedScrollbackCount){let e=t-this._renderedScrollbackCount,s=this.rowEls[0]??null,i=document.createDocumentFragment();for(let o=e-1;o>=0;o--){let B=this._buildScrollbackRowEl(A,o);i.appendChild(B),this._scrollbackRowEls.push(B)}this.container.insertBefore(i,s)}else{let e=this._renderedScrollbackCount-t;for(let s=0;s<e;s++){let i=this._scrollbackRowEls.shift();i&&i.remove()}}this._renderedScrollbackCount=t}}render(A){let t=A.getRows(),e=A.getCols(),s=!1;(t!==this.rows||e!==this.cols)&&(this.setup(e,t),s=!0),this.syncScrollback(A);let i=A.getCursor(),o=i.visible,B=i.row!==this.prevCursorRow||i.col!==this.prevCursorCol;for(let E=0;E<this.rows;E++){let Q=s||A.isDirtyRow(E),C=E===this.prevCursorRow&&B,g=E===i.row;if(Q||C||g&&B){let I=g&&o?i.col:-1;this._buildRowContent(this.rowEls[E],h=>A.getCell(E,h),this.cols,I)}}this.prevCursorRow=i.row,this.prevCursorCol=i.col,A.clearDirty()}};var H={ArrowUp:"\x1B[A",ArrowDown:"\x1B[B",ArrowRight:"\x1B[C",ArrowLeft:"\x1B[D",Home:"\x1B[H",End:"\x1B[F"},U={ArrowUp:"\x1BOA",ArrowDown:"\x1BOB",ArrowRight:"\x1BOC",ArrowLeft:"\x1BOD",Home:"\x1BOH",End:"\x1BOF"},M={Enter:"\r",Backspace:"\x7F",Tab:" ",Escape:"\x1B",Insert:"\x1B[2~",Delete:"\x1B[3~",PageUp:"\x1B[5~",PageDown:"\x1B[6~",F1:"\x1BOP",F2:"\x1BOQ",F3:"\x1BOR",F4:"\x1BOS",F5:"\x1B[15~",F6:"\x1B[17~",F7:"\x1B[18~",F8:"\x1B[19~",F9:"\x1B[20~",F10:"\x1B[21~",F11:"\x1B[23~",F12:"\x1B[24~"},l=class{constructor(A,t,e){this.composing=!1,this.element=A,this.onData=t,this.getBridge=e,this.textarea=document.createElement("textarea"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.setAttribute("enterkeyhint","send"),this.textarea.setAttribute("tabindex","0"),this.textarea.setAttribute("aria-hidden","true");let s=this.textarea.style;s.position="absolute",s.left="-9999px",s.top="0",s.width="1px",s.height="1px",s.opacity="0",s.overflow="hidden",s.border="0",s.padding="0",s.margin="0",s.outline="none",s.resize="none",s.pointerEvents="none",s.caretColor="transparent",s.color="transparent",s.background="transparent",A.appendChild(this.textarea),this._onKeyDown=this.handleKeyDown.bind(this),this._onPaste=this.handlePaste.bind(this),this._onCompositionStart=this.handleCompositionStart.bind(this),this._onCompositionEnd=this.handleCompositionEnd.bind(this),this._onInput=this.handleInput.bind(this),this._onFocus=()=>this.element.classList.add("focused"),this._onBlur=()=>this.element.classList.remove("focused"),this.textarea.addEventListener("keydown",this._onKeyDown),this.textarea.addEventListener("paste",this._onPaste),this.textarea.addEventListener("compositionstart",this._onCompositionStart),this.textarea.addEventListener("compositionend",this._onCompositionEnd),this.textarea.addEventListener("input",this._onInput),this.textarea.addEventListener("focus",this._onFocus),this.textarea.addEventListener("blur",this._onBlur)}focus(){this.textarea.focus({preventScroll:!0})}destroy(){this.textarea.removeEventListener("keydown",this._onKeyDown),this.textarea.removeEventListener("paste",this._onPaste),this.textarea.removeEventListener("compositionstart",this._onCompositionStart),this.textarea.removeEventListener("compositionend",this._onCompositionEnd),this.textarea.removeEventListener("input",this._onInput),this.textarea.removeEventListener("focus",this._onFocus),this.textarea.removeEventListener("blur",this._onBlur),this.element.classList.remove("focused"),this.textarea.remove()}handleKeyDown(A){if(this.composing)return;if((A.metaKey||A.ctrlKey)&&A.key==="c"){let e=window.getSelection();if(e&&e.toString().length>0)return}if((A.metaKey||A.ctrlKey)&&A.key==="v"){this.textarea.focus();return}if(A.metaKey&&!A.ctrlKey){if(A.key==="Backspace")A.preventDefault(),this.onData("");else if(A.key==="a"){A.preventDefault();let e=window.getSelection();if(e){let s=document.createRange();s.selectNodeContents(this.element),e.removeAllRanges(),e.addRange(s)}}return}A.preventDefault();let t=this.keyToSequence(A);t&&this.onData(t)}handlePaste(A){A.preventDefault();let t=A.clipboardData?.getData("text");if(!t)return;let e=this.getBridge();e&&e.bracketedPaste()?this.onData("\x1B[200~"+t+"\x1B[201~"):this.onData(t)}handleCompositionStart(){this.composing=!0}handleCompositionEnd(A){this.composing=!1,A.data&&this.onData(A.data),this.textarea.value=""}handleInput(){if(this.composing)return;let A=this.textarea.value;A&&(this.onData(A),this.textarea.value="")}keyToSequence(A){if(A.ctrlKey&&!A.altKey&&!A.metaKey){if(A.key.length===1){let B=A.key.toLowerCase().charCodeAt(0);if(B>=97&&B<=122)return String.fromCharCode(B-96)}if(A.key==="[")return"\x1B";if(A.key==="\\")return"";if(A.key==="]")return"";if(A.key==="^")return"";if(A.key==="_")return""}if(A.key==="Enter"&&A.shiftKey)return"\x1B[13;2u";if(A.key==="Tab"&&A.shiftKey)return"\x1B[Z";let t=M[A.key];if(t)return A.altKey?"\x1B"+t:t;let e=this.getBridge(),o=(e&&e.cursorKeysApp()?U:H)[A.key];return o?A.altKey?"\x1B"+o:o:A.key.length===1&&!A.ctrlKey&&!A.metaKey?A.altKey?"\x1B"+A.key:A.key:null}};var w=class{constructor(A,t={}){this.bridge=null,this.renderer=null,this.input=null,this.rafId=null,this.resizeObserver=null,this._destroyed=!1,this._shouldScrollToBottom=!1,this.element=A,this.wasmUrl=t.wasmUrl,this.cols=t.cols||80,this.rows=t.rows||24,this.autoResize=t.autoResize!==!1,this.onData=t.onData||null,this.onTitle=t.onTitle||null,this.onResize=t.onResize||null,this._container=document.createElement("div"),this._container.className="term-grid",this.element.appendChild(this._container),this.element.classList.add("wterm"),t.cursorBlink&&this.element.classList.add("cursor-blink"),this._onClickFocus=()=>{let e=window.getSelection();(!e||e.isCollapsed)&&this.input?.focus()},this.element.addEventListener("click",this._onClickFocus)}async init(){try{if(this.bridge=await a.load(this.wasmUrl),this._destroyed)return this;this.bridge.init(this.cols,this.rows),this.renderer=new c(this._container),this.renderer.setup(this.cols,this.rows),this.input=new l(this.element,A=>{this.onData?this.onData(A):this.write(A)},()=>this.bridge),this.autoResize?this._setupResizeObserver():this._lockHeight(),this.input.focus(),this._initialRender()}catch(A){throw this.destroy(),new Error(`wterm: failed to initialize: ${A instanceof Error?A.message:A}`)}return this}_isScrolledToBottom(){let A=this.element;return A.scrollHeight-A.scrollTop-A.clientHeight<5}_scrollToBottom(){this.element.scrollTop=this.element.scrollHeight}write(A){this.bridge&&(this._shouldScrollToBottom=this._isScrolledToBottom(),typeof A=="string"?this.bridge.writeString(A):this.bridge.writeRaw(A),this._scheduleRender())}resize(A,t){this.bridge&&(this._shouldScrollToBottom=this._isScrolledToBottom(),this.cols=A,this.rows=t,this.bridge.resize(A,t),this.renderer?.setup(A,t),this._scheduleRender(),this.onResize&&this.onResize(A,t))}focus(){this.input?this.input.focus():this.element.focus()}_scheduleRender(){this.rafId==null&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null,this._doRender()}))}_initialRender(){this._doRender()}_doRender(){if(!this.bridge||!this.renderer)return;this.renderer.render(this.bridge);let A=this.bridge.getScrollbackCount()>0;this.element.classList.toggle("has-scrollback",A),this._shouldScrollToBottom&&this._scrollToBottom();let t=this.bridge.getTitle();t!==null&&this.onTitle&&this.onTitle(t);let e=this.bridge.getResponse();e!==null&&this.onData&&this.onData(e)}_lockHeight(){let A=getComputedStyle(this.element),t=parseFloat(A.getPropertyValue("--term-row-height"))||17,e=this.rows*t,s=(parseFloat(A.paddingTop)||0)+(parseFloat(A.paddingBottom)||0);A.boxSizing==="border-box"&&(s+=(parseFloat(A.borderTopWidth)||0)+(parseFloat(A.borderBottomWidth)||0)),this.element.style.height=`${e+s}px`}_measureCharSize(){let A=document.createElement("span");A.className="term-cell",A.textContent="W",A.style.position="absolute",A.style.visibility="hidden",this._container.appendChild(A);let t=A.getBoundingClientRect(),e=t.width,s=t.height;return A.remove(),e===0||s===0?null:{width:e,height:s}}_setupResizeObserver(){let A=this._measureCharSize();if(!A)return;let t=A.width,e=A.height;this.resizeObserver=new ResizeObserver(s=>{let i=this._measureCharSize();i&&(t=i.width,e=i.height);for(let o of s){let{width:B,height:E}=o.contentRect,Q=Math.max(1,Math.floor(B/t)),C=Math.max(1,Math.floor(E/e));(Q!==this.cols||C!==this.rows)&&this.resize(Q,C)}}),this.resizeObserver.observe(this.element)}destroy(){this._destroyed=!0,this.rafId!=null&&cancelAnimationFrame(this.rafId),this.resizeObserver&&this.resizeObserver.disconnect(),this.input&&this.input.destroy(),this.element.removeEventListener("click",this._onClickFocus),this.element.innerHTML=""}};var _=/\x1b\[([0-9;]*)m/g,L=class extends w{write(A){typeof A=="string"&&(A=A.replace(_,(t,e)=>{if(!e)return t;let s=e.split(";").filter(i=>i!=="4"&&i!=="24");return s.length?"\x1B["+s.join(";")+"m":""})),super.write(A)}reset(){!this.bridge||!this.renderer||(this.bridge.init(this.cols,this.rows),this.renderer.setup(this.cols,this.rows),this._scheduleRender())}async init(){return this._calibrateInitialSize(),await super.init(),this.autoResize&&!this.resizeObserver&&!this._destroyed&&this._scheduleObserverSetup(),this}_calibrateInitialSize(){if(!this.element||!this._container||!this.element.isConnected)return;this.element.offsetHeight;let A=document.createElement("span");A.className="term-cell",A.style.cssText="position:absolute;visibility:hidden;left:-9999px;top:0;",A.textContent="W",this._container.appendChild(A);let t=A.getBoundingClientRect(),e=t.width,s=t.height;if(A.remove(),e<=0||s<=0)return;let i=getComputedStyle(this.element),o=(parseFloat(i.paddingLeft)||0)+(parseFloat(i.paddingRight)||0),B=(parseFloat(i.paddingTop)||0)+(parseFloat(i.paddingBottom)||0),E=this.element.clientWidth-o,Q=this.element.clientHeight-B;if(E<=0||Q<=0)return;let C=Math.max(1,Math.floor(E/e)),g=Math.max(1,Math.floor(Q/s));this.cols=C,this.rows=g}_scheduleObserverSetup(){if(this._observerSetupPending)return;this._observerSetupPending=!0;let A=0,t=120,e=()=>{if(this._destroyed||this.resizeObserver){this._observerSetupPending=!1;return}if(this.element.offsetHeight,this._measureCharSize()&&this.element.clientWidth>0&&this.element.clientHeight>0){this._setupResizeObserver(),this._observerSetupPending=!1;return}if(++A>=t){this._observerSetupPending=!1;return}A<=8?requestAnimationFrame(e):setTimeout(e,50)};requestAnimationFrame(e)}remeasure(){if(!this.bridge||!this.renderer)return;this.autoResize&&!this.resizeObserver&&!this._destroyed&&(this._measureCharSize()&&this.element.clientWidth>0&&this.element.clientHeight>0?this._setupResizeObserver():this._scheduleObserverSetup());let A=this._measureCharSize();if(!A)return;let t=getComputedStyle(this.element),e=this.element.clientWidth-(parseFloat(t.paddingLeft)||0)-(parseFloat(t.paddingRight)||0),s=this.element.clientHeight-(parseFloat(t.paddingTop)||0)-(parseFloat(t.paddingBottom)||0);if(e<=0||s<=0)return;let i=Math.max(1,Math.floor(e/A.width)),o=Math.max(1,Math.floor(s/A.height));i!==this.cols||o!==this.rows?this.resize(i,o):this._scheduleRender()}};return m(J);})();
|
package/dist/ws-broadcast.js
CHANGED
|
@@ -34,6 +34,9 @@ export class WsBroadcastManager {
|
|
|
34
34
|
sendInProgress: false,
|
|
35
35
|
backpressurePaused: false,
|
|
36
36
|
lastOutputBySession: new Map(),
|
|
37
|
+
outputSeqBySession: new Map(),
|
|
38
|
+
droppedSinceLast: false,
|
|
39
|
+
pendingResyncSessions: new Set(),
|
|
37
40
|
};
|
|
38
41
|
this.clients.add(client);
|
|
39
42
|
ws.on("close", () => {
|
|
@@ -51,9 +54,16 @@ export class WsBroadcastManager {
|
|
|
51
54
|
const truncatedMessages = snapshot.messages
|
|
52
55
|
? truncateMessagesForTransport(snapshot.messages, this.getCardDefaults())
|
|
53
56
|
: undefined;
|
|
57
|
+
// Reset the per-client sequence counter for this session so the
|
|
58
|
+
// client can detect missed output events between init and the
|
|
59
|
+
// first incremental update.
|
|
60
|
+
const initSeq = (client.outputSeqBySession.get(msg.sessionId) ?? 0) + 1;
|
|
61
|
+
client.outputSeqBySession.set(msg.sessionId, initSeq);
|
|
62
|
+
client.pendingResyncSessions.delete(msg.sessionId);
|
|
54
63
|
ws.send(JSON.stringify({
|
|
55
64
|
type: "init",
|
|
56
65
|
sessionId: msg.sessionId,
|
|
66
|
+
seq: initSeq,
|
|
57
67
|
data: { ...snapshot, messages: truncatedMessages, output: snapshot.output },
|
|
58
68
|
}));
|
|
59
69
|
}
|
|
@@ -65,6 +75,25 @@ export class WsBroadcastManager {
|
|
|
65
75
|
}));
|
|
66
76
|
}
|
|
67
77
|
}
|
|
78
|
+
else if (msg.type === "resync" && msg.sessionId) {
|
|
79
|
+
// Client noticed a gap and asks for a fresh snapshot.
|
|
80
|
+
const snapshot = getSession(msg.sessionId);
|
|
81
|
+
if (snapshot) {
|
|
82
|
+
const truncatedMessages = snapshot.messages
|
|
83
|
+
? truncateMessagesForTransport(snapshot.messages, this.getCardDefaults())
|
|
84
|
+
: undefined;
|
|
85
|
+
const seq = (client.outputSeqBySession.get(msg.sessionId) ?? 0) + 1;
|
|
86
|
+
client.outputSeqBySession.set(msg.sessionId, seq);
|
|
87
|
+
client.pendingResyncSessions.delete(msg.sessionId);
|
|
88
|
+
ws.send(JSON.stringify({
|
|
89
|
+
type: "init",
|
|
90
|
+
sessionId: msg.sessionId,
|
|
91
|
+
seq,
|
|
92
|
+
resync: true,
|
|
93
|
+
data: { ...snapshot, messages: truncatedMessages, output: snapshot.output },
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
68
97
|
}
|
|
69
98
|
catch {
|
|
70
99
|
// Ignore malformed messages
|
|
@@ -79,18 +108,22 @@ export class WsBroadcastManager {
|
|
|
79
108
|
const existing = this.outputDebounceCache.get(event.sessionId);
|
|
80
109
|
if (existing) {
|
|
81
110
|
clearTimeout(existing.timer);
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
const
|
|
111
|
+
// Merge prev + cur. Cur takes precedence for identically-named fields,
|
|
112
|
+
// but fields only present on prev (e.g. chunk while cur carries
|
|
113
|
+
// messages, or messages while cur carries chunk) survive — the old
|
|
114
|
+
// implementation silently dropped them.
|
|
115
|
+
const prevData = existing.event.data ?? {};
|
|
116
|
+
const curData = event.data ?? {};
|
|
117
|
+
const merged = { ...prevData, ...curData };
|
|
118
|
+
const prevChunk = prevData.chunk;
|
|
119
|
+
const curChunk = curData.chunk;
|
|
88
120
|
if (prevChunk && curChunk) {
|
|
89
|
-
|
|
121
|
+
merged.chunk = prevChunk + curChunk;
|
|
90
122
|
}
|
|
91
123
|
else if (prevChunk && !curChunk) {
|
|
92
|
-
|
|
124
|
+
merged.chunk = prevChunk;
|
|
93
125
|
}
|
|
126
|
+
event = { ...event, data: merged };
|
|
94
127
|
}
|
|
95
128
|
const timer = setTimeout(() => {
|
|
96
129
|
this.outputDebounceCache.delete(event.sessionId);
|
|
@@ -113,18 +146,47 @@ export class WsBroadcastManager {
|
|
|
113
146
|
}
|
|
114
147
|
// ── Internal ──
|
|
115
148
|
broadcast(event) {
|
|
116
|
-
const message = JSON.stringify(event);
|
|
117
149
|
for (const client of this.clients) {
|
|
118
150
|
if (client.ws.readyState !== WebSocket.OPEN)
|
|
119
151
|
continue;
|
|
120
|
-
//
|
|
152
|
+
// Stamp output events with a per-(client, session) sequence number so
|
|
153
|
+
// the client can detect a gap caused by backpressure drops.
|
|
154
|
+
let outgoing = event;
|
|
155
|
+
if (event.type === "output") {
|
|
156
|
+
const seq = (client.outputSeqBySession.get(event.sessionId) ?? 0) + 1;
|
|
157
|
+
client.outputSeqBySession.set(event.sessionId, seq);
|
|
158
|
+
outgoing = { ...event, seq };
|
|
159
|
+
}
|
|
160
|
+
// Apply backpressure if queue is too large. We mark the session as
|
|
161
|
+
// needing a resync rather than silently discarding — the client will
|
|
162
|
+
// request a fresh snapshot once it sees the resync hint.
|
|
121
163
|
if (client.sendQueue.length >= MAX_QUEUE_SIZE) {
|
|
122
164
|
client.backpressurePaused = true;
|
|
165
|
+
if (event.type === "output") {
|
|
166
|
+
client.pendingResyncSessions.add(event.sessionId);
|
|
167
|
+
client.droppedSinceLast = true;
|
|
168
|
+
}
|
|
123
169
|
continue;
|
|
124
170
|
}
|
|
125
|
-
if (client.backpressurePaused)
|
|
171
|
+
if (client.backpressurePaused) {
|
|
172
|
+
if (event.type === "output") {
|
|
173
|
+
client.pendingResyncSessions.add(event.sessionId);
|
|
174
|
+
client.droppedSinceLast = true;
|
|
175
|
+
}
|
|
126
176
|
continue;
|
|
127
|
-
|
|
177
|
+
}
|
|
178
|
+
// If we owed this session a resync notice, prepend it now that the
|
|
179
|
+
// queue has drained enough to actually deliver something.
|
|
180
|
+
if (client.pendingResyncSessions.has(event.sessionId)) {
|
|
181
|
+
client.pendingResyncSessions.delete(event.sessionId);
|
|
182
|
+
const notice = JSON.stringify({
|
|
183
|
+
type: "resync_required",
|
|
184
|
+
sessionId: event.sessionId,
|
|
185
|
+
reason: "backpressure_drop",
|
|
186
|
+
});
|
|
187
|
+
client.sendQueue.push(notice);
|
|
188
|
+
}
|
|
189
|
+
client.sendQueue.push(JSON.stringify(outgoing));
|
|
128
190
|
this.processWsQueue(client);
|
|
129
191
|
}
|
|
130
192
|
}
|