@opentui/core 0.4.1 → 0.4.3

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.
@@ -0,0 +1,58 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../node_modules/.bun/emoji-regex@10.6.0/node_modules/emoji-regex/index.js", "../src/platform/ffi.ts", "../src/platform/runtime.ts", "../../../node_modules/.bun/ansi-regex@6.2.2/node_modules/ansi-regex/index.js", "../../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js", "../../../node_modules/.bun/get-east-asian-width@1.4.0/node_modules/get-east-asian-width/lookup.js", "../../../node_modules/.bun/get-east-asian-width@1.4.0/node_modules/get-east-asian-width/index.js", "../../../node_modules/.bun/string-width@7.2.0/node_modules/string-width/index.js", "../src/zig.ts", "../src/lib/RGBA.ts", "../src/lib/border.ts", "../src/lib/KeyHandler.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/platform/worker.ts", "../src/lib/data-paths.ts", "../src/lib/validate-dir-name.ts", "../src/lib/tree-sitter/resolve-ft.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/clipboard.ts", "../src/lib/detect-links.ts", "../src/buffer.ts", "../src/text-buffer.ts", "../../../node_modules/.bun/bun-ffi-structs@0.2.4+1fb4c65d43e298b9/node_modules/bun-ffi-structs/dist/index.js", "../src/zig-structs.ts", "../src/yoga.ts"],
4
+ "sourcesContent": [
5
+ "module.exports = () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED8\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC2\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF]|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n",
6
+ "import { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\ndeclare const pointerBrand: unique symbol\n\n// This module owns OpenTUI's native FFI surface. Portable code imports this\n// file instead of bun:ffi, so backends can keep the same call sites.\n\n// External FFI producers may expose their own branded pointer types. Public APIs\n// that consume foreign pointers should accept the raw pointer shape and normalize\n// it before crossing OpenTUI's native boundary.\nexport type PointerInput = number | bigint\n\n// Runtime pointers are numbers in Bun and bigints in Node's experimental FFI.\n// Keep both in our own type, and narrow only inside a backend that requires it.\nexport type Pointer = PointerInput & { readonly [pointerBrand]: \"Pointer\" }\n\ntype PointerSource = ArrayBufferLike | ArrayBufferView\n\n// Bun accepts numeric pointers only. Keep this type private so Bun's pointer\n// model does not leak into the exported surface.\ntype BunPointer = number\n\n// These names match the Bun FFI type strings OpenTUI uses today. Other\n// backends map them at library load time instead of wrapping every native call.\nexport const FFIType = {\n char: \"char\",\n int8_t: \"int8_t\",\n i8: \"i8\",\n uint8_t: \"uint8_t\",\n u8: \"u8\",\n int16_t: \"int16_t\",\n i16: \"i16\",\n uint16_t: \"uint16_t\",\n u16: \"u16\",\n int32_t: \"int32_t\",\n i32: \"i32\",\n int: \"int\",\n uint32_t: \"uint32_t\",\n u32: \"u32\",\n int64_t: \"int64_t\",\n i64: \"i64\",\n uint64_t: \"uint64_t\",\n u64: \"u64\",\n double: \"double\",\n f64: \"f64\",\n float: \"float\",\n f32: \"f32\",\n bool: \"bool\",\n ptr: \"ptr\",\n pointer: \"pointer\",\n void: \"void\",\n cstring: \"cstring\",\n function: \"function\",\n usize: \"usize\",\n callback: \"callback\",\n napi_env: \"napi_env\",\n napi_value: \"napi_value\",\n buffer: \"buffer\",\n} as const\n\nexport type FFIType = (typeof FFIType)[keyof typeof FFIType]\n// Kept as a source-shape compatibility alias for Bun-style call sites.\nexport type FFITypeOrString = FFIType\n\n// A function definition describes one native symbol. `ptr` overrides the symbol\n// address and follows the same pointer safety rules as normal pointer values.\nexport interface FFIFunction {\n readonly args?: readonly FFITypeOrString[]\n readonly returns?: FFITypeOrString\n readonly ptr?: Pointer\n readonly threadsafe?: boolean\n}\n\n// A callback instance owns a native trampoline. `close()` invalidates `ptr`;\n// callers must not pass that pointer to native code after close.\nexport interface FFICallbackInstance {\n readonly ptr: Pointer | null\n readonly threadsafe: boolean\n close(): void\n}\n\n// A loaded library owns callbacks created through `createCallback()`.\n//\n// Typical use:\n// const callback = library.createCallback(handler, { args: [\"ptr\"], returns: \"void\" })\n// library.symbols.setLogCallback(callback.ptr)\n//\n// `close()` first closes the native library, then closes any callbacks that\n// remain open.\nexport interface Library<Fns extends Record<string, FFIFunction>> {\n symbols: { [K in keyof Fns]: (...args: any[]) => any }\n createCallback(callback: (...args: any[]) => any, definition: FFIFunction): FFICallbackInstance\n close(): void\n}\n\n// A backend normalizes runtime differences once. Do not wrap hot symbol calls\n// here unless a backend must adapt them.\ninterface FfiBackend {\n dlopen<Fns extends Record<string, FFIFunction>>(path: string | URL, symbols: Fns): Library<Fns>\n ptr(value: PointerSource): Pointer\n suffix: string\n toArrayBuffer(pointer: Pointer, offset: number | undefined, length: number): ArrayBuffer\n}\n\ninterface BunFFIFunction {\n readonly args?: readonly FFITypeOrString[]\n readonly returns?: FFITypeOrString\n readonly ptr?: BunPointer\n readonly threadsafe?: boolean\n}\n\ninterface BunFfiLibrary<Fns extends Record<string, BunFFIFunction>> {\n symbols: { [K in keyof Fns]: (...args: any[]) => any }\n close(): void\n}\n\ninterface BunFfiBackend {\n JSCallback: new (callback: (...args: any[]) => any, definition: BunFFIFunction) => FFICallbackInstance\n dlopen<Fns extends Record<string, BunFFIFunction>>(path: string | URL, symbols: Fns): BunFfiLibrary<Fns>\n ptr(value: PointerSource): Pointer\n suffix: string\n toArrayBuffer(pointer: BunPointer, offset: number | undefined, length: number): ArrayBuffer\n}\n\ninterface NodeFFIFunction {\n readonly arguments: readonly string[]\n readonly return: string\n}\n\ninterface NodeDynamicLibrary {\n close(): void\n registerCallback(signature: NodeFFIFunction, callback: (...args: any[]) => any): bigint\n unregisterCallback(pointer: bigint): void\n}\n\ninterface NodeFfiLibrary {\n readonly lib: NodeDynamicLibrary\n readonly functions: Record<string, (...args: any[]) => any>\n}\n\ninterface NodeFfiBackend {\n dlopen(path: string | null, symbols: Record<string, NodeFFIFunction>): NodeFfiLibrary\n getRawPointer(source: ArrayBuffer): bigint\n suffix: string\n toArrayBuffer(pointer: bigint, length: number, copy?: boolean): ArrayBuffer\n}\n\nexport const FFI_UNAVAILABLE = \"OpenTUI native FFI is not available for this runtime yet\"\nexport const BUN_DLOPEN_NULL = \"Bun FFI backend does not support dlopen(null)\"\nexport const LIBRARY_CLOSED = \"Cannot create FFI callback after library.close() has been called\"\nexport const NODE_CALLBACK_THREADSAFE =\n \"Node FFI callbacks are same-thread only and do not support threadsafe callbacks\"\nexport const NODE_NAPI_UNSUPPORTED = \"Node FFI backend does not support Bun N-API FFI types\"\nexport const NODE_POINTER_OVERRIDE = \"Node FFI backend does not support FFIFunction.ptr overrides\"\nexport const NODE_POINTER_ARGUMENT = \"Node FFI pointer arguments must be a Pointer, ArrayBuffer, or ArrayBufferView\"\nexport const NODE_PTR_VALUE =\n \"node:ffi ptr() only supports ArrayBuffer and ArrayBufferView values backed by ArrayBuffer\"\nexport const NODE_STRING_RETURN = \"Node FFI backend does not normalize string return values (yet)\"\nexport const NODE_USIZE_UNSUPPORTED = \"Node FFI backend does not support usize yet\"\nexport const POINTER_NEGATIVE = \"Pointer must be non-negative\"\nexport const POINTER_OFFSET_NEGATIVE = \"Pointer offset must be non-negative\"\nexport const POINTER_OFFSET_UNSAFE = \"Pointer offset must be a safe integer\"\nexport const POINTER_UNSAFE = \"Pointer exceeds safe integer range\"\n\nfunction unavailable(cause?: unknown): never {\n throw new Error(FFI_UNAVAILABLE, { cause })\n}\n\n// The placeholder backend lets non-Bun runtimes load without errors.\nfunction createUnsupportedBackend(cause?: unknown): FfiBackend {\n return {\n dlopen() {\n return unavailable(cause)\n },\n ptr() {\n return unavailable(cause)\n },\n suffix: \"\",\n toArrayBuffer() {\n return unavailable(cause)\n },\n }\n}\n\nconst isBun =\n typeof process !== \"undefined\" &&\n typeof process.versions === \"object\" &&\n process.versions !== null &&\n typeof process.versions.bun === \"string\"\n\nconst requireModule = createRequire(import.meta.url)\nconst backend = loadBackend()\n\nfunction loadBackend(): FfiBackend {\n // Keep the Bun module import behind the runtime check so Node does not\n // resolve bun:ffi during import.\n if (isBun) {\n return createBunBackend(requireModule(\"bun:ffi\") as BunFfiBackend)\n }\n\n try {\n const nodeFfi = requireModule(\"node:ffi\") as NodeFfiBackend & { default?: NodeFfiBackend }\n return createNodeBackend(nodeFfi.default ?? nodeFfi)\n } catch (error) {\n return createUnsupportedBackend(error)\n }\n}\n\n// Normalize foreign pointer-like values into the current runtime's pointer\n// representation before passing them to native code.\nexport function toPointer(value: PointerInput): Pointer {\n if (isBun && typeof value === \"bigint\") {\n return toSafeNumberPointer(value) as Pointer\n }\n\n if (!isBun && typeof value === \"number\") {\n return toSafeBigIntPointer(value) as Pointer\n }\n\n return value as Pointer\n}\n\nexport function ffiBool(value: boolean): 0 | 1 {\n return value ? 1 : 0\n}\n\n// Convert a bigint pointer to a number only when JavaScript can represent it\n// exactly. A rounded pointer would target the wrong address.\nfunction toSafeNumberPointer(pointer: bigint): number {\n if (pointer < 0n) {\n throw new Error(POINTER_NEGATIVE)\n }\n\n if (pointer > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(POINTER_UNSAFE)\n }\n\n return Number(pointer)\n}\n\nfunction toSafeBigIntPointer(pointer: number): bigint {\n if (pointer < 0) {\n throw new Error(POINTER_NEGATIVE)\n }\n\n if (!Number.isSafeInteger(pointer)) {\n throw new Error(POINTER_UNSAFE)\n }\n\n return BigInt(pointer)\n}\n\n// Wrap a backend callback so the loaded library can close it later. The wrapper\n// keeps `ptr` live until close, then clears it so callers cannot reuse a stale\n// trampoline pointer.\nfunction createManagedCallback(raw: FFICallbackInstance, callbacks: Set<FFICallbackInstance>): FFICallbackInstance {\n let ptr = raw.ptr\n let closed = false\n\n const instance: FFICallbackInstance = {\n get ptr() {\n return ptr\n },\n get threadsafe() {\n return raw.threadsafe\n },\n close() {\n if (closed) {\n return\n }\n\n closed = true\n callbacks.delete(instance)\n try {\n raw.close()\n } finally {\n // Clear the pointer even if the backend close throws. The trampoline is\n // no longer safe to use.\n ptr = null\n }\n },\n }\n\n callbacks.add(instance)\n\n return instance\n}\n\nfunction normalizeBunDefinitions<Fns extends Record<string, FFIFunction>>(\n definitions: Fns,\n): { [K in keyof Fns]: BunFFIFunction } {\n // Normalize all Bun definitions before `dlopen()`. Bun rejects bigint pointer\n // overrides, so convert them once before loading the native library.\n return Object.fromEntries(\n Object.entries(definitions).map(([name, definition]) => [name, normalizeBunDefinition(definition)]),\n ) as { [K in keyof Fns]: BunFFIFunction }\n}\n\nfunction normalizeBunDefinition(definition: FFIFunction): BunFFIFunction {\n return {\n args: definition.args,\n returns: definition.returns,\n ptr: definition.ptr == null ? undefined : toBunPointer(definition.ptr),\n threadsafe: definition.threadsafe,\n }\n}\n\n// Convert Pointer pointers to Bun pointers at the Bun boundary only.\nfunction toBunPointer(pointer: Pointer): BunPointer {\n return typeof pointer === \"bigint\" ? toSafeNumberPointer(pointer) : pointer\n}\n\n// Create a Bun backend from bun:ffi.\nexport function createBunBackend(bun: BunFfiBackend): FfiBackend {\n return {\n dlopen(path, symbols) {\n if (path === null) {\n throw new Error(BUN_DLOPEN_NULL)\n }\n\n const library = bun.dlopen(path, normalizeBunDefinitions(symbols))\n const callbacks = new Set<FFICallbackInstance>()\n let closed = false\n\n return {\n symbols: library.symbols,\n createCallback(callback, definition) {\n if (closed) {\n // A closed library no longer owns native state. New callbacks would\n // have no cleanup path.\n throw new Error(LIBRARY_CLOSED)\n }\n\n // Bun callbacks are standalone objects. OpenTUI treats them as\n // library-owned to match the future Node FFI shape and to avoid\n // leaked trampolines.\n const raw = new bun.JSCallback(callback, normalizeBunDefinition(definition))\n\n return createManagedCallback(raw, callbacks)\n },\n close() {\n if (closed) {\n return\n }\n\n closed = true\n\n try {\n // Close native state while callbacks still point to live\n // trampolines. Native teardown may call back during final cleanup.\n library.close()\n } finally {\n // After native teardown, close any JS trampolines the caller did\n // not close explicitly.\n for (const callback of [...callbacks]) {\n callback.close()\n }\n }\n },\n }\n },\n ptr: bun.ptr,\n suffix: bun.suffix,\n toArrayBuffer(pointer, offset, length) {\n // Bun only accepts numeric pointers here. Keep the coercion at this\n // backend boundary.\n return bun.toArrayBuffer(toBunPointer(pointer), offset, length)\n },\n }\n}\n\n// Create a Node backend from node:ffi.\nexport function createNodeBackend(nodeFfi: NodeFfiBackend): FfiBackend {\n return {\n dlopen(path, symbols) {\n const { lib, functions } = nodeFfi.dlopen(toNodeLibraryPath(path), normalizeNodeDefinitions(symbols))\n const callbacks = new Set<FFICallbackInstance>()\n let closed = false\n let libraryClosed = false\n\n return {\n symbols: wrapNodeSymbols(functions, symbols),\n createCallback(callback, definition) {\n if (closed) {\n throw new Error(LIBRARY_CLOSED)\n }\n\n if (definition.threadsafe) {\n throw new Error(NODE_CALLBACK_THREADSAFE)\n }\n\n const callbackPointer = lib.registerCallback(normalizeNodeDefinition(definition), callback)\n const raw: FFICallbackInstance = {\n ptr: callbackPointer as Pointer,\n threadsafe: false,\n close() {\n if (!libraryClosed) {\n lib.unregisterCallback(callbackPointer)\n }\n },\n }\n\n return createManagedCallback(raw, callbacks)\n },\n close() {\n if (closed) {\n return\n }\n\n closed = true\n\n try {\n libraryClosed = true\n lib.close()\n } finally {\n for (const callback of [...callbacks]) {\n callback.close()\n }\n }\n },\n }\n },\n ptr(value) {\n return toNodeSourcePointer(nodeFfi, value) as Pointer\n },\n suffix: nodeFfi.suffix,\n toArrayBuffer(pointer, offset, length) {\n return nodeFfi.toArrayBuffer(toBigIntPointer(pointer) + toNodePointerOffset(offset), length, false)\n },\n }\n}\n\nfunction toNodeLibraryPath(path: string | URL | null): string | null {\n return path instanceof URL ? fileURLToPath(path) : path\n}\n\nfunction normalizeNodeDefinitions<Fns extends Record<string, FFIFunction>>(\n definitions: Fns,\n): Record<string, NodeFFIFunction> {\n return Object.fromEntries(\n Object.entries(definitions).map(([name, definition]) => [name, normalizeNodeDefinition(definition)]),\n )\n}\n\nfunction wrapNodeSymbols<Fns extends Record<string, FFIFunction>>(\n functions: Record<string, (...args: any[]) => any>,\n definitions: Fns,\n): { [K in keyof Fns]: (...args: any[]) => any } {\n return Object.fromEntries(\n Object.entries(functions).map(([name, fn]) => [name, wrapNodeSymbol(fn, definitions[name])]),\n ) as { [K in keyof Fns]: (...args: any[]) => any }\n}\n\nfunction wrapNodeSymbol(fn: (...args: any[]) => any, definition: FFIFunction): (...args: any[]) => any {\n const pointerArgIndexes = (definition.args ?? []).flatMap((type, index) =>\n isNodePointerArgumentType(type) ? [index] : [],\n )\n\n if (pointerArgIndexes.length === 0) {\n return fn\n }\n\n return (...args: any[]) => {\n const normalizedArgs = args.slice()\n\n for (const index of pointerArgIndexes) {\n normalizedArgs[index] = toNodePointerArgument(normalizedArgs[index])\n }\n\n return fn(...normalizedArgs)\n }\n}\n\nfunction isNodePointerArgumentType(type: FFITypeOrString): boolean {\n return type === FFIType.ptr || type === FFIType.pointer || type === FFIType.function || type === FFIType.callback\n}\n\nfunction toNodePointerArgument(value: unknown): bigint | ArrayBuffer | ArrayBufferView {\n if (value == null) {\n return 0n\n }\n\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return toBigIntPointer(value as Pointer)\n }\n\n if (ArrayBuffer.isView(value)) {\n if (!(value.buffer instanceof ArrayBuffer)) {\n throw new TypeError(NODE_PTR_VALUE)\n }\n\n if (value.byteLength === 0) {\n return 0n\n }\n\n return value\n }\n\n if (value instanceof ArrayBuffer) {\n if (value.byteLength === 0) {\n return 0n\n }\n\n return value\n }\n\n throw new TypeError(NODE_POINTER_ARGUMENT)\n}\n\nfunction toNodeSourcePointer(nodeFfi: NodeFfiBackend, value: PointerSource): bigint {\n if (ArrayBuffer.isView(value)) {\n if (!(value.buffer instanceof ArrayBuffer)) {\n throw new TypeError(NODE_PTR_VALUE)\n }\n\n return nodeFfi.getRawPointer(value.buffer) + BigInt(value.byteOffset)\n }\n\n if (value instanceof ArrayBuffer) {\n return nodeFfi.getRawPointer(value)\n }\n\n throw new TypeError(NODE_PTR_VALUE)\n}\n\nfunction toNodePointerOffset(offset: number | undefined): bigint {\n if (offset == null) {\n return 0n\n }\n\n if (offset < 0) {\n throw new Error(POINTER_OFFSET_NEGATIVE)\n }\n\n if (!Number.isSafeInteger(offset)) {\n throw new Error(POINTER_OFFSET_UNSAFE)\n }\n\n return BigInt(offset)\n}\n\nfunction normalizeNodeDefinition(definition: FFIFunction): NodeFFIFunction {\n if (definition.ptr != null) {\n throw new Error(NODE_POINTER_OVERRIDE)\n }\n\n return {\n arguments: (definition.args ?? []).map((type) => toNodeFFIType(type, \"parameter\")),\n return: toNodeFFIType(definition.returns ?? FFIType.void, \"result\"),\n }\n}\n\nfunction toNodeFFIType(type: FFITypeOrString, position: \"parameter\" | \"result\"): string {\n switch (type) {\n case FFIType.char:\n return \"char\"\n case FFIType.int8_t:\n case FFIType.i8:\n return \"i8\"\n case FFIType.uint8_t:\n case FFIType.u8:\n return \"u8\"\n case FFIType.int16_t:\n case FFIType.i16:\n return \"i16\"\n case FFIType.uint16_t:\n case FFIType.u16:\n return \"u16\"\n case FFIType.int32_t:\n case FFIType.int:\n case FFIType.i32:\n return \"i32\"\n case FFIType.uint32_t:\n case FFIType.u32:\n return \"u32\"\n case FFIType.int64_t:\n case FFIType.i64:\n return \"i64\"\n case FFIType.uint64_t:\n case FFIType.u64:\n return \"u64\"\n case FFIType.double:\n case FFIType.f64:\n return \"f64\"\n case FFIType.float:\n case FFIType.f32:\n return \"f32\"\n case FFIType.bool:\n return \"bool\"\n case FFIType.ptr:\n case FFIType.pointer:\n return \"pointer\"\n case FFIType.void:\n return \"void\"\n case FFIType.cstring:\n // TODO(audit): cstring vs string semantics differ between backends.\n //\n // The type-name mapping here is intentional, but the runtime marshalling\n // is not equivalent:\n // - Bun's `cstring` parameter rejects raw JavaScript strings; callers\n // must pass a TypedArray, a Pointer, or a CString.\n // - Node's `string` parameter copies a JavaScript string to a\n // temporary NUL-terminated UTF-8 buffer for the duration of the\n // call.\n //\n // Callsites should encode strings into byte buffers and pass pointers\n // instead of relying on either backend's string handling.\n if (position === \"result\") {\n throw new Error(NODE_STRING_RETURN)\n }\n\n return \"string\"\n case FFIType.function:\n case FFIType.callback:\n // Pointer-like types (pointer, string, buffer, arraybuffer, and function)\n // are all passed as pointers in node:ffi.\n return \"pointer\"\n case FFIType.usize:\n // `usize` needs an ABI audit before Node support; use u64 would require\n // BigInt call sites and u32 can truncate pointers.\n throw new Error(NODE_USIZE_UNSUPPORTED)\n case FFIType.napi_env:\n case FFIType.napi_value:\n // Bun's N-API bridge types are not equivalent to raw Node FFI pointers.\n throw new Error(NODE_NAPI_UNSUPPORTED)\n case FFIType.buffer:\n return \"buffer\"\n default:\n return unsupportedNodeFFIType(type)\n }\n}\n\nfunction unsupportedNodeFFIType(type: never): never {\n throw new Error(`Unsupported FFIType for node:ffi: ${String(type)}`)\n}\n\nfunction toBigIntPointer(pointer: Pointer): bigint {\n if (typeof pointer === \"bigint\") {\n if (pointer < 0n) {\n throw new Error(POINTER_NEGATIVE)\n }\n\n return pointer\n }\n\n return toSafeBigIntPointer(pointer)\n}\n\nexport const dlopen = backend.dlopen\nexport const ptr = backend.ptr\nexport const suffix = backend.suffix\nexport const toArrayBuffer = backend.toArrayBuffer\n",
7
+ "import { existsSync } from \"node:fs\"\nimport { mkdir, writeFile as writeFileNode } from \"node:fs/promises\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport stringWidthLib from \"string-width\"\nimport stripAnsiLib from \"strip-ansi\"\n\nexport interface WriteFileOptions {\n createPath?: boolean\n mode?: number\n}\n\ninterface BunLike {\n sleep(msOrDate: number | Date): Promise<void>\n stringWidth(text: string): number\n stripANSI(text: string): string\n write(destination: string | URL, data: string | ArrayBufferView, options?: WriteFileOptions): Promise<number>\n}\n\ninterface FileImportModule {\n default: string\n}\n\ntype FilePathFallback = string | URL | (() => string | URL)\n\ntype GlobalWithBun = typeof globalThis & { Bun?: BunLike }\n\nconst TEXT_ENCODER = new TextEncoder()\nconst bun = (globalThis as GlobalWithBun).Bun\n\nexport const sleep: (msOrDate: number | Date) => Promise<void> = bun?.sleep ?? standardSleep\nexport const stringWidth: (text: string) => number = bun?.stringWidth ?? stringWidthLib\nexport const stripANSI: (text: string) => string = bun?.stripANSI ?? stripAnsiLib\nexport const writeFile: (\n destination: string | URL,\n data: string | ArrayBufferView,\n options?: WriteFileOptions,\n) => Promise<number> = bun?.write ?? writeFilePortable\n\n// Bun only discovers bundled file-like assets from the literal import expression at the call site.\nexport async function resolveBundledFilePath(\n loadBundledFile: () => Promise<FileImportModule>,\n fallbackPath: FilePathFallback,\n metaUrl: string,\n): Promise<string> {\n if (!bun) {\n const path = resolveFallbackFilePath(fallbackPath, metaUrl)\n if (existsSync(path)) {\n return path\n }\n\n return (await loadBundledFilePath(loadBundledFile, metaUrl)) ?? path\n }\n\n return normalizeLoadedFilePath((await loadBundledFile()).default, metaUrl)\n}\n\nfunction resolveFallbackFilePath(fallbackPath: FilePathFallback, metaUrl: string): string {\n const path = typeof fallbackPath === \"function\" ? fallbackPath() : fallbackPath\n return fileURLToPath(path instanceof URL ? path : new URL(path, metaUrl))\n}\n\nfunction normalizeLoadedFilePath(loadedPath: string, baseUrl: string): string {\n if (loadedPath.startsWith(\"file:\")) {\n return fileURLToPath(loadedPath)\n }\n\n if (isAbsolute(loadedPath)) {\n return loadedPath\n }\n\n return resolve(dirname(fileURLToPath(baseUrl)), loadedPath)\n}\n\nasync function loadBundledFilePath(\n loadBundledFile: () => Promise<FileImportModule>,\n metaUrl: string,\n): Promise<string | undefined> {\n const specifier = extractBundledImportSpecifier(loadBundledFile)\n if (!specifier) {\n return undefined\n }\n\n try {\n const moduleUrl = new URL(specifier, metaUrl)\n const loaded = (await import(moduleUrl.href)) as FileImportModule\n return normalizeLoadedFilePath(loaded.default, moduleUrl.href)\n } catch {\n return undefined\n }\n}\n\nfunction extractBundledImportSpecifier(loadBundledFile: () => Promise<FileImportModule>): string | undefined {\n const match = String(loadBundledFile).match(/\\bimport\\(\\s*([\"'`])([^\"'`]+)\\1/)\n return match?.[2]\n}\n\nfunction standardSleep(msOrDate: number | Date): Promise<void> {\n const ms = msOrDate instanceof Date ? msOrDate.getTime() - Date.now() : msOrDate\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function writeFilePortable(\n destination: string | URL,\n data: string | ArrayBufferView,\n options?: WriteFileOptions,\n): Promise<number> {\n const destinationPath = destination instanceof URL ? fileURLToPath(destination) : destination\n\n if (options?.createPath) {\n await mkdir(dirname(destinationPath), { recursive: true })\n }\n\n const bytes =\n typeof data === \"string\" ? TEXT_ENCODER.encode(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n\n await writeFileNode(destinationPath, bytes, { mode: options?.mode })\n\n return bytes.byteLength\n}\n",
8
+ "export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n",
9
+ "import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n",
10
+ "// Generated code.\n\nfunction isAmbiguous(x) {\n\treturn x === 0xA1\n\t\t|| x === 0xA4\n\t\t|| x === 0xA7\n\t\t|| x === 0xA8\n\t\t|| x === 0xAA\n\t\t|| x === 0xAD\n\t\t|| x === 0xAE\n\t\t|| x >= 0xB0 && x <= 0xB4\n\t\t|| x >= 0xB6 && x <= 0xBA\n\t\t|| x >= 0xBC && x <= 0xBF\n\t\t|| x === 0xC6\n\t\t|| x === 0xD0\n\t\t|| x === 0xD7\n\t\t|| x === 0xD8\n\t\t|| x >= 0xDE && x <= 0xE1\n\t\t|| x === 0xE6\n\t\t|| x >= 0xE8 && x <= 0xEA\n\t\t|| x === 0xEC\n\t\t|| x === 0xED\n\t\t|| x === 0xF0\n\t\t|| x === 0xF2\n\t\t|| x === 0xF3\n\t\t|| x >= 0xF7 && x <= 0xFA\n\t\t|| x === 0xFC\n\t\t|| x === 0xFE\n\t\t|| x === 0x101\n\t\t|| x === 0x111\n\t\t|| x === 0x113\n\t\t|| x === 0x11B\n\t\t|| x === 0x126\n\t\t|| x === 0x127\n\t\t|| x === 0x12B\n\t\t|| x >= 0x131 && x <= 0x133\n\t\t|| x === 0x138\n\t\t|| x >= 0x13F && x <= 0x142\n\t\t|| x === 0x144\n\t\t|| x >= 0x148 && x <= 0x14B\n\t\t|| x === 0x14D\n\t\t|| x === 0x152\n\t\t|| x === 0x153\n\t\t|| x === 0x166\n\t\t|| x === 0x167\n\t\t|| x === 0x16B\n\t\t|| x === 0x1CE\n\t\t|| x === 0x1D0\n\t\t|| x === 0x1D2\n\t\t|| x === 0x1D4\n\t\t|| x === 0x1D6\n\t\t|| x === 0x1D8\n\t\t|| x === 0x1DA\n\t\t|| x === 0x1DC\n\t\t|| x === 0x251\n\t\t|| x === 0x261\n\t\t|| x === 0x2C4\n\t\t|| x === 0x2C7\n\t\t|| x >= 0x2C9 && x <= 0x2CB\n\t\t|| x === 0x2CD\n\t\t|| x === 0x2D0\n\t\t|| x >= 0x2D8 && x <= 0x2DB\n\t\t|| x === 0x2DD\n\t\t|| x === 0x2DF\n\t\t|| x >= 0x300 && x <= 0x36F\n\t\t|| x >= 0x391 && x <= 0x3A1\n\t\t|| x >= 0x3A3 && x <= 0x3A9\n\t\t|| x >= 0x3B1 && x <= 0x3C1\n\t\t|| x >= 0x3C3 && x <= 0x3C9\n\t\t|| x === 0x401\n\t\t|| x >= 0x410 && x <= 0x44F\n\t\t|| x === 0x451\n\t\t|| x === 0x2010\n\t\t|| x >= 0x2013 && x <= 0x2016\n\t\t|| x === 0x2018\n\t\t|| x === 0x2019\n\t\t|| x === 0x201C\n\t\t|| x === 0x201D\n\t\t|| x >= 0x2020 && x <= 0x2022\n\t\t|| x >= 0x2024 && x <= 0x2027\n\t\t|| x === 0x2030\n\t\t|| x === 0x2032\n\t\t|| x === 0x2033\n\t\t|| x === 0x2035\n\t\t|| x === 0x203B\n\t\t|| x === 0x203E\n\t\t|| x === 0x2074\n\t\t|| x === 0x207F\n\t\t|| x >= 0x2081 && x <= 0x2084\n\t\t|| x === 0x20AC\n\t\t|| x === 0x2103\n\t\t|| x === 0x2105\n\t\t|| x === 0x2109\n\t\t|| x === 0x2113\n\t\t|| x === 0x2116\n\t\t|| x === 0x2121\n\t\t|| x === 0x2122\n\t\t|| x === 0x2126\n\t\t|| x === 0x212B\n\t\t|| x === 0x2153\n\t\t|| x === 0x2154\n\t\t|| x >= 0x215B && x <= 0x215E\n\t\t|| x >= 0x2160 && x <= 0x216B\n\t\t|| x >= 0x2170 && x <= 0x2179\n\t\t|| x === 0x2189\n\t\t|| x >= 0x2190 && x <= 0x2199\n\t\t|| x === 0x21B8\n\t\t|| x === 0x21B9\n\t\t|| x === 0x21D2\n\t\t|| x === 0x21D4\n\t\t|| x === 0x21E7\n\t\t|| x === 0x2200\n\t\t|| x === 0x2202\n\t\t|| x === 0x2203\n\t\t|| x === 0x2207\n\t\t|| x === 0x2208\n\t\t|| x === 0x220B\n\t\t|| x === 0x220F\n\t\t|| x === 0x2211\n\t\t|| x === 0x2215\n\t\t|| x === 0x221A\n\t\t|| x >= 0x221D && x <= 0x2220\n\t\t|| x === 0x2223\n\t\t|| x === 0x2225\n\t\t|| x >= 0x2227 && x <= 0x222C\n\t\t|| x === 0x222E\n\t\t|| x >= 0x2234 && x <= 0x2237\n\t\t|| x === 0x223C\n\t\t|| x === 0x223D\n\t\t|| x === 0x2248\n\t\t|| x === 0x224C\n\t\t|| x === 0x2252\n\t\t|| x === 0x2260\n\t\t|| x === 0x2261\n\t\t|| x >= 0x2264 && x <= 0x2267\n\t\t|| x === 0x226A\n\t\t|| x === 0x226B\n\t\t|| x === 0x226E\n\t\t|| x === 0x226F\n\t\t|| x === 0x2282\n\t\t|| x === 0x2283\n\t\t|| x === 0x2286\n\t\t|| x === 0x2287\n\t\t|| x === 0x2295\n\t\t|| x === 0x2299\n\t\t|| x === 0x22A5\n\t\t|| x === 0x22BF\n\t\t|| x === 0x2312\n\t\t|| x >= 0x2460 && x <= 0x24E9\n\t\t|| x >= 0x24EB && x <= 0x254B\n\t\t|| x >= 0x2550 && x <= 0x2573\n\t\t|| x >= 0x2580 && x <= 0x258F\n\t\t|| x >= 0x2592 && x <= 0x2595\n\t\t|| x === 0x25A0\n\t\t|| x === 0x25A1\n\t\t|| x >= 0x25A3 && x <= 0x25A9\n\t\t|| x === 0x25B2\n\t\t|| x === 0x25B3\n\t\t|| x === 0x25B6\n\t\t|| x === 0x25B7\n\t\t|| x === 0x25BC\n\t\t|| x === 0x25BD\n\t\t|| x === 0x25C0\n\t\t|| x === 0x25C1\n\t\t|| x >= 0x25C6 && x <= 0x25C8\n\t\t|| x === 0x25CB\n\t\t|| x >= 0x25CE && x <= 0x25D1\n\t\t|| x >= 0x25E2 && x <= 0x25E5\n\t\t|| x === 0x25EF\n\t\t|| x === 0x2605\n\t\t|| x === 0x2606\n\t\t|| x === 0x2609\n\t\t|| x === 0x260E\n\t\t|| x === 0x260F\n\t\t|| x === 0x261C\n\t\t|| x === 0x261E\n\t\t|| x === 0x2640\n\t\t|| x === 0x2642\n\t\t|| x === 0x2660\n\t\t|| x === 0x2661\n\t\t|| x >= 0x2663 && x <= 0x2665\n\t\t|| x >= 0x2667 && x <= 0x266A\n\t\t|| x === 0x266C\n\t\t|| x === 0x266D\n\t\t|| x === 0x266F\n\t\t|| x === 0x269E\n\t\t|| x === 0x269F\n\t\t|| x === 0x26BF\n\t\t|| x >= 0x26C6 && x <= 0x26CD\n\t\t|| x >= 0x26CF && x <= 0x26D3\n\t\t|| x >= 0x26D5 && x <= 0x26E1\n\t\t|| x === 0x26E3\n\t\t|| x === 0x26E8\n\t\t|| x === 0x26E9\n\t\t|| x >= 0x26EB && x <= 0x26F1\n\t\t|| x === 0x26F4\n\t\t|| x >= 0x26F6 && x <= 0x26F9\n\t\t|| x === 0x26FB\n\t\t|| x === 0x26FC\n\t\t|| x === 0x26FE\n\t\t|| x === 0x26FF\n\t\t|| x === 0x273D\n\t\t|| x >= 0x2776 && x <= 0x277F\n\t\t|| x >= 0x2B56 && x <= 0x2B59\n\t\t|| x >= 0x3248 && x <= 0x324F\n\t\t|| x >= 0xE000 && x <= 0xF8FF\n\t\t|| x >= 0xFE00 && x <= 0xFE0F\n\t\t|| x === 0xFFFD\n\t\t|| x >= 0x1F100 && x <= 0x1F10A\n\t\t|| x >= 0x1F110 && x <= 0x1F12D\n\t\t|| x >= 0x1F130 && x <= 0x1F169\n\t\t|| x >= 0x1F170 && x <= 0x1F18D\n\t\t|| x === 0x1F18F\n\t\t|| x === 0x1F190\n\t\t|| x >= 0x1F19B && x <= 0x1F1AC\n\t\t|| x >= 0xE0100 && x <= 0xE01EF\n\t\t|| x >= 0xF0000 && x <= 0xFFFFD\n\t\t|| x >= 0x100000 && x <= 0x10FFFD;\n}\n\nfunction isFullWidth(x) {\n\treturn x === 0x3000\n\t\t|| x >= 0xFF01 && x <= 0xFF60\n\t\t|| x >= 0xFFE0 && x <= 0xFFE6;\n}\n\nfunction isWide(x) {\n\treturn x >= 0x1100 && x <= 0x115F\n\t\t|| x === 0x231A\n\t\t|| x === 0x231B\n\t\t|| x === 0x2329\n\t\t|| x === 0x232A\n\t\t|| x >= 0x23E9 && x <= 0x23EC\n\t\t|| x === 0x23F0\n\t\t|| x === 0x23F3\n\t\t|| x === 0x25FD\n\t\t|| x === 0x25FE\n\t\t|| x === 0x2614\n\t\t|| x === 0x2615\n\t\t|| x >= 0x2630 && x <= 0x2637\n\t\t|| x >= 0x2648 && x <= 0x2653\n\t\t|| x === 0x267F\n\t\t|| x >= 0x268A && x <= 0x268F\n\t\t|| x === 0x2693\n\t\t|| x === 0x26A1\n\t\t|| x === 0x26AA\n\t\t|| x === 0x26AB\n\t\t|| x === 0x26BD\n\t\t|| x === 0x26BE\n\t\t|| x === 0x26C4\n\t\t|| x === 0x26C5\n\t\t|| x === 0x26CE\n\t\t|| x === 0x26D4\n\t\t|| x === 0x26EA\n\t\t|| x === 0x26F2\n\t\t|| x === 0x26F3\n\t\t|| x === 0x26F5\n\t\t|| x === 0x26FA\n\t\t|| x === 0x26FD\n\t\t|| x === 0x2705\n\t\t|| x === 0x270A\n\t\t|| x === 0x270B\n\t\t|| x === 0x2728\n\t\t|| x === 0x274C\n\t\t|| x === 0x274E\n\t\t|| x >= 0x2753 && x <= 0x2755\n\t\t|| x === 0x2757\n\t\t|| x >= 0x2795 && x <= 0x2797\n\t\t|| x === 0x27B0\n\t\t|| x === 0x27BF\n\t\t|| x === 0x2B1B\n\t\t|| x === 0x2B1C\n\t\t|| x === 0x2B50\n\t\t|| x === 0x2B55\n\t\t|| x >= 0x2E80 && x <= 0x2E99\n\t\t|| x >= 0x2E9B && x <= 0x2EF3\n\t\t|| x >= 0x2F00 && x <= 0x2FD5\n\t\t|| x >= 0x2FF0 && x <= 0x2FFF\n\t\t|| x >= 0x3001 && x <= 0x303E\n\t\t|| x >= 0x3041 && x <= 0x3096\n\t\t|| x >= 0x3099 && x <= 0x30FF\n\t\t|| x >= 0x3105 && x <= 0x312F\n\t\t|| x >= 0x3131 && x <= 0x318E\n\t\t|| x >= 0x3190 && x <= 0x31E5\n\t\t|| x >= 0x31EF && x <= 0x321E\n\t\t|| x >= 0x3220 && x <= 0x3247\n\t\t|| x >= 0x3250 && x <= 0xA48C\n\t\t|| x >= 0xA490 && x <= 0xA4C6\n\t\t|| x >= 0xA960 && x <= 0xA97C\n\t\t|| x >= 0xAC00 && x <= 0xD7A3\n\t\t|| x >= 0xF900 && x <= 0xFAFF\n\t\t|| x >= 0xFE10 && x <= 0xFE19\n\t\t|| x >= 0xFE30 && x <= 0xFE52\n\t\t|| x >= 0xFE54 && x <= 0xFE66\n\t\t|| x >= 0xFE68 && x <= 0xFE6B\n\t\t|| x >= 0x16FE0 && x <= 0x16FE4\n\t\t|| x >= 0x16FF0 && x <= 0x16FF6\n\t\t|| x >= 0x17000 && x <= 0x18CD5\n\t\t|| x >= 0x18CFF && x <= 0x18D1E\n\t\t|| x >= 0x18D80 && x <= 0x18DF2\n\t\t|| x >= 0x1AFF0 && x <= 0x1AFF3\n\t\t|| x >= 0x1AFF5 && x <= 0x1AFFB\n\t\t|| x === 0x1AFFD\n\t\t|| x === 0x1AFFE\n\t\t|| x >= 0x1B000 && x <= 0x1B122\n\t\t|| x === 0x1B132\n\t\t|| x >= 0x1B150 && x <= 0x1B152\n\t\t|| x === 0x1B155\n\t\t|| x >= 0x1B164 && x <= 0x1B167\n\t\t|| x >= 0x1B170 && x <= 0x1B2FB\n\t\t|| x >= 0x1D300 && x <= 0x1D356\n\t\t|| x >= 0x1D360 && x <= 0x1D376\n\t\t|| x === 0x1F004\n\t\t|| x === 0x1F0CF\n\t\t|| x === 0x1F18E\n\t\t|| x >= 0x1F191 && x <= 0x1F19A\n\t\t|| x >= 0x1F200 && x <= 0x1F202\n\t\t|| x >= 0x1F210 && x <= 0x1F23B\n\t\t|| x >= 0x1F240 && x <= 0x1F248\n\t\t|| x === 0x1F250\n\t\t|| x === 0x1F251\n\t\t|| x >= 0x1F260 && x <= 0x1F265\n\t\t|| x >= 0x1F300 && x <= 0x1F320\n\t\t|| x >= 0x1F32D && x <= 0x1F335\n\t\t|| x >= 0x1F337 && x <= 0x1F37C\n\t\t|| x >= 0x1F37E && x <= 0x1F393\n\t\t|| x >= 0x1F3A0 && x <= 0x1F3CA\n\t\t|| x >= 0x1F3CF && x <= 0x1F3D3\n\t\t|| x >= 0x1F3E0 && x <= 0x1F3F0\n\t\t|| x === 0x1F3F4\n\t\t|| x >= 0x1F3F8 && x <= 0x1F43E\n\t\t|| x === 0x1F440\n\t\t|| x >= 0x1F442 && x <= 0x1F4FC\n\t\t|| x >= 0x1F4FF && x <= 0x1F53D\n\t\t|| x >= 0x1F54B && x <= 0x1F54E\n\t\t|| x >= 0x1F550 && x <= 0x1F567\n\t\t|| x === 0x1F57A\n\t\t|| x === 0x1F595\n\t\t|| x === 0x1F596\n\t\t|| x === 0x1F5A4\n\t\t|| x >= 0x1F5FB && x <= 0x1F64F\n\t\t|| x >= 0x1F680 && x <= 0x1F6C5\n\t\t|| x === 0x1F6CC\n\t\t|| x >= 0x1F6D0 && x <= 0x1F6D2\n\t\t|| x >= 0x1F6D5 && x <= 0x1F6D8\n\t\t|| x >= 0x1F6DC && x <= 0x1F6DF\n\t\t|| x === 0x1F6EB\n\t\t|| x === 0x1F6EC\n\t\t|| x >= 0x1F6F4 && x <= 0x1F6FC\n\t\t|| x >= 0x1F7E0 && x <= 0x1F7EB\n\t\t|| x === 0x1F7F0\n\t\t|| x >= 0x1F90C && x <= 0x1F93A\n\t\t|| x >= 0x1F93C && x <= 0x1F945\n\t\t|| x >= 0x1F947 && x <= 0x1F9FF\n\t\t|| x >= 0x1FA70 && x <= 0x1FA7C\n\t\t|| x >= 0x1FA80 && x <= 0x1FA8A\n\t\t|| x >= 0x1FA8E && x <= 0x1FAC6\n\t\t|| x === 0x1FAC8\n\t\t|| x >= 0x1FACD && x <= 0x1FADC\n\t\t|| x >= 0x1FADF && x <= 0x1FAEA\n\t\t|| x >= 0x1FAEF && x <= 0x1FAF8\n\t\t|| x >= 0x20000 && x <= 0x2FFFD\n\t\t|| x >= 0x30000 && x <= 0x3FFFD;\n}\n\nfunction getCategory(x) {\n\tif (isAmbiguous(x)) return 'ambiguous';\n\n\tif (isFullWidth(x)) return 'fullwidth';\n\n\tif (\n\t\tx === 0x20A9\n\t\t|| x >= 0xFF61 && x <= 0xFFBE\n\t\t|| x >= 0xFFC2 && x <= 0xFFC7\n\t\t|| x >= 0xFFCA && x <= 0xFFCF\n\t\t|| x >= 0xFFD2 && x <= 0xFFD7\n\t\t|| x >= 0xFFDA && x <= 0xFFDC\n\t\t|| x >= 0xFFE8 && x <= 0xFFEE\n\t) {\n\t\treturn 'halfwidth';\n\t}\n\n\tif (\n\t\tx >= 0x20 && x <= 0x7E\n\t\t|| x === 0xA2\n\t\t|| x === 0xA3\n\t\t|| x === 0xA5\n\t\t|| x === 0xA6\n\t\t|| x === 0xAC\n\t\t|| x === 0xAF\n\t\t|| x >= 0x27E6 && x <= 0x27ED\n\t\t|| x === 0x2985\n\t\t|| x === 0x2986\n\t) {\n\t\treturn 'narrow';\n\t}\n\n\tif (isWide(x)) return 'wide';\n\n\treturn 'neutral';\n}\n\nexport {isAmbiguous, isFullWidth, isWide, getCategory};\n",
11
+ "import {getCategory, isAmbiguous, isFullWidth, isWide} from './lookup.js';\n\nfunction validate(codePoint) {\n\tif (!Number.isSafeInteger(codePoint)) {\n\t\tthrow new TypeError(`Expected a code point, got \\`${typeof codePoint}\\`.`);\n\t}\n}\n\nexport function eastAsianWidthType(codePoint) {\n\tvalidate(codePoint);\n\n\treturn getCategory(codePoint);\n}\n\nexport function eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {\n\tvalidate(codePoint);\n\n\tif (\n\t\tisFullWidth(codePoint)\n\t\t|| isWide(codePoint)\n\t\t|| (ambiguousAsWide && isAmbiguous(codePoint))\n\t) {\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\n// Private exports for https://github.com/sindresorhus/is-fullwidth-code-point\nexport {isFullWidth as _isFullWidth, isWide as _isWide} from './lookup.js';\n",
12
+ "import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n",
13
+ "import {\n dlopen,\n ffiBool,\n toArrayBuffer,\n ptr,\n toPointer,\n type FFICallbackInstance,\n type Pointer,\n} from \"./platform/ffi.js\"\nimport { writeFile } from \"./platform/runtime.js\"\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 TerminalCapabilities,\n type Highlight,\n type LineInfo,\n type MousePointerStyle,\n} from \"./types.js\"\nexport type { LineInfo, AllocatorStats, BuildOptions, NativeRenderStats }\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 AudioCreateOptionsStruct,\n AudioStartOptionsStruct,\n AudioVoiceOptionsStruct,\n AudioStatsStruct,\n BuildOptionsStruct,\n AllocatorStatsStruct,\n NativeRenderStatsStruct,\n} from \"./zig-structs.js\"\nimport type {\n NativeSpanFeedOptions,\n NativeSpanFeedStats,\n ReserveInfo,\n AudioCreateOptions,\n AudioStartOptions,\n AudioVoiceOptions,\n AudioStats,\n BuildOptions,\n AllocatorStats,\n NativeRenderStats,\n} from \"./zig-structs.js\"\nimport { isBunfsPath } from \"./lib/bunfs.js\"\n\nregisterEnvVar({\n name: \"OPENTUI_LIBC\",\n description: \"Select Linux native libc package. Supported values: glibc, musl.\",\n type: \"string\",\n default: \"\",\n})\n\nfunction validateLinuxLibcOverride(): void {\n const libc = process.env.OPENTUI_LIBC\n if (libc === undefined || libc === \"\" || libc === \"glibc\" || libc === \"musl\") return\n throw new Error(`On Linux, OPENTUI_LIBC must be unset, empty, \"glibc\", or \"musl\", got \"${libc}\"`)\n}\n\nasync function resolveNativePackage() {\n if (process.platform === \"darwin\") {\n // @ts-ignore Optional native package may be absent when building on another platform.\n if (process.arch === \"x64\") return await import(\"@opentui/core-darwin-x64\")\n // @ts-ignore Optional native package may be absent when building on another platform.\n if (process.arch === \"arm64\") return await import(\"@opentui/core-darwin-arm64\")\n }\n\n if (process.platform === \"linux\") {\n validateLinuxLibcOverride()\n\n if (process.arch === \"x64\") {\n if (process.env.OPENTUI_LIBC === \"musl\") {\n // @ts-ignore Optional native package may be absent unless building a musl target.\n return await import(\"@opentui/core-linux-x64-musl\")\n } else {\n // @ts-ignore Optional native package may be absent when building on another platform.\n return await import(\"@opentui/core-linux-x64\")\n }\n }\n\n if (process.arch === \"arm64\") {\n if (process.env.OPENTUI_LIBC === \"musl\") {\n // @ts-ignore Optional native package may be absent unless building a musl target.\n return await import(\"@opentui/core-linux-arm64-musl\")\n } else {\n // @ts-ignore Optional native package may be absent when building on another platform.\n return await import(\"@opentui/core-linux-arm64\")\n }\n }\n }\n\n if (process.platform === \"win32\") {\n // @ts-ignore Optional native package may be absent when building on another platform.\n if (process.arch === \"x64\") return await import(\"@opentui/core-win32-x64\")\n // @ts-ignore Optional native package may be absent when building on another platform.\n if (process.arch === \"arm64\") return await import(\"@opentui/core-win32-arm64\")\n }\n\n throw new Error(`opentui is not supported on the current platform: ${process.platform}-${process.arch}`)\n}\nconst nativePackage = await resolveNativePackage()\n\nexport type NativeHandle<T extends string> = Pointer & { readonly __nativeHandle: T }\nexport type RendererHandle = NativeHandle<\"renderer\">\nexport type OptimizedBufferHandle = NativeHandle<\"optimized_buffer\">\nexport type TextBufferHandle = NativeHandle<\"text_buffer\">\nexport type TextBufferViewHandle = NativeHandle<\"text_buffer_view\">\nexport type EditBufferHandle = NativeHandle<\"edit_buffer\">\nexport type EditorViewHandle = NativeHandle<\"editor_view\">\nexport type SyntaxStyleHandle = NativeHandle<\"syntax_style\">\nexport type EventSinkHandle = NativeHandle<\"event_sink\">\nexport type AudioEngineHandle = NativeHandle<\"audio_engine\">\nexport type NativeRenderableHandle = NativeHandle<\"native_renderable\">\nlet targetLibPath = nativePackage.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\nconst MAX_FFI_U32 = 0xffff_ffff\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 toNumber(value: number | bigint): number {\n return typeof value === \"bigint\" ? Number(value) : value\n}\n\nfunction toSafeByteCount(value: number | bigint, label: string): number {\n if (typeof value !== \"bigint\") {\n return value\n }\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new RangeError(`${label} exceeds JavaScript safe integer range`)\n }\n\n return Number(value)\n}\n\nfunction toSafeFFIU32Length(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 0 || value > MAX_FFI_U32) {\n throw new RangeError(`${label} exceeds native u32 length limit`)\n }\n\n return value\n}\n\nfunction ptrOrNull(value: ArrayBufferView): Pointer | null {\n return value.byteLength === 0 ? null : ptr(value)\n}\n\nfunction rgbaPtr(value: RGBA): Pointer {\n return ptr(value.buffer)\n}\n\nfunction optionalRgbaPtr(value: RGBA | null | undefined): Pointer | null {\n return value ? rgbaPtr(value) : null\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 createEventSink: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n destroyEventSink: {\n args: [\"u32\"],\n returns: \"void\",\n },\n createNativeRenderable: {\n args: [],\n returns: \"u32\",\n },\n destroyNativeRenderable: {\n args: [\"u32\"],\n returns: \"void\",\n },\n nativeRenderableAttachYogaNode: {\n args: [\"u32\", \"ptr\"],\n returns: \"bool\",\n },\n nativeRenderableSetMeasureTarget: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"bool\",\n },\n // Renderer management\n createRenderer: {\n args: [\"u32\", \"u32\", \"u8\", \"u8\", \"ptr\"],\n returns: \"u32\",\n },\n setTerminalEnvVar: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\", \"u32\"],\n returns: \"bool\",\n },\n destroyRenderer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n setUseThread: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n setClearOnShutdown: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n setBackgroundColor: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n setRenderOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n resetSplitScrollback: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n syncSplitScrollback: {\n args: [\"u32\", \"u32\"],\n returns: \"u32\",\n },\n getSplitOutputOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"u32\",\n },\n setPendingSplitFooterTransition: {\n args: [\"u32\", \"u8\", \"u32\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n clearPendingSplitFooterTransition: {\n args: [\"u32\"],\n returns: \"void\",\n },\n updateStats: {\n args: [\"u32\", \"f64\", \"u32\", \"f64\"],\n returns: \"void\",\n },\n updateMemoryStats: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n getRenderStats: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n render: {\n args: [\"u32\", \"bool\"],\n returns: \"u8\",\n },\n repaintSplitFooter: {\n args: [\"u32\", \"u32\", \"bool\"],\n returns: \"u64\",\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: [\"u32\", \"u32\", \"u32\", \"bool\", \"bool\", \"u32\", \"bool\", \"bool\", \"bool\"],\n returns: \"u64\",\n },\n getNextBuffer: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n getCurrentBuffer: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n rendererSetPaletteState: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n queryPixelResolution: {\n args: [\"u32\"],\n returns: \"void\",\n },\n queryThemeColors: {\n args: [\"u32\"],\n returns: \"void\",\n },\n\n createOptimizedBuffer: {\n args: [\"u32\", \"u32\", \"bool\", \"u8\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n destroyOptimizedBuffer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n\n drawFrameBuffer: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n getBufferWidth: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n getBufferHeight: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n bufferClear: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n bufferGetCharPtr: {\n args: [\"u32\"],\n returns: \"ptr\",\n },\n bufferGetFgPtr: {\n args: [\"u32\"],\n returns: \"ptr\",\n },\n bufferGetBgPtr: {\n args: [\"u32\"],\n returns: \"ptr\",\n },\n bufferGetAttributesPtr: {\n args: [\"u32\"],\n returns: \"ptr\",\n },\n bufferGetRespectAlpha: {\n args: [\"u32\"],\n returns: \"bool\",\n },\n bufferSetRespectAlpha: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n bufferGetId: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n bufferGetRealCharSize: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n bufferWriteResolvedChars: {\n args: [\"u32\", \"ptr\", \"u32\", \"bool\"],\n returns: \"u32\",\n },\n\n bufferDrawText: {\n args: [\"u32\", \"ptr\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferSetCellWithAlphaBlending: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferSetCell: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferFillRect: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n bufferColorMatrix: {\n args: [\"u32\", \"ptr\", \"ptr\", \"u32\", \"f32\", \"u8\"],\n returns: \"void\",\n },\n bufferColorMatrixUniform: {\n args: [\"u32\", \"ptr\", \"f32\", \"u8\"],\n returns: \"void\",\n },\n bufferResize: {\n args: [\"u32\", \"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: [\"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n\n // Cursor functions (now renderer-scoped)\n setCursorPosition: {\n args: [\"u32\", \"i32\", \"i32\", \"bool\"],\n returns: \"void\",\n },\n setCursorColor: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n getCursorState: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n\n // Cursor and mouse pointer style (combined)\n setCursorStyleOptions: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n\n // Debug overlay\n setDebugOverlay: {\n args: [\"u32\", \"bool\", \"u8\"],\n returns: \"void\",\n },\n\n // Terminal control\n clearTerminal: {\n args: [\"u32\"],\n returns: \"void\",\n },\n setTerminalTitle: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n copyToClipboardOSC52: {\n args: [\"u32\", \"u8\", \"ptr\", \"u32\"],\n returns: \"bool\",\n },\n clearClipboardOSC52: {\n args: [\"u32\", \"u8\"],\n returns: \"bool\",\n },\n triggerNotification: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\", \"u32\"],\n returns: \"bool\",\n },\n\n bufferDrawSuperSampleBuffer: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\", \"u32\", \"u8\", \"u32\"],\n returns: \"void\",\n },\n bufferDrawPackedBuffer: {\n args: [\"u32\", \"ptr\", \"u32\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n bufferDrawGrayscaleBuffer: {\n args: [\"u32\", \"i32\", \"i32\", \"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawGrayscaleBufferSupersampled: {\n args: [\"u32\", \"i32\", \"i32\", \"ptr\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawGrid: {\n args: [\"u32\", \"ptr\", \"ptr\", \"ptr\", \"ptr\", \"u32\", \"ptr\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n bufferDrawBox: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\", \"ptr\", \"u32\", \"ptr\", \"ptr\", \"ptr\", \"ptr\", \"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferPushScissorRect: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n bufferPopScissorRect: {\n args: [\"u32\"],\n returns: \"void\",\n },\n bufferClearScissorRects: {\n args: [\"u32\"],\n returns: \"void\",\n },\n bufferPushOpacity: {\n args: [\"u32\", \"f32\"],\n returns: \"void\",\n },\n bufferPopOpacity: {\n args: [\"u32\"],\n returns: \"void\",\n },\n bufferGetCurrentOpacity: {\n args: [\"u32\"],\n returns: \"f32\",\n },\n bufferClearOpacity: {\n args: [\"u32\"],\n returns: \"void\",\n },\n\n addToHitGrid: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n clearCurrentHitGrid: {\n args: [\"u32\"],\n returns: \"void\",\n },\n hitGridPushScissorRect: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n hitGridPopScissorRect: {\n args: [\"u32\"],\n returns: \"void\",\n },\n hitGridClearScissorRects: {\n args: [\"u32\"],\n returns: \"void\",\n },\n addToCurrentHitGridClipped: {\n args: [\"u32\", \"i32\", \"i32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n checkHit: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n getHitGridDirty: {\n args: [\"u32\"],\n returns: \"bool\",\n },\n dumpHitGrid: {\n args: [\"u32\"],\n returns: \"void\",\n },\n dumpBuffers: {\n args: [\"u32\", \"i64\"],\n returns: \"void\",\n },\n dumpOutputBuffer: {\n args: [\"u32\", \"i64\"],\n returns: \"void\",\n },\n restoreTerminalModes: {\n args: [\"u32\"],\n returns: \"void\",\n },\n enableMouse: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n disableMouse: {\n args: [\"u32\"],\n returns: \"void\",\n },\n enableKittyKeyboard: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n disableKittyKeyboard: {\n args: [\"u32\"],\n returns: \"void\",\n },\n setKittyKeyboardFlags: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n getKittyKeyboardFlags: {\n args: [\"u32\"],\n returns: \"u8\",\n },\n setupTerminal: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n suspendRenderer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n resumeRenderer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n writeOut: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n // TextBuffer functions\n createTextBuffer: {\n args: [\"u8\"],\n returns: \"u32\",\n },\n destroyTextBuffer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferGetLength: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n textBufferGetByteSize: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n\n textBufferReset: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferClear: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferSetDefaultFg: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferSetDefaultBg: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferSetDefaultAttributes: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferResetDefaults: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferGetTabWidth: {\n args: [\"u32\"],\n returns: \"u8\",\n },\n textBufferSetTabWidth: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n textBufferRegisterMemBuffer: {\n args: [\"u32\", \"ptr\", \"u32\", \"bool\"],\n returns: \"u16\",\n },\n textBufferReplaceMemBuffer: {\n args: [\"u32\", \"u8\", \"ptr\", \"u32\", \"bool\"],\n returns: \"bool\",\n },\n textBufferClearMemRegistry: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferSetTextFromMem: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n textBufferAppend: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferAppendFromMemId: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n textBufferLoadFile: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"bool\",\n },\n textBufferSetStyledText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferGetLineCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n textBufferGetPlainText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n textBufferAddHighlightByCharRange: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferAddHighlight: {\n args: [\"u32\", \"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferRemoveHighlightsByRef: {\n args: [\"u32\", \"u16\"],\n returns: \"void\",\n },\n textBufferClearLineHighlights: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferClearAllHighlights: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferSetSyntaxStyle: {\n args: [\"u32\", \"u32\"],\n returns: \"bool\",\n },\n textBufferGetLineHighlightsPtr: {\n args: [\"u32\", \"u32\", \"ptr\"],\n returns: \"ptr\",\n },\n textBufferFreeLineHighlights: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n textBufferGetHighlightCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n textBufferGetTextRange: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n textBufferGetTextRangeByCoords: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n\n // TextBufferView functions\n createTextBufferView: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n destroyTextBufferView: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferViewSetSelection: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewResetSelection: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferViewGetSelectionInfo: {\n args: [\"u32\"],\n returns: \"u64\",\n },\n textBufferViewSetLocalSelection: {\n args: [\"u32\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\"],\n returns: \"bool\",\n },\n textBufferViewUpdateSelection: {\n args: [\"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewUpdateLocalSelection: {\n args: [\"u32\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\"],\n returns: \"bool\",\n },\n textBufferViewResetLocalSelection: {\n args: [\"u32\"],\n returns: \"void\",\n },\n textBufferViewSetWrapWidth: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetWrapMode: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n textBufferViewSetFirstLineOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetViewportSize: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetViewport: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewGetVirtualLineCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n textBufferViewGetLineInfoDirect: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewGetLogicalLineInfoDirect: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewGetSelectedText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n textBufferViewGetPlainText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n textBufferViewSetTabIndicator: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n textBufferViewSetTabIndicatorColor: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n textBufferViewSetTruncate: {\n args: [\"u32\", \"bool\"],\n returns: \"void\",\n },\n textBufferViewMeasureForDimensions: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\"],\n returns: \"bool\",\n },\n bufferDrawTextBufferView: {\n args: [\"u32\", \"u32\", \"i32\", \"i32\"],\n returns: \"void\",\n },\n bufferDrawEditorView: {\n args: [\"u32\", \"u32\", \"i32\", \"i32\"],\n returns: \"void\",\n },\n\n // EditorView functions\n createEditorView: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n destroyEditorView: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewSetViewportSize: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editorViewSetViewport: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\", \"bool\"],\n returns: \"void\",\n },\n editorViewGetViewport: {\n args: [\"u32\", \"ptr\", \"ptr\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewSetScrollMargin: {\n args: [\"u32\", \"f32\"],\n returns: \"void\",\n },\n editorViewSetWrapMode: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n editorViewGetVirtualLineCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n editorViewGetTotalVirtualLineCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n editorViewGetTextBufferView: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n editorViewGetLineInfoDirect: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetLogicalLineInfoDirect: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n\n // EditBuffer functions\n createEditBuffer: {\n args: [\"u8\", \"u32\"],\n returns: \"u32\",\n },\n destroyEditBuffer: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferSetText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetTextFromMem: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n editBufferReplaceText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferReplaceTextFromMem: {\n args: [\"u32\", \"u8\"],\n returns: \"void\",\n },\n editBufferGetText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editBufferInsertChar: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferInsertText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n editBufferDeleteChar: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferDeleteCharBackward: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferDeleteRange: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferNewLine: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferDeleteLine: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferMoveCursorLeft: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferMoveCursorRight: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferMoveCursorUp: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferMoveCursorDown: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferGotoLine: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursor: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursorToLineCol: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferSetCursorByOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n editBufferGetCursorPosition: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetId: {\n args: [\"u32\"],\n returns: \"u16\",\n },\n editBufferGetTextBuffer: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n editBufferDebugLogRope: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferUndo: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editBufferRedo: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editBufferCanUndo: {\n args: [\"u32\"],\n returns: \"bool\",\n },\n editBufferCanRedo: {\n args: [\"u32\"],\n returns: \"bool\",\n },\n editBufferClearHistory: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferClear: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editBufferGetNextWordBoundary: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetPrevWordBoundary: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editBufferGetEOL: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editBufferOffsetToPosition: {\n args: [\"u32\", \"u32\", \"ptr\"],\n returns: \"bool\",\n },\n editBufferPositionToOffset: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"u32\",\n },\n editBufferGetLineStartOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"u32\",\n },\n editBufferGetTextRange: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editBufferGetTextRangeByCoords: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n\n // EditorView selection and editing methods\n editorViewSetSelection: {\n args: [\"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewResetSelection: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewGetSelection: {\n args: [\"u32\"],\n returns: \"u64\",\n },\n editorViewSetLocalSelection: {\n args: [\"u32\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\", \"bool\", \"bool\"],\n returns: \"bool\",\n },\n editorViewUpdateSelection: {\n args: [\"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewUpdateLocalSelection: {\n args: [\"u32\", \"i32\", \"i32\", \"i32\", \"i32\", \"ptr\", \"ptr\", \"bool\", \"bool\"],\n returns: \"bool\",\n },\n editorViewResetLocalSelection: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewGetSelectedTextBytes: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n editorViewGetCursor: {\n args: [\"u32\", \"ptr\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n\n // EditorView VisualCursor methods\n editorViewGetVisualCursor: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n\n editorViewMoveUpVisual: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewMoveDownVisual: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewDeleteSelectedText: {\n args: [\"u32\"],\n returns: \"void\",\n },\n editorViewSetCursorByOffset: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n editorViewGetNextWordBoundary: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetPrevWordBoundary: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetEOL: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetVisualSOL: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewGetVisualEOL: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n editorViewSetPlaceholderStyledText: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n editorViewSetTabIndicator: {\n args: [\"u32\", \"u32\"],\n returns: \"void\",\n },\n editorViewSetTabIndicatorColor: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n\n getArenaAllocatedBytes: {\n args: [],\n returns: \"u64\",\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: \"u32\",\n },\n destroySyntaxStyle: {\n args: [\"u32\"],\n returns: \"void\",\n },\n syntaxStyleRegister: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n syntaxStyleResolveByName: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n syntaxStyleGetStyleCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n\n // Terminal capability functions\n getTerminalCapabilities: {\n args: [\"u32\", \"ptr\"],\n returns: \"void\",\n },\n processCapabilityResponse: {\n args: [\"u32\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n // Unicode encoding API\n encodeUnicode: {\n args: [\"ptr\", \"u32\", \"ptr\", \"ptr\", \"u8\"],\n returns: \"bool\",\n },\n freeUnicode: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n bufferDrawChar: {\n args: [\"u32\", \"u32\", \"u32\", \"u32\", \"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n\n // Yoga layout\n yogaConfigCreate: {\n args: [],\n returns: \"ptr\",\n },\n yogaConfigFree: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaConfigSetUseWebDefaults: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaConfigGetUseWebDefaults: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaConfigSetPointScaleFactor: {\n args: [\"ptr\", \"f32\"],\n returns: \"void\",\n },\n yogaConfigGetPointScaleFactor: {\n args: [\"ptr\"],\n returns: \"f32\",\n },\n yogaConfigSetErrata: {\n args: [\"ptr\", \"u32\"],\n returns: \"void\",\n },\n yogaConfigGetErrata: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n yogaConfigSetExperimentalFeatureEnabled: {\n args: [\"ptr\", \"u32\", \"bool\"],\n returns: \"void\",\n },\n yogaConfigIsExperimentalFeatureEnabled: {\n args: [\"ptr\", \"u32\"],\n returns: \"bool\",\n },\n yogaNodeCreate: {\n args: [],\n returns: \"ptr\",\n },\n yogaNodeCreateForOpenTUI: {\n args: [],\n returns: \"ptr\",\n },\n yogaNodeCreateWithConfig: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n yogaNodeFree: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeFreeRecursive: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeReset: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeCopyStyle: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n yogaNodeInsertChild: {\n args: [\"ptr\", \"ptr\", \"u32\"],\n returns: \"void\",\n },\n yogaNodeRemoveChild: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n yogaNodeRemoveAllChildren: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeGetChild: {\n args: [\"ptr\", \"u32\"],\n returns: \"ptr\",\n },\n yogaNodeGetChildCount: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n yogaNodeGetParent: {\n args: [\"ptr\"],\n returns: \"ptr\",\n },\n yogaNodeCalculateLayout: {\n args: [\"ptr\", \"f32\", \"f32\", \"u32\"],\n returns: \"void\",\n },\n yogaNodeIsDirty: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaNodeMarkDirty: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeGetHasNewLayout: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaNodeSetHasNewLayout: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaNodeSetIsReferenceBaseline: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaNodeIsReferenceBaseline: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaNodeSetAlwaysFormsContainingBlock: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaNodeGetAlwaysFormsContainingBlock: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaNodeGetComputedLayout: {\n args: [\"ptr\", \"ptr\"],\n returns: \"void\",\n },\n yogaNodeLayoutGetEdge: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"f32\",\n },\n yogaNodeStyleSetEnum: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"void\",\n },\n yogaNodeStyleGetEnum: {\n args: [\"ptr\", \"u32\"],\n returns: \"u32\",\n },\n yogaNodeStyleSetFloat: {\n args: [\"ptr\", \"u32\", \"f32\"],\n returns: \"void\",\n },\n yogaNodeStyleGetFloat: {\n args: [\"ptr\", \"u32\"],\n returns: \"f32\",\n },\n yogaNodeStyleSetBorder: {\n args: [\"ptr\", \"u32\", \"f32\"],\n returns: \"void\",\n },\n yogaNodeStyleGetBorder: {\n args: [\"ptr\", \"u32\"],\n returns: \"f32\",\n },\n yogaNodeStyleSetValue: {\n args: [\"ptr\", \"u32\", \"u32\", \"u32\", \"f32\"],\n returns: \"void\",\n },\n yogaNodeStyleGetValue: {\n args: [\"ptr\", \"u32\", \"u32\"],\n returns: \"u64\",\n },\n yogaNodeSetMeasureFunc: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaNodeUnsetMeasureFunc: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaNodeHasMeasureFunc: {\n args: [\"ptr\"],\n returns: \"bool\",\n },\n yogaNodeSetDirtiedFunc: {\n args: [\"ptr\", \"bool\"],\n returns: \"void\",\n },\n yogaNodeUnsetDirtiedFunc: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaStoreMeasureResult: {\n args: [\"f32\", \"f32\"],\n returns: \"void\",\n },\n yogaSetMeasureCallback: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n yogaSetDirtiedCallback: {\n args: [\"ptr\"],\n returns: \"void\",\n },\n\n // Audio\n createAudioEngine: {\n args: [\"ptr\"],\n returns: \"u32\",\n },\n destroyAudioEngine: {\n args: [\"u32\"],\n returns: \"void\",\n },\n audioRefreshPlaybackDevices: {\n args: [\"u32\"],\n returns: \"i32\",\n },\n audioGetPlaybackDeviceCount: {\n args: [\"u32\"],\n returns: \"u32\",\n },\n audioGetPlaybackDeviceName: {\n args: [\"u32\", \"u32\", \"ptr\", \"u32\"],\n returns: \"u32\",\n },\n audioIsPlaybackDeviceDefault: {\n args: [\"u32\", \"u32\"],\n returns: \"bool\",\n },\n audioSelectPlaybackDevice: {\n args: [\"u32\", \"u32\"],\n returns: \"i32\",\n },\n audioClearPlaybackDeviceSelection: {\n args: [\"u32\"],\n returns: \"void\",\n },\n audioStart: {\n args: [\"u32\", \"ptr\"],\n returns: \"i32\",\n },\n audioStartMixer: {\n args: [\"u32\"],\n returns: \"i32\",\n },\n audioStop: {\n args: [\"u32\"],\n returns: \"i32\",\n },\n audioLoad: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\"],\n returns: \"i32\",\n },\n audioUnload: {\n args: [\"u32\", \"u32\"],\n returns: \"i32\",\n },\n audioPlay: {\n args: [\"u32\", \"u32\", \"ptr\", \"ptr\"],\n returns: \"i32\",\n },\n audioStopVoice: {\n args: [\"u32\", \"u32\"],\n returns: \"i32\",\n },\n audioSetVoiceGroup: {\n args: [\"u32\", \"u32\", \"u32\"],\n returns: \"i32\",\n },\n audioCreateGroup: {\n args: [\"u32\", \"ptr\", \"u32\", \"ptr\"],\n returns: \"i32\",\n },\n audioSetGroupVolume: {\n args: [\"u32\", \"u32\", \"f32\"],\n returns: \"i32\",\n },\n audioSetMasterVolume: {\n args: [\"u32\", \"f32\"],\n returns: \"i32\",\n },\n audioMixToBuffer: {\n args: [\"u32\", \"ptr\", \"u32\", \"u8\"],\n returns: \"i32\",\n },\n audioEnableTap: {\n args: [\"u32\", \"bool\", \"u32\"],\n returns: \"i32\",\n },\n audioReadTap: {\n args: [\"u32\", \"ptr\", \"u32\", \"u8\", \"ptr\"],\n returns: \"i32\",\n },\n audioGetStats: {\n args: [\"u32\", \"ptr\"],\n returns: \"i32\",\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\", \"u32\"],\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 ...rawSymbols,\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 void writeFile(traceFilePath, output).catch((error) => {\n console.error(\"Failed to write FFI trace file:\", error)\n })\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 type NativeBufferedOutput = \"stdout\" | \"memory\"\n\nexport interface NativeRendererCreateOptions {\n remote?: boolean\n feedPtr?: Pointer | null\n bufferedOutput?: NativeBufferedOutput\n}\n\nexport interface NativeRenderOperationResult {\n renderOffset: number\n status: number\n}\n\nexport interface NativeYogaLayout {\n left: number\n top: number\n right: number\n bottom: number\n width: number\n height: number\n}\n\nexport type NativeYogaMeasureCallback = (\n node: Pointer | null,\n width: number,\n widthMode: number,\n height: number,\n heightMode: number,\n) => void\n\nexport type NativeYogaDirtiedCallback = (node: Pointer | null) => void\n\nexport const NativeMeasureTargetKind = {\n None: 0,\n TextBufferView: 1,\n EditorView: 2,\n} as const\n\nexport type NativeMeasureTargetKind = (typeof NativeMeasureTargetKind)[keyof typeof NativeMeasureTargetKind]\n\nexport type NativeMeasureTargetHandle = TextBufferViewHandle | EditorViewHandle\n\nexport interface AudioEngineLib {\n createAudioEngine: (options?: AudioCreateOptions | null) => AudioEngineHandle | null\n destroyAudioEngine: (engine: AudioEngineHandle) => void\n audioRefreshPlaybackDevices: (engine: AudioEngineHandle) => number\n audioGetPlaybackDeviceCount: (engine: AudioEngineHandle) => number\n audioGetPlaybackDeviceName: (engine: AudioEngineHandle, index: number) => string\n audioIsPlaybackDeviceDefault: (engine: AudioEngineHandle, index: number) => boolean\n audioSelectPlaybackDevice: (engine: AudioEngineHandle, index: number) => number\n audioClearPlaybackDeviceSelection: (engine: AudioEngineHandle) => void\n audioStart: (engine: AudioEngineHandle, options?: AudioStartOptions | null) => number\n audioStartMixer: (engine: AudioEngineHandle) => number\n audioStop: (engine: AudioEngineHandle) => number\n audioLoad: (engine: AudioEngineHandle, data: Uint8Array) => { status: number; soundId: number | null }\n audioUnload: (engine: AudioEngineHandle, soundId: number) => number\n audioPlay: (\n engine: AudioEngineHandle,\n soundId: number,\n options?: AudioVoiceOptions,\n ) => { status: number; voiceId: number | null }\n audioStopVoice: (engine: AudioEngineHandle, voiceId: number) => number\n audioSetVoiceGroup: (engine: AudioEngineHandle, voiceId: number, groupId: number) => number\n audioCreateGroup: (engine: AudioEngineHandle, name: string) => { status: number; groupId: number | null }\n audioSetGroupVolume: (engine: AudioEngineHandle, groupId: number, volume: number) => number\n audioSetMasterVolume: (engine: AudioEngineHandle, volume: number) => number\n audioMixToBuffer: (engine: AudioEngineHandle, outBuffer: Float32Array, frameCount: number, channels: number) => number\n audioEnableTap: (engine: AudioEngineHandle, enabled: boolean, capacityFrames: number) => number\n audioReadTap: (\n engine: AudioEngineHandle,\n outBuffer: Float32Array,\n frameCount: number,\n channels: number,\n ) => { status: number; framesRead: number }\n audioGetStats: (engine: AudioEngineHandle) => AudioStats | null\n}\n\nexport interface RenderLib extends AudioEngineLib {\n createRenderer: (width: number, height: number, options?: NativeRendererCreateOptions) => RendererHandle | null\n setTerminalEnvVar: (renderer: RendererHandle, key: string, value: string) => boolean\n destroyRenderer: (renderer: RendererHandle) => void\n setUseThread: (renderer: RendererHandle, useThread: boolean) => void\n setClearOnShutdown: (renderer: RendererHandle, clear: boolean) => void\n setBackgroundColor: (renderer: RendererHandle, color: RGBA) => void\n setRenderOffset: (renderer: RendererHandle, offset: number) => void\n resetSplitScrollback: (renderer: RendererHandle, seedRows: number, pinnedRenderOffset: number) => number\n syncSplitScrollback: (renderer: RendererHandle, pinnedRenderOffset: number) => number\n getSplitOutputOffset: (renderer: RendererHandle, surfaceOffset: number) => number\n setPendingSplitFooterTransition: (\n renderer: RendererHandle,\n mode: number,\n sourceTopLine: number,\n sourceHeight: number,\n targetTopLine: number,\n targetHeight: number,\n scrollLines: number,\n ) => void\n clearPendingSplitFooterTransition: (renderer: RendererHandle) => void\n updateStats: (renderer: RendererHandle, time: number, fps: number, frameCallbackTime: number) => void\n updateMemoryStats: (renderer: RendererHandle, heapUsed: number, heapTotal: number, arrayBuffers: number) => void\n getRenderStats: (renderer: RendererHandle) => NativeRenderStats\n render: (renderer: RendererHandle, force: boolean) => number\n repaintSplitFooter: (\n renderer: RendererHandle,\n pinnedRenderOffset: number,\n force: boolean,\n ) => NativeRenderOperationResult\n commitSplitFooterSnapshot: (\n renderer: RendererHandle,\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 ) => NativeRenderOperationResult\n getNextBuffer: (renderer: RendererHandle) => OptimizedBuffer\n getCurrentBuffer: (renderer: RendererHandle) => OptimizedBuffer\n rendererSetPaletteState: (\n renderer: RendererHandle,\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: OptimizedBufferHandle) => void\n drawFrameBuffer: (\n targetBufferPtr: OptimizedBufferHandle,\n destX: number,\n destY: number,\n bufferPtr: OptimizedBufferHandle,\n sourceX?: number,\n sourceY?: number,\n sourceWidth?: number,\n sourceHeight?: number,\n ) => void\n getBufferWidth: (buffer: OptimizedBufferHandle) => number\n getBufferHeight: (buffer: OptimizedBufferHandle) => number\n bufferClear: (buffer: OptimizedBufferHandle, color: RGBA) => void\n bufferGetCharPtr: (buffer: OptimizedBufferHandle) => Pointer\n bufferGetFgPtr: (buffer: OptimizedBufferHandle) => Pointer\n bufferGetBgPtr: (buffer: OptimizedBufferHandle) => Pointer\n bufferGetAttributesPtr: (buffer: OptimizedBufferHandle) => Pointer\n bufferGetRespectAlpha: (buffer: OptimizedBufferHandle) => boolean\n bufferSetRespectAlpha: (buffer: OptimizedBufferHandle, respectAlpha: boolean) => void\n bufferGetId: (buffer: OptimizedBufferHandle) => string\n bufferGetRealCharSize: (buffer: OptimizedBufferHandle) => number\n bufferWriteResolvedChars: (buffer: OptimizedBufferHandle, outputBuffer: Uint8Array, addLineBreaks: boolean) => number\n bufferDrawText: (\n buffer: OptimizedBufferHandle,\n text: string,\n x: number,\n y: number,\n color: RGBA,\n bgColor?: RGBA,\n attributes?: number,\n ) => void\n bufferSetCellWithAlphaBlending: (\n buffer: OptimizedBufferHandle,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) => void\n bufferSetCell: (\n buffer: OptimizedBufferHandle,\n x: number,\n y: number,\n char: string,\n color: RGBA,\n bgColor: RGBA,\n attributes?: number,\n ) => void\n bufferFillRect: (\n buffer: OptimizedBufferHandle,\n x: number,\n y: number,\n width: number,\n height: number,\n color: RGBA,\n ) => void\n bufferColorMatrix: (\n buffer: OptimizedBufferHandle,\n matrixPtr: Pointer,\n cellMaskPtr: Pointer,\n cellMaskCount: number,\n strength: number,\n target: TargetChannel,\n ) => void\n bufferColorMatrixUniform: (\n buffer: OptimizedBufferHandle,\n matrixPtr: Pointer,\n strength: number,\n target: TargetChannel,\n ) => void\n bufferDrawSuperSampleBuffer: (\n buffer: OptimizedBufferHandle,\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: OptimizedBufferHandle,\n dataPtr: Pointer,\n dataLen: number,\n posX: number,\n posY: number,\n terminalWidthCells: number,\n terminalHeightCells: number,\n ) => void\n bufferDrawGrayscaleBuffer: (\n buffer: OptimizedBufferHandle,\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: OptimizedBufferHandle,\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: OptimizedBufferHandle,\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: OptimizedBufferHandle,\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 titleColor: RGBA,\n title: string | null,\n bottomTitle: string | null,\n ) => void\n bufferResize: (buffer: OptimizedBufferHandle, width: number, height: number) => void\n resizeRenderer: (renderer: RendererHandle, width: number, height: number) => void\n setCursorPosition: (renderer: RendererHandle, x: number, y: number, visible: boolean) => void\n setCursorColor: (renderer: RendererHandle, color: RGBA) => void\n getCursorState: (renderer: RendererHandle) => CursorState\n setCursorStyleOptions: (renderer: RendererHandle, options: CursorStyleOptions) => void\n setDebugOverlay: (renderer: RendererHandle, enabled: boolean, corner: DebugOverlayCorner) => void\n clearTerminal: (renderer: RendererHandle) => void\n setTerminalTitle: (renderer: RendererHandle, title: string) => void\n copyToClipboardOSC52: (renderer: RendererHandle, target: number, textUtf8: Uint8Array) => boolean\n clearClipboardOSC52: (renderer: RendererHandle, target: number) => boolean\n triggerNotification: (renderer: RendererHandle, message: string, title?: string) => boolean\n addToHitGrid: (renderer: RendererHandle, x: number, y: number, width: number, height: number, id: number) => void\n clearCurrentHitGrid: (renderer: RendererHandle) => void\n hitGridPushScissorRect: (renderer: RendererHandle, x: number, y: number, width: number, height: number) => void\n hitGridPopScissorRect: (renderer: RendererHandle) => void\n hitGridClearScissorRects: (renderer: RendererHandle) => void\n addToCurrentHitGridClipped: (\n renderer: RendererHandle,\n x: number,\n y: number,\n width: number,\n height: number,\n id: number,\n ) => void\n checkHit: (renderer: RendererHandle, x: number, y: number) => number\n getHitGridDirty: (renderer: RendererHandle) => boolean\n dumpHitGrid: (renderer: RendererHandle) => void\n dumpBuffers: (renderer: RendererHandle, timestamp?: number) => void\n dumpOutputBuffer: (renderer: RendererHandle, timestamp?: number) => void\n restoreTerminalModes: (renderer: RendererHandle) => void\n enableMouse: (renderer: RendererHandle, enableMovement: boolean) => void\n disableMouse: (renderer: RendererHandle) => void\n enableKittyKeyboard: (renderer: RendererHandle, flags: number) => void\n disableKittyKeyboard: (renderer: RendererHandle) => void\n setKittyKeyboardFlags: (renderer: RendererHandle, flags: number) => void\n getKittyKeyboardFlags: (renderer: RendererHandle) => number\n setupTerminal: (renderer: RendererHandle, useAlternateScreen: boolean) => void\n suspendRenderer: (renderer: RendererHandle) => void\n resumeRenderer: (renderer: RendererHandle) => void\n queryPixelResolution: (renderer: RendererHandle) => void\n queryThemeColors: (renderer: RendererHandle) => void\n writeOut: (renderer: RendererHandle, data: string | Uint8Array) => void\n\n // Yoga layout methods\n yogaConfigCreate: () => Pointer\n yogaConfigFree: (config: Pointer) => void\n yogaConfigSetUseWebDefaults: (config: Pointer, enabled: boolean) => void\n yogaConfigGetUseWebDefaults: (config: Pointer) => boolean\n yogaConfigSetPointScaleFactor: (config: Pointer, pointScaleFactor: number) => void\n yogaConfigGetPointScaleFactor: (config: Pointer) => number\n yogaConfigSetErrata: (config: Pointer, errata: number) => void\n yogaConfigGetErrata: (config: Pointer) => number\n yogaConfigSetExperimentalFeatureEnabled: (config: Pointer, feature: number, enabled: boolean) => void\n yogaConfigIsExperimentalFeatureEnabled: (config: Pointer, feature: number) => boolean\n yogaNodeCreate: () => Pointer\n yogaNodeCreateForOpenTUI: () => Pointer\n yogaNodeCreateWithConfig: (config: Pointer) => Pointer\n yogaNodeFree: (node: Pointer) => void\n yogaNodeFreeRecursive: (node: Pointer) => void\n yogaNodeReset: (node: Pointer) => void\n yogaNodeCopyStyle: (dstNode: Pointer, srcNode: Pointer) => void\n yogaNodeInsertChild: (node: Pointer, child: Pointer, index: number) => void\n yogaNodeRemoveChild: (node: Pointer, child: Pointer) => void\n yogaNodeRemoveAllChildren: (node: Pointer) => void\n yogaNodeGetChild: (node: Pointer, index: number) => Pointer | null\n yogaNodeGetChildCount: (node: Pointer) => number\n yogaNodeGetParent: (node: Pointer) => Pointer | null\n yogaNodeCalculateLayout: (node: Pointer, width: number, height: number, direction: number) => void\n yogaNodeIsDirty: (node: Pointer) => boolean\n yogaNodeMarkDirty: (node: Pointer) => void\n yogaNodeGetHasNewLayout: (node: Pointer) => boolean\n yogaNodeSetHasNewLayout: (node: Pointer, hasNewLayout: boolean) => void\n yogaNodeSetIsReferenceBaseline: (node: Pointer, isReferenceBaseline: boolean) => void\n yogaNodeIsReferenceBaseline: (node: Pointer) => boolean\n yogaNodeSetAlwaysFormsContainingBlock: (node: Pointer, alwaysFormsContainingBlock: boolean) => void\n yogaNodeGetAlwaysFormsContainingBlock: (node: Pointer) => boolean\n yogaNodeGetComputedLayout: (node: Pointer) => NativeYogaLayout\n yogaNodeLayoutGetEdge: (node: Pointer, kind: number, edge: number) => number\n yogaNodeStyleSetEnum: (node: Pointer, kind: number, value: number) => void\n yogaNodeStyleGetEnum: (node: Pointer, kind: number) => number\n yogaNodeStyleSetFloat: (node: Pointer, kind: number, value: number) => void\n yogaNodeStyleGetFloat: (node: Pointer, kind: number) => number\n yogaNodeStyleSetBorder: (node: Pointer, edge: number, border: number) => void\n yogaNodeStyleGetBorder: (node: Pointer, edge: number) => number\n yogaNodeStyleSetValue: (node: Pointer, kind: number, edgeOrGutter: number, unit: number, value: number) => void\n yogaNodeStyleGetValue: (node: Pointer, kind: number, edgeOrGutter: number) => number | bigint\n yogaNodeSetMeasureFunc: (node: Pointer, enabled: boolean) => void\n yogaNodeUnsetMeasureFunc: (node: Pointer) => void\n yogaNodeHasMeasureFunc: (node: Pointer) => boolean\n yogaNodeSetDirtiedFunc: (node: Pointer, enabled: boolean) => void\n yogaNodeUnsetDirtiedFunc: (node: Pointer) => void\n yogaStoreMeasureResult: (width: number, height: number) => void\n yogaSetMeasureCallback: (callback: Pointer | null) => void\n yogaSetDirtiedCallback: (callback: Pointer | null) => void\n createYogaMeasureCallback: (callback: NativeYogaMeasureCallback) => FFICallbackInstance\n createYogaDirtiedCallback: (callback: NativeYogaDirtiedCallback) => FFICallbackInstance\n\n // TextBuffer methods\n createTextBuffer: (widthMethod: WidthMethod) => TextBuffer\n destroyTextBuffer: (buffer: TextBufferHandle) => void\n textBufferGetLength: (buffer: TextBufferHandle) => number\n textBufferGetByteSize: (buffer: TextBufferHandle) => number\n\n textBufferReset: (buffer: TextBufferHandle) => void\n textBufferClear: (buffer: TextBufferHandle) => void\n textBufferRegisterMemBuffer: (buffer: TextBufferHandle, bytes: Uint8Array, owned?: boolean) => number\n textBufferReplaceMemBuffer: (buffer: TextBufferHandle, memId: number, bytes: Uint8Array, owned?: boolean) => boolean\n textBufferClearMemRegistry: (buffer: TextBufferHandle) => void\n textBufferSetTextFromMem: (buffer: TextBufferHandle, memId: number) => void\n textBufferAppend: (buffer: TextBufferHandle, bytes: Uint8Array) => void\n textBufferAppendFromMemId: (buffer: TextBufferHandle, memId: number) => void\n textBufferLoadFile: (buffer: TextBufferHandle, path: string) => boolean\n textBufferSetStyledText: (\n buffer: TextBufferHandle,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number; link?: { url: string } }>,\n ) => void\n textBufferSetDefaultFg: (buffer: TextBufferHandle, fg: RGBA | null) => void\n textBufferSetDefaultBg: (buffer: TextBufferHandle, bg: RGBA | null) => void\n textBufferSetDefaultAttributes: (buffer: TextBufferHandle, attributes: number | null) => void\n textBufferResetDefaults: (buffer: TextBufferHandle) => void\n textBufferGetTabWidth: (buffer: TextBufferHandle) => number\n textBufferSetTabWidth: (buffer: TextBufferHandle, width: number) => void\n textBufferGetLineCount: (buffer: TextBufferHandle) => number\n getPlainTextBytes: (buffer: TextBufferHandle, maxLength: number) => Uint8Array | null\n textBufferGetTextRange: (\n buffer: TextBufferHandle,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ) => Uint8Array | null\n textBufferGetTextRangeByCoords: (\n buffer: TextBufferHandle,\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: TextBufferHandle) => TextBufferViewHandle\n destroyTextBufferView: (view: TextBufferViewHandle) => void\n textBufferViewSetSelection: (\n view: TextBufferViewHandle,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => void\n textBufferViewResetSelection: (view: TextBufferViewHandle) => void\n textBufferViewGetSelection: (view: TextBufferViewHandle) => { start: number; end: number } | null\n textBufferViewSetLocalSelection: (\n view: TextBufferViewHandle,\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => boolean\n textBufferViewUpdateSelection: (\n view: TextBufferViewHandle,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => void\n textBufferViewUpdateLocalSelection: (\n view: TextBufferViewHandle,\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: TextBufferViewHandle) => void\n textBufferViewSetWrapWidth: (view: TextBufferViewHandle, width: number) => void\n textBufferViewSetWrapMode: (view: TextBufferViewHandle, mode: \"none\" | \"char\" | \"word\") => void\n textBufferViewSetFirstLineOffset: (view: TextBufferViewHandle, offset: number) => void\n textBufferViewSetViewportSize: (view: TextBufferViewHandle, width: number, height: number) => void\n textBufferViewSetViewport: (view: TextBufferViewHandle, x: number, y: number, width: number, height: number) => void\n textBufferViewGetLineInfo: (view: TextBufferViewHandle) => LineInfo\n textBufferViewGetLogicalLineInfo: (view: TextBufferViewHandle) => LineInfo\n textBufferViewGetSelectedTextBytes: (view: TextBufferViewHandle, maxLength: number) => Uint8Array | null\n textBufferViewGetPlainTextBytes: (view: TextBufferViewHandle, maxLength: number) => Uint8Array | null\n textBufferViewSetTabIndicator: (view: TextBufferViewHandle, indicator: number) => void\n textBufferViewSetTabIndicatorColor: (view: TextBufferViewHandle, color: RGBA) => void\n textBufferViewSetTruncate: (view: TextBufferViewHandle, truncate: boolean) => void\n textBufferViewMeasureForDimensions: (\n view: TextBufferViewHandle,\n width: number,\n height: number,\n ) => { lineCount: number; widthColsMax: number } | null\n textBufferViewGetVirtualLineCount: (view: TextBufferViewHandle) => number\n\n readonly encoder: TextEncoder\n readonly decoder: TextDecoder\n bufferDrawTextBufferView: (buffer: OptimizedBufferHandle, view: TextBufferViewHandle, x: number, y: number) => void\n bufferDrawEditorView: (buffer: OptimizedBufferHandle, view: EditorViewHandle, x: number, y: number) => void\n\n // EditBuffer methods\n createEditBuffer: (widthMethod: WidthMethod) => EditBufferHandle\n destroyEditBuffer: (buffer: EditBufferHandle) => void\n editBufferSetText: (buffer: EditBufferHandle, textBytes: Uint8Array) => void\n editBufferSetTextFromMem: (buffer: EditBufferHandle, memId: number) => void\n editBufferReplaceText: (buffer: EditBufferHandle, textBytes: Uint8Array) => void\n editBufferReplaceTextFromMem: (buffer: EditBufferHandle, memId: number) => void\n editBufferGetText: (buffer: EditBufferHandle, maxLength: number) => Uint8Array | null\n editBufferInsertChar: (buffer: EditBufferHandle, char: string) => void\n editBufferInsertText: (buffer: EditBufferHandle, text: string) => void\n editBufferDeleteChar: (buffer: EditBufferHandle) => void\n editBufferDeleteCharBackward: (buffer: EditBufferHandle) => void\n editBufferDeleteRange: (\n buffer: EditBufferHandle,\n startLine: number,\n startCol: number,\n endLine: number,\n endCol: number,\n ) => void\n editBufferNewLine: (buffer: EditBufferHandle) => void\n editBufferDeleteLine: (buffer: EditBufferHandle) => void\n editBufferMoveCursorLeft: (buffer: EditBufferHandle) => void\n editBufferMoveCursorRight: (buffer: EditBufferHandle) => void\n editBufferMoveCursorUp: (buffer: EditBufferHandle) => void\n editBufferMoveCursorDown: (buffer: EditBufferHandle) => void\n editBufferGotoLine: (buffer: EditBufferHandle, line: number) => void\n editBufferSetCursor: (buffer: EditBufferHandle, line: number, col: number) => void\n editBufferSetCursorToLineCol: (buffer: EditBufferHandle, line: number, col: number) => void\n editBufferSetCursorByOffset: (buffer: EditBufferHandle, offset: number) => void\n editBufferGetCursorPosition: (buffer: EditBufferHandle) => LogicalCursor\n editBufferGetId: (buffer: EditBufferHandle) => number\n editBufferGetTextBuffer: (buffer: EditBufferHandle) => TextBufferHandle\n editBufferDebugLogRope: (buffer: EditBufferHandle) => void\n editBufferUndo: (buffer: EditBufferHandle, maxLength: number) => Uint8Array | null\n editBufferRedo: (buffer: EditBufferHandle, maxLength: number) => Uint8Array | null\n editBufferCanUndo: (buffer: EditBufferHandle) => boolean\n editBufferCanRedo: (buffer: EditBufferHandle) => boolean\n editBufferClearHistory: (buffer: EditBufferHandle) => void\n editBufferClear: (buffer: EditBufferHandle) => void\n editBufferGetNextWordBoundary: (buffer: EditBufferHandle) => { row: number; col: number; offset: number }\n editBufferGetPrevWordBoundary: (buffer: EditBufferHandle) => { row: number; col: number; offset: number }\n editBufferGetEOL: (buffer: EditBufferHandle) => { row: number; col: number; offset: number }\n editBufferOffsetToPosition: (\n buffer: EditBufferHandle,\n offset: number,\n ) => { row: number; col: number; offset: number } | null\n editBufferPositionToOffset: (buffer: EditBufferHandle, row: number, col: number) => number\n editBufferGetLineStartOffset: (buffer: EditBufferHandle, row: number) => number\n editBufferGetTextRange: (\n buffer: EditBufferHandle,\n startOffset: number,\n endOffset: number,\n maxLength: number,\n ) => Uint8Array | null\n editBufferGetTextRangeByCoords: (\n buffer: EditBufferHandle,\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: EditBufferHandle, viewportWidth: number, viewportHeight: number) => EditorViewHandle\n destroyEditorView: (view: EditorViewHandle) => void\n editorViewSetViewportSize: (view: EditorViewHandle, width: number, height: number) => void\n editorViewSetViewport: (\n view: EditorViewHandle,\n x: number,\n y: number,\n width: number,\n height: number,\n moveCursor: boolean,\n ) => void\n editorViewGetViewport: (view: EditorViewHandle) => { offsetY: number; offsetX: number; height: number; width: number }\n editorViewSetScrollMargin: (view: EditorViewHandle, margin: number) => void\n editorViewSetWrapMode: (view: EditorViewHandle, mode: \"none\" | \"char\" | \"word\") => void\n editorViewGetVirtualLineCount: (view: EditorViewHandle) => number\n editorViewGetTotalVirtualLineCount: (view: EditorViewHandle) => number\n editorViewGetTextBufferView: (view: EditorViewHandle) => TextBufferViewHandle\n editorViewSetSelection: (\n view: EditorViewHandle,\n start: number,\n end: number,\n bgColor: RGBA | null,\n fgColor: RGBA | null,\n ) => void\n editorViewResetSelection: (view: EditorViewHandle) => void\n editorViewGetSelection: (view: EditorViewHandle) => { start: number; end: number } | null\n editorViewSetLocalSelection: (\n view: EditorViewHandle,\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: EditorViewHandle, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void\n editorViewUpdateLocalSelection: (\n view: EditorViewHandle,\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: EditorViewHandle) => void\n editorViewGetSelectedTextBytes: (view: EditorViewHandle, maxLength: number) => Uint8Array | null\n editorViewGetCursor: (view: EditorViewHandle) => { row: number; col: number }\n editorViewGetText: (view: EditorViewHandle, maxLength: number) => Uint8Array | null\n editorViewGetVisualCursor: (view: EditorViewHandle) => VisualCursor\n editorViewMoveUpVisual: (view: EditorViewHandle) => void\n editorViewMoveDownVisual: (view: EditorViewHandle) => void\n editorViewDeleteSelectedText: (view: EditorViewHandle) => void\n editorViewSetCursorByOffset: (view: EditorViewHandle, offset: number) => void\n editorViewGetNextWordBoundary: (view: EditorViewHandle) => VisualCursor\n editorViewGetPrevWordBoundary: (view: EditorViewHandle) => VisualCursor\n editorViewGetEOL: (view: EditorViewHandle) => VisualCursor\n editorViewGetVisualSOL: (view: EditorViewHandle) => VisualCursor\n editorViewGetVisualEOL: (view: EditorViewHandle) => VisualCursor\n editorViewGetLineInfo: (view: EditorViewHandle) => LineInfo\n editorViewGetLogicalLineInfo: (view: EditorViewHandle) => LineInfo\n editorViewSetPlaceholderStyledText: (\n view: EditorViewHandle,\n chunks: Array<{ text: string; fg?: RGBA | null; bg?: RGBA | null; attributes?: number }>,\n ) => void\n editorViewSetTabIndicator: (view: EditorViewHandle, indicator: number) => void\n editorViewSetTabIndicatorColor: (view: EditorViewHandle, color: RGBA) => void\n\n bufferPushScissorRect: (buffer: OptimizedBufferHandle, x: number, y: number, width: number, height: number) => void\n bufferPopScissorRect: (buffer: OptimizedBufferHandle) => void\n bufferClearScissorRects: (buffer: OptimizedBufferHandle) => void\n bufferPushOpacity: (buffer: OptimizedBufferHandle, opacity: number) => void\n bufferPopOpacity: (buffer: OptimizedBufferHandle) => void\n bufferGetCurrentOpacity: (buffer: OptimizedBufferHandle) => number\n bufferClearOpacity: (buffer: OptimizedBufferHandle) => void\n textBufferAddHighlightByCharRange: (buffer: TextBufferHandle, highlight: Highlight) => void\n textBufferAddHighlight: (buffer: TextBufferHandle, lineIdx: number, highlight: Highlight) => void\n textBufferRemoveHighlightsByRef: (buffer: TextBufferHandle, hlRef: number) => void\n textBufferClearLineHighlights: (buffer: TextBufferHandle, lineIdx: number) => void\n textBufferClearAllHighlights: (buffer: TextBufferHandle) => void\n textBufferSetSyntaxStyle: (buffer: TextBufferHandle, style: SyntaxStyleHandle | null) => boolean\n textBufferGetLineHighlights: (buffer: TextBufferHandle, lineIdx: number) => Array<Highlight>\n textBufferGetHighlightCount: (buffer: TextBufferHandle) => number\n\n getArenaAllocatedBytes: () => number\n getBuildOptions: () => BuildOptions\n getAllocatorStats: () => AllocatorStats\n\n createSyntaxStyle: () => SyntaxStyleHandle\n destroySyntaxStyle: (style: SyntaxStyleHandle) => void\n syntaxStyleRegister: (\n style: SyntaxStyleHandle,\n name: string,\n fg: RGBA | null,\n bg: RGBA | null,\n attributes: number,\n ) => number\n syntaxStyleResolveByName: (style: SyntaxStyleHandle, name: string) => number | null\n syntaxStyleGetStyleCount: (style: SyntaxStyleHandle) => number\n\n getTerminalCapabilities: (renderer: RendererHandle) => TerminalCapabilities\n processCapabilityResponse: (renderer: RendererHandle, 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: (\n buffer: OptimizedBufferHandle,\n char: number,\n x: number,\n y: number,\n fg: RGBA,\n bg: RGBA,\n attributes?: number,\n ) => 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 createNativeRenderable: () => NativeRenderableHandle\n destroyNativeRenderable: (handle: NativeRenderableHandle) => void\n nativeRenderableAttachYogaNode: (handle: NativeRenderableHandle, node: Pointer) => boolean\n nativeRenderableSetMeasureTarget: (\n handle: NativeRenderableHandle,\n kind: NativeMeasureTargetKind,\n target: NativeMeasureTargetHandle | 0,\n ) => boolean\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: FFICallbackInstance | null = null\n private eventCallbackWrapper: FFICallbackInstance | null = null\n private eventSinkPtr: EventSinkHandle | null = null\n private _nativeEvents: EventEmitter = new EventEmitter()\n private _anyEventHandlers: Array<(name: string, data: ArrayBuffer) => void> = []\n private nativeSpanFeedCallbackWrapper: FFICallbackInstance | null = null\n private nativeSpanFeedHandlers = new Map<Pointer, NativeSpanFeedEventHandler>()\n\n public createNativeRenderable(): NativeRenderableHandle {\n const handle = this.opentui.symbols.createNativeRenderable() as NativeRenderableHandle\n if (!handle) throw new Error(\"Failed to create native renderable\")\n return handle\n }\n\n public destroyNativeRenderable(handle: NativeRenderableHandle): void {\n this.opentui.symbols.destroyNativeRenderable(handle)\n }\n\n public nativeRenderableAttachYogaNode(handle: NativeRenderableHandle, node: Pointer): boolean {\n // Node's FFI returns bools as 0/1 numbers; normalize so the interface stays truthful.\n return Boolean(this.opentui.symbols.nativeRenderableAttachYogaNode(handle, node))\n }\n\n public nativeRenderableSetMeasureTarget(\n handle: NativeRenderableHandle,\n kind: NativeMeasureTargetKind,\n target: NativeMeasureTargetHandle | 0,\n ): boolean {\n return Boolean(this.opentui.symbols.nativeRenderableSetMeasureTarget(handle, kind, target))\n }\n\n constructor(libPath?: string) {\n this.opentui = getOpenTUILib(libPath)\n try {\n this.setupLogging()\n this.setupEventBus()\n } catch (error) {\n this.dispose()\n throw error\n }\n }\n\n private setupLogging() {\n if (this.logCallbackWrapper) {\n return\n }\n\n const logCallback = this.opentui.createCallback(\n (level: number, msgPtr: Pointer, msgLen: number) => {\n try {\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\", \"u32\"],\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 | null) {\n this.opentui.symbols.setLogCallback(callbackPtr)\n }\n\n public dispose(): void {\n try {\n if (this.eventSinkPtr) {\n this.opentui.symbols.destroyEventSink(this.eventSinkPtr)\n this.eventSinkPtr = null\n }\n\n this.yogaSetMeasureCallback(null)\n this.yogaSetDirtiedCallback(null)\n this.setLogCallback(null)\n } finally {\n try {\n this.opentui.close()\n } finally {\n this.eventCallbackWrapper = null\n this.logCallbackWrapper = null\n this.nativeSpanFeedCallbackWrapper = null\n this.nativeSpanFeedHandlers.clear()\n }\n }\n }\n\n private setupEventBus() {\n if (this.eventCallbackWrapper) {\n return\n }\n\n const eventCallback = this.opentui.createCallback(\n (namePtr: Pointer, nameLen: number, dataPtr: Pointer, dataLen: number) => {\n try {\n if (nameLen === 0 || !namePtr) {\n return\n }\n\n const eventName = this.decoder.decode(toArrayBuffer(namePtr, 0, nameLen))\n const eventData = dataLen > 0 && dataPtr ? toArrayBuffer(dataPtr, 0, dataLen).slice(0) : new ArrayBuffer(0)\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\", \"u32\", \"ptr\", \"u32\"],\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.eventSinkPtr = this.opentui.symbols.createEventSink(eventCallback.ptr)\n if (!this.eventSinkPtr) {\n eventCallback.close()\n this.eventCallbackWrapper = null\n throw new Error(\"Failed to create native event sink\")\n }\n }\n\n private ensureNativeSpanFeedCallback(): FFICallbackInstance {\n if (this.nativeSpanFeedCallbackWrapper) {\n return this.nativeSpanFeedCallbackWrapper\n }\n\n const callback = this.opentui.createCallback(\n (streamPtr: Pointer, eventId: number, arg0: Pointer, arg1: number | bigint) => {\n const handler = this.nativeSpanFeedHandlers.get(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 public createRenderer(width: number, height: number, options: NativeRendererCreateOptions = {}) {\n const bufferedOutputKind = options.bufferedOutput === \"memory\" ? 1 : 0\n const remoteMode = options.remote === undefined ? 0 : options.remote ? 2 : 1\n // `feedPtr` is an internal wiring detail: non-null selects the feed backend\n // used for custom Writable output. When null, `bufferedOutput` selects the\n // buffered stdout or memory backend.\n const feedPtr = options.feedPtr ?? null\n const renderer = this.opentui.symbols.createRenderer(\n width,\n height,\n bufferedOutputKind,\n remoteMode,\n feedPtr,\n ) as RendererHandle\n return renderer ? renderer : null\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(\n renderer,\n ptrOrNull(keyBytes),\n keyBytes.byteLength,\n ptrOrNull(valueBytes),\n valueBytes.byteLength,\n )\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, ffiBool(useThread))\n }\n\n public setClearOnShutdown(renderer: Pointer, clear: boolean) {\n this.opentui.symbols.setClearOnShutdown(renderer, ffiBool(clear))\n }\n\n public setBackgroundColor(renderer: Pointer, color: RGBA) {\n this.opentui.symbols.setBackgroundColor(renderer, rgbaPtr(color))\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 getSplitOutputOffset(renderer: Pointer, surfaceOffset: number): number {\n return this.opentui.symbols.getSplitOutputOffset(renderer, surfaceOffset)\n }\n\n public setPendingSplitFooterTransition(\n renderer: Pointer,\n mode: number,\n sourceTopLine: number,\n sourceHeight: number,\n targetTopLine: number,\n targetHeight: number,\n scrollLines: number,\n ): void {\n this.opentui.symbols.setPendingSplitFooterTransition(\n renderer,\n mode,\n sourceTopLine,\n sourceHeight,\n targetTopLine,\n targetHeight,\n scrollLines,\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 getRenderStats(renderer: Pointer): NativeRenderStats {\n const statsBuffer = new ArrayBuffer(NativeRenderStatsStruct.size)\n this.opentui.symbols.getRenderStats(renderer, ptr(statsBuffer))\n const stats = NativeRenderStatsStruct.unpack(statsBuffer)\n\n return {\n nativeLastFrameTime: stats.lastFrameTime,\n nativeAverageFrameTime: stats.averageFrameTime,\n nativeFrameCount: toNumber(stats.frameCount),\n cellsUpdated: stats.cellsUpdated,\n averageCellsUpdated: stats.averageCellsUpdated,\n nativeRenderTime: stats.renderTimeValid ? stats.renderTime : undefined,\n nativeStdoutWriteTime: stats.stdoutWriteTimeValid ? stats.stdoutWriteTime : undefined,\n }\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 Uint16Array(palette.length * 4)\n\n for (let index = 0; index < palette.length; index++) {\n paletteBuffer.set(palette[index].buffer, index * 4)\n }\n\n this.opentui.symbols.rendererSetPaletteState(\n renderer,\n ptr(paletteBuffer),\n palette.length,\n rgbaPtr(defaultForeground),\n rgbaPtr(defaultBackground),\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 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, ffiBool(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, ptr(outBuffer), maxLen)\n return this.decoder.decode(outBuffer.slice(0, actualLen))\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 return this.opentui.symbols.bufferWriteResolvedChars(\n buffer,\n ptrOrNull(outputBuffer),\n outputBuffer.byteLength,\n ffiBool(addLineBreaks),\n )\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, rgbaPtr(color))\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 bg = optionalRgbaPtr(bgColor)\n const fg = rgbaPtr(color)\n\n this.opentui.symbols.bufferDrawText(\n buffer,\n ptrOrNull(textBytes),\n textBytes.byteLength,\n x,\n y,\n fg,\n bg,\n attributes ?? 0,\n )\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 = rgbaPtr(bgColor)\n const fg = rgbaPtr(color)\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 = rgbaPtr(bgColor)\n const fg = rgbaPtr(color)\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 = rgbaPtr(color)\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 optionalRgbaPtr(fg),\n optionalRgbaPtr(bg),\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 optionalRgbaPtr(fg),\n optionalRgbaPtr(bg),\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 ptr(borderChars),\n rgbaPtr(borderFg),\n rgbaPtr(borderBg),\n ptr(columnOffsets),\n columnCount,\n ptr(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 titleColor: RGBA,\n title: string | null,\n bottomTitle: string | null,\n ): void {\n const titleBytes = title ? this.encoder.encode(title) : null\n const titleLen = titleBytes?.byteLength ?? 0\n const titlePtr = titleBytes ? ptr(titleBytes) : null\n\n const bottomTitleBytes = bottomTitle ? this.encoder.encode(bottomTitle) : null\n const bottomTitleLen = bottomTitleBytes?.byteLength ?? 0\n const bottomTitlePtr = bottomTitleBytes ? ptr(bottomTitleBytes) : null\n\n this.opentui.symbols.bufferDrawBox(\n buffer,\n x,\n y,\n width,\n height,\n ptr(borderChars),\n packedOptions,\n rgbaPtr(borderColor),\n rgbaPtr(backgroundColor),\n rgbaPtr(titleColor),\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(ptrOrNull(urlBytes), urlBytes.byteLength)\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, ptrOrNull(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, ffiBool(visible))\n }\n\n public setCursorColor(renderer: Pointer, color: RGBA) {\n this.opentui.symbols.setCursorColor(renderer, rgbaPtr(color))\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, buffer)\n }\n\n public render(renderer: Pointer, force: boolean): number {\n return this.opentui.symbols.render(renderer, ffiBool(force))\n }\n\n private unpackRenderOperationResult(value: number | bigint): NativeRenderOperationResult {\n const packed = typeof value === \"bigint\" ? value : BigInt(value)\n return {\n renderOffset: Number(packed & 0xffffffffn),\n status: Number((packed >> 32n) & 0xffn),\n }\n }\n\n public repaintSplitFooter(\n renderer: Pointer,\n pinnedRenderOffset: number,\n force: boolean,\n ): NativeRenderOperationResult {\n return this.unpackRenderOperationResult(\n this.opentui.symbols.repaintSplitFooter(renderer, pinnedRenderOffset, ffiBool(force)),\n )\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 ): NativeRenderOperationResult {\n return this.unpackRenderOperationResult(\n this.opentui.symbols.commitSplitFooterSnapshot(\n renderer,\n snapshot.ptr,\n rowColumns,\n ffiBool(startOnNewLine),\n ffiBool(trailingNewline),\n pinnedRenderOffset,\n ffiBool(force),\n ffiBool(beginFrame),\n ffiBool(finalizeFrame),\n ),\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 ffiBool(respectAlpha),\n widthMethodCode,\n ptr(idBytes),\n idBytes.byteLength,\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, ffiBool(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, ptrOrNull(titleBytes), titleBytes.byteLength)\n }\n\n public copyToClipboardOSC52(renderer: Pointer, target: number, textUtf8: Uint8Array): boolean {\n if (textUtf8.byteLength > 0xffffffff) return false\n return Boolean(\n this.opentui.symbols.copyToClipboardOSC52(renderer, target, ptrOrNull(textUtf8), textUtf8.byteLength),\n )\n }\n\n public clearClipboardOSC52(renderer: Pointer, target: number): boolean {\n return Boolean(this.opentui.symbols.clearClipboardOSC52(renderer, target))\n }\n\n public triggerNotification(renderer: Pointer, message: string, title?: string): boolean {\n const messageBytes = this.encoder.encode(message)\n const titleBytes = title === undefined ? null : this.encoder.encode(title)\n return Boolean(\n this.opentui.symbols.triggerNotification(\n renderer,\n messageBytes,\n messageBytes.length,\n titleBytes,\n titleBytes?.length ?? 0,\n ),\n )\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 dumpOutputBuffer(renderer: Pointer, timestamp?: number): void {\n const ts = timestamp ?? Date.now()\n this.opentui.symbols.dumpOutputBuffer(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, ffiBool(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, ffiBool(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, ptrOrNull(bytes), bytes.byteLength)\n }\n\n public yogaConfigCreate(): Pointer {\n const config = this.opentui.symbols.yogaConfigCreate()\n if (!config) throw new Error(\"Failed to create Yoga config\")\n return config\n }\n\n public yogaConfigFree(config: Pointer): void {\n this.opentui.symbols.yogaConfigFree(config)\n }\n\n public yogaConfigSetUseWebDefaults(config: Pointer, enabled: boolean): void {\n this.opentui.symbols.yogaConfigSetUseWebDefaults(config, ffiBool(enabled))\n }\n\n public yogaConfigGetUseWebDefaults(config: Pointer): boolean {\n return this.opentui.symbols.yogaConfigGetUseWebDefaults(config)\n }\n\n public yogaConfigSetPointScaleFactor(config: Pointer, pointScaleFactor: number): void {\n this.opentui.symbols.yogaConfigSetPointScaleFactor(config, pointScaleFactor)\n }\n\n public yogaConfigGetPointScaleFactor(config: Pointer): number {\n return this.opentui.symbols.yogaConfigGetPointScaleFactor(config)\n }\n\n public yogaConfigSetErrata(config: Pointer, errata: number): void {\n this.opentui.symbols.yogaConfigSetErrata(config, errata)\n }\n\n public yogaConfigGetErrata(config: Pointer): number {\n return this.opentui.symbols.yogaConfigGetErrata(config)\n }\n\n public yogaConfigSetExperimentalFeatureEnabled(config: Pointer, feature: number, enabled: boolean): void {\n this.opentui.symbols.yogaConfigSetExperimentalFeatureEnabled(config, feature, ffiBool(enabled))\n }\n\n public yogaConfigIsExperimentalFeatureEnabled(config: Pointer, feature: number): boolean {\n return this.opentui.symbols.yogaConfigIsExperimentalFeatureEnabled(config, feature)\n }\n\n public yogaNodeCreate(): Pointer {\n const node = this.opentui.symbols.yogaNodeCreate()\n if (!node) throw new Error(\"Failed to create Yoga node\")\n return node\n }\n\n public yogaNodeCreateForOpenTUI(): Pointer {\n const node = this.opentui.symbols.yogaNodeCreateForOpenTUI()\n if (!node) throw new Error(\"Failed to create OpenTUI Yoga node\")\n return node\n }\n\n public yogaNodeCreateWithConfig(config: Pointer): Pointer {\n const node = this.opentui.symbols.yogaNodeCreateWithConfig(config)\n if (!node) throw new Error(\"Failed to create Yoga node\")\n return node\n }\n\n public yogaNodeFree(node: Pointer): void {\n this.opentui.symbols.yogaNodeFree(node)\n }\n\n public yogaNodeFreeRecursive(node: Pointer): void {\n this.opentui.symbols.yogaNodeFreeRecursive(node)\n }\n\n public yogaNodeReset(node: Pointer): void {\n this.opentui.symbols.yogaNodeReset(node)\n }\n\n public yogaNodeCopyStyle(dstNode: Pointer, srcNode: Pointer): void {\n this.opentui.symbols.yogaNodeCopyStyle(dstNode, srcNode)\n }\n\n public yogaNodeInsertChild(node: Pointer, child: Pointer, index: number): void {\n this.opentui.symbols.yogaNodeInsertChild(node, child, index)\n }\n\n public yogaNodeRemoveChild(node: Pointer, child: Pointer): void {\n this.opentui.symbols.yogaNodeRemoveChild(node, child)\n }\n\n public yogaNodeRemoveAllChildren(node: Pointer): void {\n this.opentui.symbols.yogaNodeRemoveAllChildren(node)\n }\n\n public yogaNodeGetChild(node: Pointer, index: number): Pointer | null {\n return this.opentui.symbols.yogaNodeGetChild(node, index) || null\n }\n\n public yogaNodeGetChildCount(node: Pointer): number {\n return this.opentui.symbols.yogaNodeGetChildCount(node)\n }\n\n public yogaNodeGetParent(node: Pointer): Pointer | null {\n return this.opentui.symbols.yogaNodeGetParent(node) || null\n }\n\n public yogaNodeCalculateLayout(node: Pointer, width: number, height: number, direction: number): void {\n this.opentui.symbols.yogaNodeCalculateLayout(node, width, height, direction)\n }\n\n public yogaNodeIsDirty(node: Pointer): boolean {\n return this.opentui.symbols.yogaNodeIsDirty(node)\n }\n\n public yogaNodeMarkDirty(node: Pointer): void {\n this.opentui.symbols.yogaNodeMarkDirty(node)\n }\n\n public yogaNodeGetHasNewLayout(node: Pointer): boolean {\n return this.opentui.symbols.yogaNodeGetHasNewLayout(node)\n }\n\n public yogaNodeSetHasNewLayout(node: Pointer, hasNewLayout: boolean): void {\n this.opentui.symbols.yogaNodeSetHasNewLayout(node, ffiBool(hasNewLayout))\n }\n\n public yogaNodeSetIsReferenceBaseline(node: Pointer, isReferenceBaseline: boolean): void {\n this.opentui.symbols.yogaNodeSetIsReferenceBaseline(node, ffiBool(isReferenceBaseline))\n }\n\n public yogaNodeIsReferenceBaseline(node: Pointer): boolean {\n return this.opentui.symbols.yogaNodeIsReferenceBaseline(node)\n }\n\n public yogaNodeSetAlwaysFormsContainingBlock(node: Pointer, alwaysFormsContainingBlock: boolean): void {\n this.opentui.symbols.yogaNodeSetAlwaysFormsContainingBlock(node, ffiBool(alwaysFormsContainingBlock))\n }\n\n public yogaNodeGetAlwaysFormsContainingBlock(node: Pointer): boolean {\n return this.opentui.symbols.yogaNodeGetAlwaysFormsContainingBlock(node)\n }\n\n public yogaNodeGetComputedLayout(node: Pointer): NativeYogaLayout {\n const layout = new Float32Array(6)\n this.opentui.symbols.yogaNodeGetComputedLayout(node, ptr(layout))\n return {\n left: layout[0]!,\n top: layout[1]!,\n right: layout[2]!,\n bottom: layout[3]!,\n width: layout[4]!,\n height: layout[5]!,\n }\n }\n\n public yogaNodeLayoutGetEdge(node: Pointer, kind: number, edge: number): number {\n return this.opentui.symbols.yogaNodeLayoutGetEdge(node, kind, edge)\n }\n\n public yogaNodeStyleSetEnum(node: Pointer, kind: number, value: number): void {\n this.opentui.symbols.yogaNodeStyleSetEnum(node, kind, value)\n }\n\n public yogaNodeStyleGetEnum(node: Pointer, kind: number): number {\n return this.opentui.symbols.yogaNodeStyleGetEnum(node, kind)\n }\n\n public yogaNodeStyleSetFloat(node: Pointer, kind: number, value: number): void {\n this.opentui.symbols.yogaNodeStyleSetFloat(node, kind, value)\n }\n\n public yogaNodeStyleGetFloat(node: Pointer, kind: number): number {\n return this.opentui.symbols.yogaNodeStyleGetFloat(node, kind)\n }\n\n public yogaNodeStyleSetBorder(node: Pointer, edge: number, border: number): void {\n this.opentui.symbols.yogaNodeStyleSetBorder(node, edge, border)\n }\n\n public yogaNodeStyleGetBorder(node: Pointer, edge: number): number {\n return this.opentui.symbols.yogaNodeStyleGetBorder(node, edge)\n }\n\n public yogaNodeStyleSetValue(node: Pointer, kind: number, edgeOrGutter: number, unit: number, value: number): void {\n this.opentui.symbols.yogaNodeStyleSetValue(node, kind, edgeOrGutter, unit, value)\n }\n\n public yogaNodeStyleGetValue(node: Pointer, kind: number, edgeOrGutter: number): number | bigint {\n return this.opentui.symbols.yogaNodeStyleGetValue(node, kind, edgeOrGutter)\n }\n\n public yogaNodeSetMeasureFunc(node: Pointer, enabled: boolean): void {\n this.opentui.symbols.yogaNodeSetMeasureFunc(node, ffiBool(enabled))\n }\n\n public yogaNodeUnsetMeasureFunc(node: Pointer): void {\n this.opentui.symbols.yogaNodeUnsetMeasureFunc(node)\n }\n\n public yogaNodeHasMeasureFunc(node: Pointer): boolean {\n // Node's FFI returns bools as 0/1 numbers; normalize so the interface stays truthful.\n return Boolean(this.opentui.symbols.yogaNodeHasMeasureFunc(node))\n }\n\n public yogaNodeSetDirtiedFunc(node: Pointer, enabled: boolean): void {\n this.opentui.symbols.yogaNodeSetDirtiedFunc(node, ffiBool(enabled))\n }\n\n public yogaNodeUnsetDirtiedFunc(node: Pointer): void {\n this.opentui.symbols.yogaNodeUnsetDirtiedFunc(node)\n }\n\n public yogaStoreMeasureResult(width: number, height: number): void {\n this.opentui.symbols.yogaStoreMeasureResult(width, height)\n }\n\n public yogaSetMeasureCallback(callback: Pointer | null): void {\n this.opentui.symbols.yogaSetMeasureCallback(callback)\n }\n\n public yogaSetDirtiedCallback(callback: Pointer | null): void {\n this.opentui.symbols.yogaSetDirtiedCallback(callback)\n }\n\n public createYogaMeasureCallback(callback: NativeYogaMeasureCallback): FFICallbackInstance {\n return this.opentui.createCallback(callback, {\n args: [\"ptr\", \"f32\", \"u32\", \"f32\", \"u32\"],\n returns: \"void\",\n })\n }\n\n public createYogaDirtiedCallback(callback: NativeYogaDirtiedCallback): FFICallbackInstance {\n return this.opentui.createCallback(callback, {\n args: [\"ptr\"],\n returns: \"void\",\n })\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 = optionalRgbaPtr(fg)\n this.opentui.symbols.textBufferSetDefaultFg(buffer, fgPtr)\n }\n\n public textBufferSetDefaultBg(buffer: Pointer, bg: RGBA | null): void {\n const bgPtr = optionalRgbaPtr(bg)\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 Uint32Array([attributes])\n this.opentui.symbols.textBufferSetDefaultAttributes(buffer, attrValue ? ptr(attrValue) : null)\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(\n buffer,\n ptrOrNull(bytes),\n bytes.byteLength,\n ffiBool(owned),\n )\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(\n buffer,\n memId,\n ptrOrNull(bytes),\n bytes.byteLength,\n ffiBool(owned),\n )\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, ptrOrNull(bytes), bytes.byteLength)\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, ptrOrNull(pathBytes), pathBytes.byteLength)\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, 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 | null, maxLen: number): number {\n return this.opentui.symbols.textBufferGetPlainText(buffer, outPtr, maxLen)\n }\n\n public getPlainTextBytes(buffer: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.textBufferGetPlainText(buffer, ptrOrNull(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 ptrOrNull(outBuffer),\n maxLength,\n )\n\n const len = 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 ptrOrNull(outBuffer),\n maxLength,\n )\n\n const len = 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: TextBufferHandle): TextBufferViewHandle {\n const viewPtr = this.opentui.symbols.createTextBufferView(textBuffer) as TextBufferViewHandle\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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\n return Boolean(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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\n return Boolean(\n this.opentui.symbols.textBufferViewUpdateLocalSelection(view, anchorX, anchorY, focusX, focusY, bg, fg),\n )\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 | null, maxLen: number): number {\n return this.opentui.symbols.textBufferViewGetSelectedText(view, outPtr, maxLen)\n }\n\n private textBufferViewGetPlainText(view: Pointer, outPtr: Pointer | null, maxLen: number): number {\n return this.opentui.symbols.textBufferViewGetPlainText(view, outPtr, maxLen)\n }\n\n public textBufferViewGetSelectedTextBytes(view: Pointer, maxLength: number): Uint8Array | null {\n const outBuffer = new Uint8Array(maxLength)\n\n const actualLen = this.textBufferViewGetSelectedText(view, ptrOrNull(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, ptrOrNull(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, rgbaPtr(color))\n }\n\n public textBufferViewSetTruncate(view: Pointer, truncate: boolean): void {\n this.opentui.symbols.textBufferViewSetTruncate(view, ffiBool(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): boolean {\n return this.opentui.symbols.textBufferSetSyntaxStyle(buffer, style ?? 0)\n }\n\n public textBufferGetLineHighlights(buffer: Pointer, lineIdx: number): Array<Highlight> {\n const outCountBuf = new Uint32Array(1)\n\n const nativePtr = this.opentui.symbols.textBufferGetLineHighlightsPtr(buffer, lineIdx, ptr(outCountBuf))\n if (!nativePtr) return []\n\n const count = 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 toSafeByteCount(result, \"Arena allocated bytes\")\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(\n editBufferPtr: EditBufferHandle,\n viewportWidth: number,\n viewportHeight: number,\n ): EditorViewHandle {\n const viewPtr = this.opentui.symbols.createEditorView(\n editBufferPtr,\n viewportWidth,\n viewportHeight,\n ) as EditorViewHandle\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, ffiBool(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: EditorViewHandle): TextBufferViewHandle {\n const result = this.opentui.symbols.editorViewGetTextBufferView(view) as TextBufferViewHandle\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): EditBufferHandle {\n const widthMethodCode = widthMethod === \"wcwidth\" ? 0 : 1\n const bufferPtr = this.opentui.symbols.createEditBuffer(widthMethodCode, this.eventSinkPtr ?? 0) as EditBufferHandle\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, ptrOrNull(textBytes), textBytes.byteLength)\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, ptrOrNull(textBytes), textBytes.byteLength)\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, ptrOrNull(outBuffer), maxLength)\n const len = 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, ptrOrNull(charBytes), charBytes.byteLength)\n }\n\n public editBufferInsertText(buffer: Pointer, text: string): void {\n const textBytes = this.encoder.encode(text)\n this.opentui.symbols.editBufferInsertText(buffer, ptrOrNull(textBytes), textBytes.byteLength)\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: EditBufferHandle): TextBufferHandle {\n const result = this.opentui.symbols.editBufferGetTextBuffer(buffer) as TextBufferHandle\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, ptrOrNull(outBuffer), maxLength)\n const len = 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, ptrOrNull(outBuffer), maxLength)\n const len = actualLen\n if (len === 0) return null\n return outBuffer.slice(0, len)\n }\n\n public editBufferCanUndo(buffer: Pointer): boolean {\n return Boolean(this.opentui.symbols.editBufferCanUndo(buffer))\n }\n\n public editBufferCanRedo(buffer: Pointer): boolean {\n return Boolean(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 ptrOrNull(outBuffer),\n maxLength,\n )\n const len = 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 ptrOrNull(outBuffer),\n maxLength,\n )\n const len = 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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\n return Boolean(\n this.opentui.symbols.editorViewSetLocalSelection(\n view,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bg,\n fg,\n ffiBool(updateCursor),\n ffiBool(followCursor),\n ),\n )\n }\n\n public editorViewUpdateSelection(view: Pointer, end: number, bgColor: RGBA | null, fgColor: RGBA | null): void {\n const bg = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\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 = optionalRgbaPtr(bgColor)\n const fg = optionalRgbaPtr(fgColor)\n return Boolean(\n this.opentui.symbols.editorViewUpdateLocalSelection(\n view,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bg,\n fg,\n ffiBool(updateCursor),\n ffiBool(followCursor),\n ),\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, ptrOrNull(outBuffer), maxLength)\n const len = 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, ptrOrNull(outBuffer), maxLength)\n const len = 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): TerminalCapabilities {\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 osc52_support: caps.osc52_support,\n notifications: caps.notifications,\n explicit_cursor_positioning: caps.explicit_cursor_positioning,\n remote: caps.remote,\n multiplexer: caps.multiplexer,\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, ptrOrNull(responseBytes), responseBytes.byteLength)\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-sized out slot\n const outLenBuffer = new ArrayBuffer(8) // Native length out slot\n\n const success = this.opentui.symbols.encodeUnicode(\n ptrOrNull(textBytes),\n textBytes.byteLength,\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 resultLen = Number(outLenView[0])\n\n if (resultLen === 0) {\n return { ptr: 0 as Pointer, data: [] }\n }\n\n const resultPtr = toPointer(outPtrView[0])\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, rgbaPtr(fg), rgbaPtr(bg), attributes)\n }\n\n public createAudioEngine(options?: AudioCreateOptions | null): AudioEngineHandle | null {\n const optionsBuffer = options == null ? null : AudioCreateOptionsStruct.pack(options)\n const engineHandle = this.opentui.symbols.createAudioEngine(\n optionsBuffer ? ptr(optionsBuffer) : null,\n ) as AudioEngineHandle\n return engineHandle ? engineHandle : null\n }\n\n public destroyAudioEngine(engine: AudioEngineHandle): void {\n this.opentui.symbols.destroyAudioEngine(engine)\n }\n\n public audioRefreshPlaybackDevices(engine: Pointer): number {\n return this.opentui.symbols.audioRefreshPlaybackDevices(engine)\n }\n\n public audioGetPlaybackDeviceCount(engine: Pointer): number {\n return this.opentui.symbols.audioGetPlaybackDeviceCount(engine)\n }\n\n public audioGetPlaybackDeviceName(engine: Pointer, index: number): string {\n const outBuffer = new Uint8Array(512)\n const bytesWritten = toNumber(\n this.opentui.symbols.audioGetPlaybackDeviceName(engine, index, ptr(outBuffer), outBuffer.length),\n )\n const safeBytesWritten = Math.max(0, Math.min(outBuffer.length, bytesWritten))\n return this.decoder.decode(outBuffer.subarray(0, safeBytesWritten))\n }\n\n public audioIsPlaybackDeviceDefault(engine: Pointer, index: number): boolean {\n return this.opentui.symbols.audioIsPlaybackDeviceDefault(engine, index)\n }\n\n public audioSelectPlaybackDevice(engine: Pointer, index: number): number {\n return this.opentui.symbols.audioSelectPlaybackDevice(engine, index)\n }\n\n public audioClearPlaybackDeviceSelection(engine: Pointer): void {\n this.opentui.symbols.audioClearPlaybackDeviceSelection(engine)\n }\n\n public audioStart(engine: Pointer, options?: AudioStartOptions | null): number {\n const optionsBuffer = options == null ? null : AudioStartOptionsStruct.pack(options)\n return this.opentui.symbols.audioStart(engine, optionsBuffer ? ptr(optionsBuffer) : null)\n }\n\n public audioStartMixer(engine: Pointer): number {\n return this.opentui.symbols.audioStartMixer(engine)\n }\n\n public audioStop(engine: Pointer): number {\n return this.opentui.symbols.audioStop(engine)\n }\n\n public audioLoad(engine: Pointer, data: Uint8Array): { status: number; soundId: number | null } {\n const outBuffer = new ArrayBuffer(4)\n const dataLength = toSafeFFIU32Length(data.byteLength, \"Audio data length\")\n const status = this.opentui.symbols.audioLoad(engine, ptr(data), dataLength, ptr(outBuffer))\n if (status !== 0) {\n return { status, soundId: null }\n }\n const view = new Uint32Array(outBuffer)\n return { status, soundId: view[0] }\n }\n\n public audioUnload(engine: Pointer, soundId: number): number {\n return this.opentui.symbols.audioUnload(engine, soundId)\n }\n\n public audioPlay(\n engine: Pointer,\n soundId: number,\n options?: AudioVoiceOptions,\n ): { status: number; voiceId: number | null } {\n const outBuffer = new ArrayBuffer(4)\n const optionsBuffer = options ? AudioVoiceOptionsStruct.pack(options) : null\n const status = this.opentui.symbols.audioPlay(\n engine,\n soundId,\n optionsBuffer ? ptr(optionsBuffer) : null,\n ptr(outBuffer),\n )\n if (status !== 0) {\n return { status, voiceId: null }\n }\n const view = new Uint32Array(outBuffer)\n return { status, voiceId: view[0] }\n }\n\n public audioStopVoice(engine: Pointer, voiceId: number): number {\n return this.opentui.symbols.audioStopVoice(engine, voiceId)\n }\n\n public audioSetVoiceGroup(engine: Pointer, voiceId: number, groupId: number): number {\n return this.opentui.symbols.audioSetVoiceGroup(engine, voiceId, groupId)\n }\n\n public audioCreateGroup(engine: Pointer, name: string): { status: number; groupId: number | null } {\n const outBuffer = new ArrayBuffer(4)\n const nameBytes = this.encoder.encode(name)\n const nameLength = toSafeFFIU32Length(nameBytes.byteLength, \"Audio group name length\")\n const status = this.opentui.symbols.audioCreateGroup(engine, ptr(nameBytes), nameLength, ptr(outBuffer))\n if (status !== 0) {\n return { status, groupId: null }\n }\n const view = new Uint32Array(outBuffer)\n return { status, groupId: view[0] }\n }\n\n public audioSetGroupVolume(engine: Pointer, groupId: number, volume: number): number {\n return this.opentui.symbols.audioSetGroupVolume(engine, groupId, volume)\n }\n\n public audioSetMasterVolume(engine: Pointer, volume: number): number {\n return this.opentui.symbols.audioSetMasterVolume(engine, volume)\n }\n\n public audioMixToBuffer(engine: Pointer, outBuffer: Float32Array, frameCount: number, channels: number): number {\n return this.opentui.symbols.audioMixToBuffer(engine, ptr(outBuffer), frameCount, channels)\n }\n\n public audioEnableTap(engine: Pointer, enabled: boolean, capacityFrames: number): number {\n return this.opentui.symbols.audioEnableTap(engine, ffiBool(enabled), capacityFrames)\n }\n\n public audioReadTap(\n engine: Pointer,\n outBuffer: Float32Array,\n frameCount: number,\n channels: number,\n ): { status: number; framesRead: number } {\n const outFramesReadBuffer = new ArrayBuffer(4)\n const status = this.opentui.symbols.audioReadTap(\n engine,\n ptr(outBuffer),\n frameCount,\n channels,\n ptr(outFramesReadBuffer),\n )\n if (status !== 0) {\n return { status, framesRead: 0 }\n }\n const view = new Uint32Array(outFramesReadBuffer)\n return { status, framesRead: view[0] ?? 0 }\n }\n\n public audioGetStats(engine: Pointer): AudioStats | null {\n const statsBuffer = new ArrayBuffer(AudioStatsStruct.size)\n const status = this.opentui.symbols.audioGetStats(engine, ptr(statsBuffer))\n if (status !== 0) {\n return null\n }\n const stats = AudioStatsStruct.unpack(statsBuffer)\n return {\n soundsLoaded: stats.soundsLoaded,\n voicesActive: stats.voicesActive,\n framesMixed: typeof stats.framesMixed === \"bigint\" ? stats.framesMixed : BigInt(stats.framesMixed),\n lockMisses: stats.lockMisses,\n lastPeak: stats.lastPeak,\n lastRms: stats.lastRms,\n }\n }\n\n public registerNativeSpanFeedStream(stream: Pointer, handler: NativeSpanFeedEventHandler): void {\n const callback = this.ensureNativeSpanFeedCallback()\n this.nativeSpanFeedHandlers.set(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(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 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(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, ptrOrNull(bytes), bytes.byteLength)\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(): SyntaxStyleHandle {\n const styleHandle = this.opentui.symbols.createSyntaxStyle() as SyntaxStyleHandle\n if (!styleHandle) {\n throw new Error(\"Failed to create SyntaxStyle\")\n }\n return styleHandle\n }\n\n public destroySyntaxStyle(style: SyntaxStyleHandle): void {\n this.opentui.symbols.destroySyntaxStyle(style)\n }\n\n public syntaxStyleRegister(\n style: SyntaxStyleHandle,\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 = optionalRgbaPtr(fg)\n const bgPtr = optionalRgbaPtr(bg)\n return this.opentui.symbols.syntaxStyleRegister(\n style,\n ptrOrNull(nameBytes),\n nameBytes.byteLength,\n fgPtr,\n bgPtr,\n attributes,\n )\n }\n\n public syntaxStyleResolveByName(style: SyntaxStyleHandle, name: string): number | null {\n const nameBytes = this.encoder.encode(name)\n const id = this.opentui.symbols.syntaxStyleResolveByName(style, ptrOrNull(nameBytes), nameBytes.byteLength)\n return id === 0 ? null : id\n }\n\n public syntaxStyleGetStyleCount(style: SyntaxStyleHandle): number {\n return this.opentui.symbols.syntaxStyleGetStyleCount(style)\n }\n\n public editorViewSetPlaceholderStyledText(\n view: EditorViewHandle,\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, chunksBuffer, nonEmptyChunks.length)\n }\n\n public editorViewSetTabIndicator(view: EditorViewHandle, indicator: number): void {\n this.opentui.symbols.editorViewSetTabIndicator(view, indicator)\n }\n\n public editorViewSetTabIndicatorColor(view: EditorViewHandle, color: RGBA): void {\n this.opentui.symbols.editorViewSetTabIndicatorColor(view, rgbaPtr(color))\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\nlet renderLibResolved = false\n\nexport function setRenderLibPath(libPath: string) {\n if (opentuiLibPath !== libPath) {\n if (renderLibResolved) {\n throw new Error(\"setRenderLibPath() must be called before resolveRenderLib()\")\n }\n if (opentuiLib instanceof FFIRenderLib) {\n opentuiLib.dispose()\n }\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 renderLibResolved = true\n return opentuiLib\n}\n\n// Try eager loading\ntry {\n opentuiLib = new FFIRenderLib(opentuiLibPath)\n} catch (error) {}\n",
14
+ "export type RGBTriplet = readonly [number, number, number]\nexport type ColorIntent = \"rgb\" | \"indexed\" | \"default\"\nexport type ColorInput = string | RGBA\n\nexport const DEFAULT_FOREGROUND_RGB: RGBTriplet = [255, 255, 255]\nexport const DEFAULT_BACKGROUND_RGB: RGBTriplet = [0, 0, 0]\n\nconst INTENT_RGB = 0\nconst INTENT_INDEXED = 1\nconst INTENT_DEFAULT = 2\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}\n\nfunction packMeta(intent: number, slot = 0): number {\n return ((slot & 0xff) | ((intent & 0xff) << 8)) >>> 0\n}\n\nfunction toU8(value: number): number {\n return Math.round(Math.max(0, Math.min(1, Number.isFinite(value) ? value : 0)) * 255)\n}\n\nfunction toByte(value: number): number {\n return Math.round(Math.max(0, Math.min(255, Number.isFinite(value) ? value : 0)))\n}\n\nfunction packRGBA8(r: number, g: number, b: number, a: number, meta: number): Uint16Array {\n return new Uint16Array([\n (toByte(r) & 0xff) | (((meta >>> 0) & 0xff) << 8),\n (toByte(g) & 0xff) | (((meta >>> 8) & 0xff) << 8),\n (toByte(b) & 0xff) | (((meta >>> 16) & 0xff) << 8),\n (toByte(a) & 0xff) | (((meta >>> 24) & 0xff) << 8),\n ])\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 class RGBA {\n buffer: Uint16Array\n\n constructor(buffer: Uint16Array) {\n this.buffer = new Uint16Array(4)\n this.buffer.set(buffer.subarray(0, 4))\n }\n\n static fromArray(array: Uint16Array): RGBA {\n return new RGBA(array)\n }\n\n static fromValues(r: number, g: number, b: number, a: number = 1): RGBA {\n return new RGBA(packRGBA8(toU8(r), toU8(g), toU8(b), toU8(a), packMeta(INTENT_RGB)))\n }\n\n static clone(rgba: RGBA): RGBA {\n return new RGBA(rgba.buffer)\n }\n\n static fromInts(r: number, g: number, b: number, a: number = 255): RGBA {\n return new RGBA(packRGBA8(r, g, b, a, packMeta(INTENT_RGB)))\n }\n\n static fromHex(hex: string): RGBA {\n return hexToRgb(hex)\n }\n\n static fromIndex(index: number, snapshot?: ColorInput): RGBA {\n const normalized = normalizeIndexedColorIndex(index)\n const rgba = snapshot ? parseColor(snapshot) : rgbaForAnsi256Index(normalized)\n const [r, g, b, a] = rgba.toInts()\n return new RGBA(packRGBA8(r, g, b, a, packMeta(INTENT_INDEXED, normalized)))\n }\n\n static defaultForeground(snapshot?: ColorInput): RGBA {\n const rgba = snapshot ? parseColor(snapshot) : RGBA.fromInts(...DEFAULT_FOREGROUND_RGB)\n const [r, g, b, a] = rgba.toInts()\n return new RGBA(packRGBA8(r, g, b, a, packMeta(INTENT_DEFAULT)))\n }\n\n static defaultBackground(snapshot?: ColorInput): RGBA {\n const rgba = snapshot ? parseColor(snapshot) : RGBA.fromInts(...DEFAULT_BACKGROUND_RGB)\n const [r, g, b, a] = rgba.toInts()\n return new RGBA(packRGBA8(r, g, b, a, packMeta(INTENT_DEFAULT)))\n }\n\n toInts(): [number, number, number, number] {\n return [this.buffer[0] & 0xff, this.buffer[1] & 0xff, this.buffer[2] & 0xff, this.buffer[3] & 0xff]\n }\n\n get r(): number {\n return (this.buffer[0] & 0xff) / 255\n }\n\n set r(value: number) {\n this.buffer[0] = (this.buffer[0] & 0xff00) | toU8(value)\n }\n\n get g(): number {\n return (this.buffer[1] & 0xff) / 255\n }\n\n set g(value: number) {\n this.buffer[1] = (this.buffer[1] & 0xff00) | toU8(value)\n }\n\n get b(): number {\n return (this.buffer[2] & 0xff) / 255\n }\n\n set b(value: number) {\n this.buffer[2] = (this.buffer[2] & 0xff00) | toU8(value)\n }\n\n get a(): number {\n return (this.buffer[3] & 0xff) / 255\n }\n\n set a(value: number) {\n this.buffer[3] = (this.buffer[3] & 0xff00) | toU8(value)\n }\n\n get meta(): number {\n return (\n ((this.buffer[0] >>> 8) |\n ((this.buffer[1] >>> 8) << 8) |\n ((this.buffer[2] >>> 8) << 16) |\n ((this.buffer[3] >>> 8) << 24)) >>>\n 0\n )\n }\n\n get intent(): ColorIntent {\n switch ((this.meta >>> 8) & 0xff) {\n case INTENT_INDEXED:\n return \"indexed\"\n case INTENT_DEFAULT:\n return \"default\"\n default:\n return \"rgb\"\n }\n }\n\n get slot(): number {\n return this.meta & 0xff\n }\n\n map<R>(fn: (value: number) => R): [R, R, R, R] {\n return [fn(this.r), fn(this.g), fn(this.b), fn(this.a)]\n }\n\n toString(): string {\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.buffer[0] === other.buffer[0] &&\n this.buffer[1] === other.buffer[1] &&\n this.buffer[2] === other.buffer[2] &&\n this.buffer[3] === other.buffer[3]\n )\n }\n}\n\nexport function normalizeColorValue(value: ColorInput | null | undefined): NormalizedColorValue | null {\n if (value == null) return null\n return { rgba: parseColor(value) }\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)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) : 255\n\n return RGBA.fromInts(r, g, b, a)\n}\n\nexport function rgbToHex(rgb: RGBA): string {\n const [r, g, b, a] = rgb.toInts()\n const components = a === 255 ? [r, g, b] : [r, g, b, a]\n return \"#\" + components.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")\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",
15
+ "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",
16
+ "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 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",
17
+ "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",
18
+ "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\"\nexport type TerminalMultiplexer = \"none\" | \"tmux\" | \"zellij\" | \"screen\" | \"unknown\"\nexport type TerminalCapabilityState = \"unknown\" | \"supported\" | \"unsupported\"\n\nexport interface TerminalInfo {\n name: string\n version: string\n from_xtversion: boolean\n}\n\nexport interface TerminalCapabilities {\n kitty_keyboard: boolean\n kitty_graphics: boolean\n rgb: boolean\n ansi256: boolean\n unicode: WidthMethod\n sgr_pixels: boolean\n color_scheme_updates: boolean\n explicit_width: boolean\n scaled_text: boolean\n sixel: boolean\n focus_tracking: boolean\n sync: boolean\n bracketed_paste: boolean\n hyperlinks: boolean\n osc52: boolean\n osc52_support: TerminalCapabilityState\n notifications: boolean\n explicit_cursor_positioning: boolean\n remote: boolean\n multiplexer: TerminalMultiplexer\n terminal: TerminalInfo\n}\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 capabilities: (capabilities: TerminalCapabilities) => 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: TerminalCapabilities | 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",
19
+ "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",
20
+ "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",
21
+ "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",
22
+ "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",
23
+ "// 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 /* VT100 application keypad (SS3) — sent when terminal enables DECKPAM (ESC =).\n * macOS Terminal.app and other xterm-based terminals emit these when running\n * full-screen apps with the alternate screen. */\n OM: \"return\",\n Oj: \"*\",\n Ok: \"+\",\n Ol: \",\",\n Om: \"-\",\n On: \".\",\n Oo: \"/\",\n Op: \"0\",\n Oq: \"1\",\n Or: \"2\",\n Os: \"3\",\n Ot: \"4\",\n Ou: \"5\",\n Ov: \"6\",\n Ow: \"7\",\n Ox: \"8\",\n Oy: \"9\",\n OX: \"=\",\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\n// Printable characters for VT100 SS3 application-keypad sequences.\n// When the terminal is in application keypad mode (DECKPAM / ESC =), numpad keys\n// send these SS3 codes instead of raw ASCII characters. The keys map to the same\n// printable output as their regular-keyboard equivalents.\nconst ss3NumpadPrintable: Record<string, string> = {\n Op: \"0\",\n Oq: \"1\",\n Or: \"2\",\n Os: \"3\",\n Ot: \"4\",\n Ou: \"5\",\n Ov: \"6\",\n Ow: \"7\",\n Ox: \"8\",\n Oy: \"9\",\n Oj: \"*\",\n Ok: \"+\",\n Ol: \",\",\n Om: \"-\",\n On: \".\",\n Oo: \"/\",\n OX: \"=\",\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\n // SS3 application-keypad sequences have a raw sequence starting with ESC\n // which the text-insertion branch would filter out (charCode 27 < 32).\n // Override sequence with the printable character so text input works.\n const ss3Char = ss3NumpadPrintable[code]\n if (ss3Char !== undefined) {\n key.sequence = ss3Char\n if (key.name >= \"0\" && key.name <= \"9\") {\n key.number = true\n }\n }\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",
24
+ "// 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\nconst printableKeypadText: Record<string, string> = {\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 kpequal: \"=\",\n kpseparator: \",\",\n}\n\nfunction getPrintableKittyKeyText(key: ParsedKey): string | undefined {\n return printableKeypadText[key.name]\n}\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 === \" \" ? \"space\" : 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 if (text === \"\") {\n text = getPrintableKittyKeyText(key) ?? \"\"\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 (codepoint === 32) {\n text = \" \"\n } else 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 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",
25
+ "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",
26
+ "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.js\"\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",
27
+ "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",
28
+ "import { Renderable } from \"../Renderable.js\"\nimport type { ViewportBounds } from \"../types.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 selectedTextsByLine = new Map<number, Array<{ x: number; text: string }>>()\n const selectedRenderables = 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\n for (const renderable of selectedRenderables) {\n const text = renderable.getSelectedText()\n if (!text) continue\n const lines = text.split(\"\\n\")\n for (let index = 0; index < lines.length; index += 1) {\n const y = renderable.y + index\n const line = selectedTextsByLine.get(y) ?? []\n line.push({ x: renderable.x, text: lines[index] })\n selectedTextsByLine.set(y, line)\n }\n }\n\n return [...selectedTextsByLine.entries()]\n .sort(([leftY], [rightY]) => leftY - rightY)\n .map(([, line]) =>\n line\n .sort((left, right) => left.x - right.x)\n .map((segment) => segment.text)\n .join(\"\"),\n )\n .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",
29
+ "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 getSingleton<T>(key: string): T | undefined {\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] as T | undefined\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",
30
+ "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",
31
+ "// 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 | {\n // Startup cursor CPR cancellation can happen before the parser has enough\n // bytes to distinguish a stale reply from ordinary CSI input. This state\n // keeps consuming that one pending reply until it is either discarded as\n // CPR noise or handed back to normal CSI parsing.\n tag: \"csi_parametric_ignored\"\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 canStillBeStartupCursorCprPrefix(state: ParametricCsiLike): boolean {\n return state.segments === 1 && 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 withEscPrefix(bytes: Uint8Array): Uint8Array {\n const prefixed = new Uint8Array(bytes.length + 1)\n prefixed[0] = ESC\n prefixed.set(bytes, 1)\n return prefixed\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 // A startup CPR can be split either after `ESC[` or after the first `;`.\n // Normalize both shapes into one ignore-state so leaving split-footer can\n // cancel the stale reply without also swallowing unrelated CSI sequences.\n private getAbortableStartupCursorCprState(): Extract<ParserState, { tag: \"csi_parametric_ignored\" }> | null {\n if (this.pending.length === 0) {\n return null\n }\n\n switch (this.state.tag) {\n case \"csi\": {\n const bytes = this.pending.view()\n const firstParamStart = this.unitStart + 2\n if (this.cursor < firstParamStart) {\n return null\n }\n\n let firstParamValue: number | null = null\n for (let index = firstParamStart; index < this.cursor; index += 1) {\n const byte = bytes[index]!\n if (!isAsciiDigit(byte)) {\n return null\n }\n\n firstParamValue = (firstParamValue ?? 0) * 10 + (byte - 0x30)\n }\n\n return {\n tag: \"csi_parametric_ignored\",\n semicolons: 0,\n segments: 1,\n hasDigit: this.cursor > firstParamStart,\n firstParamValue,\n }\n }\n\n case \"csi_parametric\":\n case \"csi_parametric_deferred\":\n if (\n !canStillBeStartupCursorCprPrefix(this.state) ||\n (this.protocolContext.explicitWidthCprActive && canStillBeExplicitWidthCpr(this.state))\n ) {\n return null\n }\n\n return {\n tag: \"csi_parametric_ignored\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: this.state.hasDigit,\n firstParamValue: this.state.firstParamValue,\n }\n }\n\n return null\n }\n\n public abortPendingStartupCursorCpr(): void {\n this.ensureAlive()\n\n const nextState = this.getAbortableStartupCursorCprState()\n if (!nextState) {\n return\n }\n\n this.state = nextState\n\n if (this.pendingSinceMs === null) {\n this.markPending()\n }\n\n this.forceFlush = false\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_parametric_ignored\": {\n if (this.cursor >= bytes.length) {\n if (!this.forceFlush) {\n this.markPending()\n return\n }\n\n this.state = { tag: \"ground\" }\n this.consumePrefix(this.cursor)\n continue\n }\n\n if (byte === ESC) {\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_ignored\",\n semicolons: this.state.semicolons,\n segments: this.state.segments,\n hasDigit: true,\n firstParamValue:\n this.state.semicolons === 0\n ? (this.state.firstParamValue ?? 0) * 10 + (byte - 0x30)\n : this.state.firstParamValue,\n }\n continue\n }\n\n if (byte === 0x3b && this.state.semicolons === 0 && this.state.hasDigit) {\n // `CSI 1;...R` is also used by the explicit-width probe, so once we\n // learn that first param we must hand control back to normal CSI\n // parsing instead of discarding the rest of the reply.\n if (this.protocolContext.explicitWidthCprActive && this.state.firstParamValue === 1) {\n this.state = { tag: \"csi\" }\n continue\n }\n\n this.cursor += 1\n this.state = {\n tag: \"csi_parametric_ignored\",\n semicolons: 1,\n segments: 1,\n hasDigit: false,\n firstParamValue: this.state.firstParamValue,\n }\n continue\n }\n\n if (byte === 0x52 && this.state.semicolons === 1 && this.state.hasDigit) {\n const end = this.cursor + 1\n this.state = { tag: \"ground\" }\n this.consumePrefix(end)\n continue\n }\n\n if (this.state.semicolons === 0) {\n this.state = { tag: \"csi\" }\n continue\n }\n\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 `[`. Reconstruct the already-flushed ESC for valid mouse\n // reports so wheel/click input still works; keep malformed or partial\n // bytes opaque so they never leak into text input.\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 const rawBytes = bytes.subarray(this.unitStart, end)\n const prefixed = withEscPrefix(rawBytes)\n if (isMouseSgrSequence(prefixed)) {\n this.emitMouse(prefixed, \"sgr\")\n } else {\n this.emitOpaqueResponse(\"unknown\", rawBytes)\n }\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 `[`. Reconstruct the already-flushed ESC for valid mouse\n // reports so wheel/click input still works; keep malformed or partial\n // bytes opaque so they never leak into text input.\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 const rawBytes = bytes.subarray(this.unitStart, end)\n this.emitMouse(withEscPrefix(rawBytes), \"x10\")\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",
32
+ "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 TextChunkOptions {\n enabled?: boolean\n baseHighlight?: string\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?: TextChunkOptions,\n): TextChunk[] {\n const chunks: TextChunk[] = []\n const defaultStyle = syntaxStyle.getStyle(\"default\")\n const concealEnabled = options?.enabled ?? true\n const baseStyle = options?.baseHighlight ? syntaxStyle.getStyle(options.baseHighlight) : undefined\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 = baseStyle ? { ...baseStyle } : {}\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 const style = baseStyle ?? defaultStyle\n chunks.push({\n __isChunk: true,\n text,\n fg: style?.fg,\n bg: style?.bg,\n attributes: style\n ? createTextAttributes({\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n dim: style.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 const style = baseStyle ?? defaultStyle\n chunks.push({\n __isChunk: true,\n text,\n fg: style?.fg,\n bg: style?.bg,\n attributes: style\n ? createTextAttributes({\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n dim: style.dim,\n })\n : 0,\n })\n }\n\n return chunks\n}\n\nexport interface TreeSitterToStyledTextOptions {\n conceal?: Pick<TextChunkOptions, \"enabled\">\n baseHighlight?: string\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) || options?.baseHighlight) {\n const chunks = treeSitterToTextChunks(content, result.highlights ?? [], syntaxStyle, {\n enabled: options?.conceal?.enabled ?? true,\n baseHighlight: options?.baseHighlight,\n })\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",
33
+ "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 TreeSitterWorkerRequest,\n TreeSitterWorkerResponse,\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\"\nimport {\n type PlatformWorkerHandle,\n type WorkerErrorEvent,\n type WorkerMessageEvent,\n Worker as PlatformWorker,\n} from \"../../platform/worker.js\"\n\nregisterEnvVar({\n name: \"OTUI_TREE_SITTER_WORKER_PATH\",\n description: \"Path to the TreeSitter worker entry script\",\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\ntype TreeSitterWorkerPath = string | URL\ntype TreeSitterWorkerHandle = Pick<PlatformWorkerHandle, \"onerror\" | \"onmessage\" | \"postMessage\" | \"terminate\">\n\ninterface TreeSitterClientInternalOptions {\n autoStartWorker?: boolean\n}\n\ninterface PendingRequest {\n resolve: (response: any) => void\n reject: (error: Error) => void\n}\n\nlet DEFAULT_PARSER_OVERRIDES: FiletypeParserOptions[] = []\n\nexport function addDefaultParsers(parsers: FiletypeParserOptions[]): void {\n for (const parser of parsers) {\n DEFAULT_PARSER_OVERRIDES = [\n ...DEFAULT_PARSER_OVERRIDES.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: TreeSitterWorkerHandle | 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 = new Map<string, PendingRequest>()\n private messageIdCounter: number = 0\n private editQueues: Map<number, ProcessQueue<EditQueueItem>> = new Map()\n private debouncer: DebounceController\n private options: TreeSitterClientOptions\n private destroyCallbacks = new Set<() => void>()\n private lifecycleGeneration = 0\n private rejectInitialization: ((error: Error) => void) | undefined\n private destroyPromise: Promise<void> | undefined\n private workerTerminationFailed = false\n\n constructor(options: TreeSitterClientOptions, internalOptions: TreeSitterClientInternalOptions = {}) {\n super()\n this.options = options\n this.debouncer = createDebounce(\"tree-sitter-client\")\n if (internalOptions.autoStartWorker ?? true) {\n this.startWorker()\n }\n }\n\n public onDestroy(callback: () => void): () => void {\n this.destroyCallbacks.add(callback)\n return () => {\n this.destroyCallbacks.delete(callback)\n }\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 const workerPath = this.resolveWorkerPath()\n\n const worker = new PlatformWorker(workerPath)\n this.worker = worker\n\n worker.onmessage = (event) => {\n if (this.worker !== worker) {\n return\n }\n\n this.handleWorkerMessage(event as WorkerMessageEvent<TreeSitterWorkerResponse>)\n }\n\n worker.onerror = (error: WorkerErrorEvent) => {\n if (this.worker !== worker) {\n return\n }\n\n console.error(\"TreeSitter worker error:\", error.message)\n const workerError = new Error(`Worker error: ${error.message}`, { cause: error.error })\n this.handleWorkerFailure(worker, workerError)\n this.emitError(`Worker error: ${error.message}`)\n }\n }\n\n private sendWorkerMessage(message: TreeSitterWorkerRequest): void {\n if (!this.worker) {\n throw new Error(\"TreeSitter worker is not available\")\n }\n this.worker.postMessage(message)\n }\n\n private rejectPendingRequests(error: Error): void {\n const requests = Array.from(this.messageCallbacks.values())\n this.messageCallbacks.clear()\n for (const request of requests) {\n request.reject(error)\n }\n }\n\n private rejectActiveInitialization(error: Error): void {\n if (this.initializeResolvers) {\n clearTimeout(this.initializeResolvers.timeoutId)\n this.initializeResolvers.reject(error)\n this.initializeResolvers = undefined\n }\n this.rejectInitialization?.(error)\n this.rejectInitialization = undefined\n }\n\n private handleWorkerFailure(worker: TreeSitterWorkerHandle, error: Error): void {\n if (this.worker !== worker) {\n return\n }\n\n worker.onmessage = null\n worker.onerror = null\n this.worker = undefined\n this.lifecycleGeneration++\n this.initialized = false\n this.initializePromise = undefined\n this.rejectActiveInitialization(error)\n this.rejectPendingRequests(error)\n this.editQueues.clear()\n this.buffers.clear()\n this.debouncer.clear()\n\n try {\n void Promise.resolve(worker.terminate()).catch(() => {})\n } catch {\n // The worker has already failed; cleanup is best effort.\n }\n }\n\n // Path resolution stays in the client for now; runtime-specific Worker construction lives in platform/worker.\n private resolveWorkerPath(): TreeSitterWorkerPath {\n if (this.options.workerPath) {\n return this.options.workerPath\n }\n\n if (env.OTUI_TREE_SITTER_WORKER_PATH) {\n return env.OTUI_TREE_SITTER_WORKER_PATH\n }\n\n if (typeof OTUI_TREE_SITTER_WORKER_PATH !== \"undefined\") {\n return OTUI_TREE_SITTER_WORKER_PATH\n }\n\n let workerPath = new URL(\"./parser.worker.js\", import.meta.url).href\n\n if (!existsSync(resolve(import.meta.dirname, \"parser.worker.js\"))) {\n workerPath = new URL(\"./parser.worker.ts\", import.meta.url).href\n }\n\n return workerPath\n }\n\n private async stopWorker(): Promise<void> {\n const worker = this.worker\n if (!worker) {\n return\n }\n\n const onmessage = worker.onmessage\n const onerror = worker.onerror\n worker.onmessage = null\n worker.onerror = null\n this.worker = undefined\n\n try {\n const termination = worker.terminate()\n if (termination && typeof (termination as PromiseLike<number>).then === \"function\") {\n await termination\n }\n } catch (error) {\n if (!this.worker) {\n worker.onmessage = onmessage\n worker.onerror = onerror\n this.worker = worker\n }\n throw error\n }\n }\n\n // NOTE: Unused, but useful for debugging and testing\n private async handleReset() {\n this.buffers.clear()\n await this.stopWorker()\n this.startWorker()\n this.initialized = false\n this.initializePromise = undefined\n this.initializeResolvers = undefined\n return this.initialize()\n }\n\n async initialize(): Promise<void> {\n if (this.destroyPromise) {\n throw new Error(\"Cannot initialize while client is being destroyed\")\n }\n if (this.workerTerminationFailed) {\n throw new Error(\"Cannot initialize after worker termination failed; retry destroy()\")\n }\n\n if (this.initializePromise) {\n return this.initializePromise\n }\n\n if (!this.worker) {\n this.startWorker()\n }\n\n const worker = this.worker!\n const generation = this.lifecycleGeneration\n let rejectCancellation!: (error: Error) => void\n const cancellation = new Promise<never>((_, reject) => {\n rejectCancellation = reject\n })\n const initialization = Promise.race([this.initializeClient(generation, worker), cancellation])\n this.rejectInitialization = rejectCancellation\n this.initializePromise = initialization\n\n void initialization.then(\n () => {\n if (this.initializePromise === initialization) {\n this.rejectInitialization = undefined\n }\n },\n () => {\n if (this.initializePromise === initialization) {\n this.rejectInitialization = undefined\n }\n },\n )\n\n return this.initializePromise\n }\n\n private assertCurrentInitialization(generation: number, worker: TreeSitterWorkerHandle): void {\n if (this.lifecycleGeneration !== generation || this.worker !== worker || this.destroyPromise) {\n throw new Error(\"TreeSitter initialization was invalidated\")\n }\n }\n\n private async initializeClient(generation: number, worker: TreeSitterWorkerHandle): Promise<void> {\n await new Promise<void>((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.sendWorkerMessage({\n type: \"INIT\",\n dataPath: this.options.dataPath,\n })\n })\n\n this.assertCurrentInitialization(generation, worker)\n await this.registerDefaultParsers(generation, worker)\n this.assertCurrentInitialization(generation, worker)\n this.initialized = true\n }\n\n private async registerDefaultParsers(\n generation: number = this.lifecycleGeneration,\n worker: TreeSitterWorkerHandle = this.worker!,\n ): Promise<void> {\n const defaultParsers = await getParsers()\n this.assertCurrentInitialization(generation, worker)\n const overriddenFiletypes = new Set(DEFAULT_PARSER_OVERRIDES.map((parser) => parser.filetype))\n\n for (const parser of [\n ...defaultParsers.filter((parser) => !overriddenFiletypes.has(parser.filetype)),\n ...DEFAULT_PARSER_OVERRIDES,\n ]) {\n worker.postMessage({ type: \"ADD_FILETYPE_PARSER\", filetypeParser: this.resolveFiletypeParser(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 this.sendWorkerMessage({ type: \"ADD_FILETYPE_PARSER\", filetypeParser: this.resolveFiletypeParser(filetypeParser) })\n }\n\n private resolveFiletypeParser(filetypeParser: FiletypeParserOptions): FiletypeParserOptions {\n return {\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 }\n\n public async getPerformance(): Promise<PerformanceStats> {\n const messageId = `performance_${this.messageIdCounter++}`\n return new Promise<PerformanceStats>((resolve, reject) => {\n this.messageCallbacks.set(messageId, { resolve, reject })\n try {\n this.sendWorkerMessage({ type: \"GET_PERFORMANCE\", messageId })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\n }\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, reject) => {\n this.messageCallbacks.set(messageId, { resolve, reject })\n try {\n this.sendWorkerMessage({\n type: \"ONESHOT_HIGHLIGHT\",\n content,\n filetype,\n messageId,\n })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n })\n }\n\n private handleWorkerMessage(event: WorkerMessageEvent<TreeSitterWorkerResponse>) {\n const message = event.data\n\n switch (message.type) {\n case \"HIGHLIGHT_RESPONSE\": {\n const buffer = this.buffers.get(message.bufferId)\n if (!buffer || !buffer.hasParser) {\n return\n }\n\n if (buffer.version !== message.version) {\n this.resetBuffer(message.bufferId, buffer.version, buffer.content)\n return\n }\n\n this.emit(\"highlights:response\", message.bufferId, message.version, message.highlights)\n return\n }\n\n case \"INIT_RESPONSE\": {\n if (!this.initializeResolvers) {\n return\n }\n\n clearTimeout(this.initializeResolvers.timeoutId)\n\n if (message.error) {\n console.error(\"TreeSitter client initialization failed:\", message.error)\n this.initializeResolvers.reject(new Error(message.error))\n } else {\n this.initializeResolvers.resolve()\n }\n\n this.initializeResolvers = undefined\n return\n }\n\n case \"PARSER_INIT_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve({ hasParser: message.hasParser, warning: message.warning, error: message.error })\n }\n return\n }\n\n case \"PRELOAD_PARSER_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve({ hasParser: message.hasParser })\n }\n return\n }\n\n case \"BUFFER_DISPOSED\": {\n const callback = this.messageCallbacks.get(`dispose_${message.bufferId}`)\n if (callback) {\n this.messageCallbacks.delete(`dispose_${message.bufferId}`)\n callback.resolve(true)\n }\n\n this.emit(\"buffer:disposed\", message.bufferId)\n return\n }\n\n case \"PERFORMANCE_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve(message.performance)\n }\n return\n }\n\n case \"ONESHOT_HIGHLIGHT_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve({ highlights: message.highlights, warning: message.warning, error: message.error })\n }\n return\n }\n\n case \"UPDATE_DATA_PATH_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve({ error: message.error })\n }\n return\n }\n\n case \"CLEAR_CACHE_RESPONSE\": {\n const callback = this.messageCallbacks.get(message.messageId)\n if (callback) {\n this.messageCallbacks.delete(message.messageId)\n callback.resolve({ error: message.error })\n }\n return\n }\n\n case \"WARNING\": {\n this.emitWarning(message.warning, message.bufferId)\n return\n }\n\n case \"ERROR\": {\n this.emitError(message.error, message.bufferId)\n return\n }\n\n case \"WORKER_LOG\": {\n this.emit(\"worker:log\", message.logType, message.data.join(\" \"))\n return\n }\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, reject) => {\n this.messageCallbacks.set(messageId, { resolve, reject })\n try {\n this.sendWorkerMessage({\n type: \"PRELOAD_PARSER\",\n filetype,\n messageId,\n })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\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, reject) => {\n this.messageCallbacks.set(messageId, { resolve, reject })\n try {\n this.sendWorkerMessage({\n type: \"INITIALIZE_PARSER\",\n bufferId: id,\n version,\n content,\n filetype,\n messageId,\n })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\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.sendWorkerMessage({\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, reject) => {\n const messageId = `dispose_${bufferId}`\n this.messageCallbacks.set(messageId, { resolve, reject })\n try {\n this.sendWorkerMessage({\n type: \"DISPOSE_BUFFER\",\n bufferId,\n })\n } catch (error) {\n console.error(\"Error disposing buffer\", error)\n this.messageCallbacks.delete(messageId)\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 destroy(): Promise<void> {\n if (this.destroyPromise) {\n return this.destroyPromise\n }\n\n let resolveDestroy!: () => void\n let rejectDestroy!: (error: unknown) => void\n const destroyPromise = new Promise<void>((resolve, reject) => {\n resolveDestroy = resolve\n rejectDestroy = reject\n })\n this.destroyPromise = destroyPromise\n\n const destroyError = new Error(\"Client destroyed during initialization\")\n this.lifecycleGeneration++\n this.initialized = false\n this.initializePromise = undefined\n this.rejectActiveInitialization(destroyError)\n this.rejectPendingRequests(new Error(\"TreeSitter client destroyed\"))\n\n for (const callback of this.destroyCallbacks) {\n try {\n callback()\n } catch (error) {\n console.error(\"TreeSitter client destroy callback failed:\", error)\n }\n }\n this.destroyCallbacks.clear()\n\n clearDebounceScope(\"tree-sitter-client\")\n this.debouncer.clear()\n\n this.editQueues.clear()\n this.buffers.clear()\n\n void this.stopWorker().then(\n () => {\n this.workerTerminationFailed = false\n if (this.destroyPromise === destroyPromise) {\n this.destroyPromise = undefined\n }\n resolveDestroy()\n },\n (error) => {\n this.workerTerminationFailed = true\n if (this.destroyPromise === destroyPromise) {\n this.destroyPromise = undefined\n }\n rejectDestroy(error)\n },\n )\n return destroyPromise\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, {\n resolve: (response: any) => {\n if (response.error) {\n reject(new Error(response.error))\n } else {\n resolve()\n }\n },\n reject,\n })\n try {\n this.sendWorkerMessage({\n type: \"UPDATE_DATA_PATH\",\n dataPath,\n messageId,\n })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\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, {\n resolve: (response: any) => {\n if (response.error) {\n reject(new Error(response.error))\n } else {\n resolve()\n }\n },\n reject,\n })\n try {\n this.sendWorkerMessage({\n type: \"CLEAR_CACHE\",\n messageId,\n })\n } catch (error) {\n this.messageCallbacks.delete(messageId)\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n })\n }\n}\n",
34
+ "/**\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",
35
+ "/**\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",
36
+ "// 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-05-05T07:27:08.000Z\n\nimport type { FiletypeParserOptions } from \"./types.js\"\nimport { resolveBundledFilePath } from \"../../platform/runtime.js\"\n\n// Cached parsers to avoid re-resolving paths on every call\nlet _cachedParsers: Promise<FiletypeParserOptions[]> | undefined\n\nexport function getParsers(): Promise<FiletypeParserOptions[]> {\n if (!_cachedParsers) {\n _cachedParsers = loadParsers()\n }\n return _cachedParsers\n}\n\nasync function loadParsers(): Promise<FiletypeParserOptions[]> {\n const javascript_highlights = await resolveBundledFilePath(\n () => import(\"./assets/javascript/highlights.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/javascript/highlights.scm\",\n import.meta.url,\n )\n const javascript_language = await resolveBundledFilePath(\n () => import(\"./assets/javascript/tree-sitter-javascript.wasm\" as string, { with: { type: \"file\" } }),\n \"./assets/javascript/tree-sitter-javascript.wasm\",\n import.meta.url,\n )\n const typescript_highlights = await resolveBundledFilePath(\n () => import(\"./assets/typescript/highlights.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/typescript/highlights.scm\",\n import.meta.url,\n )\n const typescript_language = await resolveBundledFilePath(\n () => import(\"./assets/typescript/tree-sitter-typescript.wasm\" as string, { with: { type: \"file\" } }),\n \"./assets/typescript/tree-sitter-typescript.wasm\",\n import.meta.url,\n )\n const markdown_highlights = await resolveBundledFilePath(\n () => import(\"./assets/markdown/highlights.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/markdown/highlights.scm\",\n import.meta.url,\n )\n const markdown_language = await resolveBundledFilePath(\n () => import(\"./assets/markdown/tree-sitter-markdown.wasm\" as string, { with: { type: \"file\" } }),\n \"./assets/markdown/tree-sitter-markdown.wasm\",\n import.meta.url,\n )\n const markdown_injections = await resolveBundledFilePath(\n () => import(\"./assets/markdown/injections.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/markdown/injections.scm\",\n import.meta.url,\n )\n const markdown_inline_highlights = await resolveBundledFilePath(\n () => import(\"./assets/markdown_inline/highlights.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/markdown_inline/highlights.scm\",\n import.meta.url,\n )\n const markdown_inline_language = await resolveBundledFilePath(\n () => import(\"./assets/markdown_inline/tree-sitter-markdown_inline.wasm\" as string, { with: { type: \"file\" } }),\n \"./assets/markdown_inline/tree-sitter-markdown_inline.wasm\",\n import.meta.url,\n )\n const zig_highlights = await resolveBundledFilePath(\n () => import(\"./assets/zig/highlights.scm\" as string, { with: { type: \"file\" } }),\n \"./assets/zig/highlights.scm\",\n import.meta.url,\n )\n const zig_language = await resolveBundledFilePath(\n () => import(\"./assets/zig/tree-sitter-zig.wasm\" as string, { with: { type: \"file\" } }),\n \"./assets/zig/tree-sitter-zig.wasm\",\n import.meta.url,\n )\n\n return [\n {\n filetype: \"javascript\",\n aliases: [\"javascriptreact\"],\n queries: {\n highlights: [javascript_highlights],\n },\n wasm: javascript_language,\n },\n {\n filetype: \"typescript\",\n aliases: [\"typescriptreact\"],\n queries: {\n highlights: [typescript_highlights],\n },\n wasm: typescript_language,\n },\n {\n filetype: \"markdown\",\n queries: {\n highlights: [markdown_highlights],\n injections: [markdown_injections],\n },\n wasm: 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: [markdown_inline_highlights],\n },\n wasm: markdown_inline_language,\n },\n {\n filetype: \"zig\",\n queries: {\n highlights: [zig_highlights],\n },\n wasm: zig_language,\n },\n ]\n}\n",
37
+ "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",
38
+ "export const WORKER_UNAVAILABLE = \"OpenTUI tree-sitter workers are not available for this runtime yet.\"\n\nexport interface WorkerMessageEvent<T = unknown> {\n readonly data: T\n}\n\nexport interface WorkerErrorEvent {\n readonly error?: unknown\n readonly message: string\n}\n\nexport type WorkerMessageHandler<T = unknown> = (event: WorkerMessageEvent<T>) => void | Promise<void>\nexport type WorkerErrorHandler = (event: WorkerErrorEvent) => void\n\ntype AnyWorkerMessageHandler = WorkerMessageHandler<any>\n\nexport interface PlatformWorkerOptions {\n name?: string\n}\n\nexport interface PlatformWorkerHandle {\n onmessage: WorkerMessageHandler | null\n onerror: WorkerErrorHandler | null\n postMessage(value: unknown): void\n terminate(): void | Promise<number>\n addEventListener(type: \"message\" | \"error\", listener: WorkerMessageHandler | WorkerErrorHandler): void\n removeEventListener(type: \"message\" | \"error\", listener: WorkerMessageHandler | WorkerErrorHandler): void\n}\n\nexport type PlatformWorkerConstructor = new (\n specifier: string | URL,\n options?: PlatformWorkerOptions,\n) => PlatformWorkerHandle\n\ninterface NodeMessagePort {\n postMessage(value: unknown): void\n on(event: \"message\", listener: (value: unknown) => void): void\n off(event: \"message\", listener: (value: unknown) => void): void\n}\n\ninterface NodeWorkerThread {\n postMessage(value: unknown): void\n on(event: \"message\", listener: (value: unknown) => void): void\n on(event: \"error\", listener: (error: Error) => void): void\n off(event: \"message\", listener: (value: unknown) => void): void\n off(event: \"error\", listener: (error: Error) => void): void\n terminate(): Promise<number>\n}\n\ninterface NodeWorkerThreadsModule {\n Worker: new (\n filename: string,\n options: {\n eval: true\n type: \"module\"\n name?: string\n },\n ) => NodeWorkerThread\n readonly parentPort: NodeMessagePort | null\n readonly isMainThread: boolean\n}\n\ninterface WorkerRuntimeBridge {\n postMessage(value: unknown): void\n setMessageHandler<T>(handler: WorkerMessageHandler<T>): () => void\n}\n\ntype GlobalWithWorker = typeof globalThis & {\n Worker?: PlatformWorkerConstructor\n __opentuiWorkerMessageBridge?: true\n close?: () => void\n postMessage?: (value: unknown) => void\n}\n\ninterface NodePathModule {\n isAbsolute(path: string): boolean\n resolve(...paths: string[]): string\n}\n\ninterface NodeUrlModule {\n pathToFileURL(path: string): URL\n}\n\ninterface ProcessWithBuiltinModule {\n readonly getBuiltinModule?: (id: string) => unknown\n}\n\nconst globalWithWorker = globalThis as GlobalWithWorker\nconst nodeWorkerThreads = getBuiltinModule<NodeWorkerThreadsModule>(\"node:worker_threads\")\nconst runtimeBridge = loadWorkerRuntime(nodeWorkerThreads)\n\nclass UnsupportedWorker implements PlatformWorkerHandle {\n public onmessage: WorkerMessageHandler | null = null\n public onerror: WorkerErrorHandler | null = null\n\n constructor() {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n postMessage(): void {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n terminate(): void {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n addEventListener(): void {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n removeEventListener(): void {\n throw new Error(WORKER_UNAVAILABLE)\n }\n}\n\nexport const Worker: PlatformWorkerConstructor = loadWorkerConstructor()\nexport const isWorkerRuntime = runtimeBridge !== undefined\n\nexport function postWorkerMessage(value: unknown): void {\n if (!runtimeBridge) {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n runtimeBridge.postMessage(value)\n}\n\nexport function setWorkerMessageHandler<T>(handler: WorkerMessageHandler<T>): () => void {\n if (!runtimeBridge) {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n return runtimeBridge.setMessageHandler(handler)\n}\n\nfunction getBuiltinModule<T>(id: string): T | undefined {\n if (typeof process === \"undefined\") {\n return undefined\n }\n\n const loader = (process as typeof process & ProcessWithBuiltinModule).getBuiltinModule\n if (typeof loader !== \"function\") {\n return undefined\n }\n\n try {\n return loader(id) as T\n } catch {\n return undefined\n }\n}\n\nfunction loadWorkerConstructor(): PlatformWorkerConstructor {\n if (typeof globalWithWorker.Worker === \"function\") {\n return globalWithWorker.Worker\n }\n\n if (nodeWorkerThreads) {\n return createNodeWorkerConstructor(nodeWorkerThreads)\n }\n\n return UnsupportedWorker\n}\n\nfunction createNodeWorkerConstructor(node: NodeWorkerThreadsModule): PlatformWorkerConstructor {\n return class NodeWorkerShim implements PlatformWorkerHandle {\n public onmessage: WorkerMessageHandler | null = null\n public onerror: WorkerErrorHandler | null = null\n\n private readonly errorListeners = new Set<WorkerErrorHandler>()\n private readonly messageListeners = new Set<WorkerMessageHandler>()\n private readonly worker: NodeWorkerThread\n private terminationPromise: Promise<number> | undefined\n\n constructor(specifier: string | URL, options: PlatformWorkerOptions = {}) {\n const resolvedSpecifier = resolveWorkerImportSpecifier(specifier)\n\n this.worker = new node.Worker(createWorkerBootstrapSource(resolvedSpecifier), {\n eval: true,\n type: \"module\",\n name: options.name,\n })\n\n this.worker.on(\"message\", this.handleMessage)\n this.worker.on(\"error\", this.handleError)\n }\n\n postMessage(value: unknown): void {\n this.worker.postMessage(value)\n }\n\n terminate(): Promise<number> {\n if (this.terminationPromise) {\n return this.terminationPromise\n }\n\n this.worker.off(\"message\", this.handleMessage)\n this.worker.off(\"error\", this.handleError)\n const termination = this.worker.terminate().catch((error: unknown) => {\n this.terminationPromise = undefined\n this.worker.on(\"message\", this.handleMessage)\n this.worker.on(\"error\", this.handleError)\n throw error\n })\n this.terminationPromise = termination\n return termination\n }\n\n addEventListener(type: \"message\" | \"error\", listener: WorkerMessageHandler | WorkerErrorHandler): void {\n if (type === \"message\") {\n this.messageListeners.add(listener as WorkerMessageHandler)\n return\n }\n\n this.errorListeners.add(listener as WorkerErrorHandler)\n }\n\n removeEventListener(type: \"message\" | \"error\", listener: WorkerMessageHandler | WorkerErrorHandler): void {\n if (type === \"message\") {\n this.messageListeners.delete(listener as WorkerMessageHandler)\n return\n }\n\n this.errorListeners.delete(listener as WorkerErrorHandler)\n }\n\n private readonly handleMessage = (data: unknown): void => {\n const event: WorkerMessageEvent = { data }\n\n this.onmessage?.(event)\n\n for (const listener of this.messageListeners) {\n listener(event)\n }\n }\n\n private readonly handleError = (error: Error): void => {\n const event: WorkerErrorEvent = {\n error,\n message: error.message,\n }\n\n this.onerror?.(event)\n\n for (const listener of this.errorListeners) {\n listener(event)\n }\n }\n }\n}\n\nfunction createWorkerBootstrapSource(specifier: string): string {\n return `\n import { parentPort } from \"node:worker_threads\"\n\n const pendingMessages = []\n let messageHandler = null\n\n globalThis.self ??= globalThis\n globalThis.postMessage ??= (value) => parentPort?.postMessage(value)\n globalThis.__opentuiWorkerMessageBridge = true\n Object.defineProperty(globalThis, \"onmessage\", {\n configurable: true,\n get: () => messageHandler,\n set: (handler) => {\n messageHandler = typeof handler === \"function\" ? handler : null\n if (!messageHandler) return\n\n const messages = pendingMessages.splice(0)\n for (const data of messages) {\n messageHandler({ data })\n }\n },\n })\n parentPort?.on(\"message\", (data) => {\n if (messageHandler) {\n messageHandler({ data })\n } else {\n pendingMessages.push(data)\n }\n })\n\n await import(${JSON.stringify(specifier)})\n `\n}\n\nfunction resolveWorkerImportSpecifier(specifier: string | URL): string {\n if (specifier instanceof URL) {\n return specifier.href\n }\n\n if (isRuntimeSpecifier(specifier)) {\n return specifier\n }\n\n // The Node shim cannot infer the caller module URL for plain strings, so\n // relative override strings resolve from the current working directory.\n // Callers that need module-relative behavior should pass a URL instead.\n const nodePath = getBuiltinModule<NodePathModule>(\"node:path\")\n const nodeUrl = getBuiltinModule<NodeUrlModule>(\"node:url\")\n if (!nodePath || !nodeUrl) {\n throw new Error(WORKER_UNAVAILABLE)\n }\n\n const absolutePath = nodePath.isAbsolute(specifier) ? specifier : nodePath.resolve(specifier)\n\n return nodeUrl.pathToFileURL(absolutePath).href\n}\n\nfunction isRuntimeSpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"data:\") ||\n specifier.startsWith(\"node:\") ||\n specifier.startsWith(\"http:\") ||\n specifier.startsWith(\"https:\")\n )\n}\n\nfunction loadWorkerRuntime(node: NodeWorkerThreadsModule | undefined): WorkerRuntimeBridge | undefined {\n if (node?.parentPort && node.isMainThread === false) {\n if (globalWithWorker.__opentuiWorkerMessageBridge) {\n return createGlobalWorkerRuntimeBridge()\n }\n\n return {\n postMessage(value: unknown): void {\n node.parentPort?.postMessage(value)\n },\n setMessageHandler<T>(handler: WorkerMessageHandler<T>): () => void {\n const listener = (data: unknown): void => {\n void handler({ data: data as T })\n }\n\n node.parentPort?.on(\"message\", listener)\n\n return () => {\n node.parentPort?.off(\"message\", listener)\n }\n },\n }\n }\n\n if (!isGlobalWorkerRuntime()) {\n return undefined\n }\n\n return createGlobalWorkerRuntimeBridge()\n}\n\nfunction createGlobalWorkerRuntimeBridge(): WorkerRuntimeBridge {\n interface HandlerRegistration {\n active: boolean\n fallbackHandler: AnyWorkerMessageHandler | null\n listener: AnyWorkerMessageHandler\n previous?: HandlerRegistration\n }\n\n let currentRegistration: HandlerRegistration | undefined\n\n return {\n postMessage(value: unknown): void {\n globalWithWorker.postMessage?.(value)\n },\n setMessageHandler<T>(handler: WorkerMessageHandler<T>): () => void {\n const previousHandler = getGlobalWorkerMessageHandler()\n if (currentRegistration && previousHandler !== currentRegistration.listener) {\n currentRegistration = undefined\n }\n\n const listener: WorkerMessageHandler<T> = (event): void => {\n const normalizedEvent = normalizeWorkerMessageEvent<T>(event)\n void handler(normalizedEvent)\n }\n const registration: HandlerRegistration = {\n active: true,\n fallbackHandler: currentRegistration ? currentRegistration.fallbackHandler : previousHandler,\n listener,\n previous: currentRegistration,\n }\n\n currentRegistration = registration\n setGlobalWorkerMessageHandler(listener)\n\n return () => {\n registration.active = false\n if (currentRegistration !== registration || getGlobalWorkerMessageHandler() !== listener) {\n return\n }\n\n let previous = registration.previous\n while (previous && !previous.active) {\n previous = previous.previous\n }\n\n currentRegistration = previous\n setGlobalWorkerMessageHandler(previous?.listener ?? registration.fallbackHandler)\n }\n },\n }\n}\n\nfunction isGlobalWorkerRuntime(): boolean {\n if (typeof globalWithWorker.postMessage !== \"function\") {\n return false\n }\n\n return typeof document === \"undefined\" && typeof globalWithWorker.close === \"function\" && \"onmessage\" in globalThis\n}\n\nfunction normalizeWorkerMessageEvent<T>(event: unknown): WorkerMessageEvent<T> {\n if (event && typeof event === \"object\" && \"data\" in event) {\n return event as WorkerMessageEvent<T>\n }\n\n return { data: event as T }\n}\n\nfunction getGlobalWorkerMessageHandler(): AnyWorkerMessageHandler | null {\n return ((globalThis as { onmessage?: unknown }).onmessage as AnyWorkerMessageHandler | null | undefined) ?? null\n}\n\nfunction setGlobalWorkerMessageHandler(handler: AnyWorkerMessageHandler | null): void {\n ;(globalThis as { onmessage?: unknown }).onmessage = handler\n}\n",
39
+ "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",
40
+ "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",
41
+ "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",
42
+ "import { destroySingleton, getSingleton, 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\"\n\nconst TREE_SITTER_CLIENT_KEY = \"tree-sitter-client\"\nconst TREE_SITTER_CLIENT_LISTENER_STATE_KEY = \"tree-sitter-client-listener-state\"\n\ninterface TreeSitterClientListenerState {\n removeListener?: () => void\n}\n\nfunction getTreeSitterClientListenerState(): TreeSitterClientListenerState {\n return singleton(TREE_SITTER_CLIENT_LISTENER_STATE_KEY, () => ({}))\n}\n\nexport function getTreeSitterClient(): TreeSitterClient {\n const existingClient = getSingleton<TreeSitterClient>(TREE_SITTER_CLIENT_KEY)\n if (existingClient) {\n return existingClient\n }\n\n const dataPathsManager = getDataPaths()\n const defaultOptions: TreeSitterClientOptions = {\n dataPath: dataPathsManager.globalDataPath,\n }\n\n return singleton(TREE_SITTER_CLIENT_KEY, () => {\n const client = new TreeSitterClient(defaultOptions)\n const listenerState = getTreeSitterClientListenerState()\n\n const handlePathsChanged = (paths: { globalDataPath: string }) => {\n void client.setDataPath(paths.globalDataPath).catch((error) => {\n console.warn(\"Failed to update tree-sitter data path:\", error)\n })\n }\n\n const removeListener = () => {\n dataPathsManager.off(\"paths:changed\", handlePathsChanged)\n if (listenerState.removeListener === removeListener) {\n listenerState.removeListener = undefined\n }\n if (getSingleton<TreeSitterClient>(TREE_SITTER_CLIENT_KEY) === client) {\n destroySingleton(TREE_SITTER_CLIENT_KEY)\n }\n }\n\n listenerState.removeListener = removeListener\n client.onDestroy(removeListener)\n\n dataPathsManager.on(\"paths:changed\", handlePathsChanged)\n\n return client\n })\n}\n\nexport async function destroyTreeSitterClient(): Promise<void> {\n const client = getSingleton<TreeSitterClient>(TREE_SITTER_CLIENT_KEY)\n if (!client) {\n const listenerState = getSingleton<TreeSitterClientListenerState>(TREE_SITTER_CLIENT_LISTENER_STATE_KEY)\n listenerState?.removeListener?.()\n if (listenerState) {\n listenerState.removeListener = undefined\n }\n return\n }\n\n destroySingleton(TREE_SITTER_CLIENT_KEY)\n await client.destroy()\n}\n",
43
+ "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",
44
+ "import type { EditBuffer } from \"../edit-buffer.js\"\nimport type { EditorView } from \"../editor-view.js\"\nimport { stringWidth } from \"../platform/runtime.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 const deleteOffset = this.editorView.getVisualCursor().offset\n const deleteLength = currentOffset - deleteOffset\n if (deleteLength > 0) {\n this.adjustExtmarksAfterDeletion(deleteOffset, deleteLength)\n }\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 hadSelection = this.editorView.hasSelection()\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 const deleteEndOffset = this.getNextCursorOffset(currentOffset)\n const deleteLength = deleteEndOffset - currentOffset\n\n this.originalDeleteChar()\n\n if (deleteLength > 0) {\n this.adjustExtmarksAfterDeletion(currentOffset, deleteLength)\n }\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 const insertLength = this.editorView.getVisualCursor().offset - currentOffset\n if (insertLength > 0) {\n this.adjustExtmarksAfterInsertion(currentOffset, insertLength)\n }\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 const insertLength = this.editorView.getVisualCursor().offset - currentOffset\n if (insertLength > 0) {\n this.adjustExtmarksAfterInsertion(currentOffset, insertLength)\n }\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 getNextCursorOffset(currentOffset: number): number {\n this.originalMoveCursorRight()\n const nextOffset = this.editorView.getVisualCursor().offset\n this.originalSetCursorByOffset(currentOffset)\n return nextOffset\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 = 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 = 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",
45
+ "import { RGBA, DEFAULT_BACKGROUND_RGB, DEFAULT_FOREGROUND_RGB, ansi256IndexToRgb } from \"./RGBA.js\"\nimport { SystemClock, type Clock, type TimerHandle } from \"./clock.js\"\nimport { env, registerEnvVar } from \"./env.js\"\n\ntype Hex = string | null\n\nconst SYSTEM_CLOCK = new SystemClock()\n\nregisterEnvVar({\n name: \"OTUI_PALETTE_IDLE_TIMEOUT_MS\",\n description: \"Milliseconds of silence after palette queries before using fallback colors.\",\n type: \"number\",\n default: 300,\n})\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\nexport interface TerminalPaletteOptions {\n stdin: NodeJS.ReadStream\n stdout: NodeJS.WriteStream\n writeFn?: WriteFunction\n isLegacyTmux?: boolean\n isTmux?: boolean\n oscSource?: OscSubscriptionSource\n clock?: Clock\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 inTmux: boolean\n private oscSource?: OscSubscriptionSource\n private readonly clock: Clock\n\n constructor(options: TerminalPaletteOptions) {\n const { stdin, stdout, writeFn, isLegacyTmux, isTmux, oscSource, clock } = options\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.inTmux = isTmux ?? this.inLegacyTmux\n this.oscSource = oscSource\n this.clock = clock ?? SYSTEM_CLOCK\n }\n\n private writeOsc(osc: string, wrapForLegacyTmux = false): boolean {\n const data = wrapForLegacyTmux && 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 // Only OSC 4 needs legacy tmux passthrough; tmux routes OSC 4 replies back to the pane.\n this.writeOsc(\"\\x1b]4;0;?\\x07\", true)\n })\n }\n\n private async queryPalette(\n indices: number[],\n timeoutMs = 1200,\n idleTimeoutMs = env.OTUI_PALETTE_IDLE_TIMEOUT_MS,\n ): 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, idleTimeoutMs)\n }\n\n session.setTimer(finish, timeoutMs)\n session.subscribeInput(onData)\n // Only OSC 4 needs legacy tmux passthrough; tmux routes OSC 4 replies back to the pane.\n this.writeOsc(indices.map((i) => `\\x1b]4;${i};?\\x07`).join(\"\"), true)\n idleTimer = session.resetTimer(idleTimer, finish, idleTimeoutMs)\n })\n }\n\n private async querySpecialColors(\n timeoutMs = 1200,\n idleTimeoutMs = env.OTUI_PALETTE_IDLE_TIMEOUT_MS,\n ): 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 // tmux handles plain OSC 10/11/12 only; it has no OSC 13-17/19 handlers or reply routing.\n const queries = this.inTmux ? [10, 11, 12] : [10, 11, 12, 13, 14, 15, 16, 17, 19]\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 if (queries.every((idx) => results[idx] !== null)) {\n finish()\n return\n }\n\n if (!updated) return\n\n idleTimer = session.resetTimer(idleTimer, finish, idleTimeoutMs)\n }\n\n session.setTimer(finish, timeoutMs)\n session.subscribeInput(onData)\n // OSC 10/11/12 are plain tmux handlers. DCS passthrough does not help other special colors.\n this.writeOsc(queries.map((idx) => `\\x1b]${idx};?\\x07`).join(\"\"))\n idleTimer = session.resetTimer(idleTimer, finish, idleTimeoutMs)\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 idleTimeout = env.OTUI_PALETTE_IDLE_TIMEOUT_MS\n const [paletteResults, specialColors] = await Promise.all([\n this.queryPalette(indicesToQuery, timeout, idleTimeout),\n this.querySpecialColors(timeout, idleTimeout),\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(options: TerminalPaletteOptions): TerminalPaletteDetector {\n return new TerminalPalette(options)\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",
46
+ "import { stripANSI } from \"../platform/runtime.js\"\n\nexport 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 stripANSI(text)\n}\n",
47
+ "// OSC 52 clipboard support for terminal applications.\n// Delegates to native Zig implementation for ANSI sequence generation.\n\nimport type { RendererHandle, RenderLib } from \"../zig.js\"\n\nexport enum ClipboardTarget {\n Clipboard = 0,\n Primary = 1,\n Select = 2,\n Secondary = 3,\n}\n\nexport class Clipboard {\n private lib: RenderLib\n private rendererPtr: RendererHandle\n\n constructor(lib: RenderLib, rendererPtr: RendererHandle) {\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 textUtf8 = this.lib.encoder.encode(text)\n return this.lib.copyToClipboardOSC52(this.rendererPtr, target, textUtf8)\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 caps?.osc52_support !== \"unsupported\"\n }\n}\n",
48
+ "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",
49
+ "import { RGBA } from \"./lib/index.js\"\nimport { resolveRenderLib, type OptimizedBufferHandle, type RenderLib } from \"./zig.js\"\nimport { type Pointer, type PointerInput, toArrayBuffer, toPointer, ptr } from \"./platform/ffi.js\"\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: OptimizedBufferHandle\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: Uint16Array\n bg: Uint16Array\n attributes: Uint32Array\n } | null = null\n private _destroyed: boolean = false\n\n get ptr(): OptimizedBufferHandle {\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) {\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 attributesPtr = this.lib.bufferGetAttributesPtr(this.bufferPtr)\n\n this._rawBuffers = {\n char: new Uint32Array(toArrayBuffer(charPtr, 0, size * 4)),\n fg: new Uint16Array(toArrayBuffer(fgPtr, 0, size * 4 * 2)),\n bg: new Uint16Array(toArrayBuffer(bgPtr, 0, size * 4 * 2)),\n attributes: new Uint32Array(toArrayBuffer(attributesPtr, 0, size * 4)),\n }\n }\n\n get buffers(): {\n char: Uint32Array\n fg: Uint16Array\n bg: Uint16Array\n attributes: Uint32Array\n } {\n this.guard()\n this.ensureRawBufferViews()\n return this._rawBuffers!\n }\n\n constructor(\n lib: RenderLib,\n ptr: OptimizedBufferHandle,\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 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.fromArray(fg.slice(i * 4, i * 4 + 4))\n const cellBg = RGBA.fromArray(bg.slice(i * 4, i * 4 + 4))\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.guard()\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 // Cached typed arrays alias native memory and are invalid after destroy.\n this._rawBuffers = null\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: PointerInput,\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 toPointer(pixelDataPtr),\n pixelDataLength,\n format,\n alignedBytesPerRow,\n )\n }\n\n public drawPackedBuffer(\n dataPtr: PointerInput,\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 toPointer(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\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 titleColor?: RGBA\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.titleColor ?? options.borderColor,\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",
50
+ "import type { StyledText } from \"./lib/styled-text.js\"\nimport { RGBA } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type LineInfo, type RenderLib, type TextBufferHandle } from \"./zig.js\"\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: TextBufferHandle\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: TextBufferHandle) {\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 if (!this.lib.textBufferReplaceMemBuffer(this.bufferPtr, this._memId, this._textBytes, false)) {\n this._memId = this.lib.textBufferRegisterMemBuffer(this.bufferPtr, 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(): TextBufferHandle {\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 if (this.lib.textBufferSetSyntaxStyle(this.bufferPtr, style?.ptr ?? null)) {\n this._syntaxStyle = style ?? undefined\n }\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",
51
+ "// src/ffi.ts\nvar FFI_LOAD_ERROR = \"bun-ffi-structs requires Bun or Node.js with node:ffi enabled (--experimental-ffi --allow-ffi).\";\nvar backend = await loadBackend();\nfunction unavailable(cause) {\n throw new Error(FFI_LOAD_ERROR, {\n cause: cause instanceof Error ? cause : undefined\n });\n}\nfunction createUnsupportedBackend(cause) {\n return {\n ptr() {\n return unavailable(cause);\n },\n toArrayBuffer() {\n return unavailable(cause);\n }\n };\n}\nasync function loadBackend() {\n if (typeof process !== \"undefined\" && \"bun\" in process.versions) {\n return createBunBackend(await importModule(\"bun:ffi\"));\n }\n try {\n return createNodeBackend(await importModule(\"node:ffi\"));\n } catch (error) {\n return createUnsupportedBackend(error);\n }\n}\nfunction importModule(specifier) {\n return import(specifier).then((module) => module.default ?? module);\n}\nfunction createBunBackend(bun) {\n return {\n ptr: bun.ptr,\n toArrayBuffer(pointer, offset, length) {\n return bun.toArrayBuffer(toBunPointer(pointer), offset, length);\n }\n };\n}\nfunction createNodeBackend(nodeFfi) {\n return {\n ptr(value) {\n if (ArrayBuffer.isView(value)) {\n return nodeFfi.getRawPointer(value.buffer) + BigInt(value.byteOffset);\n }\n if (value instanceof ArrayBuffer) {\n return nodeFfi.getRawPointer(value);\n }\n throw new TypeError(\"node:ffi ptr() only supports ArrayBuffer and ArrayBufferView values.\");\n },\n toArrayBuffer(pointer, offset, length) {\n return nodeFfi.toArrayBuffer(toBigIntPointer(pointer) + BigInt(offset ?? 0), length, false);\n }\n };\n}\nfunction toBigIntPointer(pointer) {\n return typeof pointer === \"bigint\" ? pointer : BigInt(pointer);\n}\nfunction toBunPointer(pointer) {\n return typeof pointer === \"bigint\" ? Number(pointer) : pointer;\n}\nvar ptr = backend.ptr;\nvar toArrayBuffer = backend.toArrayBuffer;\n\n// src/structs_ffi.ts\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 isBun = typeof process !== \"undefined\" && \"bun\" in process.versions;\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 i64: 8\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 i64: (view, offset) => view.getBigInt64(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 retainPointerTarget(buffer, subBuffer);\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 \"i64\":\n pack = (view, off, val) => view.setBigInt64(off, BigInt(val), true);\n unpack = (view, off) => view.getBigInt64(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 if (pointerSize === 8) {\n const value = view.getBigUint64(off, true);\n return isBun ? Number(value) : value;\n }\n return view.getUint32(off, true);\n };\n break;\n default:\n fatalError(`Unsupported primitive type: ${type}`);\n }\n return { pack, unpack };\n}\nvar { pack: pointerPacker, unpack: pointerUnpacker } = primitivePackers(\"pointer\");\nvar retainedPointerTargets = new WeakMap;\nfunction retainPointerTarget(owner, target) {\n const retained = retainedPointerTargets.get(owner);\n if (retained) {\n retained.push(target);\n } else {\n retainedPointerTargets.set(owner, [target]);\n }\n}\nfunction retainIfPointerTargets(owner, target) {\n if (retainedPointerTargets.has(target)) {\n retainPointerTarget(owner, target);\n }\n}\nfunction isNullPointer(pointer) {\n return pointer == null || pointer === 0 || pointer === 0n;\n}\nfunction toItemCount(length) {\n return typeof length === \"bigint\" ? Number(length) : length;\n}\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 if (typeOrStruct === \"pointer\") {\n pack = (view, off, val) => {\n if (val instanceof ArrayBuffer || ArrayBuffer.isView(val)) {\n if (val.byteLength === 0) {\n pointerPacker(view, off, null);\n return;\n }\n pointerPacker(view, off, ptr(val));\n retainPointerTarget(view.buffer, val);\n return;\n }\n pointerPacker(view, off, val);\n };\n }\n } else if (typeof typeOrStruct === \"string\" && typeOrStruct === \"cstring\") {\n size = pointerSize;\n align = pointerSize;\n pack = (view, off, val) => {\n if (!val) {\n pointerPacker(view, off, null);\n return;\n }\n const bytes = encoder.encode(val + \"\\x00\");\n const bufPtr = ptr(bytes);\n pointerPacker(view, off, bufPtr);\n retainPointerTarget(view.buffer, bytes);\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 if (!val) {\n pointerPacker(view, off, null);\n return;\n }\n const bytes = encoder.encode(val);\n const bufPtr = ptr(bytes);\n pointerPacker(view, off, bufPtr);\n retainPointerTarget(view.buffer, bytes);\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 retainPointerTarget(view.buffer, 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 retainIfPointerTargets(view.buffer, nestedBuf);\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 retainPointerTarget(view.buffer, 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 retainPointerTarget(view.buffer, 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 retainPointerTarget(view.buffer, 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 retainPointerTarget(view.buffer, 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 const relativeOffset = lengthOfField.offset - requester.offset;\n requester.unpack = (view, off) => {\n const ptrAddress = pointerUnpacker(view, off);\n const length = lengthOfField.unpack(view, off + relativeOffset);\n if (isNullPointer(ptrAddress)) {\n return null;\n }\n const byteLength = toItemCount(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 const relativeOffset = lengthOfField.offset - requester.offset;\n requester.unpack = (view, off) => {\n const result = [];\n const length = lengthOfField.unpack(view, off + relativeOffset);\n const itemCount = toItemCount(length);\n const ptrAddress = pointerUnpacker(view, off);\n if (isNullPointer(ptrAddress) && itemCount > 0) {\n throw new Error(`Array field ${requester.name} has null pointer but length ${length}.`);\n }\n if (isNullPointer(ptrAddress) || itemCount === 0) {\n return [];\n }\n const buffer = toArrayBuffer(ptrAddress, 0, itemCount * elemSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < itemCount; i++) {\n result.push(primitiveUnpack(bufferView, i * elemSize));\n }\n return result;\n };\n } else {\n const elemSize = def.type === \"u32\" ? 4 : 8;\n const relativeOffset = lengthOfField.offset - requester.offset;\n requester.unpack = (view, off) => {\n const result = [];\n const length = lengthOfField.unpack(view, off + relativeOffset);\n const itemCount = toItemCount(length);\n const ptrAddress = pointerUnpacker(view, off);\n if (isNullPointer(ptrAddress) && itemCount > 0) {\n throw new Error(`Array field ${requester.name} has null pointer but length ${length}.`);\n }\n if (isNullPointer(ptrAddress) || itemCount === 0) {\n return [];\n }\n const buffer = toArrayBuffer(ptrAddress, 0, itemCount * elemSize);\n const bufferView = new DataView(buffer);\n for (let i = 0;i < itemCount; 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",
52
+ "import { defineStruct, defineEnum } from \"bun-ffi-structs\"\nimport { toArrayBuffer, type Pointer } from \"./platform/ffi.js\"\nimport { RGBA, normalizeColorValue } from \"./lib/RGBA.js\"\n\n// Returns the owning Uint16Array so bun-ffi-structs serializes the address and\n// retains the color buffer with the packed struct (requires bun-ffi-structs >= 0.2.4).\n// Returning a raw pointer here would leave the color memory ownerless.\nconst rgbaPackTransform = (rgba?: RGBA) => rgba?.buffer ?? null\nconst rgbaUnpackTransform = (ptr?: Pointer) =>\n ptr ? RGBA.fromArray(new Uint16Array(toArrayBuffer(ptr, 0, 8))) : undefined\n\ntype StyledChunkInput = {\n text: string\n fg?: RGBA | null\n bg?: RGBA | null\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 [\"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 }\n }\n\n return {\n ...chunk,\n fg: normalizedFg?.rgba ?? null,\n bg: normalizedBg?.rgba ?? null,\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\")\nconst TerminalMultiplexerEnum = defineEnum({ none: 0, tmux: 1, zellij: 2, screen: 3, unknown: 4 }, \"u8\")\nconst Osc52SupportEnum = defineEnum({ unknown: 0, supported: 1, unsupported: 2 }, \"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 [\"notifications\", \"bool_u8\"],\n [\"explicit_cursor_positioning\", \"bool_u8\"],\n [\"remote\", \"bool_u8\"],\n [\"multiplexer\", TerminalMultiplexerEnum],\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 [\"osc52_support\", Osc52SupportEnum],\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 NativeRenderStats = {\n nativeLastFrameTime: number\n nativeAverageFrameTime: number\n nativeFrameCount: number\n cellsUpdated: number\n averageCellsUpdated: number\n nativeRenderTime?: number\n nativeStdoutWriteTime?: number\n}\n\nexport const NativeRenderStatsStruct = defineStruct([\n [\"lastFrameTime\", \"f64\"],\n [\"averageFrameTime\", \"f64\"],\n [\"renderTime\", \"f64\"],\n [\"stdoutWriteTime\", \"f64\"],\n [\"frameCount\", \"u64\"],\n [\"cellsUpdated\", \"u32\"],\n [\"averageCellsUpdated\", \"u32\"],\n [\"renderTimeValid\", \"bool_u8\"],\n [\"stdoutWriteTimeValid\", \"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\nexport type AudioCreateOptions = {\n sampleRate?: number\n playbackChannels?: number\n}\n\nexport type AudioStartOptions = {\n periodSizeInFrames?: number\n periodSizeInMilliseconds?: number\n periods?: number\n performanceProfile?: number\n shareMode?: number\n noPreSilencedOutputBuffer?: boolean\n noClip?: boolean\n noDisableDenormals?: boolean\n noFixedSizedCallback?: boolean\n wasapiNoAutoConvertSrc?: boolean\n wasapiNoDefaultQualitySrc?: boolean\n alsaNoMMap?: boolean\n alsaNoAutoFormat?: boolean\n alsaNoAutoChannels?: boolean\n alsaNoAutoResample?: boolean\n}\n\nexport type AudioVoiceOptions = {\n volume?: number\n pan?: number\n loop?: boolean\n groupId?: number\n}\n\nexport type AudioStats = {\n soundsLoaded: number\n voicesActive: number\n framesMixed: bigint\n lockMisses: number\n lastPeak: number\n lastRms: number\n}\n\nexport const AudioCreateOptionsStruct = defineStruct([\n [\"sampleRate\", \"u32\", { default: 48_000 }],\n [\"playbackChannels\", \"u32\", { default: 2 }],\n])\n\nexport const AudioStartOptionsStruct = defineStruct([\n [\"periodSizeInFrames\", \"u32\", { default: 0 }],\n [\"periodSizeInMilliseconds\", \"u32\", { default: 0 }],\n [\"periods\", \"u32\", { default: 0 }],\n [\"performanceProfile\", \"u8\", { default: 0 }],\n [\"shareMode\", \"u8\", { default: 0 }],\n [\"noPreSilencedOutputBuffer\", \"bool_u8\", { default: false }],\n [\"noClip\", \"bool_u8\", { default: false }],\n [\"noDisableDenormals\", \"bool_u8\", { default: false }],\n [\"noFixedSizedCallback\", \"bool_u8\", { default: false }],\n [\"wasapiNoAutoConvertSrc\", \"bool_u8\", { default: false }],\n [\"wasapiNoDefaultQualitySrc\", \"bool_u8\", { default: false }],\n [\"alsaNoMMap\", \"bool_u8\", { default: false }],\n [\"alsaNoAutoFormat\", \"bool_u8\", { default: false }],\n [\"alsaNoAutoChannels\", \"bool_u8\", { default: false }],\n [\"alsaNoAutoResample\", \"bool_u8\", { default: false }],\n])\n\nexport const AudioVoiceOptionsStruct = defineStruct([\n [\"volume\", \"f32\", { default: 1 }],\n [\"pan\", \"f32\", { default: 0 }],\n [\"loop\", \"bool_u8\", { default: false }],\n [\"groupId\", \"u32\", { default: 0 }],\n])\n\nexport const AudioStatsStruct = defineStruct([\n [\"soundsLoaded\", \"u32\"],\n [\"voicesActive\", \"u32\"],\n [\"framesMixed\", \"u64\"],\n [\"lockMisses\", \"u32\"],\n [\"lastPeak\", \"f32\"],\n [\"lastRms\", \"f32\"],\n])\n",
53
+ "import {\n resolveRenderLib,\n type NativeYogaDirtiedCallback,\n type NativeYogaMeasureCallback,\n type RenderLib,\n} from \"./zig.js\"\nimport type { FFICallbackInstance, Pointer } from \"./platform/ffi.js\"\n\nexport enum Align {\n Auto = 0,\n FlexStart = 1,\n Center = 2,\n FlexEnd = 3,\n Stretch = 4,\n Baseline = 5,\n SpaceBetween = 6,\n SpaceAround = 7,\n SpaceEvenly = 8,\n}\n\nexport enum BoxSizing {\n BorderBox = 0,\n ContentBox = 1,\n}\n\nexport enum Dimension {\n Width = 0,\n Height = 1,\n}\n\nexport enum Direction {\n Inherit = 0,\n LTR = 1,\n RTL = 2,\n}\n\nexport enum Display {\n Flex = 0,\n None = 1,\n Contents = 2,\n}\n\nexport enum Edge {\n Left = 0,\n Top = 1,\n Right = 2,\n Bottom = 3,\n Start = 4,\n End = 5,\n Horizontal = 6,\n Vertical = 7,\n All = 8,\n}\n\nexport enum Errata {\n None = 0,\n StretchFlexBasis = 1,\n AbsolutePositionWithoutInsetsExcludesPadding = 2,\n AbsolutePercentAgainstInnerSize = 4,\n All = 2147483647,\n Classic = 2147483646,\n}\n\nexport enum ExperimentalFeature {\n WebFlexBasis = 0,\n}\n\nexport enum FlexDirection {\n Column = 0,\n ColumnReverse = 1,\n Row = 2,\n RowReverse = 3,\n}\n\nexport enum Gutter {\n Column = 0,\n Row = 1,\n All = 2,\n}\n\nexport enum Justify {\n FlexStart = 0,\n Center = 1,\n FlexEnd = 2,\n SpaceBetween = 3,\n SpaceAround = 4,\n SpaceEvenly = 5,\n}\n\nexport enum LogLevel {\n Error = 0,\n Warn = 1,\n Info = 2,\n Debug = 3,\n Verbose = 4,\n Fatal = 5,\n}\n\nexport enum MeasureMode {\n Undefined = 0,\n Exactly = 1,\n AtMost = 2,\n}\n\nexport enum NodeType {\n Default = 0,\n Text = 1,\n}\n\nexport enum Overflow {\n Visible = 0,\n Hidden = 1,\n Scroll = 2,\n}\n\nexport enum PositionType {\n Static = 0,\n Relative = 1,\n Absolute = 2,\n}\n\nexport enum Unit {\n Undefined = 0,\n Point = 1,\n Percent = 2,\n Auto = 3,\n}\n\nexport enum Wrap {\n NoWrap = 0,\n Wrap = 1,\n WrapReverse = 2,\n}\n\nexport const ALIGN_AUTO = Align.Auto\nexport const ALIGN_FLEX_START = Align.FlexStart\nexport const ALIGN_CENTER = Align.Center\nexport const ALIGN_FLEX_END = Align.FlexEnd\nexport const ALIGN_STRETCH = Align.Stretch\nexport const ALIGN_BASELINE = Align.Baseline\nexport const ALIGN_SPACE_BETWEEN = Align.SpaceBetween\nexport const ALIGN_SPACE_AROUND = Align.SpaceAround\nexport const ALIGN_SPACE_EVENLY = Align.SpaceEvenly\n\nexport const BOX_SIZING_BORDER_BOX = BoxSizing.BorderBox\nexport const BOX_SIZING_CONTENT_BOX = BoxSizing.ContentBox\n\nexport const DIMENSION_WIDTH = Dimension.Width\nexport const DIMENSION_HEIGHT = Dimension.Height\n\nexport const DIRECTION_INHERIT = Direction.Inherit\nexport const DIRECTION_LTR = Direction.LTR\nexport const DIRECTION_RTL = Direction.RTL\n\nexport const DISPLAY_FLEX = Display.Flex\nexport const DISPLAY_NONE = Display.None\nexport const DISPLAY_CONTENTS = Display.Contents\n\nexport const EDGE_LEFT = Edge.Left\nexport const EDGE_TOP = Edge.Top\nexport const EDGE_RIGHT = Edge.Right\nexport const EDGE_BOTTOM = Edge.Bottom\nexport const EDGE_START = Edge.Start\nexport const EDGE_END = Edge.End\nexport const EDGE_HORIZONTAL = Edge.Horizontal\nexport const EDGE_VERTICAL = Edge.Vertical\nexport const EDGE_ALL = Edge.All\n\nexport const ERRATA_NONE = Errata.None\nexport const ERRATA_STRETCH_FLEX_BASIS = Errata.StretchFlexBasis\nexport const ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING =\n Errata.AbsolutePositionWithoutInsetsExcludesPadding\nexport const ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE = Errata.AbsolutePercentAgainstInnerSize\nexport const ERRATA_ALL = Errata.All\nexport const ERRATA_CLASSIC = Errata.Classic\n\nexport const EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS = ExperimentalFeature.WebFlexBasis\n\nexport const FLEX_DIRECTION_COLUMN = FlexDirection.Column\nexport const FLEX_DIRECTION_COLUMN_REVERSE = FlexDirection.ColumnReverse\nexport const FLEX_DIRECTION_ROW = FlexDirection.Row\nexport const FLEX_DIRECTION_ROW_REVERSE = FlexDirection.RowReverse\n\nexport const GUTTER_COLUMN = Gutter.Column\nexport const GUTTER_ROW = Gutter.Row\nexport const GUTTER_ALL = Gutter.All\n\nexport const JUSTIFY_FLEX_START = Justify.FlexStart\nexport const JUSTIFY_CENTER = Justify.Center\nexport const JUSTIFY_FLEX_END = Justify.FlexEnd\nexport const JUSTIFY_SPACE_BETWEEN = Justify.SpaceBetween\nexport const JUSTIFY_SPACE_AROUND = Justify.SpaceAround\nexport const JUSTIFY_SPACE_EVENLY = Justify.SpaceEvenly\n\nexport const LOG_LEVEL_ERROR = LogLevel.Error\nexport const LOG_LEVEL_WARN = LogLevel.Warn\nexport const LOG_LEVEL_INFO = LogLevel.Info\nexport const LOG_LEVEL_DEBUG = LogLevel.Debug\nexport const LOG_LEVEL_VERBOSE = LogLevel.Verbose\nexport const LOG_LEVEL_FATAL = LogLevel.Fatal\n\nexport const MEASURE_MODE_UNDEFINED = MeasureMode.Undefined\nexport const MEASURE_MODE_EXACTLY = MeasureMode.Exactly\nexport const MEASURE_MODE_AT_MOST = MeasureMode.AtMost\n\nexport const NODE_TYPE_DEFAULT = NodeType.Default\nexport const NODE_TYPE_TEXT = NodeType.Text\n\nexport const OVERFLOW_VISIBLE = Overflow.Visible\nexport const OVERFLOW_HIDDEN = Overflow.Hidden\nexport const OVERFLOW_SCROLL = Overflow.Scroll\n\nexport const POSITION_TYPE_STATIC = PositionType.Static\nexport const POSITION_TYPE_RELATIVE = PositionType.Relative\nexport const POSITION_TYPE_ABSOLUTE = PositionType.Absolute\n\nexport const UNIT_UNDEFINED = Unit.Undefined\nexport const UNIT_POINT = Unit.Point\nexport const UNIT_PERCENT = Unit.Percent\nexport const UNIT_AUTO = Unit.Auto\n\nexport const WRAP_NO_WRAP = Wrap.NoWrap\nexport const WRAP_WRAP = Wrap.Wrap\nexport const WRAP_WRAP_REVERSE = Wrap.WrapReverse\n\nexport interface Layout {\n left: number\n right: number\n top: number\n bottom: number\n width: number\n height: number\n}\n\nexport interface Size {\n width: number\n height: number\n}\n\nexport interface Value {\n unit: Unit\n value: number\n}\n\nexport type MeasureFunction = (width: number, widthMode: MeasureMode, height: number, heightMode: MeasureMode) => Size\nexport type DirtiedFunction = (node: Node) => void\n\ntype ValueInput = number | \"auto\" | `${number}%` | Value | undefined\ntype ValueInputNoAuto = number | `${number}%` | Value | undefined\n\nconst YogaEnumKind = {\n Direction: 0,\n FlexDirection: 1,\n JustifyContent: 2,\n AlignContent: 3,\n AlignItems: 4,\n AlignSelf: 5,\n PositionType: 6,\n FlexWrap: 7,\n Overflow: 8,\n Display: 9,\n BoxSizing: 10,\n} as const\n\nconst YogaFloatKind = {\n Flex: 0,\n FlexGrow: 1,\n FlexShrink: 2,\n AspectRatio: 3,\n} as const\n\nconst YogaValueKind = {\n Width: 0,\n Height: 1,\n MinWidth: 2,\n MinHeight: 3,\n MaxWidth: 4,\n MaxHeight: 5,\n FlexBasis: 6,\n Margin: 7,\n Padding: 8,\n Position: 9,\n Gap: 10,\n} as const\n\nconst YogaEdgeLayoutKind = {\n Margin: 0,\n Padding: 1,\n Border: 2,\n} as const\n\nconst UNDEFINED_VALUE: Value = { unit: Unit.Undefined, value: NaN }\n\nconst nodeRegistry = new Map<Pointer, Node>()\n// JS-measured Yoga nodes share one native callback per loaded library. Yoga passes\n// the node pointer back to JS, and these registries route to the per-node handler.\n// This keeps Node.setMeasureFunc()/setDirtiedFunc() while avoiding one JSCallback\n// allocation per measured node.\nconst measureRegistry = new Map<Pointer, MeasureFunction>()\nconst dirtiedRegistry = new Map<Pointer, { node: Node; callback: DirtiedFunction }>()\nlet measureCallback: FFICallbackInstance | null = null\nlet measureCallbackLib: RenderLib | null = null\nlet dirtiedCallback: FFICallbackInstance | null = null\nlet dirtiedCallbackLib: RenderLib | null = null\n\nfunction lib(): RenderLib {\n return resolveRenderLib()\n}\n\nfunction ensureMeasureCallback(): void {\n const renderLib = lib()\n if (measureCallback?.ptr && measureCallbackLib === renderLib) return\n\n const callback: NativeYogaMeasureCallback = (node, width, widthMode, height, heightMode) => {\n const measureFunc = node ? measureRegistry.get(node) : undefined\n const result = measureFunc?.(width, widthMode as MeasureMode, height, heightMode as MeasureMode)\n renderLib.yogaStoreMeasureResult(result?.width ?? NaN, result?.height ?? NaN)\n }\n\n measureCallback = renderLib.createYogaMeasureCallback(callback)\n if (!measureCallback.ptr) {\n measureCallback.close()\n measureCallback = null\n throw new Error(\"Failed to create Yoga measure callback\")\n }\n\n renderLib.yogaSetMeasureCallback(measureCallback.ptr)\n measureCallbackLib = renderLib\n}\n\nfunction ensureDirtiedCallback(): void {\n const renderLib = lib()\n if (dirtiedCallback?.ptr && dirtiedCallbackLib === renderLib) return\n\n const callback: NativeYogaDirtiedCallback = (node) => {\n if (!node) return\n const registration = dirtiedRegistry.get(node)\n if (registration) registration.callback(registration.node)\n }\n\n dirtiedCallback = renderLib.createYogaDirtiedCallback(callback)\n if (!dirtiedCallback.ptr) {\n dirtiedCallback.close()\n dirtiedCallback = null\n throw new Error(\"Failed to create Yoga dirtied callback\")\n }\n\n renderLib.yogaSetDirtiedCallback(dirtiedCallback.ptr)\n dirtiedCallbackLib = renderLib\n}\n\nfunction isValueObject(value: unknown): value is Value {\n return typeof value === \"object\" && value !== null && \"unit\" in value && \"value\" in value\n}\n\nfunction parseValue(value: ValueInput): Value {\n if (isValueObject(value)) {\n return value\n }\n if (value === undefined) {\n return UNDEFINED_VALUE\n }\n if (value === \"auto\") {\n return { unit: Unit.Auto, value: NaN }\n }\n if (typeof value === \"string\") {\n if (!value.endsWith(\"%\")) {\n throw new Error(`Invalid Yoga value: ${value}`)\n }\n const numberValue = Number.parseFloat(value)\n if (Number.isNaN(numberValue)) {\n throw new Error(`Invalid Yoga percentage value: ${value}`)\n }\n return { unit: Unit.Percent, value: numberValue }\n }\n return { unit: Unit.Point, value }\n}\n\nfunction unpackValue(packedValue: number | bigint): Value {\n const packed = typeof packedValue === \"bigint\" ? packedValue : BigInt(packedValue)\n const unit = Number(packed & 0xffffffffn) as Unit\n const valueBits = Number((packed >> 32n) & 0xffffffffn)\n const buffer = new ArrayBuffer(4)\n const view = new DataView(buffer)\n view.setUint32(0, valueBits, true)\n return { unit, value: view.getFloat32(0, true) }\n}\n\nfunction normalizeLayoutInput(value: number | \"auto\" | undefined): number {\n return value === undefined || value === \"auto\" ? NaN : value\n}\n\nexport class Config {\n readonly ptr: Pointer\n private freed = false\n\n private constructor(ptr: Pointer) {\n this.ptr = ptr\n }\n\n static create(): Config {\n return new Config(lib().yogaConfigCreate())\n }\n\n static destroy(config: Config): void {\n config.free()\n }\n\n free(): void {\n if (this.freed) return\n this.freed = true\n lib().yogaConfigFree(this.ptr)\n }\n\n setUseWebDefaults(useWebDefaults: boolean): void {\n if (this.freed) return\n lib().yogaConfigSetUseWebDefaults(this.ptr, useWebDefaults)\n }\n\n useWebDefaults(): boolean {\n if (this.freed) return false\n return lib().yogaConfigGetUseWebDefaults(this.ptr)\n }\n\n setPointScaleFactor(pointScaleFactor: number): void {\n if (this.freed) return\n lib().yogaConfigSetPointScaleFactor(this.ptr, pointScaleFactor)\n }\n\n getPointScaleFactor(): number {\n if (this.freed) return 0\n return lib().yogaConfigGetPointScaleFactor(this.ptr)\n }\n\n setErrata(errata: Errata): void {\n if (this.freed) return\n lib().yogaConfigSetErrata(this.ptr, errata)\n }\n\n getErrata(): Errata {\n if (this.freed) return Errata.None\n return lib().yogaConfigGetErrata(this.ptr) as Errata\n }\n\n setExperimentalFeatureEnabled(feature: ExperimentalFeature, enabled: boolean): void {\n if (this.freed) return\n lib().yogaConfigSetExperimentalFeatureEnabled(this.ptr, feature, enabled)\n }\n\n isExperimentalFeatureEnabled(feature: ExperimentalFeature): boolean {\n if (this.freed) return false\n return lib().yogaConfigIsExperimentalFeatureEnabled(this.ptr, feature)\n }\n}\n\nexport class Node {\n readonly ptr: Pointer\n private freed = false\n\n private constructor(ptr: Pointer) {\n this.ptr = ptr\n nodeRegistry.set(ptr, this)\n }\n\n static create(config?: Config): Node {\n return Node.fromPointer(config ? lib().yogaNodeCreateWithConfig(config.ptr) : lib().yogaNodeCreate())\n }\n\n static createForOpenTUI(): Node {\n return Node.fromPointer(lib().yogaNodeCreateForOpenTUI())\n }\n\n static createDefault(): Node {\n return Node.create()\n }\n\n static createWithConfig(config: Config): Node {\n return Node.create(config)\n }\n\n static destroy(node: Node): void {\n node.free()\n }\n\n private static fromPointer(ptr: Pointer): Node {\n const existing = nodeRegistry.get(ptr)\n if (existing) return existing\n return new Node(ptr)\n }\n\n isFreed(): boolean {\n return this.freed\n }\n\n free(): void {\n if (this.freed) return\n this.unsetMeasureFunc()\n this.unsetDirtiedFunc()\n lib().yogaNodeFree(this.ptr)\n this.markFreed()\n }\n\n freeRecursive(): void {\n if (this.freed) return\n const nodes = this.collectSubtree([])\n for (const node of nodes) {\n node.unregisterCallbacks()\n }\n lib().yogaNodeFreeRecursive(this.ptr)\n for (const node of nodes) {\n node.markFreed()\n }\n }\n\n reset(): void {\n if (this.freed) return\n this.unsetMeasureFunc()\n this.unsetDirtiedFunc()\n lib().yogaNodeReset(this.ptr)\n }\n\n copyStyle(node: Node): void {\n if (this.freed) return\n lib().yogaNodeCopyStyle(this.ptr, node.ptr)\n }\n\n insertChild(child: Node, index: number): void {\n if (this.freed) return\n lib().yogaNodeInsertChild(this.ptr, child.ptr, index)\n }\n\n removeChild(child: Node): void {\n if (this.freed) return\n lib().yogaNodeRemoveChild(this.ptr, child.ptr)\n }\n\n removeAllChildren(): void {\n if (this.freed) return\n lib().yogaNodeRemoveAllChildren(this.ptr)\n }\n\n getChild(index: number): Node | null {\n if (this.freed) return null\n const child = lib().yogaNodeGetChild(this.ptr, index)\n return child ? Node.fromPointer(child) : null\n }\n\n getChildCount(): number {\n if (this.freed) return 0\n return lib().yogaNodeGetChildCount(this.ptr)\n }\n\n getParent(): Node | null {\n if (this.freed) return null\n const parent = lib().yogaNodeGetParent(this.ptr)\n return parent ? Node.fromPointer(parent) : null\n }\n\n calculateLayout(width?: number | \"auto\", height?: number | \"auto\", direction: Direction = Direction.LTR): void {\n if (this.freed) return\n lib().yogaNodeCalculateLayout(this.ptr, normalizeLayoutInput(width), normalizeLayoutInput(height), direction)\n }\n\n hasNewLayout(): boolean {\n if (this.freed) return false\n return lib().yogaNodeGetHasNewLayout(this.ptr)\n }\n\n markLayoutSeen(): void {\n if (this.freed) return\n lib().yogaNodeSetHasNewLayout(this.ptr, false)\n }\n\n markDirty(): void {\n if (this.freed) return\n lib().yogaNodeMarkDirty(this.ptr)\n }\n\n isDirty(): boolean {\n if (this.freed) return true\n return lib().yogaNodeIsDirty(this.ptr)\n }\n\n getComputedLayout(): Layout {\n if (this.freed) return { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0 }\n return lib().yogaNodeGetComputedLayout(this.ptr)\n }\n\n getComputedLeft(): number {\n return this.getComputedLayout().left\n }\n\n getComputedTop(): number {\n return this.getComputedLayout().top\n }\n\n getComputedRight(): number {\n return this.getComputedLayout().right\n }\n\n getComputedBottom(): number {\n return this.getComputedLayout().bottom\n }\n\n getComputedWidth(): number {\n return this.getComputedLayout().width\n }\n\n getComputedHeight(): number {\n return this.getComputedLayout().height\n }\n\n getComputedMargin(edge: Edge): number {\n if (this.freed) return 0\n return lib().yogaNodeLayoutGetEdge(this.ptr, YogaEdgeLayoutKind.Margin, edge)\n }\n\n getComputedPadding(edge: Edge): number {\n if (this.freed) return 0\n return lib().yogaNodeLayoutGetEdge(this.ptr, YogaEdgeLayoutKind.Padding, edge)\n }\n\n getComputedBorder(edge: Edge): number {\n if (this.freed) return 0\n return lib().yogaNodeLayoutGetEdge(this.ptr, YogaEdgeLayoutKind.Border, edge)\n }\n\n setDirection(direction: Direction): void {\n this.setEnum(YogaEnumKind.Direction, direction)\n }\n\n getDirection(): Direction {\n return this.getEnum(YogaEnumKind.Direction, Direction.Inherit) as Direction\n }\n\n setFlexDirection(flexDirection: FlexDirection): void {\n this.setEnum(YogaEnumKind.FlexDirection, flexDirection)\n }\n\n getFlexDirection(): FlexDirection {\n return this.getEnum(YogaEnumKind.FlexDirection, FlexDirection.Column) as FlexDirection\n }\n\n setJustifyContent(justifyContent: Justify): void {\n this.setEnum(YogaEnumKind.JustifyContent, justifyContent)\n }\n\n getJustifyContent(): Justify {\n return this.getEnum(YogaEnumKind.JustifyContent, Justify.FlexStart) as Justify\n }\n\n setAlignContent(alignContent: Align): void {\n this.setEnum(YogaEnumKind.AlignContent, alignContent)\n }\n\n getAlignContent(): Align {\n return this.getEnum(YogaEnumKind.AlignContent, Align.FlexStart) as Align\n }\n\n setAlignItems(alignItems: Align): void {\n this.setEnum(YogaEnumKind.AlignItems, alignItems)\n }\n\n getAlignItems(): Align {\n return this.getEnum(YogaEnumKind.AlignItems, Align.Stretch) as Align\n }\n\n setAlignSelf(alignSelf: Align): void {\n this.setEnum(YogaEnumKind.AlignSelf, alignSelf)\n }\n\n getAlignSelf(): Align {\n return this.getEnum(YogaEnumKind.AlignSelf, Align.Auto) as Align\n }\n\n setPositionType(positionType: PositionType): void {\n this.setEnum(YogaEnumKind.PositionType, positionType)\n }\n\n getPositionType(): PositionType {\n return this.getEnum(YogaEnumKind.PositionType, PositionType.Relative) as PositionType\n }\n\n setFlexWrap(flexWrap: Wrap): void {\n this.setEnum(YogaEnumKind.FlexWrap, flexWrap)\n }\n\n getFlexWrap(): Wrap {\n return this.getEnum(YogaEnumKind.FlexWrap, Wrap.NoWrap) as Wrap\n }\n\n setOverflow(overflow: Overflow): void {\n this.setEnum(YogaEnumKind.Overflow, overflow)\n }\n\n getOverflow(): Overflow {\n return this.getEnum(YogaEnumKind.Overflow, Overflow.Visible) as Overflow\n }\n\n setDisplay(display: Display): void {\n this.setEnum(YogaEnumKind.Display, display)\n }\n\n getDisplay(): Display {\n return this.getEnum(YogaEnumKind.Display, Display.Flex) as Display\n }\n\n setBoxSizing(boxSizing: BoxSizing): void {\n this.setEnum(YogaEnumKind.BoxSizing, boxSizing)\n }\n\n getBoxSizing(): BoxSizing {\n return this.getEnum(YogaEnumKind.BoxSizing, BoxSizing.BorderBox) as BoxSizing\n }\n\n setFlex(flex: number | undefined): void {\n this.setFloat(YogaFloatKind.Flex, flex)\n }\n\n getFlex(): number {\n return this.getFloat(YogaFloatKind.Flex)\n }\n\n setFlexGrow(flexGrow: number | undefined): void {\n this.setFloat(YogaFloatKind.FlexGrow, flexGrow)\n }\n\n getFlexGrow(): number {\n return this.getFloat(YogaFloatKind.FlexGrow)\n }\n\n setFlexShrink(flexShrink: number | undefined): void {\n this.setFloat(YogaFloatKind.FlexShrink, flexShrink)\n }\n\n getFlexShrink(): number {\n return this.getFloat(YogaFloatKind.FlexShrink)\n }\n\n setAspectRatio(aspectRatio: number | undefined): void {\n this.setFloat(YogaFloatKind.AspectRatio, aspectRatio)\n }\n\n getAspectRatio(): number {\n return this.getFloat(YogaFloatKind.AspectRatio)\n }\n\n setFlexBasis(flexBasis: ValueInput): void {\n this.setValue(YogaValueKind.FlexBasis, 0, flexBasis)\n }\n\n setFlexBasisPercent(flexBasis: number | undefined): void {\n this.setValue(\n YogaValueKind.FlexBasis,\n 0,\n flexBasis === undefined ? undefined : { unit: Unit.Percent, value: flexBasis },\n )\n }\n\n setFlexBasisAuto(): void {\n this.setValue(YogaValueKind.FlexBasis, 0, \"auto\")\n }\n\n getFlexBasis(): Value {\n return this.getValue(YogaValueKind.FlexBasis, 0)\n }\n\n setWidth(width: ValueInput): void {\n this.setValue(YogaValueKind.Width, 0, width)\n }\n\n setWidthPercent(width: number | undefined): void {\n this.setValue(YogaValueKind.Width, 0, width === undefined ? undefined : { unit: Unit.Percent, value: width })\n }\n\n setWidthAuto(): void {\n this.setValue(YogaValueKind.Width, 0, \"auto\")\n }\n\n getWidth(): Value {\n return this.getValue(YogaValueKind.Width, 0)\n }\n\n setHeight(height: ValueInput): void {\n this.setValue(YogaValueKind.Height, 0, height)\n }\n\n setHeightPercent(height: number | undefined): void {\n this.setValue(YogaValueKind.Height, 0, height === undefined ? undefined : { unit: Unit.Percent, value: height })\n }\n\n setHeightAuto(): void {\n this.setValue(YogaValueKind.Height, 0, \"auto\")\n }\n\n getHeight(): Value {\n return this.getValue(YogaValueKind.Height, 0)\n }\n\n setMinWidth(minWidth: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.MinWidth, 0, minWidth)\n }\n\n setMinWidthPercent(minWidth: number | undefined): void {\n this.setValue(\n YogaValueKind.MinWidth,\n 0,\n minWidth === undefined ? undefined : { unit: Unit.Percent, value: minWidth },\n )\n }\n\n getMinWidth(): Value {\n return this.getValue(YogaValueKind.MinWidth, 0)\n }\n\n setMinHeight(minHeight: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.MinHeight, 0, minHeight)\n }\n\n setMinHeightPercent(minHeight: number | undefined): void {\n this.setValue(\n YogaValueKind.MinHeight,\n 0,\n minHeight === undefined ? undefined : { unit: Unit.Percent, value: minHeight },\n )\n }\n\n getMinHeight(): Value {\n return this.getValue(YogaValueKind.MinHeight, 0)\n }\n\n setMaxWidth(maxWidth: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.MaxWidth, 0, maxWidth)\n }\n\n setMaxWidthPercent(maxWidth: number | undefined): void {\n this.setValue(\n YogaValueKind.MaxWidth,\n 0,\n maxWidth === undefined ? undefined : { unit: Unit.Percent, value: maxWidth },\n )\n }\n\n getMaxWidth(): Value {\n return this.getValue(YogaValueKind.MaxWidth, 0)\n }\n\n setMaxHeight(maxHeight: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.MaxHeight, 0, maxHeight)\n }\n\n setMaxHeightPercent(maxHeight: number | undefined): void {\n this.setValue(\n YogaValueKind.MaxHeight,\n 0,\n maxHeight === undefined ? undefined : { unit: Unit.Percent, value: maxHeight },\n )\n }\n\n getMaxHeight(): Value {\n return this.getValue(YogaValueKind.MaxHeight, 0)\n }\n\n setMargin(edge: Edge, margin: ValueInput): void {\n this.setValue(YogaValueKind.Margin, edge, margin)\n }\n\n setMarginPercent(edge: Edge, margin: number | undefined): void {\n this.setValue(YogaValueKind.Margin, edge, margin === undefined ? undefined : { unit: Unit.Percent, value: margin })\n }\n\n setMarginAuto(edge: Edge): void {\n this.setValue(YogaValueKind.Margin, edge, \"auto\")\n }\n\n getMargin(edge: Edge): Value {\n return this.getValue(YogaValueKind.Margin, edge)\n }\n\n setPadding(edge: Edge, padding: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.Padding, edge, padding)\n }\n\n setPaddingPercent(edge: Edge, padding: number | undefined): void {\n this.setValue(\n YogaValueKind.Padding,\n edge,\n padding === undefined ? undefined : { unit: Unit.Percent, value: padding },\n )\n }\n\n getPadding(edge: Edge): Value {\n return this.getValue(YogaValueKind.Padding, edge)\n }\n\n setPosition(edge: Edge, position: ValueInput): void {\n this.setValue(YogaValueKind.Position, edge, position)\n }\n\n setPositionPercent(edge: Edge, position: number | undefined): void {\n this.setValue(\n YogaValueKind.Position,\n edge,\n position === undefined ? undefined : { unit: Unit.Percent, value: position },\n )\n }\n\n setPositionAuto(edge: Edge): void {\n this.setValue(YogaValueKind.Position, edge, \"auto\")\n }\n\n getPosition(edge: Edge): Value {\n return this.getValue(YogaValueKind.Position, edge)\n }\n\n setGap(gutter: Gutter, gap: ValueInputNoAuto): void {\n this.setValue(YogaValueKind.Gap, gutter, gap)\n }\n\n setGapPercent(gutter: Gutter, gap: number | undefined): void {\n this.setValue(YogaValueKind.Gap, gutter, gap === undefined ? undefined : { unit: Unit.Percent, value: gap })\n }\n\n getGap(gutter: Gutter): Value {\n return this.getValue(YogaValueKind.Gap, gutter)\n }\n\n setBorder(edge: Edge, border: number | undefined): void {\n if (this.freed) return\n lib().yogaNodeStyleSetBorder(this.ptr, edge, border ?? NaN)\n }\n\n getBorder(edge: Edge): number {\n if (this.freed) return NaN\n return lib().yogaNodeStyleGetBorder(this.ptr, edge)\n }\n\n setIsReferenceBaseline(isReferenceBaseline: boolean): void {\n if (this.freed) return\n lib().yogaNodeSetIsReferenceBaseline(this.ptr, isReferenceBaseline)\n }\n\n isReferenceBaseline(): boolean {\n if (this.freed) return false\n return lib().yogaNodeIsReferenceBaseline(this.ptr)\n }\n\n setAlwaysFormsContainingBlock(alwaysFormsContainingBlock: boolean): void {\n if (this.freed) return\n lib().yogaNodeSetAlwaysFormsContainingBlock(this.ptr, alwaysFormsContainingBlock)\n }\n\n getAlwaysFormsContainingBlock(): boolean {\n if (this.freed) return false\n return lib().yogaNodeGetAlwaysFormsContainingBlock(this.ptr)\n }\n\n // A Yoga node has a single measure slot, shared with native-backed measurement\n // (NativeRenderable). Setting a JS measure func on a node that has a native\n // measure target replaces the native one, and vice versa.\n setMeasureFunc(measureFunc: MeasureFunction | null): void {\n if (this.freed) return\n this.unsetMeasureFunc()\n\n if (!measureFunc) return\n\n ensureMeasureCallback()\n measureRegistry.set(this.ptr, measureFunc)\n lib().yogaNodeSetMeasureFunc(this.ptr, true)\n }\n\n unsetMeasureFunc(): void {\n if (this.freed) return\n lib().yogaNodeUnsetMeasureFunc(this.ptr)\n measureRegistry.delete(this.ptr)\n }\n\n hasMeasureFunc(): boolean {\n if (this.freed) return false\n return lib().yogaNodeHasMeasureFunc(this.ptr)\n }\n\n setDirtiedFunc(dirtiedFunc: DirtiedFunction | null): void {\n if (this.freed) return\n this.unsetDirtiedFunc()\n\n if (!dirtiedFunc) return\n\n ensureDirtiedCallback()\n dirtiedRegistry.set(this.ptr, { node: this, callback: dirtiedFunc })\n lib().yogaNodeSetDirtiedFunc(this.ptr, true)\n }\n\n unsetDirtiedFunc(): void {\n if (this.freed) return\n lib().yogaNodeUnsetDirtiedFunc(this.ptr)\n dirtiedRegistry.delete(this.ptr)\n }\n\n private setEnum(kind: number, value: number): void {\n if (this.freed) return\n lib().yogaNodeStyleSetEnum(this.ptr, kind, value)\n }\n\n private getEnum(kind: number, fallback: number): number {\n if (this.freed) return fallback\n return lib().yogaNodeStyleGetEnum(this.ptr, kind)\n }\n\n private setFloat(kind: number, value: number | undefined): void {\n if (this.freed) return\n lib().yogaNodeStyleSetFloat(this.ptr, kind, value ?? NaN)\n }\n\n private getFloat(kind: number): number {\n if (this.freed) return NaN\n return lib().yogaNodeStyleGetFloat(this.ptr, kind)\n }\n\n private setValue(kind: number, edgeOrGutter: number, valueInput: ValueInput): void {\n if (this.freed) return\n const value = parseValue(valueInput)\n lib().yogaNodeStyleSetValue(this.ptr, kind, edgeOrGutter, value.unit, value.value)\n }\n\n private getValue(kind: number, edgeOrGutter: number): Value {\n if (this.freed) return UNDEFINED_VALUE\n return unpackValue(lib().yogaNodeStyleGetValue(this.ptr, kind, edgeOrGutter))\n }\n\n private collectSubtree(nodes: Node[]): Node[] {\n for (let index = 0; index < this.getChildCount(); index++) {\n this.getChild(index)?.collectSubtree(nodes)\n }\n nodes.push(this)\n return nodes\n }\n\n private unregisterCallbacks(): void {\n measureRegistry.delete(this.ptr)\n dirtiedRegistry.delete(this.ptr)\n }\n\n private markFreed(): void {\n this.unregisterCallbacks()\n this.freed = true\n nodeRegistry.delete(this.ptr)\n }\n}\n\nconst Yoga = {\n Config,\n Node,\n Align,\n BoxSizing,\n Dimension,\n Direction,\n Display,\n Edge,\n Errata,\n ExperimentalFeature,\n FlexDirection,\n Gutter,\n Justify,\n LogLevel,\n MeasureMode,\n NodeType,\n Overflow,\n PositionType,\n Unit,\n Wrap,\n ALIGN_AUTO,\n ALIGN_FLEX_START,\n ALIGN_CENTER,\n ALIGN_FLEX_END,\n ALIGN_STRETCH,\n ALIGN_BASELINE,\n ALIGN_SPACE_BETWEEN,\n ALIGN_SPACE_AROUND,\n ALIGN_SPACE_EVENLY,\n BOX_SIZING_BORDER_BOX,\n BOX_SIZING_CONTENT_BOX,\n DIMENSION_WIDTH,\n DIMENSION_HEIGHT,\n DIRECTION_INHERIT,\n DIRECTION_LTR,\n DIRECTION_RTL,\n DISPLAY_FLEX,\n DISPLAY_NONE,\n DISPLAY_CONTENTS,\n EDGE_LEFT,\n EDGE_TOP,\n EDGE_RIGHT,\n EDGE_BOTTOM,\n EDGE_START,\n EDGE_END,\n EDGE_HORIZONTAL,\n EDGE_VERTICAL,\n EDGE_ALL,\n ERRATA_NONE,\n ERRATA_STRETCH_FLEX_BASIS,\n ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING,\n ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE,\n ERRATA_ALL,\n ERRATA_CLASSIC,\n EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS,\n FLEX_DIRECTION_COLUMN,\n FLEX_DIRECTION_COLUMN_REVERSE,\n FLEX_DIRECTION_ROW,\n FLEX_DIRECTION_ROW_REVERSE,\n GUTTER_COLUMN,\n GUTTER_ROW,\n GUTTER_ALL,\n JUSTIFY_FLEX_START,\n JUSTIFY_CENTER,\n JUSTIFY_FLEX_END,\n JUSTIFY_SPACE_BETWEEN,\n JUSTIFY_SPACE_AROUND,\n JUSTIFY_SPACE_EVENLY,\n LOG_LEVEL_ERROR,\n LOG_LEVEL_WARN,\n LOG_LEVEL_INFO,\n LOG_LEVEL_DEBUG,\n LOG_LEVEL_VERBOSE,\n LOG_LEVEL_FATAL,\n MEASURE_MODE_UNDEFINED,\n MEASURE_MODE_EXACTLY,\n MEASURE_MODE_AT_MOST,\n NODE_TYPE_DEFAULT,\n NODE_TYPE_TEXT,\n OVERFLOW_VISIBLE,\n OVERFLOW_HIDDEN,\n OVERFLOW_SCROLL,\n POSITION_TYPE_STATIC,\n POSITION_TYPE_RELATIVE,\n POSITION_TYPE_ABSOLUTE,\n UNIT_UNDEFINED,\n UNIT_POINT,\n UNIT_PERCENT,\n UNIT_AUTO,\n WRAP_NO_WRAP,\n WRAP_WRAP,\n WRAP_WRAP_REVERSE,\n}\n\nexport default Yoga\n"
54
+ ],
55
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OAAO,UAAU,MAAM;AAAA,IAEtB,OAAO;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFR,0BAAS;AACT;AAwBO,IAAM,UAAU;AAAA,EACrB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AACV;AAyFO,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,2BACX;AACK,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,iBACX;AACK,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,iBAAiB;AAE9B,SAAS,WAAW,CAAC,OAAwB;AAAA,EAC3C,MAAM,IAAI,MAAM,iBAAiB,EAAE,MAAM,CAAC;AAAA;AAI5C,SAAS,wBAAwB,CAAC,OAA6B;AAAA,EAC7D,OAAO;AAAA,IACL,MAAM,GAAG;AAAA,MACP,OAAO,YAAY,KAAK;AAAA;AAAA,IAE1B,GAAG,GAAG;AAAA,MACJ,OAAO,YAAY,KAAK;AAAA;AAAA,IAE1B,QAAQ;AAAA,IACR,aAAa,GAAG;AAAA,MACd,OAAO,YAAY,KAAK;AAAA;AAAA,EAE5B;AAAA;AAGF,IAAM,QACJ,OAAO,YAAY,eACnB,OAAO,QAAQ,aAAa,YAC5B,QAAQ,aAAa,QACrB,OAAO,QAAQ,SAAS,QAAQ;AAElC,IAAM,gBAAgB,eAAc,YAAY,GAAG;AACnD,IAAM,UAAU,YAAY;AAE5B,SAAS,WAAW,GAAe;AAAA,EAGjC,IAAI,OAAO;AAAA,IACT,OAAO,iBAAiB,cAAc,SAAS,CAAkB;AAAA,EACnE;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,cAAc,UAAU;AAAA,IACxC,OAAO,kBAAkB,QAAQ,WAAW,OAAO;AAAA,IACnD,OAAO,OAAO;AAAA,IACd,OAAO,yBAAyB,KAAK;AAAA;AAAA;AAMlC,SAAS,SAAS,CAAC,OAA8B;AAAA,EACtD,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACtC,OAAO,oBAAoB,KAAK;AAAA,EAClC;AAAA,EAEA,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,OAAO,oBAAoB,KAAK;AAAA,EAClC;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,OAAO,CAAC,OAAuB;AAAA,EAC7C,OAAO,QAAQ,IAAI;AAAA;AAKrB,SAAS,mBAAmB,CAAC,SAAyB;AAAA,EACpD,IAAI,UAAU,IAAI;AAAA,IAChB,MAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AAAA,EAEA,IAAI,UAAU,OAAO,OAAO,gBAAgB,GAAG;AAAA,IAC7C,MAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AAAA,EAEA,OAAO,OAAO,OAAO;AAAA;AAGvB,SAAS,mBAAmB,CAAC,SAAyB;AAAA,EACpD,IAAI,UAAU,GAAG;AAAA,IACf,MAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AAAA,EAEA,IAAI,CAAC,OAAO,cAAc,OAAO,GAAG;AAAA,IAClC,MAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AAAA,EAEA,OAAO,OAAO,OAAO;AAAA;AAMvB,SAAS,qBAAqB,CAAC,KAA0B,WAA0D;AAAA,EACjH,IAAI,MAAM,IAAI;AAAA,EACd,IAAI,SAAS;AAAA,EAEb,MAAM,WAAgC;AAAA,QAChC,GAAG,GAAG;AAAA,MACR,OAAO;AAAA;AAAA,QAEL,UAAU,GAAG;AAAA,MACf,OAAO,IAAI;AAAA;AAAA,IAEb,KAAK,GAAG;AAAA,MACN,IAAI,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEA,SAAS;AAAA,MACT,UAAU,OAAO,QAAQ;AAAA,MACzB,IAAI;AAAA,QACF,IAAI,MAAM;AAAA,gBACV;AAAA,QAGA,MAAM;AAAA;AAAA;AAAA,EAGZ;AAAA,EAEA,UAAU,IAAI,QAAQ;AAAA,EAEtB,OAAO;AAAA;AAGT,SAAS,uBAAgE,CACvE,aACsC;AAAA,EAGtC,OAAO,OAAO,YACZ,OAAO,QAAQ,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC,MAAM,uBAAuB,UAAU,CAAC,CAAC,CACpG;AAAA;AAGF,SAAS,sBAAsB,CAAC,YAAyC;AAAA,EACvE,OAAO;AAAA,IACL,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,IACpB,KAAK,WAAW,OAAO,OAAO,YAAY,aAAa,WAAW,GAAG;AAAA,IACrE,YAAY,WAAW;AAAA,EACzB;AAAA;AAIF,SAAS,YAAY,CAAC,SAA8B;AAAA,EAClD,OAAO,OAAO,YAAY,WAAW,oBAAoB,OAAO,IAAI;AAAA;AAI/D,SAAS,gBAAgB,CAAC,KAAgC;AAAA,EAC/D,OAAO;AAAA,IACL,MAAM,CAAC,MAAM,SAAS;AAAA,MACpB,IAAI,SAAS,MAAM;AAAA,QACjB,MAAM,IAAI,MAAM,eAAe;AAAA,MACjC;AAAA,MAEA,MAAM,UAAU,IAAI,OAAO,MAAM,wBAAwB,OAAO,CAAC;AAAA,MACjE,MAAM,YAAY,IAAI;AAAA,MACtB,IAAI,SAAS;AAAA,MAEb,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,cAAc,CAAC,UAAU,YAAY;AAAA,UACnC,IAAI,QAAQ;AAAA,YAGV,MAAM,IAAI,MAAM,cAAc;AAAA,UAChC;AAAA,UAKA,MAAM,MAAM,IAAI,IAAI,WAAW,UAAU,uBAAuB,UAAU,CAAC;AAAA,UAE3E,OAAO,sBAAsB,KAAK,SAAS;AAAA;AAAA,QAE7C,KAAK,GAAG;AAAA,UACN,IAAI,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,UAEA,SAAS;AAAA,UAET,IAAI;AAAA,YAGF,QAAQ,MAAM;AAAA,oBACd;AAAA,YAGA,WAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AAAA,cACrC,SAAS,MAAM;AAAA,YACjB;AAAA;AAAA;AAAA,MAGN;AAAA;AAAA,IAEF,KAAK,IAAI;AAAA,IACT,QAAQ,IAAI;AAAA,IACZ,aAAa,CAAC,SAAS,QAAQ,QAAQ;AAAA,MAGrC,OAAO,IAAI,cAAc,aAAa,OAAO,GAAG,QAAQ,MAAM;AAAA;AAAA,EAElE;AAAA;AAIK,SAAS,iBAAiB,CAAC,SAAqC;AAAA,EACrE,OAAO;AAAA,IACL,MAAM,CAAC,MAAM,SAAS;AAAA,MACpB,QAAQ,KAAK,cAAc,QAAQ,OAAO,kBAAkB,IAAI,GAAG,yBAAyB,OAAO,CAAC;AAAA,MACpG,MAAM,YAAY,IAAI;AAAA,MACtB,IAAI,SAAS;AAAA,MACb,IAAI,gBAAgB;AAAA,MAEpB,OAAO;AAAA,QACL,SAAS,gBAAgB,WAAW,OAAO;AAAA,QAC3C,cAAc,CAAC,UAAU,YAAY;AAAA,UACnC,IAAI,QAAQ;AAAA,YACV,MAAM,IAAI,MAAM,cAAc;AAAA,UAChC;AAAA,UAEA,IAAI,WAAW,YAAY;AAAA,YACzB,MAAM,IAAI,MAAM,wBAAwB;AAAA,UAC1C;AAAA,UAEA,MAAM,kBAAkB,IAAI,iBAAiB,wBAAwB,UAAU,GAAG,QAAQ;AAAA,UAC1F,MAAM,MAA2B;AAAA,YAC/B,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,KAAK,GAAG;AAAA,cACN,IAAI,CAAC,eAAe;AAAA,gBAClB,IAAI,mBAAmB,eAAe;AAAA,cACxC;AAAA;AAAA,UAEJ;AAAA,UAEA,OAAO,sBAAsB,KAAK,SAAS;AAAA;AAAA,QAE7C,KAAK,GAAG;AAAA,UACN,IAAI,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,UAEA,SAAS;AAAA,UAET,IAAI;AAAA,YACF,gBAAgB;AAAA,YAChB,IAAI,MAAM;AAAA,oBACV;AAAA,YACA,WAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AAAA,cACrC,SAAS,MAAM;AAAA,YACjB;AAAA;AAAA;AAAA,MAGN;AAAA;AAAA,IAEF,GAAG,CAAC,OAAO;AAAA,MACT,OAAO,oBAAoB,SAAS,KAAK;AAAA;AAAA,IAE3C,QAAQ,QAAQ;AAAA,IAChB,aAAa,CAAC,SAAS,QAAQ,QAAQ;AAAA,MACrC,OAAO,QAAQ,cAAc,gBAAgB,OAAO,IAAI,oBAAoB,MAAM,GAAG,QAAQ,KAAK;AAAA;AAAA,EAEtG;AAAA;AAGF,SAAS,iBAAiB,CAAC,MAA0C;AAAA,EACnE,OAAO,gBAAgB,MAAM,cAAc,IAAI,IAAI;AAAA;AAGrD,SAAS,wBAAiE,CACxE,aACiC;AAAA,EACjC,OAAO,OAAO,YACZ,OAAO,QAAQ,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC,MAAM,wBAAwB,UAAU,CAAC,CAAC,CACrG;AAAA;AAGF,SAAS,eAAwD,CAC/D,WACA,aAC+C;AAAA,EAC/C,OAAO,OAAO,YACZ,OAAO,QAAQ,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,MAAM,eAAe,IAAI,YAAY,KAAK,CAAC,CAAC,CAC7F;AAAA;AAGF,SAAS,cAAc,CAAC,IAA6B,YAAkD;AAAA,EACrG,MAAM,qBAAqB,WAAW,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,UAC/D,0BAA0B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAC/C;AAAA,EAEA,IAAI,kBAAkB,WAAW,GAAG;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,IAAI,SAAgB;AAAA,IACzB,MAAM,iBAAiB,KAAK,MAAM;AAAA,IAElC,WAAW,SAAS,mBAAmB;AAAA,MACrC,eAAe,SAAS,sBAAsB,eAAe,MAAM;AAAA,IACrE;AAAA,IAEA,OAAO,GAAG,GAAG,cAAc;AAAA;AAAA;AAI/B,SAAS,yBAAyB,CAAC,MAAgC;AAAA,EACjE,OAAO,SAAS,QAAQ,OAAO,SAAS,QAAQ,WAAW,SAAS,QAAQ,YAAY,SAAS,QAAQ;AAAA;AAG3G,SAAS,qBAAqB,CAAC,OAAwD;AAAA,EACrF,IAAI,SAAS,MAAM;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAAA,IAC1D,OAAO,gBAAgB,KAAgB;AAAA,EACzC;AAAA,EAEA,IAAI,YAAY,OAAO,KAAK,GAAG;AAAA,IAC7B,IAAI,EAAE,MAAM,kBAAkB,cAAc;AAAA,MAC1C,MAAM,IAAI,UAAU,cAAc;AAAA,IACpC;AAAA,IAEA,IAAI,MAAM,eAAe,GAAG;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,iBAAiB,aAAa;AAAA,IAChC,IAAI,MAAM,eAAe,GAAG;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,UAAU,qBAAqB;AAAA;AAG3C,SAAS,mBAAmB,CAAC,SAAyB,OAA8B;AAAA,EAClF,IAAI,YAAY,OAAO,KAAK,GAAG;AAAA,IAC7B,IAAI,EAAE,MAAM,kBAAkB,cAAc;AAAA,MAC1C,MAAM,IAAI,UAAU,cAAc;AAAA,IACpC;AAAA,IAEA,OAAO,QAAQ,cAAc,MAAM,MAAM,IAAI,OAAO,MAAM,UAAU;AAAA,EACtE;AAAA,EAEA,IAAI,iBAAiB,aAAa;AAAA,IAChC,OAAO,QAAQ,cAAc,KAAK;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,UAAU,cAAc;AAAA;AAGpC,SAAS,mBAAmB,CAAC,QAAoC;AAAA,EAC/D,IAAI,UAAU,MAAM;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,GAAG;AAAA,IACd,MAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAAA,EAEA,IAAI,CAAC,OAAO,cAAc,MAAM,GAAG;AAAA,IACjC,MAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAAA,EAEA,OAAO,OAAO,MAAM;AAAA;AAGtB,SAAS,uBAAuB,CAAC,YAA0C;AAAA,EACzE,IAAI,WAAW,OAAO,MAAM;AAAA,IAC1B,MAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAAA,EAEA,OAAO;AAAA,IACL,YAAY,WAAW,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,IACjF,QAAQ,cAAc,WAAW,WAAW,QAAQ,MAAM,QAAQ;AAAA,EACpE;AAAA;AAGF,SAAS,aAAa,CAAC,MAAuB,UAA0C;AAAA,EACtF,QAAQ;AAAA,SACD,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,MACX,OAAO;AAAA,SACJ,QAAQ;AAAA,MAaX,IAAI,aAAa,UAAU;AAAA,QACzB,MAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAAA,MAEA,OAAO;AAAA,SACJ,QAAQ;AAAA,SACR,QAAQ;AAAA,MAGX,OAAO;AAAA,SACJ,QAAQ;AAAA,MAGX,MAAM,IAAI,MAAM,sBAAsB;AAAA,SACnC,QAAQ;AAAA,SACR,QAAQ;AAAA,MAEX,MAAM,IAAI,MAAM,qBAAqB;AAAA,SAClC,QAAQ;AAAA,MACX,OAAO;AAAA;AAAA,MAEP,OAAO,uBAAuB,IAAI;AAAA;AAAA;AAIxC,SAAS,sBAAsB,CAAC,MAAoB;AAAA,EAClD,MAAM,IAAI,MAAM,qCAAqC,OAAO,IAAI,GAAG;AAAA;AAGrE,SAAS,eAAe,CAAC,SAA0B;AAAA,EACjD,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,IAAI,UAAU,IAAI;AAAA,MAChB,MAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,OAAO;AAAA;AAG7B,IAAM,SAAS,QAAQ;AACvB,IAAM,MAAM,QAAQ;AACpB,IAAM,SAAS,QAAQ;AACvB,IAAM,gBAAgB,QAAQ;;;AC5oBrC;AACA,6BAAgB;AAChB;AACA,0BAAS;;;ACHT,SAAwB,SAAS,GAAE,YAAY,UAAS,CAAC,GAAG;AAAA,EAE3D,MAAM,KAAK;AAAA,EAGX,MAAM,MAAM,0BAA0B;AAAA,EAGtC,MAAM,MAAM;AAAA,EAEZ,MAAM,UAAU,GAAG,OAAO;AAAA,EAE1B,OAAO,IAAI,OAAO,SAAS,YAAY,YAAY,GAAG;AAAA;;;ACVvD,IAAM,QAAQ,UAAU;AAExB,SAAwB,SAAS,CAAC,QAAQ;AAAA,EACzC,IAAI,OAAO,WAAW,UAAU;AAAA,IAC/B,MAAM,IAAI,UAAU,gCAAgC,OAAO,UAAU;AAAA,EACtE;AAAA,EAKA,OAAO,OAAO,QAAQ,OAAO,EAAE;AAAA;;;ACVhC,SAAS,WAAW,CAAC,GAAG;AAAA,EACvB,OAAO,MAAM,OACT,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,KAAK,OAAQ,KAAK,OAClB,KAAK,OAAQ,KAAK,OAClB,KAAK,OAAQ,KAAK,OAClB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,KAAK,OAAQ,KAAK,OAClB,MAAM,OACN,KAAK,OAAQ,KAAK,OAClB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,KAAK,OAAQ,KAAK,OAClB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,MAAM,OACN,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,MAAM,OACN,MAAM,OACN,KAAK,OAAS,KAAK,OACnB,KAAK,OAAS,KAAK,OACnB,KAAK,OAAS,KAAK,OACnB,KAAK,OAAS,KAAK,OACnB,KAAK,OAAS,KAAK,OACnB,MAAM,QACN,KAAK,QAAS,KAAK,QACnB,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,SACN,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,MAAM,SACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,WACrB,KAAK,WAAY,KAAK;AAAA;AAG3B,SAAS,WAAW,CAAC,GAAG;AAAA,EACvB,OAAO,MAAM,SACT,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK;AAAA;AAGzB,SAAS,MAAM,CAAC,GAAG;AAAA,EAClB,OAAO,KAAK,QAAU,KAAK,QACvB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,KAAK,SAAU,KAAK,SACpB,MAAM,SACN,KAAK,SAAU,KAAK,SACpB,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAU,KAAK,SACpB,KAAK,SAAW,KAAK,SACrB,KAAK,SAAW,KAAK,SACrB,KAAK,SAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,MAAM,UACN,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK,UACrB,KAAK,UAAW,KAAK;AAAA;;;ACxW1B,SAAS,QAAQ,CAAC,WAAW;AAAA,EAC5B,IAAI,CAAC,OAAO,cAAc,SAAS,GAAG;AAAA,IACrC,MAAM,IAAI,UAAU,gCAAgC,OAAO,cAAc;AAAA,EAC1E;AAAA;AASM,SAAS,cAAc,CAAC,aAAY,kBAAkB,UAAS,CAAC,GAAG;AAAA,EACzE,SAAS,SAAS;AAAA,EAElB,IACC,YAAY,SAAS,KAClB,OAAO,SAAS,KACf,mBAAmB,YAAY,SAAS,GAC3C;AAAA,IACD,OAAO;AAAA,EACR;AAAA,EAEA,OAAO;AAAA;;;ACvBR;AAEA,IAAM,YAAY,IAAI,KAAK;AAE3B,IAAM,iCAAiC;AAEvC,SAAwB,WAAW,CAAC,QAAQ,UAAU,CAAC,GAAG;AAAA,EACzD,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AAAA,IACtD,OAAO;AAAA,EACR;AAAA,EAEA;AAAA,IACC,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,MACpB;AAAA,EAEJ,IAAI,CAAC,sBAAsB;AAAA,IAC1B,SAAS,UAAU,MAAM;AAAA,EAC1B;AAAA,EAEA,IAAI,OAAO,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,QAAQ;AAAA,EACZ,MAAM,wBAAwB,EAAC,iBAAiB,CAAC,kBAAiB;AAAA,EAElE,aAAY,SAAS,eAAc,UAAU,QAAQ,MAAM,GAAG;AAAA,IAC7D,MAAM,YAAY,UAAU,YAAY,CAAC;AAAA,IAGzC,IAAI,aAAa,MAAS,aAAa,OAAQ,aAAa,KAAO;AAAA,MAClE;AAAA,IACD;AAAA,IAGA,IACE,aAAa,QAAW,aAAa,QACnC,cAAc,OAChB;AAAA,MACD;AAAA,IACD;AAAA,IAGA,IACE,aAAa,OAAU,aAAa,OACjC,aAAa,QAAW,aAAa,QACrC,aAAa,QAAW,aAAa,QACrC,aAAa,QAAW,aAAa,QACrC,aAAa,SAAW,aAAa,OACxC;AAAA,MACD;AAAA,IACD;AAAA,IAGA,IAAI,aAAa,SAAW,aAAa,OAAS;AAAA,MACjD;AAAA,IACD;AAAA,IAGA,IAAI,aAAa,SAAW,aAAa,OAAS;AAAA,MACjD;AAAA,IACD;AAAA,IAGA,IAAI,+BAA+B,KAAK,SAAS,GAAG;AAAA,MACnD;AAAA,IACD;AAAA,IAGA,IAAI,2BAAW,EAAE,KAAK,SAAS,GAAG;AAAA,MACjC,SAAS;AAAA,MACT;AAAA,IACD;AAAA,IAEA,SAAS,eAAe,WAAW,qBAAqB;AAAA,EACzD;AAAA,EAEA,OAAO;AAAA;;;ALpDR,IAAM,eAAe,IAAI;AACzB,IAAM,MAAO,WAA6B;AAEnC,IAAM,QAAoD,KAAK,SAAS;AACxE,IAAM,eAAwC,KAAK,eAAe;AAClE,IAAM,YAAsC,KAAK,aAAa;AAC9D,IAAM,YAIU,KAAK,SAAS;AAGrC,eAAsB,sBAAsB,CAC1C,iBACA,cACA,SACiB;AAAA,EACjB,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,OAAO,wBAAwB,cAAc,OAAO;AAAA,IAC1D,IAAI,WAAW,IAAI,GAAG;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,IAEA,OAAQ,MAAM,oBAAoB,iBAAiB,OAAO,KAAM;AAAA,EAClE;AAAA,EAEA,OAAO,yBAAyB,MAAM,gBAAgB,GAAG,SAAS,OAAO;AAAA;AAG3E,SAAS,uBAAuB,CAAC,cAAgC,SAAyB;AAAA,EACxF,MAAM,OAAO,OAAO,iBAAiB,aAAa,aAAa,IAAI;AAAA,EACnE,OAAO,eAAc,gBAAgB,MAAM,OAAO,IAAI,IAAI,MAAM,OAAO,CAAC;AAAA;AAG1E,SAAS,uBAAuB,CAAC,YAAoB,SAAyB;AAAA,EAC5E,IAAI,WAAW,WAAW,OAAO,GAAG;AAAA,IAClC,OAAO,eAAc,UAAU;AAAA,EACjC;AAAA,EAEA,IAAI,WAAW,UAAU,GAAG;AAAA,IAC1B,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,QAAQ,eAAc,OAAO,CAAC,GAAG,UAAU;AAAA;AAG5D,eAAe,mBAAmB,CAChC,iBACA,SAC6B;AAAA,EAC7B,MAAM,YAAY,8BAA8B,eAAe;AAAA,EAC/D,IAAI,CAAC,WAAW;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,YAAY,IAAI,IAAI,WAAW,OAAO;AAAA,IAC5C,MAAM,SAAU,MAAa,iBAAU;AAAA,IACvC,OAAO,wBAAwB,OAAO,SAAS,UAAU,IAAI;AAAA,IAC7D,MAAM;AAAA,IACN;AAAA;AAAA;AAIJ,SAAS,6BAA6B,CAAC,iBAAsE;AAAA,EAC3G,MAAM,QAAQ,OAAO,eAAe,EAAE,MAAM,iCAAiC;AAAA,EAC7E,OAAO,QAAQ;AAAA;AAGjB,SAAS,aAAa,CAAC,UAAwC;AAAA,EAC7D,MAAM,KAAK,oBAAoB,OAAO,SAAS,QAAQ,IAAI,KAAK,IAAI,IAAI;AAAA,EACxE,OAAO,IAAI,QAAQ,CAAC,aAAY,WAAW,UAAS,EAAE,CAAC;AAAA;AAGzD,eAAe,iBAAiB,CAC9B,aACA,MACA,SACiB;AAAA,EACjB,MAAM,kBAAkB,uBAAuB,MAAM,eAAc,WAAW,IAAI;AAAA,EAElF,IAAI,SAAS,YAAY;AAAA,IACvB,MAAM,MAAM,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,QACJ,OAAO,SAAS,WAAW,aAAa,OAAO,IAAI,IAAI,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,EAErH,MAAM,cAAc,iBAAiB,OAAO,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA,EAEnE,OAAO,MAAM;AAAA;;;AM7Gf,uBAAS;AACT,yBAAS;;;ACPF,IAAM,yBAAqC,CAAC,KAAK,KAAK,GAAG;AACzD,IAAM,yBAAqC,CAAC,GAAG,GAAG,CAAC;AAE1D,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAEvB,IAAM,aAAoC;AAAA,EACxC,CAAC,GAAM,GAAM,CAAI;AAAA,EACjB,CAAC,KAAM,GAAM,CAAI;AAAA,EACjB,CAAC,GAAM,KAAM,CAAI;AAAA,EACjB,CAAC,KAAM,KAAM,CAAI;AAAA,EACjB,CAAC,GAAM,GAAM,GAAI;AAAA,EACjB,CAAC,KAAM,GAAM,GAAI;AAAA,EACjB,CAAC,GAAM,KAAM,GAAI;AAAA,EACjB,CAAC,KAAM,KAAM,GAAI;AAAA,EACjB,CAAC,KAAM,KAAM,GAAI;AAAA,EACjB,CAAC,KAAM,GAAM,CAAI;AAAA,EACjB,CAAC,GAAM,KAAM,CAAI;AAAA,EACjB,CAAC,KAAM,KAAM,CAAI;AAAA,EACjB,CAAC,GAAM,GAAM,GAAI;AAAA,EACjB,CAAC,KAAM,GAAM,GAAI;AAAA,EACjB,CAAC,GAAM,KAAM,GAAI;AAAA,EACjB,CAAC,KAAM,KAAM,GAAI;AACnB;AAEA,IAAM,uBAAuB,CAAC,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG;AAMvD,SAAS,QAAQ,CAAC,QAAgB,OAAO,GAAW;AAAA,EAClD,QAAS,OAAO,OAAU,SAAS,QAAS,OAAQ;AAAA;AAGtD,SAAS,IAAI,CAAC,OAAuB;AAAA,EACnC,OAAO,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,SAAS,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,GAAG;AAAA;AAGtF,SAAS,MAAM,CAAC,OAAuB;AAAA,EACrC,OAAO,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;AAAA;AAGlF,SAAS,SAAS,CAAC,GAAW,GAAW,GAAW,GAAW,MAA2B;AAAA,EACxF,OAAO,IAAI,YAAY;AAAA,IACpB,OAAO,CAAC,IAAI,OAAW,SAAS,IAAK,QAAS;AAAA,IAC9C,OAAO,CAAC,IAAI,OAAW,SAAS,IAAK,QAAS;AAAA,IAC9C,OAAO,CAAC,IAAI,OAAW,SAAS,KAAM,QAAS;AAAA,IAC/C,OAAO,CAAC,IAAI,OAAW,SAAS,KAAM,QAAS;AAAA,EAClD,CAAC;AAAA;AAGH,SAAS,mBAAmB,CAAC,OAAqB;AAAA,EAChD,OAAO,GAAG,GAAG,KAAK,kBAAkB,KAAK;AAAA,EACzC,OAAO,KAAK,SAAS,GAAG,GAAG,CAAC;AAAA;AAGvB,SAAS,0BAA0B,CAAC,OAAuB;AAAA,EAChE,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,KAAK;AAAA,IACxD,MAAM,IAAI,WAAW,6DAA6D,OAAO;AAAA,EAC3F;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,iBAAiB,CAAC,OAA2B;AAAA,EAC3D,MAAM,kBAAkB,2BAA2B,KAAK;AAAA,EAExD,IAAI,kBAAkB,WAAW,QAAQ;AAAA,IACvC,OAAO,WAAW;AAAA,EACpB;AAAA,EAEA,IAAI,kBAAkB,KAAK;AAAA,IACzB,MAAM,YAAY,kBAAkB;AAAA,IACpC,MAAM,IAAI,KAAK,MAAM,YAAY,EAAE;AAAA,IACnC,MAAM,IAAI,KAAK,MAAM,YAAY,CAAC,IAAI;AAAA,IACtC,MAAM,IAAI,YAAY;AAAA,IACtB,OAAO,CAAC,qBAAqB,IAAI,qBAAqB,IAAI,qBAAqB,EAAE;AAAA,EACnF;AAAA,EAEA,MAAM,QAAQ,KAAK,kBAAkB,OAAO;AAAA,EAC5C,OAAO,CAAC,OAAO,OAAO,KAAK;AAAA;AAAA;AAGtB,MAAM,KAAK;AAAA,EAChB;AAAA,EAEA,WAAW,CAAC,QAAqB;AAAA,IAC/B,KAAK,SAAS,IAAI,YAAY,CAAC;AAAA,IAC/B,KAAK,OAAO,IAAI,OAAO,SAAS,GAAG,CAAC,CAAC;AAAA;AAAA,SAGhC,SAAS,CAAC,OAA0B;AAAA,IACzC,OAAO,IAAI,KAAK,KAAK;AAAA;AAAA,SAGhB,UAAU,CAAC,GAAW,GAAW,GAAW,IAAY,GAAS;AAAA,IACtE,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;AAAA;AAAA,SAG9E,KAAK,CAAC,MAAkB;AAAA,IAC7B,OAAO,IAAI,KAAK,KAAK,MAAM;AAAA;AAAA,SAGtB,QAAQ,CAAC,GAAW,GAAW,GAAW,IAAY,KAAW;AAAA,IACtE,OAAO,IAAI,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,SAAS,UAAU,CAAC,CAAC;AAAA;AAAA,SAGtD,OAAO,CAAC,KAAmB;AAAA,IAChC,OAAO,SAAS,GAAG;AAAA;AAAA,SAGd,SAAS,CAAC,OAAe,UAA6B;AAAA,IAC3D,MAAM,aAAa,2BAA2B,KAAK;AAAA,IACnD,MAAM,OAAO,WAAW,WAAW,QAAQ,IAAI,oBAAoB,UAAU;AAAA,IAC7E,OAAO,GAAG,GAAG,GAAG,KAAK,KAAK,OAAO;AAAA,IACjC,OAAO,IAAI,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,SAAS,gBAAgB,UAAU,CAAC,CAAC;AAAA;AAAA,SAGtE,iBAAiB,CAAC,UAA6B;AAAA,IACpD,MAAM,OAAO,WAAW,WAAW,QAAQ,IAAI,KAAK,SAAS,GAAG,sBAAsB;AAAA,IACtF,OAAO,GAAG,GAAG,GAAG,KAAK,KAAK,OAAO;AAAA,IACjC,OAAO,IAAI,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,SAAS,cAAc,CAAC,CAAC;AAAA;AAAA,SAG1D,iBAAiB,CAAC,UAA6B;AAAA,IACpD,MAAM,OAAO,WAAW,WAAW,QAAQ,IAAI,KAAK,SAAS,GAAG,sBAAsB;AAAA,IACtF,OAAO,GAAG,GAAG,GAAG,KAAK,KAAK,OAAO;AAAA,IACjC,OAAO,IAAI,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,SAAS,cAAc,CAAC,CAAC;AAAA;AAAA,EAGjE,MAAM,GAAqC;AAAA,IACzC,OAAO,CAAC,KAAK,OAAO,KAAK,KAAM,KAAK,OAAO,KAAK,KAAM,KAAK,OAAO,KAAK,KAAM,KAAK,OAAO,KAAK,GAAI;AAAA;AAAA,MAGhG,CAAC,GAAW;AAAA,IACd,QAAQ,KAAK,OAAO,KAAK,OAAQ;AAAA;AAAA,MAG/B,CAAC,CAAC,OAAe;AAAA,IACnB,KAAK,OAAO,KAAM,KAAK,OAAO,KAAK,QAAU,KAAK,KAAK;AAAA;AAAA,MAGrD,CAAC,GAAW;AAAA,IACd,QAAQ,KAAK,OAAO,KAAK,OAAQ;AAAA;AAAA,MAG/B,CAAC,CAAC,OAAe;AAAA,IACnB,KAAK,OAAO,KAAM,KAAK,OAAO,KAAK,QAAU,KAAK,KAAK;AAAA;AAAA,MAGrD,CAAC,GAAW;AAAA,IACd,QAAQ,KAAK,OAAO,KAAK,OAAQ;AAAA;AAAA,MAG/B,CAAC,CAAC,OAAe;AAAA,IACnB,KAAK,OAAO,KAAM,KAAK,OAAO,KAAK,QAAU,KAAK,KAAK;AAAA;AAAA,MAGrD,CAAC,GAAW;AAAA,IACd,QAAQ,KAAK,OAAO,KAAK,OAAQ;AAAA;AAAA,MAG/B,CAAC,CAAC,OAAe;AAAA,IACnB,KAAK,OAAO,KAAM,KAAK,OAAO,KAAK,QAAU,KAAK,KAAK;AAAA;AAAA,MAGrD,IAAI,GAAW;AAAA,IACjB,QACI,KAAK,OAAO,OAAO,IACjB,KAAK,OAAO,OAAO,KAAM,IACzB,KAAK,OAAO,OAAO,KAAM,KACzB,KAAK,OAAO,OAAO,KAAM,QAC7B;AAAA;AAAA,MAIA,MAAM,GAAgB;AAAA,IACxB,QAAS,KAAK,SAAS,IAAK;AAAA,WACrB;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA;AAAA,QAEP,OAAO;AAAA;AAAA;AAAA,MAIT,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,OAAO;AAAA;AAAA,EAGrB,GAAM,CAAC,IAAwC;AAAA,IAC7C,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AAAA;AAAA,EAGxD,QAAQ,GAAW;AAAA,IACjB,OAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC;AAAA;AAAA,EAGnG,MAAM,CAAC,OAAuB;AAAA,IAC5B,IAAI,CAAC;AAAA,MAAO,OAAO;AAAA,IACnB,OACE,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO;AAAA;AAGtC;AAEO,SAAS,mBAAmB,CAAC,OAAmE;AAAA,EACrG,IAAI,SAAS;AAAA,IAAM,OAAO;AAAA,EAC1B,OAAO,EAAE,MAAM,WAAW,KAAK,EAAE;AAAA;AAG5B,SAAS,QAAQ,CAAC,KAAmB;AAAA,EAC1C,MAAM,IAAI,QAAQ,MAAM,EAAE;AAAA,EAE1B,IAAI,IAAI,WAAW,GAAG;AAAA,IACpB,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,EACzD,EAAO,SAAI,IAAI,WAAW,GAAG;AAAA,IAC3B,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,EAC3E;AAAA,EAEA,IAAI,CAAC,mBAAmB,KAAK,GAAG,KAAK,CAAC,mBAAmB,KAAK,GAAG,GAAG;AAAA,IAClE,QAAQ,KAAK,sBAAsB,4BAA4B;AAAA,IAC/D,OAAO,KAAK,WAAW,GAAG,GAAG,GAAG,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,EAC1C,MAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,EAC1C,MAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,EAC1C,MAAM,IAAI,IAAI,WAAW,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI;AAAA,EAEjE,OAAO,KAAK,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA;AAG1B,SAAS,QAAQ,CAAC,KAAmB;AAAA,EAC1C,OAAO,GAAG,GAAG,GAAG,KAAK,IAAI,OAAO;AAAA,EAChC,MAAM,aAAa,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACtD,OAAO,MAAM,WAAW,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA;AAGtE,SAAS,QAAQ,CAAC,GAAW,GAAW,GAAiB;AAAA,EAC9D,IAAI,IAAI,GACN,IAAI,GACJ,IAAI;AAAA,EAEN,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI;AAAA,EAC/B,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,EAAE;AAAA,EACpC,MAAM,IAAI,KAAK,IAAI;AAAA,EACnB,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EACvB,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK;AAAA,EAE7B,QAAQ;AAAA,SACD;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,SACG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,SACG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,SACG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,SACG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,SACG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA;AAAA,EAGJ,OAAO,KAAK,WAAW,GAAG,GAAG,GAAG,CAAC;AAAA;AAGnC,IAAM,kBAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AACf;AAEO,SAAS,UAAU,CAAC,OAAyB;AAAA,EAClD,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,MAAM,aAAa,MAAM,YAAY;AAAA,IAErC,IAAI,eAAe,eAAe;AAAA,MAChC,OAAO,KAAK,WAAW,GAAG,GAAG,GAAG,CAAC;AAAA,IACnC;AAAA,IAEA,IAAI,gBAAgB,aAAa;AAAA,MAC/B,OAAO,SAAS,gBAAgB,WAAW;AAAA,IAC7C;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EACA,OAAO;AAAA;;;AClUT,IAAM,sBAA8C,CAAC,UAAU,UAAU,WAAW,OAAO;AAEpF,SAAS,kBAAkB,CAAC,OAAsC;AAAA,EACvE,OAAO,OAAO,UAAU,YAAY,oBAAoB,SAAS,KAAoB;AAAA;AAGhF,SAAS,gBAAgB,CAAC,OAAgB,WAAwB,UAAuB;AAAA,EAC9F,IAAI,mBAAmB,KAAK,GAAG;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU,aAAa,UAAU,MAAM;AAAA,IACzC,QAAQ,KACN,wBAAwB,4BAA4B,gCAAgC,oBAAoB,KAAK,IAAI,GACnH;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,IAAM,cAAqD;AAAA,EAChE,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAiCO,SAAS,kBAAkB,CAAC,OAAmD;AAAA,EACpF,MAAM,SAAwB,CAAC;AAAA,EAC/B,IAAI,MAAM;AAAA,IAAK,OAAO,KAAK,KAAK;AAAA,EAChC,IAAI,MAAM;AAAA,IAAO,OAAO,KAAK,OAAO;AAAA,EACpC,IAAI,MAAM;AAAA,IAAQ,OAAO,KAAK,QAAQ;AAAA,EACtC,IAAI,MAAM;AAAA,IAAM,OAAO,KAAK,MAAM;AAAA,EAClC,OAAO,OAAO,SAAS,IAAI,SAAS;AAAA;AAG/B,SAAS,cAAc,CAAC,QAAoD;AAAA,EACjF,OAAO,WAAW,OACd,EAAE,KAAK,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,KAAK,IACnD,MAAM,QAAQ,MAAM,IAClB;AAAA,IACE,KAAK,OAAO,SAAS,KAAK;AAAA,IAC1B,OAAO,OAAO,SAAS,OAAO;AAAA,IAC9B,QAAQ,OAAO,SAAS,QAAQ;AAAA,IAChC,MAAM,OAAO,SAAS,MAAM;AAAA,EAC9B,IACA,EAAE,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,MAAM,MAAM;AAAA;AAIxD,SAAS,kBAAkB,CAAC,OAAsC;AAAA,EACvE,MAAM,QAAQ,IAAI,YAAY,EAAE;AAAA,EAChC,MAAM,KAAK,MAAM,QAAQ,YAAY,CAAC;AAAA,EACtC,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,EACvC,MAAM,KAAK,MAAM,WAAW,YAAY,CAAC;AAAA,EACzC,MAAM,KAAK,MAAM,YAAY,YAAY,CAAC;AAAA,EAC1C,MAAM,KAAK,MAAM,WAAW,YAAY,CAAC;AAAA,EACzC,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,EACvC,MAAM,KAAK,MAAM,KAAK,YAAY,CAAC;AAAA,EACnC,MAAM,KAAK,MAAM,QAAQ,YAAY,CAAC;AAAA,EACtC,MAAM,KAAK,MAAM,MAAM,YAAY,CAAC;AAAA,EACpC,MAAM,KAAK,MAAM,OAAO,YAAY,CAAC;AAAA,EACrC,MAAM,MAAM,MAAM,MAAM,YAAY,CAAC;AAAA,EACrC,OAAO;AAAA;AAIF,IAAM,mBAAqD;AAAA,EAChE,QAAQ,mBAAmB,YAAY,MAAM;AAAA,EAC7C,QAAQ,mBAAmB,YAAY,MAAM;AAAA,EAC7C,SAAS,mBAAmB,YAAY,OAAO;AAAA,EAC/C,OAAO,mBAAmB,YAAY,KAAK;AAC7C;;ACzKA;AAAA;AAIO,MAAM,SAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEQ,oBAA6B;AAAA,EAC7B,sBAA+B;AAAA,EAEvC,WAAW,CAAC,KAAgB;AAAA,IAC1B,KAAK,OAAO,IAAI;AAAA,IAChB,KAAK,OAAO,IAAI;AAAA,IAChB,KAAK,OAAO,IAAI;AAAA,IAChB,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,WAAW,IAAI;AAAA,IACpB,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,MAAM,IAAI;AAAA,IACf,KAAK,YAAY,IAAI;AAAA,IACrB,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,OAAO,IAAI;AAAA,IAChB,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,WAAW,IAAI;AAAA,IACpB,KAAK,UAAU,IAAI;AAAA,IACnB,KAAK,WAAW,IAAI;AAAA,IACpB,KAAK,WAAW,IAAI;AAAA;AAAA,MAGlB,gBAAgB,GAAY;AAAA,IAC9B,OAAO,KAAK;AAAA;AAAA,MAGV,kBAAkB,GAAY;AAAA,IAChC,OAAO,KAAK;AAAA;AAAA,EAGd,cAAc,GAAS;AAAA,IACrB,KAAK,oBAAoB;AAAA;AAAA,EAG3B,eAAe,GAAS;AAAA,IACtB,KAAK,sBAAsB;AAAA;AAE/B;AAAA;AAEO,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACQ,oBAA6B;AAAA,EAC7B,sBAA+B;AAAA,EAEvC,WAAW,CAAC,OAAmB,UAA0B;AAAA,IACvD,KAAK,QAAQ;AAAA,IACb,KAAK,WAAW;AAAA;AAAA,MAGd,gBAAgB,GAAY;AAAA,IAC9B,OAAO,KAAK;AAAA;AAAA,MAGV,kBAAkB,GAAY;AAAA,IAChC,OAAO,KAAK;AAAA;AAAA,EAGd,cAAc,GAAS;AAAA,IACrB,KAAK,oBAAoB;AAAA;AAAA,EAG3B,eAAe,GAAS;AAAA,IACtB,KAAK,sBAAsB;AAAA;AAE/B;AAAA;AAQO,MAAM,mBAAmB,aAAiC;AAAA,EACxD,gBAAgB,CAAC,WAA+B;AAAA,IACrD,IAAI;AAAA,MACF,QAAQ,UAAU;AAAA,aACX;AAAA,UACH,KAAK,KAAK,YAAY,IAAI,SAAS,SAAS,CAAC;AAAA,UAC7C;AAAA,aACG;AAAA,UACH,KAAK,KAAK,cAAc,IAAI,SAAS,SAAS,CAAC;AAAA,UAC/C;AAAA;AAAA,UAEA,KAAK,KAAK,YAAY,IAAI,SAAS,SAAS,CAAC;AAAA,UAC7C;AAAA;AAAA,MAEJ,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,6CAA6C,KAAK;AAAA,MAChE,OAAO;AAAA;AAAA,IAGT,OAAO;AAAA;AAAA,EAGF,YAAY,CAAC,OAAmB,UAAgC;AAAA,IACrE,IAAI;AAAA,MACF,KAAK,KAAK,SAAS,IAAI,WAAW,OAAO,QAAQ,CAAC;AAAA,MAClD,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,wCAAwC,KAAK;AAAA;AAAA;AAGjE;AAAA;AAMO,MAAM,2BAA2B,WAAW;AAAA,EACzC,qBAAmE,IAAI;AAAA,EAExE,IAAwC,CAAC,UAAa,MAAsC;AAAA,IACjG,OAAO,KAAK,iBAAiB,OAAO,GAAG,IAAI;AAAA;AAAA,EAGrC,gBAAoD,CAAC,UAAa,MAAsC;AAAA,IAC9G,IAAI,qBAAqB;AAAA,IAKzB,MAAM,kBAAkB,KAAK,UAAU,KAAY;AAAA,IACnD,IAAI,gBAAgB,SAAS,GAAG;AAAA,MAC9B,qBAAqB;AAAA,MAErB,WAAW,YAAY,iBAAiB;AAAA,QACtC,IAAI;AAAA,UACF,SAAS,GAAG,IAAI;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,QAAQ,MAAM,gCAAgC,kBAAkB,KAAK;AAAA;AAAA,QAIvE,IAAI,UAAU,cAAc,UAAU,gBAAgB,UAAU,SAAS;AAAA,UACvE,MAAM,WAAW,KAAK;AAAA,UACtB,IAAI,SAAS,oBAAoB;AAAA,YAC/B,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,KAAK,mBAAmB,IAAI,KAAK;AAAA,IAGvD,MAAM,qBAAqB,iBAAiB,cAAc,OAAO,IAAI,CAAC,GAAG,aAAa,IAAI,CAAC;AAAA,IAC3F,IAAI,yBAAyB;AAAA,IAE7B,IAAI,iBAAiB,cAAc,OAAO,GAAG;AAAA,MAC3C,yBAAyB;AAAA,MAEzB,IAAI,UAAU,cAAc,UAAU,gBAAgB,UAAU,SAAS;AAAA,QACvE,MAAM,WAAW,KAAK;AAAA,QACtB,IAAI,SAAS;AAAA,UAAkB,OAAO,sBAAsB;AAAA,QAC5D,IAAI,SAAS;AAAA,UAAoB,OAAO,sBAAsB;AAAA,MAChE;AAAA,MAEA,WAAW,WAAW,oBAAoB;AAAA,QACxC,IAAI;AAAA,UACF,QAAQ,GAAG,IAAI;AAAA,UACf,OAAO,OAAO;AAAA,UACd,QAAQ,MAAM,oCAAoC,kBAAkB,KAAK;AAAA;AAAA,QAI3E,IAAI,UAAU,cAAc,UAAU,gBAAgB,UAAU,SAAS;AAAA,UACvE,MAAM,WAAW,KAAK;AAAA,UACtB,IAAI,SAAS,oBAAoB;AAAA,YAC/B,OAAO,sBAAsB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,sBAAsB;AAAA;AAAA,EAGxB,UAA8C,CACnD,OACA,SACM;AAAA,IACN,IAAI,CAAC,KAAK,mBAAmB,IAAI,KAAK,GAAG;AAAA,MACvC,KAAK,mBAAmB,IAAI,OAAO,IAAI,GAAK;AAAA,IAC9C;AAAA,IACA,KAAK,mBAAmB,IAAI,KAAK,EAAG,IAAI,OAAO;AAAA;AAAA,EAG1C,WAA+C,CACpD,OACA,SACM;AAAA,IACN,MAAM,WAAW,KAAK,mBAAmB,IAAI,KAAK;AAAA,IAClD,IAAI,UAAU;AAAA,MACZ,SAAS,OAAO,OAAO;AAAA,IACzB;AAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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AO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAGP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAGP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAGP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OA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",
56
+ "debugId": "FC7AC9CF38562F8A64756E2164756E21",
57
+ "names": []
58
+ }