@asm-agent/tui 0.8.2

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.
Files changed (130) hide show
  1. package/README.md +795 -0
  2. package/dist/autocomplete.d.ts +61 -0
  3. package/dist/autocomplete.d.ts.map +1 -0
  4. package/dist/autocomplete.js +601 -0
  5. package/dist/autocomplete.js.map +1 -0
  6. package/dist/components/box.d.ts +24 -0
  7. package/dist/components/box.d.ts.map +1 -0
  8. package/dist/components/box.js +114 -0
  9. package/dist/components/box.js.map +1 -0
  10. package/dist/components/cancellable-loader.d.ts +22 -0
  11. package/dist/components/cancellable-loader.d.ts.map +1 -0
  12. package/dist/components/cancellable-loader.js +35 -0
  13. package/dist/components/cancellable-loader.js.map +1 -0
  14. package/dist/components/editor.d.ts +275 -0
  15. package/dist/components/editor.d.ts.map +1 -0
  16. package/dist/components/editor.js +1968 -0
  17. package/dist/components/editor.js.map +1 -0
  18. package/dist/components/image.d.ts +34 -0
  19. package/dist/components/image.d.ts.map +1 -0
  20. package/dist/components/image.js +96 -0
  21. package/dist/components/image.js.map +1 -0
  22. package/dist/components/input.d.ts +37 -0
  23. package/dist/components/input.d.ts.map +1 -0
  24. package/dist/components/input.js +385 -0
  25. package/dist/components/input.js.map +1 -0
  26. package/dist/components/loader.d.ts +29 -0
  27. package/dist/components/loader.d.ts.map +1 -0
  28. package/dist/components/loader.js +69 -0
  29. package/dist/components/loader.js.map +1 -0
  30. package/dist/components/markdown.d.ts +100 -0
  31. package/dist/components/markdown.d.ts.map +1 -0
  32. package/dist/components/markdown.js +773 -0
  33. package/dist/components/markdown.js.map +1 -0
  34. package/dist/components/select-list.d.ts +61 -0
  35. package/dist/components/select-list.d.ts.map +1 -0
  36. package/dist/components/select-list.js +206 -0
  37. package/dist/components/select-list.js.map +1 -0
  38. package/dist/components/settings-list.d.ts +49 -0
  39. package/dist/components/settings-list.d.ts.map +1 -0
  40. package/dist/components/settings-list.js +170 -0
  41. package/dist/components/settings-list.js.map +1 -0
  42. package/dist/components/spacer.d.ts +12 -0
  43. package/dist/components/spacer.d.ts.map +1 -0
  44. package/dist/components/spacer.js +21 -0
  45. package/dist/components/spacer.js.map +1 -0
  46. package/dist/components/text.d.ts +19 -0
  47. package/dist/components/text.d.ts.map +1 -0
  48. package/dist/components/text.js +77 -0
  49. package/dist/components/text.js.map +1 -0
  50. package/dist/components/truncated-text.d.ts +14 -0
  51. package/dist/components/truncated-text.d.ts.map +1 -0
  52. package/dist/components/truncated-text.js +44 -0
  53. package/dist/components/truncated-text.js.map +1 -0
  54. package/dist/editor-component.d.ts +51 -0
  55. package/dist/editor-component.d.ts.map +1 -0
  56. package/dist/editor-component.js +2 -0
  57. package/dist/editor-component.js.map +1 -0
  58. package/dist/fullscreen.d.ts +105 -0
  59. package/dist/fullscreen.d.ts.map +1 -0
  60. package/dist/fullscreen.js +597 -0
  61. package/dist/fullscreen.js.map +1 -0
  62. package/dist/fuzzy.d.ts +26 -0
  63. package/dist/fuzzy.d.ts.map +1 -0
  64. package/dist/fuzzy.js +114 -0
  65. package/dist/fuzzy.js.map +1 -0
  66. package/dist/index.d.ts +29 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +27 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/keybindings.d.ts +239 -0
  71. package/dist/keybindings.d.ts.map +1 -0
  72. package/dist/keybindings.js +222 -0
  73. package/dist/keybindings.js.map +1 -0
  74. package/dist/keys.d.ts +184 -0
  75. package/dist/keys.d.ts.map +1 -0
  76. package/dist/keys.js +1163 -0
  77. package/dist/keys.js.map +1 -0
  78. package/dist/kill-ring.d.ts +26 -0
  79. package/dist/kill-ring.d.ts.map +1 -0
  80. package/dist/kill-ring.js +42 -0
  81. package/dist/kill-ring.js.map +1 -0
  82. package/dist/latex.d.ts +21 -0
  83. package/dist/latex.d.ts.map +1 -0
  84. package/dist/latex.js +797 -0
  85. package/dist/latex.js.map +1 -0
  86. package/dist/mouse.d.ts +24 -0
  87. package/dist/mouse.d.ts.map +1 -0
  88. package/dist/mouse.js +34 -0
  89. package/dist/mouse.js.map +1 -0
  90. package/dist/render-cache.d.ts +9 -0
  91. package/dist/render-cache.d.ts.map +1 -0
  92. package/dist/render-cache.js +23 -0
  93. package/dist/render-cache.js.map +1 -0
  94. package/dist/selection-metadata.d.ts +22 -0
  95. package/dist/selection-metadata.d.ts.map +1 -0
  96. package/dist/selection-metadata.js +141 -0
  97. package/dist/selection-metadata.js.map +1 -0
  98. package/dist/slash-command-context.d.ts +12 -0
  99. package/dist/slash-command-context.d.ts.map +1 -0
  100. package/dist/slash-command-context.js +32 -0
  101. package/dist/slash-command-context.js.map +1 -0
  102. package/dist/stdin-buffer.d.ts +50 -0
  103. package/dist/stdin-buffer.d.ts.map +1 -0
  104. package/dist/stdin-buffer.js +313 -0
  105. package/dist/stdin-buffer.js.map +1 -0
  106. package/dist/terminal-colors.d.ts +31 -0
  107. package/dist/terminal-colors.d.ts.map +1 -0
  108. package/dist/terminal-colors.js +161 -0
  109. package/dist/terminal-colors.js.map +1 -0
  110. package/dist/terminal-image.d.ts +85 -0
  111. package/dist/terminal-image.d.ts.map +1 -0
  112. package/dist/terminal-image.js +324 -0
  113. package/dist/terminal-image.js.map +1 -0
  114. package/dist/terminal.d.ts +113 -0
  115. package/dist/terminal.d.ts.map +1 -0
  116. package/dist/terminal.js +486 -0
  117. package/dist/terminal.js.map +1 -0
  118. package/dist/tui.d.ts +310 -0
  119. package/dist/tui.d.ts.map +1 -0
  120. package/dist/tui.js +1673 -0
  121. package/dist/tui.js.map +1 -0
  122. package/dist/undo-stack.d.ts +16 -0
  123. package/dist/undo-stack.d.ts.map +1 -0
  124. package/dist/undo-stack.js +26 -0
  125. package/dist/undo-stack.js.map +1 -0
  126. package/dist/utils.d.ts +98 -0
  127. package/dist/utils.d.ts.map +1 -0
  128. package/dist/utils.js +1233 -0
  129. package/dist/utils.js.map +1 -0
  130. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullscreen.js","sourceRoot":"","sources":["../src/fullscreen.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,MAAM,UAAU,2BAA2B,CAAC,UAAkB,EAAE,MAAc,EAAU;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,8BAA8B,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAAA,CACrC;AAED,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,+CAA6C,CAAC;AAsDxE,MAAM,OAAO,kBAAkB;IACtB,SAAS,GAAG,CAAC,CAAC;IACd,SAAS,GAAG,IAAI,CAAC;IACjB,SAAS,GAAa,EAAE,CAAC;IACzB,SAAS,GAAG,CAAC,CAAC;IACd,UAAU,GAAG,CAAC,CAAC;IACf,aAAa,GAAG,CAAC,CAAC;IAClB,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAa,EAAE,CAAC;IAC9B,SAAS,GAAa,EAAE,CAAC;IACzB,qBAAqB,GAAG,CAAC,CAAC;IAC1B,sBAAsB,GAAG,CAAC,CAAC;IAC3B,qBAAqB,GAAwC,EAAE,CAAC;IAChE,yBAAyB,GAA4C,EAAE,CAAC;IACxE,oBAAoB,GAAkC,IAAI,CAAC;IAC3D,oBAAoB,GAAgC,IAAI,CAAC;IACzD,eAAe,GAA0B,IAAI,CAAC;IAC9C,aAAa,GAA0B,IAAI,CAAC;IAC5C,aAAa,GAAyB,IAAI,CAAC;IAEnD;;;;OAIG;IACH,YAAY,CACX,UAAoB,EACpB,IAAc,EACd,MAAc,EACd,yBAAyB,GAA4C,EAAE,EAC5D;QACX,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,MAAM,UAAU,GAAG,2BAA2B,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,SAAS,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACnC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QACjC,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAE3D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAAA,CACjC;IAEO,gBAAgB,GAA0D;QACjF,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACpE,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAAA,CAC7D;IAEO,aAAa,CAAC,SAAiB,EAAE,GAAmD,EAAqB;QAChH,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACxE,OAAO;YACN,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtD,EAAE,EAAE,SAAS,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB;SACtE,CAAC;IAAA,CACF;IAEO,kBAAkB,CAAC,MAAgB,EAAQ;QAClD,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACrC,MAAM,KAAK,GACV,IAAI,CAAC,aAAa,KAAK,OAAO;gBAC7B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC;gBACzC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC7F,KAAK,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;gBACpE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7D,CAAC;QACF,CAAC;IAAA,CACD;IAED,wFAAwF;IACxF,cAAc,CAAC,SAAiB,EAAE,SAAiB,EAAW;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACzD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,eAAe,CAAC,SAAiB,EAAE,SAAiB,EAAQ;QAC3D,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;YAAE,OAAO;QAC7G,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IAAA,CAC3D;IAED,4BAA4B,CAAC,SAAiB,EAAmC;QAChF,IACC,CAAC,IAAI,CAAC,eAAe;YACrB,CAAC,IAAI,CAAC,aAAa;YACnB,CAAC,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;YAEvE,OAAO,IAAI,CAAC;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/G,OAAO,CAAC,CAAC,CAAC;QACX,CAAC;QACD,IACC,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI;YACnD,SAAS,IAAI,MAAM,CAAC,OAAO;YAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAClC,CAAC;YACF,OAAO,CAAC,CAAC;QACV,CAAC;QACD,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,eAAe,CAAC,SAAmC,EAAE,SAAiB,EAAW;QAChF,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;YACnG,OAAO,KAAK,CAAC;QACd,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,KAAK,iBAAiB;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,wEAAwE;IACxE,YAAY,GAAkB;QAC7B,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAC3E,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG;YACf,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,OAAO;gBAC/B,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;gBAC1D,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;YACtD,CAAC,CAAC,IAAI,CAAC;QACR,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,qBAAqB,CAAC,SAAiB,EAAE,SAAiB,EAAQ;QACjE,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAClF,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;IAAA,CACD;IAED,kBAAkB,GAAkB;QACnC,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,gFAAgF;IAChF,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,iBAAsD,EAAQ;QAClH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1E,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrF,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;QAC/C,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7E,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACzB,CAAC;IAAA,CACD;IAED,mBAAmB,CAAC,SAAiB,EAAE,SAAiB,EAAW;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,oBAAoB,GAAG;YAC3B,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACpE,YAAY,EAAE,IAAI,CAAC,qBAAqB;YACxC,aAAa,EAAE,IAAI,CAAC,sBAAsB;SAC1C,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,oBAAoB,CAAC,SAAiB,EAAE,SAAiB,EAAQ;QAChE,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAAA,CAC7B;IAED,iBAAiB,GAAkB;QAClC,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,qBAAqB,CAAC;QAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAAA,CACjE;IAEO,aAAa,CAAC,IAAY,EAAE,IAAgB,EAAU;QAC7D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,GAAG,MAAM,iBAAiB,QAAQ,WAAW,KAAK,EAAE,CAAC;IAAA,CAC5D;IAEO,UAAU,CACjB,SAAiB,EACjB,SAAiB,EACjB,QAAQ,GAAkC,IAAI,EACtB;QACxB,MAAM,aAAa,GAAG,QAAQ,EAAE,aAAa,IAAI,IAAI,CAAC,sBAAsB,CAAC;QAC7E,IAAI,aAAa,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,YAAY,GAAG,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,qBAAqB,CAAC;QAC1E,MAAM,WAAW,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,YAAY,GAAG,GAAG,CAAC;QAChC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IAAA,CAC7C;IAEO,sBAAsB,GAOrB;QACR,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC5G,IAAI,aAAa,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,eAAe,GAAG,aAAa;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO;YACN,QAAQ,EAAE,eAAe,GAAG,YAAY;YACxC,OAAO,EAAE,aAAa,GAAG,YAAY;YACrC,YAAY;YACZ,aAAa;YACb,eAAe;YACf,aAAa;SACb,CAAC;IAAA,CACF;IAEO,0BAA0B,CAAC,SAAiB,EAAE,KAAc,EAAiB;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAChF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QACpG,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAAA,CACpG;IAEO,iBAAiB,CAAC,KAAqB,EAAW;QACzD,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CACrC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAC1G,CAAC;IAAA,CACF;IAEO,YAAY,CAAC,KAAa,EAA8B;QAC/D,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAAA,CACjF;IAEO,YAAY,CAAC,KAAqB,EAAiB;QAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IACC,MAAM;gBACN,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ;gBAC7B,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW;gBAChC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC9C,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,EAC7B,CAAC;gBACF,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IAAA,CACZ;IAEO,gBAAgB,CAAC,KAAa,EAAE,KAAqB,EAA4B;QACxF,IAAI,OAAO,GAA6B,IAAI,CAAC;QAC7C,IAAI,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACnD,IAAI,qBAAqB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACrD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;YACtC,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/G,IACC,YAAY,GAAG,mBAAmB;gBAClC,CAAC,YAAY,KAAK,mBAAmB,IAAI,cAAc,GAAG,qBAAqB,CAAC,EAC/E,CAAC;gBACF,OAAO,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrD,mBAAmB,GAAG,YAAY,CAAC;gBACnC,qBAAqB,GAAG,cAAc,CAAC;YACxC,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAEO,gBAAgB,GAA+B;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO;YACN,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;YAClD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;YAChD,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;YAC3D,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;SACzD,CAAC;IAAA,CACF;IAEO,kBAAkB,CAAC,SAAiB,EAAE,GAAmD,EAAgB;QAChH,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,QAAQ,CAAC;QACxF,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,IAAI,UAAU,IAAI,CAAC,aAAa;YAAE,OAAO,EAAE,CAAC;QAE5C,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrD,IACC,MAAM,CAAC,IAAI,KAAK,SAAS;gBACzB,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;gBAC7B,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO;gBAC1B,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK;gBACxB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU;gBAChC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ;gBAE9B,SAAS;YACV,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACnF,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;YAC7G,IAAI,EAAE,GAAG,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAAA,CAC7C;IAEO,mBAAmB,CAC1B,IAAY,EACZ,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,IAAI,IAAI,CAAC,qBAAqB,EACjD;QACzB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAAA,CAC1G;IAEO,wBAAwB,CAAC,KAAqB,EAAyB;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7B,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;YACtC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC5C,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7E,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBAC/C,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;oBAC7B,OAAO,GAAG,GAAG,CAAC;oBACd,QAAQ,GAAG,YAAY,CAAC;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAAA,CAC1C;IAEO,kBAAkB,CACzB,SAAiB,EACjB,GAAmD,EACnD,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,IAAI,IAAI,CAAC,qBAAqB,EAC3D;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,EAAE,GAAG,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,yBAAyB,CAChC,WAAqB,EACrB,OAA4C,EAC5C,GAAmD,EACnC;QAChB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAAA,CAC5C;IAEO,oBAAoB,CAC3B,WAAqB,EACrB,GAAmD,EACnC;QAChB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAAA,CAC5C;IAEO,sBAAsB,CAAC,CAAiB,EAAE,CAAiB,EAAU;QAC5E,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAAA,CAC3D;IAEO,yBAAyB,CAChC,WAAqB,EACrB,GAAmD,EACnC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAEnC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;gBACzD,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;oBACxE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;aACjD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,CAAC;aACtF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAChE,IACC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;gBACtD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EACjD,CAAC;gBACF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,CAAC;QACF,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/G,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAAA,CAC5C;IAED,cAAc,GAAS;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAAA,CACjC;IAED,YAAY,GAAY;QACvB,OAAO,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAAA,CACxC;IAED;;;;OAIG;IACH,WAAW,CAAC,SAAiB,EAAE,SAAiB,EAAiB;QAChE,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrF,IAAI,SAAS,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;QACpE,IAAI,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzD,OAAO,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAAA,CACpC;IAED,mFAAmF;IACnF,KAAK,CACJ,KAA6B,EAC7B,KAAe,EACf,KAAa,EACb,MAAc,EACd,SAA8C,EACvC;QACP,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,MAAM,GAAG,aAAa,CAAC;QAC3B,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,eAAe,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI;gBAAE,SAAS;YAC3C,MAAM,IAAI,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;YACtC,yEAAyE;YACzE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,aAAa,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAAA,CACzB;IAED,kEAAkE;IAClE,KAAK,GAAS;QACb,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAAA,CACpB;IAED,qEAAqE;IACrE,QAAQ,CAAC,KAAa,EAAQ;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC;IAAA,CACtD;IAED,WAAW,GAAS;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC;IAAA,CAC1C;IAED,cAAc,GAAS;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAAA,CACtB;IAED,QAAQ,GAAW;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAAA,CAC9C;IAED,YAAY,GAAW;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAAA,CAC7B;IAED,WAAW,GAAY;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC;IAAA,CACtB;IAED,UAAU,GAAe;QACxB,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5D,UAAU,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IAAA,CACF;CACD","sourcesContent":["/**\n * Fullscreen (alternate-screen) viewport: a scrollable window over the\n * transcript with a dock (editor/footer) pinned to the bottom rows. Frames\n * are a fixed grid painted with absolute addressing and diffed row-by-row;\n * scroll position is application state, not terminal scrollback.\n */\n\nimport type { TableCellSelectionRegion } from \"./selection-metadata.js\";\nimport { isImageLine } from \"./terminal-image.js\";\nimport { sliceByColumn, stripAnsi, urlAtColumn, visibleWidth } from \"./utils.js\";\n\nexport const FULLSCREEN_MIN_TRANSCRIPT_ROWS = 3;\n\nexport function clippedFullscreenDockHeight(dockLength: number, height: number): number {\n\tconst maxDock = Math.max(0, height - FULLSCREEN_MIN_TRANSCRIPT_ROWS);\n\treturn Math.min(dockLength, maxDock);\n}\n\n// Kitty images span multiple physical rows and cannot be clipped to a window.\nconst IMAGE_PLACEHOLDER = \"\\x1b[2m[image — view in inline mode]\\x1b[0m\";\n\nexport interface ScrollInfo {\n\tfollowing: boolean;\n\tlinesBelow: number;\n\tlinesAbove: number;\n}\n\nexport type SelectionScrollDirection = -1 | 1;\n\n// Transcript-anchored selection endpoint (line index + visible column), so\n// streaming appends and scrolling never shift what is selected.\ninterface SelectionPoint {\n\tline: number;\n\tcol: number;\n}\n\ninterface FrameSelectionRegion {\n\tline: number;\n\tcol: number;\n\twidth: number;\n}\n\ninterface ColumnSpan {\n\tfrom: number;\n\tto: number;\n}\n\ninterface FrameSelectionSnapshot {\n\tframe: string[];\n\tregions: FrameSelectionRegion[];\n\tvisibleStart: number;\n\tvisibleHeight: number;\n}\n\ninterface TableCellPosition {\n\trow: number;\n\tcolumn: number;\n}\n\ninterface ActiveTableSelection {\n\ttable: object;\n\tanchor: TableCellPosition;\n}\n\ninterface TableSelectionRange {\n\tfromRow: number;\n\ttoRow: number;\n\tfromColumn: number;\n\ttoColumn: number;\n}\n\ntype SelectionMode = \"transcript\" | \"table\" | \"frame\";\n\nexport class FullscreenViewport {\n\tprivate scrollTop = 0;\n\tprivate following = true;\n\tprivate prevFrame: string[] = [];\n\tprivate prevWidth = 0;\n\tprivate prevHeight = 0;\n\tprivate lastMaxScroll = 0;\n\tprivate lastWindowHeight = 0;\n\tprivate lastTranscript: string[] = [];\n\tprivate lastFrame: string[] = [];\n\tprivate lastFrameVisibleStart = 0;\n\tprivate lastFrameVisibleHeight = 0;\n\tprivate frameSelectionRegions: ReadonlyArray<FrameSelectionRegion> = [];\n\tprivate tableCellSelectionRegions: ReadonlyArray<TableCellSelectionRegion> = [];\n\tprivate activeFrameSelection: FrameSelectionSnapshot | null = null;\n\tprivate activeTableSelection: ActiveTableSelection | null = null;\n\tprivate selectionAnchor: SelectionPoint | null = null;\n\tprivate selectionHead: SelectionPoint | null = null;\n\tprivate selectionMode: SelectionMode | null = null;\n\n\t/**\n\t * Compose a frame of exactly `height` lines: scrolled transcript window on\n\t * top, dock pinned to the bottom. Following pins the window to the\n\t * transcript end; otherwise it stays frozen while content appends.\n\t */\n\tcomposeFrame(\n\t\ttranscript: string[],\n\t\tdock: string[],\n\t\theight: number,\n\t\ttableCellSelectionRegions: ReadonlyArray<TableCellSelectionRegion> = [],\n\t): string[] {\n\t\tlet dockLines = dock;\n\t\tconst dockHeight = clippedFullscreenDockHeight(dockLines.length, height);\n\t\tif (dockLines.length > dockHeight) {\n\t\t\tdockLines = dockLines.slice(dockLines.length - dockHeight);\n\t\t}\n\t\tconst windowHeight = height - dockLines.length;\n\t\tconst maxScroll = Math.max(0, transcript.length - windowHeight);\n\n\t\tif (this.following) {\n\t\t\tthis.scrollTop = maxScroll;\n\t\t} else {\n\t\t\tthis.scrollTop = Math.max(0, Math.min(this.scrollTop, maxScroll));\n\t\t}\n\t\tthis.lastMaxScroll = maxScroll;\n\t\tthis.lastWindowHeight = windowHeight;\n\t\tthis.lastTranscript = transcript;\n\t\tthis.tableCellSelectionRegions = tableCellSelectionRegions;\n\n\t\tconst window = transcript.slice(this.scrollTop, this.scrollTop + windowHeight);\n\t\tfor (let i = 0; i < window.length; i++) {\n\t\t\tif (isImageLine(window[i])) window[i] = IMAGE_PLACEHOLDER;\n\t\t}\n\t\tthis.highlightSelection(window);\n\t\twhile (window.length < windowHeight) {\n\t\t\twindow.push(\"\");\n\t\t}\n\t\treturn [...window, ...dockLines];\n\t}\n\n\tprivate orderedSelection(): { start: SelectionPoint; end: SelectionPoint } | null {\n\t\tconst a = this.selectionAnchor;\n\t\tconst b = this.selectionHead;\n\t\tif (!a || !b || (a.line === b.line && a.col === b.col)) return null;\n\t\tconst flipped = a.line > b.line || (a.line === b.line && a.col > b.col);\n\t\treturn flipped ? { start: b, end: a } : { start: a, end: b };\n\t}\n\n\tprivate selectionSpan(lineIndex: number, sel: { start: SelectionPoint; end: SelectionPoint }): ColumnSpan | null {\n\t\tif (lineIndex < sel.start.line || lineIndex > sel.end.line) return null;\n\t\treturn {\n\t\t\tfrom: lineIndex === sel.start.line ? sel.start.col : 0,\n\t\t\tto: lineIndex === sel.end.line ? sel.end.col : Number.MAX_SAFE_INTEGER,\n\t\t};\n\t}\n\n\tprivate highlightSelection(window: string[]): void {\n\t\tif (this.selectionMode !== \"transcript\" && this.selectionMode !== \"table\") return;\n\t\tconst sel = this.orderedSelection();\n\t\tif (!sel) return;\n\t\tfor (let i = 0; i < window.length; i++) {\n\t\t\tconst lineIndex = this.scrollTop + i;\n\t\t\tconst spans =\n\t\t\t\tthis.selectionMode === \"table\"\n\t\t\t\t\t? this.selectedTableSpans(lineIndex, sel)\n\t\t\t\t\t: [this.selectionSpan(lineIndex, sel)].filter((span): span is ColumnSpan => span !== null);\n\t\t\tfor (let spanIndex = spans.length - 1; spanIndex >= 0; spanIndex--) {\n\t\t\t\twindow[i] = this.highlightLine(window[i], spans[spanIndex]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Begin a selection at a screen position; false when outside the transcript window. */\n\tbeginSelection(screenRow: number, screenCol: number): boolean {\n\t\tconst line = this.transcriptLineForScreenRow(screenRow, false);\n\t\tif (line === null) {\n\t\t\tthis.clearSelection();\n\t\t\treturn false;\n\t\t}\n\t\tconst point = { line, col: Math.max(0, screenCol) };\n\t\tthis.selectionAnchor = point;\n\t\tthis.selectionHead = { ...point };\n\t\tconst table = this.tableAtPoint(point);\n\t\tconst tableCell = table ? this.closestTableCell(table, point) : null;\n\t\tif (table && tableCell) {\n\t\t\tthis.activeTableSelection = { table, anchor: tableCell };\n\t\t\tthis.selectionMode = \"table\";\n\t\t} else {\n\t\t\tthis.activeTableSelection = null;\n\t\t\tthis.selectionMode = \"transcript\";\n\t\t}\n\t\treturn true;\n\t}\n\n\textendSelection(screenRow: number, screenCol: number): void {\n\t\tif (!this.selectionAnchor || (this.selectionMode !== \"transcript\" && this.selectionMode !== \"table\")) return;\n\t\tconst line = this.transcriptLineForScreenRow(screenRow, true);\n\t\tif (line === null) return;\n\t\tthis.selectionHead = { line, col: Math.max(0, screenCol) };\n\t}\n\n\tselectionAutoScrollDirection(screenRow: number): SelectionScrollDirection | null {\n\t\tif (\n\t\t\t!this.selectionAnchor ||\n\t\t\t!this.selectionHead ||\n\t\t\t(this.selectionMode !== \"transcript\" && this.selectionMode !== \"table\")\n\t\t)\n\t\t\treturn null;\n\t\tconst bounds = this.transcriptScreenBounds();\n\t\tif (!bounds) return null;\n\t\tif (this.selectionHead.line < this.selectionAnchor.line && screenRow <= bounds.firstRow && this.scrollTop > 0) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (\n\t\t\tthis.selectionHead.line > this.selectionAnchor.line &&\n\t\t\tscreenRow >= bounds.lastRow &&\n\t\t\tthis.scrollTop < this.lastMaxScroll\n\t\t) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn null;\n\t}\n\n\tscrollSelection(direction: SelectionScrollDirection, screenCol: number): boolean {\n\t\tif (!this.selectionAnchor || (this.selectionMode !== \"transcript\" && this.selectionMode !== \"table\"))\n\t\t\treturn false;\n\t\tconst previousScrollTop = this.scrollTop;\n\t\tthis.scrollBy(direction);\n\t\tif (this.scrollTop === previousScrollTop) return false;\n\t\tconst bounds = this.transcriptScreenBounds();\n\t\tif (!bounds) return false;\n\t\tthis.extendSelection(direction === -1 ? bounds.firstRow : bounds.lastRow, screenCol);\n\t\treturn true;\n\t}\n\n\t/** Finish the selection and return its plain text (null when empty). */\n\tendSelection(): string | null {\n\t\tif (this.selectionMode !== \"transcript\" && this.selectionMode !== \"table\") {\n\t\t\tthis.clearSelection();\n\t\t\treturn null;\n\t\t}\n\t\tconst sel = this.orderedSelection();\n\t\tconst text = sel\n\t\t\t? this.selectionMode === \"table\"\n\t\t\t\t? this.extractTableSelectionText(this.lastTranscript, sel)\n\t\t\t\t: this.extractSelectionText(this.lastTranscript, sel)\n\t\t\t: null;\n\t\tthis.clearSelection();\n\t\treturn text;\n\t}\n\n\textendActiveSelection(screenRow: number, screenCol: number): void {\n\t\tif (this.selectionMode === \"frame\") {\n\t\t\tthis.extendFrameSelection(screenRow, screenCol);\n\t\t} else if (this.selectionMode === \"transcript\" || this.selectionMode === \"table\") {\n\t\t\tthis.extendSelection(screenRow, screenCol);\n\t\t}\n\t}\n\n\tendActiveSelection(): string | null {\n\t\tif (this.selectionMode === \"frame\") {\n\t\t\treturn this.endFrameSelection();\n\t\t}\n\t\tif (this.selectionMode === \"transcript\" || this.selectionMode === \"table\") {\n\t\t\treturn this.endSelection();\n\t\t}\n\t\tthis.clearSelection();\n\t\treturn null;\n\t}\n\n\t/** Snapshot and highlight the final screen frame for overlay/dock selection. */\n\tapplyFrameSelection(frame: string[], height: number, selectableRegions: ReadonlyArray<FrameSelectionRegion>): void {\n\t\tthis.lastFrame = frame;\n\t\tthis.lastFrameVisibleHeight = Math.min(Math.max(0, height), frame.length);\n\t\tthis.lastFrameVisibleStart = Math.max(0, frame.length - this.lastFrameVisibleHeight);\n\t\tthis.frameSelectionRegions = selectableRegions;\n\t\tif (this.selectionMode !== \"frame\") return;\n\t\tconst sel = this.orderedSelection();\n\t\tif (!sel) return;\n\t\tfor (let lineIndex = sel.start.line; lineIndex <= sel.end.line; lineIndex++) {\n\t\t\tlet line = frame[lineIndex];\n\t\t\tif (line === undefined) continue;\n\t\t\tconst spans = this.selectedFrameSpans(lineIndex, sel);\n\t\t\tfor (let i = spans.length - 1; i >= 0; i--) {\n\t\t\t\tline = this.highlightLine(line, spans[i]);\n\t\t\t}\n\t\t\tframe[lineIndex] = line;\n\t\t}\n\t}\n\n\tbeginFrameSelection(screenRow: number, screenCol: number): boolean {\n\t\tconst point = this.framePoint(screenRow, screenCol);\n\t\tif (!point || !this.isFrameSelectable(point)) {\n\t\t\tthis.clearSelection();\n\t\t\treturn false;\n\t\t}\n\t\tthis.activeFrameSelection = {\n\t\t\tframe: [...this.lastFrame],\n\t\t\tregions: this.frameSelectionRegions.map((region) => ({ ...region })),\n\t\t\tvisibleStart: this.lastFrameVisibleStart,\n\t\t\tvisibleHeight: this.lastFrameVisibleHeight,\n\t\t};\n\t\tthis.selectionAnchor = point;\n\t\tthis.selectionHead = { ...point };\n\t\tthis.selectionMode = \"frame\";\n\t\treturn true;\n\t}\n\n\textendFrameSelection(screenRow: number, screenCol: number): void {\n\t\tif (!this.selectionAnchor || this.selectionMode !== \"frame\") return;\n\t\tconst point = this.framePoint(screenRow, screenCol, this.activeFrameSelection);\n\t\tif (!point) return;\n\t\tconst clamped = this.clampFrameSelectionPoint(point);\n\t\tif (!clamped) return;\n\t\tthis.selectionHead = clamped;\n\t}\n\n\tendFrameSelection(): string | null {\n\t\tif (this.selectionMode !== \"frame\") {\n\t\t\tthis.clearSelection();\n\t\t\treturn null;\n\t\t}\n\t\tconst sel = this.orderedSelection();\n\t\tconst active = this.activeFrameSelection;\n\t\tconst sourceLines = active?.frame ?? this.lastFrame;\n\t\tconst regions = active?.regions ?? this.frameSelectionRegions;\n\t\tthis.clearSelection();\n\t\tif (!sel) return null;\n\t\treturn this.extractFrameSelectionText(sourceLines, regions, sel);\n\t}\n\n\tprivate highlightLine(line: string, span: ColumnSpan): string {\n\t\tconst width = visibleWidth(line);\n\t\tconst from = Math.min(span.from, width);\n\t\tconst to = Math.min(span.to, width);\n\t\tif (to <= from) return line;\n\t\tconst before = sliceByColumn(line, 0, from);\n\t\tconst selected = stripAnsi(sliceByColumn(line, from, to - from));\n\t\tconst after = sliceByColumn(line, to, Math.max(0, width - to));\n\t\treturn `${before}\\x1b[0m\\x1b[7m${selected}\\x1b[27m${after}`;\n\t}\n\n\tprivate framePoint(\n\t\tscreenRow: number,\n\t\tscreenCol: number,\n\t\tsnapshot: FrameSelectionSnapshot | null = null,\n\t): SelectionPoint | null {\n\t\tconst visibleHeight = snapshot?.visibleHeight ?? this.lastFrameVisibleHeight;\n\t\tif (visibleHeight === 0) return null;\n\t\tconst visibleStart = snapshot?.visibleStart ?? this.lastFrameVisibleStart;\n\t\tconst frameLength = snapshot?.frame.length ?? this.lastFrame.length;\n\t\tconst row = Math.max(0, Math.min(screenRow, visibleHeight - 1));\n\t\tconst line = visibleStart + row;\n\t\tif (line < 0 || line >= frameLength) return null;\n\t\treturn { line, col: Math.max(0, screenCol) };\n\t}\n\n\tprivate transcriptScreenBounds(): {\n\t\tfirstRow: number;\n\t\tlastRow: number;\n\t\tvisibleStart: number;\n\t\tvisibleHeight: number;\n\t\ttranscriptStart: number;\n\t\ttranscriptEnd: number;\n\t} | null {\n\t\tif (this.lastWindowHeight <= 0) return null;\n\t\tconst visibleHeight = this.lastFrameVisibleHeight > 0 ? this.lastFrameVisibleHeight : this.lastWindowHeight;\n\t\tif (visibleHeight <= 0) return null;\n\t\tconst visibleStart = this.lastFrameVisibleHeight > 0 ? this.lastFrameVisibleStart : 0;\n\t\tconst visibleEnd = visibleStart + visibleHeight - 1;\n\t\tconst transcriptStart = Math.max(0, visibleStart);\n\t\tconst transcriptEnd = Math.min(this.lastWindowHeight - 1, visibleEnd);\n\t\tif (transcriptStart > transcriptEnd) return null;\n\t\treturn {\n\t\t\tfirstRow: transcriptStart - visibleStart,\n\t\t\tlastRow: transcriptEnd - visibleStart,\n\t\t\tvisibleStart,\n\t\t\tvisibleHeight,\n\t\t\ttranscriptStart,\n\t\t\ttranscriptEnd,\n\t\t};\n\t}\n\n\tprivate transcriptLineForScreenRow(screenRow: number, clamp: boolean): number | null {\n\t\tconst bounds = this.transcriptScreenBounds();\n\t\tif (!bounds) return null;\n\t\tif (!clamp && (screenRow < 0 || screenRow >= bounds.visibleHeight)) return null;\n\t\tconst row = clamp ? Math.max(0, Math.min(screenRow, bounds.visibleHeight - 1)) : screenRow;\n\t\tconst frameLine = bounds.visibleStart + row;\n\t\tif (!clamp && (frameLine < bounds.transcriptStart || frameLine > bounds.transcriptEnd)) return null;\n\t\treturn this.scrollTop + Math.max(bounds.transcriptStart, Math.min(frameLine, bounds.transcriptEnd));\n\t}\n\n\tprivate isFrameSelectable(point: SelectionPoint): boolean {\n\t\treturn this.frameSelectionRegions.some(\n\t\t\t(region) => region.line === point.line && point.col >= region.col && point.col < region.col + region.width,\n\t\t);\n\t}\n\n\tprivate tableRegions(table: object): TableCellSelectionRegion[] {\n\t\treturn this.tableCellSelectionRegions.filter((region) => region.table === table);\n\t}\n\n\tprivate tableAtPoint(point: SelectionPoint): object | null {\n\t\tconst tables = new Set(this.tableCellSelectionRegions.map((region) => region.table));\n\t\tfor (const table of tables) {\n\t\t\tconst region = this.tableRegions(table)[0];\n\t\t\tif (\n\t\t\t\tregion &&\n\t\t\t\tpoint.line >= region.tableTop &&\n\t\t\t\tpoint.line <= region.tableBottom &&\n\t\t\t\tpoint.col >= Math.max(0, region.tableLeft - 1) &&\n\t\t\t\tpoint.col <= region.tableRight\n\t\t\t) {\n\t\t\t\treturn table;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate closestTableCell(table: object, point: SelectionPoint): TableCellPosition | null {\n\t\tlet closest: TableCellPosition | null = null;\n\t\tlet closestLineDistance = Number.POSITIVE_INFINITY;\n\t\tlet closestColumnDistance = Number.POSITIVE_INFINITY;\n\t\tfor (const region of this.tableRegions(table)) {\n\t\t\tconst lineDistance = Math.abs(point.line - region.line);\n\t\t\tconst end = region.col + region.width;\n\t\t\tconst columnDistance = point.col < region.col ? region.col - point.col : point.col > end ? point.col - end : 0;\n\t\t\tif (\n\t\t\t\tlineDistance < closestLineDistance ||\n\t\t\t\t(lineDistance === closestLineDistance && columnDistance < closestColumnDistance)\n\t\t\t) {\n\t\t\t\tclosest = { row: region.row, column: region.column };\n\t\t\t\tclosestLineDistance = lineDistance;\n\t\t\t\tclosestColumnDistance = columnDistance;\n\t\t\t}\n\t\t}\n\t\treturn closest;\n\t}\n\n\tprivate activeTableRange(): TableSelectionRange | null {\n\t\tconst active = this.activeTableSelection;\n\t\tconst head = this.selectionHead;\n\t\tif (!active || !head) return null;\n\t\tconst headCell = this.closestTableCell(active.table, head);\n\t\tif (!headCell) return null;\n\t\treturn {\n\t\t\tfromRow: Math.min(active.anchor.row, headCell.row),\n\t\t\ttoRow: Math.max(active.anchor.row, headCell.row),\n\t\t\tfromColumn: Math.min(active.anchor.column, headCell.column),\n\t\t\ttoColumn: Math.max(active.anchor.column, headCell.column),\n\t\t};\n\t}\n\n\tprivate selectedTableSpans(lineIndex: number, sel: { start: SelectionPoint; end: SelectionPoint }): ColumnSpan[] {\n\t\tconst active = this.activeTableSelection;\n\t\tconst range = this.activeTableRange();\n\t\tif (!active || !range) return [];\n\t\tconst singleCell = range.fromRow === range.toRow && range.fromColumn === range.toColumn;\n\t\tconst selectionSpan = singleCell ? this.selectionSpan(lineIndex, sel) : null;\n\t\tif (singleCell && !selectionSpan) return [];\n\n\t\tconst spans: ColumnSpan[] = [];\n\t\tfor (const region of this.tableCellSelectionRegions) {\n\t\t\tif (\n\t\t\t\tregion.line !== lineIndex ||\n\t\t\t\tregion.table !== active.table ||\n\t\t\t\tregion.row < range.fromRow ||\n\t\t\t\tregion.row > range.toRow ||\n\t\t\t\tregion.column < range.fromColumn ||\n\t\t\t\tregion.column > range.toColumn\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst from = selectionSpan ? Math.max(selectionSpan.from, region.col) : region.col;\n\t\t\tconst to = selectionSpan ? Math.min(selectionSpan.to, region.col + region.width) : region.col + region.width;\n\t\t\tif (to > from) spans.push({ from, to });\n\t\t}\n\t\treturn spans.sort((a, b) => a.from - b.from);\n\t}\n\n\tprivate frameRegionsForLine(\n\t\tline: number,\n\t\tregions = this.activeFrameSelection?.regions ?? this.frameSelectionRegions,\n\t): FrameSelectionRegion[] {\n\t\treturn regions.filter((region) => region.line === line && region.width > 0).sort((a, b) => a.col - b.col);\n\t}\n\n\tprivate clampFrameSelectionPoint(point: SelectionPoint): SelectionPoint | null {\n\t\tconst regions = this.frameRegionsForLine(point.line);\n\t\tif (regions.length === 0) return null;\n\t\tlet closest = regions[0].col;\n\t\tlet distance = Number.POSITIVE_INFINITY;\n\t\tfor (const region of regions) {\n\t\t\tconst start = region.col;\n\t\t\tconst end = region.col + region.width;\n\t\t\tif (point.col >= start && point.col <= end) {\n\t\t\t\treturn { line: point.line, col: Math.max(start, Math.min(point.col, end)) };\n\t\t\t}\n\t\t\tfor (const col of [start, end]) {\n\t\t\t\tconst nextDistance = Math.abs(point.col - col);\n\t\t\t\tif (nextDistance < distance) {\n\t\t\t\t\tclosest = col;\n\t\t\t\t\tdistance = nextDistance;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { line: point.line, col: closest };\n\t}\n\n\tprivate selectedFrameSpans(\n\t\tlineIndex: number,\n\t\tsel: { start: SelectionPoint; end: SelectionPoint },\n\t\tregions = this.activeFrameSelection?.regions ?? this.frameSelectionRegions,\n\t): ColumnSpan[] {\n\t\tconst span = this.selectionSpan(lineIndex, sel);\n\t\tif (!span) return [];\n\t\tconst spans: ColumnSpan[] = [];\n\t\tfor (const region of this.frameRegionsForLine(lineIndex, regions)) {\n\t\t\tconst from = Math.max(span.from, region.col);\n\t\t\tconst to = Math.min(span.to, region.col + region.width);\n\t\t\tif (to > from) spans.push({ from, to });\n\t\t}\n\t\treturn spans;\n\t}\n\n\tprivate extractFrameSelectionText(\n\t\tsourceLines: string[],\n\t\tregions: ReadonlyArray<FrameSelectionRegion>,\n\t\tsel: { start: SelectionPoint; end: SelectionPoint },\n\t): string | null {\n\t\tconst lines: string[] = [];\n\t\tfor (let lineIndex = sel.start.line; lineIndex <= sel.end.line; lineIndex++) {\n\t\t\tconst line = sourceLines[lineIndex] ?? \"\";\n\t\t\tconst spans = this.selectedFrameSpans(lineIndex, sel, regions);\n\t\t\tif (spans.length === 0) continue;\n\t\t\tconst parts: string[] = [];\n\t\t\tfor (const span of spans) {\n\t\t\t\tparts.push(stripAnsi(sliceByColumn(line, span.from, Math.max(0, span.to - span.from))));\n\t\t\t}\n\t\t\tlines.push(parts.join(\"\").trimEnd());\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\treturn text.trim().length > 0 ? text : null;\n\t}\n\n\tprivate extractSelectionText(\n\t\tsourceLines: string[],\n\t\tsel: { start: SelectionPoint; end: SelectionPoint },\n\t): string | null {\n\t\tconst lines: string[] = [];\n\t\tfor (let lineIndex = sel.start.line; lineIndex <= sel.end.line; lineIndex++) {\n\t\t\tconst line = sourceLines[lineIndex] ?? \"\";\n\t\t\tconst span = this.selectionSpan(lineIndex, sel);\n\t\t\tif (!span) continue;\n\t\t\tconst width = visibleWidth(line);\n\t\t\tconst from = Math.min(span.from, width);\n\t\t\tconst to = Math.min(span.to, width);\n\t\t\tlines.push(stripAnsi(sliceByColumn(line, from, Math.max(0, to - from))).trimEnd());\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\treturn text.trim().length > 0 ? text : null;\n\t}\n\n\tprivate compareSelectionPoints(a: SelectionPoint, b: SelectionPoint): number {\n\t\treturn a.line === b.line ? a.col - b.col : a.line - b.line;\n\t}\n\n\tprivate extractTableSelectionText(\n\t\tsourceLines: string[],\n\t\tsel: { start: SelectionPoint; end: SelectionPoint },\n\t): string | null {\n\t\tconst active = this.activeTableSelection;\n\t\tconst range = this.activeTableRange();\n\t\tif (!active || !range) return null;\n\n\t\tif (range.fromRow !== range.toRow || range.fromColumn !== range.toColumn) {\n\t\t\tconst contents = new Map<string, string>();\n\t\t\tfor (const region of this.tableRegions(active.table)) {\n\t\t\t\tcontents.set(`${region.row}:${region.column}`, region.content);\n\t\t\t}\n\t\t\tconst rows: string[] = [];\n\t\t\tfor (let row = range.fromRow; row <= range.toRow; row++) {\n\t\t\t\tconst cells: string[] = [];\n\t\t\t\tfor (let column = range.fromColumn; column <= range.toColumn; column++) {\n\t\t\t\t\tcells.push(contents.get(`${row}:${column}`) ?? \"\");\n\t\t\t\t}\n\t\t\t\trows.push(cells.join(\"\\t\"));\n\t\t\t}\n\t\t\tconst text = rows.join(\"\\n\");\n\t\t\treturn text.trim().length > 0 ? text : null;\n\t\t}\n\n\t\tconst cellRegions = this.tableRegions(active.table)\n\t\t\t.filter((region) => region.row === range.fromRow && region.column === range.fromColumn)\n\t\t\t.sort((a, b) => a.line - b.line || a.segment - b.segment);\n\t\tconst first = cellRegions[0];\n\t\tconst last = cellRegions.at(-1);\n\t\tif (first && last) {\n\t\t\tconst cellStart = { line: first.line, col: first.col };\n\t\t\tconst cellEnd = { line: last.line, col: last.col + last.width };\n\t\t\tif (\n\t\t\t\tthis.compareSelectionPoints(sel.start, cellStart) <= 0 &&\n\t\t\t\tthis.compareSelectionPoints(sel.end, cellEnd) >= 0\n\t\t\t) {\n\t\t\t\treturn first.content.trim().length > 0 ? first.content : null;\n\t\t\t}\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tfor (let lineIndex = sel.start.line; lineIndex <= sel.end.line; lineIndex++) {\n\t\t\tconst line = sourceLines[lineIndex] ?? \"\";\n\t\t\tconst spans = this.selectedTableSpans(lineIndex, sel);\n\t\t\tif (spans.length === 0) continue;\n\t\t\tconst parts = spans.map((span) => stripAnsi(sliceByColumn(line, span.from, Math.max(0, span.to - span.from))));\n\t\t\tlines.push(parts.join(\"\").trimEnd());\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\treturn text.trim().length > 0 ? text : null;\n\t}\n\n\tclearSelection(): void {\n\t\tthis.selectionAnchor = null;\n\t\tthis.selectionHead = null;\n\t\tthis.selectionMode = null;\n\t\tthis.activeFrameSelection = null;\n\t\tthis.activeTableSelection = null;\n\t}\n\n\thasSelection(): boolean {\n\t\treturn this.orderedSelection() !== null;\n\t}\n\n\t/**\n\t * OSC 8 hyperlink URL at a screen position in the last painted frame, or\n\t * null when the position is not over a hyperlink. Covers the transcript\n\t * window, the dock, and composited overlays.\n\t */\n\thyperlinkAt(screenRow: number, screenCol: number): string | null {\n\t\tif (screenRow < 0 || screenCol < 0 || this.lastFrameVisibleHeight === 0) return null;\n\t\tif (screenRow >= this.lastFrameVisibleHeight) return null;\n\t\tconst line = this.lastFrame[this.lastFrameVisibleStart + screenRow];\n\t\tif (line === undefined || isImageLine(line)) return null;\n\t\treturn urlAtColumn(line, screenCol);\n\t}\n\n\t/** Row-diff a composed frame against the previous one with absolute addressing. */\n\tpaint(\n\t\twrite: (data: string) => void,\n\t\tframe: string[],\n\t\twidth: number,\n\t\theight: number,\n\t\tcursorPos: { row: number; col: number } | null,\n\t): void {\n\t\tif (frame.length > height) {\n\t\t\tframe = frame.slice(frame.length - height);\n\t\t}\n\n\t\tlet buffer = \"\\x1b[?2026h\";\n\t\tif (width !== this.prevWidth || height !== this.prevHeight || this.prevFrame.length === 0) {\n\t\t\tbuffer += \"\\x1b[2J\\x1b[H\";\n\t\t\tthis.prevFrame = [];\n\t\t}\n\t\tfor (let row = 0; row < height; row++) {\n\t\t\tconst line = frame[row] ?? \"\";\n\t\t\tif (this.prevFrame[row] === line) continue;\n\t\t\tbuffer += `\\x1b[${row + 1};1H\\x1b[2K`;\n\t\t\t// an overwide line would wrap and shear the grid; clamp instead of crash\n\t\t\tbuffer += visibleWidth(line) > width ? sliceByColumn(line, 0, width, true) : line;\n\t\t}\n\t\tif (cursorPos) {\n\t\t\tbuffer += `\\x1b[${Math.min(cursorPos.row, height - 1) + 1};${cursorPos.col + 1}H`;\n\t\t}\n\t\tbuffer += \"\\x1b[?2026l\";\n\t\twrite(buffer);\n\n\t\tthis.prevFrame = frame;\n\t\tthis.prevWidth = width;\n\t\tthis.prevHeight = height;\n\t}\n\n\t/** Force the next paint to clear and repaint the whole screen. */\n\treset(): void {\n\t\tthis.prevFrame = [];\n\t}\n\n\t/** Scrolling up pauses following; reaching the bottom resumes it. */\n\tscrollBy(delta: number): void {\n\t\tconst base = this.following ? this.lastMaxScroll : this.scrollTop;\n\t\tthis.scrollTop = Math.max(0, Math.min(base + delta, this.lastMaxScroll));\n\t\tthis.following = this.scrollTop >= this.lastMaxScroll;\n\t}\n\n\tscrollToTop(): void {\n\t\tthis.scrollTop = 0;\n\t\tthis.following = this.lastMaxScroll === 0;\n\t}\n\n\tscrollToBottom(): void {\n\t\tthis.scrollTop = this.lastMaxScroll;\n\t\tthis.following = true;\n\t}\n\n\tpageSize(): number {\n\t\treturn Math.max(1, this.lastWindowHeight - 1);\n\t}\n\n\twindowHeight(): number {\n\t\treturn this.lastWindowHeight;\n\t}\n\n\tisFollowing(): boolean {\n\t\treturn this.following;\n\t}\n\n\tscrollInfo(): ScrollInfo {\n\t\treturn {\n\t\t\tfollowing: this.following,\n\t\t\tlinesBelow: Math.max(0, this.lastMaxScroll - this.scrollTop),\n\t\t\tlinesAbove: this.scrollTop,\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Fuzzy matching utilities.
