@fairyhunter13/opentui-core 0.1.132 → 0.1.134
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/3d.js +1 -1
- package/Renderable.d.ts +2 -1
- package/buffer.d.ts +3 -0
- package/console.d.ts +3 -1
- package/{index-t54p24hr.js → index-ckgv87ep.js} +3 -3
- package/{index-t3rrpex7.js → index-n2b7w731.js} +558 -136
- package/index-n2b7w731.js.map +76 -0
- package/{index-gwfqqvw5.js → index-x59exf1c.js} +38 -13
- package/{index-gwfqqvw5.js.map → index-x59exf1c.js.map} +5 -5
- package/index.js +27 -3
- package/index.js.map +1 -1
- package/lib/RGBA.d.ts +27 -3
- package/lib/parse.keypress-kitty.d.ts +1 -0
- package/lib/parse.keypress.d.ts +1 -0
- package/lib/terminal-palette.d.ts +8 -0
- package/package.json +7 -7
- package/renderables/Select.d.ts +3 -1
- package/renderables/TabSelect.d.ts +3 -1
- package/renderables/Textarea.d.ts +5 -3
- package/renderer-theme-mode.d.ts +29 -0
- package/renderer.d.ts +12 -7
- package/runtime-plugin-support.js +3 -3
- package/runtime-plugin.js +3 -3
- package/testing.js +1 -1
- package/types.d.ts +1 -0
- package/zig-structs.d.ts +7 -1
- package/zig.d.ts +4 -0
- package/index-t3rrpex7.js.map +0 -75
- /package/{index-t54p24hr.js.map → index-ckgv87ep.js.map} +0 -0
- /package/lib/{keymapping.d.ts → keybinding.internal.d.ts} +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/.bun/yoga-layout@3.2.1/node_modules/yoga-layout/dist/binaries/yoga-wasm-base64-esm.js", "../../../node_modules/.bun/yoga-layout@3.2.1/node_modules/yoga-layout/dist/src/generated/YGEnums.js", "../../../node_modules/.bun/yoga-layout@3.2.1/node_modules/yoga-layout/dist/src/wrapAssembly.js", "../../../node_modules/.bun/yoga-layout@3.2.1/node_modules/yoga-layout/dist/src/index.js", "../src/lib/border.ts", "../src/lib/KeyHandler.ts", "../src/lib/RGBA.ts", "../src/lib/ascii.font.ts", "../src/types.ts", "../src/utils.ts", "../src/lib/styled-text.ts", "../src/lib/hast-styled-text.ts", "../src/lib/clock.ts", "../src/lib/parse.keypress.ts", "../src/lib/parse.keypress-kitty.ts", "../src/lib/scroll-acceleration.ts", "../src/lib/yoga.options.ts", "../src/lib/parse.mouse.ts", "../src/lib/selection.ts", "../src/lib/singleton.ts", "../src/lib/env.ts", "../src/lib/stdin-parser.ts", "../src/lib/tree-sitter-styled-text.ts", "../src/lib/tree-sitter/client.ts", "../src/lib/debounce.ts", "../src/lib/queue.ts", "../src/lib/tree-sitter/default-parsers.ts", "../src/lib/bunfs.ts", "../src/lib/data-paths.ts", "../src/lib/validate-dir-name.ts", "../src/lib/tree-sitter/resolve-ft.ts", "../src/lib/tree-sitter/assets/update.ts", "../src/lib/tree-sitter/download-utils.ts", "../src/lib/tree-sitter/index.ts", "../src/lib/extmarks-history.ts", "../src/lib/extmarks.ts", "../src/lib/terminal-palette.ts", "../src/lib/paste.ts", "../src/lib/detect-links.ts", "../src/zig.ts", "../src/buffer.ts", "../../../node_modules/.bun/bun-ffi-structs@0.1.2+1fb4c65d43e298b9/node_modules/bun-ffi-structs/index.js", "../src/zig-structs.ts", "../src/text-buffer.ts", "../src/Renderable.ts", "../src/lib/renderable.validations.ts", "../src/renderables/composition/vnode.ts", "../src/text-buffer-view.ts", "../src/edit-buffer.ts", "../src/editor-view.ts", "../src/syntax-style.ts", "../src/renderables/Box.ts", "../src/renderables/TextBufferRenderable.ts", "../src/renderables/Code.ts", "../src/renderables/TextNode.ts", "../src/renderables/Text.ts", "../src/console.ts", "../src/lib/output.capture.ts", "../src/lib/keybinding.internal.ts", "../src/renderables/EditBufferRenderable.ts", "../src/ansi.ts", "../src/lib/clipboard.ts", "../src/renderer.ts", "../src/lib/objects-in-viewport.ts", "../src/lib/render-geometry.ts", "../src/lib/terminal-capability-detection.ts", "../src/renderer-theme-mode.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"\nvar loadYoga = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(loadYoga) {\n loadYoga = loadYoga || {};\n\n\nvar h;h||(h=typeof loadYoga !== 'undefined' ? loadYoga : {});var aa,ca;h.ready=new Promise(function(a,b){aa=a;ca=b});var da=Object.assign({},h),q=\"\";\"undefined\"!=typeof document&&document.currentScript&&(q=document.currentScript.src);_scriptDir&&(q=_scriptDir);0!==q.indexOf(\"blob:\")?q=q.substr(0,q.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):q=\"\";var ea=h.print||console.log.bind(console),v=h.printErr||console.warn.bind(console);Object.assign(h,da);da=null;var w;h.wasmBinary&&(w=h.wasmBinary);\nvar noExitRuntime=h.noExitRuntime||!0;\"object\"!=typeof WebAssembly&&x(\"no native wasm support detected\");var fa,ha=!1;function z(a,b,c){c=b+c;for(var d=\"\";!(b>=c);){var e=a[b++];if(!e)break;if(e&128){var f=a[b++]&63;if(192==(e&224))d+=String.fromCharCode((e&31)<<6|f);else{var g=a[b++]&63;e=224==(e&240)?(e&15)<<12|f<<6|g:(e&7)<<18|f<<12|g<<6|a[b++]&63;65536>e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d}\nvar ia,ja,A,C,ka,D,E,la,ma;function na(){var a=fa.buffer;ia=a;h.HEAP8=ja=new Int8Array(a);h.HEAP16=C=new Int16Array(a);h.HEAP32=D=new Int32Array(a);h.HEAPU8=A=new Uint8Array(a);h.HEAPU16=ka=new Uint16Array(a);h.HEAPU32=E=new Uint32Array(a);h.HEAPF32=la=new Float32Array(a);h.HEAPF64=ma=new Float64Array(a)}var oa,pa=[],qa=[],ra=[];function sa(){var a=h.preRun.shift();pa.unshift(a)}var F=0,ta=null,G=null;\nfunction x(a){if(h.onAbort)h.onAbort(a);a=\"Aborted(\"+a+\")\";v(a);ha=!0;a=new WebAssembly.RuntimeError(a+\". Build with -sASSERTIONS for more info.\");ca(a);throw a;}function ua(a){return a.startsWith(\"data:application/octet-stream;base64,\")}var H;H=\"data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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\";if(!ua(H)){var va=H;H=h.locateFile?h.locateFile(va,q):q+va}\nfunction wa(){var a=H;try{if(a==H&&w)return new Uint8Array(w);if(ua(a))try{var b=xa(a.slice(37)),c=new Uint8Array(b.length);for(a=0;a<b.length;++a)c[a]=b.charCodeAt(a);var d=c}catch(f){throw Error(\"Converting base64 string to bytes failed.\");}else d=void 0;var e=d;if(e)return e;throw\"both async and sync fetching of the wasm failed\";}catch(f){x(f)}}\nfunction ya(){return w||\"function\"!=typeof fetch?Promise.resolve().then(function(){return wa()}):fetch(H,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+H+\"'\";return a.arrayBuffer()}).catch(function(){return wa()})}function za(a){for(;0<a.length;)a.shift()(h)}function Aa(a){if(void 0===a)return\"_unknown\";a=a.replace(/[^a-zA-Z0-9_]/g,\"$\");var b=a.charCodeAt(0);return 48<=b&&57>=b?\"_\"+a:a}\nfunction Ba(a,b){a=Aa(a);return function(){return b.apply(this,arguments)}}var J=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Ca=[];function Da(a){var b=Error,c=Ba(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+\"\\n\"+d.replace(/^Error(:[^\\n]*)?\\n/,\"\"))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+\": \"+this.message};return c}var K=void 0;\nfunction L(a){throw new K(a);}var M=a=>{a||L(\"Cannot use deleted val. handle = \"+a);return J[a].value},Ea=a=>{switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Ca.length?Ca.pop():J.length;J[b]={ga:1,value:a};return b}},Fa=void 0,Ga=void 0;function N(a){for(var b=\"\";A[a];)b+=Ga[A[a++]];return b}var O=[];function Ha(){for(;O.length;){var a=O.pop();a.M.$=!1;a[\"delete\"]()}}var P=void 0,Q={};\nfunction Ia(a,b){for(void 0===b&&L(\"ptr should not be undefined\");a.R;)b=a.ba(b),a=a.R;return b}var R={};function Ja(a){a=Ka(a);var b=N(a);S(a);return b}function La(a,b){var c=R[a];void 0===c&&L(b+\" has unknown type \"+Ja(a));return c}function Ma(){}var Na=!1;function Oa(a){--a.count.value;0===a.count.value&&(a.T?a.U.W(a.T):a.P.N.W(a.O))}function Pa(a,b,c){if(b===c)return a;if(void 0===c.R)return null;a=Pa(a,b,c.R);return null===a?null:c.na(a)}var Qa={};function Ra(a,b){b=Ia(a,b);return Q[b]}\nvar Sa=void 0;function Ta(a){throw new Sa(a);}function Ua(a,b){b.P&&b.O||Ta(\"makeClassHandle requires ptr and ptrType\");!!b.U!==!!b.T&&Ta(\"Both smartPtrType and smartPtr must be specified\");b.count={value:1};return T(Object.create(a,{M:{value:b}}))}function T(a){if(\"undefined\"===typeof FinalizationRegistry)return T=b=>b,a;Na=new FinalizationRegistry(b=>{Oa(b.M)});T=b=>{var c=b.M;c.T&&Na.register(b,{M:c},b);return b};Ma=b=>{Na.unregister(b)};return T(a)}var Va={};\nfunction Wa(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function Xa(a){return this.fromWireType(D[a>>2])}var U={},Ya={};function V(a,b,c){function d(k){k=c(k);k.length!==a.length&&Ta(\"Mismatched type converter count\");for(var m=0;m<a.length;++m)W(a[m],k[m])}a.forEach(function(k){Ya[k]=b});var e=Array(b.length),f=[],g=0;b.forEach((k,m)=>{R.hasOwnProperty(k)?e[m]=R[k]:(f.push(k),U.hasOwnProperty(k)||(U[k]=[]),U[k].push(()=>{e[m]=R[k];++g;g===f.length&&d(e)}))});0===f.length&&d(e)}\nfunction Za(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError(\"Unknown type size: \"+a);}}\nfunction W(a,b,c={}){if(!(\"argPackAdvance\"in b))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");var d=b.name;a||L('type \"'+d+'\" must have a positive integer typeid pointer');if(R.hasOwnProperty(a)){if(c.ua)return;L(\"Cannot register type '\"+d+\"' twice\")}R[a]=b;delete Ya[a];U.hasOwnProperty(a)&&(b=U[a],delete U[a],b.forEach(e=>e()))}function $a(a){L(a.M.P.N.name+\" instance already deleted\")}function X(){}\nfunction ab(a,b,c){if(void 0===a[b].S){var d=a[b];a[b]=function(){a[b].S.hasOwnProperty(arguments.length)||L(\"Function '\"+c+\"' called with an invalid number of arguments (\"+arguments.length+\") - expects one of (\"+a[b].S+\")!\");return a[b].S[arguments.length].apply(this,arguments)};a[b].S=[];a[b].S[d.Z]=d}}\nfunction bb(a,b){h.hasOwnProperty(a)?(L(\"Cannot register public name '\"+a+\"' twice\"),ab(h,a,a),h.hasOwnProperty(void 0)&&L(\"Cannot register multiple overloads of a function with the same number of arguments (undefined)!\"),h[a].S[void 0]=b):h[a]=b}function cb(a,b,c,d,e,f,g,k){this.name=a;this.constructor=b;this.X=c;this.W=d;this.R=e;this.pa=f;this.ba=g;this.na=k;this.ja=[]}\nfunction db(a,b,c){for(;b!==c;)b.ba||L(\"Expected null or instance of \"+c.name+\", got an instance of \"+b.name),a=b.ba(a),b=b.R;return a}function eb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction gb(a,b){if(null===b){this.ea&&L(\"null is not a valid \"+this.name);if(this.da){var c=this.fa();null!==a&&a.push(this.W,c);return c}return 0}b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);!this.ca&&b.M.P.ca&&L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);c=db(b.M.O,b.M.P.N,this.N);if(this.da)switch(void 0===b.M.T&&L(\"Passing raw pointer to smart pointer is illegal\"),\nthis.Ba){case 0:b.M.U===this?c=b.M.T:L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);break;case 1:c=b.M.T;break;case 2:if(b.M.U===this)c=b.M.T;else{var d=b.clone();c=this.xa(c,Ea(function(){d[\"delete\"]()}));null!==a&&a.push(this.W,c)}break;default:L(\"Unsupporting sharing policy\")}return c}\nfunction hb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);b.M.P.ca&&L(\"Cannot convert argument of type \"+b.M.P.name+\" to parameter type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction Y(a,b,c,d){this.name=a;this.N=b;this.ea=c;this.ca=d;this.da=!1;this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0;void 0!==b.R?this.toWireType=gb:(this.toWireType=d?eb:hb,this.V=null)}function ib(a,b){h.hasOwnProperty(a)||Ta(\"Replacing nonexistant public symbol\");h[a]=b;h[a].Z=void 0}\nfunction jb(a,b){var c=[];return function(){c.length=0;Object.assign(c,arguments);if(a.includes(\"j\")){var d=h[\"dynCall_\"+a];d=c&&c.length?d.apply(null,[b].concat(c)):d.call(null,b)}else d=oa.get(b).apply(null,c);return d}}function Z(a,b){a=N(a);var c=a.includes(\"j\")?jb(a,b):oa.get(b);\"function\"!=typeof c&&L(\"unknown function pointer with signature \"+a+\": \"+b);return c}var mb=void 0;\nfunction nb(a,b){function c(f){e[f]||R[f]||(Ya[f]?Ya[f].forEach(c):(d.push(f),e[f]=!0))}var d=[],e={};b.forEach(c);throw new mb(a+\": \"+d.map(Ja).join([\", \"]));}\nfunction ob(a,b,c,d,e){var f=b.length;2>f&&L(\"argTypes array size mismatch! Must at least get return value and 'this' types!\");var g=null!==b[1]&&null!==c,k=!1;for(c=1;c<b.length;++c)if(null!==b[c]&&void 0===b[c].V){k=!0;break}var m=\"void\"!==b[0].name,l=f-2,n=Array(l),p=[],r=[];return function(){arguments.length!==l&&L(\"function \"+a+\" called with \"+arguments.length+\" arguments, expected \"+l+\" args!\");r.length=0;p.length=g?2:1;p[0]=e;if(g){var u=b[1].toWireType(r,this);p[1]=u}for(var t=0;t<l;++t)n[t]=\nb[t+2].toWireType(r,arguments[t]),p.push(n[t]);t=d.apply(null,p);if(k)Wa(r);else for(var y=g?1:2;y<b.length;y++){var B=1===y?u:n[y-2];null!==b[y].V&&b[y].V(B)}u=m?b[0].fromWireType(t):void 0;return u}}function pb(a,b){for(var c=[],d=0;d<a;d++)c.push(E[b+4*d>>2]);return c}function qb(a){4<a&&0===--J[a].ga&&(J[a]=void 0,Ca.push(a))}function fb(a){if(null===a)return\"null\";var b=typeof a;return\"object\"===b||\"array\"===b||\"function\"===b?a.toString():\"\"+a}\nfunction rb(a,b){switch(b){case 2:return function(c){return this.fromWireType(la[c>>2])};case 3:return function(c){return this.fromWireType(ma[c>>3])};default:throw new TypeError(\"Unknown float type: \"+a);}}\nfunction sb(a,b,c){switch(b){case 0:return c?function(d){return ja[d]}:function(d){return A[d]};case 1:return c?function(d){return C[d>>1]}:function(d){return ka[d>>1]};case 2:return c?function(d){return D[d>>2]}:function(d){return E[d>>2]};default:throw new TypeError(\"Unknown integer type: \"+a);}}function tb(a,b){for(var c=\"\",d=0;!(d>=b/2);++d){var e=C[a+2*d>>1];if(0==e)break;c+=String.fromCharCode(e)}return c}\nfunction ub(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e<c;++e)C[b>>1]=a.charCodeAt(e),b+=2;C[b>>1]=0;return b-d}function vb(a){return 2*a.length}function wb(a,b){for(var c=0,d=\"\";!(c>=b/4);){var e=D[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d}\nfunction xb(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e<a.length;++e){var f=a.charCodeAt(e);if(55296<=f&&57343>=f){var g=a.charCodeAt(++e);f=65536+((f&1023)<<10)|g&1023}D[b>>2]=f;b+=4;if(b+4>c)break}D[b>>2]=0;return b-d}function yb(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=d&&++c;b+=4}return b}var zb={};function Ab(a){var b=zb[a];return void 0===b?N(a):b}var Bb=[];function Cb(a){var b=Bb.length;Bb.push(a);return b}\nfunction Db(a,b){for(var c=Array(a),d=0;d<a;++d)c[d]=La(E[b+4*d>>2],\"parameter \"+d);return c}var Eb=[],Fb=[null,[],[]];K=h.BindingError=Da(\"BindingError\");h.count_emval_handles=function(){for(var a=0,b=5;b<J.length;++b)void 0!==J[b]&&++a;return a};h.get_first_emval=function(){for(var a=5;a<J.length;++a)if(void 0!==J[a])return J[a];return null};Fa=h.PureVirtualError=Da(\"PureVirtualError\");for(var Gb=Array(256),Hb=0;256>Hb;++Hb)Gb[Hb]=String.fromCharCode(Hb);Ga=Gb;h.getInheritedInstanceCount=function(){return Object.keys(Q).length};\nh.getLiveInheritedInstances=function(){var a=[],b;for(b in Q)Q.hasOwnProperty(b)&&a.push(Q[b]);return a};h.flushPendingDeletes=Ha;h.setDelayFunction=function(a){P=a;O.length&&P&&P(Ha)};Sa=h.InternalError=Da(\"InternalError\");X.prototype.isAliasOf=function(a){if(!(this instanceof X&&a instanceof X))return!1;var b=this.M.P.N,c=this.M.O,d=a.M.P.N;for(a=a.M.O;b.R;)c=b.ba(c),b=b.R;for(;d.R;)a=d.ba(a),d=d.R;return b===d&&c===a};\nX.prototype.clone=function(){this.M.O||$a(this);if(this.M.aa)return this.M.count.value+=1,this;var a=T,b=Object,c=b.create,d=Object.getPrototypeOf(this),e=this.M;a=a(c.call(b,d,{M:{value:{count:e.count,$:e.$,aa:e.aa,O:e.O,P:e.P,T:e.T,U:e.U}}}));a.M.count.value+=1;a.M.$=!1;return a};X.prototype[\"delete\"]=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");Ma(this);Oa(this.M);this.M.aa||(this.M.T=void 0,this.M.O=void 0)};X.prototype.isDeleted=function(){return!this.M.O};\nX.prototype.deleteLater=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");O.push(this);1===O.length&&P&&P(Ha);this.M.$=!0;return this};Y.prototype.qa=function(a){this.ka&&(a=this.ka(a));return a};Y.prototype.ha=function(a){this.W&&this.W(a)};Y.prototype.argPackAdvance=8;Y.prototype.readValueFromPointer=Xa;Y.prototype.deleteObject=function(a){if(null!==a)a[\"delete\"]()};\nY.prototype.fromWireType=function(a){function b(){return this.da?Ua(this.N.X,{P:this.wa,O:c,U:this,T:a}):Ua(this.N.X,{P:this,O:a})}var c=this.qa(a);if(!c)return this.ha(a),null;var d=Ra(this.N,c);if(void 0!==d){if(0===d.M.count.value)return d.M.O=c,d.M.T=a,d.clone();d=d.clone();this.ha(a);return d}d=this.N.pa(c);d=Qa[d];if(!d)return b.call(this);d=this.ca?d.la:d.pointerType;var e=Pa(c,this.N,d.N);return null===e?b.call(this):this.da?Ua(d.N.X,{P:d,O:e,U:this,T:a}):Ua(d.N.X,{P:d,O:e})};\nmb=h.UnboundTypeError=Da(\"UnboundTypeError\");\nvar xa=\"function\"==typeof atob?atob:function(a){var b=\"\",c=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var g=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));d=d<<2|e>>4;\ne=(e&15)<<4|f>>2;var k=(f&3)<<6|g;b+=String.fromCharCode(d);64!==f&&(b+=String.fromCharCode(e));64!==g&&(b+=String.fromCharCode(k))}while(c<a.length);return b},Jb={l:function(a,b,c,d){x(\"Assertion failed: \"+(a?z(A,a):\"\")+\", at: \"+[b?b?z(A,b):\"\":\"unknown filename\",c,d?d?z(A,d):\"\":\"unknown function\"])},q:function(a,b,c){a=N(a);b=La(b,\"wrapper\");c=M(c);var d=[].slice,e=b.N,f=e.X,g=e.R.X,k=e.R.constructor;a=Ba(a,function(){e.R.ja.forEach(function(l){if(this[l]===g[l])throw new Fa(\"Pure virtual function \"+\nl+\" must be implemented in JavaScript\");}.bind(this));Object.defineProperty(this,\"__parent\",{value:f});this.__construct.apply(this,d.call(arguments))});f.__construct=function(){this===f&&L(\"Pass correct 'this' to __construct\");var l=k.implement.apply(void 0,[this].concat(d.call(arguments)));Ma(l);var n=l.M;l.notifyOnDestruction();n.aa=!0;Object.defineProperties(this,{M:{value:n}});T(this);l=n.O;l=Ia(e,l);Q.hasOwnProperty(l)?L(\"Tried to register registered instance: \"+l):Q[l]=this};f.__destruct=function(){this===\nf&&L(\"Pass correct 'this' to __destruct\");Ma(this);var l=this.M.O;l=Ia(e,l);Q.hasOwnProperty(l)?delete Q[l]:L(\"Tried to unregister unregistered instance: \"+l)};a.prototype=Object.create(f);for(var m in c)a.prototype[m]=c[m];return Ea(a)},j:function(a){var b=Va[a];delete Va[a];var c=b.fa,d=b.W,e=b.ia,f=e.map(g=>g.ta).concat(e.map(g=>g.za));V([a],f,g=>{var k={};e.forEach((m,l)=>{var n=g[l],p=m.ra,r=m.sa,u=g[l+e.length],t=m.ya,y=m.Aa;k[m.oa]={read:B=>n.fromWireType(p(r,B)),write:(B,ba)=>{var I=[];t(y,\nB,u.toWireType(I,ba));Wa(I)}}});return[{name:b.name,fromWireType:function(m){var l={},n;for(n in k)l[n]=k[n].read(m);d(m);return l},toWireType:function(m,l){for(var n in k)if(!(n in l))throw new TypeError('Missing field: \"'+n+'\"');var p=c();for(n in k)k[n].write(p,l[n]);null!==m&&m.push(d,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:d}]})},v:function(){},B:function(a,b,c,d,e){var f=Za(c);b=N(b);W(a,{name:b,fromWireType:function(g){return!!g},toWireType:function(g,k){return k?d:e},argPackAdvance:8,\nreadValueFromPointer:function(g){if(1===c)var k=ja;else if(2===c)k=C;else if(4===c)k=D;else throw new TypeError(\"Unknown boolean type size: \"+b);return this.fromWireType(k[g>>f])},V:null})},f:function(a,b,c,d,e,f,g,k,m,l,n,p,r){n=N(n);f=Z(e,f);k&&(k=Z(g,k));l&&(l=Z(m,l));r=Z(p,r);var u=Aa(n);bb(u,function(){nb(\"Cannot construct \"+n+\" due to unbound types\",[d])});V([a,b,c],d?[d]:[],function(t){t=t[0];if(d){var y=t.N;var B=y.X}else B=X.prototype;t=Ba(u,function(){if(Object.getPrototypeOf(this)!==ba)throw new K(\"Use 'new' to construct \"+\nn);if(void 0===I.Y)throw new K(n+\" has no accessible constructor\");var kb=I.Y[arguments.length];if(void 0===kb)throw new K(\"Tried to invoke ctor of \"+n+\" with invalid number of parameters (\"+arguments.length+\") - expected (\"+Object.keys(I.Y).toString()+\") parameters instead!\");return kb.apply(this,arguments)});var ba=Object.create(B,{constructor:{value:t}});t.prototype=ba;var I=new cb(n,t,ba,r,y,f,k,l);y=new Y(n,I,!0,!1);B=new Y(n+\"*\",I,!1,!1);var lb=new Y(n+\" const*\",I,!1,!0);Qa[a]={pointerType:B,\nla:lb};ib(u,t);return[y,B,lb]})},d:function(a,b,c,d,e,f,g){var k=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(m){function l(){nb(\"Cannot call \"+n+\" due to unbound types\",k)}m=m[0];var n=m.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);var p=m.N.constructor;void 0===p[b]?(l.Z=c-1,p[b]=l):(ab(p,b,n),p[b].S[c-1]=l);V([],k,function(r){r=ob(n,[r[0],null].concat(r.slice(1)),null,f,g);void 0===p[b].S?(r.Z=c-1,p[b]=r):p[b].S[c-1]=r;return[]});return[]})},p:function(a,b,c,d,e,f){0<b||x();var g=pb(b,\nc);e=Z(d,e);V([],[a],function(k){k=k[0];var m=\"constructor \"+k.name;void 0===k.N.Y&&(k.N.Y=[]);if(void 0!==k.N.Y[b-1])throw new K(\"Cannot register multiple constructors with identical number of parameters (\"+(b-1)+\") for class '\"+k.name+\"'! Overload resolution is currently only performed using the parameter count, not actual type info!\");k.N.Y[b-1]=()=>{nb(\"Cannot construct \"+k.name+\" due to unbound types\",g)};V([],g,function(l){l.splice(1,0,null);k.N.Y[b-1]=ob(m,l,null,e,f);return[]});return[]})},\na:function(a,b,c,d,e,f,g,k){var m=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(l){function n(){nb(\"Cannot call \"+p+\" due to unbound types\",m)}l=l[0];var p=l.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);k&&l.N.ja.push(b);var r=l.N.X,u=r[b];void 0===u||void 0===u.S&&u.className!==l.name&&u.Z===c-2?(n.Z=c-2,n.className=l.name,r[b]=n):(ab(r,b,p),r[b].S[c-2]=n);V([],m,function(t){t=ob(p,t,l,f,g);void 0===r[b].S?(t.Z=c-2,r[b]=t):r[b].S[c-2]=t;return[]});return[]})},A:function(a,b){b=N(b);W(a,\n{name:b,fromWireType:function(c){var d=M(c);qb(c);return d},toWireType:function(c,d){return Ea(d)},argPackAdvance:8,readValueFromPointer:Xa,V:null})},n:function(a,b,c){c=Za(c);b=N(b);W(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){return e},argPackAdvance:8,readValueFromPointer:rb(b,c),V:null})},e:function(a,b,c,d,e){b=N(b);-1===e&&(e=4294967295);e=Za(c);var f=k=>k;if(0===d){var g=32-8*c;f=k=>k<<g>>>g}c=b.includes(\"unsigned\")?function(k,m){return m>>>0}:function(k,m){return m};\nW(a,{name:b,fromWireType:f,toWireType:c,argPackAdvance:8,readValueFromPointer:sb(b,e,0!==d),V:null})},b:function(a,b,c){function d(f){f>>=2;var g=E;return new e(ia,g[f+1],g[f])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=N(c);W(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{ua:!0})},o:function(a,b){b=N(b);var c=\"std::string\"===b;W(a,{name:b,fromWireType:function(d){var e=E[d>>2],f=d+4;if(c)for(var g=f,k=0;k<=e;++k){var m=\nf+k;if(k==e||0==A[m]){g=g?z(A,g,m-g):\"\";if(void 0===l)var l=g;else l+=String.fromCharCode(0),l+=g;g=m+1}}else{l=Array(e);for(k=0;k<e;++k)l[k]=String.fromCharCode(A[f+k]);l=l.join(\"\")}S(d);return l},toWireType:function(d,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var f,g=\"string\"==typeof e;g||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array||L(\"Cannot pass non-string to std::string\");if(c&&g){var k=0;for(f=0;f<e.length;++f){var m=e.charCodeAt(f);127>=m?k++:2047>=\nm?k+=2:55296<=m&&57343>=m?(k+=4,++f):k+=3}f=k}else f=e.length;k=Ib(4+f+1);m=k+4;E[k>>2]=f;if(c&&g){if(g=m,m=f+1,f=A,0<m){m=g+m-1;for(var l=0;l<e.length;++l){var n=e.charCodeAt(l);if(55296<=n&&57343>=n){var p=e.charCodeAt(++l);n=65536+((n&1023)<<10)|p&1023}if(127>=n){if(g>=m)break;f[g++]=n}else{if(2047>=n){if(g+1>=m)break;f[g++]=192|n>>6}else{if(65535>=n){if(g+2>=m)break;f[g++]=224|n>>12}else{if(g+3>=m)break;f[g++]=240|n>>18;f[g++]=128|n>>12&63}f[g++]=128|n>>6&63}f[g++]=128|n&63}}f[g]=0}}else if(g)for(g=\n0;g<f;++g)l=e.charCodeAt(g),255<l&&(S(m),L(\"String has UTF-16 code units that do not fit in 8 bits\")),A[m+g]=l;else for(g=0;g<f;++g)A[m+g]=e[g];null!==d&&d.push(S,k);return k},argPackAdvance:8,readValueFromPointer:Xa,V:function(d){S(d)}})},i:function(a,b,c){c=N(c);if(2===b){var d=tb;var e=ub;var f=vb;var g=()=>ka;var k=1}else 4===b&&(d=wb,e=xb,f=yb,g=()=>E,k=2);W(a,{name:c,fromWireType:function(m){for(var l=E[m>>2],n=g(),p,r=m+4,u=0;u<=l;++u){var t=m+4+u*b;if(u==l||0==n[t>>k])r=d(r,t-r),void 0===\np?p=r:(p+=String.fromCharCode(0),p+=r),r=t+b}S(m);return p},toWireType:function(m,l){\"string\"!=typeof l&&L(\"Cannot pass non-string to C++ string type \"+c);var n=f(l),p=Ib(4+n+b);E[p>>2]=n>>k;e(l,p+4,n+b);null!==m&&m.push(S,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:function(m){S(m)}})},k:function(a,b,c,d,e,f){Va[a]={name:N(b),fa:Z(c,d),W:Z(e,f),ia:[]}},h:function(a,b,c,d,e,f,g,k,m,l){Va[a].ia.push({oa:N(b),ta:c,ra:Z(d,e),sa:f,za:g,ya:Z(k,m),Aa:l})},C:function(a,b){b=N(b);W(a,{va:!0,name:b,\nargPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(a,b,c,d,e){a=Bb[a];b=M(b);c=Ab(c);var f=[];E[d>>2]=Ea(f);return a(b,c,f,e)},t:function(a,b,c,d){a=Bb[a];b=M(b);c=Ab(c);a(b,c,null,d)},g:qb,m:function(a,b){var c=Db(a,b),d=c[0];b=d.name+\"_$\"+c.slice(1).map(function(g){return g.name}).join(\"_\")+\"$\";var e=Eb[b];if(void 0!==e)return e;var f=Array(a-1);e=Cb((g,k,m,l)=>{for(var n=0,p=0;p<a-1;++p)f[p]=c[p+1].readValueFromPointer(l+n),n+=c[p+1].argPackAdvance;g=g[k].apply(g,\nf);for(p=0;p<a-1;++p)c[p+1].ma&&c[p+1].ma(f[p]);if(!d.va)return d.toWireType(m,g)});return Eb[b]=e},D:function(a){4<a&&(J[a].ga+=1)},r:function(a){var b=M(a);Wa(b);qb(a)},c:function(){x(\"\")},x:function(a,b,c){A.copyWithin(a,b,b+c)},w:function(a){var b=A.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var e=Math;d=Math.max(a,d);e=e.min.call(e,2147483648,d+(65536-d%65536)%65536);a:{try{fa.grow(e-ia.byteLength+65535>>>16);na();var f=1;break a}catch(g){}f=\nvoid 0}if(f)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(a,b,c,d){for(var e=0,f=0;f<c;f++){var g=E[b>>2],k=E[b+4>>2];b+=8;for(var m=0;m<k;m++){var l=A[g+m],n=Fb[a];0===l||10===l?((1===a?ea:v)(z(n,0)),n.length=0):n.push(l)}e+=k}E[d>>2]=e;return 0}};\n(function(){function a(e){h.asm=e.exports;fa=h.asm.E;na();oa=h.asm.J;qa.unshift(h.asm.F);F--;h.monitorRunDependencies&&h.monitorRunDependencies(F);0==F&&(null!==ta&&(clearInterval(ta),ta=null),G&&(e=G,G=null,e()))}function b(e){a(e.instance)}function c(e){return ya().then(function(f){return WebAssembly.instantiate(f,d)}).then(function(f){return f}).then(e,function(f){v(\"failed to asynchronously prepare wasm: \"+f);x(f)})}var d={a:Jb};F++;h.monitorRunDependencies&&h.monitorRunDependencies(F);if(h.instantiateWasm)try{return h.instantiateWasm(d,\na)}catch(e){v(\"Module.instantiateWasm callback failed with error: \"+e),ca(e)}(function(){return w||\"function\"!=typeof WebAssembly.instantiateStreaming||ua(H)||\"function\"!=typeof fetch?c(b):fetch(H,{credentials:\"same-origin\"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(f){v(\"wasm streaming compile failed: \"+f);v(\"falling back to ArrayBuffer instantiation\");return c(b)})})})().catch(ca);return{}})();\nh.___wasm_call_ctors=function(){return(h.___wasm_call_ctors=h.asm.F).apply(null,arguments)};var Ka=h.___getTypeName=function(){return(Ka=h.___getTypeName=h.asm.G).apply(null,arguments)};h.__embind_initialize_bindings=function(){return(h.__embind_initialize_bindings=h.asm.H).apply(null,arguments)};var Ib=h._malloc=function(){return(Ib=h._malloc=h.asm.I).apply(null,arguments)},S=h._free=function(){return(S=h._free=h.asm.K).apply(null,arguments)};\nh.dynCall_jiji=function(){return(h.dynCall_jiji=h.asm.L).apply(null,arguments)};var Kb;G=function Lb(){Kb||Mb();Kb||(G=Lb)};\nfunction Mb(){function a(){if(!Kb&&(Kb=!0,h.calledRun=!0,!ha)){za(qa);aa(h);if(h.onRuntimeInitialized)h.onRuntimeInitialized();if(h.postRun)for(\"function\"==typeof h.postRun&&(h.postRun=[h.postRun]);h.postRun.length;){var b=h.postRun.shift();ra.unshift(b)}za(ra)}}if(!(0<F)){if(h.preRun)for(\"function\"==typeof h.preRun&&(h.preRun=[h.preRun]);h.preRun.length;)sa();za(pa);0<F||(h.setStatus?(h.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){h.setStatus(\"\")},1);a()},1)):a())}}\nif(h.preInit)for(\"function\"==typeof h.preInit&&(h.preInit=[h.preInit]);0<h.preInit.length;)h.preInit.pop()();Mb();\n\n\n return loadYoga.ready\n}\n);\n})();\nexport default loadYoga;",
|
|
6
|
+
"/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// @generated by enums.py\n\nexport let Align = /*#__PURE__*/function (Align) {\n Align[Align[\"Auto\"] = 0] = \"Auto\";\n Align[Align[\"FlexStart\"] = 1] = \"FlexStart\";\n Align[Align[\"Center\"] = 2] = \"Center\";\n Align[Align[\"FlexEnd\"] = 3] = \"FlexEnd\";\n Align[Align[\"Stretch\"] = 4] = \"Stretch\";\n Align[Align[\"Baseline\"] = 5] = \"Baseline\";\n Align[Align[\"SpaceBetween\"] = 6] = \"SpaceBetween\";\n Align[Align[\"SpaceAround\"] = 7] = \"SpaceAround\";\n Align[Align[\"SpaceEvenly\"] = 8] = \"SpaceEvenly\";\n return Align;\n}({});\nexport let BoxSizing = /*#__PURE__*/function (BoxSizing) {\n BoxSizing[BoxSizing[\"BorderBox\"] = 0] = \"BorderBox\";\n BoxSizing[BoxSizing[\"ContentBox\"] = 1] = \"ContentBox\";\n return BoxSizing;\n}({});\nexport let Dimension = /*#__PURE__*/function (Dimension) {\n Dimension[Dimension[\"Width\"] = 0] = \"Width\";\n Dimension[Dimension[\"Height\"] = 1] = \"Height\";\n return Dimension;\n}({});\nexport let Direction = /*#__PURE__*/function (Direction) {\n Direction[Direction[\"Inherit\"] = 0] = \"Inherit\";\n Direction[Direction[\"LTR\"] = 1] = \"LTR\";\n Direction[Direction[\"RTL\"] = 2] = \"RTL\";\n return Direction;\n}({});\nexport let Display = /*#__PURE__*/function (Display) {\n Display[Display[\"Flex\"] = 0] = \"Flex\";\n Display[Display[\"None\"] = 1] = \"None\";\n Display[Display[\"Contents\"] = 2] = \"Contents\";\n return Display;\n}({});\nexport let Edge = /*#__PURE__*/function (Edge) {\n Edge[Edge[\"Left\"] = 0] = \"Left\";\n Edge[Edge[\"Top\"] = 1] = \"Top\";\n Edge[Edge[\"Right\"] = 2] = \"Right\";\n Edge[Edge[\"Bottom\"] = 3] = \"Bottom\";\n Edge[Edge[\"Start\"] = 4] = \"Start\";\n Edge[Edge[\"End\"] = 5] = \"End\";\n Edge[Edge[\"Horizontal\"] = 6] = \"Horizontal\";\n Edge[Edge[\"Vertical\"] = 7] = \"Vertical\";\n Edge[Edge[\"All\"] = 8] = \"All\";\n return Edge;\n}({});\nexport let Errata = /*#__PURE__*/function (Errata) {\n Errata[Errata[\"None\"] = 0] = \"None\";\n Errata[Errata[\"StretchFlexBasis\"] = 1] = \"StretchFlexBasis\";\n Errata[Errata[\"AbsolutePositionWithoutInsetsExcludesPadding\"] = 2] = \"AbsolutePositionWithoutInsetsExcludesPadding\";\n Errata[Errata[\"AbsolutePercentAgainstInnerSize\"] = 4] = \"AbsolutePercentAgainstInnerSize\";\n Errata[Errata[\"All\"] = 2147483647] = \"All\";\n Errata[Errata[\"Classic\"] = 2147483646] = \"Classic\";\n return Errata;\n}({});\nexport let ExperimentalFeature = /*#__PURE__*/function (ExperimentalFeature) {\n ExperimentalFeature[ExperimentalFeature[\"WebFlexBasis\"] = 0] = \"WebFlexBasis\";\n return ExperimentalFeature;\n}({});\nexport let FlexDirection = /*#__PURE__*/function (FlexDirection) {\n FlexDirection[FlexDirection[\"Column\"] = 0] = \"Column\";\n FlexDirection[FlexDirection[\"ColumnReverse\"] = 1] = \"ColumnReverse\";\n FlexDirection[FlexDirection[\"Row\"] = 2] = \"Row\";\n FlexDirection[FlexDirection[\"RowReverse\"] = 3] = \"RowReverse\";\n return FlexDirection;\n}({});\nexport let Gutter = /*#__PURE__*/function (Gutter) {\n Gutter[Gutter[\"Column\"] = 0] = \"Column\";\n Gutter[Gutter[\"Row\"] = 1] = \"Row\";\n Gutter[Gutter[\"All\"] = 2] = \"All\";\n return Gutter;\n}({});\nexport let Justify = /*#__PURE__*/function (Justify) {\n Justify[Justify[\"FlexStart\"] = 0] = \"FlexStart\";\n Justify[Justify[\"Center\"] = 1] = \"Center\";\n Justify[Justify[\"FlexEnd\"] = 2] = \"FlexEnd\";\n Justify[Justify[\"SpaceBetween\"] = 3] = \"SpaceBetween\";\n Justify[Justify[\"SpaceAround\"] = 4] = \"SpaceAround\";\n Justify[Justify[\"SpaceEvenly\"] = 5] = \"SpaceEvenly\";\n return Justify;\n}({});\nexport let LogLevel = /*#__PURE__*/function (LogLevel) {\n LogLevel[LogLevel[\"Error\"] = 0] = \"Error\";\n LogLevel[LogLevel[\"Warn\"] = 1] = \"Warn\";\n LogLevel[LogLevel[\"Info\"] = 2] = \"Info\";\n LogLevel[LogLevel[\"Debug\"] = 3] = \"Debug\";\n LogLevel[LogLevel[\"Verbose\"] = 4] = \"Verbose\";\n LogLevel[LogLevel[\"Fatal\"] = 5] = \"Fatal\";\n return LogLevel;\n}({});\nexport let MeasureMode = /*#__PURE__*/function (MeasureMode) {\n MeasureMode[MeasureMode[\"Undefined\"] = 0] = \"Undefined\";\n MeasureMode[MeasureMode[\"Exactly\"] = 1] = \"Exactly\";\n MeasureMode[MeasureMode[\"AtMost\"] = 2] = \"AtMost\";\n return MeasureMode;\n}({});\nexport let NodeType = /*#__PURE__*/function (NodeType) {\n NodeType[NodeType[\"Default\"] = 0] = \"Default\";\n NodeType[NodeType[\"Text\"] = 1] = \"Text\";\n return NodeType;\n}({});\nexport let Overflow = /*#__PURE__*/function (Overflow) {\n Overflow[Overflow[\"Visible\"] = 0] = \"Visible\";\n Overflow[Overflow[\"Hidden\"] = 1] = \"Hidden\";\n Overflow[Overflow[\"Scroll\"] = 2] = \"Scroll\";\n return Overflow;\n}({});\nexport let PositionType = /*#__PURE__*/function (PositionType) {\n PositionType[PositionType[\"Static\"] = 0] = \"Static\";\n PositionType[PositionType[\"Relative\"] = 1] = \"Relative\";\n PositionType[PositionType[\"Absolute\"] = 2] = \"Absolute\";\n return PositionType;\n}({});\nexport let Unit = /*#__PURE__*/function (Unit) {\n Unit[Unit[\"Undefined\"] = 0] = \"Undefined\";\n Unit[Unit[\"Point\"] = 1] = \"Point\";\n Unit[Unit[\"Percent\"] = 2] = \"Percent\";\n Unit[Unit[\"Auto\"] = 3] = \"Auto\";\n return Unit;\n}({});\nexport let Wrap = /*#__PURE__*/function (Wrap) {\n Wrap[Wrap[\"NoWrap\"] = 0] = \"NoWrap\";\n Wrap[Wrap[\"Wrap\"] = 1] = \"Wrap\";\n Wrap[Wrap[\"WrapReverse\"] = 2] = \"WrapReverse\";\n return Wrap;\n}({});\nconst constants = {\n ALIGN_AUTO: Align.Auto,\n ALIGN_FLEX_START: Align.FlexStart,\n ALIGN_CENTER: Align.Center,\n ALIGN_FLEX_END: Align.FlexEnd,\n ALIGN_STRETCH: Align.Stretch,\n ALIGN_BASELINE: Align.Baseline,\n ALIGN_SPACE_BETWEEN: Align.SpaceBetween,\n ALIGN_SPACE_AROUND: Align.SpaceAround,\n ALIGN_SPACE_EVENLY: Align.SpaceEvenly,\n BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox,\n BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox,\n DIMENSION_WIDTH: Dimension.Width,\n DIMENSION_HEIGHT: Dimension.Height,\n DIRECTION_INHERIT: Direction.Inherit,\n DIRECTION_LTR: Direction.LTR,\n DIRECTION_RTL: Direction.RTL,\n DISPLAY_FLEX: Display.Flex,\n DISPLAY_NONE: Display.None,\n DISPLAY_CONTENTS: Display.Contents,\n EDGE_LEFT: Edge.Left,\n EDGE_TOP: Edge.Top,\n EDGE_RIGHT: Edge.Right,\n EDGE_BOTTOM: Edge.Bottom,\n EDGE_START: Edge.Start,\n EDGE_END: Edge.End,\n EDGE_HORIZONTAL: Edge.Horizontal,\n EDGE_VERTICAL: Edge.Vertical,\n EDGE_ALL: Edge.All,\n ERRATA_NONE: Errata.None,\n ERRATA_STRETCH_FLEX_BASIS: Errata.StretchFlexBasis,\n ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING: Errata.AbsolutePositionWithoutInsetsExcludesPadding,\n ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE: Errata.AbsolutePercentAgainstInnerSize,\n ERRATA_ALL: Errata.All,\n ERRATA_CLASSIC: Errata.Classic,\n EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: ExperimentalFeature.WebFlexBasis,\n FLEX_DIRECTION_COLUMN: FlexDirection.Column,\n FLEX_DIRECTION_COLUMN_REVERSE: FlexDirection.ColumnReverse,\n FLEX_DIRECTION_ROW: FlexDirection.Row,\n FLEX_DIRECTION_ROW_REVERSE: FlexDirection.RowReverse,\n GUTTER_COLUMN: Gutter.Column,\n GUTTER_ROW: Gutter.Row,\n GUTTER_ALL: Gutter.All,\n JUSTIFY_FLEX_START: Justify.FlexStart,\n JUSTIFY_CENTER: Justify.Center,\n JUSTIFY_FLEX_END: Justify.FlexEnd,\n JUSTIFY_SPACE_BETWEEN: Justify.SpaceBetween,\n JUSTIFY_SPACE_AROUND: Justify.SpaceAround,\n JUSTIFY_SPACE_EVENLY: Justify.SpaceEvenly,\n LOG_LEVEL_ERROR: LogLevel.Error,\n LOG_LEVEL_WARN: LogLevel.Warn,\n LOG_LEVEL_INFO: LogLevel.Info,\n LOG_LEVEL_DEBUG: LogLevel.Debug,\n LOG_LEVEL_VERBOSE: LogLevel.Verbose,\n LOG_LEVEL_FATAL: LogLevel.Fatal,\n MEASURE_MODE_UNDEFINED: MeasureMode.Undefined,\n MEASURE_MODE_EXACTLY: MeasureMode.Exactly,\n MEASURE_MODE_AT_MOST: MeasureMode.AtMost,\n NODE_TYPE_DEFAULT: NodeType.Default,\n NODE_TYPE_TEXT: NodeType.Text,\n OVERFLOW_VISIBLE: Overflow.Visible,\n OVERFLOW_HIDDEN: Overflow.Hidden,\n OVERFLOW_SCROLL: Overflow.Scroll,\n POSITION_TYPE_STATIC: PositionType.Static,\n POSITION_TYPE_RELATIVE: PositionType.Relative,\n POSITION_TYPE_ABSOLUTE: PositionType.Absolute,\n UNIT_UNDEFINED: Unit.Undefined,\n UNIT_POINT: Unit.Point,\n UNIT_PERCENT: Unit.Percent,\n UNIT_AUTO: Unit.Auto,\n WRAP_NO_WRAP: Wrap.NoWrap,\n WRAP_WRAP: Wrap.Wrap,\n WRAP_WRAP_REVERSE: Wrap.WrapReverse\n};\nexport default constants;\n//# sourceMappingURL=YGEnums.js.map",
|
|
7
|
+
"/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-nocheck\n\nimport { Unit, Direction } from \"./generated/YGEnums.js\";\nimport YGEnums from \"./generated/YGEnums.js\";\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function wrapAssembly(lib) {\n function patch(prototype, name, fn) {\n const original = prototype[name];\n prototype[name] = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return fn.call(this, original, ...args);\n };\n }\n for (const fnName of ['setPosition', 'setMargin', 'setFlexBasis', 'setWidth', 'setHeight', 'setMinWidth', 'setMinHeight', 'setMaxWidth', 'setMaxHeight', 'setPadding', 'setGap']) {\n const methods = {\n [Unit.Point]: lib.Node.prototype[fnName],\n [Unit.Percent]: lib.Node.prototype[`${fnName}Percent`],\n [Unit.Auto]: lib.Node.prototype[`${fnName}Auto`]\n };\n patch(lib.Node.prototype, fnName, function (original) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n // We patch all these functions to add support for the following calls:\n // .setWidth(100) / .setWidth(\"100%\") / .setWidth(.getWidth()) / .setWidth(\"auto\")\n\n const value = args.pop();\n let unit, asNumber;\n if (value === 'auto') {\n unit = Unit.Auto;\n asNumber = undefined;\n } else if (typeof value === 'object') {\n unit = value.unit;\n asNumber = value.valueOf();\n } else {\n unit = typeof value === 'string' && value.endsWith('%') ? Unit.Percent : Unit.Point;\n asNumber = parseFloat(value);\n if (value !== undefined && !Number.isNaN(value) && Number.isNaN(asNumber)) {\n throw new Error(`Invalid value ${value} for ${fnName}`);\n }\n }\n if (!methods[unit]) throw new Error(`Failed to execute \"${fnName}\": Unsupported unit '${value}'`);\n if (asNumber !== undefined) {\n return methods[unit].call(this, ...args, asNumber);\n } else {\n return methods[unit].call(this, ...args);\n }\n });\n }\n function wrapMeasureFunction(measureFunction) {\n return lib.MeasureCallback.implement({\n measure: function () {\n const {\n width,\n height\n } = measureFunction(...arguments);\n return {\n width: width ?? NaN,\n height: height ?? NaN\n };\n }\n });\n }\n patch(lib.Node.prototype, 'setMeasureFunc', function (original, measureFunc) {\n // This patch is just a convenience patch, since it helps write more\n // idiomatic source code (such as .setMeasureFunc(null))\n if (measureFunc) {\n return original.call(this, wrapMeasureFunction(measureFunc));\n } else {\n return this.unsetMeasureFunc();\n }\n });\n function wrapDirtiedFunc(dirtiedFunction) {\n return lib.DirtiedCallback.implement({\n dirtied: dirtiedFunction\n });\n }\n patch(lib.Node.prototype, 'setDirtiedFunc', function (original, dirtiedFunc) {\n original.call(this, wrapDirtiedFunc(dirtiedFunc));\n });\n patch(lib.Config.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Config.create),\n // we also need to handle the deallocation\n lib.Config.destroy(this);\n });\n patch(lib.Node, 'create', (_, config) => {\n // We decide the constructor we want to call depending on the parameters\n return config ? lib.Node.createWithConfig(config) : lib.Node.createDefault();\n });\n patch(lib.Node.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Node.create),\n // we also need to handle the deallocation\n lib.Node.destroy(this);\n });\n patch(lib.Node.prototype, 'freeRecursive', function () {\n for (let t = 0, T = this.getChildCount(); t < T; ++t) {\n this.getChild(0).freeRecursive();\n }\n this.free();\n });\n patch(lib.Node.prototype, 'calculateLayout', function (original) {\n let width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : NaN;\n let height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : NaN;\n let direction = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Direction.LTR;\n // Just a small patch to add support for the function default parameters\n return original.call(this, width, height, direction);\n });\n return {\n Config: lib.Config,\n Node: lib.Node,\n ...YGEnums\n };\n}\n//# sourceMappingURL=wrapAssembly.js.map",
|
|
8
|
+
"/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-ignore untyped from Emscripten\nimport loadYoga from '../binaries/yoga-wasm-base64-esm.js';\nimport wrapAssembly from \"./wrapAssembly.js\";\nconst Yoga = wrapAssembly(await loadYoga());\nexport default Yoga;\nexport * from \"./generated/YGEnums.js\";\n//# sourceMappingURL=index.js.map",
|
|
9
|
+
"import type { ColorInput } from \"./RGBA.js\"\n\nexport interface BorderCharacters {\n topLeft: string\n topRight: string\n bottomLeft: string\n bottomRight: string\n horizontal: string\n vertical: string\n topT: string\n bottomT: string\n leftT: string\n rightT: string\n cross: string\n}\n\nexport type BorderStyle = \"single\" | \"double\" | \"rounded\" | \"heavy\"\nexport type BorderSides = \"top\" | \"right\" | \"bottom\" | \"left\"\n\nconst VALID_BORDER_STYLES: readonly BorderStyle[] = [\"single\", \"double\", \"rounded\", \"heavy\"] as const\n\nexport function isValidBorderStyle(value: unknown): value is BorderStyle {\n return typeof value === \"string\" && VALID_BORDER_STYLES.includes(value as BorderStyle)\n}\n\nexport function parseBorderStyle(value: unknown, fallback: BorderStyle = \"single\"): BorderStyle {\n if (isValidBorderStyle(value)) {\n return value\n }\n\n if (value !== undefined && value !== null) {\n console.warn(\n `Invalid borderStyle \"${value}\", falling back to \"${fallback}\". Valid values are: ${VALID_BORDER_STYLES.join(\", \")}`,\n )\n }\n return fallback\n}\n\nexport const BorderChars: Record<BorderStyle, BorderCharacters> = {\n single: {\n topLeft: \"┌\",\n topRight: \"┐\",\n bottomLeft: \"└\",\n bottomRight: \"┘\",\n horizontal: \"─\",\n vertical: \"│\",\n topT: \"┬\",\n bottomT: \"┴\",\n leftT: \"├\",\n rightT: \"┤\",\n cross: \"┼\",\n },\n double: {\n topLeft: \"╔\",\n topRight: \"╗\",\n bottomLeft: \"╚\",\n bottomRight: \"╝\",\n horizontal: \"═\",\n vertical: \"║\",\n topT: \"╦\",\n bottomT: \"╩\",\n leftT: \"╠\",\n rightT: \"╣\",\n cross: \"╬\",\n },\n rounded: {\n topLeft: \"╭\",\n topRight: \"╮\",\n bottomLeft: \"╰\",\n bottomRight: \"╯\",\n horizontal: \"─\",\n vertical: \"│\",\n topT: \"┬\",\n bottomT: \"┴\",\n leftT: \"├\",\n rightT: \"┤\",\n cross: \"┼\",\n },\n heavy: {\n topLeft: \"┏\",\n topRight: \"┓\",\n bottomLeft: \"┗\",\n bottomRight: \"┛\",\n horizontal: \"━\",\n vertical: \"┃\",\n topT: \"┳\",\n bottomT: \"┻\",\n leftT: \"┣\",\n rightT: \"┫\",\n cross: \"╋\",\n },\n}\n\nexport interface BorderConfig {\n borderStyle: BorderStyle\n border: boolean | BorderSides[]\n borderColor?: ColorInput\n customBorderChars?: BorderCharacters\n}\n\nexport interface BoxDrawOptions {\n x: number\n y: number\n width: number\n height: number\n borderStyle: BorderStyle\n border: boolean | BorderSides[]\n borderColor: ColorInput\n customBorderChars?: BorderCharacters\n backgroundColor: ColorInput\n shouldFill?: boolean\n title?: string\n titleAlignment?: \"left\" | \"center\" | \"right\"\n bottomTitle?: string\n bottomTitleAlignment?: \"left\" | \"center\" | \"right\"\n}\n\nexport interface BorderSidesConfig {\n top: boolean\n right: boolean\n bottom: boolean\n left: boolean\n}\n\nexport function getBorderFromSides(sides: BorderSidesConfig): boolean | BorderSides[] {\n const result: BorderSides[] = []\n if (sides.top) result.push(\"top\")\n if (sides.right) result.push(\"right\")\n if (sides.bottom) result.push(\"bottom\")\n if (sides.left) result.push(\"left\")\n return result.length > 0 ? result : false\n}\n\nexport function getBorderSides(border: boolean | BorderSides[]): BorderSidesConfig {\n return border === true\n ? { top: true, right: true, bottom: true, left: true }\n : Array.isArray(border)\n ? {\n top: border.includes(\"top\"),\n right: border.includes(\"right\"),\n bottom: border.includes(\"bottom\"),\n left: border.includes(\"left\"),\n }\n : { top: false, right: false, bottom: false, left: false }\n}\n\n// Convert BorderCharacters to Uint32Array for passing to Zig\nexport function borderCharsToArray(chars: BorderCharacters): Uint32Array {\n const array = new Uint32Array(11)\n array[0] = chars.topLeft.codePointAt(0)!\n array[1] = chars.topRight.codePointAt(0)!\n array[2] = chars.bottomLeft.codePointAt(0)!\n array[3] = chars.bottomRight.codePointAt(0)!\n array[4] = chars.horizontal.codePointAt(0)!\n array[5] = chars.vertical.codePointAt(0)!\n array[6] = chars.topT.codePointAt(0)!\n array[7] = chars.bottomT.codePointAt(0)!\n array[8] = chars.leftT.codePointAt(0)!\n array[9] = chars.rightT.codePointAt(0)!\n array[10] = chars.cross.codePointAt(0)!\n return array\n}\n\n// Pre-converted border character arrays for performance\nexport const BorderCharArrays: Record<BorderStyle, Uint32Array> = {\n single: borderCharsToArray(BorderChars.single),\n double: borderCharsToArray(BorderChars.double),\n rounded: borderCharsToArray(BorderChars.rounded),\n heavy: borderCharsToArray(BorderChars.heavy),\n}\n",
|
|
10
|
+
"import { EventEmitter } from \"events\"\nimport { type KeyEventType, type ParsedKey } from \"./parse.keypress.js\"\nimport type { PasteMetadata } from \"./paste.js\"\n\nexport class KeyEvent implements ParsedKey {\n name: string\n ctrl: boolean\n meta: boolean\n shift: boolean\n option: boolean\n sequence: string\n number: boolean\n raw: string\n eventType: KeyEventType\n source: \"raw\" | \"kitty\"\n code?: string\n super?: boolean\n hyper?: boolean\n capsLock?: boolean\n numLock?: boolean\n baseCode?: number\n repeated?: boolean\n\n private _defaultPrevented: boolean = false\n private _propagationStopped: boolean = false\n\n constructor(key: ParsedKey) {\n this.name = key.name\n this.ctrl = key.ctrl\n this.meta = key.meta\n this.shift = key.shift\n this.option = key.option\n this.sequence = key.sequence\n this.number = key.number\n this.raw = key.raw\n this.eventType = key.eventType\n this.source = key.source\n this.code = key.code\n this.super = key.super\n this.hyper = key.hyper\n this.capsLock = key.capsLock\n this.numLock = key.numLock\n this.baseCode = key.baseCode\n this.repeated = key.repeated\n }\n\n get defaultPrevented(): boolean {\n return this._defaultPrevented\n }\n\n get propagationStopped(): boolean {\n return this._propagationStopped\n }\n\n preventDefault(): void {\n this._defaultPrevented = true\n }\n\n stopPropagation(): void {\n this._propagationStopped = true\n }\n}\n\nexport class PasteEvent {\n type = \"paste\" as const\n bytes: Uint8Array\n metadata?: PasteMetadata\n private _defaultPrevented: boolean = false\n private _propagationStopped: boolean = false\n\n constructor(bytes: Uint8Array, metadata?: PasteMetadata) {\n this.bytes = bytes\n this.metadata = metadata\n }\n\n get defaultPrevented(): boolean {\n return this._defaultPrevented\n }\n\n get propagationStopped(): boolean {\n return this._propagationStopped\n }\n\n preventDefault(): void {\n this._defaultPrevented = true\n }\n\n stopPropagation(): void {\n this._propagationStopped = true\n }\n}\n\nexport type KeyHandlerEventMap = {\n keypress: [KeyEvent]\n keyrelease: [KeyEvent]\n paste: [PasteEvent]\n}\n\nexport class KeyHandler extends EventEmitter<KeyHandlerEventMap> {\n public processParsedKey(parsedKey: ParsedKey): boolean {\n try {\n switch (parsedKey.eventType) {\n case \"press\":\n this.emit(\"keypress\", new KeyEvent(parsedKey))\n break\n case \"release\":\n this.emit(\"keyrelease\", new KeyEvent(parsedKey))\n break\n default:\n this.emit(\"keypress\", new KeyEvent(parsedKey))\n break\n }\n } catch (error) {\n console.error(`[KeyHandler] Error processing parsed key:`, error)\n return true\n }\n\n return true\n }\n\n public processPaste(bytes: Uint8Array, metadata?: PasteMetadata): void {\n try {\n this.emit(\"paste\", new PasteEvent(bytes, metadata))\n } catch (error) {\n console.error(`[KeyHandler] Error processing paste:`, error)\n }\n }\n}\n\n/**\n * This class is used internally by the renderer to ensure global handlers\n * can preventDefault before renderable handlers process events.\n */\nexport class InternalKeyHandler extends KeyHandler {\n private renderableHandlers: Map<keyof KeyHandlerEventMap, Set<Function>> = new Map()\n\n public override emit<K extends keyof KeyHandlerEventMap>(event: K, ...args: KeyHandlerEventMap[K]): boolean {\n return this.emitWithPriority(event, ...args)\n }\n\n private emitWithPriority<K extends keyof KeyHandlerEventMap>(event: K, ...args: KeyHandlerEventMap[K]): boolean {\n let hasGlobalListeners = false\n\n // Check if we should emit to global handlers\n // Global handlers are emitted using the parent EventEmitter which calls all listeners\n // We need to manually iterate to check for stopPropagation between handlers\n const globalListeners = this.listeners(event as any)\n if (globalListeners.length > 0) {\n hasGlobalListeners = true\n\n for (const listener of globalListeners) {\n try {\n listener(...args)\n } catch (error) {\n console.error(`[KeyHandler] Error in global ${event} handler:`, error)\n }\n\n // Check if propagation was stopped after this handler\n if (event === \"keypress\" || event === \"keyrelease\" || event === \"paste\") {\n const keyEvent = args[0]\n if (keyEvent.propagationStopped) {\n return hasGlobalListeners\n }\n }\n }\n }\n\n const renderableSet = this.renderableHandlers.get(event)\n // Snapshot the handler list so listeners added during dispatch (e.g., via focus changes)\n // do not receive the in-flight key event.\n const renderableHandlers = renderableSet && renderableSet.size > 0 ? [...renderableSet] : []\n let hasRenderableListeners = false\n\n if (renderableSet && renderableSet.size > 0) {\n hasRenderableListeners = true\n\n if (event === \"keypress\" || event === \"keyrelease\" || event === \"paste\") {\n const keyEvent = args[0]\n if (keyEvent.defaultPrevented) return hasGlobalListeners || hasRenderableListeners\n if (keyEvent.propagationStopped) return hasGlobalListeners || hasRenderableListeners\n }\n\n for (const handler of renderableHandlers) {\n try {\n handler(...args)\n } catch (error) {\n console.error(`[KeyHandler] Error in renderable ${event} handler:`, error)\n }\n\n // Check if propagation was stopped after this handler\n if (event === \"keypress\" || event === \"keyrelease\" || event === \"paste\") {\n const keyEvent = args[0]\n if (keyEvent.propagationStopped) {\n return hasGlobalListeners || hasRenderableListeners\n }\n }\n }\n }\n\n return hasGlobalListeners || hasRenderableListeners\n }\n\n public onInternal<K extends keyof KeyHandlerEventMap>(\n event: K,\n handler: (...args: KeyHandlerEventMap[K]) => void,\n ): void {\n if (!this.renderableHandlers.has(event)) {\n this.renderableHandlers.set(event, new Set())\n }\n this.renderableHandlers.get(event)!.add(handler)\n }\n\n public offInternal<K extends keyof KeyHandlerEventMap>(\n event: K,\n handler: (...args: KeyHandlerEventMap[K]) => void,\n ): void {\n const handlers = this.renderableHandlers.get(event)\n if (handlers) {\n handlers.delete(handler)\n }\n }\n}\n",
|
|
11
|
+
"export type RGBTriplet = readonly [number, number, number]\nexport type ColorKind = \"rgb\" | \"indexed\" | \"default\"\nexport type ColorInput = string | RGBA\n\nexport const COLOR_TAG_RGB = 256\nexport const COLOR_TAG_DEFAULT = 257\nexport const DEFAULT_FOREGROUND_RGB: RGBTriplet = [255, 255, 255]\nexport const DEFAULT_BACKGROUND_RGB: RGBTriplet = [0, 0, 0]\n\nconst RGBA_BUFFER_STRIDE = 5\n\nconst ANSI16_RGB: readonly RGBTriplet[] = [\n [0x00, 0x00, 0x00],\n [0x80, 0x00, 0x00],\n [0x00, 0x80, 0x00],\n [0x80, 0x80, 0x00],\n [0x00, 0x00, 0x80],\n [0x80, 0x00, 0x80],\n [0x00, 0x80, 0x80],\n [0xc0, 0xc0, 0xc0],\n [0x80, 0x80, 0x80],\n [0xff, 0x00, 0x00],\n [0x00, 0xff, 0x00],\n [0xff, 0xff, 0x00],\n [0x00, 0x00, 0xff],\n [0xff, 0x00, 0xff],\n [0x00, 0xff, 0xff],\n [0xff, 0xff, 0xff],\n]\n\nconst ANSI_256_CUBE_LEVELS = [0, 95, 135, 175, 215, 255] as const\n\nexport interface NormalizedColorValue {\n rgba: RGBA\n tag: number\n}\n\nfunction normalizeColorTag(tag: number | undefined): number {\n const normalizedTag = tag != null && Number.isFinite(tag) ? Math.round(tag) : COLOR_TAG_RGB\n\n if (normalizedTag === COLOR_TAG_RGB || normalizedTag === COLOR_TAG_DEFAULT) {\n return normalizedTag\n }\n\n if (Number.isInteger(normalizedTag) && normalizedTag >= 0 && normalizedTag <= 255) {\n return normalizedTag\n }\n\n return COLOR_TAG_RGB\n}\n\nfunction normalizeRGBABuffer(buffer: Float32Array): Float32Array {\n if (buffer.length === RGBA_BUFFER_STRIDE) {\n buffer[4] = normalizeColorTag(buffer[4])\n return buffer\n }\n\n const normalized = new Float32Array(RGBA_BUFFER_STRIDE)\n normalized[0] = buffer[0] ?? 0\n normalized[1] = buffer[1] ?? 0\n normalized[2] = buffer[2] ?? 0\n normalized[3] = buffer[3] ?? 0\n normalized[4] = COLOR_TAG_RGB\n\n return normalized\n}\n\nfunction withTag(rgba: RGBA, tag: number): RGBA {\n const tagged = RGBA.clone(rgba)\n tagged.tag = tag\n return tagged\n}\n\nfunction rgbaForAnsi256Index(index: number): RGBA {\n const [r, g, b] = ansi256IndexToRgb(index)\n return RGBA.fromInts(r, g, b)\n}\n\nexport function normalizeIndexedColorIndex(index: number): number {\n if (!Number.isInteger(index) || index < 0 || index > 255) {\n throw new RangeError(`Indexed color must be an integer in the range 0..255, got ${index}`)\n }\n\n return index\n}\n\nexport function ansi256IndexToRgb(index: number): RGBTriplet {\n const normalizedIndex = normalizeIndexedColorIndex(index)\n\n if (normalizedIndex < ANSI16_RGB.length) {\n return ANSI16_RGB[normalizedIndex]\n }\n\n if (normalizedIndex < 232) {\n const cubeIndex = normalizedIndex - 16\n const r = Math.floor(cubeIndex / 36)\n const g = Math.floor(cubeIndex / 6) % 6\n const b = cubeIndex % 6\n return [ANSI_256_CUBE_LEVELS[r], ANSI_256_CUBE_LEVELS[g], ANSI_256_CUBE_LEVELS[b]]\n }\n\n const value = 8 + (normalizedIndex - 232) * 10\n return [value, value, value]\n}\n\nexport function decodeColorTag(tag: number): { kind: ColorKind; index?: number } {\n if (tag === COLOR_TAG_DEFAULT) {\n return { kind: \"default\" }\n }\n\n if (tag === COLOR_TAG_RGB) {\n return { kind: \"rgb\" }\n }\n\n return { kind: \"indexed\", index: normalizeIndexedColorIndex(tag) }\n}\n\nexport class RGBA {\n buffer: Float32Array\n\n constructor(buffer: Float32Array) {\n this.buffer = normalizeRGBABuffer(buffer)\n }\n\n static fromArray(array: Float32Array) {\n return new RGBA(array)\n }\n\n static fromValues(r: number, g: number, b: number, a: number = 1.0, tag: number = COLOR_TAG_RGB) {\n return new RGBA(new Float32Array([r, g, b, a, normalizeColorTag(tag)]))\n }\n\n static clone(rgba: RGBA) {\n return RGBA.fromValues(rgba.r, rgba.g, rgba.b, rgba.a, rgba.tag)\n }\n\n static fromInts(r: number, g: number, b: number, a: number = 255, tag: number = COLOR_TAG_RGB) {\n return new RGBA(new Float32Array([r / 255, g / 255, b / 255, a / 255, normalizeColorTag(tag)]))\n }\n\n static fromHex(hex: string): RGBA {\n return hexToRgb(hex)\n }\n\n static fromIndex(index: number, snapshot?: ColorInput): RGBA {\n const normalizedIndex = normalizeIndexedColorIndex(index)\n return withTag(snapshot ? parseColor(snapshot) : rgbaForAnsi256Index(normalizedIndex), normalizedIndex)\n }\n\n static defaultForeground(snapshot?: ColorInput): RGBA {\n return withTag(snapshot ? parseColor(snapshot) : RGBA.fromInts(...DEFAULT_FOREGROUND_RGB), COLOR_TAG_DEFAULT)\n }\n\n static defaultBackground(snapshot?: ColorInput): RGBA {\n return withTag(snapshot ? parseColor(snapshot) : RGBA.fromInts(...DEFAULT_BACKGROUND_RGB), COLOR_TAG_DEFAULT)\n }\n\n static getIntentTag(rgba: RGBA): number {\n return rgba.tag\n }\n\n toInts(): [number, number, number, number] {\n return [Math.round(this.r * 255), Math.round(this.g * 255), Math.round(this.b * 255), Math.round(this.a * 255)]\n }\n\n get r(): number {\n return this.buffer[0]\n }\n\n set r(value: number) {\n this.buffer[0] = value\n }\n\n get g(): number {\n return this.buffer[1]\n }\n\n set g(value: number) {\n this.buffer[1] = value\n }\n\n get b(): number {\n return this.buffer[2]\n }\n\n set b(value: number) {\n this.buffer[2] = value\n }\n\n get a(): number {\n return this.buffer[3]\n }\n\n set a(value: number) {\n this.buffer[3] = value\n }\n\n get tag(): number {\n return normalizeColorTag(this.buffer[4])\n }\n\n set tag(value: number) {\n this.buffer[4] = normalizeColorTag(value)\n }\n\n map<R>(fn: (value: number) => R) {\n return [fn(this.r), fn(this.g), fn(this.b), fn(this.a)]\n }\n\n toString() {\n return `rgba(${this.r.toFixed(2)}, ${this.g.toFixed(2)}, ${this.b.toFixed(2)}, ${this.a.toFixed(2)})`\n }\n\n equals(other?: RGBA): boolean {\n if (!other) return false\n return (\n this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a && this.tag === other.tag\n )\n }\n}\n\nexport function normalizeColorValue(value: ColorInput | null | undefined): NormalizedColorValue | null {\n if (value == null) return null\n\n const rgba = parseColor(value)\n return { rgba, tag: rgba.tag }\n}\n\nexport function hexToRgb(hex: string): RGBA {\n hex = hex.replace(/^#/, \"\")\n\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]\n } else if (hex.length === 4) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3]\n }\n\n if (!/^[0-9A-Fa-f]{6}$/.test(hex) && !/^[0-9A-Fa-f]{8}$/.test(hex)) {\n console.warn(`Invalid hex color: ${hex}, defaulting to magenta`)\n return RGBA.fromValues(1, 0, 1, 1)\n }\n\n const r = parseInt(hex.substring(0, 2), 16) / 255\n const g = parseInt(hex.substring(2, 4), 16) / 255\n const b = parseInt(hex.substring(4, 6), 16) / 255\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1\n\n return RGBA.fromValues(r, g, b, a)\n}\n\nexport function rgbToHex(rgb: RGBA): string {\n const components = rgb.a === 1 ? [rgb.r, rgb.g, rgb.b] : [rgb.r, rgb.g, rgb.b, rgb.a]\n return (\n \"#\" +\n components\n .map((x) => {\n const hex = Math.floor(Math.max(0, Math.min(1, x) * 255)).toString(16)\n return hex.length === 1 ? \"0\" + hex : hex\n })\n .join(\"\")\n )\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): RGBA {\n let r = 0,\n g = 0,\n b = 0\n\n const i = Math.floor(h / 60) % 6\n const f = h / 60 - Math.floor(h / 60)\n const p = v * (1 - s)\n const q = v * (1 - f * s)\n const t = v * (1 - (1 - f) * s)\n\n switch (i) {\n case 0:\n r = v\n g = t\n b = p\n break\n case 1:\n r = q\n g = v\n b = p\n break\n case 2:\n r = p\n g = v\n b = t\n break\n case 3:\n r = p\n g = q\n b = v\n break\n case 4:\n r = t\n g = p\n b = v\n break\n case 5:\n r = v\n g = p\n b = q\n break\n }\n\n return RGBA.fromValues(r, g, b, 1)\n}\n\nconst CSS_COLOR_NAMES: Record<string, string> = {\n black: \"#000000\",\n white: \"#FFFFFF\",\n red: \"#FF0000\",\n green: \"#008000\",\n blue: \"#0000FF\",\n yellow: \"#FFFF00\",\n cyan: \"#00FFFF\",\n magenta: \"#FF00FF\",\n silver: \"#C0C0C0\",\n gray: \"#808080\",\n grey: \"#808080\",\n maroon: \"#800000\",\n olive: \"#808000\",\n lime: \"#00FF00\",\n aqua: \"#00FFFF\",\n teal: \"#008080\",\n navy: \"#000080\",\n fuchsia: \"#FF00FF\",\n purple: \"#800080\",\n orange: \"#FFA500\",\n brightblack: \"#666666\",\n brightred: \"#FF6666\",\n brightgreen: \"#66FF66\",\n brightblue: \"#6666FF\",\n brightyellow: \"#FFFF66\",\n brightcyan: \"#66FFFF\",\n brightmagenta: \"#FF66FF\",\n brightwhite: \"#FFFFFF\",\n}\n\nexport function parseColor(color: ColorInput): RGBA {\n if (typeof color === \"string\") {\n const lowerColor = color.toLowerCase()\n\n if (lowerColor === \"transparent\") {\n return RGBA.fromValues(0, 0, 0, 0)\n }\n\n if (CSS_COLOR_NAMES[lowerColor]) {\n return hexToRgb(CSS_COLOR_NAMES[lowerColor])\n }\n\n return hexToRgb(color)\n }\n return color\n}\n",
|
|
12
|
+
"import { OptimizedBuffer } from \"../buffer.js\"\nimport { parseColor, RGBA, type ColorInput } from \"./RGBA.js\"\nimport block from \"./fonts/block.json\" with { type: \"json\" }\nimport shade from \"./fonts/shade.json\" with { type: \"json\" }\nimport slick from \"./fonts/slick.json\" with { type: \"json\" }\nimport tiny from \"./fonts/tiny.json\" with { type: \"json\" }\nimport huge from \"./fonts/huge.json\" with { type: \"json\" }\nimport grid from \"./fonts/grid.json\" with { type: \"json\" }\nimport pallet from \"./fonts/pallet.json\" with { type: \"json\" }\n\n/*\n * Renders ASCII fonts to a buffer.\n * Font definitions plugged from cfonts - https://github.com/dominikwilkowski/cfonts\n */\n\nexport type ASCIIFontName = \"tiny\" | \"block\" | \"shade\" | \"slick\" | \"huge\" | \"grid\" | \"pallet\"\n\nexport const fonts = {\n tiny,\n block,\n shade,\n slick,\n huge,\n grid,\n pallet,\n}\n\ntype FontSegment = {\n text: string\n colorIndex: number\n}\n\ntype FontDefinition = {\n name: string\n lines: number\n letterspace_size: number\n letterspace: string[]\n colors?: number\n chars: Record<string, string[]>\n}\n\ntype ParsedFontDefinition = {\n name: string\n lines: number\n letterspace_size: number\n letterspace: string[]\n colors: number\n chars: Record<string, FontSegment[][]>\n}\n\nconst parsedFonts: Record<string, ParsedFontDefinition> = {}\n\nfunction parseColorTags(text: string): FontSegment[] {\n const segments: FontSegment[] = []\n let currentIndex = 0\n\n const colorTagRegex = /<c(\\d+)>(.*?)<\\/c\\d+>/g\n let lastIndex = 0\n let match\n\n while ((match = colorTagRegex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n const plainText = text.slice(lastIndex, match.index)\n if (plainText) {\n segments.push({ text: plainText, colorIndex: 0 })\n }\n }\n\n const colorIndex = parseInt(match[1]) - 1\n const taggedText = match[2]\n segments.push({ text: taggedText, colorIndex: Math.max(0, colorIndex) })\n\n lastIndex = match.index + match[0].length\n }\n\n if (lastIndex < text.length) {\n const remainingText = text.slice(lastIndex)\n if (remainingText) {\n segments.push({ text: remainingText, colorIndex: 0 })\n }\n }\n\n return segments\n}\n\nfunction getParsedFont(fontKey: keyof typeof fonts): ParsedFontDefinition {\n if (!parsedFonts[fontKey]) {\n const fontDef = fonts[fontKey] as FontDefinition\n const parsedChars: Record<string, FontSegment[][]> = {}\n\n for (const [char, lines] of Object.entries(fontDef.chars)) {\n parsedChars[char] = lines.map((line) => parseColorTags(line))\n }\n\n parsedFonts[fontKey] = {\n ...fontDef,\n colors: fontDef.colors || 1,\n chars: parsedChars,\n }\n }\n\n return parsedFonts[fontKey]\n}\n\nexport function measureText({ text, font = \"tiny\" }: { text: string; font?: keyof typeof fonts }): {\n width: number\n height: number\n} {\n const fontDef = getParsedFont(font)\n if (!fontDef) {\n console.warn(`Font '${font}' not found`)\n return { width: 0, height: 0 }\n }\n\n let currentX = 0\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i].toUpperCase()\n const charDef = fontDef.chars[char]\n\n if (!charDef) {\n const spaceChar = fontDef.chars[\" \"]\n if (spaceChar && spaceChar[0]) {\n let spaceWidth = 0\n for (const segment of spaceChar[0]) {\n spaceWidth += segment.text.length\n }\n currentX += spaceWidth\n } else {\n currentX += 1\n }\n continue\n }\n\n let charWidth = 0\n if (charDef[0]) {\n for (const segment of charDef[0]) {\n charWidth += segment.text.length\n }\n }\n\n currentX += charWidth\n\n if (i < text.length - 1) {\n currentX += fontDef.letterspace_size\n }\n }\n\n return {\n width: currentX,\n height: fontDef.lines,\n }\n}\n\nexport function getCharacterPositions(text: string, font: keyof typeof fonts = \"tiny\"): number[] {\n const fontDef = getParsedFont(font)\n if (!fontDef) {\n return [0]\n }\n\n const positions: number[] = [0]\n let currentX = 0\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i].toUpperCase()\n const charDef = fontDef.chars[char]\n\n let charWidth = 0\n if (!charDef) {\n const spaceChar = fontDef.chars[\" \"]\n if (spaceChar && spaceChar[0]) {\n for (const segment of spaceChar[0]) {\n charWidth += segment.text.length\n }\n } else {\n charWidth = 1\n }\n } else if (charDef[0]) {\n for (const segment of charDef[0]) {\n charWidth += segment.text.length\n }\n }\n\n currentX += charWidth\n\n if (i < text.length - 1) {\n currentX += fontDef.letterspace_size\n }\n\n positions.push(currentX)\n }\n\n return positions\n}\n\nexport function coordinateToCharacterIndex(x: number, text: string, font: keyof typeof fonts = \"tiny\"): number {\n const positions = getCharacterPositions(text, font)\n\n if (x < 0) {\n return 0\n }\n\n for (let i = 0; i < positions.length - 1; i++) {\n const currentPos = positions[i]\n const nextPos = positions[i + 1]\n\n if (x >= currentPos && x < nextPos) {\n const charMidpoint = currentPos + (nextPos - currentPos) / 2\n return x < charMidpoint ? i : i + 1\n }\n }\n\n if (positions.length > 0 && x >= positions[positions.length - 1]) {\n return text.length\n }\n\n return 0\n}\n\nexport function renderFontToFrameBuffer(\n buffer: OptimizedBuffer,\n {\n text,\n x = 0,\n y = 0,\n color = [RGBA.fromInts(255, 255, 255, 255)],\n backgroundColor = RGBA.fromInts(0, 0, 0, 255),\n font = \"tiny\",\n }: {\n text: string\n x?: number\n y?: number\n color?: ColorInput | ColorInput[]\n backgroundColor?: ColorInput\n font?: keyof typeof fonts\n },\n): { width: number; height: number } {\n const width = buffer.width\n const height = buffer.height\n\n const fontDef = getParsedFont(font)\n if (!fontDef) {\n console.warn(`Font '${font}' not found`)\n return { width: 0, height: 0 }\n }\n\n const colors = Array.isArray(color) ? color : [color]\n\n if (y < 0 || y + fontDef.lines > height) {\n return { width: 0, height: fontDef.lines }\n }\n\n let currentX = x\n const startX = x\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i].toUpperCase()\n const charDef = fontDef.chars[char]\n\n if (!charDef) {\n const spaceChar = fontDef.chars[\" \"]\n if (spaceChar && spaceChar[0]) {\n let spaceWidth = 0\n for (const segment of spaceChar[0]) {\n spaceWidth += segment.text.length\n }\n currentX += spaceWidth\n } else {\n currentX += 1\n }\n continue\n }\n\n let charWidth = 0\n if (charDef[0]) {\n for (const segment of charDef[0]) {\n charWidth += segment.text.length\n }\n }\n\n if (currentX >= width) break\n if (currentX + charWidth < 0) {\n currentX += charWidth + fontDef.letterspace_size\n continue\n }\n\n for (let lineIdx = 0; lineIdx < fontDef.lines && lineIdx < charDef.length; lineIdx++) {\n const segments = charDef[lineIdx]\n const renderY = y + lineIdx\n\n if (renderY >= 0 && renderY < height) {\n let segmentX = currentX\n\n for (const segment of segments) {\n const segmentColor = colors[segment.colorIndex] || colors[0]\n\n for (let charIdx = 0; charIdx < segment.text.length; charIdx++) {\n const renderX = segmentX + charIdx\n\n if (renderX >= 0 && renderX < width) {\n const fontChar = segment.text[charIdx]\n if (fontChar !== \" \") {\n buffer.setCellWithAlphaBlending(\n renderX,\n renderY,\n fontChar,\n parseColor(segmentColor),\n parseColor(backgroundColor),\n )\n }\n }\n }\n\n segmentX += segment.text.length\n }\n }\n }\n\n currentX += charWidth\n\n if (i < text.length - 1) {\n currentX += fontDef.letterspace_size\n }\n }\n\n return {\n width: currentX - startX,\n height: fontDef.lines,\n }\n}\n",
|
|
13
|
+
"import type { RGBA } from \"./lib/RGBA.js\"\nimport type { EventEmitter } from \"events\"\nimport type { Selection } from \"./lib/selection.js\"\nimport type { Renderable } from \"./Renderable.js\"\nimport type { InternalKeyHandler, KeyHandler } from \"./lib/KeyHandler.js\"\nimport type { EditBufferRenderable } from \"./renderables/EditBufferRenderable.js\"\n\nexport const TextAttributes = {\n NONE: 0,\n BOLD: 1 << 0, // 1\n DIM: 1 << 1, // 2\n ITALIC: 1 << 2, // 4\n UNDERLINE: 1 << 3, // 8\n BLINK: 1 << 4, // 16\n INVERSE: 1 << 5, // 32\n HIDDEN: 1 << 6, // 64\n STRIKETHROUGH: 1 << 7, // 128\n}\n\n// Constants for attribute bit packing\nexport const ATTRIBUTE_BASE_BITS = 8\nexport const ATTRIBUTE_BASE_MASK = 0xff\n\n/**\n * Extract the base 8 bits of attributes from a u32 attribute value.\n * Currently we only use the first 8 bits for standard text attributes.\n */\nexport function getBaseAttributes(attr: number): number {\n return attr & ATTRIBUTE_BASE_MASK\n}\n\nexport type ThemeMode = \"dark\" | \"light\"\n\nexport type CursorStyle = \"block\" | \"line\" | \"underline\" | \"default\"\n\nexport type MousePointerStyle = \"default\" | \"pointer\" | \"text\" | \"crosshair\" | \"move\" | \"not-allowed\"\n\nexport interface CursorStyleOptions {\n style?: CursorStyle\n blinking?: boolean\n color?: RGBA\n cursor?: MousePointerStyle\n}\n\nexport enum DebugOverlayCorner {\n topLeft = 0,\n topRight = 1,\n bottomLeft = 2,\n bottomRight = 3,\n}\n\nexport enum TargetChannel {\n FG = 1,\n BG = 2,\n Both = 3,\n}\n\nexport type WidthMethod = \"wcwidth\" | \"unicode\"\n\nexport interface RendererEvents {\n resize: (width: number, height: number) => void\n key: (data: Buffer) => void\n \"memory:snapshot\": (snapshot: { heapUsed: number; heapTotal: number; arrayBuffers: number }) => void\n selection: (selection: Selection) => void\n focused_renderable: (current: Renderable | null, previous: Renderable | null) => void\n focused_editor: (current: EditBufferRenderable | null, previous: EditBufferRenderable | null) => void\n \"debugOverlay:toggle\": (enabled: boolean) => void\n theme_mode: (mode: ThemeMode) => void\n}\n\nexport interface RenderContext extends EventEmitter {\n addToHitGrid: (x: number, y: number, width: number, height: number, id: number) => void\n pushHitGridScissorRect: (x: number, y: number, width: number, height: number) => void\n popHitGridScissorRect: () => void\n clearHitGridScissorRects: () => void\n width: number\n height: number\n /** Monotonic, bumped once per `loop()` iteration. Lets renderables dedupe per-frame work. */\n frameId: number\n requestRender: () => void\n setCursorPosition: (x: number, y: number, visible: boolean) => void\n setCursorStyle: (options: CursorStyleOptions) => void\n setCursorColor: (color: RGBA) => void\n setMousePointer: (shape: MousePointerStyle) => void\n widthMethod: WidthMethod\n capabilities: any | null\n requestLive: () => void\n dropLive: () => void\n hasSelection: boolean\n getSelection: () => Selection | null\n requestSelectionUpdate: () => void\n currentFocusedRenderable: Renderable | null\n currentFocusedEditor: EditBufferRenderable | null\n focusRenderable: (renderable: Renderable) => void\n blurRenderable: (renderable: Renderable) => void\n claimFirstLineOffset?: (renderable?: Renderable) => number\n registerLifecyclePass: (renderable: Renderable) => void\n unregisterLifecyclePass: (renderable: Renderable) => void\n getLifecyclePasses: () => Set<Renderable>\n keyInput: KeyHandler\n _internalKeyInput: InternalKeyHandler\n clearSelection: () => void\n startSelection: (renderable: Renderable, x: number, y: number) => void\n updateSelection: (\n currentRenderable: Renderable | undefined,\n x: number,\n y: number,\n options?: { finishDragging?: boolean },\n ) => void\n}\n\nexport type Timeout = ReturnType<typeof setTimeout> | undefined\n\nexport interface ViewportBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface Highlight {\n start: number\n end: number\n styleId: number\n priority?: number | null\n hlRef?: number | null\n}\n\nexport interface LineInfo {\n /** Display-column offset for each visual line start. */\n lineStartCols: number[]\n /** Display-column width for each visual line. */\n lineWidthCols: number[]\n /** Maximum display-column width across the reported lines. */\n lineWidthColsMax: number\n /** Source logical line index for each visual line. */\n lineSources: number[]\n /** Wrap index within each source logical line. */\n lineWraps: number[]\n}\n\nexport interface LineInfoProvider {\n get lineInfo(): LineInfo\n get lineCount(): number\n get virtualLineCount(): number\n get scrollY(): number\n}\n\nexport interface CapturedSpan {\n text: string\n fg: RGBA\n bg: RGBA\n attributes: number\n width: number\n}\n\nexport interface CapturedLine {\n spans: CapturedSpan[]\n}\n\nexport interface CapturedFrame {\n cols: number\n rows: number\n cursor: [number, number]\n lines: CapturedLine[]\n}\n",
|
|
14
|
+
"import { TextAttributes } from \"./types.js\"\nimport { Renderable } from \"./Renderable.js\"\n\nexport function createTextAttributes({\n bold = false,\n italic = false,\n underline = false,\n dim = false,\n blink = false,\n inverse = false,\n hidden = false,\n strikethrough = false,\n}: {\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n blink?: boolean\n inverse?: boolean\n hidden?: boolean\n strikethrough?: boolean\n} = {}): number {\n let attributes = TextAttributes.NONE\n\n if (bold) attributes |= TextAttributes.BOLD\n if (italic) attributes |= TextAttributes.ITALIC\n if (underline) attributes |= TextAttributes.UNDERLINE\n if (dim) attributes |= TextAttributes.DIM\n if (blink) attributes |= TextAttributes.BLINK\n if (inverse) attributes |= TextAttributes.INVERSE\n if (hidden) attributes |= TextAttributes.HIDDEN\n if (strikethrough) attributes |= TextAttributes.STRIKETHROUGH\n\n return attributes\n}\n\n// Link attribute helpers (bits 8-31 encode link_id)\nconst ATTRIBUTE_BASE_MASK = 0xff\nconst LINK_ID_SHIFT = 8\nconst LINK_ID_PAYLOAD_MASK = 0xffffff\n\nexport function attributesWithLink(baseAttributes: number, linkId: number): number {\n const base = baseAttributes & ATTRIBUTE_BASE_MASK\n const linkBits = (linkId & LINK_ID_PAYLOAD_MASK) << LINK_ID_SHIFT\n return base | linkBits\n}\n\nexport function getLinkId(attributes: number): number {\n return (attributes >>> LINK_ID_SHIFT) & LINK_ID_PAYLOAD_MASK\n}\n\n// For debugging purposes\nexport function visualizeRenderableTree(renderable: Renderable, maxDepth: number = 10): void {\n function buildTreeLines(\n node: Renderable,\n prefix: string = \"\",\n parentPrefix: string = \"\",\n isLastChild: boolean = true,\n depth: number = 0,\n ): string[] {\n if (depth >= maxDepth) {\n return [`${prefix}${node.id} ... (max depth reached)`]\n }\n\n const lines: string[] = []\n const children = node.getChildren()\n\n // Add current node\n lines.push(`${prefix}${node.id}`)\n\n if (children.length > 0) {\n const lastChildIndex = children.length - 1\n\n children.forEach((child, index) => {\n const childIsLast = index === lastChildIndex\n const connector = childIsLast ? \"└── \" : \"├── \"\n const childPrefix = parentPrefix + (isLastChild ? \" \" : \"│ \")\n const childLines = buildTreeLines(child, childPrefix + connector, childPrefix, childIsLast, depth + 1)\n lines.push(...childLines)\n })\n }\n\n return lines\n }\n\n const treeLines = buildTreeLines(renderable)\n console.log(\"Renderable Tree:\\n\" + treeLines.join(\"\\n\"))\n}\n",
|
|
15
|
+
"import type { TextRenderable } from \"../renderables/Text.js\"\nimport type { TextBuffer, TextChunk } from \"../text-buffer.js\"\nimport { createTextAttributes } from \"../utils.js\"\nimport { parseColor, type ColorInput } from \"./RGBA.js\"\n\nconst BrandedStyledText: unique symbol = Symbol.for(\"@opentui/core/StyledText\")\n\nexport type Color = ColorInput\n\nexport interface StyleAttrs {\n fg?: Color\n bg?: Color\n bold?: boolean\n italic?: boolean\n underline?: boolean\n strikethrough?: boolean\n dim?: boolean\n reverse?: boolean\n blink?: boolean\n}\n\nexport function isStyledText(obj: any): obj is StyledText {\n return obj && obj[BrandedStyledText]\n}\n\nexport class StyledText {\n [BrandedStyledText] = true\n\n public chunks: TextChunk[]\n\n constructor(chunks: TextChunk[]) {\n this.chunks = chunks\n }\n}\n\nexport function stringToStyledText(content: string): StyledText {\n const chunk = {\n __isChunk: true as const,\n text: content,\n }\n return new StyledText([chunk])\n}\n\nexport type StylableInput = string | number | boolean | TextChunk\n\nfunction applyStyle(input: StylableInput, style: StyleAttrs): TextChunk {\n if (typeof input === \"object\" && \"__isChunk\" in input) {\n const existingChunk = input as TextChunk\n\n const fg = style.fg ? parseColor(style.fg) : existingChunk.fg\n const bg = style.bg ? parseColor(style.bg) : existingChunk.bg\n\n const newAttrs = createTextAttributes(style)\n const mergedAttrs = existingChunk.attributes ? existingChunk.attributes | newAttrs : newAttrs\n\n return {\n __isChunk: true,\n text: existingChunk.text,\n fg,\n bg,\n attributes: mergedAttrs,\n link: existingChunk.link,\n }\n } else {\n const plainTextStr = String(input)\n const fg = style.fg ? parseColor(style.fg) : undefined\n const bg = style.bg ? parseColor(style.bg) : undefined\n const attributes = createTextAttributes(style)\n\n return {\n __isChunk: true,\n text: plainTextStr,\n fg,\n bg,\n attributes,\n }\n }\n}\n\n// Color functions\nexport const black = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"black\" })\nexport const red = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"red\" })\nexport const green = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"green\" })\nexport const yellow = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"yellow\" })\nexport const blue = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"blue\" })\nexport const magenta = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"magenta\" })\nexport const cyan = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"cyan\" })\nexport const white = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"white\" })\n\n// Bright color functions\nexport const brightBlack = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightBlack\" })\nexport const brightRed = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightRed\" })\nexport const brightGreen = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightGreen\" })\nexport const brightYellow = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightYellow\" })\nexport const brightBlue = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightBlue\" })\nexport const brightMagenta = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightMagenta\" })\nexport const brightCyan = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightCyan\" })\nexport const brightWhite = (input: StylableInput): TextChunk => applyStyle(input, { fg: \"brightWhite\" })\n\n// Background color functions\nexport const bgBlack = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"black\" })\nexport const bgRed = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"red\" })\nexport const bgGreen = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"green\" })\nexport const bgYellow = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"yellow\" })\nexport const bgBlue = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"blue\" })\nexport const bgMagenta = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"magenta\" })\nexport const bgCyan = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"cyan\" })\nexport const bgWhite = (input: StylableInput): TextChunk => applyStyle(input, { bg: \"white\" })\n\n// Style functions\nexport const bold = (input: StylableInput): TextChunk => applyStyle(input, { bold: true })\nexport const italic = (input: StylableInput): TextChunk => applyStyle(input, { italic: true })\nexport const underline = (input: StylableInput): TextChunk => applyStyle(input, { underline: true })\nexport const strikethrough = (input: StylableInput): TextChunk => applyStyle(input, { strikethrough: true })\nexport const dim = (input: StylableInput): TextChunk => applyStyle(input, { dim: true })\nexport const reverse = (input: StylableInput): TextChunk => applyStyle(input, { reverse: true })\nexport const blink = (input: StylableInput): TextChunk => applyStyle(input, { blink: true })\n\n// Custom color functions\nexport const fg =\n (color: Color) =>\n (input: StylableInput): TextChunk =>\n applyStyle(input, { fg: color })\nexport const bg =\n (color: Color) =>\n (input: StylableInput): TextChunk =>\n applyStyle(input, { bg: color })\n\nexport const link =\n (url: string) =>\n (input: StylableInput): TextChunk => {\n const chunk =\n typeof input === \"object\" && \"__isChunk\" in input\n ? (input as TextChunk)\n : {\n __isChunk: true as const,\n text: String(input),\n }\n\n return {\n ...chunk,\n link: { url },\n }\n }\n\n/**\n * Template literal handler for styled text (non-cached version).\n * Returns a StyledText object containing chunks of text with optional styles.\n */\nexport function t(strings: TemplateStringsArray, ...values: StylableInput[]): StyledText {\n const chunks: TextChunk[] = []\n\n for (let i = 0; i < strings.length; i++) {\n const raw = strings[i]\n\n if (raw) {\n chunks.push({\n __isChunk: true,\n text: raw,\n attributes: 0,\n })\n }\n\n const val = values[i]\n if (typeof val === \"object\" && \"__isChunk\" in val) {\n chunks.push(val as TextChunk)\n } else if (val !== undefined) {\n const plainTextStr = String(val)\n chunks.push({\n __isChunk: true,\n text: plainTextStr,\n attributes: 0,\n })\n }\n }\n\n return new StyledText(chunks)\n}\n",
|
|
16
|
+
"import type { TextChunk } from \"../text-buffer.js\"\nimport { StyledText } from \"./styled-text.js\"\nimport { SyntaxStyle } from \"../syntax-style.js\"\n\nexport interface HASTText {\n type: \"text\"\n value: string\n}\n\nexport interface HASTElement {\n type: \"element\"\n tagName: string\n properties?: {\n className?: string\n }\n children: HASTNode[]\n}\n\nexport type HASTNode = HASTText | HASTElement\n\nexport type { StyleDefinition } from \"../syntax-style.js\"\n\nfunction hastToTextChunks(node: HASTNode, syntaxStyle: SyntaxStyle, parentStyles: string[] = []): TextChunk[] {\n const chunks: TextChunk[] = []\n\n if (node.type === \"text\") {\n const stylesToMerge = parentStyles.length > 0 ? parentStyles : [\"default\"]\n const mergedStyle = syntaxStyle.mergeStyles(...stylesToMerge)\n\n chunks.push({\n __isChunk: true,\n text: node.value,\n fg: mergedStyle.fg,\n bg: mergedStyle.bg,\n attributes: mergedStyle.attributes,\n })\n } else if (node.type === \"element\") {\n let currentStyles = [...parentStyles]\n\n if (node.properties?.className) {\n const classes = node.properties.className.split(\" \")\n\n for (const cls of classes) {\n currentStyles.push(cls)\n }\n }\n\n for (const child of node.children) {\n chunks.push(...hastToTextChunks(child, syntaxStyle, currentStyles))\n }\n }\n\n return chunks\n}\n\nexport function hastToStyledText(hast: HASTNode, syntaxStyle: SyntaxStyle): StyledText {\n const chunks = hastToTextChunks(hast, syntaxStyle)\n return new StyledText(chunks)\n}\n",
|
|
17
|
+
"export type TimerHandle = ReturnType<typeof globalThis.setTimeout> | number\n\nexport interface Clock {\n now(): number\n setTimeout(fn: () => void, delayMs: number): TimerHandle\n clearTimeout(handle: TimerHandle): void\n setInterval(fn: () => void, delayMs: number): TimerHandle\n clearInterval(handle: TimerHandle): void\n}\n\nexport class SystemClock implements Clock {\n public now(): number {\n if (!globalThis.performance || typeof globalThis.performance.now !== \"function\") {\n throw new Error(\"SystemClock requires globalThis.performance.now()\")\n }\n\n return globalThis.performance.now()\n }\n\n public setTimeout(fn: () => void, delayMs: number): TimerHandle {\n return globalThis.setTimeout(fn, delayMs)\n }\n\n public clearTimeout(handle: TimerHandle): void {\n globalThis.clearTimeout(handle as ReturnType<typeof globalThis.setTimeout>)\n }\n\n public setInterval(fn: () => void, delayMs: number): TimerHandle {\n return globalThis.setInterval(fn, delayMs)\n }\n\n public clearInterval(handle: TimerHandle): void {\n globalThis.clearInterval(handle as ReturnType<typeof globalThis.setTimeout>)\n }\n}\n",
|
|
18
|
+
"// Copied from https://github.com/enquirer/enquirer/blob/36785f3399a41cd61e9d28d1eb9c2fcd73d69b4c/lib/keypress.js\nimport { Buffer } from \"node:buffer\"\nimport { kittyNamedSingleStrokeKeys, parseKittyKeyboard } from \"./parse.keypress-kitty.js\"\n\nconst metaKeyCodeRe = /^(?:\\x1b)([a-zA-Z0-9])$/\n\nconst fnKeyRe = /^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/\n\nconst keyName: Record<string, string> = {\n /* xterm/gnome ESC O letter */\n OP: \"f1\",\n OQ: \"f2\",\n OR: \"f3\",\n OS: \"f4\",\n /* xterm/rxvt ESC [ number ~ */\n \"[11~\": \"f1\",\n \"[12~\": \"f2\",\n \"[13~\": \"f3\",\n \"[14~\": \"f4\",\n /* from Cygwin and used in libuv */\n \"[[A\": \"f1\",\n \"[[B\": \"f2\",\n \"[[C\": \"f3\",\n \"[[D\": \"f4\",\n \"[[E\": \"f5\",\n /* common */\n \"[15~\": \"f5\",\n \"[17~\": \"f6\",\n \"[18~\": \"f7\",\n \"[19~\": \"f8\",\n \"[20~\": \"f9\",\n \"[21~\": \"f10\",\n \"[23~\": \"f11\",\n \"[24~\": \"f12\",\n \"[29~\": \"menu\",\n \"[57427~\": \"clear\",\n /* xterm ESC [ letter */\n \"[A\": \"up\",\n \"[B\": \"down\",\n \"[C\": \"right\",\n \"[D\": \"left\",\n \"[E\": \"clear\",\n \"[F\": \"end\",\n \"[H\": \"home\",\n \"[P\": \"f1\",\n \"[Q\": \"f2\",\n \"[S\": \"f4\",\n /* xterm/gnome ESC O letter */\n OA: \"up\",\n OB: \"down\",\n OC: \"right\",\n OD: \"left\",\n OE: \"clear\",\n OF: \"end\",\n OH: \"home\",\n /* xterm/rxvt ESC [ number ~ */\n \"[1~\": \"home\",\n \"[2~\": \"insert\",\n \"[3~\": \"delete\",\n \"[4~\": \"end\",\n \"[5~\": \"pageup\",\n \"[6~\": \"pagedown\",\n /* putty */\n \"[[5~\": \"pageup\",\n \"[[6~\": \"pagedown\",\n /* rxvt */\n \"[7~\": \"home\",\n \"[8~\": \"end\",\n /* rxvt keys with modifiers */\n \"[a\": \"up\",\n \"[b\": \"down\",\n \"[c\": \"right\",\n \"[d\": \"left\",\n \"[e\": \"clear\",\n /* option + arrow keys (old style) */\n f: \"right\",\n b: \"left\",\n p: \"up\",\n n: \"down\",\n\n \"[2$\": \"insert\",\n \"[3$\": \"delete\",\n \"[5$\": \"pageup\",\n \"[6$\": \"pagedown\",\n \"[7$\": \"home\",\n \"[8$\": \"end\",\n\n Oa: \"up\",\n Ob: \"down\",\n Oc: \"right\",\n Od: \"left\",\n Oe: \"clear\",\n\n \"[2^\": \"insert\",\n \"[3^\": \"delete\",\n \"[5^\": \"pageup\",\n \"[6^\": \"pagedown\",\n \"[7^\": \"home\",\n \"[8^\": \"end\",\n /* misc. */\n \"[Z\": \"tab\",\n}\n\nexport const nonAlphanumericKeys = [...Object.values(keyName), \"backspace\"]\n\nexport const terminalNamedSingleStrokeKeys = [\n ...new Set([\"return\", \"linefeed\", \"tab\", \"escape\", \"space\", ...nonAlphanumericKeys, ...kittyNamedSingleStrokeKeys]),\n]\n\nconst isShiftKey = (code: string) => {\n return [\"[a\", \"[b\", \"[c\", \"[d\", \"[e\", \"[2$\", \"[3$\", \"[5$\", \"[6$\", \"[7$\", \"[8$\", \"[Z\"].includes(code)\n}\n\nconst isCtrlKey = (code: string) => {\n return [\"Oa\", \"Ob\", \"Oc\", \"Od\", \"Oe\", \"[2^\", \"[3^\", \"[5^\", \"[6^\", \"[7^\", \"[8^\"].includes(code)\n}\n\n// Map raw control bytes to the key names that bindings expect. Terminals send\n// Ctrl+A..Ctrl+Z as 0x01..0x1a, and they send Ctrl+\\\\..Ctrl+_ as 0x1c..0x1f.\n// The ESC-prefixed meta+ctrl path reuses this mapping, so the raw and meta\n// forms stay aligned.\nconst getCtrlKeyName = (charCode: number): string | undefined => {\n if (charCode === 0) {\n return \"space\"\n }\n\n if (charCode >= 1 && charCode <= 26) {\n return String.fromCharCode(charCode + \"a\".charCodeAt(0) - 1)\n }\n\n if (charCode >= 28 && charCode <= 31) {\n return String.fromCharCode(charCode + 64)\n }\n\n return undefined\n}\n\nexport type KeyEventType = \"press\" | \"repeat\" | \"release\"\n\nexport interface ParsedKey {\n name: string\n ctrl: boolean\n meta: boolean\n shift: boolean\n option: boolean\n sequence: string\n number: boolean\n raw: string\n eventType: KeyEventType\n source: \"raw\" | \"kitty\"\n code?: string\n super?: boolean\n hyper?: boolean\n capsLock?: boolean\n numLock?: boolean\n // Kitty's base-layout codepoint as a Unicode number. Example: 99 means \"c\".\n // This lets shortcut matching recover Ctrl+C from an event whose printed name\n // is something else under the active layout or IME.\n baseCode?: number\n repeated?: boolean\n}\n\nexport type ParseKeypressOptions = {\n useKittyKeyboard?: boolean\n}\n\nconst modifyOtherKeysRe = /^\\x1b\\[27;(\\d+);(\\d+)~$/\n\nexport const parseKeypress = (s: Buffer | string = \"\", options: ParseKeypressOptions = {}): ParsedKey | null => {\n let parts\n\n if (Buffer.isBuffer(s)) {\n if (s[0]! > 127 && s[1] === undefined) {\n ;(s[0] as unknown as number) -= 128\n s = \"\\x1b\" + String(s)\n } else {\n s = String(s)\n }\n } else if (s !== undefined && typeof s !== \"string\") {\n s = String(s)\n } else if (!s) {\n s = \"\"\n }\n\n // Filter out mouse events (SGR and basic)\n // Complete SGR mouse: ESC[<btn;x;yM or ESC[<btn;x;ym\n if (/^\\x1b\\[<\\d+;\\d+;\\d+[Mm]$/.test(s)) {\n return null\n }\n // Complete SGR mouse continuation without leading ESC. This can occur when\n // ESC was flushed separately on timeout and the rest of the sequence arrived later.\n if (/^\\[<\\d+;\\d+;\\d+[Mm]$/.test(s)) {\n return null\n }\n // Incomplete/partial SGR mouse sequences (flushed by the zig parser when\n // a new ESC arrives before the sequence is complete). These start with\n // ESC[< followed by digits/semicolons but lack the terminal M/m.\n if (/^\\x1b\\[<[\\d;]*$/.test(s)) {\n return null\n }\n // Incomplete/partial SGR mouse continuations without ESC.\n if (/^\\[<[\\d;]*$/.test(s)) {\n return null\n }\n if (s.startsWith(\"\\x1b[M\") && s.length >= 6) {\n return null\n }\n\n // Filter out terminal response sequences (not keyboard events)\n // These are responses to terminal queries and should not be treated as key presses\n\n // Window/cell size reports: ESC[4;height;width t or ESC[8;rows;cols t\n if (/^\\x1b\\[\\d+;\\d+;\\d+t$/.test(s)) {\n return null\n }\n\n // Cursor position reports (DSR): ESC[row;col R\n if (/^\\x1b\\[\\d+;\\d+R$/.test(s)) {\n return null\n }\n\n // Device Attributes (DA) responses: ESC[?...c\n if (/^\\x1b\\[\\?[\\d;]+c$/.test(s)) {\n return null\n }\n\n // Mode reports: ESC[?...;...$y\n if (/^\\x1b\\[\\?[\\d;]+\\$y$/.test(s)) {\n return null\n }\n\n // Focus events: ESC[I (focus in), ESC[O (focus out)\n // Note: ESC[O is also used for SS3 sequences (like arrow keys), but those have a character after O\n if (s === \"\\x1b[I\" || s === \"\\x1b[O\") {\n return null\n }\n\n // OSC (Operating System Command) responses: ESC]...ESC\\ or ESC]...BEL\n if (/^\\x1b\\][\\d;].*(\\x1b\\\\|\\x07)$/.test(s)) {\n return null\n }\n\n // Bracketed paste mode markers: ESC[200~ (start), ESC[201~ (end)\n if (s === \"\\x1b[200~\" || s === \"\\x1b[201~\") {\n return null\n }\n\n const key: ParsedKey = {\n name: \"\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n number: false,\n sequence: s,\n raw: s,\n eventType: \"press\",\n source: \"raw\",\n }\n\n key.sequence = key.sequence || s || key.name\n\n const ctrlKeyName = s.length === 1 ? getCtrlKeyName(s.charCodeAt(0)) : undefined\n const metaCtrlKeyName = s.length === 2 && s[0] === \"\\x1b\" ? getCtrlKeyName(s.charCodeAt(1)) : undefined\n\n // Check for Kitty keyboard protocol if enabled\n if (options.useKittyKeyboard) {\n const kittyResult = parseKittyKeyboard(s)\n if (kittyResult) {\n return kittyResult\n }\n }\n\n // Check for modifyOtherKeys sequences (CSI u protocol variant)\n // Format: CSI 27 ; modifier ; code ~\n // This is sent by terminals (xterm, iTerm2, Ghostty, etc.) with modifyOtherKeys mode enabled\n // to encode modified versions of keys that don't normally have modifier variants\n // Examples: CSI 27;2;13~ (shift+enter), CSI 27;5;13~ (ctrl+enter), CSI 27;5;27~ (ctrl+escape)\n const modifyOtherKeysMatch = modifyOtherKeysRe.exec(s)\n if (modifyOtherKeysMatch) {\n const modifier = parseInt(modifyOtherKeysMatch[1]!, 10) - 1\n const charCode = parseInt(modifyOtherKeysMatch[2]!, 10)\n\n key.ctrl = !!(modifier & 4)\n key.meta = !!(modifier & 2) // Alt/Option sets meta\n key.shift = !!(modifier & 1)\n key.option = !!(modifier & 2)\n key.super = !!(modifier & 8)\n key.hyper = !!(modifier & 16)\n\n // Handle common keys by their ASCII codes\n if (charCode === 13) {\n key.name = \"return\"\n } else if (charCode === 27) {\n key.name = \"escape\"\n } else if (charCode === 9) {\n key.name = \"tab\"\n } else if (charCode === 32) {\n key.name = \"space\"\n } else if (charCode === 127 || charCode === 8) {\n key.name = \"backspace\"\n } else {\n // For other character codes, use the character itself\n const char = String.fromCharCode(charCode)\n key.name = char\n key.sequence = char\n if (charCode >= 48 && charCode <= 57) {\n key.number = true\n }\n }\n\n return key\n }\n\n if (s === \"\\r\" || s === \"\\x1b\\r\") {\n // carriage return\n key.name = \"return\"\n key.meta = s.length === 2\n } else if (s === \"\\n\" || s === \"\\x1b\\n\") {\n // linefeed\n key.name = \"linefeed\"\n key.meta = s.length === 2\n } else if (s === \"\\t\") {\n // tab\n key.name = \"tab\"\n } else if (s === \"\\b\" || s === \"\\x1b\\b\" || s === \"\\x7f\" || s === \"\\x1b\\x7f\") {\n // backspace or ctrl+h\n // On OSX, \\x7f is also backspace\n key.name = \"backspace\"\n key.meta = s.charAt(0) === \"\\x1b\"\n } else if (s === \"\\x1b\" || s === \"\\x1b\\x1b\") {\n // escape key\n key.name = \"escape\"\n key.meta = s.length === 2\n } else if (s === \" \" || s === \"\\x1b \") {\n key.name = \"space\"\n key.meta = s.length === 2\n } else if (ctrlKeyName) {\n // ctrl+space, ctrl+letter, ctrl+\\\\, ctrl+], ctrl+^, ctrl+_\n key.name = ctrlKeyName\n key.ctrl = true\n } else if (s.length === 1 && s >= \"0\" && s <= \"9\") {\n // number - keep the actual number character for vim commands\n key.name = s\n key.number = true\n } else if (s.length === 1 && s >= \"a\" && s <= \"z\") {\n // lowercase letter\n key.name = s\n } else if (s.length === 1 && s >= \"A\" && s <= \"Z\") {\n // shift+letter\n key.name = s.toLowerCase()\n key.shift = true\n } else if (s.length === 1 || (s.length === 2 && s.codePointAt(0)! > 0xffff)) {\n // Single character (including emoji/surrogate pairs above BMP)\n key.name = s\n } else if ((parts = metaKeyCodeRe.exec(s))) {\n // meta+character key\n key.meta = true\n const char = parts[1]!\n const isUpperCase = /^[A-Z]$/.test(char)\n\n // Check if uppercase F or B map to arrow keys (old terminal style)\n if (char === \"F\") {\n key.name = \"right\"\n } else if (char === \"B\") {\n key.name = \"left\"\n } else if (isUpperCase) {\n key.shift = true\n key.name = char\n } else {\n key.name = char\n }\n } else if (metaCtrlKeyName) {\n // ESC + control byte is the raw meta+ctrl form. Reuse the same names as\n // the plain ctrl path, so meta+ctrl+\\\\ and friends resolve consistently.\n key.meta = true\n key.ctrl = true\n key.name = metaCtrlKeyName\n } else if ((parts = fnKeyRe.exec(s))) {\n const segs = [...s]\n\n if (segs[0] === \"\\u001b\" && segs[1] === \"\\u001b\") {\n key.option = true\n key.meta = true\n }\n\n // ansi escape sequence\n // reassemble the key code leaving out leading \\x1b's,\n // the modifier key bitflag and any meaningless \"1;\" sequence\n const code = [parts[1], parts[2], parts[4], parts[6]].filter(Boolean).join(\"\")\n\n const modifier = parseInt(parts[3] || parts[5] || \"1\", 10) - 1\n\n // Parse the key modifier\n // Terminal modifier bits: 1=Shift, 2=Alt/Option, 4=Ctrl, 8=Super, 16=Hyper\n // Note: meta flag is set for Alt/Option (bit 2)\n key.ctrl = key.ctrl || !!(modifier & 4)\n key.meta = key.meta || !!(modifier & 2)\n key.shift = key.shift || !!(modifier & 1)\n key.option = key.option || !!(modifier & 2)\n key.super = !!(modifier & 8)\n key.hyper = !!(modifier & 16)\n key.code = code\n\n const keyNameResult = keyName[code]\n if (keyNameResult) {\n key.name = keyNameResult\n key.shift = isShiftKey(code) || key.shift\n key.ctrl = isCtrlKey(code) || key.ctrl\n } else {\n // If we matched the regex but didn't find a valid key name,\n // reset the key to default state (unknown sequence)\n key.name = \"\"\n key.code = undefined\n }\n } else if (s === \"\\x1b[3~\") {\n // delete key\n key.name = \"delete\"\n key.meta = false\n key.code = \"[3~\"\n }\n\n return key\n}\n",
|
|
19
|
+
"// Kitty Keyboard Protocol parser\n// Based on https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n\nimport type { ParsedKey } from \"./parse.keypress.js\"\n\nconst kittyKeyMap: Record<number, string> = {\n // Standard keys\n 27: \"escape\",\n 9: \"tab\",\n 13: \"return\",\n 127: \"backspace\",\n\n // Arrow keys\n 57344: \"escape\",\n 57345: \"return\",\n 57346: \"tab\",\n 57347: \"backspace\",\n 57348: \"insert\",\n 57349: \"delete\",\n 57350: \"left\",\n 57351: \"right\",\n 57352: \"up\",\n 57353: \"down\",\n 57354: \"pageup\",\n 57355: \"pagedown\",\n 57356: \"home\",\n 57357: \"end\",\n 57358: \"capslock\",\n 57359: \"scrolllock\",\n 57360: \"numlock\",\n 57361: \"printscreen\",\n 57362: \"pause\",\n 57363: \"menu\",\n\n // Function keys\n 57364: \"f1\",\n 57365: \"f2\",\n 57366: \"f3\",\n 57367: \"f4\",\n 57368: \"f5\",\n 57369: \"f6\",\n 57370: \"f7\",\n 57371: \"f8\",\n 57372: \"f9\",\n 57373: \"f10\",\n 57374: \"f11\",\n 57375: \"f12\",\n 57376: \"f13\",\n 57377: \"f14\",\n 57378: \"f15\",\n 57379: \"f16\",\n 57380: \"f17\",\n 57381: \"f18\",\n 57382: \"f19\",\n 57383: \"f20\",\n 57384: \"f21\",\n 57385: \"f22\",\n 57386: \"f23\",\n 57387: \"f24\",\n 57388: \"f25\",\n 57389: \"f26\",\n 57390: \"f27\",\n 57391: \"f28\",\n 57392: \"f29\",\n 57393: \"f30\",\n 57394: \"f31\",\n 57395: \"f32\",\n 57396: \"f33\",\n 57397: \"f34\",\n 57398: \"f35\",\n\n // Keypad\n 57399: \"kp0\",\n 57400: \"kp1\",\n 57401: \"kp2\",\n 57402: \"kp3\",\n 57403: \"kp4\",\n 57404: \"kp5\",\n 57405: \"kp6\",\n 57406: \"kp7\",\n 57407: \"kp8\",\n 57408: \"kp9\",\n 57409: \"kpdecimal\",\n 57410: \"kpdivide\",\n 57411: \"kpmultiply\",\n 57412: \"kpminus\",\n 57413: \"kpplus\",\n 57414: \"kpenter\",\n 57415: \"kpequal\",\n 57416: \"kpseparator\",\n 57417: \"kpleft\",\n 57418: \"kpright\",\n 57419: \"kpup\",\n 57420: \"kpdown\",\n 57421: \"kppageup\",\n 57422: \"kppagedown\",\n 57423: \"kphome\",\n 57424: \"kpend\",\n 57425: \"kpinsert\",\n 57426: \"kpdelete\",\n 57427: \"clear\",\n\n // Media keys\n 57428: \"mediaplay\",\n 57429: \"mediapause\",\n 57430: \"mediaplaypause\",\n 57431: \"mediareverse\",\n 57432: \"mediastop\",\n 57433: \"mediafastforward\",\n 57434: \"mediarewind\",\n 57435: \"medianext\",\n 57436: \"mediaprev\",\n 57437: \"mediarecord\",\n\n // Volume keys\n 57438: \"volumedown\",\n 57439: \"volumeup\",\n 57440: \"mute\",\n\n // Modifiers\n 57441: \"leftshift\",\n 57442: \"leftctrl\",\n 57443: \"leftalt\",\n 57444: \"leftsuper\",\n 57445: \"lefthyper\",\n 57446: \"leftmeta\",\n 57447: \"rightshift\",\n 57448: \"rightctrl\",\n 57449: \"rightalt\",\n 57450: \"rightsuper\",\n 57451: \"righthyper\",\n 57452: \"rightmeta\",\n\n // Special\n 57453: \"iso_level3_shift\",\n 57454: \"iso_level5_shift\",\n}\n\nexport const kittyNamedSingleStrokeKeys = [...new Set(Object.values(kittyKeyMap))]\n\nfunction fromKittyMods(mod: number): {\n shift: boolean\n alt: boolean\n ctrl: boolean\n super: boolean\n hyper: boolean\n meta: boolean\n capsLock: boolean\n numLock: boolean\n} {\n return {\n shift: !!(mod & 1),\n alt: !!(mod & 2),\n ctrl: !!(mod & 4),\n super: !!(mod & 8),\n hyper: !!(mod & 16),\n meta: !!(mod & 32),\n capsLock: !!(mod & 64),\n numLock: !!(mod & 128),\n }\n}\n\n// Map functional key CSI codes to key names\nconst functionalKeyMap: Record<string, string> = {\n A: \"up\",\n B: \"down\",\n C: \"right\",\n D: \"left\",\n H: \"home\",\n F: \"end\",\n E: \"clear\",\n P: \"f1\",\n Q: \"f2\",\n S: \"f4\",\n}\n\n// Map tilde key numbers to key names (CSI number ~ format)\nconst tildeKeyMap: Record<string, string> = {\n \"1\": \"home\",\n \"2\": \"insert\",\n \"3\": \"delete\",\n \"4\": \"end\",\n \"5\": \"pageup\",\n \"6\": \"pagedown\",\n \"7\": \"home\", // rxvt\n \"8\": \"end\", // rxvt\n \"11\": \"f1\",\n \"12\": \"f2\",\n \"13\": \"f3\",\n \"14\": \"f4\",\n \"15\": \"f5\",\n \"17\": \"f6\",\n \"18\": \"f7\",\n \"19\": \"f8\",\n \"20\": \"f9\",\n \"21\": \"f10\",\n \"23\": \"f11\",\n \"24\": \"f12\",\n \"29\": \"menu\",\n \"57427\": \"clear\",\n}\n\n/**\n * Parse Kitty keyboard protocol special keys (functional and tilde) with event type\n * Formats:\n * Functional: CSI 1;modifiers:event_type LETTER (e.g., \\x1b[1;1:1A = up arrow press)\n * Tilde: CSI number;modifiers:event_type ~ (e.g., \\x1b[5;1:1~ = pageup press)\n */\nfunction parseKittySpecialKey(sequence: string): ParsedKey | null {\n // Combined regex: matches both functional keys (letter) and tilde keys (~)\n const specialKeyRe = /^\\x1b\\[(\\d+);(\\d+):(\\d+)([A-Z~])$/\n const match = specialKeyRe.exec(sequence)\n\n if (!match) return null\n\n const keyNumOrOne = match[1]\n const modifierStr = match[2]\n const eventTypeStr = match[3]\n const terminator = match[4]\n\n // Determine key name based on terminator\n let keyName: string | undefined\n if (terminator === \"~\") {\n // Tilde key: lookup by number\n keyName = tildeKeyMap[keyNumOrOne]\n } else {\n // Functional key: must have \"1\" as first param, lookup by letter\n if (keyNumOrOne !== \"1\") return null\n keyName = functionalKeyMap[terminator]\n }\n\n if (!keyName) return null\n\n const key: ParsedKey = {\n name: keyName,\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n number: false,\n sequence,\n raw: sequence,\n eventType: \"press\",\n source: \"kitty\",\n super: false,\n hyper: false,\n capsLock: false,\n numLock: false,\n }\n\n // Parse modifiers\n if (modifierStr) {\n const modifierMask = parseInt(modifierStr, 10)\n if (!isNaN(modifierMask) && modifierMask > 1) {\n const mods = fromKittyMods(modifierMask - 1)\n key.shift = mods.shift\n key.ctrl = mods.ctrl\n key.meta = mods.alt || mods.meta\n key.option = mods.alt\n key.super = mods.super\n key.hyper = mods.hyper\n key.capsLock = mods.capsLock\n key.numLock = mods.numLock\n }\n }\n\n // Parse event type: 1 = press, 2 = repeat, 3 = release\n if (eventTypeStr === \"1\" || !eventTypeStr) {\n key.eventType = \"press\"\n } else if (eventTypeStr === \"2\") {\n key.eventType = \"press\"\n key.repeated = true\n } else if (eventTypeStr === \"3\") {\n key.eventType = \"release\"\n }\n\n return key\n}\n\nexport function parseKittyKeyboard(sequence: string): ParsedKey | null {\n // Try special key format (functional letters or tilde keys with event type)\n const specialResult = parseKittySpecialKey(sequence)\n if (specialResult) return specialResult\n\n // Kitty keyboard protocol: CSI unicode-key-code:alternate-key-codes ; modifiers:event-type ; text-as-codepoints u\n const kittyRe = /^\\x1b\\[([^\\x1b]+)u$/\n const match = kittyRe.exec(sequence)\n\n if (!match) return null\n\n const params = match[1]\n const fields = params.split(\";\")\n\n if (fields.length < 1) return null\n\n const key: ParsedKey = {\n name: \"\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n number: false,\n sequence,\n raw: sequence,\n eventType: \"press\",\n source: \"kitty\",\n super: false,\n hyper: false,\n capsLock: false,\n numLock: false,\n }\n\n let text = \"\"\n\n // Parse field 1: unicode-key-code:shifted_codepoint:base_layout_codepoint.\n // The character this key produced, the shifted variant, and what the same\n // physical key would be on the base layout. Example: a key can produce `ㅊ`\n // but still report base-layout codepoint 99, which is Unicode `c`.\n const field1 = fields[0]?.split(\":\") || []\n const codepointStr = field1[0]\n if (!codepointStr) return null\n\n const codepoint = parseInt(codepointStr, 10)\n if (isNaN(codepoint)) return null\n\n let shiftedCodepoint: number | undefined\n let baseCodepoint: number | undefined\n\n // Parse shifted and base codepoints\n if (field1[1]) {\n const shifted = parseInt(field1[1], 10)\n if (!isNaN(shifted) && shifted > 0 && shifted <= 0x10ffff) {\n shiftedCodepoint = shifted\n }\n }\n if (field1[2]) {\n const base = parseInt(field1[2], 10)\n if (!isNaN(base) && base > 0 && base <= 0x10ffff) {\n baseCodepoint = base\n }\n }\n\n const knownKey = kittyKeyMap[codepoint]\n if (knownKey) {\n key.name = knownKey\n key.code = `[${codepoint}u`\n } else if (codepoint === 0) {\n key.name = \"\"\n } else {\n // It's a Unicode character\n if (codepoint > 0 && codepoint <= 0x10ffff) {\n const char = String.fromCodePoint(codepoint)\n key.name = char\n\n // Keep the raw Unicode codepoint from Kitty so higher-level matching can\n // later turn `99` into `c` and use that as a layout-stable fallback.\n if (baseCodepoint) {\n key.baseCode = baseCodepoint\n }\n } else {\n return null // Invalid codepoint\n }\n }\n\n // Parse field 2: modifier_mask:event_type\n if (fields[1]) {\n const field2 = fields[1].split(\":\")\n const modifierStr = field2[0]\n const eventTypeStr = field2[1]\n\n if (modifierStr) {\n const modifierMask = parseInt(modifierStr, 10)\n if (!isNaN(modifierMask) && modifierMask > 1) {\n const mods = fromKittyMods(modifierMask - 1) // Kitty modifiers start from 1\n key.shift = mods.shift\n key.ctrl = mods.ctrl\n key.meta = mods.alt || mods.meta\n key.option = mods.alt\n key.super = mods.super\n key.hyper = mods.hyper\n key.capsLock = mods.capsLock\n key.numLock = mods.numLock\n }\n }\n\n // Parse event type: 1 = press (default), 2 = repeat, 3 = release\n if (eventTypeStr === \"1\" || !eventTypeStr) {\n key.eventType = \"press\"\n } else if (eventTypeStr === \"2\") {\n key.eventType = \"press\"\n key.repeated = true\n } else if (eventTypeStr === \"3\") {\n key.eventType = \"release\"\n } else {\n key.eventType = \"press\"\n }\n }\n\n // Parse field 3: text_as_codepoint[:text_as_codepoint]\n if (fields[2]) {\n const codepoints = fields[2].split(\":\")\n for (const cpStr of codepoints) {\n const cp = parseInt(cpStr, 10)\n if (!isNaN(cp) && cp > 0 && cp <= 0x10ffff) {\n text += String.fromCodePoint(cp)\n }\n }\n }\n\n // Handle text generation for printable characters\n if (text === \"\") {\n // Check if this is a printable character (not a key name like \"up\", \"f1\", etc.)\n const isPrintable = key.name.length > 0 && !kittyKeyMap[codepoint]\n if (isPrintable) {\n // Use shifted codepoint if shift is active and we have one\n if (key.shift && shiftedCodepoint) {\n text = String.fromCodePoint(shiftedCodepoint)\n } else if (key.shift && key.name.length === 1) {\n // When shift is pressed but terminal didn't provide shifted codepoint,\n // convert the character to uppercase (works for Unicode including Cyrillic)\n text = key.name.toLocaleUpperCase()\n } else {\n text = key.name\n }\n }\n }\n\n // Special case: shift + space should produce a space\n if (key.name === \" \" && key.shift && !key.ctrl && !key.meta) {\n text = \" \"\n }\n\n if (text) {\n if (codepoint === 0) {\n key.name = text\n }\n key.sequence = text\n }\n\n if (codepoint === 0 && text === \"\") {\n return null\n }\n\n return key\n}\n",
|
|
20
|
+
"export interface ScrollAcceleration {\n tick(now?: number): number\n reset(): void\n}\n\nexport class LinearScrollAccel implements ScrollAcceleration {\n tick(_now?: number): number {\n return 1\n }\n\n reset(): void {}\n}\n\n/**\n * macOS-inspired scroll acceleration.\n *\n * The class measures the time between consecutive scroll events and keeps a short\n * moving window of the latest intervals. The average interval determines which\n * multiplier to apply so that quick bursts accelerate and slower gestures stay precise.\n *\n * For intuition, treat the streak as a continuous timeline and compare it with the\n * exponential distance curve from the pointer-acceleration research post:\n * d(t) = v₀ * ( t + A * (exp(t/τ) - 1 - t/τ) ).\n * Small t stays near the base multiplier, medium streaks settle on multiplier1, and\n * sustained bursts reach multiplier2, mirroring how the exponential curve bends up.\n *\n * Options:\n * - threshold1: upper bound (ms) of the \"medium\" band. Raise to delay the ramp.\n * - threshold2: upper bound (ms) of the \"fast\" band. Lower to demand tighter bursts.\n * - multiplier1: scale for medium speed streaks.\n * - multiplier2: scale for sustained fast streaks.\n * - baseMultiplier: scale for relaxed scrolling; set to 1 for linear behaviour.\n */\nexport class MacOSScrollAccel implements ScrollAcceleration {\n private lastTickTime = 0\n private velocityHistory: number[] = []\n private readonly historySize = 3\n private readonly streakTimeout = 150\n // Some terminals send 2 or more ticks for each mouse wheel tick, for example Ghostty, with a small delay between each tick, about 4ms on average.\n // We ignore these ticks otherwise they would cause faster acceleration to kick in\n // https://github.com/ghostty-org/ghostty/discussions/7577\n private readonly minTickInterval = 6\n\n constructor(\n private opts: {\n A?: number\n tau?: number\n maxMultiplier?: number\n } = {},\n ) {}\n\n tick(now = Date.now()): number {\n const A = this.opts.A ?? 0.8\n const tau = this.opts.tau ?? 3\n const maxMultiplier = this.opts.maxMultiplier ?? 6\n\n const dt = this.lastTickTime ? now - this.lastTickTime : Infinity\n\n // Reset streak if too much time has passed or first tick\n if (dt === Infinity || dt > this.streakTimeout) {\n this.lastTickTime = now\n this.velocityHistory = []\n return 1\n }\n\n // Ignore ticks closer than minTickInterval (they're part of the same logical tick)\n if (dt < this.minTickInterval) {\n return 1\n }\n\n this.lastTickTime = now\n\n this.velocityHistory.push(dt)\n if (this.velocityHistory.length > this.historySize) {\n this.velocityHistory.shift()\n }\n\n // Calculate average interval (lower = faster scrolling)\n const avgInterval = this.velocityHistory.reduce((a, b) => a + b, 0) / this.velocityHistory.length\n\n // Convert interval to velocity: faster ticks = higher velocity\n // Normalize to a reference interval (e.g., 100ms = velocity of 1)\n const referenceInterval = 100\n const velocity = referenceInterval / avgInterval\n\n // Apply exponential curve based on velocity\n // Higher velocity (tighter ticks) = more acceleration\n const x = velocity / tau\n const multiplier = 1 + A * (Math.exp(x) - 1)\n\n return Math.min(multiplier, maxMultiplier)\n }\n\n reset(): void {\n this.lastTickTime = 0\n this.velocityHistory = []\n }\n}\n",
|
|
21
|
+
"import {\n BoxSizing,\n Align,\n Dimension,\n Direction,\n Display,\n Edge,\n FlexDirection,\n Gutter,\n Justify,\n LogLevel,\n MeasureMode,\n Overflow,\n PositionType,\n Unit,\n Wrap,\n} from \"yoga-layout\"\n\nexport type AlignString =\n | \"auto\"\n | \"flex-start\"\n | \"center\"\n | \"flex-end\"\n | \"stretch\"\n | \"baseline\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\nexport type BoxSizingString = \"border-box\" | \"content-box\"\nexport type DimensionString = \"width\" | \"height\"\nexport type DirectionString = \"inherit\" | \"ltr\" | \"rtl\"\nexport type DisplayString = \"flex\" | \"none\" | \"contents\"\nexport type EdgeString = \"left\" | \"top\" | \"right\" | \"bottom\" | \"start\" | \"end\" | \"horizontal\" | \"vertical\" | \"all\"\nexport type FlexDirectionString = \"column\" | \"column-reverse\" | \"row\" | \"row-reverse\"\nexport type GutterString = \"column\" | \"row\" | \"all\"\nexport type JustifyString = \"flex-start\" | \"center\" | \"flex-end\" | \"space-between\" | \"space-around\" | \"space-evenly\"\nexport type LogLevelString = \"error\" | \"warn\" | \"info\" | \"debug\" | \"verbose\" | \"fatal\"\nexport type MeasureModeString = \"undefined\" | \"exactly\" | \"at-most\"\nexport type OverflowString = \"visible\" | \"hidden\" | \"scroll\"\nexport type PositionTypeString = \"static\" | \"relative\" | \"absolute\"\nexport type UnitString = \"undefined\" | \"point\" | \"percent\" | \"auto\"\nexport type WrapString = \"no-wrap\" | \"wrap\" | \"wrap-reverse\"\n\nexport function parseAlign(value: string | null | undefined): Align {\n if (value == null) {\n return Align.Auto\n }\n switch (value.toLowerCase()) {\n case \"auto\":\n return Align.Auto\n case \"flex-start\":\n return Align.FlexStart\n case \"center\":\n return Align.Center\n case \"flex-end\":\n return Align.FlexEnd\n case \"stretch\":\n return Align.Stretch\n case \"baseline\":\n return Align.Baseline\n case \"space-between\":\n return Align.SpaceBetween\n case \"space-around\":\n return Align.SpaceAround\n case \"space-evenly\":\n return Align.SpaceEvenly\n default:\n return Align.Auto\n }\n}\n\nexport function parseAlignItems(value: string | null | undefined): Align {\n if (value == null) {\n return Align.Stretch\n }\n switch (value.toLowerCase()) {\n case \"auto\":\n return Align.Auto\n case \"flex-start\":\n return Align.FlexStart\n case \"center\":\n return Align.Center\n case \"flex-end\":\n return Align.FlexEnd\n case \"stretch\":\n return Align.Stretch\n case \"baseline\":\n return Align.Baseline\n case \"space-between\":\n return Align.SpaceBetween\n case \"space-around\":\n return Align.SpaceAround\n case \"space-evenly\":\n return Align.SpaceEvenly\n default:\n return Align.Stretch\n }\n}\n\nexport function parseBoxSizing(value: string): BoxSizing {\n if (value == null) {\n return BoxSizing.BorderBox\n }\n switch (value.toLowerCase()) {\n case \"border-box\":\n return BoxSizing.BorderBox\n case \"content-box\":\n return BoxSizing.ContentBox\n default:\n return BoxSizing.BorderBox\n }\n}\n\nexport function parseDimension(value: string): Dimension {\n if (value == null) {\n return Dimension.Width\n }\n switch (value.toLowerCase()) {\n case \"width\":\n return Dimension.Width\n case \"height\":\n return Dimension.Height\n default:\n return Dimension.Width\n }\n}\n\nexport function parseDirection(value: string): Direction {\n if (value == null) {\n return Direction.LTR\n }\n switch (value.toLowerCase()) {\n case \"inherit\":\n return Direction.Inherit\n case \"ltr\":\n return Direction.LTR\n case \"rtl\":\n return Direction.RTL\n default:\n return Direction.LTR\n }\n}\n\nexport function parseDisplay(value: string): Display {\n if (value == null) {\n return Display.Flex\n }\n switch (value.toLowerCase()) {\n case \"flex\":\n return Display.Flex\n case \"none\":\n return Display.None\n case \"contents\":\n return Display.Contents\n default:\n return Display.Flex\n }\n}\n\nexport function parseEdge(value: string): Edge {\n if (value == null) {\n return Edge.All\n }\n switch (value.toLowerCase()) {\n case \"left\":\n return Edge.Left\n case \"top\":\n return Edge.Top\n case \"right\":\n return Edge.Right\n case \"bottom\":\n return Edge.Bottom\n case \"start\":\n return Edge.Start\n case \"end\":\n return Edge.End\n case \"horizontal\":\n return Edge.Horizontal\n case \"vertical\":\n return Edge.Vertical\n case \"all\":\n return Edge.All\n default:\n return Edge.All\n }\n}\n\nexport function parseFlexDirection(value: string | null | undefined): FlexDirection {\n if (value == null) {\n return FlexDirection.Column\n }\n switch (value.toLowerCase()) {\n case \"column\":\n return FlexDirection.Column\n case \"column-reverse\":\n return FlexDirection.ColumnReverse\n case \"row\":\n return FlexDirection.Row\n case \"row-reverse\":\n return FlexDirection.RowReverse\n default:\n return FlexDirection.Column\n }\n}\n\nexport function parseGutter(value: string): Gutter {\n if (value == null) {\n return Gutter.All\n }\n switch (value.toLowerCase()) {\n case \"column\":\n return Gutter.Column\n case \"row\":\n return Gutter.Row\n case \"all\":\n return Gutter.All\n default:\n return Gutter.All\n }\n}\n\nexport function parseJustify(value: string | null | undefined): Justify {\n if (value == null) {\n return Justify.FlexStart\n }\n switch (value.toLowerCase()) {\n case \"flex-start\":\n return Justify.FlexStart\n case \"center\":\n return Justify.Center\n case \"flex-end\":\n return Justify.FlexEnd\n case \"space-between\":\n return Justify.SpaceBetween\n case \"space-around\":\n return Justify.SpaceAround\n case \"space-evenly\":\n return Justify.SpaceEvenly\n default:\n return Justify.FlexStart\n }\n}\n\nexport function parseLogLevel(value: string): LogLevel {\n if (value == null) {\n return LogLevel.Info\n }\n switch (value.toLowerCase()) {\n case \"error\":\n return LogLevel.Error\n case \"warn\":\n return LogLevel.Warn\n case \"info\":\n return LogLevel.Info\n case \"debug\":\n return LogLevel.Debug\n case \"verbose\":\n return LogLevel.Verbose\n case \"fatal\":\n return LogLevel.Fatal\n default:\n return LogLevel.Info\n }\n}\n\nexport function parseMeasureMode(value: string): MeasureMode {\n if (value == null) {\n return MeasureMode.Undefined\n }\n switch (value.toLowerCase()) {\n case \"undefined\":\n return MeasureMode.Undefined\n case \"exactly\":\n return MeasureMode.Exactly\n case \"at-most\":\n return MeasureMode.AtMost\n default:\n return MeasureMode.Undefined\n }\n}\n\nexport function parseOverflow(value: string | null | undefined): Overflow {\n if (value == null) {\n return Overflow.Visible\n }\n switch (value.toLowerCase()) {\n case \"visible\":\n return Overflow.Visible\n case \"hidden\":\n return Overflow.Hidden\n case \"scroll\":\n return Overflow.Scroll\n default:\n return Overflow.Visible\n }\n}\n\nexport function parsePositionType(value: string | null | undefined): PositionType {\n if (value == null) {\n return PositionType.Relative\n }\n switch (value.toLowerCase()) {\n case \"static\":\n return PositionType.Static\n case \"relative\":\n return PositionType.Relative\n case \"absolute\":\n return PositionType.Absolute\n default:\n return PositionType.Static\n }\n}\n\nexport function parseUnit(value: string): Unit {\n if (value == null) {\n return Unit.Point\n }\n switch (value.toLowerCase()) {\n case \"undefined\":\n return Unit.Undefined\n case \"point\":\n return Unit.Point\n case \"percent\":\n return Unit.Percent\n case \"auto\":\n return Unit.Auto\n default:\n return Unit.Point\n }\n}\n\nexport function parseWrap(value: string | null | undefined): Wrap {\n if (value == null) {\n return Wrap.NoWrap\n }\n switch (value.toLowerCase()) {\n case \"no-wrap\":\n return Wrap.NoWrap\n case \"wrap\":\n return Wrap.Wrap\n case \"wrap-reverse\":\n return Wrap.WrapReverse\n default:\n return Wrap.NoWrap\n }\n}\n",
|
|
22
|
+
"export type MouseEventType = \"down\" | \"up\" | \"move\" | \"drag\" | \"drag-end\" | \"drop\" | \"over\" | \"out\" | \"scroll\"\n\nexport interface ScrollInfo {\n direction: \"up\" | \"down\" | \"left\" | \"right\"\n delta: number\n}\n\nexport type RawMouseEvent = {\n type: MouseEventType\n button: number\n x: number\n y: number\n modifiers: { shift: boolean; alt: boolean; ctrl: boolean }\n scroll?: ScrollInfo\n}\n\ntype ParsedMouseSequence = {\n event: RawMouseEvent\n consumed: number\n}\n\nexport class MouseParser {\n private mouseButtonsPressed = new Set<number>()\n\n private static readonly SCROLL_DIRECTIONS: Record<number, \"up\" | \"down\" | \"left\" | \"right\"> = {\n 0: \"up\",\n 1: \"down\",\n 2: \"left\",\n 3: \"right\",\n }\n\n public reset(): void {\n this.mouseButtonsPressed.clear()\n }\n\n // Preserve raw byte values so X10 payload bytes >= 0x80 remain intact.\n // SGR sequences are ASCII digits + separators and are unaffected either way.\n private decodeInput(data: Buffer | Uint8Array): string {\n const buf = Buffer.isBuffer(data) ? data : Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n return buf.toString(\"latin1\")\n }\n\n public parseMouseEvent(data: Buffer | Uint8Array): RawMouseEvent | null {\n const str = this.decodeInput(data)\n const parsed = this.parseMouseSequenceAt(str, 0)\n return parsed?.event ?? null\n }\n\n public parseAllMouseEvents(data: Buffer | Uint8Array): RawMouseEvent[] {\n const str = this.decodeInput(data)\n const events: RawMouseEvent[] = []\n let offset = 0\n\n while (offset < str.length) {\n const parsed = this.parseMouseSequenceAt(str, offset)\n if (!parsed) {\n // Stop at the first non-mouse sequence. Callers can decide whether to\n // route any remaining data through keyboard/terminal input handling.\n break\n }\n\n events.push(parsed.event)\n offset += parsed.consumed\n }\n\n return events\n }\n\n private parseMouseSequenceAt(str: string, offset: number): ParsedMouseSequence | null {\n if (!str.startsWith(\"\\x1b[\", offset)) return null\n const introducer = str[offset + 2]\n\n if (introducer === \"<\") {\n return this.parseSgrSequence(str, offset)\n }\n\n if (introducer === \"M\") {\n return this.parseBasicSequence(str, offset)\n }\n\n return null\n }\n\n private parseSgrSequence(str: string, offset: number): ParsedMouseSequence | null {\n let index = offset + 3\n const values = [0, 0, 0]\n let part = 0\n let hasDigit = false\n\n while (index < str.length) {\n const char = str[index]\n const charCode = str.charCodeAt(index)\n\n if (charCode >= 48 && charCode <= 57) {\n hasDigit = true\n values[part] = values[part]! * 10 + (charCode - 48)\n index++\n continue\n }\n\n switch (char) {\n case \";\": {\n if (!hasDigit || part >= 2) return null\n part++\n hasDigit = false\n index++\n break\n }\n case \"M\":\n case \"m\": {\n if (!hasDigit || part !== 2) return null\n\n return {\n event: this.decodeSgrEvent(values[0]!, values[1]!, values[2]!, char),\n consumed: index - offset + 1,\n }\n }\n default:\n return null\n }\n }\n\n return null\n }\n\n private parseBasicSequence(str: string, offset: number): ParsedMouseSequence | null {\n // ESC [ M + 3 bytes\n if (offset + 6 > str.length) return null\n\n const buttonByte = str.charCodeAt(offset + 3) - 32\n // Convert from 1-based to 0-based\n const x = str.charCodeAt(offset + 4) - 33\n const y = str.charCodeAt(offset + 5) - 33\n\n return {\n event: this.decodeBasicEvent(buttonByte, x, y),\n consumed: 6,\n }\n }\n\n private decodeSgrEvent(rawButtonCode: number, wireX: number, wireY: number, pressRelease: \"M\" | \"m\"): RawMouseEvent {\n const button = rawButtonCode & 3\n const isScroll = (rawButtonCode & 64) !== 0\n const scrollDirection = !isScroll ? undefined : MouseParser.SCROLL_DIRECTIONS[button]\n\n const isMotion = (rawButtonCode & 32) !== 0\n const modifiers = {\n shift: (rawButtonCode & 4) !== 0,\n alt: (rawButtonCode & 8) !== 0,\n ctrl: (rawButtonCode & 16) !== 0,\n }\n\n let type: MouseEventType\n let scrollInfo: ScrollInfo | undefined\n\n if (isMotion) {\n const isDragging = this.mouseButtonsPressed.size > 0\n\n if (button === 3) {\n type = \"move\"\n } else if (isDragging) {\n type = \"drag\"\n } else {\n type = \"move\"\n }\n } else if (isScroll && pressRelease === \"M\") {\n type = \"scroll\"\n scrollInfo = {\n direction: scrollDirection!,\n delta: 1,\n }\n } else {\n type = pressRelease === \"M\" ? \"down\" : \"up\"\n\n if (type === \"down\" && button !== 3) {\n this.mouseButtonsPressed.add(button)\n } else if (type === \"up\") {\n this.mouseButtonsPressed.clear()\n }\n }\n\n return {\n type,\n button: button === 3 ? 0 : button,\n x: wireX - 1,\n y: wireY - 1,\n modifiers,\n scroll: scrollInfo,\n }\n }\n\n private decodeBasicEvent(buttonByte: number, x: number, y: number): RawMouseEvent {\n const button = buttonByte & 3\n const isScroll = (buttonByte & 64) !== 0\n const isMotion = (buttonByte & 32) !== 0\n const scrollDirection = !isScroll ? undefined : MouseParser.SCROLL_DIRECTIONS[button]\n\n const modifiers = {\n shift: (buttonByte & 4) !== 0,\n alt: (buttonByte & 8) !== 0,\n ctrl: (buttonByte & 16) !== 0,\n }\n\n let type: MouseEventType\n let actualButton: number\n let scrollInfo: ScrollInfo | undefined\n\n if (isMotion) {\n type = \"move\"\n actualButton = button === 3 ? -1 : button\n } else if (isScroll) {\n type = \"scroll\"\n actualButton = 0\n scrollInfo = {\n direction: scrollDirection!,\n delta: 1,\n }\n } else {\n type = button === 3 ? \"up\" : \"down\"\n actualButton = button === 3 ? 0 : button\n }\n\n return {\n type,\n button: actualButton,\n x,\n y,\n modifiers,\n scroll: scrollInfo,\n }\n }\n}\n",
|
|
23
|
+
"import { Renderable, type ViewportBounds } from \"../index.js\"\nimport { coordinateToCharacterIndex, fonts } from \"./ascii.font.js\"\n\nclass SelectionAnchor {\n private relativeX: number\n private relativeY: number\n\n constructor(\n private renderable: Renderable,\n absoluteX: number,\n absoluteY: number,\n ) {\n this.relativeX = absoluteX - this.renderable.x\n this.relativeY = absoluteY - this.renderable.y\n }\n\n get x(): number {\n return this.renderable.x + this.relativeX\n }\n\n get y(): number {\n return this.renderable.y + this.relativeY\n }\n}\n\nexport class Selection {\n private _anchor: SelectionAnchor\n private _focus: { x: number; y: number }\n private _selectedRenderables: Renderable[] = []\n private _touchedRenderables: Renderable[] = []\n private _isActive: boolean = true\n private _isDragging: boolean = true\n private _isStart: boolean = false\n\n constructor(anchorRenderable: Renderable, anchor: { x: number; y: number }, focus: { x: number; y: number }) {\n this._anchor = new SelectionAnchor(anchorRenderable, anchor.x, anchor.y)\n this._focus = { ...focus }\n }\n\n get isStart(): boolean {\n return this._isStart\n }\n\n set isStart(value: boolean) {\n this._isStart = value\n }\n\n get anchor(): { x: number; y: number } {\n return { x: this._anchor.x, y: this._anchor.y }\n }\n\n get focus(): { x: number; y: number } {\n return { ...this._focus }\n }\n\n set focus(value: { x: number; y: number }) {\n this._focus = { ...value }\n }\n\n get isActive(): boolean {\n return this._isActive\n }\n\n set isActive(value: boolean) {\n this._isActive = value\n }\n\n get isDragging(): boolean {\n return this._isDragging\n }\n\n set isDragging(value: boolean) {\n this._isDragging = value\n }\n\n get bounds(): ViewportBounds {\n const minX = Math.min(this._anchor.x, this._focus.x)\n const maxX = Math.max(this._anchor.x, this._focus.x)\n const minY = Math.min(this._anchor.y, this._focus.y)\n const maxY = Math.max(this._anchor.y, this._focus.y)\n\n // Selection bounds are inclusive of both anchor and focus\n // A selection from (0,0) to (0,0) covers 1 cell\n // A selection from (0,0) to (5,3) covers cells from (0,0) to (5,3) inclusive\n const width = maxX - minX + 1\n const height = maxY - minY + 1\n\n return {\n x: minX,\n y: minY,\n width,\n height,\n }\n }\n\n updateSelectedRenderables(selectedRenderables: Renderable[]): void {\n this._selectedRenderables = selectedRenderables\n }\n\n get selectedRenderables(): Renderable[] {\n return this._selectedRenderables\n }\n\n updateTouchedRenderables(touchedRenderables: Renderable[]): void {\n this._touchedRenderables = touchedRenderables\n }\n\n get touchedRenderables(): Renderable[] {\n return this._touchedRenderables\n }\n\n getSelectedText(): string {\n const selectedTexts = this._selectedRenderables\n // Sort by reading order: top-to-bottom, then left-to-right\n .sort((a, b) => {\n const aY = a.y\n const bY = b.y\n if (aY !== bY) {\n return aY - bY\n }\n return a.x - b.x\n })\n .filter((renderable) => !renderable.isDestroyed)\n .map((renderable) => renderable.getSelectedText())\n .filter((text) => text)\n return selectedTexts.join(\"\\n\")\n }\n}\n\nexport interface LocalSelectionBounds {\n anchorX: number\n anchorY: number\n focusX: number\n focusY: number\n isActive: boolean\n}\n\nexport function convertGlobalToLocalSelection(\n globalSelection: Selection | null,\n localX: number,\n localY: number,\n): LocalSelectionBounds | null {\n if (!globalSelection?.isActive) {\n return null\n }\n\n return {\n anchorX: globalSelection.anchor.x - localX,\n anchorY: globalSelection.anchor.y - localY,\n focusX: globalSelection.focus.x - localX,\n focusY: globalSelection.focus.y - localY,\n isActive: true,\n }\n}\n\nexport class ASCIIFontSelectionHelper {\n private localSelection: { start: number; end: number } | null = null\n\n constructor(\n private getText: () => string,\n private getFont: () => keyof typeof fonts,\n ) {}\n\n hasSelection(): boolean {\n return this.localSelection !== null\n }\n\n getSelection(): { start: number; end: number } | null {\n return this.localSelection\n }\n\n shouldStartSelection(localX: number, localY: number, width: number, height: number): boolean {\n if (localX < 0 || localX >= width || localY < 0 || localY >= height) {\n return false\n }\n\n const text = this.getText()\n const font = this.getFont()\n const charIndex = coordinateToCharacterIndex(localX, text, font)\n\n return charIndex >= 0 && charIndex <= text.length\n }\n\n onLocalSelectionChanged(localSelection: LocalSelectionBounds | null, width: number, height: number): boolean {\n const previousSelection = this.localSelection\n\n if (!localSelection?.isActive) {\n this.localSelection = null\n return previousSelection !== null\n }\n\n const text = this.getText()\n const font = this.getFont()\n\n const selStart = { x: localSelection.anchorX, y: localSelection.anchorY }\n const selEnd = { x: localSelection.focusX, y: localSelection.focusY }\n\n if (height - 1 < selStart.y || 0 > selEnd.y) {\n this.localSelection = null\n return previousSelection !== null\n }\n\n let startCharIndex = 0\n let endCharIndex = text.length\n\n if (selStart.y > height - 1) {\n // Selection starts below us - we're not selected\n this.localSelection = null\n return previousSelection !== null\n } else if (selStart.y >= 0 && selStart.y <= height - 1) {\n // Selection starts within our Y range - use the actual start X coordinate\n if (selStart.x > 0) {\n startCharIndex = coordinateToCharacterIndex(selStart.x, text, font)\n }\n }\n\n if (selEnd.y < 0) {\n // Selection ends above us - we're not selected\n this.localSelection = null\n return previousSelection !== null\n } else if (selEnd.y >= 0 && selEnd.y <= height - 1) {\n // Selection ends within our Y range - use the actual end X coordinate\n if (selEnd.x >= 0) {\n endCharIndex = coordinateToCharacterIndex(selEnd.x, text, font)\n } else {\n endCharIndex = 0\n }\n }\n\n if (startCharIndex < endCharIndex && startCharIndex >= 0 && endCharIndex <= text.length) {\n this.localSelection = { start: startCharIndex, end: endCharIndex }\n } else {\n this.localSelection = null\n }\n\n return (\n previousSelection?.start !== this.localSelection?.start || previousSelection?.end !== this.localSelection?.end\n )\n }\n}\n",
|
|
24
|
+
"const singletonCacheSymbol = Symbol.for(\"@opentui/core/singleton\")\n\n/**\n * Ensures a value is initialized once per process,\n * persists across Bun hot reloads, and is type-safe.\n */\nexport function singleton<T>(key: string, factory: () => T): T {\n // @ts-expect-error this symbol is only used in this file and is not part of the public API\n const bag = (globalThis[singletonCacheSymbol] ??= {})\n if (!(key in bag)) {\n bag[key] = factory()\n }\n return bag[key] as T\n}\n\nexport function destroySingleton(key: string): void {\n // @ts-expect-error this symbol is only used in this file and is not part of the public API\n const bag = globalThis[singletonCacheSymbol]\n if (bag && key in bag) {\n delete bag[key]\n }\n}\n\nexport function hasSingleton(key: string): boolean {\n // @ts-expect-error this symbol is only used in this file and is not part of the public API\n const bag = globalThis[singletonCacheSymbol]\n return bag && key in bag\n}\n",
|
|
25
|
+
"import { singleton } from \"./singleton.js\"\n\n/**\n * Environment variable registry\n *\n * Usage:\n * ```ts\n * import { registerEnvVar, env } from \"./lib/env.ts\";\n *\n * // Register environment variables\n * registerEnvVar({\n * name: \"DEBUG\",\n * description: \"Enable debug logging\",\n * type: \"boolean\",\n * default: false\n * });\n *\n * registerEnvVar({\n * name: \"PORT\",\n * description: \"Server port number\",\n * type: \"number\",\n * default: 3000\n * });\n *\n * // Access environment variables\n * if (env.DEBUG) {\n * console.log(\"Debug mode enabled\");\n * }\n *\n * const port = env.PORT; // number\n * ```\n */\n\nexport interface EnvVarConfig {\n name: string\n description: string\n default?: string | boolean | number\n type?: \"string\" | \"boolean\" | \"number\"\n}\n\nexport const envRegistry: Record<string, EnvVarConfig> = singleton(\"env-registry\", () => ({}))\n\nexport function registerEnvVar(config: EnvVarConfig): void {\n const existing = envRegistry[config.name]\n if (existing) {\n if (\n existing.description !== config.description ||\n existing.type !== config.type ||\n existing.default !== config.default\n ) {\n throw new Error(\n `Environment variable \"${config.name}\" is already registered with different configuration. ` +\n `Existing: ${JSON.stringify(existing)}, New: ${JSON.stringify(config)}`,\n )\n }\n return\n }\n envRegistry[config.name] = config\n}\n\nfunction normalizeBoolean(value: string): boolean {\n const lowerValue = value.toLowerCase()\n return [\"true\", \"1\", \"on\", \"yes\"].includes(lowerValue)\n}\n\nfunction parseEnvValue(config: EnvVarConfig): string | boolean | number {\n const envValue = process.env[config.name]\n\n if (envValue === undefined && config.default !== undefined) {\n return config.default\n }\n\n if (envValue === undefined) {\n throw new Error(`Required environment variable ${config.name} is not set. ${config.description}`)\n }\n\n switch (config.type) {\n case \"boolean\":\n return typeof envValue === \"boolean\" ? envValue : normalizeBoolean(envValue)\n case \"number\":\n const numValue = Number(envValue)\n if (isNaN(numValue)) {\n throw new Error(`Environment variable ${config.name} must be a valid number, got: ${envValue}`)\n }\n return numValue\n case \"string\":\n default:\n return envValue\n }\n}\n\nclass EnvStore {\n private parsedValues: Map<string, string | boolean | number> = new Map()\n\n get(key: string): any {\n if (this.parsedValues.has(key)) {\n return this.parsedValues.get(key)!\n }\n\n if (!(key in envRegistry)) {\n throw new Error(`Environment variable ${key} is not registered.`)\n }\n\n try {\n const value = parseEnvValue(envRegistry[key])\n this.parsedValues.set(key, value)\n return value\n } catch (error) {\n throw new Error(`Failed to parse env var ${key}: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n\n has(key: string): boolean {\n return key in envRegistry\n }\n\n clearCache(): void {\n this.parsedValues.clear()\n }\n}\n\nconst envStore = singleton(\"env-store\", () => new EnvStore())\n\nexport function clearEnvCache(): void {\n envStore.clearCache()\n}\n\nexport function generateEnvMarkdown(): string {\n const configs = Object.values(envRegistry)\n\n if (configs.length === 0) {\n return \"# Environment Variables\\n\\nNo environment variables registered.\\n\"\n }\n\n let markdown = \"# Environment Variables\\n\\n\"\n\n for (const config of configs) {\n markdown += `## ${config.name}\\n\\n`\n markdown += `${config.description}\\n\\n`\n\n markdown += `**Type:** \\`${config.type || \"string\"}\\` \\n`\n\n if (config.default !== undefined) {\n const defaultValue = typeof config.default === \"string\" ? `\"${config.default}\"` : String(config.default)\n markdown += `**Default:** \\`${defaultValue}\\`\\n`\n } else {\n markdown += \"**Default:** *Required*\\n\"\n }\n\n markdown += \"\\n\"\n }\n\n return markdown\n}\n\nexport function generateEnvColored(): string {\n const configs = Object.values(envRegistry)\n\n if (configs.length === 0) {\n return \"\\x1b[1;36mEnvironment Variables\\x1b[0m\\n\\nNo environment variables registered.\\n\"\n }\n\n let output = \"\\x1b[1;36mEnvironment Variables\\x1b[0m\\n\\n\"\n\n for (const config of configs) {\n output += `\\x1b[1;33m${config.name}\\x1b[0m\\n`\n output += `${config.description}\\n`\n output += `\\x1b[32mType:\\x1b[0m \\x1b[36m${config.type || \"string\"}\\x1b[0m\\n`\n\n if (config.default !== undefined) {\n const defaultValue = typeof config.default === \"string\" ? `\"${config.default}\"` : String(config.default)\n output += `\\x1b[32mDefault:\\x1b[0m \\x1b[35m${defaultValue}\\x1b[0m\\n`\n } else {\n output += `\\x1b[32mDefault:\\x1b[0m \\x1b[31mRequired\\x1b[0m\\n`\n }\n\n output += \"\\n\"\n }\n\n return output\n}\n\nexport const env = new Proxy({} as Record<string, any>, {\n get(target, prop: string) {\n if (typeof prop !== \"string\") {\n return undefined\n }\n return envStore.get(prop)\n },\n\n has(target, prop: string) {\n return envStore.has(prop)\n },\n\n ownKeys() {\n return Object.keys(envRegistry)\n },\n\n getOwnPropertyDescriptor(target, prop: string) {\n if (envStore.has(prop)) {\n return {\n enumerable: true,\n configurable: true,\n get: () => envStore.get(prop),\n }\n }\n return undefined\n },\n})\n",
|
|
26
|
+
"// Byte-level stdin parser that turns raw terminal input into typed StdinEvents.\n//\n// This replaces a two-phase token -> decode pipeline with a single state machine\n// that produces fully typed events (key, mouse, paste, response) directly from\n// bytes. The parser owns all byte framing and protocol recognition. It does NOT\n// own event dispatch — that belongs to KeyHandler and the renderer.\n\nimport { Buffer } from \"node:buffer\"\nimport { SystemClock, type Clock, type TimerHandle } from \"./clock.js\"\nimport { parseKeypress, type ParsedKey } from \"./parse.keypress.js\"\nimport { MouseParser, type RawMouseEvent } from \"./parse.mouse.js\"\nimport type { PasteMetadata } from \"./paste.js\"\n\nexport { SystemClock, type Clock, type TimerHandle } from \"./clock.js\"\n\nexport type StdinResponseProtocol = \"csi\" | \"cpr\" | \"osc\" | \"dcs\" | \"apc\" | \"unknown\"\n\n// The four event types the parser produces. Everything stdin sends becomes\n// exactly one of these.\nexport type StdinEvent =\n | {\n type: \"key\"\n raw: string\n key: ParsedKey\n }\n | {\n type: \"mouse\"\n raw: string\n encoding: \"sgr\" | \"x10\"\n event: RawMouseEvent\n }\n | {\n type: \"paste\"\n bytes: Uint8Array\n metadata?: PasteMetadata\n }\n | {\n type: \"response\"\n protocol: StdinResponseProtocol\n sequence: string\n }\n\nexport interface StdinParserProtocolContext {\n kittyKeyboardEnabled: boolean\n privateCapabilityRepliesActive: boolean\n pixelResolutionQueryActive: boolean\n explicitWidthCprActive: boolean\n startupCursorCprActive: boolean\n}\n\nexport interface StdinParserOptions {\n timeoutMs?: number\n maxPendingBytes?: number\n armTimeouts?: boolean\n onTimeoutFlush?: () => void\n useKittyKeyboard?: boolean\n protocolContext?: Partial<StdinParserProtocolContext>\n clock?: Clock\n}\n\n// State machine tags for the byte scanner. Each tag represents which protocol\n// framing mode the parser is currently inside. The sawEsc flag in osc/dcs/apc\n// tracks whether the previous byte was ESC, since the two-byte ST terminator\n// (ESC \\) can split across push() calls.\ntype ParserState =\n | { tag: \"ground\" }\n | { tag: \"utf8\"; expected: number; seen: number }\n | { tag: \"esc\" }\n | { tag: \"ss3\" }\n | { tag: \"csi\" }\n | { tag: \"csi_sgr_mouse\"; part: number; hasDigit: boolean }\n | { tag: \"csi_sgr_mouse_deferred\"; part: number; hasDigit: boolean }\n | { tag: \"csi_parametric\"; semicolons: number; segments: number; hasDigit: boolean; firstParamValue: number | null }\n | {\n tag: \"csi_parametric_deferred\"\n semicolons: number\n segments: number\n hasDigit: boolean\n firstParamValue: number | null\n }\n | { tag: \"csi_private_reply\"; semicolons: number; hasDigit: boolean; sawDollar: boolean }\n | { tag: \"csi_private_reply_deferred\"; semicolons: number; hasDigit: boolean; sawDollar: boolean }\n | { tag: \"osc\"; sawEsc: boolean }\n | { tag: \"dcs\"; sawEsc: boolean }\n | { tag: \"apc\"; sawEsc: boolean }\n | { tag: \"esc_recovery\" }\n | { tag: \"esc_less_mouse\" }\n | { tag: \"esc_less_x10_mouse\" }\n\n// Collects paste body incrementally, bypassing the main ByteQueue so large\n// pastes don't grow the parser buffer. Keeps only a small tail for end-marker\n// detection across chunk boundaries.\ninterface PasteCollector {\n tail: Uint8Array\n parts: Uint8Array[]\n totalLength: number\n}\n\n// 20ms is to distinguish a lone ESC keypress from the start of an\n// escape sequence. Gemini/Claude uses 50ms, Codex uses 20ms, trying\n// this as a balanced default for now.\nconst DEFAULT_TIMEOUT_MS = 20\nconst DEFAULT_MAX_PENDING_BYTES = 64 * 1024\nconst INITIAL_PENDING_CAPACITY = 256\nconst ESC = 0x1b\nconst BEL = 0x07\nconst BRACKETED_PASTE_START = Buffer.from(\"\\x1b[200~\")\nconst BRACKETED_PASTE_END = Buffer.from(\"\\x1b[201~\")\nconst EMPTY_BYTES = new Uint8Array(0)\nconst KEY_DECODER = new TextDecoder()\nconst DEFAULT_PROTOCOL_CONTEXT: StdinParserProtocolContext = {\n kittyKeyboardEnabled: false,\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n}\n// rxvt uses $-terminated CSI sequences for shifted function keys (e.g. ESC[2$).\n// Standard CSI treats $ as an intermediate byte, not a final, so we match these\n// explicitly to avoid waiting for a \"real\" final byte that never arrives.\nconst RXVT_DOLLAR_CSI_RE = /^\\x1b\\[\\d+\\$$/\n\nconst SYSTEM_CLOCK = new SystemClock()\n\n// Byte buffer for pending input. Uses start/end offsets so consume() just\n// advances the start pointer without copying. Compacts (via copyWithin) only\n// when the consumed prefix exceeds half the buffer, keeping amortized cost low.\nclass ByteQueue {\n private buf: Uint8Array\n private start = 0\n private end = 0\n\n constructor(capacity = INITIAL_PENDING_CAPACITY) {\n this.buf = new Uint8Array(capacity)\n }\n\n get length(): number {\n return this.end - this.start\n }\n\n get capacity(): number {\n return this.buf.length\n }\n\n view(): Uint8Array {\n return this.buf.subarray(this.start, this.end)\n }\n\n // Returns a view of the contents and resets the queue. The view shares\n // the underlying buffer, so it becomes invalid on the next append().\n take(): Uint8Array {\n const chunk = this.view()\n this.start = 0\n this.end = 0\n return chunk\n }\n\n append(chunk: Uint8Array): void {\n if (chunk.length === 0) {\n return\n }\n\n this.ensureCapacity(this.length + chunk.length)\n this.buf.set(chunk, this.end)\n this.end += chunk.length\n }\n\n // Drops the first `count` bytes. Compacts when the consumed prefix\n // exceeds half the buffer to reclaim wasted space at the front.\n consume(count: number): void {\n if (count <= 0) {\n return\n }\n\n if (count >= this.length) {\n this.start = 0\n this.end = 0\n return\n }\n\n this.start += count\n if (this.start >= this.buf.length / 2) {\n this.buf.copyWithin(0, this.start, this.end)\n this.end -= this.start\n this.start = 0\n }\n }\n\n clear(): void {\n this.start = 0\n this.end = 0\n }\n\n reset(capacity = INITIAL_PENDING_CAPACITY): void {\n this.buf = new Uint8Array(capacity)\n this.start = 0\n this.end = 0\n }\n\n // Tries reclaiming space by compacting data to the front first.\n // Doubles the allocation if that still isn't enough.\n private ensureCapacity(requiredLength: number): void {\n const currentLength = this.length\n if (requiredLength <= this.buf.length) {\n const availableAtEnd = this.buf.length - this.end\n if (availableAtEnd >= requiredLength - currentLength) {\n return\n }\n\n this.buf.copyWithin(0, this.start, this.end)\n this.end = currentLength\n this.start = 0\n if (requiredLength <= this.buf.length) {\n return\n }\n }\n\n let nextCapacity = this.buf.length\n while (nextCapacity < requiredLength) {\n nextCapacity *= 2\n }\n\n const next = new Uint8Array(nextCapacity)\n next.set(this.view(), 0)\n this.buf = next\n this.start = 0\n this.end = currentLength\n }\n}\n\nfunction normalizePositiveOption(value: number | undefined, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return fallback\n }\n\n return Math.floor(value)\n}\n\n// Returns the expected byte count for a UTF-8 sequence given its lead byte,\n// or 0 for bytes that aren't valid UTF-8 leads. Returning 0 tells the parser\n// this is a legacy high-byte character (0x80–0xBF, 0xC0–0xC1, 0xF5+) that\n// goes through the parseKeypress() meta-key path instead.\nfunction utf8SequenceLength(first: number): number {\n if (first < 0x80) return 1\n if (first >= 0xc2 && first <= 0xdf) return 2\n if (first >= 0xe0 && first <= 0xef) return 3\n if (first >= 0xf0 && first <= 0xf4) return 4\n return 0\n}\n\nfunction bytesEqual(left: Uint8Array, right: Uint8Array): boolean {\n if (left.length !== right.length) {\n return false\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) {\n return false\n }\n }\n\n return true\n}\n\n// Checks whether a byte sequence is a complete SGR mouse report:\n// ESC [ < Ps ; Ps ; Ps M/m (three semicolon-separated digit groups).\nfunction isMouseSgrSequence(sequence: Uint8Array): boolean {\n if (sequence.length < 7) {\n return false\n }\n\n if (sequence[0] !== ESC || sequence[1] !== 0x5b || sequence[2] !== 0x3c) {\n return false\n }\n\n const final = sequence[sequence.length - 1]\n if (final !== 0x4d && final !== 0x6d) {\n return false\n }\n\n let part = 0\n let hasDigit = false\n for (let index = 3; index < sequence.length - 1; index += 1) {\n const byte = sequence[index]!\n if (byte >= 0x30 && byte <= 0x39) {\n hasDigit = true\n continue\n }\n\n if (byte === 0x3b && hasDigit && part < 2) {\n part += 1\n hasDigit = false\n continue\n }\n\n return false\n }\n\n return part === 2 && hasDigit\n}\n\nfunction isAsciiDigit(byte: number): boolean {\n return byte >= 0x30 && byte <= 0x39\n}\n\ninterface ParametricCsiLike {\n semicolons: number\n segments: number\n hasDigit: boolean\n firstParamValue: number | null\n}\n\ninterface PrivateReplyCsiLike {\n semicolons: number\n hasDigit: boolean\n sawDollar: boolean\n}\n\nfunction parsePositiveDecimalPrefix(sequence: Uint8Array, start: number, endExclusive: number): number | null {\n if (start >= endExclusive) return null\n\n let value = 0\n let sawDigit = false\n for (let index = start; index < endExclusive; index += 1) {\n const byte = sequence[index]!\n if (!isAsciiDigit(byte)) return null\n sawDigit = true\n value = value * 10 + (byte - 0x30)\n }\n\n return sawDigit ? value : null\n}\n\n// Returns the leading kitty codepoint from field 1, like `97` in `97:65`.\n// The CSI scanner uses this at `;` boundaries to recognize alternate-key\n// forms (`codepoint[:shifted[:base]]`). That keeps split kitty sequences\n// pending, instead of flushing them as unknown on timeout.\nfunction parseKittyFirstFieldCodepoint(sequence: Uint8Array, start: number, endExclusive: number): number | null {\n if (start >= endExclusive) return null\n\n let firstColon = -1\n for (let index = start; index < endExclusive; index += 1) {\n if (sequence[index] === 0x3a) {\n firstColon = index\n break\n }\n }\n\n if (firstColon === -1) return null\n\n const codepoint = parsePositiveDecimalPrefix(sequence, start, firstColon)\n if (codepoint === null) return null\n\n // Remaining bytes in field 1 must stay kitty-compatible: digits or colons.\n for (let index = firstColon + 1; index < endExclusive; index += 1) {\n const byte = sequence[index]!\n if (byte !== 0x3a && !isAsciiDigit(byte)) return null\n }\n\n return codepoint\n}\n\nfunction canStillBeKittyU(state: ParametricCsiLike): boolean {\n return state.semicolons >= 1\n}\n\nfunction canStillBeKittySpecial(state: ParametricCsiLike): boolean {\n return state.semicolons === 1 && state.segments > 1\n}\n\nfunction canStillBeExplicitWidthCpr(state: ParametricCsiLike): boolean {\n return state.firstParamValue === 1 && state.semicolons === 1\n}\n\nfunction canStillBeStartupCursorCpr(state: ParametricCsiLike): boolean {\n return state.semicolons === 1\n}\n\nfunction canStillBePixelResolution(state: ParametricCsiLike): boolean {\n return state.firstParamValue === 4 && state.semicolons === 2\n}\n\nfunction canDeferParametricCsi(state: ParametricCsiLike, context: StdinParserProtocolContext): boolean {\n return (\n (context.kittyKeyboardEnabled && (canStillBeKittyU(state) || canStillBeKittySpecial(state))) ||\n (context.explicitWidthCprActive && canStillBeExplicitWidthCpr(state)) ||\n (context.startupCursorCprActive && canStillBeStartupCursorCpr(state)) ||\n (context.pixelResolutionQueryActive && canStillBePixelResolution(state))\n )\n}\n\nfunction canCompleteDeferredParametricCsi(\n state: ParametricCsiLike,\n byte: number,\n context: StdinParserProtocolContext,\n): boolean {\n if (context.kittyKeyboardEnabled) {\n if (state.hasDigit && byte === 0x75) return true\n if (\n state.hasDigit &&\n state.semicolons === 1 &&\n state.segments > 1 &&\n (byte === 0x7e || (byte >= 0x41 && byte <= 0x5a))\n ) {\n return true\n }\n }\n\n if (\n context.explicitWidthCprActive &&\n state.hasDigit &&\n state.firstParamValue === 1 &&\n state.semicolons === 1 &&\n byte === 0x52\n ) {\n return true\n }\n\n if (context.startupCursorCprActive && state.hasDigit && state.semicolons === 1 && byte === 0x52) {\n return true\n }\n\n if (\n context.pixelResolutionQueryActive &&\n state.hasDigit &&\n state.firstParamValue === 4 &&\n state.semicolons === 2 &&\n byte === 0x74\n ) {\n return true\n }\n\n return false\n}\n\nfunction classifyParametricCsiProtocol(state: ParametricCsiLike, finalByte: number): StdinResponseProtocol {\n if (finalByte === 0x52 && state.semicolons === 1 && state.segments === 1 && state.hasDigit) {\n return \"cpr\"\n }\n\n return \"csi\"\n}\n\nfunction canDeferPrivateReplyCsi(context: StdinParserProtocolContext): boolean {\n return context.privateCapabilityRepliesActive\n}\n\nfunction canCompleteDeferredPrivateReplyCsi(\n state: PrivateReplyCsiLike,\n byte: number,\n context: StdinParserProtocolContext,\n): boolean {\n if (!context.privateCapabilityRepliesActive) return false\n if (state.sawDollar) return state.hasDigit && byte === 0x79\n if (byte === 0x63) return state.hasDigit || state.semicolons > 0\n if (byte === 0x6e) return state.hasDigit\n return state.hasDigit && byte === 0x75\n}\n\nfunction concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n if (left.length === 0) {\n return right\n }\n\n if (right.length === 0) {\n return left\n }\n\n const combined = new Uint8Array(left.length + right.length)\n combined.set(left, 0)\n combined.set(right, left.length)\n return combined\n}\n\nfunction indexOfBytes(haystack: Uint8Array, needle: Uint8Array): number {\n if (needle.length === 0) {\n return 0\n }\n\n const limit = haystack.length - needle.length\n for (let offset = 0; offset <= limit; offset += 1) {\n let matched = true\n for (let index = 0; index < needle.length; index += 1) {\n if (haystack[offset + index] !== needle[index]) {\n matched = false\n break\n }\n }\n\n if (matched) {\n return offset\n }\n }\n\n return -1\n}\n\n// Decodes raw protocol bytes as latin1. Used for mouse and response events\n// where the wire bytes may not be valid UTF-8 but need a lossless string\n// form for downstream sequence handlers.\nfunction decodeLatin1(bytes: Uint8Array): string {\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"latin1\")\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n return KEY_DECODER.decode(bytes)\n}\n\nfunction createPasteCollector(): PasteCollector {\n return {\n tail: EMPTY_BYTES,\n parts: [],\n totalLength: 0,\n }\n}\n\nfunction joinPasteBytes(parts: Uint8Array[], totalLength: number): Uint8Array {\n if (totalLength === 0) {\n return EMPTY_BYTES\n }\n\n if (parts.length === 1) {\n return parts[0]!\n }\n\n const bytes = new Uint8Array(totalLength)\n let offset = 0\n for (const part of parts) {\n bytes.set(part, offset)\n offset += part.length\n }\n\n return bytes\n}\n\n// Push-driven stdin parser. Callers feed raw bytes via push(), then read\n// typed events via read() or drain(). At most one incomplete protocol unit\n// is buffered at a time; everything else is immediately converted to events.\n//\n// The parser guarantees chunk-shape invariance: the same bytes always produce\n// the same events, regardless of chunk boundaries. A lone ESC resolves via\n// timeout, split UTF-8 codepoints reassemble correctly, and bracketed paste\n// markers may split across any chunk boundary.\nexport class StdinParser {\n private readonly pending = new ByteQueue(INITIAL_PENDING_CAPACITY)\n private readonly events: StdinEvent[] = []\n private readonly timeoutMs: number\n private readonly maxPendingBytes: number\n private readonly armTimeouts: boolean\n private readonly onTimeoutFlush: (() => void) | null\n private readonly useKittyKeyboard: boolean\n private readonly mouseParser = new MouseParser()\n private readonly clock: Clock\n private protocolContext: StdinParserProtocolContext\n private timeoutId: TimerHandle | null = null\n private destroyed = false\n // When the current incomplete unit first appeared. Null when nothing is pending.\n private pendingSinceMs: number | null = null\n // When true, the state machine treats the current incomplete prefix as\n // final and emits it as one atomic event (e.g. a lone ESC becomes an\n // Escape key). Set by the timeout, consumed by the next read() or drain().\n private forceFlush = false\n // True only immediately after a timeout flush emits a lone ESC key. The next\n // `[` may begin a delayed `[<...M/m` mouse continuation recovery path.\n private justFlushedEsc = false\n private state: ParserState = { tag: \"ground\" }\n // Scan position within pending.view() during scanPending().\n private cursor = 0\n // Start of the protocol unit currently being parsed. The bytes from\n // unitStart through cursor all belong to one atomic unit.\n private unitStart = 0\n // When non-null, the parser is inside a bracketed paste. All incoming\n // bytes flow through consumePasteBytes() instead of the normal state machine.\n private paste: PasteCollector | null = null\n\n constructor(options: StdinParserOptions = {}) {\n this.timeoutMs = normalizePositiveOption(options.timeoutMs, DEFAULT_TIMEOUT_MS)\n this.maxPendingBytes = normalizePositiveOption(options.maxPendingBytes, DEFAULT_MAX_PENDING_BYTES)\n this.armTimeouts = options.armTimeouts ?? true\n this.onTimeoutFlush = options.onTimeoutFlush ?? null\n this.useKittyKeyboard = options.useKittyKeyboard ?? true\n this.clock = options.clock ?? SYSTEM_CLOCK\n this.protocolContext = {\n ...DEFAULT_PROTOCOL_CONTEXT,\n kittyKeyboardEnabled: options.protocolContext?.kittyKeyboardEnabled ?? false,\n privateCapabilityRepliesActive: options.protocolContext?.privateCapabilityRepliesActive ?? false,\n pixelResolutionQueryActive: options.protocolContext?.pixelResolutionQueryActive ?? false,\n explicitWidthCprActive: options.protocolContext?.explicitWidthCprActive ?? false,\n startupCursorCprActive: options.protocolContext?.startupCursorCprActive ?? false,\n }\n }\n\n public get bufferCapacity(): number {\n return this.pending.capacity\n }\n\n public updateProtocolContext(patch: Partial<StdinParserProtocolContext>): void {\n this.ensureAlive()\n this.protocolContext = { ...this.protocolContext, ...patch }\n this.reconcileDeferredStateWithProtocolContext()\n this.reconcileTimeoutState()\n }\n\n // Feeds raw stdin bytes into the parser. Converts as much as possible into\n // queued events and leaves at most one incomplete unit behind in pending.\n //\n // When a chunk contains a paste start marker, bytes before the marker go\n // through normal parsing, then paste mode takes over for the rest. This\n // prevents large pastes from growing the main buffer.\n public push(data: Uint8Array): void {\n this.ensureAlive()\n if (data.length === 0) {\n // Preserve the existing empty-chunk -> empty-keypress behavior.\n this.emitKeyOrResponse(\"unknown\", \"\")\n return\n }\n\n let remainder = data\n while (remainder.length > 0) {\n if (this.paste) {\n remainder = this.consumePasteBytes(remainder)\n continue\n }\n\n // If we're in ground state with nothing pending, scan the incoming\n // chunk for a paste start marker. Only append through the marker so\n // scanPending() enters paste mode without buffering the full paste.\n const immediatePasteStartIndex =\n this.state.tag === \"ground\" && this.pending.length === 0 ? indexOfBytes(remainder, BRACKETED_PASTE_START) : -1\n const appendEnd =\n immediatePasteStartIndex === -1 ? remainder.length : immediatePasteStartIndex + BRACKETED_PASTE_START.length\n\n this.pending.append(remainder.subarray(0, appendEnd))\n remainder = remainder.subarray(appendEnd)\n this.scanPending()\n\n if (this.paste && this.pending.length > 0) {\n remainder = this.consumePasteBytes(this.takePendingBytes())\n continue\n }\n\n if (!this.paste && this.pending.length > this.maxPendingBytes) {\n this.flushPendingOverflow()\n this.scanPending()\n\n if (this.paste && this.pending.length > 0) {\n remainder = this.consumePasteBytes(this.takePendingBytes())\n }\n }\n }\n\n this.reconcileTimeoutState()\n }\n\n // Pops one event from the queue. If the queue is empty and a timeout has\n // set forceFlush, re-scans pending to convert the timed-out incomplete\n // unit into one final event before returning it.\n public read(): StdinEvent | null {\n this.ensureAlive()\n\n if (this.events.length === 0 && this.forceFlush) {\n this.scanPending()\n this.reconcileTimeoutState()\n }\n\n return this.events.shift() ?? null\n }\n\n // Delivers all queued events. Stops early if the parser is destroyed\n // during a callback (e.g. an event handler triggers teardown).\n public drain(onEvent: (event: StdinEvent) => void): void {\n this.ensureAlive()\n\n while (true) {\n if (this.destroyed) {\n return\n }\n\n const event = this.read()\n if (!event) {\n return\n }\n\n onEvent(event)\n }\n }\n\n // Marks the parser for forced flush if enough time has passed since\n // incomplete data arrived. Does not immediately emit events — the next\n // read() or drain() does the actual flush. This separation keeps the\n // timer callback from emitting events mid-flight in user code.\n public flushTimeout(nowMsValue: number = this.clock.now()): void {\n this.ensureAlive()\n\n if (\n this.pendingSinceMs !== null &&\n (nowMsValue < this.pendingSinceMs || nowMsValue - this.pendingSinceMs < this.timeoutMs)\n ) {\n return\n }\n\n this.tryForceFlush()\n }\n\n // Sets forceFlush when there are pending bytes outside of a paste.\n // Extracted so the setTimeout callback in reconcileTimeoutState() can\n // bypass flushTimeout()'s elapsed-time comparison. Timer scheduling and\n // clock.now() sampling can disagree by a small amount; re-checking elapsed\n // time in the callback can skip a flush and leave pending bytes stuck.\n private tryForceFlush(): void {\n if (this.paste || this.pendingSinceMs === null || this.pending.length === 0) {\n return\n }\n\n this.forceFlush = true\n }\n\n public reset(): void {\n if (this.destroyed) {\n return\n }\n\n this.clearTimeout()\n this.resetState()\n }\n\n public resetMouseState(): void {\n this.ensureAlive()\n this.mouseParser.reset()\n }\n\n public destroy(): void {\n if (this.destroyed) {\n return\n }\n\n this.clearTimeout()\n this.destroyed = true\n this.resetState()\n }\n\n private ensureAlive(): void {\n if (this.destroyed) {\n throw new Error(\"StdinParser has been destroyed\")\n }\n }\n\n // Scans the pending byte buffer one byte at a time, dispatching on the\n // current parser state. All protocol framing lives in this single switch\n // — intentionally not split into per-mode scan helpers.\n //\n // Exits when: all bytes consumed (ground), more bytes needed (incomplete\n // unit), or paste mode entered (body handled by consumePasteBytes).\n private scanPending(): void {\n while (!this.paste) {\n const bytes = this.pending.view()\n if (this.state.tag === \"ground\" && this.cursor >= bytes.length) {\n this.pending.clear()\n this.cursor = 0\n this.unitStart = 0\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n const byte = this.cursor < bytes.length ? bytes[this.cursor]! : -1\n switch (this.state.tag) {\n case \"ground\": {\n this.unitStart = this.cursor\n\n // After a timeout-flushed lone ESC, a following `[` may be the start\n // of a delayed `[<...M/m` mouse continuation. Recover only this narrow\n // case; otherwise clear the recovery flag and parse bytes normally.\n if (this.justFlushedEsc) {\n if (byte === 0x5b) {\n this.justFlushedEsc = false\n this.cursor += 1\n this.state = { tag: \"esc_recovery\" }\n continue\n }\n\n this.justFlushedEsc = false\n }\n\n if (byte === ESC) {\n this.cursor += 1\n this.state = { tag: \"esc\" }\n continue\n }\n\n if (byte < 0x80) {\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.cursor, this.cursor + 1)))\n this.consumePrefix(this.cursor + 1)\n continue\n }\n\n // Invalid UTF-8 lead byte. Could be a legacy high-byte from an\n // older terminal. If it's the last byte in the buffer, wait for\n // more data or a timeout before committing. On timeout, emit\n // through parseKeypress() which handles meta-key behavior.\n const expected = utf8SequenceLength(byte)\n if (expected === 0) {\n if (!this.forceFlush && this.cursor + 1 === bytes.length) {\n this.markPending()\n return\n }\n\n this.emitLegacyHighByte(byte)\n this.consumePrefix(this.cursor + 1)\n continue\n }\n\n this.cursor += 1\n this.state = { tag: \"utf8\", expected, seen: 1 }\n continue\n }\n\n case \"utf8\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitLegacyHighByte(bytes[this.unitStart]!)\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.unitStart + 1)\n continue\n }\n\n // Not a valid continuation byte. Treat the lead byte as a legacy\n // high-byte character and restart parsing from this position.\n if ((byte & 0xc0) !== 0x80) {\n this.emitLegacyHighByte(bytes[this.unitStart]!)\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.unitStart + 1)\n continue\n }\n\n const nextSeen = this.state.seen + 1\n this.cursor += 1\n if (nextSeen < this.state.expected) {\n this.state = { tag: \"utf8\", expected: this.state.expected, seen: nextSeen }\n continue\n }\n\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.cursor)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n case \"esc\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n const flushedLoneEsc = this.cursor === this.unitStart + 1 && bytes[this.unitStart] === ESC\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.cursor)))\n this.justFlushedEsc = flushedLoneEsc\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // The byte after ESC determines the sub-protocol:\n // [ -> CSI, O -> SS3, ] -> OSC, P -> DCS, _ -> APC.\n switch (byte) {\n case 0x5b:\n this.cursor += 1\n this.state = { tag: \"csi\" }\n continue\n case 0x4f:\n this.cursor += 1\n this.state = { tag: \"ss3\" }\n continue\n case 0x5d:\n this.cursor += 1\n this.state = { tag: \"osc\", sawEsc: false }\n continue\n case 0x50:\n this.cursor += 1\n this.state = { tag: \"dcs\", sawEsc: false }\n continue\n case 0x5f:\n this.cursor += 1\n this.state = { tag: \"apc\", sawEsc: false }\n continue\n // ESC ESC: stay in esc state. Terminals encode Alt+ESC and\n // similar sequences as ESC ESC [...], so we keep scanning.\n case ESC:\n this.cursor += 1\n continue\n default:\n this.cursor += 1\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.cursor)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n }\n\n case \"ss3\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n this.cursor += 1\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.cursor)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // Narrow recovery path for delayed mouse continuations after a\n // timeout-flushed lone ESC. Wait for either `<` (SGR) or `M` (X10); if\n // neither arrives, flush `[` as a normal key.\n case \"esc_recovery\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.cursor)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (byte === 0x3c) {\n this.cursor += 1\n this.state = { tag: \"esc_less_mouse\" }\n continue\n }\n\n if (byte === 0x4d) {\n this.cursor += 1\n this.state = { tag: \"esc_less_x10_mouse\" }\n continue\n }\n\n this.emitKeyOrResponse(\"unknown\", decodeUtf8(bytes.subarray(this.unitStart, this.unitStart + 1)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.unitStart + 1)\n continue\n }\n\n case \"csi\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // A new ESC inside an incomplete CSI means the previous sequence\n // was interrupted. Flush everything before the new ESC as one\n // opaque response, then restart parsing at the new ESC.\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // X10 mouse: ESC [ M plus 3 raw payload bytes (button, x, y).\n // cursor === unitStart + 2 confirms M comes right after ESC[,\n // not as a later final byte in a different CSI sequence.\n if (byte === 0x4d && this.cursor === this.unitStart + 2) {\n const end = this.cursor + 4\n if (bytes.length < end) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, bytes.length))\n this.state = { tag: \"ground\" }\n this.consumePrefix(bytes.length)\n continue\n }\n\n this.emitMouse(bytes.subarray(this.unitStart, end), \"x10\")\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n if (byte === 0x24) {\n const candidateEnd = this.cursor + 1\n const candidate = decodeUtf8(bytes.subarray(this.unitStart, candidateEnd))\n if (RXVT_DOLLAR_CSI_RE.test(candidate)) {\n this.emitKeyOrResponse(\"csi\", candidate)\n this.state = { tag: \"ground\" }\n this.consumePrefix(candidateEnd)\n continue\n }\n\n if (!this.forceFlush && candidateEnd >= bytes.length) {\n this.markPending()\n return\n }\n }\n\n if (byte === 0x3c && this.cursor === this.unitStart + 2) {\n this.cursor += 1\n this.state = { tag: \"csi_sgr_mouse\", part: 0, hasDigit: false }\n continue\n }\n\n // Some terminals use ESC [[A..E / ESC [[5~ / ESC [[6~ variants.\n // Treat the second `[` immediately after ESC[ as part of the CSI\n // payload instead of as a final byte so parseKeypress() can match\n // `[[A`, `[[B`, `[[5~`, etc.\n if (byte === 0x5b && this.cursor === this.unitStart + 2) {\n this.cursor += 1\n continue\n }\n\n if (byte === 0x3f && this.cursor === this.unitStart + 2) {\n this.cursor += 1\n this.state = { tag: \"csi_private_reply\", semicolons: 0, hasDigit: false, sawDollar: false }\n continue\n }\n\n if (byte === 0x3b) {\n const firstParamStart = this.unitStart + 2\n const firstParamEnd = this.cursor\n let firstParamValue = parsePositiveDecimalPrefix(bytes, firstParamStart, firstParamEnd)\n\n if (firstParamValue === null && this.protocolContext.kittyKeyboardEnabled) {\n firstParamValue = parseKittyFirstFieldCodepoint(bytes, firstParamStart, firstParamEnd)\n }\n\n if (firstParamValue !== null) {\n this.cursor += 1\n this.state = {\n tag: \"csi_parametric\",\n semicolons: 1,\n segments: 1,\n hasDigit: false,\n firstParamValue,\n }\n continue\n }\n }\n\n // Standard CSI final byte (0x40–0x7E). Check for bracketed paste\n // start, SGR mouse, or a regular CSI key/response.\n if (byte >= 0x40 && byte <= 0x7e) {\n const end = this.cursor + 1\n const rawBytes = bytes.subarray(this.unitStart, end)\n\n if (bytesEqual(rawBytes, BRACKETED_PASTE_START)) {\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n this.paste = createPasteCollector()\n continue\n }\n\n if (isMouseSgrSequence(rawBytes)) {\n this.emitMouse(rawBytes, \"sgr\")\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.emitKeyOrResponse(\"csi\", decodeUtf8(rawBytes))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.cursor += 1\n continue\n }\n\n case \"csi_sgr_mouse\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.state = { tag: \"csi_sgr_mouse_deferred\", part: this.state.part, hasDigit: this.state.hasDigit }\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte)) {\n this.cursor += 1\n this.state = { tag: \"csi_sgr_mouse\", part: this.state.part, hasDigit: true }\n continue\n }\n\n if (byte === 0x3b && this.state.hasDigit && this.state.part < 2) {\n this.cursor += 1\n this.state = { tag: \"csi_sgr_mouse\", part: this.state.part + 1, hasDigit: false }\n continue\n }\n\n if (byte >= 0x40 && byte <= 0x7e) {\n const end = this.cursor + 1\n const rawBytes = bytes.subarray(this.unitStart, end)\n if (isMouseSgrSequence(rawBytes)) {\n this.emitMouse(rawBytes, \"sgr\")\n } else {\n this.emitKeyOrResponse(\"csi\", decodeUtf8(rawBytes))\n }\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"csi\" }\n continue\n }\n\n case \"csi_sgr_mouse_deferred\": {\n if (this.cursor >= bytes.length) {\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte) || byte === 0x3b || byte === 0x4d || byte === 0x6d) {\n this.state = { tag: \"csi_sgr_mouse\", part: this.state.part, hasDigit: this.state.hasDigit }\n continue\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n case \"csi_parametric\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n if (canDeferParametricCsi(this.state, this.protocolContext)) {\n this.state = {\n tag: \"csi_parametric_deferred\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: this.state.hasDigit,\n firstParamValue: this.state.firstParamValue,\n }\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte)) {\n this.cursor += 1\n this.state = {\n tag: \"csi_parametric\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: true,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n if (byte === 0x3a && this.state.hasDigit && this.state.segments < 3) {\n this.cursor += 1\n this.state = {\n tag: \"csi_parametric\",\n semicolons: this.state.semicolons,\n segments: this.state.segments + 1,\n hasDigit: false,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n if (byte === 0x3b && this.state.semicolons < 2) {\n this.cursor += 1\n this.state = {\n tag: \"csi_parametric\",\n semicolons: this.state.semicolons + 1,\n segments: 1,\n hasDigit: false,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n if (byte >= 0x40 && byte <= 0x7e) {\n const end = this.cursor + 1\n const protocol = classifyParametricCsiProtocol(this.state, byte)\n this.emitKeyOrResponse(protocol, decodeUtf8(bytes.subarray(this.unitStart, end)))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"csi\" }\n continue\n }\n\n case \"csi_parametric_deferred\": {\n if (this.cursor >= bytes.length) {\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte) || byte === 0x3a || byte === 0x3b) {\n this.state = {\n tag: \"csi_parametric\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: this.state.hasDigit,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n if (canCompleteDeferredParametricCsi(this.state, byte, this.protocolContext)) {\n this.state = {\n tag: \"csi_parametric\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: this.state.hasDigit,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n case \"csi_private_reply\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n if (canDeferPrivateReplyCsi(this.protocolContext)) {\n this.state = {\n tag: \"csi_private_reply_deferred\",\n semicolons: this.state.semicolons,\n hasDigit: this.state.hasDigit,\n sawDollar: this.state.sawDollar,\n }\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte)) {\n this.cursor += 1\n this.state = {\n tag: \"csi_private_reply\",\n semicolons: this.state.semicolons,\n hasDigit: true,\n sawDollar: this.state.sawDollar,\n }\n continue\n }\n\n if (byte === 0x3b) {\n this.cursor += 1\n this.state = {\n tag: \"csi_private_reply\",\n semicolons: this.state.semicolons + 1,\n hasDigit: false,\n sawDollar: false,\n }\n continue\n }\n\n if (byte === 0x24 && this.state.hasDigit && !this.state.sawDollar) {\n this.cursor += 1\n this.state = {\n tag: \"csi_private_reply\",\n semicolons: this.state.semicolons,\n hasDigit: true,\n sawDollar: true,\n }\n continue\n }\n\n if (byte >= 0x40 && byte <= 0x7e) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"csi\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"csi\" }\n continue\n }\n\n case \"csi_private_reply_deferred\": {\n if (this.cursor >= bytes.length) {\n this.pendingSinceMs = null\n this.forceFlush = false\n return\n }\n\n if (byte === ESC) {\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (isAsciiDigit(byte) || byte === 0x3b || byte === 0x24) {\n this.state = {\n tag: \"csi_private_reply\",\n semicolons: this.state.semicolons,\n hasDigit: this.state.hasDigit,\n sawDollar: this.state.sawDollar,\n }\n continue\n }\n\n if (canCompleteDeferredPrivateReplyCsi(this.state, byte, this.protocolContext)) {\n this.state = {\n tag: \"csi_private_reply\",\n semicolons: this.state.semicolons,\n hasDigit: this.state.hasDigit,\n sawDollar: this.state.sawDollar,\n }\n continue\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // OSC sequences end at BEL or ESC \\. DCS and APC end at ESC \\\n // only. The sawEsc flag tracks whether the previous byte was ESC,\n // since the two-byte ESC \\ can split across push() calls.\n case \"osc\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (this.state.sawEsc) {\n if (byte === 0x5c) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"osc\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"osc\", sawEsc: false }\n continue\n }\n\n if (byte === BEL) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"osc\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n if (byte === ESC) {\n this.cursor += 1\n this.state = { tag: \"osc\", sawEsc: true }\n continue\n }\n\n this.cursor += 1\n continue\n }\n\n case \"dcs\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (this.state.sawEsc) {\n if (byte === 0x5c) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"dcs\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"dcs\", sawEsc: false }\n continue\n }\n\n if (byte === ESC) {\n this.cursor += 1\n this.state = { tag: \"dcs\", sawEsc: true }\n continue\n }\n\n this.cursor += 1\n continue\n }\n\n case \"apc\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (this.state.sawEsc) {\n if (byte === 0x5c) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"apc\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.state = { tag: \"apc\", sawEsc: false }\n continue\n }\n\n if (byte === ESC) {\n this.cursor += 1\n this.state = { tag: \"apc\", sawEsc: true }\n continue\n }\n\n this.cursor += 1\n continue\n }\n\n // Delayed SGR mouse continuation after `esc_recovery` has consumed the\n // leading `[`. Consume the rest of `<digits;digits;digitsM/m` as one\n // opaque response so split mouse bytes never leak into text.\n case \"esc_less_mouse\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if ((byte >= 0x30 && byte <= 0x39) || byte === 0x3b) {\n this.cursor += 1\n continue\n }\n\n if (byte === 0x4d || byte === 0x6d) {\n const end = this.cursor + 1\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n // Delayed X10 mouse continuation after `esc_recovery` has consumed the\n // leading `[`. Consume `[M` plus its three raw payload bytes as one\n // opaque response so split mouse bytes never leak into text.\n case \"esc_less_x10_mouse\": {\n const end = this.unitStart + 5\n\n if (bytes.length < end) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, bytes.length))\n this.state = { tag: \"ground\" }\n this.consumePrefix(bytes.length)\n continue\n }\n\n this.emitOpaqueResponse(\"unknown\", bytes.subarray(this.unitStart, end))\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n }\n }\n }\n\n // Tries to parse the raw string as a key via parseKeypress(). If it\n // recognizes the sequence (printable char, arrow, function key, etc.),\n // emits a key event. Otherwise emits a response event — this is how\n // capability responses, focus sequences, and other non-key CSI traffic\n // avoids becoming text.\n private emitKeyOrResponse(protocol: StdinResponseProtocol, raw: string): void {\n const parsed = parseKeypress(raw, { useKittyKeyboard: this.useKittyKeyboard })\n if (parsed) {\n this.events.push({\n type: \"key\",\n raw: parsed.raw,\n key: parsed,\n })\n return\n }\n\n this.events.push({\n type: \"response\",\n protocol,\n sequence: raw,\n })\n }\n\n private emitMouse(rawBytes: Uint8Array, encoding: \"sgr\" | \"x10\"): void {\n const event = this.mouseParser.parseMouseEvent(rawBytes)\n if (!event) {\n this.emitOpaqueResponse(\"unknown\", rawBytes)\n return\n }\n\n this.events.push({\n type: \"mouse\",\n raw: decodeLatin1(rawBytes),\n encoding,\n event,\n })\n }\n\n // Handles single bytes in the 0x80–0xFF range that aren't valid UTF-8\n // leads. Passes them through parseKeypress() which maps them to the\n // existing meta-key behavior (e.g. Alt+letter in terminals that send\n // high bytes instead of ESC-prefixed sequences).\n private emitLegacyHighByte(byte: number): void {\n const parsed = parseKeypress(Buffer.from([byte]), { useKittyKeyboard: this.useKittyKeyboard })\n if (parsed) {\n this.events.push({\n type: \"key\",\n raw: parsed.raw,\n key: parsed,\n })\n return\n }\n\n this.events.push({\n type: \"response\",\n protocol: \"unknown\",\n sequence: String.fromCharCode(byte),\n })\n }\n\n private emitOpaqueResponse(protocol: StdinResponseProtocol, rawBytes: Uint8Array): void {\n this.events.push({\n type: \"response\",\n protocol,\n sequence: decodeLatin1(rawBytes),\n })\n }\n\n // Advances past a completed protocol unit. Resets cursor, unitStart,\n // and timeout state so the next scan iteration starts clean.\n private consumePrefix(endExclusive: number): void {\n this.pending.consume(endExclusive)\n this.cursor = 0\n this.unitStart = 0\n this.pendingSinceMs = null\n this.forceFlush = false\n }\n\n // Removes all bytes from the pending queue and returns them. Used when\n // entering paste mode — leftover bytes after the paste start marker\n // need to flow through consumePasteBytes() instead.\n private takePendingBytes(): Uint8Array {\n const buffered = this.pending.take()\n this.cursor = 0\n this.unitStart = 0\n this.pendingSinceMs = null\n this.forceFlush = false\n return buffered\n }\n\n // Emits all pending bytes as one opaque response and clears the buffer.\n // This keeps the parser buffer bounded at maxPendingBytes without\n // dropping data or splitting it into per-character events.\n private flushPendingOverflow(): void {\n if (this.pending.length === 0) {\n return\n }\n\n this.emitOpaqueResponse(\"unknown\", this.pending.view())\n this.pending.clear()\n this.cursor = 0\n this.unitStart = 0\n this.pendingSinceMs = null\n this.forceFlush = false\n this.state = { tag: \"ground\" }\n }\n\n // Records when incomplete data first appeared so flushTimeout() can\n // decide whether enough time has elapsed to force-flush it.\n private markPending(): void {\n this.pendingSinceMs = this.clock.now()\n }\n\n // Processes bytes during an active bracketed paste. Searches for the end\n // marker (ESC[201~) using a sliding tail window so the marker can split\n // across chunk boundaries. Bytes that can't be part of the end marker are\n // appended to the paste collector without decoding.\n //\n // Returns any bytes that follow the end marker — those go back through\n // normal parsing in the push() loop.\n private consumePasteBytes(chunk: Uint8Array): Uint8Array {\n const paste = this.paste!\n const combined = concatBytes(paste.tail, chunk)\n const endIndex = indexOfBytes(combined, BRACKETED_PASTE_END)\n\n if (endIndex !== -1) {\n this.pushPasteBytes(combined.subarray(0, endIndex))\n\n this.events.push({\n type: \"paste\",\n bytes: joinPasteBytes(paste.parts, paste.totalLength),\n })\n\n this.paste = null\n return combined.subarray(endIndex + BRACKETED_PASTE_END.length)\n }\n\n // Keep enough trailing bytes to detect an end marker split across chunks.\n // Everything before that point is safe to retain immediately.\n const keep = Math.min(BRACKETED_PASTE_END.length - 1, combined.length)\n const stableLength = combined.length - keep\n if (stableLength > 0) {\n this.pushPasteBytes(combined.subarray(0, stableLength))\n }\n\n paste.tail = Uint8Array.from(combined.subarray(stableLength))\n return EMPTY_BYTES\n }\n\n private pushPasteBytes(bytes: Uint8Array): void {\n if (bytes.length === 0) {\n return\n }\n\n // Copy here because subarray() inputs may alias the caller's chunk or the\n // parser's pending buffer across pushes. The emitted paste event must keep\n // the original bytes even if those backing buffers are later reused.\n this.paste!.parts.push(Uint8Array.from(bytes))\n this.paste!.totalLength += bytes.length\n }\n\n private reconcileDeferredStateWithProtocolContext(): void {\n switch (this.state.tag) {\n case \"csi_parametric_deferred\":\n if (!canDeferParametricCsi(this.state, this.protocolContext)) {\n this.emitOpaqueResponse(\"unknown\", this.pending.view().subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n }\n return\n\n case \"csi_private_reply_deferred\":\n if (!canDeferPrivateReplyCsi(this.protocolContext)) {\n this.emitOpaqueResponse(\"unknown\", this.pending.view().subarray(this.unitStart, this.cursor))\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n }\n return\n }\n }\n\n // Arms or disarms the timeout after every push(). If there's an incomplete\n // unit in the buffer, starts a timer. When the timer fires, it sets\n // forceFlush so the next read() converts the incomplete unit into one\n // atomic event (e.g. a lone ESC becoming an Escape key).\n private reconcileTimeoutState(): void {\n if (!this.armTimeouts) {\n return\n }\n\n if (this.paste || this.pendingSinceMs === null || this.pending.length === 0) {\n this.clearTimeout()\n return\n }\n\n this.clearTimeout()\n this.timeoutId = this.clock.setTimeout(() => {\n this.timeoutId = null\n if (this.destroyed) {\n return\n }\n\n try {\n this.tryForceFlush()\n this.onTimeoutFlush?.()\n } catch (error) {\n console.error(\"stdin parser timeout flush failed\", error)\n }\n }, this.timeoutMs)\n }\n\n private clearTimeout(): void {\n if (!this.timeoutId) {\n return\n }\n\n this.clock.clearTimeout(this.timeoutId)\n this.timeoutId = null\n }\n\n // Clears all parser state: pending bytes, queued events, timeout tracking,\n // and any active paste collector. Called by both reset() (suspend/resume)\n // and destroy() to ensure no stale state survives.\n private resetState(): void {\n this.pending.reset(INITIAL_PENDING_CAPACITY)\n this.events.length = 0\n this.pendingSinceMs = null\n this.forceFlush = false\n this.justFlushedEsc = false\n this.state = { tag: \"ground\" }\n this.cursor = 0\n this.unitStart = 0\n this.paste = null\n this.mouseParser.reset()\n }\n}\n",
|
|
27
|
+
"import type { TextChunk } from \"../text-buffer.js\"\nimport { StyledText } from \"./styled-text.js\"\nimport { SyntaxStyle, type StyleDefinition } from \"../syntax-style.js\"\nimport { TreeSitterClient } from \"./tree-sitter/client.js\"\nimport type { SimpleHighlight } from \"./tree-sitter/types.js\"\nimport { createTextAttributes } from \"../utils.js\"\nimport { registerEnvVar, env } from \"./env.js\"\n\nregisterEnvVar({ name: \"OTUI_TS_STYLE_WARN\", default: false, description: \"Enable warnings for missing syntax styles\" })\n\ninterface ConcealOptions {\n enabled: boolean\n}\n\ninterface Boundary {\n offset: number\n type: \"start\" | \"end\"\n highlightIndex: number\n}\n\nfunction getSpecificity(group: string): number {\n return group.split(\".\").length\n}\n\nfunction shouldSuppressInInjection(group: string, meta: any): boolean {\n if (meta?.isInjection) {\n return false\n }\n\n // Check if this is a parent block that should be suppressed\n // TODO: This is language/highlight specific,\n // not generic enough. Needs a more generic solution.\n // The styles need to be more like a stack that gets merged\n // and for a container with injections we just don't push that container style\n return group === \"markup.raw.block\"\n}\n\nexport function treeSitterToTextChunks(\n content: string,\n highlights: SimpleHighlight[],\n syntaxStyle: SyntaxStyle,\n options?: ConcealOptions,\n): TextChunk[] {\n const chunks: TextChunk[] = []\n const defaultStyle = syntaxStyle.getStyle(\"default\")\n const concealEnabled = options?.enabled ?? true\n\n const injectionContainerRanges: Array<{ start: number; end: number }> = []\n const boundaries: Boundary[] = []\n\n for (let i = 0; i < highlights.length; i++) {\n const [start, end, , meta] = highlights[i]\n if (start === end) continue // Skip zero-length ranges\n if (meta?.containsInjection) {\n injectionContainerRanges.push({ start, end })\n }\n boundaries.push({ offset: start, type: \"start\", highlightIndex: i })\n boundaries.push({ offset: end, type: \"end\", highlightIndex: i })\n }\n\n // Sort boundaries by offset, with ends before starts at same offset\n // This ensures we close old ranges before opening new ones at the same position\n boundaries.sort((a, b) => {\n if (a.offset !== b.offset) return a.offset - b.offset\n if (a.type === \"end\" && b.type === \"start\") return -1\n if (a.type === \"start\" && b.type === \"end\") return 1\n return 0\n })\n\n const activeHighlights = new Set<number>()\n let currentOffset = 0\n\n for (let i = 0; i < boundaries.length; i++) {\n const boundary = boundaries[i]\n\n if (currentOffset < boundary.offset && activeHighlights.size > 0) {\n const segmentText = content.slice(currentOffset, boundary.offset)\n\n const activeGroups: Array<{ group: string; meta: any; index: number }> = []\n for (const idx of activeHighlights) {\n const [, , group, meta] = highlights[idx]\n activeGroups.push({ group, meta, index: idx })\n }\n\n // Check if any active highlight has a conceal property\n // Priority: 1. Check meta.conceal first 2. Check group === \"conceal\" or starts with \"conceal.\"\n const concealHighlight = concealEnabled\n ? activeGroups.find(\n (h) => h.meta?.conceal !== undefined || h.group === \"conceal\" || h.group.startsWith(\"conceal.\"),\n )\n : undefined\n\n if (concealHighlight) {\n let replacementText = \"\"\n\n if (concealHighlight.meta?.conceal !== undefined) {\n // If meta.conceal is set, use it (this would come from (#set! conceal \"...\") if supported)\n replacementText = concealHighlight.meta.conceal\n } else if (concealHighlight.group === \"conceal.with.space\") {\n // Special group name means replace with space\n replacementText = \" \"\n }\n\n if (replacementText) {\n chunks.push({\n __isChunk: true,\n text: replacementText,\n fg: defaultStyle?.fg,\n bg: defaultStyle?.bg,\n attributes: defaultStyle\n ? createTextAttributes({\n bold: defaultStyle.bold,\n italic: defaultStyle.italic,\n underline: defaultStyle.underline,\n dim: defaultStyle.dim,\n })\n : 0,\n })\n }\n } else {\n const insideInjectionContainer = injectionContainerRanges.some(\n (range) => currentOffset >= range.start && currentOffset < range.end,\n )\n\n // Filter out highlights that should be suppressed\n // Suppress highlights when we're inside an injection container\n const validGroups = activeGroups.filter((h) => {\n // If we're inside an injection container, suppress all markup.raw.block highlights\n // This includes both the container itself and any nested markup.raw.block\n if (insideInjectionContainer && shouldSuppressInInjection(h.group, h.meta)) {\n return false\n }\n return true\n })\n\n // Sort groups by specificity (least to most), then by index (earlier to later)\n // This ensures we merge styles in the correct order: parent styles first, then child overrides\n const sortedGroups = validGroups.sort((a, b) => {\n const aSpec = getSpecificity(a.group)\n const bSpec = getSpecificity(b.group)\n if (aSpec !== bSpec) return aSpec - bSpec // Lower specificity first\n return a.index - b.index // Earlier index first\n })\n\n // Merge all active styles in order (like CSS cascade)\n // Later/more specific styles override earlier/less specific ones\n const mergedStyle: StyleDefinition = {}\n\n for (const { group } of sortedGroups) {\n let styleForGroup = syntaxStyle.getStyle(group)\n\n if (!styleForGroup && group.includes(\".\")) {\n // Fallback to base scope\n const baseName = group.split(\".\")[0]\n styleForGroup = syntaxStyle.getStyle(baseName)\n }\n\n if (styleForGroup) {\n // Merge properties - later styles override earlier ones\n if (styleForGroup.fg !== undefined) mergedStyle.fg = styleForGroup.fg\n if (styleForGroup.bg !== undefined) mergedStyle.bg = styleForGroup.bg\n if (styleForGroup.bold !== undefined) mergedStyle.bold = styleForGroup.bold\n if (styleForGroup.italic !== undefined) mergedStyle.italic = styleForGroup.italic\n if (styleForGroup.underline !== undefined) mergedStyle.underline = styleForGroup.underline\n if (styleForGroup.dim !== undefined) mergedStyle.dim = styleForGroup.dim\n } else {\n if (group.includes(\".\")) {\n const baseName = group.split(\".\")[0]\n if (env.OTUI_TS_STYLE_WARN) {\n console.warn(\n `Syntax style not found for group \"${group}\" or base scope \"${baseName}\", using default style`,\n )\n }\n } else {\n if (env.OTUI_TS_STYLE_WARN) {\n console.warn(`Syntax style not found for group \"${group}\", using default style`)\n }\n }\n }\n }\n\n // Use merged style, falling back to default if nothing was merged\n const finalStyle = Object.keys(mergedStyle).length > 0 ? mergedStyle : defaultStyle\n\n chunks.push({\n __isChunk: true,\n text: segmentText,\n fg: finalStyle?.fg,\n bg: finalStyle?.bg,\n attributes: finalStyle\n ? createTextAttributes({\n bold: finalStyle.bold,\n italic: finalStyle.italic,\n underline: finalStyle.underline,\n dim: finalStyle.dim,\n })\n : 0,\n })\n }\n } else if (currentOffset < boundary.offset) {\n const text = content.slice(currentOffset, boundary.offset)\n chunks.push({\n __isChunk: true,\n text,\n fg: defaultStyle?.fg,\n bg: defaultStyle?.bg,\n attributes: defaultStyle\n ? createTextAttributes({\n bold: defaultStyle.bold,\n italic: defaultStyle.italic,\n underline: defaultStyle.underline,\n dim: defaultStyle.dim,\n })\n : 0,\n })\n }\n\n if (boundary.type === \"start\") {\n activeHighlights.add(boundary.highlightIndex)\n } else {\n activeHighlights.delete(boundary.highlightIndex)\n\n if (concealEnabled) {\n const [, , group, meta] = highlights[boundary.highlightIndex]\n if (meta?.concealLines !== undefined) {\n if (boundary.offset < content.length && content[boundary.offset] === \"\\n\") {\n currentOffset = boundary.offset + 1\n continue\n }\n }\n\n // TODO: This is also a query specific workaround, needs improvement\n if (meta?.conceal !== undefined) {\n // Skip the next space if we replaced with a space (prevents double spaces like \"text] (url)\")\n if (meta.conceal === \" \") {\n if (boundary.offset < content.length && content[boundary.offset] === \" \") {\n currentOffset = boundary.offset + 1\n continue\n }\n }\n // For heading markers specifically, also skip the trailing space\n // The group is just \"conceal\" for heading markers from the markdown query\n // We need to check if this conceal is NOT from an injection (markdown_inline)\n else if (meta.conceal === \"\" && group === \"conceal\" && !meta.isInjection) {\n if (boundary.offset < content.length && content[boundary.offset] === \" \") {\n currentOffset = boundary.offset + 1\n continue\n }\n }\n }\n }\n }\n\n currentOffset = boundary.offset\n }\n\n if (currentOffset < content.length) {\n const text = content.slice(currentOffset)\n chunks.push({\n __isChunk: true,\n text,\n fg: defaultStyle?.fg,\n bg: defaultStyle?.bg,\n attributes: defaultStyle\n ? createTextAttributes({\n bold: defaultStyle.bold,\n italic: defaultStyle.italic,\n underline: defaultStyle.underline,\n dim: defaultStyle.dim,\n })\n : 0,\n })\n }\n\n return chunks\n}\n\nexport interface TreeSitterToStyledTextOptions {\n conceal?: ConcealOptions\n}\n\nexport async function treeSitterToStyledText(\n content: string,\n filetype: string,\n syntaxStyle: SyntaxStyle,\n client: TreeSitterClient,\n options?: TreeSitterToStyledTextOptions,\n): Promise<StyledText> {\n const result = await client.highlightOnce(content, filetype)\n if (result.highlights && result.highlights.length > 0) {\n const chunks = treeSitterToTextChunks(content, result.highlights, syntaxStyle, options?.conceal)\n return new StyledText(chunks)\n } else {\n const defaultStyle = syntaxStyle.mergeStyles(\"default\")\n const chunks: TextChunk[] = [\n {\n __isChunk: true,\n text: content,\n fg: defaultStyle.fg,\n bg: defaultStyle.bg,\n attributes: defaultStyle.attributes,\n },\n ]\n return new StyledText(chunks)\n }\n}\n",
|
|
28
|
+
"import { EventEmitter } from \"events\"\nimport { createDebounce, clearDebounceScope, DebounceController } from \"../debounce.js\"\nimport { ProcessQueue } from \"../queue.js\"\nimport type {\n TreeSitterClientOptions,\n TreeSitterClientEvents,\n BufferState,\n ParsedBuffer,\n FiletypeParserOptions,\n Edit,\n PerformanceStats,\n SimpleHighlight,\n} from \"./types.js\"\nimport { getParsers } from \"./default-parsers.js\"\nimport { resolve, isAbsolute, parse } from \"path\"\nimport { existsSync } from \"fs\"\nimport { registerEnvVar, env } from \"../env.js\"\nimport { isBunfsPath, normalizeBunfsPath } from \"../bunfs.js\"\n\nregisterEnvVar({\n name: \"OTUI_TREE_SITTER_WORKER_PATH\",\n description: \"Path to the TreeSitter worker\",\n type: \"string\",\n default: \"\",\n})\n\ndeclare global {\n const OTUI_TREE_SITTER_WORKER_PATH: string\n}\n\ninterface EditQueueItem {\n edits: Edit[]\n newContent: string\n version: number\n isReset?: boolean\n}\n\nlet DEFAULT_PARSERS: FiletypeParserOptions[] = getParsers()\n\nexport function addDefaultParsers(parsers: FiletypeParserOptions[]): void {\n for (const parser of parsers) {\n DEFAULT_PARSERS = [\n ...DEFAULT_PARSERS.filter((existingParser) => existingParser.filetype !== parser.filetype),\n parser,\n ]\n }\n}\n\nconst isUrl = (path: string) => path.startsWith(\"http://\") || path.startsWith(\"https://\")\n\n// Parser options now support both URLs and local file paths\n// TODO: TreeSitterClient should have a setOptions method, passing it on to the worker etc.\nexport class TreeSitterClient extends EventEmitter<TreeSitterClientEvents> {\n private initialized = false\n private worker: Worker | undefined\n private buffers: Map<number, BufferState> = new Map()\n private initializePromise: Promise<void> | undefined\n private initializeResolvers:\n | { resolve: () => void; reject: (error: Error) => void; timeoutId: ReturnType<typeof setTimeout> }\n | undefined\n private messageCallbacks: Map<string, (response: any) => void> = new Map()\n private messageIdCounter: number = 0\n private editQueues: Map<number, ProcessQueue<EditQueueItem>> = new Map()\n private debouncer: DebounceController\n private options: TreeSitterClientOptions\n\n constructor(options: TreeSitterClientOptions) {\n super()\n this.options = options\n this.debouncer = createDebounce(\"tree-sitter-client\")\n this.startWorker()\n }\n\n private emitError(error: string, bufferId?: number): void {\n if (this.listenerCount(\"error\") > 0) {\n this.emit(\"error\", error, bufferId)\n }\n }\n\n private emitWarning(warning: string, bufferId?: number): void {\n if (this.listenerCount(\"warning\") > 0) {\n this.emit(\"warning\", warning, bufferId)\n }\n }\n\n private startWorker() {\n if (this.worker) {\n return\n }\n\n let worker_path: string | URL\n\n if (env.OTUI_TREE_SITTER_WORKER_PATH) {\n worker_path = env.OTUI_TREE_SITTER_WORKER_PATH\n } else if (typeof OTUI_TREE_SITTER_WORKER_PATH !== \"undefined\") {\n worker_path = OTUI_TREE_SITTER_WORKER_PATH\n } else if (this.options.workerPath) {\n worker_path = this.options.workerPath\n } else {\n worker_path = new URL(\"./parser.worker.js\", import.meta.url).href\n if (!existsSync(resolve(import.meta.dirname, \"parser.worker.js\"))) {\n worker_path = new URL(\"./parser.worker.ts\", import.meta.url).href\n }\n }\n\n this.worker = new Worker(worker_path)\n\n // @ts-ignore - onmessage exists\n this.worker.onmessage = this.handleWorkerMessage.bind(this)\n\n // @ts-ignore - onerror exists\n this.worker.onerror = (error: ErrorEvent) => {\n console.error(\"TreeSitter worker error:\", error.message)\n\n // If we're still initializing, reject the init promise\n if (this.initializeResolvers) {\n clearTimeout(this.initializeResolvers.timeoutId)\n this.initializeResolvers.reject(new Error(`Worker error: ${error.message}`))\n this.initializeResolvers = undefined\n }\n\n this.emitError(`Worker error: ${error.message}`)\n }\n }\n\n private stopWorker() {\n if (!this.worker) {\n return\n }\n\n this.worker.terminate()\n this.worker = undefined\n }\n\n // NOTE: Unused, but useful for debugging and testing\n private handleReset() {\n this.buffers.clear()\n this.stopWorker()\n this.startWorker()\n this.initializePromise = undefined\n this.initializeResolvers = undefined\n return this.initialize()\n }\n\n async initialize(): Promise<void> {\n if (this.initializePromise) {\n return this.initializePromise\n }\n\n this.initializePromise = new Promise((resolve, reject) => {\n const timeoutMs = this.options.initTimeout ?? 10000 // Default to 10 seconds\n const timeoutId = setTimeout(() => {\n const error = new Error(\"Worker initialization timed out\")\n console.error(\"TreeSitter client:\", error.message)\n this.initializeResolvers = undefined\n reject(error)\n }, timeoutMs)\n\n this.initializeResolvers = { resolve, reject, timeoutId }\n this.worker?.postMessage({\n type: \"INIT\",\n dataPath: this.options.dataPath,\n })\n })\n\n await this.initializePromise\n await this.registerDefaultParsers()\n\n return this.initializePromise\n }\n\n private async registerDefaultParsers(): Promise<void> {\n for (const parser of DEFAULT_PARSERS) {\n this.addFiletypeParser(parser)\n }\n }\n\n private resolvePath(path: string): string {\n if (isUrl(path)) {\n return path\n }\n if (isBunfsPath(path)) {\n return normalizeBunfsPath(parse(path).base)\n }\n if (!isAbsolute(path)) {\n return resolve(path)\n }\n return path\n }\n\n public addFiletypeParser(filetypeParser: FiletypeParserOptions): void {\n const resolvedParser: FiletypeParserOptions = {\n ...filetypeParser,\n aliases: filetypeParser.aliases\n ? [...new Set(filetypeParser.aliases.filter((alias) => alias !== filetypeParser.filetype))]\n : undefined,\n wasm: this.resolvePath(filetypeParser.wasm),\n queries: {\n highlights: filetypeParser.queries.highlights.map((path) => this.resolvePath(path)),\n injections: filetypeParser.queries.injections?.map((path) => this.resolvePath(path)),\n },\n }\n this.worker?.postMessage({ type: \"ADD_FILETYPE_PARSER\", filetypeParser: resolvedParser })\n }\n\n public async getPerformance(): Promise<PerformanceStats> {\n const messageId = `performance_${this.messageIdCounter++}`\n return new Promise<PerformanceStats>((resolve) => {\n this.messageCallbacks.set(messageId, resolve)\n this.worker?.postMessage({ type: \"GET_PERFORMANCE\", messageId })\n })\n }\n\n public async highlightOnce(\n content: string,\n filetype: string,\n ): Promise<{ highlights?: SimpleHighlight[]; warning?: string; error?: string }> {\n if (!this.initialized) {\n try {\n await this.initialize()\n } catch (error) {\n return { error: \"Could not highlight because of initialization error\" }\n }\n }\n\n const messageId = `oneshot_${this.messageIdCounter++}`\n return new Promise((resolve) => {\n this.messageCallbacks.set(messageId, resolve)\n this.worker?.postMessage({\n type: \"ONESHOT_HIGHLIGHT\",\n content,\n filetype,\n messageId,\n })\n })\n }\n\n private handleWorkerMessage(event: MessageEvent) {\n const { type, bufferId, error, highlights, warning, messageId, hasParser, performance, version } = event.data\n\n if (type === \"HIGHLIGHT_RESPONSE\") {\n const buffer = this.buffers.get(bufferId)\n if (!buffer || !buffer.hasParser) return\n if (buffer.version !== version) {\n this.resetBuffer(bufferId, buffer.version, buffer.content)\n return\n }\n this.emit(\"highlights:response\", bufferId, version, highlights)\n }\n\n if (type === \"INIT_RESPONSE\") {\n if (this.initializeResolvers) {\n clearTimeout(this.initializeResolvers.timeoutId)\n if (error) {\n console.error(\"TreeSitter client initialization failed:\", error)\n this.initializeResolvers.reject(new Error(error))\n } else {\n this.initialized = true\n this.initializeResolvers.resolve()\n }\n this.initializeResolvers = undefined\n return\n }\n }\n\n if (type === \"PARSER_INIT_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback({ hasParser, warning, error })\n }\n return\n }\n\n if (type === \"PRELOAD_PARSER_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback({ hasParser })\n }\n return\n }\n\n if (type === \"BUFFER_DISPOSED\") {\n const callback = this.messageCallbacks.get(`dispose_${bufferId}`)\n if (callback) {\n this.messageCallbacks.delete(`dispose_${bufferId}`)\n callback(true)\n }\n this.emit(\"buffer:disposed\", bufferId)\n return\n }\n\n if (type === \"PERFORMANCE_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback(performance)\n }\n return\n }\n\n if (type === \"ONESHOT_HIGHLIGHT_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback({ highlights, warning, error })\n }\n return\n }\n\n if (type === \"UPDATE_DATA_PATH_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback({ error })\n }\n return\n }\n\n if (type === \"CLEAR_CACHE_RESPONSE\") {\n const callback = this.messageCallbacks.get(messageId)\n if (callback) {\n this.messageCallbacks.delete(messageId)\n callback({ error })\n }\n return\n }\n\n if (warning) {\n this.emitWarning(warning, bufferId)\n return\n }\n\n if (error) {\n this.emitError(error, bufferId)\n return\n }\n\n if (type === \"WORKER_LOG\") {\n const { logType, data } = event.data\n const message = data.join(\" \")\n\n this.emit(\"worker:log\", logType, message)\n return\n }\n }\n\n public async preloadParser(filetype: string): Promise<boolean> {\n const messageId = `has_parser_${this.messageIdCounter++}`\n const response = await new Promise<{ hasParser: boolean; warning?: string; error?: string }>((resolve) => {\n this.messageCallbacks.set(messageId, resolve)\n this.worker?.postMessage({\n type: \"PRELOAD_PARSER\",\n filetype,\n messageId,\n })\n })\n return response.hasParser\n }\n\n public async createBuffer(\n id: number,\n content: string,\n filetype: string,\n version: number = 1,\n autoInitialize: boolean = true,\n ): Promise<boolean> {\n if (!this.initialized) {\n if (!autoInitialize) {\n this.emitError(\"Could not create buffer because client is not initialized\")\n return false\n }\n try {\n await this.initialize()\n } catch (error) {\n this.emitError(\"Could not create buffer because of initialization error\")\n return false\n }\n }\n\n if (this.buffers.has(id)) {\n throw new Error(`Buffer with id ${id} already exists`)\n }\n\n // Set buffer state immediately to avoid race conditions\n this.buffers.set(id, { id, content, filetype, version, hasParser: false })\n\n const messageId = `init_${this.messageIdCounter++}`\n const response = await new Promise<{ hasParser: boolean; warning?: string; error?: string }>((resolve) => {\n this.messageCallbacks.set(messageId, resolve)\n this.worker?.postMessage({\n type: \"INITIALIZE_PARSER\",\n bufferId: id,\n version,\n content,\n filetype,\n messageId,\n })\n })\n\n if (!response.hasParser) {\n this.emit(\"buffer:initialized\", id, false)\n if (filetype !== \"plaintext\") {\n this.emitWarning(response.warning || response.error || \"Buffer has no parser\", id)\n }\n return false\n }\n\n // Update buffer state to indicate it has a parser\n const bufferState: ParsedBuffer = { id, content, filetype, version, hasParser: true }\n this.buffers.set(id, bufferState)\n\n this.emit(\"buffer:initialized\", id, true)\n return true\n }\n\n public async updateBuffer(id: number, edits: Edit[], newContent: string, version: number): Promise<void> {\n if (!this.initialized) {\n return\n }\n\n const buffer = this.buffers.get(id)\n if (!buffer || !buffer.hasParser) {\n return\n }\n\n // Update buffer state\n this.buffers.set(id, { ...buffer, content: newContent, version })\n\n if (!this.editQueues.has(id)) {\n this.editQueues.set(\n id,\n new ProcessQueue<EditQueueItem>((item) =>\n this.processEdit(id, item.edits, item.newContent, item.version, item.isReset),\n ),\n )\n }\n\n const bufferQueue = this.editQueues.get(id)!\n bufferQueue.enqueue({ edits, newContent, version })\n }\n\n private async processEdit(\n bufferId: number,\n edits: Edit[],\n newContent: string,\n version: number,\n isReset = false,\n ): Promise<void> {\n this.worker?.postMessage({\n type: isReset ? \"RESET_BUFFER\" : \"HANDLE_EDITS\",\n bufferId,\n version,\n content: newContent,\n edits,\n })\n }\n\n public async removeBuffer(bufferId: number): Promise<void> {\n if (!this.initialized) {\n return\n }\n\n this.buffers.delete(bufferId)\n\n if (this.editQueues.has(bufferId)) {\n this.editQueues.get(bufferId)?.clear()\n this.editQueues.delete(bufferId)\n }\n\n if (this.worker) {\n await new Promise<boolean>((resolve) => {\n const messageId = `dispose_${bufferId}`\n this.messageCallbacks.set(messageId, resolve)\n try {\n this.worker!.postMessage({\n type: \"DISPOSE_BUFFER\",\n bufferId,\n })\n } catch (error) {\n console.error(\"Error disposing buffer\", error)\n resolve(false)\n }\n\n // Add a timeout in case the worker doesn't respond\n setTimeout(() => {\n if (this.messageCallbacks.has(messageId)) {\n this.messageCallbacks.delete(messageId)\n console.warn({ bufferId }, \"Timed out waiting for buffer to be disposed\")\n resolve(false)\n }\n }, 3000)\n })\n }\n\n this.debouncer.clearDebounce(`reset-${bufferId}`)\n }\n\n public async destroy(): Promise<void> {\n if (this.initializeResolvers) {\n clearTimeout(this.initializeResolvers.timeoutId)\n // Reject pending initialization promise to prevent hanging awaits\n this.initializeResolvers.reject(new Error(\"Client destroyed during initialization\"))\n this.initializeResolvers = undefined\n }\n\n for (const [messageId, callback] of this.messageCallbacks.entries()) {\n if (typeof callback === \"function\") {\n try {\n callback({ error: \"Client destroyed\" })\n } catch (e) {\n // Ignore errors during cleanup\n }\n }\n }\n this.messageCallbacks.clear()\n\n clearDebounceScope(\"tree-sitter-client\")\n this.debouncer.clear()\n\n this.editQueues.clear()\n this.buffers.clear()\n\n this.stopWorker()\n\n this.initialized = false\n this.initializePromise = undefined\n }\n\n public async resetBuffer(bufferId: number, version: number, content: string): Promise<void> {\n if (!this.initialized) {\n return\n }\n\n const buffer = this.buffers.get(bufferId)\n if (!buffer || !buffer.hasParser) {\n this.emitError(\"Cannot reset buffer with no parser\", bufferId)\n return\n }\n\n // Update buffer state\n this.buffers.set(bufferId, { ...buffer, content, version })\n\n // Use debouncer to avoid excessive resets\n this.debouncer.debounce(`reset-${bufferId}`, 10, () => this.processEdit(bufferId, [], content, version, true))\n }\n\n public getBuffer(bufferId: number): BufferState | undefined {\n return this.buffers.get(bufferId)\n }\n\n public getAllBuffers(): BufferState[] {\n return Array.from(this.buffers.values())\n }\n\n public isInitialized(): boolean {\n return this.initialized\n }\n\n public async setDataPath(dataPath: string): Promise<void> {\n if (this.options.dataPath === dataPath) {\n return\n }\n\n this.options.dataPath = dataPath\n\n if (this.initialized && this.worker) {\n const messageId = `update_datapath_${this.messageIdCounter++}`\n return new Promise<void>((resolve, reject) => {\n this.messageCallbacks.set(messageId, (response: any) => {\n if (response.error) {\n reject(new Error(response.error))\n } else {\n resolve()\n }\n })\n this.worker!.postMessage({\n type: \"UPDATE_DATA_PATH\",\n dataPath,\n messageId,\n })\n })\n }\n }\n\n public async clearCache(): Promise<void> {\n if (!this.initialized || !this.worker) {\n throw new Error(\"Cannot clear cache: client is not initialized\")\n }\n\n const messageId = `clear_cache_${this.messageIdCounter++}`\n return new Promise<void>((resolve, reject) => {\n this.messageCallbacks.set(messageId, (response: any) => {\n if (response.error) {\n reject(new Error(response.error))\n } else {\n resolve()\n }\n })\n this.worker!.postMessage({\n type: \"CLEAR_CACHE\",\n messageId,\n })\n })\n }\n}\n",
|
|
29
|
+
"/**\n * A module-level map to store timeout IDs for all debounced functions\n * Structure: Map<scopeId, Map<debounceId, timerId>>\n */\nconst TIMERS_MAP = new Map<string | number, Map<string | number, ReturnType<typeof setTimeout>>>()\n\n/**\n * Debounce controller that manages debounce instances for a specific scope\n */\nexport class DebounceController {\n constructor(private scopeId: string | number) {\n // Initialize the scope map if it doesn't exist\n if (!TIMERS_MAP.has(this.scopeId)) {\n TIMERS_MAP.set(this.scopeId, new Map())\n }\n }\n\n /**\n * Debounces the provided function with the given ID\n *\n * @param id Unique identifier within this scope\n * @param ms Milliseconds to wait before executing\n * @param fn Function to execute\n */\n debounce<R>(id: string | number, ms: number, fn: () => Promise<R>): Promise<R> {\n const scopeMap = TIMERS_MAP.get(this.scopeId)!\n\n return new Promise((resolve, reject) => {\n // Clear any existing timeout for this ID\n if (scopeMap.has(id)) {\n clearTimeout(scopeMap.get(id))\n }\n\n // Set a new timeout\n const timerId = setTimeout(() => {\n try {\n resolve(fn())\n } catch (error) {\n reject(error)\n }\n scopeMap.delete(id)\n }, ms)\n\n // Store the new timeout ID\n scopeMap.set(id, timerId)\n })\n }\n\n /**\n * Clear a specific debounce timer in this scope\n *\n * @param id The debounce ID to clear\n */\n clearDebounce(id: string | number): void {\n const scopeMap = TIMERS_MAP.get(this.scopeId)\n if (scopeMap && scopeMap.has(id)) {\n clearTimeout(scopeMap.get(id))\n scopeMap.delete(id)\n }\n }\n\n /**\n * Clear all debounce timers in this scope\n */\n clear(): void {\n const scopeMap = TIMERS_MAP.get(this.scopeId)\n if (scopeMap) {\n scopeMap.forEach((timerId) => clearTimeout(timerId))\n scopeMap.clear()\n }\n }\n}\n\n/**\n * Creates a new debounce controller for a specific scope\n *\n * @param scopeId Unique identifier for this debounce scope\n * @returns A DebounceController for the specified scope\n */\nexport function createDebounce(scopeId: string | number): DebounceController {\n return new DebounceController(scopeId)\n}\n\n/**\n * Clears all debounce timers for a specific scope\n *\n * @param scopeId The scope identifier\n */\nexport function clearDebounceScope(scopeId: string | number): void {\n const scopeMap = TIMERS_MAP.get(scopeId)\n if (scopeMap) {\n scopeMap.forEach((timerId) => clearTimeout(timerId))\n scopeMap.clear()\n }\n}\n\n/**\n * Clears all active debounce timers across all scopes\n */\nexport function clearAllDebounces(): void {\n TIMERS_MAP.forEach((scopeMap) => {\n scopeMap.forEach((timerId) => clearTimeout(timerId))\n scopeMap.clear()\n })\n TIMERS_MAP.clear()\n}\n",
|
|
30
|
+
"/**\n * Generic processing queue that handles asynchronous job processing\n */\nexport class ProcessQueue<T> {\n private queue: T[] = []\n private processing: boolean = false\n private autoProcess: boolean = true\n\n constructor(\n private processor: (item: T) => Promise<void> | void,\n autoProcess: boolean = true,\n ) {\n this.autoProcess = autoProcess\n }\n\n enqueue(item: T): void {\n this.queue.push(item)\n\n if (!this.processing && this.autoProcess) {\n this.processQueue()\n }\n }\n\n private processQueue(): void {\n if (this.queue.length === 0) {\n return\n }\n\n this.processing = true\n\n queueMicrotask(async () => {\n if (this.queue.length === 0) {\n this.processing = false\n return\n }\n\n // Get the next item to process (FIFO)\n const item = this.queue.shift()!\n\n try {\n await this.processor(item)\n } catch (error) {\n console.error(\"Error processing queue item:\", error)\n }\n\n if (this.queue.length > 0) {\n this.processQueue()\n } else {\n this.processing = false\n }\n })\n }\n\n clear(): void {\n this.queue = []\n }\n\n isProcessing(): boolean {\n return this.processing\n }\n\n size(): number {\n return this.queue.length\n }\n}\n",
|
|
31
|
+
"// This file is generated by assets/update.ts - DO NOT EDIT MANUALLY\n// Run 'bun assets/update.ts' to regenerate this file\n// Last generated: 2026-03-20T21:07:24.696Z\n\nimport type { FiletypeParserOptions } from \"./types.js\"\nimport { resolve, dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\n\nimport javascript_highlights from \"./assets/javascript/highlights.scm\" with { type: \"file\" }\nimport javascript_language from \"./assets/javascript/tree-sitter-javascript.wasm\" with { type: \"file\" }\nimport typescript_highlights from \"./assets/typescript/highlights.scm\" with { type: \"file\" }\nimport typescript_language from \"./assets/typescript/tree-sitter-typescript.wasm\" with { type: \"file\" }\nimport markdown_highlights from \"./assets/markdown/highlights.scm\" with { type: \"file\" }\nimport markdown_language from \"./assets/markdown/tree-sitter-markdown.wasm\" with { type: \"file\" }\nimport markdown_injections from \"./assets/markdown/injections.scm\" with { type: \"file\" }\nimport markdown_inline_highlights from \"./assets/markdown_inline/highlights.scm\" with { type: \"file\" }\nimport markdown_inline_language from \"./assets/markdown_inline/tree-sitter-markdown_inline.wasm\" with { type: \"file\" }\nimport zig_highlights from \"./assets/zig/highlights.scm\" with { type: \"file\" }\nimport zig_language from \"./assets/zig/tree-sitter-zig.wasm\" with { type: \"file\" }\n\n// Cached parsers to avoid re-resolving paths on every call\nlet _cachedParsers: FiletypeParserOptions[] | undefined\n\nexport function getParsers(): FiletypeParserOptions[] {\n if (!_cachedParsers) {\n _cachedParsers = [\n {\n filetype: \"javascript\",\n aliases: [\"javascriptreact\"],\n queries: {\n highlights: [resolve(dirname(fileURLToPath(import.meta.url)), javascript_highlights)],\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), javascript_language),\n },\n {\n filetype: \"typescript\",\n aliases: [\"typescriptreact\"],\n queries: {\n highlights: [resolve(dirname(fileURLToPath(import.meta.url)), typescript_highlights)],\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), typescript_language),\n },\n {\n filetype: \"markdown\",\n queries: {\n highlights: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_highlights)],\n injections: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_injections)],\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), markdown_language),\n injectionMapping: {\n \"nodeTypes\": {\n \"inline\": \"markdown_inline\",\n \"pipe_table_cell\": \"markdown_inline\"\n },\n \"infoStringMap\": {\n \"javascript\": \"javascript\",\n \"js\": \"javascript\",\n \"jsx\": \"javascriptreact\",\n \"javascriptreact\": \"javascriptreact\",\n \"typescript\": \"typescript\",\n \"ts\": \"typescript\",\n \"tsx\": \"typescriptreact\",\n \"typescriptreact\": \"typescriptreact\",\n \"markdown\": \"markdown\",\n \"md\": \"markdown\"\n }\n},\n },\n {\n filetype: \"markdown_inline\",\n queries: {\n highlights: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_inline_highlights)],\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), markdown_inline_language),\n },\n {\n filetype: \"zig\",\n queries: {\n highlights: [resolve(dirname(fileURLToPath(import.meta.url)), zig_highlights)],\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), zig_language),\n },\n ]\n }\n return _cachedParsers\n}\n",
|
|
32
|
+
"import { basename, join } from \"node:path\"\n\nexport function isBunfsPath(path: string): boolean {\n // Removed ambiguous '//' check\n return path.includes(\"$bunfs\") || /^B:[\\\\/]~BUN/i.test(path)\n}\n\nexport function getBunfsRootPath(): string {\n return process.platform === \"win32\" ? \"B:\\\\~BUN\\\\root\" : \"/$bunfs/root\"\n}\n\n/**\n * Normalizes a path to the embedded root.\n * Flattens directory structure to ensure file exists at root.\n */\nexport function normalizeBunfsPath(fileName: string): string {\n return join(getBunfsRootPath(), basename(fileName))\n}\n",
|
|
33
|
+
"import os from \"os\"\nimport path from \"path\"\nimport { EventEmitter } from \"events\"\nimport { singleton } from \"./singleton.js\"\nimport { env, registerEnvVar } from \"./env.js\"\nimport { isValidDirectoryName } from \"./validate-dir-name.js\"\n\n// Register environment variables for XDG directories\nregisterEnvVar({\n name: \"XDG_CONFIG_HOME\",\n description: \"Base directory for user-specific configuration files\",\n type: \"string\",\n default: \"\",\n})\n\nregisterEnvVar({\n name: \"XDG_DATA_HOME\",\n description: \"Base directory for user-specific data files\",\n type: \"string\",\n default: \"\",\n})\n\nexport interface DataPaths {\n globalConfigPath: string\n globalConfigFile: string\n localConfigFile: string\n globalDataPath: string\n}\n\nexport interface DataPathsEvents {\n \"paths:changed\": [paths: DataPaths]\n}\n\nexport class DataPathsManager extends EventEmitter<DataPathsEvents> {\n private _appName: string\n private _globalConfigPath?: string\n private _globalConfigFile?: string\n private _localConfigFile?: string\n private _globalDataPath?: string\n constructor() {\n super()\n this._appName = \"opentui\"\n }\n\n get appName(): string {\n return this._appName\n }\n\n set appName(value: string) {\n if (!isValidDirectoryName(value)) {\n throw new Error(`Invalid app name \"${value}\": must be a valid directory name`)\n }\n if (this._appName !== value) {\n this._appName = value\n this._globalConfigPath = undefined\n this._globalConfigFile = undefined\n this._localConfigFile = undefined\n this._globalDataPath = undefined\n this.emit(\"paths:changed\", this.toObject())\n }\n }\n\n get globalConfigPath(): string {\n if (this._globalConfigPath === undefined) {\n const homeDir = os.homedir()\n const xdgConfigHome = env.XDG_CONFIG_HOME\n const baseConfigDir = xdgConfigHome || path.join(homeDir, \".config\")\n this._globalConfigPath = path.join(baseConfigDir, this._appName)\n }\n return this._globalConfigPath\n }\n\n get globalConfigFile(): string {\n if (this._globalConfigFile === undefined) {\n this._globalConfigFile = path.join(this.globalConfigPath, \"init.ts\")\n }\n return this._globalConfigFile\n }\n\n get localConfigFile(): string {\n if (this._localConfigFile === undefined) {\n this._localConfigFile = path.join(process.cwd(), `.${this._appName}.ts`)\n }\n return this._localConfigFile\n }\n\n get globalDataPath(): string {\n if (this._globalDataPath === undefined) {\n const homeDir = os.homedir()\n const xdgDataHome = env.XDG_DATA_HOME\n const baseDataDir = xdgDataHome || path.join(homeDir, \".local/share\")\n this._globalDataPath = path.join(baseDataDir, this._appName)\n }\n return this._globalDataPath\n }\n\n toObject(): DataPaths {\n return {\n globalConfigPath: this.globalConfigPath,\n globalConfigFile: this.globalConfigFile,\n localConfigFile: this.localConfigFile,\n globalDataPath: this.globalDataPath,\n }\n }\n}\n\nexport function getDataPaths(): DataPathsManager {\n return singleton(\"data-paths-opentui\", () => new DataPathsManager())\n}\n",
|
|
34
|
+
"export function isValidDirectoryName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false\n }\n\n if (name.trim().length === 0) {\n return false\n }\n\n const reservedNames = [\n \"CON\",\n \"PRN\",\n \"AUX\",\n \"NUL\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\",\n ]\n if (reservedNames.includes(name.toUpperCase())) {\n return false\n }\n\n // Check for invalid characters\n // Windows: < > : \" | ? * \\ and control characters (0-31)\n // Unix: null character and forward slash\n const invalidChars = /[<>:\"|?*/\\\\\\x00-\\x1f]/\n if (invalidChars.test(name)) {\n return false\n }\n\n if (name.endsWith(\".\") || name.endsWith(\" \")) {\n return false\n }\n\n if (name === \".\" || name === \"..\") {\n return false\n }\n\n return true\n}\n",
|
|
35
|
+
"import path from \"node:path\"\n\nexport const extensionToFiletype: Map<string, string> = new Map([\n [\"astro\", \"astro\"],\n [\"bash\", \"bash\"],\n [\"c\", \"c\"],\n [\"cc\", \"cpp\"],\n [\"cjs\", \"javascript\"],\n [\"clj\", \"clojure\"],\n [\"cljs\", \"clojure\"],\n [\"cljc\", \"clojure\"],\n [\"cpp\", \"cpp\"],\n [\"cxx\", \"cpp\"],\n [\"cs\", \"csharp\"],\n [\"cts\", \"typescript\"],\n [\"ctsx\", \"typescriptreact\"],\n [\"dart\", \"dart\"],\n [\"diff\", \"diff\"],\n [\"edn\", \"clojure\"],\n [\"go\", \"go\"],\n [\"gemspec\", \"ruby\"],\n [\"groovy\", \"groovy\"],\n [\"h\", \"c\"],\n [\"handlebars\", \"handlebars\"],\n [\"hbs\", \"handlebars\"],\n [\"hpp\", \"cpp\"],\n [\"hxx\", \"cpp\"],\n [\"h++\", \"cpp\"],\n [\"hh\", \"cpp\"],\n [\"hrl\", \"erlang\"],\n [\"hs\", \"haskell\"],\n [\"htm\", \"html\"],\n [\"html\", \"html\"],\n [\"ini\", \"ini\"],\n [\"js\", \"javascript\"],\n [\"jsx\", \"javascriptreact\"],\n [\"jl\", \"julia\"],\n [\"json\", \"json\"],\n [\"ksh\", \"bash\"],\n [\"kt\", \"kotlin\"],\n [\"kts\", \"kotlin\"],\n [\"latex\", \"latex\"],\n [\"less\", \"less\"],\n [\"lua\", \"lua\"],\n [\"markdown\", \"markdown\"],\n [\"md\", \"markdown\"],\n [\"mdown\", \"markdown\"],\n [\"mkd\", \"markdown\"],\n [\"mjs\", \"javascript\"],\n [\"ml\", \"ocaml\"],\n [\"mli\", \"ocaml\"],\n [\"mts\", \"typescript\"],\n [\"mtsx\", \"typescriptreact\"],\n [\"patch\", \"diff\"],\n [\"php\", \"php\"],\n [\"pl\", \"perl\"],\n [\"pm\", \"perl\"],\n [\"ps1\", \"powershell\"],\n [\"psm1\", \"powershell\"],\n [\"py\", \"python\"],\n [\"pyi\", \"python\"],\n [\"r\", \"r\"],\n [\"rb\", \"ruby\"],\n [\"rake\", \"ruby\"],\n [\"rs\", \"rust\"],\n [\"ru\", \"ruby\"],\n [\"sass\", \"sass\"],\n [\"sc\", \"scala\"],\n [\"scala\", \"scala\"],\n [\"scss\", \"scss\"],\n [\"sh\", \"bash\"],\n [\"sql\", \"sql\"],\n [\"svelte\", \"svelte\"],\n [\"swift\", \"swift\"],\n [\"ts\", \"typescript\"],\n [\"tsx\", \"typescriptreact\"],\n [\"tex\", \"latex\"],\n [\"toml\", \"toml\"],\n [\"vue\", \"vue\"],\n [\"vim\", \"vim\"],\n [\"xml\", \"xml\"],\n [\"xsl\", \"xsl\"],\n [\"yaml\", \"yaml\"],\n [\"yml\", \"yaml\"],\n [\"zig\", \"zig\"],\n [\"zon\", \"zig\"],\n [\"zsh\", \"bash\"],\n [\"c++\", \"cpp\"],\n [\"erl\", \"erlang\"],\n [\"exs\", \"elixir\"],\n [\"ex\", \"elixir\"],\n [\"elm\", \"elm\"],\n [\"fsharp\", \"fsharp\"],\n [\"fs\", \"fsharp\"],\n [\"fsx\", \"fsharp\"],\n [\"fsscript\", \"fsharp\"],\n [\"fsi\", \"fsharp\"],\n [\"java\", \"java\"],\n [\"css\", \"css\"],\n])\n\nexport const basenameToFiletype: Map<string, string> = new Map([\n [\".bash_aliases\", \"bash\"],\n [\".bash_logout\", \"bash\"],\n [\".bash_profile\", \"bash\"],\n [\".bashrc\", \"bash\"],\n [\".kshrc\", \"bash\"],\n [\".profile\", \"bash\"],\n [\".vimrc\", \"vim\"],\n [\".zlogin\", \"bash\"],\n [\".zlogout\", \"bash\"],\n [\".zprofile\", \"bash\"],\n [\".zshenv\", \"bash\"],\n [\".zshrc\", \"bash\"],\n [\"appfile\", \"ruby\"],\n [\"berksfile\", \"ruby\"],\n [\"brewfile\", \"ruby\"],\n [\"cheffile\", \"ruby\"],\n [\"containerfile\", \"dockerfile\"],\n [\"dockerfile\", \"dockerfile\"],\n [\"fastfile\", \"ruby\"],\n [\"gemfile\", \"ruby\"],\n [\"gnumakefile\", \"make\"],\n [\"gvimrc\", \"vim\"],\n [\"guardfile\", \"ruby\"],\n [\"makefile\", \"make\"],\n [\"podfile\", \"ruby\"],\n [\"rakefile\", \"ruby\"],\n [\"thorfile\", \"ruby\"],\n [\"vagrantfile\", \"ruby\"],\n])\n\nfunction normalizeFiletypeToken(value: string): string | undefined {\n const normalizedValue = value.trim().replace(/^\\./, \"\").toLowerCase()\n return normalizedValue || undefined\n}\n\nfunction getBasename(value: string): string | undefined {\n const normalizedValue = value.trim().replaceAll(\"\\\\\", \"/\")\n if (!normalizedValue) return undefined\n\n const basename = path.posix.basename(normalizedValue).toLowerCase()\n return basename || undefined\n}\n\nexport function extToFiletype(extension: string): string | undefined {\n const normalizedExtension = normalizeFiletypeToken(extension)\n if (!normalizedExtension) return undefined\n\n return extensionToFiletype.get(normalizedExtension)\n}\n\nexport function pathToFiletype(path: string): string | undefined {\n if (typeof path !== \"string\") return undefined\n\n const basename = getBasename(path)\n if (!basename) return undefined\n\n const basenameFiletype = basenameToFiletype.get(basename)\n if (basenameFiletype) {\n return basenameFiletype\n }\n\n const lastDot = basename.lastIndexOf(\".\")\n if (lastDot === -1 || lastDot === basename.length - 1) {\n return undefined\n }\n\n const extension = basename.substring(lastDot + 1)\n return extToFiletype(extension)\n}\n\nexport function infoStringToFiletype(infoString: string): string | undefined {\n if (typeof infoString !== \"string\") return undefined\n\n const token = infoString.trim().split(/\\s+/, 1)[0]\n const directBasenameMatch = basenameToFiletype.get(token.toLowerCase())\n if (directBasenameMatch) return directBasenameMatch\n\n const normalizedToken = normalizeFiletypeToken(token)\n if (!normalizedToken) return undefined\n\n return (\n basenameToFiletype.get(normalizedToken) ??\n pathToFiletype(normalizedToken) ??\n extToFiletype(normalizedToken) ??\n normalizedToken\n )\n}\n",
|
|
36
|
+
"#!/usr/bin/env bun\n\nimport { readFile, writeFile, mkdir } from \"fs/promises\"\nimport * as path from \"path\"\nimport { DownloadUtils } from \"../download-utils.js\"\nimport { parseArgs } from \"util\"\nimport type { FiletypeParserOptions } from \"../types.js\"\nimport { readdir } from \"fs/promises\"\n\ninterface ParsersConfig {\n parsers: FiletypeParserOptions[]\n}\n\ninterface GeneratedParser {\n filetype: string\n aliases?: string[]\n languagePath: string\n highlightsPath: string\n injectionsPath?: string\n injectionMapping?: any\n}\n\nexport interface UpdateOptions {\n /** Path to parsers-config.json */\n configPath: string\n /** Directory where .wasm and .scm files will be downloaded */\n assetsDir: string\n /** Path where the generated TypeScript file will be written */\n outputPath: string\n}\n\nfunction getDefaultOptions(): UpdateOptions {\n return {\n configPath: path.resolve(__dirname, \"../parsers-config\"),\n assetsDir: path.resolve(__dirname),\n outputPath: path.resolve(__dirname, \"../default-parsers.ts\"),\n }\n}\n\nasync function loadConfig(configPath: string): Promise<ParsersConfig> {\n let ext = path.extname(configPath)\n let resolvedConfigPath = configPath\n\n if (ext === \"\") {\n const files = await readdir(path.dirname(configPath))\n const file = files.find(\n (file) =>\n file.startsWith(path.basename(configPath)) &&\n (file.endsWith(\".json\") || file.endsWith(\".ts\") || file.endsWith(\".js\")),\n )\n if (!file) {\n throw new Error(`No config file found for ${configPath}`)\n }\n resolvedConfigPath = path.join(path.dirname(configPath), file)\n ext = path.extname(resolvedConfigPath)\n }\n\n if (ext === \".json\") {\n const configContent = await readFile(resolvedConfigPath, \"utf-8\")\n return JSON.parse(configContent)\n } else if (ext === \".ts\" || ext === \".js\") {\n const { default: configContent } = await import(resolvedConfigPath)\n return configContent\n }\n throw new Error(`Unsupported config file extension: ${ext}`)\n}\n\nasync function downloadLanguage(\n filetype: string,\n languageUrl: string,\n assetsDir: string,\n outputPath: string,\n): Promise<string> {\n const languageDir = path.join(assetsDir, filetype)\n const languageFilename = path.basename(languageUrl)\n const languagePath = path.join(languageDir, languageFilename)\n\n const result = await DownloadUtils.downloadToPath(languageUrl, languagePath)\n\n if (result.error) {\n throw new Error(`Failed to download language for ${filetype}: ${result.error}`)\n }\n\n return \"./\" + path.relative(path.dirname(outputPath), languagePath)\n}\n\nasync function downloadAndCombineQueries(\n filetype: string,\n queryUrls: string[],\n assetsDir: string,\n outputPath: string,\n queryType: \"highlights\" | \"injections\",\n configPath: string,\n): Promise<string> {\n const queriesDir = path.join(assetsDir, filetype)\n const queryPath = path.join(queriesDir, `${queryType}.scm`)\n\n const queryContents: string[] = []\n\n for (let i = 0; i < queryUrls.length; i++) {\n const queryUrl = queryUrls[i]\n\n if (queryUrl.startsWith(\"./\")) {\n console.log(` Using local query ${i + 1}/${queryUrls.length}: ${queryUrl}`)\n\n try {\n const localPath = path.resolve(path.dirname(configPath), queryUrl)\n const content = await readFile(localPath, \"utf-8\")\n\n if (content.trim()) {\n queryContents.push(content)\n console.log(` ✓ Loaded ${content.split(\"\\n\").length} lines from local file`)\n }\n } catch (error) {\n console.warn(`Failed to read local query from ${queryUrl}: ${error}`)\n continue\n }\n } else {\n console.log(` Downloading query ${i + 1}/${queryUrls.length}: ${queryUrl}`)\n\n try {\n const response = await fetch(queryUrl)\n if (!response.ok) {\n console.warn(`Failed to download query from ${queryUrl}: ${response.statusText}`)\n continue\n }\n\n const content = await response.text()\n if (content.trim()) {\n queryContents.push(`; Query from: ${queryUrl}\\n${content}`)\n console.log(` ✓ Downloaded ${content.split(\"\\n\").length} lines`)\n }\n } catch (error) {\n console.warn(`Failed to download query from ${queryUrl}: ${error}`)\n continue\n }\n }\n }\n\n const combinedContent = queryContents.join(\"\\n\\n\")\n await writeFile(queryPath, combinedContent, \"utf-8\")\n\n console.log(` Combined ${queryContents.length} queries into ${queryPath}`)\n\n return \"./\" + path.relative(path.dirname(outputPath), queryPath)\n}\n\nasync function generateDefaultParsersFile(parsers: GeneratedParser[], outputPath: string): Promise<void> {\n const imports = parsers\n .map((parser) => {\n const safeFiletype = parser.filetype.replace(/[^a-zA-Z0-9]/g, \"_\")\n const lines = [\n `import ${safeFiletype}_highlights from \"${parser.highlightsPath}\" with { type: \"file\" }`,\n `import ${safeFiletype}_language from \"${parser.languagePath}\" with { type: \"file\" }`,\n ]\n if (parser.injectionsPath) {\n lines.push(`import ${safeFiletype}_injections from \"${parser.injectionsPath}\" with { type: \"file\" }`)\n }\n return lines.join(\"\\n\")\n })\n .join(\"\\n\")\n\n const parserDefinitions = parsers\n .map((parser) => {\n const safeFiletype = parser.filetype.replace(/[^a-zA-Z0-9]/g, \"_\")\n const queriesLines = [\n ` highlights: [resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_highlights)],`,\n ]\n if (parser.injectionsPath) {\n queriesLines.push(\n ` injections: [resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_injections)],`,\n )\n }\n\n const injectionMappingLine = parser.injectionMapping\n ? ` injectionMapping: ${JSON.stringify(parser.injectionMapping, null, 10)},`\n : \"\"\n const aliasesLine = parser.aliases?.length ? ` aliases: ${JSON.stringify(parser.aliases)},` : \"\"\n\n return ` {\n filetype: \"${parser.filetype}\",\n${aliasesLine ? aliasesLine + \"\\n\" : \"\"} queries: {\n${queriesLines.join(\"\\n\")}\n },\n wasm: resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_language),${injectionMappingLine ? \"\\n\" + injectionMappingLine : \"\"}\n }`\n })\n .join(\",\\n\")\n\n const fileContent = `// This file is generated by assets/update.ts - DO NOT EDIT MANUALLY\n// Run 'bun assets/update.ts' to regenerate this file\n// Last generated: ${new Date().toISOString()}\n\nimport type { FiletypeParserOptions } from \"./types\"\nimport { resolve, dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\n\n${imports}\n\n// Cached parsers to avoid re-resolving paths on every call\nlet _cachedParsers: FiletypeParserOptions[] | undefined\n\nexport function getParsers(): FiletypeParserOptions[] {\n if (!_cachedParsers) {\n _cachedParsers = [\n${parserDefinitions},\n ]\n }\n return _cachedParsers\n}\n`\n\n await mkdir(path.dirname(outputPath), { recursive: true })\n await writeFile(outputPath, fileContent, \"utf-8\")\n console.log(`Generated ${path.basename(outputPath)} with ${parsers.length} parsers`)\n}\n\nasync function main(options?: Partial<UpdateOptions>): Promise<void> {\n const opts = { ...getDefaultOptions(), ...options }\n\n try {\n console.log(\"Loading parsers configuration...\")\n console.log(` Config: ${opts.configPath}`)\n console.log(` Assets Dir: ${opts.assetsDir}`)\n console.log(` Output: ${opts.outputPath}`)\n\n const config = await loadConfig(opts.configPath)\n\n console.log(`Found ${config.parsers.length} parsers to process`)\n\n const generatedParsers: GeneratedParser[] = []\n\n for (const parser of config.parsers) {\n console.log(`Processing ${parser.filetype}...`)\n\n console.log(` Downloading language...`)\n const languagePath = await downloadLanguage(parser.filetype, parser.wasm, opts.assetsDir, opts.outputPath)\n\n console.log(` Downloading ${parser.queries.highlights.length} highlight queries...`)\n const highlightsPath = await downloadAndCombineQueries(\n parser.filetype,\n parser.queries.highlights,\n opts.assetsDir,\n opts.outputPath,\n \"highlights\",\n opts.configPath,\n )\n\n let injectionsPath: string | undefined\n if (parser.queries.injections && parser.queries.injections.length > 0) {\n console.log(` Downloading ${parser.queries.injections.length} injection queries...`)\n injectionsPath = await downloadAndCombineQueries(\n parser.filetype,\n parser.queries.injections,\n opts.assetsDir,\n opts.outputPath,\n \"injections\",\n opts.configPath,\n )\n }\n\n generatedParsers.push({\n filetype: parser.filetype,\n aliases: parser.aliases,\n languagePath,\n highlightsPath,\n injectionsPath,\n injectionMapping: parser.injectionMapping,\n })\n\n console.log(` ✓ Completed ${parser.filetype}`)\n }\n\n console.log(\"Generating output file...\")\n await generateDefaultParsersFile(generatedParsers, opts.outputPath)\n\n console.log(\"✅ Update completed successfully!\")\n } catch (error) {\n console.error(\"❌ Update failed:\", error)\n process.exit(1)\n }\n}\n\nfunction parseCLIArgs(): Partial<UpdateOptions> | null {\n try {\n const { values } = parseArgs({\n args: Bun.argv.slice(2),\n options: {\n config: { type: \"string\" },\n assets: { type: \"string\" },\n output: { type: \"string\" },\n help: { type: \"boolean\" },\n },\n strict: true,\n })\n\n if (values.help) {\n console.log(`Usage: bun update.ts [options]\n\nOptions:\n --config <path> Path to parsers-config.json\n --assets <path> Directory where .wasm and .scm files will be downloaded\n --output <path> Path where the generated TypeScript file will be written\n --help Show this help message\n\nExamples:\n # Use default paths (for OpenTUI core development)\n bun update.ts\n\n # Use custom paths (for application integration)\n bun update.ts --config ./my-parsers.json --assets ./src/parsers --output ./src/parsers.ts\n`)\n process.exit(0)\n }\n\n const options: Partial<UpdateOptions> = {}\n if (values.config) options.configPath = path.resolve(values.config)\n if (values.assets) options.assetsDir = path.resolve(values.assets)\n if (values.output) options.outputPath = path.resolve(values.output)\n\n return Object.keys(options).length > 0 ? options : null\n } catch (error) {\n console.error(`Error parsing arguments: ${error}`)\n console.log(\"Run with --help for usage information\")\n process.exit(1)\n }\n}\n\nif (import.meta.main) {\n const cliOptions = parseCLIArgs()\n main(cliOptions || undefined)\n}\n\nexport { main as updateAssets }\n",
|
|
37
|
+
"import { mkdir, readFile, writeFile } from \"fs/promises\"\nimport * as path from \"path\"\n\nexport interface DownloadResult {\n content?: Buffer\n filePath?: string\n error?: string\n}\n\nexport class DownloadUtils {\n private static hashUrl(url: string): string {\n let hash = 0\n for (let i = 0; i < url.length; i++) {\n const char = url.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash\n }\n return Math.abs(hash).toString(16)\n }\n\n /**\n * Download a file from URL or load from local path, with caching support\n */\n static async downloadOrLoad(\n source: string,\n cacheDir: string,\n cacheSubdir: string,\n fileExtension: string,\n useHashForCache: boolean = true,\n filetype?: string,\n ): Promise<DownloadResult> {\n const isUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\")\n\n if (isUrl) {\n let cacheFileName: string\n if (useHashForCache) {\n const hash = this.hashUrl(source)\n cacheFileName = filetype ? `${filetype}-${hash}${fileExtension}` : `${hash}${fileExtension}`\n } else {\n cacheFileName = path.basename(source)\n }\n const cacheFile = path.join(cacheDir, cacheSubdir, cacheFileName)\n\n // Ensure cache directory exists\n await mkdir(path.dirname(cacheFile), { recursive: true })\n\n try {\n const cachedContent = await readFile(cacheFile)\n if (cachedContent.byteLength > 0) {\n console.log(`Loaded from cache: ${cacheFile} (${source})`)\n return { content: cachedContent, filePath: cacheFile }\n }\n } catch (error) {\n // Cache miss, continue to fetch\n }\n\n try {\n console.log(`Downloading from URL: ${source}`)\n const response = await fetch(source)\n if (!response.ok) {\n return { error: `Failed to fetch from ${source}: ${response.statusText}` }\n }\n const content = Buffer.from(await response.arrayBuffer())\n\n try {\n await writeFile(cacheFile, Buffer.from(content))\n console.log(`Cached: ${source}`)\n } catch (cacheError) {\n console.warn(`Failed to cache: ${cacheError}`)\n }\n\n return { content, filePath: cacheFile }\n } catch (error) {\n return { error: `Error downloading from ${source}: ${error}` }\n }\n } else {\n try {\n console.log(`Loading from local path: ${source}`)\n const content = await readFile(source)\n return { content, filePath: source }\n } catch (error) {\n return { error: `Error loading from local path ${source}: ${error}` }\n }\n }\n }\n\n /**\n * Download and save a file to a specific target path\n */\n static async downloadToPath(source: string, targetPath: string): Promise<DownloadResult> {\n const isUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\")\n\n await mkdir(path.dirname(targetPath), { recursive: true })\n\n if (isUrl) {\n try {\n console.log(`Downloading from URL: ${source}`)\n const response = await fetch(source)\n if (!response.ok) {\n return { error: `Failed to fetch from ${source}: ${response.statusText}` }\n }\n const content = Buffer.from(await response.arrayBuffer())\n\n await writeFile(targetPath, Buffer.from(content))\n console.log(`Downloaded: ${source} -> ${targetPath}`)\n\n return { content, filePath: targetPath }\n } catch (error) {\n return { error: `Error downloading from ${source}: ${error}` }\n }\n } else {\n try {\n console.log(`Copying from local path: ${source}`)\n const content = await readFile(source)\n await writeFile(targetPath, Buffer.from(content))\n return { content, filePath: targetPath }\n } catch (error) {\n return { error: `Error copying from local path ${source}: ${error}` }\n }\n }\n }\n\n /**\n * Fetch multiple highlight queries and concatenate them\n */\n static async fetchHighlightQueries(sources: string[], cacheDir: string, filetype: string): Promise<string> {\n const queryPromises = sources.map((source) => this.fetchHighlightQuery(source, cacheDir, filetype))\n const queryResults = await Promise.all(queryPromises)\n\n const validQueries = queryResults.filter((query) => query.trim().length > 0)\n return validQueries.join(\"\\n\")\n }\n\n private static async fetchHighlightQuery(source: string, cacheDir: string, filetype: string): Promise<string> {\n const result = await this.downloadOrLoad(source, cacheDir, \"queries\", \".scm\", true, filetype)\n\n if (result.error) {\n console.error(`Error fetching highlight query from ${source}:`, result.error)\n return \"\"\n }\n\n if (result.content) {\n return new TextDecoder().decode(result.content)\n }\n\n return \"\"\n }\n}\n",
|
|
38
|
+
"import { singleton } from \"../singleton.js\"\nimport { TreeSitterClient } from \"./client.js\"\nimport type { TreeSitterClientOptions } from \"./types.js\"\nimport { getDataPaths } from \"../data-paths.js\"\n\nexport * from \"./client.js\"\nexport * from \"../tree-sitter-styled-text.js\"\nexport * from \"./types.js\"\nexport * from \"./resolve-ft.js\"\nexport type { UpdateOptions } from \"./assets/update.js\"\nexport { updateAssets } from \"./assets/update.js\"\n\nexport function getTreeSitterClient(): TreeSitterClient {\n const dataPathsManager = getDataPaths()\n const defaultOptions: TreeSitterClientOptions = {\n dataPath: dataPathsManager.globalDataPath,\n }\n\n return singleton(\"tree-sitter-client\", () => {\n const client = new TreeSitterClient(defaultOptions)\n\n dataPathsManager.on(\"paths:changed\", (paths) => {\n client.setDataPath(paths.globalDataPath)\n })\n\n return client\n })\n}\n",
|
|
39
|
+
"import type { Extmark } from \"./extmarks.js\"\n\nexport interface ExtmarksSnapshot {\n extmarks: Map<number, Extmark>\n nextId: number\n}\n\nexport class ExtmarksHistory {\n private undoStack: ExtmarksSnapshot[] = []\n private redoStack: ExtmarksSnapshot[] = []\n\n saveSnapshot(extmarks: Map<number, Extmark>, nextId: number): void {\n const snapshot: ExtmarksSnapshot = {\n extmarks: new Map(Array.from(extmarks.entries()).map(([id, extmark]) => [id, { ...extmark }])),\n nextId,\n }\n this.undoStack.push(snapshot)\n this.redoStack = []\n }\n\n undo(): ExtmarksSnapshot | null {\n if (this.undoStack.length === 0) return null\n return this.undoStack.pop()!\n }\n\n redo(): ExtmarksSnapshot | null {\n if (this.redoStack.length === 0) return null\n return this.redoStack.pop()!\n }\n\n pushRedo(snapshot: ExtmarksSnapshot): void {\n this.redoStack.push(snapshot)\n }\n\n pushUndo(snapshot: ExtmarksSnapshot): void {\n this.undoStack.push(snapshot)\n }\n\n clear(): void {\n this.undoStack = []\n this.redoStack = []\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0\n }\n}\n",
|
|
40
|
+
"import type { EditBuffer } from \"../edit-buffer.js\"\nimport type { EditorView } from \"../editor-view.js\"\nimport { ExtmarksHistory, type ExtmarksSnapshot } from \"./extmarks-history.js\"\n\nexport interface Extmark {\n id: number\n start: number // Display-width offset (including newlines), NOT JS string index\n end: number // Display-width offset (including newlines), NOT JS string index\n virtual: boolean\n styleId?: number\n priority?: number\n data?: any\n typeId: number\n}\n\nexport interface ExtmarkOptions {\n start: number // Display-width offset (including newlines), NOT JS string index\n end: number // Display-width offset (including newlines), NOT JS string index\n virtual?: boolean\n styleId?: number\n priority?: number\n data?: any\n typeId?: number\n metadata?: any\n}\n\n/**\n * WARNING: This is simulating extmarks in the edit buffer\n * and will move to a real native implementation in the future.\n * Use with caution.\n */\nexport class ExtmarksController {\n private editBuffer: EditBuffer\n private editorView: EditorView\n private extmarks = new Map<number, Extmark>()\n private extmarksByTypeId = new Map<number, Set<number>>()\n private metadata = new Map<number, any>()\n private nextId = 1\n private destroyed = false\n private history = new ExtmarksHistory()\n private typeNameToId = new Map<string, number>()\n private typeIdToName = new Map<number, string>()\n private nextTypeId = 1\n\n private originalMoveCursorLeft: typeof EditBuffer.prototype.moveCursorLeft\n private originalMoveCursorRight: typeof EditBuffer.prototype.moveCursorRight\n private originalSetCursorByOffset: typeof EditBuffer.prototype.setCursorByOffset\n private originalMoveUpVisual: typeof EditorView.prototype.moveUpVisual\n private originalMoveDownVisual: typeof EditorView.prototype.moveDownVisual\n private originalDeleteCharBackward: typeof EditBuffer.prototype.deleteCharBackward\n private originalDeleteChar: typeof EditBuffer.prototype.deleteChar\n private originalInsertText: typeof EditBuffer.prototype.insertText\n private originalInsertChar: typeof EditBuffer.prototype.insertChar\n private originalDeleteRange: typeof EditBuffer.prototype.deleteRange\n private originalSetText: typeof EditBuffer.prototype.setText\n private originalReplaceText: typeof EditBuffer.prototype.replaceText\n private originalClear: typeof EditBuffer.prototype.clear\n private originalNewLine: typeof EditBuffer.prototype.newLine\n private originalDeleteLine: typeof EditBuffer.prototype.deleteLine\n private originalEditorViewDeleteSelectedText: typeof EditorView.prototype.deleteSelectedText\n private originalUndo: typeof EditBuffer.prototype.undo\n private originalRedo: typeof EditBuffer.prototype.redo\n\n constructor(editBuffer: EditBuffer, editorView: EditorView) {\n this.editBuffer = editBuffer\n this.editorView = editorView\n\n this.originalMoveCursorLeft = editBuffer.moveCursorLeft.bind(editBuffer)\n this.originalMoveCursorRight = editBuffer.moveCursorRight.bind(editBuffer)\n this.originalSetCursorByOffset = editBuffer.setCursorByOffset.bind(editBuffer)\n this.originalMoveUpVisual = editorView.moveUpVisual.bind(editorView)\n this.originalMoveDownVisual = editorView.moveDownVisual.bind(editorView)\n this.originalDeleteCharBackward = editBuffer.deleteCharBackward.bind(editBuffer)\n this.originalDeleteChar = editBuffer.deleteChar.bind(editBuffer)\n this.originalInsertText = editBuffer.insertText.bind(editBuffer)\n this.originalInsertChar = editBuffer.insertChar.bind(editBuffer)\n this.originalDeleteRange = editBuffer.deleteRange.bind(editBuffer)\n this.originalSetText = editBuffer.setText.bind(editBuffer)\n this.originalReplaceText = editBuffer.replaceText.bind(editBuffer)\n this.originalClear = editBuffer.clear.bind(editBuffer)\n this.originalNewLine = editBuffer.newLine.bind(editBuffer)\n this.originalDeleteLine = editBuffer.deleteLine.bind(editBuffer)\n this.originalEditorViewDeleteSelectedText = editorView.deleteSelectedText.bind(editorView)\n this.originalUndo = editBuffer.undo.bind(editBuffer)\n this.originalRedo = editBuffer.redo.bind(editBuffer)\n\n this.wrapCursorMovement()\n this.wrapDeletion()\n this.wrapInsertion()\n this.wrapEditorViewDeleteSelectedText()\n this.wrapUndoRedo()\n this.setupContentChangeListener()\n }\n\n private wrapCursorMovement(): void {\n this.editBuffer.moveCursorLeft = (): void => {\n if (this.destroyed) {\n this.originalMoveCursorLeft()\n return\n }\n\n const currentOffset = this.editorView.getVisualCursor().offset\n const hasSelection = this.editorView.hasSelection()\n\n if (hasSelection) {\n this.originalMoveCursorLeft()\n return\n }\n\n const targetOffset = currentOffset - 1\n if (targetOffset < 0) {\n this.originalMoveCursorLeft()\n return\n }\n\n const virtualExtmark = this.findVirtualExtmarkContaining(targetOffset)\n if (virtualExtmark && currentOffset >= virtualExtmark.end) {\n this.editBuffer.setCursorByOffset(virtualExtmark.start - 1)\n return\n }\n\n this.originalMoveCursorLeft()\n }\n\n this.editBuffer.moveCursorRight = (): void => {\n if (this.destroyed) {\n this.originalMoveCursorRight()\n return\n }\n\n const currentOffset = this.editorView.getVisualCursor().offset\n const hasSelection = this.editorView.hasSelection()\n\n if (hasSelection) {\n this.originalMoveCursorRight()\n return\n }\n\n const targetOffset = currentOffset + 1\n const textLength = this.editBuffer.getText().length\n\n if (targetOffset > textLength) {\n this.originalMoveCursorRight()\n return\n }\n\n const virtualExtmark = this.findVirtualExtmarkContaining(targetOffset)\n if (virtualExtmark && currentOffset <= virtualExtmark.start) {\n this.editBuffer.setCursorByOffset(virtualExtmark.end)\n return\n }\n\n this.originalMoveCursorRight()\n }\n\n this.editorView.moveUpVisual = (): void => {\n if (this.destroyed) {\n this.originalMoveUpVisual()\n return\n }\n\n const hasSelection = this.editorView.hasSelection()\n\n if (hasSelection) {\n this.originalMoveUpVisual()\n return\n }\n\n const currentOffset = this.editorView.getVisualCursor().offset\n this.originalMoveUpVisual()\n const newOffset = this.editorView.getVisualCursor().offset\n\n const virtualExtmark = this.findVirtualExtmarkContaining(newOffset)\n if (virtualExtmark) {\n const distanceToStart = newOffset - virtualExtmark.start\n const distanceToEnd = virtualExtmark.end - newOffset\n\n if (distanceToStart < distanceToEnd) {\n this.editorView.setCursorByOffset(virtualExtmark.start - 1)\n } else {\n this.editorView.setCursorByOffset(virtualExtmark.end)\n }\n }\n }\n\n this.editorView.moveDownVisual = (): void => {\n if (this.destroyed) {\n this.originalMoveDownVisual()\n return\n }\n\n const hasSelection = this.editorView.hasSelection()\n\n if (hasSelection) {\n this.originalMoveDownVisual()\n return\n }\n\n const currentOffset = this.editorView.getVisualCursor().offset\n this.originalMoveDownVisual()\n const newOffset = this.editorView.getVisualCursor().offset\n\n const virtualExtmark = this.findVirtualExtmarkContaining(newOffset)\n if (virtualExtmark) {\n const distanceToStart = newOffset - virtualExtmark.start\n const distanceToEnd = virtualExtmark.end - newOffset\n\n if (distanceToStart < distanceToEnd) {\n const adjustedOffset = virtualExtmark.start - 1\n const targetOffset = adjustedOffset <= currentOffset ? virtualExtmark.end : adjustedOffset\n this.editorView.setCursorByOffset(targetOffset)\n } else {\n this.editorView.setCursorByOffset(virtualExtmark.end)\n }\n }\n }\n\n this.editBuffer.setCursorByOffset = (offset: number): void => {\n if (this.destroyed) {\n this.originalSetCursorByOffset(offset)\n return\n }\n\n const currentOffset = this.editorView.getVisualCursor().offset\n const hasSelection = this.editorView.hasSelection()\n\n if (hasSelection) {\n this.originalSetCursorByOffset(offset)\n return\n }\n\n const movingForward = offset > currentOffset\n\n if (movingForward) {\n const virtualExtmark = this.findVirtualExtmarkContaining(offset)\n if (virtualExtmark && currentOffset <= virtualExtmark.start) {\n this.originalSetCursorByOffset(virtualExtmark.end)\n return\n }\n } else {\n for (const extmark of this.extmarks.values()) {\n if (extmark.virtual && currentOffset >= extmark.end && offset < extmark.end && offset >= extmark.start) {\n this.originalSetCursorByOffset(extmark.start - 1)\n return\n }\n }\n }\n\n this.originalSetCursorByOffset(offset)\n }\n }\n\n private wrapDeletion(): void {\n this.editBuffer.deleteCharBackward = (): void => {\n if (this.destroyed) {\n this.originalDeleteCharBackward()\n return\n }\n\n this.saveSnapshot()\n\n const currentOffset = this.editorView.getVisualCursor().offset\n const hadSelection = this.editorView.hasSelection()\n\n if (currentOffset === 0) {\n this.originalDeleteCharBackward()\n return\n }\n\n if (hadSelection) {\n this.originalDeleteCharBackward()\n return\n }\n\n const targetOffset = currentOffset - 1\n const virtualExtmark = this.findVirtualExtmarkContaining(targetOffset)\n\n if (virtualExtmark && currentOffset === virtualExtmark.end) {\n const startCursor = this.offsetToPosition(virtualExtmark.start)\n const endCursor = this.offsetToPosition(virtualExtmark.end)\n const deleteOffset = virtualExtmark.start\n const deleteLength = virtualExtmark.end - virtualExtmark.start\n\n this.deleteExtmarkById(virtualExtmark.id)\n\n this.originalDeleteRange(startCursor.row, startCursor.col, endCursor.row, endCursor.col)\n this.adjustExtmarksAfterDeletion(deleteOffset, deleteLength)\n\n this.updateHighlights()\n\n return\n }\n\n this.originalDeleteCharBackward()\n this.adjustExtmarksAfterDeletion(targetOffset, 1)\n }\n\n this.editBuffer.deleteChar = (): void => {\n if (this.destroyed) {\n this.originalDeleteChar()\n return\n }\n\n this.saveSnapshot()\n\n const currentOffset = this.editorView.getVisualCursor().offset\n const textLength = this.editBuffer.getText().length\n const hadSelection = this.editorView.hasSelection()\n\n if (currentOffset >= textLength) {\n this.originalDeleteChar()\n return\n }\n\n if (hadSelection) {\n this.originalDeleteChar()\n return\n }\n\n const targetOffset = currentOffset\n const virtualExtmark = this.findVirtualExtmarkContaining(targetOffset)\n\n if (virtualExtmark && currentOffset === virtualExtmark.start) {\n const startCursor = this.offsetToPosition(virtualExtmark.start)\n const endCursor = this.offsetToPosition(virtualExtmark.end)\n const deleteOffset = virtualExtmark.start\n const deleteLength = virtualExtmark.end - virtualExtmark.start\n\n this.deleteExtmarkById(virtualExtmark.id)\n\n this.originalDeleteRange(startCursor.row, startCursor.col, endCursor.row, endCursor.col)\n this.adjustExtmarksAfterDeletion(deleteOffset, deleteLength)\n\n this.updateHighlights()\n\n return\n }\n\n this.originalDeleteChar()\n this.adjustExtmarksAfterDeletion(targetOffset, 1)\n }\n\n this.editBuffer.deleteRange = (startLine: number, startCol: number, endLine: number, endCol: number): void => {\n if (this.destroyed) {\n this.originalDeleteRange(startLine, startCol, endLine, endCol)\n return\n }\n\n this.saveSnapshot()\n\n const startOffset = this.positionToOffset(startLine, startCol)\n const endOffset = this.positionToOffset(endLine, endCol)\n const length = endOffset - startOffset\n\n this.originalDeleteRange(startLine, startCol, endLine, endCol)\n this.adjustExtmarksAfterDeletion(startOffset, length)\n }\n\n this.editBuffer.deleteLine = (): void => {\n if (this.destroyed) {\n this.originalDeleteLine()\n return\n }\n\n this.saveSnapshot()\n\n const text = this.editBuffer.getText()\n const currentOffset = this.editorView.getVisualCursor().offset\n\n let lineStart = 0\n for (let i = currentOffset - 1; i >= 0; i--) {\n if (text[i] === \"\\n\") {\n lineStart = i + 1\n break\n }\n }\n\n let lineEnd = text.length\n for (let i = currentOffset; i < text.length; i++) {\n if (text[i] === \"\\n\") {\n lineEnd = i + 1\n break\n }\n }\n\n const deleteLength = lineEnd - lineStart\n\n this.originalDeleteLine()\n this.adjustExtmarksAfterDeletion(lineStart, deleteLength)\n }\n }\n\n private wrapInsertion(): void {\n this.editBuffer.insertText = (text: string): void => {\n if (this.destroyed) {\n this.originalInsertText(text)\n return\n }\n\n this.saveSnapshot()\n\n const currentOffset = this.editorView.getVisualCursor().offset\n this.originalInsertText(text)\n this.adjustExtmarksAfterInsertion(currentOffset, text.length)\n }\n\n this.editBuffer.insertChar = (char: string): void => {\n if (this.destroyed) {\n this.originalInsertChar(char)\n return\n }\n\n this.saveSnapshot()\n\n const currentOffset = this.editorView.getVisualCursor().offset\n this.originalInsertChar(char)\n this.adjustExtmarksAfterInsertion(currentOffset, 1)\n }\n\n this.editBuffer.setText = (text: string): void => {\n if (this.destroyed) {\n this.originalSetText(text)\n return\n }\n\n this.clear()\n this.originalSetText(text)\n }\n\n this.editBuffer.replaceText = (text: string): void => {\n if (this.destroyed) {\n this.originalReplaceText(text)\n return\n }\n\n this.saveSnapshot()\n this.clear()\n this.originalReplaceText(text)\n }\n\n this.editBuffer.clear = (): void => {\n if (this.destroyed) {\n this.originalClear()\n return\n }\n\n this.saveSnapshot()\n\n this.clear()\n this.originalClear()\n }\n\n this.editBuffer.newLine = (): void => {\n if (this.destroyed) {\n this.originalNewLine()\n return\n }\n\n this.saveSnapshot()\n\n const currentOffset = this.editorView.getVisualCursor().offset\n this.originalNewLine()\n this.adjustExtmarksAfterInsertion(currentOffset, 1)\n }\n }\n\n private wrapEditorViewDeleteSelectedText(): void {\n this.editorView.deleteSelectedText = (): void => {\n if (this.destroyed) {\n this.originalEditorViewDeleteSelectedText()\n return\n }\n\n this.saveSnapshot()\n\n const selection = this.editorView.getSelection()\n if (!selection) {\n this.originalEditorViewDeleteSelectedText()\n return\n }\n\n const deleteOffset = Math.min(selection.start, selection.end)\n const deleteLength = Math.abs(selection.end - selection.start)\n\n this.originalEditorViewDeleteSelectedText()\n\n if (deleteLength > 0) {\n this.adjustExtmarksAfterDeletion(deleteOffset, deleteLength)\n }\n }\n }\n\n private setupContentChangeListener(): void {\n this.editBuffer.on(\"content-changed\", () => {\n if (this.destroyed) return\n this.updateHighlights()\n })\n }\n\n private deleteExtmarkById(id: number): void {\n const extmark = this.extmarks.get(id)\n if (extmark) {\n this.extmarks.delete(id)\n this.extmarksByTypeId.get(extmark.typeId)?.delete(id)\n this.metadata.delete(id)\n }\n }\n\n private findVirtualExtmarkContaining(offset: number): Extmark | null {\n for (const extmark of this.extmarks.values()) {\n if (extmark.virtual && offset >= extmark.start && offset < extmark.end) {\n return extmark\n }\n }\n return null\n }\n\n private adjustExtmarksAfterInsertion(insertOffset: number, length: number): void {\n for (const extmark of this.extmarks.values()) {\n if (extmark.start >= insertOffset) {\n extmark.start += length\n extmark.end += length\n } else if (extmark.end > insertOffset) {\n extmark.end += length\n }\n }\n this.updateHighlights()\n }\n\n public adjustExtmarksAfterDeletion(deleteOffset: number, length: number): void {\n const toDelete: number[] = []\n\n for (const extmark of this.extmarks.values()) {\n if (extmark.end <= deleteOffset) {\n continue\n }\n\n if (extmark.start >= deleteOffset + length) {\n extmark.start -= length\n extmark.end -= length\n } else if (extmark.start >= deleteOffset && extmark.end <= deleteOffset + length) {\n toDelete.push(extmark.id)\n } else if (extmark.start < deleteOffset && extmark.end > deleteOffset + length) {\n extmark.end -= length\n } else if (extmark.start < deleteOffset && extmark.end > deleteOffset) {\n extmark.end -= Math.min(extmark.end, deleteOffset + length) - deleteOffset\n } else if (extmark.start < deleteOffset + length && extmark.end > deleteOffset + length) {\n const overlap = deleteOffset + length - extmark.start\n extmark.start = deleteOffset\n extmark.end -= length\n }\n }\n\n for (const id of toDelete) {\n this.deleteExtmarkById(id)\n }\n\n this.updateHighlights()\n }\n\n private offsetToPosition(offset: number): { row: number; col: number } {\n const result = this.editBuffer.offsetToPosition(offset)\n if (!result) {\n return { row: 0, col: 0 }\n }\n return result\n }\n\n private positionToOffset(row: number, col: number): number {\n return this.editBuffer.positionToOffset(row, col)\n }\n\n private updateHighlights(): void {\n this.editBuffer.clearAllHighlights()\n\n for (const extmark of this.extmarks.values()) {\n if (extmark.styleId !== undefined) {\n // extmark.start/end are display-width offsets including newlines (from cursor operations)\n // addHighlightByCharRange expects display-width offsets excluding newlines\n // So we need to subtract the number of newlines before each position\n const startWithoutNewlines = this.offsetExcludingNewlines(extmark.start)\n const endWithoutNewlines = this.offsetExcludingNewlines(extmark.end)\n\n this.editBuffer.addHighlightByCharRange({\n start: startWithoutNewlines,\n end: endWithoutNewlines,\n styleId: extmark.styleId,\n priority: extmark.priority ?? 0,\n hlRef: extmark.id,\n })\n }\n }\n }\n\n private offsetExcludingNewlines(offset: number): number {\n // offset is a display-width offset from the start of the buffer (includes newlines)\n // We need to convert to display-width excluding newlines\n // This means: subtract 1 for each newline encountered before this offset\n const text = this.editBuffer.getText()\n let displayWidthSoFar = 0\n let newlineCount = 0\n\n // Walk through the text and calculate display widths\n let i = 0\n while (i < text.length && displayWidthSoFar < offset) {\n if (text[i] === \"\\n\") {\n displayWidthSoFar++ // newline counts as width 1 in cursor offset\n newlineCount++\n i++\n } else {\n // Find the next newline or end of string\n let j = i\n while (j < text.length && text[j] !== \"\\n\") {\n j++\n }\n const chunk = text.substring(i, j)\n const chunkWidth = Bun.stringWidth(chunk)\n\n if (displayWidthSoFar + chunkWidth < offset) {\n // Entire chunk fits before offset\n displayWidthSoFar += chunkWidth\n i = j\n } else {\n // Offset is within this chunk - need to find exact position\n // Walk character by character\n for (let k = i; k < j && displayWidthSoFar < offset; k++) {\n const charWidth = Bun.stringWidth(text[k])\n displayWidthSoFar += charWidth\n }\n break\n }\n }\n }\n\n return offset - newlineCount\n }\n\n public create(options: ExtmarkOptions): number {\n if (this.destroyed) {\n throw new Error(\"ExtmarksController is destroyed\")\n }\n\n const id = this.nextId++\n const typeId = options.typeId ?? 0\n const extmark: Extmark = {\n id,\n start: options.start,\n end: options.end,\n virtual: options.virtual ?? false,\n styleId: options.styleId,\n priority: options.priority,\n data: options.data,\n typeId,\n }\n\n this.extmarks.set(id, extmark)\n\n if (!this.extmarksByTypeId.has(typeId)) {\n this.extmarksByTypeId.set(typeId, new Set())\n }\n this.extmarksByTypeId.get(typeId)!.add(id)\n\n if (options.metadata !== undefined) {\n this.metadata.set(id, options.metadata)\n }\n\n this.updateHighlights()\n\n return id\n }\n\n public delete(id: number): boolean {\n if (this.destroyed) {\n throw new Error(\"ExtmarksController is destroyed\")\n }\n\n const extmark = this.extmarks.get(id)\n if (!extmark) return false\n\n this.deleteExtmarkById(id)\n this.updateHighlights()\n\n return true\n }\n\n public get(id: number): Extmark | null {\n if (this.destroyed) return null\n return this.extmarks.get(id) ?? null\n }\n\n public getAll(): Extmark[] {\n if (this.destroyed) return []\n return Array.from(this.extmarks.values())\n }\n\n public getVirtual(): Extmark[] {\n if (this.destroyed) return []\n return Array.from(this.extmarks.values()).filter((e) => e.virtual)\n }\n\n public getAtOffset(offset: number): Extmark[] {\n if (this.destroyed) return []\n return Array.from(this.extmarks.values()).filter((e) => offset >= e.start && offset < e.end)\n }\n\n public getAllForTypeId(typeId: number): Extmark[] {\n if (this.destroyed) return []\n const ids = this.extmarksByTypeId.get(typeId)\n if (!ids) return []\n return Array.from(ids)\n .map((id) => this.extmarks.get(id))\n .filter((e): e is Extmark => e !== undefined)\n }\n\n public clear(): void {\n if (this.destroyed) return\n\n this.extmarks.clear()\n this.extmarksByTypeId.clear()\n this.metadata.clear()\n this.updateHighlights()\n }\n\n private saveSnapshot(): void {\n this.history.saveSnapshot(this.extmarks, this.nextId)\n }\n\n private restoreSnapshot(snapshot: ExtmarksSnapshot): void {\n this.extmarks = new Map(Array.from(snapshot.extmarks.entries()).map(([id, extmark]) => [id, { ...extmark }]))\n this.nextId = snapshot.nextId\n this.updateHighlights()\n }\n\n private wrapUndoRedo(): void {\n this.editBuffer.undo = (): string | null => {\n if (this.destroyed) {\n return this.originalUndo()\n }\n\n if (!this.history.canUndo()) {\n return this.originalUndo()\n }\n\n const currentSnapshot: ExtmarksSnapshot = {\n extmarks: new Map(Array.from(this.extmarks.entries()).map(([id, extmark]) => [id, { ...extmark }])),\n nextId: this.nextId,\n }\n this.history.pushRedo(currentSnapshot)\n\n const snapshot = this.history.undo()!\n this.restoreSnapshot(snapshot)\n\n return this.originalUndo()\n }\n\n this.editBuffer.redo = (): string | null => {\n if (this.destroyed) {\n return this.originalRedo()\n }\n\n if (!this.history.canRedo()) {\n return this.originalRedo()\n }\n\n const currentSnapshot: ExtmarksSnapshot = {\n extmarks: new Map(Array.from(this.extmarks.entries()).map(([id, extmark]) => [id, { ...extmark }])),\n nextId: this.nextId,\n }\n this.history.pushUndo(currentSnapshot)\n\n const snapshot = this.history.redo()!\n this.restoreSnapshot(snapshot)\n\n return this.originalRedo()\n }\n }\n\n public registerType(typeName: string): number {\n if (this.destroyed) {\n throw new Error(\"ExtmarksController is destroyed\")\n }\n\n const existing = this.typeNameToId.get(typeName)\n if (existing !== undefined) {\n return existing\n }\n\n const typeId = this.nextTypeId++\n this.typeNameToId.set(typeName, typeId)\n this.typeIdToName.set(typeId, typeName)\n return typeId\n }\n\n public getTypeId(typeName: string): number | null {\n if (this.destroyed) return null\n return this.typeNameToId.get(typeName) ?? null\n }\n\n public getTypeName(typeId: number): string | null {\n if (this.destroyed) return null\n return this.typeIdToName.get(typeId) ?? null\n }\n\n public getMetadataFor(extmarkId: number): any {\n if (this.destroyed) return undefined\n return this.metadata.get(extmarkId)\n }\n\n public destroy(): void {\n if (this.destroyed) return\n\n this.editBuffer.moveCursorLeft = this.originalMoveCursorLeft\n this.editBuffer.moveCursorRight = this.originalMoveCursorRight\n this.editBuffer.setCursorByOffset = this.originalSetCursorByOffset\n this.editorView.moveUpVisual = this.originalMoveUpVisual\n this.editorView.moveDownVisual = this.originalMoveDownVisual\n this.editBuffer.deleteCharBackward = this.originalDeleteCharBackward\n this.editBuffer.deleteChar = this.originalDeleteChar\n this.editBuffer.insertText = this.originalInsertText\n this.editBuffer.insertChar = this.originalInsertChar\n this.editBuffer.deleteRange = this.originalDeleteRange\n this.editBuffer.setText = this.originalSetText\n this.editBuffer.replaceText = this.originalReplaceText\n this.editBuffer.clear = this.originalClear\n this.editBuffer.newLine = this.originalNewLine\n this.editBuffer.deleteLine = this.originalDeleteLine\n this.editorView.deleteSelectedText = this.originalEditorViewDeleteSelectedText\n this.editBuffer.undo = this.originalUndo\n this.editBuffer.redo = this.originalRedo\n\n this.extmarks.clear()\n this.extmarksByTypeId.clear()\n this.metadata.clear()\n this.typeNameToId.clear()\n this.typeIdToName.clear()\n this.history.clear()\n this.destroyed = true\n }\n}\n\nexport function createExtmarksController(editBuffer: EditBuffer, editorView: EditorView): ExtmarksController {\n return new ExtmarksController(editBuffer, editorView)\n}\n",
|
|
41
|
+
"import { RGBA, DEFAULT_BACKGROUND_RGB, DEFAULT_FOREGROUND_RGB, ansi256IndexToRgb } from \"./RGBA.js\"\nimport { SystemClock, type Clock, type TimerHandle } from \"./clock.js\"\n\ntype Hex = string | null\n\nconst SYSTEM_CLOCK = new SystemClock()\n\nconst OSC4_RESPONSE =\n /\\x1b]4;(\\d+);(?:(?:rgb:)([0-9a-fA-F]+)\\/([0-9a-fA-F]+)\\/([0-9a-fA-F]+)|#([0-9a-fA-F]{6}))(?:\\x07|\\x1b\\\\)/g\n\nconst OSC_SPECIAL_RESPONSE =\n /\\x1b](\\d+);(?:(?:rgb:)([0-9a-fA-F]+)\\/([0-9a-fA-F]+)\\/([0-9a-fA-F]+)|#([0-9a-fA-F]{6}))(?:\\x07|\\x1b\\\\)/g\n\nexport type WriteFunction = (data: string | Buffer) => boolean\n\nexport interface TerminalColors {\n palette: Hex[]\n defaultForeground: Hex\n defaultBackground: Hex\n cursorColor: Hex\n mouseForeground: Hex\n mouseBackground: Hex\n tekForeground: Hex\n tekBackground: Hex\n highlightBackground: Hex\n highlightForeground: Hex\n}\n\nexport interface GetPaletteOptions {\n timeout?: number\n size?: number\n}\n\nexport interface TerminalPaletteDetector {\n detect(options?: GetPaletteOptions): Promise<TerminalColors>\n detectOSCSupport(timeoutMs?: number): Promise<boolean>\n cleanup(): void\n}\n\nexport interface NormalizedTerminalPalette {\n palette: RGBA[]\n defaultForeground: RGBA\n defaultBackground: RGBA\n}\n\nexport type OscSubscriptionSource = {\n subscribeOsc(handler: (sequence: string) => void): () => void\n}\n\nfunction scaleComponent(comp: string): string {\n const val = parseInt(comp, 16)\n const maxIn = (1 << (4 * comp.length)) - 1\n return Math.round((val / maxIn) * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nfunction toHex(r?: string, g?: string, b?: string, hex6?: string): string {\n if (hex6) return `#${hex6.toLowerCase()}`\n if (r && g && b) return `#${scaleComponent(r)}${scaleComponent(g)}${scaleComponent(b)}`\n return \"#000000\"\n}\n\n/**\n * Wrap OSC sequence for tmux passthrough\n * tmux requires DCS sequences to pass OSC to the underlying terminal\n * Format: ESC P tmux; ESC <OSC_SEQUENCE> ESC \\\n */\nfunction wrapForTmux(osc: string): string {\n // Replace ESC with ESC ESC for tmux (escape the escape)\n const escaped = osc.replace(/\\x1b/g, \"\\x1b\\x1b\")\n return `\\x1bPtmux;${escaped}\\x1b\\\\`\n}\n\nexport class TerminalPalette implements TerminalPaletteDetector {\n private stdin: NodeJS.ReadStream\n private stdout: NodeJS.WriteStream\n private writeFn: WriteFunction\n private activeQuerySessions: Array<() => void> = []\n private inLegacyTmux: boolean\n private oscSource?: OscSubscriptionSource\n private readonly clock: Clock\n\n constructor(\n stdin: NodeJS.ReadStream,\n stdout: NodeJS.WriteStream,\n writeFn?: WriteFunction,\n isLegacyTmux?: boolean,\n oscSource?: OscSubscriptionSource,\n clock?: Clock,\n ) {\n this.stdin = stdin\n this.stdout = stdout\n this.writeFn = writeFn || ((data: string | Buffer) => stdout.write(data))\n this.inLegacyTmux = isLegacyTmux ?? false\n this.oscSource = oscSource\n this.clock = clock ?? SYSTEM_CLOCK\n }\n\n /**\n * Write an OSC sequence, wrapping for tmux if needed\n */\n private writeOsc(osc: string): boolean {\n const data = this.inLegacyTmux ? wrapForTmux(osc) : osc\n return this.writeFn(data)\n }\n\n cleanup(): void {\n for (const cleanupSession of [...this.activeQuerySessions]) {\n cleanupSession()\n }\n this.activeQuerySessions = []\n }\n\n private subscribeInput(handler: (chunk: string | Buffer) => void): () => void {\n if (this.oscSource) {\n return this.oscSource.subscribeOsc((sequence) => {\n handler(sequence)\n })\n }\n\n this.stdin.on(\"data\", handler)\n return () => {\n this.stdin.removeListener(\"data\", handler)\n }\n }\n\n private createQuerySession() {\n const timers = new Set<TimerHandle>()\n const subscriptions = new Set<() => void>()\n let closed = false\n\n const cleanup = () => {\n if (closed) return\n closed = true\n\n for (const timer of timers) {\n this.clock.clearTimeout(timer)\n }\n timers.clear()\n\n for (const unsubscribe of subscriptions) {\n unsubscribe()\n }\n subscriptions.clear()\n\n const idx = this.activeQuerySessions.indexOf(cleanup)\n if (idx !== -1) this.activeQuerySessions.splice(idx, 1)\n }\n\n this.activeQuerySessions.push(cleanup)\n\n return {\n setTimer: (fn: () => void, ms: number): TimerHandle => {\n const timer = this.clock.setTimeout(fn, ms)\n timers.add(timer)\n return timer\n },\n resetTimer: (existing: TimerHandle | null, fn: () => void, ms: number): TimerHandle => {\n if (existing) {\n this.clock.clearTimeout(existing)\n timers.delete(existing)\n }\n\n const timer = this.clock.setTimeout(fn, ms)\n timers.add(timer)\n return timer\n },\n subscribeInput: (handler: (chunk: string | Buffer) => void): (() => void) => {\n const unsubscribe = this.subscribeInput(handler)\n subscriptions.add(unsubscribe)\n return () => {\n if (!subscriptions.has(unsubscribe)) return\n subscriptions.delete(unsubscribe)\n unsubscribe()\n }\n },\n cleanup,\n }\n }\n\n async detectOSCSupport(timeoutMs = 300): Promise<boolean> {\n const out = this.stdout\n\n if (!out.isTTY || !this.stdin.isTTY) return false\n\n return new Promise<boolean>((resolve) => {\n const session = this.createQuerySession()\n let buffer = \"\"\n let settled = false\n\n const finish = (supported: boolean) => {\n if (settled) return\n settled = true\n session.cleanup()\n resolve(supported)\n }\n\n const onData = (chunk: string | Buffer) => {\n buffer += chunk.toString()\n // Reset regex lastIndex before testing due to global flag\n OSC4_RESPONSE.lastIndex = 0\n if (OSC4_RESPONSE.test(buffer)) {\n finish(true)\n }\n }\n\n session.setTimer(() => {\n finish(false)\n }, timeoutMs)\n session.subscribeInput(onData)\n this.writeOsc(\"\\x1b]4;0;?\\x07\")\n })\n }\n\n private async queryPalette(indices: number[], timeoutMs = 1200): Promise<Map<number, Hex>> {\n const out = this.stdout\n const results = new Map<number, Hex>()\n indices.forEach((i) => results.set(i, null))\n\n if (!out.isTTY || !this.stdin.isTTY) {\n return results\n }\n\n return new Promise<Map<number, Hex>>((resolve) => {\n const session = this.createQuerySession()\n let buffer = \"\"\n let idleTimer: TimerHandle | null = null\n let settled = false\n\n const finish = () => {\n if (settled) return\n settled = true\n session.cleanup()\n resolve(results)\n }\n\n const onData = (chunk: string | Buffer) => {\n buffer += chunk.toString()\n\n let m: RegExpExecArray | null\n OSC4_RESPONSE.lastIndex = 0\n while ((m = OSC4_RESPONSE.exec(buffer))) {\n const idx = parseInt(m[1], 10)\n if (results.has(idx)) results.set(idx, toHex(m[2], m[3], m[4], m[5]))\n }\n\n if (buffer.length > 8192) buffer = buffer.slice(-4096)\n\n const done = [...results.values()].filter((v) => v !== null).length\n if (done === results.size) {\n finish()\n return\n }\n\n idleTimer = session.resetTimer(idleTimer, finish, 150)\n }\n\n session.setTimer(finish, timeoutMs)\n session.subscribeInput(onData)\n this.writeOsc(indices.map((i) => `\\x1b]4;${i};?\\x07`).join(\"\"))\n })\n }\n\n private async querySpecialColors(timeoutMs = 1200): Promise<Record<number, Hex>> {\n const out = this.stdout\n const results: Record<number, Hex> = {\n 10: null,\n 11: null,\n 12: null,\n 13: null,\n 14: null,\n 15: null,\n 16: null,\n 17: null,\n 19: null,\n }\n\n if (!out.isTTY || !this.stdin.isTTY) {\n return results\n }\n\n return new Promise<Record<number, Hex>>((resolve) => {\n const session = this.createQuerySession()\n let buffer = \"\"\n let idleTimer: TimerHandle | null = null\n let settled = false\n\n const finish = () => {\n if (settled) return\n settled = true\n session.cleanup()\n resolve(results)\n }\n\n const onData = (chunk: string | Buffer) => {\n buffer += chunk.toString()\n let updated = false\n\n let m: RegExpExecArray | null\n OSC_SPECIAL_RESPONSE.lastIndex = 0\n while ((m = OSC_SPECIAL_RESPONSE.exec(buffer))) {\n const idx = parseInt(m[1], 10)\n if (idx in results) {\n results[idx] = toHex(m[2], m[3], m[4], m[5])\n updated = true\n }\n }\n\n if (buffer.length > 8192) buffer = buffer.slice(-4096)\n\n const done = Object.values(results).filter((v) => v !== null).length\n if (done === Object.keys(results).length) {\n finish()\n return\n }\n\n if (!updated) return\n\n idleTimer = session.resetTimer(idleTimer, finish, 150)\n }\n\n session.setTimer(finish, timeoutMs)\n session.subscribeInput(onData)\n this.writeOsc(\n [\n \"\\x1b]10;?\\x07\",\n \"\\x1b]11;?\\x07\",\n \"\\x1b]12;?\\x07\",\n \"\\x1b]13;?\\x07\",\n \"\\x1b]14;?\\x07\",\n \"\\x1b]15;?\\x07\",\n \"\\x1b]16;?\\x07\",\n \"\\x1b]17;?\\x07\",\n \"\\x1b]19;?\\x07\",\n ].join(\"\"),\n )\n })\n }\n\n async detect(options?: GetPaletteOptions): Promise<TerminalColors> {\n const { timeout = 5000, size = 16 } = options || {}\n const supported = await this.detectOSCSupport()\n\n if (!supported) {\n return {\n palette: Array(size).fill(null),\n defaultForeground: null,\n defaultBackground: null,\n cursorColor: null,\n mouseForeground: null,\n mouseBackground: null,\n tekForeground: null,\n tekBackground: null,\n highlightBackground: null,\n highlightForeground: null,\n }\n }\n\n const indicesToQuery = [...Array(size).keys()]\n const [paletteResults, specialColors] = await Promise.all([\n this.queryPalette(indicesToQuery, timeout),\n this.querySpecialColors(timeout),\n ])\n\n return {\n palette: [...Array(size).keys()].map((i) => paletteResults.get(i) ?? null),\n defaultForeground: specialColors[10],\n defaultBackground: specialColors[11],\n cursorColor: specialColors[12],\n mouseForeground: specialColors[13],\n mouseBackground: specialColors[14],\n tekForeground: specialColors[15],\n tekBackground: specialColors[16],\n highlightBackground: specialColors[17],\n highlightForeground: specialColors[19],\n }\n }\n}\n\nexport function createTerminalPalette(\n stdin: NodeJS.ReadStream,\n stdout: NodeJS.WriteStream,\n writeFn?: WriteFunction,\n isLegacyTmux?: boolean,\n oscSource?: OscSubscriptionSource,\n clock?: Clock,\n): TerminalPaletteDetector {\n return new TerminalPalette(stdin, stdout, writeFn, isLegacyTmux, oscSource, clock)\n}\n\nconst DEFAULT_FOREGROUND_FALLBACK = RGBA.fromInts(...DEFAULT_FOREGROUND_RGB)\nconst DEFAULT_BACKGROUND_FALLBACK = RGBA.fromInts(...DEFAULT_BACKGROUND_RGB)\n\nlet fallbackAnsi256Palette: RGBA[] | null = null\n\nfunction getFallbackAnsi256Palette(): readonly RGBA[] {\n if (!fallbackAnsi256Palette) {\n fallbackAnsi256Palette = Array.from({ length: 256 }, (_, index) => {\n const [r, g, b] = ansi256IndexToRgb(index)\n return RGBA.fromInts(r, g, b)\n })\n }\n\n return fallbackAnsi256Palette\n}\n\nexport function normalizeTerminalPalette(colors?: TerminalColors | null): NormalizedTerminalPalette {\n const fallbackPalette = getFallbackAnsi256Palette()\n\n return {\n palette: Array.from({ length: 256 }, (_, index) => {\n const detected = colors?.palette[index]\n return detected ? RGBA.fromHex(detected) : RGBA.clone(fallbackPalette[index])\n }),\n defaultForeground: colors?.defaultForeground\n ? RGBA.fromHex(colors.defaultForeground)\n : RGBA.clone(DEFAULT_FOREGROUND_FALLBACK),\n defaultBackground: colors?.defaultBackground\n ? RGBA.fromHex(colors.defaultBackground)\n : RGBA.clone(DEFAULT_BACKGROUND_FALLBACK),\n }\n}\n\nexport function buildTerminalPaletteSignature(colors?: TerminalColors | null): string {\n const normalized = normalizeTerminalPalette(colors)\n const paletteSignature = normalized.palette.map((color) => color.toInts().join(\",\")).join(\";\")\n\n return [\n paletteSignature,\n normalized.defaultForeground.toInts().join(\",\"),\n normalized.defaultBackground.toInts().join(\",\"),\n ].join(\"|\")\n}\n",
|
|
42
|
+
"export type PasteKind = \"text\" | \"binary\" | \"unknown\"\n\nexport interface PasteMetadata {\n mimeType?: string\n kind?: PasteKind\n}\n\nconst PASTE_TEXT_DECODER = new TextDecoder()\n\nexport function decodePasteBytes(bytes: Uint8Array): string {\n return PASTE_TEXT_DECODER.decode(bytes)\n}\n\nexport function stripAnsiSequences(text: string): string {\n return Bun.stripANSI(text)\n}\n",
|
|
43
|
+
"import type { TextChunk } from \"../text-buffer.js\"\nimport type { SimpleHighlight } from \"./tree-sitter/types.js\"\n\nconst URL_SCOPES = [\"markup.link.url\", \"string.special.url\"]\n\nexport function detectLinks(\n chunks: TextChunk[],\n context: { content: string; highlights: SimpleHighlight[] },\n): TextChunk[] {\n const content = context.content\n const highlights = context.highlights\n\n const ranges: Array<{ start: number; end: number; url: string }> = []\n\n for (let i = 0; i < highlights.length; i++) {\n const [start, end, group] = highlights[i]\n if (!URL_SCOPES.includes(group)) continue\n\n const url = content.slice(start, end)\n ranges.push({ start, end, url })\n\n for (let j = i - 1; j >= 0; j--) {\n const [labelStart, labelEnd, prev] = highlights[j]\n if (prev === \"markup.link.label\") {\n ranges.push({ start: labelStart, end: labelEnd, url })\n break\n }\n if (!prev.startsWith(\"markup.link\")) break\n }\n }\n\n if (ranges.length === 0) return chunks\n\n // Use content.indexOf to find each chunk's position in the original content.\n // This handles concealed text correctly because concealed chunks are either\n // empty (length 0, skipped) or single-char replacements (length 1, skipped).\n // Non-concealed chunks with length > 1 are exact substrings of content in order.\n let contentPos = 0\n for (const chunk of chunks) {\n if (chunk.text.length <= 1) continue\n\n const idx = content.indexOf(chunk.text, contentPos)\n if (idx < 0) continue\n\n for (const range of ranges) {\n if (idx < range.end && idx + chunk.text.length > range.start) {\n chunk.link = { url: range.url }\n break\n }\n }\n\n contentPos = idx + chunk.text.length\n }\n\n return chunks\n}\n",
|
|
44
|
+
"import { dlopen, toArrayBuffer, JSCallback, ptr, type Pointer } from \"bun:ffi\"\nimport { existsSync, writeFileSync } from \"fs\"\nimport { EventEmitter } from \"events\"\nimport {\n type CursorStyle,\n type CursorStyleOptions,\n type TargetChannel,\n type DebugOverlayCorner,\n type WidthMethod,\n type Highlight,\n type LineInfo,\n type MousePointerStyle,\n} from \"./types.js\"\nexport type { LineInfo, AllocatorStats, BuildOptions }\n\nimport { RGBA } from \"./lib/RGBA.js\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport { TextBuffer } from \"./text-buffer.js\"\nimport { env, registerEnvVar } from \"./lib/env.js\"\nimport {\n StyledChunkStruct,\n HighlightStruct,\n LogicalCursorStruct,\n VisualCursorStruct,\n TerminalCapabilitiesStruct,\n EncodedCharStruct,\n LineInfoStruct,\n MeasureResultStruct,\n CursorStateStruct,\n CursorStyleOptionsStruct,\n GridDrawOptionsStruct,\n NativeSpanFeedOptionsStruct,\n NativeSpanFeedStatsStruct,\n ReserveInfoStruct,\n BuildOptionsStruct,\n AllocatorStatsStruct,\n} from \"./zig-structs.js\"\nimport type {\n NativeSpanFeedOptions,\n NativeSpanFeedStats,\n ReserveInfo,\n BuildOptions,\n AllocatorStats,\n} from \"./zig-structs.js\"\nimport { isBunfsPath } from \"./lib/bunfs.js\"\n\nconst module = await import(`@fairyhunter13/opentui-core-${process.platform}-${process.arch}/index.ts`)\nlet targetLibPath = module.default\n\nif (isBunfsPath(targetLibPath)) {\n targetLibPath = targetLibPath.replace(\"../\", \"\")\n}\n\nif (!existsSync(targetLibPath)) {\n throw new Error(`opentui is not supported on the current platform: ${process.platform}-${process.arch}`)\n}\n\nregisterEnvVar({\n name: \"OTUI_DEBUG_FFI\",\n description: \"Enable debug logging for the FFI bindings.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_TRACE_FFI\",\n description: \"Enable tracing for the FFI bindings.\",\n type: \"boolean\",\n default: false,\n})\n\n// Env vars used in terminal.zig\nregisterEnvVar({\n name: \"OPENTUI_FORCE_WCWIDTH\",\n description: \"Use wcwidth for character width calculations\",\n type: \"boolean\",\n default: false,\n})\nregisterEnvVar({\n name: \"OPENTUI_FORCE_UNICODE\",\n description: \"Force Mode 2026 Unicode support in terminal capabilities\",\n type: \"boolean\",\n default: false,\n})\nregisterEnvVar({\n name: \"OPENTUI_GRAPHICS\",\n description: \"Enable Kitty graphics protocol detection\",\n type: \"boolean\",\n default: true,\n})\nregisterEnvVar({\n name: \"OPENTUI_FORCE_NOZWJ\",\n description: \"Use no_zwj width method (Unicode without ZWJ joining)\",\n type: \"boolean\",\n default: false,\n})\n\n// Cursor & mouse pointer style mappings (avoid recreation on each call)\nconst CURSOR_STYLE_TO_ID = { block: 0, line: 1, underline: 2, default: 3 } as const\nconst CURSOR_ID_TO_STYLE = [\"block\", \"line\", \"underline\", \"default\"] as const\nconst MOUSE_STYLE_TO_ID = { default: 0, pointer: 1, text: 2, crosshair: 3, move: 4, \"not-allowed\": 5 } as const\n\n// Global singleton state for FFI tracing to prevent duplicate exit handlers\nlet globalTraceSymbols: Record<string, number[]> | null = null\nlet globalFFILogPath: string | null = null\nlet exitHandlerRegistered = false\n\nfunction toPointer(value: number | bigint): Pointer {\n if (typeof value === \"bigint\") {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"Pointer exceeds safe integer range\")\n }\n return Number(value) as Pointer\n }\n return value as Pointer\n}\n\nfunction toNumber(value: number | bigint): number {\n return typeof value === \"bigint\" ? Number(value) : value\n}\n\nfunction getOpenTUILib(libPath?: string) {\n const resolvedLibPath = libPath || targetLibPath\n\n const rawSymbols = dlopen(resolvedLibPath, {\n // Logging\n setLogCallback: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n // Event bus\n setEventCallback: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n // Renderer management\n createRenderer: {\n args: [\"u32\", \"u32\", \"bool\", \"bool\"],\n returns: \"ptr\",\n },\n setTerminalEnvVar: {\n args: [\"ptr\", \"ptr\", \"usize\", \"ptr\", \"usize\"],\n returns: \"bool\",\n },\n destroyRenderer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n setUseThread: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n setClearOnShutdown: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n setBackgroundColor: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n setRenderOffset: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n resetSplitScrollback: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n syncSplitScrollback: {\n args: [\"ptr\", \"u32\"],\n returns: \"u32\",\n },\n setPendingSplitFooterTransition: {\n args: [\"ptr\", \"u8\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n clearPendingSplitFooterTransition: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n updateStats: {\n args: [\"ptr\", \"f64\", \"u32\", \"f64\"],\n returns: \"void\",\n },\n updateMemoryStats: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n render: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n repaintSplitFooter: {\n args: [\"ptr\", \"u32\", \"bool\"],\n returns: \"u32\",\n },\n // Single FFI entrypoint for split commit append. beginFrame/finalizeFrame let\n // native code decide whether this call is a standalone commit or part of a\n // larger batched frame envelope.\n commitSplitFooterSnapshot: {\n args: [\"ptr\", \"ptr\", \"u32\", \"bool\", \"bool\", \"u32\", \"bool\", \"bool\", \"bool\"],\n returns: \"u32\",\n },\n getNextBuffer: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n getCurrentBuffer: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n rendererSetPaletteState: {\n args: [\"ptr\", \"ptr\", \"usize\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n queryPixelResolution: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n queryThemeColors: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n\n createOptimizedBuffer: {\n args: [\"u32\", \"u32\", \"bool\", \"u8\", \"ptr\", \"usize\"],\n returns: \"ptr\",\n },\n destroyOptimizedBuffer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n\n drawFrameBuffer: {\n args: [\"ptr\", \"i32\", \"i32\", \"ptr\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n getBufferWidth: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n getBufferHeight: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n bufferClear: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n bufferGetCharPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetFgPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetBgPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetFgTagPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetBgTagPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetAttributesPtr: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n bufferGetRespectAlpha: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n bufferSetRespectAlpha: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n bufferGetId: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n bufferGetRealCharSize: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n bufferWriteResolvedChars: {\n args: [\"ptr\", \"ptr\", \"usize\", \"bool\"],\n returns: \"u32\",\n },\n\n bufferDrawText: {\n args: [\"ptr\", \"ptr\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferSetCellWithAlphaBlending: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferSetCell: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferFillRect: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n bufferColorMatrix: {\n args: [\"ptr\", \"ptr\", \"ptr\", \"usize\", \"f32\", \"u8\"],\n returns: \"void\",\n },\n bufferColorMatrixUniform: {\n args: [\"ptr\", \"ptr\", \"f32\", \"u8\"],\n returns: \"void\",\n },\n bufferResize: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n\n // Link API\n linkAlloc: {\n args: [\"ptr\", \"u32\"],\n returns: \"u32\",\n },\n linkGetUrl: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n attributesWithLink: {\n args: [\"u32\", \"u32\"],\n returns: \"u32\",\n },\n attributesGetLinkId: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n\n resizeRenderer: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n\n // Cursor functions (now renderer-scoped)\n setCursorPosition: {\n args: [\"ptr\", \"i32\", \"i32\", \"bool\"],\n returns: \"void\",\n },\n setCursorColor: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n getCursorState: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n\n // Cursor and mouse pointer style (combined)\n setCursorStyleOptions: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n\n // Debug overlay\n setDebugOverlay: {\n args: [\"ptr\", \"bool\", \"u8\"],\n returns: \"void\",\n },\n\n // Terminal control\n clearTerminal: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n setTerminalTitle: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n copyToClipboardOSC52: {\n args: [\"ptr\", \"u8\", \"ptr\", \"usize\"],\n returns: \"bool\",\n },\n clearClipboardOSC52: {\n args: [\"ptr\", \"u8\"],\n returns: \"bool\",\n },\n\n bufferDrawSuperSampleBuffer: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\", \"usize\", \"u8\", \"u32\"],\n returns: \"void\",\n },\n bufferDrawPackedBuffer: {\n args: [\"ptr\", \"ptr\", \"usize\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n bufferDrawGrayscaleBuffer: {\n args: [\"ptr\", \"i32\", \"i32\", \"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawGrayscaleBufferSupersampled: {\n args: [\"ptr\", \"i32\", \"i32\", \"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawGrid: {\n args: [\"ptr\", \"ptr\", \"ptr\", \"ptr\", \"ptr\", \"u32\", \"ptr\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawBox: {\n args: [\"ptr\", \"i32\", \"i32\", \"u32\", \"u32\", \"ptr\", \"u32\", \"ptr\", \"ptr\", \"ptr\", \"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferPushScissorRect: {\n args: [\"ptr\", \"i32\", \"i32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n bufferPopScissorRect: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n bufferClearScissorRects: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n bufferPushOpacity: {\n args: [\"ptr\", \"f32\"],\n returns: \"void\",\n },\n bufferPopOpacity: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n bufferGetCurrentOpacity: {\n args: [\"ptr\"],\n returns: \"f32\",\n },\n bufferClearOpacity: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n\n addToHitGrid: {\n args: [\"ptr\", \"i32\", \"i32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n clearCurrentHitGrid: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n hitGridPushScissorRect: {\n args: [\"ptr\", \"i32\", \"i32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n hitGridPopScissorRect: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n hitGridClearScissorRects: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n addToCurrentHitGridClipped: {\n args: [\"ptr\", \"i32\", \"i32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n checkHit: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n getHitGridDirty: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n dumpHitGrid: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n dumpBuffers: {\n args: [\"ptr\", \"i64\"],\n returns: \"void\",\n },\n dumpStdoutBuffer: {\n args: [\"ptr\", \"i64\"],\n returns: \"void\",\n },\n restoreTerminalModes: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n enableMouse: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n disableMouse: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n enableKittyKeyboard: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n disableKittyKeyboard: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n setKittyKeyboardFlags: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n getKittyKeyboardFlags: {\n args: [\"ptr\"],\n returns: \"u8\",\n },\n setupTerminal: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n suspendRenderer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n resumeRenderer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n writeOut: {\n args: [\"ptr\", \"ptr\", \"u64\"],\n returns: \"void\",\n },\n\n // TextBuffer functions\n createTextBuffer: {\n args: [\"u8\"],\n returns: \"ptr\",\n },\n destroyTextBuffer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferGetLength: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n textBufferGetByteSize: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n\n textBufferReset: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferClear: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferSetDefaultFg: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferSetDefaultBg: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferSetDefaultAttributes: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferResetDefaults: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferGetTabWidth: {\n args: [\"ptr\"],\n returns: \"u8\",\n },\n textBufferSetTabWidth: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n textBufferRegisterMemBuffer: {\n args: [\"ptr\", \"ptr\", \"usize\", \"bool\"],\n returns: \"u16\",\n },\n textBufferReplaceMemBuffer: {\n args: [\"ptr\", \"u8\", \"ptr\", \"usize\", \"bool\"],\n returns: \"bool\",\n },\n textBufferClearMemRegistry: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferSetTextFromMem: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n textBufferAppend: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n textBufferAppendFromMemId: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n textBufferLoadFile: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"bool\",\n },\n textBufferSetStyledText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n textBufferGetLineCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n textBufferGetPlainText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n textBufferAddHighlightByCharRange: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferAddHighlight: {\n args: [\"ptr\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferRemoveHighlightsByRef: {\n args: [\"ptr\", \"u16\"],\n returns: \"void\",\n },\n textBufferClearLineHighlights: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferClearAllHighlights: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferSetSyntaxStyle: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferGetLineHighlightsPtr: {\n args: [\"ptr\", \"u32\", \"ptr\"],\n returns: \"ptr\",\n },\n textBufferFreeLineHighlights: {\n args: [\"ptr\", \"usize\"],\n returns: \"void\",\n },\n textBufferGetHighlightCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n textBufferGetTextRange: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n textBufferGetTextRangeByCoords: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n\n // TextBufferView functions\n createTextBufferView: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n destroyTextBufferView: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferViewSetSelection: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewResetSelection: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferViewGetSelectionInfo: {\n args: [\"ptr\"],\n returns: \"u64\",\n },\n textBufferViewSetLocalSelection: {\n args: [\"ptr\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\"],\n returns: \"bool\",\n },\n textBufferViewUpdateSelection: {\n args: [\"ptr\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewUpdateLocalSelection: {\n args: [\"ptr\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\"],\n returns: \"bool\",\n },\n textBufferViewResetLocalSelection: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n textBufferViewSetWrapWidth: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetWrapMode: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n textBufferViewSetFirstLineOffset: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetViewportSize: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetViewport: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewGetVirtualLineCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n textBufferViewGetLineInfoDirect: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewGetLogicalLineInfoDirect: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewGetSelectedText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n textBufferViewGetPlainText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n textBufferViewSetTabIndicator: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetTabIndicatorColor: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewSetTruncate: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n textBufferViewMeasureForDimensions: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\"],\n returns: \"bool\",\n },\n bufferDrawTextBufferView: {\n args: [\"ptr\", \"ptr\", \"i32\", \"i32\"],\n returns: \"void\",\n },\n bufferDrawEditorView: {\n args: [\"ptr\", \"ptr\", \"i32\", \"i32\"],\n returns: \"void\",\n },\n\n // EditorView functions\n createEditorView: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"ptr\",\n },\n destroyEditorView: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewSetViewportSize: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editorViewSetViewport: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\", \"bool\"],\n returns: \"void\",\n },\n editorViewGetViewport: {\n args: [\"ptr\", \"ptr\", \"ptr\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewSetScrollMargin: {\n args: [\"ptr\", \"f32\"],\n returns: \"void\",\n },\n editorViewSetWrapMode: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n editorViewGetVirtualLineCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n editorViewGetTotalVirtualLineCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n editorViewGetTextBufferView: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n editorViewGetLineInfoDirect: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetLogicalLineInfoDirect: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n\n // EditBuffer functions\n createEditBuffer: {\n args: [\"u8\"],\n returns: \"ptr\",\n },\n destroyEditBuffer: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferSetText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n editBufferSetTextFromMem: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n editBufferReplaceText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n editBufferReplaceTextFromMem: {\n args: [\"ptr\", \"u8\"],\n returns: \"void\",\n },\n editBufferGetText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n editBufferInsertChar: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n editBufferInsertText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n editBufferDeleteChar: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferDeleteCharBackward: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferDeleteRange: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferNewLine: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferDeleteLine: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferMoveCursorLeft: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferMoveCursorRight: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferMoveCursorUp: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferMoveCursorDown: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferGotoLine: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursor: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursorToLineCol: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursorByOffset: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferGetCursorPosition: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetId: {\n args: [\"ptr\"],\n returns: \"u16\",\n },\n editBufferGetTextBuffer: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n editBufferDebugLogRope: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferUndo: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n editBufferRedo: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n editBufferCanUndo: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n editBufferCanRedo: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n editBufferClearHistory: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferClear: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editBufferGetNextWordBoundary: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetPrevWordBoundary: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetEOL: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editBufferOffsetToPosition: {\n args: [\"ptr\", \"u32\", \"ptr\"],\n returns: \"bool\",\n },\n editBufferPositionToOffset: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n editBufferGetLineStartOffset: {\n args: [\"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editBufferGetTextRange: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n editBufferGetTextRangeByCoords: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n\n // EditorView selection and editing methods\n editorViewSetSelection: {\n args: [\"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewResetSelection: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewGetSelection: {\n args: [\"ptr\"],\n returns: \"u64\",\n },\n editorViewSetLocalSelection: {\n args: [\"ptr\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\", \"bool\", \"bool\"],\n returns: \"bool\",\n },\n editorViewUpdateSelection: {\n args: [\"ptr\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewUpdateLocalSelection: {\n args: [\"ptr\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\", \"bool\", \"bool\"],\n returns: \"bool\",\n },\n editorViewResetLocalSelection: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewGetSelectedTextBytes: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n editorViewGetCursor: {\n args: [\"ptr\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"usize\",\n },\n\n // EditorView VisualCursor methods\n editorViewGetVisualCursor: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n\n editorViewMoveUpVisual: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewMoveDownVisual: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewDeleteSelectedText: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n editorViewSetCursorByOffset: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n editorViewGetNextWordBoundary: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetPrevWordBoundary: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetEOL: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetVisualSOL: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetVisualEOL: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewSetPlaceholderStyledText: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n editorViewSetTabIndicator: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n editorViewSetTabIndicatorColor: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n\n getArenaAllocatedBytes: {\n args: [],\n returns: \"usize\",\n },\n getBuildOptions: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n getAllocatorStats: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n\n // SyntaxStyle functions\n createSyntaxStyle: {\n args: [],\n returns: \"ptr\",\n },\n destroySyntaxStyle: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n syntaxStyleRegister: {\n args: [\"ptr\", \"ptr\", \"usize\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n syntaxStyleResolveByName: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"u32\",\n },\n syntaxStyleGetStyleCount: {\n args: [\"ptr\"],\n returns: \"usize\",\n },\n\n // Terminal capability functions\n getTerminalCapabilities: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n processCapabilityResponse: {\n args: [\"ptr\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n\n // Unicode encoding API\n encodeUnicode: {\n args: [\"ptr\", \"usize\", \"ptr\", \"ptr\", \"u8\"],\n returns: \"bool\",\n },\n freeUnicode: {\n args: [\"ptr\", \"usize\"],\n returns: \"void\",\n },\n bufferDrawChar: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n // NativeSpanFeed\n createNativeSpanFeed: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n attachNativeSpanFeed: {\n args: [\"ptr\"],\n returns: \"i32\",\n },\n destroyNativeSpanFeed: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n streamWrite: {\n args: [\"ptr\", \"ptr\", \"u64\"],\n returns: \"i32\",\n },\n streamCommit: {\n args: [\"ptr\"],\n returns: \"i32\",\n },\n streamDrainSpans: {\n args: [\"ptr\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n streamClose: {\n args: [\"ptr\"],\n returns: \"i32\",\n },\n streamReserve: {\n args: [\"ptr\", \"u32\", \"ptr\"],\n returns: \"i32\",\n },\n streamCommitReserved: {\n args: [\"ptr\", \"u32\"],\n returns: \"i32\",\n },\n streamSetOptions: {\n args: [\"ptr\", \"ptr\"],\n returns: \"i32\",\n },\n streamGetStats: {\n args: [\"ptr\", \"ptr\"],\n returns: \"i32\",\n },\n streamSetCallback: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n })\n\n if (env.OTUI_DEBUG_FFI || env.OTUI_TRACE_FFI) {\n return {\n symbols: convertToDebugSymbols(rawSymbols.symbols),\n }\n }\n\n return rawSymbols\n}\n\nfunction convertToDebugSymbols<T extends Record<string, any>>(symbols: T): T {\n // Initialize global state on first call\n if (!globalTraceSymbols) {\n globalTraceSymbols = {}\n }\n\n // Initialize global debug log path on first call\n if (env.OTUI_DEBUG_FFI && !globalFFILogPath) {\n const now = new Date()\n const timestamp = now.toISOString().replace(/[:.]/g, \"-\").replace(/T/, \"_\").split(\"Z\")[0]\n globalFFILogPath = `ffi_otui_debug_${timestamp}.log`\n }\n\n const debugSymbols: Record<string, any> = {}\n let hasTracing = false\n\n Object.entries(symbols).forEach(([key, value]) => {\n debugSymbols[key] = value\n })\n\n if (env.OTUI_DEBUG_FFI && globalFFILogPath) {\n const logPath = globalFFILogPath\n const writeSync = (msg: string) => {\n writeFileSync(logPath, msg + \"\\n\", { flag: \"a\" })\n }\n\n Object.entries(symbols).forEach(([key, value]) => {\n if (typeof value === \"function\") {\n debugSymbols[key] = (...args: any[]) => {\n writeSync(`${key}(${args.map((arg) => String(arg)).join(\", \")})`)\n const result = value(...args)\n writeSync(`${key} returned: ${String(result)}`)\n return result\n }\n }\n })\n }\n\n if (env.OTUI_TRACE_FFI) {\n hasTracing = true\n Object.entries(symbols).forEach(([key, value]) => {\n if (typeof value === \"function\") {\n // Initialize trace array for this symbol if not exists\n if (!globalTraceSymbols![key]) {\n globalTraceSymbols![key] = []\n }\n\n const originalFunc = debugSymbols[key]\n debugSymbols[key] = (...args: any[]) => {\n const start = performance.now()\n const result = originalFunc(...args)\n const end = performance.now()\n globalTraceSymbols![key].push(end - start)\n return result\n }\n }\n })\n }\n\n // Register exit handler only once\n if ((env.OTUI_DEBUG_FFI || env.OTUI_TRACE_FFI) && !exitHandlerRegistered) {\n exitHandlerRegistered = true\n\n process.on(\"exit\", () => {\n if (globalTraceSymbols) {\n const allStats: Array<{\n name: string\n count: number\n total: number\n average: number\n min: number\n max: number\n median: number\n p90: number\n p99: number\n }> = []\n\n for (const [key, timings] of Object.entries(globalTraceSymbols)) {\n if (!Array.isArray(timings) || timings.length === 0) {\n continue\n }\n\n const sortedTimings = [...timings].sort((a, b) => a - b)\n const count = sortedTimings.length\n\n const total = sortedTimings.reduce((acc, t) => acc + t, 0)\n const average = total / count\n const min = sortedTimings[0]\n const max = sortedTimings[count - 1]\n\n const medianIndex = Math.floor(count / 2)\n const p90Index = Math.floor(count * 0.9)\n const p99Index = Math.floor(count * 0.99)\n\n const median = sortedTimings[medianIndex]\n const p90 = sortedTimings[Math.min(p90Index, count - 1)]\n const p99 = sortedTimings[Math.min(p99Index, count - 1)]\n\n allStats.push({\n name: key,\n count,\n total,\n average,\n min,\n max,\n median,\n p90,\n p99,\n })\n }\n\n allStats.sort((a, b) => b.total - a.total)\n\n const lines: string[] = []\n lines.push(\"\\n--- OpenTUI FFI Call Performance ---\")\n lines.push(\"Sorted by total time spent (descending)\")\n lines.push(\n \"-------------------------------------------------------------------------------------------------------------------------\",\n )\n\n if (allStats.length === 0) {\n lines.push(\"No trace data collected or all symbols had zero calls.\")\n } else {\n const nameHeader = \"Symbol\"\n const callsHeader = \"Calls\"\n const totalHeader = \"Total (ms)\"\n const avgHeader = \"Avg (ms)\"\n const minHeader = \"Min (ms)\"\n const maxHeader = \"Max (ms)\"\n const medHeader = \"Med (ms)\"\n const p90Header = \"P90 (ms)\"\n const p99Header = \"P99 (ms)\"\n\n const nameWidth = Math.max(nameHeader.length, ...allStats.map((s) => s.name.length))\n const countWidth = Math.max(callsHeader.length, ...allStats.map((s) => String(s.count).length))\n const totalWidth = Math.max(totalHeader.length, ...allStats.map((s) => s.total.toFixed(2).length))\n const avgWidth = Math.max(avgHeader.length, ...allStats.map((s) => s.average.toFixed(2).length))\n const statWidthMin = Math.max(minHeader.length, ...allStats.map((s) => s.min.toFixed(2).length))\n const statWidthMax = Math.max(maxHeader.length, ...allStats.map((s) => s.max.toFixed(2).length))\n const medianWidth = Math.max(medHeader.length, ...allStats.map((s) => s.median.toFixed(2).length))\n const p90Width = Math.max(p90Header.length, ...allStats.map((s) => s.p90.toFixed(2).length))\n const p99Width = Math.max(p99Header.length, ...allStats.map((s) => s.p99.toFixed(2).length))\n\n lines.push(\n `${nameHeader.padEnd(nameWidth)} | ` +\n `${callsHeader.padStart(countWidth)} | ` +\n `${totalHeader.padStart(totalWidth)} | ` +\n `${avgHeader.padStart(avgWidth)} | ` +\n `${minHeader.padStart(statWidthMin)} | ` +\n `${maxHeader.padStart(statWidthMax)} | ` +\n `${medHeader.padStart(medianWidth)} | ` +\n `${p90Header.padStart(p90Width)} | ` +\n `${p99Header.padStart(p99Width)}`,\n )\n lines.push(\n `${\"-\".repeat(nameWidth)}-+-${\"-\".repeat(countWidth)}-+-${\"-\".repeat(totalWidth)}-+-${\"-\".repeat(avgWidth)}-+-${\"-\".repeat(statWidthMin)}-+-${\"-\".repeat(statWidthMax)}-+-${\"-\".repeat(medianWidth)}-+-${\"-\".repeat(p90Width)}-+-${\"-\".repeat(p99Width)}`,\n )\n\n allStats.forEach((stat) => {\n lines.push(\n `${stat.name.padEnd(nameWidth)} | ` +\n `${String(stat.count).padStart(countWidth)} | ` +\n `${stat.total.toFixed(2).padStart(totalWidth)} | ` +\n `${stat.average.toFixed(2).padStart(avgWidth)} | ` +\n `${stat.min.toFixed(2).padStart(statWidthMin)} | ` +\n `${stat.max.toFixed(2).padStart(statWidthMax)} | ` +\n `${stat.median.toFixed(2).padStart(medianWidth)} | ` +\n `${stat.p90.toFixed(2).padStart(p90Width)} | ` +\n `${stat.p99.toFixed(2).padStart(p99Width)}`,\n )\n })\n }\n lines.push(\n \"-------------------------------------------------------------------------------------------------------------------------\",\n )\n\n const output = lines.join(\"\\n\")\n console.log(output)\n\n try {\n const now = new Date()\n const timestamp = now.toISOString().replace(/[:.]/g, \"-\").replace(/T/, \"_\").split(\"Z\")[0]\n const traceFilePath = `ffi_otui_trace_${timestamp}.log`\n Bun.write(traceFilePath, output)\n } catch (e) {\n console.error(\"Failed to write FFI trace file:\", e)\n }\n }\n })\n }\n\n return debugSymbols as T\n}\n\n// Log levels matching Zig's LogLevel enum\nexport enum LogLevel {\n Error = 0,\n Warn = 1,\n Info = 2,\n Debug = 3,\n}\n\n/**\n * VisualCursor represents a cursor position with both visual and logical coordinates.\n * Visual coordinates (visualRow, visualCol) are VIEWPORT-RELATIVE.\n * This means visualRow=0 is the first visible line in the viewport, not the first line in the document.\n * Logical coordinates (logicalRow, logicalCol) are document-absolute.\n */\nexport interface VisualCursor {\n visualRow: number // Viewport-relative row (0 = top of viewport)\n visualCol: number // Viewport-relative column (0 = left edge of viewport when not wrapping)\n logicalRow: number // Document-absolute row\n logicalCol: number // Document-absolute column\n offset: number // Global display-width offset from buffer start\n}\n\nexport interface LogicalCursor {\n row: number\n col: number\n offset: number\n}\n\nexport interface CursorState {\n x: number\n y: number\n visible: boolean\n style: CursorStyle\n blinking: boolean\n color: RGBA\n}\n\nexport type NativeSpanFeedEventHandler = (eventId: number, arg0: Pointer, arg1: number | bigint) => void\n\nexport interface RenderLib {\n createRenderer: (width: number, height: number, options?: { testing?: boolean; remote?: boolean }) => Pointer | null\n setTerminalEnvVar: (renderer: Pointer, key: string, value: string) => boolean\n destroyRenderer: (renderer: Pointer) => void\n setUseThread: (renderer: Pointer, useThread: boolean) => void\n setClearOnShutdown: (renderer: Pointer, clear: boolean) => void\n setBackgroundColor: (renderer: Pointer, color: RGBA) => void\n setRenderOffset: (renderer: Pointer, offset: number) => void\n resetSplitScrollback: (renderer: Pointer, seedRows: number, pinnedRenderOffset: number) => number\n syncSplitScrollback: (renderer: Pointer, pinnedRenderOffset: number) => number\n setPendingSplitFooterTransition: (\n renderer: Pointer,\n mode: number,\n sourceTopLine: number,\n sourceHeight: number,\n targetTopLine: number,\n targetHeight: number,\n ) => void\n clearPendingSplitFooterTransition: (renderer: Pointer) => void\n updateStats: (renderer: Pointer, time: number, fps: number, frameCallbackTime: number) => void\n updateMemoryStats: (renderer: Pointer, heapUsed: number, heapTotal: number, arrayBuffers: number) => void\n render: (renderer: Pointer, force: boolean) => void\n repaintSplitFooter: (renderer: Pointer, pinnedRenderOffset: number, force: boolean) => number\n commitSplitFooterSnapshot: (\n renderer: Pointer,\n snapshot: OptimizedBuffer,\n rowColumns: number,\n startOnNewLine: boolean,\n trailingNewline: boolean,\n pinnedRenderOffset: number,\n force: boolean,\n // beginFrame/finalizeFrame mark commit boundaries when one JS flush contains\n // multiple stdout snapshots. Defaults preserve old one-call behavior.\n beginFrame?: boolean,\n finalizeFrame?: boolean,\n ) => number\n getNextBuffer: (renderer: Pointer) => OptimizedBuffer\n getCurrentBuffer: (renderer: Pointer) => OptimizedBuffer\n rendererSetPaletteState: (\n renderer: Pointer,\n palette: readonly RGBA[],\n defaultForeground: RGBA,\n defaultBackground: RGBA,\n paletteEpoch: number,\n ) => void\n createOptimizedBuffer: (\n width: number,\n height: number,\n widthMethod: WidthMethod,\n respectAlpha?: boolean,\n id?: string,\n ) => OptimizedBuffer\n destroyOptimizedBuffer: (bufferPtr: Pointer) => void\n drawFrameBuffer: (\n targetBufferPtr: Pointer,\n destX: number,\n destY: number,\n bufferPtr: Pointer,\n sourceX?: number,\n sourceY?: number,\n sourceWidth?: number,\n sourceHeight?: number,\n ) => void\n getBufferWidth: (buffer: Pointer) => number\n getBufferHeight: (buffer: Pointer) => number\n bufferClear: (buffer: Pointer, color: RGBA) => void\n bufferGetCharPtr: (buffer: Pointer) => Pointer\n bufferGetFgPtr: (buffer: Pointer) => Pointer\n bufferGetBgPtr: (buffer: Pointer) => Pointer\n bufferGetFgTagPtr: (buffer: Pointer) => Pointer\n bufferGetBgTagPtr: (buffer: Pointer) => Pointer\n bufferGetAttributesPtr: (buffer: Pointer) => Pointer\n bufferGetRespectAlpha: (buffer: Pointer) => boolean\n bufferSetRespectAlpha: (buffer: Pointer, respectAlpha: boolean) => void\n bufferGetId: (buffer: Pointer) => string\n bufferGetRealCharSize: (buffer: Pointer) => number\n bufferWriteResolvedChars: (buffer: Pointer, outputBuffer: Uint8Array, addLineBreaks: boolean) => number\n bufferDrawText: (\n buffer: Pointer,\n text: string,\n x: number,\n y: number,\n color: RGBA,\n bgColor?: RGBA,\n attributes?: number,\n ) => void\n bufferSetCellWithAlphaBlending: (\n buffer: Pointer,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) => void\n bufferSetCell: (\n buffer: Pointer,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) => void\n bufferFillRect: (buffer: Pointer, x: number, y: number, width: number, height: number, color: RGBA) => void\n bufferColorMatrix: (\n buffer: Pointer,\n matrixPtr: Pointer,\n cellMaskPtr: Pointer,\n cellMaskCount: number,\n strength: number,\n target: TargetChannel,\n ) => void\n bufferColorMatrixUniform: (buffer: Pointer, matrixPtr: Pointer, strength: number, target: TargetChannel) => void\n bufferDrawSuperSampleBuffer: (\n buffer: Pointer,\n x: number,\n y: number,\n pixelDataPtr: Pointer,\n pixelDataLength: number,\n format: \"bgra8unorm\" | \"rgba8unorm\",\n alignedBytesPerRow: number,\n ) => void\n bufferDrawPackedBuffer: (\n buffer: Pointer,\n dataPtr: Pointer,\n dataLen: number,\n posX: number,\n posY: number,\n terminalWidthCells: number,\n terminalHeightCells: number,\n ) => void\n bufferDrawGrayscaleBuffer: (\n buffer: Pointer,\n posX: number,\n posY: number,\n intensitiesPtr: Pointer,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null,\n bg: RGBA | null,\n ) => void\n bufferDrawGrayscaleBufferSupersampled: (\n buffer: Pointer,\n posX: number,\n posY: number,\n intensitiesPtr: Pointer,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null,\n bg: RGBA | null,\n ) => void\n bufferDrawGrid: (\n buffer: Pointer,\n borderChars: Uint32Array,\n borderFg: RGBA,\n borderBg: RGBA,\n columnOffsets: Int32Array,\n columnCount: number,\n rowOffsets: Int32Array,\n rowCount: number,\n options: { drawInner: boolean; drawOuter: boolean },\n ) => void\n bufferDrawBox: (\n buffer: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n borderChars: Uint32Array,\n packedOptions: number,\n borderColor: RGBA,\n backgroundColor: RGBA,\n title: string | null,\n bottomTitle: string | null,\n ) => void\n bufferResize: (buffer: Pointer, width: number, height: number) => void\n resizeRenderer: (renderer: Pointer, width: number, height: number) => void\n setCursorPosition: (renderer: Pointer, x: number, y: number, visible: boolean) => void\n setCursorColor: (renderer: Pointer, color: RGBA) => void\n getCursorState: (renderer: Pointer) => CursorState\n setCursorStyleOptions: (renderer: Pointer, options: CursorStyleOptions) => void\n setDebugOverlay: (renderer: Pointer, enabled: boolean, corner: DebugOverlayCorner) => void\n clearTerminal: (renderer: Pointer) => void\n setTerminalTitle: (renderer: Pointer, title: string) => void\n copyToClipboardOSC52: (renderer: Pointer, target: number, payload: Uint8Array) => boolean\n clearClipboardOSC52: (renderer: Pointer, target: number) => boolean\n addToHitGrid: (renderer: Pointer, x: number, y: number, width: number, height: number, id: number) => void\n clearCurrentHitGrid: (renderer: Pointer) => void\n hitGridPushScissorRect: (renderer: Pointer, x: number, y: number, width: number, height: number) => void\n hitGridPopScissorRect: (renderer: Pointer) => void\n hitGridClearScissorRects: (renderer: Pointer) => void\n addToCurrentHitGridClipped: (\n renderer: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n id: number,\n ) => void\n checkHit: (renderer: Pointer, x: number, y: number) => number\n getHitGridDirty: (renderer: Pointer) => boolean\n dumpHitGrid: (renderer: Pointer) => void\n dumpBuffers: (renderer: Pointer, timestamp?: number) => void\n dumpStdoutBuffer: (renderer: Pointer, timestamp?: number) => void\n restoreTerminalModes: (renderer: Pointer) => void\n enableMouse: (renderer: Pointer, enableMovement: boolean) => void\n disableMouse: (renderer: Pointer) => void\n enableKittyKeyboard: (renderer: Pointer, flags: number) => void\n disableKittyKeyboard: (renderer: Pointer) => void\n setKittyKeyboardFlags: (renderer: Pointer, flags: number) => void\n getKittyKeyboardFlags: (renderer: Pointer) => number\n setupTerminal: (renderer: Pointer, useAlternateScreen: boolean) => void\n suspendRenderer: (renderer: Pointer) => void\n resumeRenderer: (renderer: Pointer) => void\n queryPixelResolution: (renderer: Pointer) => void\n queryThemeColors: (renderer: Pointer) => void\n writeOut: (renderer: Pointer, data: string | Uint8Array) => void\n\n // TextBuffer methods\n createTextBuffer: (widthMethod: WidthMethod) => TextBuffer\n destroyTextBuffer: (buffer: Pointer) => void\n textBufferGetLength: (buffer: Pointer) => number\n textBufferGetByteSize: (buffer: Pointer) => number\n\n textBufferReset: (buffer: Pointer) => void\n textBufferClear: (buffer: Pointer) => void\n textBufferRegisterMemBuffer: (buffer: Pointer, bytes: Uint8Array, owned?: boolean) => number\n textBufferReplaceMemBuffer: (buffer: Pointer, memId: number, bytes: Uint8Array, owned?: boolean) => boolean\n textBufferClearMemRegistry: (buffer: Pointer) => void\n textBufferSetTextFromMem: (buffer: Pointer, memId: number) => void\n textBufferAppend: (buffer: Pointer, bytes: Uint8Array) => void\n textBufferAppendFromMemId: (buffer: Pointer, memId: number) => void\n textBufferLoadFile: (buffer: Pointer, path: string) => boolean\n textBufferSetStyledText: (\n buffer: Pointer,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number; link?: { url: string } }>,\n ) => void\n textBufferSetDefaultFg: (buffer: Pointer, fg: RGBA | null) => void\n textBufferSetDefaultBg: (buffer: Pointer, bg: RGBA | null) => void\n textBufferSetDefaultAttributes: (buffer: Pointer, attributes: number | null) => void\n textBufferResetDefaults: (buffer: Pointer) => void\n textBufferGetTabWidth: (buffer: Pointer) => number\n textBufferSetTabWidth: (buffer: Pointer, width: number) => void\n textBufferGetLineCount: (buffer: Pointer) => number\n getPlainTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null\n textBufferGetTextRange: (\n buffer: Pointer,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ) => Uint8Array | null\n textBufferGetTextRangeByCoords: (\n buffer: Pointer,\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n maxLength: number,\n ) => Uint8Array | null\n\n // TextBufferView methods\n createTextBufferView: (textBuffer: Pointer) => Pointer\n destroyTextBufferView: (view: Pointer) => void\n textBufferViewSetSelection: (\n view: Pointer,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => void\n textBufferViewResetSelection: (view: Pointer) => void\n textBufferViewGetSelection: (view: Pointer) => { start: number; end: number } | null\n textBufferViewSetLocalSelection: (\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => boolean\n textBufferViewUpdateSelection: (view: Pointer, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void\n textBufferViewUpdateLocalSelection: (\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => boolean\n textBufferViewResetLocalSelection: (view: Pointer) => void\n textBufferViewSetWrapWidth: (view: Pointer, width: number) => void\n textBufferViewSetWrapMode: (view: Pointer, mode: \"none\" | \"char\" | \"word\") => void\n textBufferViewSetFirstLineOffset: (view: Pointer, offset: number) => void\n textBufferViewSetViewportSize: (view: Pointer, width: number, height: number) => void\n textBufferViewSetViewport: (view: Pointer, x: number, y: number, width: number, height: number) => void\n textBufferViewGetLineInfo: (view: Pointer) => LineInfo\n textBufferViewGetLogicalLineInfo: (view: Pointer) => LineInfo\n textBufferViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null\n textBufferViewGetPlainTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null\n textBufferViewSetTabIndicator: (view: Pointer, indicator: number) => void\n textBufferViewSetTabIndicatorColor: (view: Pointer, color: RGBA) => void\n textBufferViewSetTruncate: (view: Pointer, truncate: boolean) => void\n textBufferViewMeasureForDimensions: (\n view: Pointer,\n width: number,\n height: number,\n ) => { lineCount: number; widthColsMax: number } | null\n textBufferViewGetVirtualLineCount: (view: Pointer) => number\n\n readonly encoder: TextEncoder\n readonly decoder: TextDecoder\n bufferDrawTextBufferView: (buffer: Pointer, view: Pointer, x: number, y: number) => void\n bufferDrawEditorView: (buffer: Pointer, view: Pointer, x: number, y: number) => void\n\n // EditBuffer methods\n createEditBuffer: (widthMethod: WidthMethod) => Pointer\n destroyEditBuffer: (buffer: Pointer) => void\n editBufferSetText: (buffer: Pointer, textBytes: Uint8Array) => void\n editBufferSetTextFromMem: (buffer: Pointer, memId: number) => void\n editBufferReplaceText: (buffer: Pointer, textBytes: Uint8Array) => void\n editBufferReplaceTextFromMem: (buffer: Pointer, memId: number) => void\n editBufferGetText: (buffer: Pointer, maxLength: number) => Uint8Array | null\n editBufferInsertChar: (buffer: Pointer, char: string) => void\n editBufferInsertText: (buffer: Pointer, text: string) => void\n editBufferDeleteChar: (buffer: Pointer) => void\n editBufferDeleteCharBackward: (buffer: Pointer) => void\n editBufferDeleteRange: (buffer: Pointer, startLine: number, startCol: number, endLine: number, endCol: number) => void\n editBufferNewLine: (buffer: Pointer) => void\n editBufferDeleteLine: (buffer: Pointer) => void\n editBufferMoveCursorLeft: (buffer: Pointer) => void\n editBufferMoveCursorRight: (buffer: Pointer) => void\n editBufferMoveCursorUp: (buffer: Pointer) => void\n editBufferMoveCursorDown: (buffer: Pointer) => void\n editBufferGotoLine: (buffer: Pointer, line: number) => void\n editBufferSetCursor: (buffer: Pointer, line: number, col: number) => void\n editBufferSetCursorToLineCol: (buffer: Pointer, line: number, col: number) => void\n editBufferSetCursorByOffset: (buffer: Pointer, offset: number) => void\n editBufferGetCursorPosition: (buffer: Pointer) => LogicalCursor\n editBufferGetId: (buffer: Pointer) => number\n editBufferGetTextBuffer: (buffer: Pointer) => Pointer\n editBufferDebugLogRope: (buffer: Pointer) => void\n editBufferUndo: (buffer: Pointer, maxLength: number) => Uint8Array | null\n editBufferRedo: (buffer: Pointer, maxLength: number) => Uint8Array | null\n editBufferCanUndo: (buffer: Pointer) => boolean\n editBufferCanRedo: (buffer: Pointer) => boolean\n editBufferClearHistory: (buffer: Pointer) => void\n editBufferClear: (buffer: Pointer) => void\n editBufferGetNextWordBoundary: (buffer: Pointer) => { row: number; col: number; offset: number }\n editBufferGetPrevWordBoundary: (buffer: Pointer) => { row: number; col: number; offset: number }\n editBufferGetEOL: (buffer: Pointer) => { row: number; col: number; offset: number }\n editBufferOffsetToPosition: (buffer: Pointer, offset: number) => { row: number; col: number; offset: number } | null\n editBufferPositionToOffset: (buffer: Pointer, row: number, col: number) => number\n editBufferGetLineStartOffset: (buffer: Pointer, row: number) => number\n editBufferGetTextRange: (\n buffer: Pointer,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ) => Uint8Array | null\n editBufferGetTextRangeByCoords: (\n buffer: Pointer,\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n maxLength: number,\n ) => Uint8Array | null\n\n // EditorView methods\n createEditorView: (editBufferPtr: Pointer, viewportWidth: number, viewportHeight: number) => Pointer\n destroyEditorView: (view: Pointer) => void\n editorViewSetViewportSize: (view: Pointer, width: number, height: number) => void\n editorViewSetViewport: (\n view: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n moveCursor: boolean,\n ) => void\n editorViewGetViewport: (view: Pointer) => { offsetY: number; offsetX: number; height: number; width: number }\n editorViewSetScrollMargin: (view: Pointer, margin: number) => void\n editorViewSetWrapMode: (view: Pointer, mode: \"none\" | \"char\" | \"word\") => void\n editorViewGetVirtualLineCount: (view: Pointer) => number\n editorViewGetTotalVirtualLineCount: (view: Pointer) => number\n editorViewGetTextBufferView: (view: Pointer) => Pointer\n editorViewSetSelection: (\n view: Pointer,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => void\n editorViewResetSelection: (view: Pointer) => void\n editorViewGetSelection: (view: Pointer) => { start: number; end: number } | null\n editorViewSetLocalSelection: (\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n updateCursor: boolean,\n followCursor: boolean,\n ) => boolean\n\n editorViewUpdateSelection: (view: Pointer, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void\n editorViewUpdateLocalSelection: (\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n updateCursor: boolean,\n followCursor: boolean,\n ) => boolean\n\n editorViewResetLocalSelection: (view: Pointer) => void\n editorViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null\n editorViewGetCursor: (view: Pointer) => { row: number; col: number }\n editorViewGetText: (view: Pointer, maxLength: number) => Uint8Array | null\n editorViewGetVisualCursor: (view: Pointer) => VisualCursor\n editorViewMoveUpVisual: (view: Pointer) => void\n editorViewMoveDownVisual: (view: Pointer) => void\n editorViewDeleteSelectedText: (view: Pointer) => void\n editorViewSetCursorByOffset: (view: Pointer, offset: number) => void\n editorViewGetNextWordBoundary: (view: Pointer) => VisualCursor\n editorViewGetPrevWordBoundary: (view: Pointer) => VisualCursor\n editorViewGetEOL: (view: Pointer) => VisualCursor\n editorViewGetVisualSOL: (view: Pointer) => VisualCursor\n editorViewGetVisualEOL: (view: Pointer) => VisualCursor\n editorViewGetLineInfo: (view: Pointer) => LineInfo\n editorViewGetLogicalLineInfo: (view: Pointer) => LineInfo\n editorViewSetPlaceholderStyledText: (\n view: Pointer,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number }>,\n ) => void\n editorViewSetTabIndicator: (view: Pointer, indicator: number) => void\n editorViewSetTabIndicatorColor: (view: Pointer, color: RGBA) => void\n\n bufferPushScissorRect: (buffer: Pointer, x: number, y: number, width: number, height: number) => void\n bufferPopScissorRect: (buffer: Pointer) => void\n bufferClearScissorRects: (buffer: Pointer) => void\n bufferPushOpacity: (buffer: Pointer, opacity: number) => void\n bufferPopOpacity: (buffer: Pointer) => void\n bufferGetCurrentOpacity: (buffer: Pointer) => number\n bufferClearOpacity: (buffer: Pointer) => void\n textBufferAddHighlightByCharRange: (buffer: Pointer, highlight: Highlight) => void\n textBufferAddHighlight: (buffer: Pointer, lineIdx: number, highlight: Highlight) => void\n textBufferRemoveHighlightsByRef: (buffer: Pointer, hlRef: number) => void\n textBufferClearLineHighlights: (buffer: Pointer, lineIdx: number) => void\n textBufferClearAllHighlights: (buffer: Pointer) => void\n textBufferSetSyntaxStyle: (buffer: Pointer, style: Pointer | null) => void\n textBufferGetLineHighlights: (buffer: Pointer, lineIdx: number) => Array<Highlight>\n textBufferGetHighlightCount: (buffer: Pointer) => number\n\n getArenaAllocatedBytes: () => number\n getBuildOptions: () => BuildOptions\n getAllocatorStats: () => AllocatorStats\n\n createSyntaxStyle: () => Pointer\n destroySyntaxStyle: (style: Pointer) => void\n syntaxStyleRegister: (style: Pointer, name: string, fg: RGBA | null, bg: RGBA | null, attributes: number) => number\n syntaxStyleResolveByName: (style: Pointer, name: string) => number | null\n syntaxStyleGetStyleCount: (style: Pointer) => number\n\n getTerminalCapabilities: (renderer: Pointer) => any\n processCapabilityResponse: (renderer: Pointer, response: string) => void\n\n encodeUnicode: (\n text: string,\n widthMethod: WidthMethod,\n ) => { ptr: Pointer; data: Array<{ width: number; char: number }> } | null\n freeUnicode: (encoded: { ptr: Pointer; data: Array<{ width: number; char: number }> }) => void\n bufferDrawChar: (buffer: Pointer, char: number, x: number, y: number, fg: RGBA, bg: RGBA, attributes?: number) => void\n\n registerNativeSpanFeedStream: (stream: Pointer, handler: NativeSpanFeedEventHandler) => void\n unregisterNativeSpanFeedStream: (stream: Pointer) => void\n createNativeSpanFeed: (options?: NativeSpanFeedOptions | null) => Pointer\n attachNativeSpanFeed: (stream: Pointer) => number\n destroyNativeSpanFeed: (stream: Pointer) => void\n streamWrite: (stream: Pointer, data: Uint8Array | string) => number\n streamCommit: (stream: Pointer) => number\n streamDrainSpans: (stream: Pointer, outBuffer: Uint8Array, maxSpans: number) => number\n streamClose: (stream: Pointer) => number\n streamSetOptions: (stream: Pointer, options: NativeSpanFeedOptions) => number\n streamGetStats: (stream: Pointer) => NativeSpanFeedStats | null\n streamReserve: (stream: Pointer, minLen: number) => { status: number; info: ReserveInfo | null }\n streamCommitReserved: (stream: Pointer, length: number) => number\n\n onNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void\n onceNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void\n offNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void\n onAnyNativeEvent: (handler: (name: string, data: ArrayBuffer) => void) => void\n}\n\nclass FFIRenderLib implements RenderLib {\n private opentui: ReturnType<typeof getOpenTUILib>\n public readonly encoder: TextEncoder = new TextEncoder()\n public readonly decoder: TextDecoder = new TextDecoder()\n private logCallbackWrapper: any // Store the FFI callback wrapper\n private eventCallbackWrapper: any // Store the FFI event callback wrapper\n private _nativeEvents: EventEmitter = new EventEmitter()\n private _anyEventHandlers: Array<(name: string, data: ArrayBuffer) => void> = []\n private nativeSpanFeedCallbackWrapper: JSCallback | null = null\n private nativeSpanFeedHandlers = new Map<Pointer, NativeSpanFeedEventHandler>()\n\n constructor(libPath?: string) {\n this.opentui = getOpenTUILib(libPath)\n this.setupLogging()\n this.setupEventBus()\n }\n\n private setupLogging() {\n if (this.logCallbackWrapper) {\n return\n }\n\n const logCallback = new JSCallback(\n (level: number, msgPtr: Pointer, msgLenBigInt: bigint | number) => {\n try {\n const msgLen = typeof msgLenBigInt === \"bigint\" ? Number(msgLenBigInt) : msgLenBigInt\n\n if (msgLen === 0 || !msgPtr) {\n return\n }\n\n const msgBuffer = toArrayBuffer(msgPtr, 0, msgLen)\n const msgBytes = new Uint8Array(msgBuffer)\n const message = this.decoder.decode(msgBytes)\n\n switch (level) {\n case LogLevel.Error:\n console.error(message)\n break\n case LogLevel.Warn:\n console.warn(message)\n break\n case LogLevel.Info:\n console.info(message)\n break\n case LogLevel.Debug:\n console.debug(message)\n break\n default:\n console.log(message)\n }\n } catch (error) {\n console.error(\"Error in Zig log callback:\", error)\n }\n },\n {\n args: [\"u8\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n )\n\n this.logCallbackWrapper = logCallback\n\n if (!logCallback.ptr) {\n throw new Error(\"Failed to create log callback\")\n }\n\n this.setLogCallback(logCallback.ptr)\n }\n\n private setLogCallback(callbackPtr: Pointer) {\n this.opentui.symbols.setLogCallback(callbackPtr)\n }\n\n private setupEventBus() {\n if (this.eventCallbackWrapper) {\n return\n }\n\n const eventCallback = new JSCallback(\n (namePtr: Pointer, nameLenBigInt: bigint | number, dataPtr: Pointer, dataLenBigInt: bigint | number) => {\n try {\n const nameLen = typeof nameLenBigInt === \"bigint\" ? Number(nameLenBigInt) : nameLenBigInt\n const dataLen = typeof dataLenBigInt === \"bigint\" ? Number(dataLenBigInt) : dataLenBigInt\n\n if (nameLen === 0 || !namePtr) {\n return\n }\n\n const nameBuffer = toArrayBuffer(namePtr, 0, nameLen)\n const nameBytes = new Uint8Array(nameBuffer)\n const eventName = this.decoder.decode(nameBytes)\n\n let eventData: ArrayBuffer\n if (dataLen > 0 && dataPtr) {\n eventData = toArrayBuffer(dataPtr, 0, dataLen).slice()\n } else {\n eventData = new ArrayBuffer(0)\n }\n\n queueMicrotask(() => {\n this._nativeEvents.emit(eventName, eventData)\n\n for (const handler of this._anyEventHandlers) {\n handler(eventName, eventData)\n }\n })\n } catch (error) {\n console.error(\"Error in native event callback:\", error)\n }\n },\n {\n args: [\"ptr\", \"usize\", \"ptr\", \"usize\"],\n returns: \"void\",\n },\n )\n\n this.eventCallbackWrapper = eventCallback\n\n if (!eventCallback.ptr) {\n throw new Error(\"Failed to create event callback\")\n }\n\n this.setEventCallback(eventCallback.ptr)\n }\n\n private ensureNativeSpanFeedCallback(): JSCallback {\n if (this.nativeSpanFeedCallbackWrapper) {\n return this.nativeSpanFeedCallbackWrapper\n }\n\n const callback = new JSCallback(\n (streamPtr: Pointer, eventId: number, arg0: Pointer, arg1: number | bigint) => {\n const handler = this.nativeSpanFeedHandlers.get(toPointer(streamPtr))\n if (handler) {\n handler(eventId, arg0, arg1)\n }\n },\n {\n args: [\"ptr\", \"u32\", \"ptr\", \"u64\"],\n returns: \"void\",\n },\n )\n\n this.nativeSpanFeedCallbackWrapper = callback\n\n if (!callback.ptr) {\n throw new Error(\"Failed to create native span feed callback\")\n }\n\n return callback\n }\n\n private setEventCallback(callbackPtr: Pointer) {\n this.opentui.symbols.setEventCallback(callbackPtr)\n }\n\n public createRenderer(width: number, height: number, options: { testing?: boolean; remote?: boolean } = {}) {\n const testing = options.testing ?? false\n const remote = options.remote ?? false\n return this.opentui.symbols.createRenderer(width, height, testing, remote)\n }\n\n public setTerminalEnvVar(renderer: Pointer, key: string, value: string): boolean {\n const keyBytes = this.encoder.encode(key)\n const valueBytes = this.encoder.encode(value)\n return this.opentui.symbols.setTerminalEnvVar(renderer, keyBytes, keyBytes.length, valueBytes, valueBytes.length)\n }\n\n public destroyRenderer(renderer: Pointer): void {\n this.opentui.symbols.destroyRenderer(renderer)\n }\n\n public setUseThread(renderer: Pointer, useThread: boolean) {\n this.opentui.symbols.setUseThread(renderer, useThread)\n }\n\n public setClearOnShutdown(renderer: Pointer, clear: boolean) {\n this.opentui.symbols.setClearOnShutdown(renderer, clear)\n }\n\n public setBackgroundColor(renderer: Pointer, color: RGBA) {\n this.opentui.symbols.setBackgroundColor(renderer, color.buffer)\n }\n\n public setRenderOffset(renderer: Pointer, offset: number) {\n this.opentui.symbols.setRenderOffset(renderer, offset)\n }\n\n public resetSplitScrollback(renderer: Pointer, seedRows: number, pinnedRenderOffset: number): number {\n return this.opentui.symbols.resetSplitScrollback(renderer, seedRows, pinnedRenderOffset)\n }\n\n public syncSplitScrollback(renderer: Pointer, pinnedRenderOffset: number): number {\n return this.opentui.symbols.syncSplitScrollback(renderer, pinnedRenderOffset)\n }\n\n public setPendingSplitFooterTransition(\n renderer: Pointer,\n mode: number,\n sourceTopLine: number,\n sourceHeight: number,\n targetTopLine: number,\n targetHeight: number,\n ): void {\n this.opentui.symbols.setPendingSplitFooterTransition(\n renderer,\n mode,\n sourceTopLine,\n sourceHeight,\n targetTopLine,\n targetHeight,\n )\n }\n\n public clearPendingSplitFooterTransition(renderer: Pointer): void {\n this.opentui.symbols.clearPendingSplitFooterTransition(renderer)\n }\n\n public updateStats(renderer: Pointer, time: number, fps: number, frameCallbackTime: number) {\n this.opentui.symbols.updateStats(renderer, time, fps, frameCallbackTime)\n }\n\n public updateMemoryStats(renderer: Pointer, heapUsed: number, heapTotal: number, arrayBuffers: number) {\n this.opentui.symbols.updateMemoryStats(renderer, heapUsed, heapTotal, arrayBuffers)\n }\n\n public getNextBuffer(renderer: Pointer): OptimizedBuffer {\n const bufferPtr = this.opentui.symbols.getNextBuffer(renderer)\n if (!bufferPtr) {\n throw new Error(\"Failed to get next buffer\")\n }\n\n const width = this.opentui.symbols.getBufferWidth(bufferPtr)\n const height = this.opentui.symbols.getBufferHeight(bufferPtr)\n\n return new OptimizedBuffer(this, bufferPtr, width, height, { id: \"next buffer\", widthMethod: \"unicode\" })\n }\n\n public getCurrentBuffer(renderer: Pointer): OptimizedBuffer {\n const bufferPtr = this.opentui.symbols.getCurrentBuffer(renderer)\n if (!bufferPtr) {\n throw new Error(\"Failed to get current buffer\")\n }\n\n const width = this.opentui.symbols.getBufferWidth(bufferPtr)\n const height = this.opentui.symbols.getBufferHeight(bufferPtr)\n\n return new OptimizedBuffer(this, bufferPtr, width, height, { id: \"current buffer\", widthMethod: \"unicode\" })\n }\n\n public rendererSetPaletteState(\n renderer: Pointer,\n palette: readonly RGBA[],\n defaultForeground: RGBA,\n defaultBackground: RGBA,\n paletteEpoch: number,\n ): void {\n const paletteBuffer = new Float32Array(palette.length * 4)\n\n for (let index = 0; index < palette.length; index++) {\n const color = palette[index]\n const base = index * 4\n paletteBuffer[base] = color.r\n paletteBuffer[base + 1] = color.g\n paletteBuffer[base + 2] = color.b\n paletteBuffer[base + 3] = color.a\n }\n\n this.opentui.symbols.rendererSetPaletteState(\n renderer,\n paletteBuffer,\n palette.length,\n defaultForeground.buffer,\n defaultBackground.buffer,\n paletteEpoch >>> 0,\n )\n }\n\n public bufferGetCharPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetCharPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get char pointer\")\n }\n return ptr\n }\n\n public bufferGetFgPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetFgPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get fg pointer\")\n }\n return ptr\n }\n\n public bufferGetBgPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetBgPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get bg pointer\")\n }\n return ptr\n }\n\n public bufferGetFgTagPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetFgTagPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get fg tag pointer\")\n }\n return ptr\n }\n\n public bufferGetBgTagPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetBgTagPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get bg tag pointer\")\n }\n return ptr\n }\n\n public bufferGetAttributesPtr(buffer: Pointer): Pointer {\n const ptr = this.opentui.symbols.bufferGetAttributesPtr(buffer)\n if (!ptr) {\n throw new Error(\"Failed to get attributes pointer\")\n }\n return ptr\n }\n\n public bufferGetRespectAlpha(buffer: Pointer): boolean {\n return this.opentui.symbols.bufferGetRespectAlpha(buffer)\n }\n\n public bufferSetRespectAlpha(buffer: Pointer, respectAlpha: boolean): void {\n this.opentui.symbols.bufferSetRespectAlpha(buffer, respectAlpha)\n }\n\n public bufferGetId(buffer: Pointer): string {\n const maxLen = 256\n const outBuffer = new Uint8Array(maxLen)\n const actualLen = this.opentui.symbols.bufferGetId(buffer, outBuffer, maxLen)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n return this.decoder.decode(outBuffer.slice(0, len))\n }\n\n public bufferGetRealCharSize(buffer: Pointer): number {\n return this.opentui.symbols.bufferGetRealCharSize(buffer)\n }\n\n public bufferWriteResolvedChars(buffer: Pointer, outputBuffer: Uint8Array, addLineBreaks: boolean): number {\n const bytesWritten = this.opentui.symbols.bufferWriteResolvedChars(\n buffer,\n outputBuffer,\n outputBuffer.length,\n addLineBreaks,\n )\n return typeof bytesWritten === \"bigint\" ? Number(bytesWritten) : bytesWritten\n }\n\n public getBufferWidth(buffer: Pointer): number {\n return this.opentui.symbols.getBufferWidth(buffer)\n }\n\n public getBufferHeight(buffer: Pointer): number {\n return this.opentui.symbols.getBufferHeight(buffer)\n }\n\n public bufferClear(buffer: Pointer, color: RGBA) {\n this.opentui.symbols.bufferClear(buffer, color.buffer)\n }\n\n public bufferDrawText(\n buffer: Pointer,\n text: string,\n x: number,\n y: number,\n color: RGBA,\n bgColor?: RGBA,\n attributes?: number,\n ) {\n const textBytes = this.encoder.encode(text)\n const textLength = textBytes.byteLength\n const bg = bgColor ? bgColor.buffer : null\n const fg = color.buffer\n\n this.opentui.symbols.bufferDrawText(buffer, textBytes, textLength, x, y, fg, bg, attributes ?? 0)\n }\n\n public bufferSetCellWithAlphaBlending(\n buffer: Pointer,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) {\n const charPtr = char.codePointAt(0) ?? \" \".codePointAt(0)!\n const bg = bgColor.buffer\n const fg = color.buffer\n\n this.opentui.symbols.bufferSetCellWithAlphaBlending(buffer, x, y, charPtr, fg, bg, attributes ?? 0)\n }\n\n public bufferSetCell(\n buffer: Pointer,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) {\n const charPtr = char.codePointAt(0) ?? \" \".codePointAt(0)!\n const bg = bgColor.buffer\n const fg = color.buffer\n\n this.opentui.symbols.bufferSetCell(buffer, x, y, charPtr, fg, bg, attributes ?? 0)\n }\n\n public bufferFillRect(buffer: Pointer, x: number, y: number, width: number, height: number, color: RGBA) {\n const bg = color.buffer\n this.opentui.symbols.bufferFillRect(buffer, x, y, width, height, bg)\n }\n\n public bufferColorMatrix(\n buffer: Pointer,\n matrixPtr: Pointer,\n cellMaskPtr: Pointer,\n cellMaskCount: number,\n strength: number,\n target: TargetChannel,\n ): void {\n this.opentui.symbols.bufferColorMatrix(buffer, matrixPtr, cellMaskPtr, cellMaskCount, strength, target)\n }\n\n public bufferColorMatrixUniform(buffer: Pointer, matrixPtr: Pointer, strength: number, target: TargetChannel): void {\n this.opentui.symbols.bufferColorMatrixUniform(buffer, matrixPtr, strength, target)\n }\n\n public bufferDrawSuperSampleBuffer(\n buffer: Pointer,\n x: number,\n y: number,\n pixelDataPtr: Pointer,\n pixelDataLength: number,\n format: \"bgra8unorm\" | \"rgba8unorm\",\n alignedBytesPerRow: number,\n ): void {\n const formatId = format === \"bgra8unorm\" ? 0 : 1\n this.opentui.symbols.bufferDrawSuperSampleBuffer(\n buffer,\n x,\n y,\n pixelDataPtr,\n pixelDataLength,\n formatId,\n alignedBytesPerRow,\n )\n }\n\n public bufferDrawPackedBuffer(\n buffer: Pointer,\n dataPtr: Pointer,\n dataLen: number,\n posX: number,\n posY: number,\n terminalWidthCells: number,\n terminalHeightCells: number,\n ): void {\n this.opentui.symbols.bufferDrawPackedBuffer(\n buffer,\n dataPtr,\n dataLen,\n posX,\n posY,\n terminalWidthCells,\n terminalHeightCells,\n )\n }\n\n public bufferDrawGrayscaleBuffer(\n buffer: Pointer,\n posX: number,\n posY: number,\n intensitiesPtr: Pointer,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null,\n bg: RGBA | null,\n ): void {\n this.opentui.symbols.bufferDrawGrayscaleBuffer(\n buffer,\n posX,\n posY,\n intensitiesPtr,\n srcWidth,\n srcHeight,\n fg?.buffer ?? null,\n bg?.buffer ?? null,\n )\n }\n\n public bufferDrawGrayscaleBufferSupersampled(\n buffer: Pointer,\n posX: number,\n posY: number,\n intensitiesPtr: Pointer,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null,\n bg: RGBA | null,\n ): void {\n this.opentui.symbols.bufferDrawGrayscaleBufferSupersampled(\n buffer,\n posX,\n posY,\n intensitiesPtr,\n srcWidth,\n srcHeight,\n fg?.buffer ?? null,\n bg?.buffer ?? null,\n )\n }\n\n public bufferDrawGrid(\n buffer: Pointer,\n borderChars: Uint32Array,\n borderFg: RGBA,\n borderBg: RGBA,\n columnOffsets: Int32Array,\n columnCount: number,\n rowOffsets: Int32Array,\n rowCount: number,\n options: { drawInner: boolean; drawOuter: boolean },\n ): void {\n const optionsBuffer = GridDrawOptionsStruct.pack({\n drawInner: options.drawInner,\n drawOuter: options.drawOuter,\n })\n\n this.opentui.symbols.bufferDrawGrid(\n buffer,\n borderChars,\n borderFg.buffer,\n borderBg.buffer,\n columnOffsets,\n columnCount,\n rowOffsets,\n rowCount,\n ptr(optionsBuffer),\n )\n }\n\n public bufferDrawBox(\n buffer: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n borderChars: Uint32Array,\n packedOptions: number,\n borderColor: RGBA,\n backgroundColor: RGBA,\n title: string | null,\n bottomTitle: string | null,\n ): void {\n const titleBytes = title ? this.encoder.encode(title) : null\n const titleLen = title ? titleBytes!.length : 0\n const titlePtr = title ? titleBytes : null\n\n const bottomTitleBytes = bottomTitle ? this.encoder.encode(bottomTitle) : null\n const bottomTitleLen = bottomTitle ? bottomTitleBytes!.length : 0\n const bottomTitlePtr = bottomTitle ? bottomTitleBytes : null\n\n this.opentui.symbols.bufferDrawBox(\n buffer,\n x,\n y,\n width,\n height,\n borderChars,\n packedOptions,\n borderColor.buffer,\n backgroundColor.buffer,\n titlePtr,\n titleLen,\n bottomTitlePtr,\n bottomTitleLen,\n )\n }\n\n public bufferResize(buffer: Pointer, width: number, height: number): void {\n this.opentui.symbols.bufferResize(buffer, width, height)\n }\n\n // Link API\n public linkAlloc(url: string): number {\n const urlBytes = this.encoder.encode(url)\n return this.opentui.symbols.linkAlloc(urlBytes, urlBytes.length)\n }\n\n public linkGetUrl(linkId: number, maxLen: number = 512): string {\n const outBuffer = new Uint8Array(maxLen)\n const actualLen = this.opentui.symbols.linkGetUrl(linkId, outBuffer, maxLen)\n return this.decoder.decode(outBuffer.slice(0, actualLen))\n }\n\n public attributesWithLink(baseAttributes: number, linkId: number): number {\n return this.opentui.symbols.attributesWithLink(baseAttributes, linkId)\n }\n\n public attributesGetLinkId(attributes: number): number {\n return this.opentui.symbols.attributesGetLinkId(attributes)\n }\n\n public resizeRenderer(renderer: Pointer, width: number, height: number) {\n this.opentui.symbols.resizeRenderer(renderer, width, height)\n }\n\n public setCursorPosition(renderer: Pointer, x: number, y: number, visible: boolean) {\n this.opentui.symbols.setCursorPosition(renderer, x, y, visible)\n }\n\n public setCursorColor(renderer: Pointer, color: RGBA) {\n this.opentui.symbols.setCursorColor(renderer, color.buffer)\n }\n\n public getCursorState(renderer: Pointer): CursorState {\n const cursorBuffer = new ArrayBuffer(CursorStateStruct.size)\n this.opentui.symbols.getCursorState(renderer, ptr(cursorBuffer))\n const struct = CursorStateStruct.unpack(cursorBuffer)\n\n return {\n x: struct.x,\n y: struct.y,\n visible: struct.visible,\n style: CURSOR_ID_TO_STYLE[struct.style] ?? \"block\",\n blinking: struct.blinking,\n color: RGBA.fromValues(struct.r, struct.g, struct.b, struct.a),\n }\n }\n\n public setCursorStyleOptions(renderer: Pointer, options: CursorStyleOptions): void {\n const style = options.style != null ? CURSOR_STYLE_TO_ID[options.style] : 255\n const blinking = options.blinking != null ? (options.blinking ? 1 : 0) : 255\n const cursor = options.cursor != null ? MOUSE_STYLE_TO_ID[options.cursor] : 255\n\n const buffer = CursorStyleOptionsStruct.pack({ style, blinking, color: options.color, cursor })\n this.opentui.symbols.setCursorStyleOptions(renderer, ptr(buffer))\n }\n\n public render(renderer: Pointer, force: boolean) {\n this.opentui.symbols.render(renderer, force)\n }\n\n public repaintSplitFooter(renderer: Pointer, pinnedRenderOffset: number, force: boolean): number {\n return this.opentui.symbols.repaintSplitFooter(renderer, pinnedRenderOffset, force)\n }\n\n public commitSplitFooterSnapshot(\n renderer: Pointer,\n snapshot: OptimizedBuffer,\n rowColumns: number,\n startOnNewLine: boolean,\n trailingNewline: boolean,\n pinnedRenderOffset: number,\n force: boolean,\n beginFrame: boolean = true,\n finalizeFrame: boolean = true,\n ): number {\n return this.opentui.symbols.commitSplitFooterSnapshot(\n renderer,\n snapshot.ptr,\n rowColumns,\n startOnNewLine,\n trailingNewline,\n pinnedRenderOffset,\n force,\n beginFrame,\n finalizeFrame,\n )\n }\n\n public createOptimizedBuffer(\n width: number,\n height: number,\n widthMethod: WidthMethod,\n respectAlpha: boolean = false,\n id?: string,\n ): OptimizedBuffer {\n if (Number.isNaN(width) || Number.isNaN(height)) {\n console.error(new Error(`Invalid dimensions for OptimizedBuffer: ${width}x${height}`).stack)\n }\n\n const widthMethodCode = widthMethod === \"wcwidth\" ? 0 : 1\n const idToUse = id || \"unnamed buffer\"\n const idBytes = this.encoder.encode(idToUse)\n const bufferPtr = this.opentui.symbols.createOptimizedBuffer(\n width,\n height,\n respectAlpha,\n widthMethodCode,\n idBytes,\n idBytes.length,\n )\n if (!bufferPtr) {\n throw new Error(`Failed to create optimized buffer: ${width}x${height}`)\n }\n\n return new OptimizedBuffer(this, bufferPtr, width, height, { respectAlpha, id, widthMethod })\n }\n\n public destroyOptimizedBuffer(bufferPtr: Pointer) {\n this.opentui.symbols.destroyOptimizedBuffer(bufferPtr)\n }\n\n public drawFrameBuffer(\n targetBufferPtr: Pointer,\n destX: number,\n destY: number,\n bufferPtr: Pointer,\n sourceX?: number,\n sourceY?: number,\n sourceWidth?: number,\n sourceHeight?: number,\n ) {\n const srcX = sourceX ?? 0\n const srcY = sourceY ?? 0\n const srcWidth = sourceWidth ?? 0\n const srcHeight = sourceHeight ?? 0\n this.opentui.symbols.drawFrameBuffer(targetBufferPtr, destX, destY, bufferPtr, srcX, srcY, srcWidth, srcHeight)\n }\n\n public setDebugOverlay(renderer: Pointer, enabled: boolean, corner: DebugOverlayCorner) {\n this.opentui.symbols.setDebugOverlay(renderer, enabled, corner)\n }\n\n public clearTerminal(renderer: Pointer) {\n this.opentui.symbols.clearTerminal(renderer)\n }\n\n public setTerminalTitle(renderer: Pointer, title: string) {\n const titleBytes = this.encoder.encode(title)\n this.opentui.symbols.setTerminalTitle(renderer, titleBytes, titleBytes.length)\n }\n\n public copyToClipboardOSC52(renderer: Pointer, target: number, payload: Uint8Array): boolean {\n return this.opentui.symbols.copyToClipboardOSC52(renderer, target, payload, payload.length)\n }\n\n public clearClipboardOSC52(renderer: Pointer, target: number): boolean {\n return this.opentui.symbols.clearClipboardOSC52(renderer, target)\n }\n\n public addToHitGrid(renderer: Pointer, x: number, y: number, width: number, height: number, id: number) {\n this.opentui.symbols.addToHitGrid(renderer, x, y, width, height, id)\n }\n\n public clearCurrentHitGrid(renderer: Pointer) {\n this.opentui.symbols.clearCurrentHitGrid(renderer)\n }\n\n public hitGridPushScissorRect(renderer: Pointer, x: number, y: number, width: number, height: number) {\n this.opentui.symbols.hitGridPushScissorRect(renderer, x, y, width, height)\n }\n\n public hitGridPopScissorRect(renderer: Pointer) {\n this.opentui.symbols.hitGridPopScissorRect(renderer)\n }\n\n public hitGridClearScissorRects(renderer: Pointer) {\n this.opentui.symbols.hitGridClearScissorRects(renderer)\n }\n\n public addToCurrentHitGridClipped(\n renderer: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n id: number,\n ) {\n this.opentui.symbols.addToCurrentHitGridClipped(renderer, x, y, width, height, id)\n }\n\n public checkHit(renderer: Pointer, x: number, y: number): number {\n return this.opentui.symbols.checkHit(renderer, x, y)\n }\n\n public getHitGridDirty(renderer: Pointer): boolean {\n return this.opentui.symbols.getHitGridDirty(renderer)\n }\n\n public dumpHitGrid(renderer: Pointer): void {\n this.opentui.symbols.dumpHitGrid(renderer)\n }\n\n public dumpBuffers(renderer: Pointer, timestamp?: number): void {\n const ts = timestamp ?? Date.now()\n this.opentui.symbols.dumpBuffers(renderer, ts)\n }\n\n public dumpStdoutBuffer(renderer: Pointer, timestamp?: number): void {\n const ts = timestamp ?? Date.now()\n this.opentui.symbols.dumpStdoutBuffer(renderer, ts)\n }\n\n public restoreTerminalModes(renderer: Pointer): void {\n this.opentui.symbols.restoreTerminalModes(renderer)\n }\n\n public enableMouse(renderer: Pointer, enableMovement: boolean): void {\n this.opentui.symbols.enableMouse(renderer, enableMovement)\n }\n\n public disableMouse(renderer: Pointer): void {\n this.opentui.symbols.disableMouse(renderer)\n }\n\n public enableKittyKeyboard(renderer: Pointer, flags: number): void {\n this.opentui.symbols.enableKittyKeyboard(renderer, flags)\n }\n\n public disableKittyKeyboard(renderer: Pointer): void {\n this.opentui.symbols.disableKittyKeyboard(renderer)\n }\n\n public setKittyKeyboardFlags(renderer: Pointer, flags: number): void {\n this.opentui.symbols.setKittyKeyboardFlags(renderer, flags)\n }\n\n public getKittyKeyboardFlags(renderer: Pointer): number {\n return this.opentui.symbols.getKittyKeyboardFlags(renderer)\n }\n\n public setupTerminal(renderer: Pointer, useAlternateScreen: boolean): void {\n this.opentui.symbols.setupTerminal(renderer, useAlternateScreen)\n }\n\n public suspendRenderer(renderer: Pointer): void {\n this.opentui.symbols.suspendRenderer(renderer)\n }\n\n public resumeRenderer(renderer: Pointer): void {\n this.opentui.symbols.resumeRenderer(renderer)\n }\n\n public queryPixelResolution(renderer: Pointer): void {\n this.opentui.symbols.queryPixelResolution(renderer)\n }\n\n public queryThemeColors(renderer: Pointer): void {\n this.opentui.symbols.queryThemeColors(renderer)\n }\n\n /**\n * Write data to stdout, synchronizing with the render thread if necessary.\n * This should be used for ALL stdout writes to avoid race conditions when\n * the render thread is active.\n */\n public writeOut(renderer: Pointer, data: string | Uint8Array): void {\n const bytes = typeof data === \"string\" ? new TextEncoder().encode(data) : data\n if (bytes.length === 0) return\n this.opentui.symbols.writeOut(renderer, ptr(bytes), bytes.length)\n }\n\n // TextBuffer methods\n public createTextBuffer(widthMethod: WidthMethod): TextBuffer {\n const widthMethodCode = widthMethod === \"wcwidth\" ? 0 : 1\n const bufferPtr = this.opentui.symbols.createTextBuffer(widthMethodCode)\n if (!bufferPtr) {\n throw new Error(`Failed to create TextBuffer`)\n }\n\n return new TextBuffer(this, bufferPtr)\n }\n\n public destroyTextBuffer(buffer: Pointer): void {\n this.opentui.symbols.destroyTextBuffer(buffer)\n }\n\n public textBufferGetLength(buffer: Pointer): number {\n return this.opentui.symbols.textBufferGetLength(buffer)\n }\n\n public textBufferGetByteSize(buffer: Pointer): number {\n return this.opentui.symbols.textBufferGetByteSize(buffer)\n }\n\n public textBufferReset(buffer: Pointer): void {\n this.opentui.symbols.textBufferReset(buffer)\n }\n\n public textBufferClear(buffer: Pointer): void {\n this.opentui.symbols.textBufferClear(buffer)\n }\n\n public textBufferSetDefaultFg(buffer: Pointer, fg: RGBA | null): void {\n const fgPtr = fg ? fg.buffer : null\n this.opentui.symbols.textBufferSetDefaultFg(buffer, fgPtr)\n }\n\n public textBufferSetDefaultBg(buffer: Pointer, bg: RGBA | null): void {\n const bgPtr = bg ? bg.buffer : null\n this.opentui.symbols.textBufferSetDefaultBg(buffer, bgPtr)\n }\n\n public textBufferSetDefaultAttributes(buffer: Pointer, attributes: number | null): void {\n const attrValue = attributes === null ? null : new Uint8Array([attributes])\n this.opentui.symbols.textBufferSetDefaultAttributes(buffer, attrValue)\n }\n\n public textBufferResetDefaults(buffer: Pointer): void {\n this.opentui.symbols.textBufferResetDefaults(buffer)\n }\n\n public textBufferGetTabWidth(buffer: Pointer): number {\n return this.opentui.symbols.textBufferGetTabWidth(buffer)\n }\n\n public textBufferSetTabWidth(buffer: Pointer, width: number): void {\n this.opentui.symbols.textBufferSetTabWidth(buffer, width)\n }\n\n public textBufferRegisterMemBuffer(buffer: Pointer, bytes: Uint8Array, owned: boolean = false): number {\n const result = this.opentui.symbols.textBufferRegisterMemBuffer(buffer, bytes, bytes.length, owned)\n if (result === 0xffff) {\n throw new Error(\"Failed to register memory buffer\")\n }\n return result\n }\n\n public textBufferReplaceMemBuffer(\n buffer: Pointer,\n memId: number,\n bytes: Uint8Array,\n owned: boolean = false,\n ): boolean {\n return this.opentui.symbols.textBufferReplaceMemBuffer(buffer, memId, bytes, bytes.length, owned)\n }\n\n public textBufferClearMemRegistry(buffer: Pointer): void {\n this.opentui.symbols.textBufferClearMemRegistry(buffer)\n }\n\n public textBufferSetTextFromMem(buffer: Pointer, memId: number): void {\n this.opentui.symbols.textBufferSetTextFromMem(buffer, memId)\n }\n\n public textBufferAppend(buffer: Pointer, bytes: Uint8Array): void {\n this.opentui.symbols.textBufferAppend(buffer, bytes, bytes.length)\n }\n\n public textBufferAppendFromMemId(buffer: Pointer, memId: number): void {\n this.opentui.symbols.textBufferAppendFromMemId(buffer, memId)\n }\n\n public textBufferLoadFile(buffer: Pointer, path: string): boolean {\n const pathBytes = this.encoder.encode(path)\n return this.opentui.symbols.textBufferLoadFile(buffer, pathBytes, pathBytes.length)\n }\n\n public textBufferSetStyledText(\n buffer: Pointer,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number; link?: { url: string } }>,\n ): void {\n if (chunks.length === 0) {\n this.textBufferClear(buffer)\n return\n }\n\n const chunksBuffer = StyledChunkStruct.packList(chunks)\n this.opentui.symbols.textBufferSetStyledText(buffer, ptr(chunksBuffer), chunks.length)\n }\n\n public textBufferGetLineCount(buffer: Pointer): number {\n return this.opentui.symbols.textBufferGetLineCount(buffer)\n }\n\n private textBufferGetPlainText(buffer: Pointer, outPtr: Pointer, maxLen: number): number {\n const result = this.opentui.symbols.textBufferGetPlainText(buffer, outPtr, maxLen)\n return typeof result === \"bigint\" ? Number(result) : result\n }\n\n public getPlainTextBytes(buffer: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.textBufferGetPlainText(buffer, ptr(outBuffer), maxLength)\n\n if (actualLen === 0) {\n return null\n }\n\n return outBuffer.slice(0, actualLen)\n }\n\n public textBufferGetTextRange(\n buffer: Pointer,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.opentui.symbols.textBufferGetTextRange(\n buffer,\n startOffset,\n endOffset,\n ptr(outBuffer),\n maxLength,\n )\n\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n\n if (len === 0) {\n return null\n }\n\n return outBuffer.slice(0, len)\n }\n\n public textBufferGetTextRangeByCoords(\n buffer: Pointer,\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n maxLength: number,\n ): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.opentui.symbols.textBufferGetTextRangeByCoords(\n buffer,\n startRow,\n startCol,\n endRow,\n endCol,\n ptr(outBuffer),\n maxLength,\n )\n\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n\n if (len === 0) {\n return null\n }\n\n return outBuffer.slice(0, len)\n }\n\n // TextBufferView methods\n public createTextBufferView(textBuffer: Pointer): Pointer {\n const viewPtr = this.opentui.symbols.createTextBufferView(textBuffer)\n if (!viewPtr) {\n throw new Error(\"Failed to create TextBufferView\")\n }\n return viewPtr\n }\n\n public destroyTextBufferView(view: Pointer): void {\n this.opentui.symbols.destroyTextBufferView(view)\n }\n\n public textBufferViewSetSelection(\n view: Pointer,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ): void {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n this.opentui.symbols.textBufferViewSetSelection(view, start, end, bg, fg)\n }\n\n public textBufferViewResetSelection(view: Pointer): void {\n this.opentui.symbols.textBufferViewResetSelection(view)\n }\n\n public textBufferViewGetSelection(view: Pointer): { start: number; end: number } | null {\n const packedInfo = this.textBufferViewGetSelectionInfo(view)\n\n // Check for no selection marker (0xFFFFFFFF_FFFFFFFF)\n if (packedInfo === 0xffff_ffff_ffff_ffffn) {\n return null\n }\n\n const start = Number(packedInfo >> 32n)\n const end = Number(packedInfo & 0xffff_ffffn)\n\n return { start, end }\n }\n\n private textBufferViewGetSelectionInfo(view: Pointer): bigint {\n return this.opentui.symbols.textBufferViewGetSelectionInfo(view)\n }\n\n public textBufferViewSetLocalSelection(\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ): boolean {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n return this.opentui.symbols.textBufferViewSetLocalSelection(view, anchorX, anchorY, focusX, focusY, bg, fg)\n }\n\n public textBufferViewUpdateSelection(view: Pointer, end: number, bgColor: RGBA | null, fgColor: RGBA | null): void {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n this.opentui.symbols.textBufferViewUpdateSelection(view, end, bg, fg)\n }\n\n public textBufferViewUpdateLocalSelection(\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ): boolean {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n return this.opentui.symbols.textBufferViewUpdateLocalSelection(view, anchorX, anchorY, focusX, focusY, bg, fg)\n }\n\n public textBufferViewResetLocalSelection(view: Pointer): void {\n this.opentui.symbols.textBufferViewResetLocalSelection(view)\n }\n\n public textBufferViewSetWrapWidth(view: Pointer, width: number): void {\n this.opentui.symbols.textBufferViewSetWrapWidth(view, width)\n }\n\n public textBufferViewSetWrapMode(view: Pointer, mode: \"none\" | \"char\" | \"word\"): void {\n const modeValue = mode === \"none\" ? 0 : mode === \"char\" ? 1 : 2\n this.opentui.symbols.textBufferViewSetWrapMode(view, modeValue)\n }\n\n public textBufferViewSetFirstLineOffset(view: Pointer, offset: number): void {\n this.opentui.symbols.textBufferViewSetFirstLineOffset(view, offset)\n }\n\n public textBufferViewSetViewportSize(view: Pointer, width: number, height: number): void {\n this.opentui.symbols.textBufferViewSetViewportSize(view, width, height)\n }\n\n public textBufferViewSetViewport(view: Pointer, x: number, y: number, width: number, height: number): void {\n this.opentui.symbols.textBufferViewSetViewport(view, x, y, width, height)\n }\n\n public textBufferViewGetLineInfo(view: Pointer): LineInfo {\n const outBuffer = new ArrayBuffer(LineInfoStruct.size)\n this.textBufferViewGetLineInfoDirect(view, ptr(outBuffer))\n const struct = LineInfoStruct.unpack(outBuffer)\n\n const lineStartCols = struct.startCols as number[]\n const lineWidthCols = struct.widthCols as number[]\n const lineWidthColsMax = struct.widthColsMax\n\n return {\n lineStartCols,\n lineWidthCols,\n lineWidthColsMax,\n lineSources: struct.sources as number[],\n lineWraps: struct.wraps as number[],\n }\n }\n\n public textBufferViewGetLogicalLineInfo(view: Pointer): LineInfo {\n const outBuffer = new ArrayBuffer(LineInfoStruct.size)\n this.textBufferViewGetLogicalLineInfoDirect(view, ptr(outBuffer))\n const struct = LineInfoStruct.unpack(outBuffer)\n\n const lineStartCols = struct.startCols as number[]\n const lineWidthCols = struct.widthCols as number[]\n const lineWidthColsMax = struct.widthColsMax\n\n return {\n lineStartCols,\n lineWidthCols,\n lineWidthColsMax,\n lineSources: struct.sources as number[],\n lineWraps: struct.wraps as number[],\n }\n }\n\n public textBufferViewGetVirtualLineCount(view: Pointer): number {\n return this.opentui.symbols.textBufferViewGetVirtualLineCount(view)\n }\n\n private textBufferViewGetLineInfoDirect(view: Pointer, outPtr: Pointer): void {\n this.opentui.symbols.textBufferViewGetLineInfoDirect(view, outPtr)\n }\n\n private textBufferViewGetLogicalLineInfoDirect(view: Pointer, outPtr: Pointer): void {\n this.opentui.symbols.textBufferViewGetLogicalLineInfoDirect(view, outPtr)\n }\n\n private textBufferViewGetSelectedText(view: Pointer, outPtr: Pointer, maxLen: number): number {\n const result = this.opentui.symbols.textBufferViewGetSelectedText(view, outPtr, maxLen)\n return typeof result === \"bigint\" ? Number(result) : result\n }\n\n private textBufferViewGetPlainText(view: Pointer, outPtr: Pointer, maxLen: number): number {\n const result = this.opentui.symbols.textBufferViewGetPlainText(view, outPtr, maxLen)\n return typeof result === \"bigint\" ? Number(result) : result\n }\n\n public textBufferViewGetSelectedTextBytes(view: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.textBufferViewGetSelectedText(view, ptr(outBuffer), maxLength)\n\n if (actualLen === 0) {\n return null\n }\n\n return outBuffer.slice(0, actualLen)\n }\n\n public textBufferViewGetPlainTextBytes(view: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.textBufferViewGetPlainText(view, ptr(outBuffer), maxLength)\n\n if (actualLen === 0) {\n return null\n }\n\n return outBuffer.slice(0, actualLen)\n }\n\n public textBufferViewSetTabIndicator(view: Pointer, indicator: number): void {\n this.opentui.symbols.textBufferViewSetTabIndicator(view, indicator)\n }\n\n public textBufferViewSetTabIndicatorColor(view: Pointer, color: RGBA): void {\n this.opentui.symbols.textBufferViewSetTabIndicatorColor(view, color.buffer)\n }\n\n public textBufferViewSetTruncate(view: Pointer, truncate: boolean): void {\n this.opentui.symbols.textBufferViewSetTruncate(view, truncate)\n }\n\n public textBufferViewMeasureForDimensions(\n view: Pointer,\n width: number,\n height: number,\n ): { lineCount: number; widthColsMax: number } | null {\n const resultBuffer = new ArrayBuffer(MeasureResultStruct.size)\n const resultPtr = ptr(new Uint8Array(resultBuffer))\n const success = this.opentui.symbols.textBufferViewMeasureForDimensions(view, width, height, resultPtr)\n if (!success) {\n return null\n }\n const result = MeasureResultStruct.unpack(resultBuffer)\n return result\n }\n\n public textBufferAddHighlightByCharRange(buffer: Pointer, highlight: Highlight): void {\n const packedHighlight = HighlightStruct.pack(highlight)\n this.opentui.symbols.textBufferAddHighlightByCharRange(buffer, ptr(packedHighlight))\n }\n\n public textBufferAddHighlight(buffer: Pointer, lineIdx: number, highlight: Highlight): void {\n const packedHighlight = HighlightStruct.pack(highlight)\n this.opentui.symbols.textBufferAddHighlight(buffer, lineIdx, ptr(packedHighlight))\n }\n\n public textBufferRemoveHighlightsByRef(buffer: Pointer, hlRef: number): void {\n this.opentui.symbols.textBufferRemoveHighlightsByRef(buffer, hlRef)\n }\n\n public textBufferClearLineHighlights(buffer: Pointer, lineIdx: number): void {\n this.opentui.symbols.textBufferClearLineHighlights(buffer, lineIdx)\n }\n\n public textBufferClearAllHighlights(buffer: Pointer): void {\n this.opentui.symbols.textBufferClearAllHighlights(buffer)\n }\n\n public textBufferSetSyntaxStyle(buffer: Pointer, style: Pointer | null): void {\n this.opentui.symbols.textBufferSetSyntaxStyle(buffer, style)\n }\n\n public textBufferGetLineHighlights(buffer: Pointer, lineIdx: number): Array<Highlight> {\n const outCountBuf = new BigUint64Array(1)\n\n const nativePtr = this.opentui.symbols.textBufferGetLineHighlightsPtr(buffer, lineIdx, ptr(outCountBuf))\n if (!nativePtr) return []\n\n const count = Number(outCountBuf[0])\n const byteLen = count * HighlightStruct.size\n const raw = toArrayBuffer(nativePtr, 0, byteLen)\n const results = HighlightStruct.unpackList(raw, count)\n\n this.opentui.symbols.textBufferFreeLineHighlights(nativePtr, count)\n\n return results\n }\n\n public textBufferGetHighlightCount(buffer: Pointer): number {\n return this.opentui.symbols.textBufferGetHighlightCount(buffer)\n }\n\n public getArenaAllocatedBytes(): number {\n const result = this.opentui.symbols.getArenaAllocatedBytes()\n return typeof result === \"bigint\" ? Number(result) : result\n }\n\n public getBuildOptions(): BuildOptions {\n const optionsBuffer = new ArrayBuffer(BuildOptionsStruct.size)\n this.opentui.symbols.getBuildOptions(ptr(optionsBuffer))\n const options = BuildOptionsStruct.unpack(optionsBuffer)\n\n return {\n gpaSafeStats: !!options.gpaSafeStats,\n gpaMemoryLimitTracking: !!options.gpaMemoryLimitTracking,\n }\n }\n\n public getAllocatorStats(): AllocatorStats {\n const statsBuffer = new ArrayBuffer(AllocatorStatsStruct.size)\n this.opentui.symbols.getAllocatorStats(ptr(statsBuffer))\n const stats = AllocatorStatsStruct.unpack(statsBuffer)\n\n return {\n totalRequestedBytes: toNumber(stats.totalRequestedBytes),\n activeAllocations: toNumber(stats.activeAllocations),\n smallAllocations: toNumber(stats.smallAllocations),\n largeAllocations: toNumber(stats.largeAllocations),\n requestedBytesValid: !!stats.requestedBytesValid,\n }\n }\n\n public bufferDrawTextBufferView(buffer: Pointer, view: Pointer, x: number, y: number): void {\n this.opentui.symbols.bufferDrawTextBufferView(buffer, view, x, y)\n }\n\n public bufferDrawEditorView(buffer: Pointer, view: Pointer, x: number, y: number): void {\n this.opentui.symbols.bufferDrawEditorView(buffer, view, x, y)\n }\n\n // EditorView methods\n public createEditorView(editBufferPtr: Pointer, viewportWidth: number, viewportHeight: number): Pointer {\n const viewPtr = this.opentui.symbols.createEditorView(editBufferPtr, viewportWidth, viewportHeight)\n if (!viewPtr) {\n throw new Error(\"Failed to create EditorView\")\n }\n return viewPtr\n }\n\n public destroyEditorView(view: Pointer): void {\n this.opentui.symbols.destroyEditorView(view)\n }\n\n public editorViewSetViewportSize(view: Pointer, width: number, height: number): void {\n this.opentui.symbols.editorViewSetViewportSize(view, width, height)\n }\n\n public editorViewSetViewport(\n view: Pointer,\n x: number,\n y: number,\n width: number,\n height: number,\n moveCursor: boolean,\n ): void {\n this.opentui.symbols.editorViewSetViewport(view, x, y, width, height, moveCursor)\n }\n\n public editorViewGetViewport(view: Pointer): { offsetY: number; offsetX: number; height: number; width: number } {\n const x = new Uint32Array(1)\n const y = new Uint32Array(1)\n const width = new Uint32Array(1)\n const height = new Uint32Array(1)\n\n this.opentui.symbols.editorViewGetViewport(view, ptr(x), ptr(y), ptr(width), ptr(height))\n\n return {\n offsetX: x[0],\n offsetY: y[0],\n width: width[0],\n height: height[0],\n }\n }\n\n public editorViewSetScrollMargin(view: Pointer, margin: number): void {\n this.opentui.symbols.editorViewSetScrollMargin(view, margin)\n }\n\n public editorViewSetWrapMode(view: Pointer, mode: \"none\" | \"char\" | \"word\"): void {\n const modeValue = mode === \"none\" ? 0 : mode === \"char\" ? 1 : 2\n this.opentui.symbols.editorViewSetWrapMode(view, modeValue)\n }\n\n public editorViewGetVirtualLineCount(view: Pointer): number {\n return this.opentui.symbols.editorViewGetVirtualLineCount(view)\n }\n\n public editorViewGetTotalVirtualLineCount(view: Pointer): number {\n return this.opentui.symbols.editorViewGetTotalVirtualLineCount(view)\n }\n\n public editorViewGetTextBufferView(view: Pointer): Pointer {\n const result = this.opentui.symbols.editorViewGetTextBufferView(view)\n if (!result) {\n throw new Error(\"Failed to get TextBufferView from EditorView\")\n }\n return result\n }\n\n public editorViewGetLineInfo(view: Pointer): LineInfo {\n const outBuffer = new ArrayBuffer(LineInfoStruct.size)\n this.opentui.symbols.editorViewGetLineInfoDirect(view, ptr(outBuffer))\n const struct = LineInfoStruct.unpack(outBuffer)\n\n const lineStartCols = struct.startCols as number[]\n const lineWidthCols = struct.widthCols as number[]\n const lineWidthColsMax = struct.widthColsMax\n\n return {\n lineStartCols,\n lineWidthCols,\n lineWidthColsMax,\n lineSources: struct.sources as number[],\n lineWraps: struct.wraps as number[],\n }\n }\n\n public editorViewGetLogicalLineInfo(view: Pointer): LineInfo {\n const outBuffer = new ArrayBuffer(LineInfoStruct.size)\n this.opentui.symbols.editorViewGetLogicalLineInfoDirect(view, ptr(outBuffer))\n const struct = LineInfoStruct.unpack(outBuffer)\n\n const lineStartCols = struct.startCols as number[]\n const lineWidthCols = struct.widthCols as number[]\n const lineWidthColsMax = struct.widthColsMax\n\n return {\n lineStartCols,\n lineWidthCols,\n lineWidthColsMax,\n lineSources: struct.sources as number[],\n lineWraps: struct.wraps as number[],\n }\n }\n\n // EditBuffer implementations\n public createEditBuffer(widthMethod: WidthMethod): Pointer {\n const widthMethodCode = widthMethod === \"wcwidth\" ? 0 : 1\n const bufferPtr = this.opentui.symbols.createEditBuffer(widthMethodCode)\n if (!bufferPtr) {\n throw new Error(\"Failed to create EditBuffer\")\n }\n return bufferPtr\n }\n\n public destroyEditBuffer(buffer: Pointer): void {\n this.opentui.symbols.destroyEditBuffer(buffer)\n }\n\n public editBufferSetText(buffer: Pointer, textBytes: Uint8Array): void {\n this.opentui.symbols.editBufferSetText(buffer, textBytes, textBytes.length)\n }\n\n public editBufferSetTextFromMem(buffer: Pointer, memId: number): void {\n this.opentui.symbols.editBufferSetTextFromMem(buffer, memId)\n }\n\n public editBufferReplaceText(buffer: Pointer, textBytes: Uint8Array): void {\n this.opentui.symbols.editBufferReplaceText(buffer, textBytes, textBytes.length)\n }\n\n public editBufferReplaceTextFromMem(buffer: Pointer, memId: number): void {\n this.opentui.symbols.editBufferReplaceTextFromMem(buffer, memId)\n }\n\n public editBufferGetText(buffer: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editBufferGetText(buffer, ptr(outBuffer), maxLength)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editBufferInsertChar(buffer: Pointer, char: string): void {\n const charBytes = this.encoder.encode(char)\n this.opentui.symbols.editBufferInsertChar(buffer, charBytes, charBytes.length)\n }\n\n public editBufferInsertText(buffer: Pointer, text: string): void {\n const textBytes = this.encoder.encode(text)\n this.opentui.symbols.editBufferInsertText(buffer, textBytes, textBytes.length)\n }\n\n public editBufferDeleteChar(buffer: Pointer): void {\n this.opentui.symbols.editBufferDeleteChar(buffer)\n }\n\n public editBufferDeleteCharBackward(buffer: Pointer): void {\n this.opentui.symbols.editBufferDeleteCharBackward(buffer)\n }\n\n public editBufferDeleteRange(\n buffer: Pointer,\n startLine: number,\n startCol: number,\n endLine: number,\n endCol: number,\n ): void {\n this.opentui.symbols.editBufferDeleteRange(buffer, startLine, startCol, endLine, endCol)\n }\n\n public editBufferNewLine(buffer: Pointer): void {\n this.opentui.symbols.editBufferNewLine(buffer)\n }\n\n public editBufferDeleteLine(buffer: Pointer): void {\n this.opentui.symbols.editBufferDeleteLine(buffer)\n }\n\n public editBufferMoveCursorLeft(buffer: Pointer): void {\n this.opentui.symbols.editBufferMoveCursorLeft(buffer)\n }\n\n public editBufferMoveCursorRight(buffer: Pointer): void {\n this.opentui.symbols.editBufferMoveCursorRight(buffer)\n }\n\n public editBufferMoveCursorUp(buffer: Pointer): void {\n this.opentui.symbols.editBufferMoveCursorUp(buffer)\n }\n\n public editBufferMoveCursorDown(buffer: Pointer): void {\n this.opentui.symbols.editBufferMoveCursorDown(buffer)\n }\n\n public editBufferGotoLine(buffer: Pointer, line: number): void {\n this.opentui.symbols.editBufferGotoLine(buffer, line)\n }\n\n public editBufferSetCursor(buffer: Pointer, line: number, byteOffset: number): void {\n this.opentui.symbols.editBufferSetCursor(buffer, line, byteOffset)\n }\n\n public editBufferSetCursorToLineCol(buffer: Pointer, line: number, col: number): void {\n this.opentui.symbols.editBufferSetCursorToLineCol(buffer, line, col)\n }\n\n public editBufferSetCursorByOffset(buffer: Pointer, offset: number): void {\n this.opentui.symbols.editBufferSetCursorByOffset(buffer, offset)\n }\n\n public editBufferGetCursorPosition(buffer: Pointer): LogicalCursor {\n const cursorBuffer = new ArrayBuffer(LogicalCursorStruct.size)\n this.opentui.symbols.editBufferGetCursorPosition(buffer, ptr(cursorBuffer))\n return LogicalCursorStruct.unpack(cursorBuffer)\n }\n\n public editBufferGetId(buffer: Pointer): number {\n return this.opentui.symbols.editBufferGetId(buffer)\n }\n\n public editBufferGetTextBuffer(buffer: Pointer): Pointer {\n const result = this.opentui.symbols.editBufferGetTextBuffer(buffer)\n if (!result) {\n throw new Error(\"Failed to get TextBuffer from EditBuffer\")\n }\n return result\n }\n\n public editBufferDebugLogRope(buffer: Pointer): void {\n this.opentui.symbols.editBufferDebugLogRope(buffer)\n }\n\n public editBufferUndo(buffer: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editBufferUndo(buffer, ptr(outBuffer), maxLength)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editBufferRedo(buffer: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editBufferRedo(buffer, ptr(outBuffer), maxLength)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editBufferCanUndo(buffer: Pointer): boolean {\n return this.opentui.symbols.editBufferCanUndo(buffer)\n }\n\n public editBufferCanRedo(buffer: Pointer): boolean {\n return this.opentui.symbols.editBufferCanRedo(buffer)\n }\n\n public editBufferClearHistory(buffer: Pointer): void {\n this.opentui.symbols.editBufferClearHistory(buffer)\n }\n\n public editBufferClear(buffer: Pointer): void {\n this.opentui.symbols.editBufferClear(buffer)\n }\n\n public editBufferGetNextWordBoundary(buffer: Pointer): LogicalCursor {\n const cursorBuffer = new ArrayBuffer(LogicalCursorStruct.size)\n this.opentui.symbols.editBufferGetNextWordBoundary(buffer, ptr(cursorBuffer))\n return LogicalCursorStruct.unpack(cursorBuffer)\n }\n\n public editBufferGetPrevWordBoundary(buffer: Pointer): LogicalCursor {\n const cursorBuffer = new ArrayBuffer(LogicalCursorStruct.size)\n this.opentui.symbols.editBufferGetPrevWordBoundary(buffer, ptr(cursorBuffer))\n return LogicalCursorStruct.unpack(cursorBuffer)\n }\n\n public editBufferGetEOL(buffer: Pointer): LogicalCursor {\n const cursorBuffer = new ArrayBuffer(LogicalCursorStruct.size)\n this.opentui.symbols.editBufferGetEOL(buffer, ptr(cursorBuffer))\n return LogicalCursorStruct.unpack(cursorBuffer)\n }\n\n public editBufferOffsetToPosition(buffer: Pointer, offset: number): LogicalCursor | null {\n const cursorBuffer = new ArrayBuffer(LogicalCursorStruct.size)\n const success = this.opentui.symbols.editBufferOffsetToPosition(buffer, offset, ptr(cursorBuffer))\n if (!success) return null\n return LogicalCursorStruct.unpack(cursorBuffer)\n }\n\n public editBufferPositionToOffset(buffer: Pointer, row: number, col: number): number {\n return this.opentui.symbols.editBufferPositionToOffset(buffer, row, col)\n }\n\n public editBufferGetLineStartOffset(buffer: Pointer, row: number): number {\n return this.opentui.symbols.editBufferGetLineStartOffset(buffer, row)\n }\n\n public editBufferGetTextRange(\n buffer: Pointer,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editBufferGetTextRange(\n buffer,\n startOffset,\n endOffset,\n ptr(outBuffer),\n maxLength,\n )\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editBufferGetTextRangeByCoords(\n buffer: Pointer,\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n maxLength: number,\n ): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editBufferGetTextRangeByCoords(\n buffer,\n startRow,\n startCol,\n endRow,\n endCol,\n ptr(outBuffer),\n maxLength,\n )\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n // EditorView selection and editing implementations\n public editorViewSetSelection(\n view: Pointer,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ): void {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n this.opentui.symbols.editorViewSetSelection(view, start, end, bg, fg)\n }\n\n public editorViewResetSelection(view: Pointer): void {\n this.opentui.symbols.editorViewResetSelection(view)\n }\n\n public editorViewGetSelection(view: Pointer): { start: number; end: number } | null {\n const packedInfo = this.opentui.symbols.editorViewGetSelection(view)\n if (packedInfo === 0xffff_ffff_ffff_ffffn) {\n return null\n }\n const start = Number(packedInfo >> 32n)\n const end = Number(packedInfo & 0xffff_ffffn)\n return { start, end }\n }\n\n public editorViewSetLocalSelection(\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n updateCursor: boolean,\n followCursor: boolean,\n ): boolean {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n return this.opentui.symbols.editorViewSetLocalSelection(\n view,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bg,\n fg,\n updateCursor,\n followCursor,\n )\n }\n\n public editorViewUpdateSelection(view: Pointer, end: number, bgColor: RGBA | null, fgColor: RGBA | null): void {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n this.opentui.symbols.editorViewUpdateSelection(view, end, bg, fg)\n }\n\n public editorViewUpdateLocalSelection(\n view: Pointer,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n updateCursor: boolean,\n followCursor: boolean,\n ): boolean {\n const bg = bgColor ? bgColor.buffer : null\n const fg = fgColor ? fgColor.buffer : null\n return this.opentui.symbols.editorViewUpdateLocalSelection(\n view,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bg,\n fg,\n updateCursor,\n followCursor,\n )\n }\n\n public editorViewResetLocalSelection(view: Pointer): void {\n this.opentui.symbols.editorViewResetLocalSelection(view)\n }\n\n public editorViewGetSelectedTextBytes(view: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editorViewGetSelectedTextBytes(view, ptr(outBuffer), maxLength)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editorViewGetCursor(view: Pointer): { row: number; col: number } {\n const row = new Uint32Array(1)\n const col = new Uint32Array(1)\n this.opentui.symbols.editorViewGetCursor(view, ptr(row), ptr(col))\n return { row: row[0], col: col[0] }\n }\n\n public editorViewGetText(view: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n const actualLen = this.opentui.symbols.editorViewGetText(view, ptr(outBuffer), maxLength)\n const len = typeof actualLen === \"bigint\" ? Number(actualLen) : actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editorViewGetVisualCursor(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetVisualCursor(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public editorViewMoveUpVisual(view: Pointer): void {\n this.opentui.symbols.editorViewMoveUpVisual(view)\n }\n\n public editorViewMoveDownVisual(view: Pointer): void {\n this.opentui.symbols.editorViewMoveDownVisual(view)\n }\n\n public editorViewDeleteSelectedText(view: Pointer): void {\n this.opentui.symbols.editorViewDeleteSelectedText(view)\n }\n\n public editorViewSetCursorByOffset(view: Pointer, offset: number): void {\n this.opentui.symbols.editorViewSetCursorByOffset(view, offset)\n }\n\n public editorViewGetNextWordBoundary(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetNextWordBoundary(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public editorViewGetPrevWordBoundary(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetPrevWordBoundary(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public editorViewGetEOL(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetEOL(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public editorViewGetVisualSOL(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetVisualSOL(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public editorViewGetVisualEOL(view: Pointer): VisualCursor {\n const cursorBuffer = new ArrayBuffer(VisualCursorStruct.size)\n this.opentui.symbols.editorViewGetVisualEOL(view, ptr(cursorBuffer))\n return VisualCursorStruct.unpack(cursorBuffer)\n }\n\n public bufferPushScissorRect(buffer: Pointer, x: number, y: number, width: number, height: number): void {\n this.opentui.symbols.bufferPushScissorRect(buffer, x, y, width, height)\n }\n\n public bufferPopScissorRect(buffer: Pointer): void {\n this.opentui.symbols.bufferPopScissorRect(buffer)\n }\n\n public bufferClearScissorRects(buffer: Pointer): void {\n this.opentui.symbols.bufferClearScissorRects(buffer)\n }\n\n public bufferPushOpacity(buffer: Pointer, opacity: number): void {\n this.opentui.symbols.bufferPushOpacity(buffer, opacity)\n }\n\n public bufferPopOpacity(buffer: Pointer): void {\n this.opentui.symbols.bufferPopOpacity(buffer)\n }\n\n public bufferGetCurrentOpacity(buffer: Pointer): number {\n return this.opentui.symbols.bufferGetCurrentOpacity(buffer)\n }\n\n public bufferClearOpacity(buffer: Pointer): void {\n this.opentui.symbols.bufferClearOpacity(buffer)\n }\n\n public getTerminalCapabilities(renderer: Pointer) {\n const capsBuffer = new ArrayBuffer(TerminalCapabilitiesStruct.size)\n this.opentui.symbols.getTerminalCapabilities(renderer, ptr(capsBuffer))\n\n const caps = TerminalCapabilitiesStruct.unpack(capsBuffer)\n\n return {\n kitty_keyboard: caps.kitty_keyboard,\n kitty_graphics: caps.kitty_graphics,\n rgb: caps.rgb,\n ansi256: caps.ansi256,\n unicode: caps.unicode,\n sgr_pixels: caps.sgr_pixels,\n color_scheme_updates: caps.color_scheme_updates,\n explicit_width: caps.explicit_width,\n scaled_text: caps.scaled_text,\n sixel: caps.sixel,\n focus_tracking: caps.focus_tracking,\n sync: caps.sync,\n bracketed_paste: caps.bracketed_paste,\n hyperlinks: caps.hyperlinks,\n osc52: caps.osc52,\n explicit_cursor_positioning: caps.explicit_cursor_positioning,\n terminal: {\n name: caps.term_name ?? \"\",\n version: caps.term_version ?? \"\",\n from_xtversion: caps.term_from_xtversion,\n },\n }\n }\n\n public processCapabilityResponse(renderer: Pointer, response: string): void {\n const responseBytes = this.encoder.encode(response)\n this.opentui.symbols.processCapabilityResponse(renderer, responseBytes, responseBytes.length)\n }\n\n public encodeUnicode(\n text: string,\n widthMethod: WidthMethod,\n ): { ptr: Pointer; data: Array<{ width: number; char: number }> } | null {\n const textBytes = this.encoder.encode(text)\n const widthMethodCode = widthMethod === \"wcwidth\" ? 0 : 1\n\n const outPtrBuffer = new ArrayBuffer(8) // Pointer size\n const outLenBuffer = new ArrayBuffer(8) // usize\n\n const success = this.opentui.symbols.encodeUnicode(\n textBytes,\n textBytes.length,\n ptr(outPtrBuffer),\n ptr(outLenBuffer),\n widthMethodCode,\n )\n\n if (!success) {\n return null\n }\n\n const outPtrView = new BigUint64Array(outPtrBuffer)\n const outLenView = new BigUint64Array(outLenBuffer)\n\n const resultPtr = Number(outPtrView[0]) as Pointer\n const resultLen = Number(outLenView[0])\n\n if (resultLen === 0) {\n return { ptr: resultPtr, data: [] }\n }\n\n // Convert pointer to ArrayBuffer and use EncodedCharStruct to unpack the list\n const byteLen = resultLen * EncodedCharStruct.size\n const raw = toArrayBuffer(resultPtr, 0, byteLen)\n const data = EncodedCharStruct.unpackList(raw, resultLen)\n\n return { ptr: resultPtr, data }\n }\n\n public freeUnicode(encoded: { ptr: Pointer; data: Array<{ width: number; char: number }> }): void {\n this.opentui.symbols.freeUnicode(encoded.ptr, encoded.data.length)\n }\n\n public bufferDrawChar(\n buffer: Pointer,\n char: number,\n x: number,\n y: number,\n fg: RGBA,\n bg: RGBA,\n attributes: number = 0,\n ): void {\n this.opentui.symbols.bufferDrawChar(buffer, char, x, y, fg.buffer, bg.buffer, attributes)\n }\n\n public registerNativeSpanFeedStream(stream: Pointer, handler: NativeSpanFeedEventHandler): void {\n const callback = this.ensureNativeSpanFeedCallback()\n this.nativeSpanFeedHandlers.set(toPointer(stream), handler)\n this.opentui.symbols.streamSetCallback(stream, callback.ptr)\n }\n\n public unregisterNativeSpanFeedStream(stream: Pointer): void {\n this.opentui.symbols.streamSetCallback(stream, null)\n this.nativeSpanFeedHandlers.delete(toPointer(stream))\n }\n\n public createNativeSpanFeed(options?: NativeSpanFeedOptions | null): Pointer {\n const optionsBuffer = options == null ? null : NativeSpanFeedOptionsStruct.pack(options)\n const streamPtr = this.opentui.symbols.createNativeSpanFeed(optionsBuffer ? ptr(optionsBuffer) : null)\n if (!streamPtr) {\n throw new Error(\"Failed to create stream\")\n }\n return toPointer(streamPtr)\n }\n\n public attachNativeSpanFeed(stream: Pointer): number {\n return this.opentui.symbols.attachNativeSpanFeed(stream)\n }\n\n public destroyNativeSpanFeed(stream: Pointer): void {\n this.opentui.symbols.destroyNativeSpanFeed(stream)\n this.nativeSpanFeedHandlers.delete(toPointer(stream))\n }\n\n public streamWrite(stream: Pointer, data: Uint8Array | string): number {\n const bytes = typeof data === \"string\" ? this.encoder.encode(data) : data\n return this.opentui.symbols.streamWrite(stream, ptr(bytes), bytes.length)\n }\n\n public streamCommit(stream: Pointer): number {\n return this.opentui.symbols.streamCommit(stream)\n }\n\n public streamDrainSpans(stream: Pointer, outBuffer: Uint8Array, maxSpans: number): number {\n const count = this.opentui.symbols.streamDrainSpans(stream, ptr(outBuffer), maxSpans)\n return toNumber(count)\n }\n\n public streamClose(stream: Pointer): number {\n return this.opentui.symbols.streamClose(stream)\n }\n\n public streamSetOptions(stream: Pointer, options: NativeSpanFeedOptions): number {\n const optionsBuffer = NativeSpanFeedOptionsStruct.pack(options)\n return this.opentui.symbols.streamSetOptions(stream, ptr(optionsBuffer))\n }\n\n public streamGetStats(stream: Pointer): NativeSpanFeedStats | null {\n const statsBuffer = new ArrayBuffer(NativeSpanFeedStatsStruct.size)\n const status = this.opentui.symbols.streamGetStats(stream, ptr(statsBuffer))\n if (status !== 0) {\n return null\n }\n const stats = NativeSpanFeedStatsStruct.unpack(statsBuffer)\n return {\n bytesWritten: typeof stats.bytesWritten === \"bigint\" ? stats.bytesWritten : BigInt(stats.bytesWritten),\n spansCommitted: typeof stats.spansCommitted === \"bigint\" ? stats.spansCommitted : BigInt(stats.spansCommitted),\n chunks: stats.chunks,\n pendingSpans: stats.pendingSpans,\n }\n }\n\n public streamReserve(stream: Pointer, minLen: number): { status: number; info: ReserveInfo | null } {\n const reserveBuffer = new ArrayBuffer(ReserveInfoStruct.size)\n const status = this.opentui.symbols.streamReserve(stream, minLen, ptr(reserveBuffer))\n if (status !== 0) {\n return { status, info: null }\n }\n return { status, info: ReserveInfoStruct.unpack(reserveBuffer) }\n }\n\n public streamCommitReserved(stream: Pointer, length: number): number {\n return this.opentui.symbols.streamCommitReserved(stream, length)\n }\n\n public createSyntaxStyle(): Pointer {\n const stylePtr = this.opentui.symbols.createSyntaxStyle()\n if (!stylePtr) {\n throw new Error(\"Failed to create SyntaxStyle\")\n }\n return stylePtr\n }\n\n public destroySyntaxStyle(style: Pointer): void {\n this.opentui.symbols.destroySyntaxStyle(style)\n }\n\n public syntaxStyleRegister(\n style: Pointer,\n name: string,\n fg: RGBA | null,\n bg: RGBA | null,\n attributes: number,\n ): number {\n const nameBytes = this.encoder.encode(name)\n const fgPtr = fg ? fg.buffer : null\n const bgPtr = bg ? bg.buffer : null\n return this.opentui.symbols.syntaxStyleRegister(style, nameBytes, nameBytes.length, fgPtr, bgPtr, attributes)\n }\n\n public syntaxStyleResolveByName(style: Pointer, name: string): number | null {\n const nameBytes = this.encoder.encode(name)\n const id = this.opentui.symbols.syntaxStyleResolveByName(style, nameBytes, nameBytes.length)\n return id === 0 ? null : id\n }\n\n public syntaxStyleGetStyleCount(style: Pointer): number {\n const result = this.opentui.symbols.syntaxStyleGetStyleCount(style)\n return typeof result === \"bigint\" ? Number(result) : result\n }\n\n public editorViewSetPlaceholderStyledText(\n view: Pointer,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number }>,\n ): void {\n const nonEmptyChunks = chunks.filter((c) => c.text.length > 0)\n if (nonEmptyChunks.length === 0) {\n this.opentui.symbols.editorViewSetPlaceholderStyledText(view, null, 0)\n return\n }\n\n const chunksBuffer = StyledChunkStruct.packList(nonEmptyChunks)\n this.opentui.symbols.editorViewSetPlaceholderStyledText(view, ptr(chunksBuffer), nonEmptyChunks.length)\n }\n\n public editorViewSetTabIndicator(view: Pointer, indicator: number): void {\n this.opentui.symbols.editorViewSetTabIndicator(view, indicator)\n }\n\n public editorViewSetTabIndicatorColor(view: Pointer, color: RGBA): void {\n this.opentui.symbols.editorViewSetTabIndicatorColor(view, color.buffer)\n }\n\n public onNativeEvent(name: string, handler: (data: ArrayBuffer) => void): void {\n this._nativeEvents.on(name, handler)\n }\n\n public onceNativeEvent(name: string, handler: (data: ArrayBuffer) => void): void {\n this._nativeEvents.once(name, handler)\n }\n\n public offNativeEvent(name: string, handler: (data: ArrayBuffer) => void): void {\n this._nativeEvents.off(name, handler)\n }\n\n public onAnyNativeEvent(handler: (name: string, data: ArrayBuffer) => void): void {\n this._anyEventHandlers.push(handler)\n }\n}\n\nlet opentuiLibPath: string | undefined\nlet opentuiLib: RenderLib | undefined\n\nexport function setRenderLibPath(libPath: string) {\n if (opentuiLibPath !== libPath) {\n opentuiLibPath = libPath\n opentuiLib = undefined\n }\n}\n\nexport function resolveRenderLib(): RenderLib {\n if (!opentuiLib) {\n try {\n opentuiLib = new FFIRenderLib(opentuiLibPath)\n } catch (error) {\n throw new Error(\n `Failed to initialize OpenTUI render library: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n )\n }\n }\n return opentuiLib\n}\n\n// Try eager loading\ntry {\n opentuiLib = new FFIRenderLib(opentuiLibPath)\n} catch (error) {}\n",
|
|
45
|
+
"import { RGBA } from \"./lib/index.js\"\nimport { resolveRenderLib, type RenderLib } from \"./zig.js\"\nimport { type Pointer, toArrayBuffer, ptr } from \"bun:ffi\"\nimport { type BorderStyle, type BorderSides, BorderCharArrays, parseBorderStyle } from \"./lib/index.js\"\nimport { TargetChannel, type WidthMethod, type CapturedSpan, type CapturedLine } from \"./types.js\"\nimport type { TextBufferView } from \"./text-buffer-view.js\"\nimport type { EditorView } from \"./editor-view.js\"\n\n// Pack drawing options into a single u32\n// bits 0-3: borderSides, bit 4: shouldFill, bits 5-6: titleAlignment, bits 7-8: bottomTitleAlignment\nfunction packDrawOptions(\n border: boolean | BorderSides[],\n shouldFill: boolean,\n titleAlignment: \"left\" | \"center\" | \"right\",\n bottomTitleAlignment: \"left\" | \"center\" | \"right\",\n): number {\n let packed = 0\n\n if (border === true) {\n packed |= 0b1111 // All sides\n } else if (Array.isArray(border)) {\n if (border.includes(\"top\")) packed |= 0b1000\n if (border.includes(\"right\")) packed |= 0b0100\n if (border.includes(\"bottom\")) packed |= 0b0010\n if (border.includes(\"left\")) packed |= 0b0001\n }\n\n if (shouldFill) {\n packed |= 1 << 4\n }\n\n const alignmentMap: Record<string, number> = {\n left: 0,\n center: 1,\n right: 2,\n }\n const alignment = alignmentMap[titleAlignment]\n const bottomAlignment = alignmentMap[bottomTitleAlignment]\n\n packed |= alignment << 5\n packed |= bottomAlignment << 7\n\n return packed\n}\n\nexport class OptimizedBuffer {\n private static fbIdCounter = 0\n public id: string\n public lib: RenderLib\n private bufferPtr: Pointer\n private _width: number\n private _height: number\n private _widthMethod: WidthMethod\n public respectAlpha: boolean = false\n private _rawBuffers: {\n char: Uint32Array\n fg: Float32Array\n bg: Float32Array\n attributes: Uint32Array\n } | null = null\n private _rawColorTags: {\n fg: Uint16Array\n bg: Uint16Array\n } | null = null\n private _destroyed: boolean = false\n\n get ptr(): Pointer {\n return this.bufferPtr\n }\n\n // Fail loud and clear\n // Instead of trying to return values that could work or not,\n // this at least will show a stack trace to know where the call to a destroyed Buffer was made\n private guard(): void {\n if (this._destroyed) throw new Error(`Buffer ${this.id} is destroyed`)\n }\n\n private ensureRawBufferViews(): void {\n if (this._rawBuffers !== null && this._rawColorTags !== null) {\n return\n }\n\n const size = this._width * this._height\n const charPtr = this.lib.bufferGetCharPtr(this.bufferPtr)\n const fgPtr = this.lib.bufferGetFgPtr(this.bufferPtr)\n const bgPtr = this.lib.bufferGetBgPtr(this.bufferPtr)\n const fgTagPtr = this.lib.bufferGetFgTagPtr(this.bufferPtr)\n const bgTagPtr = this.lib.bufferGetBgTagPtr(this.bufferPtr)\n const attributesPtr = this.lib.bufferGetAttributesPtr(this.bufferPtr)\n\n this._rawBuffers = {\n char: new Uint32Array(toArrayBuffer(charPtr, 0, size * 4)),\n fg: new Float32Array(toArrayBuffer(fgPtr, 0, size * 4 * 4)),\n bg: new Float32Array(toArrayBuffer(bgPtr, 0, size * 4 * 4)),\n attributes: new Uint32Array(toArrayBuffer(attributesPtr, 0, size * 4)),\n }\n\n this._rawColorTags = {\n fg: new Uint16Array(toArrayBuffer(fgTagPtr, 0, size * 2)),\n bg: new Uint16Array(toArrayBuffer(bgTagPtr, 0, size * 2)),\n }\n }\n\n get buffers(): {\n char: Uint32Array\n fg: Float32Array\n bg: Float32Array\n attributes: Uint32Array\n } {\n this.guard()\n this.ensureRawBufferViews()\n return this._rawBuffers!\n }\n\n private get rawColorTags(): { fg: Uint16Array; bg: Uint16Array } {\n this.guard()\n this.ensureRawBufferViews()\n return this._rawColorTags!\n }\n\n constructor(\n lib: RenderLib,\n ptr: Pointer,\n width: number,\n height: number,\n options: { respectAlpha?: boolean; id?: string; widthMethod?: WidthMethod },\n ) {\n this.id = options.id || `fb_${OptimizedBuffer.fbIdCounter++}`\n this.lib = lib\n this.respectAlpha = options.respectAlpha || false\n this._width = width\n this._height = height\n this._widthMethod = options.widthMethod || \"unicode\"\n this.bufferPtr = ptr\n }\n\n static create(\n width: number,\n height: number,\n widthMethod: WidthMethod,\n options: { respectAlpha?: boolean; id?: string } = {},\n ): OptimizedBuffer {\n const lib = resolveRenderLib()\n const respectAlpha = options.respectAlpha || false\n const id = options.id && options.id.trim() !== \"\" ? options.id : \"unnamed buffer\"\n const buffer = lib.createOptimizedBuffer(width, height, widthMethod, respectAlpha, id)\n return buffer\n }\n\n public get widthMethod(): WidthMethod {\n return this._widthMethod\n }\n\n public get width(): number {\n return this._width\n }\n\n public get height(): number {\n return this._height\n }\n\n public setRespectAlpha(respectAlpha: boolean): void {\n this.guard()\n this.lib.bufferSetRespectAlpha(this.bufferPtr, respectAlpha)\n this.respectAlpha = respectAlpha\n }\n\n public getNativeId(): string {\n this.guard()\n return this.lib.bufferGetId(this.bufferPtr)\n }\n\n public getRealCharBytes(addLineBreaks: boolean = false): Uint8Array {\n this.guard()\n const realSize = this.lib.bufferGetRealCharSize(this.bufferPtr)\n const outputBuffer = new Uint8Array(realSize)\n const bytesWritten = this.lib.bufferWriteResolvedChars(this.bufferPtr, outputBuffer, addLineBreaks)\n return outputBuffer.slice(0, bytesWritten)\n }\n\n public getSpanLines(): CapturedLine[] {\n this.guard()\n const { char, fg, bg, attributes } = this.buffers\n const { fg: fgTag, bg: bgTag } = this.rawColorTags\n const lines: CapturedLine[] = []\n\n const CHAR_FLAG_CONTINUATION = 0xc0000000 | 0\n const CHAR_FLAG_MASK = 0xc0000000 | 0\n\n const realTextBytes = this.getRealCharBytes(true)\n const realTextLines = new TextDecoder().decode(realTextBytes).split(\"\\n\")\n\n for (let y = 0; y < this._height; y++) {\n const spans: CapturedSpan[] = []\n let currentSpan: CapturedSpan | null = null\n\n const lineChars = [...(realTextLines[y] || \"\")]\n let charIdx = 0\n\n for (let x = 0; x < this._width; x++) {\n const i = y * this._width + x\n const cp = char[i]\n const cellFg = RGBA.fromValues(fg[i * 4], fg[i * 4 + 1], fg[i * 4 + 2], fg[i * 4 + 3], fgTag[i])\n const cellBg = RGBA.fromValues(bg[i * 4], bg[i * 4 + 1], bg[i * 4 + 2], bg[i * 4 + 3], bgTag[i])\n const cellAttrs = attributes[i] & 0xff\n\n // Continuation cells are placeholders for wide characters (emojis, CJK)\n const isContinuation = (cp & CHAR_FLAG_MASK) === CHAR_FLAG_CONTINUATION\n const cellChar = isContinuation ? \"\" : (lineChars[charIdx++] ?? \" \")\n\n // Check if this cell continues the current span\n if (\n currentSpan &&\n currentSpan.fg.equals(cellFg) &&\n currentSpan.bg.equals(cellBg) &&\n currentSpan.attributes === cellAttrs\n ) {\n currentSpan.text += cellChar\n currentSpan.width += 1\n } else {\n // Start a new span\n if (currentSpan) {\n spans.push(currentSpan)\n }\n currentSpan = {\n text: cellChar,\n fg: cellFg,\n bg: cellBg,\n attributes: cellAttrs,\n width: 1,\n }\n }\n }\n\n // Push the last span\n if (currentSpan) {\n spans.push(currentSpan)\n }\n\n lines.push({ spans })\n }\n\n return lines\n }\n\n public clear(bg: RGBA = RGBA.fromValues(0, 0, 0, 1)): void {\n this.guard()\n this.lib.bufferClear(this.bufferPtr, bg)\n }\n\n public setCell(x: number, y: number, char: string, fg: RGBA, bg: RGBA, attributes: number = 0): void {\n this.guard()\n this.lib.bufferSetCell(this.bufferPtr, x, y, char, fg, bg, attributes)\n }\n\n public setCellWithAlphaBlending(\n x: number,\n y: number,\n char: string,\n fg: RGBA,\n bg: RGBA,\n attributes: number = 0,\n ): void {\n this.guard()\n this.lib.bufferSetCellWithAlphaBlending(this.bufferPtr, x, y, char, fg, bg, attributes)\n }\n\n public drawText(\n text: string,\n x: number,\n y: number,\n fg: RGBA,\n bg?: RGBA,\n attributes: number = 0,\n selection?: { start: number; end: number; bgColor?: RGBA; fgColor?: RGBA } | null,\n ): void {\n this.guard()\n if (!selection) {\n this.lib.bufferDrawText(this.bufferPtr, text, x, y, fg, bg, attributes)\n return\n }\n\n const { start, end } = selection\n\n let selectionBg: RGBA\n let selectionFg: RGBA\n\n if (selection.bgColor) {\n selectionBg = selection.bgColor\n selectionFg = selection.fgColor || fg\n } else {\n const defaultBg = bg || RGBA.fromValues(0, 0, 0, 0)\n selectionFg = defaultBg.a > 0 ? defaultBg : RGBA.fromValues(0, 0, 0, 1)\n selectionBg = fg\n }\n\n if (start > 0) {\n const beforeText = text.slice(0, start)\n this.lib.bufferDrawText(this.bufferPtr, beforeText, x, y, fg, bg, attributes)\n }\n\n if (end > start) {\n const selectedText = text.slice(start, end)\n this.lib.bufferDrawText(this.bufferPtr, selectedText, x + start, y, selectionFg, selectionBg, attributes)\n }\n\n if (end < text.length) {\n const afterText = text.slice(end)\n this.lib.bufferDrawText(this.bufferPtr, afterText, x + end, y, fg, bg, attributes)\n }\n }\n\n public fillRect(x: number, y: number, width: number, height: number, bg: RGBA): void {\n this.lib.bufferFillRect(this.bufferPtr, x, y, width, height, bg)\n }\n\n public colorMatrix(\n matrix: Float32Array,\n cellMask: Float32Array,\n strength: number = 1.0,\n target: TargetChannel = TargetChannel.Both,\n ): void {\n this.guard()\n if (matrix.length !== 16) throw new RangeError(`colorMatrix matrix must have length 16, got ${matrix.length}`)\n const cellMaskCount = Math.floor(cellMask.length / 3)\n this.lib.bufferColorMatrix(this.bufferPtr, ptr(matrix), ptr(cellMask), cellMaskCount, strength, target)\n }\n\n public colorMatrixUniform(\n matrix: Float32Array,\n strength: number = 1.0,\n target: TargetChannel = TargetChannel.Both,\n ): void {\n this.guard()\n if (matrix.length !== 16)\n throw new RangeError(`colorMatrixUniform matrix must have length 16, got ${matrix.length}`)\n if (strength === 0.0) return\n this.lib.bufferColorMatrixUniform(this.bufferPtr, ptr(matrix), strength, target)\n }\n\n public drawFrameBuffer(\n destX: number,\n destY: number,\n frameBuffer: OptimizedBuffer,\n sourceX?: number,\n sourceY?: number,\n sourceWidth?: number,\n sourceHeight?: number,\n ): void {\n this.guard()\n this.lib.drawFrameBuffer(this.bufferPtr, destX, destY, frameBuffer.ptr, sourceX, sourceY, sourceWidth, sourceHeight)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.lib.destroyOptimizedBuffer(this.bufferPtr)\n }\n\n public drawTextBuffer(textBufferView: TextBufferView, x: number, y: number): void {\n this.guard()\n this.lib.bufferDrawTextBufferView(this.bufferPtr, textBufferView.ptr, x, y)\n }\n\n public drawEditorView(editorView: EditorView, x: number, y: number): void {\n this.guard()\n this.lib.bufferDrawEditorView(this.bufferPtr, editorView.ptr, x, y)\n }\n\n public drawSuperSampleBuffer(\n x: number,\n y: number,\n pixelDataPtr: Pointer,\n pixelDataLength: number,\n format: \"bgra8unorm\" | \"rgba8unorm\",\n alignedBytesPerRow: number,\n ): void {\n this.guard()\n this.lib.bufferDrawSuperSampleBuffer(\n this.bufferPtr,\n x,\n y,\n pixelDataPtr,\n pixelDataLength,\n format,\n alignedBytesPerRow,\n )\n }\n\n public drawPackedBuffer(\n dataPtr: Pointer,\n dataLen: number,\n posX: number,\n posY: number,\n terminalWidthCells: number,\n terminalHeightCells: number,\n ): void {\n this.guard()\n this.lib.bufferDrawPackedBuffer(\n this.bufferPtr,\n dataPtr,\n dataLen,\n posX,\n posY,\n terminalWidthCells,\n terminalHeightCells,\n )\n }\n\n public drawGrayscaleBuffer(\n posX: number,\n posY: number,\n intensities: Float32Array,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null = null,\n bg: RGBA | null = null,\n ): void {\n this.guard()\n this.lib.bufferDrawGrayscaleBuffer(this.bufferPtr, posX, posY, ptr(intensities), srcWidth, srcHeight, fg, bg)\n }\n\n public drawGrayscaleBufferSupersampled(\n posX: number,\n posY: number,\n intensities: Float32Array,\n srcWidth: number,\n srcHeight: number,\n fg: RGBA | null = null,\n bg: RGBA | null = null,\n ): void {\n this.guard()\n this.lib.bufferDrawGrayscaleBufferSupersampled(\n this.bufferPtr,\n posX,\n posY,\n ptr(intensities),\n srcWidth,\n srcHeight,\n fg,\n bg,\n )\n }\n\n public resize(width: number, height: number): void {\n this.guard()\n if (this._width === width && this._height === height) return\n\n this._width = width\n this._height = height\n this._rawBuffers = null\n this._rawColorTags = null\n\n this.lib.bufferResize(this.bufferPtr, width, height)\n }\n\n public drawBox(options: {\n x: number\n y: number\n width: number\n height: number\n borderStyle?: BorderStyle\n customBorderChars?: Uint32Array\n border: boolean | BorderSides[]\n borderColor: RGBA\n backgroundColor: RGBA\n shouldFill?: boolean\n title?: string\n titleAlignment?: \"left\" | \"center\" | \"right\"\n bottomTitle?: string\n bottomTitleAlignment?: \"left\" | \"center\" | \"right\"\n }): void {\n this.guard()\n const style = parseBorderStyle(options.borderStyle, \"single\")\n const borderChars: Uint32Array = options.customBorderChars ?? BorderCharArrays[style]\n\n const packedOptions = packDrawOptions(\n options.border,\n options.shouldFill ?? false,\n options.titleAlignment || \"left\",\n options.bottomTitleAlignment || \"left\",\n )\n\n this.lib.bufferDrawBox(\n this.bufferPtr,\n options.x,\n options.y,\n options.width,\n options.height,\n borderChars,\n packedOptions,\n options.borderColor,\n options.backgroundColor,\n options.title ?? null,\n options.bottomTitle ?? null,\n )\n }\n\n public pushScissorRect(x: number, y: number, width: number, height: number): void {\n this.guard()\n this.lib.bufferPushScissorRect(this.bufferPtr, x, y, width, height)\n }\n\n public popScissorRect(): void {\n this.guard()\n this.lib.bufferPopScissorRect(this.bufferPtr)\n }\n\n public clearScissorRects(): void {\n this.guard()\n this.lib.bufferClearScissorRects(this.bufferPtr)\n }\n\n public pushOpacity(opacity: number): void {\n this.guard()\n this.lib.bufferPushOpacity(this.bufferPtr, Math.max(0, Math.min(1, opacity)))\n }\n\n public popOpacity(): void {\n this.guard()\n this.lib.bufferPopOpacity(this.bufferPtr)\n }\n\n public getCurrentOpacity(): number {\n this.guard()\n return this.lib.bufferGetCurrentOpacity(this.bufferPtr)\n }\n\n public clearOpacity(): void {\n this.guard()\n this.lib.bufferClearOpacity(this.bufferPtr)\n }\n\n public encodeUnicode(text: string): { ptr: Pointer; data: Array<{ width: number; char: number }> } | null {\n this.guard()\n return this.lib.encodeUnicode(text, this._widthMethod)\n }\n\n public freeUnicode(encoded: { ptr: Pointer; data: Array<{ width: number; char: number }> }): void {\n this.guard()\n this.lib.freeUnicode(encoded)\n }\n\n public drawGrid(options: {\n borderChars: Uint32Array\n borderFg: RGBA\n borderBg: RGBA\n columnOffsets: Int32Array\n rowOffsets: Int32Array\n drawInner: boolean\n drawOuter: boolean\n }): void {\n this.guard()\n\n const columnCount = Math.max(0, options.columnOffsets.length - 1)\n const rowCount = Math.max(0, options.rowOffsets.length - 1)\n\n this.lib.bufferDrawGrid(\n this.bufferPtr,\n options.borderChars,\n options.borderFg,\n options.borderBg,\n options.columnOffsets,\n columnCount,\n options.rowOffsets,\n rowCount,\n {\n drawInner: options.drawInner,\n drawOuter: options.drawOuter,\n },\n )\n }\n\n public drawChar(char: number, x: number, y: number, fg: RGBA, bg: RGBA, attributes: number = 0): void {\n this.guard()\n this.lib.bufferDrawChar(this.bufferPtr, char, x, y, fg, bg, attributes)\n }\n}\n",
|
|
46
|
+
"// src/structs_ffi.ts\nimport { ptr, toArrayBuffer } from \"bun:ffi\";\nfunction fatalError(...args) {\n const message = args.join(\" \");\n console.error(\"FATAL ERROR:\", message);\n throw new Error(message);\n}\nvar pointerSize = process.arch === \"x64\" || process.arch === \"arm64\" ? 8 : 4;\nvar typeSizes = {\n u8: 1,\n bool_u8: 1,\n bool_u32: 4,\n u16: 2,\n i16: 2,\n u32: 4,\n u64: 8,\n f32: 4,\n f64: 8,\n pointer: pointerSize,\n i32: 4\n};\nvar primitiveKeys = Object.keys(typeSizes);\nfunction isPrimitiveType(type) {\n return typeof type === \"string\" && primitiveKeys.includes(type);\n}\nvar typeAlignments = { ...typeSizes };\nvar typeGetters = {\n u8: (view, offset) => view.getUint8(offset),\n bool_u8: (view, offset) => Boolean(view.getUint8(offset)),\n bool_u32: (view, offset) => Boolean(view.getUint32(offset, true)),\n u16: (view, offset) => view.getUint16(offset, true),\n i16: (view, offset) => view.getInt16(offset, true),\n u32: (view, offset) => view.getUint32(offset, true),\n u64: (view, offset) => view.getBigUint64(offset, true),\n f32: (view, offset) => view.getFloat32(offset, true),\n f64: (view, offset) => view.getFloat64(offset, true),\n i32: (view, offset) => view.getInt32(offset, true),\n pointer: (view, offset) => pointerSize === 8 ? view.getBigUint64(offset, true) : BigInt(view.getUint32(offset, true))\n};\nfunction objectPtr() {\n return {\n __type: \"objectPointer\"\n };\n}\nfunction isObjectPointerDef(type) {\n return typeof type === \"object\" && type !== null && type.__type === \"objectPointer\";\n}\nfunction allocStruct(structDef, options) {\n const buffer = new ArrayBuffer(structDef.size);\n const view = new DataView(buffer);\n const result = { buffer, view };\n const { pack: pointerPacker } = primitivePackers(\"pointer\");\n if (options?.lengths) {\n const subBuffers = {};\n for (const [arrayFieldName, length] of Object.entries(options.lengths)) {\n const arrayMeta = structDef.arrayFields.get(arrayFieldName);\n if (!arrayMeta) {\n throw new Error(`Field '${arrayFieldName}' is not an array field with a lengthOf field`);\n }\n const subBuffer = new ArrayBuffer(length * arrayMeta.elementSize);\n subBuffers[arrayFieldName] = subBuffer;\n const pointer = length > 0 ? ptr(subBuffer) : null;\n pointerPacker(view, arrayMeta.arrayOffset, pointer);\n arrayMeta.lengthPack(view, arrayMeta.lengthOffset, length);\n }\n if (Object.keys(subBuffers).length > 0) {\n result.subBuffers = subBuffers;\n }\n }\n return result;\n}\nfunction alignOffset(offset, align) {\n return offset + (align - 1) & ~(align - 1);\n}\nfunction enumTypeError(value) {\n throw new TypeError(`Invalid enum value: ${value}`);\n}\nfunction defineEnum(mapping, base = \"u32\") {\n const reverse = Object.fromEntries(Object.entries(mapping).map(([k, v]) => [v, k]));\n return {\n __type: \"enum\",\n type: base,\n to(value) {\n return typeof value === \"number\" ? value : mapping[value] ?? enumTypeError(String(value));\n },\n from(value) {\n return reverse[value] ?? enumTypeError(String(value));\n },\n enum: mapping\n };\n}\nfunction isEnum(type) {\n return typeof type === \"object\" && type.__type === \"enum\";\n}\nfunction isStruct(type) {\n return typeof type === \"object\" && type.__type === \"struct\";\n}\nfunction primitivePackers(type) {\n let pack;\n let unpack;\n switch (type) {\n case \"u8\":\n pack = (view, off, val) => view.setUint8(off, val);\n unpack = (view, off) => view.getUint8(off);\n break;\n case \"bool_u8\":\n pack = (view, off, val) => view.setUint8(off, val ? 1 : 0);\n unpack = (view, off) => Boolean(view.getUint8(off));\n break;\n case \"bool_u32\":\n pack = (view, off, val) => view.setUint32(off, val ? 1 : 0, true);\n unpack = (view, off) => Boolean(view.getUint32(off, true));\n break;\n case \"u16\":\n pack = (view, off, val) => view.setUint16(off, val, true);\n unpack = (view, off) => view.getUint16(off, true);\n break;\n case \"i16\":\n pack = (view, off, val) => view.setInt16(off, val, true);\n unpack = (view, off) => view.getInt16(off, true);\n break;\n case \"u32\":\n pack = (view, off, val) => view.setUint32(off, val, true);\n unpack = (view, off) => view.getUint32(off, true);\n break;\n case \"i32\":\n pack = (view, off, val) => view.setInt32(off, val, true);\n unpack = (view, off) => view.getInt32(off, true);\n break;\n case \"u64\":\n pack = (view, off, val) => view.setBigUint64(off, BigInt(val), true);\n unpack = (view, off) => view.getBigUint64(off, true);\n break;\n case \"f32\":\n pack = (view, off, val) => view.setFloat32(off, val, true);\n unpack = (view, off) => view.getFloat32(off, true);\n break;\n case \"f64\":\n pack = (view, off, val) => view.setFloat64(off, val, true);\n unpack = (view, off) => view.getFloat64(off, true);\n break;\n case \"pointer\":\n pack = (view, off, val) => {\n pointerSize === 8 ? view.setBigUint64(off, val ? BigInt(val) : 0n, true) : view.setUint32(off, val ? Number(val) : 0, true);\n };\n unpack = (view, off) => {\n const bint = pointerSize === 8 ? view.getBigUint64(off, true) : BigInt(view.getUint32(off, true));\n return Number(bint);\n };\n break;\n default:\n fatalError(`Unsupported primitive type: ${type}`);\n }\n return { pack, unpack };\n}\nvar { pack: pointerPacker, unpack: pointerUnpacker } = primitivePackers(\"pointer\");\nfunction packObjectArray(val) {\n const buffer = new ArrayBuffer(val.length * pointerSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < val.length; i++) {\n const instance = val[i];\n const ptrValue = instance?.ptr ?? null;\n pointerPacker(bufferView, i * pointerSize, ptrValue);\n }\n return bufferView;\n}\nvar encoder = new TextEncoder;\nvar decoder = new TextDecoder;\nfunction defineStruct(fields, structDefOptions) {\n let offset = 0;\n let maxAlign = 1;\n const layout = [];\n const lengthOfFields = {};\n const lengthOfRequested = [];\n const arrayFieldsMetadata = {};\n for (const [name, typeOrStruct, options = {}] of fields) {\n if (options.condition && !options.condition()) {\n continue;\n }\n let size = 0, align = 0;\n let pack;\n let unpack;\n let needsLengthOf = false;\n let lengthOfDef = null;\n if (isPrimitiveType(typeOrStruct)) {\n size = typeSizes[typeOrStruct];\n align = typeAlignments[typeOrStruct];\n ({ pack, unpack } = primitivePackers(typeOrStruct));\n } else if (typeof typeOrStruct === \"string\" && typeOrStruct === \"cstring\") {\n size = pointerSize;\n align = pointerSize;\n pack = (view, off, val) => {\n const bufPtr = val ? ptr(encoder.encode(val + \"\\x00\")) : null;\n pointerPacker(view, off, bufPtr);\n };\n unpack = (view, off) => {\n const ptrVal = pointerUnpacker(view, off);\n return ptrVal;\n };\n } else if (typeof typeOrStruct === \"string\" && typeOrStruct === \"char*\") {\n size = pointerSize;\n align = pointerSize;\n pack = (view, off, val) => {\n const bufPtr = val ? ptr(encoder.encode(val)) : null;\n pointerPacker(view, off, bufPtr);\n };\n unpack = (view, off) => {\n const ptrVal = pointerUnpacker(view, off);\n return ptrVal;\n };\n needsLengthOf = true;\n } else if (isEnum(typeOrStruct)) {\n const base = typeOrStruct.type;\n size = typeSizes[base];\n align = typeAlignments[base];\n const { pack: packEnum } = primitivePackers(base);\n pack = (view, off, val) => {\n const num = typeOrStruct.to(val);\n packEnum(view, off, num);\n };\n unpack = (view, off) => {\n const raw = typeGetters[base](view, off);\n return typeOrStruct.from(raw);\n };\n } else if (isStruct(typeOrStruct)) {\n if (options.asPointer === true) {\n size = pointerSize;\n align = pointerSize;\n pack = (view, off, val, obj, options2) => {\n if (!val) {\n pointerPacker(view, off, null);\n return;\n }\n const nestedBuf = typeOrStruct.pack(val, options2);\n pointerPacker(view, off, ptr(nestedBuf));\n };\n unpack = (view, off) => {\n throw new Error(\"Not implemented yet\");\n };\n } else {\n size = typeOrStruct.size;\n align = typeOrStruct.align;\n pack = (view, off, val, obj, options2) => {\n const nestedBuf = typeOrStruct.pack(val, options2);\n const nestedView = new Uint8Array(nestedBuf);\n const dView = new Uint8Array(view.buffer);\n dView.set(nestedView, off);\n };\n unpack = (view, off) => {\n const slice = view.buffer.slice(off, off + size);\n return typeOrStruct.unpack(slice);\n };\n }\n } else if (isObjectPointerDef(typeOrStruct)) {\n size = pointerSize;\n align = pointerSize;\n pack = (view, off, value) => {\n const ptrValue = value?.ptr ?? null;\n if (ptrValue === undefined) {\n console.warn(`Field '${name}' expected object with '.ptr' property, but got undefined pointer value from:`, value);\n pointerPacker(view, off, null);\n } else {\n pointerPacker(view, off, ptrValue);\n }\n };\n unpack = (view, off) => {\n return pointerUnpacker(view, off);\n };\n } else if (Array.isArray(typeOrStruct) && typeOrStruct.length === 1 && typeOrStruct[0] !== undefined) {\n const [def] = typeOrStruct;\n size = pointerSize;\n align = pointerSize;\n let arrayElementSize;\n if (isEnum(def)) {\n arrayElementSize = typeSizes[def.type];\n pack = (view, off, val, obj) => {\n if (!val || val.length === 0) {\n pointerPacker(view, off, null);\n return;\n }\n const buffer = new ArrayBuffer(val.length * arrayElementSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < val.length; i++) {\n const num = def.to(val[i]);\n bufferView.setUint32(i * arrayElementSize, num, true);\n }\n pointerPacker(view, off, ptr(buffer));\n };\n unpack = null;\n needsLengthOf = true;\n lengthOfDef = def;\n } else if (isStruct(def)) {\n arrayElementSize = def.size;\n pack = (view, off, val, obj, options2) => {\n if (!val || val.length === 0) {\n pointerPacker(view, off, null);\n return;\n }\n const buffer = new ArrayBuffer(val.length * arrayElementSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < val.length; i++) {\n def.packInto(val[i], bufferView, i * arrayElementSize, options2);\n }\n pointerPacker(view, off, ptr(buffer));\n };\n unpack = (view, off) => {\n throw new Error(\"Not implemented yet\");\n };\n } else if (isPrimitiveType(def)) {\n arrayElementSize = typeSizes[def];\n const { pack: primitivePack } = primitivePackers(def);\n pack = (view, off, val) => {\n if (!val || val.length === 0) {\n pointerPacker(view, off, null);\n return;\n }\n const buffer = new ArrayBuffer(val.length * arrayElementSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < val.length; i++) {\n primitivePack(bufferView, i * arrayElementSize, val[i]);\n }\n pointerPacker(view, off, ptr(buffer));\n };\n unpack = null;\n needsLengthOf = true;\n lengthOfDef = def;\n } else if (isObjectPointerDef(def)) {\n arrayElementSize = pointerSize;\n pack = (view, off, val) => {\n if (!val || val.length === 0) {\n pointerPacker(view, off, null);\n return;\n }\n const packedView = packObjectArray(val);\n pointerPacker(view, off, ptr(packedView.buffer));\n };\n unpack = () => {\n throw new Error(\"not implemented yet\");\n };\n } else {\n throw new Error(`Unsupported array element type for ${name}: ${JSON.stringify(def)}`);\n }\n const lengthOfField = Object.values(lengthOfFields).find((f) => f.lengthOf === name);\n if (lengthOfField && isPrimitiveType(lengthOfField.type)) {\n const { pack: lengthPack } = primitivePackers(lengthOfField.type);\n arrayFieldsMetadata[name] = {\n elementSize: arrayElementSize,\n arrayOffset: offset,\n lengthOffset: lengthOfField.offset,\n lengthPack\n };\n }\n } else {\n throw new Error(`Unsupported field type for ${name}: ${JSON.stringify(typeOrStruct)}`);\n }\n offset = alignOffset(offset, align);\n if (options.unpackTransform) {\n const originalUnpack = unpack;\n unpack = (view, off) => options.unpackTransform(originalUnpack(view, off));\n }\n if (options.packTransform) {\n const originalPack = pack;\n pack = (view, off, val, obj, packOptions) => originalPack(view, off, options.packTransform(val), obj, packOptions);\n }\n if (options.optional) {\n const originalPack = pack;\n if (isStruct(typeOrStruct) && !options.asPointer) {\n pack = (view, off, val, obj, packOptions) => {\n if (val || options.mapOptionalInline) {\n originalPack(view, off, val, obj, packOptions);\n }\n };\n } else {\n pack = (view, off, val, obj, packOptions) => originalPack(view, off, val ?? 0, obj, packOptions);\n }\n }\n if (options.lengthOf) {\n const originalPack = pack;\n pack = (view, off, val, obj, packOptions) => {\n const targetValue = obj[options.lengthOf];\n let length = 0;\n if (targetValue) {\n if (typeof targetValue === \"string\") {\n length = Buffer.byteLength(targetValue);\n } else {\n length = targetValue.length;\n }\n }\n return originalPack(view, off, length, obj, packOptions);\n };\n }\n let validateFunctions;\n if (options.validate) {\n validateFunctions = Array.isArray(options.validate) ? options.validate : [options.validate];\n }\n const layoutField = {\n name,\n offset,\n size,\n align,\n validate: validateFunctions,\n optional: !!options.optional || !!options.lengthOf || options.default !== undefined,\n default: options.default,\n pack,\n unpack,\n type: typeOrStruct,\n lengthOf: options.lengthOf\n };\n layout.push(layoutField);\n if (options.lengthOf) {\n lengthOfFields[options.lengthOf] = layoutField;\n }\n if (needsLengthOf) {\n const def = typeof typeOrStruct === \"string\" && typeOrStruct === \"char*\" ? \"char*\" : lengthOfDef;\n if (!def)\n fatalError(`Internal error: needsLengthOf=true but def is null for ${name}`);\n lengthOfRequested.push({ requester: layoutField, def });\n }\n offset += size;\n maxAlign = Math.max(maxAlign, align);\n }\n for (const { requester, def } of lengthOfRequested) {\n const lengthOfField = lengthOfFields[requester.name];\n if (!lengthOfField) {\n if (def === \"char*\") {\n continue;\n }\n throw new Error(`lengthOf field not found for array field ${requester.name}`);\n }\n if (def === \"char*\") {\n requester.unpack = (view, off) => {\n const ptrAddress = pointerUnpacker(view, off);\n const length = lengthOfField.unpack(view, lengthOfField.offset);\n if (ptrAddress === 0) {\n return null;\n }\n const byteLength = typeof length === \"bigint\" ? Number(length) : length;\n if (byteLength === 0) {\n return \"\";\n }\n const buffer = toArrayBuffer(ptrAddress, 0, byteLength);\n return decoder.decode(buffer);\n };\n } else if (isPrimitiveType(def)) {\n const elemSize = typeSizes[def];\n const { unpack: primitiveUnpack } = primitivePackers(def);\n requester.unpack = (view, off) => {\n const result = [];\n const length = lengthOfField.unpack(view, lengthOfField.offset);\n const ptrAddress = pointerUnpacker(view, off);\n if (ptrAddress === 0n && length > 0) {\n throw new Error(`Array field ${requester.name} has null pointer but length ${length}.`);\n }\n if (ptrAddress === 0n || length === 0) {\n return [];\n }\n const buffer = toArrayBuffer(ptrAddress, 0, length * elemSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < length; i++) {\n result.push(primitiveUnpack(bufferView, i * elemSize));\n }\n return result;\n };\n } else {\n const elemSize = def.type === \"u32\" ? 4 : 8;\n requester.unpack = (view, off) => {\n const result = [];\n const length = lengthOfField.unpack(view, lengthOfField.offset);\n const ptrAddress = pointerUnpacker(view, off);\n if (ptrAddress === 0n && length > 0) {\n throw new Error(`Array field ${requester.name} has null pointer but length ${length}.`);\n }\n if (ptrAddress === 0n || length === 0) {\n return [];\n }\n const buffer = toArrayBuffer(ptrAddress, 0, length * elemSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < length; i++) {\n result.push(def.from(bufferView.getUint32(i * elemSize, true)));\n }\n return result;\n };\n }\n }\n const totalSize = alignOffset(offset, maxAlign);\n const description = layout.map((f) => ({\n name: f.name,\n offset: f.offset,\n size: f.size,\n align: f.align,\n optional: f.optional,\n type: f.type,\n lengthOf: f.lengthOf\n }));\n const layoutByName = new Map(description.map((f) => [f.name, f]));\n const arrayFields = new Map(Object.entries(arrayFieldsMetadata));\n return {\n __type: \"struct\",\n size: totalSize,\n align: maxAlign,\n hasMapValue: !!structDefOptions?.mapValue,\n layoutByName,\n arrayFields,\n pack(obj, options) {\n const buf = new ArrayBuffer(totalSize);\n const view = new DataView(buf);\n let mappedObj = obj;\n if (structDefOptions?.mapValue) {\n mappedObj = structDefOptions.mapValue(obj);\n }\n for (const field of layout) {\n const value = mappedObj[field.name] ?? field.default;\n if (!field.optional && value === undefined) {\n fatalError(`Packing non-optional field '${field.name}' but value is undefined (and no default provided)`);\n }\n if (field.validate) {\n for (const validateFn of field.validate) {\n validateFn(value, field.name, {\n hints: options?.validationHints,\n input: mappedObj\n });\n }\n }\n field.pack(view, field.offset, value, mappedObj, options);\n }\n return view.buffer;\n },\n packInto(obj, view, offset2, options) {\n let mappedObj = obj;\n if (structDefOptions?.mapValue) {\n mappedObj = structDefOptions.mapValue(obj);\n }\n for (const field of layout) {\n const value = mappedObj[field.name] ?? field.default;\n if (!field.optional && value === undefined) {\n console.warn(`packInto missing value for non-optional field '${field.name}' at offset ${offset2 + field.offset}. Writing default or zero.`);\n }\n if (field.validate) {\n for (const validateFn of field.validate) {\n validateFn(value, field.name, {\n hints: options?.validationHints,\n input: mappedObj\n });\n }\n }\n field.pack(view, offset2 + field.offset, value, mappedObj, options);\n }\n },\n unpack(buf) {\n if (buf.byteLength < totalSize) {\n fatalError(`Buffer size (${buf.byteLength}) is smaller than struct size (${totalSize}) for unpacking.`);\n }\n const view = new DataView(buf);\n const result = structDefOptions?.default ? { ...structDefOptions.default } : {};\n for (const field of layout) {\n if (!field.unpack) {\n continue;\n }\n try {\n result[field.name] = field.unpack(view, field.offset);\n } catch (e) {\n console.error(`Error unpacking field '${field.name}' at offset ${field.offset}:`, e);\n throw e;\n }\n }\n if (structDefOptions?.reduceValue) {\n return structDefOptions.reduceValue(result);\n }\n return result;\n },\n packList(objects, options) {\n if (objects.length === 0) {\n return new ArrayBuffer(0);\n }\n const buffer = new ArrayBuffer(totalSize * objects.length);\n const view = new DataView(buffer);\n for (let i = 0;i < objects.length; i++) {\n let mappedObj = objects[i];\n if (structDefOptions?.mapValue) {\n mappedObj = structDefOptions.mapValue(objects[i]);\n }\n for (const field of layout) {\n const value = mappedObj[field.name] ?? field.default;\n if (!field.optional && value === undefined) {\n fatalError(`Packing non-optional field '${field.name}' at index ${i} but value is undefined (and no default provided)`);\n }\n if (field.validate) {\n for (const validateFn of field.validate) {\n validateFn(value, field.name, {\n hints: options?.validationHints,\n input: mappedObj\n });\n }\n }\n field.pack(view, i * totalSize + field.offset, value, mappedObj, options);\n }\n }\n return buffer;\n },\n unpackList(buf, count) {\n if (count === 0) {\n return [];\n }\n const expectedSize = totalSize * count;\n if (buf.byteLength < expectedSize) {\n fatalError(`Buffer size (${buf.byteLength}) is smaller than expected size (${expectedSize}) for unpacking ${count} structs.`);\n }\n const view = new DataView(buf);\n const results = [];\n for (let i = 0;i < count; i++) {\n const offset2 = i * totalSize;\n const result = structDefOptions?.default ? { ...structDefOptions.default } : {};\n for (const field of layout) {\n if (!field.unpack) {\n continue;\n }\n try {\n result[field.name] = field.unpack(view, offset2 + field.offset);\n } catch (e) {\n console.error(`Error unpacking field '${field.name}' at index ${i}, offset ${offset2 + field.offset}:`, e);\n throw e;\n }\n }\n if (structDefOptions?.reduceValue) {\n results.push(structDefOptions.reduceValue(result));\n } else {\n results.push(result);\n }\n }\n return results;\n },\n describe() {\n return description;\n }\n };\n}\nexport {\n pointerSize,\n packObjectArray,\n objectPtr,\n defineStruct,\n defineEnum,\n allocStruct\n};\n",
|
|
47
|
+
"import { defineStruct, defineEnum } from \"bun-ffi-structs\"\nimport { ptr, toArrayBuffer, type Pointer } from \"bun:ffi\"\nimport { RGBA, COLOR_TAG_RGB, normalizeColorValue } from \"./lib/RGBA.js\"\n\nconst rgbaPackTransform = (rgba?: RGBA) => (rgba ? ptr(rgba.buffer) : null)\nconst rgbaUnpackTransform = (ptr?: Pointer) => (ptr ? RGBA.fromArray(new Float32Array(toArrayBuffer(ptr))) : undefined)\n\ntype StyledChunkInput = {\n text: string\n fg?: RGBA | null\n bg?: RGBA | null\n fg_tag?: number\n bg_tag?: number\n attributes?: number | null\n link?: { url: string } | string | null\n}\n\nexport const StyledChunkStruct = defineStruct(\n [\n [\"text\", \"char*\"],\n [\"text_len\", \"u64\", { lengthOf: \"text\" }],\n [\n \"fg\",\n \"pointer\",\n {\n optional: true,\n packTransform: rgbaPackTransform,\n unpackTransform: rgbaUnpackTransform,\n },\n ],\n [\n \"bg\",\n \"pointer\",\n {\n optional: true,\n packTransform: rgbaPackTransform,\n unpackTransform: rgbaUnpackTransform,\n },\n ],\n [\"fg_tag\", \"u16\", { default: COLOR_TAG_RGB }],\n [\"bg_tag\", \"u16\", { default: COLOR_TAG_RGB }],\n [\"attributes\", \"u32\", { default: 0 }],\n [\"link\", \"char*\", { default: \"\" }],\n [\"link_len\", \"u64\", { lengthOf: \"link\" }],\n ],\n {\n mapValue: (chunk: StyledChunkInput): StyledChunkInput => {\n const normalizedFg = normalizeColorValue(chunk.fg ?? null)\n const normalizedBg = normalizeColorValue(chunk.bg ?? null)\n\n if (!chunk.link || typeof chunk.link === \"string\") {\n return {\n ...chunk,\n fg: normalizedFg?.rgba ?? null,\n bg: normalizedBg?.rgba ?? null,\n fg_tag: normalizedFg?.tag ?? COLOR_TAG_RGB,\n bg_tag: normalizedBg?.tag ?? COLOR_TAG_RGB,\n }\n }\n\n return {\n ...chunk,\n fg: normalizedFg?.rgba ?? null,\n bg: normalizedBg?.rgba ?? null,\n fg_tag: normalizedFg?.tag ?? COLOR_TAG_RGB,\n bg_tag: normalizedBg?.tag ?? COLOR_TAG_RGB,\n link: chunk.link.url,\n }\n },\n },\n)\n\nexport const HighlightStruct = defineStruct([\n [\"start\", \"u32\"],\n [\"end\", \"u32\"],\n [\"styleId\", \"u32\"],\n [\"priority\", \"u8\", { default: 0 }],\n [\"hlRef\", \"u16\", { default: 0 }],\n])\n\nexport const LogicalCursorStruct = defineStruct([\n [\"row\", \"u32\"],\n [\"col\", \"u32\"],\n [\"offset\", \"u32\"],\n])\n\nexport const VisualCursorStruct = defineStruct([\n [\"visualRow\", \"u32\"],\n [\"visualCol\", \"u32\"],\n [\"logicalRow\", \"u32\"],\n [\"logicalCol\", \"u32\"],\n [\"offset\", \"u32\"],\n])\n\nconst UnicodeMethodEnum = defineEnum({ wcwidth: 0, unicode: 1 }, \"u8\")\n\nexport const TerminalCapabilitiesStruct = defineStruct([\n [\"kitty_keyboard\", \"bool_u8\"],\n [\"kitty_graphics\", \"bool_u8\"],\n [\"rgb\", \"bool_u8\"],\n [\"ansi256\", \"bool_u8\"],\n [\"unicode\", UnicodeMethodEnum],\n [\"sgr_pixels\", \"bool_u8\"],\n [\"color_scheme_updates\", \"bool_u8\"],\n [\"explicit_width\", \"bool_u8\"],\n [\"scaled_text\", \"bool_u8\"],\n [\"sixel\", \"bool_u8\"],\n [\"focus_tracking\", \"bool_u8\"],\n [\"sync\", \"bool_u8\"],\n [\"bracketed_paste\", \"bool_u8\"],\n [\"hyperlinks\", \"bool_u8\"],\n [\"osc52\", \"bool_u8\"],\n [\"explicit_cursor_positioning\", \"bool_u8\"],\n [\"term_name\", \"char*\"],\n [\"term_name_len\", \"u64\", { lengthOf: \"term_name\" }],\n [\"term_version\", \"char*\"],\n [\"term_version_len\", \"u64\", { lengthOf: \"term_version\" }],\n [\"term_from_xtversion\", \"bool_u8\"],\n])\n\nexport const EncodedCharStruct = defineStruct([\n [\"width\", \"u8\"],\n [\"char\", \"u32\"],\n])\n\nexport const LineInfoStruct = defineStruct([\n [\"startCols\", [\"u32\"]],\n [\"startColsLen\", \"u32\", { lengthOf: \"startCols\" }],\n [\"widthCols\", [\"u32\"]],\n [\"widthColsLen\", \"u32\", { lengthOf: \"widthCols\" }],\n [\"sources\", [\"u32\"]],\n [\"sourcesLen\", \"u32\", { lengthOf: \"sources\" }],\n [\"wraps\", [\"u32\"]],\n [\"wrapsLen\", \"u32\", { lengthOf: \"wraps\" }],\n [\"widthColsMax\", \"u32\"],\n])\n\nexport const MeasureResultStruct = defineStruct([\n [\"lineCount\", \"u32\"],\n [\"widthColsMax\", \"u32\"],\n])\n\nexport const CursorStateStruct = defineStruct([\n [\"x\", \"u32\"],\n [\"y\", \"u32\"],\n [\"visible\", \"bool_u8\"],\n [\"style\", \"u8\"],\n [\"blinking\", \"bool_u8\"],\n [\"r\", \"f32\"],\n [\"g\", \"f32\"],\n [\"b\", \"f32\"],\n [\"a\", \"f32\"],\n])\n\nexport const CursorStyleOptionsStruct = defineStruct([\n [\"style\", \"u8\", { default: 255 }],\n [\"blinking\", \"u8\", { default: 255 }],\n [\n \"color\",\n \"pointer\",\n {\n optional: true,\n packTransform: rgbaPackTransform,\n unpackTransform: rgbaUnpackTransform,\n },\n ],\n [\"cursor\", \"u8\", { default: 255 }],\n])\n\nexport const GridDrawOptionsStruct = defineStruct([\n [\"drawInner\", \"bool_u8\", { default: true }],\n [\"drawOuter\", \"bool_u8\", { default: true }],\n])\n\nexport type BuildOptions = {\n gpaSafeStats: boolean\n gpaMemoryLimitTracking: boolean\n}\n\nexport const BuildOptionsStruct = defineStruct([\n [\"gpaSafeStats\", \"bool_u8\"],\n [\"gpaMemoryLimitTracking\", \"bool_u8\"],\n])\n\nexport type AllocatorStats = {\n totalRequestedBytes: number\n activeAllocations: number\n smallAllocations: number\n largeAllocations: number\n requestedBytesValid: boolean\n}\n\nexport const AllocatorStatsStruct = defineStruct([\n [\"totalRequestedBytes\", \"u64\"],\n [\"activeAllocations\", \"u64\"],\n [\"smallAllocations\", \"u64\"],\n [\"largeAllocations\", \"u64\"],\n [\"requestedBytesValid\", \"bool_u8\"],\n])\n\nexport type GrowthPolicy = \"grow\" | \"block\"\n\nexport type NativeSpanFeedOptions = {\n chunkSize?: number\n initialChunks?: number\n maxBytes?: bigint\n growthPolicy?: GrowthPolicy\n autoCommitOnFull?: boolean\n spanQueueCapacity?: number\n}\n\nexport type NativeSpanFeedStats = {\n bytesWritten: bigint\n spansCommitted: bigint\n chunks: number\n pendingSpans: number\n}\n\nexport type SpanInfo = {\n chunkPtr: Pointer\n offset: number\n len: number\n chunkIndex: number\n}\n\nexport type ReserveInfo = {\n ptr: Pointer\n len: number\n}\n\nconst GrowthPolicyEnum = defineEnum({ grow: 0, block: 1 }, \"u8\")\n\nexport const NativeSpanFeedOptionsStruct = defineStruct([\n [\"chunkSize\", \"u32\", { default: 64 * 1024 }],\n [\"initialChunks\", \"u32\", { default: 2 }],\n [\"maxBytes\", \"u64\", { default: 0n }],\n [\"growthPolicy\", GrowthPolicyEnum, { default: \"grow\" }],\n [\"autoCommitOnFull\", \"bool_u8\", { default: true }],\n [\"spanQueueCapacity\", \"u32\", { default: 0 }],\n])\n\nexport const NativeSpanFeedStatsStruct = defineStruct([\n [\"bytesWritten\", \"u64\"],\n [\"spansCommitted\", \"u64\"],\n [\"chunks\", \"u32\"],\n [\"pendingSpans\", \"u32\"],\n])\n\nexport const SpanInfoStruct = defineStruct(\n [\n [\"chunkPtr\", \"pointer\"],\n [\"offset\", \"u32\"],\n [\"len\", \"u32\"],\n [\"chunkIndex\", \"u32\"],\n [\"reserved\", \"u32\", { default: 0 }],\n ],\n {\n reduceValue: (value: { chunkPtr: Pointer; offset: number; len: number; chunkIndex: number }) => ({\n chunkPtr: value.chunkPtr as Pointer,\n offset: value.offset,\n len: value.len,\n chunkIndex: value.chunkIndex,\n }),\n },\n)\n\nexport const ReserveInfoStruct = defineStruct(\n [\n [\"ptr\", \"pointer\"],\n [\"len\", \"u32\"],\n [\"reserved\", \"u32\", { default: 0 }],\n ],\n {\n reduceValue: (value: { ptr: Pointer; len: number }) => ({\n ptr: value.ptr as Pointer,\n len: value.len,\n }),\n },\n)\n",
|
|
48
|
+
"import type { StyledText } from \"./lib/styled-text.js\"\nimport { RGBA } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type LineInfo, type RenderLib } from \"./zig.js\"\nimport { type Pointer } from \"bun:ffi\"\nimport { type WidthMethod, type Highlight } from \"./types.js\"\nimport type { SyntaxStyle } from \"./syntax-style.js\"\n\nexport interface TextChunk {\n __isChunk: true\n text: string\n fg?: RGBA\n bg?: RGBA\n attributes?: number\n link?: { url: string }\n}\n\nexport class TextBuffer {\n private lib: RenderLib\n private bufferPtr: Pointer\n private _length: number = 0\n private _byteSize: number = 0\n private _lineInfo?: LineInfo\n private _destroyed: boolean = false\n private _syntaxStyle?: SyntaxStyle\n private _textBytes?: Uint8Array\n private _memId?: number\n private _appendedChunks: Uint8Array[] = []\n\n constructor(lib: RenderLib, ptr: Pointer) {\n this.lib = lib\n this.bufferPtr = ptr\n }\n\n static create(widthMethod: WidthMethod): TextBuffer {\n const lib = resolveRenderLib()\n return lib.createTextBuffer(widthMethod)\n }\n\n // Fail loud and clear\n // Instead of trying to return values that could work or not,\n // this at least will show a stack trace to know where the call to a destroyed TextBuffer was made\n private guard(): void {\n if (this._destroyed) throw new Error(\"TextBuffer is destroyed\")\n }\n\n public setText(text: string): void {\n this.guard()\n this._textBytes = this.lib.encoder.encode(text)\n\n if (this._memId === undefined) {\n this._memId = this.lib.textBufferRegisterMemBuffer(this.bufferPtr, this._textBytes, false)\n } else {\n this.lib.textBufferReplaceMemBuffer(this.bufferPtr, this._memId, this._textBytes, false)\n }\n\n this.lib.textBufferSetTextFromMem(this.bufferPtr, this._memId)\n this._length = this.lib.textBufferGetLength(this.bufferPtr)\n this._byteSize = this.lib.textBufferGetByteSize(this.bufferPtr)\n this._lineInfo = undefined\n this._appendedChunks = [] // Clear any previously appended chunks\n }\n\n public append(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n // Keep the bytes alive to prevent garbage collection\n this._appendedChunks.push(textBytes)\n this.lib.textBufferAppend(this.bufferPtr, textBytes)\n this._length = this.lib.textBufferGetLength(this.bufferPtr)\n this._byteSize = this.lib.textBufferGetByteSize(this.bufferPtr)\n this._lineInfo = undefined\n }\n\n public loadFile(path: string): void {\n this.guard()\n const success = this.lib.textBufferLoadFile(this.bufferPtr, path)\n if (!success) {\n throw new Error(`Failed to load file: ${path}`)\n }\n this._length = this.lib.textBufferGetLength(this.bufferPtr)\n this._byteSize = this.lib.textBufferGetByteSize(this.bufferPtr)\n this._lineInfo = undefined\n this._textBytes = undefined\n }\n\n public setStyledText(text: StyledText): void {\n this.guard()\n\n this.lib.textBufferSetStyledText(this.bufferPtr, text.chunks)\n\n this._length = this.lib.textBufferGetLength(this.bufferPtr)\n this._byteSize = this.lib.textBufferGetByteSize(this.bufferPtr)\n this._lineInfo = undefined\n }\n\n public setDefaultFg(fg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultFg(this.bufferPtr, fg)\n }\n\n public setDefaultBg(bg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultBg(this.bufferPtr, bg)\n }\n\n public setDefaultAttributes(attributes: number | null): void {\n this.guard()\n this.lib.textBufferSetDefaultAttributes(this.bufferPtr, attributes)\n }\n\n public resetDefaults(): void {\n this.guard()\n this.lib.textBufferResetDefaults(this.bufferPtr)\n }\n\n public getLineCount(): number {\n this.guard()\n return this.lib.textBufferGetLineCount(this.bufferPtr)\n }\n\n public get length(): number {\n this.guard()\n return this._length\n }\n\n public get byteSize(): number {\n this.guard()\n return this._byteSize\n }\n\n public get ptr(): Pointer {\n this.guard()\n return this.bufferPtr\n }\n\n public getPlainText(): string {\n this.guard()\n if (this._byteSize === 0) return \"\"\n // Use byteSize for accurate buffer allocation (includes newlines in byte count)\n const plainBytes = this.lib.getPlainTextBytes(this.bufferPtr, this._byteSize)\n\n if (!plainBytes) return \"\"\n\n return this.lib.decoder.decode(plainBytes)\n }\n\n public getTextRange(startOffset: number, endOffset: number): string {\n this.guard()\n if (startOffset >= endOffset) return \"\"\n if (this._byteSize === 0) return \"\"\n\n const rangeBytes = this.lib.textBufferGetTextRange(this.bufferPtr, startOffset, endOffset, this._byteSize)\n\n if (!rangeBytes) return \"\"\n\n return this.lib.decoder.decode(rangeBytes)\n }\n\n /**\n * Add a highlight using character offsets into the full text.\n * start/end in highlight represent absolute character positions.\n */\n public addHighlightByCharRange(highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlightByCharRange(this.bufferPtr, highlight)\n }\n\n /**\n * Add a highlight to a specific line by column positions.\n * start/end in highlight represent column offsets.\n */\n public addHighlight(lineIdx: number, highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlight(this.bufferPtr, lineIdx, highlight)\n }\n\n public removeHighlightsByRef(hlRef: number): void {\n this.guard()\n this.lib.textBufferRemoveHighlightsByRef(this.bufferPtr, hlRef)\n }\n\n public clearLineHighlights(lineIdx: number): void {\n this.guard()\n this.lib.textBufferClearLineHighlights(this.bufferPtr, lineIdx)\n }\n\n public clearAllHighlights(): void {\n this.guard()\n this.lib.textBufferClearAllHighlights(this.bufferPtr)\n }\n\n public getLineHighlights(lineIdx: number): Array<Highlight> {\n this.guard()\n return this.lib.textBufferGetLineHighlights(this.bufferPtr, lineIdx)\n }\n\n public getHighlightCount(): number {\n this.guard()\n return this.lib.textBufferGetHighlightCount(this.bufferPtr)\n }\n\n public setSyntaxStyle(style: SyntaxStyle | null): void {\n this.guard()\n this._syntaxStyle = style ?? undefined\n this.lib.textBufferSetSyntaxStyle(this.bufferPtr, style?.ptr ?? null)\n }\n\n public getSyntaxStyle(): SyntaxStyle | null {\n this.guard()\n return this._syntaxStyle ?? null\n }\n\n public setTabWidth(width: number): void {\n this.guard()\n this.lib.textBufferSetTabWidth(this.bufferPtr, width)\n }\n\n public getTabWidth(): number {\n this.guard()\n return this.lib.textBufferGetTabWidth(this.bufferPtr)\n }\n\n public clear(): void {\n this.guard()\n this.lib.textBufferClear(this.bufferPtr)\n this._length = 0\n this._byteSize = 0\n this._lineInfo = undefined\n this._textBytes = undefined\n this._appendedChunks = []\n // Note: _memId is NOT cleared - it can be reused for next setText\n }\n\n public reset(): void {\n this.guard()\n this.lib.textBufferReset(this.bufferPtr)\n this._length = 0\n this._byteSize = 0\n this._lineInfo = undefined\n this._textBytes = undefined\n this._memId = undefined // Reset clears the registry, so clear our ID\n this._appendedChunks = []\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.lib.destroyTextBuffer(this.bufferPtr)\n }\n}\n",
|
|
49
|
+
"import { EventEmitter } from \"events\"\nimport Yoga, { Direction, Display, Edge, FlexDirection, type Config, type Node as YogaNode } from \"yoga-layout\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport type { KeyEvent, PasteEvent } from \"./lib/KeyHandler.js\"\nimport type { MouseEventType } from \"./lib/parse.mouse.js\"\nimport type { Selection } from \"./lib/selection.js\"\nimport {\n parseAlign,\n parseAlignItems,\n parseFlexDirection,\n parseJustify,\n parseOverflow,\n parsePositionType,\n parseWrap,\n type AlignString,\n type FlexDirectionString,\n type JustifyString,\n type OverflowString,\n type PositionTypeString,\n type WrapString,\n} from \"./lib/yoga.options.js\"\nimport { maybeMakeRenderable, type VNode } from \"./renderables/composition/vnode.js\"\nimport type { MouseEvent } from \"./renderer.js\"\nimport type { RenderContext } from \"./types.js\"\nimport {\n validateOptions,\n isPositionType,\n isDimensionType,\n isFlexBasisType,\n isSizeType,\n isMarginType,\n isPaddingType,\n isPositionTypeType,\n isOverflowType,\n} from \"./lib/renderable.validations.js\"\n\nconst BrandedRenderable: unique symbol = Symbol.for(\"@opentui/core/Renderable\")\n\nexport enum LayoutEvents {\n LAYOUT_CHANGED = \"layout-changed\",\n ADDED = \"added\",\n REMOVED = \"removed\",\n RESIZED = \"resized\",\n}\n\nexport enum RenderableEvents {\n FOCUSED = \"focused\",\n BLURRED = \"blurred\",\n DESTROYED = \"destroyed\",\n}\n\nexport interface Position {\n top?: number | \"auto\" | `${number}%`\n right?: number | \"auto\" | `${number}%`\n bottom?: number | \"auto\" | `${number}%`\n left?: number | \"auto\" | `${number}%`\n}\n\nexport interface BaseRenderableOptions {\n id?: string\n}\n\nexport interface LayoutOptions extends BaseRenderableOptions {\n flexGrow?: number\n flexShrink?: number\n flexDirection?: FlexDirectionString\n flexWrap?: WrapString\n alignItems?: AlignString\n justifyContent?: JustifyString\n alignSelf?: AlignString\n flexBasis?: number | \"auto\" | undefined\n position?: PositionTypeString\n overflow?: OverflowString\n top?: number | \"auto\" | `${number}%`\n right?: number | \"auto\" | `${number}%`\n bottom?: number | \"auto\" | `${number}%`\n left?: number | \"auto\" | `${number}%`\n minWidth?: number | \"auto\" | `${number}%`\n minHeight?: number | \"auto\" | `${number}%`\n maxWidth?: number | \"auto\" | `${number}%`\n maxHeight?: number | \"auto\" | `${number}%`\n margin?: number | \"auto\" | `${number}%`\n marginX?: number | \"auto\" | `${number}%`\n marginY?: number | \"auto\" | `${number}%`\n marginTop?: number | \"auto\" | `${number}%`\n marginRight?: number | \"auto\" | `${number}%`\n marginBottom?: number | \"auto\" | `${number}%`\n marginLeft?: number | \"auto\" | `${number}%`\n padding?: number | `${number}%`\n paddingX?: number | `${number}%`\n paddingY?: number | `${number}%`\n paddingTop?: number | `${number}%`\n paddingRight?: number | `${number}%`\n paddingBottom?: number | `${number}%`\n paddingLeft?: number | `${number}%`\n enableLayout?: boolean\n}\n\nexport interface RenderableOptions<T extends BaseRenderable = BaseRenderable> extends Partial<LayoutOptions> {\n width?: number | \"auto\" | `${number}%`\n height?: number | \"auto\" | `${number}%`\n zIndex?: number\n visible?: boolean\n buffered?: boolean\n live?: boolean\n opacity?: number\n\n // hooks for custom render logic\n renderBefore?: (this: T, buffer: OptimizedBuffer, deltaTime: number) => void\n renderAfter?: (this: T, buffer: OptimizedBuffer, deltaTime: number) => void\n\n // catch all\n onMouse?: (this: T, event: MouseEvent) => void\n\n onMouseDown?: (this: T, event: MouseEvent) => void\n onMouseUp?: (this: T, event: MouseEvent) => void\n onMouseMove?: (this: T, event: MouseEvent) => void\n onMouseDrag?: (this: T, event: MouseEvent) => void\n onMouseDragEnd?: (this: T, event: MouseEvent) => void\n onMouseDrop?: (this: T, event: MouseEvent) => void\n onMouseOver?: (this: T, event: MouseEvent) => void\n onMouseOut?: (this: T, event: MouseEvent) => void\n onMouseScroll?: (this: T, event: MouseEvent) => void\n\n onPaste?: (this: T, event: PasteEvent) => void\n\n onKeyDown?: (key: KeyEvent) => void\n\n onSizeChange?: (this: T) => void\n}\n\nexport function isRenderable(obj: any): obj is Renderable {\n return !!obj?.[BrandedRenderable]\n}\n\nexport abstract class BaseRenderable extends EventEmitter {\n [BrandedRenderable] = true\n\n private static renderableNumber = 1\n protected _id: string\n public readonly num: number\n protected _dirty: boolean = false\n public parent: BaseRenderable | null = null\n protected _visible: boolean = true\n\n constructor(options: BaseRenderableOptions) {\n super()\n this.num = BaseRenderable.renderableNumber++\n this._id = options.id ?? `renderable-${this.num}`\n }\n\n public abstract add(obj: BaseRenderable | unknown, index?: number): number\n public abstract remove(id: string): void\n public abstract insertBefore(obj: BaseRenderable | unknown, anchor: BaseRenderable | unknown): void\n public abstract getChildren(): BaseRenderable[]\n public abstract getChildrenCount(): number\n public abstract getRenderable(id: string): BaseRenderable | undefined\n public abstract requestRender(): void\n public abstract findDescendantById(id: string): BaseRenderable | undefined\n\n public get id(): string {\n return this._id\n }\n\n public set id(value: string) {\n this._id = value\n }\n\n public get isDirty(): boolean {\n return this._dirty\n }\n\n protected markClean(): void {\n this._dirty = false\n }\n\n protected markDirty(): void {\n this._dirty = true\n }\n\n public destroy(): void {\n // Default implementation: do nothing\n // Override this method to provide custom removal logic\n }\n\n public destroyRecursively(): void {\n // Default implementation: do nothing\n // Override this method to provide custom destruction logic\n }\n\n public get visible(): boolean {\n return this._visible\n }\n\n public set visible(value: boolean) {\n this._visible = value\n }\n}\n\nconst yogaConfig: Config = Yoga.Config.create()\nyogaConfig.setUseWebDefaults(false)\nyogaConfig.setPointScaleFactor(1)\n\nexport abstract class Renderable extends BaseRenderable {\n static renderablesByNumber: Map<number, Renderable> = new Map()\n\n protected _isDestroyed: boolean = false\n protected _ctx: RenderContext\n protected _translateX: number = 0\n protected _translateY: number = 0\n protected _x: number = 0\n protected _y: number = 0\n // Render hot paths only need absolute terminal coordinates. Cache them during\n // layout so render-time code does not keep walking parent chains via x/y.\n protected _screenX: number = 0\n protected _screenY: number = 0\n protected _width: number | \"auto\" | `${number}%`\n protected _height: number | \"auto\" | `${number}%`\n protected _widthValue: number = 0\n protected _heightValue: number = 0\n private _zIndex: number\n public selectable: boolean = false\n protected buffered: boolean\n protected frameBuffer: OptimizedBuffer | null = null\n\n protected _focusable: boolean = false\n protected _focused: boolean = false\n protected _hasFocusedDescendant: boolean = false\n protected keypressHandler: ((key: KeyEvent) => void) | null = null\n protected pasteHandler: ((event: PasteEvent) => void) | null = null\n\n private _live: boolean = false\n protected _liveCount: number = 0\n\n private _sizeChangeListener: (() => void) | undefined = undefined\n private _mouseListener: ((event: MouseEvent) => void) | null = null\n private _mouseListeners: Partial<Record<MouseEventType, (event: MouseEvent) => void>> = {}\n private _pasteListener: ((event: PasteEvent) => void) | undefined = undefined\n private _keyListeners: Partial<Record<\"down\", (key: KeyEvent) => void>> = {}\n\n protected yogaNode: YogaNode\n protected _positionType: PositionTypeString = \"relative\"\n protected _overflow: OverflowString = \"visible\"\n protected _position: Position = {}\n protected _opacity: number = 1.0\n private _flexShrink: number = 1\n\n private renderableMapById: Map<string, Renderable> = new Map()\n protected _childrenInLayoutOrder: Renderable[] = []\n protected _childrenInZIndexOrder: Renderable[] = []\n private needsZIndexSort: boolean = false\n public override parent: Renderable | null = null\n\n private childrenPrimarySortDirty: boolean = true\n private childrenSortedByPrimaryAxis: Renderable[] = []\n private _shouldUpdateBefore: Set<Renderable> = new Set()\n\n // Frame id of the last updateFromLayout(); -1 ensures the first call runs.\n private _lastLayoutFrame: number = -1\n\n public onLifecyclePass: (() => void) | null = null\n\n public renderBefore?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void\n public renderAfter?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void\n\n constructor(ctx: RenderContext, options: RenderableOptions<any>) {\n super(options)\n\n this._ctx = ctx\n Renderable.renderablesByNumber.set(this.num, this)\n\n validateOptions(this.id, options)\n\n this.renderBefore = options.renderBefore\n this.renderAfter = options.renderAfter\n\n this._width = options.width ?? \"auto\"\n this._height = options.height ?? \"auto\"\n\n if (typeof this._width === \"number\") {\n this._widthValue = this._width\n }\n if (typeof this._height === \"number\") {\n this._heightValue = this._height\n }\n\n this._zIndex = options.zIndex ?? 0\n this._visible = options.visible !== false\n this.buffered = options.buffered ?? false\n this._live = options.live ?? false\n this._liveCount = this._live && this._visible ? 1 : 0\n this._opacity = options.opacity !== undefined ? Math.max(0, Math.min(1, options.opacity)) : 1.0\n\n // TODO: use a global yoga config\n this.yogaNode = Yoga.Node.create(yogaConfig)\n this.yogaNode.setDisplay(this._visible ? Display.Flex : Display.None)\n this.setupYogaProperties(options)\n\n this.applyEventOptions(options)\n\n if (this.buffered) {\n this.createFrameBuffer()\n }\n }\n\n public override get id() {\n return this._id\n }\n\n public override set id(value: string) {\n if (this.parent) {\n this.parent.renderableMapById.delete(this.id)\n this.parent.renderableMapById.set(value, this)\n }\n super.id = value\n }\n\n public get focusable(): boolean {\n return this._focusable\n }\n\n public set focusable(value: boolean) {\n this._focusable = value\n }\n\n public get ctx(): RenderContext {\n return this._ctx\n }\n\n public override get visible(): boolean {\n return this._visible\n }\n\n public get primaryAxis(): \"row\" | \"column\" {\n const dir = this.yogaNode.getFlexDirection()\n return dir === 2 || dir === 3 ? \"row\" : \"column\"\n }\n\n public override set visible(value: boolean) {\n if (this._visible === value) return\n\n const wasVisible = this._visible\n this._visible = value\n this.yogaNode.setDisplay(value ? Display.Flex : Display.None)\n\n if (this._live) {\n if (!wasVisible && value) {\n this.propagateLiveCount(1)\n } else if (wasVisible && !value) {\n this.propagateLiveCount(-1)\n }\n }\n\n if (this._focused) {\n this.blur()\n }\n this.requestRender()\n }\n\n public get opacity(): number {\n return this._opacity\n }\n\n public set opacity(value: number) {\n const clamped = Math.max(0, Math.min(1, value))\n if (this._opacity !== clamped) {\n this._opacity = clamped\n this.requestRender()\n }\n }\n\n public hasSelection(): boolean {\n return false\n }\n\n public onSelectionChanged(selection: Selection | null): boolean {\n // Default implementation: do nothing\n // Override this method to provide custom selection handling\n return false\n }\n\n public getSelectedText(): string {\n return \"\"\n }\n\n public shouldStartSelection(x: number, y: number): boolean {\n return false\n }\n\n public focus(): void {\n if (this._isDestroyed || this._focused || !this._focusable) return\n\n this._focused = true\n this._ctx.focusRenderable(this)\n this.requestRender()\n\n this.keypressHandler = (key: KeyEvent) => {\n if (this._isDestroyed) return\n this._keyListeners[\"down\"]?.(key)\n // Check again after user listener - it might have destroyed the renderable\n if (this._isDestroyed) return\n if (!key.defaultPrevented && this.handleKeyPress) {\n this.handleKeyPress(key)\n }\n }\n\n this.pasteHandler = (event: PasteEvent) => {\n if (this._isDestroyed) return\n this._pasteListener?.call(this, event)\n // Check again after user listener - it might have destroyed the renderable\n if (this._isDestroyed) return\n if (!event.defaultPrevented && this.handlePaste) {\n this.handlePaste(event)\n }\n }\n\n this.ctx._internalKeyInput.onInternal(\"keypress\", this.keypressHandler)\n this.ctx._internalKeyInput.onInternal(\"paste\", this.pasteHandler)\n this.propagateFocusChange(true)\n this.emit(RenderableEvents.FOCUSED)\n }\n\n protected propagateFocusChange(hasFocus: boolean): void {\n let parent = this.parent\n while (parent) {\n if (parent._hasFocusedDescendant !== hasFocus) {\n parent._hasFocusedDescendant = hasFocus\n parent.markDirty()\n }\n parent = parent.parent\n }\n\n this.requestRender()\n }\n\n public blur(): void {\n if (!this._focused || !this._focusable) return\n\n this._ctx.blurRenderable(this)\n this._focused = false\n this.requestRender()\n\n if (this.keypressHandler) {\n this.ctx._internalKeyInput.offInternal(\"keypress\", this.keypressHandler)\n this.keypressHandler = null\n }\n\n if (this.pasteHandler) {\n this.ctx._internalKeyInput.offInternal(\"paste\", this.pasteHandler)\n this.pasteHandler = null\n }\n\n this.propagateFocusChange(false)\n this.emit(RenderableEvents.BLURRED)\n }\n\n public get focused(): boolean {\n return this._focused\n }\n\n public get hasFocusedDescendant(): boolean {\n return this._hasFocusedDescendant\n }\n\n public get live(): boolean {\n return this._live\n }\n\n public get liveCount(): number {\n return this._liveCount\n }\n\n public set live(value: boolean) {\n if (this._live === value) return\n\n this._live = value\n\n if (this._visible) {\n const delta = value ? 1 : -1\n this.propagateLiveCount(delta)\n }\n }\n\n protected propagateLiveCount(delta: number): void {\n this._liveCount += delta\n this.parent?.propagateLiveCount(delta)\n }\n\n public handleKeyPress?(key: KeyEvent): boolean\n public handlePaste?(event: PasteEvent): void\n\n public override findDescendantById(id: string): Renderable | undefined {\n for (const child of this._childrenInLayoutOrder) {\n if (child.id === id) return child\n if (isRenderable(child)) {\n const found = child.findDescendantById(id)\n if (found) return found\n }\n }\n return undefined\n }\n\n public override requestRender() {\n this.markDirty()\n this._ctx.requestRender()\n }\n\n public get translateX(): number {\n return this._translateX\n }\n\n // Translate updates bypass layout, so keep the absolute screen cache current\n // here to make same-frame sort/cull/render reads observe the new position.\n public set translateX(value: number) {\n if (this._translateX === value) return\n this._translateX = value\n const parentScreenX = this.parent ? this.parent._screenX : 0\n this._screenX = parentScreenX + this._x + this._translateX\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n this.requestRender()\n }\n\n public get translateY(): number {\n return this._translateY\n }\n\n public set translateY(value: number) {\n if (this._translateY === value) return\n this._translateY = value\n const parentScreenY = this.parent ? this.parent._screenY : 0\n this._screenY = parentScreenY + this._y + this._translateY\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n this.requestRender()\n }\n\n // Use the cached parent screen position plus this node's current local offset.\n // That keeps culling/sorting in sync even before this node refreshes _screenX/Y.\n public get screenX(): number {\n const parentScreenX = this.parent ? this.parent._screenX : 0\n return parentScreenX + this._x + this._translateX\n }\n\n public get screenY(): number {\n const parentScreenY = this.parent ? this.parent._screenY : 0\n return parentScreenY + this._y + this._translateY\n }\n\n public get x(): number {\n if (this.parent) {\n return this.parent.x + this._x + this._translateX\n }\n return this._x + this._translateX\n }\n\n public set x(value: number) {\n this.left = value\n }\n\n public get top(): number | \"auto\" | `${number}%` | undefined {\n return this._position.top\n }\n\n public set top(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ top: value })\n }\n }\n\n public get right(): number | \"auto\" | `${number}%` | undefined {\n return this._position.right\n }\n\n public set right(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ right: value })\n }\n }\n\n public get bottom(): number | \"auto\" | `${number}%` | undefined {\n return this._position.bottom\n }\n\n public set bottom(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ bottom: value })\n }\n }\n\n public get left(): number | \"auto\" | `${number}%` | undefined {\n return this._position.left\n }\n\n public set left(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ left: value })\n }\n }\n\n public get y(): number {\n if (this.parent) {\n return this.parent.y + this._y + this._translateY\n }\n return this._y + this._translateY\n }\n\n public set y(value: number) {\n this.top = value\n }\n\n public get width(): number {\n return this._widthValue\n }\n\n public set width(value: number | \"auto\" | `${number}%`) {\n if (!isDimensionType(value) || this._width === value) {\n return\n }\n\n this._width = value\n this.yogaNode.setWidth(value)\n\n if (typeof value === \"number\" && this._flexShrink === 1) {\n this._flexShrink = 0\n this.yogaNode.setFlexShrink(0)\n }\n\n this.requestRender()\n }\n\n public get height(): number {\n return this._heightValue\n }\n\n public set height(value: number | \"auto\" | `${number}%`) {\n if (!isDimensionType(value) || this._height === value) {\n return\n }\n\n this._height = value\n this.yogaNode.setHeight(value)\n\n if (typeof value === \"number\" && this._flexShrink === 1) {\n this._flexShrink = 0\n this.yogaNode.setFlexShrink(0)\n }\n\n this.requestRender()\n }\n\n public get zIndex(): number {\n return this._zIndex\n }\n\n public set zIndex(value: number) {\n if (this._zIndex !== value) {\n this._zIndex = value\n this.parent?.requestZIndexSort()\n this.requestRender()\n }\n }\n\n private requestZIndexSort(): void {\n this.needsZIndexSort = true\n }\n\n private ensureZIndexSorted(): void {\n if (this.needsZIndexSort) {\n this._childrenInZIndexOrder.sort((a, b) => (a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0))\n this.needsZIndexSort = false\n }\n }\n\n public getChildrenSortedByPrimaryAxis(): Renderable[] {\n if (\n !this.childrenPrimarySortDirty &&\n this.childrenSortedByPrimaryAxis.length === this._childrenInLayoutOrder.length\n ) {\n return this.childrenSortedByPrimaryAxis\n }\n\n const dir = this.yogaNode.getFlexDirection()\n const axis: \"x\" | \"y\" = dir === 2 || dir === 3 ? \"x\" : \"y\"\n\n const sorted = [...this._childrenInLayoutOrder]\n sorted.sort((a, b) => {\n // Viewport culling compares against screen-space bounds, so primary-axis\n // ordering has to use absolute positions instead of parent-relative x/y.\n const va = axis === \"y\" ? a.screenY : a.screenX\n const vb = axis === \"y\" ? b.screenY : b.screenX\n return va - vb\n })\n\n this.childrenSortedByPrimaryAxis = sorted\n this.childrenPrimarySortDirty = false\n return this.childrenSortedByPrimaryAxis\n }\n\n private setupYogaProperties(options: RenderableOptions<Renderable>): void {\n const node = this.yogaNode\n\n if (isFlexBasisType(options.flexBasis)) {\n node.setFlexBasis(options.flexBasis)\n }\n\n if (isSizeType(options.minWidth)) {\n node.setMinWidth(options.minWidth)\n }\n if (isSizeType(options.minHeight)) {\n node.setMinHeight(options.minHeight)\n }\n\n if (options.flexGrow !== undefined) {\n node.setFlexGrow(options.flexGrow)\n } else {\n node.setFlexGrow(0)\n }\n\n if (options.flexShrink !== undefined) {\n this._flexShrink = options.flexShrink\n node.setFlexShrink(options.flexShrink)\n } else {\n // If explicit numeric width is set, don't shrink by default\n // Otherwise follow web default of 1\n const hasExplicitWidth = typeof options.width === \"number\"\n const hasExplicitHeight = typeof options.height === \"number\"\n this._flexShrink = hasExplicitWidth || hasExplicitHeight ? 0 : 1\n node.setFlexShrink(this._flexShrink)\n }\n\n node.setFlexDirection(parseFlexDirection(options.flexDirection))\n node.setFlexWrap(parseWrap(options.flexWrap))\n node.setAlignItems(parseAlignItems(options.alignItems))\n node.setJustifyContent(parseJustify(options.justifyContent))\n node.setAlignSelf(parseAlign(options.alignSelf))\n\n if (isDimensionType(options.width)) {\n this._width = options.width\n this.yogaNode.setWidth(options.width)\n }\n if (isDimensionType(options.height)) {\n this._height = options.height\n this.yogaNode.setHeight(options.height)\n }\n\n this._positionType = options.position === \"absolute\" ? \"absolute\" : \"relative\"\n if (this._positionType !== \"relative\") {\n node.setPositionType(parsePositionType(this._positionType))\n }\n\n this._overflow = options.overflow === \"hidden\" ? \"hidden\" : options.overflow === \"scroll\" ? \"scroll\" : \"visible\"\n if (this._overflow !== \"visible\") {\n node.setOverflow(parseOverflow(this._overflow))\n }\n\n // TODO: flatten position properties internally as well\n const hasPositionProps =\n options.top !== undefined ||\n options.right !== undefined ||\n options.bottom !== undefined ||\n options.left !== undefined\n if (hasPositionProps) {\n this._position = {\n top: options.top,\n right: options.right,\n bottom: options.bottom,\n left: options.left,\n }\n this.updateYogaPosition(this._position)\n }\n\n if (isSizeType(options.maxWidth)) {\n node.setMaxWidth(options.maxWidth)\n }\n if (isSizeType(options.maxHeight)) {\n node.setMaxHeight(options.maxHeight)\n }\n\n this.setupMarginAndPadding(options)\n }\n\n private setupMarginAndPadding(options: RenderableOptions<Renderable>): void {\n const node = this.yogaNode\n\n if (isMarginType(options.margin)) {\n node.setMargin(Edge.All, options.margin)\n }\n\n if (isMarginType(options.marginX)) {\n node.setMargin(Edge.Horizontal, options.marginX)\n }\n if (isMarginType(options.marginY)) {\n node.setMargin(Edge.Vertical, options.marginY)\n }\n if (isMarginType(options.marginTop)) {\n node.setMargin(Edge.Top, options.marginTop)\n }\n if (isMarginType(options.marginRight)) {\n node.setMargin(Edge.Right, options.marginRight)\n }\n if (isMarginType(options.marginBottom)) {\n node.setMargin(Edge.Bottom, options.marginBottom)\n }\n if (isMarginType(options.marginLeft)) {\n node.setMargin(Edge.Left, options.marginLeft)\n }\n\n if (isPaddingType(options.padding)) {\n node.setPadding(Edge.All, options.padding)\n }\n\n if (isPaddingType(options.paddingX)) {\n node.setPadding(Edge.Horizontal, options.paddingX)\n }\n if (isPaddingType(options.paddingY)) {\n node.setPadding(Edge.Vertical, options.paddingY)\n }\n if (isPaddingType(options.paddingTop)) {\n node.setPadding(Edge.Top, options.paddingTop)\n }\n if (isPaddingType(options.paddingRight)) {\n node.setPadding(Edge.Right, options.paddingRight)\n }\n if (isPaddingType(options.paddingBottom)) {\n node.setPadding(Edge.Bottom, options.paddingBottom)\n }\n if (isPaddingType(options.paddingLeft)) {\n node.setPadding(Edge.Left, options.paddingLeft)\n }\n }\n\n set position(positionType: PositionTypeString | null | undefined) {\n if (!isPositionTypeType(positionType) || this._positionType === positionType) return\n\n this._positionType = positionType\n this.yogaNode.setPositionType(parsePositionType(positionType))\n this.requestRender()\n }\n\n get overflow(): OverflowString {\n return this._overflow\n }\n\n set overflow(overflow: OverflowString | null | undefined) {\n if (!isOverflowType(overflow) || this._overflow === overflow) return\n\n this._overflow = overflow\n this.yogaNode.setOverflow(parseOverflow(overflow))\n this.requestRender()\n }\n\n public setPosition(position: Position): void {\n this._position = { ...this._position, ...position }\n this.updateYogaPosition(position)\n }\n\n private updateYogaPosition(position: Position): void {\n const node = this.yogaNode\n const { top, right, bottom, left } = position\n\n if (isPositionType(top)) {\n if (top === \"auto\") {\n node.setPositionAuto(Edge.Top)\n } else {\n node.setPosition(Edge.Top, top)\n }\n }\n if (isPositionType(right)) {\n if (right === \"auto\") {\n node.setPositionAuto(Edge.Right)\n } else {\n node.setPosition(Edge.Right, right)\n }\n }\n if (isPositionType(bottom)) {\n if (bottom === \"auto\") {\n node.setPositionAuto(Edge.Bottom)\n } else {\n node.setPosition(Edge.Bottom, bottom)\n }\n }\n if (isPositionType(left)) {\n if (left === \"auto\") {\n node.setPositionAuto(Edge.Left)\n } else {\n node.setPosition(Edge.Left, left)\n }\n }\n this.requestRender()\n }\n\n public set flexGrow(grow: number | null | undefined) {\n if (grow == null) {\n this.yogaNode.setFlexGrow(0)\n } else {\n this.yogaNode.setFlexGrow(grow)\n }\n this.requestRender()\n }\n\n public set flexShrink(shrink: number | null | undefined) {\n const value = shrink == null ? 1 : shrink\n this._flexShrink = value\n this.yogaNode.setFlexShrink(value)\n this.requestRender()\n }\n\n public set flexDirection(direction: FlexDirectionString | null | undefined) {\n this.yogaNode.setFlexDirection(parseFlexDirection(direction))\n this.requestRender()\n }\n\n public set flexWrap(wrap: WrapString | null | undefined) {\n this.yogaNode.setFlexWrap(parseWrap(wrap))\n this.requestRender()\n }\n\n public set alignItems(alignItems: AlignString | null | undefined) {\n this.yogaNode.setAlignItems(parseAlignItems(alignItems))\n this.requestRender()\n }\n\n public set justifyContent(justifyContent: JustifyString | null | undefined) {\n this.yogaNode.setJustifyContent(parseJustify(justifyContent))\n this.requestRender()\n }\n\n public set alignSelf(alignSelf: AlignString | null | undefined) {\n this.yogaNode.setAlignSelf(parseAlign(alignSelf))\n this.requestRender()\n }\n\n public set flexBasis(basis: number | \"auto\" | null | undefined) {\n if (isFlexBasisType(basis)) {\n this.yogaNode.setFlexBasis(basis)\n this.requestRender()\n }\n }\n\n public set minWidth(minWidth: number | `${number}%` | null | undefined) {\n if (isSizeType(minWidth)) {\n this.yogaNode.setMinWidth(minWidth)\n this.requestRender()\n }\n }\n\n public set maxWidth(maxWidth: number | `${number}%` | null | undefined) {\n if (isSizeType(maxWidth)) {\n this.yogaNode.setMaxWidth(maxWidth)\n this.requestRender()\n }\n }\n\n public set minHeight(minHeight: number | `${number}%` | null | undefined) {\n if (isSizeType(minHeight)) {\n this.yogaNode.setMinHeight(minHeight)\n this.requestRender()\n }\n }\n\n public set maxHeight(maxHeight: number | `${number}%` | null | undefined) {\n if (isSizeType(maxHeight)) {\n this.yogaNode.setMaxHeight(maxHeight)\n this.requestRender()\n }\n }\n\n public set margin(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.All, margin)\n this.requestRender()\n }\n }\n\n public set marginX(marginX: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(marginX)) {\n this.yogaNode.setMargin(Edge.Horizontal, marginX)\n this.requestRender()\n }\n }\n\n public set marginY(marginY: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(marginY)) {\n this.yogaNode.setMargin(Edge.Vertical, marginY)\n this.requestRender()\n }\n }\n\n public set marginTop(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Top, margin)\n this.requestRender()\n }\n }\n\n public set marginRight(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Right, margin)\n this.requestRender()\n }\n }\n\n public set marginBottom(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Bottom, margin)\n this.requestRender()\n }\n }\n\n public set marginLeft(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Left, margin)\n this.requestRender()\n }\n }\n\n public set padding(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.All, padding)\n this.requestRender()\n }\n }\n\n public set paddingX(paddingX: number | `${number}%` | null | undefined) {\n if (isPaddingType(paddingX)) {\n this.yogaNode.setPadding(Edge.Horizontal, paddingX)\n this.requestRender()\n }\n }\n\n public set paddingY(paddingY: number | `${number}%` | null | undefined) {\n if (isPaddingType(paddingY)) {\n this.yogaNode.setPadding(Edge.Vertical, paddingY)\n this.requestRender()\n }\n }\n\n public set paddingTop(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Top, padding)\n this.requestRender()\n }\n }\n\n public set paddingRight(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Right, padding)\n this.requestRender()\n }\n }\n\n public set paddingBottom(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Bottom, padding)\n this.requestRender()\n }\n }\n\n public set paddingLeft(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Left, padding)\n this.requestRender()\n }\n }\n\n public getLayoutNode(): YogaNode {\n return this.yogaNode\n }\n\n public updateFromLayout(): void {\n // Yoga layout is stable within a frame; skip the FFI round-trip on repeat calls.\n const frameId = this._ctx.frameId\n if (this._lastLayoutFrame === frameId) return\n this._lastLayoutFrame = frameId\n\n const layout = this.yogaNode.getComputedLayout()\n\n const oldX = this._x\n const oldY = this._y\n const oldWidth = this._widthValue\n const oldHeight = this._heightValue\n\n this._x = layout.left\n this._y = layout.top\n // Layout is updated top-down, so the parent cache is already current here.\n // Recomputing once per layout pass keeps render-time coordinate reads cheap.\n const parentScreenX = this.parent ? this.parent._screenX : 0\n const parentScreenY = this.parent ? this.parent._screenY : 0\n this._screenX = parentScreenX + this._x + this._translateX\n this._screenY = parentScreenY + this._y + this._translateY\n\n const newWidth = Math.max(layout.width, 1)\n const newHeight = Math.max(layout.height, 1)\n const sizeChanged = oldWidth !== newWidth || oldHeight !== newHeight\n\n this._widthValue = newWidth\n this._heightValue = newHeight\n\n if (sizeChanged) {\n this.onLayoutResize(newWidth, newHeight)\n }\n\n const positionChanged = oldX !== this._x || oldY !== this._y\n if (positionChanged) {\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n }\n }\n\n protected onLayoutResize(width: number, height: number): void {\n if (this._visible) {\n // TODO: Should probably .markDirty()\n this.handleFrameBufferResize(width, height)\n this.onResize(width, height)\n this.requestRender()\n }\n }\n\n protected handleFrameBufferResize(width: number, height: number): void {\n if (!this.buffered) return\n\n if (width <= 0 || height <= 0) {\n return\n }\n\n if (this.frameBuffer) {\n this.frameBuffer.resize(width, height)\n } else {\n this.createFrameBuffer()\n }\n }\n\n protected createFrameBuffer(): void {\n const w = this.width\n const h = this.height\n\n if (w <= 0 || h <= 0) {\n return\n }\n\n try {\n const widthMethod = this._ctx.widthMethod\n this.frameBuffer = OptimizedBuffer.create(w, h, widthMethod, {\n respectAlpha: true,\n id: `framebuffer-${this.id}`,\n })\n } catch (error) {\n console.error(`Failed to create frame buffer for ${this.id}:`, error)\n this.frameBuffer = null\n }\n }\n\n /**\n * This will be called during a render pass.\n * Requesting a render during a render pass will drop the requested render.\n * If you need to request a render during a render pass, use process.nextTick.\n */\n protected onResize(width: number, height: number): void {\n this.onSizeChange?.()\n this.emit(\"resize\")\n // Override in subclasses for additional resize logic\n }\n\n private replaceParent(obj: Renderable) {\n if (obj.parent) {\n obj.parent.remove(obj.id)\n }\n obj.parent = this\n }\n\n public override add(obj: Renderable | VNode<any, any[]> | unknown, index?: number): number {\n if (this._isDestroyed) return -1\n if (!obj) {\n return -1\n }\n\n const renderable = maybeMakeRenderable(this._ctx, obj)\n if (!renderable) {\n return -1\n }\n\n if (renderable.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Renderable with id ${renderable.id} was already destroyed, skipping add`)\n }\n return -1\n }\n\n const anchorRenderable = index !== undefined ? this._childrenInLayoutOrder[index] : undefined\n\n if (anchorRenderable) {\n return this.insertBefore(renderable, anchorRenderable)\n }\n\n if (renderable.parent === this) {\n if (!this._isDestroyed && !renderable.isDestroyed) this.yogaNode.removeChild(renderable.getLayoutNode())\n this._childrenInLayoutOrder.splice(this._childrenInLayoutOrder.indexOf(renderable), 1)\n } else {\n this.replaceParent(renderable)\n this.needsZIndexSort = true\n this.renderableMapById.set(renderable.id, renderable)\n this._childrenInZIndexOrder.push(renderable)\n\n if (typeof renderable.onLifecyclePass === \"function\") {\n this._ctx.registerLifecyclePass(renderable)\n }\n\n if (renderable._liveCount > 0) {\n this.propagateLiveCount(renderable._liveCount)\n }\n }\n\n const childLayoutNode = renderable.getLayoutNode()\n const insertedIndex = this._childrenInLayoutOrder.length\n this._childrenInLayoutOrder.push(renderable)\n if (!this._isDestroyed && !renderable.isDestroyed) {\n const existingParent = childLayoutNode.getParent()\n if (existingParent && existingParent !== this.yogaNode) {\n existingParent.removeChild(childLayoutNode)\n }\n this.yogaNode.insertChild(childLayoutNode, insertedIndex)\n }\n\n this.childrenPrimarySortDirty = true\n this._shouldUpdateBefore.add(renderable)\n\n this.requestRender()\n\n return insertedIndex\n }\n\n override insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number {\n if (this._isDestroyed) return -1\n if (!anchor) {\n return this.add(obj)\n }\n\n if (!obj) {\n return -1\n }\n\n const renderable = maybeMakeRenderable(this._ctx, obj)\n if (!renderable) {\n return -1\n }\n\n if (renderable.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Renderable with id ${renderable.id} was already destroyed, skipping insertBefore`)\n }\n return -1\n }\n\n if (!isRenderable(anchor)) {\n throw new Error(\"Anchor must be a Renderable\")\n }\n\n if (anchor.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor with id ${anchor.id} was already destroyed, skipping insertBefore`)\n }\n return -1\n }\n\n if (!this.renderableMapById.has(anchor.id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor with id ${anchor.id} does not exist within the parent ${this.id}, skipping insertBefore`)\n }\n return -1\n }\n\n if (renderable === anchor || renderable.id === anchor.id) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor is the same as the node ${renderable.id} being inserted, skipping insertBefore`)\n }\n return -1\n }\n\n if (renderable.parent === this) {\n if (!this._isDestroyed && !renderable.isDestroyed) this.yogaNode.removeChild(renderable.getLayoutNode())\n this._childrenInLayoutOrder.splice(this._childrenInLayoutOrder.indexOf(renderable), 1)\n } else {\n this.replaceParent(renderable)\n this.needsZIndexSort = true\n this.renderableMapById.set(renderable.id, renderable)\n this._childrenInZIndexOrder.push(renderable)\n\n if (typeof renderable.onLifecyclePass === \"function\") {\n this._ctx.registerLifecyclePass(renderable)\n }\n\n if (renderable._liveCount > 0) {\n this.propagateLiveCount(renderable._liveCount)\n }\n }\n\n this.childrenPrimarySortDirty = true\n\n const anchorIndex = this._childrenInLayoutOrder.indexOf(anchor)\n const insertedIndex = Math.max(0, Math.min(anchorIndex, this._childrenInLayoutOrder.length))\n\n this._childrenInLayoutOrder.splice(insertedIndex, 0, renderable)\n if (!this._isDestroyed && !renderable.isDestroyed) {\n const existingParent = renderable.getLayoutNode().getParent()\n if (existingParent && existingParent !== this.yogaNode) {\n existingParent.removeChild(renderable.getLayoutNode())\n }\n this.yogaNode.insertChild(renderable.getLayoutNode(), insertedIndex)\n }\n\n this._shouldUpdateBefore.add(renderable)\n\n this.requestRender()\n\n return insertedIndex\n }\n\n // TODO: that naming is meh\n public override getRenderable(id: string): Renderable | undefined {\n return this.renderableMapById.get(id)\n }\n\n public override remove(id: string): void {\n if (this._isDestroyed) return\n if (!id) {\n return\n }\n\n if (this.renderableMapById.has(id)) {\n const obj = this.renderableMapById.get(id)\n if (obj) {\n if (obj._liveCount > 0) {\n this.propagateLiveCount(-obj._liveCount)\n }\n\n const childLayoutNode = obj.getLayoutNode()\n if (!this._isDestroyed && !obj.isDestroyed) this.yogaNode.removeChild(childLayoutNode)\n this.requestRender()\n\n obj.onRemove()\n obj.parent = null\n this._ctx.unregisterLifecyclePass(obj)\n this.renderableMapById.delete(id)\n\n const index = this._childrenInLayoutOrder.findIndex((obj) => obj.id === id)\n if (index !== -1) {\n this._childrenInLayoutOrder.splice(index, 1)\n }\n\n const zIndexIndex = this._childrenInZIndexOrder.findIndex((obj) => obj.id === id)\n if (zIndexIndex !== -1) {\n this._childrenInZIndexOrder.splice(zIndexIndex, 1)\n }\n\n this.childrenPrimarySortDirty = true\n }\n }\n }\n\n protected onRemove(): void {\n // Default implementation: do nothing\n // Override this method to provide custom removal logic\n }\n\n public override getChildren(): Renderable[] {\n return [...this._childrenInLayoutOrder]\n }\n\n public override getChildrenCount(): number {\n return this._childrenInLayoutOrder.length\n }\n\n public updateLayout(deltaTime: number, renderList: RenderCommand[] = []): void {\n if (!this.visible) return\n\n this.onUpdate(deltaTime)\n\n // If destroyed during onUpdate, don't add to render list\n if (this._isDestroyed) return\n\n // NOTE: worst case updateFromLayout is called throughout the whole tree,\n // which currently still has yoga performance issues.\n // This can be mitigated at some point when the layout tree moved to native,\n // as in the native yoga tree we can use events during the calculateLayout phase,\n // and anctually know if a child has changed or not.\n // That would allow us to to generate optimised render commands,\n // including the layout updates, in one pass.\n this.updateFromLayout()\n\n // Update newly added children before getting visible children\n // This ensures their positions are current when culling happens\n if (this._shouldUpdateBefore.size > 0) {\n for (const child of this._shouldUpdateBefore) {\n if (!child.isDestroyed) {\n child.updateFromLayout()\n }\n }\n this._shouldUpdateBefore.clear()\n }\n\n // Check again after updateFromLayout, which calls onResize/onSizeChange\n if (this._isDestroyed) return\n\n // Push opacity BEFORE rendering this element so it affects this element and all children\n const shouldPushOpacity = this._opacity < 1.0\n if (shouldPushOpacity) {\n renderList.push({ action: \"pushOpacity\", opacity: this._opacity })\n }\n\n renderList.push({ action: \"render\", renderable: this })\n\n this.ensureZIndexSorted()\n\n const shouldPushScissor = this._overflow !== \"visible\" && this.width > 0 && this.height > 0\n if (shouldPushScissor) {\n const scissorRect = this.getScissorRect()\n renderList.push({\n action: \"pushScissorRect\",\n x: scissorRect.x,\n y: scissorRect.y,\n width: scissorRect.width,\n height: scissorRect.height,\n screenX: this._screenX,\n screenY: this._screenY,\n })\n }\n // Most renderables expose all children. Skip building a visible-child list\n // unless a subclass actually performs viewport/style-based child filtering.\n if (!this._hasVisibleChildFilter()) {\n for (const child of this._childrenInZIndexOrder) {\n child.updateLayout(deltaTime, renderList)\n }\n } else {\n // Refresh every child's layout before culling reads their screen\n // coordinates; otherwise culling runs against last frame's positions\n // and drops content that shifted this frame. The per-frame guard in\n // updateFromLayout keeps this at one FFI call per child per frame.\n for (const child of this._childrenInZIndexOrder) {\n if (child.isDestroyed) continue\n child.updateFromLayout()\n }\n const visibleChildren = this._getVisibleChildren()\n const visibleChildSet = new Set(visibleChildren)\n for (const child of this._childrenInZIndexOrder) {\n if (!visibleChildSet.has(child.num)) continue\n child.updateLayout(deltaTime, renderList)\n }\n }\n\n if (shouldPushScissor) {\n renderList.push({ action: \"popScissorRect\" })\n }\n if (shouldPushOpacity) {\n renderList.push({ action: \"popOpacity\" })\n }\n }\n\n public render(buffer: OptimizedBuffer, deltaTime: number): void {\n let renderBuffer = buffer\n if (this.buffered && this.frameBuffer) {\n renderBuffer = this.frameBuffer\n }\n\n if (this.renderBefore) {\n this.renderBefore.call(this, renderBuffer, deltaTime)\n }\n\n this.renderSelf(renderBuffer, deltaTime)\n\n if (this.renderAfter) {\n this.renderAfter.call(this, renderBuffer, deltaTime)\n }\n\n // Hooks may move the renderable mid-frame, so sample the cached absolute\n // position after they run before hit-grid writes or framebuffer compositing.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n if (this.buffered && this.frameBuffer) {\n buffer.drawFrameBuffer(screenX, screenY, this.frameBuffer)\n }\n }\n\n protected _hasVisibleChildFilter(): boolean {\n // Presume an override of _getVisibleChildren means this subclass is using\n // the legacy filtering hook, so existing custom renderables keep working.\n return this._getVisibleChildren !== Renderable.prototype._getVisibleChildren\n }\n\n protected _getVisibleChildren(): number[] {\n return this._childrenInZIndexOrder.map((child) => child.num)\n }\n\n protected onUpdate(deltaTime: number): void {\n // Default implementation: do nothing\n // Override this method to provide custom rendering\n }\n\n protected getScissorRect(): {\n x: number\n y: number\n width: number\n height: number\n } {\n return {\n x: this.buffered ? 0 : this._screenX,\n y: this.buffered ? 0 : this._screenY,\n width: this.width,\n height: this.height,\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n // Default implementation: do nothing\n // Override this method to provide custom rendering\n }\n\n public get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n public override destroy(): void {\n if (this._isDestroyed) {\n return\n }\n\n this._isDestroyed = true\n this.emit(RenderableEvents.DESTROYED)\n\n if (this.parent) {\n this.parent.remove(this.id)\n }\n\n if (this.frameBuffer) {\n this.frameBuffer.destroy()\n this.frameBuffer = null\n }\n\n for (const child of this._childrenInLayoutOrder) {\n this.remove(child.id)\n }\n\n this._childrenInLayoutOrder = []\n this.renderableMapById.clear()\n Renderable.renderablesByNumber.delete(this.num)\n\n this.blur()\n this.removeAllListeners()\n\n this.destroySelf()\n\n try {\n this.yogaNode.free()\n } catch (e) {\n // Might be already freed and will throw an error if we try to free it again\n }\n }\n\n public override destroyRecursively(): void {\n // Destroy children first to ensure removal as destroy clears child array\n // Make a copy of the children array to avoid iteration issues when children are destroyed\n const children = [...this._childrenInLayoutOrder]\n for (const child of children) {\n child.destroyRecursively()\n }\n this.destroy()\n }\n\n protected destroySelf(): void {\n // Default implementation: do nothing else\n // Override this method to provide custom cleanup\n }\n\n public processMouseEvent(event: MouseEvent): void {\n this._mouseListener?.call(this, event)\n this._mouseListeners[event.type]?.call(this, event)\n this.onMouseEvent(event)\n\n if (this.parent && !event.propagationStopped) {\n this.parent.processMouseEvent(event)\n }\n }\n\n protected onMouseEvent(event: MouseEvent): void {\n // Default implementation: do nothing\n // Override this method to provide custom event handling\n }\n\n public set onMouse(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListener = handler\n else this._mouseListener = null\n }\n\n public set onMouseDown(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"down\"] = handler\n else delete this._mouseListeners[\"down\"]\n }\n\n public set onMouseUp(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"up\"] = handler\n else delete this._mouseListeners[\"up\"]\n }\n\n public set onMouseMove(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"move\"] = handler\n else delete this._mouseListeners[\"move\"]\n }\n\n public set onMouseDrag(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drag\"] = handler\n else delete this._mouseListeners[\"drag\"]\n }\n\n public set onMouseDragEnd(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drag-end\"] = handler\n else delete this._mouseListeners[\"drag-end\"]\n }\n\n public set onMouseDrop(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drop\"] = handler\n else delete this._mouseListeners[\"drop\"]\n }\n\n public set onMouseOver(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"over\"] = handler\n else delete this._mouseListeners[\"over\"]\n }\n\n public set onMouseOut(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"out\"] = handler\n else delete this._mouseListeners[\"out\"]\n }\n\n public set onMouseScroll(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"scroll\"] = handler\n else delete this._mouseListeners[\"scroll\"]\n }\n\n public set onPaste(handler: ((event: PasteEvent) => void) | undefined) {\n this._pasteListener = handler\n }\n public get onPaste(): ((event: PasteEvent) => void) | undefined {\n return this._pasteListener\n }\n\n public set onKeyDown(handler: ((key: KeyEvent) => void) | undefined) {\n if (handler) this._keyListeners[\"down\"] = handler\n else delete this._keyListeners[\"down\"]\n }\n public get onKeyDown(): ((key: KeyEvent) => void) | undefined {\n return this._keyListeners[\"down\"]\n }\n\n public set onSizeChange(handler: (() => void) | undefined) {\n this._sizeChangeListener = handler\n }\n public get onSizeChange(): (() => void) | undefined {\n return this._sizeChangeListener\n }\n\n private applyEventOptions(options: RenderableOptions<Renderable>): void {\n this.onMouse = options.onMouse\n this.onMouseDown = options.onMouseDown\n this.onMouseUp = options.onMouseUp\n this.onMouseMove = options.onMouseMove\n this.onMouseDrag = options.onMouseDrag\n this.onMouseDragEnd = options.onMouseDragEnd\n this.onMouseDrop = options.onMouseDrop\n this.onMouseOver = options.onMouseOver\n this.onMouseOut = options.onMouseOut\n this.onMouseScroll = options.onMouseScroll\n this.onPaste = options.onPaste\n this.onKeyDown = options.onKeyDown\n this.onSizeChange = options.onSizeChange\n }\n}\n\ninterface RenderCommandBase {\n action: \"render\" | \"pushScissorRect\" | \"popScissorRect\" | \"pushOpacity\" | \"popOpacity\"\n}\n\ninterface RenderCommandPushScissorRect extends RenderCommandBase {\n action: \"pushScissorRect\"\n x: number\n y: number\n width: number\n height: number\n screenX: number\n screenY: number\n}\n\ninterface RenderCommandPopScissorRect extends RenderCommandBase {\n action: \"popScissorRect\"\n}\n\ninterface RenderCommandRender extends RenderCommandBase {\n action: \"render\"\n renderable: Renderable\n}\n\ninterface RenderCommandPushOpacity extends RenderCommandBase {\n action: \"pushOpacity\"\n opacity: number\n}\n\ninterface RenderCommandPopOpacity extends RenderCommandBase {\n action: \"popOpacity\"\n}\n\nexport type RenderCommand =\n | RenderCommandPushScissorRect\n | RenderCommandPopScissorRect\n | RenderCommandRender\n | RenderCommandPushOpacity\n | RenderCommandPopOpacity\n\nexport class RootRenderable extends Renderable {\n private renderList: RenderCommand[] = []\n\n constructor(ctx: RenderContext) {\n super(ctx, {\n id: \"__root__\",\n zIndex: 0,\n visible: true,\n width: ctx.width,\n height: ctx.height,\n enableLayout: true,\n })\n\n if (this.yogaNode) {\n this.yogaNode.free()\n }\n\n this.yogaNode = Yoga.Node.create(yogaConfig)\n this.yogaNode.setWidth(ctx.width)\n this.yogaNode.setHeight(ctx.height)\n this.yogaNode.setFlexDirection(FlexDirection.Column)\n\n this.calculateLayout()\n }\n\n public override render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n\n // 0. Run lifecycle pass\n for (const renderable of this._ctx.getLifecyclePasses()) {\n renderable.onLifecyclePass?.call(renderable)\n }\n\n // NOTE: Strictly speaking, this is a 3-pass rendering process:\n // 1. Calculate layout from root\n // 2. Update layout throughout the tree and collect render list\n // 3. Render all collected renderables\n // Should be 2-pass by hooking into the calculateLayout phase,\n // but that's only possible if we move the layout tree to native.\n\n // 1. Calculate layout from root\n if (this.yogaNode.isDirty()) {\n this.calculateLayout()\n }\n\n // 2. Update layout throughout the tree and collect render list\n this.renderList.length = 0\n this.updateLayout(deltaTime, this.renderList)\n\n // 3. Render all collected renderables\n this._ctx.clearHitGridScissorRects()\n for (let i = 1; i < this.renderList.length; i++) {\n const command = this.renderList[i]\n switch (command.action) {\n case \"render\":\n // Skip if renderable was destroyed during a previous render callback\n if (!command.renderable.isDestroyed) {\n command.renderable.render(buffer, deltaTime)\n }\n break\n case \"pushScissorRect\":\n buffer.pushScissorRect(command.x, command.y, command.width, command.height)\n this._ctx.pushHitGridScissorRect(command.screenX, command.screenY, command.width, command.height)\n break\n case \"popScissorRect\":\n buffer.popScissorRect()\n this._ctx.popHitGridScissorRect()\n break\n case \"pushOpacity\":\n buffer.pushOpacity(command.opacity)\n break\n case \"popOpacity\":\n buffer.popOpacity()\n break\n }\n }\n }\n\n protected override propagateLiveCount(delta: number): void {\n const oldCount = this._liveCount\n this._liveCount += delta\n\n if (oldCount === 0 && this._liveCount > 0) {\n this._ctx.requestLive()\n } else if (oldCount > 0 && this._liveCount === 0) {\n this._ctx.dropLive()\n }\n }\n\n public calculateLayout(): void {\n this.yogaNode.calculateLayout(this.width, this.height, Direction.LTR)\n this.emit(LayoutEvents.LAYOUT_CHANGED)\n }\n\n public resize(width: number, height: number): void {\n this.width = width\n this.height = height\n\n this.emit(LayoutEvents.RESIZED, { width, height })\n }\n}\n",
|
|
50
|
+
"import type { RenderableOptions, Renderable } from \"../Renderable.js\"\nimport type { PositionTypeString, OverflowString } from \"./yoga.options.js\"\n\nexport function validateOptions(id: string, options: RenderableOptions<Renderable>): void {\n if (typeof options.width === \"number\") {\n if (options.width < 0) {\n throw new TypeError(`Invalid width for Renderable ${id}: ${options.width}`)\n }\n }\n if (typeof options.height === \"number\") {\n if (options.height < 0) {\n throw new TypeError(`Invalid height for Renderable ${id}: ${options.height}`)\n }\n }\n}\n\nexport function isValidPercentage(value: any): value is `${number}%` {\n if (typeof value === \"string\" && value.endsWith(\"%\")) {\n const numPart = value.slice(0, -1)\n const num = parseFloat(numPart)\n return !Number.isNaN(num)\n }\n return false\n}\n\nexport function isMarginType(value: any): value is number | \"auto\" | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n if (value === \"auto\") {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPaddingType(value: any): value is number | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPositionType(value: any): value is number | \"auto\" | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n if (value === \"auto\") {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPositionTypeType(value: any): value is PositionTypeString {\n return value === \"relative\" || value === \"absolute\"\n}\n\nexport function isOverflowType(value: any): value is OverflowString {\n return value === \"visible\" || value === \"hidden\" || value === \"scroll\"\n}\n\nexport function isDimensionType(value: any): value is number | \"auto\" | `${number}%` {\n return isPositionType(value)\n}\n\nexport function isFlexBasisType(value: any): value is number | \"auto\" | undefined {\n if (value === undefined || value === \"auto\") {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return false\n}\n\nexport function isSizeType(value: any): value is number | `${number}%` | undefined {\n if (value === undefined) {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n",
|
|
51
|
+
"import { isRenderable, Renderable, type RenderableOptions } from \"../../Renderable.js\"\nimport type { RenderContext } from \"../../types.js\"\nimport util from \"node:util\"\n\nexport type VChild = VNode | Renderable | VChild[] | null | undefined | false\n\nexport interface PendingCall {\n method: string\n args: any[]\n isProperty?: boolean\n}\n\nconst BrandedVNode: unique symbol = Symbol.for(\"@opentui/core/VNode\")\n\nexport interface VNode<P = any, C = VChild[]> {\n [BrandedVNode]: true\n type: Construct<P>\n props?: P\n children?: C\n __delegateMap?: Record<string, string>\n __pendingCalls?: PendingCall[]\n}\n\n// Type that represents a VNode with Renderable methods available for chaining\nexport type ProxiedVNode<TCtor extends RenderableConstructor<any>> = VNode<\n TCtor extends RenderableConstructor<infer P> ? P : any\n> & {\n [K in keyof InstanceType<TCtor>]: InstanceType<TCtor>[K] extends (...args: infer Args) => any\n ? (...args: Args) => ProxiedVNode<TCtor>\n : InstanceType<TCtor>[K]\n}\n\nexport interface RenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>> {\n new (ctx: RenderContext, options: P): Renderable\n}\n\nexport type FunctionalConstruct<P = any> = (props: P, children?: VChild[]) => VNode\n\nexport type Construct<P = any> =\n | RenderableConstructor<P extends RenderableOptions<any> ? P : never>\n | FunctionalConstruct<P>\n\nfunction isRenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>>(\n value: any,\n): value is RenderableConstructor<P> {\n return typeof value === \"function\" && value.prototype && Renderable.prototype.isPrototypeOf(value.prototype)\n}\n\nfunction flattenChildren(children: VChild[]): VChild[] {\n const result: VChild[] = []\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...flattenChildren(child))\n } else if (child !== null && child !== undefined && child !== false) {\n result.push(child)\n }\n }\n return result\n}\n\n// Overloads for proper typing\nexport function h<TCtor extends RenderableConstructor<any>>(\n type: TCtor,\n props?: TCtor extends RenderableConstructor<infer P> ? P : never,\n ...children: VChild[]\n): ProxiedVNode<TCtor>\nexport function h<P>(type: FunctionalConstruct<P>, props?: P, ...children: VChild[]): VNode<P>\nexport function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): VNode<P> | ProxiedVNode<any>\nexport function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): any {\n if (typeof type !== \"function\") {\n throw new TypeError(\"h() received an invalid vnode type\")\n }\n\n const vnode: VNode<P> = {\n [BrandedVNode]: true,\n type,\n props,\n children: flattenChildren(children),\n __pendingCalls: [],\n }\n\n if (isRenderableConstructor(type)) {\n return new Proxy(vnode, {\n get(target, prop, receiver) {\n // Return VNode properties directly\n if (prop in target) {\n return Reflect.get(target, prop, receiver)\n }\n\n if (typeof prop === \"string\") {\n const prototype = type.prototype\n const hasMethod =\n prototype &&\n (typeof prototype[prop] === \"function\" ||\n Object.getOwnPropertyDescriptor(prototype, prop) ||\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop))\n\n if (hasMethod) {\n return (...args: any[]) => {\n target.__pendingCalls = target.__pendingCalls || []\n target.__pendingCalls.push({ method: prop, args })\n return target\n }\n }\n }\n\n return Reflect.get(target, prop, receiver)\n },\n\n set(target, prop, value, receiver) {\n if (typeof prop === \"string\" && isRenderableConstructor(type)) {\n const prototype = type.prototype\n const descriptor =\n Object.getOwnPropertyDescriptor(prototype, prop) ||\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop)\n\n if (descriptor && descriptor.set) {\n target.__pendingCalls = target.__pendingCalls || []\n target.__pendingCalls.push({ method: prop, args: [value], isProperty: true })\n return true\n }\n }\n\n return Reflect.set(target, prop, value, receiver)\n },\n })\n }\n\n return vnode\n}\n\nexport function isVNode(node: any): node is VNode {\n return node && node[BrandedVNode]\n}\n\nexport function maybeMakeRenderable(\n ctx: RenderContext,\n node: Renderable | VNode<any, any[]> | unknown,\n): Renderable | null {\n if (isRenderable(node)) return node\n if (isVNode(node)) return instantiate(ctx, node)\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"maybeMakeRenderable received an invalid node\", util.inspect(node, { depth: 2 }))\n }\n return null\n}\n\nexport function wrapWithDelegates<T extends InstanceType<RenderableConstructor>>(\n instance: T,\n delegateMap: Record<string, string> | undefined,\n): T {\n if (!delegateMap || Object.keys(delegateMap).length === 0) return instance\n\n const descendantCache = new Map<string, Renderable | undefined>()\n\n const getDescendant = (id: string): Renderable | undefined => {\n if (descendantCache.has(id)) {\n const cached = descendantCache.get(id)\n if (cached !== undefined) {\n return cached\n }\n }\n const descendant = (instance as Renderable).findDescendantById(id)\n if (descendant) {\n descendantCache.set(id, descendant)\n }\n return descendant\n }\n\n const proxy = new Proxy(instance as any, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\" && delegateMap[prop]) {\n const host = getDescendant(delegateMap[prop])\n if (host) {\n const value = (host as any)[prop]\n if (typeof value === \"function\") {\n return value.bind(host)\n }\n return value\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value, receiver) {\n if (typeof prop === \"string\" && delegateMap[prop]) {\n const host = getDescendant(delegateMap[prop])\n if (host) {\n return Reflect.set(host as any, prop, value)\n }\n }\n return Reflect.set(target, prop, value, receiver)\n },\n })\n return proxy\n}\n\nexport type InstantiateFn<NodeType extends VNode | Renderable> = Renderable & { __node?: NodeType }\n\nexport function instantiate<NodeType extends VNode | Renderable>(\n ctx: RenderContext,\n node: NodeType,\n): InstantiateFn<NodeType> {\n if (isRenderable(node)) return node\n\n if (!node || typeof node !== \"object\") {\n throw new TypeError(\"mount() received an invalid vnode\")\n }\n\n const vnode = node as VNode\n const { type, props } = vnode\n const children = flattenChildren(vnode.children || [])\n const delegateMap = (vnode as any).__delegateMap as Record<string, string> | undefined\n\n if (isRenderableConstructor(type)) {\n const instance = new type(ctx, (props || {}) as any)\n\n for (const child of children) {\n if (isRenderable(child)) {\n instance.add(child)\n } else {\n const mounted = instantiate(ctx, child as NodeType)\n instance.add(mounted)\n }\n }\n\n const delegatedInstance = wrapWithDelegates(instance, delegateMap)\n\n const pendingCalls = (vnode as any).__pendingCalls as PendingCall[] | undefined\n if (pendingCalls) {\n for (const call of pendingCalls) {\n if (call.isProperty) {\n ;(delegatedInstance as any)[call.method] = call.args[0]\n } else {\n ;(delegatedInstance as any)[call.method].apply(delegatedInstance, call.args)\n }\n }\n }\n\n return delegatedInstance\n }\n\n // Functional construct: resolve to a concrete vnode and mount it\n const resolved = (type as FunctionalConstruct)(props || ({} as any), children)\n const inst = instantiate(ctx, resolved)\n\n return wrapWithDelegates(inst, delegateMap) as InstantiateFn<NodeType>\n}\n\nexport type DelegateMap<T> = Partial<Record<keyof T, string>>\n\nexport type ValidateShape<Given, AllowedKeys> = {\n [K in keyof Given]: K extends keyof AllowedKeys ? NonNullable<Given[K]> : never\n}\n\ntype InferNode<T> = T extends InstantiateFn<infer U> ? U : never\n\nexport function delegate<\n Factory extends InstantiateFn<any>,\n InnerNode extends InferNode<Factory>,\n TargetMap extends Record<keyof InnerNode, string>,\n const Mapping extends Partial<TargetMap>,\n>(mapping: ValidateShape<Mapping, TargetMap>, vnode: Factory): Renderable\n\nexport function delegate<\n ConstructorType extends RenderableConstructor<any>,\n TargetMap extends Record<keyof InstanceType<ConstructorType>, string>,\n const Mapping extends Partial<TargetMap>,\n>(mapping: ValidateShape<Mapping, TargetMap>, vnode: ProxiedVNode<ConstructorType>): ProxiedVNode<ConstructorType>\n\nexport function delegate<\n ConstructorType extends RenderableConstructor<any>,\n const Mapping extends DelegateMap<InstanceType<ConstructorType>>,\n>(mapping: ValidateShape<Mapping, string>, vnode: VNode & { type: ConstructorType }): VNode\n\n/**\n * Controlled delegation that routes selected properties/methods\n * to a descendant renderable identified by ID.\n */\nexport function delegate<NodeType extends VNode | Renderable | InstantiateFn<any>>(\n mapping: Record<string, string>,\n vnode: NodeType,\n): VNode | Renderable {\n if (isRenderable(vnode)) {\n return wrapWithDelegates(vnode, mapping)\n }\n if (!vnode || typeof vnode !== \"object\") return vnode\n vnode.__delegateMap = { ...(vnode.__delegateMap || {}), ...mapping }\n return vnode\n}\n",
|
|
52
|
+
"import { RGBA } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type LineInfo, type RenderLib } from \"./zig.js\"\nimport { type Pointer } from \"bun:ffi\"\nimport type { TextBuffer } from \"./text-buffer.js\"\n\nexport class TextBufferView {\n private lib: RenderLib\n private viewPtr: Pointer\n private textBuffer: TextBuffer\n private _destroyed: boolean = false\n\n constructor(lib: RenderLib, ptr: Pointer, textBuffer: TextBuffer) {\n this.lib = lib\n this.viewPtr = ptr\n this.textBuffer = textBuffer\n }\n\n static create(textBuffer: TextBuffer): TextBufferView {\n const lib = resolveRenderLib()\n const viewPtr = lib.createTextBufferView(textBuffer.ptr)\n return new TextBufferView(lib, viewPtr, textBuffer)\n }\n\n // Fail loud and clear\n private guard(): void {\n if (this._destroyed) throw new Error(\"TextBufferView is destroyed\")\n }\n\n public get ptr(): Pointer {\n this.guard()\n return this.viewPtr\n }\n\n public setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.textBufferViewSetSelection(this.viewPtr, start, end, bgColor || null, fgColor || null)\n }\n\n public updateSelection(end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.textBufferViewUpdateSelection(this.viewPtr, end, bgColor || null, fgColor || null)\n }\n\n public resetSelection(): void {\n this.guard()\n this.lib.textBufferViewResetSelection(this.viewPtr)\n }\n\n public getSelection(): { start: number; end: number } | null {\n this.guard()\n return this.lib.textBufferViewGetSelection(this.viewPtr)\n }\n\n public hasSelection(): boolean {\n this.guard()\n return this.getSelection() !== null\n }\n\n public setLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n ): boolean {\n this.guard()\n return this.lib.textBufferViewSetLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n )\n }\n\n public updateLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n ): boolean {\n this.guard()\n return this.lib.textBufferViewUpdateLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n )\n }\n\n public resetLocalSelection(): void {\n this.guard()\n this.lib.textBufferViewResetLocalSelection(this.viewPtr)\n }\n\n public setWrapWidth(width: number | null): void {\n this.guard()\n this.lib.textBufferViewSetWrapWidth(this.viewPtr, width ?? 0)\n }\n\n public setWrapMode(mode: \"none\" | \"char\" | \"word\"): void {\n this.guard()\n this.lib.textBufferViewSetWrapMode(this.viewPtr, mode)\n }\n\n public setFirstLineOffset(offset: number): void {\n this.guard()\n this.lib.textBufferViewSetFirstLineOffset(this.viewPtr, offset)\n }\n\n public setViewportSize(width: number, height: number): void {\n this.guard()\n this.lib.textBufferViewSetViewportSize(this.viewPtr, width, height)\n }\n\n public setViewport(x: number, y: number, width: number, height: number): void {\n this.guard()\n this.lib.textBufferViewSetViewport(this.viewPtr, x, y, width, height)\n }\n\n public get lineInfo(): LineInfo {\n this.guard()\n return this.lib.textBufferViewGetLineInfo(this.viewPtr)\n }\n\n public get logicalLineInfo(): LineInfo {\n this.guard()\n return this.lib.textBufferViewGetLogicalLineInfo(this.viewPtr)\n }\n\n public getSelectedText(): string {\n this.guard()\n const byteSize = this.textBuffer.byteSize\n if (byteSize === 0) return \"\"\n\n const selectedBytes = this.lib.textBufferViewGetSelectedTextBytes(this.viewPtr, byteSize)\n\n if (!selectedBytes) return \"\"\n\n return this.lib.decoder.decode(selectedBytes)\n }\n\n public getPlainText(): string {\n this.guard()\n const byteSize = this.textBuffer.byteSize\n if (byteSize === 0) return \"\"\n\n const plainBytes = this.lib.textBufferViewGetPlainTextBytes(this.viewPtr, byteSize)\n\n if (!plainBytes) return \"\"\n\n return this.lib.decoder.decode(plainBytes)\n }\n\n public setTabIndicator(indicator: string | number): void {\n this.guard()\n const codePoint = typeof indicator === \"string\" ? (indicator.codePointAt(0) ?? 0) : indicator\n this.lib.textBufferViewSetTabIndicator(this.viewPtr, codePoint)\n }\n\n public setTabIndicatorColor(color: RGBA): void {\n this.guard()\n this.lib.textBufferViewSetTabIndicatorColor(this.viewPtr, color)\n }\n\n public setTruncate(truncate: boolean): void {\n this.guard()\n this.lib.textBufferViewSetTruncate(this.viewPtr, truncate)\n }\n\n public measureForDimensions(width: number, height: number): { lineCount: number; widthColsMax: number } | null {\n this.guard()\n return this.lib.textBufferViewMeasureForDimensions(this.viewPtr, width, height)\n }\n\n public getVirtualLineCount(): number {\n this.guard()\n return this.lib.textBufferViewGetVirtualLineCount(this.viewPtr)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.lib.destroyTextBufferView(this.viewPtr)\n }\n}\n",
|
|
53
|
+
"import { resolveRenderLib, type LogicalCursor, type RenderLib } from \"./zig.js\"\nimport { type Pointer } from \"bun:ffi\"\nimport { type WidthMethod, type Highlight } from \"./types.js\"\nimport { RGBA } from \"./lib/RGBA.js\"\nimport { EventEmitter } from \"events\"\nimport type { SyntaxStyle } from \"./syntax-style.js\"\n\nexport type { LogicalCursor }\n\n/**\n * EditBuffer provides a text editing buffer with cursor management,\n * incremental editing, and grapheme-aware operations.\n */\nexport class EditBuffer extends EventEmitter {\n private static registry = new Map<number, EditBuffer>()\n private static nativeEventsSubscribed = false\n\n private lib: RenderLib\n private bufferPtr: Pointer\n private textBufferPtr: Pointer\n public readonly id: number\n private _destroyed: boolean = false\n private _textBytes: Uint8Array[] = []\n private _singleTextBytes: Uint8Array | null = null\n private _singleTextMemId: number | null = null\n private _syntaxStyle?: SyntaxStyle\n\n constructor(lib: RenderLib, ptr: Pointer) {\n super()\n this.lib = lib\n this.bufferPtr = ptr\n this.textBufferPtr = lib.editBufferGetTextBuffer(ptr)\n this.id = lib.editBufferGetId(ptr)\n\n EditBuffer.registry.set(this.id, this)\n EditBuffer.subscribeToNativeEvents(lib)\n }\n\n static create(widthMethod: WidthMethod): EditBuffer {\n const lib = resolveRenderLib()\n const ptr = lib.createEditBuffer(widthMethod)\n return new EditBuffer(lib, ptr)\n }\n\n private static subscribeToNativeEvents(lib: RenderLib): void {\n if (EditBuffer.nativeEventsSubscribed) return\n EditBuffer.nativeEventsSubscribed = true\n\n lib.onAnyNativeEvent((name: string, data: ArrayBuffer) => {\n const buffer = new Uint16Array(data)\n\n if (name.startsWith(\"eb_\") && buffer.length >= 1) {\n const id = buffer[0]\n const instance = EditBuffer.registry.get(id)\n\n if (instance) {\n // Strip the \"eb_\" prefix and forward the event\n const eventName = name.slice(3)\n const eventData = data.slice(2)\n instance.emit(eventName, eventData)\n }\n }\n })\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"EditBuffer is destroyed\")\n }\n\n public get ptr(): Pointer {\n this.guard()\n return this.bufferPtr\n }\n\n /**\n * Set text and completely reset the buffer state (clears history, resets add_buffer).\n * Use this for initial text setting or when you want a clean slate.\n */\n public setText(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n\n if (this._singleTextMemId !== null) {\n this.lib.textBufferReplaceMemBuffer(this.textBufferPtr, this._singleTextMemId, textBytes, false)\n } else {\n this._singleTextMemId = this.lib.textBufferRegisterMemBuffer(this.textBufferPtr, textBytes, false)\n }\n this._singleTextBytes = textBytes\n this.lib.editBufferSetTextFromMem(this.bufferPtr, this._singleTextMemId)\n }\n\n /**\n * Set text using owned memory and completely reset the buffer state (clears history, resets add_buffer).\n * The native code takes ownership of the memory.\n */\n public setTextOwned(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this.lib.editBufferSetText(this.bufferPtr, textBytes)\n }\n\n /**\n * Replace text while preserving undo history (creates an undo point).\n * Use this when you want the setText operation to be undoable.\n */\n public replaceText(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this._textBytes.push(textBytes)\n const memId = this.lib.textBufferRegisterMemBuffer(this.textBufferPtr, textBytes, false)\n this.lib.editBufferReplaceTextFromMem(this.bufferPtr, memId)\n }\n\n /**\n * Replace text using owned memory while preserving undo history (creates an undo point).\n * The native code takes ownership of the memory.\n */\n public replaceTextOwned(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this.lib.editBufferReplaceText(this.bufferPtr, textBytes)\n }\n\n public getLineCount(): number {\n this.guard()\n return this.lib.textBufferGetLineCount(this.textBufferPtr)\n }\n\n public getText(): string {\n this.guard()\n // TODO: Use byte size of text buffer to get the actual size of the text\n // actually native can stack alloc all the text and decode will alloc as js string then\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetText(this.bufferPtr, maxSize)\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public insertChar(char: string): void {\n this.guard()\n this.lib.editBufferInsertChar(this.bufferPtr, char)\n }\n\n public insertText(text: string): void {\n this.guard()\n this.lib.editBufferInsertText(this.bufferPtr, text)\n }\n\n public deleteChar(): void {\n this.guard()\n this.lib.editBufferDeleteChar(this.bufferPtr)\n }\n\n public deleteCharBackward(): void {\n this.guard()\n this.lib.editBufferDeleteCharBackward(this.bufferPtr)\n }\n\n public deleteRange(startLine: number, startCol: number, endLine: number, endCol: number): void {\n this.guard()\n this.lib.editBufferDeleteRange(this.bufferPtr, startLine, startCol, endLine, endCol)\n }\n\n public newLine(): void {\n this.guard()\n this.lib.editBufferNewLine(this.bufferPtr)\n }\n\n public deleteLine(): void {\n this.guard()\n this.lib.editBufferDeleteLine(this.bufferPtr)\n }\n\n public moveCursorLeft(): void {\n this.guard()\n this.lib.editBufferMoveCursorLeft(this.bufferPtr)\n }\n\n public moveCursorRight(): void {\n this.guard()\n this.lib.editBufferMoveCursorRight(this.bufferPtr)\n }\n\n public moveCursorUp(): void {\n this.guard()\n this.lib.editBufferMoveCursorUp(this.bufferPtr)\n }\n\n public moveCursorDown(): void {\n this.guard()\n this.lib.editBufferMoveCursorDown(this.bufferPtr)\n }\n\n public gotoLine(line: number): void {\n this.guard()\n this.lib.editBufferGotoLine(this.bufferPtr, line)\n }\n\n public setCursor(line: number, col: number): void {\n this.guard()\n this.lib.editBufferSetCursor(this.bufferPtr, line, col)\n }\n\n public setCursorToLineCol(line: number, col: number): void {\n this.guard()\n this.lib.editBufferSetCursorToLineCol(this.bufferPtr, line, col)\n }\n\n public setCursorByOffset(offset: number): void {\n this.guard()\n this.lib.editBufferSetCursorByOffset(this.bufferPtr, offset)\n }\n\n public getCursorPosition(): LogicalCursor {\n this.guard()\n return this.lib.editBufferGetCursorPosition(this.bufferPtr)\n }\n\n public getNextWordBoundary(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetNextWordBoundary(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public getPrevWordBoundary(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetPrevWordBoundary(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public getEOL(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetEOL(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public offsetToPosition(offset: number): { row: number; col: number } | null {\n this.guard()\n const result = this.lib.editBufferOffsetToPosition(this.bufferPtr, offset)\n if (!result) return null\n return { row: result.row, col: result.col }\n }\n\n public positionToOffset(row: number, col: number): number {\n this.guard()\n return this.lib.editBufferPositionToOffset(this.bufferPtr, row, col)\n }\n\n public getLineStartOffset(row: number): number {\n this.guard()\n return this.lib.editBufferGetLineStartOffset(this.bufferPtr, row)\n }\n\n public getTextRange(startOffset: number, endOffset: number): string {\n this.guard()\n if (startOffset >= endOffset) return \"\"\n\n // TODO: Use actual expected size of the text\n // like other methods native can just return a pointer and size\n // and we immediately decode the text into a js string then the native stack\n // can go out of scope\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetTextRange(this.bufferPtr, startOffset, endOffset, maxSize)\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public getTextRangeByCoords(startRow: number, startCol: number, endRow: number, endCol: number): string {\n this.guard()\n\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetTextRangeByCoords(\n this.bufferPtr,\n startRow,\n startCol,\n endRow,\n endCol,\n maxSize,\n )\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public debugLogRope(): void {\n this.guard()\n this.lib.editBufferDebugLogRope(this.bufferPtr)\n }\n\n public undo(): string | null {\n this.guard()\n const maxSize = 256\n const metaBytes = this.lib.editBufferUndo(this.bufferPtr, maxSize)\n if (!metaBytes) return null\n return this.lib.decoder.decode(metaBytes)\n }\n\n public redo(): string | null {\n this.guard()\n const maxSize = 256\n const metaBytes = this.lib.editBufferRedo(this.bufferPtr, maxSize)\n if (!metaBytes) return null\n return this.lib.decoder.decode(metaBytes)\n }\n\n public canUndo(): boolean {\n this.guard()\n return this.lib.editBufferCanUndo(this.bufferPtr)\n }\n\n public canRedo(): boolean {\n this.guard()\n return this.lib.editBufferCanRedo(this.bufferPtr)\n }\n\n public clearHistory(): void {\n this.guard()\n this.lib.editBufferClearHistory(this.bufferPtr)\n }\n\n public setDefaultFg(fg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultFg(this.textBufferPtr, fg)\n }\n\n public setDefaultBg(bg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultBg(this.textBufferPtr, bg)\n }\n\n public setDefaultAttributes(attributes: number | null): void {\n this.guard()\n this.lib.textBufferSetDefaultAttributes(this.textBufferPtr, attributes)\n }\n\n public resetDefaults(): void {\n this.guard()\n this.lib.textBufferResetDefaults(this.textBufferPtr)\n }\n\n public setSyntaxStyle(style: SyntaxStyle | null): void {\n this.guard()\n this._syntaxStyle = style ?? undefined\n this.lib.textBufferSetSyntaxStyle(this.textBufferPtr, style?.ptr ?? null)\n }\n\n public getSyntaxStyle(): SyntaxStyle | null {\n this.guard()\n return this._syntaxStyle ?? null\n }\n\n public addHighlight(lineIdx: number, highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlight(this.textBufferPtr, lineIdx, highlight)\n }\n\n public addHighlightByCharRange(highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlightByCharRange(this.textBufferPtr, highlight)\n }\n\n public removeHighlightsByRef(hlRef: number): void {\n this.guard()\n this.lib.textBufferRemoveHighlightsByRef(this.textBufferPtr, hlRef)\n }\n\n public clearLineHighlights(lineIdx: number): void {\n this.guard()\n this.lib.textBufferClearLineHighlights(this.textBufferPtr, lineIdx)\n }\n\n public clearAllHighlights(): void {\n this.guard()\n this.lib.textBufferClearAllHighlights(this.textBufferPtr)\n }\n\n public getLineHighlights(lineIdx: number): Array<Highlight> {\n this.guard()\n return this.lib.textBufferGetLineHighlights(this.textBufferPtr, lineIdx)\n }\n\n public clear(): void {\n this.guard()\n this.lib.editBufferClear(this.bufferPtr)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n\n this._destroyed = true\n EditBuffer.registry.delete(this.id)\n this.lib.destroyEditBuffer(this.bufferPtr)\n }\n}\n",
|
|
54
|
+
"import { RGBA } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type RenderLib, type VisualCursor, type LineInfo } from \"./zig.js\"\nimport { type Pointer } from \"bun:ffi\"\nimport type { EditBuffer } from \"./edit-buffer.js\"\nimport { createExtmarksController } from \"./lib/index.js\"\n\nexport interface Viewport {\n offsetY: number\n offsetX: number\n height: number\n width: number\n}\n\nexport type { VisualCursor }\n\nexport class EditorView {\n private lib: RenderLib\n private viewPtr: Pointer\n private editBuffer: EditBuffer\n private _destroyed: boolean = false\n private _extmarksController?: any\n private _textBufferViewPtr?: Pointer\n\n constructor(lib: RenderLib, ptr: Pointer, editBuffer: EditBuffer) {\n this.lib = lib\n this.viewPtr = ptr\n this.editBuffer = editBuffer\n }\n\n static create(editBuffer: EditBuffer, viewportWidth: number, viewportHeight: number): EditorView {\n const lib = resolveRenderLib()\n const viewPtr = lib.createEditorView(editBuffer.ptr, viewportWidth, viewportHeight)\n return new EditorView(lib, viewPtr, editBuffer)\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"EditorView is destroyed\")\n }\n\n public get ptr(): Pointer {\n this.guard()\n return this.viewPtr\n }\n\n public setViewportSize(width: number, height: number): void {\n this.guard()\n this.lib.editorViewSetViewportSize(this.viewPtr, width, height)\n }\n\n public setViewport(x: number, y: number, width: number, height: number, moveCursor: boolean = true): void {\n this.guard()\n this.lib.editorViewSetViewport(this.viewPtr, x, y, width, height, moveCursor)\n }\n\n public getViewport(): Viewport {\n this.guard()\n return this.lib.editorViewGetViewport(this.viewPtr)\n }\n\n public setScrollMargin(margin: number): void {\n this.guard()\n this.lib.editorViewSetScrollMargin(this.viewPtr, margin)\n }\n\n public setWrapMode(mode: \"none\" | \"char\" | \"word\"): void {\n this.guard()\n this.lib.editorViewSetWrapMode(this.viewPtr, mode)\n }\n\n public getVirtualLineCount(): number {\n this.guard()\n return this.lib.editorViewGetVirtualLineCount(this.viewPtr)\n }\n\n public getTotalVirtualLineCount(): number {\n this.guard()\n return this.lib.editorViewGetTotalVirtualLineCount(this.viewPtr)\n }\n\n public setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.editorViewSetSelection(this.viewPtr, start, end, bgColor || null, fgColor || null)\n }\n\n public updateSelection(end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.editorViewUpdateSelection(this.viewPtr, end, bgColor || null, fgColor || null)\n }\n\n public resetSelection(): void {\n this.guard()\n this.lib.editorViewResetSelection(this.viewPtr)\n }\n\n public getSelection(): { start: number; end: number } | null {\n this.guard()\n return this.lib.editorViewGetSelection(this.viewPtr)\n }\n\n public hasSelection(): boolean {\n this.guard()\n return this.getSelection() !== null\n }\n\n public setLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n updateCursor?: boolean,\n followCursor?: boolean,\n ): boolean {\n this.guard()\n return this.lib.editorViewSetLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n updateCursor ?? false,\n followCursor ?? false,\n )\n }\n\n public updateLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n updateCursor?: boolean,\n followCursor?: boolean,\n ): boolean {\n this.guard()\n return this.lib.editorViewUpdateLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n updateCursor ?? false,\n followCursor ?? false,\n )\n }\n\n public resetLocalSelection(): void {\n this.guard()\n this.lib.editorViewResetLocalSelection(this.viewPtr)\n }\n\n public getSelectedText(): string {\n this.guard()\n // TODO: native can stack alloc all the text and decode will alloc as js string then\n const maxLength = 1024 * 1024 // 1MB should be enough for most selections\n const selectedBytes = this.lib.editorViewGetSelectedTextBytes(this.viewPtr, maxLength)\n\n if (!selectedBytes) return \"\"\n\n return this.lib.decoder.decode(selectedBytes)\n }\n\n public getCursor(): { row: number; col: number } {\n this.guard()\n return this.lib.editorViewGetCursor(this.viewPtr)\n }\n\n public getText(): string {\n this.guard()\n const maxLength = 1024 * 1024 // 1MB buffer\n const textBytes = this.lib.editorViewGetText(this.viewPtr, maxLength)\n if (!textBytes) return \"\"\n return this.lib.decoder.decode(textBytes)\n }\n\n public getVisualCursor(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualCursor(this.viewPtr)\n }\n\n public moveUpVisual(): void {\n this.guard()\n this.lib.editorViewMoveUpVisual(this.viewPtr)\n }\n\n public moveDownVisual(): void {\n this.guard()\n this.lib.editorViewMoveDownVisual(this.viewPtr)\n }\n\n public deleteSelectedText(): void {\n this.guard()\n this.lib.editorViewDeleteSelectedText(this.viewPtr)\n }\n\n public setCursorByOffset(offset: number): void {\n this.guard()\n this.lib.editorViewSetCursorByOffset(this.viewPtr, offset)\n }\n\n public getNextWordBoundary(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetNextWordBoundary(this.viewPtr)\n }\n\n public getPrevWordBoundary(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetPrevWordBoundary(this.viewPtr)\n }\n\n public getEOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetEOL(this.viewPtr)\n }\n\n public getVisualSOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualSOL(this.viewPtr)\n }\n\n public getVisualEOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualEOL(this.viewPtr)\n }\n\n public getLineInfo(): LineInfo {\n this.guard()\n return this.lib.editorViewGetLineInfo(this.viewPtr)\n }\n\n public getLogicalLineInfo(): LineInfo {\n this.guard()\n return this.lib.editorViewGetLogicalLineInfo(this.viewPtr)\n }\n\n public get extmarks(): any {\n if (!this._extmarksController) {\n this._extmarksController = createExtmarksController(this.editBuffer, this)\n }\n return this._extmarksController\n }\n\n public setPlaceholderStyledText(chunks: { text: string; fg?: RGBA; bg?: RGBA; attributes?: number }[]): void {\n this.guard()\n this.lib.editorViewSetPlaceholderStyledText(this.viewPtr, chunks)\n }\n\n public setTabIndicator(indicator: string | number): void {\n this.guard()\n const codePoint = typeof indicator === \"string\" ? (indicator.codePointAt(0) ?? 0) : indicator\n this.lib.editorViewSetTabIndicator(this.viewPtr, codePoint)\n }\n\n public setTabIndicatorColor(color: RGBA): void {\n this.guard()\n this.lib.editorViewSetTabIndicatorColor(this.viewPtr, color)\n }\n\n public measureForDimensions(width: number, height: number): { lineCount: number; widthColsMax: number } | null {\n this.guard()\n if (!this._textBufferViewPtr) {\n this._textBufferViewPtr = this.lib.editorViewGetTextBufferView(this.viewPtr)\n }\n return this.lib.textBufferViewMeasureForDimensions(this._textBufferViewPtr, width, height)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n\n if (this._extmarksController) {\n this._extmarksController.destroy()\n this._extmarksController = undefined\n }\n\n this._destroyed = true\n this.lib.destroyEditorView(this.viewPtr)\n }\n}\n",
|
|
55
|
+
"import { RGBA, parseColor, type ColorInput } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type RenderLib } from \"./zig.js\"\nimport { type Pointer } from \"bun:ffi\"\nimport { createTextAttributes } from \"./utils.js\"\n\nexport interface StyleDefinition {\n fg?: RGBA\n bg?: RGBA\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n}\n\nexport interface MergedStyle {\n fg?: RGBA\n bg?: RGBA\n attributes: number\n}\n\nexport interface ThemeTokenStyle {\n scope: string[]\n style: {\n foreground?: ColorInput\n background?: ColorInput\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n }\n}\n\nexport function convertThemeToStyles(theme: ThemeTokenStyle[]): Record<string, StyleDefinition> {\n const flatStyles: Record<string, StyleDefinition> = {}\n\n for (const tokenStyle of theme) {\n const styleDefinition: StyleDefinition = {}\n\n if (tokenStyle.style.foreground) {\n styleDefinition.fg = parseColor(tokenStyle.style.foreground)\n }\n if (tokenStyle.style.background) {\n styleDefinition.bg = parseColor(tokenStyle.style.background)\n }\n\n if (tokenStyle.style.bold !== undefined) {\n styleDefinition.bold = tokenStyle.style.bold\n }\n if (tokenStyle.style.italic !== undefined) {\n styleDefinition.italic = tokenStyle.style.italic\n }\n if (tokenStyle.style.underline !== undefined) {\n styleDefinition.underline = tokenStyle.style.underline\n }\n if (tokenStyle.style.dim !== undefined) {\n styleDefinition.dim = tokenStyle.style.dim\n }\n\n // Apply the same style to all scopes\n for (const scope of tokenStyle.scope) {\n flatStyles[scope] = styleDefinition\n }\n }\n\n return flatStyles\n}\n\nexport class SyntaxStyle {\n private lib: RenderLib\n private stylePtr: Pointer\n private _destroyed: boolean = false\n private nameCache: Map<string, number> = new Map()\n private styleDefs: Map<string, StyleDefinition> = new Map()\n private mergedCache: Map<string, MergedStyle> = new Map()\n\n constructor(lib: RenderLib, ptr: Pointer) {\n this.lib = lib\n this.stylePtr = ptr\n }\n\n static create(): SyntaxStyle {\n const lib = resolveRenderLib()\n const ptr = lib.createSyntaxStyle()\n return new SyntaxStyle(lib, ptr)\n }\n\n static fromTheme(theme: ThemeTokenStyle[]): SyntaxStyle {\n const style = SyntaxStyle.create()\n const flatStyles = convertThemeToStyles(theme)\n\n for (const [name, styleDef] of Object.entries(flatStyles)) {\n style.registerStyle(name, styleDef)\n }\n\n return style\n }\n\n static fromStyles(styles: Record<string, StyleDefinition>): SyntaxStyle {\n const style = SyntaxStyle.create()\n\n for (const [name, styleDef] of Object.entries(styles)) {\n style.registerStyle(name, styleDef)\n }\n\n return style\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"NativeSyntaxStyle is destroyed\")\n }\n\n public registerStyle(name: string, style: StyleDefinition): number {\n this.guard()\n\n const attributes = createTextAttributes({\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n dim: style.dim,\n })\n\n const id = this.lib.syntaxStyleRegister(this.stylePtr, name, style.fg || null, style.bg || null, attributes)\n\n this.nameCache.set(name, id)\n this.styleDefs.set(name, style)\n\n return id\n }\n\n public resolveStyleId(name: string): number | null {\n this.guard()\n\n // Check cache first\n const cached = this.nameCache.get(name)\n if (cached !== undefined) return cached\n\n const id = this.lib.syntaxStyleResolveByName(this.stylePtr, name)\n\n if (id !== null) {\n this.nameCache.set(name, id)\n }\n\n return id\n }\n\n public getStyleId(name: string): number | null {\n this.guard()\n\n const id = this.resolveStyleId(name)\n if (id !== null) return id\n\n // Try base name if it's a scoped style\n if (name.includes(\".\")) {\n const baseName = name.split(\".\")[0]\n return this.resolveStyleId(baseName)\n }\n\n return null\n }\n\n public get ptr(): Pointer {\n this.guard()\n return this.stylePtr\n }\n\n public getStyleCount(): number {\n this.guard()\n return this.lib.syntaxStyleGetStyleCount(this.stylePtr)\n }\n\n public clearNameCache(): void {\n this.nameCache.clear()\n }\n\n public getStyle(name: string): StyleDefinition | undefined {\n this.guard()\n\n const style = this.styleDefs.get(name)\n if (style) return style\n\n if (name.includes(\".\")) {\n const baseName = name.split(\".\")[0]\n return this.styleDefs.get(baseName)\n }\n\n return undefined\n }\n\n public mergeStyles(...styleNames: string[]): MergedStyle {\n this.guard()\n\n const cacheKey = styleNames.join(\":\")\n const cached = this.mergedCache.get(cacheKey)\n if (cached) return cached\n\n const styleDefinition: StyleDefinition = {}\n\n for (const name of styleNames) {\n const style = this.getStyle(name)\n\n if (!style) continue\n\n if (style.fg) styleDefinition.fg = style.fg\n if (style.bg) styleDefinition.bg = style.bg\n if (style.bold !== undefined) styleDefinition.bold = style.bold\n if (style.italic !== undefined) styleDefinition.italic = style.italic\n if (style.underline !== undefined) styleDefinition.underline = style.underline\n if (style.dim !== undefined) styleDefinition.dim = style.dim\n }\n\n const attributes = createTextAttributes({\n bold: styleDefinition.bold,\n italic: styleDefinition.italic,\n underline: styleDefinition.underline,\n dim: styleDefinition.dim,\n })\n\n const merged: MergedStyle = {\n fg: styleDefinition.fg,\n bg: styleDefinition.bg,\n attributes,\n }\n\n this.mergedCache.set(cacheKey, merged)\n\n return merged\n }\n\n public clearCache(): void {\n this.guard()\n this.mergedCache.clear()\n }\n\n public getCacheSize(): number {\n this.guard()\n return this.mergedCache.size\n }\n\n public getAllStyles(): Map<string, StyleDefinition> {\n this.guard()\n return new Map(this.styleDefs)\n }\n\n public getRegisteredNames(): string[] {\n this.guard()\n return Array.from(this.styleDefs.keys())\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.nameCache.clear()\n this.styleDefs.clear()\n this.mergedCache.clear()\n this.lib.destroySyntaxStyle(this.stylePtr)\n }\n}\n",
|
|
56
|
+
"import { Edge, Gutter } from \"yoga-layout\"\nimport { type RenderableOptions, Renderable } from \"../Renderable.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport {\n type BorderCharacters,\n type BorderSides,\n type BorderSidesConfig,\n type BorderStyle,\n borderCharsToArray,\n getBorderSides,\n parseBorderStyle,\n} from \"../lib/index.js\"\nimport { type ColorInput, RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { isValidPercentage } from \"../lib/renderable.validations.js\"\nimport type { RenderContext } from \"../types.js\"\n\nexport interface BoxOptions<TRenderable extends Renderable = BoxRenderable> extends RenderableOptions<TRenderable> {\n backgroundColor?: string | RGBA\n borderStyle?: BorderStyle\n border?: boolean | BorderSides[]\n borderColor?: string | RGBA\n customBorderChars?: BorderCharacters\n shouldFill?: boolean\n title?: string\n titleAlignment?: \"left\" | \"center\" | \"right\"\n bottomTitle?: string\n bottomTitleAlignment?: \"left\" | \"center\" | \"right\"\n focusedBorderColor?: ColorInput\n focusable?: boolean\n gap?: number | `${number}%`\n rowGap?: number | `${number}%`\n columnGap?: number | `${number}%`\n}\n\nfunction isGapType(value: any): value is number | undefined {\n if (value === undefined) {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport class BoxRenderable extends Renderable {\n protected _backgroundColor: RGBA\n protected _border: boolean | BorderSides[]\n protected _borderStyle: BorderStyle\n protected _borderColor: RGBA\n protected _focusedBorderColor: RGBA\n private _customBorderCharsObj: BorderCharacters | undefined\n protected _customBorderChars?: Uint32Array\n protected borderSides: BorderSidesConfig\n public shouldFill: boolean\n protected _title?: string\n protected _titleAlignment: \"left\" | \"center\" | \"right\"\n protected _bottomTitle?: string\n protected _bottomTitleAlignment: \"left\" | \"center\" | \"right\"\n\n protected _defaultOptions = {\n backgroundColor: \"transparent\",\n borderStyle: \"single\",\n border: false,\n borderColor: \"#FFFFFF\",\n shouldFill: true,\n titleAlignment: \"left\",\n bottomTitleAlignment: \"left\",\n focusedBorderColor: \"#00AAFF\",\n } satisfies Partial<BoxOptions>\n\n constructor(ctx: RenderContext, options: BoxOptions) {\n super(ctx, options)\n\n if (options.focusable === true) {\n this._focusable = true\n }\n\n this._backgroundColor = parseColor(options.backgroundColor || this._defaultOptions.backgroundColor)\n this._border = options.border ?? this._defaultOptions.border\n if (\n !options.border &&\n (options.borderStyle || options.borderColor || options.focusedBorderColor || options.customBorderChars)\n ) {\n this._border = true\n }\n this._borderStyle = parseBorderStyle(options.borderStyle, this._defaultOptions.borderStyle)\n this._borderColor = parseColor(options.borderColor || this._defaultOptions.borderColor)\n this._focusedBorderColor = parseColor(options.focusedBorderColor || this._defaultOptions.focusedBorderColor)\n this._customBorderCharsObj = options.customBorderChars\n this._customBorderChars = this._customBorderCharsObj ? borderCharsToArray(this._customBorderCharsObj) : undefined\n this.borderSides = getBorderSides(this._border)\n this.shouldFill = options.shouldFill ?? this._defaultOptions.shouldFill\n this._title = options.title\n this._titleAlignment = options.titleAlignment || this._defaultOptions.titleAlignment\n this._bottomTitle = options.bottomTitle\n this._bottomTitleAlignment = options.bottomTitleAlignment || this._defaultOptions.bottomTitleAlignment\n\n this.applyYogaBorders()\n\n const hasInitialGapProps =\n options.gap !== undefined || options.rowGap !== undefined || options.columnGap !== undefined\n if (hasInitialGapProps) {\n this.applyYogaGap(options)\n }\n }\n\n private initializeBorder(): void {\n // https://github.com/anomalyco/opentui/issues/186\n // Solid-js reconciler does not pass props to constructor on init,\n // so we need to initialize the border when supporting properties are set.\n // borderStyle, borderColor, focusedBorderColor\n if (this._border === false) {\n this._border = true\n this.borderSides = getBorderSides(this._border)\n this.applyYogaBorders()\n }\n }\n\n public get customBorderChars(): BorderCharacters | undefined {\n return this._customBorderCharsObj\n }\n\n public set customBorderChars(value: BorderCharacters | undefined) {\n this._customBorderCharsObj = value\n this._customBorderChars = value ? borderCharsToArray(value) : undefined\n this.requestRender()\n }\n\n public get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n public set backgroundColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.backgroundColor)\n if (this._backgroundColor !== newColor) {\n this._backgroundColor = newColor\n this.requestRender()\n }\n }\n\n public get border(): boolean | BorderSides[] {\n return this._border\n }\n\n public set border(value: boolean | BorderSides[]) {\n if (this._border !== value) {\n this._border = value\n this.borderSides = getBorderSides(value)\n this.applyYogaBorders()\n this.requestRender()\n }\n }\n\n public get borderStyle(): BorderStyle {\n return this._borderStyle\n }\n\n public set borderStyle(value: BorderStyle) {\n const _value = parseBorderStyle(value, this._defaultOptions.borderStyle)\n if (this._borderStyle !== _value || !this._border) {\n this._borderStyle = _value\n this._customBorderChars = undefined\n this.initializeBorder()\n this.requestRender()\n }\n }\n\n public get borderColor(): RGBA {\n return this._borderColor\n }\n\n public set borderColor(value: RGBA | string) {\n const newColor = parseColor(value ?? this._defaultOptions.borderColor)\n if (this._borderColor !== newColor) {\n this._borderColor = newColor\n this.initializeBorder()\n this.requestRender()\n }\n }\n\n public get focusedBorderColor(): RGBA {\n return this._focusedBorderColor\n }\n\n public set focusedBorderColor(value: RGBA | string) {\n const newColor = parseColor(value ?? this._defaultOptions.focusedBorderColor)\n if (this._focusedBorderColor !== newColor) {\n this._focusedBorderColor = newColor\n this.initializeBorder()\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n public get title(): string | undefined {\n return this._title\n }\n\n public set title(value: string | undefined) {\n if (this._title !== value) {\n this._title = value\n this.requestRender()\n }\n }\n\n public get titleAlignment(): \"left\" | \"center\" | \"right\" {\n return this._titleAlignment\n }\n\n public set titleAlignment(value: \"left\" | \"center\" | \"right\") {\n if (this._titleAlignment !== value) {\n this._titleAlignment = value\n this.requestRender()\n }\n }\n\n public get bottomTitle(): string | undefined {\n return this._bottomTitle\n }\n\n public set bottomTitle(value: string | undefined) {\n if (this._bottomTitle !== value) {\n this._bottomTitle = value\n this.requestRender()\n }\n }\n\n public get bottomTitleAlignment(): \"left\" | \"center\" | \"right\" {\n return this._bottomTitleAlignment\n }\n\n public set bottomTitleAlignment(value: \"left\" | \"center\" | \"right\") {\n if (this._bottomTitleAlignment !== value) {\n this._bottomTitleAlignment = value\n this.requestRender()\n }\n }\n\n protected override renderSelf(buffer: OptimizedBuffer): void {\n const hasBorder = this.borderSides.top || this.borderSides.right || this.borderSides.bottom || this.borderSides.left\n const hasVisibleFill = this.shouldFill && this._backgroundColor.a > 0\n // Many boxes are used only for layout. Skip drawBox entirely when a box\n // would not draw pixels so wrapper nodes do not pay the FFI/native cost.\n if (!hasBorder && !hasVisibleFill) {\n return\n }\n\n const hasFocusWithin = this._focusable && (this._focused || this._hasFocusedDescendant)\n const currentBorderColor = hasFocusWithin ? this._focusedBorderColor : this._borderColor\n const screenX = this._screenX\n const screenY = this._screenY\n\n buffer.drawBox({\n x: screenX,\n y: screenY,\n width: this.width,\n height: this.height,\n borderStyle: this._borderStyle,\n customBorderChars: this._customBorderChars,\n border: this._border,\n borderColor: currentBorderColor,\n backgroundColor: this._backgroundColor,\n shouldFill: this.shouldFill,\n title: this._title,\n titleAlignment: this._titleAlignment,\n bottomTitle: this._bottomTitle,\n bottomTitleAlignment: this._bottomTitleAlignment,\n })\n }\n\n protected override getScissorRect(): { x: number; y: number; width: number; height: number } {\n const baseRect = super.getScissorRect()\n\n if (!this.borderSides.top && !this.borderSides.right && !this.borderSides.bottom && !this.borderSides.left) {\n return baseRect\n }\n\n const leftInset = this.borderSides.left ? 1 : 0\n const rightInset = this.borderSides.right ? 1 : 0\n const topInset = this.borderSides.top ? 1 : 0\n const bottomInset = this.borderSides.bottom ? 1 : 0\n\n return {\n x: baseRect.x + leftInset,\n y: baseRect.y + topInset,\n width: Math.max(0, baseRect.width - leftInset - rightInset),\n height: Math.max(0, baseRect.height - topInset - bottomInset),\n }\n }\n\n private applyYogaBorders(): void {\n const node = this.yogaNode\n node.setBorder(Edge.Left, this.borderSides.left ? 1 : 0)\n node.setBorder(Edge.Right, this.borderSides.right ? 1 : 0)\n node.setBorder(Edge.Top, this.borderSides.top ? 1 : 0)\n node.setBorder(Edge.Bottom, this.borderSides.bottom ? 1 : 0)\n this.requestRender()\n }\n\n private applyYogaGap(options: BoxOptions): void {\n const node = this.yogaNode\n\n if (isGapType(options.gap)) {\n node.setGap(Gutter.All, options.gap)\n }\n\n if (isGapType(options.rowGap)) {\n node.setGap(Gutter.Row, options.rowGap)\n }\n\n if (isGapType(options.columnGap)) {\n node.setGap(Gutter.Column, options.columnGap)\n }\n }\n\n public set gap(gap: number | `${number}%` | undefined) {\n if (isGapType(gap)) {\n this.yogaNode.setGap(Gutter.All, gap)\n this.requestRender()\n }\n }\n\n public set rowGap(rowGap: number | `${number}%` | undefined) {\n if (isGapType(rowGap)) {\n this.yogaNode.setGap(Gutter.Row, rowGap)\n this.requestRender()\n }\n }\n\n public set columnGap(columnGap: number | `${number}%` | undefined) {\n if (isGapType(columnGap)) {\n this.yogaNode.setGap(Gutter.Column, columnGap)\n this.requestRender()\n }\n }\n}\n",
|
|
57
|
+
"import { Renderable, type RenderableOptions } from \"../Renderable.js\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection.js\"\nimport { TextBuffer, type TextChunk } from \"../text-buffer.js\"\nimport { TextBufferView } from \"../text-buffer-view.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { type RenderContext, type LineInfoProvider } from \"../types.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport { MeasureMode } from \"yoga-layout\"\nimport type { LineInfo } from \"../zig.js\"\nimport { SyntaxStyle } from \"../syntax-style.js\"\n\nexport interface TextBufferOptions extends RenderableOptions<TextBufferRenderable> {\n fg?: string | RGBA\n bg?: string | RGBA\n selectionBg?: string | RGBA\n selectionFg?: string | RGBA\n selectable?: boolean\n attributes?: number\n wrapMode?: \"none\" | \"char\" | \"word\"\n tabIndicator?: string | number\n tabIndicatorColor?: string | RGBA\n truncate?: boolean\n}\n\nexport abstract class TextBufferRenderable extends Renderable implements LineInfoProvider {\n public override selectable: boolean = true\n\n protected _defaultFg: RGBA\n protected _defaultBg: RGBA\n protected _defaultAttributes: number\n protected _selectionBg: RGBA | undefined\n protected _selectionFg: RGBA | undefined\n protected _wrapMode: \"none\" | \"char\" | \"word\" = \"word\"\n protected lastLocalSelection: LocalSelectionBounds | null = null\n protected _tabIndicator?: string | number\n protected _tabIndicatorColor?: RGBA\n protected _scrollX: number = 0\n protected _scrollY: number = 0\n protected _truncate: boolean = false\n protected _firstLineOffset: number = 0\n\n protected textBuffer: TextBuffer\n protected textBufferView: TextBufferView\n protected _textBufferSyntaxStyle: SyntaxStyle\n\n protected _defaultOptions = {\n fg: RGBA.fromValues(1, 1, 1, 1),\n bg: RGBA.fromValues(0, 0, 0, 0),\n selectionBg: undefined,\n selectionFg: undefined,\n selectable: true,\n attributes: 0,\n wrapMode: \"word\" as \"none\" | \"char\" | \"word\",\n tabIndicator: undefined,\n tabIndicatorColor: undefined,\n truncate: false,\n } satisfies Partial<TextBufferOptions>\n\n constructor(ctx: RenderContext, options: TextBufferOptions) {\n super(ctx, options)\n\n this._defaultFg = parseColor(options.fg ?? this._defaultOptions.fg)\n this._defaultBg = parseColor(options.bg ?? this._defaultOptions.bg)\n this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : this._defaultOptions.selectionBg\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : this._defaultOptions.selectionFg\n this.selectable = options.selectable ?? this._defaultOptions.selectable\n this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode\n this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator\n this._tabIndicatorColor = options.tabIndicatorColor\n ? parseColor(options.tabIndicatorColor)\n : this._defaultOptions.tabIndicatorColor\n this._truncate = options.truncate ?? this._defaultOptions.truncate\n\n this.textBuffer = TextBuffer.create(this._ctx.widthMethod)\n this.textBufferView = TextBufferView.create(this.textBuffer)\n this._firstLineOffset = ctx.claimFirstLineOffset?.(this) ?? 0\n\n this._textBufferSyntaxStyle = SyntaxStyle.create()\n this.textBuffer.setSyntaxStyle(this._textBufferSyntaxStyle)\n\n this.textBufferView.setWrapMode(this._wrapMode)\n this.textBufferView.setFirstLineOffset(this._firstLineOffset)\n this.setupMeasureFunc()\n\n this.textBuffer.setDefaultFg(this._defaultFg)\n this.textBuffer.setDefaultBg(this._defaultBg)\n this.textBuffer.setDefaultAttributes(this._defaultAttributes)\n\n if (this._tabIndicator !== undefined) {\n this.textBufferView.setTabIndicator(this._tabIndicator)\n }\n if (this._tabIndicatorColor !== undefined) {\n this.textBufferView.setTabIndicatorColor(this._tabIndicatorColor)\n }\n\n if (this._wrapMode !== \"none\" && this.width > 0) {\n this.textBufferView.setWrapWidth(this.width)\n }\n\n if (this.width > 0 && this.height > 0) {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, this.width, this.height)\n }\n\n this.textBufferView.setTruncate(this._truncate)\n\n this.updateTextInfo()\n }\n\n protected override onMouseEvent(event: any): void {\n if (event.type === \"scroll\") {\n this.handleScroll(event)\n }\n }\n\n protected handleScroll(event: any): void {\n if (!event.scroll) return\n\n const { direction, delta } = event.scroll\n\n if (direction === \"up\") {\n this.scrollY -= delta\n } else if (direction === \"down\") {\n this.scrollY += delta\n }\n\n if (this._wrapMode === \"none\") {\n if (direction === \"left\") {\n this.scrollX -= delta\n } else if (direction === \"right\") {\n this.scrollX += delta\n }\n }\n }\n\n public get lineInfo(): LineInfo {\n return this.textBufferView.logicalLineInfo\n }\n\n public get lineCount(): number {\n return this.textBuffer.getLineCount()\n }\n\n public get virtualLineCount(): number {\n return this.textBufferView.getVirtualLineCount()\n }\n\n public get scrollY(): number {\n return this._scrollY\n }\n\n public set scrollY(value: number) {\n const maxScrollY = Math.max(0, this.scrollHeight - this.height)\n const clamped = Math.max(0, Math.min(value, maxScrollY))\n if (this._scrollY !== clamped) {\n this._scrollY = clamped\n this.updateViewportOffset()\n this.requestRender()\n }\n }\n\n public get scrollX(): number {\n return this._scrollX\n }\n\n public set scrollX(value: number) {\n const maxScrollX = Math.max(0, this.scrollWidth - this.width)\n const clamped = Math.max(0, Math.min(value, maxScrollX))\n if (this._scrollX !== clamped) {\n this._scrollX = clamped\n this.updateViewportOffset()\n this.requestRender()\n }\n }\n\n public get scrollWidth(): number {\n return this.lineInfo.lineWidthColsMax\n }\n\n public get scrollHeight(): number {\n return this.lineInfo.lineStartCols.length\n }\n\n public get maxScrollY(): number {\n return Math.max(0, this.scrollHeight - this.height)\n }\n\n public get maxScrollX(): number {\n return Math.max(0, this.scrollWidth - this.width)\n }\n\n protected updateViewportOffset(): void {\n // Update the viewport with the new scroll position\n if (this.width > 0 && this.height > 0) {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, this.width, this.height)\n }\n }\n\n get plainText(): string {\n return this.textBuffer.getPlainText()\n }\n\n get textLength(): number {\n return this.textBuffer.length\n }\n\n get fg(): RGBA {\n return this._defaultFg\n }\n\n set fg(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.fg)\n if (this._defaultFg !== newColor) {\n this._defaultFg = newColor\n this.textBuffer.setDefaultFg(this._defaultFg)\n this.onFgChanged(newColor)\n this.requestRender()\n }\n }\n\n get selectionBg(): RGBA | undefined {\n return this._selectionBg\n }\n\n set selectionBg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionBg\n if (this._selectionBg !== newColor) {\n this._selectionBg = newColor\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n this.requestRender()\n }\n }\n\n get selectionFg(): RGBA | undefined {\n return this._selectionFg\n }\n\n set selectionFg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionFg\n if (this._selectionFg !== newColor) {\n this._selectionFg = newColor\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n this.requestRender()\n }\n }\n\n get bg(): RGBA {\n return this._defaultBg\n }\n\n set bg(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.bg)\n if (this._defaultBg !== newColor) {\n this._defaultBg = newColor\n this.textBuffer.setDefaultBg(this._defaultBg)\n this.onBgChanged(newColor)\n this.requestRender()\n }\n }\n\n get attributes(): number {\n return this._defaultAttributes\n }\n\n set attributes(value: number) {\n if (this._defaultAttributes !== value) {\n this._defaultAttributes = value\n this.textBuffer.setDefaultAttributes(this._defaultAttributes)\n this.onAttributesChanged(value)\n this.requestRender()\n }\n }\n\n get wrapMode(): \"none\" | \"char\" | \"word\" {\n return this._wrapMode\n }\n\n set wrapMode(value: \"none\" | \"char\" | \"word\") {\n if (this._wrapMode !== value) {\n this._wrapMode = value\n this.textBufferView.setWrapMode(this._wrapMode)\n if (value !== \"none\" && this.width > 0) {\n this.textBufferView.setWrapWidth(this.width)\n }\n // Changing wrap mode can change dimensions, so mark yoga node dirty to trigger re-measurement\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n\n get tabIndicator(): string | number | undefined {\n return this._tabIndicator\n }\n\n set tabIndicator(value: string | number | undefined) {\n if (this._tabIndicator !== value) {\n this._tabIndicator = value\n if (value !== undefined) {\n this.textBufferView.setTabIndicator(value)\n }\n this.requestRender()\n }\n }\n\n get tabIndicatorColor(): RGBA | undefined {\n return this._tabIndicatorColor\n }\n\n set tabIndicatorColor(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : undefined\n if (this._tabIndicatorColor !== newColor) {\n this._tabIndicatorColor = newColor\n if (newColor !== undefined) {\n this.textBufferView.setTabIndicatorColor(newColor)\n }\n this.requestRender()\n }\n }\n\n get truncate(): boolean {\n return this._truncate\n }\n\n set truncate(value: boolean) {\n if (this._truncate !== value) {\n this._truncate = value\n this.textBufferView.setTruncate(value)\n this.requestRender()\n }\n }\n\n protected override onResize(width: number, height: number): void {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, width, height)\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n }\n\n protected refreshLocalSelection(): boolean {\n if (this.lastLocalSelection) {\n return this.updateLocalSelection(this.lastLocalSelection)\n }\n return false\n }\n\n private updateLocalSelection(localSelection: LocalSelectionBounds | null): boolean {\n if (!localSelection?.isActive) {\n this.textBufferView.resetLocalSelection()\n return true\n }\n\n return this.textBufferView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n }\n\n protected updateTextInfo(): void {\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n }\n\n // Undefined = 0,\n // Exactly = 1,\n // AtMost = 2\n private setupMeasureFunc(): void {\n const measureFunc = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n ): { width: number; height: number } => {\n // When widthMode is Undefined, Yoga is asking for the intrinsic/natural width\n // Pass width=0 to measureForDimensions to signal we want max-content (no wrapping)\n // The Zig code treats width=0 with wrap_mode != none as null wrap_width,\n // which triggers no-wrap mode and returns iter_mod.getMaxLineWidth()\n let effectiveWidth: number\n if (widthMode === MeasureMode.Undefined || isNaN(width)) {\n effectiveWidth = 0\n } else {\n effectiveWidth = width\n }\n\n const effectiveHeight = isNaN(height) ? 1 : height\n\n const measureResult = this.textBufferView.measureForDimensions(\n Math.floor(effectiveWidth),\n Math.floor(effectiveHeight),\n )\n\n const measuredWidth = measureResult ? Math.max(1, measureResult.widthColsMax) : 1\n const measuredHeight = measureResult ? Math.max(1, measureResult.lineCount) : 1\n\n if (widthMode === MeasureMode.AtMost && this._positionType !== \"absolute\") {\n return {\n width: Math.min(effectiveWidth, measuredWidth),\n height: Math.min(effectiveHeight, measuredHeight),\n }\n }\n\n // NOTE: Yoga may use these measurements or not.\n // If the yoga node settings and the parent allow this node to grow, it will.\n return {\n width: measuredWidth,\n height: measuredHeight,\n }\n }\n\n this.yogaNode.setMeasureFunc(measureFunc)\n }\n\n override shouldStartSelection(x: number, y: number): boolean {\n if (!this.selectable) return false\n\n const localX = x - this.x\n const localY = y - this.y\n\n return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height\n }\n\n override onSelectionChanged(selection: Selection | null): boolean {\n const localSelection = convertGlobalToLocalSelection(selection, this.x, this.y)\n this.lastLocalSelection = localSelection\n\n let changed: boolean\n if (!localSelection?.isActive) {\n this.textBufferView.resetLocalSelection()\n changed = true\n } else if (selection?.isStart) {\n changed = this.textBufferView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n } else {\n changed = this.textBufferView.updateLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n }\n\n if (changed) {\n this.requestRender()\n }\n\n return this.hasSelection()\n }\n\n override getSelectedText(): string {\n return this.textBufferView.getSelectedText()\n }\n\n override hasSelection(): boolean {\n return this.textBufferView.hasSelection()\n }\n\n getSelection(): { start: number; end: number } | null {\n return this.textBufferView.getSelection()\n }\n\n override render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n // Text views do enough per-frame work that avoiding recursive x/y lookups is\n // measurable; use the layout cache for hit-grid and draw entry points.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n this.renderSelf(buffer)\n\n if (this.buffered && this.frameBuffer) {\n buffer.drawFrameBuffer(screenX, screenY, this.frameBuffer)\n }\n }\n\n protected override renderSelf(buffer: OptimizedBuffer): void {\n if (this.textBuffer.ptr) {\n buffer.drawTextBuffer(this.textBufferView, this._screenX, this._screenY)\n }\n }\n\n override destroy(): void {\n if (this.isDestroyed) return\n\n this.textBuffer.setSyntaxStyle(null)\n this._textBufferSyntaxStyle.destroy()\n this.textBufferView.destroy()\n this.textBuffer.destroy()\n super.destroy()\n }\n\n protected onFgChanged(newColor: RGBA): void {\n // Override in subclasses if needed\n }\n\n protected onBgChanged(newColor: RGBA): void {\n // Override in subclasses if needed\n }\n\n protected onAttributesChanged(newAttributes: number): void {\n // Override in subclasses if needed\n }\n}\n",
|
|
58
|
+
"import { type RenderContext } from \"../types.js\"\nimport { StyledText } from \"../lib/styled-text.js\"\nimport { SyntaxStyle } from \"../syntax-style.js\"\nimport { getTreeSitterClient, treeSitterToStyledText, TreeSitterClient } from \"../lib/tree-sitter/index.js\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport type { SimpleHighlight } from \"../lib/tree-sitter/types.js\"\nimport type { TextChunk } from \"../text-buffer.js\"\nimport { treeSitterToTextChunks } from \"../lib/tree-sitter-styled-text.js\"\n\nexport interface HighlightContext {\n content: string\n filetype: string\n syntaxStyle: SyntaxStyle\n}\n\nexport type OnHighlightCallback = (\n highlights: SimpleHighlight[],\n context: HighlightContext,\n) => SimpleHighlight[] | undefined | Promise<SimpleHighlight[] | undefined>\n\nexport interface ChunkRenderContext extends HighlightContext {\n highlights: SimpleHighlight[]\n}\n\nexport type OnChunksCallback = (\n chunks: TextChunk[],\n context: ChunkRenderContext,\n) => TextChunk[] | undefined | Promise<TextChunk[] | undefined>\n\nexport interface CodeOptions extends TextBufferOptions {\n content?: string\n filetype?: string\n syntaxStyle: SyntaxStyle\n treeSitterClient?: TreeSitterClient\n conceal?: boolean\n drawUnstyledText?: boolean\n streaming?: boolean\n onHighlight?: OnHighlightCallback\n onChunks?: OnChunksCallback\n}\n\nexport class CodeRenderable extends TextBufferRenderable {\n private _content: string\n private _filetype?: string\n private _syntaxStyle: SyntaxStyle\n private _isHighlighting: boolean = false\n private _treeSitterClient: TreeSitterClient\n private _highlightsDirty: boolean = false\n private _highlightSnapshotId: number = 0\n private _conceal: boolean\n private _drawUnstyledText: boolean\n private _shouldRenderTextBuffer: boolean = true\n private _streaming: boolean\n private _hadInitialContent: boolean = false\n private _lastHighlights: SimpleHighlight[] = []\n private _onHighlight?: OnHighlightCallback\n private _onChunks?: OnChunksCallback\n private _highlightingPromise: Promise<void> = Promise.resolve()\n\n protected _contentDefaultOptions = {\n content: \"\",\n conceal: true,\n drawUnstyledText: true,\n streaming: false,\n } satisfies Partial<CodeOptions>\n\n constructor(ctx: RenderContext, options: CodeOptions) {\n super(ctx, options)\n\n this._content = options.content ?? this._contentDefaultOptions.content\n this._filetype = options.filetype\n this._syntaxStyle = options.syntaxStyle\n this._treeSitterClient = options.treeSitterClient ?? getTreeSitterClient()\n this._conceal = options.conceal ?? this._contentDefaultOptions.conceal\n this._drawUnstyledText = options.drawUnstyledText ?? this._contentDefaultOptions.drawUnstyledText\n this._streaming = options.streaming ?? this._contentDefaultOptions.streaming\n this._onHighlight = options.onHighlight\n this._onChunks = options.onChunks\n\n if (this._content.length > 0) {\n this.textBuffer.setText(this._content)\n this.updateTextInfo()\n this._shouldRenderTextBuffer = this._drawUnstyledText || !this._filetype\n }\n\n this._highlightsDirty = this._content.length > 0\n }\n\n get content(): string {\n return this._content\n }\n\n set content(value: string) {\n if (this._content !== value) {\n this._content = value\n this._highlightsDirty = true\n this._highlightSnapshotId++\n\n if (this._streaming && !this._drawUnstyledText && this._filetype) {\n this.requestRender()\n return\n }\n\n this.textBuffer.setText(value)\n this.updateTextInfo()\n }\n }\n\n get filetype(): string | undefined {\n return this._filetype\n }\n\n set filetype(value: string | undefined) {\n if (this._filetype !== value) {\n this._filetype = value\n this._highlightsDirty = true\n }\n }\n\n get syntaxStyle(): SyntaxStyle {\n return this._syntaxStyle\n }\n\n set syntaxStyle(value: SyntaxStyle) {\n if (this._syntaxStyle !== value) {\n this._syntaxStyle = value\n this._highlightsDirty = true\n }\n }\n\n get conceal(): boolean {\n return this._conceal\n }\n\n set conceal(value: boolean) {\n if (this._conceal !== value) {\n this._conceal = value\n this._highlightsDirty = true\n }\n }\n\n get drawUnstyledText(): boolean {\n return this._drawUnstyledText\n }\n\n set drawUnstyledText(value: boolean) {\n if (this._drawUnstyledText !== value) {\n this._drawUnstyledText = value\n this._highlightsDirty = true\n }\n }\n\n get streaming(): boolean {\n return this._streaming\n }\n\n set streaming(value: boolean) {\n if (this._streaming !== value) {\n this._streaming = value\n this._hadInitialContent = false\n this._lastHighlights = []\n this._highlightsDirty = true\n }\n }\n\n get treeSitterClient(): TreeSitterClient {\n return this._treeSitterClient\n }\n\n set treeSitterClient(value: TreeSitterClient) {\n if (this._treeSitterClient !== value) {\n this._treeSitterClient = value\n this._highlightsDirty = true\n }\n }\n\n get onHighlight(): OnHighlightCallback | undefined {\n return this._onHighlight\n }\n\n set onHighlight(value: OnHighlightCallback | undefined) {\n if (this._onHighlight !== value) {\n this._onHighlight = value\n this._highlightsDirty = true\n }\n }\n\n get onChunks(): OnChunksCallback | undefined {\n return this._onChunks\n }\n\n set onChunks(value: OnChunksCallback | undefined) {\n if (this._onChunks !== value) {\n this._onChunks = value\n this._highlightsDirty = true\n }\n }\n\n get isHighlighting(): boolean {\n return this._isHighlighting\n }\n\n get highlightingDone(): Promise<void> {\n return this._highlightingPromise\n }\n\n protected async transformChunks(chunks: TextChunk[], context: ChunkRenderContext): Promise<TextChunk[]> {\n if (!this._onChunks) return chunks\n\n const modified = await this._onChunks(chunks, context)\n return modified ?? chunks\n }\n\n private ensureVisibleTextBeforeHighlight(): void {\n if (this.isDestroyed) return\n\n const content = this._content\n\n if (!this._filetype) {\n this._shouldRenderTextBuffer = true\n return\n }\n\n const isInitialContent = this._streaming && !this._hadInitialContent\n const shouldDrawUnstyledNow = this._streaming ? isInitialContent && this._drawUnstyledText : this._drawUnstyledText\n\n if (this._streaming && !isInitialContent) {\n this._shouldRenderTextBuffer = true\n } else if (shouldDrawUnstyledNow) {\n this.textBuffer.setText(content)\n this._shouldRenderTextBuffer = true\n } else {\n this._shouldRenderTextBuffer = false\n }\n }\n\n private async startHighlight(): Promise<void> {\n const content = this._content\n const filetype = this._filetype\n const snapshotId = ++this._highlightSnapshotId\n\n if (!filetype) return\n\n const isInitialContent = this._streaming && !this._hadInitialContent\n if (isInitialContent) {\n this._hadInitialContent = true\n }\n\n this._isHighlighting = true\n\n try {\n const result = await this._treeSitterClient.highlightOnce(content, filetype)\n\n if (snapshotId !== this._highlightSnapshotId) {\n return\n }\n\n if (this.isDestroyed) return\n\n let highlights = result.highlights ?? []\n\n if (this._onHighlight && highlights.length >= 0) {\n const context: HighlightContext = {\n content,\n filetype,\n syntaxStyle: this._syntaxStyle,\n }\n const modified = await this._onHighlight(highlights, context)\n if (modified !== undefined) {\n highlights = modified\n }\n }\n\n if (snapshotId !== this._highlightSnapshotId) {\n return\n }\n\n if (this.isDestroyed) return\n\n if (highlights.length > 0) {\n if (this._streaming) {\n this._lastHighlights = highlights\n }\n }\n\n if (highlights.length > 0 || this._onChunks) {\n const context: ChunkRenderContext = {\n content,\n filetype,\n syntaxStyle: this._syntaxStyle,\n highlights,\n }\n\n let chunks = treeSitterToTextChunks(content, highlights, this._syntaxStyle, {\n enabled: this._conceal,\n })\n\n chunks = await this.transformChunks(chunks, context)\n\n if (snapshotId !== this._highlightSnapshotId) {\n return\n }\n\n if (this.isDestroyed) return\n\n const styledText = new StyledText(chunks)\n this.textBuffer.setStyledText(styledText)\n } else {\n this.textBuffer.setText(content)\n }\n\n this._shouldRenderTextBuffer = true\n this._isHighlighting = false\n this._highlightsDirty = false\n this.updateTextInfo()\n this.requestRender()\n } catch (error) {\n if (snapshotId !== this._highlightSnapshotId) {\n return\n }\n\n console.warn(\"Code highlighting failed, falling back to plain text:\", error)\n if (this.isDestroyed) return\n this.textBuffer.setText(content)\n this._shouldRenderTextBuffer = true\n this._isHighlighting = false\n this._highlightsDirty = false\n this.updateTextInfo()\n this.requestRender()\n }\n }\n\n public getLineHighlights(lineIdx: number) {\n return this.textBuffer.getLineHighlights(lineIdx)\n }\n\n protected override renderSelf(buffer: OptimizedBuffer): void {\n if (this._highlightsDirty) {\n if (this.isDestroyed) return\n\n if (this._content.length === 0) {\n this._shouldRenderTextBuffer = false\n this._highlightsDirty = false\n } else if (!this._filetype) {\n this._shouldRenderTextBuffer = true\n this._highlightsDirty = false\n } else {\n this.ensureVisibleTextBeforeHighlight()\n this._highlightsDirty = false\n this._highlightingPromise = this.startHighlight()\n }\n }\n\n if (!this._shouldRenderTextBuffer) return\n super.renderSelf(buffer)\n }\n}\n",
|
|
59
|
+
"import type { TextRenderable } from \"./Text.js\"\nimport { BaseRenderable, type BaseRenderableOptions } from \"../Renderable.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { isStyledText, StyledText } from \"../lib/styled-text.js\"\nimport { type TextChunk } from \"../text-buffer.js\"\nimport type { RenderContext } from \"../types.js\"\n\nexport interface TextNodeOptions extends BaseRenderableOptions {\n fg?: string | RGBA\n bg?: string | RGBA\n attributes?: number\n link?: { url: string }\n}\n\nconst BrandedTextNodeRenderable: unique symbol = Symbol.for(\"@opentui/core/TextNodeRenderable\")\n\nexport function isTextNodeRenderable(obj: any): obj is TextNodeRenderable {\n return !!obj?.[BrandedTextNodeRenderable]\n}\n\nfunction styledTextToTextNodes(styledText: StyledText): TextNodeRenderable[] {\n return styledText.chunks.map((chunk) => {\n const node = new TextNodeRenderable({\n fg: chunk.fg,\n bg: chunk.bg,\n attributes: chunk.attributes,\n link: chunk.link,\n })\n node.add(chunk.text)\n return node\n })\n}\n\nexport class TextNodeRenderable extends BaseRenderable {\n [BrandedTextNodeRenderable] = true\n\n private _fg?: RGBA\n private _bg?: RGBA\n private _attributes: number\n private _link?: { url: string }\n private _children: (string | TextNodeRenderable)[] = []\n public override parent: TextNodeRenderable | null = null\n\n constructor(options: TextNodeOptions) {\n super(options)\n\n this._fg = options.fg ? parseColor(options.fg) : undefined\n this._bg = options.bg ? parseColor(options.bg) : undefined\n this._attributes = options.attributes ?? 0\n this._link = options.link\n }\n\n public get children(): (string | TextNodeRenderable)[] {\n return this._children\n }\n\n public set children(children: (string | TextNodeRenderable)[]) {\n this._children = children\n this.requestRender()\n }\n\n public override requestRender(): void {\n this.markDirty()\n this.parent?.requestRender()\n }\n\n public override add(obj: TextNodeRenderable | StyledText | string, index?: number): number {\n if (typeof obj === \"string\") {\n if (index !== undefined) {\n this._children.splice(index, 0, obj)\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(obj)\n this.requestRender()\n return insertIndex\n }\n\n if (isTextNodeRenderable(obj)) {\n if (index !== undefined) {\n this._children.splice(index, 0, obj)\n obj.parent = this\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(obj)\n obj.parent = this\n this.requestRender()\n return insertIndex\n }\n\n if (isStyledText(obj)) {\n const textNodes = styledTextToTextNodes(obj)\n if (index !== undefined) {\n this._children.splice(index, 0, ...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n this.requestRender()\n return insertIndex\n }\n\n throw new Error(\"TextNodeRenderable only accepts strings, TextNodeRenderable instances, or StyledText instances\")\n }\n\n public replace(obj: TextNodeRenderable | string, index: number) {\n this._children[index] = obj\n if (typeof obj !== \"string\") {\n obj.parent = this\n }\n this.requestRender()\n }\n\n public override insertBefore(\n child: string | TextNodeRenderable | StyledText,\n anchorNode: TextNodeRenderable | string | unknown,\n ): this {\n if (!anchorNode || !isTextNodeRenderable(anchorNode)) {\n throw new Error(\"Anchor must be a TextNodeRenderable\")\n }\n\n const anchorIndex = this._children.indexOf(anchorNode)\n if (anchorIndex === -1) {\n throw new Error(\"Anchor node not found in children\")\n }\n\n if (typeof child === \"string\") {\n this._children.splice(anchorIndex, 0, child)\n } else if (isTextNodeRenderable(child)) {\n this._children.splice(anchorIndex, 0, child)\n child.parent = this\n } else if (child instanceof StyledText) {\n const textNodes = styledTextToTextNodes(child)\n this._children.splice(anchorIndex, 0, ...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n } else {\n throw new Error(\"Child must be a string, TextNodeRenderable, or StyledText instance\")\n }\n\n this.requestRender()\n return this\n }\n\n public override remove(id: string): this {\n const childIndex = this.getRenderableIndex(id)\n if (childIndex === -1) {\n throw new Error(\"Child not found in children\")\n }\n\n const child = this._children[childIndex] as TextNodeRenderable\n\n this._children.splice(childIndex, 1)\n child.parent = null\n this.requestRender()\n return this\n }\n\n public clear(): void {\n this._children = []\n this.requestRender()\n }\n\n public mergeStyles(parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } }): {\n fg?: RGBA\n bg?: RGBA\n attributes: number\n link?: { url: string }\n } {\n return {\n fg: this._fg ?? parentStyle.fg,\n bg: this._bg ?? parentStyle.bg,\n attributes: this._attributes | parentStyle.attributes,\n link: this._link ?? parentStyle.link,\n }\n }\n\n public gatherWithInheritedStyle(\n parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } } = {\n fg: undefined,\n bg: undefined,\n attributes: 0,\n },\n ): TextChunk[] {\n const currentStyle = this.mergeStyles(parentStyle)\n\n const chunks: TextChunk[] = []\n\n for (const child of this._children) {\n if (typeof child === \"string\") {\n chunks.push({\n __isChunk: true,\n text: child,\n fg: currentStyle.fg,\n bg: currentStyle.bg,\n attributes: currentStyle.attributes,\n link: currentStyle.link,\n })\n } else {\n const childChunks = child.gatherWithInheritedStyle(currentStyle)\n chunks.push(...childChunks)\n }\n }\n\n this.markClean()\n\n return chunks\n }\n\n public static fromString(text: string, options: Partial<TextNodeOptions> = {}): TextNodeRenderable {\n const node = new TextNodeRenderable(options)\n node.add(text)\n return node\n }\n\n public static fromNodes(nodes: TextNodeRenderable[], options: Partial<TextNodeOptions> = {}): TextNodeRenderable {\n const node = new TextNodeRenderable(options)\n for (const childNode of nodes) {\n node.add(childNode)\n }\n return node\n }\n\n public toChunks(\n parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } } = {\n fg: undefined,\n bg: undefined,\n attributes: 0,\n },\n ): TextChunk[] {\n return this.gatherWithInheritedStyle(parentStyle)\n }\n\n public override getChildren(): BaseRenderable[] {\n return this._children.filter((child): child is TextNodeRenderable => typeof child !== \"string\")\n }\n\n public override getChildrenCount(): number {\n return this._children.length\n }\n\n public override getRenderable(id: string): BaseRenderable | undefined {\n return this._children.find((child): child is TextNodeRenderable => typeof child !== \"string\" && child.id === id)\n }\n\n public getRenderableIndex(id: string): number {\n return this._children.findIndex((child) => isTextNodeRenderable(child) && child.id === id)\n }\n\n public get fg(): RGBA | undefined {\n return this._fg\n }\n\n public set fg(fg: RGBA | string | undefined) {\n if (!fg) {\n this._fg = undefined\n this.requestRender()\n return\n }\n this._fg = parseColor(fg)\n this.requestRender()\n }\n\n public set bg(bg: RGBA | string | undefined) {\n if (!bg) {\n this._bg = undefined\n this.requestRender()\n return\n }\n this._bg = parseColor(bg)\n this.requestRender()\n }\n\n public get bg(): RGBA | undefined {\n return this._bg\n }\n\n public set attributes(attributes: number) {\n this._attributes = attributes\n this.requestRender()\n }\n\n public get attributes(): number {\n return this._attributes\n }\n\n public set link(link: { url: string } | undefined) {\n this._link = link\n this.requestRender()\n }\n\n public get link(): { url: string } | undefined {\n return this._link\n }\n\n public override findDescendantById(id: string): BaseRenderable | undefined {\n return undefined\n }\n}\n\nexport class RootTextNodeRenderable extends TextNodeRenderable {\n textParent: TextRenderable\n\n constructor(\n private readonly ctx: RenderContext,\n options: TextNodeOptions,\n textParent: TextRenderable,\n ) {\n super(options)\n this.textParent = textParent\n }\n\n public override requestRender(): void {\n this.markDirty()\n this.ctx.requestRender()\n }\n}\n",
|
|
60
|
+
"import { BaseRenderable } from \"../Renderable.js\"\nimport { stringToStyledText, StyledText } from \"../lib/styled-text.js\"\nimport { type TextChunk } from \"../text-buffer.js\"\nimport { RGBA } from \"../lib/RGBA.js\"\nimport { type RenderContext } from \"../types.js\"\nimport { RootTextNodeRenderable, TextNodeRenderable } from \"./TextNode.js\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable.js\"\n\nexport interface TextOptions extends TextBufferOptions {\n content?: StyledText | string\n}\n\nexport class TextRenderable extends TextBufferRenderable {\n private _text: StyledText\n\n // TODO: The TextRenderable is currently juggling both a StyledText and a RootTextNodeRenderable.\n // We should refactor this to only use the RootTextNodeRenderable here and have a separate StyledTextRenderable with `content`.\n private _hasManualStyledText: boolean = false\n\n protected rootTextNode: RootTextNodeRenderable\n\n protected _contentDefaultOptions = {\n content: \"\",\n } satisfies Partial<TextOptions>\n\n constructor(ctx: RenderContext, options: TextOptions) {\n super(ctx, options)\n\n const content = options.content ?? this._contentDefaultOptions.content\n const styledText = typeof content === \"string\" ? stringToStyledText(content) : content\n this._text = styledText\n this._hasManualStyledText = options.content !== undefined && content !== \"\"\n\n this.rootTextNode = new RootTextNodeRenderable(\n ctx,\n {\n id: `${this.id}-root`,\n fg: this._defaultFg,\n bg: this._defaultBg,\n attributes: this._defaultAttributes,\n },\n this,\n )\n\n this.updateTextBuffer(styledText)\n }\n\n private updateTextBuffer(styledText: StyledText): void {\n this.textBuffer.setStyledText(styledText)\n this.clearChunks(styledText)\n }\n\n private clearChunks(styledText: StyledText): void {\n // Clearing chunks that were already writtend to the text buffer,\n // to not retain references to the text data in js\n // TODO: This is causing issues in the solid renderer\n // styledText.chunks.forEach((chunk) => {\n // // @ts-ignore\n // chunk.text = undefined\n // })\n }\n\n get content(): StyledText {\n return this._text\n }\n\n get chunks(): TextChunk[] {\n return this._text.chunks\n }\n\n get textNode(): RootTextNodeRenderable {\n return this.rootTextNode\n }\n\n set content(value: StyledText | string) {\n this._hasManualStyledText = true\n const styledText = typeof value === \"string\" ? stringToStyledText(value) : value\n if (this._text !== styledText) {\n this._text = styledText\n this.updateTextBuffer(styledText)\n this.updateTextInfo()\n }\n }\n\n private updateTextFromNodes(): void {\n if (this.rootTextNode.isDirty && !this._hasManualStyledText) {\n const chunks = this.rootTextNode.gatherWithInheritedStyle({\n fg: this._defaultFg,\n bg: this._defaultBg,\n attributes: this._defaultAttributes,\n link: undefined,\n })\n this.textBuffer.setStyledText(new StyledText(chunks))\n this.refreshLocalSelection()\n this.yogaNode.markDirty()\n }\n }\n\n public override add(obj: TextNodeRenderable | StyledText | string, index?: number): number {\n return this.rootTextNode.add(obj, index)\n }\n\n public override remove(id: string): void {\n this.rootTextNode.remove(id)\n }\n\n public override insertBefore(obj: BaseRenderable | any, anchor?: TextNodeRenderable): number {\n this.rootTextNode.insertBefore(obj, anchor)\n return this.rootTextNode.children.indexOf(obj)\n }\n\n public getTextChildren(): BaseRenderable[] {\n return this.rootTextNode.getChildren()\n }\n\n public clear(): void {\n this.rootTextNode.clear()\n\n const emptyStyledText = stringToStyledText(\"\")\n this._text = emptyStyledText\n this.updateTextBuffer(emptyStyledText)\n this.updateTextInfo()\n\n this.requestRender()\n }\n\n public override onLifecyclePass = () => {\n this.updateTextFromNodes()\n }\n\n protected override onFgChanged(newColor: RGBA): void {\n this.rootTextNode.fg = newColor\n }\n\n protected override onBgChanged(newColor: RGBA): void {\n this.rootTextNode.bg = newColor\n }\n\n protected override onAttributesChanged(newAttributes: number): void {\n this.rootTextNode.attributes = newAttributes\n }\n\n override destroy(): void {\n this.rootTextNode.children.length = 0\n super.destroy()\n }\n}\n",
|
|
61
|
+
"import { EventEmitter } from \"events\"\nimport { Console } from \"node:console\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport util from \"node:util\"\nimport type { CliRenderer, MouseEvent } from \"./renderer.js\"\nimport type { ColorInput } from \"./lib/RGBA.js\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport { type Clock, SystemClock } from \"./lib/clock.js\"\nimport { Capture, CapturedWritableStream } from \"./lib/output.capture.js\"\nimport { parseColor, RGBA } from \"./lib/RGBA.js\"\nimport { singleton } from \"./lib/singleton.js\"\nimport { env, registerEnvVar } from \"./lib/env.js\"\nimport type { KeyEvent } from \"./lib/KeyHandler.js\"\nimport {\n type KeyBinding as BaseKeyBinding,\n mergeKeyBindings,\n buildKeyBindingsMap,\n getKeyBindingAction,\n defaultKeyAliases,\n mergeKeyAliases,\n keyBindingToString,\n} from \"./lib/keybinding.internal.js\"\n\ntype KeyAliasMap = Record<string, string>\n\ninterface CallerInfo {\n functionName: string\n fullPath: string\n fileName: string\n lineNumber: number\n columnNumber: number\n}\n\nfunction getCallerInfo(): CallerInfo | null {\n const err = new Error()\n const stackLines = err.stack?.split(\"\\n\").slice(5) || []\n if (!stackLines.length) return null\n\n const callerLine = stackLines[0].trim()\n\n const regex = /at\\s+(?:([\\w$.<>]+)\\s+\\()?((?:\\/|[A-Za-z]:\\\\)[^:]+):(\\d+):(\\d+)\\)?/\n const match = callerLine.match(regex)\n\n if (!match) return null\n\n // Extract details from the match.\n const functionName = match[1] || \"<anonymous>\"\n const fullPath = match[2]\n const fileName = fullPath.split(/[\\\\/]/).pop() || \"<unknown>\"\n const lineNumber = parseInt(match[3], 10) || 0\n const columnNumber = parseInt(match[4], 10) || 0\n\n return { functionName, fullPath, fileName, lineNumber, columnNumber }\n}\n\nenum LogLevel {\n LOG = \"LOG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n DEBUG = \"DEBUG\",\n}\n\nexport const capture = singleton(\"ConsoleCapture\", () => new Capture())\n\nregisterEnvVar({\n name: \"OTUI_USE_CONSOLE\",\n description: \"Whether to use the console. Will not capture console output if set to false.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"SHOW_CONSOLE\",\n description: \"Show the console at startup if set to true.\",\n type: \"boolean\",\n default: false,\n})\n\nclass TerminalConsoleCache extends EventEmitter {\n private _cachedLogs: [Date, LogLevel, any[], CallerInfo | null][] = []\n private readonly MAX_CACHE_SIZE = 1000\n private _collectCallerInfo: boolean = false\n private _cachingEnabled: boolean = true\n private _originalConsole: typeof console | null = null\n\n get cachedLogs(): [Date, LogLevel, any[], CallerInfo | null][] {\n return this._cachedLogs\n }\n\n constructor() {\n super()\n\n // Note: Console activation will be handled by the renderer when needed\n // Don't activate on import to avoid hiding console.log globally\n }\n\n public activate(): void {\n if (!this._originalConsole) {\n this._originalConsole = global.console\n }\n this.setupConsoleCapture()\n this.overrideConsoleMethods()\n }\n\n private setupConsoleCapture(): void {\n if (!env.OTUI_USE_CONSOLE) return\n\n const mockStdout = new CapturedWritableStream(\"stdout\", capture)\n const mockStderr = new CapturedWritableStream(\"stderr\", capture)\n\n // TODO: The Console constructor doesn't return a full Console interface implementation,\n // it only provides a subset of methods (log, info, warn, error, debug, etc.).\n // TypeScript's Console interface requires all methods (assert, clear, count, etc.).\n // Using 'as any' as a workaround since we override the methods we use immediately after.\n global.console = new Console({\n stdout: mockStdout,\n stderr: mockStderr,\n colorMode: true,\n inspectOptions: {\n compact: false,\n breakLength: 80,\n depth: 2,\n },\n }) as any\n }\n\n private overrideConsoleMethods(): void {\n console.log = (...args: any[]) => {\n this.appendToConsole(LogLevel.LOG, ...args)\n }\n\n console.info = (...args: any[]) => {\n this.appendToConsole(LogLevel.INFO, ...args)\n }\n\n console.warn = (...args: any[]) => {\n this.appendToConsole(LogLevel.WARN, ...args)\n }\n\n console.error = (...args: any[]) => {\n this.appendToConsole(LogLevel.ERROR, ...args)\n }\n\n console.debug = (...args: any[]) => {\n this.appendToConsole(LogLevel.DEBUG, ...args)\n }\n }\n\n public setCollectCallerInfo(enabled: boolean): void {\n this._collectCallerInfo = enabled\n }\n\n public clearConsole(): void {\n this._cachedLogs = []\n }\n\n public setCachingEnabled(enabled: boolean): void {\n this._cachingEnabled = enabled\n }\n\n public deactivate(): void {\n this.restoreOriginalConsole()\n }\n\n private restoreOriginalConsole(): void {\n if (this._originalConsole) {\n global.console = this._originalConsole\n }\n }\n\n public addLogEntry(level: LogLevel, ...args: any[]) {\n const callerInfo = this._collectCallerInfo ? getCallerInfo() : null\n const logEntry: [Date, LogLevel, any[], CallerInfo | null] = [new Date(), level, args, callerInfo]\n\n if (this._cachingEnabled) {\n if (this._cachedLogs.length >= this.MAX_CACHE_SIZE) {\n this._cachedLogs.shift()\n }\n this._cachedLogs.push(logEntry)\n }\n\n return logEntry\n }\n\n private appendToConsole(level: LogLevel, ...args: any[]): void {\n if (this._cachedLogs.length >= this.MAX_CACHE_SIZE) {\n this._cachedLogs.shift()\n }\n const entry = this.addLogEntry(level, ...args)\n this.emit(\"entry\", entry)\n }\n\n public destroy(): void {\n this.deactivate()\n }\n}\n\nconst terminalConsoleCache = singleton(\"TerminalConsoleCache\", () => {\n const terminalConsoleCache = new TerminalConsoleCache()\n process.on(\"exit\", () => {\n terminalConsoleCache.destroy()\n })\n return terminalConsoleCache\n})\n\nexport enum ConsolePosition {\n TOP = \"top\",\n BOTTOM = \"bottom\",\n LEFT = \"left\",\n RIGHT = \"right\",\n}\n\ninterface ConsoleSelection {\n startLine: number\n startCol: number\n endLine: number\n endCol: number\n}\n\nexport type ConsoleAction =\n | \"scroll-up\"\n | \"scroll-down\"\n | \"scroll-to-top\"\n | \"scroll-to-bottom\"\n | \"position-previous\"\n | \"position-next\"\n | \"size-increase\"\n | \"size-decrease\"\n | \"save-logs\"\n | \"copy-selection\"\n\nexport type ConsoleKeyBinding = BaseKeyBinding<ConsoleAction>\n\nconst defaultConsoleKeybindings: ConsoleKeyBinding[] = [\n { name: \"up\", action: \"scroll-up\" },\n { name: \"down\", action: \"scroll-down\" },\n { name: \"up\", shift: true, action: \"scroll-to-top\" },\n { name: \"down\", shift: true, action: \"scroll-to-bottom\" },\n { name: \"p\", ctrl: true, action: \"position-previous\" },\n { name: \"o\", ctrl: true, action: \"position-next\" },\n { name: \"+\", action: \"size-increase\" },\n { name: \"=\", shift: true, action: \"size-increase\" },\n { name: \"-\", action: \"size-decrease\" },\n { name: \"s\", ctrl: true, action: \"save-logs\" },\n { name: \"c\", ctrl: true, shift: true, action: \"copy-selection\" },\n]\n\nexport interface ConsoleOptions {\n position?: ConsolePosition\n sizePercent?: number\n zIndex?: number\n colorInfo?: ColorInput\n colorWarn?: ColorInput\n colorError?: ColorInput\n colorDebug?: ColorInput\n colorDefault?: ColorInput\n backgroundColor?: ColorInput\n startInDebugMode?: boolean\n title?: string\n titleBarColor?: ColorInput\n titleBarTextColor?: ColorInput\n cursorColor?: ColorInput\n maxStoredLogs?: number\n maxDisplayLines?: number\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n selectionColor?: ColorInput\n copyButtonColor?: ColorInput\n clock?: Clock\n}\n\nconst DEFAULT_CONSOLE_OPTIONS: Required<\n Omit<ConsoleOptions, \"onCopySelection\" | \"keyBindings\" | \"keyAliasMap\" | \"clock\">\n> & {\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n} = {\n position: ConsolePosition.BOTTOM,\n sizePercent: 30,\n zIndex: Infinity,\n colorInfo: \"#00FFFF\", // Cyan\n colorWarn: \"#FFFF00\", // Yellow\n colorError: \"#FF0000\", // Red\n colorDebug: \"#808080\", // Gray\n colorDefault: \"#FFFFFF\", // White\n backgroundColor: RGBA.fromValues(0.1, 0.1, 0.1, 0.7),\n startInDebugMode: false,\n title: \"Console\",\n titleBarColor: RGBA.fromValues(0.05, 0.05, 0.05, 0.7),\n titleBarTextColor: \"#FFFFFF\",\n cursorColor: \"#00A0FF\",\n maxStoredLogs: 2000,\n maxDisplayLines: 3000,\n onCopySelection: undefined,\n keyBindings: undefined,\n keyAliasMap: undefined,\n selectionColor: RGBA.fromValues(0.3, 0.5, 0.8, 0.5),\n copyButtonColor: \"#00A0FF\",\n}\n\nconst INDENT_WIDTH = 2\n\ninterface DisplayLine {\n text: string\n level: LogLevel\n indent: boolean\n}\n\nexport class TerminalConsole extends EventEmitter {\n private isVisible: boolean = false\n private isFocused: boolean = false\n private renderer: CliRenderer\n private keyHandler: (event: KeyEvent) => void\n private options: Required<Omit<ConsoleOptions, \"onCopySelection\" | \"keyBindings\" | \"keyAliasMap\" | \"clock\">> & {\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n }\n private _debugModeEnabled: boolean = false\n\n private frameBuffer: OptimizedBuffer | null = null\n private consoleX: number = 0\n private consoleY: number = 0\n private consoleWidth: number = 0\n private consoleHeight: number = 0\n private scrollTopIndex: number = 0\n private isScrolledToBottom: boolean = true\n private currentLineIndex: number = 0\n private _displayLines: DisplayLine[] = []\n private _allLogEntries: [Date, LogLevel, any[], CallerInfo | null][] = []\n private _needsFrameBufferUpdate: boolean = false\n private _entryListener: (logEntry: [Date, LogLevel, any[], CallerInfo | null]) => void\n\n private _selectionStart: { line: number; col: number } | null = null\n private _selectionEnd: { line: number; col: number } | null = null\n private _isDragging: boolean = false\n private _copyButtonBounds: { x: number; y: number; width: number; height: number } = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n }\n private _autoScrollInterval: ReturnType<Clock[\"setInterval\"]> | null = null\n private readonly clock: Clock\n\n private _keyBindingsMap: Map<string, ConsoleAction>\n private _keyAliasMap: KeyAliasMap\n private _keyBindings: ConsoleKeyBinding[]\n private _mergedKeyBindings: ConsoleKeyBinding[]\n private _actionHandlers: Map<ConsoleAction, () => boolean>\n\n private markNeedsRerender(): void {\n this._needsFrameBufferUpdate = true\n this.renderer.requestRender()\n }\n\n private getCopyButtonLabel(): string {\n const copyBindings = this._mergedKeyBindings.filter((b) => b.action === \"copy-selection\")\n const copyBinding = copyBindings[copyBindings.length - 1]\n if (copyBinding) {\n const shortcut = keyBindingToString(copyBinding)\n return `[Copy (${shortcut})]`\n }\n return \"[Copy]\"\n }\n\n private _rgbaInfo: RGBA\n private _rgbaWarn: RGBA\n private _rgbaError: RGBA\n private _rgbaDebug: RGBA\n private _rgbaDefault: RGBA\n private backgroundColor: RGBA\n private _rgbaTitleBar: RGBA\n private _rgbaTitleBarText: RGBA\n private _title: string\n private _rgbaCursor: RGBA\n private _rgbaSelection: RGBA\n private _rgbaCopyButton: RGBA\n\n private _positions: ConsolePosition[] = [\n ConsolePosition.TOP,\n ConsolePosition.RIGHT,\n ConsolePosition.BOTTOM,\n ConsolePosition.LEFT,\n ]\n\n constructor(renderer: CliRenderer, options: ConsoleOptions = {}) {\n super()\n this.renderer = renderer\n this.clock = options.clock ?? new SystemClock()\n this.options = { ...DEFAULT_CONSOLE_OPTIONS, ...options }\n this.keyHandler = this.handleKeyPress.bind(this)\n this._debugModeEnabled = this.options.startInDebugMode\n terminalConsoleCache.setCollectCallerInfo(this._debugModeEnabled)\n\n this._rgbaInfo = parseColor(this.options.colorInfo)\n this._rgbaWarn = parseColor(this.options.colorWarn)\n this._rgbaError = parseColor(this.options.colorError)\n this._rgbaDebug = parseColor(this.options.colorDebug)\n this._rgbaDefault = parseColor(this.options.colorDefault)\n this.backgroundColor = parseColor(this.options.backgroundColor)\n this._rgbaTitleBar = parseColor(this.options.titleBarColor)\n this._rgbaTitleBarText = parseColor(this.options.titleBarTextColor || this.options.colorDefault)\n this._title = this.options.title\n this._rgbaCursor = parseColor(this.options.cursorColor)\n this._rgbaSelection = parseColor(this.options.selectionColor)\n this._rgbaCopyButton = parseColor(this.options.copyButtonColor)\n\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {})\n this._keyBindings = options.keyBindings || []\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this._actionHandlers = this.buildActionHandlers()\n\n this._updateConsoleDimensions()\n this._scrollToBottom(true)\n\n this._entryListener = (logEntry: [Date, LogLevel, any[], CallerInfo | null]) => {\n this._handleNewLog(logEntry)\n }\n terminalConsoleCache.on(\"entry\", this._entryListener)\n\n if (env.SHOW_CONSOLE) {\n this.show()\n }\n }\n\n private buildActionHandlers(): Map<ConsoleAction, () => boolean> {\n return new Map([\n [\"scroll-up\", () => this.scrollUp()],\n [\"scroll-down\", () => this.scrollDown()],\n [\"scroll-to-top\", () => this.scrollToTop()],\n [\"scroll-to-bottom\", () => this.scrollToBottomAction()],\n [\"position-previous\", () => this.positionPrevious()],\n [\"position-next\", () => this.positionNext()],\n [\"size-increase\", () => this.sizeIncrease()],\n [\"size-decrease\", () => this.sizeDecrease()],\n [\"save-logs\", () => this.saveLogsAction()],\n [\"copy-selection\", () => this.triggerCopyAction()],\n ])\n }\n\n public activate(): void {\n terminalConsoleCache.activate()\n }\n\n public deactivate(): void {\n terminalConsoleCache.deactivate()\n }\n\n // Handles a single new log entry *while the console is visible*\n private _handleNewLog(logEntry: [Date, LogLevel, any[], CallerInfo | null]): void {\n if (!this.isVisible) return\n\n this._allLogEntries.push(logEntry)\n\n if (this._allLogEntries.length > this.options.maxStoredLogs) {\n this._allLogEntries.splice(0, this._allLogEntries.length - this.options.maxStoredLogs)\n }\n\n const newDisplayLines = this._processLogEntry(logEntry)\n this._displayLines.push(...newDisplayLines)\n\n if (this._displayLines.length > this.options.maxDisplayLines) {\n this._displayLines.splice(0, this._displayLines.length - this.options.maxDisplayLines)\n const linesRemoved = this._displayLines.length - this.options.maxDisplayLines\n this.scrollTopIndex = Math.max(0, this.scrollTopIndex - linesRemoved)\n }\n\n if (this.isScrolledToBottom) {\n this._scrollToBottom()\n }\n this.markNeedsRerender()\n }\n\n private _updateConsoleDimensions(termWidth?: number, termHeight?: number): void {\n const width = termWidth ?? this.renderer.width\n const height = termHeight ?? this.renderer.height\n const sizePercent = this.options.sizePercent / 100\n\n switch (this.options.position) {\n case ConsolePosition.TOP:\n this.consoleX = 0\n this.consoleY = 0\n this.consoleWidth = width\n this.consoleHeight = Math.max(1, Math.floor(height * sizePercent))\n break\n case ConsolePosition.BOTTOM:\n this.consoleHeight = Math.max(1, Math.floor(height * sizePercent))\n this.consoleWidth = width\n this.consoleX = 0\n this.consoleY = height - this.consoleHeight\n break\n case ConsolePosition.LEFT:\n this.consoleWidth = Math.max(1, Math.floor(width * sizePercent))\n this.consoleHeight = height\n this.consoleX = 0\n this.consoleY = 0\n break\n case ConsolePosition.RIGHT:\n this.consoleWidth = Math.max(1, Math.floor(width * sizePercent))\n this.consoleHeight = height\n this.consoleY = 0\n this.consoleX = width - this.consoleWidth\n break\n }\n this.currentLineIndex = Math.max(0, Math.min(this.currentLineIndex, this.consoleHeight - 1))\n }\n\n private handleKeyPress(event: KeyEvent): void {\n if (event.name === \"escape\") {\n this.blur()\n return\n }\n\n const action = getKeyBindingAction(this._keyBindingsMap, event)\n\n if (action) {\n const handler = this._actionHandlers.get(action)\n if (handler) {\n handler()\n return\n }\n }\n }\n\n private scrollUp(): boolean {\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n\n if (this.currentLineIndex > 0) {\n this.currentLineIndex--\n this.markNeedsRerender()\n } else if (this.scrollTopIndex > 0) {\n this.scrollTopIndex--\n this.isScrolledToBottom = false\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollDown(): boolean {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n const canCursorMoveDown =\n this.currentLineIndex < logAreaHeight - 1 && this.scrollTopIndex + this.currentLineIndex < displayLineCount - 1\n\n if (canCursorMoveDown) {\n this.currentLineIndex++\n this.markNeedsRerender()\n } else if (this.scrollTopIndex < maxScrollTop) {\n this.scrollTopIndex++\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollToTop(): boolean {\n if (this.scrollTopIndex > 0 || this.currentLineIndex > 0) {\n this.scrollTopIndex = 0\n this.currentLineIndex = 0\n this.isScrolledToBottom = this._displayLines.length <= Math.max(1, this.consoleHeight - 1)\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollToBottomAction(): boolean {\n const logAreaHeightForScroll = Math.max(1, this.consoleHeight - 1)\n const maxScrollPossible = Math.max(0, this._displayLines.length - logAreaHeightForScroll)\n if (this.scrollTopIndex < maxScrollPossible || !this.isScrolledToBottom) {\n this._scrollToBottom(true)\n this.markNeedsRerender()\n }\n return true\n }\n\n private positionPrevious(): boolean {\n const currentPositionIndex = this._positions.indexOf(this.options.position)\n const prevIndex = (currentPositionIndex - 1 + this._positions.length) % this._positions.length\n this.options.position = this._positions[prevIndex]\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private positionNext(): boolean {\n const currentPositionIndex = this._positions.indexOf(this.options.position)\n const nextIndex = (currentPositionIndex + 1) % this._positions.length\n this.options.position = this._positions[nextIndex]\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private sizeIncrease(): boolean {\n this.options.sizePercent = Math.min(100, this.options.sizePercent + 5)\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private sizeDecrease(): boolean {\n this.options.sizePercent = Math.max(10, this.options.sizePercent - 5)\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private saveLogsAction(): boolean {\n this.saveLogsToFile()\n return true\n }\n\n private triggerCopyAction(): boolean {\n this.triggerCopy()\n return true\n }\n\n private attachStdin(): void {\n if (this.isFocused) return\n this.renderer.keyInput.on(\"keypress\", this.keyHandler)\n this.isFocused = true\n }\n\n private detachStdin(): void {\n if (!this.isFocused) return\n this.renderer.keyInput.off(\"keypress\", this.keyHandler)\n this.isFocused = false\n }\n\n private formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n }).format(date)\n }\n\n private formatArguments(args: any[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n const errorProps = arg\n return `Error: ${errorProps.message}\\n` + (errorProps.stack ? `${errorProps.stack}\\n` : \"\")\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return util.inspect(arg, { depth: 2 })\n } catch (e) {\n return String(arg)\n }\n }\n try {\n return util.inspect(arg, { depth: 2 })\n } catch (e) {\n return String(arg)\n }\n })\n .join(\" \")\n }\n\n public resize(width: number, height: number): void {\n this._updateConsoleDimensions(width, height)\n\n if (this.frameBuffer) {\n this.frameBuffer.resize(this.consoleWidth, this.consoleHeight)\n\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n this.scrollTopIndex = Math.min(this.scrollTopIndex, maxScrollTop)\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n const visibleLineCount = Math.min(logAreaHeight, displayLineCount - this.scrollTopIndex)\n this.currentLineIndex = Math.max(0, Math.min(this.currentLineIndex, visibleLineCount - 1))\n\n if (this.isVisible) {\n this.markNeedsRerender()\n }\n }\n }\n\n public clear(): void {\n terminalConsoleCache.clearConsole()\n this._allLogEntries = []\n this._displayLines = []\n this.markNeedsRerender()\n }\n\n public toggle(): void {\n if (this.isVisible) {\n if (this.isFocused) {\n this.hide()\n } else {\n this.focus()\n }\n } else {\n this.show()\n }\n if (!this.renderer.isRunning) {\n this.renderer.requestRender()\n }\n }\n\n public focus(): void {\n this.attachStdin()\n this._scrollToBottom(true)\n this.markNeedsRerender()\n }\n\n public blur(): void {\n this.detachStdin()\n this.markNeedsRerender()\n }\n\n public show(): void {\n if (!this.isVisible) {\n this.isVisible = true\n this._processCachedLogs()\n terminalConsoleCache.setCachingEnabled(false)\n\n if (!this.frameBuffer) {\n this.frameBuffer = OptimizedBuffer.create(this.consoleWidth, this.consoleHeight, this.renderer.widthMethod, {\n respectAlpha: this.backgroundColor.a < 1,\n id: \"console framebuffer\",\n })\n }\n const logCount = terminalConsoleCache.cachedLogs.length\n const visibleLogLines = Math.min(this.consoleHeight, logCount)\n this.currentLineIndex = Math.max(0, visibleLogLines - 1)\n this.scrollTopIndex = 0\n this._scrollToBottom(true)\n\n this.focus()\n this.markNeedsRerender()\n }\n }\n\n public hide(): void {\n if (this.isVisible) {\n this.isVisible = false\n this.blur()\n terminalConsoleCache.setCachingEnabled(true)\n }\n }\n\n public destroy(): void {\n this.stopAutoScroll()\n this.hide()\n this.deactivate()\n terminalConsoleCache.off(\"entry\", this._entryListener)\n }\n\n public getCachedLogs(): string {\n return terminalConsoleCache.cachedLogs\n .map((logEntry) => logEntry[0].toISOString() + \" \" + logEntry.slice(1).join(\" \"))\n .join(\"\\n\")\n }\n\n private updateFrameBuffer(): void {\n if (!this.frameBuffer) return\n\n this.frameBuffer.clear(this.backgroundColor)\n\n const displayLines = this._displayLines\n const displayLineCount = displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n\n // --- Draw Title Bar ---\n this.frameBuffer.fillRect(0, 0, this.consoleWidth, 1, this._rgbaTitleBar)\n const dynamicTitle = `${this._title}${this.isFocused ? \" (Focused)\" : \"\"}`\n const titleX = Math.max(0, Math.floor((this.consoleWidth - dynamicTitle.length) / 2))\n this.frameBuffer.drawText(dynamicTitle, titleX, 0, this._rgbaTitleBarText, this._rgbaTitleBar)\n\n // --- Draw [Copy] Button ---\n const copyLabel = this.getCopyButtonLabel()\n const copyButtonX = this.consoleWidth - copyLabel.length - 1\n if (copyButtonX >= 0) {\n const copyButtonEnabled = this.hasSelection()\n const disabledColor = RGBA.fromInts(100, 100, 100, 255)\n const copyColor = copyButtonEnabled ? this._rgbaCopyButton : disabledColor\n this.frameBuffer.drawText(copyLabel, copyButtonX, 0, copyColor, this._rgbaTitleBar)\n this._copyButtonBounds = { x: copyButtonX, y: 0, width: copyLabel.length, height: 1 }\n } else {\n this._copyButtonBounds = { x: -1, y: -1, width: 0, height: 0 }\n }\n\n const startIndex = this.scrollTopIndex\n const endIndex = Math.min(startIndex + logAreaHeight, displayLineCount)\n const visibleDisplayLines = displayLines.slice(startIndex, endIndex)\n\n let lineY = 1\n for (let i = 0; i < visibleDisplayLines.length; i++) {\n if (lineY >= this.consoleHeight) break\n\n const displayLine = visibleDisplayLines[i]\n const absoluteLineIndex = startIndex + i\n\n let levelColor = this._rgbaDefault\n switch (displayLine.level) {\n case LogLevel.INFO:\n levelColor = this._rgbaInfo\n break\n case LogLevel.WARN:\n levelColor = this._rgbaWarn\n break\n case LogLevel.ERROR:\n levelColor = this._rgbaError\n break\n case LogLevel.DEBUG:\n levelColor = this._rgbaDebug\n break\n }\n\n const linePrefix = displayLine.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textToDraw = displayLine.text\n const textAvailableWidth = this.consoleWidth - 1 - (displayLine.indent ? INDENT_WIDTH : 0)\n const showCursor = this.isFocused && lineY - 1 === this.currentLineIndex\n\n if (showCursor) {\n this.frameBuffer.drawText(\">\", 0, lineY, this._rgbaCursor, this.backgroundColor)\n } else {\n this.frameBuffer.drawText(\" \", 0, lineY, this._rgbaDefault, this.backgroundColor)\n }\n\n const fullText = `${linePrefix}${textToDraw.substring(0, textAvailableWidth)}`\n const selectionRange = this.getLineSelectionRange(absoluteLineIndex)\n\n if (selectionRange) {\n const adjustedStart = Math.max(0, selectionRange.start)\n const adjustedEnd = Math.min(fullText.length, selectionRange.end)\n\n if (adjustedStart > 0) {\n this.frameBuffer.drawText(fullText.substring(0, adjustedStart), 1, lineY, levelColor)\n }\n\n if (adjustedStart < adjustedEnd) {\n this.frameBuffer.fillRect(1 + adjustedStart, lineY, adjustedEnd - adjustedStart, 1, this._rgbaSelection)\n this.frameBuffer.drawText(\n fullText.substring(adjustedStart, adjustedEnd),\n 1 + adjustedStart,\n lineY,\n levelColor,\n this._rgbaSelection,\n )\n }\n\n if (adjustedEnd < fullText.length) {\n this.frameBuffer.drawText(fullText.substring(adjustedEnd), 1 + adjustedEnd, lineY, levelColor)\n }\n } else {\n this.frameBuffer.drawText(fullText, 1, lineY, levelColor)\n }\n\n lineY++\n }\n }\n\n public renderToBuffer(buffer: OptimizedBuffer): void {\n if (!this.isVisible || !this.frameBuffer) return\n\n if (this._needsFrameBufferUpdate) {\n this.updateFrameBuffer()\n this._needsFrameBufferUpdate = false\n }\n\n buffer.drawFrameBuffer(this.consoleX, this.consoleY, this.frameBuffer)\n }\n\n public setDebugMode(enabled: boolean): void {\n this._debugModeEnabled = enabled\n terminalConsoleCache.setCollectCallerInfo(enabled)\n if (this.isVisible) {\n this.markNeedsRerender()\n }\n }\n\n public toggleDebugMode(): void {\n this.setDebugMode(!this._debugModeEnabled)\n }\n\n public set keyBindings(bindings: ConsoleKeyBinding[]) {\n this._keyBindings = bindings\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, bindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this.markNeedsRerender()\n }\n\n public set keyAliasMap(aliases: KeyAliasMap) {\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, aliases)\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this.markNeedsRerender()\n }\n\n public set onCopySelection(callback: ((text: string) => void) | undefined) {\n this.options.onCopySelection = callback\n }\n\n public get onCopySelection(): ((text: string) => void) | undefined {\n return this.options.onCopySelection\n }\n\n private _scrollToBottom(forceCursorToLastLine: boolean = false): void {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n this.scrollTopIndex = maxScrollTop\n this.isScrolledToBottom = true\n\n const visibleLineCount = Math.min(logAreaHeight, displayLineCount - this.scrollTopIndex)\n if (forceCursorToLastLine || this.currentLineIndex >= visibleLineCount) {\n this.currentLineIndex = Math.max(0, visibleLineCount - 1)\n }\n }\n\n private _processLogEntry(logEntry: [Date, LogLevel, any[], CallerInfo | null]): DisplayLine[] {\n const [date, level, args, callerInfo] = logEntry\n const displayLines: DisplayLine[] = []\n\n const timestamp = this.formatTimestamp(date)\n const callerSource = callerInfo ? `${callerInfo.fileName}:${callerInfo.lineNumber}` : \"unknown\"\n const prefix = `[${timestamp}] [${level}]` + (this._debugModeEnabled ? ` [${callerSource}]` : \"\") + \" \"\n\n const formattedArgs = this.formatArguments(args)\n const initialLines = formattedArgs.split(\"\\n\")\n\n for (let i = 0; i < initialLines.length; i++) {\n const lineText = initialLines[i]\n const isFirstLineOfEntry = i === 0\n const availableWidth = this.consoleWidth - 1 - (isFirstLineOfEntry ? 0 : INDENT_WIDTH)\n const linePrefix = isFirstLineOfEntry ? prefix : \" \".repeat(INDENT_WIDTH)\n const textToWrap = isFirstLineOfEntry ? linePrefix + lineText : lineText\n\n let currentPos = 0\n while (currentPos < textToWrap.length || (isFirstLineOfEntry && currentPos === 0 && textToWrap.length === 0)) {\n const segment = textToWrap.substring(currentPos, currentPos + availableWidth)\n const isFirstSegmentOfLine = currentPos === 0\n\n displayLines.push({\n text: isFirstSegmentOfLine && !isFirstLineOfEntry ? linePrefix + segment : segment,\n level: level,\n indent: !isFirstLineOfEntry || !isFirstSegmentOfLine,\n })\n\n currentPos += availableWidth\n if (isFirstLineOfEntry && currentPos === 0 && textToWrap.length === 0) break\n }\n }\n\n return displayLines\n }\n\n private _processCachedLogs(): void {\n const logsToProcess = [...terminalConsoleCache.cachedLogs]\n terminalConsoleCache.clearConsole()\n\n this._allLogEntries.push(...logsToProcess)\n\n if (this._allLogEntries.length > this.options.maxStoredLogs) {\n this._allLogEntries.splice(0, this._allLogEntries.length - this.options.maxStoredLogs)\n }\n\n for (const logEntry of logsToProcess) {\n const processed = this._processLogEntry(logEntry)\n this._displayLines.push(...processed)\n }\n\n if (this._displayLines.length > this.options.maxDisplayLines) {\n this._displayLines.splice(0, this._displayLines.length - this.options.maxDisplayLines)\n }\n }\n\n private hasSelection(): boolean {\n if (this._selectionStart === null || this._selectionEnd === null) return false\n\n return this._selectionStart.line !== this._selectionEnd.line || this._selectionStart.col !== this._selectionEnd.col\n }\n\n private normalizeSelection(): ConsoleSelection | null {\n if (!this._selectionStart || !this._selectionEnd) return null\n\n const start = this._selectionStart\n const end = this._selectionEnd\n\n const startBeforeEnd = start.line < end.line || (start.line === end.line && start.col <= end.col)\n\n if (startBeforeEnd) {\n return {\n startLine: start.line,\n startCol: start.col,\n endLine: end.line,\n endCol: end.col,\n }\n } else {\n return {\n startLine: end.line,\n startCol: end.col,\n endLine: start.line,\n endCol: start.col,\n }\n }\n }\n\n private getSelectedText(): string {\n const selection = this.normalizeSelection()\n if (!selection) return \"\"\n\n const lines: string[] = []\n for (let i = selection.startLine; i <= selection.endLine; i++) {\n if (i < 0 || i >= this._displayLines.length) continue\n const line = this._displayLines[i]\n const linePrefix = line.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textAvailableWidth = this.consoleWidth - 1 - (line.indent ? INDENT_WIDTH : 0)\n const fullText = linePrefix + line.text.substring(0, textAvailableWidth)\n let text = fullText\n\n if (i === selection.startLine && i === selection.endLine) {\n text = fullText.substring(selection.startCol, selection.endCol)\n } else if (i === selection.startLine) {\n text = fullText.substring(selection.startCol)\n } else if (i === selection.endLine) {\n text = fullText.substring(0, selection.endCol)\n }\n\n lines.push(text)\n }\n\n return lines.join(\"\\n\")\n }\n\n private clearSelection(): void {\n this._selectionStart = null\n this._selectionEnd = null\n this._isDragging = false\n this.stopAutoScroll()\n }\n\n private stopAutoScroll(): void {\n if (this._autoScrollInterval !== null) {\n this.clock.clearInterval(this._autoScrollInterval)\n this._autoScrollInterval = null\n }\n }\n\n private startAutoScroll(direction: \"up\" | \"down\"): void {\n this.stopAutoScroll()\n this._autoScrollInterval = this.clock.setInterval(() => {\n if (direction === \"up\") {\n if (this.scrollTopIndex > 0) {\n this.scrollTopIndex--\n this.isScrolledToBottom = false\n if (this._selectionEnd) {\n this._selectionEnd = {\n line: this.scrollTopIndex,\n col: this._selectionEnd.col,\n }\n }\n this.markNeedsRerender()\n } else {\n this.stopAutoScroll()\n }\n } else {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n if (this.scrollTopIndex < maxScrollTop) {\n this.scrollTopIndex++\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n if (this._selectionEnd) {\n const maxLine = this.scrollTopIndex + logAreaHeight - 1\n this._selectionEnd = {\n line: Math.min(maxLine, displayLineCount - 1),\n col: this._selectionEnd.col,\n }\n }\n this.markNeedsRerender()\n } else {\n this.stopAutoScroll()\n }\n }\n }, 50)\n }\n\n private triggerCopy(): void {\n if (!this.hasSelection()) return\n const text = this.getSelectedText()\n if (text && this.options.onCopySelection) {\n try {\n this.options.onCopySelection(text)\n } catch {}\n this.clearSelection()\n this.markNeedsRerender()\n }\n }\n\n private getLineSelectionRange(lineIndex: number): { start: number; end: number } | null {\n const selection = this.normalizeSelection()\n if (!selection) return null\n\n if (lineIndex < selection.startLine || lineIndex > selection.endLine) {\n return null\n }\n\n const line = this._displayLines[lineIndex]\n if (!line) return null\n\n const linePrefix = line.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textAvailableWidth = this.consoleWidth - 1 - (line.indent ? INDENT_WIDTH : 0)\n const fullTextLength = linePrefix.length + Math.min(line.text.length, textAvailableWidth)\n\n let start = 0\n let end = fullTextLength\n\n if (lineIndex === selection.startLine) {\n start = Math.max(0, selection.startCol)\n }\n if (lineIndex === selection.endLine) {\n end = Math.min(fullTextLength, selection.endCol)\n }\n\n if (start >= end) return null\n return { start, end }\n }\n\n public handleMouse(event: MouseEvent): boolean {\n if (!this.isVisible) return false\n\n const localX = event.x - this.consoleX\n const localY = event.y - this.consoleY\n\n if (localX < 0 || localX >= this.consoleWidth || localY < 0 || localY >= this.consoleHeight) {\n return false\n }\n\n if (event.type === \"scroll\" && event.scroll) {\n if (event.scroll.direction === \"up\") {\n this.scrollUp()\n } else if (event.scroll.direction === \"down\") {\n this.scrollDown()\n }\n return true\n }\n\n if (localY === 0) {\n if (\n event.type === \"down\" &&\n event.button === 0 &&\n localX >= this._copyButtonBounds.x &&\n localX < this._copyButtonBounds.x + this._copyButtonBounds.width\n ) {\n this.triggerCopy()\n return true\n }\n return true\n }\n\n const lineIndex = this.scrollTopIndex + (localY - 1)\n const colIndex = Math.max(0, localX - 1)\n\n if (event.type === \"down\" && event.button === 0) {\n this.clearSelection()\n this._selectionStart = { line: lineIndex, col: colIndex }\n this._selectionEnd = { line: lineIndex, col: colIndex }\n this._isDragging = true\n this.markNeedsRerender()\n return true\n }\n\n if (event.type === \"drag\" && this._isDragging) {\n this._selectionEnd = { line: lineIndex, col: colIndex }\n\n // Check if drag is at the edge and trigger auto-scroll\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const relativeY = localY - 1 // Subtract 1 for title bar\n\n if (relativeY <= 0) {\n // Dragging at top edge\n this.startAutoScroll(\"up\")\n } else if (relativeY >= logAreaHeight - 1) {\n // Dragging at bottom edge\n this.startAutoScroll(\"down\")\n } else {\n // Not at edge, stop auto-scrolling\n this.stopAutoScroll()\n }\n\n this.markNeedsRerender()\n return true\n }\n\n if (event.type === \"up\") {\n if (this._isDragging) {\n this._selectionEnd = { line: lineIndex, col: colIndex }\n this._isDragging = false\n this.stopAutoScroll()\n this.markNeedsRerender()\n }\n return true\n }\n\n return true\n }\n\n public get visible(): boolean {\n return this.isVisible\n }\n\n public get bounds(): { x: number; y: number; width: number; height: number } {\n return {\n x: this.consoleX,\n y: this.consoleY,\n width: this.consoleWidth,\n height: this.consoleHeight,\n }\n }\n\n private saveLogsToFile(): void {\n try {\n const timestamp = Date.now()\n const filename = `_console_${timestamp}.log`\n const filepath = path.join(process.cwd(), filename)\n\n const allLogEntries = [...this._allLogEntries, ...terminalConsoleCache.cachedLogs]\n\n const logLines: string[] = []\n\n for (const [date, level, args, callerInfo] of allLogEntries) {\n const timestampStr = this.formatTimestamp(date)\n const callerSource = callerInfo ? `${callerInfo.fileName}:${callerInfo.lineNumber}` : \"unknown\"\n const prefix = `[${timestampStr}] [${level}]` + (this._debugModeEnabled ? ` [${callerSource}]` : \"\") + \" \"\n const formattedArgs = this.formatArguments(args)\n logLines.push(prefix + formattedArgs)\n }\n\n const content = logLines.join(\"\\n\")\n fs.writeFileSync(filepath, content, \"utf8\")\n\n console.info(`Console logs saved to: ${filename}`)\n } catch (error) {\n console.error(`Failed to save console logs:`, error)\n }\n }\n}\n",
|
|
62
|
+
"import { Writable } from \"stream\"\nimport { EventEmitter } from \"events\"\n\nexport type CapturedOutput = {\n stream: \"stdout\" | \"stderr\"\n output: string\n}\n\nexport class Capture extends EventEmitter {\n // TODO: Cache could rather be a buffer to avoid join()?\n private output: CapturedOutput[] = []\n\n constructor() {\n super()\n }\n\n get size(): number {\n return this.output.length\n }\n\n write(stream: \"stdout\" | \"stderr\", data: string): void {\n this.output.push({ stream, output: data })\n this.emit(\"write\", stream, data)\n }\n\n claimOutput() {\n const output = this.output.map((o) => o.output).join(\"\")\n this.clear()\n return output\n }\n\n private clear(): void {\n this.output = []\n }\n}\n\nexport class CapturedWritableStream extends Writable {\n public isTTY: boolean = true\n public columns: number = process.stdout.columns || 80\n public rows: number = process.stdout.rows || 24\n\n constructor(\n private stream: \"stdout\" | \"stderr\",\n private capture: Capture,\n ) {\n super()\n }\n\n override _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n const data = chunk.toString()\n this.capture.write(this.stream, data)\n callback()\n }\n\n getColorDepth(): number {\n return process.stdout.getColorDepth?.() || 8\n }\n}\n",
|
|
63
|
+
"export interface KeyBindingLike {\n name: string\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n}\n\nexport interface KeyBinding<Action extends string = string> extends KeyBindingLike {\n action: Action\n}\n\nexport interface KeyBindingLookup extends KeyBindingLike {\n // Kitty's base-layout codepoint as a Unicode number. Example: 99 means \"c\".\n baseCode?: number\n}\n\nexport type KeyAliasMap = Record<string, string>\n\nexport const defaultKeyAliases: KeyAliasMap = {\n enter: \"return\",\n esc: \"escape\",\n kp0: \"0\",\n kp1: \"1\",\n kp2: \"2\",\n kp3: \"3\",\n kp4: \"4\",\n kp5: \"5\",\n kp6: \"6\",\n kp7: \"7\",\n kp8: \"8\",\n kp9: \"9\",\n kpdecimal: \".\",\n kpdivide: \"/\",\n kpmultiply: \"*\",\n kpminus: \"-\",\n kpplus: \"+\",\n kpenter: \"enter\",\n kpequal: \"=\",\n kpseparator: \",\",\n kpleft: \"left\",\n kpright: \"right\",\n kpup: \"up\",\n kpdown: \"down\",\n kppageup: \"pageup\",\n kppagedown: \"pagedown\",\n kphome: \"home\",\n kpend: \"end\",\n kpinsert: \"insert\",\n kpdelete: \"delete\",\n}\n\nexport function mergeKeyAliases(defaults: KeyAliasMap, custom: KeyAliasMap): KeyAliasMap {\n return { ...defaults, ...custom }\n}\n\nexport function mergeKeyBindings<Action extends string>(\n defaults: KeyBinding<Action>[],\n custom: KeyBinding<Action>[],\n): KeyBinding<Action>[] {\n const map = new Map<string, KeyBinding<Action>>()\n for (const binding of defaults) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding)\n }\n for (const binding of custom) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding)\n }\n return Array.from(map.values())\n}\n\nexport function getKeyBindingKey(binding: KeyBindingLike): string {\n return `${binding.name}:${binding.ctrl ? 1 : 0}:${binding.shift ? 1 : 0}:${binding.meta ? 1 : 0}:${binding.super ? 1 : 0}`\n}\n\n// `baseCode` is Kitty's \"base layout codepoint\": the character for the same\n// physical key on the keyboard's base layout. Example: an event may arrive as\n// `name: \"ㅊ\", baseCode: 99`, where `99` is Unicode `c`. We normalize that\n// numeric codepoint to the key names we store in key maps so Ctrl+ㅊ can still\n// match a Ctrl+C binding.\nfunction getBaseCodeKeyName(baseCode: number | undefined): string | undefined {\n if (baseCode === undefined || baseCode < 32 || baseCode === 127) {\n return undefined\n }\n\n try {\n const name = String.fromCodePoint(baseCode)\n\n if (name.length === 1 && name >= \"A\" && name <= \"Z\") {\n return name.toLowerCase()\n }\n\n return name\n } catch {\n return undefined\n }\n}\n\n// Return every lookup key that can represent this event. We try the parsed\n// name first, then the base-layout key when Kitty provides one. That keeps\n// direct character bindings precise, and still lets physical-layout\n// shortcuts resolve.\nexport function getKeyBindingKeys(binding: KeyBindingLookup): string[] {\n const names = new Set([binding.name])\n const baseCodeName = getBaseCodeKeyName(binding.baseCode)\n\n if (baseCodeName) {\n names.add(baseCodeName)\n }\n\n return [...names].map((name) => getKeyBindingKey({ ...binding, name }))\n}\n\nexport function getKeyBindingAction<Action extends string>(\n map: Map<string, Action>,\n binding: KeyBindingLookup,\n): Action | undefined {\n for (const key of getKeyBindingKeys(binding)) {\n const action = map.get(key)\n\n if (action !== undefined) {\n return action\n }\n }\n\n return undefined\n}\n\nexport function matchesKeyBinding(binding: KeyBindingLookup, match: KeyBindingLike): boolean {\n const matchKey = getKeyBindingKey(match)\n\n return getKeyBindingKeys(binding).includes(matchKey)\n}\n\nexport function buildKeyBindingsMap<Action extends string>(\n bindings: KeyBinding<Action>[],\n aliasMap?: KeyAliasMap,\n): Map<string, Action> {\n const map = new Map<string, Action>()\n const aliases = aliasMap || {}\n\n for (const binding of bindings) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding.action)\n }\n\n // Add aliased versions of all bindings\n for (const binding of bindings) {\n const normalizedName = aliases[binding.name] || binding.name\n if (normalizedName !== binding.name) {\n // Create aliased key with normalized name\n const aliasedKey = getKeyBindingKey({ ...binding, name: normalizedName })\n map.set(aliasedKey, binding.action)\n }\n }\n\n return map\n}\n\n/**\n * Converts a key binding to a human-readable string representation\n * @param binding The key binding to stringify\n * @returns A string like \"ctrl+shift+y\" or just \"escape\"\n * @example\n * keyBindingToString({ name: \"y\", ctrl: true, shift: true }) // \"ctrl+shift+y\"\n * keyBindingToString({ name: \"escape\" }) // \"escape\"\n * keyBindingToString({ name: \"c\", ctrl: true }) // \"ctrl+c\"\n * keyBindingToString({ name: \"s\", super: true }) // \"super+s\"\n */\nexport function keyBindingToString<Action extends string>(binding: KeyBinding<Action>): string {\n const parts: string[] = []\n\n if (binding.ctrl) parts.push(\"ctrl\")\n if (binding.shift) parts.push(\"shift\")\n if (binding.meta) parts.push(\"meta\")\n if (binding.super) parts.push(\"super\")\n\n parts.push(binding.name)\n\n return parts.join(\"+\")\n}\n",
|
|
64
|
+
"import { Renderable, type RenderableOptions } from \"../Renderable.js\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection.js\"\nimport { EditBuffer, type LogicalCursor } from \"../edit-buffer.js\"\nimport { EditorView, type VisualCursor } from \"../editor-view.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport type { RenderContext, Highlight, CursorStyleOptions, LineInfoProvider, LineInfo } from \"../types.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport { MeasureMode } from \"yoga-layout\"\nimport type { SyntaxStyle } from \"../syntax-style.js\"\n\nconst BrandedEditBufferRenderable: unique symbol = Symbol.for(\"@opentui/core/EditBufferRenderable\")\n\nexport type EditorCapture = \"escape\" | \"navigate\" | \"submit\" | \"tab\"\n\nexport interface EditorTraits {\n capture?: readonly EditorCapture[]\n suspend?: boolean\n status?: string\n}\n\nexport enum EditBufferRenderableEvents {\n TRAITS_CHANGED = \"traits-changed\",\n}\n\nfunction sameCapture(a?: readonly EditorCapture[], b?: readonly EditorCapture[]) {\n if (a === b) return true\n if (!a || !b) return !a && !b\n if (a.length !== b.length) return false\n return a.every((item, i) => item === b[i])\n}\n\nfunction sameTraits(a: EditorTraits, b: EditorTraits) {\n return a.suspend === b.suspend && a.status === b.status && sameCapture(a.capture, b.capture)\n}\n\nexport function isEditBufferRenderable(obj: unknown): obj is EditBufferRenderable {\n return !!(obj && typeof obj === \"object\" && BrandedEditBufferRenderable in obj)\n}\n\nexport interface CursorChangeEvent {\n line: number\n visualColumn: number\n}\n\nexport interface ContentChangeEvent {\n // No payload - use getText() to retrieve content if needed\n}\n\nexport interface EditBufferOptions extends RenderableOptions<EditBufferRenderable> {\n textColor?: string | RGBA\n backgroundColor?: string | RGBA\n selectionBg?: string | RGBA\n selectionFg?: string | RGBA\n selectable?: boolean\n attributes?: number\n wrapMode?: \"none\" | \"char\" | \"word\"\n scrollMargin?: number\n scrollSpeed?: number\n showCursor?: boolean\n cursorColor?: string | RGBA\n cursorStyle?: CursorStyleOptions\n syntaxStyle?: SyntaxStyle\n tabIndicator?: string | number\n tabIndicatorColor?: string | RGBA\n onCursorChange?: (event: CursorChangeEvent) => void\n onContentChange?: (event: ContentChangeEvent) => void\n}\n\nexport abstract class EditBufferRenderable extends Renderable implements LineInfoProvider {\n [BrandedEditBufferRenderable] = true\n protected override _focusable: boolean = true\n public override selectable: boolean = true\n private _traits: EditorTraits = {}\n\n protected _textColor: RGBA\n protected _backgroundColor: RGBA\n protected _defaultAttributes: number\n protected _selectionBg: RGBA | undefined\n protected _selectionFg: RGBA | undefined\n protected _wrapMode: \"none\" | \"char\" | \"word\" = \"word\"\n protected _scrollMargin: number = 0.2\n protected _showCursor: boolean = true\n protected _cursorColor: RGBA\n protected _cursorStyle: CursorStyleOptions\n protected lastLocalSelection: LocalSelectionBounds | null = null\n protected _tabIndicator?: string | number\n protected _tabIndicatorColor?: RGBA\n\n private _cursorChangeListener: ((event: CursorChangeEvent) => void) | undefined = undefined\n private _contentChangeListener: ((event: ContentChangeEvent) => void) | undefined = undefined\n\n private _autoScrollVelocity: number = 0\n private _autoScrollAccumulator: number = 0\n private _scrollSpeed: number = 16\n private _keyboardSelectionActive: boolean = false\n\n public readonly editBuffer: EditBuffer\n public readonly editorView: EditorView\n\n protected _defaultOptions = {\n textColor: RGBA.fromValues(1, 1, 1, 1),\n backgroundColor: \"transparent\",\n selectionBg: undefined,\n selectionFg: undefined,\n selectable: true,\n attributes: 0,\n wrapMode: \"word\" as \"none\" | \"char\" | \"word\",\n scrollMargin: 0.2,\n scrollSpeed: 16,\n showCursor: true,\n cursorColor: RGBA.fromValues(1, 1, 1, 1),\n cursorStyle: {\n style: \"block\",\n blinking: true,\n },\n tabIndicator: undefined,\n tabIndicatorColor: undefined,\n } satisfies Partial<EditBufferOptions>\n\n constructor(ctx: RenderContext, options: EditBufferOptions) {\n super(ctx, options)\n\n this._textColor = parseColor(options.textColor ?? this._defaultOptions.textColor)\n this._backgroundColor = parseColor(options.backgroundColor ?? this._defaultOptions.backgroundColor)\n this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : this._defaultOptions.selectionBg\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : this._defaultOptions.selectionFg\n this.selectable = options.selectable ?? this._defaultOptions.selectable\n this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode\n this._scrollMargin = options.scrollMargin ?? this._defaultOptions.scrollMargin\n this._scrollSpeed = options.scrollSpeed ?? this._defaultOptions.scrollSpeed\n this._showCursor = options.showCursor ?? this._defaultOptions.showCursor\n this._cursorColor = parseColor(options.cursorColor ?? this._defaultOptions.cursorColor)\n this._cursorStyle = options.cursorStyle ?? this._defaultOptions.cursorStyle\n this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator\n this._tabIndicatorColor = options.tabIndicatorColor\n ? parseColor(options.tabIndicatorColor)\n : this._defaultOptions.tabIndicatorColor\n\n this.editBuffer = EditBuffer.create(this._ctx.widthMethod)\n this.editorView = EditorView.create(this.editBuffer, this.width || 80, this.height || 24)\n\n this.editorView.setWrapMode(this._wrapMode)\n this.editorView.setScrollMargin(this._scrollMargin)\n\n this.editBuffer.setDefaultFg(this._textColor)\n this.editBuffer.setDefaultBg(this._backgroundColor)\n this.editBuffer.setDefaultAttributes(this._defaultAttributes)\n\n if (options.syntaxStyle) {\n this.editBuffer.setSyntaxStyle(options.syntaxStyle)\n }\n\n if (this._tabIndicator !== undefined) {\n this.editorView.setTabIndicator(this._tabIndicator)\n }\n if (this._tabIndicatorColor !== undefined) {\n this.editorView.setTabIndicatorColor(this._tabIndicatorColor)\n }\n\n this.setupMeasureFunc()\n this.setupEventListeners(options)\n }\n\n public get lineInfo(): LineInfo {\n return this.editorView.getLogicalLineInfo()\n }\n\n private setupEventListeners(options: EditBufferOptions): void {\n this._cursorChangeListener = options.onCursorChange\n this._contentChangeListener = options.onContentChange\n\n this.editBuffer.on(\"cursor-changed\", () => {\n if (this._cursorChangeListener) {\n const cursor = this.editBuffer.getCursorPosition()\n this._cursorChangeListener({\n line: cursor.row,\n visualColumn: cursor.col,\n })\n }\n })\n\n this.editBuffer.on(\"content-changed\", () => {\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n if (this._contentChangeListener) {\n this._contentChangeListener({})\n }\n })\n }\n\n public get lineCount(): number {\n return this.editBuffer.getLineCount()\n }\n\n public get virtualLineCount(): number {\n return this.editorView.getVirtualLineCount()\n }\n\n public get scrollY(): number {\n return this.editorView.getViewport().offsetY\n }\n\n get plainText(): string {\n return this.editBuffer.getText()\n }\n\n get logicalCursor(): LogicalCursor {\n return this.editBuffer.getCursorPosition()\n }\n\n get visualCursor(): VisualCursor {\n return this.editorView.getVisualCursor()\n }\n\n get cursorOffset(): number {\n return this.editorView.getVisualCursor().offset\n }\n\n set cursorOffset(offset: number) {\n this.editorView.setCursorByOffset(offset)\n this.requestRender()\n }\n\n get cursorCharacterOffset(): number | undefined {\n const len = this.plainText.length\n if (len <= 0) return\n\n const cursor = this.logicalCursor\n const offset = this.cursorOffset\n if (offset >= len) {\n if (cursor.col > 0) return len - 1\n return 0\n }\n\n if (this.plainText[offset] === \"\\n\" && cursor.col > 0) {\n return offset - 1\n }\n\n return offset\n }\n\n get textColor(): RGBA {\n return this._textColor\n }\n\n set textColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.textColor)\n if (this._textColor !== newColor) {\n this._textColor = newColor\n this.editBuffer.setDefaultFg(newColor)\n this.requestRender()\n }\n }\n\n get selectionBg(): RGBA | undefined {\n return this._selectionBg\n }\n\n get traits(): EditorTraits {\n return this._traits\n }\n\n set traits(value: EditorTraits) {\n if (sameTraits(this._traits, value)) return\n const prev = this._traits\n this._traits = value\n this.emit(EditBufferRenderableEvents.TRAITS_CHANGED, value, prev)\n }\n\n set selectionBg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionBg\n if (this._selectionBg !== newColor) {\n this._selectionBg = newColor\n this.refreshSelectionStyle()\n this.requestRender()\n }\n }\n\n get selectionFg(): RGBA | undefined {\n return this._selectionFg\n }\n\n set selectionFg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionFg\n if (this._selectionFg !== newColor) {\n this._selectionFg = newColor\n this.refreshSelectionStyle()\n this.requestRender()\n }\n }\n\n get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n set backgroundColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.backgroundColor)\n if (this._backgroundColor !== newColor) {\n this._backgroundColor = newColor\n this.editBuffer.setDefaultBg(newColor)\n this.requestRender()\n }\n }\n\n get attributes(): number {\n return this._defaultAttributes\n }\n\n set attributes(value: number) {\n if (this._defaultAttributes !== value) {\n this._defaultAttributes = value\n this.editBuffer.setDefaultAttributes(value)\n this.requestRender()\n }\n }\n\n get wrapMode(): \"none\" | \"char\" | \"word\" {\n return this._wrapMode\n }\n\n set wrapMode(value: \"none\" | \"char\" | \"word\") {\n if (this._wrapMode !== value) {\n this._wrapMode = value\n this.editorView.setWrapMode(value)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n\n get showCursor(): boolean {\n return this._showCursor\n }\n\n set showCursor(value: boolean) {\n if (this._showCursor !== value) {\n this._showCursor = value\n if (!value && this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n }\n this.requestRender()\n }\n }\n\n get cursorColor(): RGBA {\n return this._cursorColor\n }\n\n set cursorColor(value: RGBA | string) {\n const newColor = parseColor(value)\n if (this._cursorColor !== newColor) {\n this._cursorColor = newColor\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n get cursorStyle(): CursorStyleOptions {\n return this._cursorStyle\n }\n\n set cursorStyle(style: CursorStyleOptions) {\n const newStyle = style\n if (this.cursorStyle.style !== newStyle.style || this.cursorStyle.blinking !== newStyle.blinking) {\n this._cursorStyle = newStyle\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n get tabIndicator(): string | number | undefined {\n return this._tabIndicator\n }\n\n set tabIndicator(value: string | number | undefined) {\n if (this._tabIndicator !== value) {\n this._tabIndicator = value\n if (value !== undefined) {\n this.editorView.setTabIndicator(value)\n }\n this.requestRender()\n }\n }\n\n get tabIndicatorColor(): RGBA | undefined {\n return this._tabIndicatorColor\n }\n\n set tabIndicatorColor(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : undefined\n if (this._tabIndicatorColor !== newColor) {\n this._tabIndicatorColor = newColor\n if (newColor !== undefined) {\n this.editorView.setTabIndicatorColor(newColor)\n }\n this.requestRender()\n }\n }\n\n get scrollSpeed(): number {\n return this._scrollSpeed\n }\n\n set scrollSpeed(value: number) {\n this._scrollSpeed = Math.max(0, value)\n }\n\n protected override onMouseEvent(event: any): void {\n if (event.type === \"scroll\") {\n this.handleScroll(event)\n }\n }\n\n protected handleScroll(event: any): void {\n if (!event.scroll) return\n\n const { direction, delta } = event.scroll\n const viewport = this.editorView.getViewport()\n\n if (direction === \"up\") {\n const newOffsetY = Math.max(0, viewport.offsetY - delta)\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, true)\n this.requestRender()\n } else if (direction === \"down\") {\n const totalVirtualLines = this.editorView.getTotalVirtualLineCount()\n const maxOffsetY = Math.max(0, totalVirtualLines - viewport.height)\n const newOffsetY = Math.min(viewport.offsetY + delta, maxOffsetY)\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, true)\n this.requestRender()\n }\n\n if (this._wrapMode === \"none\") {\n if (direction === \"left\") {\n const newOffsetX = Math.max(0, viewport.offsetX - delta)\n this.editorView.setViewport(newOffsetX, viewport.offsetY, viewport.width, viewport.height, true)\n this.requestRender()\n } else if (direction === \"right\") {\n const newOffsetX = viewport.offsetX + delta\n this.editorView.setViewport(newOffsetX, viewport.offsetY, viewport.width, viewport.height, true)\n this.requestRender()\n }\n }\n }\n\n protected override onResize(width: number, height: number): void {\n this.editorView.setViewportSize(width, height)\n }\n\n protected refreshLocalSelection(): boolean {\n if (this.lastLocalSelection) {\n return this.updateLocalSelection(this.lastLocalSelection)\n }\n return false\n }\n\n private updateLocalSelection(localSelection: LocalSelectionBounds | null): boolean {\n if (!localSelection?.isActive) {\n this.editorView.resetLocalSelection()\n return true\n }\n return this.editorView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n false,\n )\n }\n\n override shouldStartSelection(x: number, y: number): boolean {\n if (!this.selectable) return false\n\n const localX = x - this.x\n const localY = y - this.y\n\n return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height\n }\n\n override onSelectionChanged(selection: Selection | null): boolean {\n const localSelection = convertGlobalToLocalSelection(selection, this.x, this.y)\n this.lastLocalSelection = localSelection\n\n const updateCursor = true\n const followCursor = this._keyboardSelectionActive\n\n let changed: boolean\n if (!localSelection?.isActive) {\n this._keyboardSelectionActive = false\n this.editorView.resetLocalSelection()\n changed = true\n } else if (selection?.isStart) {\n changed = this.editorView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n updateCursor,\n followCursor,\n )\n } else {\n changed = this.editorView.updateLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n updateCursor,\n followCursor,\n )\n }\n\n if (changed && localSelection?.isActive && selection?.isDragging) {\n const viewport = this.editorView.getViewport()\n const focusY = localSelection.focusY\n const scrollMargin = Math.max(1, Math.floor(viewport.height * this._scrollMargin))\n\n if (focusY < scrollMargin) {\n this._autoScrollVelocity = -this._scrollSpeed\n } else if (focusY >= viewport.height - scrollMargin) {\n this._autoScrollVelocity = this._scrollSpeed\n } else {\n this._autoScrollVelocity = 0\n }\n } else {\n this._keyboardSelectionActive = false\n this._autoScrollVelocity = 0\n this._autoScrollAccumulator = 0\n }\n\n if (changed) {\n this.requestRender()\n }\n\n return this.hasSelection()\n }\n\n protected override onUpdate(deltaTime: number): void {\n super.onUpdate(deltaTime)\n\n if (this._autoScrollVelocity !== 0 && this.hasSelection()) {\n const deltaSeconds = deltaTime / 1000\n this._autoScrollAccumulator += this._autoScrollVelocity * deltaSeconds\n\n const linesToScroll = Math.floor(Math.abs(this._autoScrollAccumulator))\n if (linesToScroll > 0) {\n const direction = this._autoScrollVelocity > 0 ? 1 : -1\n const viewport = this.editorView.getViewport()\n const totalVirtualLines = this.editorView.getTotalVirtualLineCount()\n const maxOffsetY = Math.max(0, totalVirtualLines - viewport.height)\n const newOffsetY = Math.max(0, Math.min(viewport.offsetY + direction * linesToScroll, maxOffsetY))\n\n if (newOffsetY !== viewport.offsetY) {\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, false)\n\n this._ctx.requestSelectionUpdate()\n }\n\n this._autoScrollAccumulator -= direction * linesToScroll\n }\n }\n }\n\n override getSelectedText(): string {\n return this.editorView.getSelectedText()\n }\n\n override hasSelection(): boolean {\n return this.editorView.hasSelection()\n }\n\n getSelection(): { start: number; end: number } | null {\n return this.editorView.getSelection()\n }\n\n private refreshSelectionStyle(): void {\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n return\n }\n\n const selection = this.getSelection()\n if (!selection) return\n this.editorView.setSelection(selection.start, selection.end, this._selectionBg, this._selectionFg)\n }\n\n private deleteSelectedText(): void {\n this.editorView.deleteSelectedText()\n this._ctx.clearSelection()\n this.requestRender()\n }\n\n setSelection(start: number, end: number): void {\n this.lastLocalSelection = null\n this.editorView.resetLocalSelection()\n this._ctx.clearSelection()\n this.editorView.setSelection(start, end, this._selectionBg, this._selectionFg)\n this.requestRender()\n }\n\n setSelectionInclusive(start: number, end: number): void {\n this.setSelection(Math.min(start, end), Math.max(start, end) + 1)\n }\n\n clearSelection(): boolean {\n const had = this.hasSelection()\n this.lastLocalSelection = null\n this.editorView.resetSelection()\n this.editorView.resetLocalSelection()\n this._ctx.clearSelection()\n if (had) {\n this.requestRender()\n }\n return had\n }\n\n deleteSelection(): boolean {\n if (!this.hasSelection()) return false\n\n this.lastLocalSelection = null\n this.deleteSelectedText()\n return true\n }\n\n setCursor(row: number, col: number): void {\n this.editBuffer.setCursor(row, col)\n this.requestRender()\n }\n\n public insertChar(char: string): void {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n }\n\n this.editBuffer.insertChar(char)\n this.requestRender()\n }\n\n public insertText(text: string): void {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n }\n\n this.editBuffer.insertText(text)\n this.requestRender()\n }\n\n public deleteChar(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n this._ctx.clearSelection()\n this.editBuffer.deleteChar()\n this.requestRender()\n return true\n }\n\n public deleteCharBackward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n this._ctx.clearSelection()\n this.editBuffer.deleteCharBackward()\n this.requestRender()\n return true\n }\n\n public newLine(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.newLine()\n this.requestRender()\n return true\n }\n\n public deleteLine(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.deleteLine()\n this.requestRender()\n return true\n }\n\n public moveCursorLeft(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n\n if (!select && this.hasSelection()) {\n const selection = this.getSelection()!\n this.editBuffer.setCursorByOffset(selection.start)\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n this.updateSelectionForMovement(select, true)\n this.editBuffer.moveCursorLeft()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorRight(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n\n if (!select && this.hasSelection()) {\n const selection = this.getSelection()!\n const targetOffset = this.cursorOffset === selection.start ? selection.end - 1 : selection.end\n this.editBuffer.setCursorByOffset(targetOffset)\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n this.updateSelectionForMovement(select, true)\n this.editBuffer.moveCursorRight()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorUp(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editorView.moveUpVisual()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorDown(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editorView.moveDownVisual()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoLine(line: number): void {\n this.editBuffer.gotoLine(line)\n this.requestRender()\n }\n\n public gotoLineStart(): void {\n this.setCursor(this.logicalCursor.row, 0)\n }\n\n public gotoLineTextEnd(): void {\n const eol = this.editBuffer.getEOL()\n this.setCursor(eol.row, eol.col)\n }\n\n public gotoLineHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const cursor = this.editorView.getCursor()\n if (cursor.col === 0 && cursor.row > 0) {\n this.editBuffer.setCursor(cursor.row - 1, 0)\n const prevLineEol = this.editBuffer.getEOL()\n this.editBuffer.setCursor(prevLineEol.row, prevLineEol.col)\n } else {\n this.editBuffer.setCursor(cursor.row, 0)\n }\n\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoLineEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const cursor = this.editorView.getCursor()\n const eol = this.editBuffer.getEOL()\n const lineCount = this.editBuffer.getLineCount()\n if (cursor.col === eol.col && cursor.row < lineCount - 1) {\n this.editBuffer.setCursor(cursor.row + 1, 0)\n } else {\n this.editBuffer.setCursor(eol.row, eol.col)\n }\n\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoVisualLineHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const sol = this.editorView.getVisualSOL()\n this.editBuffer.setCursor(sol.logicalRow, sol.logicalCol)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoVisualLineEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const eol = this.editorView.getVisualEOL()\n this.editBuffer.setCursor(eol.logicalRow, eol.logicalCol)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoBufferHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editBuffer.setCursor(0, 0)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoBufferEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editBuffer.gotoLine(999999)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public selectAll(): boolean {\n this.updateSelectionForMovement(false, true)\n this.editBuffer.setCursor(0, 0)\n return this.gotoBufferEnd({ select: true })\n }\n\n public deleteToLineEnd(): boolean {\n const cursor = this.editorView.getCursor()\n const eol = this.editBuffer.getEOL()\n\n if (eol.col > cursor.col) {\n this.editBuffer.deleteRange(cursor.row, cursor.col, eol.row, eol.col)\n }\n\n this.requestRender()\n return true\n }\n\n public deleteToLineStart(): boolean {\n const cursor = this.editorView.getCursor()\n\n if (cursor.col > 0) {\n this.editBuffer.deleteRange(cursor.row, 0, cursor.row, cursor.col)\n } else if (cursor.row > 0) {\n this.editBuffer.deleteCharBackward()\n }\n\n this.requestRender()\n return true\n }\n\n public undo(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.undo()\n this.requestRender()\n return true\n }\n\n public redo(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.redo()\n this.requestRender()\n return true\n }\n\n public moveWordForward(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const nextWord = this.editBuffer.getNextWordBoundary()\n this.editBuffer.setCursorByOffset(nextWord.offset)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveWordBackward(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const prevWord = this.editBuffer.getPrevWordBoundary()\n this.editBuffer.setCursorByOffset(prevWord.offset)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public deleteWordForward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n const currentCursor = this.editBuffer.getCursorPosition()\n const nextWord = this.editBuffer.getNextWordBoundary()\n\n if (nextWord.offset > currentCursor.offset) {\n this.editBuffer.deleteRange(currentCursor.row, currentCursor.col, nextWord.row, nextWord.col)\n }\n\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n public deleteWordBackward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n const currentCursor = this.editBuffer.getCursorPosition()\n const prevWord = this.editBuffer.getPrevWordBoundary()\n\n if (prevWord.offset < currentCursor.offset) {\n this.editBuffer.deleteRange(prevWord.row, prevWord.col, currentCursor.row, currentCursor.col)\n }\n\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n // Undefined = 0,\n // Exactly = 1,\n // AtMost = 2\n private setupMeasureFunc(): void {\n const measureFunc = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n ): { width: number; height: number } => {\n // When widthMode is Undefined, Yoga is asking for the intrinsic/natural width\n // Pass width=0 to measureForDimensions to signal we want max-content (no wrapping)\n // The Zig code treats width=0 with wrap_mode != none as null wrap_width,\n // which triggers no-wrap mode and returns the text's intrinsic width\n let effectiveWidth: number\n if (widthMode === MeasureMode.Undefined || isNaN(width)) {\n effectiveWidth = 0\n } else {\n effectiveWidth = width\n }\n\n const effectiveHeight = isNaN(height) ? 1 : height\n\n const measureResult = this.editorView.measureForDimensions(\n Math.floor(effectiveWidth),\n Math.floor(effectiveHeight),\n )\n\n const measuredWidth = measureResult ? Math.max(1, measureResult.widthColsMax) : 1\n const measuredHeight = measureResult ? Math.max(1, measureResult.lineCount) : 1\n\n if (widthMode === MeasureMode.AtMost && this._positionType !== \"absolute\") {\n return {\n width: Math.min(effectiveWidth, measuredWidth),\n height: Math.min(effectiveHeight, measuredHeight),\n }\n }\n\n return {\n width: measuredWidth,\n height: measuredHeight,\n }\n }\n\n this.yogaNode.setMeasureFunc(measureFunc)\n }\n\n override render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n if (this.isDestroyed) return\n // Editor rendering/cursor placement reads absolute coordinates multiple\n // times per frame, so it benefits from the same cached screen position.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n this.renderSelf(buffer)\n this.renderCursor(buffer)\n }\n\n protected override renderSelf(buffer: OptimizedBuffer): void {\n buffer.drawEditorView(this.editorView, this.x, this.y)\n }\n\n protected renderCursor(buffer: OptimizedBuffer): void {\n if (!this._showCursor || !this._focused) return\n\n const visualCursor = this.editorView.getVisualCursor()\n const screenX = this._screenX\n const screenY = this._screenY\n\n const cursorX = screenX + visualCursor.visualCol + 1 // +1 for 1-based terminal coords\n const cursorY = screenY + visualCursor.visualRow + 1 // +1 for 1-based terminal coords\n\n this._ctx.setCursorPosition(cursorX, cursorY, true)\n this._ctx.setCursorStyle({ ...this._cursorStyle, color: this._cursorColor })\n }\n\n public focus(): void {\n super.focus()\n this._ctx.setCursorStyle({ ...this._cursorStyle, color: this._cursorColor })\n this.requestRender()\n }\n\n public blur(): void {\n super.blur()\n this._ctx.setCursorPosition(0, 0, false)\n this.requestRender()\n }\n\n protected onRemove(): void {\n if (this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n }\n }\n\n override destroy(): void {\n if (this.isDestroyed) return\n\n this.traits = {}\n\n if (this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n // Manually blur to unhook event handlers BEFORE setting destroyed flag\n // This prevents the guard in super.destroy() from skipping blur()\n this.blur()\n }\n\n // Destroy dependent resources in correct order BEFORE calling super\n // EditorView depends on EditBuffer, so destroy it first\n this.editorView.destroy()\n this.editBuffer.destroy()\n\n // Finally clean up parent resources\n // Note: super.destroy() will try to blur() again, but blur() has guards to prevent double-blur\n super.destroy()\n }\n\n public set onCursorChange(handler: ((event: CursorChangeEvent) => void) | undefined) {\n this._cursorChangeListener = handler\n }\n\n public get onCursorChange(): ((event: CursorChangeEvent) => void) | undefined {\n return this._cursorChangeListener\n }\n\n public set onContentChange(handler: ((event: ContentChangeEvent) => void) | undefined) {\n this._contentChangeListener = handler\n }\n\n public get onContentChange(): ((event: ContentChangeEvent) => void) | undefined {\n return this._contentChangeListener\n }\n\n get syntaxStyle(): SyntaxStyle | null {\n return this.editBuffer.getSyntaxStyle()\n }\n\n set syntaxStyle(style: SyntaxStyle | null) {\n this.editBuffer.setSyntaxStyle(style)\n this.requestRender()\n }\n\n public addHighlight(lineIdx: number, highlight: Highlight): void {\n this.editBuffer.addHighlight(lineIdx, highlight)\n this.requestRender()\n }\n\n public addHighlightByCharRange(highlight: Highlight): void {\n this.editBuffer.addHighlightByCharRange(highlight)\n this.requestRender()\n }\n\n public removeHighlightsByRef(hlRef: number): void {\n this.editBuffer.removeHighlightsByRef(hlRef)\n this.requestRender()\n }\n\n public clearLineHighlights(lineIdx: number): void {\n this.editBuffer.clearLineHighlights(lineIdx)\n this.requestRender()\n }\n\n public clearAllHighlights(): void {\n this.editBuffer.clearAllHighlights()\n this.requestRender()\n }\n\n public getLineHighlights(lineIdx: number): Array<Highlight> {\n return this.editBuffer.getLineHighlights(lineIdx)\n }\n\n /**\n * Set text and completely reset the buffer state (clears history, resets add_buffer).\n * Use this for initial text setting or when you want a clean slate.\n */\n public setText(text: string): void {\n this.editBuffer.setText(text)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n /**\n * Replace text while preserving undo history (creates an undo point).\n * Use this when you want the setText operation to be undoable.\n */\n public replaceText(text: string): void {\n this.editBuffer.replaceText(text)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public clear(): void {\n this.editBuffer.clear()\n this.editBuffer.clearAllHighlights()\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public deleteRange(startLine: number, startCol: number, endLine: number, endCol: number): void {\n this.editBuffer.deleteRange(startLine, startCol, endLine, endCol)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public getTextRange(startOffset: number, endOffset: number): string {\n return this.editBuffer.getTextRange(startOffset, endOffset)\n }\n\n public getTextRangeByCoords(startRow: number, startCol: number, endRow: number, endCol: number): string {\n return this.editBuffer.getTextRangeByCoords(startRow, startCol, endRow, endCol)\n }\n\n protected updateSelectionForMovement(shiftPressed: boolean, isBeforeMovement: boolean): void {\n if (!this.selectable) return\n\n if (!shiftPressed) {\n this._keyboardSelectionActive = false\n this._ctx.clearSelection()\n return\n }\n\n this._keyboardSelectionActive = true\n\n const visualCursor = this.editorView.getVisualCursor()\n const cursorX = this.x + visualCursor.visualCol\n const cursorY = this.y + visualCursor.visualRow\n\n if (isBeforeMovement) {\n if (!this._ctx.hasSelection) {\n this._ctx.startSelection(this, cursorX, cursorY)\n }\n return\n }\n\n this._ctx.updateSelection(this, cursorX, cursorY, { finishDragging: true })\n }\n}\n",
|
|
65
|
+
"export const ANSI = {\n switchToAlternateScreen: \"\\x1b[?1049h\",\n switchToMainScreen: \"\\x1b[?1049l\",\n reset: \"\\x1b[0m\",\n\n scrollDown: (lines: number) => `\\x1b[${lines}T`,\n scrollUp: (lines: number) => `\\x1b[${lines}S`,\n\n moveCursor: (row: number, col: number) => `\\x1b[${row};${col}H`,\n moveCursorAndClear: (row: number, col: number) => `\\x1b[${row};${col}H\\x1b[J`,\n\n setRgbBackground: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n resetBackground: \"\\x1b[49m\",\n\n // Bracketed paste mode\n bracketedPasteStart: \"\\u001b[200~\",\n bracketedPasteEnd: \"\\u001b[201~\",\n}\n",
|
|
66
|
+
"// OSC 52 clipboard support for terminal applications.\n// Delegates to native Zig implementation for ANSI sequence generation.\n\nimport type { Pointer } from \"bun:ffi\"\nimport type { RenderLib } from \"../zig.js\"\n\nexport enum ClipboardTarget {\n Clipboard = 0,\n Primary = 1,\n Secondary = 2,\n Query = 3,\n}\n\nexport function encodeOsc52Payload(text: string, encoder: TextEncoder = new TextEncoder()): Uint8Array {\n const base64 = Buffer.from(text).toString(\"base64\")\n return encoder.encode(base64)\n}\n\nexport class Clipboard {\n private lib: RenderLib\n private rendererPtr: Pointer\n\n constructor(lib: RenderLib, rendererPtr: Pointer) {\n this.lib = lib\n this.rendererPtr = rendererPtr\n }\n\n public copyToClipboardOSC52(text: string, target: ClipboardTarget = ClipboardTarget.Clipboard): boolean {\n if (!this.isOsc52Supported()) {\n return false\n }\n const payload = encodeOsc52Payload(text, this.lib.encoder)\n return this.lib.copyToClipboardOSC52(this.rendererPtr, target, payload)\n }\n\n public clearClipboardOSC52(target: ClipboardTarget = ClipboardTarget.Clipboard): boolean {\n if (!this.isOsc52Supported()) {\n return false\n }\n return this.lib.clearClipboardOSC52(this.rendererPtr, target)\n }\n\n public isOsc52Supported(): boolean {\n const caps = this.lib.getTerminalCapabilities(this.rendererPtr)\n return Boolean(caps?.osc52)\n }\n}\n",
|
|
67
|
+
"import { ANSI } from \"./ansi.js\"\nimport { Renderable, RootRenderable } from \"./Renderable.js\"\nimport { BoxRenderable } from \"./renderables/Box.js\"\nimport { CodeRenderable } from \"./renderables/Code.js\"\nimport { TextRenderable } from \"./renderables/Text.js\"\nimport {\n DebugOverlayCorner,\n type CursorStyleOptions,\n type MousePointerStyle,\n type RenderContext,\n type ThemeMode,\n type ViewportBounds,\n type WidthMethod,\n} from \"./types.js\"\nimport { RGBA, parseColor, type ColorInput } from \"./lib/RGBA.js\"\nimport type { Pointer } from \"bun:ffi\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport { resolveRenderLib, type RenderLib } from \"./zig.js\"\nimport { TerminalConsole, type ConsoleOptions, capture } from \"./console.js\"\nimport { type MouseEventType, type RawMouseEvent, type ScrollInfo } from \"./lib/parse.mouse.js\"\nimport { Selection } from \"./lib/selection.js\"\nimport { Clipboard, type ClipboardTarget } from \"./lib/clipboard.js\"\nimport { EventEmitter } from \"events\"\nimport { destroySingleton, hasSingleton, singleton } from \"./lib/singleton.js\"\nimport { getObjectsInViewport } from \"./lib/objects-in-viewport.js\"\nimport { KeyHandler, InternalKeyHandler } from \"./lib/KeyHandler.js\"\nimport { isEditBufferRenderable, type EditBufferRenderable } from \"./renderables/EditBufferRenderable.js\"\nimport { env, registerEnvVar } from \"./lib/env.js\"\nimport { getTreeSitterClient } from \"./lib/tree-sitter/index.js\"\nimport {\n buildTerminalPaletteSignature,\n createTerminalPalette,\n normalizeTerminalPalette,\n type TerminalPaletteDetector,\n type TerminalColors,\n type GetPaletteOptions,\n} from \"./lib/terminal-palette.js\"\nimport { calculateRenderGeometry } from \"./lib/render-geometry.js\"\nimport {\n isCapabilityResponse,\n isPixelResolutionResponse,\n parsePixelResolution,\n} from \"./lib/terminal-capability-detection.js\"\nimport { type Clock, type TimerHandle, SystemClock } from \"./lib/clock.js\"\nimport { StdinParser, type StdinEvent, type StdinParserProtocolContext } from \"./lib/stdin-parser.js\"\nimport { matchesKeyBinding } from \"./lib/keybinding.internal.js\"\nimport { RendererThemeMode } from \"./renderer-theme-mode.js\"\n\nregisterEnvVar({\n name: \"OTUI_DUMP_CAPTURES\",\n description: \"Dump captured stdout and console caches when the renderer exit handler runs.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_NO_NATIVE_RENDER\",\n description:\n \"Skip the Zig/native frame renderer. Useful for debugging the render loop; split-footer stdout flushing may still write ANSI.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_USE_ALTERNATE_SCREEN\",\n description: \"When explicitly set, force screen mode selection: true=alternate-screen, false=main-screen.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"OTUI_OVERRIDE_STDOUT\",\n description: \"When explicitly set, force stdout routing: false=passthrough, true=capture in split-footer mode.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"OTUI_DEBUG\",\n description: \"Enable debug mode to capture all raw input for debugging purposes.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_SHOW_STATS\",\n description: \"Show the debug overlay at startup.\",\n type: \"boolean\",\n default: false,\n})\n\nexport interface CliRendererConfig {\n // Read input from this stream. Defaults to process.stdin.\n stdin?: NodeJS.ReadStream\n\n // Use a custom stdout stream for size detection and stdout interception.\n // Native frame output still goes to the real TTY.\n stdout?: NodeJS.WriteStream\n\n // Tell the native renderer it is driving a remote terminal.\n remote?: boolean\n\n // Skip terminal setup. Useful in tests.\n testing?: boolean\n\n // Call renderer.destroy() when Ctrl+C is pressed. Defaults to true.\n exitOnCtrlC?: boolean\n\n // Clean up on these signals. Defaults to the common termination signals.\n exitSignals?: NodeJS.Signals[]\n\n // Clear owned screen regions on suspend/destroy. Defaults to true.\n clearOnShutdown?: boolean\n\n // Forward these env var names to native terminal detection.\n forwardEnvKeys?: string[]\n\n // Wait this long before handling resize events. Defaults to 100 ms.\n debounceDelay?: number\n\n // Aim for this many frames per second in continuous mode. Defaults to 30.\n targetFps?: number\n\n // Cap immediate re-renders at this frame rate. Defaults to 60.\n maxFps?: number\n\n // Emit memory snapshots on this interval in ms. Set 0 to disable.\n memorySnapshotInterval?: number\n\n // Render from a separate thread when the platform supports it.\n useThread?: boolean\n\n // Collect frame timing stats for the debug overlay.\n gatherStats?: boolean\n\n // Keep this many timing samples. Defaults to 300.\n maxStatSamples?: number\n\n // Pass options to the built-in console overlay.\n consoleOptions?: Omit<ConsoleOptions, \"clock\">\n\n // Run these hooks after each render pass.\n postProcessFns?: ((buffer: OptimizedBuffer, deltaTime: number) => void)[]\n\n // Track mouse move events. Defaults to true.\n enableMouseMovement?: boolean\n\n // Enable mouse input. Defaults to true.\n useMouse?: boolean\n\n // Focus the nearest focusable renderable on left click. Defaults to true.\n autoFocus?: boolean\n\n // Choose where the renderer owns terminal space. Defaults to \"alternate-screen\".\n screenMode?: ScreenMode\n\n // Set the requested footer height for \"split-footer\". Defaults to 12.\n footerHeight?: number\n\n // Choose what happens to writes that go through `stdout.write`.\n externalOutputMode?: ExternalOutputMode\n\n // Choose what the built-in console overlay does.\n consoleMode?: ConsoleMode\n\n // Set Kitty keyboard protocol flags, or null to disable them.\n useKittyKeyboard?: KittyKeyboardOptions | null\n\n // Fill the render buffer with this background color. Default transparent.\n backgroundColor?: ColorInput\n\n // Open the console overlay on uncaught errors. Defaults to true in development.\n openConsoleOnError?: boolean\n\n // Run these input handlers before the built-in handlers.\n prependInputHandlers?: ((sequence: string) => boolean)[]\n\n // Cap the stdin parser buffer size in bytes. Defaults to 64 MB.\n stdinParserMaxBufferBytes?: number\n\n // Use a custom clock for timers and tests.\n clock?: Clock\n\n // Run after destroy() finishes cleanup.\n onDestroy?: () => void\n}\n\n// Controls how the renderer uses terminal space:\n//\n// - \"alternate-screen\": Use the terminal's alternate screen buffer.\n//\n// - \"main-screen\": Render on the main screen.\n//\n// - \"split-footer\": Keep the renderer in a reserved footer on the main screen.\nexport type ScreenMode = \"alternate-screen\" | \"main-screen\" | \"split-footer\"\n\n// Controls writes that go through the configured `stdout.write`.\n//\n// - \"capture-stdout\": Queue stdout and replay it above the split footer.\n// Only valid with \"split-footer\".\n//\n// - \"passthrough\": Leave stdout alone.\nexport type ExternalOutputMode = \"capture-stdout\" | \"passthrough\"\n\n// Controls the built-in console overlay:\n//\n// - \"console-overlay\": Capture `console.*` output and show the overlay.\n//\n// - \"disabled\": Hide the overlay. `OTUI_USE_CONSOLE` controls global console\n// capture.\nexport type ConsoleMode = \"console-overlay\" | \"disabled\"\n\nexport type PixelResolution = {\n width: number\n height: number\n}\n\nexport interface ScrollbackRenderContext {\n width: number\n widthMethod: WidthMethod\n tailColumn: number\n renderContext: RenderContext\n}\n\nexport interface ScrollbackSnapshot {\n root: Renderable\n width?: number\n height?: number\n rowColumns?: number\n startOnNewLine?: boolean\n trailingNewline?: boolean\n teardown?: () => void\n}\n\nexport type ScrollbackWriter = (ctx: ScrollbackRenderContext) => ScrollbackSnapshot\n\nexport interface ScrollbackSurfaceOptions {\n startOnNewLine?: boolean\n}\n\nexport interface ScrollbackSurfaceCommitOptions {\n rowColumns?: number\n trailingNewline?: boolean\n}\n\nexport interface ScrollbackSurface {\n readonly renderContext: RenderContext\n readonly root: Renderable\n readonly width: number\n readonly height: number\n readonly isDestroyed: boolean\n\n render(): void\n settle(timeoutMs?: number): Promise<void>\n commitRows(startRow: number, endRowExclusive: number, options?: ScrollbackSurfaceCommitOptions): void\n destroy(): void\n}\n\nconst DEFAULT_FOOTER_HEIGHT = 12\nconst MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES = 4\nconst TRANSPARENT_RGBA = RGBA.fromValues(0, 0, 0, 0)\n\nlet scrollbackSurfaceCounter = 0\n\nfunction normalizeFooterHeight(footerHeight: number | undefined): number {\n if (footerHeight === undefined) {\n return DEFAULT_FOOTER_HEIGHT\n }\n\n if (!Number.isFinite(footerHeight)) {\n throw new Error(\"footerHeight must be a finite number\")\n }\n\n const normalizedFooterHeight = Math.trunc(footerHeight)\n if (normalizedFooterHeight <= 0) {\n throw new Error(\"footerHeight must be greater than 0\")\n }\n\n return normalizedFooterHeight\n}\n\nfunction resolveModes(config: CliRendererConfig): {\n screenMode: ScreenMode\n footerHeight: number\n externalOutputMode: ExternalOutputMode\n} {\n let screenMode = config.screenMode ?? \"alternate-screen\"\n if (process.env.OTUI_USE_ALTERNATE_SCREEN !== undefined) {\n screenMode = env.OTUI_USE_ALTERNATE_SCREEN ? \"alternate-screen\" : \"main-screen\"\n }\n\n const footerHeight =\n screenMode === \"split-footer\" ? normalizeFooterHeight(config.footerHeight) : DEFAULT_FOOTER_HEIGHT\n\n let externalOutputMode =\n config.externalOutputMode ?? (screenMode === \"split-footer\" ? \"capture-stdout\" : \"passthrough\")\n if (process.env.OTUI_OVERRIDE_STDOUT !== undefined) {\n externalOutputMode = env.OTUI_OVERRIDE_STDOUT && screenMode === \"split-footer\" ? \"capture-stdout\" : \"passthrough\"\n }\n\n if (externalOutputMode === \"capture-stdout\" && screenMode !== \"split-footer\") {\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n return {\n screenMode,\n footerHeight,\n externalOutputMode,\n }\n}\n\ntype ExternalOutputCommit = {\n snapshot: OptimizedBuffer\n rowColumns: number\n startOnNewLine: boolean\n trailingNewline: boolean\n}\n\ntype PendingSplitFooterTransition = {\n mode: \"viewport-scroll\" | \"clear-stale-rows\"\n sourceTopLine: number\n sourceHeight: number\n targetTopLine: number\n targetHeight: number\n}\n\nclass ExternalOutputQueue {\n private commits: ExternalOutputCommit[] = []\n\n get size(): number {\n return this.commits.length\n }\n\n writeSnapshot(commit: ExternalOutputCommit): void {\n this.commits.push(commit)\n }\n\n claim(limit: number = Number.POSITIVE_INFINITY): ExternalOutputCommit[] {\n if (this.commits.length === 0) {\n return []\n }\n\n // Split-footer capture can enqueue many tiny commits in a burst (for example,\n // simulated Ctrl+R hold). Taking everything at once creates very large native\n // frames that increase visible churn. We keep claim() bounded so one render tick\n // produces one modest frame and schedules another tick if work remains.\n const clampedLimit = Number.isFinite(limit) ? Math.max(1, Math.trunc(limit)) : this.commits.length\n if (clampedLimit >= this.commits.length) {\n const output = this.commits\n this.commits = []\n return output\n }\n\n const output = this.commits.slice(0, clampedLimit)\n this.commits = this.commits.slice(clampedLimit)\n return output\n }\n\n clear(): void {\n for (const commit of this.commits) {\n commit.snapshot.destroy()\n }\n this.commits = []\n }\n}\n\nconst CHAR_FLAG_CONTINUATION = 0xc0000000 >>> 0\nconst CHAR_FLAG_MASK = 0xc0000000 >>> 0\n\nclass ScrollbackSnapshotRenderContext extends EventEmitter implements RenderContext {\n public width: number\n public height: number\n public frameId = 0\n public widthMethod: WidthMethod\n public capabilities: any | null = null\n public hasSelection: boolean = false\n public currentFocusedRenderable: Renderable | null = null\n public keyInput: KeyHandler\n public _internalKeyInput: InternalKeyHandler\n\n private lifecyclePasses: Set<Renderable> = new Set()\n\n constructor(width: number, height: number, widthMethod: WidthMethod) {\n super()\n this.width = width\n this.height = height\n this.widthMethod = widthMethod\n this.keyInput = new KeyHandler()\n this._internalKeyInput = new InternalKeyHandler()\n }\n\n public addToHitGrid(_x: number, _y: number, _width: number, _height: number, _id: number): void {}\n public pushHitGridScissorRect(_x: number, _y: number, _width: number, _height: number): void {}\n public popHitGridScissorRect(): void {}\n public clearHitGridScissorRects(): void {}\n public requestRender(): void {}\n public setCursorPosition(_x: number, _y: number, _visible: boolean): void {}\n public setCursorStyle(_options: CursorStyleOptions): void {}\n public setCursorColor(_color: RGBA): void {}\n public setMousePointer(_shape: MousePointerStyle): void {}\n public requestLive(): void {}\n public dropLive(): void {}\n public getSelection(): Selection | null {\n return null\n }\n public get currentFocusedEditor(): EditBufferRenderable | null {\n if (!this.currentFocusedRenderable) return null\n if (!isEditBufferRenderable(this.currentFocusedRenderable)) return null\n return this.currentFocusedRenderable\n }\n public requestSelectionUpdate(): void {}\n public focusRenderable(renderable: Renderable): void {\n this.currentFocusedRenderable = renderable\n }\n public blurRenderable(renderable: Renderable): void {\n if (this.currentFocusedRenderable === renderable) {\n this.currentFocusedRenderable = null\n }\n }\n public registerLifecyclePass(renderable: Renderable): void {\n this.lifecyclePasses.add(renderable)\n }\n public unregisterLifecyclePass(renderable: Renderable): void {\n this.lifecyclePasses.delete(renderable)\n }\n public getLifecyclePasses(): Set<Renderable> {\n return this.lifecyclePasses\n }\n public clearSelection(): void {}\n public startSelection(_renderable: Renderable, _x: number, _y: number): void {}\n public updateSelection(\n _currentRenderable: Renderable | undefined,\n _x: number,\n _y: number,\n _options?: { finishDragging?: boolean },\n ): void {}\n}\n\nconst DEFAULT_FORWARDED_ENV_KEYS = [\n \"TMUX\",\n \"TERM\",\n \"OPENTUI_GRAPHICS\",\n \"TERM_PROGRAM\",\n \"TERM_PROGRAM_VERSION\",\n \"ALACRITTY_SOCKET\",\n \"ALACRITTY_LOG\",\n \"COLORTERM\",\n \"TERMUX_VERSION\",\n \"VHS_RECORD\",\n \"OPENTUI_FORCE_WCWIDTH\",\n \"OPENTUI_FORCE_UNICODE\",\n \"OPENTUI_FORCE_NOZWJ\",\n \"OPENTUI_FORCE_EXPLICIT_WIDTH\",\n \"WT_SESSION\",\n \"STY\",\n \"WSL_DISTRO_NAME\",\n \"WSL_INTEROP\",\n] as const\n\n// Kitty keyboard protocol flags\n// See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\nconst KITTY_FLAG_DISAMBIGUATE = 0b1 // Report disambiguated escape codes\nconst KITTY_FLAG_EVENT_TYPES = 0b10 // Report event types (press/repeat/release)\nconst KITTY_FLAG_ALTERNATE_KEYS = 0b100 // Report alternate keys (e.g., numpad vs regular)\nconst KITTY_FLAG_ALL_KEYS_AS_ESCAPES = 0b1000 // Report all keys as escape codes\nconst KITTY_FLAG_REPORT_TEXT = 0b10000 // Report text associated with key events\n\nconst DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES = 64 * 1024 * 1024\nconst NATIVE_PALETTE_QUERY_SIZE = 16\n\n/**\n * Kitty Keyboard Protocol configuration options\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#progressive-enhancement\n */\nexport interface KittyKeyboardOptions {\n /** Disambiguate escape codes (fixes ESC timing, alt+key ambiguity, ctrl+c as event). Default: true */\n disambiguate?: boolean\n /** Report alternate keys (numpad, shifted, base layout) for cross-keyboard shortcuts. Default: true */\n alternateKeys?: boolean\n /** Report event types (press/repeat/release). Default: false */\n events?: boolean\n /** Report all keys as escape codes. Default: false */\n allKeysAsEscapes?: boolean\n /** Report text associated with key events. Default: false */\n reportText?: boolean\n}\n\n/**\n * Build kitty keyboard protocol flags based on configuration\n * @param config Kitty keyboard configuration object (null/undefined = disabled)\n * @returns The combined flags value (0 = disabled, >0 = enabled)\n * @internal Exported for testing\n */\nexport function buildKittyKeyboardFlags(config: KittyKeyboardOptions | null | undefined): number {\n if (!config) {\n return 0\n }\n\n let flags = 0\n\n // Default: disambiguate + alternate keys (both default to true)\n // - Disambiguate (0b1): Fixes ESC timing issues, alt+key ambiguity, makes ctrl+c a key event\n // - Alternate keys (0b100): Reports shifted/base-layout keys for cross-keyboard shortcuts\n\n // disambiguate defaults to true unless explicitly set to false\n if (config.disambiguate !== false) {\n flags |= KITTY_FLAG_DISAMBIGUATE\n }\n\n // alternateKeys defaults to true unless explicitly set to false\n if (config.alternateKeys !== false) {\n flags |= KITTY_FLAG_ALTERNATE_KEYS\n }\n\n // Optional flags (default to false, only enabled when explicitly true)\n if (config.events === true) {\n flags |= KITTY_FLAG_EVENT_TYPES\n }\n\n if (config.allKeysAsEscapes === true) {\n flags |= KITTY_FLAG_ALL_KEYS_AS_ESCAPES\n }\n\n if (config.reportText === true) {\n flags |= KITTY_FLAG_REPORT_TEXT\n }\n\n return flags\n}\n\nexport class MouseEvent {\n public readonly type: MouseEventType\n public readonly button: number\n public readonly x: number\n public readonly y: number\n public readonly source?: Renderable\n public readonly modifiers: {\n shift: boolean\n alt: boolean\n ctrl: boolean\n }\n public readonly scroll?: ScrollInfo\n public readonly target: Renderable | null\n public readonly isDragging?: boolean\n private _propagationStopped: boolean = false\n private _defaultPrevented: boolean = false\n\n public get propagationStopped(): boolean {\n return this._propagationStopped\n }\n\n public get defaultPrevented(): boolean {\n return this._defaultPrevented\n }\n\n constructor(target: Renderable | null, attributes: RawMouseEvent & { source?: Renderable; isDragging?: boolean }) {\n this.target = target\n this.type = attributes.type\n this.button = attributes.button\n this.x = attributes.x\n this.y = attributes.y\n this.modifiers = attributes.modifiers\n this.scroll = attributes.scroll\n this.source = attributes.source\n this.isDragging = attributes.isDragging\n }\n\n public stopPropagation(): void {\n this._propagationStopped = true\n }\n\n public preventDefault(): void {\n this._defaultPrevented = true\n }\n}\n\nexport enum MouseButton {\n LEFT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n WHEEL_UP = 4,\n WHEEL_DOWN = 5,\n}\n\nconst rendererTracker = singleton(\"RendererTracker\", () => {\n const renderers = new Set<CliRenderer>()\n return {\n addRenderer: (renderer: CliRenderer) => {\n renderers.add(renderer)\n },\n removeRenderer: (renderer: CliRenderer) => {\n renderers.delete(renderer)\n if (renderers.size === 0) {\n process.stdin.pause()\n\n if (hasSingleton(\"tree-sitter-client\")) {\n getTreeSitterClient().destroy()\n destroySingleton(\"tree-sitter-client\")\n }\n }\n },\n }\n})\n\nexport async function createCliRenderer(config: CliRendererConfig = {}): Promise<CliRenderer> {\n if (process.argv.includes(\"--delay-start\")) {\n await new Promise((resolve) => setTimeout(resolve, 5000))\n }\n const stdin = config.stdin || process.stdin\n const stdout = config.stdout || process.stdout\n const { screenMode, footerHeight } = resolveModes(config)\n\n const width = stdout.columns || 80\n const height = stdout.rows || 24\n const geometry = calculateRenderGeometry(screenMode, width, height, footerHeight)\n\n const ziglib = resolveRenderLib()\n const rendererPtr = ziglib.createRenderer(geometry.renderWidth, geometry.renderHeight, {\n remote: config.remote ?? false,\n testing: config.testing ?? false,\n })\n if (!rendererPtr) {\n throw new Error(\"Failed to create renderer\")\n }\n if (config.useThread === undefined) {\n config.useThread = true\n }\n\n // Disable threading on linux because there currently is currently an issue\n // might be just a missing dependency for the build or something, but threads crash on linux\n if (process.platform === \"linux\") {\n config.useThread = false\n }\n ziglib.setUseThread(rendererPtr, config.useThread)\n\n const kittyConfig = config.useKittyKeyboard ?? {}\n const kittyFlags = buildKittyKeyboardFlags(kittyConfig)\n\n ziglib.setKittyKeyboardFlags(rendererPtr, kittyFlags)\n\n const renderer = new CliRenderer(ziglib, rendererPtr, stdin, stdout, width, height, config)\n if (!config.testing) {\n await renderer.setupTerminal()\n }\n return renderer\n}\n\nexport enum CliRenderEvents {\n RESIZE = \"resize\",\n FOCUS = \"focus\",\n BLUR = \"blur\",\n FOCUSED_RENDERABLE = \"focused_renderable\",\n FOCUSED_EDITOR = \"focused_editor\",\n THEME_MODE = \"theme_mode\",\n CAPABILITIES = \"capabilities\",\n SELECTION = \"selection\",\n DEBUG_OVERLAY_TOGGLE = \"debugOverlay:toggle\",\n DESTROY = \"destroy\",\n MEMORY_SNAPSHOT = \"memory:snapshot\",\n}\n\nexport enum RendererControlState {\n IDLE = \"idle\",\n AUTO_STARTED = \"auto_started\",\n EXPLICIT_STARTED = \"explicit_started\",\n EXPLICIT_PAUSED = \"explicit_paused\",\n EXPLICIT_SUSPENDED = \"explicit_suspended\",\n EXPLICIT_STOPPED = \"explicit_stopped\",\n}\n\nexport class CliRenderer extends EventEmitter implements RenderContext {\n private static animationFrameId = 0\n private lib: RenderLib\n public rendererPtr: Pointer\n public stdin: NodeJS.ReadStream\n private stdout: NodeJS.WriteStream\n private exitOnCtrlC: boolean\n private exitSignals: NodeJS.Signals[]\n private _exitListenersAdded: boolean = false\n private _isDestroyed: boolean = false\n private _destroyPending: boolean = false\n private _destroyFinalized: boolean = false\n private _destroyCleanupPrepared: boolean = false\n public nextRenderBuffer: OptimizedBuffer\n public currentRenderBuffer: OptimizedBuffer\n private _isRunning: boolean = false\n private _targetFps: number = 30\n private _maxFps: number = 60\n private automaticMemorySnapshot: boolean = false\n private memorySnapshotInterval: number\n private memorySnapshotTimer: TimerHandle | null = null\n private lastMemorySnapshot: {\n heapUsed: number\n heapTotal: number\n arrayBuffers: number\n } = {\n heapUsed: 0,\n heapTotal: 0,\n arrayBuffers: 0,\n }\n public readonly root: RootRenderable\n public width: number\n public height: number\n private _useThread: boolean = false\n private gatherStats: boolean = false\n private frameTimes: number[] = []\n private maxStatSamples: number = 300\n private postProcessFns: ((buffer: OptimizedBuffer, deltaTime: number) => void)[] = []\n private backgroundColor: RGBA = RGBA.fromInts(0, 0, 0, 0)\n private waitingForPixelResolution: boolean = false\n private readonly clock: Clock\n\n private rendering: boolean = false\n private renderingNative: boolean = false\n private renderTimeout: TimerHandle | null = null\n private lastTime: number = 0\n private frameCount: number = 0\n // Bumped once per loop() iteration; see RenderContext.frameId.\n private _frameId: number = 0\n private lastFpsTime: number = 0\n private currentFps: number = 0\n private targetFrameTime: number = 1000 / this._targetFps\n private minTargetFrameTime: number = 1000 / this._maxFps\n private immediateRerenderRequested: boolean = false\n private updateScheduled: boolean = false\n\n private liveRequestCounter: number = 0\n private _controlState: RendererControlState = RendererControlState.IDLE\n\n private frameCallbacks: ((deltaTime: number) => Promise<void>)[] = []\n private renderStats: {\n frameCount: number\n fps: number\n renderTime?: number\n frameCallbackTime: number\n } = {\n frameCount: 0,\n fps: 0,\n renderTime: 0,\n frameCallbackTime: 0,\n }\n public debugOverlay = {\n enabled: env.OTUI_SHOW_STATS,\n corner: DebugOverlayCorner.bottomRight,\n }\n\n private _console: TerminalConsole\n private _resolution: PixelResolution | null = null\n private _keyHandler: InternalKeyHandler\n private stdinParser: StdinParser | null = null\n private readonly oscSubscribers = new Set<(sequence: string) => void>()\n private hasLoggedStdinParserError = false\n\n private animationRequest: Map<number, FrameRequestCallback> = new Map()\n\n private resizeTimeoutId: TimerHandle | null = null\n private capabilityTimeoutId: TimerHandle | null = null\n private splitStartupSeedTimeoutId: TimerHandle | null = null\n private pendingSplitStartupCursorSeed: boolean = false\n private resizeDebounceDelay: number = 100\n\n private enableMouseMovement: boolean = false\n private _useMouse: boolean = true\n private autoFocus: boolean = true\n private _screenMode: ScreenMode = \"alternate-screen\"\n private _footerHeight: number = DEFAULT_FOOTER_HEIGHT\n private _externalOutputMode: ExternalOutputMode = \"passthrough\"\n private clearOnShutdown: boolean = true\n private _suspendedMouseEnabled: boolean = false\n private _previousControlState: RendererControlState = RendererControlState.IDLE\n private capturedRenderable?: Renderable\n private lastOverRenderableNum: number = 0\n private lastOverRenderable?: Renderable\n\n private currentSelection: Selection | null = null\n private selectionContainers: Renderable[] = []\n private clipboard: Clipboard\n\n private _splitHeight: number = 0\n private renderOffset: number = 0\n private splitTailColumn: number = 0\n private pendingSplitFooterTransition: PendingSplitFooterTransition | null = null\n // One-shot latch used to request a full split repaint after transitions\n // (resize/mode/output-path changes). Cleared on first renderNative tick.\n private forceFullRepaintRequested: boolean = false\n // Upper bound for captured stdout commits consumed per native frame.\n // This is a visual smoothness control: smaller batches reduce frame envelope\n // churn and keep render latency predictable under heavy scrollback append load.\n private readonly maxSplitCommitsPerFrame: number = 8\n\n private _terminalWidth: number = 0\n private _terminalHeight: number = 0\n private _terminalIsSetup: boolean = false\n\n private externalOutputQueue = new ExternalOutputQueue()\n private realStdoutWrite: (chunk: any, encoding?: any, callback?: any) => boolean\n\n private _useConsole: boolean = true\n private sigwinchHandler: () => void = (() => {\n const width = this.stdout.columns || 80\n const height = this.stdout.rows || 24\n this.handleResize(width, height)\n }).bind(this)\n private _capabilities: any | null = null\n private _latestPointer: { x: number; y: number } = { x: 0, y: 0 }\n private _hasPointer: boolean = false\n private _lastPointerModifiers: RawMouseEvent[\"modifiers\"] = {\n shift: false,\n alt: false,\n ctrl: false,\n }\n private _currentMousePointerStyle: MousePointerStyle | undefined = undefined\n\n private _currentFocusedRenderable: Renderable | null = null\n private lifecyclePasses: Set<Renderable> = new Set()\n private _openConsoleOnError: boolean = false\n private _paletteDetector: TerminalPaletteDetector | null = null\n private _paletteCache = new Map<number, TerminalColors>()\n private _cachedPalette: TerminalColors | null = null\n private _paletteDetectionPromise: Promise<TerminalColors> | null = null\n private _paletteDetectionSize = 0\n private _paletteEpoch = 0\n private _publishedPaletteSignature: string | null = null\n private _palettePublishGeneration = 0\n private _onDestroy?: () => void\n private themeModeState: RendererThemeMode\n private _terminalFocusState: boolean | null = null\n\n private sequenceHandlers: ((sequence: string) => boolean)[] = []\n private prependedInputHandlers: ((sequence: string) => boolean)[] = []\n private shouldRestoreModesOnNextFocus: boolean = false\n private themeModeHandler!: (sequence: string) => boolean\n\n private idleResolvers: (() => void)[] = []\n\n private _debugInputs: Array<{ timestamp: string; sequence: string }> = []\n private _debugModeEnabled: boolean = env.OTUI_DEBUG\n\n private handleError: (error: Error) => void = ((error: Error) => {\n console.error(error)\n\n if (this._openConsoleOnError) {\n this.console.show()\n }\n }).bind(this)\n\n private dumpOutputCache(optionalMessage: string = \"\"): void {\n const cachedLogs = this.console.getCachedLogs()\n const capturedConsoleOutput = capture.claimOutput()\n const capturedExternalOutputCommits = this.externalOutputQueue.claim()\n\n let capturedExternalOutput = \"\"\n for (const commit of capturedExternalOutputCommits) {\n capturedExternalOutput += `[snapshot ${commit.snapshot.width}x${commit.snapshot.height}]\\n`\n commit.snapshot.destroy()\n }\n\n if (capturedConsoleOutput.length > 0 || capturedExternalOutput.length > 0 || cachedLogs.length > 0) {\n this.realStdoutWrite.call(this.stdout, optionalMessage)\n }\n\n if (cachedLogs.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"Console cache:\\n\")\n this.realStdoutWrite.call(this.stdout, cachedLogs)\n }\n\n if (capturedConsoleOutput.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"\\nCaptured console output:\\n\")\n this.realStdoutWrite.call(this.stdout, capturedConsoleOutput + \"\\n\")\n }\n\n if (capturedExternalOutput.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"\\nCaptured external output:\\n\")\n this.realStdoutWrite.call(this.stdout, capturedExternalOutput + \"\\n\")\n }\n\n this.realStdoutWrite.call(this.stdout, ANSI.reset)\n }\n\n private exitHandler: () => void = (() => {\n this.destroy()\n if (env.OTUI_DUMP_CAPTURES) {\n Bun.sleep(100).then(() => {\n this.dumpOutputCache(\"=== CAPTURED OUTPUT ===\\n\")\n })\n }\n }).bind(this)\n\n private warningHandler: (warning: any) => void = ((warning: any) => {\n console.warn(JSON.stringify(warning.message, null, 2))\n }).bind(this)\n\n public get controlState(): RendererControlState {\n return this._controlState\n }\n\n constructor(\n lib: RenderLib,\n rendererPtr: Pointer,\n stdin: NodeJS.ReadStream,\n stdout: NodeJS.WriteStream,\n width: number,\n height: number,\n config: CliRendererConfig = {},\n ) {\n super()\n\n rendererTracker.addRenderer(this)\n\n this.stdin = stdin\n this.stdout = stdout\n this.realStdoutWrite = stdout.write\n this.lib = lib\n this._terminalWidth = stdout.columns ?? width\n this._terminalHeight = stdout.rows ?? height\n this._useThread = config.useThread === undefined ? false : config.useThread\n const { screenMode, footerHeight, externalOutputMode } = resolveModes(config)\n this._externalOutputMode = externalOutputMode\n\n const initialGeometry = calculateRenderGeometry(screenMode, this._terminalWidth, this._terminalHeight, footerHeight)\n\n this.width = initialGeometry.renderWidth\n this.height = initialGeometry.renderHeight\n this._splitHeight = initialGeometry.effectiveFooterHeight\n this.renderOffset = screenMode === \"split-footer\" ? 0 : initialGeometry.renderOffset\n\n this._footerHeight = footerHeight\n\n this.rendererPtr = rendererPtr\n this.clearOnShutdown = config.clearOnShutdown ?? true\n this.lib.setClearOnShutdown(this.rendererPtr, this.clearOnShutdown)\n\n const forwardEnvKeys = config.forwardEnvKeys ?? (config.remote ? [] : [...DEFAULT_FORWARDED_ENV_KEYS])\n for (const key of forwardEnvKeys) {\n const value = process.env[key]\n if (value === undefined) continue\n this.lib.setTerminalEnvVar(this.rendererPtr, key, value)\n }\n\n this.exitOnCtrlC = config.exitOnCtrlC === undefined ? true : config.exitOnCtrlC\n this.exitSignals = config.exitSignals || [\n \"SIGINT\", // Ctrl+C\n \"SIGTERM\", // Termination signal\n \"SIGQUIT\", // Ctrl+\\\n \"SIGABRT\", // Abort signal\n \"SIGHUP\", // Hangup (terminal closed)\n \"SIGBREAK\", // Ctrl+Break on Windows\n \"SIGPIPE\", // Broken pipe\n \"SIGBUS\", // Bus error\n ]\n\n this.clipboard = new Clipboard(this.lib, this.rendererPtr)\n this.resizeDebounceDelay = config.debounceDelay || 100\n this.targetFps = config.targetFps || 30\n this.maxFps = config.maxFps || 60\n this.clock = config.clock ?? new SystemClock()\n this.themeModeState = new RendererThemeMode(\n {\n queryThemeColors: () => {\n this.lib.queryThemeColors(this.rendererPtr)\n },\n },\n this.clock,\n )\n this.themeModeHandler = (sequence: string) => {\n const result = this.themeModeState.handleSequence(sequence)\n if (result.changedMode) {\n this.emit(CliRenderEvents.THEME_MODE, result.changedMode)\n }\n return result.handled\n }\n this.memorySnapshotInterval = config.memorySnapshotInterval ?? 0\n this.gatherStats = config.gatherStats || false\n this.maxStatSamples = config.maxStatSamples || 300\n this.enableMouseMovement = config.enableMouseMovement ?? true\n this._useMouse = config.useMouse ?? true\n this.autoFocus = config.autoFocus ?? true\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n this.postProcessFns = config.postProcessFns || []\n this.prependedInputHandlers = config.prependInputHandlers || []\n\n this.root = new RootRenderable(this)\n\n if (this.memorySnapshotInterval > 0) {\n this.startMemorySnapshotTimer()\n }\n\n // Handle terminal resize\n process.on(\"SIGWINCH\", this.sigwinchHandler)\n\n process.on(\"warning\", this.warningHandler)\n\n process.on(\"uncaughtException\", this.handleError)\n process.on(\"unhandledRejection\", this.handleError)\n process.on(\"beforeExit\", this.exitHandler)\n\n const kittyConfig = config.useKittyKeyboard ?? {}\n const useKittyForParsing = kittyConfig !== null\n this._keyHandler = new InternalKeyHandler()\n this._keyHandler.on(\"keypress\", (event) => {\n // Use the shared matcher here too. Kitty can report a non-Latin\n // character plus a base-layout `c`, and Ctrl+C should still exit.\n if (this.exitOnCtrlC && matchesKeyBinding(event, { name: \"c\", ctrl: true })) {\n process.nextTick(() => {\n this.destroy()\n })\n return\n }\n })\n\n this.addExitListeners()\n\n const stdinParserMaxBufferBytes = config.stdinParserMaxBufferBytes ?? DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES\n this.stdinParser = new StdinParser({\n timeoutMs: 20,\n maxPendingBytes: stdinParserMaxBufferBytes,\n armTimeouts: true,\n onTimeoutFlush: () => {\n this.drainStdinParser()\n },\n useKittyKeyboard: useKittyForParsing,\n protocolContext: {\n kittyKeyboardEnabled: useKittyForParsing,\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n clock: this.clock,\n })\n\n this._console = new TerminalConsole(this, {\n ...(config.consoleOptions ?? {}),\n clock: this.clock,\n })\n this.consoleMode = config.consoleMode ?? \"console-overlay\"\n this.applyScreenMode(screenMode, false, false)\n this.stdout.write = externalOutputMode === \"capture-stdout\" ? this.interceptStdoutWrite : this.realStdoutWrite\n this._openConsoleOnError = config.openConsoleOnError ?? false\n this._onDestroy = config.onDestroy\n\n global.requestAnimationFrame = (callback: FrameRequestCallback) => {\n const id = CliRenderer.animationFrameId++\n this.animationRequest.set(id, callback)\n this.requestLive()\n return id\n }\n global.cancelAnimationFrame = (handle: number) => {\n this.animationRequest.delete(handle)\n }\n\n const window = global.window\n if (!window) {\n global.window = {} as Window & typeof globalThis\n }\n global.window.requestAnimationFrame = requestAnimationFrame\n\n // Prevents output from being written to the terminal, useful for debugging\n if (env.OTUI_NO_NATIVE_RENDER) {\n this.renderNative = () => {\n if (this._splitHeight > 0) {\n this.flushStdoutCache(this._splitHeight)\n }\n }\n }\n\n this.setupInput()\n }\n\n private addExitListeners(): void {\n if (this._exitListenersAdded || this.exitSignals.length === 0) return\n\n this.exitSignals.forEach((signal) => {\n process.addListener(signal, this.exitHandler)\n })\n\n this._exitListenersAdded = true\n }\n\n private removeExitListeners(): void {\n if (!this._exitListenersAdded || this.exitSignals.length === 0) return\n\n this.exitSignals.forEach((signal) => {\n process.removeListener(signal, this.exitHandler)\n })\n\n this._exitListenersAdded = false\n }\n\n public get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n public registerLifecyclePass(renderable: Renderable) {\n this.lifecyclePasses.add(renderable)\n }\n\n public unregisterLifecyclePass(renderable: Renderable) {\n this.lifecyclePasses.delete(renderable)\n }\n\n public getLifecyclePasses() {\n return this.lifecyclePasses\n }\n\n public get currentFocusedRenderable(): Renderable | null {\n return this._currentFocusedRenderable\n }\n\n public get currentFocusedEditor(): EditBufferRenderable | null {\n if (!this._currentFocusedRenderable) return null\n if (!isEditBufferRenderable(this._currentFocusedRenderable)) return null\n return this._currentFocusedRenderable\n }\n\n private normalizeClockTime(now: number, fallback: number): number {\n if (Number.isFinite(now)) {\n return now\n }\n\n return Number.isFinite(fallback) ? fallback : 0\n }\n\n private getElapsedMs(now: number, then: number): number {\n if (!Number.isFinite(now) || !Number.isFinite(then)) {\n return 0\n }\n\n return Math.max(now - then, 0)\n }\n\n public focusRenderable(renderable: Renderable) {\n if (this._currentFocusedRenderable === renderable) {\n return\n }\n\n const previousRenderable = this._currentFocusedRenderable\n const previousEditor = this.currentFocusedEditor\n\n this._currentFocusedRenderable = renderable\n previousRenderable?.blur()\n\n const currentEditor = this.currentFocusedEditor\n if (previousEditor !== currentEditor) {\n this.emit(CliRenderEvents.FOCUSED_EDITOR, currentEditor, previousEditor)\n }\n\n this.emit(CliRenderEvents.FOCUSED_RENDERABLE, renderable, previousRenderable)\n }\n\n public blurRenderable(renderable: Renderable): void {\n if (this._currentFocusedRenderable !== renderable) {\n return\n }\n\n const previousEditor = this.currentFocusedEditor\n this._currentFocusedRenderable = null\n\n if (previousEditor !== null) {\n this.emit(CliRenderEvents.FOCUSED_EDITOR, null, previousEditor)\n }\n\n this.emit(CliRenderEvents.FOCUSED_RENDERABLE, null, renderable)\n }\n\n private setCapturedRenderable(renderable: Renderable | undefined): void {\n if (this.capturedRenderable === renderable) {\n return\n }\n this.capturedRenderable = renderable\n }\n\n public addToHitGrid(x: number, y: number, width: number, height: number, id: number) {\n if (id !== this.capturedRenderable?.num) {\n this.lib.addToHitGrid(this.rendererPtr, x, y, width, height, id)\n }\n }\n\n public pushHitGridScissorRect(x: number, y: number, width: number, height: number): void {\n this.lib.hitGridPushScissorRect(this.rendererPtr, x, y, width, height)\n }\n\n public popHitGridScissorRect(): void {\n this.lib.hitGridPopScissorRect(this.rendererPtr)\n }\n\n public clearHitGridScissorRects(): void {\n this.lib.hitGridClearScissorRects(this.rendererPtr)\n }\n\n public get widthMethod(): WidthMethod {\n const caps = this.capabilities\n return caps?.unicode === \"wcwidth\" ? \"wcwidth\" : \"unicode\"\n }\n\n public get frameId(): number {\n return this._frameId\n }\n\n private writeOut(chunk: any, encoding?: any, callback?: any): boolean {\n if (this.rendererPtr && this._useThread) {\n const data = typeof chunk === \"string\" ? chunk : (chunk?.toString() ?? \"\")\n this.lib.writeOut(this.rendererPtr, data)\n if (typeof callback === \"function\") {\n process.nextTick(callback)\n }\n return true\n }\n\n return this.realStdoutWrite.call(this.stdout, chunk, encoding, callback)\n }\n\n public requestRender() {\n if (this._controlState === RendererControlState.EXPLICIT_SUSPENDED) {\n return\n }\n\n if (this._isRunning) {\n return\n }\n\n // NOTE: Using a frame callback that causes a re-render while already rendering\n // leads to a continuous loop of renders.\n if (this.rendering) {\n this.immediateRerenderRequested = true\n return\n }\n\n if (!this.updateScheduled && !this.renderTimeout) {\n this.updateScheduled = true\n const now = this.normalizeClockTime(this.clock.now(), this.lastTime)\n const elapsed = this.getElapsedMs(now, this.lastTime)\n const delay = Math.max(this.minTargetFrameTime - elapsed, 0)\n\n if (delay === 0) {\n process.nextTick(() => this.activateFrame())\n return\n }\n\n this.clock.setTimeout(() => this.activateFrame(), delay)\n }\n }\n\n private async activateFrame() {\n if (!this.updateScheduled) {\n this.resolveIdleIfNeeded()\n return\n }\n\n try {\n await this.loop()\n } finally {\n this.updateScheduled = false\n this.resolveIdleIfNeeded()\n }\n }\n\n public get consoleMode(): ConsoleMode {\n return this._useConsole ? \"console-overlay\" : \"disabled\"\n }\n\n public set consoleMode(mode: ConsoleMode) {\n this._useConsole = mode === \"console-overlay\"\n if (this._useConsole) {\n this.console.activate()\n } else {\n this.console.deactivate()\n }\n }\n\n public get isRunning(): boolean {\n return this._isRunning\n }\n\n private isIdleNow(): boolean {\n return (\n !this._isRunning &&\n !this.rendering &&\n !this.renderTimeout &&\n !this.updateScheduled &&\n !this.immediateRerenderRequested\n )\n }\n\n private resolveIdleIfNeeded(): void {\n if (!this.isIdleNow()) return\n const resolvers = this.idleResolvers.splice(0)\n for (const resolve of resolvers) {\n resolve()\n }\n }\n\n public idle(): Promise<void> {\n if (this._isDestroyed) return Promise.resolve()\n if (this.isIdleNow()) return Promise.resolve()\n return new Promise<void>((resolve) => {\n this.idleResolvers.push(resolve)\n })\n }\n\n public get resolution(): PixelResolution | null {\n return this._resolution\n }\n\n public get console(): TerminalConsole {\n return this._console\n }\n\n public get keyInput(): KeyHandler {\n return this._keyHandler\n }\n\n public get _internalKeyInput(): InternalKeyHandler {\n return this._keyHandler\n }\n\n public get terminalWidth(): number {\n return this._terminalWidth\n }\n\n public get terminalHeight(): number {\n return this._terminalHeight\n }\n\n public get useThread(): boolean {\n return this._useThread\n }\n\n public get targetFps(): number {\n return this._targetFps\n }\n\n public set targetFps(targetFps: number) {\n this._targetFps = targetFps\n this.targetFrameTime = 1000 / this._targetFps\n }\n\n public get maxFps(): number {\n return this._maxFps\n }\n\n public set maxFps(maxFps: number) {\n this._maxFps = maxFps\n this.minTargetFrameTime = 1000 / this._maxFps\n }\n\n public get useMouse(): boolean {\n return this._useMouse\n }\n\n public set useMouse(useMouse: boolean) {\n if (this._useMouse === useMouse) return // No change needed\n\n this._useMouse = useMouse\n\n if (useMouse) {\n this.enableMouse()\n } else {\n this.disableMouse()\n }\n }\n\n public get screenMode(): ScreenMode {\n return this._screenMode\n }\n\n public set screenMode(mode: ScreenMode) {\n if (this.externalOutputMode === \"capture-stdout\" && mode !== \"split-footer\") {\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n this.applyScreenMode(mode)\n }\n\n public get footerHeight(): number {\n return this._footerHeight\n }\n\n public set footerHeight(footerHeight: number) {\n const normalizedFooterHeight = normalizeFooterHeight(footerHeight)\n if (normalizedFooterHeight === this._footerHeight) {\n return\n }\n\n this._footerHeight = normalizedFooterHeight\n if (this.screenMode === \"split-footer\") {\n this.applyScreenMode(\"split-footer\")\n }\n }\n\n public get externalOutputMode(): ExternalOutputMode {\n return this._externalOutputMode\n }\n\n public set externalOutputMode(mode: ExternalOutputMode) {\n if (mode === \"capture-stdout\" && this.screenMode !== \"split-footer\") {\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n const previousMode = this._externalOutputMode\n if (previousMode === mode) {\n return\n }\n\n if (previousMode === \"capture-stdout\" && mode === \"passthrough\" && this._splitHeight > 0) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n this._externalOutputMode = mode\n this.stdout.write = mode === \"capture-stdout\" ? this.interceptStdoutWrite : this.realStdoutWrite\n\n if (this._screenMode === \"split-footer\" && this._splitHeight > 0 && mode === \"capture-stdout\") {\n this.clearPendingSplitFooterTransition()\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n return\n }\n\n if (\n this._screenMode === \"split-footer\" &&\n this._splitHeight > 0 &&\n previousMode === \"capture-stdout\" &&\n mode === \"passthrough\"\n ) {\n this.clearPendingSplitFooterTransition()\n return\n }\n\n this.syncSplitFooterState()\n }\n\n public get liveRequestCount(): number {\n return this.liveRequestCounter\n }\n\n public get currentControlState(): string {\n return this._controlState\n }\n\n public get capabilities(): any | null {\n return this._capabilities\n }\n\n public get themeMode(): ThemeMode | null {\n return this.themeModeState.themeMode\n }\n\n public waitForThemeMode(timeoutMs: number = 1000): Promise<ThemeMode | null> {\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\")\n }\n\n return this.themeModeState.waitForThemeMode(timeoutMs, this._isDestroyed)\n }\n\n public getDebugInputs(): Array<{ timestamp: string; sequence: string }> {\n return [...this._debugInputs]\n }\n\n public get useKittyKeyboard(): boolean {\n return this.lib.getKittyKeyboardFlags(this.rendererPtr) > 0\n }\n\n public set useKittyKeyboard(use: boolean) {\n const flags = use ? KITTY_FLAG_DISAMBIGUATE | KITTY_FLAG_ALTERNATE_KEYS : 0\n this.lib.setKittyKeyboardFlags(this.rendererPtr, flags)\n }\n\n public createScrollbackSurface(options: ScrollbackSurfaceOptions = {}): ScrollbackSurface {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error(\n 'createScrollbackSurface requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"',\n )\n }\n\n const renderer = this\n const surfaceId = scrollbackSurfaceCounter++\n const startOnNewLine = options.startOnNewLine ?? true\n const firstLineOffset =\n !startOnNewLine && renderer.splitTailColumn > 0 && renderer.splitTailColumn < renderer.width\n ? renderer.splitTailColumn\n : 0\n\n const snapshotContext = new ScrollbackSnapshotRenderContext(renderer.width, 1, renderer.widthMethod)\n let firstLineOffsetOwner: Renderable | null = null\n const renderContext = Object.create(snapshotContext) as RenderContext\n Object.defineProperty(renderContext, \"claimFirstLineOffset\", {\n value: (renderable?: Renderable): number => {\n if (firstLineOffsetOwner?.isDestroyed) {\n firstLineOffsetOwner = null\n }\n\n if (firstLineOffsetOwner) {\n return 0\n }\n\n firstLineOffsetOwner = renderable ?? null\n return firstLineOffset\n },\n enumerable: true,\n configurable: true,\n })\n\n const internalRoot = new RootRenderable(renderContext)\n const publicRoot = new BoxRenderable(renderContext, {\n id: `scrollback-surface-root-${surfaceId}`,\n position: \"absolute\",\n left: 0,\n top: 0,\n width: renderer.width,\n height: \"auto\",\n border: false,\n backgroundColor: \"transparent\",\n shouldFill: false,\n flexDirection: \"column\",\n })\n internalRoot.add(publicRoot)\n\n let surfaceWidth = renderer.width\n let surfaceHeight = 1\n let surfaceWidthMethod = renderer.widthMethod\n let surfaceDestroyed = false\n let hasRendered = false\n let nextCommitStartOnNewLine = startOnNewLine\n let backingBuffer = OptimizedBuffer.create(surfaceWidth, surfaceHeight, surfaceWidthMethod, {\n id: `scrollback-surface-buffer-${surfaceId}`,\n })\n\n const destroyListener = (): void => {\n destroySurface()\n }\n\n const assertNotDestroyed = (): void => {\n if (surfaceDestroyed) {\n throw new Error(\"ScrollbackSurface is destroyed\")\n }\n }\n\n const assertRendered = (): void => {\n if (!hasRendered) {\n throw new Error(\"ScrollbackSurface.commitRows requires render() before commitRows()\")\n }\n }\n\n const assertGeometryStillCurrent = (): void => {\n if (renderer.width !== surfaceWidth || renderer.widthMethod !== surfaceWidthMethod) {\n throw new Error(\"ScrollbackSurface.commitRows requires render() after renderer geometry changes\")\n }\n }\n\n const assertRowRange = (startRow: number, endRowExclusive: number): void => {\n if (!Number.isInteger(startRow) || !Number.isInteger(endRowExclusive)) {\n throw new Error(\"ScrollbackSurface.commitRows requires finite integer row bounds\")\n }\n\n if (startRow < 0) {\n throw new Error(\"ScrollbackSurface.commitRows requires startRow >= 0\")\n }\n\n if (endRowExclusive < startRow) {\n throw new Error(\"ScrollbackSurface.commitRows requires endRowExclusive >= startRow\")\n }\n\n if (endRowExclusive > surfaceHeight) {\n throw new Error(\"ScrollbackSurface.commitRows row range exceeds rendered surface height\")\n }\n }\n\n const collectPendingCodeRenderables = (node: Renderable): CodeRenderable[] => {\n const pending: CodeRenderable[] = []\n\n if (node instanceof CodeRenderable && node.isHighlighting) {\n pending.push(node)\n }\n\n for (const child of node.getChildren()) {\n pending.push(...collectPendingCodeRenderables(child))\n }\n\n return pending\n }\n\n const waitForPendingHighlights = async (pending: CodeRenderable[], timeoutMs: number): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n let settled = false\n const timeoutHandle = renderer.clock.setTimeout(() => {\n if (settled) {\n return\n }\n\n settled = true\n reject(new Error(\"ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting\"))\n }, timeoutMs)\n\n Promise.all(pending.map((renderable) => renderable.highlightingDone)).then(\n () => {\n if (settled) {\n return\n }\n\n settled = true\n renderer.clock.clearTimeout(timeoutHandle)\n resolve()\n },\n (error) => {\n if (settled) {\n return\n }\n\n settled = true\n renderer.clock.clearTimeout(timeoutHandle)\n reject(error)\n },\n )\n })\n }\n\n const renderSurface = (): void => {\n assertNotDestroyed()\n\n const width = renderer.width\n const widthMethod = renderer.widthMethod\n\n snapshotContext.width = width\n snapshotContext.widthMethod = widthMethod\n publicRoot.width = width\n\n const renderPass = (height: number): void => {\n snapshotContext.height = height\n internalRoot.resize(width, height)\n backingBuffer.resize(width, height)\n backingBuffer.clear(TRANSPARENT_RGBA)\n snapshotContext.frameId += 1\n internalRoot.render(backingBuffer, 0)\n }\n\n let targetHeight = Math.max(1, surfaceHeight)\n\n if (surfaceWidthMethod !== widthMethod) {\n backingBuffer.destroy()\n backingBuffer = OptimizedBuffer.create(width, targetHeight, widthMethod, {\n id: `scrollback-surface-buffer-${surfaceId}`,\n })\n } else {\n backingBuffer.resize(width, targetHeight)\n }\n\n for (let pass = 0; pass < MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES; pass += 1) {\n renderPass(targetHeight)\n\n const measuredHeight = Math.max(1, publicRoot.height)\n if (measuredHeight === targetHeight) {\n surfaceWidth = width\n surfaceHeight = measuredHeight\n surfaceWidthMethod = widthMethod\n hasRendered = true\n return\n }\n\n targetHeight = measuredHeight\n }\n\n renderPass(targetHeight)\n\n surfaceWidth = width\n surfaceHeight = targetHeight\n surfaceWidthMethod = widthMethod\n hasRendered = true\n }\n\n const settleSurface = async (timeoutMs: number = 2000): Promise<void> => {\n assertNotDestroyed()\n\n const startedAt = renderer.clock.now()\n renderSurface()\n\n while (true) {\n assertNotDestroyed()\n\n const pending = collectPendingCodeRenderables(publicRoot)\n if (pending.length === 0) {\n return\n }\n\n const remainingMs = timeoutMs - (renderer.clock.now() - startedAt)\n if (remainingMs <= 0) {\n throw new Error(\"ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting\")\n }\n\n await waitForPendingHighlights(pending, remainingMs)\n assertNotDestroyed()\n renderSurface()\n }\n }\n\n const commitRows = (\n startRow: number,\n endRowExclusive: number,\n commitOptions: ScrollbackSurfaceCommitOptions = {},\n ): void => {\n assertNotDestroyed()\n assertRendered()\n assertGeometryStillCurrent()\n assertRowRange(startRow, endRowExclusive)\n\n if (startRow === endRowExclusive) {\n return\n }\n\n const rowCount = endRowExclusive - startRow\n const commitBuffer = OptimizedBuffer.create(surfaceWidth, rowCount, surfaceWidthMethod, {\n id: `scrollback-surface-commit-${surfaceId}`,\n })\n\n try {\n commitBuffer.drawFrameBuffer(0, 0, backingBuffer, 0, startRow, surfaceWidth, rowCount)\n\n renderer.enqueueRenderedScrollbackCommit({\n snapshot: commitBuffer,\n rowColumns: commitOptions.rowColumns,\n startOnNewLine: nextCommitStartOnNewLine,\n trailingNewline: commitOptions.trailingNewline ?? false,\n })\n\n nextCommitStartOnNewLine = false\n } catch (error) {\n commitBuffer.destroy()\n throw error\n }\n }\n\n const destroySurface = (): void => {\n if (surfaceDestroyed) {\n return\n }\n\n surfaceDestroyed = true\n renderer.off(CliRenderEvents.DESTROY, destroyListener)\n\n let destroyError: unknown = null\n\n try {\n internalRoot.destroyRecursively()\n } catch (error) {\n destroyError = error\n }\n\n try {\n backingBuffer.destroy()\n } catch (error) {\n if (destroyError === null) {\n destroyError = error\n }\n }\n\n renderContext.removeAllListeners()\n snapshotContext.removeAllListeners()\n\n if (destroyError !== null) {\n throw destroyError\n }\n }\n\n renderer.on(CliRenderEvents.DESTROY, destroyListener)\n\n return {\n get renderContext(): RenderContext {\n return renderContext\n },\n get root(): Renderable {\n return publicRoot\n },\n get width(): number {\n return surfaceWidth\n },\n get height(): number {\n return surfaceHeight\n },\n get isDestroyed(): boolean {\n return surfaceDestroyed\n },\n render: renderSurface,\n settle: settleSurface,\n commitRows,\n destroy: destroySurface,\n }\n }\n\n // writeToScrollback is a \"render to scrollback commit\" API, not a direct stdout\n // write. The callback returns a renderable tree, we render that tree into an\n // off-screen OptimizedBuffer, then enqueue the result as one ExternalOutputCommit.\n //\n // Why this shape exists:\n // - It keeps app-authored scrollback output in the same FIFO queue as captured\n // stdout, so ordering is deterministic even when both sources interleave.\n // - It lets the render loop batch multiple queued commits into one native frame,\n // which is the key mechanism that avoids repeated sync/cursor toggles (flicker).\n // - It reuses the normal renderable pipeline (layout, styling, grapheme shaping),\n // so scrollback payloads match what users see in the live UI.\n //\n // startOnNewLine and trailingNewline preserve newline intent when one logical\n // write spans multiple commits. startOnNewLine adds a newline before this commit\n // if the previous commit ended mid-row. trailingNewline adds a newline after this\n // commit's final row.\n //\n // Native split append uses these flags to avoid glued rows (missing newline), and\n // double-advance gaps (extra newline), while still appending payload and repainting\n // footer in the same frame.\n //\n // Side effects: throws if split-footer capture mode is not active, transfers\n // snapshot buffer ownership to the queue on success, triggers async render,\n // and invokes snapshot teardown when cleanup runs.\n public writeToScrollback(write: ScrollbackWriter): void {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error('writeToScrollback requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"')\n }\n\n const snapshotContext = new ScrollbackSnapshotRenderContext(this.width, this.height, this.widthMethod)\n const snapshot = write({\n width: this.width,\n widthMethod: this.widthMethod,\n tailColumn: this.splitTailColumn,\n renderContext: snapshotContext,\n })\n\n if (!snapshot || !snapshot.root) {\n throw new Error(\"writeToScrollback must return a snapshot root renderable\")\n }\n\n let renderFailed = false\n let snapshotRoot: RootRenderable | null = null\n let snapshotBuffer: OptimizedBuffer | null = null\n\n try {\n const rootRenderable = snapshot.root\n const snapshotWidth = this.getSnapshotWidth(snapshot.width, rootRenderable.width)\n const snapshotHeight = this.getSnapshotHeight(snapshot.height, rootRenderable.height)\n\n snapshotContext.width = snapshotWidth\n snapshotContext.height = snapshotHeight\n snapshotContext.widthMethod = this.widthMethod\n\n snapshotRoot = new RootRenderable(snapshotContext)\n snapshotBuffer = OptimizedBuffer.create(snapshotWidth, snapshotHeight, this.widthMethod, {\n id: \"scrollback-snapshot-commit\",\n })\n\n // Render through normal renderables so split scrollback output uses the same\n // text shaping/styling pipeline as the rest of the renderer.\n snapshotRoot.add(rootRenderable)\n snapshotRoot.render(snapshotBuffer, 0)\n this.enqueueRenderedScrollbackCommit({\n snapshot: snapshotBuffer,\n rowColumns: snapshot.rowColumns,\n startOnNewLine: snapshot.startOnNewLine,\n trailingNewline: snapshot.trailingNewline,\n })\n } catch (error) {\n renderFailed = true\n snapshotBuffer?.destroy()\n throw error\n } finally {\n let cleanupError: unknown | null = null\n\n try {\n if (snapshotRoot) {\n snapshotRoot.destroyRecursively()\n } else {\n snapshot.root.destroyRecursively()\n }\n } catch (error) {\n cleanupError = error\n }\n\n try {\n snapshot.teardown?.()\n } catch (error) {\n if (cleanupError === null) {\n cleanupError = error\n }\n }\n\n if (!renderFailed && cleanupError) {\n throw cleanupError\n }\n }\n }\n\n private getSnapshotWidth(value: number | undefined, fallback: number): number {\n const rawValue = value ?? fallback\n\n if (!Number.isFinite(rawValue)) {\n throw new Error(\"writeToScrollback produced a non-finite width\")\n }\n\n return Math.min(Math.max(Math.trunc(rawValue), 1), Math.max(this.width, 1))\n }\n\n private getSnapshotHeight(value: number | undefined, fallback: number): number {\n const rawValue = value ?? fallback\n\n if (!Number.isFinite(rawValue)) {\n throw new Error(\"writeToScrollback produced a non-finite height\")\n }\n\n return Math.max(Math.trunc(rawValue), 1)\n }\n\n private getSnapshotRowWidths(snapshot: OptimizedBuffer, rowColumns: number): number[] {\n const widths: number[] = []\n const limit = Math.min(Math.max(Math.trunc(rowColumns), 0), snapshot.width)\n const chars = snapshot.buffers.char\n\n for (let y = 0; y < snapshot.height; y += 1) {\n let x = limit\n\n while (x > 0) {\n const cp = chars[y * snapshot.width + x - 1]\n if (cp === 0 || (cp & CHAR_FLAG_MASK) === CHAR_FLAG_CONTINUATION) {\n x -= 1\n continue\n }\n\n break\n }\n\n widths.push(x)\n }\n\n return widths\n }\n\n private publishSplitTailColumns(columns: number): void {\n if (columns <= 0) {\n return\n }\n\n const width = Math.max(this.width, 1)\n let tail = this.splitTailColumn\n let remaining = columns\n\n while (remaining > 0) {\n if (tail >= width) {\n tail = 0\n }\n\n const step = Math.min(remaining, width - tail)\n tail += step\n remaining -= step\n\n if (remaining > 0 && tail >= width) {\n tail = 0\n }\n }\n\n this.splitTailColumn = tail\n }\n\n private recordSplitCommit(commit: ExternalOutputCommit): void {\n if (commit.startOnNewLine && this.splitTailColumn > 0) {\n this.splitTailColumn = 0\n }\n\n const rowWidths = this.getSnapshotRowWidths(commit.snapshot, commit.rowColumns)\n for (const [index, rowWidth] of rowWidths.entries()) {\n this.publishSplitTailColumns(rowWidth)\n if (index < rowWidths.length - 1 || commit.trailingNewline) {\n this.splitTailColumn = 0\n }\n }\n }\n\n private enqueueRenderedScrollbackCommit(options: {\n snapshot: OptimizedBuffer\n rowColumns?: number\n startOnNewLine?: boolean\n trailingNewline?: boolean\n }): void {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error('scrollback commit requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"')\n }\n\n const rowColumns = Math.min(\n Math.max(Math.trunc(options.rowColumns ?? options.snapshot.width), 0),\n options.snapshot.width,\n )\n\n this.enqueueSplitCommit({\n snapshot: options.snapshot,\n rowColumns,\n startOnNewLine: options.startOnNewLine ?? true,\n trailingNewline: options.trailingNewline ?? true,\n })\n\n this.requestRender()\n }\n\n private enqueueSplitCommit(commit: ExternalOutputCommit): void {\n this.recordSplitCommit(commit)\n this.externalOutputQueue.writeSnapshot(commit)\n }\n\n private createStdoutSnapshotCommit(line: string, trailingNewline: boolean): ExternalOutputCommit {\n // Convert captured stdout into the same commit shape used by writeToScrollback.\n // One commit format keeps split append behavior consistent across both sources.\n const snapshotContext = new ScrollbackSnapshotRenderContext(this.width, 1, this.widthMethod)\n const maxWidth = Math.max(1, this.width)\n const lineCells = [...line]\n const rowColumns = Math.min(lineCells.length, maxWidth)\n const renderedLine = lineCells.slice(0, maxWidth).join(\"\")\n const snapshotRoot = new RootRenderable(snapshotContext)\n const snapshotRenderable = new TextRenderable(snapshotContext, {\n id: \"captured-stdout-snapshot\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: Math.max(1, rowColumns),\n height: 1,\n content: renderedLine,\n })\n const snapshotBuffer = OptimizedBuffer.create(Math.max(1, rowColumns), 1, this.widthMethod, {\n id: \"captured-stdout-snapshot\",\n })\n\n try {\n snapshotRoot.add(snapshotRenderable)\n snapshotRoot.render(snapshotBuffer, 0)\n return {\n snapshot: snapshotBuffer,\n rowColumns,\n startOnNewLine: false,\n trailingNewline,\n }\n } catch (error) {\n snapshotBuffer.destroy()\n throw error\n } finally {\n snapshotRoot.destroyRecursively()\n }\n }\n\n private splitStdoutRows(text: string): Array<{ line: string; trailingNewline: boolean }> {\n // Captured stdout arrives as an arbitrary byte stream, but split append commits\n // are row-based (line text + whether that row ended with '\\n'). We normalize\n // here because native split append expects already-decoded row intent, not raw\n // control characters.\n //\n // '\\r' must restart the in-progress row so in-place status updates (progress\n // bars/spinners) do not accumulate stale prefixes in scrollback. '\\n' commits\n // the row and marks newline intent for the final chunk of that logical row.\n const rows: Array<{ line: string; trailingNewline: boolean }> = []\n let current = \"\"\n\n for (const char of text) {\n if (char === \"\\r\") {\n current = \"\"\n continue\n }\n\n if (char === \"\\n\") {\n rows.push({ line: current, trailingNewline: true })\n current = \"\"\n continue\n }\n\n current += char\n }\n\n if (current.length > 0) {\n rows.push({ line: current, trailingNewline: false })\n }\n\n return rows\n }\n\n private createStdoutSnapshotCommits(text: string): ExternalOutputCommit[] {\n if (text.length === 0) {\n return []\n }\n\n // Chunk captured stdout into width-bounded row commits so each commit is a\n // small, deterministic append step. This keeps bursty output smooth while\n // preserving newline ownership on the final chunk of each logical row.\n const commits: ExternalOutputCommit[] = []\n // Split commits are row-oriented snapshots. We chunk by renderer width so each\n // commit maps to a single logical terminal row append operation.\n const chunkWidth = Math.max(1, this.width)\n for (const row of this.splitStdoutRows(text)) {\n const rowCells = [...row.line]\n if (rowCells.length === 0) {\n // Preserve empty-line writes: newline-only chunks still need a commit so\n // split scrollback state advances correctly in native code.\n commits.push(this.createStdoutSnapshotCommit(\"\", row.trailingNewline))\n continue\n }\n\n let offset = 0\n while (offset < rowCells.length) {\n const chunk = rowCells.slice(offset, offset + chunkWidth).join(\"\")\n offset += chunkWidth\n const isLastChunk = offset >= rowCells.length\n // Only the final wrapped chunk carries newline intent.\n commits.push(this.createStdoutSnapshotCommit(chunk, isLastChunk ? row.trailingNewline : false))\n }\n }\n\n return commits\n }\n\n private flushPendingSplitCommits(forceFooterRepaint: boolean = false): void {\n // Drain only a bounded prefix so one JS render pass maps to one native frame.\n // Remaining commits are intentionally left queued and rendered on subsequent\n // ticks to avoid giant multi-thousand-cell frames that can flicker.\n const commits = this.externalOutputQueue.claim(this.maxSplitCommitsPerFrame)\n let hasCommittedOutput = false\n const lastCommitIndex = commits.length - 1\n\n for (const [index, commit] of commits.entries()) {\n // Force repaint only on the last commit in a frame. Repainting after every\n // chunk negates batching and reintroduces duplicate clear/move traffic.\n const forceCommit = forceFooterRepaint && index === lastCommitIndex\n // beginFrame/finalizeFrame tell native code whether this commit opens or\n // closes the shared frame envelope. Intermediate commits append payload only.\n const beginFrame = index === 0\n const finalizeFrame = index === lastCommitIndex\n\n try {\n // Keep split append policy in native code so every producer (captured stdout\n // and writeToScrollback) shares the same cursor/scrollback invariants.\n this.renderOffset = this.lib.commitSplitFooterSnapshot(\n this.rendererPtr,\n commit.snapshot,\n commit.rowColumns,\n commit.startOnNewLine,\n commit.trailingNewline,\n this.getSplitPinnedRenderOffset(),\n forceCommit,\n beginFrame,\n finalizeFrame,\n )\n hasCommittedOutput = true\n } finally {\n commit.snapshot.destroy()\n }\n }\n\n if (!hasCommittedOutput) {\n this.renderOffset = this.lib.repaintSplitFooter(\n this.rendererPtr,\n this.getSplitPinnedRenderOffset(),\n forceFooterRepaint,\n )\n }\n\n this.pendingSplitFooterTransition = null\n\n if (this.externalOutputQueue.size > 0) {\n // Preserve FIFO ordering without doing unbounded work in one tick.\n // This keeps sustained stdout bursts smooth instead of blocking on one frame.\n this.requestRender()\n }\n }\n\n private interceptStdoutWrite = (chunk: any, encoding?: any, callback?: any): boolean => {\n const resolvedCallback = typeof encoding === \"function\" ? encoding : callback\n const resolvedEncoding = typeof encoding === \"string\" ? encoding : undefined\n const text = typeof chunk === \"string\" ? chunk : (chunk?.toString(resolvedEncoding) ?? \"\")\n\n if (this._externalOutputMode === \"capture-stdout\" && this._screenMode === \"split-footer\" && this._splitHeight > 0) {\n // Capture mode intentionally diverts stdout into split commit snapshots\n // instead of writing directly to process stdout. Native flushing will append\n // and repaint in one controlled frame, which is what avoids footer flicker.\n const commits = this.createStdoutSnapshotCommits(text)\n for (const commit of commits) {\n this.enqueueSplitCommit(commit)\n }\n\n if (commits.length > 0) {\n // Defer actual terminal writes to the render loop so commits can be batched.\n this.requestRender()\n }\n }\n\n if (typeof resolvedCallback === \"function\") {\n process.nextTick(resolvedCallback)\n }\n\n return true\n }\n\n private getSplitPinnedRenderOffset(): number {\n return this._screenMode === \"split-footer\" ? Math.max(this._terminalHeight - this._splitHeight, 0) : 0\n }\n\n private getSplitCursorSeedRows(): number {\n const cursorState = this.lib.getCursorState(this.rendererPtr)\n const cursorRow = Number.isFinite(cursorState.y) ? Math.max(Math.trunc(cursorState.y), 1) : 1\n return Math.min(cursorRow, Math.max(this._terminalHeight, 1))\n }\n\n private flushPendingSplitOutputBeforeTransition(forceFooterRepaint: boolean = false): void {\n if (\n this._screenMode !== \"split-footer\" ||\n this._splitHeight <= 0 ||\n this._externalOutputMode !== \"capture-stdout\"\n ) {\n return\n }\n\n if (this.externalOutputQueue.size === 0 && !forceFooterRepaint) {\n return\n }\n\n this.flushPendingSplitCommits(forceFooterRepaint)\n }\n\n private resetSplitScrollback(seedRows: number = 0): void {\n this.splitTailColumn = 0\n this.renderOffset = this.lib.resetSplitScrollback(this.rendererPtr, seedRows, this.getSplitPinnedRenderOffset())\n }\n\n private syncSplitScrollback(): void {\n this.renderOffset = this.lib.syncSplitScrollback(this.rendererPtr, this.getSplitPinnedRenderOffset())\n }\n\n private clearPendingSplitFooterTransition(): void {\n if (this.pendingSplitFooterTransition === null) {\n return\n }\n\n this.pendingSplitFooterTransition = null\n this.lib.clearPendingSplitFooterTransition(this.rendererPtr)\n }\n\n private setPendingSplitFooterTransition(transition: PendingSplitFooterTransition): void {\n this.pendingSplitFooterTransition = transition\n this.lib.setPendingSplitFooterTransition(\n this.rendererPtr,\n transition.mode === \"viewport-scroll\" ? 1 : 2,\n transition.sourceTopLine,\n transition.sourceHeight,\n transition.targetTopLine,\n transition.targetHeight,\n )\n }\n\n private syncSplitFooterState(): void {\n const splitActive = this._screenMode === \"split-footer\" && this._splitHeight > 0\n\n if (!splitActive) {\n this.clearPendingSplitFooterTransition()\n this.splitTailColumn = 0\n this.lib.resetSplitScrollback(this.rendererPtr, 0, 0)\n this.renderOffset = 0\n this.lib.setRenderOffset(this.rendererPtr, this.renderOffset)\n return\n }\n\n if (this._externalOutputMode === \"capture-stdout\") {\n this.syncSplitScrollback()\n } else {\n this.clearPendingSplitFooterTransition()\n this.splitTailColumn = 0\n this.lib.resetSplitScrollback(this.rendererPtr, 0, 0)\n this.renderOffset = this.getSplitPinnedRenderOffset()\n this.lib.setRenderOffset(this.rendererPtr, this.renderOffset)\n }\n }\n\n private clearStaleSplitSurfaceRows(\n previousTopLine: number,\n previousHeight: number,\n nextTopLine: number,\n nextHeight: number,\n ): void {\n if (!this._terminalIsSetup || previousHeight <= 0 || this._terminalHeight <= 0) {\n return\n }\n\n const terminalBottom = this._terminalHeight\n const previousStart = Math.max(1, previousTopLine)\n const previousEnd = Math.min(terminalBottom, previousTopLine + previousHeight - 1)\n\n if (previousEnd < previousStart) {\n return\n }\n\n const nextStart = Math.max(1, nextTopLine)\n const nextEnd = Math.min(terminalBottom, nextTopLine + Math.max(nextHeight, 0) - 1)\n\n let clear = \"\"\n for (let line = previousStart; line <= previousEnd; line += 1) {\n if (line >= nextStart && line <= nextEnd) {\n continue\n }\n\n clear += `${ANSI.moveCursor(line, 1)}\\x1b[2K`\n }\n\n if (clear.length > 0) {\n this.writeOut(clear)\n }\n }\n\n private applyScreenMode(screenMode: ScreenMode, emitResize: boolean = true, requestRender: boolean = true): void {\n const prevScreenMode = this._screenMode\n const prevSplitHeight = this._splitHeight\n const nextGeometry = calculateRenderGeometry(\n screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const nextSplitHeight = nextGeometry.effectiveFooterHeight\n\n if (prevScreenMode === screenMode && prevSplitHeight === nextSplitHeight) {\n return\n }\n\n const prevUseAlternateScreen = prevScreenMode === \"alternate-screen\"\n const nextUseAlternateScreen = screenMode === \"alternate-screen\"\n const terminalScreenModeChanged = this._terminalIsSetup && prevUseAlternateScreen !== nextUseAlternateScreen\n const leavingSplitFooter = prevSplitHeight > 0 && nextSplitHeight === 0\n\n if (this._terminalIsSetup && prevSplitHeight > 0) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n const previousSurfaceTopLine = this.renderOffset + 1\n const previousPinnedRenderOffset = Math.max(this._terminalHeight - prevSplitHeight, 0)\n const splitWasSettled = prevSplitHeight === 0 || this.renderOffset >= previousPinnedRenderOffset\n const shouldUseViewportScrollTransitions = this._externalOutputMode !== \"capture-stdout\" || splitWasSettled\n const shouldDeferSplitFooterResizeTransition =\n this._terminalIsSetup &&\n prevScreenMode === \"split-footer\" &&\n screenMode === \"split-footer\" &&\n this._externalOutputMode === \"capture-stdout\" &&\n prevSplitHeight > 0 &&\n nextSplitHeight > 0 &&\n !terminalScreenModeChanged\n const splitStartupSeedBlocksFirstNativeFrame =\n this.pendingSplitStartupCursorSeed && this.splitStartupSeedTimeoutId !== null\n const splitTransitionSourceTopLine = this.pendingSplitFooterTransition?.sourceTopLine ?? previousSurfaceTopLine\n const splitTransitionSourceHeight = this.pendingSplitFooterTransition?.sourceHeight ?? prevSplitHeight\n const splitTransitionMode =\n this.pendingSplitFooterTransition?.mode ?? (splitWasSettled ? \"viewport-scroll\" : \"clear-stale-rows\")\n\n if (this._terminalIsSetup && leavingSplitFooter) {\n this.clearPendingSplitFooterTransition()\n this.renderOffset = 0\n this.lib.setRenderOffset(this.rendererPtr, 0)\n }\n\n if (\n this._terminalIsSetup &&\n !terminalScreenModeChanged &&\n shouldUseViewportScrollTransitions &&\n !shouldDeferSplitFooterResizeTransition\n ) {\n if (prevSplitHeight === 0 && nextSplitHeight > 0) {\n const freedLines = this._terminalHeight - nextSplitHeight\n const scrollDown = ANSI.scrollDown(freedLines)\n this.writeOut(scrollDown)\n } else if (prevSplitHeight > nextSplitHeight && nextSplitHeight > 0) {\n const freedLines = prevSplitHeight - nextSplitHeight\n const scrollDown = ANSI.scrollDown(freedLines)\n this.writeOut(scrollDown)\n } else if (prevSplitHeight < nextSplitHeight && prevSplitHeight > 0) {\n const additionalLines = nextSplitHeight - prevSplitHeight\n const scrollUp = ANSI.scrollUp(additionalLines)\n this.writeOut(scrollUp)\n }\n }\n\n this._screenMode = screenMode\n this._splitHeight = nextSplitHeight\n this.width = nextGeometry.renderWidth\n this.height = nextGeometry.renderHeight\n\n this.lib.resizeRenderer(this.rendererPtr, this.width, this.height)\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n if (prevScreenMode !== \"split-footer\") {\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n } else {\n this.syncSplitScrollback()\n }\n\n if (shouldDeferSplitFooterResizeTransition) {\n if (splitStartupSeedBlocksFirstNativeFrame) {\n this.clearPendingSplitFooterTransition()\n } else {\n this.setPendingSplitFooterTransition({\n mode: splitTransitionMode,\n sourceTopLine: splitTransitionSourceTopLine,\n sourceHeight: splitTransitionSourceHeight,\n targetTopLine: this.renderOffset + 1,\n targetHeight: nextSplitHeight,\n })\n }\n this.forceFullRepaintRequested = true\n } else if (!shouldUseViewportScrollTransitions && prevSplitHeight > 0 && nextSplitHeight > 0) {\n this.clearPendingSplitFooterTransition()\n this.clearStaleSplitSurfaceRows(previousSurfaceTopLine, prevSplitHeight, this.renderOffset + 1, nextSplitHeight)\n } else {\n this.clearPendingSplitFooterTransition()\n }\n } else {\n this.syncSplitFooterState()\n }\n\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n\n this._console.resize(this.width, this.height)\n this.root.resize(this.width, this.height)\n\n if (terminalScreenModeChanged) {\n this.lib.suspendRenderer(this.rendererPtr)\n this.lib.setupTerminal(this.rendererPtr, nextUseAlternateScreen)\n\n if (this._useMouse) {\n this.enableMouse()\n }\n }\n\n if (emitResize) {\n this.emit(CliRenderEvents.RESIZE, this.width, this.height)\n }\n\n if (requestRender) {\n this.requestRender()\n }\n }\n\n // TODO: Move this to native\n private flushStdoutCache(space: number, force: boolean = false): boolean {\n if (this.externalOutputQueue.size === 0 && !force) return false\n\n const outputCommits = this.externalOutputQueue.claim()\n let output = \"\"\n for (const commit of outputCommits) {\n output += `[snapshot ${commit.snapshot.width}x${commit.snapshot.height}]\\n`\n commit.snapshot.destroy()\n }\n\n const rendererStartLine = this.renderOffset + 1\n const flush = ANSI.moveCursorAndClear(rendererStartLine, 1)\n\n const outputLine = this.renderOffset + 1\n const move = ANSI.moveCursor(outputLine, 1)\n\n let clear = \"\"\n if (space > 0) {\n const backgroundColor = this.backgroundColor.toInts()\n const newlines = \" \".repeat(this.width) + \"\\n\".repeat(space)\n // Check if background is transparent (alpha = 0)\n if (backgroundColor[3] === 0) {\n clear = newlines\n } else {\n clear =\n ANSI.setRgbBackground(backgroundColor[0], backgroundColor[1], backgroundColor[2]) +\n newlines +\n ANSI.resetBackground\n }\n }\n\n this.writeOut(flush + move + output + clear)\n\n return true\n }\n\n private enableMouse(): void {\n this._useMouse = true\n this.lib.enableMouse(this.rendererPtr, this.enableMouseMovement)\n }\n\n private disableMouse(): void {\n this._useMouse = false\n this.setCapturedRenderable(undefined)\n this.stdinParser?.resetMouseState()\n this.lib.disableMouse(this.rendererPtr)\n }\n\n public enableKittyKeyboard(flags: number = 0b00011): void {\n this.lib.enableKittyKeyboard(this.rendererPtr, flags)\n this.updateStdinParserProtocolContext({ kittyKeyboardEnabled: true })\n }\n\n public disableKittyKeyboard(): void {\n this.lib.disableKittyKeyboard(this.rendererPtr)\n this.updateStdinParserProtocolContext({ kittyKeyboardEnabled: false }, true)\n }\n\n public set useThread(useThread: boolean) {\n this._useThread = useThread\n this.lib.setUseThread(this.rendererPtr, useThread)\n }\n\n // TODO: All input management may move to native when zig finally has async io support again,\n // without rolling a full event loop\n public async setupTerminal(): Promise<void> {\n if (this._terminalIsSetup) return\n this._terminalIsSetup = true\n\n const startupCursorCprActive = this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\"\n this.updateStdinParserProtocolContext({\n privateCapabilityRepliesActive: true,\n explicitWidthCprActive: true,\n startupCursorCprActive,\n })\n this.lib.setupTerminal(this.rendererPtr, this._screenMode === \"alternate-screen\")\n this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr)\n\n if (this.debugOverlay.enabled) {\n this.lib.setDebugOverlay(this.rendererPtr, true, this.debugOverlay.corner)\n if (!this.memorySnapshotInterval) {\n this.memorySnapshotInterval = 3000\n this.startMemorySnapshotTimer()\n this.automaticMemorySnapshot = true\n }\n }\n\n this.capabilityTimeoutId = this.clock.setTimeout(() => {\n this.capabilityTimeoutId = null\n this.pendingSplitStartupCursorSeed = false\n\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n this.splitStartupSeedTimeoutId = null\n }\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.requestRender()\n }\n\n this.removeInputHandler(this.capabilityHandler)\n this.updateStdinParserProtocolContext(\n {\n privateCapabilityRepliesActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n true,\n )\n }, 5000)\n\n if (this._useMouse) {\n this.enableMouse()\n }\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.pendingSplitStartupCursorSeed = true\n\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n }\n\n this.splitStartupSeedTimeoutId = this.clock.setTimeout(() => {\n this.splitStartupSeedTimeoutId = null\n\n if (!this.pendingSplitStartupCursorSeed) {\n return\n }\n\n this.updateStdinParserProtocolContext({ startupCursorCprActive: false })\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.requestRender()\n }\n }, 120)\n }\n\n this.queryPixelResolution()\n this.ensureNativePaletteState()\n }\n\n private stdinListener: (chunk: Buffer | string) => void = ((chunk: Buffer | string) => {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n if (!this.stdinParser) return\n\n try {\n this.stdinParser.push(data)\n this.drainStdinParser()\n } catch (error) {\n this.handleStdinParserFailure(error)\n }\n }).bind(this)\n\n public addInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers.push(handler)\n }\n\n public prependInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers.unshift(handler)\n }\n\n public removeInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers = this.sequenceHandlers.filter((candidate) => candidate !== handler)\n }\n\n private updateStdinParserProtocolContext(patch: Partial<StdinParserProtocolContext>, drain = false): void {\n if (!this.stdinParser) return\n this.stdinParser.updateProtocolContext(patch)\n if (drain) this.drainStdinParser()\n }\n\n public subscribeOsc(handler: (sequence: string) => void): () => void {\n this.oscSubscribers.add(handler)\n return () => {\n this.oscSubscribers.delete(handler)\n }\n }\n\n private processCapabilitySequence(sequence: string, hasCursorReport: boolean): boolean {\n const hasStandardCapabilitySignature = isCapabilityResponse(sequence)\n const shouldProcessAsCapability =\n hasStandardCapabilitySignature || (hasCursorReport && this.capabilityTimeoutId !== null)\n\n if (!shouldProcessAsCapability) {\n return false\n }\n\n this.lib.processCapabilityResponse(this.rendererPtr, sequence)\n this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr)\n if (hasStandardCapabilitySignature) {\n this.forceFullRepaintRequested = true\n this.requestRender()\n }\n this.emit(CliRenderEvents.CAPABILITIES, this._capabilities)\n\n const hadPendingSplitStartupCursorSeed = this.pendingSplitStartupCursorSeed\n\n if (\n hadPendingSplitStartupCursorSeed &&\n hasCursorReport &&\n this._screenMode === \"split-footer\" &&\n this._externalOutputMode === \"capture-stdout\"\n ) {\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n this.clearPendingSplitFooterTransition()\n this.pendingSplitStartupCursorSeed = false\n this.updateStdinParserProtocolContext({ startupCursorCprActive: false })\n\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n this.splitStartupSeedTimeoutId = null\n }\n\n this.requestRender()\n }\n\n const consumeStartupCursorReport =\n hadPendingSplitStartupCursorSeed && hasCursorReport && this.splitStartupSeedTimeoutId !== null\n\n return hasStandardCapabilitySignature || consumeStartupCursorReport\n }\n\n private capabilityHandler: (sequence: string) => boolean = ((sequence: string) => {\n return this.processCapabilitySequence(sequence, false)\n }).bind(this)\n\n private focusHandler: (sequence: string) => boolean = ((sequence: string) => {\n if (sequence === \"\\x1b[I\") {\n // When the terminal regains focus, some terminal emulators (notably\n // Windows Terminal / ConPTY) may have stripped DEC private modes like\n // mouse tracking, bracketed paste, and focus tracking itself while the\n // window was unfocused.\n if (this.shouldRestoreModesOnNextFocus) {\n this.lib.restoreTerminalModes(this.rendererPtr)\n this.shouldRestoreModesOnNextFocus = false\n }\n if (this._terminalFocusState !== true) {\n this._terminalFocusState = true\n this.emit(CliRenderEvents.FOCUS)\n }\n return true\n }\n if (sequence === \"\\x1b[O\") {\n this.shouldRestoreModesOnNextFocus = true\n if (this._terminalFocusState !== false) {\n this._terminalFocusState = false\n this.emit(CliRenderEvents.BLUR)\n }\n return true\n }\n return false\n }).bind(this)\n\n private dispatchSequenceHandlers(sequence: string): boolean {\n if (this._debugModeEnabled) {\n this._debugInputs.push({\n timestamp: new Date().toISOString(),\n sequence,\n })\n }\n\n for (const handler of this.sequenceHandlers) {\n if (handler(sequence)) {\n return true\n }\n }\n\n return false\n }\n\n private drainStdinParser(): void {\n if (!this.stdinParser) return\n\n this.stdinParser.drain((event) => {\n this.handleStdinEvent(event)\n })\n }\n\n private handleStdinEvent(event: StdinEvent): void {\n switch (event.type) {\n case \"key\":\n if (this.dispatchSequenceHandlers(event.raw)) {\n return\n }\n\n this._keyHandler.processParsedKey(event.key)\n return\n case \"mouse\":\n if (this._useMouse && this.processSingleMouseEvent(event.event)) {\n return\n }\n\n this.dispatchSequenceHandlers(event.raw)\n return\n case \"paste\":\n this._keyHandler.processPaste(event.bytes, event.metadata)\n return\n case \"response\":\n if (event.protocol === \"osc\") {\n for (const subscriber of this.oscSubscribers) {\n subscriber(event.sequence)\n }\n }\n\n if (event.protocol === \"cpr\" && this.processCapabilitySequence(event.sequence, true)) {\n return\n }\n\n this.dispatchSequenceHandlers(event.sequence)\n return\n }\n }\n\n private handleStdinParserFailure(error: unknown): void {\n if (!this.hasLoggedStdinParserError) {\n this.hasLoggedStdinParserError = true\n if (process.env.NODE_ENV !== \"test\") {\n console.error(\"[stdin-parser-error] parser failure, resetting parser\", error)\n }\n }\n\n try {\n this.stdinParser?.reset()\n } catch (resetError) {\n console.error(\"stdin parser reset failed after parser error\", resetError)\n }\n }\n\n private setupInput(): void {\n for (const handler of this.prependedInputHandlers) {\n this.addInputHandler(handler)\n }\n\n this.addInputHandler((sequence: string) => {\n if (isPixelResolutionResponse(sequence) && this.waitingForPixelResolution) {\n const resolution = parsePixelResolution(sequence)\n if (resolution) {\n this._resolution = resolution\n }\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext({ pixelResolutionQueryActive: false }, true)\n return true\n }\n return false\n })\n this.addInputHandler(this.capabilityHandler)\n this.addInputHandler(this.focusHandler)\n this.addInputHandler(this.themeModeHandler)\n\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(true)\n }\n\n this.stdin.on(\"data\", this.stdinListener)\n this.stdin.resume()\n }\n\n private dispatchMouseEvent(\n target: Renderable,\n attributes: RawMouseEvent & { source?: Renderable; isDragging?: boolean },\n ): MouseEvent {\n const event = new MouseEvent(target, attributes)\n target.processMouseEvent(event)\n\n if (this.autoFocus && event.type === \"down\" && event.button === MouseButton.LEFT && !event.defaultPrevented) {\n let current: Renderable | null = target\n while (current) {\n if (current.focusable) {\n current.focus()\n break\n }\n current = current.parent\n }\n }\n\n return event\n }\n\n private processSingleMouseEvent(mouseEvent: RawMouseEvent): boolean {\n if (this._splitHeight > 0) {\n if (mouseEvent.y < this.renderOffset) {\n return false\n }\n mouseEvent.y -= this.renderOffset\n }\n\n this._latestPointer.x = mouseEvent.x\n this._latestPointer.y = mouseEvent.y\n this._hasPointer = true\n this._lastPointerModifiers = mouseEvent.modifiers\n\n if (this._console.visible) {\n const consoleBounds = this._console.bounds\n if (\n mouseEvent.x >= consoleBounds.x &&\n mouseEvent.x < consoleBounds.x + consoleBounds.width &&\n mouseEvent.y >= consoleBounds.y &&\n mouseEvent.y < consoleBounds.y + consoleBounds.height\n ) {\n const event = new MouseEvent(null, mouseEvent)\n const handled = this._console.handleMouse(event)\n if (handled) return true\n }\n }\n\n if (mouseEvent.type === \"scroll\") {\n const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y)\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n const fallbackTarget =\n this._currentFocusedRenderable &&\n !this._currentFocusedRenderable.isDestroyed &&\n this._currentFocusedRenderable.focused\n ? this._currentFocusedRenderable\n : null\n const scrollTarget = maybeRenderable ?? fallbackTarget\n\n if (scrollTarget) {\n const event = new MouseEvent(scrollTarget, mouseEvent)\n scrollTarget.processMouseEvent(event)\n }\n return true\n }\n\n const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y)\n const sameElement = maybeRenderableId === this.lastOverRenderableNum\n this.lastOverRenderableNum = maybeRenderableId\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n\n if (\n mouseEvent.type === \"down\" &&\n mouseEvent.button === MouseButton.LEFT &&\n !this.currentSelection?.isDragging &&\n !mouseEvent.modifiers.ctrl\n ) {\n const canStartSelection = Boolean(\n maybeRenderable &&\n maybeRenderable.selectable &&\n !maybeRenderable.isDestroyed &&\n maybeRenderable.shouldStartSelection(mouseEvent.x, mouseEvent.y),\n )\n\n if (canStartSelection && maybeRenderable) {\n this.startSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n this.dispatchMouseEvent(maybeRenderable, mouseEvent)\n return true\n }\n }\n\n if (mouseEvent.type === \"drag\" && this.currentSelection?.isDragging) {\n this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n isDragging: true,\n })\n maybeRenderable.processMouseEvent(event)\n }\n\n return true\n }\n\n if (mouseEvent.type === \"up\" && this.currentSelection?.isDragging) {\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n isDragging: true,\n })\n maybeRenderable.processMouseEvent(event)\n }\n\n this.finishSelection()\n return true\n }\n\n if (mouseEvent.type === \"down\" && mouseEvent.button === MouseButton.LEFT && this.currentSelection) {\n if (mouseEvent.modifiers.ctrl) {\n this.currentSelection.isDragging = true\n this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n return true\n }\n }\n\n if (!sameElement && (mouseEvent.type === \"drag\" || mouseEvent.type === \"move\")) {\n if (\n this.lastOverRenderable &&\n this.lastOverRenderable !== this.capturedRenderable &&\n !this.lastOverRenderable.isDestroyed\n ) {\n const event = new MouseEvent(this.lastOverRenderable, {\n ...mouseEvent,\n type: \"out\",\n })\n this.lastOverRenderable.processMouseEvent(event)\n }\n this.lastOverRenderable = maybeRenderable\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n type: \"over\",\n source: this.capturedRenderable,\n })\n maybeRenderable.processMouseEvent(event)\n }\n }\n\n if (this.capturedRenderable && mouseEvent.type !== \"up\") {\n const event = new MouseEvent(this.capturedRenderable, mouseEvent)\n this.capturedRenderable.processMouseEvent(event)\n return true\n }\n\n if (this.capturedRenderable && mouseEvent.type === \"up\") {\n const event = new MouseEvent(this.capturedRenderable, {\n ...mouseEvent,\n type: \"drag-end\",\n })\n this.capturedRenderable.processMouseEvent(event)\n this.capturedRenderable.processMouseEvent(new MouseEvent(this.capturedRenderable, mouseEvent))\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n type: \"drop\",\n source: this.capturedRenderable,\n })\n maybeRenderable.processMouseEvent(event)\n }\n this.lastOverRenderable = this.capturedRenderable\n this.lastOverRenderableNum = this.capturedRenderable.num\n this.setCapturedRenderable(undefined)\n // Dropping the renderable needs to push another frame when the renderer is not live\n // to update the hit grid, otherwise capturedRenderable won't be in the hit grid and will not receive mouse events\n this.requestRender()\n }\n\n let event: MouseEvent | undefined\n if (maybeRenderable) {\n if (mouseEvent.type === \"drag\" && mouseEvent.button === MouseButton.LEFT) {\n this.setCapturedRenderable(maybeRenderable)\n } else {\n this.setCapturedRenderable(undefined)\n }\n event = this.dispatchMouseEvent(maybeRenderable, mouseEvent)\n } else {\n this.setCapturedRenderable(undefined)\n this.lastOverRenderable = undefined\n }\n\n if (!event?.defaultPrevented && mouseEvent.type === \"down\" && this.currentSelection) {\n this.clearSelection()\n }\n\n return true\n }\n\n /**\n * Recheck hover state after hit grid changes.\n * Called after render when native code detects the hit grid changed.\n * Fires out/over events if the element under the cursor changed.\n */\n private recheckHoverState(): void {\n if (this._isDestroyed || !this._hasPointer) return\n if (this.capturedRenderable) return\n\n const hitId = this.hitTest(this._latestPointer.x, this._latestPointer.y)\n const hitRenderable = Renderable.renderablesByNumber.get(hitId)\n const lastOver = this.lastOverRenderable\n\n // No change\n if (lastOver?.num === hitId) {\n this.lastOverRenderableNum = hitId\n return\n }\n\n const baseEvent: RawMouseEvent = {\n type: \"move\",\n button: 0,\n x: this._latestPointer.x,\n y: this._latestPointer.y,\n modifiers: this._lastPointerModifiers,\n }\n\n // Fire out on old element\n if (lastOver && !lastOver.isDestroyed) {\n const event = new MouseEvent(lastOver, { ...baseEvent, type: \"out\" })\n lastOver.processMouseEvent(event)\n }\n\n this.lastOverRenderable = hitRenderable\n this.lastOverRenderableNum = hitId\n\n // Fire over on new element\n if (hitRenderable) {\n const event = new MouseEvent(hitRenderable, {\n ...baseEvent,\n type: \"over\",\n })\n hitRenderable.processMouseEvent(event)\n }\n }\n public setMousePointer(style: MousePointerStyle): void {\n this._currentMousePointerStyle = style\n this.lib.setCursorStyleOptions(this.rendererPtr, { cursor: style })\n }\n\n public hitTest(x: number, y: number): number {\n return this.lib.checkHit(this.rendererPtr, x, y)\n }\n\n private takeMemorySnapshot(): void {\n if (this._isDestroyed) return\n\n const memoryUsage = process.memoryUsage()\n this.lastMemorySnapshot = {\n heapUsed: memoryUsage.heapUsed,\n heapTotal: memoryUsage.heapTotal,\n arrayBuffers: memoryUsage.arrayBuffers,\n }\n\n this.lib.updateMemoryStats(\n this.rendererPtr,\n this.lastMemorySnapshot.heapUsed,\n this.lastMemorySnapshot.heapTotal,\n this.lastMemorySnapshot.arrayBuffers,\n )\n\n this.emit(CliRenderEvents.MEMORY_SNAPSHOT, this.lastMemorySnapshot)\n }\n\n private startMemorySnapshotTimer(): void {\n this.stopMemorySnapshotTimer()\n\n this.memorySnapshotTimer = this.clock.setInterval(() => {\n this.takeMemorySnapshot()\n }, this.memorySnapshotInterval)\n }\n\n private stopMemorySnapshotTimer(): void {\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n }\n\n public setMemorySnapshotInterval(interval: number): void {\n this.memorySnapshotInterval = interval\n\n if (this._isRunning && interval > 0) {\n this.startMemorySnapshotTimer()\n } else if (interval <= 0 && this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n }\n\n private handleResize(width: number, height: number): void {\n if (this._isDestroyed) return\n if (this._splitHeight > 0) {\n this.processResize(width, height)\n return\n }\n\n if (this.resizeTimeoutId !== null) {\n this.clock.clearTimeout(this.resizeTimeoutId)\n this.resizeTimeoutId = null\n }\n\n this.resizeTimeoutId = this.clock.setTimeout(() => {\n this.resizeTimeoutId = null\n this.processResize(width, height)\n }, this.resizeDebounceDelay)\n }\n\n private queryPixelResolution() {\n this.waitingForPixelResolution = true\n this.updateStdinParserProtocolContext({ pixelResolutionQueryActive: true })\n this.lib.queryPixelResolution(this.rendererPtr)\n }\n\n private processResize(width: number, height: number): void {\n if (width === this._terminalWidth && height === this._terminalHeight) return\n\n if (this._terminalIsSetup && this._controlState !== RendererControlState.EXPLICIT_SUSPENDED) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n const pendingSplitFooterTransition = this.pendingSplitFooterTransition\n const previousGeometry = calculateRenderGeometry(\n this._screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const prevWidth = this._terminalWidth\n const previousTerminalHeight = this._terminalHeight\n const visiblePreviousSplitHeight =\n pendingSplitFooterTransition?.sourceHeight ?? previousGeometry.effectiveFooterHeight\n\n this._terminalWidth = width\n this._terminalHeight = height\n this.queryPixelResolution()\n\n this.setCapturedRenderable(undefined)\n this.stdinParser?.resetMouseState()\n\n const nextGeometry = calculateRenderGeometry(\n this._screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const splitFooterActive = this._screenMode === \"split-footer\"\n\n if (splitFooterActive) {\n // Width shrink historically needs a broader scrub band, but if resize interrupts\n // a deferred footer transition we also need to clear from that visible source surface.\n let clearStart: number | null = null\n\n if (width < prevWidth && visiblePreviousSplitHeight > 0) {\n clearStart = Math.max(previousTerminalHeight - visiblePreviousSplitHeight * 2, 1)\n }\n\n if (pendingSplitFooterTransition !== null) {\n clearStart =\n clearStart === null\n ? pendingSplitFooterTransition.sourceTopLine\n : Math.min(clearStart, pendingSplitFooterTransition.sourceTopLine)\n }\n\n if (clearStart !== null) {\n const flush = ANSI.moveCursorAndClear(clearStart, 1)\n this.writeOut(flush)\n }\n\n this.currentRenderBuffer.clear(this.backgroundColor)\n }\n\n this.clearPendingSplitFooterTransition()\n\n this._splitHeight = nextGeometry.effectiveFooterHeight\n this.width = nextGeometry.renderWidth\n this.height = nextGeometry.renderHeight\n\n this.lib.resizeRenderer(this.rendererPtr, this.width, this.height)\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.syncSplitScrollback()\n } else {\n this.syncSplitFooterState()\n }\n\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n this._console.resize(this.width, this.height)\n this.root.resize(this.width, this.height)\n this.emit(CliRenderEvents.RESIZE, this.width, this.height)\n this.requestRender()\n }\n\n public setBackgroundColor(color: ColorInput): void {\n const parsedColor = parseColor(color)\n this.lib.setBackgroundColor(this.rendererPtr, parsedColor as RGBA)\n this.backgroundColor = parsedColor as RGBA\n this.nextRenderBuffer.clear(parsedColor as RGBA)\n this.requestRender()\n }\n\n public toggleDebugOverlay(): void {\n const willBeEnabled = !this.debugOverlay.enabled\n\n if (willBeEnabled && !this.memorySnapshotInterval) {\n this.memorySnapshotInterval = 3000\n this.startMemorySnapshotTimer()\n this.automaticMemorySnapshot = true\n } else if (!willBeEnabled && this.automaticMemorySnapshot) {\n this.stopMemorySnapshotTimer()\n this.memorySnapshotInterval = 0\n this.automaticMemorySnapshot = false\n }\n\n this.debugOverlay.enabled = !this.debugOverlay.enabled\n this.lib.setDebugOverlay(this.rendererPtr, this.debugOverlay.enabled, this.debugOverlay.corner)\n this.emit(CliRenderEvents.DEBUG_OVERLAY_TOGGLE, this.debugOverlay.enabled)\n this.requestRender()\n }\n\n public configureDebugOverlay(options: { enabled?: boolean; corner?: DebugOverlayCorner }): void {\n this.debugOverlay.enabled = options.enabled ?? this.debugOverlay.enabled\n this.debugOverlay.corner = options.corner ?? this.debugOverlay.corner\n this.lib.setDebugOverlay(this.rendererPtr, this.debugOverlay.enabled, this.debugOverlay.corner)\n this.requestRender()\n }\n\n public setTerminalTitle(title: string): void {\n this.lib.setTerminalTitle(this.rendererPtr, title)\n }\n\n /**\n * Reset the terminal background color to its default via OSC 111.\n * Called automatically by destroy() and suspend(), but exposed for\n * consumers that need explicit control (e.g. before SIGTSTP).\n */\n public resetTerminalBgColor(): void {\n process.stdout.write(\"\\x1b]111\\x07\")\n }\n\n public copyToClipboardOSC52(text: string, target?: ClipboardTarget): boolean {\n return this.clipboard.copyToClipboardOSC52(text, target)\n }\n\n public clearClipboardOSC52(target?: ClipboardTarget): boolean {\n return this.clipboard.clearClipboardOSC52(target)\n }\n\n public isOsc52Supported(): boolean {\n return this._capabilities?.osc52 ?? this.clipboard.isOsc52Supported()\n }\n\n public dumpHitGrid(): void {\n this.lib.dumpHitGrid(this.rendererPtr)\n }\n\n public dumpBuffers(timestamp?: number): void {\n this.lib.dumpBuffers(this.rendererPtr, timestamp)\n }\n\n public dumpStdoutBuffer(timestamp?: number): void {\n this.lib.dumpStdoutBuffer(this.rendererPtr, timestamp)\n }\n\n public static setCursorPosition(renderer: CliRenderer, x: number, y: number, visible: boolean = true): void {\n const lib = resolveRenderLib()\n lib.setCursorPosition(renderer.rendererPtr, x, y, visible)\n }\n\n public static setCursorStyle(renderer: CliRenderer, options: CursorStyleOptions): void {\n const lib = resolveRenderLib()\n lib.setCursorStyleOptions(renderer.rendererPtr, options)\n if (options.cursor !== undefined) {\n renderer._currentMousePointerStyle = options.cursor\n }\n }\n\n public static setCursorColor(renderer: CliRenderer, color: RGBA): void {\n const lib = resolveRenderLib()\n lib.setCursorColor(renderer.rendererPtr, color)\n }\n\n public setCursorPosition(x: number, y: number, visible: boolean = true): void {\n this.lib.setCursorPosition(this.rendererPtr, x, y, visible)\n }\n\n public setCursorStyle(options: CursorStyleOptions): void {\n this.lib.setCursorStyleOptions(this.rendererPtr, options)\n if (options.cursor !== undefined) {\n this._currentMousePointerStyle = options.cursor\n }\n }\n\n public setCursorColor(color: RGBA): void {\n this.lib.setCursorColor(this.rendererPtr, color)\n }\n\n public getCursorState() {\n return this.lib.getCursorState(this.rendererPtr)\n }\n\n public addPostProcessFn(processFn: (buffer: OptimizedBuffer, deltaTime: number) => void): void {\n this.postProcessFns.push(processFn)\n }\n\n public removePostProcessFn(processFn: (buffer: OptimizedBuffer, deltaTime: number) => void): void {\n this.postProcessFns = this.postProcessFns.filter((fn) => fn !== processFn)\n }\n\n public clearPostProcessFns(): void {\n this.postProcessFns = []\n }\n\n public setFrameCallback(callback: (deltaTime: number) => Promise<void>): void {\n this.frameCallbacks.push(callback)\n }\n\n public removeFrameCallback(callback: (deltaTime: number) => Promise<void>): void {\n this.frameCallbacks = this.frameCallbacks.filter((cb) => cb !== callback)\n }\n\n public clearFrameCallbacks(): void {\n this.frameCallbacks = []\n }\n\n public requestLive(): void {\n this.liveRequestCounter++\n\n if (this._controlState === RendererControlState.IDLE && this.liveRequestCounter > 0) {\n this._controlState = RendererControlState.AUTO_STARTED\n this.internalStart()\n }\n }\n\n public dropLive(): void {\n this.liveRequestCounter = Math.max(0, this.liveRequestCounter - 1)\n\n if (this._controlState === RendererControlState.AUTO_STARTED && this.liveRequestCounter === 0) {\n this._controlState = RendererControlState.IDLE\n this.internalPause()\n }\n }\n\n public start(): void {\n this._controlState = RendererControlState.EXPLICIT_STARTED\n this.internalStart()\n }\n\n public auto(): void {\n this._controlState = this._isRunning ? RendererControlState.AUTO_STARTED : RendererControlState.IDLE\n }\n\n private internalStart(): void {\n if (!this._isRunning && !this._isDestroyed) {\n this._isRunning = true\n\n // Invalidate any queued idle one-shot frame.\n // start()/live/resume transition to the continuous loop, so queued\n // activateFrame callbacks must no-op via !updateScheduled.\n this.updateScheduled = false\n\n if (this.memorySnapshotInterval > 0) {\n this.startMemorySnapshotTimer()\n }\n\n this.startRenderLoop()\n }\n }\n\n public pause(): void {\n this._controlState = RendererControlState.EXPLICIT_PAUSED\n this.internalPause()\n }\n\n public suspend(): void {\n this._previousControlState = this._controlState\n\n this._controlState = RendererControlState.EXPLICIT_SUSPENDED\n this.internalPause()\n\n if (this._terminalIsSetup) {\n this.flushPendingSplitOutputBeforeTransition(true)\n }\n\n this._suspendedMouseEnabled = this._useMouse\n\n this.disableMouse()\n this.removeExitListeners()\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext({\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n })\n this.stdinParser?.reset()\n this.stdin.removeListener(\"data\", this.stdinListener)\n\n this.themeModeState.cancelRefresh()\n\n this.lib.suspendRenderer(this.rendererPtr)\n\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(false)\n }\n\n this.stdin.pause()\n }\n\n public resume(): void {\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(true)\n }\n\n // Drain any input buffered during suspension before registering the\n // listener. Adding a \"data\" listener can auto-resume a Readable, so the\n // drain must come first while the stream is still paused and read()\n // pulls from the internal buffer rather than being a flowing-mode no-op.\n while (this.stdin.read() !== null) {}\n this.stdin.on(\"data\", this.stdinListener)\n this.stdin.resume()\n this.addExitListeners()\n\n this.lib.resumeRenderer(this.rendererPtr)\n if (this._screenMode === \"split-footer\" && this._splitHeight > 0) {\n this.syncSplitFooterState()\n }\n\n if (this._suspendedMouseEnabled) {\n this.enableMouse()\n }\n\n this.currentRenderBuffer.clear(this.backgroundColor)\n this._controlState = this._previousControlState\n\n if (\n this._previousControlState === RendererControlState.AUTO_STARTED ||\n this._previousControlState === RendererControlState.EXPLICIT_STARTED\n ) {\n this.internalStart()\n } else {\n this.requestRender()\n }\n }\n\n private internalPause(): void {\n this._isRunning = false\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n if (!this.rendering) {\n this.resolveIdleIfNeeded()\n }\n }\n\n public stop(): void {\n this._controlState = RendererControlState.EXPLICIT_STOPPED\n this.internalStop()\n }\n\n private internalStop(): void {\n if (this.isRunning && !this._isDestroyed) {\n this._isRunning = false\n\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n // If we're currently rendering, the frame will resolve idle when it completes\n // Otherwise, resolve immediately\n if (!this.rendering) {\n this.resolveIdleIfNeeded()\n }\n }\n }\n\n public destroy(): void {\n if (this._isDestroyed) return\n this._isDestroyed = true\n this._destroyPending = true\n\n if (this.rendering) {\n // Restore terminal/input state immediately, but defer full native teardown until the frame unwinds.\n this.prepareDestroyDuringRender()\n return\n }\n\n this.finalizeDestroy()\n }\n\n private cleanupBeforeDestroy(): void {\n if (this._destroyCleanupPrepared) return\n this._destroyCleanupPrepared = true\n\n process.removeListener(\"SIGWINCH\", this.sigwinchHandler)\n process.removeListener(\"uncaughtException\", this.handleError)\n process.removeListener(\"unhandledRejection\", this.handleError)\n process.removeListener(\"warning\", this.warningHandler)\n process.removeListener(\"beforeExit\", this.exitHandler)\n this.removeExitListeners()\n\n if (this.resizeTimeoutId !== null) {\n this.clock.clearTimeout(this.resizeTimeoutId)\n this.resizeTimeoutId = null\n }\n\n if (this.capabilityTimeoutId !== null) {\n this.clock.clearTimeout(this.capabilityTimeoutId)\n this.capabilityTimeoutId = null\n }\n\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n this.splitStartupSeedTimeoutId = null\n }\n\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n this.themeModeState.cancelRefresh()\n\n this._isRunning = false\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext(\n {\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n true,\n )\n this._useMouse = false\n this.setCapturedRenderable(undefined)\n\n this.stdin.removeListener(\"data\", this.stdinListener)\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(false)\n }\n\n this.externalOutputMode = \"passthrough\"\n\n if (this._splitHeight > 0) {\n this.flushStdoutCache(this._splitHeight, true)\n }\n }\n\n private prepareDestroyDuringRender(): void {\n this.lib.suspendRenderer(this.rendererPtr)\n this.cleanupBeforeDestroy()\n }\n\n private finalizeDestroy(): void {\n if (this._destroyFinalized) return\n\n this._destroyFinalized = true\n this._destroyPending = false\n\n // Reset terminal state (disable mouse tracking, exit alt screen) BEFORE\n // cleanupBeforeDestroy() restores raw mode — otherwise pending mouse events\n // leak as visible escape sequences.\n if (!this._destroyCleanupPrepared) {\n this.lib.suspendRenderer(this.rendererPtr)\n }\n\n this.cleanupBeforeDestroy()\n\n // Clean up palette detector\n if (this._paletteDetector) {\n this._paletteDetector.cleanup()\n this._paletteDetector = null\n }\n this._paletteCache.clear()\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n this._cachedPalette = null\n this._publishedPaletteSignature = null\n this._paletteEpoch = 0\n this._palettePublishGeneration = 0\n\n this.themeModeState.dispose()\n\n this.emit(CliRenderEvents.DESTROY)\n\n try {\n this.root.destroyRecursively()\n } catch (e) {\n console.error(\"Error destroying root renderable:\", e instanceof Error ? e.stack : String(e))\n }\n\n this.stdinParser?.destroy()\n this.stdinParser = null\n this.oscSubscribers.clear()\n this._console.destroy()\n\n if (\n this._splitHeight > 0 &&\n this._terminalIsSetup &&\n this._controlState !== RendererControlState.EXPLICIT_SUSPENDED\n ) {\n this.flushPendingSplitOutputBeforeTransition(true)\n this.renderOffset = 0\n if (this.clearOnShutdown) {\n this.lib.setRenderOffset(this.rendererPtr, 0)\n }\n }\n\n this._externalOutputMode = \"passthrough\"\n this.stdout.write = this.realStdoutWrite\n this.externalOutputQueue.clear()\n\n this.lib.destroyRenderer(this.rendererPtr)\n rendererTracker.removeRenderer(this)\n\n if (this._onDestroy) {\n try {\n this._onDestroy()\n } catch (e) {\n console.error(\"Error in onDestroy callback:\", e instanceof Error ? e.stack : String(e))\n }\n }\n\n // Resolve any pending idle() calls\n this.resolveIdleIfNeeded()\n }\n\n private startRenderLoop(): void {\n if (!this._isRunning) return\n\n this.lastTime = this.normalizeClockTime(this.clock.now(), 0)\n this.frameCount = 0\n this.lastFpsTime = this.lastTime\n this.currentFps = 0\n\n this.loop()\n }\n\n private async loop(): Promise<void> {\n if (this.rendering || this._isDestroyed) return\n this.renderTimeout = null\n\n this.rendering = true\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n try {\n // Bump before any work so all callers this iteration see the new id.\n this._frameId++\n\n const now = this.normalizeClockTime(this.clock.now(), this.lastTime)\n const elapsed = this.getElapsedMs(now, this.lastTime)\n\n const deltaTime = elapsed\n this.lastTime = now\n\n this.frameCount++\n if (this.getElapsedMs(now, this.lastFpsTime) >= 1000) {\n this.currentFps = this.frameCount\n this.frameCount = 0\n this.lastFpsTime = now\n }\n\n this.renderStats.frameCount++\n this.renderStats.fps = this.currentFps\n const overallStart = performance.now()\n\n const frameRequests = Array.from(this.animationRequest.values())\n this.animationRequest.clear()\n const animationRequestStart = performance.now()\n for (const callback of frameRequests) {\n callback(deltaTime)\n this.dropLive()\n }\n const animationRequestEnd = performance.now()\n const animationRequestTime = animationRequestEnd - animationRequestStart\n\n const start = performance.now()\n for (const frameCallback of this.frameCallbacks) {\n try {\n await frameCallback(deltaTime)\n } catch (error) {\n console.error(\"Error in frame callback:\", error)\n }\n }\n const end = performance.now()\n this.renderStats.frameCallbackTime = end - start\n\n this.root.render(this.nextRenderBuffer, deltaTime)\n\n for (const postProcessFn of this.postProcessFns) {\n postProcessFn(this.nextRenderBuffer, deltaTime)\n }\n\n this._console.renderToBuffer(this.nextRenderBuffer)\n\n // If destroy() was requested during this frame, skip native work and scheduling.\n if (!this._isDestroyed) {\n this.renderNative()\n\n // Check if hit grid changed and recheck hover state if needed\n if (this._useMouse && this.lib.getHitGridDirty(this.rendererPtr)) {\n this.recheckHoverState()\n }\n\n const overallFrameTime = performance.now() - overallStart\n\n // TODO: Add animationRequestTime to stats\n this.lib.updateStats(\n this.rendererPtr,\n overallFrameTime,\n this.renderStats.fps,\n this.renderStats.frameCallbackTime,\n )\n\n if (this.gatherStats) {\n this.collectStatSample(overallFrameTime)\n }\n\n if (this._isRunning || this.immediateRerenderRequested) {\n const targetFrameTime = this.immediateRerenderRequested ? this.minTargetFrameTime : this.targetFrameTime\n const delay = Math.max(1, targetFrameTime - Math.floor(overallFrameTime))\n this.immediateRerenderRequested = false\n this.renderTimeout = this.clock.setTimeout(() => {\n this.renderTimeout = null\n this.loop()\n }, delay)\n } else {\n this.clock.clearTimeout(this.renderTimeout!)\n this.renderTimeout = null\n }\n }\n } finally {\n this.rendering = false\n if (this._destroyPending) {\n this.finalizeDestroy()\n }\n this.resolveIdleIfNeeded()\n }\n }\n\n public intermediateRender(): void {\n this.immediateRerenderRequested = true\n this.loop()\n }\n\n private renderNative(): void {\n if (this.renderingNative) {\n console.error(\"Rendering called concurrently\")\n throw new Error(\"Rendering called concurrently\")\n }\n\n this.renderingNative = true\n\n if (\n this.pendingSplitStartupCursorSeed &&\n this.splitStartupSeedTimeoutId !== null &&\n this._splitHeight > 0 &&\n this._externalOutputMode === \"capture-stdout\"\n ) {\n this.renderingNative = false\n return\n }\n\n if (this._splitHeight > 0 && this._externalOutputMode === \"capture-stdout\") {\n // forceFullRepaintRequested is a one-shot latch used when mode/geometry\n // transitions need a complete footer refresh. Consume it once so steady-state\n // capture path keeps using diff-based repainting.\n const forceSplitRepaint = this.forceFullRepaintRequested\n this.forceFullRepaintRequested = false\n this.flushPendingSplitCommits(forceSplitRepaint)\n this.pendingSplitFooterTransition = null\n } else {\n const force = this.forceFullRepaintRequested\n this.forceFullRepaintRequested = false\n this.pendingSplitFooterTransition = null\n this.lib.render(this.rendererPtr, force)\n }\n // this.dumpStdoutBuffer(Date.now())\n this.renderingNative = false\n }\n\n private collectStatSample(frameTime: number): void {\n this.frameTimes.push(frameTime)\n if (this.frameTimes.length > this.maxStatSamples) {\n this.frameTimes.shift()\n }\n }\n\n public getStats(): {\n fps: number\n frameCount: number\n frameTimes: number[]\n averageFrameTime: number\n minFrameTime: number\n maxFrameTime: number\n } {\n const frameTimes = [...this.frameTimes]\n const sum = frameTimes.reduce((acc, time) => acc + time, 0)\n const avg = frameTimes.length ? sum / frameTimes.length : 0\n const min = frameTimes.length ? Math.min(...frameTimes) : 0\n const max = frameTimes.length ? Math.max(...frameTimes) : 0\n\n return {\n fps: this.renderStats.fps,\n frameCount: this.renderStats.frameCount,\n frameTimes,\n averageFrameTime: avg,\n minFrameTime: min,\n maxFrameTime: max,\n }\n }\n\n public resetStats(): void {\n this.frameTimes = []\n this.renderStats.frameCount = 0\n }\n\n public setGatherStats(enabled: boolean): void {\n this.gatherStats = enabled\n if (!enabled) {\n this.frameTimes = []\n }\n }\n\n public getSelection(): Selection | null {\n return this.currentSelection\n }\n\n public get hasSelection(): boolean {\n return !!this.currentSelection\n }\n\n public getSelectionContainer(): Renderable | null {\n return this.selectionContainers.length > 0 ? this.selectionContainers[this.selectionContainers.length - 1] : null\n }\n\n public clearSelection(): void {\n if (this.currentSelection) {\n for (const renderable of this.currentSelection.touchedRenderables) {\n if (renderable.selectable && !renderable.isDestroyed) {\n renderable.onSelectionChanged(null)\n }\n }\n this.currentSelection = null\n }\n this.selectionContainers = []\n }\n\n /**\n * Start a new selection at the given coordinates.\n * Used by both mouse and keyboard selection.\n */\n public startSelection(renderable: Renderable, x: number, y: number): void {\n if (!renderable.selectable) return\n\n this.clearSelection()\n this.selectionContainers.push(renderable.parent || this.root)\n this.currentSelection = new Selection(renderable, { x, y }, { x, y })\n this.currentSelection.isStart = true\n\n this.notifySelectablesOfSelectionChange()\n }\n\n public updateSelection(\n currentRenderable: Renderable | undefined,\n x: number,\n y: number,\n options?: { finishDragging?: boolean },\n ): void {\n if (this.currentSelection) {\n this.currentSelection.isStart = false\n this.currentSelection.focus = { x, y }\n\n if (options?.finishDragging) {\n this.currentSelection.isDragging = false\n }\n\n if (this.selectionContainers.length > 0) {\n const currentContainer = this.selectionContainers[this.selectionContainers.length - 1]\n\n if (!currentRenderable || !this.isWithinContainer(currentRenderable, currentContainer)) {\n const parentContainer = currentContainer.parent || this.root\n this.selectionContainers.push(parentContainer)\n } else if (currentRenderable && this.selectionContainers.length > 1) {\n let containerIndex = this.selectionContainers.indexOf(currentRenderable)\n\n if (containerIndex === -1) {\n const immediateParent = currentRenderable.parent || this.root\n containerIndex = this.selectionContainers.indexOf(immediateParent)\n }\n\n if (containerIndex !== -1 && containerIndex < this.selectionContainers.length - 1) {\n this.selectionContainers = this.selectionContainers.slice(0, containerIndex + 1)\n }\n }\n }\n\n this.notifySelectablesOfSelectionChange()\n }\n }\n\n public requestSelectionUpdate(): void {\n if (this.currentSelection?.isDragging) {\n const pointer = this._latestPointer\n\n const maybeRenderableId = this.hitTest(pointer.x, pointer.y)\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n\n this.updateSelection(maybeRenderable, pointer.x, pointer.y)\n }\n }\n\n private isWithinContainer(renderable: Renderable, container: Renderable): boolean {\n let current: Renderable | null = renderable\n while (current) {\n if (current === container) return true\n current = current.parent\n }\n return false\n }\n\n private finishSelection(): void {\n if (this.currentSelection) {\n this.currentSelection.isDragging = false\n this.emit(CliRenderEvents.SELECTION, this.currentSelection)\n this.notifySelectablesOfSelectionChange()\n }\n }\n\n private notifySelectablesOfSelectionChange(): void {\n const selectedRenderables: Renderable[] = []\n const touchedRenderables: Renderable[] = []\n const currentContainer =\n this.selectionContainers.length > 0 ? this.selectionContainers[this.selectionContainers.length - 1] : this.root\n\n if (this.currentSelection) {\n this.walkSelectableRenderables(\n currentContainer,\n this.currentSelection.bounds,\n selectedRenderables,\n touchedRenderables,\n )\n\n for (const renderable of this.currentSelection.touchedRenderables) {\n if (!touchedRenderables.includes(renderable) && !renderable.isDestroyed) {\n renderable.onSelectionChanged(null)\n }\n }\n\n this.currentSelection.updateSelectedRenderables(selectedRenderables)\n this.currentSelection.updateTouchedRenderables(touchedRenderables)\n }\n }\n\n private walkSelectableRenderables(\n container: Renderable,\n selectionBounds: ViewportBounds,\n selectedRenderables: Renderable[],\n touchedRenderables: Renderable[],\n ): void {\n const children = getObjectsInViewport<Renderable>(\n selectionBounds,\n container.getChildrenSortedByPrimaryAxis(),\n container.primaryAxis,\n 0, // padding\n 0, // minTriggerSize - always perform overlap checks for selection\n )\n\n for (const child of children) {\n if (child.selectable) {\n const hasSelection = child.onSelectionChanged(this.currentSelection)\n if (hasSelection) {\n selectedRenderables.push(child)\n }\n touchedRenderables.push(child)\n }\n if (child.getChildrenCount() > 0) {\n this.walkSelectableRenderables(child, selectionBounds, selectedRenderables, touchedRenderables)\n }\n }\n }\n\n public get paletteDetectionStatus(): \"idle\" | \"detecting\" | \"cached\" {\n if (this._paletteDetectionPromise) return \"detecting\"\n if (this._paletteCache.size > 0) return \"cached\"\n return \"idle\"\n }\n\n private getCachedPaletteBySize(size: number): TerminalColors | null {\n const exactMatch = this._paletteCache.get(size)\n if (exactMatch) {\n return exactMatch\n }\n\n const largerSize = [...this._paletteCache.keys()].sort((a, b) => a - b).find((candidate) => candidate >= size)\n if (largerSize === undefined) {\n return null\n }\n\n const source = this._paletteCache.get(largerSize)\n if (!source) {\n return null\n }\n\n const projected = {\n ...source,\n palette: source.palette.slice(0, size),\n }\n\n this._paletteCache.set(size, projected)\n return projected\n }\n\n private ensurePaletteDetector(): TerminalPaletteDetector {\n if (!this._paletteDetector) {\n const isLegacyTmux =\n this.capabilities?.terminal?.name?.toLowerCase()?.includes(\"tmux\") &&\n this.capabilities?.terminal?.version?.localeCompare(\"3.6\") < 0\n this._paletteDetector = createTerminalPalette(\n this.stdin,\n this.stdout,\n this.writeOut.bind(this),\n isLegacyTmux,\n {\n subscribeOsc: this.subscribeOsc.bind(this),\n },\n this.clock,\n )\n }\n\n return this._paletteDetector\n }\n\n private syncNativePaletteState(colors: TerminalColors | null): void {\n const signature = buildTerminalPaletteSignature(colors)\n if (this._publishedPaletteSignature !== null && this._publishedPaletteSignature !== signature) {\n this._paletteEpoch = (this._paletteEpoch + 1) >>> 0\n }\n\n this._publishedPaletteSignature = signature\n\n const normalized = normalizeTerminalPalette(colors)\n this.lib.rendererSetPaletteState(\n this.rendererPtr,\n normalized.palette,\n normalized.defaultForeground,\n normalized.defaultBackground,\n this._paletteEpoch,\n )\n }\n\n private ensureNativePaletteState(): void {\n if (!this._terminalIsSetup || this._isDestroyed) return\n const publishGeneration = this._palettePublishGeneration\n\n void this.getPalette({ size: NATIVE_PALETTE_QUERY_SIZE })\n .then((colors) => {\n if (this._palettePublishGeneration === publishGeneration) {\n this.syncNativePaletteState(colors)\n }\n this.requestRender()\n })\n .catch(() => {})\n }\n\n public clearPaletteCache(): void {\n this._paletteCache.clear()\n this._cachedPalette = null\n }\n\n /**\n * Detects the terminal's color palette\n *\n * @returns Promise resolving to TerminalColors object containing palette and special colors\n * @throws Error if renderer is suspended\n */\n public async getPalette(options?: GetPaletteOptions): Promise<TerminalColors> {\n if (this._controlState === RendererControlState.EXPLICIT_SUSPENDED) {\n throw new Error(\"Cannot detect palette while renderer is suspended\")\n }\n\n const requestedSize = options?.size ?? 16\n const detectionTimeout = options?.timeout\n\n const cachedPalette = this.getCachedPaletteBySize(requestedSize)\n if (cachedPalette) {\n this._cachedPalette = cachedPalette\n return cachedPalette\n }\n\n if (this._paletteDetectionPromise) {\n if (this._paletteDetectionSize >= requestedSize) {\n return this._paletteDetectionPromise.then((palette) => {\n const cached = this.getCachedPaletteBySize(requestedSize)\n if (cached) {\n this._cachedPalette = cached\n return cached\n }\n\n const projected = {\n ...palette,\n palette: palette.palette.slice(0, requestedSize),\n }\n this._paletteCache.set(requestedSize, projected)\n this._cachedPalette = projected\n return projected\n })\n }\n\n await this._paletteDetectionPromise\n\n const afterWait = this.getCachedPaletteBySize(requestedSize)\n if (afterWait) {\n this._cachedPalette = afterWait\n return afterWait\n }\n }\n\n const detector = this.ensurePaletteDetector()\n const publishGeneration = this._palettePublishGeneration\n this._paletteDetectionSize = requestedSize\n this._paletteDetectionPromise = detector\n .detect({ ...options, timeout: detectionTimeout })\n .then((result) => {\n this._paletteCache.set(result.palette.length, result)\n this._cachedPalette = result\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n\n if (this._palettePublishGeneration === publishGeneration) {\n if (result.palette.length >= NATIVE_PALETTE_QUERY_SIZE) {\n this.syncNativePaletteState(result)\n } else if (this._terminalIsSetup && !this._paletteCache.has(NATIVE_PALETTE_QUERY_SIZE)) {\n this.ensureNativePaletteState()\n }\n }\n\n return result\n })\n .catch((error) => {\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n throw error\n })\n\n const detected = await this._paletteDetectionPromise\n const finalPalette = this.getCachedPaletteBySize(requestedSize) ?? detected\n this._cachedPalette = finalPalette\n return finalPalette\n }\n}\n",
|
|
68
|
+
"import type { ViewportBounds } from \"../types.js\"\n\ninterface ViewportObject {\n screenX: number\n screenY: number\n width: number\n height: number\n zIndex: number\n}\n\n/**\n * Returns objects that overlap with the viewport bounds.\n *\n * @param viewport - The viewport bounds to check against\n * @param objects - Array of objects MUST be sorted by screen position (screenY for column, screenX for row direction)\n * @param direction - Primary scroll direction: \"column\" (vertical) or \"row\" (horizontal)\n * @param padding - Extra padding around viewport to include nearby objects\n * @param minTriggerSize - Minimum array size to use binary search optimization\n * @returns Array of visible objects sorted by zIndex\n *\n * @remarks\n * Objects must be pre-sorted by their start screen position (screenY for column direction, screenX for row direction).\n * Unsorted input will produce incorrect results.\n */\nexport function getObjectsInViewport<T extends ViewportObject>(\n viewport: ViewportBounds,\n objects: T[],\n direction: \"row\" | \"column\" = \"column\",\n padding: number = 10,\n minTriggerSize: number = 16,\n): T[] {\n if (viewport.width <= 0 || viewport.height <= 0) {\n return []\n }\n\n if (objects.length === 0) {\n return []\n }\n\n if (objects.length < minTriggerSize) {\n return objects\n }\n\n const viewportTop = viewport.y - padding\n const viewportBottom = viewport.y + viewport.height + padding\n const viewportLeft = viewport.x - padding\n const viewportRight = viewport.x + viewport.width + padding\n\n const isRow = direction === \"row\"\n\n const children = objects\n const totalChildren = children.length\n if (totalChildren === 0) return []\n\n const vpStart = isRow ? viewportLeft : viewportTop\n const vpEnd = isRow ? viewportRight : viewportBottom\n\n // Binary search to find any child that overlaps along the primary axis\n let lo = 0\n let hi = totalChildren - 1\n let candidate = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n const c = children[mid]\n const start = isRow ? c.screenX : c.screenY\n const end = isRow ? c.screenX + c.width : c.screenY + c.height\n\n if (end < vpStart) {\n lo = mid + 1\n } else if (start > vpEnd) {\n hi = mid - 1\n } else {\n candidate = mid\n break\n }\n }\n\n const visibleChildren: T[] = []\n\n // If binary search found no candidate, the viewport might be in a gap between objects\n // Start from the position where the search ended\n if (candidate === -1) {\n // Binary search failed to find overlap - viewport is in a gap\n // We need to check objects before lo for any that extend into the viewport\n candidate = lo > 0 ? lo - 1 : 0\n }\n\n // Expand left to find all objects that overlap the viewport\n // To handle large objects that start early but extend far, we continue\n // checking even after finding objects that don't overlap, up to a limit\n // This handles cases where many small objects sit between a large object and the viewport\n // Real-world examples: background panels, large images, or spanning containers\n const maxLookBehind = 50\n let left = candidate\n let gapCount = 0\n\n while (left - 1 >= 0) {\n const prev = children[left - 1]\n const prevEnd = isRow ? prev.screenX + prev.width : prev.screenY + prev.height\n\n if (prevEnd <= vpStart) {\n gapCount++\n if (gapCount >= maxLookBehind) {\n break\n }\n } else {\n gapCount = 0\n }\n\n left--\n }\n\n // Expand right to find the rightmost overlapping object\n let right = candidate + 1\n while (right < totalChildren) {\n const next = children[right]\n if ((isRow ? next.screenX : next.screenY) >= vpEnd) break\n right++\n }\n\n // Collect candidates that also overlap on the cross axis\n for (let i = left; i < right; i++) {\n const child = children[i]\n const start = isRow ? child.screenX : child.screenY\n const end = isRow ? child.screenX + child.width : child.screenY + child.height\n\n // Check primary axis overlap (optimization: skip objects that don't overlap)\n if (end <= vpStart) continue\n if (start >= vpEnd) break\n\n // Check cross-axis overlap\n if (isRow) {\n const childBottom = child.screenY + child.height\n if (childBottom < viewportTop) continue\n const childTop = child.screenY\n if (childTop > viewportBottom) continue\n } else {\n const childRight = child.screenX + child.width\n if (childRight < viewportLeft) continue\n const childLeft = child.screenX\n if (childLeft > viewportRight) continue\n }\n\n visibleChildren.push(child)\n }\n\n // Sort by zIndex\n if (visibleChildren.length > 1) {\n visibleChildren.sort((a, b) => (a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0))\n }\n\n return visibleChildren\n}\n",
|
|
69
|
+
"export type RenderGeometryScreenMode = \"alternate-screen\" | \"main-screen\" | \"split-footer\"\n\nexport interface RenderGeometry {\n effectiveFooterHeight: number\n renderOffset: number\n renderWidth: number\n renderHeight: number\n}\n\nexport function calculateRenderGeometry(\n screenMode: RenderGeometryScreenMode,\n terminalWidth: number,\n terminalHeight: number,\n footerHeight: number,\n): RenderGeometry {\n const safeTerminalWidth = Math.max(terminalWidth, 0)\n const safeTerminalHeight = Math.max(terminalHeight, 0)\n\n if (screenMode !== \"split-footer\") {\n return {\n effectiveFooterHeight: 0,\n renderOffset: 0,\n renderWidth: safeTerminalWidth,\n renderHeight: safeTerminalHeight,\n }\n }\n\n const effectiveFooterHeight = Math.min(footerHeight, safeTerminalHeight)\n\n return {\n effectiveFooterHeight,\n renderOffset: safeTerminalHeight - effectiveFooterHeight,\n renderWidth: safeTerminalWidth,\n renderHeight: effectiveFooterHeight,\n }\n}\n",
|
|
70
|
+
"/**\n * Terminal capability response detection utilities.\n *\n * Detects various terminal capability response sequences:\n * - DECRPM (DEC Request Mode): ESC[?...;N$y where N is 0,1,2,3,4\n * - CPR (Cursor Position Report): ESC[row;colR (used for width detection)\n * - XTVersion: ESC P >| ... ESC \\\n * - Kitty Graphics: ESC _ G ... ESC \\\n * - Kitty Keyboard Query: ESC[?Nu where N is 0,1,2,etc\n * - DA1 (Device Attributes): ESC[?...c\n * - Pixel Resolution: ESC[4;height;widtht\n */\n\n/**\n * Check if a sequence is a terminal capability response.\n * Returns true if the sequence matches any known capability response pattern.\n */\nexport function isCapabilityResponse(sequence: string): boolean {\n // DECRPM: ESC[?digits;digits$y\n if (/\\x1b\\[\\?\\d+(?:;\\d+)*\\$y/.test(sequence)) {\n return true\n }\n\n // CPR for explicit width/scaled text detection: ESC[1;NR where N >= 2\n // The column number tells us how many characters were rendered with width annotations\n // ESC[1;1R means no width support (cursor didn't move)\n // ESC[1;2R or higher means width support (cursor moved after rendering)\n // We accept any column >= 2 to handle cases where cursor wasn't at exact home position\n if (/\\x1b\\[1;(?!1R)\\d+R/.test(sequence)) {\n return true\n }\n\n // XTVersion: ESC P >| ... ESC \\\n if (/\\x1bP>\\|[\\s\\S]*?\\x1b\\\\/.test(sequence)) {\n return true\n }\n\n // Kitty graphics response: ESC _ G ... ESC \\\n // Matches any graphics response including OK, errors, etc.\n // This is for filtering capability responses from user input\n if (/\\x1b_G[\\s\\S]*?\\x1b\\\\/.test(sequence)) {\n return true\n }\n\n // Kitty keyboard query response: ESC[?Nu or ESC[?N;Mu (progressive enhancement)\n if (/\\x1b\\[\\?\\d+(?:;\\d+)?u/.test(sequence)) {\n return true\n }\n\n // DA1 (Device Attributes): ESC[?...c\n if (/\\x1b\\[\\?[0-9;]*c/.test(sequence)) {\n return true\n }\n\n return false\n}\n\n/**\n * Check if a sequence is a pixel resolution response.\n * Format: ESC[4;height;widtht\n */\nexport function isPixelResolutionResponse(sequence: string): boolean {\n return /\\x1b\\[4;\\d+;\\d+t/.test(sequence)\n}\n\n/**\n * Parse pixel resolution from response sequence.\n * Returns { width, height } or null if not a valid resolution response.\n */\nexport function parsePixelResolution(sequence: string): { width: number; height: number } | null {\n const match = sequence.match(/\\x1b\\[4;(\\d+);(\\d+)t/)\n if (match) {\n return {\n width: parseInt(match[2]),\n height: parseInt(match[1]),\n }\n }\n return null\n}\n",
|
|
71
|
+
"import { parseColor } from \"./lib/RGBA.js\"\nimport { type Clock, type TimerHandle } from \"./lib/clock.js\"\nimport type { ThemeMode } from \"./types.js\"\n\nconst OSC_THEME_RESPONSE =\n /\\x1b](10|11);(?:(?:rgb:)([0-9a-fA-F]+)\\/([0-9a-fA-F]+)\\/([0-9a-fA-F]+)|#([0-9a-fA-F]{6}))(?:\\x07|\\x1b\\\\)/g\n\nfunction scaleOscThemeComponent(component: string): string {\n const value = parseInt(component, 16)\n const maxValue = (1 << (4 * component.length)) - 1\n return Math.round((value / maxValue) * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nfunction oscThemeColorToHex(r?: string, g?: string, b?: string, hex6?: string): string {\n if (hex6) {\n return `#${hex6.toLowerCase()}`\n }\n\n if (r && g && b) {\n return `#${scaleOscThemeComponent(r)}${scaleOscThemeComponent(g)}${scaleOscThemeComponent(b)}`\n }\n\n return \"#000000\"\n}\n\nfunction inferThemeModeFromBackgroundColor(color: string): ThemeMode {\n const [r, g, b] = parseColor(color).toInts()\n const brightness = (r * 299 + g * 587 + b * 114) / 1000\n return brightness > 128 ? \"light\" : \"dark\"\n}\n\nexport interface RendererThemeModeHost {\n queryThemeColors(): void\n}\n\ntype ThemeWaiter = {\n resolve: (mode: ThemeMode | null) => void\n timeoutHandle: TimerHandle | null\n}\n\nexport class RendererThemeMode {\n private static readonly QUERY_TIMEOUT_MS = 250\n\n private _themeMode: ThemeMode | null = null\n private themeQueryPending = true\n private themeOscForeground: string | null = null\n private themeOscBackground: string | null = null\n private themeRefreshTimeoutId: TimerHandle | null = null\n private waiters = new Set<ThemeWaiter>()\n\n constructor(\n private readonly host: RendererThemeModeHost,\n private readonly clock: Clock,\n ) {}\n\n public get themeMode(): ThemeMode | null {\n return this._themeMode\n }\n\n public waitForThemeMode(timeoutMs: number, isDestroyed: boolean): Promise<ThemeMode | null> {\n if (this._themeMode !== null || isDestroyed || timeoutMs === 0) {\n return Promise.resolve(this._themeMode)\n }\n\n return new Promise<ThemeMode | null>((resolve) => {\n const waiter: ThemeWaiter = {\n resolve,\n timeoutHandle: null,\n }\n\n if (timeoutMs > 0) {\n waiter.timeoutHandle = this.clock.setTimeout(() => {\n this.waiters.delete(waiter)\n waiter.timeoutHandle = null\n resolve(this._themeMode)\n }, timeoutMs)\n }\n\n this.waiters.add(waiter)\n })\n }\n\n public cancelRefresh(): void {\n if (this.themeRefreshTimeoutId === null) {\n return\n }\n\n this.clock.clearTimeout(this.themeRefreshTimeoutId)\n this.themeRefreshTimeoutId = null\n this.themeQueryPending = false\n }\n\n public dispose(): void {\n this.cancelRefresh()\n\n for (const waiter of this.waiters) {\n if (waiter.timeoutHandle !== null) {\n this.clock.clearTimeout(waiter.timeoutHandle)\n }\n waiter.resolve(this._themeMode)\n }\n\n this.waiters.clear()\n }\n\n public handleSequence(sequence: string): { handled: boolean; changedMode: ThemeMode | null } {\n if (sequence === \"\\x1b[?997;1n\" || sequence === \"\\x1b[?997;2n\") {\n this.requestThemeOscColors()\n return { handled: true, changedMode: null }\n }\n\n let handledOscThemeResponse = false\n let match: RegExpExecArray | null\n\n OSC_THEME_RESPONSE.lastIndex = 0\n while ((match = OSC_THEME_RESPONSE.exec(sequence))) {\n handledOscThemeResponse = true\n const color = oscThemeColorToHex(match[2], match[3], match[4], match[5])\n\n if (match[1] === \"10\") {\n this.themeOscForeground = color\n } else {\n this.themeOscBackground = color\n }\n }\n\n if (!handledOscThemeResponse) {\n return { handled: false, changedMode: null }\n }\n\n if (!this.themeQueryPending) {\n return { handled: true, changedMode: null }\n }\n\n if (!this.themeOscForeground || !this.themeOscBackground) {\n return { handled: true, changedMode: null }\n }\n\n const nextMode = inferThemeModeFromBackgroundColor(this.themeOscBackground)\n const changedMode = this.applyThemeMode(nextMode)\n this.completeThemeQuery()\n\n return { handled: true, changedMode }\n }\n\n private clearThemeRefreshTimeout(): void {\n if (this.themeRefreshTimeoutId === null) {\n return\n }\n\n this.clock.clearTimeout(this.themeRefreshTimeoutId)\n this.themeRefreshTimeoutId = null\n }\n\n private completeThemeQuery(): void {\n this.clearThemeRefreshTimeout()\n this.themeQueryPending = false\n }\n\n private requestThemeOscColors(): void {\n if (this.themeRefreshTimeoutId !== null) {\n return\n }\n\n this.themeQueryPending = true\n this.themeOscForeground = null\n this.themeOscBackground = null\n\n this.host.queryThemeColors()\n\n this.clearThemeRefreshTimeout()\n this.themeRefreshTimeoutId = this.clock.setTimeout(() => {\n this.completeThemeQuery()\n }, RendererThemeMode.QUERY_TIMEOUT_MS)\n }\n\n private applyThemeMode(mode: ThemeMode): ThemeMode | null {\n const changed = this._themeMode !== mode\n this._themeMode = mode\n\n if (!changed) {\n return null\n }\n\n for (const waiter of this.waiters) {\n if (waiter.timeoutHandle !== null) {\n this.clock.clearTimeout(waiter.timeoutHandle)\n }\n waiter.resolve(mode)\n }\n\n this.waiters.clear()\n return mode\n }\n}\n"
|
|
72
|
+
],
|
|
73
|
+
"mappings": "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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
|
|
74
|
+
"debugId": "A3534BF85C8469EA64756E2164756E21",
|
|
75
|
+
"names": []
|
|
76
|
+
}
|