3
+ * Matches if all query characters appear in order (not necessarily consecutive).
4
+ * Lower score = better match.
5
+ */
6
+ export interface FuzzyMatch {
7
+ matches: boolean;
8
+ score: number;
9
+ }
10
+ export declare function fuzzyMatch(query: string, text: string): FuzzyMatch;
11
+ export interface ScoredItem<T> {
12
+ item: T;
13
+ score: number;
14
+ }
15
+ /**
16
+ * Filter items by fuzzy match quality, returning each match with its score
17
+ * (lower is better) sorted best-first. Supports space-separated tokens: all
18
+ * tokens must match.
19
+ */
20
+ export declare function fuzzyFilterScored<T>(items: T[], query: string, getText: (item: T) => string): ScoredItem<T>[];
21
+ /**
22
+ * Filter and sort items by fuzzy match quality (best matches first).
23
+ * Supports space-separated tokens: all tokens must match.
24
+ */
25
+ export declare function fuzzyFilter<T>(items: T[], query: string, getText: (item: T) => string): T[];
26
+ //# sourceMappingURL=fuzzy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../src/fuzzy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CA6ElE;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAkC7G;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CAK3F","sourcesContent":["/**\n * Fuzzy matching utilities.\n * Matches if all query characters appear in order (not necessarily consecutive).\n * Lower score = better match.\n */\n\nexport interface FuzzyMatch {\n\tmatches: boolean;\n\tscore: number;\n}\n\nexport function fuzzyMatch(query: string, text: string): FuzzyMatch {\n\tconst queryLower = query.toLowerCase();\n\tconst textLower = text.toLowerCase();\n\n\tconst matchQuery = (normalizedQuery: string): FuzzyMatch => {\n\t\tif (normalizedQuery.length === 0) {\n\t\t\treturn { matches: true, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery.length > textLower.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tlet queryIndex = 0;\n\t\tlet score = 0;\n\t\tlet lastMatchIndex = -1;\n\t\tlet consecutiveMatches = 0;\n\n\t\tfor (let i = 0; i < textLower.length && queryIndex < normalizedQuery.length; i++) {\n\t\t\tif (textLower[i] === normalizedQuery[queryIndex]) {\n\t\t\t\tconst isWordBoundary = i === 0 || /[\\s\\-_./:]/.test(textLower[i - 1]!);\n\n\t\t\t\tif (lastMatchIndex === i - 1) {\n\t\t\t\t\tconsecutiveMatches++;\n\t\t\t\t\tscore -= consecutiveMatches * 5;\n\t\t\t\t} else {\n\t\t\t\t\tconsecutiveMatches = 0;\n\t\t\t\t\tif (lastMatchIndex >= 0) {\n\t\t\t\t\t\tscore += (i - lastMatchIndex - 1) * 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isWordBoundary) {\n\t\t\t\t\tscore -= 10;\n\t\t\t\t}\n\n\t\t\t\tscore += i * 0.1;\n\n\t\t\t\tlastMatchIndex = i;\n\t\t\t\tqueryIndex++;\n\t\t\t}\n\t\t}\n\n\t\tif (queryIndex < normalizedQuery.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery === textLower) {\n\t\t\tscore -= 100;\n\t\t}\n\n\t\treturn { matches: true, score };\n\t};\n\n\tconst primaryMatch = matchQuery(queryLower);\n\tif (primaryMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst alphaNumericMatch = queryLower.match(/^(?<letters>[a-z]+)(?<digits>[0-9]+)$/);\n\tconst numericAlphaMatch = queryLower.match(/^(?<digits>[0-9]+)(?<letters>[a-z]+)$/);\n\tconst swappedQuery = alphaNumericMatch\n\t\t? `${alphaNumericMatch.groups?.digits ?? \"\"}${alphaNumericMatch.groups?.letters ?? \"\"}`\n\t\t: numericAlphaMatch\n\t\t\t? `${numericAlphaMatch.groups?.letters ?? \"\"}${numericAlphaMatch.groups?.digits ?? \"\"}`\n\t\t\t: \"\";\n\n\tif (!swappedQuery) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst swappedMatch = matchQuery(swappedQuery);\n\tif (!swappedMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\treturn { matches: true, score: swappedMatch.score + 5 };\n}\n\nexport interface ScoredItem<T> {\n\titem: T;\n\tscore: number;\n}\n\n/**\n * Filter items by fuzzy match quality, returning each match with its score\n * (lower is better) sorted best-first. Supports space-separated tokens: all\n * tokens must match.\n */\nexport function fuzzyFilterScored<T>(items: T[], query: string, getText: (item: T) => string): ScoredItem<T>[] {\n\tconst tokens = query\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.filter((t) => t.length > 0);\n\n\tif (tokens.length === 0) {\n\t\treturn items.map((item) => ({ item, score: 0 }));\n\t}\n\n\tconst results: ScoredItem<T>[] = [];\n\n\tfor (const item of items) {\n\t\tconst text = getText(item);\n\t\tlet totalScore = 0;\n\t\tlet allMatch = true;\n\n\t\tfor (const token of tokens) {\n\t\t\tconst match = fuzzyMatch(token, text);\n\t\t\tif (match.matches) {\n\t\t\t\ttotalScore += match.score;\n\t\t\t} else {\n\t\t\t\tallMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (allMatch) {\n\t\t\tresults.push({ item, score: totalScore });\n\t\t}\n\t}\n\n\tresults.sort((a, b) => a.score - b.score);\n\treturn results;\n}\n\n/**\n * Filter and sort items by fuzzy match quality (best matches first).\n * Supports space-separated tokens: all tokens must match.\n */\nexport function fuzzyFilter<T>(items: T[], query: string, getText: (item: T) => string): T[] {\n\tif (!query.trim()) {\n\t\treturn items;\n\t}\n\treturn fuzzyFilterScored(items, query, getText).map((r) => r.item);\n}\n"]}
package/dist/fuzzy.js ADDED
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Fuzzy matching utilities.
3
+ * Matches if all query characters appear in order (not necessarily consecutive).
4
+ * Lower score = better match.
5
+ */
6
+ export function fuzzyMatch(query, text) {
7
+ const queryLower = query.toLowerCase();
8
+ const textLower = text.toLowerCase();
9
+ const matchQuery = (normalizedQuery) => {
10
+ if (normalizedQuery.length === 0) {
11
+ return { matches: true, score: 0 };
12
+ }
13
+ if (normalizedQuery.length > textLower.length) {
14
+ return { matches: false, score: 0 };
15
+ }
16
+ let queryIndex = 0;
17
+ let score = 0;
18
+ let lastMatchIndex = -1;
19
+ let consecutiveMatches = 0;
20
+ for (let i = 0; i < textLower.length && queryIndex < normalizedQuery.length; i++) {
21
+ if (textLower[i] === normalizedQuery[queryIndex]) {
22
+ const isWordBoundary = i === 0 || /[\s\-_./:]/.test(textLower[i - 1]);
23
+ if (lastMatchIndex === i - 1) {
24
+ consecutiveMatches++;
25
+ score -= consecutiveMatches * 5;
26
+ }
27
+ else {
28
+ consecutiveMatches = 0;
29
+ if (lastMatchIndex >= 0) {
30
+ score += (i - lastMatchIndex - 1) * 2;
31
+ }
32
+ }
33
+ if (isWordBoundary) {
34
+ score -= 10;
35
+ }
36
+ score += i * 0.1;
37
+ lastMatchIndex = i;
38
+ queryIndex++;
39
+ }
40
+ }
41
+ if (queryIndex < normalizedQuery.length) {
42
+ return { matches: false, score: 0 };
43
+ }
44
+ if (normalizedQuery === textLower) {
45
+ score -= 100;
46
+ }
47
+ return { matches: true, score };
48
+ };
49
+ const primaryMatch = matchQuery(queryLower);
50
+ if (primaryMatch.matches) {
51
+ return primaryMatch;
52
+ }
53
+ const alphaNumericMatch = queryLower.match(/^(?<letters>[a-z]+)(?<digits>[0-9]+)$/);
54
+ const numericAlphaMatch = queryLower.match(/^(?<digits>[0-9]+)(?<letters>[a-z]+)$/);
55
+ const swappedQuery = alphaNumericMatch
56
+ ? `${alphaNumericMatch.groups?.digits ?? ""}${alphaNumericMatch.groups?.letters ?? ""}`
57
+ : numericAlphaMatch
58
+ ? `${numericAlphaMatch.groups?.letters ?? ""}${numericAlphaMatch.groups?.digits ?? ""}`
59
+ : "";
60
+ if (!swappedQuery) {
61
+ return primaryMatch;
62
+ }
63
+ const swappedMatch = matchQuery(swappedQuery);
64
+ if (!swappedMatch.matches) {
65
+ return primaryMatch;
66
+ }
67
+ return { matches: true, score: swappedMatch.score + 5 };
68
+ }
69
+ /**
70
+ * Filter items by fuzzy match quality, returning each match with its score
71
+ * (lower is better) sorted best-first. Supports space-separated tokens: all
72
+ * tokens must match.
73
+ */
74
+ export function fuzzyFilterScored(items, query, getText) {
75
+ const tokens = query
76
+ .trim()
77
+ .split(/\s+/)
78
+ .filter((t) => t.length > 0);
79
+ if (tokens.length === 0) {
80
+ return items.map((item) => ({ item, score: 0 }));
81
+ }
82
+ const results = [];
83
+ for (const item of items) {
84
+ const text = getText(item);
85
+ let totalScore = 0;
86
+ let allMatch = true;
87
+ for (const token of tokens) {
88
+ const match = fuzzyMatch(token, text);
89
+ if (match.matches) {
90
+ totalScore += match.score;
91
+ }
92
+ else {
93
+ allMatch = false;
94
+ break;
95
+ }
96
+ }
97
+ if (allMatch) {
98
+ results.push({ item, score: totalScore });
99
+ }
100
+ }
101
+ results.sort((a, b) => a.score - b.score);
102
+ return results;
103
+ }
104
+ /**
105
+ * Filter and sort items by fuzzy match quality (best matches first).
106
+ * Supports space-separated tokens: all tokens must match.
107
+ */
108
+ export function fuzzyFilter(items, query, getText) {
109
+ if (!query.trim()) {
110
+ return items;
111
+ }
112
+ return fuzzyFilterScored(items, query, getText).map((r) => r.item);
113
+ }
114
+ //# sourceMappingURL=fuzzy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../src/fuzzy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Fuzzy matching utilities.\n * Matches if all query characters appear in order (not necessarily consecutive).\n * Lower score = better match.\n */\n\nexport interface FuzzyMatch {\n\tmatches: boolean;\n\tscore: number;\n}\n\nexport function fuzzyMatch(query: string, text: string): FuzzyMatch {\n\tconst queryLower = query.toLowerCase();\n\tconst textLower = text.toLowerCase();\n\n\tconst matchQuery = (normalizedQuery: string): FuzzyMatch => {\n\t\tif (normalizedQuery.length === 0) {\n\t\t\treturn { matches: true, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery.length > textLower.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tlet queryIndex = 0;\n\t\tlet score = 0;\n\t\tlet lastMatchIndex = -1;\n\t\tlet consecutiveMatches = 0;\n\n\t\tfor (let i = 0; i < textLower.length && queryIndex < normalizedQuery.length; i++) {\n\t\t\tif (textLower[i] === normalizedQuery[queryIndex]) {\n\t\t\t\tconst isWordBoundary = i === 0 || /[\\s\\-_./:]/.test(textLower[i - 1]!);\n\n\t\t\t\tif (lastMatchIndex === i - 1) {\n\t\t\t\t\tconsecutiveMatches++;\n\t\t\t\t\tscore -= consecutiveMatches * 5;\n\t\t\t\t} else {\n\t\t\t\t\tconsecutiveMatches = 0;\n\t\t\t\t\tif (lastMatchIndex >= 0) {\n\t\t\t\t\t\tscore += (i - lastMatchIndex - 1) * 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isWordBoundary) {\n\t\t\t\t\tscore -= 10;\n\t\t\t\t}\n\n\t\t\t\tscore += i * 0.1;\n\n\t\t\t\tlastMatchIndex = i;\n\t\t\t\tqueryIndex++;\n\t\t\t}\n\t\t}\n\n\t\tif (queryIndex < normalizedQuery.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery === textLower) {\n\t\t\tscore -= 100;\n\t\t}\n\n\t\treturn { matches: true, score };\n\t};\n\n\tconst primaryMatch = matchQuery(queryLower);\n\tif (primaryMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst alphaNumericMatch = queryLower.match(/^(?<letters>[a-z]+)(?<digits>[0-9]+)$/);\n\tconst numericAlphaMatch = queryLower.match(/^(?<digits>[0-9]+)(?<letters>[a-z]+)$/);\n\tconst swappedQuery = alphaNumericMatch\n\t\t? `${alphaNumericMatch.groups?.digits ?? \"\"}${alphaNumericMatch.groups?.letters ?? \"\"}`\n\t\t: numericAlphaMatch\n\t\t\t? `${numericAlphaMatch.groups?.letters ?? \"\"}${numericAlphaMatch.groups?.digits ?? \"\"}`\n\t\t\t: \"\";\n\n\tif (!swappedQuery) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst swappedMatch = matchQuery(swappedQuery);\n\tif (!swappedMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\treturn { matches: true, score: swappedMatch.score + 5 };\n}\n\nexport interface ScoredItem<T> {\n\titem: T;\n\tscore: number;\n}\n\n/**\n * Filter items by fuzzy match quality, returning each match with its score\n * (lower is better) sorted best-first. Supports space-separated tokens: all\n * tokens must match.\n */\nexport function fuzzyFilterScored<T>(items: T[], query: string, getText: (item: T) => string): ScoredItem<T>[] {\n\tconst tokens = query\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.filter((t) => t.length > 0);\n\n\tif (tokens.length === 0) {\n\t\treturn items.map((item) => ({ item, score: 0 }));\n\t}\n\n\tconst results: ScoredItem<T>[] = [];\n\n\tfor (const item of items) {\n\t\tconst text = getText(item);\n\t\tlet totalScore = 0;\n\t\tlet allMatch = true;\n\n\t\tfor (const token of tokens) {\n\t\t\tconst match = fuzzyMatch(token, text);\n\t\t\tif (match.matches) {\n\t\t\t\ttotalScore += match.score;\n\t\t\t} else {\n\t\t\t\tallMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (allMatch) {\n\t\t\tresults.push({ item, score: totalScore });\n\t\t}\n\t}\n\n\tresults.sort((a, b) => a.score - b.score);\n\treturn results;\n}\n\n/**\n * Filter and sort items by fuzzy match quality (best matches first).\n * Supports space-separated tokens: all tokens must match.\n */\nexport function fuzzyFilter<T>(items: T[], query: string, getText: (item: T) => string): T[] {\n\tif (!query.trim()) {\n\t\treturn items;\n\t}\n\treturn fuzzyFilterScored(items, query, getText).map((r) => r.item);\n}\n"]}
@@ -0,0 +1,29 @@
1
+ export { type AutocompleteItem, type AutocompleteProvider, type AutocompleteSuggestions, CombinedAutocompleteProvider, type SlashCommand, } from "./autocomplete.js";
2
+ export { Box } from "./components/box.js";
3
+ export { CancellableLoader } from "./components/cancellable-loader.js";
4
+ export { Editor, type EditorOptions, type EditorTheme } from "./components/editor.js";
5
+ export { Image, type ImageOptions, type ImageTheme } from "./components/image.js";
6
+ export { Input } from "./components/input.js";
7
+ export { Loader, type LoaderIndicatorOptions } from "./components/loader.js";
8
+ export { type DefaultTextStyle, Markdown, type MarkdownTheme } from "./components/markdown.js";
9
+ export { type SelectItem, SelectList, type SelectListLayoutOptions, type SelectListTheme, type SelectListTruncatePrimaryContext, } from "./components/select-list.js";
10
+ export { type SettingItem, SettingsList, type SettingsListTheme } from "./components/settings-list.js";
11
+ export { Spacer } from "./components/spacer.js";
12
+ export { Text } from "./components/text.js";
13
+ export { TruncatedText } from "./components/truncated-text.js";
14
+ export type { EditorComponent, EditorPasteSnapshot } from "./editor-component.js";
15
+ export { clippedFullscreenDockHeight, FULLSCREEN_MIN_TRANSCRIPT_ROWS, FullscreenViewport, type ScrollInfo, } from "./fullscreen.js";
16
+ export { type FuzzyMatch, fuzzyFilter, fuzzyFilterScored, fuzzyMatch, type ScoredItem } from "./fuzzy.js";
17
+ export { getKeybindings, type Keybinding, type KeybindingConflict, type KeybindingDefinition, type KeybindingDefinitions, type Keybindings, type KeybindingsConfig, KeybindingsManager, setKeybindings, TUI_KEYBINDINGS, } from "./keybindings.js";
18
+ export { decodeKittyPrintable, isKeyRelease, isKeyRepeat, isKittyProtocolActive, Key, type KeyEventType, type KeyId, matchesKey, parseKey, setKittyProtocolActive, } from "./keys.js";
19
+ export { latexToUnicode } from "./latex.js";
20
+ export { isMouseSequence, isWheelDown, isWheelUp, MOUSE_WHEEL_DOWN, MOUSE_WHEEL_UP, type MouseEvent, parseSgrMouseEvent, } from "./mouse.js";
21
+ export { VersionedRenderCache } from "./render-cache.js";
22
+ export type { TableCellSelectionRegion } from "./selection-metadata.js";
23
+ export { StdinBuffer, type StdinBufferEventMap, type StdinBufferOptions } from "./stdin-buffer.js";
24
+ export { ProcessTerminal, type Terminal, type TerminalStopOptions } from "./terminal.js";
25
+ export { bestAnsiColor, blendColor, clearDefaultTerminalColors, type DefaultTerminalColors, detectBackgroundFromColorFgBg, getDefaultTerminalColors, getTerminalBackgroundKind, isLightColor, type OscColorKind, type OscColorResponse, onDefaultTerminalColorsChange, parseOscColorResponse, QUERY_DEFAULT_BACKGROUND, QUERY_DEFAULT_FOREGROUND, type Rgb, rgbTo256, rgbToHex, setDefaultTerminalColors, type TerminalBackgroundKind, type TerminalColorMode, } from "./terminal-colors.js";
26
+ export { allocateImageId, type CellDimensions, calculateImageRows, deleteAllKittyImages, deleteKittyImage, detectCapabilities, encodeITerm2, encodeKitty, getCapabilities, getCellDimensions, getGifDimensions, getImageDimensions, getJpegDimensions, getPngDimensions, getWebpDimensions, hyperlink, type ImageDimensions, type ImageProtocol, type ImageRenderOptions, imageFallback, renderImage, resetCapabilitiesCache, setCapabilities, setCellDimensions, type TerminalCapabilities, } from "./terminal-image.js";
27
+ export { type Component, Container, CURSOR_MARKER, type Focusable, type FullscreenOptions, isFocusable, type OverlayAnchor, type OverlayHandle, type OverlayMargin, type OverlayOptions, type SizeValue, TUI, type TuiStopOptions, } from "./tui.js";
28
+ export { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "./utils.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\nexport { Box } from \"./components/box.js\";\nexport { CancellableLoader } from \"./components/cancellable-loader.js\";\nexport { Editor, type EditorOptions, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader, type LoaderIndicatorOptions } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport {\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SelectListTheme,\n\ttype SelectListTruncatePrimaryContext,\n} from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\nexport type { EditorComponent, EditorPasteSnapshot } from \"./editor-component.js\";\nexport {\n\tclippedFullscreenDockHeight,\n\tFULLSCREEN_MIN_TRANSCRIPT_ROWS,\n\tFullscreenViewport,\n\ttype ScrollInfo,\n} from \"./fullscreen.js\";\nexport { type FuzzyMatch, fuzzyFilter, fuzzyFilterScored, fuzzyMatch, type ScoredItem } from \"./fuzzy.js\";\nexport {\n\tgetKeybindings,\n\ttype Keybinding,\n\ttype KeybindingConflict,\n\ttype KeybindingDefinition,\n\ttype KeybindingDefinitions,\n\ttype Keybindings,\n\ttype KeybindingsConfig,\n\tKeybindingsManager,\n\tsetKeybindings,\n\tTUI_KEYBINDINGS,\n} from \"./keybindings.js\";\nexport {\n\tdecodeKittyPrintable,\n\tisKeyRelease,\n\tisKeyRepeat,\n\tisKittyProtocolActive,\n\tKey,\n\ttype KeyEventType,\n\ttype KeyId,\n\tmatchesKey,\n\tparseKey,\n\tsetKittyProtocolActive,\n} from \"./keys.js\";\nexport { latexToUnicode } from \"./latex.js\";\nexport {\n\tisMouseSequence,\n\tisWheelDown,\n\tisWheelUp,\n\tMOUSE_WHEEL_DOWN,\n\tMOUSE_WHEEL_UP,\n\ttype MouseEvent,\n\tparseSgrMouseEvent,\n} from \"./mouse.js\";\nexport { VersionedRenderCache } from \"./render-cache.js\";\nexport type { TableCellSelectionRegion } from \"./selection-metadata.js\";\nexport { StdinBuffer, type StdinBufferEventMap, type StdinBufferOptions } from \"./stdin-buffer.js\";\nexport { ProcessTerminal, type Terminal, type TerminalStopOptions } from \"./terminal.js\";\nexport {\n\tbestAnsiColor,\n\tblendColor,\n\tclearDefaultTerminalColors,\n\ttype DefaultTerminalColors,\n\tdetectBackgroundFromColorFgBg,\n\tgetDefaultTerminalColors,\n\tgetTerminalBackgroundKind,\n\tisLightColor,\n\ttype OscColorKind,\n\ttype OscColorResponse,\n\tonDefaultTerminalColorsChange,\n\tparseOscColorResponse,\n\tQUERY_DEFAULT_BACKGROUND,\n\tQUERY_DEFAULT_FOREGROUND,\n\ttype Rgb,\n\trgbTo256,\n\trgbToHex,\n\tsetDefaultTerminalColors,\n\ttype TerminalBackgroundKind,\n\ttype TerminalColorMode,\n} from \"./terminal-colors.js\";\nexport {\n\tallocateImageId,\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdeleteAllKittyImages,\n\tdeleteKittyImage,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\thyperlink,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCapabilities,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport {\n\ttype Component,\n\tContainer,\n\tCURSOR_MARKER,\n\ttype Focusable,\n\ttype FullscreenOptions,\n\tisFocusable,\n\ttype OverlayAnchor,\n\ttype OverlayHandle,\n\ttype OverlayMargin,\n\ttype OverlayOptions,\n\ttype SizeValue,\n\tTUI,\n\ttype TuiStopOptions,\n} from \"./tui.js\";\nexport { truncateToWidth, visibleWidth, wrapTextWithAnsi } from \"./utils.js\";\n"]}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ export { CombinedAutocompleteProvider, } from "./autocomplete.js";
2
+ export { Box } from "./components/box.js";
3
+ export { CancellableLoader } from "./components/cancellable-loader.js";
4
+ export { Editor } from "./components/editor.js";
5
+ export { Image } from "./components/image.js";
6
+ export { Input } from "./components/input.js";
7
+ export { Loader } from "./components/loader.js";
8
+ export { Markdown } from "./components/markdown.js";
9
+ export { SelectList, } from "./components/select-list.js";
10
+ export { SettingsList } from "./components/settings-list.js";
11
+ export { Spacer } from "./components/spacer.js";
12
+ export { Text } from "./components/text.js";
13
+ export { TruncatedText } from "./components/truncated-text.js";
14
+ export { clippedFullscreenDockHeight, FULLSCREEN_MIN_TRANSCRIPT_ROWS, FullscreenViewport, } from "./fullscreen.js";
15
+ export { fuzzyFilter, fuzzyFilterScored, fuzzyMatch } from "./fuzzy.js";
16
+ export { getKeybindings, KeybindingsManager, setKeybindings, TUI_KEYBINDINGS, } from "./keybindings.js";
17
+ export { decodeKittyPrintable, isKeyRelease, isKeyRepeat, isKittyProtocolActive, Key, matchesKey, parseKey, setKittyProtocolActive, } from "./keys.js";
18
+ export { latexToUnicode } from "./latex.js";
19
+ export { isMouseSequence, isWheelDown, isWheelUp, MOUSE_WHEEL_DOWN, MOUSE_WHEEL_UP, parseSgrMouseEvent, } from "./mouse.js";
20
+ export { VersionedRenderCache } from "./render-cache.js";
21
+ export { StdinBuffer } from "./stdin-buffer.js";
22
+ export { ProcessTerminal } from "./terminal.js";
23
+ export { bestAnsiColor, blendColor, clearDefaultTerminalColors, detectBackgroundFromColorFgBg, getDefaultTerminalColors, getTerminalBackgroundKind, isLightColor, onDefaultTerminalColorsChange, parseOscColorResponse, QUERY_DEFAULT_BACKGROUND, QUERY_DEFAULT_FOREGROUND, rgbTo256, rgbToHex, setDefaultTerminalColors, } from "./terminal-colors.js";
24
+ export { allocateImageId, calculateImageRows, deleteAllKittyImages, deleteKittyImage, detectCapabilities, encodeITerm2, encodeKitty, getCapabilities, getCellDimensions, getGifDimensions, getImageDimensions, getJpegDimensions, getPngDimensions, getWebpDimensions, hyperlink, imageFallback, renderImage, resetCapabilitiesCache, setCapabilities, setCellDimensions, } from "./terminal-image.js";
25
+ export { Container, CURSOR_MARKER, isFocusable, TUI, } from "./tui.js";
26
+ export { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "./utils.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAwC,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,KAAK,EAAsC,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAA+B,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAyB,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAEN,UAAU,GAIV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAoB,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACN,2BAA2B,EAC3B,8BAA8B,EAC9B,kBAAkB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAmB,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAC1G,OAAO,EACN,cAAc,EAOd,kBAAkB,EAClB,cAAc,EACd,eAAe,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,GAAG,EAGH,UAAU,EACV,QAAQ,EACR,sBAAsB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACN,eAAe,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EAEd,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAqD,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAAE,eAAe,EAA2C,MAAM,eAAe,CAAC;AACzF,OAAO,EACN,aAAa,EACb,UAAU,EACV,0BAA0B,EAE1B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EAGZ,6BAA6B,EAC7B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EAExB,QAAQ,EACR,QAAQ,EACR,wBAAwB,GAGxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,eAAe,EAEf,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EAIT,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,SAAS,EACT,aAAa,EAGb,WAAW,EAMX,GAAG,GAEH,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\nexport { Box } from \"./components/box.js\";\nexport { CancellableLoader } from \"./components/cancellable-loader.js\";\nexport { Editor, type EditorOptions, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader, type LoaderIndicatorOptions } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport {\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SelectListTheme,\n\ttype SelectListTruncatePrimaryContext,\n} from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\nexport type { EditorComponent, EditorPasteSnapshot } from \"./editor-component.js\";\nexport {\n\tclippedFullscreenDockHeight,\n\tFULLSCREEN_MIN_TRANSCRIPT_ROWS,\n\tFullscreenViewport,\n\ttype ScrollInfo,\n} from \"./fullscreen.js\";\nexport { type FuzzyMatch, fuzzyFilter, fuzzyFilterScored, fuzzyMatch, type ScoredItem } from \"./fuzzy.js\";\nexport {\n\tgetKeybindings,\n\ttype Keybinding,\n\ttype KeybindingConflict,\n\ttype KeybindingDefinition,\n\ttype KeybindingDefinitions,\n\ttype Keybindings,\n\ttype KeybindingsConfig,\n\tKeybindingsManager,\n\tsetKeybindings,\n\tTUI_KEYBINDINGS,\n} from \"./keybindings.js\";\nexport {\n\tdecodeKittyPrintable,\n\tisKeyRelease,\n\tisKeyRepeat,\n\tisKittyProtocolActive,\n\tKey,\n\ttype KeyEventType,\n\ttype KeyId,\n\tmatchesKey,\n\tparseKey,\n\tsetKittyProtocolActive,\n} from \"./keys.js\";\nexport { latexToUnicode } from \"./latex.js\";\nexport {\n\tisMouseSequence,\n\tisWheelDown,\n\tisWheelUp,\n\tMOUSE_WHEEL_DOWN,\n\tMOUSE_WHEEL_UP,\n\ttype MouseEvent,\n\tparseSgrMouseEvent,\n} from \"./mouse.js\";\nexport { VersionedRenderCache } from \"./render-cache.js\";\nexport type { TableCellSelectionRegion } from \"./selection-metadata.js\";\nexport { StdinBuffer, type StdinBufferEventMap, type StdinBufferOptions } from \"./stdin-buffer.js\";\nexport { ProcessTerminal, type Terminal, type TerminalStopOptions } from \"./terminal.js\";\nexport {\n\tbestAnsiColor,\n\tblendColor,\n\tclearDefaultTerminalColors,\n\ttype DefaultTerminalColors,\n\tdetectBackgroundFromColorFgBg,\n\tgetDefaultTerminalColors,\n\tgetTerminalBackgroundKind,\n\tisLightColor,\n\ttype OscColorKind,\n\ttype OscColorResponse,\n\tonDefaultTerminalColorsChange,\n\tparseOscColorResponse,\n\tQUERY_DEFAULT_BACKGROUND,\n\tQUERY_DEFAULT_FOREGROUND,\n\ttype Rgb,\n\trgbTo256,\n\trgbToHex,\n\tsetDefaultTerminalColors,\n\ttype TerminalBackgroundKind,\n\ttype TerminalColorMode,\n} from \"./terminal-colors.js\";\nexport {\n\tallocateImageId,\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdeleteAllKittyImages,\n\tdeleteKittyImage,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\thyperlink,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCapabilities,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport {\n\ttype Component,\n\tContainer,\n\tCURSOR_MARKER,\n\ttype Focusable,\n\ttype FullscreenOptions,\n\tisFocusable,\n\ttype OverlayAnchor,\n\ttype OverlayHandle,\n\ttype OverlayMargin,\n\ttype OverlayOptions,\n\ttype SizeValue,\n\tTUI,\n\ttype TuiStopOptions,\n} from \"./tui.js\";\nexport { truncateToWidth, visibleWidth, wrapTextWithAnsi } from \"./utils.js\";\n"]}
@@ -0,0 +1,239 @@
1
+ import { type KeyId } from "./keys.js";
2
+ /**
3
+ * Global keybinding registry.
4
+ * Downstream packages can add keybindings via declaration merging.
5
+ */
6
+ export interface Keybindings {
7
+ "tui.editor.cursorUp": true;
8
+ "tui.editor.cursorDown": true;
9
+ "tui.editor.cursorLeft": true;
10
+ "tui.editor.cursorRight": true;
11
+ "tui.editor.cursorWordLeft": true;
12
+ "tui.editor.cursorWordRight": true;
13
+ "tui.editor.cursorLineStart": true;
14
+ "tui.editor.cursorLineEnd": true;
15
+ "tui.editor.jumpForward": true;
16
+ "tui.editor.jumpBackward": true;
17
+ "tui.editor.pageUp": true;
18
+ "tui.editor.pageDown": true;
19
+ "tui.editor.deleteCharBackward": true;
20
+ "tui.editor.deleteCharForward": true;
21
+ "tui.editor.deleteWordBackward": true;
22
+ "tui.editor.deleteWordForward": true;
23
+ "tui.editor.deleteToLineStart": true;
24
+ "tui.editor.deleteToLineEnd": true;
25
+ "tui.editor.yank": true;
26
+ "tui.editor.yankPop": true;
27
+ "tui.editor.undo": true;
28
+ "tui.input.newLine": true;
29
+ "tui.input.submit": true;
30
+ "tui.input.tab": true;
31
+ "tui.input.copy": true;
32
+ "tui.viewport.pageUp": true;
33
+ "tui.viewport.pageDown": true;
34
+ "tui.viewport.top": true;
35
+ "tui.viewport.follow": true;
36
+ "tui.select.up": true;
37
+ "tui.select.down": true;
38
+ "tui.select.pageUp": true;
39
+ "tui.select.pageDown": true;
40
+ "tui.select.confirm": true;
41
+ "tui.select.cancel": true;
42
+ }
43
+ export type Keybinding = keyof Keybindings;
44
+ export interface KeybindingDefinition {
45
+ defaultKeys: KeyId | KeyId[];
46
+ description?: string;
47
+ defaultKeyScope?: string;
48
+ }
49
+ export type KeybindingDefinitions = Record<string, KeybindingDefinition>;
50
+ export type KeybindingsConfig = Record<string, KeyId | KeyId[] | undefined>;
51
+ export declare const TUI_KEYBINDINGS: {
52
+ readonly "tui.editor.cursorUp": {
53
+ readonly defaultKeys: "up";
54
+ readonly description: "Move cursor up";
55
+ readonly defaultKeyScope: "editor";
56
+ };
57
+ readonly "tui.editor.cursorDown": {
58
+ readonly defaultKeys: "down";
59
+ readonly description: "Move cursor down";
60
+ readonly defaultKeyScope: "editor";
61
+ };
62
+ readonly "tui.editor.cursorLeft": {
63
+ readonly defaultKeys: ["left", "ctrl+b"];
64
+ readonly description: "Move cursor left";
65
+ readonly defaultKeyScope: "editor";
66
+ };
67
+ readonly "tui.editor.cursorRight": {
68
+ readonly defaultKeys: ["right", "ctrl+f"];
69
+ readonly description: "Move cursor right";
70
+ readonly defaultKeyScope: "editor";
71
+ };
72
+ readonly "tui.editor.cursorWordLeft": {
73
+ readonly defaultKeys: ["alt+left", "ctrl+left", "alt+b"];
74
+ readonly description: "Move cursor word left";
75
+ readonly defaultKeyScope: "editor";
76
+ };
77
+ readonly "tui.editor.cursorWordRight": {
78
+ readonly defaultKeys: ["alt+right", "ctrl+right", "alt+f"];
79
+ readonly description: "Move cursor word right";
80
+ readonly defaultKeyScope: "editor";
81
+ };
82
+ readonly "tui.editor.cursorLineStart": {
83
+ readonly defaultKeys: ["home", "ctrl+a"];
84
+ readonly description: "Move to line start";
85
+ readonly defaultKeyScope: "editor";
86
+ };
87
+ readonly "tui.editor.cursorLineEnd": {
88
+ readonly defaultKeys: ["end", "ctrl+e"];
89
+ readonly description: "Move to line end";
90
+ readonly defaultKeyScope: "editor";
91
+ };
92
+ readonly "tui.editor.jumpForward": {
93
+ readonly defaultKeys: "ctrl+]";
94
+ readonly description: "Jump forward to character";
95
+ readonly defaultKeyScope: "editor";
96
+ };
97
+ readonly "tui.editor.jumpBackward": {
98
+ readonly defaultKeys: "ctrl+alt+]";
99
+ readonly description: "Jump backward to character";
100
+ readonly defaultKeyScope: "editor";
101
+ };
102
+ readonly "tui.editor.pageUp": {
103
+ readonly defaultKeys: "pageUp";
104
+ readonly description: "Page up";
105
+ readonly defaultKeyScope: "editor";
106
+ };
107
+ readonly "tui.editor.pageDown": {
108
+ readonly defaultKeys: "pageDown";
109
+ readonly description: "Page down";
110
+ readonly defaultKeyScope: "editor";
111
+ };
112
+ readonly "tui.editor.deleteCharBackward": {
113
+ readonly defaultKeys: "backspace";
114
+ readonly description: "Delete character backward";
115
+ readonly defaultKeyScope: "editor";
116
+ };
117
+ readonly "tui.editor.deleteCharForward": {
118
+ readonly defaultKeys: ["delete", "ctrl+d"];
119
+ readonly description: "Delete character forward";
120
+ readonly defaultKeyScope: "editor";
121
+ };
122
+ readonly "tui.editor.deleteWordBackward": {
123
+ readonly defaultKeys: ["ctrl+w", "alt+backspace"];
124
+ readonly description: "Delete word backward";
125
+ readonly defaultKeyScope: "editor";
126
+ };
127
+ readonly "tui.editor.deleteWordForward": {
128
+ readonly defaultKeys: ["alt+d", "alt+delete"];
129
+ readonly description: "Delete word forward";
130
+ readonly defaultKeyScope: "editor";
131
+ };
132
+ readonly "tui.editor.deleteToLineStart": {
133
+ readonly defaultKeys: "ctrl+u";
134
+ readonly description: "Delete to line start";
135
+ readonly defaultKeyScope: "editor";
136
+ };
137
+ readonly "tui.editor.deleteToLineEnd": {
138
+ readonly defaultKeys: "ctrl+k";
139
+ readonly description: "Delete to line end";
140
+ readonly defaultKeyScope: "editor";
141
+ };
142
+ readonly "tui.editor.yank": {
143
+ readonly defaultKeys: "ctrl+y";
144
+ readonly description: "Yank";
145
+ readonly defaultKeyScope: "editor";
146
+ };
147
+ readonly "tui.editor.yankPop": {
148
+ readonly defaultKeys: "alt+y";
149
+ readonly description: "Yank pop";
150
+ readonly defaultKeyScope: "editor";
151
+ };
152
+ readonly "tui.editor.undo": {
153
+ readonly defaultKeys: "ctrl+-";
154
+ readonly description: "Undo";
155
+ readonly defaultKeyScope: "editor";
156
+ };
157
+ readonly "tui.input.newLine": {
158
+ readonly defaultKeys: "shift+enter";
159
+ readonly description: "Insert newline";
160
+ readonly defaultKeyScope: "editor";
161
+ };
162
+ readonly "tui.input.submit": {
163
+ readonly defaultKeys: "enter";
164
+ readonly description: "Submit input";
165
+ readonly defaultKeyScope: "editor";
166
+ };
167
+ readonly "tui.input.tab": {
168
+ readonly defaultKeys: "tab";
169
+ readonly description: "Tab / autocomplete";
170
+ readonly defaultKeyScope: "editor";
171
+ };
172
+ readonly "tui.input.copy": {
173
+ readonly defaultKeys: "ctrl+c";
174
+ readonly description: "Copy selection";
175
+ readonly defaultKeyScope: "editor";
176
+ };
177
+ readonly "tui.viewport.pageUp": {
178
+ readonly defaultKeys: "pageUp";
179
+ readonly description: "Scroll transcript up a page (fullscreen)";
180
+ };
181
+ readonly "tui.viewport.pageDown": {
182
+ readonly defaultKeys: "pageDown";
183
+ readonly description: "Scroll transcript down a page (fullscreen)";
184
+ };
185
+ readonly "tui.viewport.top": {
186
+ readonly defaultKeys: "shift+alt+up";
187
+ readonly description: "Scroll transcript to top (fullscreen)";
188
+ };
189
+ readonly "tui.viewport.follow": {
190
+ readonly defaultKeys: "ctrl+shift+down";
191
+ readonly description: "Scroll to bottom and follow output (fullscreen)";
192
+ };
193
+ readonly "tui.select.up": {
194
+ readonly defaultKeys: "up";
195
+ readonly description: "Move selection up";
196
+ };
197
+ readonly "tui.select.down": {
198
+ readonly defaultKeys: "down";
199
+ readonly description: "Move selection down";
200
+ };
201
+ readonly "tui.select.pageUp": {
202
+ readonly defaultKeys: "pageUp";
203
+ readonly description: "Selection page up";
204
+ };
205
+ readonly "tui.select.pageDown": {
206
+ readonly defaultKeys: "pageDown";
207
+ readonly description: "Selection page down";
208
+ };
209
+ readonly "tui.select.confirm": {
210
+ readonly defaultKeys: "enter";
211
+ readonly description: "Confirm selection";
212
+ };
213
+ readonly "tui.select.cancel": {
214
+ readonly defaultKeys: ["escape", "ctrl+c"];
215
+ readonly description: "Cancel selection";
216
+ };
217
+ };
218
+ export interface KeybindingConflict {
219
+ key: KeyId;
220
+ keybindings: string[];
221
+ }
222
+ export declare class KeybindingsManager {
223
+ private definitions;
224
+ private userBindings;
225
+ private keysById;
226
+ private conflicts;
227
+ constructor(definitions: KeybindingDefinitions, userBindings?: KeybindingsConfig);
228
+ private rebuild;
229
+ matches(data: string, keybinding: Keybinding): boolean;
230
+ getKeys(keybinding: Keybinding): KeyId[];
231
+ getDefinition(keybinding: Keybinding): KeybindingDefinition;
232
+ getConflicts(): KeybindingConflict[];
233
+ setUserBindings(userBindings: KeybindingsConfig): void;
234
+ getUserBindings(): KeybindingsConfig;
235
+ getResolvedBindings(): KeybindingsConfig;
236
+ }
237
+ export declare function setKeybindings(keybindings: KeybindingsManager): void;
238
+ export declare function getKeybindings(): KeybindingsManager;
239
+ //# sourceMappingURL=keybindings.d.ts.map