silvery 0.19.1 → 0.21.0

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 (218) hide show
  1. package/README.md +9 -4
  2. package/dist/Text-Lq0dmj8-.mjs +239 -0
  3. package/dist/Text-Lq0dmj8-.mjs.map +1 -0
  4. package/dist/UPNG-Bo33r8rA.mjs +3 -0
  5. package/dist/UPNG-DosRPdF4.mjs +5075 -0
  6. package/dist/UPNG-DosRPdF4.mjs.map +1 -0
  7. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +6 -0
  8. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +1 -0
  9. package/dist/{animation-Cn64yepo.mjs → animation-ZMN2_XKv.mjs} +2 -2
  10. package/dist/animation-ZMN2_XKv.mjs.map +1 -0
  11. package/dist/{ansi-Cc33mW54.d.mts → ansi-2Xn0yatP.d.mts} +1 -1
  12. package/dist/{ansi-Cc33mW54.d.mts.map → ansi-2Xn0yatP.d.mts.map} +1 -1
  13. package/dist/{ansi-CLOitHKx.mjs → ansi-D1KQMAbf.mjs} +1 -1
  14. package/dist/{ansi-CLOitHKx.mjs.map → ansi-D1KQMAbf.mjs.map} +1 -1
  15. package/dist/ansi-yC4RyBNY.mjs +22441 -0
  16. package/dist/ansi-yC4RyBNY.mjs.map +1 -0
  17. package/dist/apng-CR08rIaH.mjs +58 -0
  18. package/dist/apng-CR08rIaH.mjs.map +1 -0
  19. package/dist/apng-DaHfVaVI.mjs +3 -0
  20. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  21. package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
  22. package/dist/backend-B-WYLUib.mjs +13396 -0
  23. package/dist/backend-B-WYLUib.mjs.map +1 -0
  24. package/dist/backends-CUtan80W.mjs +3 -0
  25. package/dist/backends-DIVYzKqd.mjs +1083 -0
  26. package/dist/backends-DIVYzKqd.mjs.map +1 -0
  27. package/dist/bound-term-0sPrrzH1.d.mts +4640 -0
  28. package/dist/bound-term-0sPrrzH1.d.mts.map +1 -0
  29. package/dist/canvas-1v7dPT-_.mjs +3 -0
  30. package/dist/canvas-CSuPOMNt.mjs +1442 -0
  31. package/dist/canvas-CSuPOMNt.mjs.map +1 -0
  32. package/dist/{chunk-Vs_PY4HZ.mjs → chunk-BSw8zbkd.mjs} +1 -1
  33. package/dist/cli-dvo0r2fs.mjs +4 -0
  34. package/dist/compare-CQodSH4G.mjs +376 -0
  35. package/dist/compare-CQodSH4G.mjs.map +1 -0
  36. package/dist/compare-DHlcxEYA.mjs +3 -0
  37. package/dist/context-BU5LkkIy.mjs.map +1 -1
  38. package/dist/devtools-CJdt5H0X.mjs +2 -0
  39. package/dist/{devtools-DxkSLXDA.mjs → devtools-DcQjgyjL.mjs} +5 -4
  40. package/dist/{devtools-DxkSLXDA.mjs.map → devtools-DcQjgyjL.mjs.map} +1 -1
  41. package/dist/easing-BI-ASGMO.d.mts +24 -0
  42. package/dist/easing-BI-ASGMO.d.mts.map +1 -0
  43. package/dist/{eta-Bb3RH3wh.mjs → eta-CJlGH06n.mjs} +1 -1
  44. package/dist/{eta-Bb3RH3wh.mjs.map → eta-CJlGH06n.mjs.map} +1 -1
  45. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs +306 -0
  46. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs.map +1 -0
  47. package/dist/{flexily-zero-adapter-CMxXhdOL.mjs → flexily-zero-adapter-C4lW_Ov5.mjs} +1 -1
  48. package/dist/fonts-BFmhXDv7.mjs +88 -0
  49. package/dist/fonts-BFmhXDv7.mjs.map +1 -0
  50. package/dist/gif-C_AjaT9d.mjs +188 -0
  51. package/dist/gif-C_AjaT9d.mjs.map +1 -0
  52. package/dist/gif-DaC4XrxA.mjs +3 -0
  53. package/dist/gifenc-BOUT-KFB.mjs +730 -0
  54. package/dist/gifenc-BOUT-KFB.mjs.map +1 -0
  55. package/dist/image-C2Birh2x.mjs +1252 -0
  56. package/dist/image-C2Birh2x.mjs.map +1 -0
  57. package/dist/index-BUMxS65f.d.mts +453 -0
  58. package/dist/index-BUMxS65f.d.mts.map +1 -0
  59. package/dist/{index-D3saHouR.d.mts → index-CSQf13CI.d.mts} +1057 -1133
  60. package/dist/index-CSQf13CI.d.mts.map +1 -0
  61. package/dist/{index-BXslOebb.d.mts → index-Cl9KKjQ_.d.mts} +4919 -3921
  62. package/dist/index-Cl9KKjQ_.d.mts.map +1 -0
  63. package/dist/index-XbNrPhWl.d.mts +336 -0
  64. package/dist/index-XbNrPhWl.d.mts.map +1 -0
  65. package/dist/index.d.mts +8 -5
  66. package/dist/index.d.mts.map +1 -1
  67. package/dist/index.mjs +14 -12
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/key-mapping-CS-YD_cD.mjs +132 -0
  70. package/dist/key-mapping-CS-YD_cD.mjs.map +1 -0
  71. package/dist/key-mapping-Yn-Jgrij.mjs +3 -0
  72. package/dist/{layout-engine-B6Cdz1yZ.mjs → layout-engine-C07LEXWT.mjs} +1 -1
  73. package/dist/layout-engine-C2px0RJE.mjs +67 -0
  74. package/dist/layout-engine-C2px0RJE.mjs.map +1 -0
  75. package/dist/layout-signals-Cnw6xk8Q.mjs +988 -0
  76. package/dist/layout-signals-Cnw6xk8Q.mjs.map +1 -0
  77. package/dist/mouse-events-Dki3ISIp.mjs +1044 -0
  78. package/dist/mouse-events-Dki3ISIp.mjs.map +1 -0
  79. package/dist/{multi-progress-Bq9Oi_WI.mjs → multi-progress-CIRjrzma.mjs} +3 -3
  80. package/dist/{multi-progress-Bq9Oi_WI.mjs.map → multi-progress-CIRjrzma.mjs.map} +1 -1
  81. package/dist/{multi-progress-DAQC7eap.d.mts → multi-progress-DHZ2xUT2.d.mts} +2 -2
  82. package/dist/{multi-progress-DAQC7eap.d.mts.map → multi-progress-DHZ2xUT2.d.mts.map} +1 -1
  83. package/dist/{node-BeWlnCPY.mjs → node-CjM5Rt-M.mjs} +4 -4
  84. package/dist/node-CjM5Rt-M.mjs.map +1 -0
  85. package/dist/playwright-D5YiZcNS.mjs +76397 -0
  86. package/dist/playwright-D5YiZcNS.mjs.map +1 -0
  87. package/dist/png-codec-Dp84742B.mjs +36 -0
  88. package/dist/png-codec-Dp84742B.mjs.map +1 -0
  89. package/dist/png-codec-QwOtJ8Zs.mjs +3 -0
  90. package/dist/progress-DB_Xo071.mjs +675 -0
  91. package/dist/progress-DB_Xo071.mjs.map +1 -0
  92. package/dist/{progress-bar-CXE5Qfkd.mjs → progress-bar-oJwq22CR.mjs} +4 -4
  93. package/dist/{progress-bar-CXE5Qfkd.mjs.map → progress-bar-oJwq22CR.mjs.map} +1 -1
  94. package/dist/rasterizer-BRXrDdWx.mjs +3 -0
  95. package/dist/rasterizer-CpEhJvdR.mjs +296 -0
  96. package/dist/rasterizer-CpEhJvdR.mjs.map +1 -0
  97. package/dist/reconciler-DldIJB93.mjs +2083 -0
  98. package/dist/reconciler-DldIJB93.mjs.map +1 -0
  99. package/dist/{render-string-0mN37DLf.mjs → render-string-BcoCpjCB.mjs} +1 -1
  100. package/dist/{render-string-X-CxpTdZ.mjs → render-string-DkQacASz.mjs} +2728 -555
  101. package/dist/render-string-DkQacASz.mjs.map +1 -0
  102. package/dist/resvg-js-DkOndZI3.mjs +203 -0
  103. package/dist/resvg-js-DkOndZI3.mjs.map +1 -0
  104. package/dist/runtime.d.mts +3 -2
  105. package/dist/runtime.mjs +3 -3
  106. package/dist/schemes-JjNp4aSl.mjs +2611 -0
  107. package/dist/schemes-JjNp4aSl.mjs.map +1 -0
  108. package/dist/{spinner-CGo34vyR.d.mts → spinner-CZINHpkV.d.mts} +2 -2
  109. package/dist/{spinner-CGo34vyR.d.mts.map → spinner-CZINHpkV.d.mts.map} +1 -1
  110. package/dist/{spinner-CeOmcuw_.mjs → spinner-D9lrHr8s.mjs} +7 -7
  111. package/dist/spinner-D9lrHr8s.mjs.map +1 -0
  112. package/dist/src-5w9QR6_8.mjs +1071 -0
  113. package/dist/src-5w9QR6_8.mjs.map +1 -0
  114. package/dist/src-BNTToU7l.mjs +4387 -0
  115. package/dist/src-BNTToU7l.mjs.map +1 -0
  116. package/dist/{src-Bd7ezSgG.mjs → src-BR4xNwdG.mjs} +10436 -2622
  117. package/dist/src-BR4xNwdG.mjs.map +1 -0
  118. package/dist/{types-Bk2yw9Qj.mjs → src-DKp-_OFG.mjs} +34 -94
  119. package/dist/src-DKp-_OFG.mjs.map +1 -0
  120. package/dist/src-bt8wSrfJ.mjs +258 -0
  121. package/dist/src-bt8wSrfJ.mjs.map +1 -0
  122. package/dist/src-e33Y6kNJ.mjs +3 -0
  123. package/dist/src-iDwu25UD.mjs +1814 -0
  124. package/dist/src-iDwu25UD.mjs.map +1 -0
  125. package/dist/steps-Bp2uNqnn.d.mts +202 -0
  126. package/dist/steps-Bp2uNqnn.d.mts.map +1 -0
  127. package/dist/svg-15lZZzxq.mjs +486 -0
  128. package/dist/svg-15lZZzxq.mjs.map +1 -0
  129. package/dist/svg-Cz0UXcDj.mjs +255 -0
  130. package/dist/svg-Cz0UXcDj.mjs.map +1 -0
  131. package/dist/svg-DY72a4HK.mjs +3 -0
  132. package/dist/svg-g1D6ErwR.d.mts +82 -0
  133. package/dist/svg-g1D6ErwR.d.mts.map +1 -0
  134. package/dist/term.d.mts +3 -0
  135. package/dist/term.mjs +9 -0
  136. package/dist/term.mjs.map +1 -0
  137. package/dist/theme.d.mts +95 -2
  138. package/dist/theme.d.mts.map +1 -0
  139. package/dist/theme.mjs +9 -3
  140. package/dist/theme.mjs.map +1 -0
  141. package/dist/{types-BH_v3iMT.d.mts → types-kt_fKR37.d.mts} +2 -15
  142. package/dist/types-kt_fKR37.d.mts.map +1 -0
  143. package/dist/ui/animation.d.mts +2 -1
  144. package/dist/ui/animation.mjs +1 -1
  145. package/dist/ui/ansi.d.mts +1 -1
  146. package/dist/ui/ansi.mjs +1 -1
  147. package/dist/ui/cli.d.mts +3 -3
  148. package/dist/ui/cli.mjs +5 -5
  149. package/dist/ui/display.d.mts +1 -1
  150. package/dist/ui/image.d.mts +2 -2
  151. package/dist/ui/image.mjs +2 -2
  152. package/dist/ui/input.d.mts +1 -1
  153. package/dist/ui/input.mjs +4 -2
  154. package/dist/ui/input.mjs.map +1 -1
  155. package/dist/ui/progress.d.mts +5 -249
  156. package/dist/ui/progress.mjs +5 -858
  157. package/dist/ui/react.d.mts +1 -1
  158. package/dist/ui/react.mjs +2 -2
  159. package/dist/ui/recording-chrome-react.d.mts +21 -0
  160. package/dist/ui/recording-chrome-react.d.mts.map +1 -0
  161. package/dist/ui/recording-chrome-react.mjs +105 -0
  162. package/dist/ui/recording-chrome-react.mjs.map +1 -0
  163. package/dist/ui/recording-chrome.d.mts +2 -0
  164. package/dist/ui/recording-chrome.mjs +2 -0
  165. package/dist/ui/utils.mjs +1 -1
  166. package/dist/ui/wrappers.d.mts +3 -3
  167. package/dist/ui/wrappers.mjs +2 -2
  168. package/dist/ui.d.mts +7 -6
  169. package/dist/ui.mjs +8 -7
  170. package/dist/{useLatest-Bg2x4bfP.d.mts → useLatest-DRDDVwjh.d.mts} +5 -25
  171. package/dist/useLatest-DRDDVwjh.d.mts.map +1 -0
  172. package/dist/{with-text-input-CRfoiFFG.d.mts → with-text-input-YeohVLeo.d.mts} +4 -55
  173. package/dist/with-text-input-YeohVLeo.d.mts.map +1 -0
  174. package/dist/wrapper-C70ATkVv.mjs +3527 -0
  175. package/dist/wrapper-C70ATkVv.mjs.map +1 -0
  176. package/dist/{wrappers-UTADQkSY.mjs → wrappers-BCUYITrY.mjs} +5 -157
  177. package/dist/wrappers-BCUYITrY.mjs.map +1 -0
  178. package/dist/{yoga-adapter-8oRGRw8V.mjs → yoga-adapter-BnZX1PAY.mjs} +28 -2
  179. package/dist/yoga-adapter-BnZX1PAY.mjs.map +1 -0
  180. package/dist/yoga-adapter-DxgsQ_gg.mjs +2 -0
  181. package/dist/zipBundle-3nqeDRtm.mjs +3 -0
  182. package/dist/zipBundle-VNAYFmqJ.mjs +2003 -0
  183. package/dist/zipBundle-VNAYFmqJ.mjs.map +1 -0
  184. package/package.json +20 -9
  185. package/dist/animation-Cn64yepo.mjs.map +0 -1
  186. package/dist/cli-BKp0YtBD.mjs +0 -4
  187. package/dist/devtools-9QY4teqI.mjs +0 -2
  188. package/dist/flexily-zero-adapter-BlQa46nr.mjs +0 -3385
  189. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +0 -1
  190. package/dist/image-CTII5QWI.mjs +0 -477
  191. package/dist/image-CTII5QWI.mjs.map +0 -1
  192. package/dist/index-BXslOebb.d.mts.map +0 -1
  193. package/dist/index-BnA7mNpo.d.mts +0 -175
  194. package/dist/index-BnA7mNpo.d.mts.map +0 -1
  195. package/dist/index-D3saHouR.d.mts.map +0 -1
  196. package/dist/layout-engine-ClUgv6jB.mjs +0 -50
  197. package/dist/layout-engine-ClUgv6jB.mjs.map +0 -1
  198. package/dist/node-BeWlnCPY.mjs.map +0 -1
  199. package/dist/reconciler-Cwgm8hRR.mjs +0 -8459
  200. package/dist/reconciler-Cwgm8hRR.mjs.map +0 -1
  201. package/dist/render-string-X-CxpTdZ.mjs.map +0 -1
  202. package/dist/spinner-CeOmcuw_.mjs.map +0 -1
  203. package/dist/src-B5GjfG7g.mjs +0 -4305
  204. package/dist/src-B5GjfG7g.mjs.map +0 -1
  205. package/dist/src-Bd7ezSgG.mjs.map +0 -1
  206. package/dist/src-CChwjk0Z.mjs +0 -738
  207. package/dist/src-CChwjk0Z.mjs.map +0 -1
  208. package/dist/src-NCKb8kE5.mjs +0 -2660
  209. package/dist/src-NCKb8kE5.mjs.map +0 -1
  210. package/dist/types-BH_v3iMT.d.mts.map +0 -1
  211. package/dist/types-Bk2yw9Qj.mjs.map +0 -1
  212. package/dist/ui/progress.d.mts.map +0 -1
  213. package/dist/ui/progress.mjs.map +0 -1
  214. package/dist/useLatest-Bg2x4bfP.d.mts.map +0 -1
  215. package/dist/with-text-input-CRfoiFFG.d.mts.map +0 -1
  216. package/dist/wrappers-UTADQkSY.mjs.map +0 -1
  217. package/dist/yoga-adapter-8oRGRw8V.mjs.map +0 -1
  218. package/dist/yoga-adapter-D_CcxSt5.mjs +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ansi-yC4RyBNY.mjs","names":["log","splitRawInput","ST","stripAnsi","parseSvgDimensions","formatRgb","formatRgb","diffBuffers","composeSideBySide","composeDiff","escapeXml","BLANK_CELL","buildPalette256","PALETTE_256","Terminal","Unicode11Addon","DEFAULT_COLS","DEFAULT_ROWS","xterm","writeSync","Unicode11Addon","xtermPkg","log","DEBUG_OUTPUT","reusableCellStyle","styleTransition","wrapTextSizing","log","cellVisualEquals","CSI","log","safeJsonStringify","log","enableBracketedPaste","disableBracketedPaste","splitRawInput","_createTerm"],"sources":["../packages/ag/src/keys.ts","../packages/ag-term/src/ansi/sgr-codes.ts","../packages/ag-term/src/buffer.ts","../packages/ag-term/src/text-sizing.ts","../packages/ag-term/src/unicode.ts","../packages/ag-term/src/errors.ts","../../termless/src/terminal/types.ts","../../termless/src/render/index.ts","../../termless/src/view/viewer.ts","../../termless/src/recording/recording.ts","../../termless/src/recording/frame-trace-recording.ts","../../termless/src/recording/native/zip-archive.ts","../../termless/src/recording/native/native-rec.ts","../../termless/src/recording/frame-trace.ts","../../termless/src/recording/load-visual-trace.ts","../../termless/src/recording/write-visual-trace.ts","../../termless/src/view/animated-svg.ts","../../termless/src/view/from-recording.ts","../../termless/src/view/animation.ts","../../termless/src/view.ts","../../termless/src/view/slideshow.ts","../../termless/src/assertions.ts","../../termless/src/jest-matchers.ts","../../termless/src/terminal/diff.ts","../../termless/src/recording/visual-snapshot.ts","../../termless/src/terminal/timer.ts","../../termless/src/recording/tape/parser.ts","../../termless/src/recording/tape/themes.ts","../../termless/src/recording/tape/executor.ts","../../termless/src/recording/tape/compare.ts","../../termless/src/terminal/snapshot.ts","../../termless/src/recording/tape/compare-canvas.ts","../../termless/src/recording/tape/overlay.ts","../../termless/src/recording/tape/compile.ts","../../termless/src/recording/tape/codegen.ts","../../termless/src/recording/asciicast/reader.ts","../../termless/src/recording/asciicast/writer.ts","../../termless/src/recording/asciicast/recording-codec.ts","../../termless/src/index.ts","../../../node_modules/.bun/@xterm+headless@5.5.0/node_modules/@xterm/headless/lib-headless/xterm-headless.js","../../../node_modules/.bun/@xterm+addon-unicode11@0.9.0/node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js","../../termless/packages/xtermjs/src/backend.ts","../../termless/packages/xtermjs/src/viewport-adapter.ts","../../termless/packages/xtermjs/src/index.ts","../packages/ag-term/src/pipeline/output-verify.ts","../packages/ag-term/src/pipeline/diff-buffers.ts","../packages/ag-term/src/pipeline/output-density.ts","../packages/ag-term/src/pipeline/output-modes.ts","../packages/ag-term/src/pipeline/output-phase.ts","../packages/ag-term/src/ansi/detection.ts","../packages/ag-term/src/mouse.ts","../packages/ag-term/src/bracketed-paste.ts","../packages/ag-term/src/focus-reporting.ts","../packages/ag-term/src/runtime/input-owner.ts","../packages/ag-term/src/runtime/devices/console-router.ts","../packages/ag-term/src/runtime/devices/output.ts","../packages/ag-term/src/runtime/devices/size.ts","../packages/ag-term/src/runtime/devices/modes.ts","../packages/ag-term/src/runtime/devices/signals.ts","../packages/ag-term/src/runtime/devices/console.ts","../packages/ag-term/src/runtime/term-internal.ts","../packages/ag-term/src/ansi/term.ts","../packages/ag-term/src/ansi/utils.ts","../packages/ag-term/src/ansi/hyperlink.ts","../packages/ag-term/src/ansi/ansi.ts","../packages/ag-term/src/ansi/advanced-clipboard.ts","../packages/ag-term/src/ansi/index.ts"],"sourcesContent":["/**\n * Keyboard Constants and Utilities\n *\n * Single source of truth for all key parsing, mapping, and matching in silvery.\n *\n * ## Two-Layer Input Architecture\n *\n * parseKey() returns `[input, key]` where these serve DIFFERENT purposes:\n *\n * - `input` is **normalized for keybinding matching**. Shifted punctuation is\n * decomposed: '#' becomes input='3' with key.shift=true, so keybindings\n * like 'shift-3' can match. Uppercase letters become lowercase + shift.\n *\n * - `key.text` is the **actual typed character** (pre-normalization). For text\n * insertion, always use `key.text ?? input` — this ensures Shift+3 inserts\n * '#', opt+e inserts '´', and IME output inserts the composed string.\n *\n * Rule: keybinding resolution uses `input`. Text insertion uses `key.text`.\n * Never reconstruct characters from key codes — trust what the terminal sent.\n *\n * - KEY_MAP: Playwright key names -> ANSI sequences (for sending input)\n * - CODE_TO_KEY: ANSI escape suffixes -> key names (for parsing input)\n * - Key interface: structured key object with boolean flags\n * - parseKeypress(): raw terminal input -> ParsedKeypress\n * - parseKey(): raw terminal input -> [input, Key]\n * - keyToAnsi(): Playwright key string -> ANSI sequence\n * - keyToName(): Key object -> named key string\n * - keyToModifiers(): Key object -> modifier flags\n * - parseHotkey(): \"ctrl+shift+a\" -> ParsedHotkey\n * - matchHotkey(): match ParsedHotkey against Key\n *\n * @example\n * ```tsx\n * import { keyToAnsi } from '@silvery/test'\n *\n * // Convert key names to ANSI\n * keyToAnsi('Enter') // '\\r'\n * keyToAnsi('ArrowUp') // '\\x1b[A'\n * keyToAnsi('Control+c') // '\\x03'\n * keyToAnsi('a') // 'a'\n * ```\n */\n\nimport { createLogger } from \"loggily\"\n\nconst log = createLogger(\"silvery:keys\")\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Key object describing which special keys/modifiers were pressed.\n */\nexport interface Key {\n /** Up arrow key was pressed */\n upArrow: boolean\n /** Down arrow key was pressed */\n downArrow: boolean\n /** Left arrow key was pressed */\n leftArrow: boolean\n /** Right arrow key was pressed */\n rightArrow: boolean\n /** Page Down key was pressed */\n pageDown: boolean\n /** Page Up key was pressed */\n pageUp: boolean\n /** Home key was pressed */\n home: boolean\n /** End key was pressed */\n end: boolean\n /** Return (Enter) key was pressed */\n return: boolean\n /** Escape key was pressed */\n escape: boolean\n /** Ctrl key was pressed */\n ctrl: boolean\n /** Shift key was pressed */\n shift: boolean\n /** Tab key was pressed */\n tab: boolean\n /** Backspace key was pressed */\n backspace: boolean\n /** Delete key was pressed */\n delete: boolean\n /** Meta key (Alt/Option on macOS, Alt on other platforms) was pressed */\n meta: boolean\n /** Super key (Cmd on macOS, Win on Windows) was pressed. Requires Kitty protocol. */\n super: boolean\n /** Hyper key was pressed. Requires Kitty protocol. */\n hyper: boolean\n /** CapsLock is active. Requires Kitty protocol. */\n capsLock: boolean\n /** NumLock is active. Requires Kitty protocol. */\n numLock: boolean\n /** Kitty event type. Only set with Kitty flag 2 (report events). */\n eventType?: \"press\" | \"repeat\" | \"release\"\n /** The actual text character typed (pre-normalization). For text insertion,\n * use this instead of the normalized `input` which maps shifted chars to base keys. */\n text?: string\n /** True when the key is a modifier pressed alone (Shift, Ctrl, Alt, Super, Hyper, Meta).\n * Set during parsing for Kitty protocol modifier-only events. */\n isModifierOnly?: boolean\n /**\n * Internal Kitty key name (e.g. \"leftsuper\", \"rightcontrol\",\n * \"leftshift\") for modifier-only events. Surfaced so the modifier-state\n * tracker (`useModifierKeys`) can drop the matching flag on release —\n * Kitty release events keep the modifier bit set, so the bit alone\n * doesn't say which key was lifted.\n *\n * Optional + only set for modifier-only events to avoid bloating the\n * public surface for non-modifier keys (use the existing flag fields\n * `upArrow`, `escape`, etc. for those). Bead:\n * @km/silvery/keydown-keyup-test-primitives.\n */\n modifierName?: string\n}\n\n/**\n * Input handler callback type.\n * Return 'exit' to exit the app.\n */\nexport type InputHandler = (input: string, key: Key) => void | \"exit\"\n\n/**\n * Detect modifier-only key events (Cmd, Shift, Ctrl, Alt pressed alone).\n * With Kitty REPORT_ALL_KEYS, these fire as key events with empty input\n * and no actionable key flags — only modifier flags are set.\n *\n * The flag is set during parsing by `parseKey()`. This function checks it.\n * Shared by useInput (filters these out) and create-app (filters for app handlers).\n */\nexport function isModifierOnlyEvent(_input: string, key: Key): boolean {\n return key.isModifierOnly === true\n}\n\n/**\n * Parsed hotkey from a string like \"ctrl+shift+a\" or \"Control+ArrowUp\".\n */\nexport interface ParsedHotkey {\n key: string\n ctrl: boolean\n meta: boolean\n shift: boolean\n alt: boolean\n super: boolean\n hyper: boolean\n}\n\n// ============================================================================\n// Key -> ANSI Mapping (for sending input)\n// ============================================================================\n\n/**\n * Playwright-compatible key names -> ANSI sequences.\n * Keys that are modifier-only (Control, Shift, etc.) are null.\n */\nconst KEY_MAP: Record<string, string | null> = {\n // Navigation (Playwright names)\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowLeft: \"\\x1b[D\",\n ArrowRight: \"\\x1b[C\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n\n // Editing\n Enter: \"\\r\",\n Tab: \"\\t\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n Escape: \"\\x1b\",\n Space: \" \",\n\n // Modifiers (prefix only, not standalone sequences)\n Control: null,\n Shift: null,\n Alt: null,\n Meta: null,\n Super: null,\n Hyper: null,\n}\n\nconst MODIFIER_ALIASES: Record<string, string> = {\n ctrl: \"Control\",\n control: \"Control\",\n \"⌃\": \"Control\",\n shift: \"Shift\",\n \"⇧\": \"Shift\",\n alt: \"Alt\",\n meta: \"Meta\",\n opt: \"Alt\",\n option: \"Alt\",\n \"⌥\": \"Alt\",\n cmd: \"Super\",\n command: \"Super\",\n super: \"Super\",\n \"⌘\": \"Super\",\n hyper: \"Hyper\",\n \"✦\": \"Hyper\",\n}\n\n/** Modifier symbols that can be used as prefixes without + separator (e.g. ⌘J, ⌃⇧J) */\nconst MODIFIER_SYMBOLS = new Set([\"⌃\", \"⇧\", \"⌥\", \"⌘\", \"✦\"])\n\nfunction normalizeModifier(mod: string): string {\n return MODIFIER_ALIASES[mod.toLowerCase()] ?? mod\n}\n\n/**\n * Convert Playwright-style key string to ANSI sequence.\n *\n * Supports:\n * - Single characters: 'a', 'A', '1', etc.\n * - Named keys: 'Enter', 'ArrowUp', 'Escape', etc.\n * - Modifier combos: 'Control+c', 'Shift+Tab', 'Control+Shift+a'\n * - Lowercase modifier aliases: 'ctrl+c', 'shift+Tab', 'alt+x'\n *\n * @example\n * ```tsx\n * keyToAnsi('Enter') // '\\r'\n * keyToAnsi('ArrowUp') // '\\x1b[A'\n * keyToAnsi('Control+c') // '\\x03'\n * keyToAnsi('j') // 'j'\n * ```\n */\nexport function keyToAnsi(key: string): string {\n // Split on + for combos: 'Control+Shift+a' -> ['Control', 'Shift', 'a']\n const parts = key.split(\"+\")\n const mainKey = parts.pop()!\n // Normalize modifier aliases: ctrl->Control, shift->Shift, alt->Alt, meta->Meta\n const modifiers = parts.map(normalizeModifier)\n\n // Super/Hyper modifiers require Kitty keyboard protocol encoding\n // (standard ANSI cannot represent Cmd/Super)\n if (modifiers.includes(\"Super\") || modifiers.includes(\"Hyper\")) {\n return keyToKittyAnsi(key)\n }\n\n // Single char without modifiers\n if (!modifiers.length && mainKey.length === 1) {\n return mainKey\n }\n\n // Ctrl+letter -> control code (ASCII 1-26)\n if (modifiers.includes(\"Control\") && mainKey.length === 1) {\n const code = mainKey.toLowerCase().charCodeAt(0) - 96\n if (code >= 1 && code <= 26) return String.fromCharCode(code)\n }\n\n // Ctrl+/ -> \\x1f (Unit Separator, standard terminal convention)\n if (modifiers.includes(\"Control\") && mainKey === \"/\") {\n return \"\\x1f\"\n }\n\n // Ctrl+Enter -> \\n (legacy terminal: \\r = Enter, \\n = Ctrl+Enter/Ctrl+J)\n if (modifiers.includes(\"Control\") && mainKey === \"Enter\") {\n return \"\\n\"\n }\n\n // Alt+key -> ESC prefix (standard terminal convention)\n // Alt/Meta/Option keys send ESC followed by the key\n if ((modifiers.includes(\"Alt\") || modifiers.includes(\"Meta\")) && mainKey.length === 1) {\n return `\\x1b${mainKey}`\n }\n\n // Shift+Tab -> backtab (universally \\x1b[Z across all terminal emulators)\n if (modifiers.includes(\"Shift\") && mainKey === \"Tab\") {\n return \"\\x1b[Z\"\n }\n\n // Shift+key for legacy ANSI encoding (no CSI sequence available)\n // Legacy terminals send the shifted character directly: Shift+a → 'A', Shift+/ → '?'\n if (modifiers.length === 1 && modifiers[0] === \"Shift\" && mainKey.length === 1) {\n // Shift+letter → uppercase\n if (mainKey >= \"a\" && mainKey <= \"z\") return mainKey.toUpperCase()\n // Shift+punct → shifted character (US QWERTY)\n const shifted = BASE_TO_SHIFTED_PUNCT[mainKey]\n if (shifted) return shifted\n }\n\n // Modified arrow/function keys -> xterm-style CSI 1;modifier sequences\n // E.g. Shift+ArrowUp -> \\x1b[1;2A, Ctrl+ArrowDown -> \\x1b[1;5B\n const ARROW_SUFFIX: Record<string, string> = {\n ArrowUp: \"A\",\n ArrowDown: \"B\",\n ArrowRight: \"C\",\n ArrowLeft: \"D\",\n Home: \"H\",\n End: \"F\",\n }\n if (modifiers.length > 0 && mainKey in ARROW_SUFFIX) {\n let mod = 1\n if (modifiers.includes(\"Shift\")) mod += 1\n if (modifiers.includes(\"Alt\") || modifiers.includes(\"Meta\")) mod += 2\n if (modifiers.includes(\"Control\")) mod += 4\n if (modifiers.includes(\"Super\")) mod += 8\n if (modifiers.includes(\"Hyper\")) mod += 16\n return `\\x1b[1;${mod}${ARROW_SUFFIX[mainKey]}`\n }\n\n // Modified ~-terminated nav keys (PageUp/PageDown/Insert/Delete) ->\n // xterm-style CSI number;modifier ~ sequences. Without this, the bare\n // \"\\x1b[5~\" / \"\\x1b[6~\" sequences from KEY_MAP carry no Shift modifier\n // and parseKeypress decodes them as `pageUp:true, shift:false` —\n // breaking app bindings like silvercode's Shift+PageUp transcript\n // scroll, which only fires when `key.shift` is true.\n // Bead: @km/silvery/keyToAnsi-shift-pageup-pagedown-encoding.\n const TILDE_KEY_NUMBER: Record<string, number> = {\n PageUp: 5,\n PageDown: 6,\n Insert: 2,\n Delete: 3,\n }\n if (modifiers.length > 0 && mainKey in TILDE_KEY_NUMBER) {\n let mod = 1\n if (modifiers.includes(\"Shift\")) mod += 1\n if (modifiers.includes(\"Alt\") || modifiers.includes(\"Meta\")) mod += 2\n if (modifiers.includes(\"Control\")) mod += 4\n if (modifiers.includes(\"Super\")) mod += 8\n if (modifiers.includes(\"Hyper\")) mod += 16\n return `\\x1b[${TILDE_KEY_NUMBER[mainKey]};${mod}~`\n }\n\n // Look up base key in map\n const base = KEY_MAP[mainKey]\n if (base !== undefined && base !== null) return base\n\n // Fallback: return as-is (single char or unknown key)\n return mainKey\n}\n\n// ============================================================================\n// ANSI -> Key Mapping (for parsing input)\n// ============================================================================\n\n/**\n * ANSI escape code suffix -> key name mapping.\n * Used by useInput to parse incoming key sequences.\n *\n * The key is the escape sequence suffix (after ESC or ESC[).\n * Multiple terminal emulators may use different sequences for the same key.\n */\nexport const CODE_TO_KEY: Record<string, string> = {\n // Arrow keys (xterm ESC [ letter)\n \"[A\": \"up\",\n \"[B\": \"down\",\n \"[C\": \"right\",\n \"[D\": \"left\",\n \"[E\": \"clear\",\n \"[F\": \"end\",\n \"[H\": \"home\",\n\n // Arrow keys (xterm/gnome ESC O letter)\n OA: \"up\",\n OB: \"down\",\n OC: \"right\",\n OD: \"left\",\n OE: \"clear\",\n OF: \"end\",\n OH: \"home\",\n\n // Function keys (xterm/gnome ESC O letter)\n OP: \"f1\",\n OQ: \"f2\",\n OR: \"f3\",\n OS: \"f4\",\n\n // Function keys (xterm/rxvt ESC [ number ~)\n \"[11~\": \"f1\",\n \"[12~\": \"f2\",\n \"[13~\": \"f3\",\n \"[14~\": \"f4\",\n \"[15~\": \"f5\",\n \"[17~\": \"f6\",\n \"[18~\": \"f7\",\n \"[19~\": \"f8\",\n \"[20~\": \"f9\",\n \"[21~\": \"f10\",\n \"[23~\": \"f11\",\n \"[24~\": \"f12\",\n\n // Function keys (Cygwin/libuv)\n \"[[A\": \"f1\",\n \"[[B\": \"f2\",\n \"[[C\": \"f3\",\n \"[[D\": \"f4\",\n \"[[E\": \"f5\",\n\n // Navigation keys (xterm/rxvt ESC [ number ~)\n \"[1~\": \"home\",\n \"[2~\": \"insert\",\n \"[3~\": \"delete\",\n \"[4~\": \"end\",\n \"[5~\": \"pageup\",\n \"[6~\": \"pagedown\",\n\n // Navigation keys (putty)\n \"[[5~\": \"pageup\",\n \"[[6~\": \"pagedown\",\n\n // Navigation keys (rxvt)\n \"[7~\": \"home\",\n \"[8~\": \"end\",\n\n // Arrow keys with shift (rxvt lowercase)\n \"[a\": \"up\",\n \"[b\": \"down\",\n \"[c\": \"right\",\n \"[d\": \"left\",\n \"[e\": \"clear\",\n\n // Navigation keys with shift (rxvt $)\n \"[2$\": \"insert\",\n \"[3$\": \"delete\",\n \"[5$\": \"pageup\",\n \"[6$\": \"pagedown\",\n \"[7$\": \"home\",\n \"[8$\": \"end\",\n\n // Arrow keys with ctrl (rxvt O lowercase)\n Oa: \"up\",\n Ob: \"down\",\n Oc: \"right\",\n Od: \"left\",\n Oe: \"clear\",\n\n // Navigation keys with ctrl (rxvt ^)\n \"[2^\": \"insert\",\n \"[3^\": \"delete\",\n \"[5^\": \"pageup\",\n \"[6^\": \"pagedown\",\n \"[7^\": \"home\",\n \"[8^\": \"end\",\n\n // Shift+Tab\n \"[Z\": \"tab\",\n}\n\n// ============================================================================\n// Key Parsing Constants\n// ============================================================================\n\nconst NON_ALPHANUMERIC_KEYS = [\n ...Object.values(CODE_TO_KEY),\n \"backspace\",\n \"tab\",\n \"delete\",\n // Note: 'return', 'enter', 'escape', and 'space' are intentionally NOT included.\n // Users may need the raw character as input ('\\r' for return, '\\x1b' for escape).\n // Use key.return / key.escape boolean flags to detect these keys.\n]\n\nconst SHIFT_CODES = new Set([\n \"[a\",\n \"[b\",\n \"[c\",\n \"[d\",\n \"[e\",\n \"[2$\",\n \"[3$\",\n \"[5$\",\n \"[6$\",\n \"[7$\",\n \"[8$\",\n \"[Z\",\n])\n\nconst CTRL_CODES = new Set([\"Oa\", \"Ob\", \"Oc\", \"Od\", \"Oe\", \"[2^\", \"[3^\", \"[5^\", \"[6^\", \"[7^\", \"[8^\"])\n\nconst META_KEY_CODE_RE = /^(?:\\x1b)([\\x20-\\x7e])$/\nconst FN_KEY_RE = /^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/\n\n/**\n * US QWERTY shifted punctuation → base key map.\n *\n * Legacy terminals send the result character (e.g. `?`) without a shift modifier flag.\n * Kitty protocol sends the base codepoint + shift modifier. This map lets us normalize\n * legacy input so that keybindings like `shift-/` match on both protocols.\n */\nconst SHIFTED_PUNCT_MAP: Record<string, string> = {\n \"!\": \"1\",\n \"@\": \"2\",\n \"#\": \"3\",\n $: \"4\",\n \"%\": \"5\",\n \"^\": \"6\",\n \"&\": \"7\",\n \"*\": \"8\",\n \"(\": \"9\",\n \")\": \"0\",\n _: \"-\",\n \"+\": \"=\",\n \"~\": \"`\",\n \"{\": \"[\",\n \"}\": \"]\",\n \"|\": \"\\\\\",\n \":\": \";\",\n '\"': \"'\",\n \"<\": \",\",\n \">\": \".\",\n \"?\": \"/\",\n}\n\n/** Reverse of SHIFTED_PUNCT_MAP: base key → shifted character (US QWERTY) */\nconst BASE_TO_SHIFTED_PUNCT: Record<string, string> = Object.fromEntries(\n Object.entries(SHIFTED_PUNCT_MAP).map(([shifted, base]) => [base, shifted]),\n)\n\n// ============================================================================\n// Kitty Keyboard Protocol\n// ============================================================================\n\n/**\n * Matches Kitty keyboard protocol sequences:\n * CSI codepoint[:shifted[:base]][;modifiers[:event_type][;text_codepoints]] u\n *\n * Groups:\n * 1: codepoint\n * 2: shifted_codepoint (optional)\n * 3: base_layout_key (optional)\n * 4: modifiers (optional, defaults to 1)\n * 5: event_type (optional)\n * 6: text_codepoints (colon-separated, optional — requires REPORT_TEXT flag)\n */\nconst KITTY_RE = /^\\x1b\\[(\\d+)(?::(\\d+))?(?::(\\d+))?(?:;(\\d+)(?::(\\d+))?(?:;([\\d:]+))?)?u$/\n\n/** Matches xterm modifyOtherKeys format: CSI 27 ; modifier ; keycode ~ */\nconst MODIFY_OTHER_KEYS_RE = /^\\x1b\\[27;(\\d+);(\\d+)~$/\n\n/**\n * Kitty-enhanced special key sequences:\n * CSI number ; modifiers : eventType {letter|~}\n * These are legacy CSI sequences enhanced with the :eventType field.\n * Examples: \\x1b[1;1:1A (up arrow press), \\x1b[3;1:3~ (delete release)\n */\nconst KITTY_SPECIAL_RE = /^\\x1b\\[(\\d+);(\\d+):(\\d+)([A-Za-z~])$/\n\n/** Letter-terminated special key names (CSI 1 ; mods letter) */\nconst KITTY_SPECIAL_LETTER_KEYS: Record<string, string> = {\n A: \"up\",\n B: \"down\",\n C: \"right\",\n D: \"left\",\n E: \"clear\",\n F: \"end\",\n H: \"home\",\n P: \"f1\",\n Q: \"f2\",\n R: \"f3\",\n S: \"f4\",\n}\n\n/** Number-terminated special key names (CSI number ; mods ~) */\nconst KITTY_SPECIAL_NUMBER_KEYS: Record<number, string> = {\n 2: \"insert\",\n 3: \"delete\",\n 5: \"pageup\",\n 6: \"pagedown\",\n 7: \"home\",\n 8: \"end\",\n 11: \"f1\",\n 12: \"f2\",\n 13: \"f3\",\n 14: \"f4\",\n 15: \"f5\",\n 17: \"f6\",\n 18: \"f7\",\n 19: \"f8\",\n 20: \"f9\",\n 21: \"f10\",\n 23: \"f11\",\n 24: \"f12\",\n}\n\n/** Valid Unicode codepoint range, excluding surrogates */\nfunction isValidCodepoint(cp: number): boolean {\n return cp >= 0 && cp <= 0x10_ffff && !(cp >= 0xd8_00 && cp <= 0xdf_ff)\n}\n\n/** Safely convert codepoint to string, returning '?' for invalid values */\nfunction safeFromCodePoint(cp: number): string {\n return isValidCodepoint(cp) ? String.fromCodePoint(cp) : \"?\"\n}\n\n/** Maps Kitty codepoints to key names for non-printable/functional keys */\nconst KITTY_CODEPOINT_MAP: Record<number, string> = {\n // Standard control keys\n // Note: Kitty protocol sends Backspace as codepoint 127 (CSI 127 u).\n // Codepoint 8 (BS) is kept as a fallback. Delete uses legacy CSI 3 ~ format\n // (handled by KITTY_SPECIAL_NUMBER_KEYS), not the CSI u format.\n 8: \"backspace\",\n 9: \"tab\",\n 13: \"return\",\n 27: \"escape\",\n 127: \"backspace\",\n // Function keys F13-F35 (F1-F12 use legacy CSI sequences in Kitty mode)\n 57376: \"f13\",\n 57377: \"f14\",\n 57378: \"f15\",\n 57379: \"f16\",\n 57380: \"f17\",\n 57381: \"f18\",\n 57382: \"f19\",\n 57383: \"f20\",\n 57384: \"f21\",\n 57385: \"f22\",\n 57386: \"f23\",\n 57387: \"f24\",\n 57388: \"f25\",\n 57389: \"f26\",\n 57390: \"f27\",\n 57391: \"f28\",\n 57392: \"f29\",\n 57393: \"f30\",\n 57394: \"f31\",\n 57395: \"f32\",\n 57396: \"f33\",\n 57397: \"f34\",\n 57398: \"f35\",\n // Lock/misc keys\n 57358: \"capslock\",\n 57359: \"scrolllock\",\n 57360: \"numlock\",\n 57361: \"printscreen\",\n 57362: \"pause\",\n 57363: \"menu\",\n // Keypad keys\n 57399: \"kp0\",\n 57400: \"kp1\",\n 57401: \"kp2\",\n 57402: \"kp3\",\n 57403: \"kp4\",\n 57404: \"kp5\",\n 57405: \"kp6\",\n 57406: \"kp7\",\n 57407: \"kp8\",\n 57408: \"kp9\",\n 57409: \"kpdecimal\",\n 57410: \"kpdivide\",\n 57411: \"kpmultiply\",\n 57412: \"kpsubtract\",\n 57413: \"kpadd\",\n 57414: \"kpenter\",\n 57415: \"kpequal\",\n 57416: \"kpseparator\",\n 57417: \"kpleft\",\n 57418: \"kpright\",\n 57419: \"kpup\",\n 57420: \"kpdown\",\n 57421: \"kppageup\",\n 57422: \"kppagedown\",\n 57423: \"kphome\",\n 57424: \"kpend\",\n 57425: \"kpinsert\",\n 57426: \"kpdelete\",\n 57427: \"kpbegin\",\n // Media keys\n 57428: \"mediaplay\",\n 57429: \"mediapause\",\n 57430: \"mediaplaypause\",\n 57431: \"mediareverse\",\n 57432: \"mediastop\",\n 57433: \"mediafastforward\",\n 57434: \"mediarewind\",\n 57435: \"mediatracknext\",\n 57436: \"mediatrackprevious\",\n 57437: \"mediarecord\",\n 57438: \"lowervolume\",\n 57439: \"raisevolume\",\n 57440: \"mutevolume\",\n // Modifier-only keys\n 57441: \"leftshift\",\n 57442: \"leftcontrol\",\n 57443: \"leftalt\",\n 57444: \"leftsuper\",\n 57445: \"lefthyper\",\n 57446: \"leftmeta\",\n 57447: \"rightshift\",\n 57448: \"rightcontrol\",\n 57449: \"rightalt\",\n 57450: \"rightsuper\",\n 57451: \"righthyper\",\n 57452: \"rightmeta\",\n 57453: \"isoLevel3Shift\",\n 57454: \"isoLevel5Shift\",\n}\n\n/** Key names that represent modifier-only events (Kitty codepoints 57441–57454). */\nconst MODIFIER_ONLY_NAMES = new Set([\n \"leftshift\",\n \"leftcontrol\",\n \"leftalt\",\n \"leftsuper\",\n \"lefthyper\",\n \"leftmeta\",\n \"rightshift\",\n \"rightcontrol\",\n \"rightalt\",\n \"rightsuper\",\n \"righthyper\",\n \"rightmeta\",\n \"isoLevel3Shift\",\n \"isoLevel5Shift\",\n])\n\n/** Lookup a Kitty codepoint to a key name */\nfunction kittyCodepointToName(cp: number): string | undefined {\n return KITTY_CODEPOINT_MAP[cp]\n}\n\n/** Convert numeric Kitty event type (1/2/3) to string. */\nfunction numericToEventType(n: number): \"press\" | \"repeat\" | \"release\" | undefined {\n if (n === 1) return \"press\"\n if (n === 2) return \"repeat\"\n if (n === 3) return \"release\"\n return undefined\n}\n\n// ============================================================================\n// Key Parsing\n// ============================================================================\n\nexport interface ParsedKeypress {\n name: string\n ctrl: boolean\n meta: boolean\n shift: boolean\n option: boolean\n super: boolean\n hyper: boolean\n /** Kitty event type. Only set with Kitty flag 2 (report events). */\n eventType?: \"press\" | \"repeat\" | \"release\"\n /** The character when Shift is held. From Kitty shifted_codepoint. */\n shiftedKey?: string\n /** The key on a standard US layout (for non-Latin keyboards). From Kitty base_layout_key. */\n baseLayoutKey?: string\n /** CapsLock is active. Kitty modifier bit 6. */\n capsLock?: boolean\n /** NumLock is active. Kitty modifier bit 7. */\n numLock?: boolean\n /** Decoded text from Kitty REPORT_TEXT mode. */\n associatedText?: string\n sequence: string\n /** Raw input string, identical to sequence for most keys. */\n raw?: string\n code?: string\n /** Whether this key was parsed from the Kitty keyboard protocol. */\n isKittyProtocol?: boolean\n /**\n * Whether this key represents printable text input.\n * When false, the key is a control/function/modifier key that should not\n * produce text input (e.g., arrows, function keys, capslock, media keys).\n * Only set by the kitty protocol parser.\n */\n isPrintable?: boolean\n /**\n * Text associated with the key.\n * For printable kitty keys, defaults to the character from the codepoint.\n * When REPORT_TEXT flag is active, contains the decoded text-as-codepoints.\n */\n text?: string\n}\n\n/**\n * Parse a raw input sequence into a structured keypress object.\n * Accepts string or Buffer (Buffer support for stdin compatibility).\n */\nexport function parseKeypress(s: string | Buffer): ParsedKeypress {\n let input: string\n\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(s)) {\n if (s[0] !== undefined && s[0]! > 127 && s[1] === undefined) {\n const buf = Buffer.from(s)\n buf[0]! -= 128\n input = `\\x1b${buf.toString()}`\n } else {\n input = s.toString()\n }\n } else {\n input = typeof s === \"string\" ? (s ?? \"\") : String(s)\n }\n\n const key: ParsedKeypress = {\n name: \"\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n super: false,\n hyper: false,\n sequence: input,\n }\n\n if (input === \"\\r\") {\n key.name = \"return\"\n } else if (input === \"\\n\") {\n // In legacy terminal mode, Enter sends \\r. The only way to get \\n is\n // Ctrl+Enter (or Ctrl+J, same byte). Treat it as ctrl+return so\n // TextArea's submitKey=\"ctrl+enter\" works without Kitty protocol.\n key.name = \"return\"\n key.ctrl = true\n } else if (input === \"\\t\") {\n key.name = \"tab\"\n } else if (input === \"\\b\" || input === \"\\x1b\\b\") {\n key.name = \"backspace\"\n key.meta = input.charAt(0) === \"\\x1b\"\n } else if (input === \"\\x7f\" || input === \"\\x1b\\x7f\") {\n // Modern terminals send \\x7f for Backspace key (not \\x08).\n // The actual Delete key sends \\x1b[3~ (handled by CODE_TO_KEY).\n key.name = \"backspace\"\n key.meta = input.charAt(0) === \"\\x1b\"\n } else if (input === \"\\x1b\\r\") {\n // Meta + Return (Alt+Enter / Option+Return on macOS)\n key.name = \"return\"\n key.meta = true\n } else if (input === \"\\x1b\" || input === \"\\x1b\\x1b\") {\n key.name = \"escape\"\n key.meta = input.length === 2\n } else if (input === \" \" || input === \"\\x1b \") {\n key.name = \"space\"\n key.meta = input.length === 2\n } else if (input.length === 1 && input <= \"\\x1a\") {\n // ctrl+letter\n key.name = String.fromCharCode(input.charCodeAt(0) + \"a\".charCodeAt(0) - 1)\n key.ctrl = true\n } else if (input === \"\\x1f\") {\n // Ctrl+/ sends 0x1F (Unit Separator) in terminals\n key.name = \"/\"\n key.ctrl = true\n } else if (input.length === 1 && input >= \"0\" && input <= \"9\") {\n key.name = \"number\"\n } else if (input.length === 1 && input >= \"a\" && input <= \"z\") {\n key.name = input\n } else if (input.length === 1 && input >= \"A\" && input <= \"Z\") {\n key.name = input.toLowerCase()\n key.shift = true\n } else {\n // Try Kitty keyboard protocol first (CSI codepoint ; modifiers u)\n // Must be checked before FN_KEY_RE because 'u' matches [a-zA-Z]\n const kittyParts = KITTY_RE.exec(input)\n // Kitty-enhanced special keys: CSI number ; modifiers : eventType {letter|~}\n const kittySpecialParts = !kittyParts && KITTY_SPECIAL_RE.exec(input)\n // xterm modifyOtherKeys format: CSI 27 ; modifier ; keycode ~\n // Sent by Ghostty, xterm, and others for modified keys like Ctrl+Enter\n const modifyOtherKeysParts =\n !kittyParts && !kittySpecialParts && MODIFY_OTHER_KEYS_RE.exec(input)\n\n if (kittySpecialParts) {\n // Kitty-enhanced special key: CSI number ; modifiers : eventType {letter|~}\n const number = Number(kittySpecialParts[1])\n const modifier = Math.max(0, Number(kittySpecialParts[2]) - 1)\n const eventType = Number(kittySpecialParts[3])\n const terminator = kittySpecialParts[4]!\n\n const name =\n terminator === \"~\"\n ? KITTY_SPECIAL_NUMBER_KEYS[number]\n : KITTY_SPECIAL_LETTER_KEYS[terminator]\n\n key.isKittyProtocol = true\n key.isPrintable = false\n key.raw = input\n key.name = name ?? \"\"\n\n key.shift = !!(modifier & 1)\n key.option = !!(modifier & 2) // alt\n key.ctrl = !!(modifier & 4)\n key.super = !!(modifier & 8)\n key.hyper = !!(modifier & 16)\n key.meta = !!(modifier & 32)\n key.capsLock = !!(modifier & 64)\n key.numLock = !!(modifier & 128)\n\n const eventTypeStr = numericToEventType(eventType)\n if (eventTypeStr) {\n key.eventType = eventTypeStr\n }\n } else if (kittyParts || modifyOtherKeysParts) {\n let codepoint: number\n let modifier: number\n if (kittyParts) {\n codepoint = Number(kittyParts[1])\n modifier = Math.max(0, Number(kittyParts[4] || 1) - 1)\n } else {\n const mokParts = modifyOtherKeysParts as RegExpExecArray\n modifier = Math.max(0, Number(mokParts[1]) - 1)\n codepoint = Number(mokParts[2])\n }\n\n // Mark as kitty protocol\n if (kittyParts) {\n key.isKittyProtocol = true\n key.raw = input\n\n // Handle invalid codepoints (above U+10FFFF or surrogates)\n if (!isValidCodepoint(codepoint)) {\n key.name = \"\"\n key.isPrintable = false\n return key\n }\n }\n\n key.shift = !!(modifier & 1)\n key.option = !!(modifier & 2) // alt (in kitty protocol, bit 2 = alt/option)\n key.ctrl = !!(modifier & 4)\n key.super = !!(modifier & 8) // super (Cmd on macOS)\n key.hyper = !!(modifier & 16) // hyper\n key.meta = !!(modifier & 32) // meta (kitty distinguishes meta from alt)\n key.capsLock = !!(modifier & 64)\n key.numLock = !!(modifier & 128)\n\n // Event type from Kitty protocol (group 5): 1=press, 2=repeat, 3=release\n if (kittyParts?.[5]) {\n const et = numericToEventType(Number(kittyParts[5]))\n if (et) key.eventType = et\n }\n\n // Shifted codepoint (group 2)\n if (kittyParts?.[2]) {\n key.shiftedKey = String.fromCodePoint(Number(kittyParts[2]))\n }\n\n // Base layout key (group 3)\n if (kittyParts?.[3]) {\n key.baseLayoutKey = String.fromCodePoint(Number(kittyParts[3]))\n }\n\n // Text-as-codepoints (group 6) — requires REPORT_TEXT flag\n let textFromProtocol: string | undefined\n if (kittyParts?.[6]) {\n textFromProtocol = kittyParts[6]\n .split(\":\")\n .map((cp) => safeFromCodePoint(Number(cp)))\n .join(\"\")\n key.associatedText = textFromProtocol\n key.text = textFromProtocol\n }\n\n // Map codepoint to key name and determine printability\n if (codepoint === 32) {\n key.name = \"space\"\n key.isPrintable = true\n } else if (codepoint === 13) {\n key.name = \"return\"\n key.isPrintable = true\n } else {\n const mapped = kittyCodepointToName(codepoint)\n if (mapped) {\n key.name = mapped\n key.isPrintable = false\n } else if (codepoint >= 1 && codepoint <= 26) {\n // Ctrl+letter comes as codepoint 1-26\n key.name = String.fromCodePoint(codepoint + 96) // 'a' is 97\n key.isPrintable = false\n } else if (codepoint >= 32 && codepoint <= 126) {\n // Printable ASCII\n key.name = String.fromCharCode(codepoint).toLowerCase()\n if (codepoint >= 65 && codepoint <= 90) {\n key.shift = true\n key.name = String.fromCharCode(codepoint + 32)\n }\n key.isPrintable = true\n } else if (isValidCodepoint(codepoint)) {\n key.name = safeFromCodePoint(codepoint)\n key.isPrintable = true\n } else {\n key.name = \"\"\n key.isPrintable = false\n }\n }\n\n // Default text to the character from the codepoint when not explicitly\n // provided by the protocol, so keys like space and return produce their\n // expected text input (' ' and '\\r' respectively).\n // With REPORT_ALL_KEYS, Shift+key sends base codepoint + shift modifier\n // plus shifted_codepoint. Use it for correct text (Shift+1 → '!').\n if (kittyParts && key.isPrintable && !textFromProtocol) {\n if (key.shift && key.shiftedKey) {\n key.text = key.shiftedKey // Shift+1→'!', Shift+;→':'\n } else if (key.shift && codepoint >= 97 && codepoint <= 122) {\n key.text = String.fromCharCode(codepoint - 32) // 'a'→'A'\n } else if (key.shift && codepoint >= 65 && codepoint <= 90) {\n key.text = String.fromCharCode(codepoint) // Already uppercase — 'A' stays 'A'\n } else if (\n key.shift &&\n key.isPrintable &&\n !key.shiftedKey &&\n codepoint >= 32 &&\n codepoint <= 126\n ) {\n // Kitty protocol with Shift held on a non-letter key but no shifted_codepoint.\n // The terminal is using DISAMBIGUATE flag only (missing REPORT_ALL_KEYS flag 8).\n //\n // What goes wrong: key.text will be the base character ('1' instead of '!',\n // ';' instead of ':', '=' instead of '+', etc.). This means:\n // - Hotkey bindings like \"!\" won't match when the user types Shift+1\n // - TextInput will insert '1' instead of '!' when the user types Shift+1\n // - Any shifted punctuation produces the wrong character\n //\n // Fix: enable REPORT_ALL_KEYS when requesting the Kitty keyboard protocol.\n // Silvery defaults to this (flag 11 = DISAMBIGUATE|REPORT_EVENTS|REPORT_ALL_KEYS).\n // If you see this warning, your app or framework is overriding the default flags.\n //\n // See: https://terminfo.dev/extensions/kitty-keyboard-report-all-keys\n // https://sw.kovidgoyal.net/kitty/keyboard-protocol/#progressive-enhancement\n // Best-effort recovery: use US QWERTY shifted punct map as fallback.\n // Not perfect for non-US layouts, but better than inserting '1' for '#'.\n const baseChar = safeFromCodePoint(codepoint)\n const shifted = BASE_TO_SHIFTED_PUNCT[baseChar]\n key.text = shifted ?? baseChar\n } else {\n key.text = safeFromCodePoint(codepoint)\n }\n }\n } else if (KITTY_RE.test(input)) {\n // Matched kitty pattern but was rejected (e.g., invalid codepoint in the\n // parseKittyKeypress path above returned early). Return safe empty keypress.\n key.isKittyProtocol = true\n key.isPrintable = false\n key.raw = input\n return key\n } else {\n let parts = META_KEY_CODE_RE.exec(input)\n if (input === \"\\x1b[\") {\n // Ink compatibility: when a pending ESC[ prefix is flushed as\n // literal input, surface it as \"[\" rather than Alt+[.\n key.name = \"[\"\n } else if (parts) {\n key.meta = true\n key.shift = /^[A-Z]$/.test(parts[1] ?? \"\")\n } else {\n parts = FN_KEY_RE.exec(input)\n if (parts) {\n const segs = input.split(\"\")\n if (segs[0] === \"\\u001b\" && segs[1] === \"\\u001b\") {\n key.option = true\n }\n\n // Reassemble key code\n const code = [parts[1], parts[2], parts[4], parts[6]].filter(Boolean).join(\"\")\n const modifier = (Number(parts[3] || parts[5] || 1) - 1) as number\n\n key.ctrl = !!(modifier & 4)\n key.meta = !!(modifier & 2) // alt\n key.super = !!(modifier & 8) // super (Cmd on macOS)\n key.hyper = !!(modifier & 16) // hyper\n key.shift = !!(modifier & 1)\n key.capsLock = !!(modifier & 64)\n key.numLock = !!(modifier & 128)\n key.code = code\n key.name = CODE_TO_KEY[code] ?? \"\"\n key.shift = SHIFT_CODES.has(code) || key.shift\n key.ctrl = CTRL_CODES.has(code) || key.ctrl\n }\n }\n }\n }\n\n return key\n}\n\n/**\n * Parse raw terminal input into a Key object and cleaned input string.\n *\n * @param rawInput Raw terminal input (string or Buffer)\n * @returns Tuple of [cleanedInput, Key]\n */\nexport function parseKey(rawInput: string | Buffer): [string, Key] {\n const keypress = parseKeypress(rawInput)\n\n const key: Key = {\n upArrow: keypress.name === \"up\",\n downArrow: keypress.name === \"down\",\n leftArrow: keypress.name === \"left\",\n rightArrow: keypress.name === \"right\",\n pageDown: keypress.name === \"pagedown\",\n pageUp: keypress.name === \"pageup\",\n home: keypress.name === \"home\",\n end: keypress.name === \"end\",\n return: keypress.name === \"return\",\n escape: keypress.name === \"escape\",\n ctrl: keypress.ctrl,\n shift: keypress.shift,\n tab: keypress.name === \"tab\",\n backspace: keypress.name === \"backspace\",\n delete: keypress.name === \"delete\",\n meta: keypress.name !== \"escape\" && (keypress.meta || keypress.option),\n super: keypress.super,\n hyper: keypress.hyper,\n capsLock: keypress.capsLock ?? false,\n numLock: keypress.numLock ?? false,\n eventType: keypress.eventType,\n }\n\n let input: string\n\n if (keypress.isKittyProtocol) {\n // Kitty protocol: use base key name for keybinding resolution.\n // key.text (set by parseKeypress) has the shifted character for text insertion,\n // but input must be the base key so keybindings like \"shift-/\" match correctly.\n //\n // Exception: shifted letters get uppercase input to match legacy terminal behavior\n // (legacy terminals send \"G\" for Shift+g). This matters because many components\n // check `input === \"G\"` directly. The km command system normalizes via keyToString\n // so uppercase vs lowercase doesn't affect keybinding resolution for letters.\n if (keypress.isPrintable) {\n if (\n keypress.shift &&\n keypress.name.length === 1 &&\n keypress.name >= \"a\" &&\n keypress.name <= \"z\"\n ) {\n input = keypress.name.toUpperCase()\n } else if (keypress.name === \"space\") {\n input = \" \"\n } else if (keypress.name === \"return\") {\n input = \"\\r\"\n } else {\n input = keypress.name\n }\n } else if (keypress.ctrl && keypress.name.length === 1) {\n // Ctrl+letter via codepoint 1-26: provide the letter name so handlers\n // (e.g., exitOnCtrlC checking input === 'c' && key.ctrl) still work.\n input = keypress.name\n } else {\n input = \"\"\n }\n } else {\n input = keypress.ctrl ? keypress.name : keypress.sequence\n\n if (NON_ALPHANUMERIC_KEYS.includes(keypress.name)) {\n input = \"\"\n }\n\n // Strip meta prefix if remaining\n if (input.startsWith(\"\\u001b\")) {\n input = input.slice(1)\n }\n\n // Filter out escape sequence fragments that leak through\n // e.g., \"[2~\" from Insert key, \"[A\" from arrows when not fully parsed\n // Single \"[\" and \"]\" are allowed — they're valid key bindings\n if (\n (input.startsWith(\"[\") && input.length > 1) ||\n (input.startsWith(\"O\") && input.length > 1)\n ) {\n // For Kitty-encoded keys (Super/Hyper modifiers), preserve the key name\n // since the raw sequence was CSI codepoint;modifiers u\n if (keypress.super || keypress.hyper) {\n input = keypress.name\n } else {\n input = \"\"\n }\n }\n }\n\n // Preserve the actual typed character for text insertion.\n // For Kitty: keypress.text has the shifted char ('?' for Shift+/), input has the base key ('/').\n // For legacy: input has the shifted char ('#' for Shift+3), which gets normalized below.\n if (keypress.isKittyProtocol) {\n key.text = keypress.text ?? input\n } else if (input.length >= 1) {\n key.text = input\n }\n\n // Legacy terminals: normalize shifted punctuation → base key + shift\n // Kitty protocol already provides base codepoint + shift modifier\n if (!keypress.isKittyProtocol && input.length === 1 && !key.shift) {\n const base = SHIFTED_PUNCT_MAP[input]\n if (base) {\n input = base\n key.shift = true\n }\n }\n\n // Detect shift for uppercase letters\n if (input.length === 1 && typeof input[0] === \"string\" && /[A-Z]/.test(input[0])) {\n key.shift = true\n }\n\n // Flag modifier-only events (Kitty protocol sends Shift/Ctrl/Alt/Super/Hyper/Meta as keys)\n if (input === \"\" && MODIFIER_ONLY_NAMES.has(keypress.name)) {\n key.isModifierOnly = true\n // Surface the underlying Kitty name so consumers can tell WHICH\n // modifier was pressed/released — the modifier byte bits alone\n // don't disambiguate (release events keep the bit set). Bead:\n // @km/silvery/keydown-keyup-test-primitives.\n key.modifierName = keypress.name\n }\n\n // Trace every parsed key — enable with DEBUG=silvery:keys. The raw\n // sequence + parsed name/modifiers lets you pinpoint why a keystroke\n // isn't firing (terminal not in Kitty mode, modifier not parsed, etc.).\n log.debug?.(\"parseKey\", {\n raw: typeof rawInput === \"string\" ? rawInput : rawInput.toString(\"hex\"),\n input,\n name: keypress.name,\n shift: key.shift,\n ctrl: key.ctrl,\n meta: key.meta,\n super: key.super,\n tab: key.tab,\n kitty: keypress.isKittyProtocol ?? false,\n })\n\n return [input, key]\n}\n\n/**\n * Create an empty Key object (all fields false).\n */\nexport function emptyKey(): Key {\n return {\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n pageDown: false,\n pageUp: false,\n home: false,\n end: false,\n return: false,\n escape: false,\n ctrl: false,\n shift: false,\n tab: false,\n backspace: false,\n delete: false,\n meta: false,\n super: false,\n hyper: false,\n capsLock: false,\n numLock: false,\n }\n}\n\n// ============================================================================\n// Key Utility Functions\n// ============================================================================\n\n/**\n * Convert a Key object to a named key string.\n *\n * Returns the Playwright-compatible name for special keys (ArrowUp, Enter, etc.)\n * or \"\" if no special key is pressed.\n */\nexport function keyToName(key: Key): string {\n if (key.upArrow) return \"ArrowUp\"\n if (key.downArrow) return \"ArrowDown\"\n if (key.leftArrow) return \"ArrowLeft\"\n if (key.rightArrow) return \"ArrowRight\"\n if (key.return) return \"Enter\"\n if (key.escape) return \"Escape\"\n if (key.backspace) return \"Backspace\"\n if (key.delete) return \"Delete\"\n if (key.tab) return \"Tab\"\n if (key.pageUp) return \"PageUp\"\n if (key.pageDown) return \"PageDown\"\n if (key.home) return \"Home\"\n if (key.end) return \"End\"\n return \"\"\n}\n\n/**\n * Extract modifier flags from a Key object.\n * `alt` is always false (terminals cannot distinguish alt from meta).\n */\nexport function keyToModifiers(key: Key): {\n ctrl: boolean\n meta: boolean\n shift: boolean\n alt: boolean\n super: boolean\n hyper: boolean\n} {\n return {\n ctrl: !!key.ctrl,\n meta: !!key.meta,\n shift: !!key.shift,\n alt: false,\n super: !!key.super,\n hyper: !!key.hyper,\n }\n}\n\n/**\n * Parse a hotkey string into base key and modifiers.\n *\n * Supports Playwright-style (\"Control+c\", \"Shift+ArrowUp\") and\n * lowercase aliases (\"ctrl+c\", \"shift+tab\", \"cmd+a\").\n *\n * @example\n * ```tsx\n * parseHotkey('j') // { key: 'j', ctrl: false, meta: false, shift: false, alt: false }\n * parseHotkey('Control+c') // { key: 'c', ctrl: true, ... }\n * parseHotkey('Shift+ArrowUp') // { key: 'ArrowUp', shift: true, ... }\n * parseHotkey('⌘j') // { key: 'j', super: true, ... } (macOS symbol prefix)\n * parseHotkey('⌃⇧a') // { key: 'a', ctrl: true, shift: true, ... }\n * ```\n */\nexport function parseHotkey(keyStr: string): ParsedHotkey {\n // Support macOS symbol prefix format: ⌘J, ⌃⇧J, ✦⌘J\n let remaining = keyStr\n const symbolMods = new Set<string>()\n for (const char of remaining) {\n if (MODIFIER_SYMBOLS.has(char)) {\n symbolMods.add(char)\n } else {\n break\n }\n }\n\n if (symbolMods.size > 0) {\n remaining = remaining.slice(symbolMods.size)\n if (remaining.startsWith(\"+\")) remaining = remaining.slice(1)\n }\n\n const parts = remaining.split(\"+\")\n const key = parts.pop() || keyStr\n const modifiers = new Set([...parts.map((p) => p.toLowerCase()), ...symbolMods])\n\n return {\n key,\n ctrl: modifiers.has(\"control\") || modifiers.has(\"ctrl\") || modifiers.has(\"⌃\"),\n meta:\n modifiers.has(\"meta\") ||\n modifiers.has(\"alt\") ||\n modifiers.has(\"opt\") ||\n modifiers.has(\"option\") ||\n modifiers.has(\"⌥\"),\n shift: modifiers.has(\"shift\") || modifiers.has(\"⇧\"),\n alt: false, // alt and meta are indistinguishable in terminals; use meta\n super:\n modifiers.has(\"super\") ||\n modifiers.has(\"cmd\") ||\n modifiers.has(\"command\") ||\n modifiers.has(\"⌘\"),\n hyper: modifiers.has(\"hyper\") || modifiers.has(\"✦\"),\n }\n}\n\n/**\n * Match a parsed hotkey against a Key object and input string.\n *\n * @param hotkey Parsed hotkey to match\n * @param key Key object from input event\n * @param input Optional input string (for matching character keys)\n * @returns true if the hotkey matches the key event\n */\nexport function matchHotkey(hotkey: ParsedHotkey, key: Key, input?: string): boolean {\n // Check modifiers\n if (!!hotkey.ctrl !== !!key.ctrl) return false\n if (!!hotkey.meta !== !!key.meta) return false\n if (!!hotkey.super !== !!key.super) return false\n if (!!hotkey.hyper !== !!key.hyper) return false\n if (!!hotkey.alt !== false) return false // terminals can't distinguish alt from meta\n\n // For single-character hotkeys without explicit Shift (e.g., \"!\", \"J\", \"@\"),\n // skip the shift check — match against the input string directly.\n // The character itself encodes shift intent regardless of keyboard layout.\n // This is layout-independent: French \"!\" (unshifted) and US \"!\" (Shift+1) both match.\n const isCharacterHotkey = hotkey.key.length === 1 && !hotkey.shift\n if (!isCharacterHotkey && !!hotkey.shift !== !!key.shift) return false\n\n // Check key name against Key boolean fields\n const name = keyToName(key)\n if (name && name === hotkey.key) return true\n\n // Check against input string (base key for keybinding resolution)\n if (input !== undefined && input === hotkey.key) return true\n\n // Check against key.text (actual typed character for text insertion).\n // Kitty protocol: input is the base key (\"1\") but key.text is the shifted char (\"!\").\n // Character hotkeys like \"!\" should match against key.text so they work across protocols.\n if (key.text !== undefined && key.text === hotkey.key) return true\n\n return false\n}\n\n// ============================================================================\n// Kitty Protocol Output\n// ============================================================================\n\n/** Reverse map: key name → Kitty codepoint */\nconst NAME_TO_KITTY_CODEPOINT: Record<string, number> = {}\nfor (const [cp, name] of Object.entries(KITTY_CODEPOINT_MAP)) {\n NAME_TO_KITTY_CODEPOINT[name] = Number(cp)\n}\n\n// Bare modifier-name aliases — lookup defaults to the LEFT variant so\n// `keyToKittyAnsi(\"Super\")` produces the same sequence as\n// `keyToKittyAnsi(\"leftsuper\")` (left-cmd press). Tests asserting on a\n// specific physical key (right-shift, right-super, …) keep using the\n// `left*`/`right*` names directly. Bead:\n// @km/silvery/keydown-keyup-test-primitives.\nNAME_TO_KITTY_CODEPOINT[\"shift\"] = 57441\nNAME_TO_KITTY_CODEPOINT[\"control\"] = 57442\nNAME_TO_KITTY_CODEPOINT[\"alt\"] = 57443\nNAME_TO_KITTY_CODEPOINT[\"super\"] = 57444\nNAME_TO_KITTY_CODEPOINT[\"hyper\"] = 57445\nNAME_TO_KITTY_CODEPOINT[\"meta\"] = 57446\n// Aliases for the canonical modifier names that the alias table maps to.\n// `cmd`/`command`/`super` all normalize to \"Super\"; `keyToKittyAnsi` does\n// `mainKey.toLowerCase()` then this lookup, so we cover the lowered form.\n\n/**\n * Implicit modifier bits for modifier-only keys.\n * When a modifier key is pressed by itself, real terminals include the\n * corresponding modifier bit in the CSI u sequence. E.g., pressing Cmd alone\n * sends `\\x1b[57444;9u` (codepoint 57444, modifier 9 = super(8) + 1).\n * This map ensures keyToKittyAnsi produces the same encoding.\n */\nconst MODIFIER_KEY_IMPLICIT_BITS: Record<string, number> = {\n leftshift: 1,\n rightshift: 1,\n leftcontrol: 4,\n rightcontrol: 4,\n leftalt: 2,\n rightalt: 2,\n leftsuper: 8,\n rightsuper: 8,\n lefthyper: 16,\n righthyper: 16,\n leftmeta: 32,\n rightmeta: 32,\n // Bare modifier-name aliases — same implicit bits as the LEFT variant\n // so `keyToKittyAnsi(\"Super\")` includes the super(8) bit by itself.\n // Bead: @km/silvery/keydown-keyup-test-primitives.\n shift: 1,\n control: 4,\n alt: 2,\n super: 8,\n hyper: 16,\n meta: 32,\n}\n\n/** Playwright-style key name → CSI u codepoint for keys using CSI u format */\nconst PLAYWRIGHT_TO_KITTY_CSI_U: Record<string, number> = {\n Enter: 13,\n Escape: 27,\n Backspace: 127,\n Tab: 9,\n Space: 32,\n}\n\n/** Playwright-style key name → Kitty enhanced special key suffix (letter-terminated) */\nconst PLAYWRIGHT_TO_KITTY_SPECIAL_LETTER: Record<string, string> = {\n ArrowUp: \"A\",\n ArrowDown: \"B\",\n ArrowRight: \"C\",\n ArrowLeft: \"D\",\n Home: \"H\",\n End: \"F\",\n F1: \"P\",\n F2: \"Q\",\n F3: \"R\",\n F4: \"S\",\n}\n\n/** Playwright-style key name → Kitty enhanced special key number (tilde-terminated) */\nconst PLAYWRIGHT_TO_KITTY_SPECIAL_TILDE: Record<string, number> = {\n Insert: 2,\n Delete: 3,\n PageUp: 5,\n PageDown: 6,\n F5: 15,\n F6: 17,\n F7: 18,\n F8: 19,\n F9: 20,\n F10: 21,\n F11: 23,\n F12: 24,\n}\n\n/**\n * Convert a Playwright-style key string to a Kitty keyboard protocol ANSI sequence.\n *\n * Uses the appropriate Kitty format for each key type:\n * - Regular keys: CSI codepoint ; modifiers u\n * - Arrow/nav keys: CSI 1 ; modifiers letter (enhanced special key format)\n * - Tilde keys: CSI number ; modifiers ~ (enhanced special key format)\n *\n * @example\n * ```tsx\n * keyToKittyAnsi('a') // '\\x1b[97u' (no modifiers → bare)\n * keyToKittyAnsi('Enter') // '\\x1b[13u'\n * keyToKittyAnsi('Control+c') // '\\x1b[99;5u' (ctrl = 4, modifier = 5)\n * keyToKittyAnsi('Shift+Enter') // '\\x1b[13;2u' (shift = 1, modifier = 2)\n * keyToKittyAnsi('ArrowUp') // '\\x1b[1;1A' (enhanced special key)\n * ```\n */\nexport function keyToKittyAnsi(key: string): string {\n const parts = key.split(\"+\")\n const mainKey = parts.pop()!\n const modifiers = parts.map(normalizeModifier)\n\n // Calculate modifier bitfield\n let mod = 0\n if (modifiers.includes(\"Shift\")) mod |= 1\n if (modifiers.includes(\"Alt\") || modifiers.includes(\"Meta\")) mod |= 2\n if (modifiers.includes(\"Control\")) mod |= 4\n if (modifiers.includes(\"Super\")) mod |= 8\n if (modifiers.includes(\"Hyper\")) mod |= 16\n\n // Check for letter-terminated special keys (arrow keys, home, end, F1-F4)\n const specialLetter = PLAYWRIGHT_TO_KITTY_SPECIAL_LETTER[mainKey]\n if (specialLetter) {\n return `\\x1b[1;${mod + 1}${specialLetter}`\n }\n\n // Check for tilde-terminated special keys (insert, delete, pageup, F5-F12)\n const specialNumber = PLAYWRIGHT_TO_KITTY_SPECIAL_TILDE[mainKey]\n if (specialNumber !== undefined) {\n return `\\x1b[${specialNumber};${mod + 1}~`\n }\n\n // Check CSI u format keys\n const csiUCodepoint = PLAYWRIGHT_TO_KITTY_CSI_U[mainKey]\n if (csiUCodepoint !== undefined) {\n if (mod > 0) {\n return `\\x1b[${csiUCodepoint};${mod + 1}u`\n }\n return `\\x1b[${csiUCodepoint}u`\n }\n\n // Single character — use Unicode codepoint in CSI u format\n if (mainKey.length === 1) {\n const codepoint = mainKey.charCodeAt(0)\n if (mod > 0) {\n // Include shifted_codepoint for Shift+key so parseKey can recover the actual character.\n // Format: CSI codepoint:shifted_codepoint;modifiers u\n if ((mod & 1) !== 0) {\n // Shift is held — check if there's a shifted character to include\n const shifted = BASE_TO_SHIFTED_PUNCT[mainKey]\n if (shifted) {\n return `\\x1b[${codepoint}:${shifted.charCodeAt(0)};${mod + 1}u`\n }\n // Shift+letter: include uppercase codepoint\n if (codepoint >= 97 && codepoint <= 122) {\n return `\\x1b[${codepoint}:${codepoint - 32};${mod + 1}u`\n }\n }\n return `\\x1b[${codepoint};${mod + 1}u`\n }\n return `\\x1b[${codepoint}u`\n }\n\n // Try lowercase as direct kitty name (e.g., \"return\", \"escape\")\n const cp = NAME_TO_KITTY_CODEPOINT[mainKey.toLowerCase()]\n if (cp !== undefined) {\n // Modifier-only keys: include the implicit modifier bit.\n // When the key IS a modifier (leftsuper, leftshift, etc.), real terminals\n // include the corresponding modifier bit in the sequence. E.g., pressing\n // Cmd sends codepoint 57444 with super bit (8), so modifier = 9.\n const implicitMod = MODIFIER_KEY_IMPLICIT_BITS[mainKey.toLowerCase()]\n if (implicitMod !== undefined) {\n mod |= implicitMod\n }\n if (mod > 0) {\n return `\\x1b[${cp};${mod + 1}u`\n }\n return `\\x1b[${cp}u`\n }\n\n // Fallback: return as-is (not a kitty key)\n return keyToAnsi(key)\n}\n\n// ============================================================================\n// Raw Input Splitting\n// ============================================================================\n\n/** Grapheme segmenter for splitting non-escape text into visual characters */\nconst graphemeSegmenter = new Intl.Segmenter(\"en\", { granularity: \"grapheme\" })\n\n/**\n * Split raw terminal input into individual keypresses.\n *\n * When stdin.read() returns multiple characters buffered together (e.g., rapid\n * typing, paste, or auto-repeat during heavy renders), this tokenizer splits\n * them into individual keypresses so each can be parsed and handled separately.\n *\n * Uses grapheme segmentation for non-escape text, so emoji with variation\n * selectors (❤️), ZWJ sequences (👨‍👩‍👧‍👦), and combining marks stay intact.\n *\n * Handles:\n * - CSI sequences: ESC [ ... (arrow keys, function keys, Kitty protocol)\n * - SS3 sequences: ESC O + letter\n * - Meta sequences: ESC + single char\n * - Double ESC\n * - Grapheme clusters (emoji, combining marks, CJK)\n */\nexport function* splitRawInput(data: string): Generator<string> {\n // Single character fast path (most common case in real terminal I/O)\n if (data.length <= 1) {\n if (data.length === 1) yield data\n return\n }\n\n let i = 0\n let textStart = -1 // start of accumulated non-escape text\n\n while (i < data.length) {\n if (data.charCodeAt(i) === 0x1b) {\n // Flush accumulated text before this escape sequence\n if (textStart >= 0) {\n yield* splitNonEscapeText(data.slice(textStart, i))\n textStart = -1\n }\n\n // ESC — start of escape sequence\n if (i + 1 >= data.length) {\n // Bare ESC at end of chunk\n yield \"\\x1b\"\n i++\n continue\n }\n\n const next = data.charCodeAt(i + 1)\n\n if (next === 0x5b) {\n // CSI sequence: ESC [ params final-byte\n // Final byte is in range 0x40-0x7E (@A-Z[\\]^_`a-z{|}~)\n let j = i + 2\n while (j < data.length) {\n const c = data.charCodeAt(j)\n if (c >= 0x40 && c <= 0x7e) {\n j++ // include the final byte\n break\n }\n j++\n }\n yield data.slice(i, j)\n i = j\n } else if (next === 0x4f) {\n // SS3 sequence: ESC O + one letter\n const end = Math.min(i + 3, data.length)\n yield data.slice(i, end)\n i = end\n } else if (next === 0x1b) {\n // Double ESC: meta + escape, OR meta + CSI/SS3 sequence\n // Check if a control sequence follows the double ESC\n if (i + 2 < data.length) {\n const third = data.charCodeAt(i + 2)\n if (third === 0x5b) {\n // Meta + CSI: ESC ESC [ params final-byte (e.g., meta+arrow)\n let j = i + 3\n while (j < data.length) {\n const c = data.charCodeAt(j)\n if (c >= 0x40 && c <= 0x7e) {\n j++ // include the final byte\n break\n }\n j++\n }\n yield data.slice(i, j)\n i = j\n } else if (third === 0x4f) {\n // Meta + SS3: ESC ESC O letter\n const end = Math.min(i + 4, data.length)\n yield data.slice(i, end)\n i = end\n } else {\n // Plain double ESC (meta+escape)\n yield \"\\x1b\\x1b\"\n i += 2\n }\n } else {\n // Double ESC at end of chunk\n yield \"\\x1b\\x1b\"\n i += 2\n }\n } else {\n // Meta + single char (Alt+key)\n yield data.slice(i, i + 2)\n i += 2\n }\n } else {\n // Non-escape: accumulate into text run\n if (textStart < 0) textStart = i\n i++\n }\n }\n\n // Flush final text run\n if (textStart >= 0) {\n yield* splitNonEscapeText(data.slice(textStart))\n }\n}\n\n/**\n * Split non-escape text, keeping most characters together as one chunk.\n *\n * Only delete (0x7F) and backspace (0x08) are split out individually because\n * they can arrive as rapid repeats in a single stdin chunk. Other control\n * characters like \\r and \\t may legitimately appear inside pasted text and\n * should NOT be split out (matching Ink's input-parser behavior).\n */\nfunction* splitNonEscapeText(text: string): Generator<string> {\n let segmentStart = 0\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i)\n if (ch === 0x7f || ch === 0x08) {\n // Flush text before this delete/backspace\n if (i > segmentStart) {\n yield text.slice(segmentStart, i)\n }\n yield text[i]!\n segmentStart = i + 1\n }\n }\n // Flush remaining text\n if (segmentStart < text.length) {\n yield text.slice(segmentStart)\n }\n}\n\n/** Split a non-escape text run into grapheme clusters */\nfunction* splitGraphemes(text: string): Generator<string> {\n for (const { segment } of graphemeSegmenter.segment(text)) {\n yield segment\n }\n}\n","export { fgColorCode, bgColorCode } from \"@silvery/ansi\"\n","/**\n * Terminal buffer implementation for Silvery.\n *\n * Uses packed Uint32Array for efficient cell metadata storage,\n * with separate string array for character storage (needed for\n * multi-byte Unicode graphemes and combining characters).\n */\n\nimport { fgColorCode, bgColorCode } from \"./ansi/sgr-codes\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Underline style variants (SGR 4:x codes).\n * - false: no underline\n * - 'single': standard underline (SGR 4 or 4:1)\n * - 'double': double underline (SGR 4:2)\n * - 'curly': curly/wavy underline (SGR 4:3)\n * - 'dotted': dotted underline (SGR 4:4)\n * - 'dashed': dashed underline (SGR 4:5)\n */\nexport type UnderlineStyle = false | \"single\" | \"double\" | \"curly\" | \"dotted\" | \"dashed\"\n\n/**\n * Text attributes that can be applied to a cell.\n */\nexport interface CellAttrs {\n bold?: boolean\n dim?: boolean\n italic?: boolean\n /** Simple underline flag (for backwards compatibility) */\n underline?: boolean\n /**\n * Underline style: 'single' | 'double' | 'curly' | 'dotted' | 'dashed'.\n * When set, takes precedence over the underline boolean.\n */\n underlineStyle?: UnderlineStyle\n /**\n * Overline (SGR 53/55). A line ABOVE the character cell, independent of\n * underline. Used for top-edge indicators where underline would read as\n * \"this row is underlined content\" instead of \"you're at the top\".\n */\n overline?: boolean\n blink?: boolean\n inverse?: boolean\n hidden?: boolean\n strikethrough?: boolean\n}\n\n/**\n * Color representation.\n * - number: 256-color index (0-255)\n * - RGB object: true color\n * - null: default/inherit\n * - DEFAULT_BG: terminal's default background (SGR 49), opaque but uses terminal's own bg color\n */\nexport type Color = number | { r: number; g: number; b: number } | null\n\n/**\n * Sentinel color representing the terminal's default background (SGR 49).\n * Unlike `null` (transparent/inherit), this actively fills cells with the\n * terminal's configured background, making the element opaque.\n */\nexport const DEFAULT_BG: Color = Object.freeze({ r: -1, g: -1, b: -1 })\n\n/** Check if a color is the default bg sentinel. */\nexport function isDefaultBg(color: Color): boolean {\n return color !== null && typeof color === \"object\" && color.r === -1\n}\n\n/**\n * A single cell in the terminal buffer.\n */\nexport interface Cell {\n /** The character/grapheme in this cell */\n char: string\n /** Foreground color */\n fg: Color\n /** Background color */\n bg: Color\n /**\n * Underline color (independent of fg).\n * Uses SGR 58. If null, underline uses fg color.\n */\n underlineColor: Color\n /** Text attributes */\n attrs: CellAttrs\n /** True if this is a wide character (CJK, emoji, etc.) */\n wide: boolean\n /** True if this is the continuation cell after a wide character */\n continuation: boolean\n /**\n * OSC 8 hyperlink URL.\n * When set, the cell is part of a clickable hyperlink in supporting terminals.\n */\n hyperlink?: string\n}\n\n/**\n * Partial cell update accepted by buffer write APIs.\n *\n * `selectable` is render metadata, not a visual cell property: it controls the\n * SELECTABLE_FLAG bit used by app-level semantic text selection. It is carried\n * on write payloads so selectability is explicit per mutation rather than an\n * ambient buffer mode.\n */\nexport type CellPatch = Partial<Cell> & { selectable?: boolean }\n\n/**\n * Style information for a cell (excludes char and position flags).\n */\nexport interface Style {\n fg: Color\n bg: Color\n /**\n * Underline color (independent of fg).\n * Uses SGR 58. If null, underline uses fg color.\n */\n underlineColor?: Color\n attrs: CellAttrs\n /**\n * OSC 8 hyperlink URL.\n * When set, the cell is part of a clickable hyperlink in supporting terminals.\n */\n hyperlink?: string\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n// Bit packing layout for cell metadata in Uint32Array:\n// [0-7]: foreground color index (8 bits)\n// [8-15]: background color index (8 bits)\n// [16-23]: attributes (8 bits): bold, dim, italic, blink, inverse, hidden, strikethrough, overline\n// [24-26]: underline style (3 bits): 0=none, 1=single, 2=double, 3=curly, 4=dotted, 5=dashed\n// [27-31]: flags (5 bits): wide, continuation, true_color_fg, true_color_bg + 1 spare\n\n// Attribute bit positions (within bits 16-23)\nconst ATTR_BOLD = 1 << 16\nconst ATTR_DIM = 1 << 17\nconst ATTR_ITALIC = 1 << 18\nconst ATTR_BLINK = 1 << 19\nconst ATTR_INVERSE = 1 << 20\nconst ATTR_HIDDEN = 1 << 21\nconst ATTR_STRIKETHROUGH = 1 << 22\nconst ATTR_OVERLINE = 1 << 23\n\n// Underline style (3 bits in positions 24-26)\n// 0 = no underline, 1 = single, 2 = double, 3 = curly, 4 = dotted, 5 = dashed\nconst UNDERLINE_STYLE_SHIFT = 24\nconst UNDERLINE_STYLE_MASK = 0x7 << UNDERLINE_STYLE_SHIFT // 3 bits\n\n// Flag bit positions (in bits 27-31)\nconst WIDE_FLAG = 1 << 27\nconst CONTINUATION_FLAG = 1 << 28\nconst TRUE_COLOR_FG_FLAG = 1 << 29\nconst TRUE_COLOR_BG_FLAG = 1 << 30\n/**\n * Selection mask flag — bit 31 in the packed cell metadata.\n * Set during render phase based on resolved `userSelect` prop.\n * Read during selection to determine which cells participate.\n *\n * Uses `>>> 0` to avoid JS signed 32-bit integer issues.\n */\nexport const SELECTABLE_FLAG = 0x80000000 >>> 0\n\n/**\n * Check if a cell is selectable (SELECTABLE_FLAG is set in packed metadata).\n */\nexport function isCellSelectable(packed: number): boolean {\n return ((packed >>> 0) & SELECTABLE_FLAG) !== 0\n}\n\n/**\n * Set the SELECTABLE_FLAG on a packed cell value.\n */\nexport function setSelectableFlag(packed: number): number {\n return (packed | SELECTABLE_FLAG) >>> 0\n}\n\n/**\n * Clear the SELECTABLE_FLAG on a packed cell value.\n */\nexport function clearSelectableFlag(packed: number): number {\n return (packed & ~SELECTABLE_FLAG) >>> 0\n}\n\n/**\n * Packed attribute bits that make a space character visually meaningful.\n * Inverse makes spaces visible (block of color), underline draws a line under spaces,\n * strikethrough draws a line through spaces, overline draws a line above spaces.\n * Other attrs (bold, dim, italic) don't visually affect space characters.\n */\nexport const VISIBLE_SPACE_ATTR_MASK =\n ATTR_INVERSE | ATTR_STRIKETHROUGH | ATTR_OVERLINE | UNDERLINE_STYLE_MASK\n\n// Default empty cell\nconst EMPTY_CELL: Cell = {\n char: \" \",\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n wide: false,\n continuation: false,\n hyperlink: undefined,\n}\n\n/** Frozen empty attrs object, shared across zero-allocation reads for OOB cells */\nconst EMPTY_ATTRS: CellAttrs = Object.freeze({})\n\n// ============================================================================\n// Row Metadata\n// ============================================================================\n\n/**\n * Per-row metadata for text extraction correctness.\n * Maintained by the render phase during text rendering.\n */\nexport interface RowMetadata {\n /** True if this row continues on the next row (soft wrap, not hard break) */\n softWrapped: boolean\n /** Rightmost column with non-space content (for trailing space trimming) */\n lastContentCol: number\n}\n\n// ============================================================================\n// Packing/Unpacking Helpers\n// ============================================================================\n\n/**\n * Map UnderlineStyle to numeric value for bit packing.\n */\nfunction underlineStyleToNumber(style: UnderlineStyle | undefined): number {\n switch (style) {\n case false:\n return 0\n case \"single\":\n return 1\n case \"double\":\n return 2\n case \"curly\":\n return 3\n case \"dotted\":\n return 4\n case \"dashed\":\n return 5\n default:\n return 0 // undefined or unknown = no underline\n }\n}\n\n/**\n * Map numeric value back to UnderlineStyle.\n */\nfunction numberToUnderlineStyle(n: number): UnderlineStyle | undefined {\n switch (n) {\n case 0:\n return undefined // No underline\n case 1:\n return \"single\"\n case 2:\n return \"double\"\n case 3:\n return \"curly\"\n case 4:\n return \"dotted\"\n case 5:\n return \"dashed\"\n default:\n return undefined\n }\n}\n\n/**\n * Convert CellAttrs to bits for packing (used internally by packCell).\n * Note: This packs into the full 32-bit word, not just the attrs byte.\n */\nexport function attrsToNumber(attrs: CellAttrs): number {\n let n = 0\n if (attrs.bold) n |= ATTR_BOLD\n if (attrs.dim) n |= ATTR_DIM\n if (attrs.italic) n |= ATTR_ITALIC\n if (attrs.blink) n |= ATTR_BLINK\n if (attrs.inverse) n |= ATTR_INVERSE\n if (attrs.hidden) n |= ATTR_HIDDEN\n if (attrs.strikethrough) n |= ATTR_STRIKETHROUGH\n if (attrs.overline) n |= ATTR_OVERLINE\n\n // Pack underline style (3 bits)\n // If underlineStyle is set, use it. Otherwise, check underline boolean.\n const ulStyle = attrs.underlineStyle ?? (attrs.underline ? \"single\" : undefined)\n n |= underlineStyleToNumber(ulStyle) << UNDERLINE_STYLE_SHIFT\n\n return n\n}\n\n/**\n * Convert a number back to CellAttrs.\n */\nexport function numberToAttrs(n: number): CellAttrs {\n const attrs: CellAttrs = {}\n if (n & ATTR_BOLD) attrs.bold = true\n if (n & ATTR_DIM) attrs.dim = true\n if (n & ATTR_ITALIC) attrs.italic = true\n if (n & ATTR_BLINK) attrs.blink = true\n if (n & ATTR_INVERSE) attrs.inverse = true\n if (n & ATTR_HIDDEN) attrs.hidden = true\n if (n & ATTR_STRIKETHROUGH) attrs.strikethrough = true\n if (n & ATTR_OVERLINE) attrs.overline = true\n\n // Unpack underline style\n const ulStyleNum = (n & UNDERLINE_STYLE_MASK) >> UNDERLINE_STYLE_SHIFT\n const ulStyle = numberToUnderlineStyle(ulStyleNum)\n if (ulStyle) {\n attrs.underlineStyle = ulStyle\n attrs.underline = true\n }\n\n return attrs\n}\n\n/**\n * Convert a color to an index value for packing.\n * Returns 0 for null (default), or (index + 1) for 256-color.\n * This +1 offset allows distinguishing null from black (color index 0).\n * True color is handled separately via flags and auxiliary storage.\n */\nfunction colorToIndex(color: Color): number {\n if (color === null) return 0\n if (typeof color === \"number\") return (color & 0xff) + 1 // +1 to distinguish from null\n // True color - return 0, handle via flag\n return 0\n}\n\n/**\n * Check if a color is true color (RGB).\n */\nfunction isTrueColor(color: Color): color is { r: number; g: number; b: number } {\n return color !== null && typeof color === \"object\"\n}\n\n/**\n * Pack cell metadata into a 32-bit number.\n */\nexport function packCell(cell: Cell): number {\n let packed = 0\n\n // Foreground color index (bits 0-7)\n packed |= colorToIndex(cell.fg) & 0xff\n\n // Background color index (bits 8-15)\n packed |= (colorToIndex(cell.bg) & 0xff) << 8\n\n // Attributes (bits 16-22) and underline style (bits 24-26)\n // attrsToNumber returns bits already in their final positions\n packed |= attrsToNumber(cell.attrs)\n\n // Flags (bits 27-30)\n if (cell.wide) packed |= WIDE_FLAG\n if (cell.continuation) packed |= CONTINUATION_FLAG\n if (isTrueColor(cell.fg)) packed |= TRUE_COLOR_FG_FLAG\n if (isTrueColor(cell.bg)) packed |= TRUE_COLOR_BG_FLAG\n\n return packed\n}\n\n/**\n * Unpack foreground color index from packed value.\n */\nfunction unpackFgIndex(packed: number): number {\n return packed & 0xff\n}\n\n/**\n * Unpack background color index from packed value.\n */\nfunction unpackBgIndex(packed: number): number {\n return (packed >> 8) & 0xff\n}\n\n/**\n * Unpack attributes from packed value.\n * Extracts both the boolean attrs (bits 16-22) and underline style (bits 24-26).\n */\nfunction unpackAttrs(packed: number): CellAttrs {\n // numberToAttrs expects the full packed value with attrs in bits 16-22\n // and underline style in bits 24-26\n return numberToAttrs(packed)\n}\n\n/**\n * Check if wide flag is set.\n */\nfunction unpackWide(packed: number): boolean {\n return (packed & WIDE_FLAG) !== 0\n}\n\n/**\n * Check if continuation flag is set.\n */\nfunction unpackContinuation(packed: number): boolean {\n return (packed & CONTINUATION_FLAG) !== 0\n}\n\n/**\n * Check if true color foreground flag is set.\n */\nfunction unpackTrueColorFg(packed: number): boolean {\n return (packed & TRUE_COLOR_FG_FLAG) !== 0\n}\n\n/**\n * Check if true color background flag is set.\n */\nfunction unpackTrueColorBg(packed: number): boolean {\n return (packed & TRUE_COLOR_BG_FLAG) !== 0\n}\n\n// ============================================================================\n// TerminalBuffer Class\n// ============================================================================\n\n/**\n * Efficient terminal cell buffer.\n *\n * Uses packed Uint32Array for cell metadata and separate string array\n * for characters. This allows efficient diffing while supporting\n * full Unicode grapheme clusters.\n */\nexport class TerminalBuffer {\n /** Packed cell metadata */\n private cells: Uint32Array\n /** Character storage (one per cell, may be multi-byte grapheme) */\n private chars: string[]\n /** True color foreground storage (only for cells with true color fg) */\n private fgColors: Map<number, { r: number; g: number; b: number }>\n /** True color background storage (only for cells with true color bg) */\n private bgColors: Map<number, { r: number; g: number; b: number }>\n /** Underline color storage (independent of fg, for SGR 58) */\n private underlineColors: Map<number, Color>\n /** OSC 8 hyperlink URL storage (only for cells that are part of a hyperlink) */\n private hyperlinks: Map<number, string>\n /**\n * Per-row dirty tracking for diff optimization.\n * When set, diffBuffers() can skip clean rows entirely.\n * 0 = clean (unchanged since last resetDirtyRows), 1 = dirty (modified).\n */\n private _dirtyRows: Uint8Array\n /** Bounding box: first dirty row (inclusive). -1 when no rows are dirty. */\n private _minDirtyRow: number\n /** Bounding box: last dirty row (inclusive). -1 when no rows are dirty. */\n private _maxDirtyRow: number\n /**\n * Per-row metadata for text extraction (soft wrap, last content column).\n * Set by the render phase, read by extractText.\n */\n private _rowMetadata: RowMetadata[]\n readonly width: number\n readonly height: number\n\n constructor(width: number, height: number) {\n this.width = width\n this.height = height\n const size = width * height\n this.cells = new Uint32Array(size)\n this.chars = new Array<string>(size).fill(\" \")\n this.fgColors = new Map()\n this.bgColors = new Map()\n this.underlineColors = new Map()\n this.hyperlinks = new Map()\n // All rows start dirty (fresh buffer needs full diff on first comparison)\n this._dirtyRows = new Uint8Array(height).fill(1)\n this._minDirtyRow = 0\n this._maxDirtyRow = height - 1\n // Row metadata: default to not soft-wrapped, no content\n this._rowMetadata = Array.from({ length: height }, () => ({\n softWrapped: false,\n lastContentCol: -1,\n }))\n }\n\n /**\n * Get the index for a cell position.\n */\n private index(x: number, y: number): number {\n return y * this.width + x\n }\n\n /**\n * Check if coordinates are within bounds.\n */\n inBounds(x: number, y: number): boolean {\n return x >= 0 && x < this.width && y >= 0 && y < this.height\n }\n\n /**\n * Get a cell at the given position.\n */\n getCell(x: number, y: number): Cell {\n if (!this.inBounds(x, y)) {\n return { ...EMPTY_CELL }\n }\n\n const idx = this.index(x, y)\n const packed = this.cells[idx]\n const char = this.chars[idx]\n\n // Determine foreground color\n // Color indices are stored with +1 offset (0=null, 1=black, 2=red, etc.)\n let fg: Color = null\n if (unpackTrueColorFg(packed!)) {\n fg = this.fgColors.get(idx) ?? null\n } else {\n const fgIndex = unpackFgIndex(packed!)\n fg = fgIndex > 0 ? fgIndex - 1 : null // -1 to restore actual color index\n }\n\n // Determine background color\n let bg: Color = null\n if (unpackTrueColorBg(packed!)) {\n bg = this.bgColors.get(idx) ?? null\n } else {\n const bgIndex = unpackBgIndex(packed!)\n bg = bgIndex > 0 ? bgIndex - 1 : null // -1 to restore actual color index\n }\n\n const hyperlink = this.hyperlinks.get(idx)\n return {\n char: char!,\n fg,\n bg,\n underlineColor: this.underlineColors.get(idx) ?? null,\n attrs: unpackAttrs(packed!),\n wide: unpackWide(packed!),\n continuation: unpackContinuation(packed!),\n ...(hyperlink !== undefined ? { hyperlink } : {}),\n }\n }\n\n // --------------------------------------------------------------------------\n // Zero-allocation cell accessors for hot paths\n // --------------------------------------------------------------------------\n\n /**\n * Count cells that are not default-empty.\n *\n * A cell is \"painted\" iff any of these differs from default-empty:\n * - char !== \" \"\n * - packed metadata is non-zero (any fg, bg, attr, wide/cont/truecolor flag)\n *\n * Used by the degenerate-frame canary in `render()` (renderer.ts) and by\n * test helpers that want to assert a fixture renders meaningful content.\n *\n * O(W*H) — single pass over the packed Uint32Array + chars array.\n */\n countPaintedCells(): number {\n let n = 0\n const len = this.cells.length\n for (let i = 0; i < len; i++) {\n if (this.cells[i]! !== 0 || this.chars[i]! !== \" \") n++\n }\n return n\n }\n\n /**\n * Get just the character at a cell position (no object allocation).\n * Returns \" \" for out-of-bounds positions.\n */\n getCellChar(x: number, y: number): string {\n if (!this.inBounds(x, y)) return \" \"\n return this.chars[this.index(x, y)]!\n }\n\n /**\n * Get just the background color at a cell position (no object allocation).\n * Returns null for out-of-bounds positions.\n */\n getCellBg(x: number, y: number): Color {\n if (!this.inBounds(x, y)) return null\n const idx = this.index(x, y)\n const packed = this.cells[idx]!\n if (unpackTrueColorBg(packed)) {\n return this.bgColors.get(idx) ?? null\n }\n const bgIndex = unpackBgIndex(packed)\n return bgIndex > 0 ? bgIndex - 1 : null\n }\n\n /**\n * Get just the foreground color at a cell position (no object allocation).\n * Returns null for out-of-bounds positions.\n */\n getCellFg(x: number, y: number): Color {\n if (!this.inBounds(x, y)) return null\n const idx = this.index(x, y)\n const packed = this.cells[idx]!\n if (unpackTrueColorFg(packed)) {\n return this.fgColors.get(idx) ?? null\n }\n const fgIndex = unpackFgIndex(packed)\n return fgIndex > 0 ? fgIndex - 1 : null\n }\n\n /**\n * Get the raw packed metadata at a cell position (no unpackAttrs allocation).\n * Returns 0 for out-of-bounds positions. The packed value contains color\n * indices, attr bits, underline style, and flags in a single Uint32.\n */\n getCellAttrs(x: number, y: number): number {\n if (!this.inBounds(x, y)) return 0\n return this.cells[this.index(x, y)]!\n }\n\n /**\n * Check if a cell is a wide character (no object allocation).\n * Returns false for out-of-bounds positions.\n */\n isCellWide(x: number, y: number): boolean {\n if (!this.inBounds(x, y)) return false\n return unpackWide(this.cells[this.index(x, y)]!)\n }\n\n /**\n * Check if a cell is a continuation of a wide character (no object allocation).\n * Returns false for out-of-bounds positions.\n */\n isCellContinuation(x: number, y: number): boolean {\n if (!this.inBounds(x, y)) return false\n return unpackContinuation(this.cells[this.index(x, y)]!)\n }\n\n /**\n * Check if a cell is selectable (SELECTABLE_FLAG is set, no object allocation).\n * Returns false for out-of-bounds positions.\n */\n isCellSelectable(x: number, y: number): boolean {\n if (!this.inBounds(x, y)) return false\n return ((this.cells[this.index(x, y)]! >>> 0) & SELECTABLE_FLAG) !== 0\n }\n\n // --------------------------------------------------------------------------\n // Row Metadata (for text extraction)\n // --------------------------------------------------------------------------\n\n /**\n * Set metadata for a row (soft wrap, last content column).\n * Called by the render phase during text rendering.\n */\n setRowMeta(row: number, meta: Partial<RowMetadata>): void {\n if (row < 0 || row >= this.height) return\n const existing = this._rowMetadata[row]!\n if (meta.softWrapped !== undefined) existing.softWrapped = meta.softWrapped\n if (meta.lastContentCol !== undefined) existing.lastContentCol = meta.lastContentCol\n }\n\n /**\n * Get metadata for a row. Returns default values for out-of-bounds rows.\n */\n getRowMeta(row: number): RowMetadata {\n if (row < 0 || row >= this.height) return { softWrapped: false, lastContentCol: -1 }\n return this._rowMetadata[row]!\n }\n\n /**\n * Get the full row metadata array (for bulk access during text extraction).\n */\n getRowMetadataArray(): readonly RowMetadata[] {\n return this._rowMetadata\n }\n\n /**\n * Read cell data into a caller-provided Cell object (zero-allocation).\n * For hot loops that need the full Cell, reuse a single object:\n *\n * const cell = createMutableCell()\n * for (...) { buffer.readCellInto(x, y, cell) }\n *\n * Returns the same `out` object for chaining convenience.\n */\n readCellInto(x: number, y: number, out: Cell): Cell {\n if (!this.inBounds(x, y)) {\n out.char = \" \"\n out.fg = null\n out.bg = null\n out.underlineColor = null\n out.attrs = EMPTY_ATTRS\n out.wide = false\n out.continuation = false\n out.hyperlink = undefined\n return out\n }\n\n const idx = this.index(x, y)\n const packed = this.cells[idx]!\n\n out.char = this.chars[idx]!\n\n // Foreground color\n if (unpackTrueColorFg(packed)) {\n out.fg = this.fgColors.get(idx) ?? null\n } else {\n const fgIndex = unpackFgIndex(packed)\n out.fg = fgIndex > 0 ? fgIndex - 1 : null\n }\n\n // Background color\n if (unpackTrueColorBg(packed)) {\n out.bg = this.bgColors.get(idx) ?? null\n } else {\n const bgIndex = unpackBgIndex(packed)\n out.bg = bgIndex > 0 ? bgIndex - 1 : null\n }\n\n out.underlineColor = this.underlineColors.get(idx) ?? null\n\n // Unpack attrs inline to avoid allocating a new CellAttrs object.\n // We reuse the existing out.attrs object when possible.\n const attrs = out.attrs === EMPTY_ATTRS ? ((out.attrs = {}), out.attrs) : out.attrs\n attrs.bold = (packed & ATTR_BOLD) !== 0 ? true : undefined\n attrs.dim = (packed & ATTR_DIM) !== 0 ? true : undefined\n attrs.italic = (packed & ATTR_ITALIC) !== 0 ? true : undefined\n attrs.blink = (packed & ATTR_BLINK) !== 0 ? true : undefined\n attrs.inverse = (packed & ATTR_INVERSE) !== 0 ? true : undefined\n attrs.hidden = (packed & ATTR_HIDDEN) !== 0 ? true : undefined\n attrs.strikethrough = (packed & ATTR_STRIKETHROUGH) !== 0 ? true : undefined\n attrs.overline = (packed & ATTR_OVERLINE) !== 0 ? true : undefined\n\n const ulStyleNum = (packed & UNDERLINE_STYLE_MASK) >> UNDERLINE_STYLE_SHIFT\n const ulStyle = numberToUnderlineStyle(ulStyleNum)\n if (ulStyle) {\n attrs.underlineStyle = ulStyle\n attrs.underline = true\n } else {\n attrs.underlineStyle = undefined\n attrs.underline = undefined\n }\n\n out.wide = (packed & WIDE_FLAG) !== 0\n out.continuation = (packed & CONTINUATION_FLAG) !== 0\n out.hyperlink = this.hyperlinks.get(idx)\n\n return out\n }\n\n /**\n * Set a cell at the given position.\n *\n * Optimized: resolves defaults and packs metadata inline to avoid\n * allocating an intermediate Cell object.\n */\n setCell(x: number, y: number, cell: CellPatch): void {\n if (!this.inBounds(x, y)) {\n return\n }\n\n // Write trap for SILVERY_STRICT mismatch diagnosis\n const trap = (globalThis as any).__silvery_write_trap\n if (trap && x === trap.x && y === trap.y) {\n const char = cell.char ?? \" \"\n const stack = new Error().stack?.split(\"\\n\").slice(1, 6).join(\"\\n\") ?? \"\"\n trap.log.push(\n ` char=\"${char}\" fg=${cell.fg ?? \"null\"} bg=${cell.bg ?? \"null\"} dim=${cell.attrs?.dim} ul=${cell.attrs?.underline}\\n${stack}`,\n )\n }\n\n this._dirtyRows[y] = 1\n if (this._minDirtyRow === -1 || y < this._minDirtyRow) this._minDirtyRow = y\n if (y > this._maxDirtyRow) this._maxDirtyRow = y\n\n const idx = this.index(x, y)\n\n // Wide character consistency: when overwriting a continuation cell (second\n // half of a wide char), the leading main cell at x-1 must be replaced with\n // a space (matching Ink's overlay boundary clearing — see ink/output.ts).\n // Otherwise the buffer would have a wide-char glyph with no continuation,\n // and the terminal would render a half-visible wide character past the\n // overlay. When overwriting a wide char's main cell with a non-wide char,\n // clear the continuation cell at x+1 the same way.\n if (!(cell.continuation ?? false)) {\n const prevPacked = this.cells[idx]\n if (prevPacked !== undefined && (prevPacked & CONTINUATION_FLAG) !== 0 && x > 0) {\n // Overwriting a continuation cell — replace the leading wide-char cell\n // at x-1 with a space and clear its wide flag. This matches Ink's\n // pre-write boundary cleanup (ink/output.ts: currentLine[offsetX-1] = spaceCell).\n const prevIdx = idx - 1\n this.cells[prevIdx] = this.cells[prevIdx]! & ~WIDE_FLAG\n this.chars[prevIdx] = \" \"\n }\n }\n if (!(cell.wide ?? false)) {\n const prevPacked = this.cells[idx]\n if (prevPacked !== undefined && (prevPacked & WIDE_FLAG) !== 0 && x + 1 < this.width) {\n // Overwriting a wide cell with a non-wide char — clear continuation at x+1\n const nextIdx = idx + 1\n this.cells[nextIdx] = this.cells[nextIdx]! & ~CONTINUATION_FLAG\n this.chars[nextIdx] = \" \"\n }\n }\n\n // Resolve properties with defaults (no intermediate object)\n const char = cell.char ?? \" \"\n const fg = cell.fg ?? null\n const bg = cell.bg ?? null\n const underlineColor = cell.underlineColor ?? null\n const attrs = cell.attrs ?? EMPTY_ATTRS\n const wide = cell.wide ?? false\n const continuation = cell.continuation ?? false\n\n // Store character\n this.chars[idx] = char\n\n // Handle true color storage\n if (isTrueColor(fg)) {\n this.fgColors.set(idx, fg)\n } else {\n this.fgColors.delete(idx)\n }\n\n if (isTrueColor(bg)) {\n this.bgColors.set(idx, bg)\n } else {\n this.bgColors.delete(idx)\n }\n\n // Handle underline color storage\n if (underlineColor !== null) {\n this.underlineColors.set(idx, underlineColor)\n } else {\n this.underlineColors.delete(idx)\n }\n\n // Handle hyperlink storage\n const hyperlink = cell.hyperlink\n if (hyperlink !== undefined && hyperlink !== \"\") {\n this.hyperlinks.set(idx, hyperlink)\n } else {\n this.hyperlinks.delete(idx)\n }\n\n // Pack metadata inline (avoids packCell's fullCell parameter overhead)\n let packed = 0\n packed |= colorToIndex(fg) & 0xff\n packed |= (colorToIndex(bg) & 0xff) << 8\n packed |= attrsToNumber(attrs)\n if (wide) packed |= WIDE_FLAG\n if (continuation) packed |= CONTINUATION_FLAG\n if (isTrueColor(fg)) packed |= TRUE_COLOR_FG_FLAG\n if (isTrueColor(bg)) packed |= TRUE_COLOR_BG_FLAG\n if (cell.selectable) packed = (packed | SELECTABLE_FLAG) >>> 0\n this.cells[idx] = packed\n }\n\n /**\n * Fill a region with a cell.\n *\n * Optimized: packs cell metadata once and assigns directly to arrays,\n * avoiding O(width*height) intermediate object allocations from setCell().\n */\n fill(x: number, y: number, width: number, height: number, cell: CellPatch): void {\n const endX = Math.min(x + width, this.width)\n const endY = Math.min(y + height, this.height)\n const startX = Math.max(0, x)\n const startY = Math.max(0, y)\n\n if (startX >= endX || startY >= endY) return\n\n // Write trap for SILVERY_STRICT mismatch diagnosis (fill path)\n const trap = (globalThis as any).__silvery_write_trap\n if (trap && trap.x >= startX && trap.x < endX && trap.y >= startY && trap.y < endY) {\n const stack = new Error().stack?.split(\"\\n\").slice(1, 6).join(\"\\n\") ?? \"\"\n const ch = cell.char ?? \" \"\n trap.log.push(\n ` FILL char=\"${ch}\" fg=${cell.fg ?? \"null\"} bg=${cell.bg ?? \"null\"} rect=(${x},${y},${width},${height})\\n${stack}`,\n )\n }\n\n // Resolve cell properties once (instead of per-cell in setCell)\n const char = cell.char ?? \" \"\n const fg = cell.fg ?? null\n const bg = cell.bg ?? null\n const underlineColor = cell.underlineColor ?? null\n const attrs = cell.attrs ?? {}\n const wide = cell.wide ?? false\n const continuation = cell.continuation ?? false\n\n // Pack metadata once for the entire fill region\n const fullCell: Cell = {\n char,\n fg,\n bg,\n underlineColor,\n attrs,\n wide,\n continuation,\n }\n let packed = packCell(fullCell)\n if (cell.selectable) packed = (packed | SELECTABLE_FLAG) >>> 0\n\n // Determine true color values once\n const hasTrueColorFg = isTrueColor(fg)\n const hasTrueColorBg = isTrueColor(bg)\n const trueColorFg = hasTrueColorFg ? (fg as { r: number; g: number; b: number }) : null\n const trueColorBg = hasTrueColorBg ? (bg as { r: number; g: number; b: number }) : null\n const hasUnderlineColor = underlineColor !== null\n const hyperlink = cell.hyperlink\n const hasHyperlink = hyperlink !== undefined && hyperlink !== \"\"\n\n // Mark affected rows dirty + update bounding box\n for (let cy = startY; cy < endY; cy++) {\n this._dirtyRows[cy] = 1\n }\n if (startY < endY) {\n if (this._minDirtyRow === -1 || startY < this._minDirtyRow) this._minDirtyRow = startY\n if (endY - 1 > this._maxDirtyRow) this._maxDirtyRow = endY - 1\n }\n\n // Determine which Map operations are actually needed.\n // Skip delete() calls when the map is already empty (common case: no true colors).\n const needFgDelete = !hasTrueColorFg && this.fgColors.size > 0\n const needBgDelete = !hasTrueColorBg && this.bgColors.size > 0\n const needUlDelete = !hasUnderlineColor && this.underlineColors.size > 0\n const needHlDelete = !hasHyperlink && this.hyperlinks.size > 0\n\n for (let cy = startY; cy < endY; cy++) {\n const rowBase = cy * this.width\n for (let cx = startX; cx < endX; cx++) {\n const idx = rowBase + cx\n\n // Direct array assignment (no setCell overhead)\n this.cells[idx] = packed\n this.chars[idx] = char\n\n // Handle true color maps — skip delete when map is empty\n if (hasTrueColorFg) {\n this.fgColors.set(idx, trueColorFg!)\n } else if (needFgDelete) {\n this.fgColors.delete(idx)\n }\n\n if (hasTrueColorBg) {\n this.bgColors.set(idx, trueColorBg!)\n } else if (needBgDelete) {\n this.bgColors.delete(idx)\n }\n\n if (hasUnderlineColor) {\n this.underlineColors.set(idx, underlineColor)\n } else if (needUlDelete) {\n this.underlineColors.delete(idx)\n }\n\n if (hasHyperlink) {\n this.hyperlinks.set(idx, hyperlink!)\n } else if (needHlDelete) {\n this.hyperlinks.delete(idx)\n }\n }\n }\n }\n\n /**\n * Restyle a rectangular region — update fg, bg, and attrs on existing cells\n * without changing character content (char, wide, continuation, hyperlink).\n *\n * This is the style-only fast path: when only visual props changed (color,\n * bold, dim, inverse, etc.) but text content and layout are identical, we\n * can skip text collection/formatting and just update the style metadata.\n *\n * @param x Left column (inclusive)\n * @param y Top row (inclusive)\n * @param width Region width\n * @param height Region height\n * @param style New style to apply (fg, bg, attrs, underlineColor)\n */\n restyleRegion(x: number, y: number, width: number, height: number, style: Style): void {\n const endX = Math.min(x + width, this.width)\n const endY = Math.min(y + height, this.height)\n const startX = Math.max(0, x)\n const startY = Math.max(0, y)\n\n if (startX >= endX || startY >= endY) return\n\n // Pre-compute style-related packed bits\n const fgIndex = colorToIndex(style.fg) & 0xff\n const bgIndex = (colorToIndex(style.bg) & 0xff) << 8\n const attrBits = attrsToNumber(style.attrs)\n const hasTrueColorFg = isTrueColor(style.fg)\n const hasTrueColorBg = isTrueColor(style.bg)\n const trueColorFgFlag = hasTrueColorFg ? TRUE_COLOR_FG_FLAG : 0\n const trueColorBgFlag = hasTrueColorBg ? TRUE_COLOR_BG_FLAG : 0\n const trueColorFg = hasTrueColorFg ? (style.fg as { r: number; g: number; b: number }) : null\n const trueColorBg = hasTrueColorBg ? (style.bg as { r: number; g: number; b: number }) : null\n const underlineColor = style.underlineColor ?? null\n const hasUnderlineColor = underlineColor !== null\n\n // Style bits to apply (everything except char position flags)\n const styleBits = fgIndex | bgIndex | attrBits | trueColorFgFlag | trueColorBgFlag\n\n // Mask to preserve: wide, continuation, selectable\n // Clear: fg index (0-7), bg index (8-15), attrs (16-26), true color flags (29-30)\n const PRESERVE_MASK = WIDE_FLAG | CONTINUATION_FLAG | SELECTABLE_FLAG\n const needFgDelete = !hasTrueColorFg && this.fgColors.size > 0\n const needBgDelete = !hasTrueColorBg && this.bgColors.size > 0\n const needUlDelete = !hasUnderlineColor && this.underlineColors.size > 0\n\n // Mark affected rows dirty\n for (let cy = startY; cy < endY; cy++) {\n this._dirtyRows[cy] = 1\n }\n if (this._minDirtyRow === -1 || startY < this._minDirtyRow) this._minDirtyRow = startY\n if (endY - 1 > this._maxDirtyRow) this._maxDirtyRow = endY - 1\n\n for (let cy = startY; cy < endY; cy++) {\n const rowBase = cy * this.width\n for (let cx = startX; cx < endX; cx++) {\n const idx = rowBase + cx\n\n // Preserve char position flags, replace style bits\n const oldPacked = this.cells[idx]!\n this.cells[idx] = ((oldPacked & PRESERVE_MASK) >>> 0) | styleBits\n\n // Handle true color maps\n if (hasTrueColorFg) {\n this.fgColors.set(idx, trueColorFg!)\n } else if (needFgDelete) {\n this.fgColors.delete(idx)\n }\n\n if (hasTrueColorBg) {\n this.bgColors.set(idx, trueColorBg!)\n } else if (needBgDelete) {\n this.bgColors.delete(idx)\n }\n\n if (hasUnderlineColor) {\n this.underlineColors.set(idx, underlineColor)\n } else if (needUlDelete) {\n this.underlineColors.delete(idx)\n }\n }\n }\n }\n\n /**\n * Fill only the background color of a region — update bg on existing cells\n * without changing character content, foreground, or attributes.\n *\n * Unlike fill() which writes space characters, this preserves existing chars.\n * Used by the style-only fast path: when a Box's backgroundColor changes but\n * children are unchanged, fillBg() paints the new bg without destroying child\n * chars. Clean children can then be skipped (their chars are correct from the\n * clone, their bg was updated by fillBg).\n *\n * @param x Left column (inclusive)\n * @param y Top row (inclusive)\n * @param width Region width\n * @param height Region height\n * @param bg New background color\n */\n fillBg(x: number, y: number, width: number, height: number, bg: Color): void {\n const endX = Math.min(x + width, this.width)\n const endY = Math.min(y + height, this.height)\n const startX = Math.max(0, x)\n const startY = Math.max(0, y)\n\n if (startX >= endX || startY >= endY) return\n\n const bgIndex = (colorToIndex(bg) & 0xff) << 8\n const hasTrueColorBg = isTrueColor(bg)\n const trueColorBg = hasTrueColorBg ? (bg as { r: number; g: number; b: number }) : null\n const needBgDelete = !hasTrueColorBg && this.bgColors.size > 0\n\n // Mask to clear: bg index (bits 8-15) and TRUE_COLOR_BG_FLAG (bit 30)\n const BG_CLEAR_MASK = ~((0xff << 8) | TRUE_COLOR_BG_FLAG)\n const trueColorBgFlag = hasTrueColorBg ? TRUE_COLOR_BG_FLAG : 0\n\n // Mark affected rows dirty\n for (let cy = startY; cy < endY; cy++) {\n this._dirtyRows[cy] = 1\n }\n if (startY < endY) {\n if (this._minDirtyRow === -1 || startY < this._minDirtyRow) this._minDirtyRow = startY\n if (endY - 1 > this._maxDirtyRow) this._maxDirtyRow = endY - 1\n }\n\n for (let cy = startY; cy < endY; cy++) {\n const rowBase = cy * this.width\n for (let cx = startX; cx < endX; cx++) {\n const idx = rowBase + cx\n\n // Clear old bg bits, set new bg bits (preserve everything else)\n const oldPacked = this.cells[idx]!\n this.cells[idx] = ((oldPacked & BG_CLEAR_MASK) >>> 0) | bgIndex | trueColorBgFlag\n\n // Handle true color bg map\n if (hasTrueColorBg) {\n this.bgColors.set(idx, trueColorBg!)\n } else if (needBgDelete) {\n this.bgColors.delete(idx)\n }\n }\n }\n }\n\n /**\n * OR-combine SGR attribute bits into every cell in a rectangular region —\n * WITHOUT modifying glyphs, fg, bg, wide flags, selectable flag, or any\n * other per-cell state.\n *\n * This is the transparent-overlay primitive. It lets a Box (or any caller)\n * layer an underline / strikethrough / bold / etc. onto existing content\n * without overwriting what's underneath.\n *\n * Semantics:\n * - `attrs.underlineStyle` (or `attrs.underline: true` via attrsToNumber)\n * REPLACES any existing underline style on each cell — 3-bit field, one\n * value wins. This matches CSS `text-decoration` overlay semantics where\n * a decoration container sets the decoration.\n * - All other attr bits (bold/dim/italic/blink/inverse/hidden/strikethrough)\n * OR-in — existing attrs are preserved, new attrs add to them.\n * - `underlineColor` is applied only when explicitly provided; otherwise\n * each cell keeps its existing underline color.\n *\n * Use cases:\n * - Overscroll indicator: `<Box underline=\"single\" position=\"absolute\" />`\n * overlays an underline on the last row without touching the text.\n * - Error squiggly across a paragraph: `<Box underline=\"curly\">`.\n * - Heading visual emphasis: `<Box underline=\"double\">`.\n *\n * @param x Left column (inclusive)\n * @param y Top row (inclusive)\n * @param width Region width\n * @param height Region height\n * @param attrs Attributes to merge onto every cell\n * @param underlineColor Optional underline color — when provided, replaces the\n * existing underlineColor on each cell. `null` clears it. `undefined`\n * leaves it untouched.\n */\n mergeAttrsInRect(\n x: number,\n y: number,\n width: number,\n height: number,\n attrs: CellAttrs,\n underlineColor?: Color,\n ): void {\n const endX = Math.min(x + width, this.width)\n const endY = Math.min(y + height, this.height)\n const startX = Math.max(0, x)\n const startY = Math.max(0, y)\n\n if (startX >= endX || startY >= endY) return\n\n const attrBits = attrsToNumber(attrs)\n if (attrBits === 0 && underlineColor === undefined) return\n\n // Separate the underline-style bits (bits 24-26) from the OR-in bits\n // (bits 16-22 — bold, dim, italic, blink, inverse, hidden, strikethrough).\n // Underline REPLACES rather than OR-combines so callers can request a\n // specific style without accumulating with existing ones.\n const UL_MASK = UNDERLINE_STYLE_MASK\n const orInBits = attrBits & ~UL_MASK\n const newUlBits = attrBits & UL_MASK\n const setUnderline = newUlBits !== 0\n const setUnderlineColor = underlineColor !== undefined\n\n // Mark affected rows dirty\n for (let cy = startY; cy < endY; cy++) {\n this._dirtyRows[cy] = 1\n }\n if (this._minDirtyRow === -1 || startY < this._minDirtyRow) this._minDirtyRow = startY\n if (endY - 1 > this._maxDirtyRow) this._maxDirtyRow = endY - 1\n\n const hasTrueColorUl = setUnderlineColor && isTrueColor(underlineColor)\n const trueColorUl = hasTrueColorUl\n ? (underlineColor as { r: number; g: number; b: number })\n : null\n\n for (let cy = startY; cy < endY; cy++) {\n const rowBase = cy * this.width\n for (let cx = startX; cx < endX; cx++) {\n const idx = rowBase + cx\n const oldPacked = this.cells[idx]!\n\n let newPacked = (oldPacked | orInBits) >>> 0\n if (setUnderline) {\n // Clear old underline bits, set new ones\n newPacked = (((newPacked & ~UL_MASK) >>> 0) | newUlBits) >>> 0\n }\n this.cells[idx] = newPacked\n\n if (setUnderlineColor) {\n if (underlineColor === null) {\n this.underlineColors.delete(idx)\n } else if (hasTrueColorUl) {\n this.underlineColors.set(idx, trueColorUl!)\n } else {\n // 256-color / palette index\n this.underlineColors.set(idx, underlineColor!)\n }\n }\n }\n }\n }\n\n /**\n * Clear the buffer (fill with empty cells).\n */\n clear(): void {\n this.cells.fill(0)\n this.chars.fill(\" \")\n this.fgColors.clear()\n this.bgColors.clear()\n this.underlineColors.clear()\n this.hyperlinks.clear()\n this._dirtyRows.fill(1)\n this._minDirtyRow = 0\n this._maxDirtyRow = this.height - 1\n }\n\n /**\n * Copy a region from another buffer.\n */\n copyFrom(\n source: TerminalBuffer,\n srcX: number,\n srcY: number,\n destX: number,\n destY: number,\n width: number,\n height: number,\n ): void {\n const cell = createMutableCell()\n for (let dy = 0; dy < height; dy++) {\n const dstY = destY + dy\n if (dstY >= 0 && dstY < this.height) {\n this._dirtyRows[dstY] = 1\n if (this._minDirtyRow === -1 || dstY < this._minDirtyRow) this._minDirtyRow = dstY\n if (dstY > this._maxDirtyRow) this._maxDirtyRow = dstY\n }\n for (let dx = 0; dx < width; dx++) {\n const sx = srcX + dx\n const sy = srcY + dy\n const dX = destX + dx\n\n if (source.inBounds(sx, sy) && this.inBounds(dX, dstY)) {\n source.readCellInto(sx, sy, cell)\n this.setCell(dX, dstY, { ...cell, selectable: source.isCellSelectable(sx, sy) })\n }\n }\n }\n }\n\n /**\n * Shift content within a rectangular region vertically by `delta` rows.\n * Positive delta = shift content UP (scroll down), negative = shift DOWN (scroll up).\n * Exposed rows (at the bottom for positive delta, top for negative) are filled\n * with the given background cell.\n *\n * Uses Uint32Array.copyWithin for the packed cells (native memcpy) and\n * Array splice for the character array.\n */\n scrollRegion(\n x: number,\n y: number,\n regionWidth: number,\n regionHeight: number,\n delta: number,\n clearCell: CellPatch = {},\n ): void {\n if (delta === 0 || regionHeight <= 0 || regionWidth <= 0) return\n\n const startX = Math.max(0, x)\n const endX = Math.min(x + regionWidth, this.width)\n const startY = Math.max(0, y)\n const endY = Math.min(y + regionHeight, this.height)\n const clampedWidth = endX - startX\n const clampedHeight = endY - startY\n\n if (clampedWidth <= 0 || clampedHeight <= 0) return\n\n // Mark all rows in the scroll region dirty + update bounding box\n for (let r = startY; r < endY; r++) {\n this._dirtyRows[r] = 1\n }\n if (this._minDirtyRow === -1 || startY < this._minDirtyRow) this._minDirtyRow = startY\n if (endY - 1 > this._maxDirtyRow) this._maxDirtyRow = endY - 1\n\n if (Math.abs(delta) >= clampedHeight) {\n // Scroll amount exceeds region — just clear everything\n this.fill(startX, startY, clampedWidth, clampedHeight, {\n char: clearCell.char ?? \" \",\n bg: clearCell.bg ?? null,\n selectable: clearCell.selectable,\n })\n return\n }\n\n const absDelta = Math.abs(delta)\n const w = this.width\n\n if (delta > 0) {\n // Shift content UP: copy rows [startY + delta .. endY) to [startY .. endY - delta)\n for (let row = startY; row < endY - absDelta; row++) {\n const dstBase = row * w\n const srcBase = (row + absDelta) * w\n // Copy cells and chars for the region columns\n this.cells.copyWithin(dstBase + startX, srcBase + startX, srcBase + endX)\n for (let cx = startX; cx < endX; cx++) {\n this.chars[dstBase + cx] = this.chars[srcBase + cx]!\n // Move true color maps\n const srcIdx = srcBase + cx\n const dstIdx = dstBase + cx\n const fgc = this.fgColors.get(srcIdx)\n if (fgc) {\n this.fgColors.set(dstIdx, fgc)\n this.fgColors.delete(srcIdx)\n } else {\n this.fgColors.delete(dstIdx)\n }\n const bgc = this.bgColors.get(srcIdx)\n if (bgc) {\n this.bgColors.set(dstIdx, bgc)\n this.bgColors.delete(srcIdx)\n } else {\n this.bgColors.delete(dstIdx)\n }\n const ulc = this.underlineColors.get(srcIdx)\n if (ulc) {\n this.underlineColors.set(dstIdx, ulc)\n this.underlineColors.delete(srcIdx)\n } else {\n this.underlineColors.delete(dstIdx)\n }\n const hl = this.hyperlinks.get(srcIdx)\n if (hl) {\n this.hyperlinks.set(dstIdx, hl)\n this.hyperlinks.delete(srcIdx)\n } else {\n this.hyperlinks.delete(dstIdx)\n }\n }\n }\n // Clear exposed rows at bottom\n this.fill(startX, endY - absDelta, clampedWidth, absDelta, {\n char: clearCell.char ?? \" \",\n bg: clearCell.bg ?? null,\n selectable: clearCell.selectable,\n })\n } else {\n // Shift content DOWN: copy rows [startY .. endY - absDelta) to [startY + absDelta .. endY)\n for (let row = endY - 1; row >= startY + absDelta; row--) {\n const dstBase = row * w\n const srcBase = (row - absDelta) * w\n this.cells.copyWithin(dstBase + startX, srcBase + startX, srcBase + endX)\n for (let cx = startX; cx < endX; cx++) {\n this.chars[dstBase + cx] = this.chars[srcBase + cx]!\n const srcIdx = srcBase + cx\n const dstIdx = dstBase + cx\n const fgc = this.fgColors.get(srcIdx)\n if (fgc) {\n this.fgColors.set(dstIdx, fgc)\n this.fgColors.delete(srcIdx)\n } else {\n this.fgColors.delete(dstIdx)\n }\n const bgc = this.bgColors.get(srcIdx)\n if (bgc) {\n this.bgColors.set(dstIdx, bgc)\n this.bgColors.delete(srcIdx)\n } else {\n this.bgColors.delete(dstIdx)\n }\n const ulc = this.underlineColors.get(srcIdx)\n if (ulc) {\n this.underlineColors.set(dstIdx, ulc)\n this.underlineColors.delete(srcIdx)\n } else {\n this.underlineColors.delete(dstIdx)\n }\n const hl = this.hyperlinks.get(srcIdx)\n if (hl) {\n this.hyperlinks.set(dstIdx, hl)\n this.hyperlinks.delete(srcIdx)\n } else {\n this.hyperlinks.delete(dstIdx)\n }\n }\n }\n // Clear exposed rows at top\n this.fill(startX, startY, clampedWidth, absDelta, {\n char: clearCell.char ?? \" \",\n bg: clearCell.bg ?? null,\n selectable: clearCell.selectable,\n })\n }\n }\n\n /**\n * Clone this buffer.\n */\n clone(): TerminalBuffer {\n const copy = new TerminalBuffer(this.width, this.height)\n copy.cells.set(this.cells)\n copy.chars = [...this.chars]\n copy.fgColors = new Map(this.fgColors)\n copy.bgColors = new Map(this.bgColors)\n copy.underlineColors = new Map(this.underlineColors)\n copy.hyperlinks = new Map(this.hyperlinks)\n // Clone starts with all rows CLEAN. The render phase will mark only\n // the rows it modifies as dirty. diffBuffers() then skips clean rows,\n // which are guaranteed identical to the prev buffer (since this is a clone).\n copy._dirtyRows.fill(0)\n copy._minDirtyRow = -1\n copy._maxDirtyRow = -1\n // Deep-copy row metadata\n copy._rowMetadata = this._rowMetadata.map((m) => ({ ...m }))\n // Phase 2 Step 5 of paint-clear-invariant L5: outline snapshots no\n // longer live on `TerminalBuffer`. Cross-frame outline state is now\n // owned by `createAg` via `RenderPostState` (see render-post-state.ts).\n // The buffer is now a pure cell store with no across-frame coupling\n // beyond the cells themselves.\n return copy\n }\n\n /**\n * Check if a row has been modified since the last resetDirtyRows() call.\n * Used by diffBuffers() to skip unchanged rows.\n */\n isRowDirty(y: number): boolean {\n if (y < 0 || y >= this.height) return false\n return this._dirtyRows[y] !== 0\n }\n\n /** First dirty row (inclusive), or -1 if no rows are dirty. */\n get minDirtyRow(): number {\n return this._minDirtyRow\n }\n\n /** Last dirty row (inclusive), or -1 if no rows are dirty. */\n get maxDirtyRow(): number {\n return this._maxDirtyRow\n }\n\n /**\n * Reset all dirty row flags to clean.\n * Call after diffing to prepare for the next frame's modifications.\n */\n resetDirtyRows(): void {\n this._dirtyRows.fill(0)\n this._minDirtyRow = -1\n this._maxDirtyRow = -1\n }\n\n /**\n * Mark all rows as dirty.\n * Used when the buffer's dirty rows may not cover all changes relative\n * to a different prev buffer (e.g., after multiple doRender calls where\n * the runtime's prevBuffer skipped intermediate buffers).\n */\n markAllRowsDirty(): void {\n this._dirtyRows.fill(1)\n this._minDirtyRow = 0\n this._maxDirtyRow = this.height - 1\n }\n\n /**\n * Check if two cells at given positions are equal.\n * Used for diffing.\n */\n cellEquals(x: number, y: number, other: TerminalBuffer): boolean {\n if (!this.inBounds(x, y) || !other.inBounds(x, y)) {\n return false\n }\n\n const idx = this.index(x, y)\n const otherIdx = other.index(x, y)\n\n // Quick check: packed metadata must match (mask out SELECTABLE_FLAG — it's\n // selection metadata, not visual output, and must not trigger output diffs)\n const mask = ~SELECTABLE_FLAG\n if ((this.cells[idx]! & mask) !== (other.cells[otherIdx]! & mask)) {\n return false\n }\n\n // Character must match\n if (this.chars[idx] !== other.chars[otherIdx]) {\n return false\n }\n\n // If true color flags are set, check the color values\n const packed = this.cells[idx]!\n if (unpackTrueColorFg(packed)) {\n const a = this.fgColors.get(idx)\n const b = other.fgColors.get(otherIdx)\n if (!colorEquals(a, b)) return false\n }\n if (unpackTrueColorBg(packed!)) {\n const a = this.bgColors.get(idx)\n const b = other.bgColors.get(otherIdx)\n if (!colorEquals(a, b)) return false\n }\n\n // Check underline colors\n const ulA = this.underlineColors.get(idx) ?? null\n const ulB = other.underlineColors.get(otherIdx) ?? null\n if (!colorEquals(ulA, ulB)) return false\n\n // Check hyperlinks\n const hlA = this.hyperlinks.get(idx)\n const hlB = other.hyperlinks.get(otherIdx)\n if (hlA !== hlB) return false\n\n return true\n }\n\n /**\n * Fast check: are all packed metadata values identical for a row?\n * This is a bulk pre-check before per-cell comparison. If metadata differs,\n * we still need per-cell diffing. If metadata matches, we only need to\n * check chars, true color maps, underline colors, and hyperlinks.\n * Returns true if all packed 32-bit values in the row are identical.\n */\n rowMetadataEquals(y: number, other: TerminalBuffer): boolean {\n if (y < 0 || y >= this.height || y >= other.height) return false\n const start = y * this.width\n const otherStart = y * other.width\n const w = Math.min(this.width, other.width)\n // Mask out SELECTABLE_FLAG — it's selection metadata, not visual output\n const mask = ~SELECTABLE_FLAG\n for (let i = 0; i < w; i++) {\n if ((this.cells[start + i]! & mask) !== (other.cells[otherStart + i]! & mask)) return false\n }\n return true\n }\n\n /**\n * Fast check: are all characters identical for a row?\n * Companion to rowMetadataEquals for a two-phase row comparison.\n */\n rowCharsEquals(y: number, other: TerminalBuffer): boolean {\n if (y < 0 || y >= this.height || y >= other.height) return false\n const start = y * this.width\n const otherStart = y * other.width\n const w = Math.min(this.width, other.width)\n for (let i = 0; i < w; i++) {\n if (this.chars[start + i] !== other.chars[otherStart + i]) return false\n }\n return true\n }\n\n /**\n * Check Map-based extras for a row: true color fg/bg, underline colors, hyperlinks.\n * Must be called AFTER rowMetadataEquals confirms packed metadata matches.\n * Only checks cells that have true color flags set (the Maps are only populated\n * for those cells). Also checks underline colors and hyperlinks for all cells.\n */\n rowExtrasEquals(y: number, other: TerminalBuffer): boolean {\n if (y < 0 || y >= this.height || y >= other.height) return false\n const start = y * this.width\n const w = Math.min(this.width, other.width)\n const otherStart = y * other.width\n for (let i = 0; i < w; i++) {\n const idx = start + i\n const otherIdx = otherStart + i\n const packed = this.cells[idx]!\n\n // Check true color fg values\n if ((packed & TRUE_COLOR_FG_FLAG) !== 0) {\n const a = this.fgColors.get(idx)\n const b = other.fgColors.get(otherIdx)\n if (!colorEquals(a, b)) return false\n }\n\n // Check true color bg values\n if ((packed & TRUE_COLOR_BG_FLAG) !== 0) {\n const a = this.bgColors.get(idx)\n const b = other.bgColors.get(otherIdx)\n if (!colorEquals(a, b)) return false\n }\n\n // Check underline colors\n const ulA = this.underlineColors.get(idx) ?? null\n const ulB = other.underlineColors.get(otherIdx) ?? null\n if (!colorEquals(ulA, ulB)) return false\n\n // Check hyperlinks\n const hlA = this.hyperlinks.get(idx)\n const hlB = other.hyperlinks.get(otherIdx)\n if (hlA !== hlB) return false\n }\n return true\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Compare two colors for equality.\n */\nexport function colorEquals(a: Color | undefined, b: Color | undefined): boolean {\n if (a === b) return true\n if (a === null || a === undefined) return b === null || b === undefined\n if (b === null || b === undefined) return false\n if (typeof a === \"number\") return a === b\n if (typeof b === \"number\") return false\n return a.r === b.r && a.g === b.g && a.b === b.b\n}\n\n/**\n * Compare two cells for equality.\n */\nexport function cellEquals(a: Cell, b: Cell): boolean {\n return (\n a.char === b.char &&\n colorEquals(a.fg, b.fg) &&\n colorEquals(a.bg, b.bg) &&\n colorEquals(a.underlineColor, b.underlineColor) &&\n a.wide === b.wide &&\n a.continuation === b.continuation &&\n attrsEquals(a.attrs, b.attrs) &&\n (a.hyperlink ?? undefined) === (b.hyperlink ?? undefined)\n )\n}\n\n/**\n * Compare two CellAttrs for equality.\n */\nexport function attrsEquals(a: CellAttrs, b: CellAttrs): boolean {\n return (\n Boolean(a.bold) === Boolean(b.bold) &&\n Boolean(a.dim) === Boolean(b.dim) &&\n Boolean(a.italic) === Boolean(b.italic) &&\n Boolean(a.underline) === Boolean(b.underline) &&\n (a.underlineStyle ?? false) === (b.underlineStyle ?? false) &&\n Boolean(a.overline) === Boolean(b.overline) &&\n Boolean(a.blink) === Boolean(b.blink) &&\n Boolean(a.inverse) === Boolean(b.inverse) &&\n Boolean(a.hidden) === Boolean(b.hidden) &&\n Boolean(a.strikethrough) === Boolean(b.strikethrough)\n )\n}\n\n/**\n * Compare two styles for equality.\n */\nexport function styleEquals(a: Style | null, b: Style | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return (\n colorEquals(a.fg, b.fg) &&\n colorEquals(a.bg, b.bg) &&\n colorEquals(a.underlineColor, b.underlineColor) &&\n attrsEquals(a.attrs, b.attrs) &&\n (a.hyperlink ?? undefined) === (b.hyperlink ?? undefined)\n )\n}\n\n/**\n * Create a mutable Cell object for use with readCellInto().\n * The returned object is reusable -- readCellInto() overwrites all fields.\n */\nexport function createMutableCell(): Cell {\n return {\n char: \" \",\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n wide: false,\n continuation: false,\n hyperlink: undefined,\n }\n}\n\n/**\n * Create a buffer initialized with a specific character.\n */\nexport function createBuffer(width: number, height: number, char = \" \"): TerminalBuffer {\n const buffer = new TerminalBuffer(width, height)\n if (char !== \" \") {\n buffer.fill(0, 0, width, height, { char })\n }\n return buffer\n}\n\n// ============================================================================\n// Buffer Conversion Utilities\n// ============================================================================\n\n/**\n * Convert a terminal buffer to plain text (no ANSI codes).\n * Useful for snapshot testing and text-based assertions.\n *\n * @param buffer The buffer to convert\n * @param options.trimTrailingWhitespace Remove trailing spaces from each line (default: true)\n * @param options.trimEmptyLines Remove trailing empty lines (default: true)\n * @returns Plain text representation of the buffer\n */\nexport function bufferToText(\n buffer: TerminalBuffer,\n options: {\n trimTrailingWhitespace?: boolean\n trimEmptyLines?: boolean\n } = {},\n): string {\n const { trimTrailingWhitespace = true, trimEmptyLines = true } = options\n\n const lines: string[] = []\n\n for (let y = 0; y < buffer.height; y++) {\n let line = \"\"\n // Track string offset for each column (needed because continuation cells\n // are skipped, making string length != column count for wide chars)\n let strOffset = 0\n let contentEdgeStrOffset = 0\n const contentEdge = trimTrailingWhitespace ? getContentEdge(buffer, y) : 0\n for (let x = 0; x < buffer.width; x++) {\n // Use zero-allocation accessors instead of getCell()\n if (buffer.isCellContinuation(x, y)) continue\n line += buffer.getCellChar(x, y)\n strOffset++\n // Track the string offset corresponding to the content edge column\n if (x < contentEdge) {\n contentEdgeStrOffset = strOffset\n }\n }\n if (trimTrailingWhitespace) {\n // Smart trim: use content edge to preserve styled trailing spaces\n // while removing unstyled buffer padding.\n const trimmed = line.trimEnd()\n line =\n trimmed.length >= contentEdgeStrOffset ? trimmed : line.substring(0, contentEdgeStrOffset)\n }\n lines.push(line)\n }\n\n let result = lines.join(\"\\n\")\n if (trimEmptyLines) {\n // Remove trailing empty lines without stripping spaces from last content line\n while (lines.length > 0 && lines[lines.length - 1]!.length === 0) {\n lines.pop()\n }\n result = lines.join(\"\\n\")\n }\n return result\n}\n\n/**\n * Find the rightmost column with non-default cell content on a row.\n * A default cell has packed metadata === 0 (no fg, bg, attrs) AND char === ' '.\n * Returns the column count (1-indexed), so the content edge for trimming.\n */\nfunction getContentEdge(buffer: TerminalBuffer, y: number): number {\n // Mask out structural flags (wide, continuation) that don't indicate actual content.\n // Also mask SELECTABLE_FLAG (bit 31) — it's selection metadata, not styling.\n // True-color flags DO indicate styled content (they mean fg/bg is set in Maps).\n const FLAG_MASK = ~(WIDE_FLAG | CONTINUATION_FLAG | SELECTABLE_FLAG)\n for (let x = buffer.width - 1; x >= 0; x--) {\n // Skip continuation cells (trailing half of wide chars) — the main cell covers them\n if (buffer.isCellContinuation(x, y)) continue\n // Check if cell has any actual styling (fg, bg, text attrs) after masking structural flags\n const attrs = buffer.getCellAttrs(x, y) & FLAG_MASK\n if (attrs !== 0) return x + 1\n // Check if cell has a non-space character\n if (buffer.getCellChar(x, y) !== \" \") return x + 1\n }\n return 0\n}\n\n/**\n * Convert a terminal buffer to styled ANSI text.\n * Unlike bufferToAnsi, this doesn't include cursor control sequences,\n * making it suitable for displaying in terminals or saving to files.\n *\n * @param buffer The buffer to convert\n * @param options.trimTrailingWhitespace Remove trailing spaces from each line (default: true)\n * @param options.trimEmptyLines Remove trailing empty lines (default: true)\n * @returns ANSI-styled text (no cursor control)\n */\nexport function bufferToStyledText(\n buffer: TerminalBuffer,\n options: {\n trimTrailingWhitespace?: boolean\n trimEmptyLines?: boolean\n } = {},\n): string {\n const { trimTrailingWhitespace = true, trimEmptyLines = true } = options\n\n const lines: string[] = []\n let currentStyle: Style | null = null\n let currentHyperlink: string | undefined\n\n for (let y = 0; y < buffer.height; y++) {\n let line = \"\"\n\n for (let x = 0; x < buffer.width; x++) {\n // getCell allocates a fresh object each call, which is fine here since\n // bufferToStyledText is a utility function, not a hot render path.\n const cell = buffer.getCell(x, y)\n // Skip continuation cells (part of wide character)\n if (cell.continuation) continue\n\n // Check if hyperlink changed (OSC 8 is separate from SGR)\n const cellHyperlink = cell.hyperlink\n if (cellHyperlink !== currentHyperlink) {\n if (currentHyperlink) {\n // Close previous hyperlink using the same format as the open\n line += emitHyperlinkClose(currentHyperlink)\n }\n if (cellHyperlink) {\n line += emitHyperlinkOpen(cellHyperlink)\n }\n currentHyperlink = cellHyperlink\n }\n\n // Check if style changed — emit minimal transition (chalk-compatible)\n const cellStyle: Style = {\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: cell.attrs,\n }\n if (!styleEquals(currentStyle, cellStyle)) {\n line += styleTransitionCodes(currentStyle, cellStyle)\n currentStyle = cellStyle\n }\n\n line += cell.char\n }\n\n // Close any open hyperlink at end of line\n if (currentHyperlink) {\n line += emitHyperlinkClose(currentHyperlink)\n currentHyperlink = undefined\n }\n\n // Reset style at end of line using per-attribute resets (chalk-compatible)\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n line += styleResetCodes(currentStyle)\n currentStyle = null\n }\n\n if (trimTrailingWhitespace) {\n // Need to be careful not to strip ANSI codes\n // Only trim actual whitespace at the end\n line = trimTrailingWhitespacePreservingAnsi(line)\n }\n lines.push(line)\n }\n\n // Final per-attribute reset (chalk-compatible)\n let result = lines.join(\"\\n\")\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n result += styleResetCodes(currentStyle)\n }\n\n if (trimEmptyLines) {\n // Remove empty lines at the end (but preserve ANSI resets)\n result = result.replace(/\\n+$/, \"\")\n }\n\n return result\n}\n\n// ============================================================================\n// Hyperlink Format Helpers\n// ============================================================================\n\n/**\n * Decode hyperlink format metadata from URL prefix.\n * parseAnsiText encodes the original OSC format (C1 vs ESC, BEL vs ST)\n * as a prefix: \\x01<tag>\\x02<url>\n *\n * Tags:\n * c1b = C1 OSC (\\x9d) + BEL (\\x07) terminator\n * c1s = C1 OSC (\\x9d) + ST (\\x1b\\\\) terminator\n * e7b = ESC OSC (\\x1b]) + BEL (\\x07) terminator\n * (no prefix) = ESC OSC + ST (default)\n */\nfunction decodeHyperlinkFormat(encoded: string): {\n url: string\n oscIntro: string\n oscClose: string\n closeIntro: string\n closeTerminator: string\n} {\n if (encoded.charCodeAt(0) === 1) {\n const sepIdx = encoded.indexOf(\"\\x02\")\n if (sepIdx > 0) {\n const tag = encoded.slice(1, sepIdx)\n const url = encoded.slice(sepIdx + 1)\n if (tag === \"c1b\") {\n return {\n url,\n oscIntro: \"\\x9d\",\n oscClose: \"\\x9d\",\n closeIntro: \"\\x9d\",\n closeTerminator: \"\\x07\",\n }\n }\n if (tag === \"c1s\") {\n return {\n url,\n oscIntro: \"\\x9d\",\n oscClose: \"\\x9d\",\n closeIntro: \"\\x9d\",\n closeTerminator: \"\\x1b\\\\\",\n }\n }\n if (tag === \"e7b\") {\n return {\n url,\n oscIntro: \"\\x1b]\",\n oscClose: \"\\x1b]\",\n closeIntro: \"\\x1b]\",\n closeTerminator: \"\\x07\",\n }\n }\n }\n }\n // Default: ESC OSC + ST\n return {\n url: encoded,\n oscIntro: \"\\x1b]\",\n oscClose: \"\\x1b]\",\n closeIntro: \"\\x1b]\",\n closeTerminator: \"\\x1b\\\\\",\n }\n}\n\n/** Emit OSC 8 hyperlink open sequence, respecting format metadata in URL. */\nfunction emitHyperlinkOpen(encoded: string): string {\n const fmt = decodeHyperlinkFormat(encoded)\n return `${fmt.oscIntro}8;;${fmt.url}${fmt.closeTerminator}`\n}\n\n/** Emit OSC 8 hyperlink close sequence, respecting format metadata in URL. */\nfunction emitHyperlinkClose(encoded: string): string {\n const fmt = decodeHyperlinkFormat(encoded)\n return `${fmt.closeIntro}8;;${fmt.closeTerminator}`\n}\n\n// ============================================================================\n// xterm-256 Color Palette\n// ============================================================================\n\n/** Standard xterm-256 color palette as hex strings. */\nconst XTERM_256_PALETTE: string[] = (() => {\n const palette: string[] = new Array(256)\n\n // Colors 0-7: standard colors\n const standard = [\n \"#000000\",\n \"#cd0000\",\n \"#00cd00\",\n \"#cdcd00\",\n \"#0000ee\",\n \"#cd00cd\",\n \"#00cdcd\",\n \"#e5e5e5\",\n ]\n // Colors 8-15: bright colors\n const bright = [\n \"#7f7f7f\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#5c5cff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n for (let i = 0; i < 8; i++) {\n palette[i] = standard[i]!\n palette[i + 8] = bright[i]!\n }\n\n // Colors 16-231: 6x6x6 RGB cube\n const cubeValues = [0, 95, 135, 175, 215, 255]\n for (let i = 0; i < 216; i++) {\n const r = cubeValues[Math.floor(i / 36)]!\n const g = cubeValues[Math.floor((i % 36) / 6)]!\n const b = cubeValues[i % 6]!\n palette[16 + i] =\n \"#\" +\n r.toString(16).padStart(2, \"0\") +\n g.toString(16).padStart(2, \"0\") +\n b.toString(16).padStart(2, \"0\")\n }\n\n // Colors 232-255: grayscale ramp\n for (let i = 0; i < 24; i++) {\n const v = 8 + i * 10\n const hex = v.toString(16).padStart(2, \"0\")\n palette[232 + i] = \"#\" + hex + hex + hex\n }\n\n return palette\n})()\n\n/**\n * Convert a Color value to a CSS color string.\n * Returns null for default/inherit colors.\n */\nfunction colorToCSS(color: Color): string | null {\n if (color === null) return null\n if (typeof color === \"number\") {\n return XTERM_256_PALETTE[color] ?? null\n }\n // DEFAULT_BG sentinel → no CSS color (use inherited/default)\n if (color.r === -1) return null\n return `rgb(${color.r},${color.g},${color.b})`\n}\n\n// ============================================================================\n// Buffer to HTML Conversion\n// ============================================================================\n\n/**\n * Convert a terminal buffer to a full HTML document.\n * Suitable for rendering as a screenshot via headless browser.\n *\n * @param buffer The buffer to convert\n * @param options.fontFamily CSS font-family (default: 'JetBrains Mono, Menlo, monospace')\n * @param options.fontSize CSS font-size in px (default: 14)\n * @param options.theme Color scheme (default: 'dark')\n * @returns Complete HTML document string\n */\nexport function bufferToHTML(\n buffer: TerminalBuffer,\n options: {\n fontFamily?: string\n fontSize?: number\n theme?: \"dark\" | \"light\"\n } = {},\n): string {\n const { fontFamily = \"JetBrains Mono, Menlo, monospace\", fontSize = 14, theme = \"dark\" } = options\n\n const defaultFg = theme === \"dark\" ? \"#d4d4d4\" : \"#1e1e1e\"\n const defaultBg = theme === \"dark\" ? \"#1e1e1e\" : \"#ffffff\"\n\n const htmlLines: string[] = []\n\n for (let y = 0; y < buffer.height; y++) {\n let lineHTML = \"\"\n let currentStyle: Style | null = null\n let spanOpen = false\n let linkOpen = false\n let currentHyperlink: string | undefined\n\n for (let x = 0; x < buffer.width; x++) {\n const cell = buffer.getCell(x, y)\n if (cell.continuation) continue\n\n // Handle hyperlink transitions\n const cellHyperlink = cell.hyperlink\n if (cellHyperlink !== currentHyperlink) {\n if (linkOpen) {\n if (spanOpen) {\n lineHTML += \"</span>\"\n spanOpen = false\n }\n lineHTML += \"</a>\"\n linkOpen = false\n }\n if (cellHyperlink) {\n lineHTML += `<a href=\"${escapeHTML(cellHyperlink)}\">`\n linkOpen = true\n }\n currentHyperlink = cellHyperlink\n }\n\n const cellStyle: Style = {\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: cell.attrs,\n }\n\n if (!styleEquals(currentStyle, cellStyle)) {\n if (spanOpen) {\n lineHTML += \"</span>\"\n spanOpen = false\n }\n const css = styleToCSSProperties(cellStyle, defaultFg, defaultBg)\n if (css) {\n lineHTML += `<span style=\"${css}\">`\n spanOpen = true\n }\n currentStyle = cellStyle\n }\n\n lineHTML += escapeHTML(cell.char)\n }\n\n if (spanOpen) {\n lineHTML += \"</span>\"\n }\n if (linkOpen) {\n lineHTML += \"</a>\"\n currentHyperlink = undefined\n }\n\n htmlLines.push(`<div>${lineHTML}</div>`)\n }\n\n return `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"></head>\n<body style=\"margin:0;padding:0;background:${defaultBg};color:${defaultFg};font-family:${fontFamily};font-size:${fontSize}px;line-height:1.2;white-space:pre\">\n${htmlLines.join(\"\\n\")}\n</body>\n</html>`\n}\n\n/**\n * Convert a Style to CSS inline style properties.\n * Returns null if the style is entirely default.\n */\nfunction styleToCSSProperties(style: Style, defaultFg: string, defaultBg: string): string | null {\n const parts: string[] = []\n\n // Handle inverse: swap fg/bg\n let fgColor: string | null\n let bgColor: string | null\n if (style.attrs.inverse) {\n fgColor = colorToCSS(style.bg) ?? defaultBg\n bgColor = colorToCSS(style.fg) ?? defaultFg\n } else {\n fgColor = colorToCSS(style.fg)\n bgColor = colorToCSS(style.bg)\n }\n\n if (fgColor) parts.push(`color:${fgColor}`)\n if (bgColor) parts.push(`background:${bgColor}`)\n if (style.attrs.bold) parts.push(\"font-weight:bold\")\n if (style.attrs.dim) parts.push(\"opacity:0.5\")\n if (style.attrs.italic) parts.push(\"font-style:italic\")\n if (style.attrs.hidden) parts.push(\"visibility:hidden\")\n\n // Text decoration: underline and/or strikethrough\n const decorations: string[] = []\n const underlineStyle = style.attrs.underlineStyle\n if (typeof underlineStyle === \"string\") {\n const cssStyleMap: Record<string, string> = {\n single: \"solid\",\n double: \"double\",\n curly: \"wavy\",\n dotted: \"dotted\",\n dashed: \"dashed\",\n }\n decorations.push(\"underline\")\n const cssStyle = cssStyleMap[underlineStyle]\n if (cssStyle) parts.push(`text-decoration-style:${cssStyle}`)\n const ulColor = colorToCSS(style.underlineColor ?? null)\n if (ulColor) parts.push(`text-decoration-color:${ulColor}`)\n } else if (style.attrs.underline) {\n decorations.push(\"underline\")\n }\n if (style.attrs.strikethrough) decorations.push(\"line-through\")\n if (decorations.length > 0) parts.push(`text-decoration:${decorations.join(\" \")}`)\n\n return parts.length > 0 ? parts.join(\";\") : null\n}\n\n/** Escape special HTML characters. */\nfunction escapeHTML(str: string): string {\n if (str === \" \" || str.length === 0) return str\n return str\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n}\n\n/**\n * Check if any text attributes are active.\n */\nexport function hasActiveAttrs(attrs: CellAttrs): boolean {\n return !!(\n attrs.bold ||\n attrs.dim ||\n attrs.italic ||\n attrs.underline ||\n attrs.underlineStyle ||\n attrs.overline ||\n attrs.blink ||\n attrs.inverse ||\n attrs.hidden ||\n attrs.strikethrough\n )\n}\n\n/**\n * Convert style to ANSI escape sequence.\n *\n * Uses SGR 7 for inverse so terminals correctly swap fg/bg\n * (including default terminal colors that have no explicit ANSI code).\n */\n// =============================================================================\n// Color code helpers (imported from ansi/sgr-codes.ts)\n// =============================================================================\n\n/**\n * Convert style to ANSI escape sequence (chalk-compatible format).\n *\n * Emits only non-default attributes with no reset prefix. Called when there\n * is no previous style context (first cell), so the terminal is already in\n * reset state. Each attribute gets its own \\x1b[Xm sequence.\n */\nexport function styleToAnsiCodes(style: Style): string {\n const fg = style.fg\n const bg = style.bg\n\n let result = \"\"\n\n // Foreground color\n if (fg !== null) {\n result += `\\x1b[${fgColorCode(fg)}m`\n }\n\n // Background color (DEFAULT_BG sentinel = terminal default, skip)\n if (bg !== null && !isDefaultBg(bg)) {\n result += `\\x1b[${bgColorCode(bg)}m`\n }\n\n // Attributes\n if (style.attrs.bold) result += \"\\x1b[1m\"\n if (style.attrs.dim) result += \"\\x1b[2m\"\n if (style.attrs.italic) result += \"\\x1b[3m\"\n\n // Underline: use SGR 4:x if style specified, otherwise simple SGR 4\n const underlineStyle = style.attrs.underlineStyle\n if (typeof underlineStyle === \"string\") {\n const styleMap: Record<string, number> = {\n single: 1,\n double: 2,\n curly: 3,\n dotted: 4,\n dashed: 5,\n }\n const subparam = styleMap[underlineStyle]\n if (subparam !== undefined && subparam !== 0) {\n result += `\\x1b[4:${subparam}m`\n }\n } else if (style.attrs.underline) {\n result += \"\\x1b[4m\" // Simple underline\n }\n\n // Use SGR 7 for inverse — lets the terminal correctly swap fg/bg\n if (style.attrs.inverse) result += \"\\x1b[7m\"\n if (style.attrs.strikethrough) result += \"\\x1b[9m\"\n if (style.attrs.overline) result += \"\\x1b[53m\"\n\n // Underline color (SGR 58)\n if (style.underlineColor !== null && style.underlineColor !== undefined) {\n if (typeof style.underlineColor === \"number\") {\n result += `\\x1b[58;5;${style.underlineColor}m`\n } else {\n result += `\\x1b[58;2;${style.underlineColor.r};${style.underlineColor.g};${style.underlineColor.b}m`\n }\n }\n\n return result\n}\n\n/**\n * Compute the minimal SGR transition between two styles (chalk-compatible).\n *\n * When oldStyle is null (first cell or after reset), falls through to\n * full generation via styleToAnsiCodes. Otherwise, diffs attribute\n * by attribute and emits only changed SGR codes as individual \\x1b[Xm sequences.\n */\nexport function styleTransitionCodes(oldStyle: Style | null, newStyle: Style): string {\n // First cell or after reset — full generation\n if (!oldStyle) return styleToAnsiCodes(newStyle)\n\n // Same style — nothing to emit\n if (styleEquals(oldStyle, newStyle)) return \"\"\n\n let result = \"\"\n const oa = oldStyle.attrs\n const na = newStyle.attrs\n\n // Bold and dim share SGR 22 as their off-code\n const boldChanged = Boolean(oa.bold) !== Boolean(na.bold)\n const dimChanged = Boolean(oa.dim) !== Boolean(na.dim)\n if (boldChanged || dimChanged) {\n const boldOff = boldChanged && !na.bold\n const dimOff = dimChanged && !na.dim\n if (boldOff || dimOff) {\n result += \"\\x1b[22m\"\n if (na.bold) result += \"\\x1b[1m\"\n if (na.dim) result += \"\\x1b[2m\"\n } else {\n if (boldChanged && na.bold) result += \"\\x1b[1m\"\n if (dimChanged && na.dim) result += \"\\x1b[2m\"\n }\n }\n if (Boolean(oa.italic) !== Boolean(na.italic)) {\n result += na.italic ? \"\\x1b[3m\" : \"\\x1b[23m\"\n }\n\n // Underline\n const oldUl = Boolean(oa.underline)\n const newUl = Boolean(na.underline)\n const oldUlStyle = oa.underlineStyle ?? false\n const newUlStyle = na.underlineStyle ?? false\n if (oldUl !== newUl || oldUlStyle !== newUlStyle) {\n if (typeof na.underlineStyle === \"string\") {\n const styleMap: Record<string, number> = {\n single: 1,\n double: 2,\n curly: 3,\n dotted: 4,\n dashed: 5,\n }\n const sub = styleMap[na.underlineStyle]\n if (sub !== undefined && sub !== 0) {\n result += `\\x1b[4:${sub}m`\n } else if (newUl) {\n result += \"\\x1b[4m\"\n } else {\n result += \"\\x1b[24m\"\n }\n } else if (newUl) {\n result += \"\\x1b[4m\"\n } else {\n result += \"\\x1b[24m\"\n }\n }\n\n if (Boolean(oa.inverse) !== Boolean(na.inverse)) {\n result += na.inverse ? \"\\x1b[7m\" : \"\\x1b[27m\"\n }\n if (Boolean(oa.strikethrough) !== Boolean(na.strikethrough)) {\n result += na.strikethrough ? \"\\x1b[9m\" : \"\\x1b[29m\"\n }\n // Overline (SGR 53/55)\n if (Boolean(oa.overline) !== Boolean(na.overline)) {\n result += na.overline ? \"\\x1b[53m\" : \"\\x1b[55m\"\n }\n\n // Foreground color\n if (!colorEquals(oldStyle.fg, newStyle.fg)) {\n if (newStyle.fg === null) {\n result += \"\\x1b[39m\"\n } else {\n result += `\\x1b[${fgColorCode(newStyle.fg)}m`\n }\n }\n\n // Background color\n if (!colorEquals(oldStyle.bg, newStyle.bg)) {\n if (newStyle.bg === null) {\n result += \"\\x1b[49m\"\n } else {\n result += `\\x1b[${bgColorCode(newStyle.bg)}m`\n }\n }\n\n // Underline color (SGR 58/59)\n if (!colorEquals(oldStyle.underlineColor, newStyle.underlineColor)) {\n if (newStyle.underlineColor === null || newStyle.underlineColor === undefined) {\n result += \"\\x1b[59m\"\n } else if (typeof newStyle.underlineColor === \"number\") {\n result += `\\x1b[58;5;${newStyle.underlineColor}m`\n } else {\n result += `\\x1b[58;2;${newStyle.underlineColor.r};${newStyle.underlineColor.g};${newStyle.underlineColor.b}m`\n }\n }\n\n return result\n}\n\n/**\n * Emit per-attribute reset codes for all active attributes in a style.\n * Returns empty string if no attributes are active.\n * Uses individual \\x1b[Xm sequences to match chalk's format.\n */\nexport function styleResetCodes(style: Style): string {\n let result = \"\"\n // Attributes (order: underline, bold/dim, italic, strikethrough, inverse — matches chalk close order)\n if (style.attrs.underline || style.attrs.underlineStyle) result += \"\\x1b[24m\"\n if (style.attrs.bold || style.attrs.dim) result += \"\\x1b[22m\"\n if (style.attrs.italic) result += \"\\x1b[23m\"\n if (style.attrs.strikethrough) result += \"\\x1b[29m\"\n if (style.attrs.inverse) result += \"\\x1b[27m\"\n if (style.attrs.overline) result += \"\\x1b[55m\"\n // Colors\n if (style.bg !== null && !isDefaultBg(style.bg)) result += \"\\x1b[49m\"\n if (style.fg !== null) result += \"\\x1b[39m\"\n // Underline color\n if (style.underlineColor !== null && style.underlineColor !== undefined) result += \"\\x1b[59m\"\n return result\n}\n\n/**\n * Trim trailing whitespace from a string while preserving ANSI codes.\n */\nexport function trimTrailingWhitespacePreservingAnsi(str: string): string {\n // Find the last non-whitespace character or ANSI escape\n let lastContentIndex = -1\n let i = 0\n\n while (i < str.length) {\n if (str[i] === \"\\x1b\") {\n // Check for OSC sequence (ESC ] ... ST or BEL)\n if (str[i + 1] === \"]\") {\n // Find the terminator: ST (\\x1b\\\\) or BEL (\\x07)\n let end = -1\n for (let j = i + 2; j < str.length; j++) {\n if (str[j] === \"\\x07\") {\n end = j\n break\n }\n if (str[j] === \"\\x1b\" && str[j + 1] === \"\\\\\") {\n end = j + 1\n break\n }\n }\n if (end !== -1) {\n lastContentIndex = end\n i = end + 1\n continue\n }\n }\n // Found SGR escape - skip the entire sequence\n const end = str.indexOf(\"m\", i)\n if (end !== -1) {\n lastContentIndex = end\n i = end + 1\n continue\n }\n }\n if (str[i] !== \" \" && str[i] !== \"\\t\") {\n lastContentIndex = i\n }\n i++\n }\n\n return str.slice(0, lastContentIndex + 1)\n}\n\n// ============================================================================\n// TextFrame — Immutable Snapshot\n// ============================================================================\n\nimport type { TextFrame, FrameCell, RGB } from \"@silvery/ag/text-frame\"\n\n/**\n * Standard ANSI 256-color palette → RGB lookup.\n * Colors 0-15: standard + bright colors (approximate).\n * Colors 16-231: 6×6×6 color cube.\n * Colors 232-255: grayscale ramp.\n *\n * Exported for the backdrop-fade pipeline pass, which needs to resolve\n * palette-indexed cells to RGB before blending via `@silvery/color`.\n */\nexport function ansi256ToRgb(idx: number): RGB {\n if (idx < 16) {\n // Standard 16 colors (same values used by xterm)\n const table: [number, number, number][] = [\n [0, 0, 0],\n [128, 0, 0],\n [0, 128, 0],\n [128, 128, 0],\n [0, 0, 128],\n [128, 0, 128],\n [0, 128, 128],\n [192, 192, 192],\n [128, 128, 128],\n [255, 0, 0],\n [0, 255, 0],\n [255, 255, 0],\n [0, 0, 255],\n [255, 0, 255],\n [0, 255, 255],\n [255, 255, 255],\n ]\n const [r, g, b] = table[idx]!\n return { r, g, b }\n }\n if (idx < 232) {\n // 6×6×6 color cube (indices 16-231)\n const i = idx - 16\n const r = Math.floor(i / 36)\n const g = Math.floor((i % 36) / 6)\n const b = i % 6\n return {\n r: r ? r * 40 + 55 : 0,\n g: g ? g * 40 + 55 : 0,\n b: b ? b * 40 + 55 : 0,\n }\n }\n // Grayscale ramp (indices 232-255)\n const v = (idx - 232) * 10 + 8\n return { r: v, g: v, b: v }\n}\n\n/** Resolve a buffer Color (number | RGB | null) to FrameCell RGB (RGB | null). */\nfunction resolveColor(color: Color): RGB | null {\n if (color === null) return null\n if (typeof color === \"number\") return ansi256ToRgb(color)\n // RGB object — check for DEFAULT_BG sentinel\n if (color.r === -1) return null\n return color\n}\n\n/** Convert a buffer Cell to an immutable FrameCell with resolved RGB colors. */\nexport function cellToFrameCell(c: Cell): FrameCell {\n const ulStyle =\n c.attrs.underlineStyle ?? (c.attrs.underline ? (\"single\" as const) : (false as const))\n return {\n char: c.char,\n fg: resolveColor(c.fg),\n bg: resolveColor(c.bg),\n bold: c.attrs.bold ?? false,\n dim: c.attrs.dim ?? false,\n italic: c.attrs.italic ?? false,\n underline: ulStyle,\n underlineColor: resolveColor(c.underlineColor ?? null),\n overline: c.attrs.overline ?? false,\n strikethrough: c.attrs.strikethrough ?? false,\n inverse: c.attrs.inverse ?? false,\n blink: c.attrs.blink ?? false,\n hidden: c.attrs.hidden ?? false,\n wide: c.wide,\n continuation: c.continuation,\n hyperlink: c.hyperlink ?? null,\n }\n}\n\n/** Empty FrameCell returned for out-of-bounds access. */\nexport const EMPTY_FRAME_CELL: FrameCell = Object.freeze({\n char: \" \",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false as const,\n underlineColor: null,\n overline: false,\n strikethrough: false,\n inverse: false,\n blink: false,\n hidden: false,\n wide: false,\n continuation: false,\n hyperlink: null,\n})\n\n/**\n * Create an immutable TextFrame snapshot from a TerminalBuffer.\n *\n * The snapshot is detached from the source buffer — mutations to the buffer\n * after this call do not affect the frame. Text and ANSI are lazily computed\n * on first access.\n *\n * This is the primary public read API for rendered output. Internal pipeline\n * code (diff-buffers, render phases) continues to use TerminalBuffer directly.\n */\nexport function createTextFrame(buffer: TerminalBuffer): TextFrame {\n const width = buffer.width\n const height = buffer.height\n\n // Snapshot: lazy clone — only on first text/ansi/cell access. Hot test\n // paths create frames they never read, so eager cloning charges every\n // caller for an 80K-cell buffer copy that's discarded immediately.\n // Callers who need true construction-time detachment (i.e. the frame\n // must be safe across buffer mutations between createTextFrame() and\n // first read) should request an eager/COW snapshot via a dedicated path\n // instead of relying on createTextFrame()'s default.\n let _snapshot: TerminalBuffer | undefined\n function getSnapshot(): TerminalBuffer {\n if (!_snapshot) _snapshot = buffer.clone()\n return _snapshot\n }\n\n // Cell data: lazy — only built on first cell() access.\n // At 400x200, eager construction creates 80,000 Cell objects (~10ms).\n // Most frames only access .text or .ansi, never individual cells.\n let _cellData: Cell[] | undefined\n function getCellData(): Cell[] {\n if (!_cellData) {\n const snap = getSnapshot()\n _cellData = new Array(width * height)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n _cellData[y * width + x] = snap.getCell(x, y)\n }\n }\n }\n return _cellData\n }\n\n // Lazy caches\n let _text: string | undefined\n let _ansi: string | undefined\n let _lines: string[] | undefined\n\n const frame: TextFrame = {\n width,\n height,\n\n get text(): string {\n if (_text === undefined) _text = bufferToText(getSnapshot())\n return _text\n },\n\n get ansi(): string {\n if (_ansi === undefined) _ansi = bufferToStyledText(getSnapshot())\n return _ansi\n },\n\n get lines(): string[] {\n if (_lines === undefined) _lines = frame.text.split(\"\\n\")\n return _lines\n },\n\n cell(col: number, row: number): FrameCell {\n if (col < 0 || col >= width || row < 0 || row >= height) {\n return EMPTY_FRAME_CELL\n }\n return cellToFrameCell(getCellData()[row * width + col]!)\n },\n\n containsText(text: string): boolean {\n return frame.text.includes(text)\n },\n }\n\n return frame\n}\n","/**\n * Text Sizing Protocol (OSC 66) -- Kitty v0.40+\n *\n * Lets the app specify how many cells a character should occupy.\n * This solves the measurement/rendering mismatch for Private Use Area (PUA)\n * characters (nerdfont icons, powerline symbols) that `string-width` reports\n * as 1-cell but terminals render as 2-cell.\n *\n * When OSC 66 is used with w=2, both the app's layout engine and the terminal\n * agree on the character width, eliminating truncation and misalignment.\n *\n * Protocol format:\n * ESC ] 66 ; w=<width> ; <text> BEL\n *\n * Post km-silvery.unicode-plateau Phase 2 (2026-04-23): this module reads\n * ZERO environment variables. Capability detection lives entirely in\n * `@silvery/ansi`'s `createTerminalProfile`. Consumers pass `TerminalCaps`\n * (or an explicit fingerprint string for the probe cache) so the module is\n * pure w.r.t. environment and browser/canvas targets aren't broken.\n *\n * @see https://sw.kovidgoyal.net/kitty/text-sizing-protocol/\n */\n\nimport type { TerminalCaps } from \"@silvery/ansi\"\n\nconst OSC = \"\\x1b]\"\nconst ST = \"\\x07\" // BEL terminator (more compatible than ESC \\)\n\n/**\n * Wrap text in an OSC 66 sequence that tells the terminal to render it\n * in exactly `width` cells.\n */\nexport function textSized(text: string, width: number): string {\n return `${OSC}66;w=${width};${text}${ST}`\n}\n\n// ============================================================================\n// Text Scale (font size multiplier) — OSC 66 s= parameter\n// ============================================================================\n\n/**\n * Generate an OSC 66 escape sequence to set the text scale (font size).\n *\n * The scale is a floating-point multiplier:\n * - 2.0 = double size (headings)\n * - 1.0 = normal\n * - 0.5 = half size (small print, annotations)\n *\n * The scale applies to all subsequent text until reset or changed.\n * Only supported in Kitty v0.40+.\n *\n * @param scale - Font size multiplier (e.g. 2.0 for double, 0.5 for half)\n */\nexport function textScaled(scale: number): string {\n return `${OSC}66;s=${scale}${ST}`\n}\n\n/**\n * Generate an OSC 66 escape sequence to reset text scale to default (1.0).\n */\nexport function resetTextScale(): string {\n return `${OSC}66;s=1${ST}`\n}\n\n/**\n * Check if a code point is in the Private Use Area (PUA).\n * Covers BMP PUA (U+E000-U+F8FF) and Supplementary PUA-A/B.\n */\nexport function isPrivateUseArea(cp: number): boolean {\n return (\n (cp >= 0xe000 && cp <= 0xf8ff) || // BMP PUA\n (cp >= 0xf0000 && cp <= 0xffffd) || // Supplementary PUA-A\n (cp >= 0x100000 && cp <= 0x10fffd) // Supplementary PUA-B\n )\n}\n\n// ============================================================================\n// Probe fingerprint + result cache\n// ============================================================================\n\n/**\n * Structural subset of the terminal profile's emulator the fingerprint helper\n * needs. Accepts any object with `program` + `version` strings (typically\n * `profile.emulator` or `term.emulator`).\n */\nexport interface FingerprintEmulator {\n readonly program: string\n readonly version: string\n}\n\n/**\n * Build a terminal fingerprint for cache keying. Combines `program` +\n * `version` from the supplied emulator to uniquely identify the terminal\n * type. Different versions may add/remove OSC 66 support, so version is part\n * of the key.\n *\n * Post unicode-plateau Phase 2: the emulator argument is required — the\n * legacy env-reading variant is gone. Callers building fingerprints from a\n * one-shot probe can use `createTerminalProfile().emulator` upstream.\n */\nexport function getTerminalFingerprint(emulator: FingerprintEmulator): string {\n const program = emulator.program || \"unknown\"\n const version = emulator.version || \"unknown\"\n return `${program}@${version}`\n}\n\n/** Result of text sizing probe */\nexport interface TextSizingProbeResult {\n supported: boolean\n widthOnly: boolean\n}\n\n/**\n * Cache of probe results by terminal fingerprint.\n * Persists across app instances in the same process so the probe\n * only runs once per terminal type.\n */\nconst probeCache = new Map<string, TextSizingProbeResult>()\n\n/**\n * Get a cached probe result for the given fingerprint, if available.\n */\nexport function getCachedProbeResult(fingerprint: string): TextSizingProbeResult | undefined {\n return probeCache.get(fingerprint)\n}\n\n/**\n * Store a probe result in the cache for the given fingerprint.\n */\nexport function setCachedProbeResult(fingerprint: string, result: TextSizingProbeResult): void {\n probeCache.set(fingerprint, result)\n}\n\n/**\n * Clear the probe cache. Useful for testing.\n */\nexport function clearProbeCache(): void {\n probeCache.clear()\n}\n\n// ============================================================================\n// Async probe\n// ============================================================================\n\n/**\n * Detect terminal support for the text sizing protocol.\n * Uses cursor position reports (CPR) to check if OSC 66 advances the cursor\n * by the specified width.\n *\n * Results are cached by fingerprint so the probe only runs once per terminal\n * type per process.\n *\n * @param write - Writer function (TUI output)\n * @param read - Reader function (CPR response source)\n * @param fingerprint - Cache key. Derived via {@link getTerminalFingerprint}\n * from `TerminalCaps`; callers inside a running session typically compute\n * it once from `term.profile.caps`.\n * @param timeout - Per-probe timeout in ms (default 1000)\n * @returns Object with `supported` and `widthOnly` flags:\n * - supported=true, widthOnly=false: full support (scale + width)\n * - supported=true, widthOnly=true: width mode only\n * - supported=false: no support\n */\nexport async function detectTextSizingSupport(\n write: (data: string) => void,\n read: () => Promise<string>,\n fingerprint: string,\n timeout = 1000,\n): Promise<TextSizingProbeResult> {\n // Check cache first\n const cached = getCachedProbeResult(fingerprint)\n if (cached !== undefined) return cached\n\n // Detection sequence:\n // 1. CR to column 0\n // 2. OSC 66 w=2 with a space character\n // 3. Request CPR (cursor position report)\n // If cursor is at column 3 (1-indexed), w=2 worked\n const testSequence = \"\\r\" + textSized(\" \", 2) + \"\\x1b[6n\" + \"\\r\\x1b[K\"\n write(testSequence)\n\n try {\n const response = await Promise.race([\n read(),\n new Promise<string>((_resolve, reject) =>\n setTimeout(() => reject(new Error(\"timeout\")), timeout),\n ),\n ])\n\n // Parse CPR response: ESC [ row ; col R\n const match = response.match(/\\x1b\\[(\\d+);(\\d+)R/)\n if (match) {\n const col = Number(match[2])\n // Column 3 means the space occupied 2 cells (col is 1-indexed, started at 1)\n if (col === 3) {\n const result: TextSizingProbeResult = { supported: true, widthOnly: false }\n setCachedProbeResult(fingerprint, result)\n return result\n }\n }\n\n const result: TextSizingProbeResult = { supported: false, widthOnly: false }\n setCachedProbeResult(fingerprint, result)\n return result\n } catch {\n const result: TextSizingProbeResult = { supported: false, widthOnly: false }\n setCachedProbeResult(fingerprint, result)\n return result\n }\n}\n","/**\n * Unicode handling for Silvery.\n *\n * Uses Intl.Segmenter for proper grapheme cluster segmentation and\n * string-width for accurate terminal width calculation.\n *\n * Key concepts:\n * - Grapheme: A user-perceived character (may be multiple code points)\n * - Display width: How many terminal columns a character occupies (0, 1, or 2)\n * - Wide characters: CJK ideographs, emoji, etc. that take 2 columns\n * - Combining characters: Diacritics, emoji modifiers that take 0 columns\n */\n\nimport { BG_OVERRIDE_CODE } from \"./ansi/index\"\nimport sliceAnsi from \"slice-ansi\"\nimport stringWidth from \"string-width\"\nimport {\n type Cell,\n type Style,\n type TerminalBuffer,\n type UnderlineStyle,\n createMutableCell,\n} from \"./buffer\"\nimport { isPrivateUseArea } from \"./text-sizing\"\n\n// Re-export for consumers of silvery\nexport { BG_OVERRIDE_CODE }\n\n// ============================================================================\n// Grapheme Segmentation\n// ============================================================================\n\n// Singleton Intl.Segmenter instance (stateless, reusable)\nconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\n// ============================================================================\n// Performance: LRU Cache for displayWidth\n// ============================================================================\n\n/**\n * Simple LRU cache for displayWidth results.\n * String width calculation is expensive (~8us for ASCII text),\n * but the same strings are often measured repeatedly.\n */\nclass DisplayWidthCache {\n private cache = new Map<string, number>()\n private maxSize: number\n\n constructor(maxSize = 1000) {\n this.maxSize = maxSize\n }\n\n get(text: string): number | undefined {\n const cached = this.cache.get(text)\n if (cached !== undefined) {\n // Move to end (most recently used)\n this.cache.delete(text)\n this.cache.set(text, cached)\n }\n return cached\n }\n\n set(text: string, width: number): void {\n // Evict oldest if at capacity\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value\n if (firstKey !== undefined) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(text, width)\n }\n\n clear(): void {\n this.cache.clear()\n }\n}\n\n// Cache size: 10K entries should be enough for most TUI apps\n// Each entry is a string key + number value, ~100 bytes, so 10K = ~1MB\nconst displayWidthCache = new DisplayWidthCache(10000)\n\n// ============================================================================\n// Text Sizing Protocol (OSC 66) State\n// ============================================================================\n\n/**\n * Default text-presentation emoji width: true (modern terminal assumption).\n * Modern terminals (Ghostty, iTerm, Kitty) render text-presentation emoji\n * as 2-wide. Terminal.app renders them as 1-wide.\n */\nconst DEFAULT_TEXT_EMOJI_WIDE = true\n\n/**\n * Default text sizing mode: false.\n * When enabled via a Measurer, PUA characters are treated as 2-wide.\n */\nconst DEFAULT_TEXT_SIZING_ENABLED = false\n\n// ============================================================================\n// Scoped Measurer (pipeline execution context)\n// ============================================================================\n\n/**\n * Active measurer for the current pipeline execution.\n * Set by runWithMeasurer() during pipeline execution, restored after.\n * When null, module-level functions use the lazy default measurer.\n */\nlet _scopedMeasurer: Measurer | null = null\n\n/**\n * Run a function with a specific measurer as the active scope.\n * Module-level convenience functions (graphemeWidth, displayWidth, etc.)\n * will use this measurer instead of the lazy default for the duration.\n */\nexport function runWithMeasurer<T>(measurer: Measurer, fn: () => T): T {\n const prev = _scopedMeasurer\n _scopedMeasurer = measurer\n try {\n return fn()\n } finally {\n _scopedMeasurer = prev\n }\n}\n\n/**\n * Check if text sizing mode is currently enabled.\n * Returns the default (false) since globals have been removed.\n * Use measurer.textSizing for scoped queries.\n */\nexport function isTextSizingEnabled(): boolean {\n if (_scopedMeasurer) return _scopedMeasurer.textSizing\n return DEFAULT_TEXT_SIZING_ENABLED\n}\n\n// ============================================================================\n// Width Measurer (per-term instance, no globals)\n// ============================================================================\n\n/**\n * Width measurement functions scoped to specific terminal capabilities.\n * Created by createMeasurer() from TerminalCaps.\n */\nexport interface Measurer {\n readonly maybeWideEmojis: boolean\n readonly textSizing: boolean\n /** Height of one line in measurement units. Terminal: 1 (one cell row). Canvas pixel: e.g. 20. */\n readonly lineHeight: number\n displayWidth(text: string): number\n displayWidthAnsi(text: string): number\n graphemeWidth(grapheme: string): number\n wrapText(\n text: string,\n width: number,\n trim?: boolean,\n hard?: boolean,\n truncateAtomicOverflow?: boolean,\n ): string[]\n sliceByWidth(text: string, maxWidth: number): string\n sliceByWidthFromEnd(text: string, maxWidth: number): string\n}\n\n/**\n * Strip OSC 8 hyperlink sequences before passing to slice-ansi.\n * slice-ansi doesn't understand OSC sequences and corrupts them.\n */\nconst OSC8_RE = /\\x1b\\]8;;[^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g\nfunction stripOsc8ForSlice(text: string): string {\n return text.replace(OSC8_RE, \"\")\n}\n\n/**\n * Create a width measurer scoped to terminal capabilities.\n * Each measurer has its own caches (no shared global state).\n */\nexport function createMeasurer(\n caps: { maybeWideEmojis?: boolean; textSizing?: boolean } = {},\n): Measurer {\n const maybeWideEmojis = caps.maybeWideEmojis ?? true\n const textSizing = caps.textSizing ?? false\n const cache = new DisplayWidthCache(10000)\n\n function measuredGraphemeWidth(grapheme: string): number {\n const width = stringWidth(grapheme)\n if (width !== 1) return width\n if (maybeWideEmojis && isTextPresentationEmoji(grapheme)) return 2\n if (textSizing) {\n const cp = grapheme.codePointAt(0)\n if (cp !== undefined && isPrivateUseArea(cp)) return 2\n }\n return width\n }\n\n function measuredDisplayWidth(text: string): number {\n const cached = cache.get(text)\n if (cached !== undefined) return cached\n\n let width: number\n const needsSlowPath =\n MAY_CONTAIN_TEXT_EMOJI.test(text) || (textSizing && MAY_CONTAIN_PUA.test(text))\n if (!needsSlowPath) {\n width = stringWidth(text)\n } else {\n const stripped = stripAnsi(text)\n width = 0\n for (const grapheme of splitGraphemes(stripped)) {\n width += measuredGraphemeWidth(grapheme)\n }\n }\n cache.set(text, width)\n return width\n }\n\n function measuredDisplayWidthAnsi(text: string): number {\n return measuredDisplayWidth(stripAnsi(text))\n }\n\n function measuredSliceByWidth(text: string, maxWidth: number): string {\n if (hasAnsi(text)) {\n return sliceAnsi(stripOsc8ForSlice(text), 0, maxWidth)\n }\n let width = 0\n let result = \"\"\n const graphemes = splitGraphemes(text)\n for (const grapheme of graphemes) {\n const gWidth = measuredGraphemeWidth(grapheme)\n if (width + gWidth > maxWidth) break\n result += grapheme\n width += gWidth\n }\n return result\n }\n\n function measuredSliceByWidthFromEnd(text: string, maxWidth: number): string {\n const totalWidth = measuredDisplayWidthAnsi(text)\n if (totalWidth <= maxWidth) return text\n if (hasAnsi(text)) {\n const cleaned = stripOsc8ForSlice(text)\n const cleanedWidth = measuredDisplayWidthAnsi(cleaned)\n const startIndex = cleanedWidth - maxWidth\n return sliceAnsi(cleaned, startIndex)\n }\n const graphemes = splitGraphemes(text)\n let width = 0\n let startIdx = graphemes.length\n for (let i = graphemes.length - 1; i >= 0; i--) {\n const gWidth = measuredGraphemeWidth(graphemes[i]!)\n if (width + gWidth > maxWidth) break\n width += gWidth\n startIdx = i\n }\n return graphemes.slice(startIdx).join(\"\")\n }\n\n function measuredWrapText(\n text: string,\n width: number,\n trim?: boolean,\n hard?: boolean,\n truncateAtomicOverflow?: boolean,\n ): string[] {\n return wrapTextWithMeasurer(\n text,\n width,\n measurer,\n trim ?? false,\n hard ?? false,\n true,\n truncateAtomicOverflow ?? false,\n )\n }\n\n const measurer: Measurer = {\n maybeWideEmojis,\n textSizing,\n lineHeight: 1,\n displayWidth: measuredDisplayWidth,\n displayWidthAnsi: measuredDisplayWidthAnsi,\n graphemeWidth: measuredGraphemeWidth,\n wrapText: measuredWrapText,\n sliceByWidth: measuredSliceByWidth,\n sliceByWidthFromEnd: measuredSliceByWidthFromEnd,\n }\n\n return measurer\n}\n\n// ============================================================================\n// Default Measurer (lazy singleton for module-level convenience functions)\n// ============================================================================\n\nlet _defaultMeasurer: Measurer | undefined\n\n/** Get the default measurer (lazy init, uses default caps). */\nfunction getDefaultMeasurer(): Measurer {\n if (!_defaultMeasurer) {\n _defaultMeasurer = createMeasurer()\n }\n return _defaultMeasurer\n}\n\n/**\n * Split a string into grapheme clusters.\n * Each grapheme is a user-perceived character that may consist of\n * multiple Unicode code points.\n *\n * Examples:\n * - \"cafe\\u0301\" (café with combining accent) -> [\"c\", \"a\", \"f\", \"e\\u0301\"]\n * - \"👨‍👩‍👧\" (family emoji) -> [\"👨‍👩‍👧\"]\n * - \"한국어\" -> [\"한\", \"국\", \"어\"]\n */\nexport function splitGraphemes(text: string): string[] {\n return [...segmenter.segment(text)].map((s) => s.segment)\n}\n\n/**\n * Count the number of graphemes in a string.\n */\nexport function graphemeCount(text: string): number {\n let count = 0\n for (const _ of segmenter.segment(text)) count++\n return count\n}\n\n// ============================================================================\n// Emoji Width Correction\n// ============================================================================\n\n/**\n * Regex for Extended_Pictographic characters that have default text presentation.\n * These characters are reported as width 1 by string-width (per Unicode EAW),\n * but most modern terminals render them as 2 columns wide using emoji glyphs.\n *\n * Specifically: Extended_Pictographic AND NOT Emoji_Presentation.\n * Examples: ⚠ (U+26A0), ☑ (U+2611), ✈ (U+2708), ❤ (U+2764)\n * Counter-examples: 📁 (U+1F4C1) has Emoji_Presentation so string-width is correct.\n *\n * Uses the RGI_Emoji regex with VS16 to detect characters that support\n * emoji presentation -- if char+VS16 is RGI emoji, the terminal likely\n * renders the bare char as 2-wide.\n */\nconst TEXT_PRESENTATION_EMOJI_REGEX = /^\\p{Extended_Pictographic}$/u\nconst EMOJI_PRESENTATION_REGEX = /^\\p{Emoji_Presentation}$/u\nconst RGI_EMOJI_REGEX = /^\\p{RGI_Emoji}$/v\n\n/**\n * Cache for isTextPresentationEmoji results.\n * Maps first code point to boolean.\n */\nconst textPresentationEmojiCache = new Map<number, boolean>()\n\n/**\n * Check if a grapheme is a text-presentation emoji that terminals render wide.\n *\n * Returns true for characters that are Extended_Pictographic, do NOT have\n * the Emoji_Presentation property, but become RGI emoji when followed by\n * VS16 (U+FE0F). These characters are rendered as 2 columns in most\n * modern terminals despite string-width reporting width 1.\n */\nexport function isTextPresentationEmoji(grapheme: string): boolean {\n const cp = grapheme.codePointAt(0)\n if (cp === undefined) return false\n\n // Multi-codepoint graphemes (with VS16, ZWJ, etc.) are already handled\n // correctly by string-width. Only check single-codepoint graphemes.\n //\n // Important: this gate must run before the codepoint cache. U+FE0E\n // text-presentation clusters such as \"⏸︎\" share the same first codepoint\n // as bare \"⏸\", but have different width semantics. Caching by base\n // codepoint for multi-codepoint clusters makes width depend on call order.\n const singleChar = String.fromCodePoint(cp)\n if (singleChar.length !== grapheme.length) {\n return false\n }\n\n // Check cache for single-codepoint graphemes only.\n const cached = textPresentationEmojiCache.get(cp)\n if (cached !== undefined) return cached\n\n // Must be Extended_Pictographic but NOT Emoji_Presentation\n const isExtPict = TEXT_PRESENTATION_EMOJI_REGEX.test(grapheme)\n const isEmojiPres = EMOJI_PRESENTATION_REGEX.test(grapheme)\n if (!isExtPict || isEmojiPres) {\n textPresentationEmojiCache.set(cp, false)\n return false\n }\n\n // Check if adding VS16 makes it an RGI emoji sequence\n const withVs16 = grapheme + \"\\uFE0F\"\n const result = RGI_EMOJI_REGEX.test(withVs16)\n textPresentationEmojiCache.set(cp, result)\n return result\n}\n\n// ============================================================================\n// Private Use Area (PUA) — Nerdfont / Powerline Icons\n// ============================================================================\n\n/**\n * Append VS16 (U+FE0F) to emoji characters that have default text presentation.\n *\n * Use this to normalize icon characters for consistent terminal rendering.\n * Characters that already have emoji presentation or VS16 are returned unchanged.\n *\n * @example\n * ```ts\n * ensureEmojiPresentation('⚠') // '⚠\\uFE0F' (⚠️)\n * ensureEmojiPresentation('☑') // '☑\\uFE0F' (☑️)\n * ensureEmojiPresentation('☐') // '☐' (unchanged, not an emoji)\n * ensureEmojiPresentation('📁') // '📁' (unchanged, already emoji presentation)\n * ```\n */\nexport function ensureEmojiPresentation(char: string): string {\n if (char.includes(\"\\uFE0F\")) return char // Already has VS16\n if (isTextPresentationEmoji(char)) return char + \"\\uFE0F\"\n return char\n}\n\n// ============================================================================\n// Display Width Calculation\n// ============================================================================\n\n/**\n * Regex to detect strings that MAY contain text-presentation emoji.\n * Used as a fast pre-check before the more expensive grapheme-based calculation.\n * Covers the Unicode blocks where Extended_Pictographic characters live:\n * - Miscellaneous Technical (U+2300-U+23FF)\n * - Miscellaneous Symbols (U+2600-U+26FF)\n * - Dingbats (U+2700-U+27BF)\n * - Miscellaneous Symbols and Arrows (U+2B00-U+2BFF)\n * - Other scattered ranges\n */\nconst MAY_CONTAIN_TEXT_EMOJI =\n /[\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26A7\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]/\n\n/**\n * Fast pre-check regex for BMP Private Use Area characters (U+E000-U+F8FF).\n * Used to gate the slow grapheme-by-grapheme path when text sizing is enabled.\n */\nconst MAY_CONTAIN_PUA = /[\\uE000-\\uF8FF]/\n\n/**\n * Get the display width of a string (number of terminal columns).\n * Uses string-width which handles:\n * - Wide characters (CJK) -> 2 columns\n * - Regular ASCII -> 1 column\n * - Zero-width characters (combining, ZWJ) -> 0 columns\n * - Emoji -> varies (1 or 2)\n * - ANSI escape sequences -> 0 columns (stripped)\n *\n * Corrects string-width for text-presentation emoji characters\n * (e.g., ⚠ U+26A0) that terminals render as 2 columns wide.\n *\n * Results are cached for performance.\n */\nexport function displayWidth(text: string): number {\n if (_scopedMeasurer) return _scopedMeasurer.displayWidth(text)\n // Check cache first\n const cached = displayWidthCache.get(text)\n if (cached !== undefined) {\n return cached\n }\n\n let width: number\n // Fast path: if text cannot contain text-presentation emoji, use string-width directly.\n // Default measurer does not enable text sizing, so PUA check uses the constant default.\n const needsSlowPath =\n MAY_CONTAIN_TEXT_EMOJI.test(text) || (DEFAULT_TEXT_SIZING_ENABLED && MAY_CONTAIN_PUA.test(text))\n if (!needsSlowPath) {\n width = stringWidth(text)\n } else {\n // Slow path: strip ANSI codes first (they'd inflate the grapheme count),\n // then split into graphemes and sum corrected widths\n const stripped = stripAnsi(text)\n width = 0\n for (const grapheme of splitGraphemes(stripped)) {\n width += graphemeWidth(grapheme)\n }\n }\n\n displayWidthCache.set(text, width)\n return width\n}\n\n/**\n * Get the display width of a single grapheme.\n *\n * Overrides string-width for characters that are Extended_Pictographic with\n * default text presentation. These characters (e.g., ⚠ U+26A0, ☑ U+2611)\n * are reported as width 1 by string-width (per Unicode EAW tables), but most\n * modern terminals render them as 2 columns wide using emoji glyphs.\n *\n * The mismatch causes text after these characters to be placed at the wrong\n * column, leading to truncation or overlap.\n */\nexport function graphemeWidth(grapheme: string): number {\n if (_scopedMeasurer) return _scopedMeasurer.graphemeWidth(grapheme)\n const width = stringWidth(grapheme)\n // If string-width already says 2 (or 0), trust it\n if (width !== 1) return width\n // Check if this is a text-presentation emoji that terminals render wide.\n // Uses DEFAULT_TEXT_EMOJI_WIDE (true) — assumes modern terminal.\n if (DEFAULT_TEXT_EMOJI_WIDE && isTextPresentationEmoji(grapheme)) return 2\n // Default module-level function does not enable text sizing.\n // Scoped measurers handle PUA via their own graphemeWidth.\n if (DEFAULT_TEXT_SIZING_ENABLED) {\n const cp = grapheme.codePointAt(0)\n if (cp !== undefined && isPrivateUseArea(cp)) return 2\n }\n return width\n}\n\n/**\n * Check if a grapheme is a wide character (takes 2 columns).\n */\nexport function isWideGrapheme(grapheme: string): boolean {\n return graphemeWidth(grapheme) === 2\n}\n\n/**\n * Check if a grapheme is zero-width (combining character, ZWJ, etc.).\n */\nexport function isZeroWidthGrapheme(grapheme: string): boolean {\n return stringWidth(grapheme) === 0\n}\n\n// ============================================================================\n// Text Manipulation\n// ============================================================================\n\n/**\n * Truncate a string to fit within a given display width.\n * Handles wide characters and ANSI escape sequences (including OSC 8 hyperlinks) correctly.\n *\n * @param text - The text to truncate (may contain ANSI escape sequences)\n * @param maxWidth - Maximum display width\n * @param ellipsis - Ellipsis to append if truncated (default: \"...\")\n * @returns Truncated string\n */\nexport function truncateText(\n text: string,\n maxWidth: number,\n ellipsis = \"\\u2026\", // Unicode ellipsis (single character)\n): string {\n const textWidth = displayWidth(text)\n\n // No truncation needed\n if (textWidth <= maxWidth) {\n return text\n }\n\n const ellipsisWidth = displayWidth(ellipsis)\n const targetWidth = maxWidth - ellipsisWidth\n\n if (targetWidth <= 0) {\n // Not enough space for even the ellipsis\n return maxWidth > 0 ? ellipsis.slice(0, maxWidth) : \"\"\n }\n\n // Use ANSI-aware grapheme splitting when text contains escape sequences\n // (including OSC 8 hyperlinks) to avoid counting escape bytes as visible width.\n const graphemes = hasAnsi(text) ? splitGraphemesAnsiAware(text) : splitGraphemes(text)\n let result = \"\"\n let currentWidth = 0\n\n for (const grapheme of graphemes) {\n const gWidth = graphemeWidth(grapheme)\n if (currentWidth + gWidth > targetWidth) {\n break\n }\n result += grapheme\n currentWidth += gWidth\n }\n\n return result + ellipsis\n}\n\n/**\n * Pad a string to a given display width.\n *\n * @param text - The text to pad\n * @param width - Target display width\n * @param align - Alignment: 'left', 'right', or 'center'\n * @param padChar - Character to use for padding (default: space)\n * @returns Padded string\n */\nexport function padText(\n text: string,\n width: number,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n padChar = \" \",\n): string {\n const textWidth = displayWidth(text)\n const padWidth = width - textWidth\n\n if (padWidth <= 0) {\n return text\n }\n\n const padCharWidth = displayWidth(padChar)\n if (padCharWidth === 0) {\n // Can't pad with zero-width characters\n return text\n }\n\n // Calculate number of pad characters needed\n const padCount = Math.floor(padWidth / padCharWidth)\n\n switch (align) {\n case \"left\":\n return text + padChar.repeat(padCount)\n case \"right\":\n return padChar.repeat(padCount) + text\n case \"center\": {\n const leftPad = Math.floor(padCount / 2)\n const rightPad = padCount - leftPad\n return padChar.repeat(leftPad) + text + padChar.repeat(rightPad)\n }\n }\n}\n\n/**\n * Constrain text to width and height limits.\n * Combines wrapping and truncation to fit text in a box.\n *\n * @param text - Text to constrain (may contain ANSI codes)\n * @param width - Maximum display width per line\n * @param maxLines - Maximum number of lines\n * @param pad - If true, pad lines to full width\n * @param ellipsis - Custom ellipsis character (default: \"…\")\n * @returns Object with lines array and truncated flag\n */\nexport function constrainText(\n text: string,\n width: number,\n maxLines: number,\n pad = false,\n ellipsis = \"…\",\n): { lines: string[]; truncated: boolean } {\n const allLines = wrapText(text, width)\n const truncated = allLines.length > maxLines\n let lines = allLines.slice(0, maxLines)\n\n if (truncated && lines.length > 0) {\n const lastIdx = lines.length - 1\n const lastLine = lines[lastIdx]\n if (lastLine) {\n const ellipsisLen = displayWidth(ellipsis)\n const lastLineLen = displayWidth(lastLine)\n if (lastLineLen + ellipsisLen <= width) {\n lines[lastIdx] = lastLine + ellipsis\n } else {\n lines[lastIdx] = truncateText(lastLine, width, ellipsis)\n }\n }\n }\n\n if (pad) {\n lines = lines.map((line) => padText(line, width))\n }\n\n return { lines, truncated }\n}\n\n/**\n * Check if a grapheme is a hard word-boundary character — space or tab.\n *\n * Hyphen-minus (`-`) is intentionally NOT a boundary: CSS, browsers, and\n * `@chenglou/pretext` all keep hyphenated tokens together (`cmd-hover` stays\n * one word, not `cmd-` + `hover`). When a hyphenated token is wider than its\n * container the wrap algorithm falls back to the atomic-overflow path\n * (analogous to CSS `overflow-wrap: anywhere`), not a hyphen split. See\n * `@km/silvery/wrap-stop-breaking-at-hyphen` for the rationale.\n */\nexport function isWordBoundary(grapheme: string): boolean {\n return grapheme === \" \" || grapheme === \"\\t\"\n}\n\n/**\n * Check if a grapheme is a *soft* break point inside a token — a separator\n * that paths and identifiers commonly use, so the wrap algorithm can split\n * `.claude/skills/{claim,do}/SKILL.md` at a `/` (or `,`) instead of either\n * letting it overflow or hard-character-wrapping mid-word.\n *\n * Soft break points are SECONDARY: the wrap algorithm prefers true word\n * boundaries (`isWordBoundary`) and only falls back to soft breaks when no\n * hard boundary fits on the current line. Breaking AFTER the separator\n * keeps the boundary character with its left context — `path/` on one\n * line, `to` on the next — which matches how readers visually parse paths.\n *\n * The set is deliberately conservative:\n * - filesystem path separators (`/`, `\\`)\n * - namespace / scope separators (`.`, `:`)\n * - identifier joins (`_`)\n * - list separators (`,`)\n *\n * Brackets/parens (`{ } [ ] ( )`) are EXCLUDED because they pair —\n * breaking after `(` would orphan the opening delimiter from its\n * matching close. The CSS spec does the same. Operator characters\n * (`= ? & |`) are also excluded — they're either part of structural\n * punctuation (URL query strings, expressions) or already handled by\n * `isBreakBeforeOperatorWith` for orphan suppression.\n */\nexport function isSoftBreakPoint(grapheme: string): boolean {\n return (\n grapheme === \"/\" ||\n grapheme === \"\\\\\" ||\n grapheme === \".\" ||\n grapheme === \"_\" ||\n grapheme === \":\" ||\n grapheme === \",\"\n )\n}\n\n/**\n * Look ahead from a space to check if the next word is a single-character\n * operator (like +, =, *, /, etc.) followed by another space. Breaking before\n * such operators looks bad — e.g. \"$12k\\n+ $400\" — so we suppress the break\n * point to keep the operator with its left operand.\n *\n * Accepts an explicit graphemeWidth function so it works with both the\n * module-level default and per-measurer instances.\n */\nfunction isBreakBeforeOperatorWith(\n graphemes: string[],\n spaceIndex: number,\n gWidthFn: (g: string) => number,\n): boolean {\n // Look for pattern: [current space] [operator] [space]\n // spaceIndex is the index of the current space in the graphemes array\n let j = spaceIndex + 1\n // Skip any zero-width characters (ANSI escapes)\n while (j < graphemes.length && gWidthFn(graphemes[j]!) === 0) j++\n if (j >= graphemes.length) return false\n const nextChar = graphemes[j]!\n // Must be a single visible character that is not alphanumeric or space\n if (gWidthFn(nextChar) !== 1) return false\n if (/^[a-zA-Z0-9\\s]$/.test(nextChar)) return false\n // Check that it's followed by a space (it's an infix operator, not a prefix)\n let k = j + 1\n while (k < graphemes.length && gWidthFn(graphemes[k]!) === 0) k++\n if (k >= graphemes.length) return false\n return graphemes[k] === \" \"\n}\n\n/**\n * Check if a grapheme can break anywhere (CJK characters).\n * CJK text doesn't use spaces between words, so any character boundary is valid.\n */\nexport function canBreakAnywhere(grapheme: string): boolean {\n return isCJK(grapheme)\n}\n\n// ANSI CSI pattern: ESC [ (params) (letter)\nconst ANSI_CSI_RE = /^\\x1b\\[[0-9;:?]*[A-Za-z]/\n// ANSI OSC pattern: ESC ] ... (BEL or ST)\nconst ANSI_OSC_RE = /^\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/\n// Single-char escape: ESC followed by one letter\nconst ANSI_SINGLE_RE = /^\\x1b[DME78(B]/\n\n/**\n * Split text into graphemes, keeping ANSI escape sequences as single zero-width tokens.\n * Without this, `splitGraphemes` would split `\\x1b[38;5;1m` into individual characters\n * like `[`, `3`, `8`, `;`, etc., each consuming display width.\n */\nexport function splitGraphemesAnsiAware(text: string): string[] {\n if (!hasAnsi(text)) {\n return splitGraphemes(text)\n }\n\n const result: string[] = []\n let pos = 0\n\n while (pos < text.length) {\n if (text[pos] === \"\\x1b\") {\n // Try to match an ANSI sequence starting at pos\n const remaining = text.slice(pos)\n const csi = remaining.match(ANSI_CSI_RE)\n if (csi) {\n result.push(csi[0])\n pos += csi[0].length\n continue\n }\n const osc = remaining.match(ANSI_OSC_RE)\n if (osc) {\n result.push(osc[0])\n pos += osc[0].length\n continue\n }\n const single = remaining.match(ANSI_SINGLE_RE)\n if (single) {\n result.push(single[0])\n pos += single[0].length\n continue\n }\n }\n\n // Find the next ESC or end of string\n const nextEsc = text.indexOf(\"\\x1b\", pos + 1)\n const chunk = nextEsc === -1 ? text.slice(pos) : text.slice(pos, nextEsc)\n\n // Split this non-ANSI chunk into graphemes\n for (const g of splitGraphemes(chunk)) {\n result.push(g)\n }\n pos += chunk.length\n }\n\n return result\n}\n\n/**\n * Wrap text to fit within a given width.\n *\n * Implements word-boundary wrapping:\n * 1. Breaks at word boundaries (spaces, hyphens) when possible\n * 2. Falls back to character wrap only when necessary (very long words)\n * 3. Handles CJK text properly (can break anywhere since CJK has no word spaces)\n * 4. Preserves intentional line breaks\n *\n * @param text - The text to wrap (may contain ANSI escape sequences)\n * @param width - Maximum display width per line\n * @param preserveNewlines - Whether to preserve existing newlines\n * @param trim - Trim trailing spaces on broken lines and skip leading spaces on continuation lines (useful for rendering)\n * @param truncateAtomicOverflow - When true, an unbreakable token wider than\n * `width` (no soft-break separator) ends with a Unicode `…` ellipsis on\n * the offending line and the rest of the token is dropped, instead of\n * character-wrapping. Implements the `wrap=\"wrap-truncate\"` mode —\n * CSS-equivalent `overflow-wrap: break-word` + `text-overflow: ellipsis`.\n * Default `false` preserves existing character-wrap fallback (`wrap=\"wrap\"`).\n * @returns Array of wrapped lines\n */\nexport function wrapText(\n text: string,\n width: number,\n preserveNewlines = true,\n trim = false,\n truncateAtomicOverflow = false,\n): string[] {\n // When a scoped measurer with its own wrapText is active (e.g., Pretext),\n // delegate to it directly — it uses word-level measurement (layoutWithLines)\n // rather than character-by-character accumulation via wrapTextWithMeasurer.\n if (_scopedMeasurer?.wrapText) {\n return _scopedMeasurer.wrapText(text, width, trim, false, truncateAtomicOverflow)\n }\n return wrapTextWithMeasurer(\n text,\n width,\n _scopedMeasurer ?? undefined,\n trim,\n false,\n preserveNewlines,\n truncateAtomicOverflow,\n )\n}\n\n/** Get the active line height (from scoped measurer if set, else 1). */\nexport function getActiveLineHeight(): number {\n return _scopedMeasurer?.lineHeight ?? 1\n}\n\n/**\n * One per-visual-line slice produced by `wrapTextWithOffsets`. The offsets\n * are character indices into the *original* input text, so callers can\n * align selection ranges, syntax highlighting, or any per-cell decoration\n * onto the wrapped layout without re-running the wrap algorithm.\n *\n * Convention: `endOffset` is exclusive — `text === source.slice(start, end)`\n * for hard wraps. Soft wraps that swallow a whitespace boundary keep the\n * boundary char inside the offset window (so consecutive `endOffset`s\n * advance past the swallowed character) but omit it from `text` — see the\n * comment block in `wrapTextWithOffsets` for rationale.\n */\nexport interface WrapTextSlice {\n readonly text: string\n readonly startOffset: number\n readonly endOffset: number\n}\n\n/**\n * Wrap text and return offset-tagged slices — one per visual line.\n *\n * This is the offset-aware sibling of `wrapText`. It implements the same\n * word-boundary algorithm as `wrapTextWithMeasurer` but tracks grapheme\n * indices into the source so the geometry layer (`computeSelectionFragments`\n * in `@silvery/ag`) can project a selection range onto each visual row\n * without ambiguity.\n *\n * **No newline preservation, no trim**: the contract is \"one paragraph in,\n * one slice list out.\" Callers split on `\\n` themselves and walk\n * paragraphs through this helper. That keeps the offset mapping simple —\n * paragraph-relative slices translate to source offsets via a single\n * paragraph-start addition. The geometry layer needs neither trim nor\n * newline handling; existing `wrapText` keeps both for the rendering path.\n *\n * **Boundary-character handling**: when a soft wrap drops a boundary\n * (space/hyphen) — e.g. `\"hello world\"` at width 5 produces visible lines\n * `[\"hello\", \"world\"]` — the next slice's `startOffset` advances past the\n * dropped char so visual-line indices remain in source-position lockstep.\n * This means `text.length <= endOffset - startOffset` for soft-wrapped\n * lines (selection-range arithmetic uses the offsets, not the slice\n * length).\n *\n * Returns `[]` for empty text. Returns a single-slice passthrough for text\n * that fits in `width` without wrapping. Width `<= 0` is treated as\n * \"don't wrap\" (single passthrough slice) — callers receive geometry they\n * can project onto a clipped/zero-width content rect without a divide-by-zero.\n */\nexport function wrapTextWithOffsets(text: string, width: number): WrapTextSlice[] {\n if (text.length === 0) return []\n if (width <= 0) {\n // Edge case: caller gave us a non-positive width (clipped content rect,\n // pre-layout). Don't wrap; emit one passthrough so downstream offset\n // math doesn't have to special-case empty arrays.\n return [{ text, startOffset: 0, endOffset: text.length }]\n }\n\n const measurer = _scopedMeasurer\n const gWidthFn = measurer ? measurer.graphemeWidth.bind(measurer) : graphemeWidth\n\n // ANSI-aware grapheme split — zero-width tokens flow through with the\n // previous visible grapheme so they don't disturb the offset count.\n const graphemes = splitGraphemesAnsiAware(text)\n\n // Pre-compute each grapheme's source offset (start index in `text`).\n // `splitGraphemesAnsiAware` preserves all bytes, so offsets are simply\n // running cumulative lengths.\n const grapheneOffsets: number[] = new Array(graphemes.length)\n {\n let pos = 0\n for (let i = 0; i < graphemes.length; i++) {\n grapheneOffsets[i] = pos\n pos += graphemes[i]!.length\n }\n }\n\n const out: WrapTextSlice[] = []\n let currentLine = \"\"\n let currentWidth = 0\n let lineStartGraphemeIdx = 0\n\n // Last word-boundary break point inside the current line.\n let lastBreakIndex = -1 // char position within currentLine\n let lastBreakWidth = 0\n let lastBreakGraphemeIdx = -1 // index into `graphemes` AFTER the break\n\n // Last soft (intra-token) break point — used only when no hard break\n // fits. See `isSoftBreakPoint` for the rationale; same triple shape as\n // the hard-break tracker but stays unused unless we'd otherwise\n // character-wrap mid-token.\n let lastSoftBreakIndex = -1\n let lastSoftBreakWidth = 0\n let lastSoftBreakGraphemeIdx = -1\n\n function pushLine(endGraphemeIdx: number): void {\n // endGraphemeIdx is the FIRST grapheme that does NOT belong to this\n // line. The slice covers source [lineStartOffset, breakOffset).\n const startOffset = grapheneOffsets[lineStartGraphemeIdx] ?? text.length\n const endOffset =\n endGraphemeIdx < graphemes.length\n ? (grapheneOffsets[endGraphemeIdx] ?? text.length)\n : text.length\n out.push({ text: currentLine, startOffset, endOffset })\n }\n\n for (let i = 0; i < graphemes.length; i++) {\n const grapheme = graphemes[i]!\n const gWidth = gWidthFn(grapheme)\n\n // Zero-width: append without consuming visible width. Boundary\n // tracking is unaffected — these chars belong to the surrounding\n // grapheme cluster.\n if (gWidth === 0) {\n currentLine += grapheme\n continue\n }\n\n if (isWordBoundary(grapheme)) {\n // Boundary char: include if it fits, mark as break point.\n if (currentWidth + gWidth <= width) {\n currentLine += grapheme\n currentWidth += gWidth\n if (grapheme !== \" \" || !isBreakBeforeOperatorWith(graphemes, i, gWidthFn)) {\n lastBreakIndex = currentLine.length\n lastBreakWidth = currentWidth\n lastBreakGraphemeIdx = i + 1\n }\n continue\n }\n // Boundary char doesn't fit: break BEFORE it; the boundary is\n // swallowed (consumed as the break). The next slice's startOffset\n // jumps past it, so source coverage stays monotone.\n if (currentLine) {\n pushLine(i) // line ends just before the boundary\n }\n currentLine = \"\"\n currentWidth = 0\n // Skip the boundary character itself — start the next line from i+1.\n lineStartGraphemeIdx = i + 1\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIdx = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIdx = -1\n continue\n } else if (canBreakAnywhere(grapheme)) {\n // CJK: can break before this character. Mark and fall through to\n // the overflow check (CJK chars themselves are visible).\n lastBreakIndex = currentLine.length\n lastBreakWidth = currentWidth\n lastBreakGraphemeIdx = i\n }\n\n if (currentWidth + gWidth > width) {\n if (lastBreakIndex > 0 && lastBreakGraphemeIdx >= 0) {\n // Word-boundary wrap: rewind to last break point.\n const savedLine = currentLine\n // `lastBreakIndex` points just past the boundary grapheme, so the\n // slice INCLUDES the trailing word-boundary char (typically a\n // space). The next slice's `startOffset` already skips that\n // boundary, but the boundary still lives in `text`. Drop trailing\n // whitespace from the text so callers see clean line content\n // (parity with `wrapTextWithMeasurer`'s `trimEnd()`). Non-space\n // boundaries (hyphen, etc.) are not whitespace and pass through\n // untouched. @km/tui/softwrap-leading-space-on-wrap.\n currentLine = savedLine.slice(0, lastBreakIndex).trimEnd()\n pushLine(lastBreakGraphemeIdx)\n // Reset; rewind the loop counter so the rewind-target grapheme is\n // re-processed at the start of the next line.\n lineStartGraphemeIdx = lastBreakGraphemeIdx\n i = lastBreakGraphemeIdx - 1\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIdx = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIdx = -1\n } else if (lastSoftBreakIndex > 0 && lastSoftBreakGraphemeIdx >= 0) {\n // Soft break inside a token (path/identifier separator): rewind\n // to AFTER the separator so `path/to` becomes `path/` + `to`.\n const savedLine = currentLine\n currentLine = savedLine.slice(0, lastSoftBreakIndex)\n pushLine(lastSoftBreakGraphemeIdx)\n lineStartGraphemeIdx = lastSoftBreakGraphemeIdx\n i = lastSoftBreakGraphemeIdx - 1\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIdx = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIdx = -1\n } else {\n // No break point: hard char wrap. Push the current line, start a\n // new one with this grapheme.\n if (currentLine) {\n pushLine(i)\n }\n lineStartGraphemeIdx = i\n currentLine = grapheme\n currentWidth = gWidth\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIdx = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIdx = -1\n }\n } else {\n currentLine += grapheme\n currentWidth += gWidth\n // Track soft (intra-token) break points. Only meaningful if there\n // is already content before this separator on the line.\n if (currentLine.length > 1 && isSoftBreakPoint(grapheme)) {\n lastSoftBreakIndex = currentLine.length\n lastSoftBreakWidth = currentWidth\n lastSoftBreakGraphemeIdx = i + 1\n }\n }\n }\n // Suppress unused-variable warning — symmetric bookkeeping for the\n // soft-break triple, kept for parity with the hard-break tracker.\n void lastSoftBreakWidth\n\n // Trailing content: push as the final line.\n if (currentLine || lineStartGraphemeIdx < graphemes.length) {\n pushLine(graphemes.length)\n }\n\n // Single-slice passthrough? Tell the caller \"no wrap happened\" by\n // returning empty — matches the WrapMeasurer contract documented in\n // `@silvery/ag/wrap-measurer`. The caller (geometry layer) synthesizes a\n // single passthrough slice from the source itself, avoiding an\n // allocation for the (very common) \"fits in one line\" case.\n if (out.length === 1 && out[0]!.startOffset === 0 && out[0]!.endOffset === text.length) {\n return []\n }\n\n // Suppress unused-variable warning — `lastBreakWidth` is part of the\n // bookkeeping triple that mirrors `wrapTextWithMeasurer`, kept for\n // symmetry / future re-use even though this offset-only variant doesn't\n // read it back.\n void lastBreakWidth\n\n return out\n}\n\n/**\n * Wrap text using an explicit measurer for grapheme width calculations.\n * When measurer is undefined, falls back to the module-level graphemeWidth.\n */\nexport function wrapTextWithMeasurer(\n text: string,\n width: number,\n measurer: Measurer | undefined,\n trim = false,\n _hard = false,\n preserveNewlines = true,\n truncateAtomicOverflow = false,\n): string[] {\n if (width <= 0) {\n return []\n }\n\n const gWidthFn = measurer ? measurer.graphemeWidth.bind(measurer) : graphemeWidth\n\n const lines: string[] = []\n\n // Split by newlines first if preserving\n const inputLines = preserveNewlines ? text.split(\"\\n\") : [text.replace(/\\n/g, \" \")]\n\n for (const line of inputLines) {\n // Handle empty lines\n if (line === \"\") {\n lines.push(\"\")\n continue\n }\n\n // If the line contains ANSI escape sequences, split them out so they\n // don't consume display width. We interleave visible graphemes with\n // zero-width ANSI \"tokens\" that are appended to currentLine untouched.\n const graphemes = splitGraphemesAnsiAware(line)\n let currentLine = \"\"\n let currentWidth = 0\n let isFirstLineOfParagraph = true\n\n // Track the last valid break point\n let lastBreakIndex = -1 // Index in currentLine (character position)\n let lastBreakWidth = 0 // Width at break point\n let lastBreakGraphemeIndex = -1 // Index in graphemes array\n\n // Track the last soft break point (intra-token separator like `/`, `.`,\n // `_`, `:`). Soft breaks are SECONDARY: only used when no hard break\n // (space/hyphen) is available within the current line — the\n // `lastBreakIndex` triple takes precedence whenever it exists. Resets\n // alongside the hard-break triple every time a line is pushed.\n let lastSoftBreakIndex = -1\n let lastSoftBreakWidth = 0\n let lastSoftBreakGraphemeIndex = -1\n\n for (let i = 0; i < graphemes.length; i++) {\n const grapheme = graphemes[i]!\n const gWidth = gWidthFn(grapheme)\n\n // Handle zero-width characters\n if (gWidth === 0) {\n currentLine += grapheme\n continue\n }\n\n // In trim mode, skip leading spaces on continuation lines\n if (\n trim &&\n !isFirstLineOfParagraph &&\n currentWidth === 0 &&\n isWordBoundary(grapheme) &&\n grapheme !== \"-\"\n ) {\n continue\n }\n\n // Check if this grapheme is a break point\n // Break AFTER spaces/hyphens, or BEFORE CJK characters\n if (isWordBoundary(grapheme)) {\n // Include the boundary character, then mark as break point\n if (currentWidth + gWidth <= width) {\n currentLine += grapheme\n currentWidth += gWidth\n // Suppress break point if the next word is a lone operator (e.g. \"+\", \"=\")\n // to avoid orphaning operators at the start of the next line.\n if (grapheme !== \" \" || !isBreakBeforeOperatorWith(graphemes, i, gWidthFn)) {\n lastBreakIndex = currentLine.length\n lastBreakWidth = currentWidth\n lastBreakGraphemeIndex = i + 1\n }\n continue\n }\n // Space/hyphen doesn't fit — break here (before the boundary char).\n // The current line is complete; the boundary char is consumed as the break.\n if (currentLine) {\n let lineToAdd = currentLine\n if (trim) lineToAdd = lineToAdd.trimEnd()\n lines.push(lineToAdd)\n isFirstLineOfParagraph = false\n }\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIndex = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIndex = -1\n continue\n } else if (canBreakAnywhere(grapheme)) {\n // CJK: can break before this character\n lastBreakIndex = currentLine.length\n lastBreakWidth = currentWidth\n lastBreakGraphemeIndex = i\n }\n\n // Would this grapheme overflow?\n if (currentWidth + gWidth > width) {\n if (lastBreakIndex > 0) {\n // We have a valid hard break point - use it.\n // Unconditional `trimEnd()`: `lastBreakIndex` points just past\n // the word-boundary grapheme so the slice INCLUDES the trailing\n // boundary character (typically a space). The next line's\n // `lastBreakGraphemeIndex` already skips past it, so keeping the\n // trailing space here double-counts the boundary — when this\n // wrapped line is rendered inside a Box with `backgroundColor`\n // (common for body cards), the trailing space paints as visible\n // chrome. `trim` controls only continuation-line LEADING-space\n // skipping; trailing whitespace from the rewind boundary always\n // drops. @km/tui/softwrap-leading-space-on-wrap.\n const lineToAdd = currentLine.slice(0, lastBreakIndex).trimEnd()\n lines.push(lineToAdd)\n isFirstLineOfParagraph = false\n\n // Reset and continue from break point\n currentLine = currentLine.slice(lastBreakIndex)\n currentWidth = currentWidth - lastBreakWidth\n\n // Rewind to process graphemes after the break\n i = lastBreakGraphemeIndex - 1\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIndex = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIndex = -1\n } else if (lastSoftBreakIndex > 0) {\n // Soft break available inside the current token (e.g. `path/to`\n // becomes `path/` + `to`). Used only when no hard break fits on\n // the current line — paths and identifiers wrap at separators\n // instead of either overflowing or doing mid-word char wrap.\n // Trailing whitespace dropped unconditionally — see hard-break\n // branch above for rationale.\n const lineToAdd = currentLine.slice(0, lastSoftBreakIndex).trimEnd()\n lines.push(lineToAdd)\n isFirstLineOfParagraph = false\n\n // Rewind to the soft-break point: re-process graphemes from the\n // position AFTER the separator. This matches the hard-break path\n // so soft-wrapped continuation lines align with the rest of the\n // wrap algorithm (no special start-of-continuation handling).\n i = lastSoftBreakGraphemeIndex - 1\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIndex = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIndex = -1\n } else if (truncateAtomicOverflow) {\n // No break point found AND wrap-truncate mode is active — emit\n // ellipsis-truncated line and skip the rest of the unbreakable\n // run until we hit a word boundary (where wrapping resumes).\n // Implements `wrap=\"wrap-truncate\"` per Text.md — CSS analogue\n // `overflow-wrap: break-word` + `text-overflow: ellipsis`.\n //\n // Algorithm:\n // 1. Trim trailing graphemes from currentLine until ellipsis fits.\n // 2. Push `<currentLine prefix> + …` as the truncated line.\n // 3. Fast-forward `i` past the unbreakable run (until next\n // word-boundary grapheme) so subsequent text resumes wrapping.\n const ellipsis = \"…\"\n const ellipsisWidth = gWidthFn(ellipsis)\n // Build the truncated prefix by trimming graphemes from the end\n // of currentLine until ellipsis fits within `width`. Split once,\n // pop graphemes off the tail (O(n) instead of O(n²) re-split).\n const lineGraphemes = splitGraphemes(currentLine)\n let truncatedWidth = currentWidth\n while (truncatedWidth + ellipsisWidth > width && lineGraphemes.length > 0) {\n const last = lineGraphemes.pop()!\n truncatedWidth -= gWidthFn(last)\n }\n let truncatedLine = lineGraphemes.join(\"\")\n if (trim) truncatedLine = truncatedLine.trimEnd()\n lines.push(truncatedLine + ellipsis)\n isFirstLineOfParagraph = false\n\n // Fast-forward `i` past the rest of the unbreakable run. We're\n // currently at index `i` (the grapheme that didn't fit). Advance\n // until we find a word-boundary or soft-break grapheme — that's\n // where wrapping can legitimately resume on the next iteration.\n let j = i\n while (\n j < graphemes.length &&\n !isWordBoundary(graphemes[j]!) &&\n !canBreakAnywhere(graphemes[j]!)\n ) {\n j++\n }\n // Reset state and rewind `i` so the next loop iteration picks up\n // at j (the first wrappable grapheme after the truncated run).\n i = j - 1\n currentLine = \"\"\n currentWidth = 0\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIndex = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIndex = -1\n } else {\n // No break point found - must do character wrap\n if (currentLine) {\n if (trim) currentLine = currentLine.trimEnd()\n lines.push(currentLine)\n isFirstLineOfParagraph = false\n }\n currentLine = grapheme\n currentWidth = gWidth\n lastBreakIndex = -1\n lastBreakWidth = 0\n lastBreakGraphemeIndex = -1\n lastSoftBreakIndex = -1\n lastSoftBreakWidth = 0\n lastSoftBreakGraphemeIndex = -1\n }\n } else {\n currentLine += grapheme\n currentWidth += gWidth\n // Track soft break points (path-style separators). Mark AFTER the\n // separator so `path/to` breaks as `path/` + `to`. Only useful if\n // there's already content before this separator on the line — a\n // leading separator has nothing to keep with its left context.\n if (currentLine.length > 1 && isSoftBreakPoint(grapheme)) {\n lastSoftBreakIndex = currentLine.length\n lastSoftBreakWidth = currentWidth\n lastSoftBreakGraphemeIndex = i + 1\n }\n }\n }\n // Suppress unused-variable warning — `lastSoftBreakWidth` is part of\n // the bookkeeping triple kept symmetric with `lastBreakWidth` for\n // future use; the width itself isn't read back when soft-wrapping.\n void lastSoftBreakWidth\n\n // Push remaining content\n if (currentLine) {\n lines.push(currentLine)\n }\n }\n\n // Fix OSC 8 hyperlink state across wrapped lines — each line must be self-contained\n if (text.includes(\"\\x1b]8;;\")) {\n fixOsc8AcrossWrappedLines(lines)\n }\n\n return lines\n}\n\n/**\n * Post-process wrapped lines to ensure OSC 8 hyperlink sequences are self-contained per line.\n * When wrapping splits text containing OSC 8 sequences across lines, the open/close sequences\n * may end up on different lines. This closes unclosed hyperlinks at line ends and re-opens\n * them on continuation lines. Mutates the array in place.\n */\nfunction fixOsc8AcrossWrappedLines(lines: string[]): void {\n let activeHref: string | null = null\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]!\n\n // Re-open hyperlink from previous line\n if (activeHref !== null) {\n line = `\\x1b]8;;${activeHref}\\x1b\\\\` + line\n }\n\n // Scan line for OSC 8 sequences to determine end-of-line state\n let lineHref: string | null = activeHref\n const osc8Matches = line.matchAll(/\\x1b\\]8;;([^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)/g)\n for (const m of osc8Matches) {\n lineHref = m[1] === \"\" ? null : m[1]!\n }\n\n // Close unclosed hyperlink at line end\n if (lineHref !== null) {\n line += \"\\x1b]8;;\\x1b\\\\\"\n }\n\n lines[i] = line\n activeHref = lineHref\n }\n}\n\n/**\n * Slice text by display width (from start).\n * Returns the first `maxWidth` columns of text.\n * Uses the default measurer for width calculations.\n * Handles both ANSI-styled and plain text.\n *\n * @param text - The text to slice\n * @param maxWidth - Maximum display width to keep from the start\n * @returns Sliced string from the start\n */\nexport function sliceByWidth(text: string, maxWidth: number): string {\n return (_scopedMeasurer ?? getDefaultMeasurer()).sliceByWidth(text, maxWidth)\n}\n\n/**\n * Slice a string by display width range.\n * Like string.slice() but works with display columns.\n *\n * @param text - The text to slice\n * @param start - Start display column (inclusive)\n * @param end - End display column (exclusive)\n * @returns Sliced string\n */\nexport function sliceByWidthRange(text: string, start: number, end?: number): string {\n const graphemes = splitGraphemes(text)\n let result = \"\"\n let currentCol = 0\n const endCol = end ?? Number.POSITIVE_INFINITY\n\n for (const grapheme of graphemes) {\n const gWidth = graphemeWidth(grapheme)\n\n // Haven't reached start yet\n if (currentCol + gWidth <= start) {\n currentCol += gWidth\n continue\n }\n\n // Past the end\n if (currentCol >= endCol) {\n break\n }\n\n // This grapheme is at least partially in range\n result += grapheme\n currentCol += gWidth\n }\n\n return result\n}\n\n/**\n * Slice text by display width from the end.\n * Returns the last `maxWidth` columns of text.\n * Uses the default measurer for width calculations.\n *\n * @param text - The text to slice\n * @param maxWidth - Maximum display width to keep from the end\n * @returns Sliced string from the end\n */\nexport function sliceByWidthFromEnd(text: string, maxWidth: number): string {\n return (_scopedMeasurer ?? getDefaultMeasurer()).sliceByWidthFromEnd(text, maxWidth)\n}\n\n// ============================================================================\n// Buffer Writing\n// ============================================================================\n\n/**\n * Write styled text to a terminal buffer.\n *\n * Handles:\n * - Multi-byte graphemes (emoji, combining characters)\n * - Wide characters (CJK) that take 2 cells\n * - Zero-width characters (appended to previous cell)\n *\n * @param buffer - The buffer to write to\n * @param x - Starting column\n * @param y - Row\n * @param text - Text to write\n * @param style - Style to apply\n * @returns The ending column (x + display_width)\n */\nexport function writeTextToBuffer(\n buffer: TerminalBuffer,\n x: number,\n y: number,\n text: string,\n style: Style = { fg: null, bg: null, attrs: {} },\n): number {\n const graphemes = splitGraphemes(text)\n let col = x\n let combineCell: Cell | null = null\n\n for (const grapheme of graphemes) {\n const width = graphemeWidth(grapheme)\n\n if (width === 0) {\n // Zero-width character: combine with previous cell.\n // Use readCellInto to avoid allocating a fresh Cell on each combine.\n if (col > 0 && buffer.inBounds(col - 1, y)) {\n // Lazy-init reusable cell (zero-width combining is uncommon)\n combineCell ??= createMutableCell()\n buffer.readCellInto(col - 1, y, combineCell)\n combineCell.char = combineCell.char + grapheme\n buffer.setCell(col - 1, y, combineCell)\n }\n } else if (width === 1) {\n // Normal single-width character\n if (buffer.inBounds(col, y)) {\n buffer.setCell(col, y, {\n char: grapheme,\n fg: style.fg,\n bg: style.bg,\n attrs: style.attrs,\n wide: false,\n continuation: false,\n })\n }\n col++\n } else if (width === 2) {\n // Wide character: takes 2 cells\n // For text-presentation emoji, add VS16 so terminals render at 2 columns\n const outputChar = ensureEmojiPresentation(grapheme)\n if (buffer.inBounds(col, y)) {\n buffer.setCell(col, y, {\n char: outputChar,\n fg: style.fg,\n bg: style.bg,\n attrs: style.attrs,\n wide: true,\n continuation: false,\n })\n }\n if (buffer.inBounds(col + 1, y)) {\n buffer.setCell(col + 1, y, {\n char: \"\",\n fg: style.fg,\n bg: style.bg,\n attrs: style.attrs,\n wide: false,\n continuation: true,\n })\n }\n col += 2\n }\n\n // Stop if we've gone past the buffer edge\n if (col >= buffer.width) {\n break\n }\n }\n\n return col\n}\n\n/**\n * Write styled text to a buffer with automatic truncation.\n *\n * @param buffer - The buffer to write to\n * @param x - Starting column\n * @param y - Row\n * @param text - Text to write\n * @param maxWidth - Maximum width (truncate if exceeded)\n * @param style - Style to apply\n * @param ellipsis - Ellipsis for truncated text\n */\nexport function writeTextTruncated(\n buffer: TerminalBuffer,\n x: number,\n y: number,\n text: string,\n maxWidth: number,\n style: Style = { fg: null, bg: null, attrs: {} },\n ellipsis = \"\\u2026\",\n): void {\n const textWidth = displayWidth(text)\n\n if (textWidth <= maxWidth) {\n writeTextToBuffer(buffer, x, y, text, style)\n } else {\n const truncated = truncateText(text, maxWidth, ellipsis)\n writeTextToBuffer(buffer, x, y, truncated, style)\n }\n}\n\n/**\n * Write multiple lines of styled text to a buffer.\n *\n * @param buffer - The buffer to write to\n * @param x - Starting column\n * @param y - Starting row\n * @param lines - Lines to write\n * @param style - Style to apply\n */\nexport function writeLinesToBuffer(\n buffer: TerminalBuffer,\n x: number,\n y: number,\n lines: string[],\n style: Style = { fg: null, bg: null, attrs: {} },\n): void {\n for (let i = 0; i < lines.length; i++) {\n if (y + i >= buffer.height) break\n writeTextToBuffer(buffer, x, y + i, lines[i]!, style)\n }\n}\n\n// ============================================================================\n// ANSI-Aware Operations\n// ============================================================================\n\n/**\n * Strip all ANSI escape codes from a string.\n *\n * Handles:\n * - CSI sequences (cursor movement, colors, SGR, etc.)\n * - OSC sequences (window titles, hyperlinks)\n * - Single-character escape sequences\n * - Character set selection\n */\nexport function stripAnsi(text: string): string {\n return text\n .replace(/\\x1b\\[[0-9;:?]*[A-Za-z]/g, \"\") // ESC CSI sequences (including SGR with colons)\n .replace(/\\x9b[0-9;:?]*[A-Za-z]/g, \"\") // C1 CSI sequences\n .replace(/\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g, \"\") // ESC OSC sequences\n .replace(/\\x9d[^\\x07\\x1b\\x9c]*(?:\\x07|\\x1b\\\\|\\x9c)/g, \"\") // C1 OSC sequences\n .replace(/\\x1b[DME78]/g, \"\") // Single-char sequences\n .replace(/\\x1b\\(B/g, \"\") // Character set selection\n}\n\n/**\n * Get display width of text with ANSI sequences.\n * ANSI sequences don't contribute to display width.\n */\nexport function displayWidthAnsi(text: string): number {\n return displayWidth(stripAnsi(text))\n}\n\n/**\n * Truncate text that may contain ANSI sequences.\n * Preserves ANSI codes while truncating visible characters.\n *\n * Note: This is a simplified implementation that strips ANSI before\n * truncation. For proper ANSI-aware truncation, consider using\n * slice-ansi or similar library.\n */\nexport function truncateAnsi(text: string, maxWidth: number, ellipsis = \"\\u2026\"): string {\n // Simple approach: if text has ANSI, strip and truncate\n // A more sophisticated approach would preserve styles\n const stripped = stripAnsi(text)\n return truncateText(stripped, maxWidth, ellipsis)\n}\n\n// ============================================================================\n// ANSI Parsing\n// ============================================================================\n\n// BG_OVERRIDE_CODE is imported from ansi and re-exported at top of file\n\n/** Styled text segment with associated ANSI colors/attributes */\nexport interface StyledSegment {\n text: string\n fg?: number | null // SGR color code (30-37, 90-97, or 38;5;N / 38;2;r;g;b)\n bg?: number | null // SGR color code (40-47, 100-107, or 48;5;N / 48;2;r;g;b)\n /**\n * Underline color (SGR 58).\n * Same format as fg/bg: packed RGB with 0x1000000 marker, or 256-color index.\n */\n underlineColor?: number | null\n bold?: boolean\n dim?: boolean\n italic?: boolean\n underline?: boolean\n /**\n * Underline style variant (SGR 4:x).\n * Uses UnderlineStyle from buffer.ts.\n */\n underlineStyle?: UnderlineStyle\n inverse?: boolean\n /** Strikethrough (SGR 9 on, SGR 29 off). */\n strikethrough?: boolean\n /** Overline (SGR 53 on, SGR 55 off). */\n overline?: boolean\n bgOverride?: boolean // Set when BG_OVERRIDE_CODE (9999) is present\n /**\n * OSC 8 hyperlink URL.\n * Set when the segment is inside an OSC 8 hyperlink sequence.\n */\n hyperlink?: string\n /**\n * True when the foreground color was specified using colon-separated SGR\n * (e.g., `38:2::255:100:0m` instead of `38;2;255;100;0m`).\n * Used to preserve the original format in round-trip output.\n */\n colonFg?: boolean\n /**\n * True when the background color was specified using colon-separated SGR.\n */\n colonBg?: boolean\n}\n\n/**\n * Map SGR 4:x subparameter to underline style.\n * 0=none, 1=single, 2=double, 3=curly, 4=dotted, 5=dashed\n */\nfunction parseUnderlineStyle(subparam: number): UnderlineStyle {\n switch (subparam) {\n case 0:\n return false\n case 1:\n return \"single\"\n case 2:\n return \"double\"\n case 3:\n return \"curly\"\n case 4:\n return \"dotted\"\n case 5:\n return \"dashed\"\n default:\n return \"single\" // Unknown, default to single\n }\n}\n\nfunction packRgb(r: number, g: number, b: number): number {\n return 0x1000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)\n}\n\nfunction parseColonRgb(subparts: number[]): number | null {\n if (subparts.length < 5) return null\n const [r, g, b] = subparts.slice(-3)\n if (!Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)) return null\n return packRgb(r!, g!, b!)\n}\n\n/**\n * Parse text with ANSI escape sequences into styled segments.\n * Handles basic SGR (Select Graphic Rendition) codes including:\n * - Standard colors (30-37, 40-47, 90-97, 100-107)\n * - Extended colors (38;5;N, 48;5;N for 256-color, 38;2;r;g;b, 48;2;r;g;b for RGB)\n * - Underline styles (4:x where x = 0-5)\n * - Underline color (58;5;N for 256-color, 58;2;r;g;b for RGB)\n */\nexport function parseAnsiText(text: string): StyledSegment[] {\n const segments: StyledSegment[] = []\n\n // Step 1: Strip non-SGR CSI sequences (cursor movement, erase, etc.) that would\n // otherwise leak through as literal text. SGR sequences end in 'm'; all\n // other CSI sequences (ending in A-L, H, J, K, S, T, etc.) are stripped.\n // Handles both ESC-based CSI (\\x1b[) and C1 CSI (\\x9b).\n // This must happen BEFORE OSC 8 processing so hyperlink position tracking\n // is based on the cleaned text (no position drift from stripped sequences).\n const sanitizedText = text\n .replace(/\\x1b\\[[0-9;:]*[A-LN-Za-ln-z@`]/g, \"\")\n .replace(/\\x9b[0-9;:]*[A-LN-Za-ln-z@`]/g, \"\")\n\n // Step 2: Strip OSC 8 hyperlink sequences and build a position-to-URL map.\n // OSC 8 format: \\x1b]8;;URL(\\x1b\\\\ | \\x07) for open, \\x1b]8;;(\\x1b\\\\ | \\x07) for close.\n // Also handles C1 OSC (\\x9d) form: \\x9d8;;URL(\\x1b\\\\ | \\x07 | \\x9c)\n // We strip these from the text before SGR parsing and track which character\n // positions map to which hyperlink URL.\n //\n // Hyperlink format metadata is encoded in the URL using control char prefixes:\n // \\x01c1b\\x02 = C1 OSC intro + BEL terminator\n // \\x01c1s\\x02 = C1 OSC intro + ST terminator\n // \\x01e7b\\x02 = ESC OSC intro + BEL terminator\n // (no prefix) = ESC OSC intro + ST terminator (default)\n // bufferToStyledText reads these prefixes to emit the original format.\n const oscPattern = /(?:\\x1b\\]|\\x9d)8;;([^\\x07\\x1b\\x9c]*)(?:\\x07|\\x1b\\\\|\\x9c)/g\n let currentHyperlink: string | undefined\n // Map from character index in cleaned text to hyperlink URL\n const hyperlinkRanges: Array<{ start: number; end: number; url: string }> = []\n let rangeStart = -1\n let cleaned = \"\"\n let oscMatch: RegExpExecArray | null\n let oscLastIndex = 0\n\n while ((oscMatch = oscPattern.exec(sanitizedText)) !== null) {\n // Append text between last OSC and this one (preserving SGR codes)\n cleaned += sanitizedText.slice(oscLastIndex, oscMatch.index)\n const url = oscMatch[1]!\n\n // Detect format: C1 vs ESC intro, BEL vs ST terminator\n const matchStr = oscMatch[0]\n const isC1 = matchStr.charCodeAt(0) === 0x9d\n const lastChar = matchStr.charCodeAt(matchStr.length - 1)\n const isBel = lastChar === 0x07\n const isSt9c = lastChar === 0x9c\n\n if (url === \"\") {\n // Close hyperlink — format prefix matches the open sequence\n if (currentHyperlink && rangeStart >= 0) {\n hyperlinkRanges.push({ start: rangeStart, end: cleaned.length, url: currentHyperlink })\n }\n currentHyperlink = undefined\n rangeStart = -1\n } else {\n // Open hyperlink — encode format metadata in URL prefix\n if (currentHyperlink && rangeStart >= 0) {\n // Close previous unclosed hyperlink\n hyperlinkRanges.push({ start: rangeStart, end: cleaned.length, url: currentHyperlink })\n }\n // Encode hyperlink format as a prefix on the URL:\n // \\x01c1b\\x02 = C1 intro + BEL terminator\n // \\x01c1s\\x02 = C1 intro + ST terminator (ESC \\ or C1 ST \\x9c)\n // \\x01e7b\\x02 = ESC intro + BEL terminator\n // no prefix = ESC intro + ST terminator (default)\n let encodedUrl = url\n if (isC1 && (isBel || isSt9c)) {\n encodedUrl = `\\x01c1b\\x02${url}`\n } else if (isC1) {\n encodedUrl = `\\x01c1s\\x02${url}`\n } else if (isBel) {\n encodedUrl = `\\x01e7b\\x02${url}`\n }\n // else: ESC + ST = default, no prefix needed\n currentHyperlink = encodedUrl\n rangeStart = cleaned.length\n }\n\n oscLastIndex = oscMatch.index + oscMatch[0].length\n }\n // Append remaining text after last OSC\n cleaned += sanitizedText.slice(oscLastIndex)\n // Close any still-open hyperlink\n if (currentHyperlink && rangeStart >= 0) {\n hyperlinkRanges.push({ start: rangeStart, end: cleaned.length, url: currentHyperlink })\n }\n\n // If no OSC 8 sequences found, use sanitized text for efficiency\n const processText = hyperlinkRanges.length > 0 ? cleaned : sanitizedText\n\n // Extended pattern: matches SGR with semicolons AND colons (for 4:x, 58:2::r:g:b)\n // Handles both ESC-based CSI (\\x1b[) and C1 CSI (\\x9b)\n const ansiPattern = /(?:\\x1b\\[|\\x9b)([0-9;:]*)m/g\n\n let currentStyle: Omit<StyledSegment, \"text\"> = {}\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n // Helper to find hyperlink URL for a position in the cleaned text.\n // Positions in cleaned text map directly to hyperlinkRanges since OSC 8\n // sequences were stripped but SGR sequences remain at the same indices.\n function getHyperlinkAt(pos: number): string | undefined {\n for (const range of hyperlinkRanges) {\n if (pos >= range.start && pos < range.end) return range.url\n }\n return undefined\n }\n\n while ((match = ansiPattern.exec(processText)) !== null) {\n // Add text before this escape sequence\n if (match.index > lastIndex) {\n const content = processText.slice(lastIndex, match.index)\n if (content.length > 0) {\n if (hyperlinkRanges.length > 0) {\n // Split content into runs by hyperlink URL.\n // lastIndex is the position of content[0] in processText/cleaned.\n let segStart = 0\n for (let ci = 0; ci < content.length; ci++) {\n const hl = getHyperlinkAt(lastIndex + ci)\n const prevHl = ci > 0 ? getHyperlinkAt(lastIndex + ci - 1) : undefined\n if (ci > 0 && hl !== prevHl) {\n const sub = content.slice(segStart, ci)\n if (sub.length > 0) {\n const seg: StyledSegment = { text: sub, ...currentStyle }\n if (prevHl) seg.hyperlink = prevHl\n segments.push(seg)\n }\n segStart = ci\n }\n }\n // Push remaining\n const sub = content.slice(segStart)\n if (sub.length > 0) {\n const hl = getHyperlinkAt(lastIndex + segStart)\n const seg: StyledSegment = { text: sub, ...currentStyle }\n if (hl) seg.hyperlink = hl\n segments.push(seg)\n }\n } else {\n segments.push({ text: content, ...currentStyle })\n }\n }\n }\n\n // Parse SGR codes - split by semicolon first, then handle colon subparams\n const rawParams = match[1]!\n\n // Handle colon-separated sequences (like 4:3 for curly underline, 58:2::r:g:b)\n // Split by semicolon first to get top-level params\n const params = rawParams.split(\";\")\n\n for (let i = 0; i < params.length; i++) {\n const param = params[i]!\n\n // Check if this param has colon subparameters (e.g., \"4:3\", \"58:2::255:0:0\")\n if (param.includes(\":\")) {\n const subparts = param.split(\":\").map((s) => (s === \"\" ? 0 : Number(s)))\n const mainCode = subparts[0]!\n\n if (mainCode === 4) {\n // SGR 4:x - underline style\n const styleCode = subparts[1] ?? 1\n currentStyle.underlineStyle = parseUnderlineStyle(styleCode)\n currentStyle.underline = currentStyle.underlineStyle !== false\n } else if (mainCode === 58) {\n // SGR 58 - underline color\n // Format: 58:5:N, 58:2::r:g:b, 58:2:r:g:b, or 58:2:colorspace:r:g:b.\n if (subparts[1] === 5 && subparts[2] !== undefined) {\n currentStyle.underlineColor = subparts[2]\n } else if (subparts[1] === 2) {\n const rgb = parseColonRgb(subparts)\n if (rgb !== null) currentStyle.underlineColor = rgb\n }\n } else if (mainCode === 38) {\n // SGR 38:2::r:g:b or 38:5:N format (colon-separated)\n if (subparts[1] === 5 && subparts[2] !== undefined) {\n currentStyle.fg = subparts[2]\n currentStyle.colonFg = true\n } else if (subparts[1] === 2) {\n const rgb = parseColonRgb(subparts)\n if (rgb !== null) {\n currentStyle.fg = rgb\n currentStyle.colonFg = true\n }\n }\n } else if (mainCode === 48) {\n // SGR 48:2::r:g:b or 48:5:N format (colon-separated)\n if (subparts[1] === 5 && subparts[2] !== undefined) {\n currentStyle.bg = subparts[2]\n currentStyle.colonBg = true\n } else if (subparts[1] === 2) {\n const rgb = parseColonRgb(subparts)\n if (rgb !== null) {\n currentStyle.bg = rgb\n currentStyle.colonBg = true\n }\n }\n }\n continue\n }\n\n // Standard semicolon-separated params\n const code = Number(param)\n switch (code) {\n case 0:\n // Reset\n currentStyle = {}\n break\n case 1:\n currentStyle.bold = true\n break\n case 2:\n currentStyle.dim = true\n break\n case 3:\n currentStyle.italic = true\n break\n case 4:\n // Plain SGR 4 - simple underline (no subparam)\n currentStyle.underline = true\n currentStyle.underlineStyle = \"single\"\n break\n case 7:\n currentStyle.inverse = true\n break\n case 9:\n // SGR 9 - strikethrough on\n currentStyle.strikethrough = true\n break\n case 22:\n currentStyle.bold = false\n currentStyle.dim = false\n break\n case 23:\n currentStyle.italic = false\n break\n case 24:\n // SGR 24 - underline off\n currentStyle.underline = false\n currentStyle.underlineStyle = false\n break\n case 27:\n currentStyle.inverse = false\n break\n case 29:\n // SGR 29 - strikethrough off\n currentStyle.strikethrough = false\n break\n case 30:\n case 31:\n case 32:\n case 33:\n case 34:\n case 35:\n case 36:\n case 37:\n currentStyle.fg = code\n break\n case 38: {\n // Extended color: 38;5;N (256 color) or 38;2;r;g;b (true color)\n // Semicolon-separated — clear colonFg flag\n const nextParams = params.slice(i + 1).map(Number)\n currentStyle.colonFg = undefined\n if (nextParams[0] === 5 && nextParams[1] !== undefined) {\n currentStyle.fg = nextParams[1]\n i += 2\n } else if (nextParams[0] === 2 && nextParams[3] !== undefined) {\n // True color - store as RGB values packed\n currentStyle.fg =\n 0x1000000 |\n ((nextParams[1]! & 0xff) << 16) |\n ((nextParams[2]! & 0xff) << 8) |\n (nextParams[3]! & 0xff)\n i += 4\n }\n break\n }\n case 39:\n currentStyle.fg = null // Default foreground\n break\n case 40:\n case 41:\n case 42:\n case 43:\n case 44:\n case 45:\n case 46:\n case 47:\n currentStyle.bg = code\n break\n case 48: {\n // Extended color: 48;5;N (256 color) or 48;2;r;g;b (true color)\n // Semicolon-separated — clear colonBg flag\n const nextParams = params.slice(i + 1).map(Number)\n currentStyle.colonBg = undefined\n if (nextParams[0] === 5 && nextParams[1] !== undefined) {\n currentStyle.bg = nextParams[1]\n i += 2\n } else if (nextParams[0] === 2 && nextParams[3] !== undefined) {\n // True color - store as RGB values packed\n currentStyle.bg =\n 0x1000000 |\n ((nextParams[1]! & 0xff) << 16) |\n ((nextParams[2]! & 0xff) << 8) |\n (nextParams[3]! & 0xff)\n i += 4\n }\n break\n }\n case 49:\n currentStyle.bg = null // Default background\n break\n case 53:\n // SGR 53 - overline on\n currentStyle.overline = true\n break\n case 55:\n // SGR 55 - overline off\n currentStyle.overline = false\n break\n case 58: {\n // Underline color: 58;5;N (256 color) or 58;2;r;g;b (true color)\n const nextParams = params.slice(i + 1).map(Number)\n if (nextParams[0] === 5 && nextParams[1] !== undefined) {\n currentStyle.underlineColor = nextParams[1]\n i += 2\n } else if (nextParams[0] === 2 && nextParams[3] !== undefined) {\n // True color - store as RGB values packed\n currentStyle.underlineColor =\n 0x1000000 |\n ((nextParams[1]! & 0xff) << 16) |\n ((nextParams[2]! & 0xff) << 8) |\n (nextParams[3]! & 0xff)\n i += 4\n }\n break\n }\n case 59:\n currentStyle.underlineColor = null // Default underline color\n break\n case 90:\n case 91:\n case 92:\n case 93:\n case 94:\n case 95:\n case 96:\n case 97:\n currentStyle.fg = code // Bright foreground colors\n break\n case 100:\n case 101:\n case 102:\n case 103:\n case 104:\n case 105:\n case 106:\n case 107:\n currentStyle.bg = code // Bright background colors\n break\n case BG_OVERRIDE_CODE:\n // Private code: signals intentional bg override, skip conflict detection\n currentStyle.bgOverride = true\n break\n }\n }\n\n lastIndex = match.index + match[0].length\n }\n\n // Add remaining text\n if (lastIndex < processText.length) {\n const content = processText.slice(lastIndex)\n if (content.length > 0) {\n if (hyperlinkRanges.length > 0) {\n // Split remaining content by hyperlink URL\n let segStart = 0\n for (let ci = 0; ci < content.length; ci++) {\n const hl = getHyperlinkAt(lastIndex + ci)\n const prevHl = ci > 0 ? getHyperlinkAt(lastIndex + ci - 1) : undefined\n if (ci > 0 && hl !== prevHl) {\n const sub = content.slice(segStart, ci)\n if (sub.length > 0) {\n const seg: StyledSegment = { text: sub, ...currentStyle }\n if (prevHl) seg.hyperlink = prevHl\n segments.push(seg)\n }\n segStart = ci\n }\n }\n const sub = content.slice(segStart)\n if (sub.length > 0) {\n const hl = getHyperlinkAt(lastIndex + segStart)\n const seg: StyledSegment = { text: sub, ...currentStyle }\n if (hl) seg.hyperlink = hl\n segments.push(seg)\n }\n } else {\n segments.push({ text: content, ...currentStyle })\n }\n }\n }\n\n return segments\n}\n\nconst ANSI_TEST_REGEX = /\\x1b(?:\\[[0-9;:]*[A-Za-z]|\\])|\\x9b[\\x30-\\x3f]*[\\x40-\\x7e]|\\x9d/\n\n/**\n * Check if text contains ANSI escape sequences (SGR or OSC).\n * Detects both ESC-based (7-bit) and C1 (8-bit) forms:\n * - ESC [ params final (CSI)\n * - ESC ] (OSC)\n * - U+009B params final (C1 CSI)\n * - U+009D (C1 OSC)\n */\nexport function hasAnsi(text: string): boolean {\n // Use a non-global regex for testing to avoid lastIndex issues\n return ANSI_TEST_REGEX.test(text)\n}\n\n// ============================================================================\n// Measurement Utilities\n// ============================================================================\n\n/**\n * Measure the dimensions of multi-line text.\n *\n * @param text - Text to measure (may contain newlines)\n * @returns { width, height } in display columns and rows\n */\nexport function measureText(text: string): { width: number; height: number } {\n const lines = text.split(\"\\n\")\n let maxWidth = 0\n\n for (const line of lines) {\n const lineWidth = displayWidth(line)\n if (lineWidth > maxWidth) {\n maxWidth = lineWidth\n }\n }\n\n return {\n width: maxWidth,\n height: lines.length,\n }\n}\n\n/**\n * Check if a string contains any wide characters.\n */\nexport function hasWideCharacters(text: string): boolean {\n const graphemes = splitGraphemes(text)\n return graphemes.some(isWideGrapheme)\n}\n\n/**\n * Check if a string contains any combining/zero-width characters.\n */\nexport function hasZeroWidthCharacters(text: string): boolean {\n const graphemes = splitGraphemes(text)\n return graphemes.some(isZeroWidthGrapheme)\n}\n\n/**\n * Normalize string for consistent handling.\n * Applies Unicode NFC normalization.\n */\nexport function normalizeText(text: string): string {\n return text.normalize(\"NFC\")\n}\n\n// ============================================================================\n// Character Detection\n// ============================================================================\n\n/**\n * Common character ranges for quick checks.\n */\nconst CHAR_RANGES = {\n // Basic Latin (ASCII)\n isBasicLatin: (cp: number) => cp >= 0x0020 && cp <= 0x007f,\n\n // CJK Unified Ideographs\n isCJK: (cp: number) =>\n (cp >= 0x4e00 && cp <= 0x9fff) || // CJK Unified Ideographs\n (cp >= 0x3400 && cp <= 0x4dbf) || // CJK Unified Ideographs Extension A\n (cp >= 0x20000 && cp <= 0x2a6df) || // CJK Unified Ideographs Extension B\n (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs\n (cp >= 0x2f800 && cp <= 0x2fa1f), // CJK Compatibility Ideographs Supplement\n\n // Japanese Hiragana/Katakana\n isJapaneseKana: (cp: number) =>\n (cp >= 0x3040 && cp <= 0x309f) || // Hiragana\n (cp >= 0x30a0 && cp <= 0x30ff), // Katakana\n\n // Korean Hangul\n isHangul: (cp: number) =>\n (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables\n (cp >= 0x1100 && cp <= 0x11ff), // Hangul Jamo\n\n // Emoji ranges (simplified)\n isEmoji: (cp: number) =>\n (cp >= 0x1f600 && cp <= 0x1f64f) || // Emoticons\n (cp >= 0x1f300 && cp <= 0x1f5ff) || // Misc Symbols and Pictographs\n (cp >= 0x1f680 && cp <= 0x1f6ff) || // Transport and Map\n (cp >= 0x1f700 && cp <= 0x1f77f) || // Alchemical Symbols\n (cp >= 0x1f900 && cp <= 0x1f9ff) || // Supplemental Symbols and Pictographs\n (cp >= 0x2600 && cp <= 0x26ff) || // Misc symbols\n (cp >= 0x2700 && cp <= 0x27bf), // Dingbats\n} as const\n\n/**\n * Get the first code point of a string.\n */\nexport function getFirstCodePoint(str: string): number {\n const cp = str.codePointAt(0)\n return cp ?? 0\n}\n\n/**\n * Check if a grapheme is likely an emoji.\n * Note: This is a heuristic, not comprehensive.\n */\nexport function isLikelyEmoji(grapheme: string): boolean {\n const cp = getFirstCodePoint(grapheme)\n return CHAR_RANGES.isEmoji(cp) || grapheme.includes(\"\\u200d\") // Contains ZWJ\n}\n\n/**\n * Check if a grapheme is a CJK character.\n */\nexport function isCJK(grapheme: string): boolean {\n const cp = getFirstCodePoint(grapheme)\n return CHAR_RANGES.isCJK(cp) || CHAR_RANGES.isJapaneseKana(cp) || CHAR_RANGES.isHangul(cp)\n}\n","/**\n * Error types for silvery terminal rendering.\n *\n * Separated from scheduler.ts to allow React-free barrel imports.\n * Keep this file React-free — only plain types allowed.\n */\n\nimport type { RenderPhaseStats } from \"./pipeline/types\"\n\n/** Structured mismatch data attached to the error (mirrors MismatchDebugContext shape) */\nexport interface MismatchErrorData {\n /** Render-phase instrumentation snapshot (nodes visited/rendered/skipped, per-flag breakdown) */\n renderPhaseStats?: RenderPhaseStats\n /** Debug context for the mismatched cell (from debug-mismatch.ts) */\n mismatchContext?: unknown\n}\n\n/**\n * Error thrown when SILVERY_STRICT detects a mismatch.\n * This error should NOT be caught by general error handlers - it indicates\n * a bug in incremental rendering that needs to be fixed.\n *\n * When SILVERY_STRICT fires, the error automatically includes:\n * - Render-phase instrumentation (nodes visited/rendered/skipped, per-flag breakdown)\n * - Cell attribution (which node owns the mismatched cell, dirty flags, scroll context)\n */\nexport class IncrementalRenderMismatchError extends Error {\n /** Render-phase instrumentation snapshot */\n renderPhaseStats?: RenderPhaseStats\n /** Debug context for the mismatched cell */\n mismatchContext?: unknown\n\n constructor(message: string, data?: MismatchErrorData) {\n super(message)\n this.name = \"IncrementalRenderMismatchError\"\n this.renderPhaseStats = data?.renderPhaseStats\n this.mismatchContext = data?.mismatchContext\n }\n}\n","// ═══════════════════════════════════════════════════════\n// Core Types\n// ═══════════════════════════════════════════════════════\n\nexport interface TerminalOptions {\n cols: number\n rows: number\n scrollbackLimit?: number\n}\n\n// ── Cell ──\n\nexport interface Cell {\n char: string\n fg: RGB | null\n bg: RGB | null\n bold: boolean\n dim: boolean\n italic: boolean\n underline: UnderlineStyle\n underlineColor: RGB | null\n strikethrough: boolean\n inverse: boolean\n blink: boolean\n hidden: boolean\n wide: boolean\n continuation: boolean\n hyperlink: string | null\n}\n\nexport type UnderlineStyle = false | \"single\" | \"double\" | \"curly\" | \"dotted\" | \"dashed\"\n\nexport type RGB = { r: number; g: number; b: number }\n\n// ── Cursor ──\n\nexport interface CursorState {\n x: number\n y: number\n /** Whether the cursor is visible. `null` if the backend doesn't know. */\n visible: boolean | null\n /** Cursor shape. `null` if the backend doesn't know. */\n style: CursorStyle | null\n}\n\nexport type CursorStyle = \"block\" | \"underline\" | \"beam\"\n\n// ── Modes ──\n\nexport type TerminalMode =\n | \"altScreen\"\n | \"cursorVisible\"\n | \"bracketedPaste\"\n | \"applicationCursor\"\n | \"applicationKeypad\"\n | \"autoWrap\"\n | \"mouseTracking\"\n | \"focusTracking\"\n | \"originMode\"\n | \"insertMode\"\n | \"reverseVideo\"\n\n// ── Scrollback ──\n\nexport interface ScrollbackState {\n /**\n * Absolute row index of the viewport's top line in the buffer.\n * When at the bottom (no scrollback visible): `totalLines - screenLines`.\n * When scrolled to the very top: `0`.\n *\n * Used by region views as the start row for viewport rendering:\n * `createRegionView(readable, viewportOffset, viewportOffset + screenLines)`.\n */\n viewportOffset: number\n /**\n * Total number of lines in the buffer (scrollback history + screen).\n * Row 0 is the first line in scrollback; row `totalLines - 1` is the last screen line.\n */\n totalLines: number\n /**\n * Number of visible screen rows (the terminal's row dimension).\n * The screen occupies the last `screenLines` rows of the buffer\n * (rows `totalLines - screenLines` through `totalLines - 1`).\n */\n screenLines: number\n}\n\n// ── Key ──\n\nexport interface KeyDescriptor {\n key: string\n shift?: boolean\n ctrl?: boolean\n alt?: boolean\n super?: boolean\n}\n\n// ── Capabilities ──\n\nexport interface TerminalCapabilities {\n name: string\n version: string\n truecolor: boolean\n kittyKeyboard: boolean\n kittyGraphics: boolean\n sixel: boolean\n osc8Hyperlinks: boolean\n semanticPrompts: boolean\n unicode: string\n reflow: boolean\n extensions: Set<string>\n}\n\n// ═══════════════════════════════════════════════════════\n// View Types — composable regions for matchers\n// ═══════════════════════════════════════════════════════\n\n/** A region of the terminal that can produce text. Used with text matchers. */\nexport interface RegionView {\n getText(): string\n getLines(): string[]\n containsText(text: string): boolean\n}\n\n/**\n * Raw terminal output stream captured before emulator parsing.\n *\n * Use this for terminal protocol assertions (OSC/APC/CSI bytes such as\n * Kitty graphics packets) that may intentionally leave no visible cells.\n */\nexport interface OutputView {\n getText(): string\n getChunks(): readonly string[]\n containsOutput(text: string): boolean\n clear(): void\n}\n\n/** A single cell with positional context. Used with style matchers. */\nexport interface CellView {\n readonly char: string\n readonly row: number\n readonly col: number\n readonly fg: RGB | null\n readonly bg: RGB | null\n readonly bold: boolean\n readonly dim: boolean\n readonly italic: boolean\n readonly underline: UnderlineStyle\n readonly underlineColor: RGB | null\n readonly strikethrough: boolean\n readonly inverse: boolean\n readonly blink: boolean\n readonly hidden: boolean\n readonly wide: boolean\n readonly continuation: boolean\n readonly hyperlink: string | null\n}\n\n/** A row is a RegionView with positional context and cell access. */\nexport interface RowView extends RegionView {\n readonly row: number\n readonly cells: Cell[]\n cellAt(col: number): CellView\n}\n\n// ═══════════════════════════════════════════════════════\n// TerminalReadable — shared protocol for backends\n// ═══════════════════════════════════════════════════════\n\n/**\n * Shared read protocol for terminal backends.\n *\n * **Coordinate system**: All row parameters use **absolute buffer rows**.\n * Row 0 is the first line in scrollback history. The screen occupies the\n * last `screenLines` rows (from `totalLines - screenLines` to `totalLines - 1`).\n */\nexport interface TerminalReadable {\n /** Get all buffer text (scrollback + screen) as a newline-joined string. */\n getText(): string\n /**\n * Get text in a rectangular range using absolute buffer rows.\n * startCol/endCol apply to the first/last rows respectively;\n * intermediate rows return full width.\n */\n getTextRange(startRow: number, startCol: number, endRow: number, endCol: number): string\n /** Get a single cell at an absolute buffer row and column. */\n getCell(row: number, col: number): Cell\n /** Get all cells in an absolute buffer row. */\n getLine(row: number): Cell[]\n /** Get all lines as cell arrays (entire buffer: scrollback + screen). */\n getLines(): Cell[][]\n getCursor(): CursorState\n getMode(mode: TerminalMode): boolean\n getTitle(): string\n getScrollback(): ScrollbackState\n}\n\n// ═══════════════════════════════════════════════════════\n// TerminalBackend — all backends MUST implement this\n// ═══════════════════════════════════════════════════════\n\n/**\n * Options accepted by {@link TerminalBackend.screenshot} and\n * {@link Terminal.screenshot}.\n *\n * Mirrors `@termless/ghostty`'s `RenderOptions` shape — kept as a local minimal\n * type here so `@termless/core` does not import from `@termless/ghostty` (which\n * would create a peer-dep cycle: ghostty already depends on core). The two\n * shapes are kept structurally compatible by hand.\n *\n * Fields are documented in `@termless/ghostty`'s `RenderOptions`.\n */\nexport interface ScreenshotOptions {\n cols?: number\n rows?: number\n fontSize?: number\n fontFamily?: string\n fontPath?: string\n dpr?: number\n cursorStyle?: \"block\" | \"underline\" | \"beam\"\n cursorBlink?: boolean\n hideCursor?: boolean\n cellWidth?: number\n cellHeight?: number\n targetWidth?: number\n targetHeight?: number\n theme?: Record<string, string>\n /**\n * Which renderer rasterizes the screenshot — `canvas` (`@napi-rs/canvas`,\n * high fidelity), `resvg` (`@resvg/resvg-js`, cross-platform), `swash`\n * (`@termless/swash-render`, pure-Rust, browser-grade color emoji),\n * `browser` (headless Chromium via the optional `playwright` package —\n * absolute-max fidelity, opt-in only), or `auto` (canvas when its native\n * binding loads, else resvg). Default `auto`. A *force* override consulted\n * by {@link Terminal.screenshot}. `browser` is never reached from `auto`.\n */\n renderer?: \"canvas\" | \"resvg\" | \"swash\" | \"browser\" | \"auto\"\n}\n\nexport interface TerminalBackend extends TerminalReadable {\n readonly name: string\n\n // Lifecycle\n init(opts: TerminalOptions): void\n destroy(): void\n\n // Data flow\n feed(data: Uint8Array): void\n resize(cols: number, rows: number): void\n reset(): void\n\n // Key encoding\n encodeKey(key: KeyDescriptor): Uint8Array\n\n /**\n * Callback invoked when the emulator generates a response that must be\n * written back to the PTY (e.g., cursor position reports, device attribute\n * responses, kitty keyboard negotiation). Set by the Terminal layer when\n * a PTY is spawned.\n */\n onResponse?: (data: Uint8Array) => void\n\n // Scrollback\n scrollViewport(delta: number): void\n\n // Capabilities\n readonly capabilities: TerminalCapabilities\n\n /**\n * Optional native screenshot capability. Present iff the backend has its\n * own raster renderer (today: only the ghostty backend, which renders via\n * `@termless/ghostty.renderTerminalPng`).\n *\n * Parser-only backends (xtermjs / vt100 / vterm / libvterm / alacritty /\n * wezterm) do NOT implement this; `Terminal.screenshot()` proxies them\n * through `@termless/ghostty`'s renderer by re-emitting cells as ANSI via\n * `cellsToAnsi` + `renderAnsiPng`.\n */\n screenshot?(opts?: ScreenshotOptions): Promise<Uint8Array>\n}\n\n// ═══════════════════════════════════════════════════════\n// Terminal — high-level API wrapping backend + optional PTY\n// ═══════════════════════════════════════════════════════\n\nexport interface TerminalCreateOptions {\n backend: TerminalBackend\n cols?: number\n rows?: number\n scrollbackLimit?: number\n /**\n * Optional hook fired after every successful write to the backend\n * (both direct `feed()` calls and PTY-spawned data). Receives the raw\n * bytes written. Used by frame-trace mode and other observers that need\n * to react to buffer mutations without polling.\n */\n onAfterWrite?: (data: Uint8Array) => void\n}\n\nexport interface SpawnOptions {\n command: string[]\n env?: Record<string, string>\n cwd?: string\n}\n\nexport interface TextPosition {\n row: number\n col: number\n text: string\n}\n\n/** Modifier keys for mouse events. */\nexport interface MouseModifiers {\n ctrl?: boolean\n shift?: boolean\n alt?: boolean\n}\n\n/** Options for mouse click/press/release events. */\nexport interface MouseOptions extends MouseModifiers {\n /** Mouse button: 0=left (default), 1=middle, 2=right. */\n button?: 0 | 1 | 2\n}\n\nexport interface Terminal extends TerminalReadable {\n readonly cols: number\n readonly rows: number\n readonly backend: TerminalBackend\n\n // Region selectors (WHERE)\n readonly screen: RegionView\n readonly scrollback: RegionView\n readonly buffer: RegionView\n readonly viewport: RegionView\n readonly out: OutputView\n row(n: number): RowView\n cell(row: number, col: number): CellView\n range(r1: number, c1: number, r2: number, c2: number): RegionView\n firstRow(): RowView\n lastRow(): RowView\n\n // Direct data feed (no PTY)\n feed(data: Uint8Array | string): void\n\n // PTY lifecycle\n spawn(command: string[], options?: Omit<SpawnOptions, \"command\">): Promise<void>\n readonly alive: boolean\n readonly exitInfo: string | null\n\n // Input — keyboard\n press(key: string): void\n type(text: string): void\n\n // Input — mouse (SGR mode 1006)\n click(x: number, y: number, options?: MouseOptions): void\n dblclick(x: number, y: number, options?: MouseOptions & { delay?: number }): Promise<void>\n mouseDown(x: number, y: number, options?: MouseOptions): void\n mouseUp(x: number, y: number, options?: MouseOptions): void\n mouseMove(x: number, y: number, options?: MouseOptions): void\n wheel(deltaX: number, deltaY: number, options?: { x?: number; y?: number } & MouseModifiers): void\n\n // Waiting\n waitFor(text: string, timeout?: number): Promise<void>\n waitForStable(stableMs?: number, timeout?: number): Promise<void>\n\n // Search\n find(text: string): TextPosition | null\n findAll(pattern: RegExp): TextPosition[]\n\n // Screenshot\n screenshotSvg(options?: SvgScreenshotOptions): string\n screenshotPng(options?: PngScreenshotOptions): Promise<Uint8Array>\n /**\n * Auto-picking PNG screenshot.\n *\n * Decision tree:\n * 1. If the backend implements `screenshot()` natively (today: ghostty),\n * use it directly.\n * 2. Otherwise, try the `@termless/ghostty` proxy path: serialize the\n * backend's cell grid via `cellsToAnsi`, feed to `renderAnsiPng`.\n * 3. If `@termless/ghostty` is not installed, fall back to the resvg-based\n * SVG → PNG path (`screenshotPng`). Cross-platform safe; lower fidelity.\n */\n screenshot(options?: ScreenshotOptions): Promise<Uint8Array>\n /**\n * Explicit native-canvas PNG screenshot. Always goes through `@termless/ghostty`'s\n * `renderAnsiPng` regardless of whether the backend has a native `screenshot()`\n * method — useful when the caller wants the ghostty renderer's fidelity\n * specifically (consistent fonts/theme/metrics) and doesn't want the\n * auto-picker silently using a different path.\n *\n * Throws if `@termless/ghostty` is not installed.\n */\n screenshotCanvasPng(options?: ScreenshotOptions): Promise<Uint8Array>\n\n // Resize\n resize(cols: number, rows: number): void\n\n // Clipboard\n /** Captured OSC 52 clipboard writes (decoded text). Populated when terminal output contains OSC 52 set-clipboard sequences. */\n readonly clipboardWrites: string[]\n\n // Cleanup\n close(): Promise<void>\n [Symbol.asyncDispose](): Promise<void>\n}\n\n// ═══════════════════════════════════════════════════════\n// SVG Screenshot Options\n// ═══════════════════════════════════════════════════════\n\n/**\n * Window bar style on a rendered screenshot.\n *\n * - `none` — no bar.\n * - `colorful` — macOS traffic-light dots, filled (active window).\n * - `rings` — macOS traffic-light dots, outlined (inactive window).\n * - `windows` — a flat Windows-style title bar with minimize / maximize /\n * close glyphs at the right edge.\n */\nexport type WindowBar = \"none\" | \"rings\" | \"colorful\" | \"windows\"\n\nexport interface SvgScreenshotOptions {\n fontFamily?: string\n fontSize?: number\n cellWidth?: number\n cellHeight?: number\n theme?: SvgTheme\n /** Padding between terminal content and SVG edge in pixels (default: 0). */\n padding?: number\n /** Border radius for the outer SVG rect in pixels (default: 0). */\n borderRadius?: number\n /** Window bar style — macOS traffic light dots (default: \"none\"). */\n windowBar?: WindowBar\n /** Height of the window bar area in pixels (default: 40). */\n windowBarSize?: number\n /** Optional title text rendered centered in the window bar. */\n windowTitle?: string\n /**\n * Soft drop shadow blur radius in pixels for the window frame (default: 0\n * — no shadow). Needs a `margin` large enough to contain the blur, else the\n * shadow is clipped at the SVG edge.\n */\n shadow?: number\n /** Outer margin around the SVG in pixels (default: 0). */\n margin?: number\n /** Fill color for the outer margin area (default: transparent). */\n marginFill?: string\n /** Playback speed multiplier for Sleep durations (default: 1). */\n playbackSpeed?: number\n /** Output framerate in frames per second (default: 50). */\n framerate?: number\n /**\n * Embed the bundled fonts into the SVG as base64 `@font-face` rules, and\n * point `font-family` at them (default: false). A self-contained SVG renders\n * identically everywhere — no host-font dependency. Use for standalone\n * `.svg` output; leave off for the GIF pipeline (the rasterizer supplies\n * fonts, and per-frame embedding would bloat the in-memory frame set).\n */\n embedFonts?: boolean\n}\n\nexport interface PngScreenshotOptions extends SvgScreenshotOptions {\n /** Render scale factor (default: 2 for retina-quality output). */\n scale?: number\n}\n\nexport interface SvgTheme {\n foreground?: string\n background?: string\n cursor?: string\n palette?: Record<number, string>\n}\n\n// ═══════════════════════════════════════════════════════\n// Emulator Warnings\n// ═══════════════════════════════════════════════════════\n\n/**\n * Structured warning emitted by a terminal emulator backend.\n *\n * Backends capture these instead of (or in addition to) using console.log/warn.\n * Test infrastructure checks for unexpected warnings after each test to surface\n * portability issues — e.g., an emulator saying \"unsupported OSC: 66\" is the\n * emulator telling you \"your portability assumption is false.\"\n */\nexport interface EmulatorWarning {\n /** Warning category code, e.g., \"UNSUPPORTED_OSC\", \"UNKNOWN_CSI\", \"PARSE_ERROR\" */\n code: string\n /** The raw message from the emulator */\n message: string\n /** Which backend produced this warning */\n backend: string\n}\n\n/**\n * Extension interface for backends that can capture emulator warnings.\n *\n * Backends implementing this collect warnings during feed() calls instead of\n * logging to console. Test infrastructure drains warnings after each test.\n */\nexport interface WarningExtension {\n /** Get all accumulated warnings since last drain. */\n getWarnings(): EmulatorWarning[]\n /** Clear accumulated warnings (called by test teardown). */\n clearWarnings(): void\n}\n\n// ═══════════════════════════════════════════════════════\n// Extension Interfaces (optional)\n// ═══════════════════════════════════════════════════════\n\nexport interface MouseEvent {\n x: number\n y: number\n button: \"left\" | \"middle\" | \"right\" | \"wheelUp\" | \"wheelDown\" | \"none\"\n action: \"press\" | \"release\" | \"move\"\n shift?: boolean\n ctrl?: boolean\n alt?: boolean\n}\n\nexport interface MouseEncodingExtension {\n encodeMouse(event: MouseEvent): Uint8Array | null\n}\n\nexport interface ColorPaletteExtension {\n setColorPalette(entries: Partial<Record<number, RGB>>): void\n setDefaultFg(color: RGB): void\n setDefaultBg(color: RGB): void\n}\n\nexport interface DirtyTrackingExtension {\n getDirtyRows(): Set<number>\n clearDirty(): void\n}\n\nexport interface HyperlinkExtension {\n getHyperlinkAt(row: number, col: number): string | null\n}\n\nexport interface BellExtension {\n getBellCount(): number\n clearBellCount(): void\n}\n\nexport function hasExtension<T>(backend: TerminalBackend, ext: string): backend is TerminalBackend & T {\n return backend.capabilities.extensions.has(ext)\n}\n","/**\n * The **Renderer strategy** — `buffer → pixels`.\n *\n * A Renderer rasterizes a terminal buffer into a presentable artifact (SVG\n * vector text, PNG raster, or — via `@termless/ghostty` — a canvas-rendered\n * PNG). It is a *strategy*, not a domain object: the recording domain has\n * three nouns (Backend · Terminal · Recording) and four verbs (record · view ·\n * play · compare); the Renderer is an internal capability used by `record`\n * (frame capture) and `view` (per-frame display).\n *\n * There is no `Renderer` class hierarchy and no presentation-side noun for it.\n * A Renderer is just a function — `(terminal, options) => artifact` — and this\n * module collects the built-in strategies behind one import surface:\n *\n * - {@link screenshotSvg} — synchronous vector strategy (no native deps)\n * - {@link screenshotPng} — raster strategy via `@resvg/resvg-js`\n * - `@termless/ghostty`'s `renderTerminalPng` — canvas raster strategy\n * (lives in the ghostty package but conforms to {@link RasterRenderer})\n *\n * Swapping the strategy is what satisfies the cross-platform ambition: a\n * canvas/DOM target plugs in here without the three domain objects moving.\n */\n\nimport type { TerminalReadable } from \"../terminal/types.ts\"\n\nexport { screenshotSvg, rgbToHex, rgbToString } from \"./svg.ts\"\nexport { screenshotPng } from \"./png.ts\"\nexport type { PngScreenshotOptions } from \"./png.ts\"\n\n/**\n * A **vector** Renderer strategy: a synchronous `buffer → SVG string`\n * rasterizer. {@link screenshotSvg} is the built-in implementation.\n */\nexport type VectorRenderer<O = unknown> = (terminal: TerminalReadable, options?: O) => string\n\n/**\n * A **raster** Renderer strategy: an async `buffer → PNG bytes` rasterizer.\n * Both {@link screenshotPng} and `@termless/ghostty`'s `renderTerminalPng`\n * conform to this shape.\n */\nexport type RasterRenderer<O = unknown> = (terminal: TerminalReadable, options?: O) => Promise<Uint8Array>\n\n/**\n * The Renderer strategy in either form. `record` and `view` accept a\n * `Renderer` and never care which concrete strategy was supplied.\n */\nexport type Renderer<O = unknown> = VectorRenderer<O> | RasterRenderer<O>\n","/**\n * HTML trace viewer for frame-trace output.\n *\n * Phase 5 of the Visual Eyes epic (@km/infra/15376).\n *\n * `writeViewer(dir)` reads a frame-trace directory (`index.jsonl` + `NNNNN.png`\n * files) and emits a self-contained `viewer.html` alongside them. The viewer is\n * a single file with all data inlined — jsonl rows as a JSON blob, PNGs as\n * base64 data URIs — so it works by double-clicking the file with no server\n * and no cross-origin `file://` fetch.\n *\n * `createFrameTracer`'s `stop()` calls `writeViewer` automatically, so every\n * trace gets a viewer. `writeViewer` is also exported for standalone use on an\n * existing trace directory.\n *\n * The browser-side JS lives inside the template string below — it is vanilla,\n * framework-free, build-step-free. It is its own world: the \"no classes / no\n * globals\" rule applies to the .ts side, not the inlined browser code.\n */\n\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { TraceFrame } from \"../recording/frame-trace.ts\"\nimport type { Frame as ModelFrame, Recording } from \"../recording/recording.ts\"\n\nexport interface WriteViewerResult {\n /** Absolute path to the generated viewer.html. */\n viewerFile: string\n /** Number of frames inlined. */\n frameCount: number\n /** Number of PNGs inlined as data URIs. */\n imageCount: number\n /** Byte length of the generated HTML. */\n bytes: number\n}\n\n/** Parse a frame-trace `index.jsonl`, tolerating a truncated final line. */\nfunction parseIndex(indexPath: string): TraceFrame[] {\n const raw = readFileSync(indexPath, \"utf-8\")\n const frames: TraceFrame[] = []\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim()\n if (trimmed === \"\") continue\n try {\n frames.push(JSON.parse(trimmed) as TraceFrame)\n } catch {\n // Truncated/partial final line from a crashed session — stop here.\n break\n }\n }\n return frames\n}\n\nconst MIME_BY_EXT: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".webp\": \"image/webp\",\n}\n\n/** base64-encode a binary file into a `data:` URI, runtime-agnostic. */\nfunction fileToDataUri(path: string): string {\n const ext = path.slice(path.lastIndexOf(\".\")).toLowerCase()\n const mime = MIME_BY_EXT[ext] ?? \"image/png\"\n const bytes = readFileSync(path)\n const b64 = Buffer.from(bytes).toString(\"base64\")\n return `data:${mime};base64,${b64}`\n}\n\n/**\n * Generate `viewer.html` for a frame-trace directory.\n *\n * @param dir Directory containing `index.jsonl` and `NNNNN.png` files.\n * @returns Metadata about the generated viewer.\n */\nexport function writeViewer(dir: string): WriteViewerResult {\n const indexPath = join(dir, \"index.jsonl\")\n if (!existsSync(indexPath)) {\n throw new Error(`writeViewer: no index.jsonl in ${dir}`)\n }\n const frames = parseIndex(indexPath)\n return emitViewer(frames, dir)\n}\n\n/**\n * Project a unified-model {@link ModelFrame} onto the viewer's on-disk-shaped\n * wire {@link TraceFrame}. The browser-side viewer JS reads the frozen on-disk\n * field names (`ts`, `duplicate_of`, `ansi_input_preview`, …); this is the\n * one-way bridge from the {@link Recording} model into that wire shape.\n *\n * Timebase — the model carries `at` (integer µs from start). The viewer's\n * `ts` field is treated as a relative ms position when no wall clock exists,\n * so a model frame's `at` is converted µs → ms.\n */\nfunction modelFrameToViewerFrame(frame: ModelFrame, prevAtMicros: number): TraceFrame {\n const tsMs = Math.round(frame.at / 1000)\n return {\n seq: frame.seq,\n ts: tsMs,\n iso: \"\",\n hash: frame.contentHash,\n duplicate_of: frame.duplicateOf,\n bytes_in_since_last: frame.bytesInSinceLast,\n ansi_input_preview: frame.ansiPreview,\n buffer: {\n cols: frame.buffer.cols,\n rows: frame.buffer.rows,\n cursor: { row: frame.buffer.cursor.row, col: frame.buffer.cursor.col },\n },\n duration_since_prev_ms: Math.round((frame.at - prevAtMicros) / 1000),\n render_ms: 0,\n png: frame.png,\n ...(frame.signal !== undefined ? { silvery: frame.signal } : {}),\n }\n}\n\n/**\n * Generate `viewer.html` from a unified {@link Recording}'s `frames`\n * projection (Phase 2 of the Recording-domain unification).\n *\n * This is the {@link Recording}-consuming entry point — `writeViewer` parses\n * the on-disk `index.jsonl`; this consumes the in-memory model directly. PNGs\n * are still inlined from `dir` (the projection's `png` field is a path\n * relative to the recording bundle).\n *\n * @throws {Error} when the recording has no `frames` projection.\n */\nexport function writeViewerFromRecording(recording: Recording, dir: string): WriteViewerResult {\n const modelFrames = recording.frames\n if (modelFrames === undefined || modelFrames.length === 0) {\n throw new Error(\"writeViewerFromRecording: recording has no frames projection\")\n }\n const frames: TraceFrame[] = []\n let prevAt = 0\n for (const mf of modelFrames) {\n frames.push(modelFrameToViewerFrame(mf, prevAt))\n prevAt = mf.at\n }\n return emitViewer(frames, dir)\n}\n\n/**\n * Shared viewer-emission core: inline referenced PNGs, render the HTML\n * template, write `viewer.html`. Used by both `writeViewer` (on-disk source)\n * and `writeViewerFromRecording` (in-memory `Recording` source).\n */\nfunction emitViewer(frames: TraceFrame[], dir: string): WriteViewerResult {\n // Inline every referenced PNG as a data URI. Frames may share a PNG name\n // (they don't here — dedupe points dups at duplicate_of), and duplicate\n // frames have png:null; we resolve those through duplicate_of at view time.\n const images: Record<string, string> = {}\n const pngOnDisk = existsSync(dir) ? new Set(readdirSync(dir).filter((f) => /\\.png$/i.test(f))) : new Set<string>()\n for (const frame of frames) {\n if (frame.png && pngOnDisk.has(frame.png) && !(frame.png in images)) {\n images[frame.png] = fileToDataUri(join(dir, frame.png))\n }\n }\n\n const payload = JSON.stringify({ frames, images })\n const html = renderTemplate(payload, dir)\n const viewerFile = join(dir, \"viewer.html\")\n writeFileSync(viewerFile, html, \"utf-8\")\n\n return {\n viewerFile,\n frameCount: frames.length,\n imageCount: Object.keys(images).length,\n bytes: Buffer.byteLength(html, \"utf-8\"),\n }\n}\n\n/**\n * Build the self-contained HTML document.\n *\n * The data payload is embedded in a `<script type=\"application/json\">` tag\n * (not a JS literal) so payload contents can never break out into executable\n * context. The only escaping needed is `</` → `<\\/` so the JSON can't close\n * the script tag early.\n */\nfunction renderTemplate(payload: string, dir: string): string {\n const safePayload = payload.replace(/<\\//g, \"<\\\\/\")\n const title = `Frame Trace — ${dir.replace(/<\\//g, \"<\\\\/\")}`\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHtml(title)}</title>\n<style>\n${VIEWER_CSS}\n</style>\n</head>\n<body>\n<header id=\"viewer-header\">\n <h1>Frame Trace Viewer</h1>\n <div id=\"trace-meta\"></div>\n</header>\n<div id=\"toolbar\">\n <input id=\"find-input\" type=\"search\" placeholder=\"Find in ANSI input…\" autocomplete=\"off\">\n <input id=\"filter-input\" type=\"search\" placeholder=\"Filter rows (free-text predicate over JSON)…\" autocomplete=\"off\">\n <button id=\"diff-toggle\" type=\"button\">Diff mode: off</button>\n <span id=\"diff-hint\"></span>\n</div>\n<div id=\"timeline-wrap\">\n <div id=\"timeline\" tabindex=\"0\" role=\"listbox\" aria-label=\"Frame timeline\"></div>\n</div>\n<main id=\"detail\">\n <section id=\"preview-pane\">\n <div id=\"preview-stage\">\n <img id=\"preview-img\" alt=\"frame preview\">\n <canvas id=\"diff-canvas\"></canvas>\n </div>\n </section>\n <aside id=\"info-pane\">\n <div id=\"frame-info\"></div>\n <div id=\"ansi-block\">\n <h3>ANSI input preview</h3>\n <pre id=\"ansi-preview\"></pre>\n </div>\n <div id=\"silvery-block\" hidden>\n <h3>Silvery state</h3>\n <pre id=\"silvery-state\"></pre>\n </div>\n </aside>\n</main>\n<footer id=\"viewer-footer\">\n <span>Arrow keys / <kbd>j</kbd> <kbd>k</kbd> to scrub · click a tick to select · diff mode: pick two frames</span>\n</footer>\n<script type=\"application/json\" id=\"trace-data\">${safePayload}</script>\n<script>\n${VIEWER_JS}\n</script>\n</body>\n</html>\n`\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\")\n}\n\nconst VIEWER_CSS = `\n:root {\n --bg: #14161a; --panel: #1d2026; --panel2: #262a32; --line: #333842;\n --fg: #e6e8ec; --muted: #8b919e; --accent: #4ea1ff; --idle: #3a3f49;\n --diff: #ff3b4e; --ok: #3ddc84; --warn: #ffb454;\n}\n* { box-sizing: border-box; }\nhtml, body { margin: 0; height: 100%; }\nbody {\n background: var(--bg); color: var(--fg);\n font: 13px/1.5 ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n display: flex; flex-direction: column; height: 100vh;\n}\n#viewer-header { padding: 8px 14px; border-bottom: 1px solid var(--line); }\n#viewer-header h1 { font-size: 15px; margin: 0 0 2px; }\n#trace-meta { color: var(--muted); font-size: 11px; }\n#toolbar {\n display: flex; gap: 8px; padding: 8px 14px; align-items: center;\n border-bottom: 1px solid var(--line); flex-wrap: wrap;\n}\n#toolbar input[type=search] {\n background: var(--panel2); color: var(--fg); border: 1px solid var(--line);\n border-radius: 4px; padding: 5px 8px; font: inherit; min-width: 220px;\n}\n#toolbar input:focus { outline: 1px solid var(--accent); }\n#diff-toggle {\n background: var(--panel2); color: var(--fg); border: 1px solid var(--line);\n border-radius: 4px; padding: 5px 10px; font: inherit; cursor: pointer;\n}\n#diff-toggle.on { background: var(--accent); color: #06121f; border-color: var(--accent); }\n#diff-hint { color: var(--warn); font-size: 11px; }\n#timeline-wrap { border-bottom: 1px solid var(--line); background: var(--panel); }\n#timeline {\n display: flex; align-items: stretch; gap: 1px; height: 56px;\n overflow-x: auto; overflow-y: hidden; padding: 6px 8px; outline: none;\n}\n#timeline:focus { box-shadow: inset 0 0 0 1px var(--accent); }\n.tick {\n flex: 0 0 6px; min-width: 6px; background: var(--accent);\n border-radius: 2px; cursor: pointer; position: relative; opacity: 0.85;\n}\n.tick.dup { background: var(--idle); opacity: 0.6; }\n.tick.idle-gap { background: var(--idle); flex-basis: 14px; opacity: 0.35; }\n.tick.hidden-row { display: none; }\n.tick.match { box-shadow: inset 0 0 0 2px var(--warn); }\n.tick.selected { box-shadow: inset 0 0 0 2px var(--fg); opacity: 1; }\n.tick.diff-a { box-shadow: inset 0 0 0 2px var(--ok); opacity: 1; }\n.tick.diff-b { box-shadow: inset 0 0 0 2px var(--diff); opacity: 1; }\n.tick:hover { opacity: 1; }\n#detail { flex: 1; display: flex; min-height: 0; }\n#preview-pane {\n flex: 1; display: flex; align-items: center; justify-content: center;\n background: #0c0d10; padding: 14px; min-width: 0;\n}\n#preview-stage { position: relative; max-width: 100%; max-height: 100%; }\n#preview-img { max-width: 100%; max-height: 70vh; display: block; image-rendering: pixelated; }\n#diff-canvas {\n position: absolute; left: 0; top: 0; pointer-events: none; display: none;\n max-width: 100%; max-height: 70vh;\n}\n#info-pane {\n width: 360px; flex: 0 0 360px; border-left: 1px solid var(--line);\n padding: 12px 14px; overflow-y: auto; background: var(--panel);\n}\n#info-pane h3 { font-size: 11px; text-transform: uppercase; color: var(--muted); margin: 14px 0 4px; }\n#frame-info { display: grid; grid-template-columns: auto 1fr; gap: 2px 10px; }\n#frame-info .k { color: var(--muted); }\n#frame-info .v { color: var(--fg); word-break: break-all; }\n#frame-info .v.delta-pos { color: var(--warn); }\npre {\n background: var(--panel2); border: 1px solid var(--line); border-radius: 4px;\n padding: 8px; white-space: pre-wrap; word-break: break-all; margin: 0;\n max-height: 240px; overflow: auto; font-size: 12px;\n}\n#viewer-footer { padding: 6px 14px; border-top: 1px solid var(--line); color: var(--muted); font-size: 11px; }\nkbd {\n background: var(--panel2); border: 1px solid var(--line); border-radius: 3px;\n padding: 0 4px; font-size: 10px;\n}\n.empty { color: var(--muted); padding: 20px; text-align: center; }\n`\n\nconst VIEWER_JS = `\n\"use strict\";\n(function () {\n // ── Data ──────────────────────────────────────────────────────────────\n var dataEl = document.getElementById(\"trace-data\");\n var DATA = JSON.parse(dataEl.textContent || \"{}\");\n var FRAMES = DATA.frames || [];\n var IMAGES = DATA.images || {};\n\n var els = {\n timeline: document.getElementById(\"timeline\"),\n meta: document.getElementById(\"trace-meta\"),\n previewImg: document.getElementById(\"preview-img\"),\n diffCanvas: document.getElementById(\"diff-canvas\"),\n frameInfo: document.getElementById(\"frame-info\"),\n ansiPreview: document.getElementById(\"ansi-preview\"),\n silveryBlock: document.getElementById(\"silvery-block\"),\n silveryState: document.getElementById(\"silvery-state\"),\n findInput: document.getElementById(\"find-input\"),\n filterInput: document.getElementById(\"filter-input\"),\n diffToggle: document.getElementById(\"diff-toggle\"),\n diffHint: document.getElementById(\"diff-hint\"),\n };\n\n // ── State ─────────────────────────────────────────────────────────────\n var selected = FRAMES.length ? 0 : -1;\n var diffMode = false;\n var diffA = -1;\n var diffB = -1;\n var ticks = []; // tick DOM elements, indexed by frame index\n var hiddenSet = new Set(); // frame indices filtered out\n\n // Resolve the PNG for a frame, following duplicate_of for deduped frames.\n function imageForFrame(idx) {\n var f = FRAMES[idx];\n if (!f) return null;\n if (f.png && IMAGES[f.png]) return IMAGES[f.png];\n if (f.duplicate_of != null) {\n // duplicate_of is a 1-based seq; find that frame.\n for (var i = 0; i < FRAMES.length; i++) {\n if (FRAMES[i].seq === f.duplicate_of && FRAMES[i].png && IMAGES[FRAMES[i].png]) {\n return IMAGES[FRAMES[i].png];\n }\n }\n }\n return null;\n }\n\n // Idle-gap detection: median inter-frame gap; anything >3x median is \"idle\".\n function computeIdleThreshold() {\n var gaps = [];\n for (var i = 1; i < FRAMES.length; i++) {\n var g = FRAMES[i].ts - FRAMES[i - 1].ts;\n if (g >= 0) gaps.push(g);\n }\n if (!gaps.length) return Infinity;\n gaps.sort(function (a, b) { return a - b; });\n var median = gaps[Math.floor(gaps.length / 2)] || 0;\n return Math.max(median * 3, 200);\n }\n var idleThreshold = computeIdleThreshold();\n\n // ── Build timeline ────────────────────────────────────────────────────\n function buildTimeline() {\n els.timeline.innerHTML = \"\";\n ticks = [];\n if (!FRAMES.length) {\n els.timeline.innerHTML = '<div class=\"empty\">No frames in this trace.</div>';\n return;\n }\n for (var i = 0; i < FRAMES.length; i++) {\n var f = FRAMES[i];\n // Idle gap marker before this frame.\n if (i > 0) {\n var gap = f.ts - FRAMES[i - 1].ts;\n if (gap > idleThreshold) {\n var g = document.createElement(\"div\");\n g.className = \"tick idle-gap\";\n g.title = \"idle \" + gap + \"ms\";\n els.timeline.appendChild(g);\n }\n }\n var t = document.createElement(\"div\");\n t.className = \"tick\" + (f.duplicate_of != null ? \" dup\" : \"\");\n t.dataset.idx = String(i);\n t.setAttribute(\"role\", \"option\");\n t.title = \"frame \" + f.seq + \" · \" + (f.duration_since_prev_ms || 0) + \"ms · \" +\n (f.bytes_in_since_last || 0) + \"B\";\n (function (idx) {\n t.addEventListener(\"click\", function () { onTickClick(idx); });\n })(i);\n els.timeline.appendChild(t);\n ticks[i] = t;\n }\n }\n\n function onTickClick(idx) {\n if (diffMode) {\n if (diffA === -1 || (diffA !== -1 && diffB !== -1)) {\n diffA = idx; diffB = -1;\n } else {\n diffB = idx;\n }\n selected = idx;\n render();\n if (diffA !== -1 && diffB !== -1) renderDiff();\n } else {\n selected = idx;\n render();\n }\n }\n\n // ── Detail render ─────────────────────────────────────────────────────\n function render() {\n // Tick classes.\n for (var i = 0; i < ticks.length; i++) {\n var t = ticks[i];\n if (!t) continue;\n t.classList.toggle(\"selected\", i === selected && !diffMode);\n t.classList.toggle(\"diff-a\", i === diffA);\n t.classList.toggle(\"diff-b\", i === diffB);\n t.classList.toggle(\"hidden-row\", hiddenSet.has(i));\n }\n var f = FRAMES[selected];\n if (!f) return;\n\n // Preview image.\n var uri = imageForFrame(selected);\n if (uri) {\n els.previewImg.src = uri;\n els.previewImg.style.display = \"block\";\n } else {\n els.previewImg.removeAttribute(\"src\");\n els.previewImg.style.display = \"none\";\n }\n if (!diffMode || diffA === -1 || diffB === -1) {\n els.diffCanvas.style.display = \"none\";\n }\n\n // Bytes-in delta vs previous frame.\n var prevBytes = selected > 0 ? (FRAMES[selected - 1].bytes_in_since_last || 0) : 0;\n var delta = (f.bytes_in_since_last || 0) - prevBytes;\n\n // Frame info grid.\n var rows = [\n [\"seq\", f.seq],\n [\"timestamp\", f.iso || String(f.ts)],\n [\"hash\", f.hash],\n [\"duplicate of\", f.duplicate_of == null ? \"—\" : f.duplicate_of],\n [\"bytes in\", f.bytes_in_since_last || 0],\n [\"bytes Δ\", (delta >= 0 ? \"+\" : \"\") + delta],\n [\"since prev\", (f.duration_since_prev_ms || 0) + \"ms\"],\n [\"render\", (f.render_ms || 0) + \"ms\"],\n [\"buffer\", f.buffer ? (f.buffer.cols + \"×\" + f.buffer.rows) : \"—\"],\n [\"cursor\", f.buffer && f.buffer.cursor\n ? (\"r\" + f.buffer.cursor.row + \" c\" + f.buffer.cursor.col) : \"—\"],\n [\"png\", f.png || \"(deduped)\"],\n ];\n var html = \"\";\n for (var r = 0; r < rows.length; r++) {\n var deltaCls = rows[r][0] === \"bytes Δ\" && delta > 0 ? \" delta-pos\" : \"\";\n html += '<div class=\"k\">' + esc(rows[r][0]) + '</div>' +\n '<div class=\"v' + deltaCls + '\">' + esc(String(rows[r][1])) + '</div>';\n }\n els.frameInfo.innerHTML = html;\n\n // ANSI input preview.\n els.ansiPreview.textContent = f.ansi_input_preview && f.ansi_input_preview.length\n ? f.ansi_input_preview : \"(no input recorded for this frame)\";\n\n // Silvery state — render only when present.\n if (f.silvery !== undefined && f.silvery !== null) {\n els.silveryBlock.hidden = false;\n els.silveryState.textContent = typeof f.silvery === \"string\"\n ? f.silvery : JSON.stringify(f.silvery, null, 2);\n } else {\n els.silveryBlock.hidden = true;\n }\n }\n\n function esc(s) {\n return String(s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n }\n\n // ── Find: highlight ticks whose ansi preview matches ──────────────────\n function applyFind() {\n var q = els.findInput.value.toLowerCase();\n for (var i = 0; i < FRAMES.length; i++) {\n if (!ticks[i]) continue;\n var hit = q !== \"\" &&\n String(FRAMES[i].ansi_input_preview || \"\").toLowerCase().indexOf(q) !== -1;\n ticks[i].classList.toggle(\"match\", hit);\n }\n }\n\n // ── Filter: free-text predicate over row JSON ─────────────────────────\n // A frame is shown when the predicate substring appears in its JSON, OR\n // when the predicate is a \"key:value\" / \"key=value\" form that matches.\n function applyFilter() {\n var q = els.filterInput.value.trim().toLowerCase();\n hiddenSet.clear();\n if (q !== \"\") {\n for (var i = 0; i < FRAMES.length; i++) {\n var json = JSON.stringify(FRAMES[i]).toLowerCase();\n if (json.indexOf(q) === -1) hiddenSet.add(i);\n }\n // Keep selection valid.\n if (hiddenSet.has(selected)) {\n var next = FRAMES.findIndex(function (_, i) { return !hiddenSet.has(i); });\n if (next !== -1) selected = next;\n }\n }\n render();\n updateMeta();\n }\n\n // ── Diff: pixel-diff two frames onto the overlay canvas ───────────────\n function renderDiff() {\n var uriA = imageForFrame(diffA);\n var uriB = imageForFrame(diffB);\n if (!uriA || !uriB) {\n els.diffHint.textContent = \"diff needs two frames with images\";\n return;\n }\n var imgA = new Image();\n var imgB = new Image();\n var loaded = 0;\n function ready() {\n loaded++;\n if (loaded < 2) return;\n var w = Math.max(imgA.naturalWidth, imgB.naturalWidth);\n var h = Math.max(imgA.naturalHeight, imgB.naturalHeight);\n if (!w || !h) return;\n var ca = document.createElement(\"canvas\"); ca.width = w; ca.height = h;\n var cb = document.createElement(\"canvas\"); cb.width = w; cb.height = h;\n ca.getContext(\"2d\").drawImage(imgA, 0, 0);\n cb.getContext(\"2d\").drawImage(imgB, 0, 0);\n var da = ca.getContext(\"2d\").getImageData(0, 0, w, h);\n var db = cb.getContext(\"2d\").getImageData(0, 0, w, h);\n var out = els.diffCanvas;\n out.width = w; out.height = h;\n var octx = out.getContext(\"2d\");\n var overlay = octx.createImageData(w, h);\n var changed = 0;\n for (var p = 0; p < da.data.length; p += 4) {\n var dr = Math.abs(da.data[p] - db.data[p]);\n var dg = Math.abs(da.data[p + 1] - db.data[p + 1]);\n var dbl = Math.abs(da.data[p + 2] - db.data[p + 2]);\n if (dr + dg + dbl > 24) {\n overlay.data[p] = 255; overlay.data[p + 1] = 59;\n overlay.data[p + 2] = 78; overlay.data[p + 3] = 170;\n changed++;\n }\n }\n octx.putImageData(overlay, 0, 0);\n // Show frame B as the base, overlay on top.\n els.previewImg.src = uriB;\n els.diffCanvas.style.display = \"block\";\n els.diffHint.textContent = \"diff \" + FRAMES[diffA].seq + \" → \" + FRAMES[diffB].seq +\n \" · \" + changed + \" px changed\";\n }\n imgA.onload = ready; imgB.onload = ready;\n imgA.src = uriA; imgB.src = uriB;\n }\n\n function toggleDiff() {\n diffMode = !diffMode;\n els.diffToggle.classList.toggle(\"on\", diffMode);\n els.diffToggle.textContent = \"Diff mode: \" + (diffMode ? \"on\" : \"off\");\n if (!diffMode) {\n diffA = -1; diffB = -1;\n els.diffCanvas.style.display = \"none\";\n els.diffHint.textContent = \"\";\n } else {\n els.diffHint.textContent = \"click two frames to diff\";\n }\n render();\n }\n\n // ── Keyboard scrub ────────────────────────────────────────────────────\n function step(dir) {\n if (!FRAMES.length) return;\n var i = selected;\n for (var n = 0; n < FRAMES.length; n++) {\n i += dir;\n if (i < 0 || i >= FRAMES.length) return;\n if (!hiddenSet.has(i)) { selected = i; render(); return; }\n }\n }\n\n document.addEventListener(\"keydown\", function (e) {\n var tag = (e.target && e.target.tagName) || \"\";\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") {\n if (e.key === \"Escape\") e.target.blur();\n return;\n }\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\" || e.key === \"j\") {\n e.preventDefault(); step(1);\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" || e.key === \"k\") {\n e.preventDefault(); step(-1);\n } else if (e.key === \"Home\") {\n e.preventDefault(); selected = 0; render();\n } else if (e.key === \"End\") {\n e.preventDefault(); selected = FRAMES.length - 1; render();\n } else if (e.key === \"d\") {\n toggleDiff();\n }\n });\n\n // ── Meta line ─────────────────────────────────────────────────────────\n function updateMeta() {\n var visible = FRAMES.length - hiddenSet.size;\n var dur = FRAMES.length > 1\n ? (FRAMES[FRAMES.length - 1].ts - FRAMES[0].ts) : 0;\n var uniq = 0;\n for (var i = 0; i < FRAMES.length; i++) if (FRAMES[i].duplicate_of == null) uniq++;\n els.meta.textContent = FRAMES.length + \" frames (\" + uniq + \" unique) · \" +\n visible + \" shown · \" + dur + \"ms span · \" +\n Object.keys(IMAGES).length + \" images inlined\";\n }\n\n // ── Wire up ───────────────────────────────────────────────────────────\n els.findInput.addEventListener(\"input\", applyFind);\n els.filterInput.addEventListener(\"input\", applyFilter);\n els.diffToggle.addEventListener(\"click\", toggleDiff);\n\n buildTimeline();\n updateMeta();\n render();\n})();\n`\n","/**\n * The in-memory Recording model — termless's unified captured-session type.\n *\n * A **Recording** is a captured terminal session: a timeline carrying two\n * **source tracks** and one **projection**.\n *\n * - `commands` — a *source track* of timed high-level instructions (key\n * presses, `Type`, `Sleep`, `Resize`, `Set`, `Screenshot`). Replayable\n * *intent*.\n * - `io` — a *source track* of timed raw byte events, each direction-tagged\n * `\"in\" | \"out\"` (mirroring asciicast v2's `i`/`o`). The observed *truth*.\n * - `frames` — a *projection* (NOT a co-equal track): rendered visual states\n * plus capture metadata. A materialized view of `io × Renderer ×\n * snapshot-policy`, regenerable and revalidatable.\n *\n * Track authority — the invariant that makes `play` deterministic: when\n * multiple tracks exist, **`io` is the authoritative observation; `commands`\n * is the authoritative intent.** `play` defaults to `commands` (editable);\n * `reproduce` uses `io` (byte-exact).\n *\n * Timebase — every timestamp on every track is **integer microseconds** on a\n * single monotonic clock. Never a float. asciicast's float-second timestamps\n * are normalized to integer µs on import (see {@link secondsToMicros}).\n *\n * This is `recording/recording.ts` — THE canonical captured-session model.\n * The legacy fragmented artifacts (the old `recording.ts`, `asciicast/convert`)\n * were purged in Phase 6A; this `Recording` type owns the concept. The format\n * codecs live alongside it: `asciicast/recording-codec.ts` (the `.cast` codec),\n * `tape/compile.ts` (the `.tape` compiler), `native/native-rec.ts` (`.rec`).\n */\n\n// =============================================================================\n// Timebase — integer microseconds, single monotonic clock\n// =============================================================================\n\n/**\n * A timestamp on a Recording's monotonic clock.\n *\n * **Integer microseconds** relative to recording start. This is a branded\n * `number`: the brand exists only at the type level (it is erased at runtime)\n * and forces every timestamp to pass through {@link micros} or\n * {@link secondsToMicros} / {@link millisToMicros}, so a stray float can never\n * be assigned where the model expects µs.\n */\nexport type Micros = number & { readonly __brand: \"Micros\" }\n\n/**\n * Brand a raw integer as a {@link Micros} timestamp.\n *\n * Throws if the value is not a non-negative integer — the model never carries\n * a float timestamp, and this is the choke point that enforces it.\n */\nexport function micros(value: number): Micros {\n if (!Number.isInteger(value)) {\n throw new Error(`Recording timestamps must be integer microseconds, got: ${value}`)\n }\n if (value < 0) {\n throw new Error(`Recording timestamps must be non-negative, got: ${value}`)\n }\n return value as Micros\n}\n\n/**\n * Normalize an asciicast-style float-second timestamp to integer µs.\n *\n * asciicast v2 records `time` as a float in seconds; this is the import\n * normalizer that converts it to the Recording model's integer-µs timebase.\n * Rounds to the nearest microsecond — there is no float left afterwards.\n */\nexport function secondsToMicros(seconds: number): Micros {\n return micros(Math.round(seconds * 1_000_000))\n}\n\n/**\n * Normalize a millisecond timestamp (e.g. legacy `recording.ts` events,\n * `.tape` `Sleep` durations) to integer µs.\n */\nexport function millisToMicros(ms: number): Micros {\n return micros(Math.round(ms * 1_000))\n}\n\n// =============================================================================\n// Renderer fingerprint — what a frame projection was rendered against\n// =============================================================================\n\n/**\n * A fingerprint of the Renderer strategy + environment a frame was rendered\n * against. Stored on every {@link Frame} so the projection can be\n * *revalidated* (does it still match the current renderer?) and *regenerated*\n * (re-render `io` with the same fingerprint) — see the design doc §3.\n *\n * When the live renderer's fingerprint differs from a frame's, that frame is\n * marked stale but stays scrubbable.\n */\nexport interface RendererFingerprint {\n /** Backend id the frame was rendered with (e.g. `\"ghostty\"`, `\"vterm\"`). */\n backend: string\n /** Font family / face used by the rasterizer. */\n fontFamily: string\n /** Font size in points. */\n fontSize: number\n /** Cell size in device pixels — `{ width, height }`. */\n cellSize: { width: number; height: number }\n /** Device pixel ratio (DPI scaling) the frame was rasterized at. */\n dpr: number\n /** Theme identifier (name or content hash) the frame used. */\n theme: string\n}\n\n// =============================================================================\n// commands — the intent source track\n// =============================================================================\n\n/**\n * A single timed high-level instruction on the `commands` track.\n *\n * `commands` houses heterogeneity: terminal input (`type`, `key`, `ctrl`,\n * `alt`), player directives (`sleep`, `screenshot`), and environment changes\n * (`resize`, `set`). It is the *intent* track — replayable, editable, and the\n * default source for `play`. The unified shape later phases converge\n * `TapeCommand` onto.\n *\n * Discriminated on `kind`. `at` is the command's position on the recording's\n * monotonic µs clock.\n */\nexport type Command =\n | { kind: \"type\"; at: Micros; text: string; speedMicros?: Micros }\n | { kind: \"key\"; at: Micros; key: string; count?: number }\n | { kind: \"ctrl\"; at: Micros; key: string }\n | { kind: \"alt\"; at: Micros; key: string }\n | { kind: \"sleep\"; at: Micros; durationMicros: Micros }\n | { kind: \"resize\"; at: Micros; cols: number; rows: number }\n | { kind: \"set\"; at: Micros; key: string; value: string }\n | { kind: \"screenshot\"; at: Micros; path?: string }\n\n// =============================================================================\n// io — the observed-truth source track\n// =============================================================================\n\n/**\n * The direction of a raw byte event on the `io` track.\n *\n * - `\"in\"` — bytes sent *to* the terminal (user/program input).\n * - `\"out\"` — bytes received *from* the terminal (program output).\n *\n * Mirrors asciicast v2's `i` / `o` event discriminator. The `io` track is\n * direction-blind without this tag, so every event MUST carry it.\n */\nexport type IoDirection = \"in\" | \"out\"\n\n/**\n * A single timed raw byte event on the `io` track.\n *\n * `io` is the *observed truth*: re-feeding it to the parser reproduces the\n * session byte-exactly. `at` is on the recording's monotonic µs clock;\n * `direction` is mandatory.\n */\nexport interface IoEvent {\n /** Position on the recording's monotonic µs clock. */\n at: Micros\n /** Whether these bytes went in to, or came out of, the terminal. */\n direction: IoDirection\n /** The raw byte payload, decoded as a string (UTF-8). */\n data: string\n}\n\n// =============================================================================\n// frames — the derived projection\n// =============================================================================\n\n/**\n * A single rendered visual state on the `frames` projection.\n *\n * `frames` is a **projection**, not a co-equal source track: it is a\n * materialized view of `io × Renderer × snapshot-policy`. The *visual* part\n * regenerates from `io + Renderer`; the *capture metadata* (`signalDelta`,\n * `dirtyRegions`) is recorded, not derivable — which is why the projection\n * stays *in* the Recording rather than being computed on demand.\n *\n * Each frame carries a {@link RendererFingerprint} + a `contentHash` so it can\n * be revalidated and regenerated. This is the unified, canonical frame shape;\n * the on-disk frame-trace index row (`TraceFrame`) is a serialization detail.\n */\nexport interface Frame {\n /** 1-based sequence number within the projection. */\n seq: number\n /** Position on the recording's monotonic µs clock. */\n at: Micros\n /**\n * Content hash of the rendered buffer state (cells + cursor + modes).\n * Identical visual states share a hash — the basis for dedup.\n */\n contentHash: string\n /**\n * `seq` of the earlier frame this one is a visual duplicate of, or `null`\n * when this frame is itself unique.\n */\n duplicateOf: number | null\n /** The Renderer strategy + environment this frame was rendered against. */\n fingerprint: RendererFingerprint\n /** Buffer geometry + cursor at capture time. */\n buffer: {\n cols: number\n rows: number\n cursor: { row: number; col: number }\n }\n /** A short ANSI preview of the input that produced this frame. */\n ansiPreview: string\n /** Raw input byte count accumulated since the previous frame. */\n bytesInSinceLast: number\n /**\n * Reference to the rendered PNG for this frame — a path relative to the\n * recording bundle, or `null` for a frame with no rasterized image\n * (a visual duplicate, or a metadata-only capture).\n */\n png: string | null\n /**\n * Optional silvery render-state snapshot (signal delta + dirty regions).\n * This is the *capture metadata* that is recorded, not derivable. Kept\n * structural so the recording model stays dependency-free of silvery.\n */\n signal?: {\n dirtyRegions: { row: number; height: number }[]\n signalDelta: {\n nodesVisited: number\n nodesRendered: number\n nodesSkipped: number\n incremental: boolean\n }\n }\n}\n\n// =============================================================================\n// Recording — two source tracks + one projection\n// =============================================================================\n\n/**\n * Provenance about whether a Recording's frames projection can be regenerated.\n *\n * Some sessions (custom renderers, non-deterministic programs) cannot\n * regenerate `frames` from `io`. When `reproducible` is `false`, the `frames`\n * projection is the *only* record of the visual state — not a cache — and a\n * `validate()` pass must treat it as authoritative rather than derivable.\n * (Design doc §9 — spec the flag in Phase 1.)\n */\nexport interface RecordingProvenance {\n /**\n * `true` when the `frames` projection can be regenerated by re-rendering the\n * `io` track. `false` for sessions whose visual state is not reproducible —\n * then `frames` is the sole record. Defaults to `true`.\n */\n reproducible: boolean\n}\n\n/**\n * A captured terminal session — two source tracks and one projection on a\n * single monotonic µs timeline.\n *\n * A Recording is **valid with any non-empty subset of members**:\n *\n * - `commands` only — a hand-authored tape (intent, no observed output).\n * - `commands` + `io` — a live record.\n * - `commands` + `io` + `frames` — a *trace*.\n * - `io` only — a decoded `.cast`.\n *\n * Use {@link createRecording} to construct one (it validates the non-empty\n * invariant) and {@link trackAuthority} to ask which track is authoritative.\n */\nexport interface Recording {\n /** Recording model version. */\n version: 1\n /** Terminal dimensions at recording start. */\n cols: number\n /** Terminal dimensions at recording start. */\n rows: number\n /** Total duration in integer µs. */\n durationMicros: Micros\n /**\n * The `commands` source track — timed intent. `undefined` when the\n * recording carries no command track (e.g. a decoded `.cast`).\n */\n commands?: Command[]\n /**\n * The `io` source track — timed observed truth. `undefined` when the\n * recording carries no io track (e.g. a hand-authored `.tape`).\n */\n io?: IoEvent[]\n /**\n * The `frames` projection — derived visual states. `undefined` when the\n * recording has not been rendered into frames.\n */\n frames?: Frame[]\n /** Whether the frames projection is regenerable from the io track. */\n provenance: RecordingProvenance\n}\n\n/**\n * The track authority of a Recording — which track, if any, is the\n * authoritative answer for a given question.\n *\n * - `observation` — the authoritative *observed truth*: `\"io\"` when an io\n * track exists, else `null`.\n * - `intent` — the authoritative *intent*: `\"commands\"` when a commands track\n * exists, else `null`.\n *\n * `play` follows `intent`; `reproduce` follows `observation`.\n */\nexport interface TrackAuthority {\n observation: \"io\" | null\n intent: \"commands\" | null\n}\n\n// =============================================================================\n// Construction + accessors\n// =============================================================================\n\n/** Input to {@link createRecording} — at least one track member is required. */\nexport interface CreateRecordingInput {\n cols: number\n rows: number\n durationMicros: Micros\n commands?: Command[]\n io?: IoEvent[]\n frames?: Frame[]\n /** Provenance; defaults to `{ reproducible: true }`. */\n provenance?: RecordingProvenance\n}\n\n/**\n * Construct a {@link Recording}, enforcing the non-empty-subset invariant.\n *\n * Throws when none of `commands` / `io` / `frames` is present — a Recording\n * with no tracks is not a recording.\n */\nexport function createRecording(input: CreateRecordingInput): Recording {\n const hasCommands = input.commands !== undefined && input.commands.length > 0\n const hasIo = input.io !== undefined && input.io.length > 0\n const hasFrames = input.frames !== undefined && input.frames.length > 0\n if (!hasCommands && !hasIo && !hasFrames) {\n throw new Error(\"A Recording must carry at least one non-empty track (commands, io, or frames).\")\n }\n return {\n version: 1,\n cols: input.cols,\n rows: input.rows,\n durationMicros: input.durationMicros,\n ...(input.commands !== undefined ? { commands: input.commands } : {}),\n ...(input.io !== undefined ? { io: input.io } : {}),\n ...(input.frames !== undefined ? { frames: input.frames } : {}),\n provenance: input.provenance ?? { reproducible: true },\n }\n}\n\n/**\n * Report the {@link TrackAuthority} of a Recording.\n *\n * Encodes the track-authority rule: `io` is the authoritative observation,\n * `commands` is the authoritative intent. A track is authoritative only when\n * it is present and non-empty.\n */\nexport function trackAuthority(recording: Recording): TrackAuthority {\n const hasIo = recording.io !== undefined && recording.io.length > 0\n const hasCommands = recording.commands !== undefined && recording.commands.length > 0\n return {\n observation: hasIo ? \"io\" : null,\n intent: hasCommands ? \"commands\" : null,\n }\n}\n","/**\n * frame-trace → `Recording` adapter — projects a frame trace into the\n * in-memory {@link Recording} model's `frames` projection.\n *\n * Phase 2 of the Recording-domain unification (design doc §3, §6). The\n * frame-trace artifact ({@link \"./frame-trace.ts\"}) captures rendered visual\n * states; in the unified model those are the `frames` **projection** — a\n * materialized view of `io × Renderer × snapshot-policy`, not a co-equal\n * source track.\n *\n * This module is a **pure projection** — it touches no disk. The frame\n * tracer's `index.jsonl` + `NNNNN.png` writing is byte-untouched; this\n * adapter only re-shapes the tracer's *in-memory* `Frame[]` into the model.\n *\n * Timebase — the on-disk frame-trace `Frame.ts` is a **wall-clock ms epoch**.\n * The Recording model's clock is **integer µs relative to recording start**.\n * The adapter rebases: `at = (frame.ts − firstTs) × 1000`.\n *\n * Renderer fingerprint — the on-disk frame trace does not record a renderer\n * fingerprint per frame (the layout is frozen). The adapter synthesizes one\n * {@link RendererFingerprint} for the whole trace from the\n * {@link FrameTraceOptions.canvas} options the tracer was created with, and\n * stamps every projected frame with it.\n */\n\nimport {\n type Frame as ModelFrame,\n type Micros,\n type Recording,\n type RendererFingerprint,\n createRecording,\n micros,\n} from \"./recording.ts\"\nimport type { TraceFrame } from \"./frame-trace.ts\"\nimport type { ScreenshotOptions } from \"../terminal/types.ts\"\n\n/** Canvas options the frame tracer was created with — the fingerprint source. */\nexport type TraceCanvasOptions = Pick<ScreenshotOptions, \"cols\" | \"rows\" | \"fontSize\" | \"fontPath\" | \"theme\" | \"dpr\">\n\n/** Input for {@link traceToRecording}. */\nexport interface TraceToRecordingInput {\n /** The in-memory frame-trace frames (e.g. `tracer.framesSinceSeq(0)`). */\n frames: TraceFrame[]\n /** Terminal columns at trace start. */\n cols: number\n /** Terminal rows at trace start. */\n rows: number\n /** Backend id the frames were rendered with (e.g. `\"ghostty\"`). */\n backend: string\n /** Canvas render options the tracer used — source of the fingerprint. */\n canvas?: TraceCanvasOptions\n /**\n * Whether the `frames` projection can be regenerated from an `io` track.\n * A bare frame trace has no `io` track recorded, so the visual state is the\n * sole record — pass `false` for a frame-trace-only recording (default).\n */\n reproducible?: boolean\n}\n\n/** Default fingerprint values when the tracer carried no explicit canvas opts. */\nconst FINGERPRINT_DEFAULTS = {\n fontFamily: \"JetBrains Mono\",\n fontSize: 14,\n cellWidth: 8,\n cellHeight: 16,\n dpr: 2,\n theme: \"default\",\n}\n\n/**\n * Synthesize a {@link RendererFingerprint} for a whole trace from the canvas\n * options the tracer ran with. The on-disk frame-trace layout has no\n * per-frame fingerprint slot (it is frozen) — the unified model wants one, so\n * we derive a single trace-wide fingerprint and stamp it on every frame.\n */\nexport function fingerprintFromCanvas(backend: string, canvas?: TraceCanvasOptions): RendererFingerprint {\n const fontSize = canvas?.fontSize ?? FINGERPRINT_DEFAULTS.fontSize\n const dpr = canvas?.dpr ?? FINGERPRINT_DEFAULTS.dpr\n // Cell size is not in ScreenshotOptions; derive a nominal cell box from the\n // font size (canvas renderers use ~0.6 advance width, ~1.2 line height).\n return {\n backend,\n fontFamily: FINGERPRINT_DEFAULTS.fontFamily,\n fontSize,\n cellSize: {\n width: Math.round(fontSize * 0.6 * dpr),\n height: Math.round(fontSize * 1.2 * dpr),\n },\n dpr,\n theme:\n typeof canvas?.theme === \"string\"\n ? canvas.theme\n : canvas?.theme !== undefined\n ? \"custom\"\n : FINGERPRINT_DEFAULTS.theme,\n }\n}\n\n/** Project one on-disk-shaped {@link TraceFrame} into a model {@link ModelFrame}. */\nfunction projectFrame(frame: TraceFrame, firstTs: number, fingerprint: RendererFingerprint): ModelFrame {\n const at: Micros = micros(Math.max(0, Math.round((frame.ts - firstTs) * 1000)))\n const model: ModelFrame = {\n seq: frame.seq,\n at,\n contentHash: frame.hash,\n duplicateOf: frame.duplicate_of,\n fingerprint,\n buffer: {\n cols: frame.buffer.cols,\n rows: frame.buffer.rows,\n cursor: { row: frame.buffer.cursor.row, col: frame.buffer.cursor.col },\n },\n ansiPreview: frame.ansi_input_preview,\n bytesInSinceLast: frame.bytes_in_since_last,\n png: frame.png,\n }\n // Carry the silvery render-state snapshot when the on-disk frame had one.\n // It is structurally the model's `signal` shape; copy only the two fields\n // the model declares so an arbitrary legacy payload can't leak in.\n const silvery = frame.silvery\n if (\n silvery !== undefined &&\n silvery !== null &&\n typeof silvery === \"object\" &&\n \"dirtyRegions\" in silvery &&\n \"signalDelta\" in silvery\n ) {\n const s = silvery as {\n dirtyRegions: { row: number; height: number }[]\n signalDelta: {\n nodesVisited: number\n nodesRendered: number\n nodesSkipped: number\n incremental: boolean\n }\n }\n model.signal = { dirtyRegions: s.dirtyRegions, signalDelta: s.signalDelta }\n }\n return model\n}\n\n/**\n * Build a {@link Recording} whose `frames` projection is populated from a\n * frame trace.\n *\n * The result carries only the `frames` projection — a bare frame trace has no\n * `commands` or `io` source track. `provenance.reproducible` defaults to\n * `false`: with no `io` track recorded, the visual state is the sole record.\n *\n * @throws {Error} when `frames` is empty — {@link createRecording} rejects an\n * all-empty recording.\n */\nexport function traceToRecording(input: TraceToRecordingInput): Recording {\n const { frames, cols, rows, backend, canvas } = input\n if (frames.length === 0) {\n throw new Error(\"traceToRecording: frame trace is empty — no frames projection to build\")\n }\n const fingerprint = fingerprintFromCanvas(backend, canvas)\n const firstTs = frames[0]!.ts\n const projected = frames.map((f) => projectFrame(f, firstTs, fingerprint))\n const lastTs = frames[frames.length - 1]!.ts\n const durationMicros = micros(Math.max(0, Math.round((lastTs - firstTs) * 1000)))\n return createRecording({\n cols,\n rows,\n durationMicros,\n frames: projected,\n provenance: { reproducible: input.reproducible ?? false },\n })\n}\n","/**\n * Minimal, dependency-free ZIP container — `pack` / `unpack` for the `.rec`\n * native recording format (see {@link \"./native-rec.ts\"}).\n *\n * A `.rec` recording is a **single-file container** by default. `pack` zips that\n * directory into a single-file portable archive (like `.docx` / `.epub`);\n * `unpack` expands it back. The archive is a standard ZIP — readable by any\n * ZIP tool — but termless writes and reads it itself so the native format has\n * **zero runtime dependencies**.\n *\n * Implementation notes:\n *\n * - Entries are stored with DEFLATE compression (method 8) via Node's\n * `node:zlib` `deflateRawSync` — already a termless-supported dependency\n * (every runtime termless targets ships `node:zlib`).\n * - 32-bit fields only — no ZIP64. A recording bundle is well under 4 GiB\n * (PNGs are small; `.jsonl` tracks are text). The directory layout is the\n * answer for genuinely huge traces; the archive is the portable convenience.\n * - CRC-32 is computed per entry (ZIP mandates it). A small precomputed table\n * keeps it fast and dependency-free.\n *\n * This is intentionally a *codec*, not a general archiver: it round-trips a\n * `name → bytes` map, which is exactly what the `.rec` directory is.\n */\n\nimport { deflateRawSync, inflateRawSync } from \"node:zlib\"\n\n// =============================================================================\n// CRC-32 — ZIP mandates a per-entry checksum.\n// =============================================================================\n\n/** Precomputed CRC-32 table (IEEE 802.3 polynomial, reflected). */\nconst CRC_TABLE: Uint32Array = (() => {\n const table = new Uint32Array(256)\n for (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n }\n table[n] = c >>> 0\n }\n return table\n})()\n\n/** Compute the CRC-32 of a byte buffer. */\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff\n for (let i = 0; i < bytes.length; i++) {\n crc = CRC_TABLE[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8)\n }\n return (crc ^ 0xffffffff) >>> 0\n}\n\n// =============================================================================\n// Archive entry\n// =============================================================================\n\n/** One file inside a ZIP archive — a path (forward-slash separated) + bytes. */\nexport interface ZipEntry {\n /** Path within the archive, forward-slash separated (e.g. `frames/00001.png`). */\n path: string\n /** The file's raw bytes. */\n bytes: Uint8Array\n}\n\n// =============================================================================\n// Writing\n// =============================================================================\n\n/** A DOS date/time pair encoded for a ZIP entry — fixed epoch for reproducibility. */\nconst DOS_DATE = 0x0021 // 1980-01-01\nconst DOS_TIME = 0x0000 // 00:00:00\n\n/**\n * Build a ZIP archive from a set of entries.\n *\n * Entries are written in the order given. The archive uses DEFLATE for every\n * entry, a fixed 1980-01-01 timestamp (so the same content produces the same\n * bytes — reproducible archives), and only 32-bit fields.\n *\n * @param entries The files to archive.\n * @returns The complete ZIP archive bytes.\n */\nexport function buildZip(entries: ZipEntry[]): Uint8Array {\n const encoder = new TextEncoder()\n const localChunks: Uint8Array[] = []\n const centralChunks: Uint8Array[] = []\n let offset = 0\n\n for (const entry of entries) {\n const nameBytes = encoder.encode(entry.path)\n const crc = crc32(entry.bytes)\n const compressed = deflateRawSync(entry.bytes)\n\n // Local file header (30 bytes + name).\n const local = new Uint8Array(30 + nameBytes.length)\n const lv = new DataView(local.buffer)\n lv.setUint32(0, 0x04034b50, true) // signature\n lv.setUint16(4, 20, true) // version needed\n lv.setUint16(6, 0, true) // flags\n lv.setUint16(8, 8, true) // method: deflate\n lv.setUint16(10, DOS_TIME, true)\n lv.setUint16(12, DOS_DATE, true)\n lv.setUint32(14, crc, true)\n lv.setUint32(18, compressed.length, true)\n lv.setUint32(22, entry.bytes.length, true)\n lv.setUint16(26, nameBytes.length, true)\n lv.setUint16(28, 0, true) // extra length\n local.set(nameBytes, 30)\n localChunks.push(local, compressed)\n\n // Central directory header (46 bytes + name).\n const central = new Uint8Array(46 + nameBytes.length)\n const cv = new DataView(central.buffer)\n cv.setUint32(0, 0x02014b50, true) // signature\n cv.setUint16(4, 20, true) // version made by\n cv.setUint16(6, 20, true) // version needed\n cv.setUint16(8, 0, true) // flags\n cv.setUint16(10, 8, true) // method: deflate\n cv.setUint16(12, DOS_TIME, true)\n cv.setUint16(14, DOS_DATE, true)\n cv.setUint32(16, crc, true)\n cv.setUint32(20, compressed.length, true)\n cv.setUint32(24, entry.bytes.length, true)\n cv.setUint16(28, nameBytes.length, true)\n cv.setUint16(30, 0, true) // extra length\n cv.setUint16(32, 0, true) // comment length\n cv.setUint16(34, 0, true) // disk number\n cv.setUint16(36, 0, true) // internal attrs\n cv.setUint32(38, 0, true) // external attrs\n cv.setUint32(42, offset, true) // local header offset\n central.set(nameBytes, 46)\n centralChunks.push(central)\n\n offset += local.length + compressed.length\n }\n\n const centralStart = offset\n let centralSize = 0\n for (const c of centralChunks) centralSize += c.length\n\n // End-of-central-directory record (22 bytes, no comment).\n const eocd = new Uint8Array(22)\n const ev = new DataView(eocd.buffer)\n ev.setUint32(0, 0x06054b50, true) // signature\n ev.setUint16(4, 0, true) // disk number\n ev.setUint16(6, 0, true) // central dir start disk\n ev.setUint16(8, entries.length, true) // entries on this disk\n ev.setUint16(10, entries.length, true) // total entries\n ev.setUint32(12, centralSize, true)\n ev.setUint32(16, centralStart, true)\n ev.setUint16(20, 0, true) // comment length\n\n return concat([...localChunks, ...centralChunks, eocd])\n}\n\n/** Concatenate byte buffers into one. */\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n let total = 0\n for (const c of chunks) total += c.length\n const out = new Uint8Array(total)\n let at = 0\n for (const c of chunks) {\n out.set(c, at)\n at += c.length\n }\n return out\n}\n\n// =============================================================================\n// Reading\n// =============================================================================\n\n/**\n * Parse a ZIP archive into its entries.\n *\n * Reads via the end-of-central-directory record + central directory — the\n * canonical ZIP read path — so the entry order and metadata match what\n * {@link buildZip} wrote. Only the stored (0) and DEFLATE (8) methods are\n * supported; an unknown method throws.\n *\n * @param archive The ZIP archive bytes.\n * @returns The archived entries, in central-directory order.\n * @throws {Error} when the archive has no EOCD record or uses an unsupported\n * compression method.\n */\nexport function parseZip(archive: Uint8Array): ZipEntry[] {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength)\n const decoder = new TextDecoder()\n\n // Find the end-of-central-directory record by scanning backwards for its\n // signature (it is within the last 22 + 65535 bytes; no comment here).\n let eocd = -1\n for (let i = archive.length - 22; i >= 0; i--) {\n if (view.getUint32(i, true) === 0x06054b50) {\n eocd = i\n break\n }\n }\n if (eocd < 0) {\n throw new Error(\"parseZip: not a ZIP archive (no end-of-central-directory record)\")\n }\n\n const totalEntries = view.getUint16(eocd + 10, true)\n let pointer = view.getUint32(eocd + 16, true)\n const entries: ZipEntry[] = []\n\n for (let n = 0; n < totalEntries; n++) {\n if (view.getUint32(pointer, true) !== 0x02014b50) {\n throw new Error(\"parseZip: malformed central directory\")\n }\n const method = view.getUint16(pointer + 10, true)\n const compressedSize = view.getUint32(pointer + 20, true)\n const uncompressedSize = view.getUint32(pointer + 24, true)\n const nameLength = view.getUint16(pointer + 28, true)\n const extraLength = view.getUint16(pointer + 30, true)\n const commentLength = view.getUint16(pointer + 32, true)\n const localOffset = view.getUint32(pointer + 42, true)\n const name = decoder.decode(archive.subarray(pointer + 46, pointer + 46 + nameLength))\n\n // Resolve the data from the local header at `localOffset`.\n const localNameLength = view.getUint16(localOffset + 26, true)\n const localExtraLength = view.getUint16(localOffset + 28, true)\n const dataStart = localOffset + 30 + localNameLength + localExtraLength\n const dataEnd = dataStart + compressedSize\n const raw = archive.subarray(dataStart, dataEnd)\n\n let bytes: Uint8Array\n if (method === 0) {\n bytes = raw.slice()\n } else if (method === 8) {\n bytes = new Uint8Array(inflateRawSync(raw))\n } else {\n throw new Error(`parseZip: unsupported compression method ${method} for entry \"${name}\"`)\n }\n if (bytes.length !== uncompressedSize) {\n throw new Error(`parseZip: size mismatch for entry \"${name}\"`)\n }\n\n entries.push({ path: name, bytes })\n pointer += 46 + nameLength + extraLength + commentLength\n }\n\n return entries\n}\n","/**\n * The native `.rec` recording format — termless's canonical full-fidelity\n * on-disk form for a {@link Recording}.\n *\n * Phase 5 of the Recording-domain unification (design doc §4, §6). `.rec`\n * supersedes the ad-hoc `recording.ts` JSON and the bare frame-trace directory\n * with **one canonical format** that carries all three Recording members\n * losslessly.\n *\n * ## Shape — a single-file container\n *\n * A `.rec` is a **single file**: a standard ZIP container (like `.docx` /\n * `.epub`) that holds the whole Recording — manifest, source tracks, and the\n * frames projection — as archive entries:\n *\n * ```\n * mysession.rec ← one file, a ZIP container holding:\n * manifest.json — metadata, Renderer fingerprint, track\n * index, format version\n * commands.jsonl — the commands source track (omitted if absent)\n * io.jsonl — the io source track (omitted if absent)\n * frames/index.jsonl + NNNNN.png — the frames projection (omitted if absent)\n * ```\n *\n * The unpacked layout (a directory with the same entries) is an internal\n * working form — {@link packRecording} / {@link unpackRecording} convert\n * between the file and the directory; {@link writeRecording} /\n * {@link readRecording} are the user-facing single-file API.\n *\n * ## Superset of the frame-trace layout\n *\n * The `frames/` subtree is **byte-identical to the frame-trace directory\n * layout** ({@link \"../frame-trace.ts\"}'s `index.jsonl` + `NNNNN.png`). An\n * existing km golden trace directory IS a valid `.rec` `frames/` subtree —\n * {@link readRecording} loads a bare legacy frame-trace directory (no\n * `manifest.json`, just `index.jsonl` + PNGs) as a frames-only Recording.\n * That superset relationship is what keeps every km golden valid across the\n * format change.\n */\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from \"node:fs\"\nimport { basename, join } from \"node:path\"\nimport type { TraceFrame } from \"../frame-trace.ts\"\nimport { traceToRecording } from \"../frame-trace-recording.ts\"\nimport {\n type Command,\n type IoEvent,\n type Recording,\n type RendererFingerprint,\n createRecording,\n micros,\n} from \"../recording.ts\"\nimport { buildZip, parseZip, type ZipEntry } from \"./zip-archive.ts\"\n\n/** The `.rec` format version written into every `manifest.json`. */\nexport const REC_FORMAT_VERSION = 1\n\n/** File name of the manifest within a `.rec` container. */\nconst MANIFEST_FILE = \"manifest.json\"\n/** File name of the commands track within a `.rec` container. */\nconst COMMANDS_FILE = \"commands.jsonl\"\n/** File name of the io track within a `.rec` container. */\nconst IO_FILE = \"io.jsonl\"\n/** Sub-directory holding the frames projection within a `.rec` container. */\nconst FRAMES_DIR = \"frames\"\n/** Index file within the `frames/` sub-directory. */\nconst FRAMES_INDEX = \"index.jsonl\"\n\n// =============================================================================\n// manifest.json\n// =============================================================================\n\n/**\n * The `manifest.json` of a `.rec` container — metadata about the recording\n * plus an index of which track files are present.\n *\n * The manifest is the marker that distinguishes a full `.rec` from a bare\n * legacy frame-trace directory: when it is absent, {@link readRecording}\n * falls back to the frames-only legacy path.\n */\nexport interface RecManifest {\n /** The `.rec` format version — {@link REC_FORMAT_VERSION}. */\n recVersion: number\n /** Recording-model version (currently always `1`). */\n recordingVersion: 1\n /** Terminal columns at recording start. */\n cols: number\n /** Terminal rows at recording start. */\n rows: number\n /** Total recording duration in integer microseconds. */\n durationMicros: number\n /** Whether the frames projection is regenerable from the io track. */\n reproducible: boolean\n /**\n * Which track files are present in the container. A reader uses this index\n * to know what to load without probing for every track.\n */\n tracks: {\n /** `true` when `commands.jsonl` is present. */\n commands: boolean\n /** `true` when `io.jsonl` is present. */\n io: boolean\n /** `true` when `frames/index.jsonl` is present. */\n frames: boolean\n }\n /**\n * The Renderer fingerprint the frames projection was rendered against, when\n * the recording carries a frames projection. Absent for a frames-less\n * recording. Lifted from the first frame — the frame-trace layout stamps one\n * trace-wide fingerprint.\n */\n fingerprint?: RendererFingerprint\n}\n\n// =============================================================================\n// Options\n// =============================================================================\n\n/** Options for {@link writeRecording}. */\nexport interface WriteRecordingOptions {\n /**\n * Directory the frames projection's PNGs are copied *from*. Each frame's\n * `png` field is a relative filename resolved against this directory; the\n * resolved PNG is packed into the `.rec` container's `frames/` sub-tree\n * under the same name. Omit when the recording carries no PNGs (every\n * frame's `png` is `null`) or when the PNGs are not available on disk.\n */\n pngSourceDir?: string\n}\n\n/** Options for {@link readRecording}. */\nexport interface ReadRecordingOptions {\n /**\n * Backend id stamped onto the synthesized renderer fingerprint when reading\n * a *bare legacy frame-trace directory* (one with no `manifest.json`). The\n * legacy layout records no backend. Ignored for a full `.rec` container,\n * which carries the fingerprint in its manifest. Default: `\"unknown\"`.\n */\n backend?: string\n}\n\n// =============================================================================\n// JSONL helpers\n// =============================================================================\n\n/** Serialize an array of records as JSONL — one JSON object per line. */\nfunction toJsonl(records: readonly unknown[]): string {\n if (records.length === 0) return \"\"\n return records.map((r) => JSON.stringify(r)).join(\"\\n\") + \"\\n\"\n}\n\n/**\n * Parse JSONL into an array. Tolerant: blank lines and a malformed final line\n * (a truncated, interrupted write) are skipped — mirroring the append-only,\n * truncation-tolerant design of the frame tracer.\n */\nfunction parseJsonl<T>(text: string): T[] {\n const out: T[] = []\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim()\n if (trimmed.length === 0) continue\n try {\n out.push(JSON.parse(trimmed) as T)\n } catch {\n // Tolerant: skip a malformed (e.g. truncated) line.\n }\n }\n return out\n}\n\n// =============================================================================\n// Frames projection ⇄ frame-trace `index.jsonl`\n// =============================================================================\n//\n// The `.rec` `frames/` sub-tree is byte-compatible with the frame-trace\n// directory layout: `index.jsonl` rows are the on-disk `TraceFrame` shape, not\n// the in-memory model `Frame` shape. Writing converts model frames to\n// `TraceFrame` rows; reading projects `TraceFrame` rows back via the shared\n// `traceToRecording` adapter — the exact same path `loadVisualTrace` uses.\n\n/**\n * Convert a model {@link Recording}'s frames projection back to the on-disk\n * `TraceFrame[]` shape so it can be written into `frames/index.jsonl`.\n *\n * The model dropped the frame-trace-only fields (`iso`, `render_ms`); they are\n * reconstructed deterministically. `ts` is rebuilt from the model's integer-µs\n * `at` (`ts = at / 1000`) so that re-projecting the written frames through\n * {@link traceToRecording} yields a frames projection equal to the original —\n * `traceToRecording` rebases `at = (ts − firstTs) × 1000`, and `firstTs` is 0.\n */\nfunction recordingFramesToTraceFrames(recording: Recording): TraceFrame[] {\n const frames = recording.frames ?? []\n const result: TraceFrame[] = []\n let prevTs: number | null = null\n for (const f of frames) {\n // `at` is integer µs from recording start; the frame-trace `ts` is a\n // ms epoch. With epoch 0 the round-trip is exact: at → ts → at.\n const ts = Math.round(f.at / 1000)\n const trace: TraceFrame = {\n seq: f.seq,\n ts,\n iso: new Date(ts).toISOString(),\n hash: f.contentHash,\n duplicate_of: f.duplicateOf,\n bytes_in_since_last: f.bytesInSinceLast,\n ansi_input_preview: f.ansiPreview,\n buffer: {\n cols: f.buffer.cols,\n rows: f.buffer.rows,\n cursor: { row: f.buffer.cursor.row, col: f.buffer.cursor.col },\n },\n duration_since_prev_ms: prevTs === null ? 0 : ts - prevTs,\n render_ms: 0,\n png: f.png,\n }\n if (f.signal !== undefined) trace.silvery = { type: \"RENDER_DISPATCHED\", ...f.signal }\n result.push(trace)\n prevTs = ts\n }\n return result\n}\n\n// =============================================================================\n// In-memory bundle — the `name → bytes` map a `.rec` container holds\n// =============================================================================\n\n/**\n * Serialize a {@link Recording} into the set of files a `.rec` container\n * holds: a `name → bytes` map. This is the shared core of {@link writeRecording}\n * (zips the map into one file) and {@link packRecording} (zips a directory).\n *\n * `pngSourceDir` resolves each frame's `png` filename to bytes; a missing PNG\n * is skipped (the index still records the frame) — mirroring the frame\n * tracer's render-failure tolerance.\n */\nfunction serializeRecording(recording: Recording, pngSourceDir?: string): Map<string, Uint8Array> {\n const encoder = new TextEncoder()\n const files = new Map<string, Uint8Array>()\n\n const traceFrames = recording.frames !== undefined ? recordingFramesToTraceFrames(recording) : []\n const fingerprint = recording.frames?.[0]?.fingerprint\n\n const manifest: RecManifest = {\n recVersion: REC_FORMAT_VERSION,\n recordingVersion: recording.version,\n cols: recording.cols,\n rows: recording.rows,\n durationMicros: recording.durationMicros,\n reproducible: recording.provenance.reproducible,\n tracks: {\n commands: recording.commands !== undefined,\n io: recording.io !== undefined,\n frames: recording.frames !== undefined,\n },\n ...(fingerprint !== undefined ? { fingerprint } : {}),\n }\n files.set(MANIFEST_FILE, encoder.encode(JSON.stringify(manifest, null, 2) + \"\\n\"))\n\n if (recording.commands !== undefined) {\n files.set(COMMANDS_FILE, encoder.encode(toJsonl(recording.commands)))\n }\n if (recording.io !== undefined) {\n files.set(IO_FILE, encoder.encode(toJsonl(recording.io)))\n }\n if (recording.frames !== undefined) {\n files.set(`${FRAMES_DIR}/${FRAMES_INDEX}`, encoder.encode(toJsonl(traceFrames)))\n if (pngSourceDir !== undefined) {\n for (const frame of traceFrames) {\n if (frame.png === null) continue\n const src = join(pngSourceDir, frame.png)\n if (!existsSync(src)) continue\n files.set(`${FRAMES_DIR}/${frame.png}`, new Uint8Array(readFileSync(src)))\n }\n }\n }\n\n return files\n}\n\n/**\n * Reconstruct a {@link Recording} from a `.rec` `name → bytes` file map.\n *\n * The manifest is authoritative for `cols` / `rows` / `durationMicros` /\n * `provenance`. The frames projection is rebuilt by projecting the\n * `frames/index.jsonl` `TraceFrame` rows through {@link traceToRecording} — the\n * shared adapter — so a `.rec` and a bare frame-trace directory take the same\n * projection path. PNG bytes are NOT loaded into the Recording; each frame's\n * `png` field stays a relative filename.\n */\nfunction deserializeRecording(files: Map<string, Uint8Array>, backend: string): Recording {\n const decoder = new TextDecoder()\n const manifestRaw = files.get(MANIFEST_FILE)\n if (manifestRaw === undefined) {\n throw new Error(\"readRecording: .rec container has no manifest.json\")\n }\n const manifest = JSON.parse(decoder.decode(manifestRaw)) as RecManifest\n\n const commandsRaw = files.get(COMMANDS_FILE)\n const ioRaw = files.get(IO_FILE)\n const framesRaw = files.get(`${FRAMES_DIR}/${FRAMES_INDEX}`)\n\n const commands = commandsRaw !== undefined ? parseJsonl<Command>(decoder.decode(commandsRaw)) : undefined\n const io = ioRaw !== undefined ? parseJsonl<IoEvent>(decoder.decode(ioRaw)) : undefined\n\n // The frames projection: project the on-disk TraceFrame rows through the\n // shared adapter, then adopt that projection's frames.\n let frames: Recording[\"frames\"]\n if (framesRaw !== undefined) {\n const traceFrames = parseJsonl<TraceFrame>(decoder.decode(framesRaw))\n if (traceFrames.length > 0) {\n const projected = traceToRecording({\n frames: traceFrames,\n cols: manifest.cols,\n rows: manifest.rows,\n backend: manifest.fingerprint?.backend ?? backend,\n reproducible: manifest.reproducible,\n })\n frames = projected.frames\n }\n }\n\n return createRecording({\n cols: manifest.cols,\n rows: manifest.rows,\n durationMicros: micros(manifest.durationMicros),\n ...(commands !== undefined ? { commands } : {}),\n ...(io !== undefined ? { io } : {}),\n ...(frames !== undefined ? { frames } : {}),\n provenance: { reproducible: manifest.reproducible },\n })\n}\n\n// =============================================================================\n// Directory helpers — collect / write a `.rec` directory working form\n// =============================================================================\n\n/** Recursively list every file path under `root` (directories excluded). */\nfunction walk(root: string): string[] {\n const out: string[] = []\n for (const name of readdirSync(root)) {\n const path = join(root, name)\n if (statSync(path).isDirectory()) {\n out.push(...walk(path))\n } else {\n out.push(path)\n }\n }\n return out\n}\n\n/** Path of `file` relative to `root`, forward-slash separated (ZIP convention). */\nfunction relativeSlash(root: string, file: string): string {\n const rel = file.slice(root.length).replace(/^[/\\\\]+/, \"\")\n return rel.split(/[/\\\\]/).join(\"/\")\n}\n\n/**\n * Collect a `.rec` *directory* bundle (manifest + tracks + frames) into a\n * `name → bytes` map — the inverse of writing the map to a directory.\n */\nfunction collectBundleDir(dir: string): Map<string, Uint8Array> {\n const files = new Map<string, Uint8Array>()\n files.set(MANIFEST_FILE, new Uint8Array(readFileSync(join(dir, MANIFEST_FILE))))\n for (const name of [COMMANDS_FILE, IO_FILE]) {\n const path = join(dir, name)\n if (existsSync(path)) files.set(name, new Uint8Array(readFileSync(path)))\n }\n const framesDir = join(dir, FRAMES_DIR)\n if (existsSync(framesDir) && statSync(framesDir).isDirectory()) {\n for (const name of readdirSync(framesDir)) {\n files.set(`${FRAMES_DIR}/${name}`, new Uint8Array(readFileSync(join(framesDir, name))))\n }\n }\n return files\n}\n\n/** Write a `name → bytes` bundle map out as a directory tree at `dir`. */\nfunction writeBundleDir(dir: string, files: Map<string, Uint8Array>): void {\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true })\n }\n mkdirSync(dir, { recursive: true })\n for (const [name, bytes] of files) {\n const dest = join(dir, name)\n mkdirSync(join(dest, \"..\"), { recursive: true })\n writeFileSync(dest, bytes)\n }\n}\n\n/** Zip a `name → bytes` bundle map into ZIP-container bytes (stable order). */\nfunction bundleToZip(files: Map<string, Uint8Array>): Uint8Array {\n const entries: ZipEntry[] = [...files.entries()].map(([path, bytes]) => ({ path, bytes }))\n entries.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0))\n return buildZip(entries)\n}\n\n// =============================================================================\n// File I/O — writeRecording / readRecording (the `.rec` single-file API)\n// =============================================================================\n\n/**\n * Write a {@link Recording} to a single `.rec` file at `path`.\n *\n * The `.rec` is a ZIP container holding `manifest.json`, the present source\n * tracks (`commands.jsonl` / `io.jsonl`), and the frames projection\n * (`frames/index.jsonl` + the unique-frame PNGs copied from\n * {@link WriteRecordingOptions.pngSourceDir}). The container's internal\n * `frames/` sub-tree is byte-compatible with the legacy frame-trace layout.\n *\n * @param path Destination `.rec` file. Created or overwritten. Parent\n * directories are created if missing.\n * @param recording The recording to serialize.\n * @param options See {@link WriteRecordingOptions}.\n */\nexport function writeRecording(path: string, recording: Recording, options: WriteRecordingOptions = {}): void {\n const files = serializeRecording(recording, options.pngSourceDir)\n mkdirSync(join(path, \"..\"), { recursive: true })\n writeFileSync(path, bundleToZip(files))\n}\n\n/**\n * Read a `.rec` recording into a {@link Recording}.\n *\n * Accepts **three** forms:\n *\n * - A single `.rec` **file** — the canonical container; the ZIP is parsed and\n * every track loaded.\n * - A `.rec` **directory** bundle — the internal unpacked working form (has a\n * `manifest.json`); all present tracks are loaded.\n * - A **bare legacy frame-trace directory** — no `manifest.json`, just\n * `index.jsonl` + `NNNNN.png` (the layout km goldens use). Loaded as a\n * frames-only Recording. This is the superset-compatibility guarantee:\n * every existing km golden trace loads through `readRecording` unchanged.\n *\n * PNG bytes are NOT loaded into the Recording; each frame's `png` field stays a\n * relative filename, resolved by a consumer.\n *\n * @param path Path to a `.rec` file, a `.rec` directory, or a frame-trace\n * directory.\n * @param options See {@link ReadRecordingOptions}.\n * @returns The reconstructed {@link Recording}.\n * @throws {Error} when `path` is none of the accepted forms.\n */\nexport function readRecording(path: string, options: ReadRecordingOptions = {}): Recording {\n const backend = options.backend ?? \"unknown\"\n\n if (!existsSync(path)) {\n throw new Error(`readRecording: ${path} does not exist`)\n }\n\n // ── Single-file `.rec` container ──\n if (statSync(path).isFile()) {\n const entries = parseZip(new Uint8Array(readFileSync(path)))\n const files = new Map<string, Uint8Array>()\n for (const entry of entries) files.set(entry.path, entry.bytes)\n return deserializeRecording(files, backend)\n }\n\n // ── Directory form: `.rec` bundle, or a bare legacy frame-trace directory ──\n const dir = path\n const manifestPath = join(dir, MANIFEST_FILE)\n\n // Bare legacy frame-trace directory — no manifest, frames-only.\n if (!existsSync(manifestPath)) {\n const legacyIndex = join(dir, FRAMES_INDEX)\n if (!existsSync(legacyIndex)) {\n throw new Error(\n `readRecording: ${dir} is not a .rec container (no manifest.json) ` +\n `and not a frame-trace directory (no index.jsonl)`,\n )\n }\n const traceFrames = parseJsonl<TraceFrame>(readFileSync(legacyIndex, \"utf-8\"))\n if (traceFrames.length === 0) {\n throw new Error(`readRecording: ${legacyIndex} contains no parseable frames`)\n }\n const first = traceFrames[0]!\n return traceToRecording({\n frames: traceFrames,\n cols: first.buffer.cols,\n rows: first.buffer.rows,\n backend,\n })\n }\n\n // Full `.rec` directory bundle.\n return deserializeRecording(collectBundleDir(dir), backend)\n}\n\n// =============================================================================\n// Archive ⇄ directory — packRecording / unpackRecording (internal working form)\n// =============================================================================\n\n/**\n * Pack a `.rec` *directory* bundle into a single `.rec` file.\n *\n * The `.rec` file is a standard ZIP (like `.docx` / `.epub`) — every file in\n * the directory becomes an archive entry, paths relative to the directory\n * root. The directory bundle is the internal unpacked working form;\n * {@link writeRecording} is the usual way to produce a `.rec` directly from a\n * {@link Recording}.\n *\n * @param dir Source `.rec` directory bundle.\n * @param archivePath Destination `.rec` file.\n * @throws {Error} when `dir` does not exist.\n */\nexport function packRecording(dir: string, archivePath: string): void {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n throw new Error(`packRecording: ${dir} is not a directory`)\n }\n const entries: ZipEntry[] = []\n for (const path of walk(dir)) {\n entries.push({ path: relativeSlash(dir, path), bytes: new Uint8Array(readFileSync(path)) })\n }\n // Stable order — sorted paths produce a reproducible archive.\n entries.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0))\n writeFileSync(archivePath, buildZip(entries))\n}\n\n/**\n * Unpack a single `.rec` file back into a `.rec` directory bundle — the\n * internal unpacked working form.\n *\n * The inverse of {@link packRecording}. The destination directory is wiped and\n * recreated, then every archive entry is written to its path within it.\n *\n * @param archivePath Source `.rec` file.\n * @param dir Destination `.rec` directory. Created if missing; prior contents\n * are removed.\n * @throws {Error} when `archivePath` does not exist.\n */\nexport function unpackRecording(archivePath: string, dir: string): void {\n if (!existsSync(archivePath)) {\n throw new Error(`unpackRecording: ${archivePath} does not exist`)\n }\n const entries = parseZip(new Uint8Array(readFileSync(archivePath)))\n const files = new Map<string, Uint8Array>()\n for (const entry of entries) files.set(entry.path, entry.bytes)\n writeBundleDir(dir, files)\n}\n\n/**\n * Probe whether a path uses the `.rec` extension — the conventional name for\n * the single-file `.rec` container.\n */\nexport function isRecPath(path: string): boolean {\n return basename(path).endsWith(\".rec\")\n}\n","/**\n * Frame-trace mode for termless.\n *\n * Captures every render-relevant buffer mutation with timestamp + content\n * hash + (optional) PNG. Designed to make visual bugs investigable:\n * \"the border disappeared after frame 47\" instead of \"looks wrong somewhere\".\n *\n * Phase 2 of the Visual Eyes epic (@km/infra/mcp-tty-ghostty-backend-toggle).\n *\n * Usage (consumer-side, e.g., mcp__tty plugin):\n * const tracer = createFrameTracer(terminal, { dir: \"/tmp/trace-1/\" })\n * // ... terminal runs ...\n * const summary = await tracer.stop()\n * // tracer.framesSinceSeq(0) returns the full trace\n *\n * Output layout:\n * /tmp/trace-1/\n * index.jsonl — append-only, one TraceFrame per line; tolerant to truncation\n * 00001.png — unique frames only; duplicates point to original via duplicate_of\n * 00002.png\n * ...\n * viewer.html — self-contained HTML trace viewer, written on stop()\n *\n * The tracer hooks into `terminal.onAfterWrite` (wired via TerminalCreateOptions)\n * and debounces frame captures by `debounceMs` so we get one frame per render\n * pass rather than one per cell-write.\n */\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync, statSync } from \"node:fs\"\nimport { writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { writeViewer } from \"../view/viewer.ts\"\nimport { traceToRecording } from \"./frame-trace-recording.ts\"\nimport { writeRecording } from \"./native/native-rec.ts\"\nimport type { Recording } from \"./recording.ts\"\nimport type { ScreenshotOptions, Terminal } from \"../terminal/types.ts\"\n\nexport interface FrameTraceOptions {\n /** Output directory. Created if missing. */\n dir: string\n /** Debounce interval. Default: 16ms (one render frame at 60fps). */\n debounceMs?: number\n /** Hard cap on frames captured. Default: 10_000. */\n maxFrames?: number\n /** Skip writing PNGs for duplicate hashes (still records in index). Default: true. */\n dedupe?: boolean\n /** Override canvas-render options forwarded to @termless/ghostty's renderTerminalPng. */\n canvas?: Pick<ScreenshotOptions, \"cols\" | \"rows\" | \"fontSize\" | \"fontPath\" | \"theme\" | \"dpr\">\n /**\n * If provided, called instead of `@termless/ghostty.renderTerminalPng` to\n * produce the frame PNG bytes. Useful for tests that don't want to spin up\n * the native canvas renderer / WASM.\n */\n renderFn?: (terminal: Terminal) => Promise<Uint8Array>\n /**\n * Path to a render-event sidecar JSONL written by silvery's render-trace\n * (`SILVERY_TRACE_FRAMES` — Phase 4 of the Visual Eyes epic). When set,\n * each captured frame is annotated with the silvery render event whose\n * timestamp is the closest match (the `silvery` field on `TraceFrame`).\n *\n * Default: `<dir>/render-events.jsonl` — the path silvery writes to when\n * `SILVERY_TRACE_FRAMES` points at this same trace directory. Pass an\n * explicit path to read events from elsewhere; pass `null` to disable the\n * join entirely.\n */\n silveryEventsFile?: string | null\n}\n\n/**\n * A silvery render-boundary event, as written by silvery's `render-trace`\n * sidecar (`SILVERY_TRACE_FRAMES`). Mirrors silvery's `RenderDispatchedEvent`\n * shape — kept structural (not an import) so `@termless/core` stays\n * dependency-free of silvery.\n */\nexport interface SilveryRenderEvent {\n type: \"RENDER_DISPATCHED\"\n /** Wall-clock ms epoch — the join key. */\n ts: number\n renderCount: number\n reason: string\n dirtyRegions: { row: number; height: number }[]\n signalDelta: {\n nodesVisited: number\n nodesRendered: number\n nodesSkipped: number\n incremental: boolean\n }\n fiberHash: string\n}\n\nexport interface TraceFrame {\n seq: number\n ts: number\n iso: string\n hash: string\n duplicate_of: number | null\n bytes_in_since_last: number\n ansi_input_preview: string\n buffer: {\n cols: number\n rows: number\n cursor: { row: number; col: number }\n }\n duration_since_prev_ms: number\n render_ms: number\n png: string | null\n /**\n * Optional silvery render-state snapshot. Populated by Phase 4 of the\n * Visual Eyes epic — the silvery `RENDER_DISPATCHED` event whose timestamp\n * is the closest match for this frame. Absent on traces recorded without a\n * silvery render-event sidecar. The viewer renders it when present and\n * omits the section when absent.\n *\n * Typed `SilveryRenderEvent | unknown` so older traces (or non-silvery\n * sources) that wrote an arbitrary value still type-check; new traces\n * populate it with a `SilveryRenderEvent`.\n */\n silvery?: SilveryRenderEvent | unknown\n}\n\nexport interface FrameTraceSummary {\n count: number\n uniqueCount: number\n duplicateRatio: number\n totalBytes: number\n indexFile: string\n firstTs: number | null\n lastTs: number | null\n truncated: boolean\n}\n\nexport interface FrameTracer {\n /** Hook to register with Terminal's `onAfterWrite`. */\n readonly onWrite: (data: Uint8Array) => void\n /** All frames recorded so far. */\n framesSinceSeq(seq: number): TraceFrame[]\n /** Frames recorded at or after `ts` (ms epoch). */\n framesSinceTime(ts: number): TraceFrame[]\n /** Flush pending debounced frame, close index file, return summary. */\n stop(): Promise<FrameTraceSummary>\n /**\n * Project the frames captured so far into the unified in-memory\n * {@link Recording} model — a `Recording` whose `frames` projection is\n * populated (Phase 2 of the Recording-domain unification).\n *\n * This is a pure in-memory projection: it touches no disk and does not\n * alter the `index.jsonl` + `NNNNN.png` layout. Call after `stop()` for the\n * complete trace, or any time for a snapshot.\n *\n * @throws {Error} when no frames have been captured.\n */\n toRecording(): Recording\n /**\n * Write the captured trace to a native single-file `.rec` recording at\n * `recPath` (Phase 5 of the Recording-domain unification).\n *\n * `.rec` is the canonical full-fidelity on-disk recording format — a ZIP\n * container whose `frames/` sub-tree is byte-compatible with the frame-trace\n * layout this tracer writes, wrapped with a `manifest.json`. The frame\n * tracer's own `index.jsonl` + `NNNNN.png` output (at the `dir` it was\n * created with) is left **untouched** — `writeRec` is an additive native-\n * format export, not a replacement for the live trace directory.\n *\n * Call after `stop()`. The unique-frame PNGs are copied from the tracer's\n * live trace `dir` into the `.rec` container's `frames/` sub-tree.\n *\n * @param recPath Destination `.rec` file.\n * @throws {Error} when no frames have been captured.\n */\n writeRec(recPath: string): void\n /** Was the trace truncated by maxFrames cap. */\n readonly truncated: boolean\n /** Total frames recorded (unique + duplicate). */\n readonly count: number\n}\n\n// ── Hash helper: prefers Bun.hash.xxHash64 for speed; falls back to a\n// simple FNV-1a (deterministic, dep-free) otherwise. xxHash3 collision rate\n// is fine for \"is this the same buffer state\" over the typical 10k-frame\n// trace lifetime.\n\nfunction hashBytes(bytes: Uint8Array | string): string {\n const data = typeof bytes === \"string\" ? new TextEncoder().encode(bytes) : bytes\n const bunHash = (globalThis as { Bun?: { hash?: { xxHash64?: (b: Uint8Array) => bigint } } }).Bun?.hash?.xxHash64\n if (bunHash) {\n return `xxh64:${bunHash(data).toString(16)}`\n }\n // FNV-1a 64-bit fallback.\n let h = 0xcbf29ce484222325n\n const prime = 0x100000001b3n\n const mask = (1n << 64n) - 1n\n for (let i = 0; i < data.length; i++) {\n h ^= BigInt(data[i] ?? 0)\n h = (h * prime) & mask\n }\n return `fnv1a:${h.toString(16)}`\n}\n\nfunction bufferFingerprint(terminal: Terminal): {\n hash: string\n cols: number\n rows: number\n cursorRow: number\n cursorCol: number\n} {\n const lines = terminal.getLines()\n // Hash visible text per row + cursor position. Lightweight enough to call\n // on every debounced tick; differentiates render passes that change attrs\n // too (cellsToAnsi-like serialization could be heavier but more precise).\n const lineStrs: string[] = []\n for (const row of lines) {\n let s = \"\"\n for (const cell of row) {\n // Mix in char + a 1-byte attribute digest so attribute-only changes still\n // produce a new hash.\n const attrs =\n (cell.bold ? 1 : 0) |\n (cell.dim ? 2 : 0) |\n (cell.italic ? 4 : 0) |\n (cell.underline ? 8 : 0) |\n (cell.inverse ? 16 : 0) |\n (cell.strikethrough ? 32 : 0)\n const fg = cell.fg ? `${cell.fg.r},${cell.fg.g},${cell.fg.b}` : \"\"\n const bg = cell.bg ? `${cell.bg.r},${cell.bg.g},${cell.bg.b}` : \"\"\n s += `${cell.char}|${attrs}|${fg}|${bg};`\n }\n lineStrs.push(s)\n }\n const cursor = (() => {\n try {\n return terminal.getCursor()\n } catch {\n return { x: 0, y: 0, visible: true, style: \"block\" as const }\n }\n })()\n return {\n hash: hashBytes(lineStrs.join(\"\\n\")),\n cols: lines[0]?.length ?? 0,\n rows: lines.length,\n cursorRow: cursor.y,\n cursorCol: cursor.x,\n }\n}\n\nfunction previewAnsi(bytes: Uint8Array, maxLen = 80): string {\n const text = new TextDecoder().decode(bytes)\n if (text.length <= maxLen) return text\n return text.slice(0, maxLen) + \"…\"\n}\n\nfunction padSeq(n: number, width = 5): string {\n return n.toString().padStart(width, \"0\")\n}\n\n// ── Silvery render-event join ────────────────────────────────────────────────\n//\n// silvery writes a `render-events.jsonl` sidecar (one RENDER_DISPATCHED event\n// per line) when `SILVERY_TRACE_FRAMES` is set. The frame tracer reads that\n// sidecar incrementally — re-reading the whole file each capture is fine; it's\n// small, append-only, and a capture happens at most every `debounceMs`.\n\n/**\n * A reader that incrementally tails a silvery render-event sidecar and\n * answers \"which render event best matches a frame captured at ts T?\".\n */\ninterface SilveryEventJoin {\n /** Re-read the sidecar if it grew; return the event closest to `ts`. */\n matchFor(ts: number): SilveryRenderEvent | null\n}\n\n/** Parse one JSONL line into a SilveryRenderEvent, or null if malformed. */\nfunction parseSilveryEvent(line: string): SilveryRenderEvent | null {\n const trimmed = line.trim()\n if (trimmed.length === 0) return null\n try {\n const obj = JSON.parse(trimmed) as Partial<SilveryRenderEvent>\n if (obj.type !== \"RENDER_DISPATCHED\" || typeof obj.ts !== \"number\") return null\n return obj as SilveryRenderEvent\n } catch {\n return null\n }\n}\n\n/**\n * Create a join over the silvery render-event sidecar at `file`.\n *\n * The join is tolerant: a missing file, a truncated final line, or malformed\n * rows are skipped — frame capture is never blocked by sidecar issues. The\n * file is re-stat'd each `matchFor` call and only re-parsed when it grew.\n *\n * Matching rule: pick the event with the **largest `ts` ≤ frame `ts`** — the\n * render that produced this frame happened at or before the frame's capture.\n * If no event precedes the frame (clock skew, first frame), fall back to the\n * single closest event by absolute `ts` distance within a small window so\n * an early frame still gets annotated.\n */\nfunction createSilveryEventJoin(file: string): SilveryEventJoin {\n const events: SilveryRenderEvent[] = []\n let lastSize = -1\n // Window for the \"no event precedes the frame\" fallback — a frame should\n // only borrow a later event if it's within one render-debounce or so.\n const FALLBACK_WINDOW_MS = 64\n\n function refresh(): void {\n let size: number\n try {\n size = statSync(file).size\n } catch {\n return // sidecar not created yet — silvery may not have rendered.\n }\n if (size === lastSize) return\n lastSize = size\n let text: string\n try {\n text = readFileSync(file, \"utf-8\")\n } catch {\n return\n }\n events.length = 0\n for (const line of text.split(\"\\n\")) {\n const ev = parseSilveryEvent(line)\n if (ev) events.push(ev)\n }\n // Sidecar is append-only in render order, but sort defensively so the\n // closest-match scan below can rely on ascending ts.\n events.sort((a, b) => a.ts - b.ts)\n }\n\n return {\n matchFor(ts: number): SilveryRenderEvent | null {\n refresh()\n if (events.length === 0) return null\n // Largest ts <= frame ts.\n let best: SilveryRenderEvent | null = null\n for (const ev of events) {\n if (ev.ts <= ts) best = ev\n else break\n }\n if (best) return best\n // No event precedes the frame — borrow the earliest event if it's\n // close enough (handles the first frame / coarse-clock skew).\n const earliest = events[0]!\n return earliest.ts - ts <= FALLBACK_WINDOW_MS ? earliest : null\n },\n }\n}\n\nexport function createFrameTracer(terminal: Terminal, options: FrameTraceOptions): FrameTracer {\n const debounceMs = options.debounceMs ?? 16\n const maxFrames = options.maxFrames ?? 10_000\n const dedupe = options.dedupe ?? true\n const dir = options.dir\n // Default renderer: route through @termless/ghostty's renderTerminalPng.\n // Dynamic import keeps @termless/core install-independent of @termless/ghostty;\n // a missing module surfaces from the import itself, not from a top-level\n // dependency. Tests inject `renderFn` to avoid the WASM cost entirely.\n const renderFn =\n options.renderFn ??\n (async (t: Terminal): Promise<Uint8Array> => {\n const { renderTerminalPng } = (await import(\"@termless/ghostty\")) as {\n renderTerminalPng: (term: Terminal, opts?: unknown) => Promise<Uint8Array>\n }\n return renderTerminalPng(t, options.canvas)\n })\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n const indexFile = join(dir, \"index.jsonl\")\n // Truncate any prior index for this dir.\n appendFileSync(indexFile, \"\", { flag: \"w\" })\n\n // Silvery render-event join. `silveryEventsFile` defaults to the sidecar\n // silvery writes when `SILVERY_TRACE_FRAMES` points at this same dir;\n // pass `null` to disable.\n const silveryEventsFile =\n options.silveryEventsFile === null ? null : (options.silveryEventsFile ?? join(dir, \"render-events.jsonl\"))\n const silveryJoin = silveryEventsFile ? createSilveryEventJoin(silveryEventsFile) : null\n\n const frames: TraceFrame[] = []\n const hashToSeq = new Map<string, number>()\n let pendingTimer: ReturnType<typeof setTimeout> | null = null\n let bytesSinceLast = 0\n let lastAnsiPreview = \"\"\n let lastTs: number | null = null\n let firstTs: number | null = null\n let truncated = false\n let stopped = false\n // Debounced capture ticks must run in order. If async renders overlap,\n // several captures can pass the maxFrames guard before earlier frames commit.\n // The queue tail also gives `stop()` one handle to await so `await\n // tracer.stop()` then `rmSync(dir)` is race-free by construction.\n let captureQueue: Promise<void> = Promise.resolve()\n let inFlightCapture: Promise<void> | null = null\n\n function flushPending(): void {\n if (pendingTimer) {\n clearTimeout(pendingTimer)\n pendingTimer = null\n }\n }\n\n async function captureFrame(): Promise<void> {\n if (stopped) return\n if (frames.length >= maxFrames) {\n truncated = true\n return\n }\n const ts = Date.now()\n const renderStart = performance.now()\n const fp = bufferFingerprint(terminal)\n const seq = frames.length + 1\n const existing = hashToSeq.get(fp.hash)\n const duplicate_of = existing ?? null\n let pngRelPath: string | null = null\n let renderMs = 0\n if (existing == null) {\n // Unique frame — write the PNG.\n try {\n const png = await renderFn(terminal)\n // `renderFn` is async — the tracer may have been stopped while it ran.\n // Bail before any disk write so a late capture never touches a\n // directory the caller has already removed.\n if (stopped) return\n const fname = `${padSeq(seq)}.png`\n await writeFile(join(dir, fname), png)\n pngRelPath = fname\n renderMs = +(performance.now() - renderStart).toFixed(2)\n hashToSeq.set(fp.hash, seq)\n } catch (err) {\n // Don't kill the trace — record the frame without PNG and continue.\n renderMs = +(performance.now() - renderStart).toFixed(2)\n // eslint-disable-next-line no-console\n console.error(\"[frame-trace] render failed:\", (err as Error).message)\n }\n } else if (!dedupe) {\n // Forced re-render even though hash matches.\n const png = await renderFn(terminal)\n if (stopped) return\n const fname = `${padSeq(seq)}.png`\n await writeFile(join(dir, fname), png)\n pngRelPath = fname\n renderMs = +(performance.now() - renderStart).toFixed(2)\n }\n const durSincePrev = lastTs == null ? 0 : ts - lastTs\n const frame: TraceFrame = {\n seq,\n ts,\n iso: new Date(ts).toISOString(),\n hash: fp.hash,\n duplicate_of,\n bytes_in_since_last: bytesSinceLast,\n ansi_input_preview: lastAnsiPreview,\n buffer: {\n cols: fp.cols,\n rows: fp.rows,\n cursor: { row: fp.cursorRow, col: fp.cursorCol },\n },\n duration_since_prev_ms: durSincePrev,\n render_ms: renderMs,\n png: pngRelPath,\n }\n // Join the closest silvery render event onto the frame. Absent when no\n // sidecar exists or no event matches — the `silvery` field stays\n // undefined and the viewer omits the section.\n const silveryEvent = silveryJoin?.matchFor(ts)\n if (silveryEvent) frame.silvery = silveryEvent\n // A `writeFile` await above may have let `stop()` run to completion; never\n // append to an index file whose directory has since been removed.\n if (stopped) return\n frames.push(frame)\n appendFileSync(indexFile, JSON.stringify(frame) + \"\\n\")\n if (firstTs == null) firstTs = ts\n lastTs = ts\n bytesSinceLast = 0\n lastAnsiPreview = \"\"\n }\n\n function scheduleCapture(): void {\n if (stopped || truncated) return\n if (pendingTimer) clearTimeout(pendingTimer)\n pendingTimer = setTimeout(() => {\n pendingTimer = null\n // Queue the fired capture so async renders cannot overlap. A capture is\n // async (`renderFn` + disk writes); without this handle a `stop()` that\n // races a just-fired debounce would return before the capture's late\n // `writeFile`/`appendFileSync`, letting a caller's `rmSync(dir)` trip an\n // ENOENT. `.catch` keeps the fire-and-forget tick rejection-free; errors\n // inside `captureFrame` are already swallowed at their own call sites.\n const capture = captureQueue.then(() => captureFrame()).catch(() => {})\n captureQueue = capture\n inFlightCapture = capture\n void capture.then(() => {\n if (inFlightCapture === capture) inFlightCapture = null\n })\n }, debounceMs)\n }\n\n function onWrite(data: Uint8Array): void {\n bytesSinceLast += data.byteLength\n if (lastAnsiPreview === \"\") lastAnsiPreview = previewAnsi(data)\n scheduleCapture()\n }\n\n async function stop(): Promise<FrameTraceSummary> {\n // Drain a debounced capture that has fired and is mid-flight (awaiting\n // `renderFn` / disk writes) before doing anything else. Capturing the\n // handle and awaiting it here is what makes `await tracer.stop()` then\n // `rmSync(dir)` race-free — no late write can outlive `stop()`.\n if (inFlightCapture) {\n await inFlightCapture\n }\n if (pendingTimer) {\n clearTimeout(pendingTimer)\n pendingTimer = null\n // Flush one final frame if writes were pending. Done before `stopped`\n // is set so this capture is allowed to write its frame.\n await captureFrame()\n }\n stopped = true\n // A capture could have fired between the `inFlightCapture` await above and\n // here (a debounce timer landing during `await captureFrame()`). It will\n // observe `stopped` and bail before any write, but await it so `stop()`'s\n // returned promise still strictly outlives every capture tick.\n if (inFlightCapture) {\n await inFlightCapture\n }\n const uniqueCount = hashToSeq.size\n const count = frames.length\n const totalBytes = frames.reduce((acc, f) => acc + f.bytes_in_since_last, 0)\n // Emit a self-contained HTML viewer alongside the trace so every trace is\n // immediately inspectable by double-clicking viewer.html — no server.\n // Never let a viewer-generation failure kill the trace summary.\n try {\n writeViewer(dir)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[frame-trace] viewer generation failed:\", (err as Error).message)\n }\n return {\n count,\n uniqueCount,\n duplicateRatio: count === 0 ? 0 : 1 - uniqueCount / count,\n totalBytes,\n indexFile,\n firstTs,\n lastTs,\n truncated,\n }\n }\n\n return {\n onWrite,\n framesSinceSeq(seq: number) {\n return frames.filter((f) => f.seq > seq)\n },\n framesSinceTime(ts: number) {\n return frames.filter((f) => f.ts >= ts)\n },\n stop,\n toRecording(): Recording {\n // Pure in-memory projection — re-shapes the captured `frames` into the\n // unified Recording model. The on-disk `index.jsonl` + PNG layout is\n // untouched. Buffer geometry comes from the first frame (or the\n // tracer's canvas opts as a fallback for a 0-frame edge).\n const cols = frames[0]?.buffer.cols ?? options.canvas?.cols ?? terminal.cols\n const rows = frames[0]?.buffer.rows ?? options.canvas?.rows ?? terminal.rows\n return traceToRecording({\n frames,\n cols,\n rows,\n backend: terminal.backend.name,\n ...(options.canvas !== undefined ? { canvas: options.canvas } : {}),\n })\n },\n writeRec(recPath: string): void {\n // Project the captured trace into a Recording, then serialize it to a\n // single `.rec` file. The unique-frame PNGs are copied from the tracer's\n // live trace `dir` (where `captureFrame` wrote them).\n const cols = frames[0]?.buffer.cols ?? options.canvas?.cols ?? terminal.cols\n const rows = frames[0]?.buffer.rows ?? options.canvas?.rows ?? terminal.rows\n const recording = traceToRecording({\n frames,\n cols,\n rows,\n backend: terminal.backend.name,\n ...(options.canvas !== undefined ? { canvas: options.canvas } : {}),\n })\n writeRecording(recPath, recording, { pngSourceDir: dir })\n },\n get truncated() {\n return truncated\n },\n get count() {\n return frames.length\n },\n }\n}\n","/**\n * `loadVisualTrace` — read an on-disk frame-trace directory into a\n * {@link Recording}.\n *\n * Phase 4 of the Recording-domain unification (design doc §6). The frame-trace\n * directory layout (`index.jsonl` + `NNNNN.png`) is a **cross-repo ABI** — km's\n * `toMatchVisualTrace` matcher parses it directly. This module inserts the\n * indirection that hands the layout back to termless: km calls\n * `loadVisualTrace` and never touches the on-disk shape again, so Phase 5 is\n * free to change the format without breaking km.\n *\n * The on-disk layout this reads is exactly what {@link \"./frame-trace.ts\"}'s\n * `createFrameTracer` writes:\n *\n * trace-dir/\n * index.jsonl — append-only, one {@link Frame} per line\n * 00001.png — unique frames only; duplicates point back via duplicate_of\n * ...\n * viewer.html — ignored here\n *\n * `loadVisualTrace` is the disk-reading sibling of Phase 2's pure in-memory\n * {@link traceToRecording}: it parses `index.jsonl` into `Frame[]` and then\n * delegates to the same projection. Reading is **tolerant** — a truncated or\n * malformed final line is skipped, mirroring the tracer's append-only design.\n *\n * PNG bytes are NOT loaded into memory. The frames projection carries each\n * frame's `png` field as a relative filename (unchanged from disk); a consumer\n * that needs the bytes resolves them against the trace directory itself.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { readRecording } from \"./native/native-rec.ts\"\nimport type { Recording } from \"./recording.ts\"\n\n/** Options for {@link loadVisualTrace}. */\nexport interface LoadVisualTraceOptions {\n /**\n * Backend id stamped onto the synthesized renderer fingerprint of every\n * projected frame. The on-disk frame-trace layout records no backend, so it\n * must be supplied (or defaults). Default: `\"unknown\"`.\n */\n backend?: string\n}\n\n/**\n * Load an on-disk frame-trace directory into an in-memory {@link Recording}.\n *\n * Phase 5 update: `loadVisualTrace` now **delegates to {@link readRecording}**,\n * the native `.rec` reader. `readRecording` accepts both a full `.rec`\n * directory and a bare legacy frame-trace directory (`index.jsonl` +\n * `NNNNN.png`, no `manifest.json`) — so `loadVisualTrace` keeps its exact\n * contract (a frame-trace directory in, a `Recording` out) while the native\n * `.rec` format owns the read path. km's `toMatchVisualTrace` calling\n * `loadVisualTrace` transparently gains `.rec` support.\n *\n * Terminal geometry (`cols`/`rows`) is taken from the first frame's buffer.\n * `provenance.reproducible` is `false`: a bare frame trace records no `io`\n * track, so the visual state is the sole record.\n *\n * @param path Path to a frame-trace directory (`index.jsonl` + `NNNNN.png`),\n * or a full `.rec` directory.\n * @param options See {@link LoadVisualTraceOptions}.\n * @returns A {@link Recording} with a populated `frames` projection.\n * @throws {Error} when `<path>` is neither a frame-trace directory nor a\n * `.rec` directory, or when it contains no parseable frames.\n */\nexport function loadVisualTrace(path: string, options: LoadVisualTraceOptions = {}): Recording {\n // Preserve the historical error message for a missing frame-trace index so\n // existing callers/tests that match on it keep passing.\n const indexFile = join(path, \"index.jsonl\")\n const manifestFile = join(path, \"manifest.json\")\n if (!existsSync(indexFile) && !existsSync(manifestFile)) {\n throw new Error(`loadVisualTrace: no index.jsonl found at ${indexFile}`)\n }\n return readRecording(path, { backend: options.backend ?? \"unknown\" })\n}\n","/**\n * `writeVisualTrace` — write a frame-trace directory to disk.\n *\n * Phase 4 of the Recording-domain unification (design doc §6). The disk-*writing*\n * sibling of {@link \"./load-visual-trace.ts\"}'s `loadVisualTrace`. Together they\n * hand the frame-trace directory layout — a **cross-repo ABI** — back to\n * termless: km's `toMatchVisualTrace` matcher writes a golden trace by calling\n * `writeVisualTrace` and never touches the on-disk shape itself, so Phase 5 is\n * free to change the format without breaking km.\n *\n * The on-disk layout this writes is exactly what {@link \"./frame-trace.ts\"}'s\n * `createFrameTracer` produces:\n *\n * trace-dir/\n * index.jsonl — one {@link TraceFrame} per line, in `seq` order\n * 00001.png — unique frames only; duplicates point back via duplicate_of\n * ...\n *\n * Unlike `createFrameTracer` (which appends frames *as they are captured*),\n * `writeVisualTrace` writes a *complete, already-captured* trace in one shot:\n * the destination directory is wiped, the `index.jsonl` is written whole, and\n * every unique frame's PNG is copied from a source directory.\n *\n * Operating on the tracer's `TraceFrame` shape (not the in-memory `Recording`) is\n * deliberate: a golden trace must round-trip byte-identically through\n * `writeVisualTrace` → `loadVisualTrace`, and the `TraceFrame` shape carries fields\n * (`render_ms`, `duration_since_prev_ms`, `iso`) the `Recording` projection\n * drops. Writing from `TraceFrame[]` keeps the on-disk bytes lossless.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { TraceFrame } from \"./frame-trace.ts\"\n\n/** Options for {@link writeVisualTrace}. */\nexport interface WriteVisualTraceOptions {\n /**\n * Directory the unique-frame PNGs are copied *from*. Each frame's `png`\n * field is a relative filename resolved against this directory. When a\n * referenced PNG is missing it is skipped (the index still records the\n * frame) — mirroring the tracer's render-failure tolerance.\n *\n * Omit when the trace carries no PNGs (every frame's `png` is `null`).\n */\n pngSourceDir?: string\n}\n\n/**\n * Write a complete frame-trace directory to `dir`.\n *\n * The destination directory is **wiped and recreated** — `writeVisualTrace`\n * produces a clean trace directory, never merges into an existing one. The\n * `index.jsonl` is written with one frame per line in array order; every\n * unique frame's PNG (`frame.png !== null`) is copied from\n * {@link WriteVisualTraceOptions.pngSourceDir} preserving its filename, so the\n * `duplicate_of` chains still resolve.\n *\n * @param dir Destination frame-trace directory. Created if missing; its prior\n * contents are removed.\n * @param frames The complete, already-captured trace frames (e.g. from a\n * tracer's `framesSinceSeq(0)`).\n * @param options See {@link WriteVisualTraceOptions}.\n */\nexport function writeVisualTrace(dir: string, frames: TraceFrame[], options: WriteVisualTraceOptions = {}): void {\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true })\n }\n mkdirSync(dir, { recursive: true })\n\n // Copy every unique frame's PNG, preserving its filename so duplicate_of\n // chains keep resolving against the written directory.\n if (options.pngSourceDir !== undefined) {\n for (const frame of frames) {\n if (frame.png === null) continue\n const src = join(options.pngSourceDir, frame.png)\n if (!existsSync(src)) continue\n copyFileSync(src, join(dir, frame.png))\n }\n }\n\n // Write index.jsonl whole — one Frame per line, trailing newline when\n // non-empty (matches the tracer's append-with-newline output).\n const body = frames.map((f) => JSON.stringify(f)).join(\"\\n\") + (frames.length > 0 ? \"\\n\" : \"\")\n writeFileSync(join(dir, \"index.jsonl\"), body)\n}\n","/**\n * Animated SVG encoder for termless.\n *\n * Composes multiple SVG frames into a single animated SVG using CSS keyframe\n * animations. Each frame becomes a `<g>` element with opacity toggled via\n * `@keyframes` — at any given time exactly one frame is visible.\n *\n * The output is a self-contained SVG that animates in any modern browser.\n */\n\nimport type { AnimationFrame, AnimationOptions } from \"./animation-types.ts\"\nimport { embeddedFontFaceDefs } from \"../render/svg.ts\"\n\n/** Extract the inner content of an SVG element (everything between <svg ...> and </svg>). */\nfunction stripSvgWrapper(svg: string): string {\n // Remove the opening <svg ...> tag\n const openEnd = svg.indexOf(\">\")\n if (openEnd === -1) return svg\n let inner = svg.slice(openEnd + 1)\n\n // Remove the closing </svg> tag\n const closeStart = inner.lastIndexOf(\"</svg>\")\n if (closeStart !== -1) {\n inner = inner.slice(0, closeStart)\n }\n\n return inner.trim()\n}\n\n/** Parse width and height from an SVG element's attributes. */\nfunction parseSvgDimensions(svg: string): { width: number; height: number } {\n const widthMatch = svg.match(/width=\"([^\"]+)\"/)\n const heightMatch = svg.match(/height=\"([^\"]+)\"/)\n return {\n width: widthMatch ? Number(widthMatch[1]) : 100,\n height: heightMatch ? Number(heightMatch[1]) : 50,\n }\n}\n\n/**\n * Compose multiple SVG frames into a single animated SVG.\n *\n * Uses CSS `@keyframes` to toggle frame visibility via opacity.\n * Each frame displays for its specified duration, then the next\n * frame takes over. The animation loops according to `options.loop`.\n */\nexport function createAnimatedSvg(frames: AnimationFrame[], options?: AnimationOptions): string {\n if (frames.length === 0) {\n throw new Error(\"createAnimatedSvg requires at least one frame\")\n }\n\n const defaultDuration = options?.defaultDuration ?? 100\n const loop = options?.loop ?? 0\n const iterationCount = loop === 0 ? \"infinite\" : String(loop)\n\n const { width, height } = parseSvgDimensions(frames[0]!.svg)\n\n // Single frame — no animation needed\n if (frames.length === 1) {\n const content = stripSvgWrapper(frames[0]!.svg)\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">`,\n embeddedFontFaceDefs(),\n content,\n `</svg>`,\n ].join(\"\\n\")\n }\n\n // Calculate total duration and cumulative timing\n const durations = frames.map((f) => f.duration || defaultDuration)\n const totalDuration = durations.reduce((sum, d) => sum + d, 0)\n const totalSeconds = totalDuration / 1000\n\n // Build CSS keyframes for each frame\n const styleLines: string[] = []\n let cumulativeTime = 0\n\n for (let i = 0; i < frames.length; i++) {\n const startPct = (cumulativeTime / totalDuration) * 100\n const endPct = ((cumulativeTime + durations[i]!) / totalDuration) * 100\n\n // Each frame is visible (opacity 1) during its window, invisible otherwise.\n // Use a tiny gap (0.01%) for the transition to avoid two frames being visible.\n const keyframes: string[] = []\n\n if (startPct > 0) {\n keyframes.push(`0% { opacity: 0 }`)\n keyframes.push(`${startPct.toFixed(2)}% { opacity: 0 }`)\n } else {\n keyframes.push(`0% { opacity: 1 }`)\n }\n\n if (startPct > 0) {\n keyframes.push(`${(startPct + 0.01).toFixed(2)}% { opacity: 1 }`)\n }\n\n keyframes.push(`${endPct.toFixed(2)}% { opacity: 1 }`)\n\n if (endPct < 100) {\n keyframes.push(`${(endPct + 0.01).toFixed(2)}% { opacity: 0 }`)\n keyframes.push(`100% { opacity: 0 }`)\n }\n\n styleLines.push(`@keyframes f${i} { ${keyframes.join(\"; \")} }`)\n styleLines.push(`.f${i} { animation: f${i} ${totalSeconds}s step-end ${iterationCount}; opacity: 0 }`)\n\n cumulativeTime += durations[i]!\n }\n\n // The first frame should start visible\n styleLines.push(`.f0 { opacity: 1 }`)\n\n // Build SVG groups for each frame\n const groups: string[] = []\n for (let i = 0; i < frames.length; i++) {\n const content = stripSvgWrapper(frames[i]!.svg)\n groups.push(`<g class=\"f${i}\">${content}</g>`)\n }\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">`,\n embeddedFontFaceDefs(),\n `<style>`,\n ...styleLines,\n `</style>`,\n ...groups,\n `</svg>`,\n ].join(\"\\n\")\n}\n","/**\n * `Recording` → animation-frame bridge.\n *\n * Phase 2 of the Recording-domain unification (design doc §5). The animation\n * encoders ({@link \"./gif.ts\"}, {@link \"./apng.ts\"}, {@link \"./animated-svg.ts\"})\n * consume low-level frame lists — `PngFrame[]` (pre-rasterized) or\n * `AnimationFrame[]` (SVG). This bridge derives those lists from a unified\n * {@link Recording}'s `frames` projection so the animation encoders consume a\n * `Recording` rather than an ad-hoc shape assembled by each caller.\n *\n * Per-frame **duration** is derived from the recording's µs timeline: a\n * frame displays until the next frame's timestamp. The final frame uses a\n * caller-supplied trailing duration (it has no successor on the timeline).\n *\n * The frames projection stores `png` as a path *relative to the recording\n * bundle*. {@link recordingToPngFrames} reads those PNGs from `bundleDir`,\n * resolving deduped frames (`duplicateOf`) to the original frame's image.\n */\n\nimport { readFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { Frame as ModelFrame, Recording } from \"../recording/recording.ts\"\nimport type { AnimationFrame } from \"./animation-types.ts\"\nimport type { PngFrame } from \"./gif.ts\"\n\n/** Options for deriving animation frames from a {@link Recording}. */\nexport interface FromRecordingOptions {\n /**\n * Display duration (ms) for the final frame — it has no successor on the\n * timeline to bound it. Default: 100ms.\n */\n trailingDurationMs?: number\n /**\n * Include visual-duplicate frames (`duplicateOf != null`). When `false`\n * (default) duplicate frames are merged into their predecessor's duration —\n * the animation skips redundant identical stills.\n */\n includeDuplicates?: boolean\n}\n\n/** Compute the display duration (ms) for the model frame at `index`. */\nfunction durationMsFor(frames: ModelFrame[], index: number, trailingMs: number): number {\n const next = frames[index + 1]\n if (next === undefined) return trailingMs\n return Math.max(0, Math.round((next.at - frames[index]!.at) / 1000))\n}\n\n/**\n * Resolve the on-disk PNG path for a frame, following `duplicateOf` for\n * deduped frames (which carry `png: null`).\n */\nfunction pngPathFor(recording: Recording, frame: ModelFrame): string | null {\n if (frame.png !== null) return frame.png\n if (frame.duplicateOf !== null) {\n const original = recording.frames!.find((f) => f.seq === frame.duplicateOf)\n if (original?.png != null) return original.png\n }\n return null\n}\n\n/**\n * Derive {@link PngFrame}[] from a {@link Recording}'s `frames` projection,\n * reading the rasterized PNGs from `bundleDir`.\n *\n * @throws {Error} when the recording has no `frames` projection, or a\n * non-duplicate frame has no resolvable PNG.\n */\nexport function recordingToPngFrames(\n recording: Recording,\n bundleDir: string,\n options?: FromRecordingOptions,\n): PngFrame[] {\n const modelFrames = recording.frames\n if (modelFrames === undefined || modelFrames.length === 0) {\n throw new Error(\"recordingToPngFrames: recording has no frames projection\")\n }\n const trailingMs = options?.trailingDurationMs ?? 100\n const includeDuplicates = options?.includeDuplicates ?? false\n\n const result: PngFrame[] = []\n for (let i = 0; i < modelFrames.length; i++) {\n const frame = modelFrames[i]!\n const isDuplicate = frame.duplicateOf !== null\n if (isDuplicate && !includeDuplicates) {\n // Merge this still into the previous frame's display time.\n if (result.length > 0) {\n result[result.length - 1]!.duration += durationMsFor(modelFrames, i, trailingMs)\n }\n continue\n }\n const path = pngPathFor(recording, frame)\n if (path === null) {\n throw new Error(`recordingToPngFrames: frame ${frame.seq} has no resolvable PNG`)\n }\n result.push({\n png: new Uint8Array(readFileSync(join(bundleDir, path))),\n duration: durationMsFor(modelFrames, i, trailingMs),\n })\n }\n return result\n}\n\n/**\n * Derive {@link AnimationFrame}[] (SVG-backed) from a {@link Recording} and a\n * per-frame SVG renderer.\n *\n * The frames projection stores rasterized PNGs, not SVG — so the caller\n * supplies `renderSvg`, a function that produces the SVG for a frame's\n * `contentHash` (or by `seq`). This keeps the bridge renderer-agnostic: the\n * Renderer strategy (design doc §5) lives outside.\n */\nexport function recordingToAnimationFrames(\n recording: Recording,\n renderSvg: (frame: ModelFrame) => string,\n options?: FromRecordingOptions,\n): AnimationFrame[] {\n const modelFrames = recording.frames\n if (modelFrames === undefined || modelFrames.length === 0) {\n throw new Error(\"recordingToAnimationFrames: recording has no frames projection\")\n }\n const trailingMs = options?.trailingDurationMs ?? 100\n const includeDuplicates = options?.includeDuplicates ?? false\n\n const result: AnimationFrame[] = []\n for (let i = 0; i < modelFrames.length; i++) {\n const frame = modelFrames[i]!\n if (frame.duplicateOf !== null && !includeDuplicates) {\n if (result.length > 0) {\n result[result.length - 1]!.duration += durationMsFor(modelFrames, i, trailingMs)\n }\n continue\n }\n result.push({ svg: renderSvg(frame), duration: durationMsFor(modelFrames, i, trailingMs) })\n }\n return result\n}\n","/**\n * Animation output format support for termless.\n *\n * Convenience functions for encoding animation frames in multiple formats.\n * Individual encoders are also exported directly for fine-grained control.\n */\n\nexport type { AnimationFrame, AnimationOptions, AnimationFormat } from \"./animation-types.ts\"\nexport { createAnimatedSvg } from \"./animated-svg.ts\"\nexport { createGif } from \"./gif.ts\"\nexport { createApng } from \"./apng.ts\"\n// Recording-domain bridge (Phase 2): derive animation frames from a Recording.\nexport { recordingToPngFrames, recordingToAnimationFrames } from \"./from-recording.ts\"\nexport type { FromRecordingOptions } from \"./from-recording.ts\"\n\nimport type { AnimationFrame, AnimationFormat, AnimationOptions } from \"./animation-types.ts\"\nimport { createAnimatedSvg } from \"./animated-svg.ts\"\nimport type { RendererKind } from \"./rasterizer.ts\"\n\n/**\n * Render animation frames in the specified format.\n *\n * - `\"svg\"` → animated SVG string (CSS keyframes, synchronous — no renderer)\n * - `\"gif\"` → animated GIF Uint8Array (gifenc + the `options.renderer` raster path)\n * - `\"apng\"` → animated PNG Uint8Array (upng-js + the `options.renderer` raster path)\n */\nexport async function renderAnimation(\n frames: AnimationFrame[],\n format: AnimationFormat,\n options?: AnimationOptions & { scale?: number; renderer?: RendererKind },\n): Promise<Uint8Array | string> {\n switch (format) {\n case \"svg\":\n return createAnimatedSvg(frames, options)\n case \"gif\": {\n const { createGif } = await import(\"./gif.ts\")\n return createGif(frames, options)\n }\n case \"apng\": {\n const { createApng } = await import(\"./apng.ts\")\n return createApng(frames, options)\n }\n default:\n throw new Error(`Unsupported animation format: ${format}`)\n }\n}\n\n/** Detect animation format from a filename extension. */\nexport function detectFormat(filename: string): AnimationFormat {\n if (filename.endsWith(\".svg\")) return \"svg\"\n if (filename.endsWith(\".gif\")) return \"gif\"\n if (filename.endsWith(\".apng\") || filename.endsWith(\".png\")) return \"apng\"\n throw new Error(`Unknown animation format for: ${filename}`)\n}\n","/**\n * The `view` verb — present a {@link Recording}.\n *\n * Phase 3 of the Recording-domain unification (design doc §2, §5). `view` is\n * one of the four recording-domain verbs (record · **view** · play · compare).\n * It collapses what used to be several separate surfaces — the scrubbable HTML\n * viewer, the HTML slideshow, GIF/APNG/animated-SVG export — into a single\n * verb with a `mode`:\n *\n * - `mode: \"scrub\"` — the rich scrubbable HTML viewer (timeline scrub, find,\n * filter, pixel-diff, per-frame metadata). Canonical viewer.\n * - `mode: \"animate\"` — a GIF / APNG / animated-SVG artifact.\n * - `mode: \"web\"` — a browser `view` surface (`@termless/web-player`).\n *\n * Writing a GIF to a file is *not* a separate \"export\" concept — it is just\n * `view` with `mode: \"animate\"` and a file sink. The sink is the destination\n * (a file path, or — in the future — a window); the mode is the presentation.\n *\n * Per-frame rasterization is delegated to the {@link \"./render/index.ts\"}\n * Renderer strategy — `view` never rasterizes a buffer itself.\n */\n\nimport { writeFileSync } from \"node:fs\"\nimport type { Recording } from \"./recording/recording.ts\"\nimport { writeViewer, writeViewerFromRecording, type WriteViewerResult } from \"./view/viewer.ts\"\nimport { renderAnimation, type AnimationFormat } from \"./view/animation.ts\"\nimport { recordingToAnimationFrames, type FromRecordingOptions } from \"./view/from-recording.ts\"\nimport type { Frame as ModelFrame } from \"./recording/recording.ts\"\n\n/** The presentation mode of the `view` verb. */\nexport type ViewMode = \"scrub\" | \"animate\"\n\n/** Options for the scrubbable HTML viewer mode. */\nexport interface ScrubViewOptions {\n mode: \"scrub\"\n /**\n * The frame-trace bundle directory — PNGs are inlined from here, and the\n * generated `viewer.html` is written alongside.\n */\n bundleDir: string\n}\n\n/** Options for the animation-artifact mode (GIF / APNG / animated SVG). */\nexport interface AnimateViewOptions {\n mode: \"animate\"\n /** The animation encoding. */\n format: AnimationFormat\n /** Per-frame SVG renderer — the Renderer strategy for animation frames. */\n renderSvg: (frame: ModelFrame) => string\n /** Destination file path (the file sink). */\n sink: string\n /** Frame-derivation options (trailing duration, duplicate handling). */\n frames?: FromRecordingOptions\n /**\n * The raster renderer for `gif` / `apng` output — `canvas` (high fidelity),\n * `resvg` (cross-platform), or `auto` (default). Ignored for `svg` (vector).\n */\n renderer?: \"canvas\" | \"resvg\" | \"auto\"\n}\n\n/** All `view` verb options, discriminated by `mode`. */\nexport type ViewOptions = ScrubViewOptions | AnimateViewOptions\n\n/**\n * Present a {@link Recording}.\n *\n * - `mode: \"scrub\"` → writes `viewer.html` into `bundleDir`, returns the\n * {@link WriteViewerResult}.\n * - `mode: \"animate\"` → encodes the recording's `frames` projection as a\n * GIF / APNG / animated SVG and writes it to the `sink` path, returning the\n * byte length written.\n *\n * @throws {Error} when the recording has no `frames` projection.\n */\nexport async function view(recording: Recording, options: ScrubViewOptions): Promise<WriteViewerResult>\nexport async function view(recording: Recording, options: AnimateViewOptions): Promise<number>\nexport async function view(recording: Recording, options: ViewOptions): Promise<WriteViewerResult | number> {\n if (options.mode === \"scrub\") {\n return writeViewerFromRecording(recording, options.bundleDir)\n }\n // mode: \"animate\"\n const frames = recordingToAnimationFrames(recording, options.renderSvg, options.frames)\n const artifact = await renderAnimation(frames, options.format, { renderer: options.renderer ?? \"auto\" })\n const bytes = typeof artifact === \"string\" ? Buffer.from(artifact, \"utf-8\") : artifact\n writeFileSync(options.sink, bytes)\n return bytes.byteLength\n}\n\n// Re-export the on-disk-source scrub entry — `writeViewer` parses an existing\n// frame-trace `index.jsonl`, the lower-level path beneath `view(.., {scrub})`.\nexport { writeViewer }\n","/**\n * SVG slideshow viewer — the simple `view` mode.\n *\n * Phase 3 of the Recording-domain unification (design doc §5). The recording\n * domain has **one viewer** — the scrubbable {@link \"./viewer.ts\"} (timeline\n * scrub, find, filter, pixel-diff, frame metadata) is canonical. This\n * slideshow is a distinct *mode* of the same `view` verb, not a second viewer\n * concept: an auto-playing SVG carousel for live captures that have no\n * frame-trace PNG directory to scrub.\n *\n * It consumes an in-memory list of SVG frames (`SlideshowFrame[]`) — produced\n * by `record` capturing `screenshotSvg()` per interval — and emits one\n * self-contained HTML file. No PNGs, no `index.jsonl`, no bundle directory.\n *\n * Browser-side JS lives in the template string below; it is vanilla and\n * build-step-free — the \"no classes / no globals\" rule applies to the .ts\n * side, not the inlined browser code.\n */\n\n/** One captured SVG still on the slideshow timeline. */\nexport interface SlideshowFrame {\n /** Zero-based frame index. */\n index: number\n /** Milliseconds since capture start. */\n timestamp: number\n /** The frame's SVG markup. */\n svg: string\n}\n\n/**\n * Generate a self-contained HTML slideshow from a list of SVG frames.\n *\n * Includes play/pause, prev/next, a frame counter, and a timestamp display.\n * The output is a single file with every frame's SVG inlined — works by\n * double-clicking with no server.\n */\nexport function generateSlideshow(frames: SlideshowFrame[], intervalMs: number): string {\n if (frames.length === 0) {\n return `<!DOCTYPE html>\n<html><head><title>termless recording</title></head>\n<body><p>No frames recorded.</p></body></html>`\n }\n\n const escapedFrames = frames.map((f) => ({\n index: f.index,\n timestamp: f.timestamp,\n svg: f.svg,\n }))\n\n // Build inline SVG divs — one per frame, hidden by default except the first\n const frameDivs = escapedFrames\n .map((f, i) => `<div class=\"frame\" id=\"frame-${i}\" style=\"display:${i === 0 ? \"block\" : \"none\"}\">${f.svg}</div>`)\n .join(\"\\n\")\n\n const timestamps = JSON.stringify(escapedFrames.map((f) => f.timestamp))\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>termless recording</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { background: #1e1e1e; color: #d4d4d4; font-family: system-ui, sans-serif; display: flex; flex-direction: column; align-items: center; padding: 20px; }\n .player { position: relative; }\n .frame svg { display: block; }\n .controls { display: flex; align-items: center; gap: 12px; margin-top: 12px; padding: 8px 16px; background: #2d2d2d; border-radius: 6px; }\n .controls button { background: #3d3d3d; color: #d4d4d4; border: 1px solid #555; border-radius: 4px; padding: 4px 12px; cursor: pointer; font-size: 14px; }\n .controls button:hover { background: #4d4d4d; }\n .info { font-size: 13px; color: #888; }\n kbd { background: #3d3d3d; border: 1px solid #555; border-radius: 3px; padding: 1px 5px; font-size: 12px; }\n</style>\n</head>\n<body>\n<div class=\"player\">\n${frameDivs}\n</div>\n<div class=\"controls\">\n <button id=\"prev-btn\" title=\"Previous frame\">&larr;</button>\n <button id=\"play-btn\" title=\"Play/Pause\">Pause</button>\n <button id=\"next-btn\" title=\"Next frame\">&rarr;</button>\n <span class=\"info\" id=\"frame-info\">Frame 1 / ${frames.length}</span>\n <span class=\"info\" id=\"time-info\">0ms</span>\n <span class=\"info\"><kbd>&larr;</kbd> <kbd>&rarr;</kbd> <kbd>Space</kbd></span>\n</div>\n<script>\n(function() {\n const totalFrames = ${frames.length};\n const timestamps = ${timestamps};\n const interval = ${intervalMs};\n let current = 0;\n let playing = true;\n let timer = null;\n\n const playBtn = document.getElementById(\"play-btn\");\n const prevBtn = document.getElementById(\"prev-btn\");\n const nextBtn = document.getElementById(\"next-btn\");\n const frameInfo = document.getElementById(\"frame-info\");\n const timeInfo = document.getElementById(\"time-info\");\n\n function showFrame(idx) {\n document.getElementById(\"frame-\" + current).style.display = \"none\";\n current = idx;\n document.getElementById(\"frame-\" + current).style.display = \"block\";\n frameInfo.textContent = \"Frame \" + (current + 1) + \" / \" + totalFrames;\n timeInfo.textContent = timestamps[current] + \"ms\";\n }\n\n function nextFrame() {\n showFrame((current + 1) % totalFrames);\n }\n\n function prevFrame() {\n showFrame((current - 1 + totalFrames) % totalFrames);\n }\n\n function startPlayback() {\n if (timer) return;\n playing = true;\n playBtn.textContent = \"Pause\";\n timer = setInterval(nextFrame, interval);\n }\n\n function stopPlayback() {\n playing = false;\n playBtn.textContent = \"Play\";\n if (timer) { clearInterval(timer); timer = null; }\n }\n\n function togglePlayback() {\n if (playing) stopPlayback(); else startPlayback();\n }\n\n playBtn.addEventListener(\"click\", togglePlayback);\n prevBtn.addEventListener(\"click\", function() { stopPlayback(); prevFrame(); });\n nextBtn.addEventListener(\"click\", function() { stopPlayback(); nextFrame(); });\n\n document.addEventListener(\"keydown\", function(e) {\n if (e.key === \"ArrowLeft\") { stopPlayback(); prevFrame(); }\n else if (e.key === \"ArrowRight\") { stopPlayback(); nextFrame(); }\n else if (e.key === \" \") { e.preventDefault(); togglePlayback(); }\n });\n\n startPlayback();\n})();\n</script>\n</body>\n</html>`\n}\n","/**\n * Pure assertion functions for terminal testing.\n *\n * These are test-runner-agnostic: they return { pass, message } objects\n * that any matcher wrapper (vitest, jest, bun:test, node:test) can use.\n *\n * Three categories match the composable API:\n * - Region assertions: operate on RegionView (getText, getLines, containsText)\n * - Cell assertions: operate on CellView (bold, italic, fg, bg, etc.)\n * - Terminal assertions: operate on TerminalReadable (cursor, modes, scrollback)\n */\n\nimport type {\n CellView,\n CursorStyle,\n OutputView,\n RegionView,\n RGB,\n TerminalMode,\n TerminalReadable,\n UnderlineStyle,\n} from \"./terminal/types.ts\"\n\n// ═══════════════════════════════════════════════════════\n// Result Type\n// ═══════════════════════════════════════════════════════\n\nexport interface AssertionResult {\n pass: boolean\n message: string\n expected?: unknown\n actual?: unknown\n}\n\n// ═══════════════════════════════════════════════════════\n// Type Guards\n// ═══════════════════════════════════════════════════════\n\nexport function isRegionView(value: unknown): value is RegionView {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"containsText\" in value &&\n typeof (value as Record<string, unknown>).containsText === \"function\"\n )\n}\n\nexport function isOutputView(value: unknown): value is OutputView {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"containsOutput\" in value &&\n typeof (value as Record<string, unknown>).containsOutput === \"function\" &&\n \"getText\" in value &&\n typeof (value as Record<string, unknown>).getText === \"function\"\n )\n}\n\nexport function isCellView(value: unknown): value is CellView {\n return (\n value !== null && typeof value === \"object\" && \"bold\" in value && \"fg\" in value && \"row\" in value && \"col\" in value\n )\n}\n\nexport function isTerminalReadable(value: unknown): value is TerminalReadable {\n if (value === null || value === undefined) return false\n // Accept both objects and functions — Proxy-based wrappers (silvery Term)\n // use a function target for callability, so typeof returns \"function\"\n if (typeof value !== \"object\" && typeof value !== \"function\") return false\n return \"getCell\" in value && \"getCursor\" in value && \"getMode\" in value\n}\n\n// ═══════════════════════════════════════════════════════\n// Type Assertions (throw on wrong type)\n// ═══════════════════════════════════════════════════════\n\nexport function assertRegionView(value: unknown, matcherName: string): asserts value is RegionView {\n if (isRegionView(value)) return\n if (isTerminalReadable(value)) {\n throw new Error(\n `${matcherName} requires a region. Use term.screen, term.buffer, or term.scrollback. ` +\n `Example: expect(term.screen).${matcherName}(...)`,\n )\n }\n throw new Error(\n `${matcherName} requires a RegionView (an object with containsText, getText, getLines). ` + `Got ${typeof value}.`,\n )\n}\n\nexport function assertCellView(value: unknown, matcherName: string): asserts value is CellView {\n if (isCellView(value)) return\n throw new Error(\n `${matcherName} expects a CellView. Use term.cell(row, col). ` +\n `Example: expect(term.cell(0, 0)).${matcherName}()`,\n )\n}\n\nexport function assertOutputView(value: unknown, matcherName: string): asserts value is OutputView {\n if (isOutputView(value)) return\n if (isTerminalReadable(value)) {\n throw new Error(`${matcherName} requires raw output. Use term.out. Example: expect(term.out).${matcherName}(...)`)\n }\n throw new Error(\n `${matcherName} requires an OutputView (an object with containsOutput and getText). ` + `Got ${typeof value}.`,\n )\n}\n\nexport function assertTerminalReadable(value: unknown, matcherName: string): asserts value is TerminalReadable {\n if (isTerminalReadable(value)) return\n throw new Error(\n `${matcherName} expects a TerminalReadable, got ${typeof value}. ` +\n `Pass an object with getCell(), getCursor(), and getMode() methods.`,\n )\n}\n\n// ═══════════════════════════════════════════════════════\n// Color Helpers\n// ═══════════════════════════════════════════════════════\n\nexport function parseColor(color: string | RGB): RGB {\n if (typeof color === \"object\") return color\n const hex = color.replace(\"#\", \"\")\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n}\n\nexport function colorsMatch(a: RGB | null, b: RGB): boolean {\n if (!a) return false\n return a.r === b.r && a.g === b.g && a.b === b.b\n}\n\nexport function formatRgb(color: RGB | null): string {\n if (!color) return \"null\"\n return `#${color.r.toString(16).padStart(2, \"0\")}${color.g.toString(16).padStart(2, \"0\")}${color.b.toString(16).padStart(2, \"0\")}`\n}\n\n// ═══════════════════════════════════════════════════════\n// Region Assertions (RegionView)\n// ═══════════════════════════════════════════════════════\n\n/** Assert region contains the given text as a substring. */\nexport function assertContainsText(region: RegionView, text: string): AssertionResult {\n const pass = region.containsText(text)\n const content = region.getText()\n return {\n pass,\n message: pass\n ? `Expected region not to contain \"${text}\"\\n\\nContent:\\n${content}`\n : `Expected region to contain \"${text}\"\\n\\nContent:\\n${content}`,\n }\n}\n\n/** Assert region text matches exactly after trimming. */\nexport function assertHasText(region: RegionView, text: string): AssertionResult {\n const actual = region.getText().trim()\n const pass = actual === text\n return {\n pass,\n message: pass\n ? `Expected region text not to be \"${text}\"`\n : `Expected region text to be \"${text}\"\\n\\nActual: \"${actual}\"`,\n expected: text,\n actual,\n }\n}\n\n/** Assert region lines match expected lines (trailing whitespace trimmed per line). */\nexport function assertMatchesLines(region: RegionView, expectedLines: string[]): AssertionResult {\n const actualLines = region.getLines().map((l) => l.trimEnd())\n\n const maxLen = Math.max(actualLines.length, expectedLines.length)\n const mismatches: string[] = []\n for (let i = 0; i < maxLen; i++) {\n const actual = actualLines[i] ?? \"\"\n const expected = expectedLines[i] ?? \"\"\n if (actual !== expected) {\n mismatches.push(` line ${i}: expected \"${expected}\" got \"${actual}\"`)\n }\n }\n\n const pass = mismatches.length === 0\n return {\n pass,\n message: pass\n ? `Expected region lines not to match the given lines`\n : `Region line mismatch:\\n${mismatches.join(\"\\n\")}`,\n expected: expectedLines,\n actual: actualLines,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Output Assertions (OutputView)\n// ═══════════════════════════════════════════════════════\n\n/** Assert the raw output stream contains the given protocol/text bytes. */\nexport function assertContainsOutput(out: OutputView, text: string): AssertionResult {\n const pass = out.containsOutput(text)\n const content = out.getText()\n return {\n pass,\n message: pass\n ? `Expected raw output not to contain \"${text}\"\\n\\nOutput:\\n${content}`\n : `Expected raw output to contain \"${text}\"\\n\\nOutput:\\n${content}`,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Cell Assertions (CellView)\n// ═══════════════════════════════════════════════════════\n\nfunction cellLocation(cell: CellView): string {\n return `cell (${cell.row},${cell.col}) containing '${cell.char}'`\n}\n\n/** Assert cell is bold. */\nexport function assertIsBold(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.bold,\n message: cell.bold ? `Expected ${loc} not to be bold` : `Expected ${loc} to be bold`,\n }\n}\n\n/** Assert cell is italic. */\nexport function assertIsItalic(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.italic,\n message: cell.italic ? `Expected ${loc} not to be italic` : `Expected ${loc} to be italic`,\n }\n}\n\n/** Assert cell is dim. */\nexport function assertIsDim(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.dim,\n message: cell.dim ? `Expected ${loc} not to be dim` : `Expected ${loc} to be dim`,\n }\n}\n\n/** Assert cell has strikethrough. */\nexport function assertIsStrikethrough(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.strikethrough,\n message: cell.strikethrough ? `Expected ${loc} not to be strikethrough` : `Expected ${loc} to be strikethrough`,\n }\n}\n\n/** Assert cell has inverse video. */\nexport function assertIsInverse(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.inverse,\n message: cell.inverse ? `Expected ${loc} not to be inverse` : `Expected ${loc} to be inverse`,\n }\n}\n\n/** Assert cell is wide (double-width character). */\nexport function assertIsWide(cell: CellView): AssertionResult {\n const loc = cellLocation(cell)\n return {\n pass: cell.wide,\n message: cell.wide ? `Expected ${loc} not to be wide` : `Expected ${loc} to be wide`,\n }\n}\n\n/** Assert cell has underline. Optionally check specific style. */\nexport function assertHasUnderline(cell: CellView, style?: UnderlineStyle): AssertionResult {\n const loc = cellLocation(cell)\n const hasUnderline = cell.underline !== false\n const pass = style ? cell.underline === style : hasUnderline\n\n let message: string\n if (style) {\n message = pass\n ? `Expected ${loc} not to have underline style \"${style}\"`\n : `Expected ${loc} underline to be \"${style}\", got \"${cell.underline}\"`\n } else {\n message = pass\n ? `Expected ${loc} not to be underlined`\n : `Expected ${loc} to be underlined, got \"${cell.underline}\"`\n }\n\n return { pass, message, expected: style ?? \"any underline\", actual: cell.underline }\n}\n\n/** Assert cell foreground color. Accepts hex string or {r,g,b}. */\nexport function assertHasFg(cell: CellView, color: string | RGB): AssertionResult {\n const loc = cellLocation(cell)\n const expected = parseColor(color)\n const pass = colorsMatch(cell.fg, expected)\n return {\n pass,\n message: pass\n ? `Expected ${loc} not to have fg ${formatRgb(expected)}`\n : `Expected ${loc} fg to be ${formatRgb(expected)}, got ${formatRgb(cell.fg)}`,\n expected: formatRgb(expected),\n actual: formatRgb(cell.fg),\n }\n}\n\n/** Assert cell background color. Accepts hex string or {r,g,b}. */\nexport function assertHasBg(cell: CellView, color: string | RGB): AssertionResult {\n const loc = cellLocation(cell)\n const expected = parseColor(color)\n const pass = colorsMatch(cell.bg, expected)\n return {\n pass,\n message: pass\n ? `Expected ${loc} not to have bg ${formatRgb(expected)}`\n : `Expected ${loc} bg to be ${formatRgb(expected)}, got ${formatRgb(cell.bg)}`,\n expected: formatRgb(expected),\n actual: formatRgb(cell.bg),\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Composable Cell Assertion (CellView)\n// ═══════════════════════════════════════════════════════\n\n/** Partial cell attributes for composable matching. */\nexport interface CellAttrs {\n bold?: boolean\n italic?: boolean\n dim?: boolean\n strikethrough?: boolean\n inverse?: boolean\n wide?: boolean\n /** `true` matches any underline style; a string matches a specific style. */\n underline?: UnderlineStyle | boolean\n fg?: string | RGB\n bg?: string | RGB\n}\n\n/** Assert multiple cell attributes at once. Only specified fields are checked. */\nexport function assertHaveAttrs(cell: CellView, attrs: CellAttrs): AssertionResult {\n const loc = cellLocation(cell)\n const details: string[] = []\n let allMatch = true\n\n const check = (label: string, expected: unknown, actual: unknown, pass: boolean) => {\n if (pass) {\n details.push(` ${label}: matched`)\n } else {\n details.push(` ${label}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`)\n allMatch = false\n }\n }\n\n if (attrs.bold !== undefined) check(\"bold\", attrs.bold, cell.bold, cell.bold === attrs.bold)\n if (attrs.italic !== undefined) check(\"italic\", attrs.italic, cell.italic, cell.italic === attrs.italic)\n if (attrs.dim !== undefined) check(\"dim\", attrs.dim, cell.dim, cell.dim === attrs.dim)\n if (attrs.strikethrough !== undefined)\n check(\"strikethrough\", attrs.strikethrough, cell.strikethrough, cell.strikethrough === attrs.strikethrough)\n if (attrs.inverse !== undefined) check(\"inverse\", attrs.inverse, cell.inverse, cell.inverse === attrs.inverse)\n if (attrs.wide !== undefined) check(\"wide\", attrs.wide, cell.wide, cell.wide === attrs.wide)\n\n if (attrs.underline !== undefined) {\n if (attrs.underline === true) {\n const hasUnderline = cell.underline !== false\n check(\"underline\", true, cell.underline, hasUnderline)\n } else {\n check(\"underline\", attrs.underline, cell.underline, cell.underline === attrs.underline)\n }\n }\n\n if (attrs.fg !== undefined) {\n const expected = parseColor(attrs.fg)\n const pass = colorsMatch(cell.fg, expected)\n check(\"fg\", formatRgb(expected), formatRgb(cell.fg), pass)\n }\n\n if (attrs.bg !== undefined) {\n const expected = parseColor(attrs.bg)\n const pass = colorsMatch(cell.bg, expected)\n check(\"bg\", formatRgb(expected), formatRgb(cell.bg), pass)\n }\n\n const attrsStr = JSON.stringify(attrs)\n return {\n pass: allMatch,\n message: allMatch\n ? `Expected ${loc} not to have attrs ${attrsStr}`\n : `Expected ${loc} to have attrs ${attrsStr}\\n${details.join(\"\\n\")}`,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Terminal Assertions (TerminalReadable)\n// ═══════════════════════════════════════════════════════\n\n/** Assert cursor is at the given position. */\nexport function assertCursorAt(term: TerminalReadable, x: number, y: number): AssertionResult {\n const cursor = term.getCursor()\n const pass = cursor.x === x && cursor.y === y\n return {\n pass,\n message: pass\n ? `Expected cursor not to be at (${x},${y})`\n : `Expected cursor at (${x},${y}), got (${cursor.x},${cursor.y})`,\n expected: { x, y },\n actual: { x: cursor.x, y: cursor.y },\n }\n}\n\n/** Assert cursor has a specific style (block, underline, beam). */\nexport function assertCursorStyle(term: TerminalReadable, style: CursorStyle): AssertionResult {\n const cursor = term.getCursor()\n if (cursor.style === null) {\n return {\n pass: false,\n message: `Expected cursor style to be \"${style}\", but backend does not report cursor style (null)`,\n expected: style,\n actual: null,\n }\n }\n const pass = cursor.style === style\n return {\n pass,\n message: pass\n ? `Expected cursor style not to be \"${style}\"`\n : `Expected cursor style to be \"${style}\", got \"${cursor.style}\"`,\n expected: style,\n actual: cursor.style,\n }\n}\n\n/** Assert cursor is visible. */\nexport function assertCursorVisible(term: TerminalReadable): AssertionResult {\n const cursor = term.getCursor()\n if (cursor.visible === null) {\n return {\n pass: false,\n message: `Expected cursor to be visible, but backend does not report cursor visibility (null)`,\n }\n }\n return {\n pass: cursor.visible,\n message: cursor.visible ? `Expected cursor not to be visible` : `Expected cursor to be visible`,\n }\n}\n\n/** Assert cursor is hidden. */\nexport function assertCursorHidden(term: TerminalReadable): AssertionResult {\n const cursor = term.getCursor()\n if (cursor.visible === null) {\n return {\n pass: false,\n message: `Expected cursor to be hidden, but backend does not report cursor visibility (null)`,\n }\n }\n return {\n pass: !cursor.visible,\n message: !cursor.visible ? `Expected cursor not to be hidden` : `Expected cursor to be hidden`,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Composable Cursor Assertion (TerminalReadable)\n// ═══════════════════════════════════════════════════════\n\n/** Partial cursor properties for composable matching. */\nexport interface CursorProps {\n x?: number\n y?: number\n visible?: boolean\n style?: CursorStyle\n}\n\n/** Assert multiple cursor properties at once. Only specified fields are checked. */\nexport function assertHaveCursor(term: TerminalReadable, props: CursorProps): AssertionResult {\n const cursor = term.getCursor()\n const details: string[] = []\n let allMatch = true\n\n const check = (label: string, expected: unknown, actual: unknown, pass: boolean) => {\n if (pass) {\n details.push(` ${label}: matched`)\n } else {\n details.push(` ${label}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`)\n allMatch = false\n }\n }\n\n if (props.x !== undefined) check(\"x\", props.x, cursor.x, cursor.x === props.x)\n if (props.y !== undefined) check(\"y\", props.y, cursor.y, cursor.y === props.y)\n\n if (props.visible !== undefined) {\n if (cursor.visible === null) {\n details.push(\n ` visible: expected ${JSON.stringify(props.visible)}, but backend does not report cursor visibility (null)`,\n )\n allMatch = false\n } else {\n check(\"visible\", props.visible, cursor.visible, cursor.visible === props.visible)\n }\n }\n\n if (props.style !== undefined) {\n if (cursor.style === null) {\n details.push(` style: expected ${JSON.stringify(props.style)}, but backend does not report cursor style (null)`)\n allMatch = false\n } else {\n check(\"style\", props.style, cursor.style, cursor.style === props.style)\n }\n }\n\n const propsStr = JSON.stringify(props)\n return {\n pass: allMatch,\n message: allMatch\n ? `Expected terminal not to have cursor ${propsStr}`\n : `Expected terminal to have cursor ${propsStr}\\n${details.join(\"\\n\")}`,\n }\n}\n\n/** Assert a specific terminal mode is enabled. */\nexport function assertInMode(term: TerminalReadable, mode: TerminalMode): AssertionResult {\n const pass = term.getMode(mode)\n return {\n pass,\n message: pass ? `Expected terminal not to be in mode \"${mode}\"` : `Expected terminal to be in mode \"${mode}\"`,\n }\n}\n\n/** Assert terminal has a specific title (set via OSC escape). */\nexport function assertTitle(term: TerminalReadable, title: string): AssertionResult {\n const actual = term.getTitle()\n const pass = actual === title\n return {\n pass,\n message: pass\n ? `Expected terminal title not to be \"${title}\"`\n : `Expected terminal title to be \"${title}\", got \"${actual}\"`,\n expected: title,\n actual,\n }\n}\n\n/** Assert scrollback has a specific number of lines (excluding visible screen lines). */\nexport function assertScrollbackLines(term: TerminalReadable, n: number): AssertionResult {\n const scrollback = term.getScrollback()\n const scrollbackLines = Math.max(0, scrollback.totalLines - scrollback.screenLines)\n const pass = scrollbackLines === n\n return {\n pass,\n message: pass\n ? `Expected scrollback not to have ${n} lines`\n : `Expected scrollback to have ${n} lines, got ${scrollbackLines}`,\n expected: n,\n actual: scrollbackLines,\n }\n}\n\n/** Assert viewport is at the bottom of scrollback (viewing the latest output). */\nexport function assertAtBottomOfScrollback(term: TerminalReadable): AssertionResult {\n const scrollback = term.getScrollback()\n const bottomOffset = scrollback.totalLines - scrollback.screenLines\n const pass = scrollback.viewportOffset === bottomOffset\n return {\n pass,\n message: pass\n ? `Expected terminal not to be at bottom of scrollback`\n : `Expected terminal to be at bottom of scrollback (viewportOffset=${bottomOffset}), got ${scrollback.viewportOffset}`,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Clipboard Assertions\n// ═══════════════════════════════════════════════════════\n\n/** Assert that the terminal has captured a specific clipboard text via OSC 52. */\nexport function assertClipboardText(clipboardWrites: readonly string[], expected: string): AssertionResult {\n const pass = clipboardWrites.includes(expected)\n return {\n pass,\n message: pass\n ? `Expected clipboard not to contain \"${expected}\"`\n : clipboardWrites.length === 0\n ? `Expected clipboard to contain \"${expected}\", but no OSC 52 writes were captured`\n : `Expected clipboard to contain \"${expected}\", but captured: ${JSON.stringify(clipboardWrites)}`,\n expected,\n actual: clipboardWrites,\n }\n}\n","/**\n * Jest/Bun-compatible matcher adapter for terminal testing.\n *\n * Wraps the pure assertion functions from ./assertions.ts into the\n * Jest `expect.extend()` format. Works with Jest, Bun test, and any\n * runner that supports `expect.extend({ matcherName(received, ...args) })`.\n *\n * Usage:\n * import { termlessMatchers } from \"@termless/core\"\n * expect.extend(termlessMatchers)\n *\n * // Then use matchers:\n * expect(term.screen).toContainText(\"Hello\")\n * expect(term.cell(0, 0)).toBeBold()\n * expect(term).toHaveCursorAt(5, 10)\n */\n\nimport type { CursorStyle, RGB, TerminalMode, UnderlineStyle } from \"./terminal/types.ts\"\nimport {\n assertRegionView,\n assertCellView,\n assertTerminalReadable,\n assertContainsText,\n assertHasText,\n assertMatchesLines,\n assertIsBold,\n assertIsItalic,\n assertIsDim,\n assertIsStrikethrough,\n assertIsInverse,\n assertIsWide,\n assertHasUnderline,\n assertHasFg,\n assertHasBg,\n assertHaveAttrs,\n assertCursorAt,\n assertCursorStyle,\n assertCursorVisible,\n assertCursorHidden,\n assertHaveCursor,\n assertInMode,\n assertTitle,\n assertScrollbackLines,\n assertAtBottomOfScrollback,\n type AssertionResult,\n type CellAttrs,\n type CursorProps,\n} from \"./assertions.ts\"\n\n/** Convert an AssertionResult to the { pass, message() } format Jest/vitest expect. */\nfunction toMatcherResult(result: AssertionResult) {\n return {\n pass: result.pass,\n message: () => result.message,\n }\n}\n\n/**\n * Options accepted by the {@link termlessMatchers.toMatchAcrossRenderers}\n * matcher. The matcher forwards these straight to `captureCrossRenderer`, so\n * the surface is `CrossRendererOptions` (minus `cols`/`rows` — the matcher\n * fills those from the terminal) plus the matcher-only `dimensionTolerance`.\n */\nexport type ToMatchAcrossRenderersOptions = Omit<import(\"./compare.ts\").CrossRendererOptions, \"cols\" | \"rows\"> & {\n /** Max canvas-vs-svg dimension drift before the matcher fails. Default 0.10. */\n dimensionTolerance?: number\n}\n\n/**\n * Terminal matchers compatible with Jest's `expect.extend()`.\n * Also works with Bun test and any Jest-compatible expect implementation.\n *\n * @example\n * ```typescript\n * import { termlessMatchers } from \"@termless/core\"\n * expect.extend(termlessMatchers)\n * ```\n */\nexport const termlessMatchers = {\n // ── Text Matchers (RegionView) ──\n\n toContainText(received: unknown, text: string) {\n assertRegionView(received, \"toContainText\")\n return toMatcherResult(assertContainsText(received, text))\n },\n\n toHaveText(received: unknown, text: string) {\n assertRegionView(received, \"toHaveText\")\n return toMatcherResult(assertHasText(received, text))\n },\n\n toMatchLines(received: unknown, lines: string[]) {\n assertRegionView(received, \"toMatchLines\")\n return toMatcherResult(assertMatchesLines(received, lines))\n },\n\n // ── Cell Style Matchers (CellView) ──\n\n /** Assert multiple cell attributes at once. */\n toHaveAttrs(received: unknown, attrs: CellAttrs) {\n assertCellView(received, \"toHaveAttrs\")\n return toMatcherResult(assertHaveAttrs(received, attrs))\n },\n\n /** @deprecated Use toHaveAttrs({ bold: true }) */\n toBeBold(received: unknown) {\n assertCellView(received, \"toBeBold\")\n return toMatcherResult(assertIsBold(received))\n },\n\n /** @deprecated Use toHaveAttrs({ italic: true }) */\n toBeItalic(received: unknown) {\n assertCellView(received, \"toBeItalic\")\n return toMatcherResult(assertIsItalic(received))\n },\n\n /** @deprecated Use toHaveAttrs({ dim: true }) */\n toBeDim(received: unknown) {\n assertCellView(received, \"toBeDim\")\n return toMatcherResult(assertIsDim(received))\n },\n\n /** @deprecated Use toHaveAttrs({ strikethrough: true }) */\n toBeStrikethrough(received: unknown) {\n assertCellView(received, \"toBeStrikethrough\")\n return toMatcherResult(assertIsStrikethrough(received))\n },\n\n /** @deprecated Use toHaveAttrs({ inverse: true }) */\n toBeInverse(received: unknown) {\n assertCellView(received, \"toBeInverse\")\n return toMatcherResult(assertIsInverse(received))\n },\n\n /** @deprecated Use toHaveAttrs({ wide: true }) */\n toBeWide(received: unknown) {\n assertCellView(received, \"toBeWide\")\n return toMatcherResult(assertIsWide(received))\n },\n\n /** @deprecated Use toHaveAttrs({ underline: true }) or toHaveAttrs({ underline: \"curly\" }) */\n toHaveUnderline(received: unknown, style?: UnderlineStyle) {\n assertCellView(received, \"toHaveUnderline\")\n return toMatcherResult(assertHasUnderline(received, style))\n },\n\n /** @deprecated Use toHaveAttrs({ fg: color }) */\n toHaveFg(received: unknown, color: string | RGB) {\n assertCellView(received, \"toHaveFg\")\n return toMatcherResult(assertHasFg(received, color))\n },\n\n /** @deprecated Use toHaveAttrs({ bg: color }) */\n toHaveBg(received: unknown, color: string | RGB) {\n assertCellView(received, \"toHaveBg\")\n return toMatcherResult(assertHasBg(received, color))\n },\n\n // ── Terminal Matchers (TerminalReadable) ──\n\n /** Assert multiple cursor properties at once. */\n toHaveCursor(received: unknown, props: CursorProps) {\n assertTerminalReadable(received, \"toHaveCursor\")\n return toMatcherResult(assertHaveCursor(received, props))\n },\n\n /** @deprecated Use toHaveCursor({ x, y }) */\n toHaveCursorAt(received: unknown, x: number, y: number) {\n assertTerminalReadable(received, \"toHaveCursorAt\")\n return toMatcherResult(assertCursorAt(received, x, y))\n },\n\n /** @deprecated Use toHaveCursor({ style }) */\n toHaveCursorStyle(received: unknown, style: CursorStyle) {\n assertTerminalReadable(received, \"toHaveCursorStyle\")\n return toMatcherResult(assertCursorStyle(received, style))\n },\n\n /** @deprecated Use toHaveCursor({ visible: true }) */\n toHaveCursorVisible(received: unknown) {\n assertTerminalReadable(received, \"toHaveCursorVisible\")\n return toMatcherResult(assertCursorVisible(received))\n },\n\n /** @deprecated Use toHaveCursor({ visible: false }) */\n toHaveCursorHidden(received: unknown) {\n assertTerminalReadable(received, \"toHaveCursorHidden\")\n return toMatcherResult(assertCursorHidden(received))\n },\n\n toBeInMode(received: unknown, mode: TerminalMode) {\n assertTerminalReadable(received, \"toBeInMode\")\n return toMatcherResult(assertInMode(received, mode))\n },\n\n toHaveTitle(received: unknown, title: string) {\n assertTerminalReadable(received, \"toHaveTitle\")\n return toMatcherResult(assertTitle(received, title))\n },\n\n toHaveScrollbackLines(received: unknown, n: number) {\n assertTerminalReadable(received, \"toHaveScrollbackLines\")\n return toMatcherResult(assertScrollbackLines(received, n))\n },\n\n toBeAtBottomOfScrollback(received: unknown) {\n assertTerminalReadable(received, \"toBeAtBottomOfScrollback\")\n return toMatcherResult(assertAtBottomOfScrollback(received))\n },\n\n // ── Cross-Renderer Matcher ────────────────────────────────────\n /**\n * Capture the terminal's current buffer state via canvas + SVG (and\n * optionally peekaboo against a real terminal app), then assert the\n * three renderings agree on cell-grid dimensions + content. Saves all\n * three to `saveTo` for visual review.\n *\n * Hard invariant (always asserted):\n * - SVG's natural dimensions match canvas's logical dimensions\n * within `dimensionTolerance` (default 0.10 — 10%). Different DPRs\n * and cell-pixel defaults make exact match impossible without\n * unifying all parameters.\n *\n * Soft assertions (warn-only via report.notes when set):\n * - Peekaboo dimensions roughly match expected window size\n * (window chrome adds 60-100px height typically)\n *\n * @example\n * ```ts\n * await expect(term).toMatchAcrossRenderers({\n * command: [\"bash\", \"-c\", \"echo hello\"],\n * saveTo: \"/tmp/diff\",\n * includePeekaboo: process.env.PEEKABOO === \"1\",\n * })\n * ```\n */\n async toMatchAcrossRenderers(\n received: unknown,\n options: ToMatchAcrossRenderersOptions = {},\n ): Promise<{ pass: boolean; message: () => string }> {\n assertTerminalReadable(received, \"toMatchAcrossRenderers\")\n const { captureCrossRenderer } = await import(\"./compare.ts\")\n const term = received as import(\"./terminal/types.ts\").Terminal\n const result = await captureCrossRenderer(term, {\n ...options,\n cols: term.cols,\n rows: term.rows,\n })\n const tol = options.dimensionTolerance ?? 0.1\n const canvas = result.report.dimensions.canvas\n const svg = result.report.dimensions.svg\n\n if (!canvas || !svg) {\n return {\n pass: false,\n message: () =>\n `toMatchAcrossRenderers: one renderer failed to produce dimensions (canvas=${canvas ? \"ok\" : \"null\"}, svg=${svg ? \"ok\" : \"null\"})`,\n }\n }\n\n // Canvas pixels are CSS-logical-px × DPR; SVG is plain logical px.\n // Try DPR=2 first (typical), pick whichever produces the closest\n // match — robust without plumbing meta through.\n let bestMatch = { dpr: 2, widthRatio: 1, heightRatio: 1 }\n for (const dpr of [2, 1]) {\n const cw = canvas.width / dpr\n const ch = canvas.height / dpr\n const wr = Math.abs(cw - svg.width) / Math.max(cw, svg.width)\n const hr = Math.abs(ch - svg.height) / Math.max(ch, svg.height)\n if (wr + hr < bestMatch.widthRatio + bestMatch.heightRatio) {\n bestMatch = { dpr, widthRatio: wr, heightRatio: hr }\n }\n }\n const widthRatio = bestMatch.widthRatio\n const heightRatio = bestMatch.heightRatio\n const canvasLogical = { width: canvas.width / bestMatch.dpr, height: canvas.height / bestMatch.dpr }\n\n const dimensionOk = widthRatio <= tol && heightRatio <= tol\n if (!dimensionOk) {\n const lines = [\n `toMatchAcrossRenderers: canvas vs svg dimension drift exceeds tolerance ${tol}:`,\n ` canvas: ${canvas.width}×${canvas.height} px (logical ${canvasLogical.width}×${canvasLogical.height})`,\n ` svg: ${svg.width}×${svg.height} px`,\n ` width drift: ${(widthRatio * 100).toFixed(1)}%`,\n ` height drift: ${(heightRatio * 100).toFixed(1)}%`,\n ]\n if (result.report.files) {\n lines.push(` diff bundle: ${result.report.files.report}`)\n }\n return { pass: false, message: () => lines.join(\"\\n\") }\n }\n\n return {\n pass: true,\n message: () =>\n `Expected canvas + svg to differ by more than ${tol}, got widthDrift=${(widthRatio * 100).toFixed(1)}%, heightDrift=${(heightRatio * 100).toFixed(1)}%`,\n }\n },\n}\n\n// ── Vitest type augmentation ────────────────────────────────────\n// `toMatchAcrossRenderers` is the only termless matcher consumed via\n// `expect(x).toMatchAcrossRenderers(...)` (the rest are plain assertion\n// functions in assertions.ts). Augment vitest's Assertion + Matchers\n// interfaces so `tsc` knows about it once `expect.extend(termlessMatchers)`\n// has run. Without this, typecheck fails with TS2339 on every call site.\n// `toMatchAcrossRenderers` is registered via `expect.extend(termlessMatchers)`\n// at runtime; this augmentation tells `tsc` about it. The `Matchers<T>`\n// interface is the custom-matcher extension point — it is *declared* in\n// `@vitest/expect` (vitest only re-exports the type), and `Assertion<T>`\n// (what `expect()` returns) extends it. Augmenting `\"vitest\"` would create a\n// fresh, unmerged interface and TS2339 would persist on every call site, so\n// the augmentation must target `@vitest/expect` directly — declared as a\n// devDependency for that reason. The `<T = any>` default must match vitest's\n// own declaration exactly, otherwise TS2428 (\"identical type parameters\").\ndeclare module \"@vitest/expect\" {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars\n interface Matchers<T = any> {\n toMatchAcrossRenderers(options?: ToMatchAcrossRenderersOptions): Promise<void>\n }\n}\n","/**\n * Visual diff between two terminal buffers.\n *\n * Compares two TerminalReadable instances cell-by-cell and produces a\n * structured diff result plus a human-readable formatted string.\n */\n\nimport type { Cell, RGB, TerminalReadable, UnderlineStyle } from \"./types.ts\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** A single cell difference between two buffers. */\nexport interface CellDiff {\n row: number\n col: number\n old: CellSummary\n new: CellSummary\n}\n\n/** Compact representation of a cell's visible properties. */\nexport interface CellSummary {\n char: string\n fg: RGB | null\n bg: RGB | null\n bold: boolean\n italic: boolean\n underline: UnderlineStyle\n}\n\n/** Result of comparing two terminal buffers. */\nexport interface DiffResult {\n /** Whether the buffers are identical. */\n equal: boolean\n /** Positions that differ, with old and new cell values. */\n diffs: CellDiff[]\n /** Human-readable formatted diff string. */\n formatted: string\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction cellToSummary(cell: Cell): CellSummary {\n return {\n char: cell.char,\n fg: cell.fg,\n bg: cell.bg,\n bold: cell.bold,\n italic: cell.italic,\n underline: cell.underline,\n }\n}\n\nfunction cellsEqual(a: Cell, b: Cell): boolean {\n return (\n a.char === b.char &&\n rgbEqual(a.fg, b.fg) &&\n rgbEqual(a.bg, b.bg) &&\n a.bold === b.bold &&\n a.dim === b.dim &&\n a.italic === b.italic &&\n a.underline === b.underline &&\n a.underlineColor === b.underlineColor &&\n a.strikethrough === b.strikethrough &&\n a.inverse === b.inverse &&\n a.blink === b.blink &&\n a.hidden === b.hidden &&\n a.wide === b.wide &&\n a.continuation === b.continuation &&\n a.hyperlink === b.hyperlink\n )\n}\n\nfunction rgbEqual(a: RGB | null, b: RGB | null): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n return a.r === b.r && a.g === b.g && a.b === b.b\n}\n\nfunction formatRgb(color: RGB | null): string {\n if (!color) return \"default\"\n return `#${color.r.toString(16).padStart(2, \"0\")}${color.g.toString(16).padStart(2, \"0\")}${color.b.toString(16).padStart(2, \"0\")}`\n}\n\nfunction describeCellDiff(diff: CellDiff): string {\n const parts: string[] = []\n\n if (diff.old.char !== diff.new.char) {\n const oldChar = diff.old.char || \" \"\n const newChar = diff.new.char || \" \"\n parts.push(`text: '${oldChar}' -> '${newChar}'`)\n }\n\n if (!rgbEqual(diff.old.fg, diff.new.fg)) {\n parts.push(`fg: ${formatRgb(diff.old.fg)} -> ${formatRgb(diff.new.fg)}`)\n }\n\n if (!rgbEqual(diff.old.bg, diff.new.bg)) {\n parts.push(`bg: ${formatRgb(diff.old.bg)} -> ${formatRgb(diff.new.bg)}`)\n }\n\n if (diff.old.bold !== diff.new.bold) {\n parts.push(`bold: ${diff.old.bold} -> ${diff.new.bold}`)\n }\n\n if (diff.old.italic !== diff.new.italic) {\n parts.push(`italic: ${diff.old.italic} -> ${diff.new.italic}`)\n }\n\n if (diff.old.underline !== diff.new.underline) {\n parts.push(`underline: ${diff.old.underline} -> ${diff.new.underline}`)\n }\n\n return parts.join(\", \")\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Compare two terminal buffers cell-by-cell.\n *\n * Returns positions that differ with old/new values, plus a formatted diff\n * string for human-readable output.\n *\n * @example\n * ```ts\n * const result = diffBuffers(termA, termB)\n * if (!result.equal) {\n * console.log(result.formatted)\n * // (0,5) text: 'a' -> 'b'\n * // (1,0) fg: #ff0000 -> default\n * }\n * ```\n */\nexport function diffBuffers(a: TerminalReadable, b: TerminalReadable): DiffResult {\n const linesA = a.getLines()\n const linesB = b.getLines()\n const maxRows = Math.max(linesA.length, linesB.length)\n\n const diffs: CellDiff[] = []\n\n for (let row = 0; row < maxRows; row++) {\n const rowA = linesA[row] ?? []\n const rowB = linesB[row] ?? []\n const maxCols = Math.max(rowA.length, rowB.length)\n\n for (let col = 0; col < maxCols; col++) {\n const cellA = rowA[col] ?? emptyCell()\n const cellB = rowB[col] ?? emptyCell()\n\n if (!cellsEqual(cellA, cellB)) {\n diffs.push({\n row,\n col,\n old: cellToSummary(cellA),\n new: cellToSummary(cellB),\n })\n }\n }\n }\n\n const formatted =\n diffs.length === 0\n ? \"Buffers are identical\"\n : diffs.map((d) => `(${d.row},${d.col}) ${describeCellDiff(d)}`).join(\"\\n\")\n\n return {\n equal: diffs.length === 0,\n diffs,\n formatted,\n }\n}\n\nfunction emptyCell(): Cell {\n return {\n char: \" \",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n underlineColor: null,\n strikethrough: false,\n inverse: false,\n blink: false,\n hidden: false,\n wide: false,\n continuation: false,\n hyperlink: null,\n }\n}\n","/**\n * Visual-state snapshotting for terminal change detection.\n *\n * Captures the full visual state of a terminal (cell styles, cursor, modes,\n * title) as a deterministic string, so frame recorders can detect non-text\n * changes like cursor style, color, and mode transitions.\n *\n * The captured-session model itself lives in `recording.ts` (the unified\n * `Recording` type) and its format codecs (`asciicast/recording-codec.ts`,\n * `tape/compile.ts`, `native/native-rec.ts`). This module is only the\n * buffer-snapshot helper used by the `record` verb's change-detection loop.\n */\n\nimport type { Cell, RGB, TerminalReadable, TerminalMode, UnderlineStyle } from \"../terminal/types.ts\"\n\n// =============================================================================\n// Visual State Snapshotting\n// =============================================================================\n\n/** Modes that affect visual appearance and should be tracked for change detection. */\nconst VISUAL_MODES: TerminalMode[] = [\"altScreen\", \"cursorVisible\", \"reverseVideo\"]\n\nfunction rgbToString(color: RGB | null): string {\n if (color === null) return \"-\"\n return `${color.r},${color.g},${color.b}`\n}\n\nfunction underlineToString(u: UnderlineStyle): string {\n return u === false ? \"0\" : u\n}\n\nfunction cellToString(cell: Cell): string {\n // Encode all visually-relevant cell properties into a compact string.\n // Order: char|fg|bg|bold|dim|italic|underline|underlineColor|strikethrough|inverse|blink|hidden|wide|hyperlink\n return `${cell.char}|${rgbToString(cell.fg)}|${rgbToString(cell.bg)}|${cell.bold ? 1 : 0}${cell.dim ? 1 : 0}${cell.italic ? 1 : 0}${underlineToString(cell.underline)}|${rgbToString(cell.underlineColor)}|${cell.strikethrough ? 1 : 0}${cell.inverse ? 1 : 0}${cell.blink ? 1 : 0}${cell.hidden ? 1 : 0}${cell.wide ? 1 : 0}|${cell.hyperlink ?? \"-\"}`\n}\n\n/**\n * Snapshot the full visual state of a terminal as a deterministic string.\n *\n * Captures everything that affects what the user sees:\n * - Cell content AND styles (fg, bg, bold, italic, underline, etc.)\n * - Cursor position, style, and visibility\n * - Terminal modes (alt screen, reverse video)\n * - Window title\n *\n * Two terminals that look identical produce identical snapshots.\n * Any visual difference — even just a color change on one cell —\n * produces a different snapshot.\n *\n * Use this for frame change detection instead of text-only comparison:\n *\n * @example\n * ```ts\n * let previousSnapshot: string | null = null\n * // ... in capture loop:\n * const snapshot = snapshotVisualState(terminal)\n * if (snapshot !== previousSnapshot) {\n * captureFrame()\n * previousSnapshot = snapshot\n * }\n * ```\n */\nexport function snapshotVisualState(readable: TerminalReadable): string {\n const parts: string[] = []\n\n // Cursor state\n const cursor = readable.getCursor()\n parts.push(`C:${cursor.x},${cursor.y},${cursor.visible},${cursor.style}`)\n\n // Title\n parts.push(`T:${readable.getTitle()}`)\n\n // Visual modes\n const modeFlags = VISUAL_MODES.map((m) => (readable.getMode(m) ? \"1\" : \"0\")).join(\"\")\n parts.push(`M:${modeFlags}`)\n\n // Cell grid — every cell's full visual state\n const lines = readable.getLines()\n for (let row = 0; row < lines.length; row++) {\n const rowCells = lines[row]!\n const cellStrings: string[] = []\n for (let col = 0; col < rowCells.length; col++) {\n cellStrings.push(cellToString(rowCells[col]!))\n }\n parts.push(`R${row}:${cellStrings.join(\";\")}`)\n }\n\n return parts.join(\"\\n\")\n}\n","/**\n * Mock timer system for testing terminal animations.\n *\n * Provides a controlled time source where pending timers fire synchronously\n * when advanceTime() is called. This allows deterministic testing of\n * animation frames, cursor blink, and other time-dependent behavior.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** A pending timer entry. */\ninterface PendingTimer {\n id: number\n callback: () => void\n fireAt: number\n interval: number | null // null = setTimeout, number = setInterval repeat\n}\n\n/** Mock timer controller for testing animations. */\nexport interface MockTimerController {\n /** Current mock time in milliseconds. */\n readonly now: number\n\n /**\n * Advance the mock clock by the given number of milliseconds.\n * All pending timers that fall within the window fire synchronously\n * in chronological order.\n */\n advanceTime(ms: number): void\n\n /** Schedule a one-shot timer (like setTimeout). Returns timer ID. */\n setTimeout(callback: () => void, delay: number): number\n\n /** Schedule a repeating timer (like setInterval). Returns timer ID. */\n setInterval(callback: () => void, interval: number): number\n\n /** Cancel a pending timer (like clearTimeout / clearInterval). */\n clearTimer(id: number): void\n\n /** Number of currently pending timers. */\n readonly pendingCount: number\n\n /** Dispose all pending timers. */\n dispose(): void\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create a mock timer controller for testing animations.\n *\n * The controller manages its own clock that starts at 0 and only advances\n * when advanceTime() is called. Timers fire synchronously in order.\n *\n * @example\n * ```ts\n * const timer = createMockTimer()\n *\n * let fired = false\n * timer.setTimeout(() => { fired = true }, 100)\n *\n * timer.advanceTime(50) // not yet\n * assert(!fired)\n *\n * timer.advanceTime(50) // fires at t=100\n * assert(fired)\n *\n * timer.dispose()\n * ```\n */\nexport function createMockTimer(): MockTimerController {\n let currentTime = 0\n let nextId = 1\n const timers = new Map<number, PendingTimer>()\n\n function scheduleTimeout(callback: () => void, delay: number): number {\n const id = nextId++\n timers.set(id, {\n id,\n callback,\n fireAt: currentTime + Math.max(0, delay),\n interval: null,\n })\n return id\n }\n\n function scheduleInterval(callback: () => void, interval: number): number {\n const id = nextId++\n const safeInterval = Math.max(1, interval) // prevent zero-interval infinite loops\n timers.set(id, {\n id,\n callback,\n fireAt: currentTime + safeInterval,\n interval: safeInterval,\n })\n return id\n }\n\n function clearTimer(id: number): void {\n timers.delete(id)\n }\n\n function advanceTime(ms: number): void {\n if (ms < 0) throw new Error(\"Cannot advance time by a negative amount\")\n\n const targetTime = currentTime + ms\n\n // Process timers in chronological order until we reach targetTime\n while (true) {\n // Find the next timer to fire\n let next: PendingTimer | null = null\n for (const timer of timers.values()) {\n if (timer.fireAt <= targetTime) {\n if (!next || timer.fireAt < next.fireAt || (timer.fireAt === next.fireAt && timer.id < next.id)) {\n next = timer\n }\n }\n }\n\n if (!next) break\n\n // Advance clock to timer fire time and execute\n currentTime = next.fireAt\n const { id, callback, interval } = next\n\n if (interval !== null) {\n // Reschedule interval timer for next occurrence\n next.fireAt = currentTime + interval\n } else {\n // One-shot: remove after firing\n timers.delete(id)\n }\n\n callback()\n }\n\n // Advance clock to the full target time\n currentTime = targetTime\n }\n\n return {\n get now() {\n return currentTime\n },\n\n advanceTime,\n setTimeout: scheduleTimeout,\n setInterval: scheduleInterval,\n clearTimer,\n\n get pendingCount() {\n return timers.size\n },\n\n dispose(): void {\n timers.clear()\n },\n }\n}\n","/**\n * VHS .tape format parser for termless.\n *\n * Parses the line-based VHS tape format into structured TapeCommand objects.\n * The format is documented at https://github.com/charmbracelet/vhs\n *\n * @example\n * ```ts\n * import { parseTape } from \"@termless/core\"\n *\n * const tape = parseTape(`\n * Output demo.gif\n * Set FontSize 14\n * Type \"hello world\"\n * Enter\n * Sleep 2s\n * Screenshot\n * `)\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type TapeCommand =\n | { type: \"output\"; path: string }\n | { type: \"set\"; key: string; value: string }\n | { type: \"type\"; text: string; speed?: number }\n | { type: \"key\"; key: string; count?: number }\n | { type: \"ctrl\"; key: string }\n | { type: \"alt\"; key: string }\n | { type: \"sleep\"; ms: number }\n | { type: \"screenshot\"; path?: string }\n | { type: \"expect\"; text: string; timeout?: number }\n | { type: \"hide\" }\n | { type: \"show\" }\n | { type: \"source\"; path: string }\n | { type: \"require\"; program: string }\n\nexport interface TapeFile {\n commands: TapeCommand[]\n settings: Record<string, string>\n}\n\n// =============================================================================\n// Duration parsing\n// =============================================================================\n\n/**\n * Parse a duration string into milliseconds.\n *\n * Supports: \"2s\" -> 2000, \"500ms\" -> 500, \"0.5s\" -> 500, \"100\" -> 100 (ms).\n */\nexport function parseDuration(s: string): number {\n const trimmed = s.trim()\n if (trimmed.endsWith(\"ms\")) {\n return Number.parseFloat(trimmed.slice(0, -2))\n }\n if (trimmed.endsWith(\"s\")) {\n return Number.parseFloat(trimmed.slice(0, -1)) * 1000\n }\n // Bare number treated as milliseconds\n return Number.parseFloat(trimmed)\n}\n\n// =============================================================================\n// Key command names (case-insensitive match)\n// =============================================================================\n\nconst KEY_COMMANDS = new Set([\n \"enter\",\n \"backspace\",\n \"tab\",\n \"space\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n \"escape\",\n \"delete\",\n \"pageup\",\n \"pagedown\",\n \"home\",\n \"end\",\n])\n\n// =============================================================================\n// Line parsing\n// =============================================================================\n\n/**\n * Parse a quoted string, handling escaped quotes.\n * Returns the unquoted content.\n */\nfunction parseQuotedString(s: string): string {\n if (s.startsWith('\"') && s.endsWith('\"')) {\n return s.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\")\n }\n return s\n}\n\n/**\n * Parse a single line into a TapeCommand, or null for comments/blank lines.\n */\nfunction parseLine(line: string): TapeCommand | null {\n const trimmed = line.trim()\n\n // Skip empty lines and comments\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) return null\n\n // Split into command and arguments\n // Handle quoted strings properly\n const parts = splitCommandLine(trimmed)\n if (parts.length === 0) return null\n\n const cmd = parts[0]!\n const cmdLower = cmd.toLowerCase()\n\n // Output <path>\n if (cmdLower === \"output\") {\n return { type: \"output\", path: parts.slice(1).join(\" \") }\n }\n\n // Set <key> <value>\n if (cmdLower === \"set\") {\n const key = parts[1] ?? \"\"\n const value = parts.slice(2).join(\" \")\n return { type: \"set\", key, value: parseQuotedString(value) }\n }\n\n // Type[@speed] \"text\"\n if (cmdLower === \"type\" || cmdLower.startsWith(\"type@\")) {\n let speed: number | undefined\n if (cmdLower.startsWith(\"type@\")) {\n speed = parseDuration(cmd.slice(5))\n }\n const text = parseQuotedString(parts.slice(1).join(\" \"))\n return { type: \"type\", text, ...(speed !== undefined ? { speed } : {}) }\n }\n\n // Ctrl+<key>\n if (cmdLower.startsWith(\"ctrl+\")) {\n return { type: \"ctrl\", key: cmd.slice(5) }\n }\n\n // Alt+<key>\n if (cmdLower.startsWith(\"alt+\")) {\n return { type: \"alt\", key: cmd.slice(4) }\n }\n\n // Sleep <duration>\n if (cmdLower === \"sleep\") {\n const duration = parts[1] ?? \"0\"\n return { type: \"sleep\", ms: parseDuration(duration) }\n }\n\n // Screenshot [path]\n if (cmdLower === \"screenshot\") {\n const path = parts.length > 1 ? parts.slice(1).join(\" \") : undefined\n return { type: \"screenshot\", path }\n }\n\n // Hide\n if (cmdLower === \"hide\") {\n return { type: \"hide\" }\n }\n\n // Show\n if (cmdLower === \"show\") {\n return { type: \"show\" }\n }\n\n // Source <path>\n if (cmdLower === \"source\") {\n return { type: \"source\", path: parts.slice(1).join(\" \") }\n }\n\n // Require <program>\n if (cmdLower === \"require\") {\n return { type: \"require\", program: parts[1] ?? \"\" }\n }\n\n // Expect \"text\" [timeout]\n if (cmdLower === \"expect\") {\n const text = parseQuotedString(parts[1] ?? \"\")\n let timeout: number | undefined\n if (parts.length > 2) {\n timeout = parseDuration(parts[2]!)\n }\n return { type: \"expect\", text, ...(timeout !== undefined ? { timeout } : {}) }\n }\n\n // Key commands: Enter, Backspace, Tab, Space, Up, Down, Left, Right, Escape, Delete\n if (KEY_COMMANDS.has(cmdLower)) {\n const count = parts.length > 1 ? Number.parseInt(parts[1]!, 10) : undefined\n return { type: \"key\", key: cmd, ...(count !== undefined && count > 1 ? { count } : {}) }\n }\n\n // Unknown command — treat as key press (VHS is lenient)\n return { type: \"key\", key: cmd }\n}\n\n/**\n * Split a command line into parts, respecting quoted strings.\n */\nfunction splitCommandLine(line: string): string[] {\n const parts: string[] = []\n let current = \"\"\n let inQuote = false\n let escaped = false\n\n for (const ch of line) {\n if (escaped) {\n current += ch\n escaped = false\n continue\n }\n if (ch === \"\\\\\") {\n escaped = true\n current += ch\n continue\n }\n if (ch === '\"') {\n inQuote = !inQuote\n current += ch\n continue\n }\n if (ch === \" \" && !inQuote) {\n if (current.length > 0) {\n parts.push(current)\n current = \"\"\n }\n continue\n }\n current += ch\n }\n\n if (current.length > 0) {\n parts.push(current)\n }\n\n return parts\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Parse a VHS .tape file format string into a TapeFile.\n *\n * The tape format is line-based. Each line is either:\n * - A comment (starting with #)\n * - A blank line (ignored)\n * - A command (Output, Set, Type, Enter, Sleep, Screenshot, etc.)\n *\n * Set commands are collected into the `settings` map in addition to\n * appearing in the `commands` array.\n */\nexport function parseTape(source: string): TapeFile {\n const lines = source.split(\"\\n\")\n const commands: TapeCommand[] = []\n const settings: Record<string, string> = {}\n\n for (const line of lines) {\n const cmd = parseLine(line)\n if (cmd === null) continue\n\n commands.push(cmd)\n\n // Collect Set commands into settings\n if (cmd.type === \"set\") {\n settings[cmd.key] = cmd.value\n }\n }\n\n return { commands, settings }\n}\n","/**\n * Built-in themes for termless recordings.\n *\n * Each theme defines foreground, background, cursor, and (optionally) the\n * 16-color ANSI palette. Theme names are case-insensitive and common aliases\n * are supported (e.g. \"catppuccin\" → \"catppuccin-mocha\").\n *\n * When @silvery/theme is available (optional peer dependency), all 45+\n * palettes are automatically mapped to SvgTheme objects and exposed alongside\n * the built-in fallback themes.\n */\n\nimport type { SvgTheme } from \"../../terminal/types.ts\"\n\n// =============================================================================\n// Built-in fallback themes (used when @silvery/theme is not installed)\n// =============================================================================\n\nconst BUILTIN_THEMES: Record<string, SvgTheme> = {\n dracula: {\n background: \"#282a36\",\n foreground: \"#f8f8f2\",\n cursor: \"#f8f8f2\",\n palette: {\n 0: \"#21222c\",\n 1: \"#ff5555\",\n 2: \"#50fa7b\",\n 3: \"#f1fa8c\",\n 4: \"#bd93f9\",\n 5: \"#ff79c6\",\n 6: \"#8be9fd\",\n 7: \"#f8f8f2\",\n 8: \"#6272a4\",\n 9: \"#ff6e6e\",\n 10: \"#69ff94\",\n 11: \"#ffffa5\",\n 12: \"#d6acff\",\n 13: \"#ff92df\",\n 14: \"#a4ffff\",\n 15: \"#ffffff\",\n },\n },\n nord: {\n background: \"#2e3440\",\n foreground: \"#d8dee9\",\n cursor: \"#d8dee9\",\n palette: {\n 0: \"#3b4252\",\n 1: \"#bf616a\",\n 2: \"#a3be8c\",\n 3: \"#ebcb8b\",\n 4: \"#81a1c1\",\n 5: \"#b48ead\",\n 6: \"#88c0d0\",\n 7: \"#e5e9f0\",\n 8: \"#4c566a\",\n 9: \"#bf616a\",\n 10: \"#a3be8c\",\n 11: \"#ebcb8b\",\n 12: \"#81a1c1\",\n 13: \"#b48ead\",\n 14: \"#8fbcbb\",\n 15: \"#eceff4\",\n },\n },\n monokai: {\n background: \"#272822\",\n foreground: \"#f8f8f2\",\n cursor: \"#f8f8f2\",\n palette: {\n 0: \"#272822\",\n 1: \"#f92672\",\n 2: \"#a6e22e\",\n 3: \"#f4bf75\",\n 4: \"#66d9ef\",\n 5: \"#ae81ff\",\n 6: \"#a1efe4\",\n 7: \"#f8f8f2\",\n 8: \"#75715e\",\n 9: \"#f92672\",\n 10: \"#a6e22e\",\n 11: \"#f4bf75\",\n 12: \"#66d9ef\",\n 13: \"#ae81ff\",\n 14: \"#a1efe4\",\n 15: \"#f9f8f5\",\n },\n },\n \"catppuccin-mocha\": {\n background: \"#1e1e2e\",\n foreground: \"#cdd6f4\",\n cursor: \"#f5e0dc\",\n palette: {\n 0: \"#45475a\",\n 1: \"#f38ba8\",\n 2: \"#a6e3a1\",\n 3: \"#f9e2af\",\n 4: \"#89b4fa\",\n 5: \"#f5c2e7\",\n 6: \"#94e2d5\",\n 7: \"#bac2de\",\n 8: \"#585b70\",\n 9: \"#f38ba8\",\n 10: \"#a6e3a1\",\n 11: \"#f9e2af\",\n 12: \"#89b4fa\",\n 13: \"#f5c2e7\",\n 14: \"#94e2d5\",\n 15: \"#a6adc8\",\n },\n },\n \"tokyo-night\": {\n background: \"#1a1b26\",\n foreground: \"#a9b1d6\",\n cursor: \"#c0caf5\",\n palette: {\n 0: \"#15161e\",\n 1: \"#f7768e\",\n 2: \"#9ece6a\",\n 3: \"#e0af68\",\n 4: \"#7aa2f7\",\n 5: \"#bb9af7\",\n 6: \"#7dcfff\",\n 7: \"#a9b1d6\",\n 8: \"#414868\",\n 9: \"#f7768e\",\n 10: \"#9ece6a\",\n 11: \"#e0af68\",\n 12: \"#7aa2f7\",\n 13: \"#bb9af7\",\n 14: \"#7dcfff\",\n 15: \"#c0caf5\",\n },\n },\n \"solarized-dark\": {\n background: \"#002b36\",\n foreground: \"#839496\",\n cursor: \"#93a1a1\",\n palette: {\n 0: \"#073642\",\n 1: \"#dc322f\",\n 2: \"#859900\",\n 3: \"#b58900\",\n 4: \"#268bd2\",\n 5: \"#d33682\",\n 6: \"#2aa198\",\n 7: \"#eee8d5\",\n 8: \"#002b36\",\n 9: \"#cb4b16\",\n 10: \"#586e75\",\n 11: \"#657b83\",\n 12: \"#839496\",\n 13: \"#6c71c4\",\n 14: \"#93a1a1\",\n 15: \"#fdf6e3\",\n },\n },\n \"solarized-light\": {\n background: \"#fdf6e3\",\n foreground: \"#657b83\",\n cursor: \"#586e75\",\n palette: {\n 0: \"#073642\",\n 1: \"#dc322f\",\n 2: \"#859900\",\n 3: \"#b58900\",\n 4: \"#268bd2\",\n 5: \"#d33682\",\n 6: \"#2aa198\",\n 7: \"#eee8d5\",\n 8: \"#002b36\",\n 9: \"#cb4b16\",\n 10: \"#586e75\",\n 11: \"#657b83\",\n 12: \"#839496\",\n 13: \"#6c71c4\",\n 14: \"#93a1a1\",\n 15: \"#fdf6e3\",\n },\n },\n \"github-dark\": {\n background: \"#0d1117\",\n foreground: \"#c9d1d9\",\n cursor: \"#c9d1d9\",\n palette: {\n 0: \"#484f58\",\n 1: \"#ff7b72\",\n 2: \"#3fb950\",\n 3: \"#d29922\",\n 4: \"#58a6ff\",\n 5: \"#bc8cff\",\n 6: \"#39c5cf\",\n 7: \"#b1bac4\",\n 8: \"#6e7681\",\n 9: \"#ffa198\",\n 10: \"#56d364\",\n 11: \"#e3b341\",\n 12: \"#79c0ff\",\n 13: \"#d2a8ff\",\n 14: \"#56d4dd\",\n 15: \"#f0f6fc\",\n },\n },\n \"github-light\": {\n background: \"#ffffff\",\n foreground: \"#24292f\",\n cursor: \"#24292f\",\n palette: {\n 0: \"#24292e\",\n 1: \"#d73a49\",\n 2: \"#22863a\",\n 3: \"#b08800\",\n 4: \"#0366d6\",\n 5: \"#6f42c1\",\n 6: \"#1b7c83\",\n 7: \"#6a737d\",\n 8: \"#959da5\",\n 9: \"#cb2431\",\n 10: \"#28a745\",\n 11: \"#dbab09\",\n 12: \"#2188ff\",\n 13: \"#8a63d2\",\n 14: \"#3192aa\",\n 15: \"#d1d5da\",\n },\n },\n \"gruvbox-dark\": {\n background: \"#282828\",\n foreground: \"#ebdbb2\",\n cursor: \"#ebdbb2\",\n palette: {\n 0: \"#282828\",\n 1: \"#cc241d\",\n 2: \"#98971a\",\n 3: \"#d79921\",\n 4: \"#458588\",\n 5: \"#b16286\",\n 6: \"#689d6a\",\n 7: \"#a89984\",\n 8: \"#928374\",\n 9: \"#fb4934\",\n 10: \"#b8bb26\",\n 11: \"#fabd2f\",\n 12: \"#83a598\",\n 13: \"#d3869b\",\n 14: \"#8ec07c\",\n 15: \"#ebdbb2\",\n },\n },\n \"one-dark\": {\n background: \"#282c34\",\n foreground: \"#abb2bf\",\n cursor: \"#528bff\",\n palette: {\n 0: \"#282c34\",\n 1: \"#e06c75\",\n 2: \"#98c379\",\n 3: \"#e5c07b\",\n 4: \"#61afef\",\n 5: \"#c678dd\",\n 6: \"#56b6c2\",\n 7: \"#abb2bf\",\n 8: \"#545862\",\n 9: \"#e06c75\",\n 10: \"#98c379\",\n 11: \"#e5c07b\",\n 12: \"#61afef\",\n 13: \"#c678dd\",\n 14: \"#56b6c2\",\n 15: \"#c8ccd4\",\n },\n },\n \"rose-pine\": {\n background: \"#191724\",\n foreground: \"#e0def4\",\n cursor: \"#ebbcba\",\n palette: {\n 0: \"#26233a\",\n 1: \"#eb6f92\",\n 2: \"#9ccfd8\",\n 3: \"#f6c177\",\n 4: \"#31748f\",\n 5: \"#c4a7e7\",\n 6: \"#9ccfd8\",\n 7: \"#e0def4\",\n 8: \"#6e6a86\",\n 9: \"#eb6f92\",\n 10: \"#9ccfd8\",\n 11: \"#f6c177\",\n 12: \"#31748f\",\n 13: \"#c4a7e7\",\n 14: \"#9ccfd8\",\n 15: \"#e0def4\",\n },\n },\n}\n\n// =============================================================================\n// Aliases (work for both built-in and silvery themes)\n// =============================================================================\n\nconst ALIASES: Record<string, string> = {\n catppuccin: \"catppuccin-mocha\",\n solarized: \"solarized-dark\",\n gruvbox: \"gruvbox-dark\",\n github: \"github-dark\",\n kanagawa: \"kanagawa-wave\",\n material: \"material-dark\",\n oxocarbon: \"oxocarbon-dark\",\n edge: \"edge-dark\",\n ayu: \"ayu-dark\",\n everforest: \"everforest-dark\",\n modus: \"modus-vivendi\",\n}\n\n// =============================================================================\n// @silvery/theme integration (optional peer dependency)\n// =============================================================================\n\n/**\n * Map a silvery ColorScheme to an SvgTheme.\n *\n * ColorScheme has named fields (black, red, green, ..., brightWhite)\n * which map to ANSI indices 0-15.\n */\ninterface ColorPaletteLike {\n name?: string\n foreground: string\n background: string\n cursorColor: string\n black: string\n red: string\n green: string\n yellow: string\n blue: string\n magenta: string\n cyan: string\n white: string\n brightBlack: string\n brightRed: string\n brightGreen: string\n brightYellow: string\n brightBlue: string\n brightMagenta: string\n brightCyan: string\n brightWhite: string\n}\n\nfunction paletteToSvgTheme(p: ColorPaletteLike): SvgTheme {\n return {\n foreground: p.foreground.toLowerCase(),\n background: p.background.toLowerCase(),\n cursor: p.cursorColor.toLowerCase(),\n palette: {\n 0: p.black.toLowerCase(),\n 1: p.red.toLowerCase(),\n 2: p.green.toLowerCase(),\n 3: p.yellow.toLowerCase(),\n 4: p.blue.toLowerCase(),\n 5: p.magenta.toLowerCase(),\n 6: p.cyan.toLowerCase(),\n 7: p.white.toLowerCase(),\n 8: p.brightBlack.toLowerCase(),\n 9: p.brightRed.toLowerCase(),\n 10: p.brightGreen.toLowerCase(),\n 11: p.brightYellow.toLowerCase(),\n 12: p.brightBlue.toLowerCase(),\n 13: p.brightMagenta.toLowerCase(),\n 14: p.brightCyan.toLowerCase(),\n 15: p.brightWhite.toLowerCase(),\n },\n }\n}\n\n/**\n * Lazily load @silvery/theme palettes on first access.\n * Uses synchronous require() to avoid top-level await, which would make\n * @termless/core an async module and break require() callers (e.g. silvery's createTerm).\n * Falls back to empty record if @silvery/theme is not installed.\n */\nlet _silveryThemes: Record<string, SvgTheme> | undefined\nfunction getSilveryThemes(): Record<string, SvgTheme> {\n if (_silveryThemes !== undefined) return _silveryThemes\n try {\n const themePkg = \"@silvery/theme\"\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(themePkg) as { builtinPalettes?: Record<string, ColorPaletteLike> }\n const palettes = mod.builtinPalettes\n if (!palettes) {\n _silveryThemes = {}\n return _silveryThemes\n }\n\n const result: Record<string, SvgTheme> = {}\n for (const [name, palette] of Object.entries(palettes)) {\n result[name] = paletteToSvgTheme(palette)\n }\n _silveryThemes = result\n return _silveryThemes\n } catch {\n _silveryThemes = {}\n return _silveryThemes\n }\n}\n\n// =============================================================================\n// Merged theme access\n// =============================================================================\n\n/**\n * Get all available themes (silvery palettes override built-in for same name).\n */\nfunction getAllThemes(): Record<string, SvgTheme> {\n // Silvery themes take precedence over built-in for overlapping names\n const silveryThemes = getSilveryThemes()\n if (Object.keys(silveryThemes).length > 0) {\n return { ...BUILTIN_THEMES, ...silveryThemes }\n }\n return BUILTIN_THEMES\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Resolve a theme name to an SvgTheme. Case-insensitive, supports aliases.\n * Returns undefined for unknown themes.\n *\n * When @silvery/theme is available, resolves from all 45+ silvery palettes\n * in addition to the 12 built-in fallback themes.\n */\nexport function resolveTheme(name: string): SvgTheme | undefined {\n const normalized = name.toLowerCase()\n const resolved = ALIASES[normalized] ?? normalized\n return getAllThemes()[resolved]\n}\n\n/**\n * List all available theme names (canonical names only, not aliases).\n *\n * When @silvery/theme is installed, includes all silvery palette names\n * alongside built-in themes (deduplicated).\n */\nexport function listThemes(): string[] {\n return Object.keys(getAllThemes())\n}\n\n/**\n * List all theme aliases as [alias, canonical] pairs.\n */\nexport function listAliases(): [string, string][] {\n return Object.entries(ALIASES)\n}\n","/**\n * VHS .tape executor for termless.\n *\n * Executes parsed tape commands against a termless Terminal instance.\n * Supports both headless mode (feed raw data) and PTY mode (spawn a shell\n * and type into it).\n *\n * @example\n * ```ts\n * import { parseTape, executeTape } from \"@termless/core\"\n *\n * const tape = parseTape(`\n * Set Shell \"bash\"\n * Type \"echo hello\"\n * Enter\n * Sleep 1s\n * Screenshot\n * `)\n *\n * const result = await executeTape(tape, {\n * onScreenshot: (png) => writeFileSync(\"out.png\", png),\n * })\n * ```\n */\n\nimport type { TapeFile, TapeCommand } from \"./parser.ts\"\nimport { parseDuration } from \"./parser.ts\"\nimport type { Terminal, TerminalBackend, SvgScreenshotOptions, WindowBar } from \"../../terminal/types.ts\"\nimport { createTerminal } from \"../../terminal/terminal.ts\"\nimport { screenshotPng } from \"../../render/png.ts\"\nimport { createFrameTracer } from \"../frame-trace.ts\"\nimport type { FrameTracer, FrameTraceSummary } from \"../frame-trace.ts\"\nimport { resolveTheme } from \"./themes.ts\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TapeExecutorOptions {\n /** Backend name or pre-created backend instance (default: \"vterm\"). */\n backend?: string | TerminalBackend\n /** Override terminal columns. */\n cols?: number\n /** Override terminal rows. */\n rows?: number\n /** Default typing speed in ms between characters (default: 50). */\n defaultTypingSpeed?: number\n /** Directory for saving screenshots. */\n screenshotDir?: string\n /** Theme name for screenshots (overrides `Set Theme` in tape). */\n theme?: string\n /** Called after each visual change when recording is not hidden. */\n onFrame?: (frame: ScreenshotCapture) => void\n /** Called when a Screenshot command is executed. */\n onScreenshot?: (png: Uint8Array, path?: string) => void\n /** Called after each command is executed, with the command and terminal. */\n onAfterCommand?: (cmd: TapeCommand, terminal: Terminal) => void\n /**\n * Visual Eyes Phase 3: directory for frame-trace output. Overrides\n * `Set Frames` in the tape. When neither this nor `Set Frames` is set,\n * frame-trace mode is disabled.\n */\n framesDir?: string\n}\n\nexport interface ScreenshotCapture {\n /** Milliseconds since execution start. */\n timestamp: number\n /** PNG screenshot data. */\n png: Uint8Array\n}\n\nexport interface TapeResult {\n /** Total execution time in milliseconds. */\n duration: number\n /** Collected frames (when onFrame is provided and not hidden). */\n frames: ScreenshotCapture[]\n /** Number of screenshots taken. */\n screenshotCount: number\n /** The terminal instance (still open for inspection). */\n terminal: Terminal\n /**\n * Frame-trace summary if `framesDir` (option or `Set Frames`) was set.\n * `null` otherwise.\n */\n frameTrace: FrameTraceSummary | null\n}\n\n// =============================================================================\n// Key name mapping (VHS key names -> termless key descriptors)\n// =============================================================================\n\nconst VHS_KEY_MAP: Record<string, string> = {\n enter: \"Enter\",\n backspace: \"Backspace\",\n tab: \"Tab\",\n space: \"Space\",\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\",\n escape: \"Escape\",\n delete: \"Delete\",\n pageup: \"PageUp\",\n pagedown: \"PageDown\",\n home: \"Home\",\n end: \"End\",\n}\n\n/**\n * Map a VHS key name to a termless key string.\n */\nfunction mapKeyName(vhsKey: string): string {\n return VHS_KEY_MAP[vhsKey.toLowerCase()] ?? vhsKey\n}\n\n// =============================================================================\n// Executor\n// =============================================================================\n\n/**\n * Execute parsed tape commands against a termless Terminal.\n *\n * If the tape specifies a Shell (via `Set Shell`), spawns it as a PTY process.\n * Otherwise operates in headless mode (feed-only, useful for testing).\n *\n * Key behaviors:\n * - Type: feeds each character through the PTY with typing speed delay\n * - Enter/Tab/etc: sends the corresponding key press\n * - Ctrl+C: sends Ctrl+key combination\n * - Sleep: actual delay (setTimeout)\n * - Screenshot: captures PNG and invokes callback\n * - Set Width/Height: resizes terminal\n * - Hide/Show: toggles frame recording\n * - Source: recursively executes another tape file (requires readFile callback)\n */\nexport async function executeTape(tape: TapeFile, options?: TapeExecutorOptions): Promise<TapeResult> {\n const startTime = Date.now()\n const frames: ScreenshotCapture[] = []\n let screenshotCount = 0\n let hidden = false\n\n // Resolve dimensions from settings or options\n const cols = options?.cols ?? (tape.settings.Width ? Number.parseInt(tape.settings.Width, 10) : 80)\n const rows = options?.rows ?? (tape.settings.Height ? Number.parseInt(tape.settings.Height, 10) : 24)\n const defaultSpeed = options?.defaultTypingSpeed ?? parseDurationSetting(tape.settings.TypingSpeed, 50)\n\n // Resolve backend — accept a pre-created instance or a name string\n let backendInstance: TerminalBackend\n const backendOpt = options?.backend ?? \"vterm\"\n if (typeof backendOpt === \"string\") {\n const { backend } = await import(\"../../backend/backends.ts\")\n backendInstance = await backend(backendOpt)\n } else {\n backendInstance = backendOpt\n }\n\n // Resolve frame-trace dir (option override → Set Frames in tape).\n const framesDir = options?.framesDir ?? tape.settings.Frames ?? null\n const frameDebounceMs = tape.settings.FrameDebounceMs ? Number.parseInt(tape.settings.FrameDebounceMs, 10) : undefined\n\n let frameTracer: FrameTracer | null = null\n const terminal = createTerminal({\n backend: backendInstance,\n cols,\n rows,\n onAfterWrite: (data) => frameTracer?.onWrite(data),\n })\n\n if (framesDir) {\n frameTracer = createFrameTracer(terminal, {\n dir: framesDir,\n debounceMs: frameDebounceMs,\n canvas: { cols, rows },\n })\n }\n\n // Spawn shell if specified\n const shell = tape.settings.Shell ? parseShellSetting(tape.settings.Shell) : null\n if (shell) {\n await terminal.spawn(shell)\n // Brief wait for shell to initialize\n await delay(100)\n }\n\n // Screenshot rendering options from settings\n const svgOptions: SvgScreenshotOptions = {}\n if (tape.settings.FontSize) svgOptions.fontSize = Number.parseInt(tape.settings.FontSize, 10)\n if (tape.settings.FontFamily) svgOptions.fontFamily = tape.settings.FontFamily\n\n // Visual polish settings\n if (tape.settings.Padding) svgOptions.padding = Number.parseInt(tape.settings.Padding, 10)\n if (tape.settings.BorderRadius) svgOptions.borderRadius = Number.parseInt(tape.settings.BorderRadius, 10)\n if (tape.settings.WindowBar) svgOptions.windowBar = tape.settings.WindowBar.toLowerCase() as WindowBar\n if (tape.settings.WindowBarSize) svgOptions.windowBarSize = Number.parseInt(tape.settings.WindowBarSize, 10)\n if (tape.settings.WindowTitle) svgOptions.windowTitle = tape.settings.WindowTitle\n if (tape.settings.Shadow) svgOptions.shadow = Number.parseInt(tape.settings.Shadow, 10)\n if (tape.settings.Margin) svgOptions.margin = Number.parseInt(tape.settings.Margin, 10)\n if (tape.settings.MarginFill) svgOptions.marginFill = tape.settings.MarginFill\n\n // Playback speed: from tape settings or options (options override)\n const playbackSpeed = tape.settings.PlaybackSpeed ? Number.parseFloat(tape.settings.PlaybackSpeed) : 1\n\n // Framerate: from tape settings (stored for use by callers)\n if (tape.settings.Framerate) svgOptions.framerate = Number.parseInt(tape.settings.Framerate, 10)\n\n // Resolve theme: CLI --theme flag takes precedence over Set Theme in tape\n const themeName = options?.theme ?? tape.settings.Theme\n if (themeName) {\n const theme = resolveTheme(themeName)\n if (theme) {\n svgOptions.theme = theme\n }\n }\n\n // Execute commands\n for (const cmd of tape.commands) {\n await executeCommand(cmd, terminal, {\n defaultSpeed,\n svgOptions,\n hidden,\n startTime,\n frames,\n playbackSpeed,\n onFrame: options?.onFrame,\n onScreenshot: options?.onScreenshot,\n onScreenshotCount: () => screenshotCount++,\n onHide: () => {\n hidden = true\n },\n onShow: () => {\n hidden = false\n },\n })\n options?.onAfterCommand?.(cmd, terminal)\n }\n\n const frameTrace = frameTracer ? await frameTracer.stop() : null\n\n return {\n duration: Date.now() - startTime,\n frames,\n screenshotCount,\n terminal,\n frameTrace,\n }\n}\n\n// =============================================================================\n// Command execution\n// =============================================================================\n\ninterface ExecuteContext {\n defaultSpeed: number\n svgOptions: SvgScreenshotOptions\n hidden: boolean\n startTime: number\n frames: ScreenshotCapture[]\n playbackSpeed: number\n onFrame?: (frame: ScreenshotCapture) => void\n onScreenshot?: (png: Uint8Array, path?: string) => void\n onScreenshotCount: () => void\n onHide: () => void\n onShow: () => void\n}\n\nasync function executeCommand(cmd: TapeCommand, terminal: Terminal, ctx: ExecuteContext): Promise<void> {\n switch (cmd.type) {\n case \"output\":\n // Output path is metadata — handled by the CLI layer\n break\n\n case \"set\":\n // Most settings are consumed at init time. Handle dynamic ones here.\n if (cmd.key === \"Width\" || cmd.key === \"Height\") {\n const newCols = cmd.key === \"Width\" ? Number.parseInt(cmd.value, 10) : terminal.cols\n const newRows = cmd.key === \"Height\" ? Number.parseInt(cmd.value, 10) : terminal.rows\n terminal.resize(newCols, newRows)\n }\n if (cmd.key === \"Theme\") {\n const theme = resolveTheme(cmd.value)\n if (theme) {\n ctx.svgOptions.theme = theme\n }\n }\n // Visual polish settings (can be changed dynamically mid-tape)\n if (cmd.key === \"Padding\") ctx.svgOptions.padding = Number.parseInt(cmd.value, 10)\n if (cmd.key === \"BorderRadius\") ctx.svgOptions.borderRadius = Number.parseInt(cmd.value, 10)\n if (cmd.key === \"WindowBar\") ctx.svgOptions.windowBar = cmd.value.toLowerCase() as WindowBar\n if (cmd.key === \"WindowBarSize\") ctx.svgOptions.windowBarSize = Number.parseInt(cmd.value, 10)\n if (cmd.key === \"WindowTitle\") ctx.svgOptions.windowTitle = cmd.value\n if (cmd.key === \"Shadow\") ctx.svgOptions.shadow = Number.parseInt(cmd.value, 10)\n if (cmd.key === \"Margin\") ctx.svgOptions.margin = Number.parseInt(cmd.value, 10)\n if (cmd.key === \"MarginFill\") ctx.svgOptions.marginFill = cmd.value\n if (cmd.key === \"PlaybackSpeed\") ctx.playbackSpeed = Number.parseFloat(cmd.value)\n if (cmd.key === \"Framerate\") ctx.svgOptions.framerate = Number.parseInt(cmd.value, 10)\n break\n\n case \"type\": {\n const speed = cmd.speed ?? ctx.defaultSpeed\n for (const char of cmd.text) {\n if (terminal.alive) {\n terminal.type(char)\n } else {\n terminal.feed(char)\n }\n if (speed > 0) await delay(speed)\n }\n break\n }\n\n case \"key\": {\n const keyName = mapKeyName(cmd.key)\n const count = cmd.count ?? 1\n for (let i = 0; i < count; i++) {\n if (terminal.alive) {\n terminal.press(keyName)\n } else {\n // In headless mode, feed the key's ANSI encoding directly\n const { keyToAnsi, parseKey } = await import(\"../../terminal/key-mapping.ts\")\n const ansi = keyToAnsi(parseKey(keyName))\n terminal.feed(ansi)\n }\n if (count > 1) await delay(50)\n }\n break\n }\n\n case \"ctrl\": {\n const keyStr = `Ctrl+${cmd.key}`\n if (terminal.alive) {\n terminal.press(keyStr)\n } else {\n const { keyToAnsi, parseKey } = await import(\"../../terminal/key-mapping.ts\")\n terminal.feed(keyToAnsi(parseKey(keyStr)))\n }\n break\n }\n\n case \"alt\": {\n const keyStr = `Alt+${cmd.key}`\n if (terminal.alive) {\n terminal.press(keyStr)\n } else {\n const { keyToAnsi, parseKey } = await import(\"../../terminal/key-mapping.ts\")\n terminal.feed(keyToAnsi(parseKey(keyStr)))\n }\n break\n }\n\n case \"sleep\":\n await delay(cmd.ms / ctx.playbackSpeed)\n break\n\n case \"screenshot\": {\n const png = await screenshotPng(terminal, ctx.svgOptions)\n ctx.onScreenshotCount()\n ctx.onScreenshot?.(png, cmd.path)\n\n if (!ctx.hidden) {\n const frame: ScreenshotCapture = {\n timestamp: Date.now() - ctx.startTime,\n png,\n }\n ctx.frames.push(frame)\n ctx.onFrame?.(frame)\n }\n break\n }\n\n case \"hide\":\n ctx.onHide()\n break\n\n case \"show\":\n ctx.onShow()\n break\n\n case \"expect\": {\n const timeout = cmd.timeout ?? 5000\n const pollInterval = 50\n const deadline = Date.now() + timeout\n let found = false\n while (Date.now() < deadline) {\n const text = terminal.getText()\n if (text.includes(cmd.text)) {\n found = true\n break\n }\n await delay(pollInterval)\n }\n if (!found) {\n throw new Error(`Expect timed out after ${timeout}ms: text \"${cmd.text}\" not found`)\n }\n break\n }\n\n case \"source\":\n // Source requires filesystem access — handled by the CLI layer.\n // In library usage, this is a no-op (users should pre-process sources).\n break\n\n case \"require\":\n // Require checks if a program exists — handled by the CLI layer.\n break\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction parseDurationSetting(value: string | undefined, defaultMs: number): number {\n if (!value) return defaultMs\n return parseDuration(value)\n}\n\nfunction parseShellSetting(value: string): string[] {\n // Remove quotes if present\n const cleaned = value.replace(/^[\"']|[\"']$/g, \"\")\n return cleaned.split(/\\s+/)\n}\n","/**\n * Multi-backend tape comparison for termless.\n *\n * Runs the same .tape file against multiple backends and compares the results.\n * Supports separate screenshots, side-by-side composition, grid layout, and\n * pixel-level diff highlighting.\n *\n * @example\n * ```ts\n * import { parseTape, compareTape } from \"@termless/core\"\n *\n * const tape = parseTape(`Type \"hello\"\\nEnter\\nScreenshot`)\n * const result = await compareTape(tape, {\n * backends: [\"xtermjs\", \"vterm\", \"ghostty\"],\n * mode: \"side-by-side\",\n * output: \"./comparison.svg\",\n * })\n * ```\n */\n\nimport type { TapeFile } from \"./parser.ts\"\nimport type { TerminalBackend } from \"../../terminal/types.ts\"\nimport { executeTape, type TapeExecutorOptions } from \"./executor.ts\"\nimport { screenshotPng } from \"../../render/png.ts\"\n\nlet upngModule: typeof import(\"upng-js\") | null = null\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type CompareMode = \"separate\" | \"side-by-side\" | \"grid\" | \"diff\"\n\n/** A backend specification: either a name string or a pre-created instance with a label. */\nexport type BackendSpec = string | { name: string; backend: TerminalBackend }\n\nexport interface CompareOptions {\n /** Backend names or instances to compare. */\n backends: BackendSpec[]\n /** How to present the comparison. */\n mode: CompareMode\n /** Output path for composed results (SVG/PNG). */\n output?: string\n /** Additional executor options passed to each backend run. */\n executorOptions?: Omit<TapeExecutorOptions, \"backend\">\n}\n\nexport interface BackendScreenshot {\n /** Backend name. */\n backend: string\n /** PNG data from the final screenshot. */\n png: Uint8Array\n /** Terminal text content at time of screenshot. */\n text: string\n}\n\nexport interface CompareResult {\n /** Individual backend screenshots. */\n screenshots: BackendScreenshot[]\n /** Composed SVG (for side-by-side, grid, diff modes). */\n composedSvg?: string\n /** Whether all backends produced identical output text. */\n textMatch: boolean\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Run a tape against multiple backends and compare the results.\n *\n * Each backend executes the full tape independently. After execution,\n * the results are composed according to the specified mode:\n *\n * - **separate**: individual screenshots per backend\n * - **side-by-side**: horizontal composition with backend name headers\n * - **grid**: arrange screenshots in a grid (2 columns)\n * - **diff**: highlight text differences between backends\n */\nexport async function compareTape(tape: TapeFile, options: CompareOptions): Promise<CompareResult> {\n const screenshots: BackendScreenshot[] = []\n\n // Run tape against each backend sequentially\n // (parallel would work but sequential is safer for resource-constrained systems)\n for (const spec of options.backends) {\n const backendOpt = typeof spec === \"string\" ? spec : spec.backend\n const backendLabel = typeof spec === \"string\" ? spec : spec.name\n const lastPng: Uint8Array[] = []\n\n const result = await executeTape(tape, {\n ...options.executorOptions,\n backend: backendOpt,\n onScreenshot: (png) => {\n lastPng.push(png)\n },\n })\n\n // If no explicit screenshot command, take one at the end\n let png: Uint8Array\n if (lastPng.length > 0) {\n png = lastPng[lastPng.length - 1]!\n } else {\n png = await screenshotPng(result.terminal)\n }\n\n const text = result.terminal.getText()\n\n screenshots.push({\n backend: backendLabel,\n png,\n text,\n })\n\n await result.terminal.close()\n }\n\n // Check text match\n const texts = screenshots.map((s) => s.text)\n const textMatch = texts.every((t) => t === texts[0])\n\n // Compose based on mode\n let composedSvg: string | undefined\n\n switch (options.mode) {\n case \"separate\":\n // No composition needed\n break\n\n case \"side-by-side\":\n composedSvg = await composeSideBySide(screenshots)\n break\n\n case \"grid\":\n composedSvg = await composeGrid(screenshots)\n break\n\n case \"diff\":\n composedSvg = await composeDiff(screenshots)\n break\n }\n\n return { screenshots, composedSvg, textMatch }\n}\n\n// =============================================================================\n// SVG Composition\n// =============================================================================\n\n/**\n * Compose screenshots horizontally with backend name headers.\n * Generates a wrapper SVG that embeds individual PNGs at their decoded dimensions.\n */\nasync function composeSideBySide(screenshots: BackendScreenshot[]): Promise<string> {\n if (screenshots.length === 0) return \"<svg></svg>\"\n\n const measured = await measureScreenshots(screenshots)\n const headerHeight = 30\n const gap = 10\n\n const totalWidth = measured.reduce((sum, s) => sum + s.width, 0) + (measured.length - 1) * gap\n const totalHeight = Math.max(...measured.map((s) => s.height)) + headerHeight\n\n const parts: string[] = []\n parts.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalWidth}\" height=\"${totalHeight}\">`)\n parts.push(`<rect width=\"100%\" height=\"100%\" fill=\"#1e1e1e\"/>`)\n\n let x = 0\n for (const s of measured) {\n const b64 = uint8ArrayToBase64(s.png)\n\n parts.push(\n `<text x=\"${x + s.width / 2}\" y=\"20\" text-anchor=\"middle\" fill=\"#d4d4d4\" font-family=\"monospace\" font-size=\"14\">${escapeXml(s.backend)}</text>`,\n )\n\n parts.push(\n `<image x=\"${x}\" y=\"${headerHeight}\" width=\"${s.width}\" height=\"${s.height}\" href=\"data:image/png;base64,${b64}\"/>`,\n )\n x += s.width + gap\n }\n\n parts.push(\"</svg>\")\n return parts.join(\"\\n\")\n}\n\n/**\n * Compose screenshots in a grid layout (2 columns).\n */\nasync function composeGrid(screenshots: BackendScreenshot[]): Promise<string> {\n if (screenshots.length === 0) return \"<svg></svg>\"\n\n const measured = await measureScreenshots(screenshots)\n const headerHeight = 30\n const gap = 10\n const gridCols = 2\n const cellWidth = Math.max(...measured.map((s) => s.width))\n const cellHeight = Math.max(...measured.map((s) => s.height))\n\n const gridRows = Math.ceil(measured.length / gridCols)\n const totalWidth = gridCols * cellWidth + (gridCols - 1) * gap\n const totalHeight = gridRows * (cellHeight + headerHeight + gap)\n\n const parts: string[] = []\n parts.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalWidth}\" height=\"${totalHeight}\">`)\n parts.push(`<rect width=\"100%\" height=\"100%\" fill=\"#1e1e1e\"/>`)\n\n for (let i = 0; i < measured.length; i++) {\n const col = i % gridCols\n const row = Math.floor(i / gridCols)\n const x = col * (cellWidth + gap)\n const y = row * (cellHeight + headerHeight + gap)\n const s = measured[i]!\n const b64 = uint8ArrayToBase64(s.png)\n\n parts.push(\n `<text x=\"${x + s.width / 2}\" y=\"${y + 20}\" text-anchor=\"middle\" fill=\"#d4d4d4\" font-family=\"monospace\" font-size=\"14\">${escapeXml(s.backend)}</text>`,\n )\n parts.push(\n `<image x=\"${x}\" y=\"${y + headerHeight}\" width=\"${s.width}\" height=\"${s.height}\" href=\"data:image/png;base64,${b64}\"/>`,\n )\n }\n\n parts.push(\"</svg>\")\n return parts.join(\"\\n\")\n}\n\n/**\n * Compose diff view — show screenshots side by side with pixel diff overlays below.\n */\nasync function composeDiff(screenshots: BackendScreenshot[]): Promise<string> {\n if (screenshots.length < 2) return composeSideBySide(screenshots)\n\n const measured = await measureScreenshots(screenshots)\n const headerHeight = 30\n const diffHeaderHeight = 50\n const gap = 10\n const baseline = screenshots[0]!\n const overlays = await Promise.all(screenshots.slice(1).map((s) => createPixelDiffOverlay(baseline, s)))\n\n const screenshotWidth = measured.reduce((sum, s) => sum + s.width, 0) + (measured.length - 1) * gap\n const screenshotHeight = Math.max(...measured.map((s) => s.height))\n const overlayWidth = overlays.reduce((sum, s) => sum + s.width, 0) + Math.max(0, overlays.length - 1) * gap\n const overlayHeight = Math.max(...overlays.map((s) => s.height))\n const totalWidth = Math.max(screenshotWidth, overlayWidth)\n const overlayY = headerHeight + screenshotHeight + gap + diffHeaderHeight\n const totalHeight = overlayY + overlayHeight\n\n const parts: string[] = []\n parts.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalWidth}\" height=\"${totalHeight}\">`)\n parts.push(`<rect width=\"100%\" height=\"100%\" fill=\"#1e1e1e\"/>`)\n\n let screenshotX = 0\n for (const s of measured) {\n const b64 = uint8ArrayToBase64(s.png)\n\n parts.push(\n `<text x=\"${screenshotX + s.width / 2}\" y=\"20\" text-anchor=\"middle\" fill=\"#d4d4d4\" font-family=\"monospace\" font-size=\"14\">${escapeXml(s.backend)}</text>`,\n )\n parts.push(\n `<image x=\"${screenshotX}\" y=\"${headerHeight}\" width=\"${s.width}\" height=\"${s.height}\" href=\"data:image/png;base64,${b64}\"/>`,\n )\n screenshotX += s.width + gap\n }\n\n const diffY = headerHeight + screenshotHeight + gap\n const texts = screenshots.map((s) => s.text)\n const allMatch = texts.every((t) => t === texts[0])\n\n const diffMessage = allMatch ? \"All backends produced identical text output\" : \"Text output differs between backends\"\n\n const diffColor = allMatch ? \"#4ec9b0\" : \"#f44747\"\n parts.push(\n `<text x=\"10\" y=\"${diffY + 20}\" fill=\"${diffColor}\" font-family=\"monospace\" font-size=\"12\">${escapeXml(diffMessage)}</text>`,\n )\n\n let overlayX = 0\n for (const overlay of overlays) {\n const b64 = uint8ArrayToBase64(overlay.png)\n const changedPct = ((overlay.diffPixels / overlay.totalPixels) * 100).toFixed(2)\n const label = `Pixel diff vs ${baseline.backend}: ${overlay.backend} — ${overlay.diffPixels}/${overlay.totalPixels} changed pixels (${changedPct}%)`\n\n parts.push(\n `<text x=\"${overlayX + overlay.width / 2}\" y=\"${overlayY - 14}\" text-anchor=\"middle\" fill=\"#d4d4d4\" font-family=\"monospace\" font-size=\"12\">${escapeXml(label)}</text>`,\n )\n parts.push(\n `<image data-diff-overlay=\"true\" x=\"${overlayX}\" y=\"${overlayY}\" width=\"${overlay.width}\" height=\"${overlay.height}\" href=\"data:image/png;base64,${b64}\"/>`,\n )\n overlayX += overlay.width + gap\n }\n\n parts.push(\"</svg>\")\n return parts.join(\"\\n\")\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ninterface DecodedPng {\n width: number\n height: number\n rgba: Uint8Array\n}\n\ninterface MeasuredScreenshot extends BackendScreenshot {\n width: number\n height: number\n}\n\ninterface PixelDiffOverlay {\n backend: string\n width: number\n height: number\n png: Uint8Array\n diffPixels: number\n totalPixels: number\n}\n\nasync function loadUpng() {\n if (upngModule) return upngModule\n try {\n upngModule = await import(\"upng-js\")\n return upngModule\n } catch {\n throw new Error(\"diff comparison requires upng-js. Install it:\\n bun add upng-js\")\n }\n}\n\nasync function decodePng(data: Uint8Array): Promise<DecodedPng> {\n const UPNG = await loadUpng()\n const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer\n const decoded = UPNG.decode(buffer)\n const frame = UPNG.toRGBA8(decoded)[0]\n if (!frame) {\n throw new Error(\"PNG decode produced no RGBA frame\")\n }\n return {\n width: decoded.width,\n height: decoded.height,\n rgba: new Uint8Array(frame),\n }\n}\n\nasync function measureScreenshots(screenshots: BackendScreenshot[]): Promise<MeasuredScreenshot[]> {\n const UPNG = await loadUpng()\n return screenshots.map((s) => {\n const buffer = s.png.buffer.slice(s.png.byteOffset, s.png.byteOffset + s.png.byteLength) as ArrayBuffer\n const decoded = UPNG.decode(buffer)\n return {\n ...s,\n width: decoded.width,\n height: decoded.height,\n }\n })\n}\n\nasync function createPixelDiffOverlay(\n baseline: BackendScreenshot,\n target: BackendScreenshot,\n): Promise<PixelDiffOverlay> {\n const UPNG = await loadUpng()\n const [a, b] = await Promise.all([decodePng(baseline.png), decodePng(target.png)])\n const width = Math.max(a.width, b.width)\n const height = Math.max(a.height, b.height)\n const output = new Uint8Array(width * height * 4)\n let diffPixels = 0\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const outIndex = (y * width + x) * 4\n const inA = x < a.width && y < a.height\n const inB = x < b.width && y < b.height\n const aIndex = (y * a.width + x) * 4\n const bIndex = (y * b.width + x) * 4\n const same =\n inA &&\n inB &&\n a.rgba[aIndex] === b.rgba[bIndex] &&\n a.rgba[aIndex + 1] === b.rgba[bIndex + 1] &&\n a.rgba[aIndex + 2] === b.rgba[bIndex + 2] &&\n a.rgba[aIndex + 3] === b.rgba[bIndex + 3]\n\n if (!same) {\n diffPixels++\n output[outIndex] = 255\n output[outIndex + 1] = 0\n output[outIndex + 2] = 255\n output[outIndex + 3] = 220\n }\n }\n }\n\n const png = UPNG.encode([output.buffer as ArrayBuffer], width, height, 0)\n return {\n backend: target.backend,\n width,\n height,\n png: new Uint8Array(png),\n diffPixels,\n totalPixels: width * height,\n }\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\")\n}\n\nfunction uint8ArrayToBase64(data: Uint8Array): string {\n // Use Buffer if available (Node.js/Bun), otherwise manual encoding\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(data).toString(\"base64\")\n }\n let binary = \"\"\n for (const byte of data) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary)\n}\n","/**\n * Terminal snapshots — a frozen copy of a terminal's visible cell grid.\n *\n * A live {@link Terminal} keeps mutating as its process emits output. To\n * record an animation you must *freeze* each frame: deep-copy the cell grid +\n * cursor at capture time, then render the frozen copies afterwards. A\n * {@link TerminalSnapshot} is that frozen copy, and {@link snapshotReadable}\n * wraps one as a {@link TerminalReadable} so any renderer — `screenshotSvg`,\n * swash's `renderCells`, `renderTerminalPng` — can paint it long after the\n * source terminal has closed.\n */\n\nimport type { Cell, CursorState, Terminal, TerminalReadable } from \"./types.ts\"\n\n/** A frozen copy of a terminal's visible cell grid + cursor. */\nexport interface TerminalSnapshot {\n grid: Cell[][]\n cursor: CursorState\n cols: number\n rows: number\n title: string\n}\n\nconst BLANK_CELL: Cell = {\n char: \" \",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n underlineColor: null,\n strikethrough: false,\n inverse: false,\n blink: false,\n hidden: false,\n wide: false,\n continuation: false,\n hyperlink: null,\n}\n\n/** Deep-copy a terminal's current visible state into a {@link TerminalSnapshot}. */\nexport function snapshotTerminal(term: Terminal): TerminalSnapshot {\n const grid = term.getLines().map((row) => row.map((cell) => ({ ...cell })))\n let cursor: CursorState\n try {\n cursor = term.getCursor()\n } catch {\n cursor = { x: 0, y: 0, visible: false, style: null }\n }\n let title = \"\"\n try {\n title = term.getTitle()\n } catch {\n // ignore — title is optional\n }\n return { grid, cursor, cols: term.cols, rows: term.rows, title }\n}\n\n/**\n * Wrap a {@link TerminalSnapshot} as a {@link TerminalReadable}. The snapshot\n * is a frozen copy, so this view is stable even after the source terminal has\n * closed — which is exactly what frame-by-frame rendering needs.\n */\nexport function snapshotReadable(snap: TerminalSnapshot): TerminalReadable {\n const cellAt = (row: number, col: number): Cell => snap.grid[row]?.[col] ?? BLANK_CELL\n return {\n getText: () => snap.grid.map((row) => row.map((c) => c.char || \" \").join(\"\")).join(\"\\n\"),\n getTextRange: (r1: number, c1: number, r2: number, c2: number) => {\n const out: string[] = []\n for (let r = r1; r <= r2; r++) {\n let line = \"\"\n for (let c = c1; c <= c2; c++) line += cellAt(r, c).char || \" \"\n out.push(line)\n }\n return out.join(\"\\n\")\n },\n getCell: cellAt,\n getLine: (row: number) => snap.grid[row] ?? [],\n getLines: () => snap.grid,\n getCursor: () => snap.cursor,\n getMode: () => false,\n getTitle: () => snap.title,\n getScrollback: () => ({ lines: [], total: 0 }),\n cols: snap.cols,\n rows: snap.rows,\n } as unknown as TerminalReadable\n}\n","/**\n * Visual Eyes Phase 7 — cross-backend canvas compare.\n *\n * The \"one renderer, N parsers\" design (Phase 3): the same `.tape` is replayed\n * through each backend's *own* VT parser, then every resulting terminal state\n * is rendered through the **same** canvas pipeline (`renderTerminalPng` —\n * ghostty-web's CanvasRenderer + native Skia). Because the renderer is held\n * constant, any pixel difference between two panels is attributable to a\n * **parser divergence** — not a rendering-engine difference.\n *\n * This is what catches real parser bugs: OSC8 hyperlink handling, wide-char\n * width disagreements, DEC private mode interpretation, kitty-graphics, etc.\n *\n * Contrast with {@link compareTape} (`./compare.ts`), which screenshots each\n * backend through *its own* SVG renderer — that mixes parser + renderer\n * differences and can't isolate one from the other.\n *\n * Three compare modes:\n *\n * - **side-by-side** — N panels in a labeled row, one per backend.\n * - **diff** — the N panels PLUS an extra \"divergence\" panel where\n * any pixel that differs between *any* pair of backends\n * is painted red.\n * - **separate** — no composition; the per-backend PNGs are returned raw.\n *\n * Animation: when `animate: true`, every Screenshot command in the tape (or a\n * synthetic final frame) becomes a GIF frame; the per-backend GIF streams are\n * time-synced (same frame count, same per-frame delay) so they can be played\n * side by side.\n */\n\nimport type { TapeFile } from \"./parser.ts\"\nimport type { Cell, CursorState, Terminal, TerminalBackend, TerminalReadable } from \"../../terminal/types.ts\"\nimport { snapshotTerminal, snapshotReadable, type TerminalSnapshot } from \"../../terminal/snapshot.ts\"\nimport { executeTape, type TapeExecutorOptions } from \"./executor.ts\"\nimport { renderTerminalPng, type CanvasTheme, type RenderOptions } from \"@termless/ghostty\"\nimport { pngDimensions } from \"../../compare.ts\"\nimport { encodePng, decodePngRgba, type RgbaImage } from \"./png-codec.ts\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type CanvasCompareMode = \"separate\" | \"side-by-side\" | \"diff\"\n\n/** A backend specification: a name string, or a pre-created instance + label. */\nexport type CanvasBackendSpec = string | { name: string; backend: TerminalBackend }\n\nexport interface CanvasCompareOptions {\n /** Backend names or instances to compare. At least one; ≥2 for `diff`. */\n backends: CanvasBackendSpec[]\n /** Compare mode. Default `side-by-side`. */\n mode?: CanvasCompareMode\n /** Canvas render options forwarded to `renderTerminalPng` (theme, font, dpr). */\n render?: Pick<RenderOptions, \"fontSize\" | \"fontFamily\" | \"fontPath\" | \"dpr\"> & { theme?: CanvasTheme }\n /** Terminal columns override. */\n cols?: number\n /** Terminal rows override. */\n rows?: number\n /** Executor options forwarded to each backend run. */\n executorOptions?: Omit<TapeExecutorOptions, \"backend\">\n /**\n * Collect a frame per Screenshot command (plus a final frame) so the caller\n * can stitch a time-synced GIF. Default false (single final frame only).\n */\n animate?: boolean\n /** Panel caption height in px. Default 28. */\n captionHeight?: number\n /** Gap between panels in px. Default 12. */\n gap?: number\n}\n\n/** One backend's render of one tape frame. */\nexport interface CanvasBackendFrame {\n /** PNG bytes from `renderTerminalPng`. */\n png: Uint8Array\n /** Decoded RGBA (lazy-filled by the compositor). */\n rgba?: RgbaImage\n}\n\n/** A backend's full result: label, text, and the per-frame canvas renders. */\nexport interface CanvasBackendResult {\n backend: string\n /** Final terminal text — used for the text-equality check. */\n text: string\n /** One entry per captured frame (≥1; last entry is the final state). */\n frames: CanvasBackendFrame[]\n}\n\nexport interface CanvasCompareResult {\n /** Per-backend results, in input order. */\n backends: CanvasBackendResult[]\n /** Composed PNG (side-by-side / diff modes); undefined for `separate`. */\n composedPng?: Uint8Array\n /** Composed PNG per frame when `animate` is set — index-aligned across time. */\n composedFrames?: Uint8Array[]\n /** True iff every backend produced byte-identical final text. */\n textMatch: boolean\n /** Diff mode only: count of pixels that differ between any backend pair. */\n divergentPixels?: number\n /** Total pixels considered for the divergence overlay. */\n totalPixels?: number\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Replay a tape through N backends and render every result through the same\n * canvas pipeline. See the file header for the design rationale.\n */\nexport async function compareCanvas(tape: TapeFile, options: CanvasCompareOptions): Promise<CanvasCompareResult> {\n if (options.backends.length === 0) {\n throw new Error(\"compareCanvas: at least one backend is required\")\n }\n const mode = options.mode ?? \"side-by-side\"\n const captionHeight = options.captionHeight ?? 28\n const gap = options.gap ?? 12\n\n const results: CanvasBackendResult[] = []\n\n // ── Run the tape through each backend, render every frame via the canvas ──\n for (const spec of options.backends) {\n const backendOpt = typeof spec === \"string\" ? spec : spec.backend\n const backendLabel = typeof spec === \"string\" ? spec : spec.name\n\n // Frames are captured as terminal *snapshots* — a deep copy of the cell\n // grid + cursor. We render each snapshot through the canvas after the run\n // so the renderer config is identical across every backend and frame.\n // Capturing the real Cell[][] (not just text) preserves colour, wide\n // chars, and hyperlinks — so parser divergence in any of those surfaces.\n const snapshots: TerminalSnapshot[] = []\n const capture = (term: Terminal) => {\n snapshots.push(snapshotTerminal(term))\n }\n\n const run = await executeTape(tape, {\n ...options.executorOptions,\n backend: backendOpt,\n ...(options.cols != null ? { cols: options.cols } : {}),\n ...(options.rows != null ? { rows: options.rows } : {}),\n onScreenshot: options.animate\n ? (_png, _path) => {\n // The screenshot callback fires inside executeTape; the terminal\n // is captured via onAfterCommand below to get the post-command\n // state. Here we just mark intent — see onAfterCommand.\n }\n : undefined,\n onAfterCommand: options.animate\n ? (cmd, term) => {\n if (cmd.type === \"screenshot\") capture(term)\n }\n : undefined,\n })\n\n // Always capture the final state as the last frame.\n capture(run.terminal)\n\n const renderOpts: RenderOptions = {\n cols: run.terminal.cols,\n rows: run.terminal.rows,\n ...(options.render?.fontSize != null ? { fontSize: options.render.fontSize } : {}),\n ...(options.render?.fontFamily != null ? { fontFamily: options.render.fontFamily } : {}),\n ...(options.render?.fontPath != null ? { fontPath: options.render.fontPath } : {}),\n ...(options.render?.dpr != null ? { dpr: options.render.dpr } : {}),\n ...(options.render?.theme ? { theme: options.render.theme } : {}),\n }\n\n const frames: CanvasBackendFrame[] = []\n for (const snap of snapshots) {\n const png = await renderTerminalPng(snapshotReadable(snap), renderOpts)\n frames.push({ png })\n }\n\n const text = run.terminal.getText()\n results.push({ backend: backendLabel, text, frames })\n await run.terminal.close()\n }\n\n const textMatch = results.every((r) => r.text === results[0]!.text)\n\n // ── separate: no composition ─────────────────────────────\n if (mode === \"separate\") {\n return { backends: results, textMatch }\n }\n\n // ── Compose ──────────────────────────────────────────────\n // Time-sync: every backend gets `frameCount` frames. Backends with fewer\n // frames repeat their last frame (a tape may screenshot at different\n // points, but the canonical use is identical tapes → identical counts).\n const frameCount = options.animate ? Math.max(...results.map((r) => r.frames.length)) : 1\n\n const composedFrames: Uint8Array[] = []\n let lastDivergent = 0\n let lastTotal = 0\n\n for (let f = 0; f < frameCount; f++) {\n const panelImages = results.map((r) => {\n const idx = options.animate ? Math.min(f, r.frames.length - 1) : r.frames.length - 1\n return { label: r.backend, png: r.frames[idx]!.png }\n })\n\n if (mode === \"diff\") {\n const composed = composeDiff(panelImages, { captionHeight, gap })\n composedFrames.push(composed.png)\n lastDivergent = composed.divergentPixels\n lastTotal = composed.totalPixels\n } else {\n composedFrames.push(composeSideBySide(panelImages, { captionHeight, gap }))\n }\n }\n\n return {\n backends: results,\n composedPng: composedFrames[composedFrames.length - 1],\n ...(options.animate ? { composedFrames } : {}),\n textMatch,\n ...(mode === \"diff\" ? { divergentPixels: lastDivergent, totalPixels: lastTotal } : {}),\n }\n}\n\n// =============================================================================\n// Composition (PNG → PNG, no SVG round-trip)\n// =============================================================================\n\ninterface PanelImage {\n label: string\n png: Uint8Array\n}\n\ninterface ComposeLayout {\n captionHeight: number\n gap: number\n}\n\n/** Background colour of the composed canvas. */\nconst BG: [number, number, number, number] = [26, 27, 38, 255] // Tokyo Night bg\n/** Caption text colour. */\nconst FG: [number, number, number, number] = [192, 202, 245, 255]\n/** Divergence overlay colour. */\nconst DIVERGE: [number, number, number, number] = [255, 64, 64, 235]\n\n/**\n * Compose N panels into one labelled row. Each panel is captioned with its\n * backend name. The result is a single PNG.\n */\nexport function composeSideBySide(panels: PanelImage[], layout: ComposeLayout): Uint8Array {\n const decoded = panels.map((p) => ({ label: p.label, img: decodePngRgba(p.png) }))\n const { captionHeight, gap } = layout\n\n const panelHeight = Math.max(...decoded.map((d) => d.img.height))\n const totalWidth = decoded.reduce((s, d) => s + d.img.width, 0) + (decoded.length - 1) * gap\n const totalHeight = panelHeight + captionHeight\n\n const canvas = blankImage(totalWidth, totalHeight)\n\n let x = 0\n for (const d of decoded) {\n drawCaption(canvas, d.label, x, d.img.width, captionHeight)\n blit(canvas, d.img, x, captionHeight)\n x += d.img.width + gap\n }\n return encodePng(canvas)\n}\n\n/**\n * Compose N panels PLUS a divergence panel. The divergence panel starts as the\n * first backend's render and overlays red on every pixel that differs between\n * any pair of backends.\n */\nexport function composeDiff(\n panels: PanelImage[],\n layout: ComposeLayout,\n): { png: Uint8Array; divergentPixels: number; totalPixels: number } {\n if (panels.length < 2) {\n return { png: composeSideBySide(panels, layout), divergentPixels: 0, totalPixels: 0 }\n }\n const decoded = panels.map((p) => ({ label: p.label, img: decodePngRgba(p.png) }))\n const { captionHeight, gap } = layout\n\n // Divergence mask — over the common (min) area of all panels.\n const width = Math.min(...decoded.map((d) => d.img.width))\n const height = Math.min(...decoded.map((d) => d.img.height))\n const overlay = cloneRegion(decoded[0]!.img, width, height)\n let divergentPixels = 0\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let divergent = false\n const base = decoded[0]!.img\n const bi = (y * base.width + x) * 4\n for (let p = 1; p < decoded.length && !divergent; p++) {\n const other = decoded[p]!.img\n const oi = (y * other.width + x) * 4\n if (\n base.data[bi] !== other.data[oi] ||\n base.data[bi + 1] !== other.data[oi + 1] ||\n base.data[bi + 2] !== other.data[oi + 2] ||\n base.data[bi + 3] !== other.data[oi + 3]\n ) {\n divergent = true\n }\n }\n if (divergent) {\n divergentPixels++\n const di = (y * width + x) * 4\n // Alpha-blend the red overlay over the base pixel.\n const a = DIVERGE[3] / 255\n overlay.data[di] = Math.round(DIVERGE[0] * a + overlay.data[di]! * (1 - a))\n overlay.data[di + 1] = Math.round(DIVERGE[1] * a + overlay.data[di + 1]! * (1 - a))\n overlay.data[di + 2] = Math.round(DIVERGE[2] * a + overlay.data[di + 2]! * (1 - a))\n overlay.data[di + 3] = 255\n }\n }\n }\n\n const allPanels: { label: string; img: RgbaImage }[] = [\n ...decoded,\n { label: `divergence (${divergentPixels} px)`, img: overlay },\n ]\n\n const panelHeight = Math.max(...allPanels.map((d) => d.img.height))\n const totalWidth = allPanels.reduce((s, d) => s + d.img.width, 0) + (allPanels.length - 1) * gap\n const totalHeight = panelHeight + captionHeight\n\n const canvas = blankImage(totalWidth, totalHeight)\n let cx = 0\n for (const d of allPanels) {\n drawCaption(canvas, d.label, cx, d.img.width, captionHeight)\n blit(canvas, d.img, cx, captionHeight)\n cx += d.img.width + gap\n }\n\n return { png: encodePng(canvas), divergentPixels, totalPixels: width * height }\n}\n\n// =============================================================================\n// Raster helpers\n// =============================================================================\n\nfunction blankImage(width: number, height: number): RgbaImage {\n const data = new Uint8Array(width * height * 4)\n for (let i = 0; i < data.length; i += 4) {\n data[i] = BG[0]\n data[i + 1] = BG[1]\n data[i + 2] = BG[2]\n data[i + 3] = BG[3]\n }\n return { width, height, data }\n}\n\nfunction cloneRegion(src: RgbaImage, width: number, height: number): RgbaImage {\n const data = new Uint8Array(width * height * 4)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const si = (y * src.width + x) * 4\n const di = (y * width + x) * 4\n data[di] = src.data[si]!\n data[di + 1] = src.data[si + 1]!\n data[di + 2] = src.data[si + 2]!\n data[di + 3] = src.data[si + 3]!\n }\n }\n return { width, height, data }\n}\n\n/** Copy `src` onto `dst` at (ox, oy). Source is clipped to the destination. */\nfunction blit(dst: RgbaImage, src: RgbaImage, ox: number, oy: number): void {\n for (let y = 0; y < src.height; y++) {\n const dy = oy + y\n if (dy < 0 || dy >= dst.height) continue\n for (let x = 0; x < src.width; x++) {\n const dx = ox + x\n if (dx < 0 || dx >= dst.width) continue\n const si = (y * src.width + x) * 4\n const di = (dy * dst.width + dx) * 4\n dst.data[di] = src.data[si]!\n dst.data[di + 1] = src.data[si + 1]!\n dst.data[di + 2] = src.data[si + 2]!\n dst.data[di + 3] = src.data[si + 3]!\n }\n }\n}\n\n/**\n * Draw a backend caption — a 5×7 bitmap-font label, left-padded, vertically\n * centred in the caption band. Dependency-free so compose works without a\n * canvas/font stack.\n */\nfunction drawCaption(dst: RgbaImage, label: string, ox: number, panelWidth: number, captionHeight: number): void {\n const scale = 2\n const glyphW = 6 * scale\n const glyphH = 7 * scale\n const text = label.slice(0, Math.max(0, Math.floor(panelWidth / glyphW)))\n const textWidth = text.length * glyphW\n const startX = ox + Math.max(2, Math.floor((panelWidth - textWidth) / 2))\n const startY = Math.max(0, Math.floor((captionHeight - glyphH) / 2))\n\n for (let i = 0; i < text.length; i++) {\n const glyph = FONT5x7[text[i]!.toUpperCase()] ?? FONT5x7[\"?\"]!\n for (let row = 0; row < 7; row++) {\n const bits = glyph[row]!\n for (let col = 0; col < 5; col++) {\n if ((bits >> (4 - col)) & 1) {\n fillRect(dst, startX + (i * 6 + col) * scale, startY + row * scale, scale, scale, FG)\n }\n }\n }\n }\n}\n\nfunction fillRect(\n dst: RgbaImage,\n ox: number,\n oy: number,\n w: number,\n h: number,\n color: [number, number, number, number],\n): void {\n for (let y = 0; y < h; y++) {\n const dy = oy + y\n if (dy < 0 || dy >= dst.height) continue\n for (let x = 0; x < w; x++) {\n const dx = ox + x\n if (dx < 0 || dx >= dst.width) continue\n const di = (dy * dst.width + dx) * 4\n dst.data[di] = color[0]\n dst.data[di + 1] = color[1]\n dst.data[di + 2] = color[2]\n dst.data[di + 3] = color[3]\n }\n }\n}\n\n/** Minimal 5×7 bitmap font — uppercase letters, digits, common punctuation. */\nconst FONT5x7: Record<string, number[]> = {\n A: [0x0e, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11],\n B: [0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e],\n C: [0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e],\n D: [0x1e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1e],\n E: [0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x1f],\n F: [0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x10],\n G: [0x0e, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0f],\n H: [0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11],\n I: [0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e],\n J: [0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c],\n K: [0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11],\n L: [0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f],\n M: [0x11, 0x1b, 0x15, 0x15, 0x11, 0x11, 0x11],\n N: [0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x11],\n O: [0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e],\n P: [0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10],\n Q: [0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d],\n R: [0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11],\n S: [0x0f, 0x10, 0x10, 0x0e, 0x01, 0x01, 0x1e],\n T: [0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04],\n U: [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e],\n V: [0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04],\n W: [0x11, 0x11, 0x11, 0x15, 0x15, 0x1b, 0x11],\n X: [0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11],\n Y: [0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x04],\n Z: [0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f],\n \"0\": [0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e],\n \"1\": [0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x0e],\n \"2\": [0x0e, 0x11, 0x01, 0x06, 0x08, 0x10, 0x1f],\n \"3\": [0x1f, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0e],\n \"4\": [0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02],\n \"5\": [0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e],\n \"6\": [0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e],\n \"7\": [0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08],\n \"8\": [0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e],\n \"9\": [0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c],\n \" \": [0, 0, 0, 0, 0, 0, 0],\n \"-\": [0, 0, 0, 0x1f, 0, 0, 0],\n \".\": [0, 0, 0, 0, 0, 0x0c, 0x0c],\n \",\": [0, 0, 0, 0, 0, 0x0c, 0x08],\n \"(\": [0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02],\n \")\": [0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08],\n \":\": [0, 0x0c, 0x0c, 0, 0x0c, 0x0c, 0],\n \"/\": [0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10],\n _: [0, 0, 0, 0, 0, 0, 0x1f],\n \"?\": [0x0e, 0x11, 0x01, 0x02, 0x04, 0, 0x04],\n}\n\n// Re-export for callers that need to verify panel geometry.\nexport { pngDimensions }\n","/**\n * Keystroke overlay for SVG screenshots.\n *\n * Renders a translucent badge with the current keystroke/shortcut\n * in a corner of the SVG frame — like KeyCastr for terminal recordings.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface KeyOverlayOptions {\n /** Position of the overlay badge */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\"\n /** Font size for the key label */\n fontSize?: number\n /** Padding inside the badge */\n padding?: number\n /** Background opacity (0-1) */\n opacity?: number\n}\n\n// =============================================================================\n// SVG dimension parsing\n// =============================================================================\n\n/**\n * Extract width and height from an SVG string's root element attributes.\n */\nfunction parseSvgDimensions(svg: string): { width: number; height: number } {\n const widthMatch = svg.match(/\\bwidth=\"(\\d+(?:\\.\\d+)?)\"/)\n const heightMatch = svg.match(/\\bheight=\"(\\d+(?:\\.\\d+)?)\"/)\n return {\n width: widthMatch ? Number.parseFloat(widthMatch[1]!) : 672,\n height: heightMatch ? Number.parseFloat(heightMatch[1]!) : 432,\n }\n}\n\n// =============================================================================\n// XML escaping\n// =============================================================================\n\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\")\n}\n\n// =============================================================================\n// Overlay renderer\n// =============================================================================\n\n/**\n * Overlay a keystroke badge on an SVG screenshot.\n *\n * Parses the SVG dimensions, inserts a rounded-rect badge with the key label\n * before the closing `</svg>` tag.\n *\n * @param svg - The SVG string to overlay on\n * @param keystroke - Human-readable keystroke (e.g., \"Ctrl+C\", \"Enter\", \"j\")\n * @param options - Positioning and styling options\n * @returns The modified SVG string with the badge\n */\nexport function overlayKeystroke(svg: string, keystroke: string, options?: KeyOverlayOptions): string {\n if (!keystroke) return svg\n\n const position = options?.position ?? \"bottom-right\"\n const fontSize = options?.fontSize ?? 14\n const padding = options?.padding ?? 8\n const opacity = options?.opacity ?? 0.75\n\n const { width, height } = parseSvgDimensions(svg)\n\n // Approximate text width based on character count and font size\n const charWidth = fontSize * 0.62\n const textWidth = keystroke.length * charWidth\n const badgeWidth = textWidth + padding * 2\n const badgeHeight = fontSize + padding * 2\n const borderRadius = 6\n const margin = 10\n\n // Position the badge\n let x: number\n let y: number\n\n switch (position) {\n case \"bottom-right\":\n x = width - badgeWidth - margin\n y = height - badgeHeight - margin\n break\n case \"bottom-left\":\n x = margin\n y = height - badgeHeight - margin\n break\n case \"top-right\":\n x = width - badgeWidth - margin\n y = margin\n break\n case \"top-left\":\n x = margin\n y = margin\n break\n }\n\n // Center text within badge\n const textX = x + padding\n const textY = y + padding + fontSize * 0.82 // baseline offset\n\n const badge = [\n `<g class=\"key-overlay\">`,\n `<rect x=\"${x}\" y=\"${y}\" width=\"${badgeWidth}\" height=\"${badgeHeight}\" rx=\"${borderRadius}\" ry=\"${borderRadius}\" fill=\"rgba(0,0,0,${opacity})\"/>`,\n `<text x=\"${textX}\" y=\"${textY}\" font-family=\"'Menlo', 'Monaco', 'Courier New', monospace\" font-size=\"${fontSize}\" fill=\"#ffffff\">${escapeXml(keystroke)}</text>`,\n `</g>`,\n ].join(\"\\n\")\n\n // Insert before closing </svg>\n return svg.replace(\"</svg>\", `${badge}\\n</svg>`)\n}\n","/**\n * `.tape` → `Recording` compiler.\n *\n * A `.tape` file is a *scenario script* — high-level directives (`Type`,\n * `Sleep`, `Screenshot`, …). This module is the **compiler** that lowers a\n * parsed `TapeFile` into the in-memory {@link Recording} model's `commands`\n * source track.\n *\n * It is deliberately **not a symmetric codec**: `.tape` carries intent,\n * `Recording.commands` carries the same intent in the unified shape, and the\n * inverse direction ({@link \"./codegen.ts\"}) is best-effort and lossy. The\n * design doc (§4) is explicit that `.tape` is a compiler input, not a peer of\n * `.cast`.\n *\n * Compilation model — the `commands` track is timed on the recording's\n * monotonic µs clock. The compiler walks the tape advancing a virtual clock:\n *\n * - `Type` — emitted as a single `{ kind: \"type\" }` command at the current\n * clock; the clock advances by `text.length × speed` (the per-character\n * typing delay the executor would apply). `speedMicros` records the\n * per-character delay so a player can reproduce the cadence.\n * - `Enter`/`Backspace`/… — `{ kind: \"key\" }`; a `count` > 1 advances the\n * clock by `count × 50ms` (mirroring the executor's inter-press delay).\n * - `Ctrl+x` / `Alt+x` — `{ kind: \"ctrl\" }` / `{ kind: \"alt\" }`.\n * - `Sleep` — `{ kind: \"sleep\" }`; advances the clock by the sleep duration.\n * - `Set Width|Height` — `{ kind: \"resize\" }`; other `Set` keys → a\n * `{ kind: \"set\" }` directive (environment change).\n * - `Screenshot` — `{ kind: \"screenshot\" }`. A *render directive*, NOT a\n * {@link Frame} — the design doc (§4) is explicit it must not collapse into\n * the frames projection.\n * - `Hide`/`Show`/`Output`/`Source`/`Require`/`Expect` — player/CLI\n * directives with no place on the `commands` track; dropped, surfaced via\n * {@link CompileTapeResult.dropped} so callers can warn.\n *\n * `Set Width`/`Set Height` also seed the recording's initial `cols`/`rows`.\n */\n\nimport { createTerminal } from \"../../terminal/terminal.ts\"\nimport { type Command, type Micros, type Recording, createRecording, micros, millisToMicros } from \"../recording.ts\"\nimport { type TapeCommand, type TapeFile, parseTape } from \"./parser.ts\"\n\n// =============================================================================\n// Options + result\n// =============================================================================\n\n/** Options for {@link compileTape}. */\nexport interface CompileTapeOptions {\n /** Override terminal columns (else `Set Width`, else 80). */\n cols?: number\n /** Override terminal rows (else `Set Height`, else 24). */\n rows?: number\n /**\n * Default per-character typing delay in ms used to advance the virtual\n * clock for a `Type` with no explicit `@speed`. Mirrors the executor's\n * `defaultTypingSpeed` (default 50ms).\n */\n defaultTypingSpeedMs?: number\n}\n\n/** Result of {@link compileTape}. */\nexport interface CompileTapeResult {\n /** The compiled in-memory recording (carries a `commands` track). */\n recording: Recording\n /**\n * Tape commands with no representation on the `commands` track —\n * `Output`, `Hide`, `Show`, `Source`, `Require`, `Expect`. Surfaced so a\n * caller can warn that information was dropped; the compile itself never\n * fails on them.\n */\n dropped: TapeCommand[]\n}\n\n// =============================================================================\n// Compiler\n// =============================================================================\n\nconst DEFAULT_TYPING_SPEED_MS = 50\nconst INTER_PRESS_DELAY_MS = 50\n\n/** Tape command `type` values that have no `commands`-track representation. */\nconst DROPPED_KINDS = new Set<TapeCommand[\"type\"]>([\"output\", \"hide\", \"show\", \"source\", \"require\", \"expect\"])\n\n/**\n * Compile a parsed `.tape` into a {@link Recording} carrying a `commands`\n * source track.\n *\n * The result recording has `io` and `frames` undefined — a hand-authored\n * tape is intent-only. `provenance.reproducible` stays at its default\n * (`true`): the session's frames *could* be derived by playing the commands.\n */\nexport function compileTape(tape: TapeFile, options?: CompileTapeOptions): CompileTapeResult {\n const settingWidth = tape.settings.Width ? Number.parseInt(tape.settings.Width, 10) : undefined\n const settingHeight = tape.settings.Height ? Number.parseInt(tape.settings.Height, 10) : undefined\n let cols = options?.cols ?? settingWidth ?? 80\n let rows = options?.rows ?? settingHeight ?? 24\n\n const defaultSpeedMs = options?.defaultTypingSpeedMs ?? DEFAULT_TYPING_SPEED_MS\n\n const commands: Command[] = []\n const dropped: TapeCommand[] = []\n // Virtual clock in microseconds, advancing as the tape \"executes\".\n let clockMicros = 0\n\n const at = (): Micros => micros(clockMicros)\n\n for (const cmd of tape.commands) {\n if (DROPPED_KINDS.has(cmd.type)) {\n dropped.push(cmd)\n continue\n }\n switch (cmd.type) {\n case \"set\": {\n if (cmd.key === \"Width\") {\n cols = Number.parseInt(cmd.value, 10) || cols\n commands.push({ kind: \"resize\", at: at(), cols, rows })\n } else if (cmd.key === \"Height\") {\n rows = Number.parseInt(cmd.value, 10) || rows\n commands.push({ kind: \"resize\", at: at(), cols, rows })\n } else {\n commands.push({ kind: \"set\", at: at(), key: cmd.key, value: cmd.value })\n }\n break\n }\n case \"type\": {\n // The clock advances by the *effective* typing speed (explicit\n // `@speed` or the default). `speedMicros` is recorded ONLY when the\n // tape authored an explicit `@speed` — the default cadence is not\n // intent, so it must not survive `Recording → .tape` codegen.\n const effectiveSpeedMs = cmd.speed ?? defaultSpeedMs\n commands.push(\n cmd.speed !== undefined\n ? { kind: \"type\", at: at(), text: cmd.text, speedMicros: millisToMicros(cmd.speed) }\n : { kind: \"type\", at: at(), text: cmd.text },\n )\n clockMicros += effectiveSpeedMs * cmd.text.length * 1000\n break\n }\n case \"key\": {\n const count = cmd.count ?? 1\n commands.push(\n count > 1 ? { kind: \"key\", at: at(), key: cmd.key, count } : { kind: \"key\", at: at(), key: cmd.key },\n )\n if (count > 1) clockMicros += INTER_PRESS_DELAY_MS * (count - 1) * 1000\n break\n }\n case \"ctrl\":\n commands.push({ kind: \"ctrl\", at: at(), key: cmd.key })\n break\n case \"alt\":\n commands.push({ kind: \"alt\", at: at(), key: cmd.key })\n break\n case \"sleep\": {\n const durationMicros = millisToMicros(cmd.ms)\n commands.push({ kind: \"sleep\", at: at(), durationMicros })\n clockMicros += cmd.ms * 1000\n break\n }\n case \"screenshot\":\n commands.push(\n cmd.path !== undefined ? { kind: \"screenshot\", at: at(), path: cmd.path } : { kind: \"screenshot\", at: at() },\n )\n break\n }\n }\n\n // A tape with no compilable command still produces a valid (empty-intent)\n // recording is impossible — createRecording rejects an all-empty Recording.\n // Seed a zero-duration sleep so a fully-dropped tape still yields a\n // Recording rather than throwing; this keeps `compileTape` total.\n if (commands.length === 0) {\n commands.push({ kind: \"sleep\", at: micros(0), durationMicros: micros(0) })\n }\n\n const recording = createRecording({\n cols,\n rows,\n durationMicros: micros(clockMicros),\n commands,\n })\n return { recording, dropped }\n}\n\n/** Convenience: parse `.tape` source text and compile it in one call. */\nexport function compileTapeSource(source: string, options?: CompileTapeOptions): CompileTapeResult {\n return compileTape(parseTape(source), options)\n}\n\n/**\n * Construct a live {@link Terminal} sized to a compiled recording.\n *\n * A small convenience for `play`-style consumers — the `commands` track has\n * no opinion about the backend, so the caller still passes one in.\n */\nexport function terminalForRecording(\n recording: Recording,\n backend: Parameters<typeof createTerminal>[0][\"backend\"],\n): ReturnType<typeof createTerminal> {\n return createTerminal({ backend, cols: recording.cols, rows: recording.rows })\n}\n","/**\n * `Recording` → `.tape` codegen — **best-effort and lossy**.\n *\n * This is the inverse of {@link \"./compile.ts\"}, but `.tape` is a *compiler\n * input*, not a symmetric codec (design doc §4): the round-trip\n * `.tape → Recording → .tape` is **lossy by nature**, and so is\n * `Recording → .tape` from a recording that originated elsewhere.\n *\n * What this module can and cannot do:\n *\n * - It serializes the `commands` track only. A recording with no `commands`\n * track (a decoded `.cast`, an io-only capture) has *no* intent to render\n * as a `.tape` — {@link generateTape} throws for it.\n * - The `io` and `frames` members are dropped — `.tape` has no syntax for raw\n * bytes or rendered frames.\n * - Timing is not perfectly preserved: `.tape` expresses cadence through\n * `Sleep` directives and `Type@speed`, not absolute timestamps. The\n * generated tape inserts a `Sleep` whenever the gap between two commands\n * exceeds a threshold, approximating — not reproducing — the original\n * clock.\n *\n * Use it for *human-readable export* of an authored recording, never as a\n * lossless serialization. The native `.rec` format (Phase 5) is the lossless\n * round-trip.\n */\n\nimport type { Command, Recording } from \"../recording.ts\"\n\n/** Options for {@link generateTape}. */\nexport interface GenerateTapeOptions {\n /** Emit a leading `Output <path>` directive. */\n output?: string\n /**\n * Emit `Set Width`/`Set Height` from the recording dimensions as the first\n * directives. Default: `true`.\n */\n emitDimensions?: boolean\n /**\n * Minimum gap (µs) between two commands before a `Sleep` is synthesized to\n * bridge it. Smaller gaps are treated as natural typing cadence and\n * dropped. Default: 250_000 (250ms).\n */\n sleepThresholdMicros?: number\n}\n\nconst DEFAULT_SLEEP_THRESHOLD = 250_000\n\n/** Quote a string for the `.tape` `Type \"...\"` / `Set k \"v\"` syntax. */\nfunction quote(s: string): string {\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`\n}\n\n/** Render a single {@link Command} as one or more `.tape` lines. */\nfunction commandToLines(cmd: Command): string[] {\n switch (cmd.kind) {\n case \"type\": {\n if (cmd.speedMicros !== undefined) {\n const ms = Math.round(cmd.speedMicros / 1000)\n return [`Type@${ms}ms ${quote(cmd.text)}`]\n }\n return [`Type ${quote(cmd.text)}`]\n }\n case \"key\": {\n // VHS key directives are capitalized words; emit a count when > 1.\n return [cmd.count !== undefined && cmd.count > 1 ? `${cmd.key} ${cmd.count}` : cmd.key]\n }\n case \"ctrl\":\n return [`Ctrl+${cmd.key}`]\n case \"alt\":\n return [`Alt+${cmd.key}`]\n case \"sleep\": {\n const ms = Math.round(cmd.durationMicros / 1000)\n return [`Sleep ${ms}ms`]\n }\n case \"resize\":\n // A mid-tape resize lowers to two Set directives.\n return [`Set Width ${cmd.cols}`, `Set Height ${cmd.rows}`]\n case \"set\":\n return [`Set ${cmd.key} ${quote(cmd.value)}`]\n case \"screenshot\":\n return [cmd.path !== undefined ? `Screenshot ${cmd.path}` : \"Screenshot\"]\n }\n}\n\n/**\n * Generate best-effort `.tape` source text from a {@link Recording}.\n *\n * @throws {Error} when the recording carries no `commands` track — there is\n * no intent to serialize.\n */\nexport function generateTape(recording: Recording, options?: GenerateTapeOptions): string {\n const commands = recording.commands\n if (commands === undefined || commands.length === 0) {\n throw new Error(\"generateTape: recording has no commands track — nothing to codegen as .tape\")\n }\n const emitDimensions = options?.emitDimensions ?? true\n const sleepThreshold = options?.sleepThresholdMicros ?? DEFAULT_SLEEP_THRESHOLD\n\n const lines: string[] = []\n lines.push(\"# Generated from a termless Recording — lossy, best-effort.\")\n if (options?.output !== undefined) lines.push(`Output ${options.output}`)\n if (emitDimensions) {\n lines.push(`Set Width ${recording.cols}`)\n lines.push(`Set Height ${recording.rows}`)\n }\n\n let prevAt: number | null = null\n for (const cmd of commands) {\n // Bridge a long gap with a synthesized Sleep. A `sleep` command already\n // carries its own duration, so don't double-count it.\n if (prevAt !== null && cmd.kind !== \"sleep\") {\n const gap = cmd.at - prevAt\n if (gap >= sleepThreshold) {\n lines.push(`Sleep ${Math.round(gap / 1000)}ms`)\n }\n }\n for (const line of commandToLines(cmd)) lines.push(line)\n prevAt = cmd.at\n }\n\n return lines.join(\"\\n\") + \"\\n\"\n}\n","/**\n * asciicast v2 reader and replayer.\n *\n * Parses asciicast v2 JSON-lines files and replays them through\n * a termless Terminal or TerminalBackend.\n */\n\nimport type { Terminal, TerminalBackend } from \"../../terminal/types.ts\"\nimport type { AsciicastEvent, AsciicastEventType, AsciicastHeader, AsciicastRecording } from \"./types.ts\"\n\n/** Options for replaying an asciicast recording. */\nexport interface ReplayOptions {\n /** Speed multiplier (default: 1). Higher = faster. 0 or Infinity = instant. */\n speed?: number\n /** Called for each event during replay. */\n onEvent?: (event: AsciicastEvent) => void\n}\n\n/**\n * Parse an asciicast v2 file from its string content.\n *\n * Handles both `\\n` and `\\r\\n` line endings. Validates the header\n * version (must be 2) and parses event tuples.\n *\n * @throws {Error} If the content is empty, the header is missing version 2,\n * or an event line has an invalid format.\n */\nexport function parseAsciicast(content: string): AsciicastRecording {\n // Split on \\n, handling \\r\\n by trimming \\r from each line\n const lines = content.split(\"\\n\").filter((line) => line.trim().length > 0)\n\n if (lines.length === 0) {\n throw new Error(\"Empty asciicast file\")\n }\n\n // Parse header (first line)\n const headerLine = lines[0]!.replace(/\\r$/, \"\")\n const header = JSON.parse(headerLine) as AsciicastHeader\n\n if (header.version !== 2) {\n throw new Error(`Unsupported asciicast version: ${header.version} (expected 2)`)\n }\n\n // Parse events (remaining lines)\n const events: AsciicastEvent[] = []\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i]!.replace(/\\r$/, \"\")\n const tuple = JSON.parse(line)\n\n if (!Array.isArray(tuple) || tuple.length < 3) {\n throw new Error(`Invalid event at line ${i + 1}: expected [time, type, data]`)\n }\n\n const [time, type, data] = tuple as [number, AsciicastEventType, string]\n events.push({ time, type, data })\n }\n\n return { header, events }\n}\n\n/** Type guard: is target a Terminal (has feed that accepts string)? */\nfunction isTerminal(target: Terminal | TerminalBackend): target is Terminal {\n // Terminal.feed accepts string | Uint8Array; TerminalBackend.feed accepts only Uint8Array.\n // We check for the `cols` property that Terminal has as a readonly number.\n return \"cols\" in target && \"press\" in target\n}\n\n/**\n * Replay an asciicast recording through a terminal.\n *\n * Feeds \"o\" (output) events to the terminal via `feed()`. Input (\"i\") events\n * are skipped during replay — they record what the user typed, not what\n * should drive the terminal. Marker (\"m\") events are reported via onEvent\n * but don't feed data.\n *\n * By default, replay preserves original timing. Set `speed` to adjust:\n * - `speed: 2` = 2x faster\n * - `speed: Infinity` or `speed: 0` = instant (no delays)\n */\nexport async function replayAsciicast(\n recording: AsciicastRecording,\n terminal: Terminal | TerminalBackend,\n options?: ReplayOptions,\n): Promise<void> {\n const speed = options?.speed ?? 1\n const instant = speed === 0 || !Number.isFinite(speed)\n const encoder = new TextEncoder()\n\n let lastTime = 0\n\n for (const event of recording.events) {\n // Wait for timing gap (unless instant)\n if (!instant && event.time > lastTime) {\n const delay = ((event.time - lastTime) / speed) * 1000\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n lastTime = event.time\n\n // Notify callback\n options?.onEvent?.(event)\n\n // Only feed output events\n if (event.type === \"o\") {\n if (isTerminal(terminal)) {\n terminal.feed(event.data)\n } else {\n terminal.feed(encoder.encode(event.data))\n }\n }\n }\n}\n","/**\n * asciicast v2 streaming writer.\n *\n * Builds an asciicast v2 file incrementally from timestamped events. To\n * serialize a captured {@link Recording} to `.cast`, use `encodeAsciicast`\n * from `asciicast/recording-codec.ts` — the symmetric `.cast` codec.\n */\n\nimport type { AsciicastHeader } from \"./types.ts\"\n\n/** Handle for streaming asciicast writes. */\nexport interface AsciicastWriter {\n /** Write an output (\"o\") event with auto-timestamp. */\n writeOutput(data: string): void\n /** Write an input (\"i\") event with auto-timestamp. */\n writeInput(data: string): void\n /** Write a marker (\"m\") event with auto-timestamp. */\n writeMarker(label: string): void\n /** Finalize the writer and return the complete asciicast string. */\n close(): string\n}\n\n/**\n * Create a streaming asciicast writer that accumulates events.\n *\n * Events are timestamped relative to when the writer was created.\n * Call `close()` to get the final JSON-lines string.\n */\nexport function createAsciicastWriter(header: AsciicastHeader): AsciicastWriter {\n const startTime = Date.now()\n const lines: string[] = [JSON.stringify(header)]\n let closed = false\n\n function elapsed(): number {\n return (Date.now() - startTime) / 1000\n }\n\n function writeEvent(type: string, data: string): void {\n if (closed) throw new Error(\"AsciicastWriter has been closed\")\n lines.push(JSON.stringify([elapsed(), type, data]))\n }\n\n return {\n writeOutput(data: string): void {\n writeEvent(\"o\", data)\n },\n writeInput(data: string): void {\n writeEvent(\"i\", data)\n },\n writeMarker(label: string): void {\n writeEvent(\"m\", label)\n },\n close(): string {\n if (closed) throw new Error(\"AsciicastWriter has already been closed\")\n closed = true\n return lines.join(\"\\n\") + \"\\n\"\n },\n }\n}\n","/**\n * `.cast` ⇄ `Recording` codec — symmetric, lossless on the `io` track.\n *\n * asciicast v2 is a stream of direction-tagged byte events (`o` = output,\n * `i` = input, `m` = marker). That maps **directly** onto the in-memory\n * {@link Recording} model's `io` source track — design doc §4 names `.cast`\n * the one *symmetric codec* (unlike `.tape`, which is a lossy compiler).\n *\n * - {@link decodeAsciicast}: `.cast` → a `Recording` with an `io` track.\n * - {@link encodeAsciicast}: a `Recording`'s `io` track → `.cast` text.\n *\n * Timebase normalization — asciicast records `time` as a **float in\n * seconds**. The Recording model's clock is **integer microseconds**. Decode\n * routes every timestamp through {@link secondsToMicros}; encode divides back\n * to float seconds. The decode direction is the canonical one — once a `.cast`\n * is decoded, there is no float left in the model.\n *\n * Marker (`m`) events have no `io`-track representation (they are neither\n * input nor output bytes). {@link decodeAsciicast} drops them; a caller that\n * needs markers should read them from {@link parseAsciicast} directly.\n */\n\nimport { type Recording, type IoEvent, createRecording, micros, secondsToMicros } from \"../recording.ts\"\nimport { parseAsciicast } from \"./reader.ts\"\nimport type { AsciicastHeader, AsciicastRecording } from \"./types.ts\"\n\n/** Options for {@link encodeAsciicast}. */\nexport interface EncodeAsciicastOptions {\n /** Optional `title` for the asciicast header. */\n title?: string\n /** Optional unix `timestamp` for the asciicast header. */\n timestamp?: number\n}\n\n/**\n * Decode an {@link AsciicastRecording} into a {@link Recording} carrying an\n * `io` source track.\n *\n * Every `o`/`i` event becomes a direction-tagged {@link IoEvent}; the float\n * `time` is normalized to integer µs. Marker (`m`) events are dropped — they\n * are not byte I/O. The result has no `commands` or `frames` track: a decoded\n * `.cast` is observed-truth only.\n */\nexport function decodeAsciicast(cast: AsciicastRecording): Recording {\n const io: IoEvent[] = []\n let maxAt = 0\n for (const event of cast.events) {\n if (event.type === \"m\") continue // markers carry no io bytes\n const at = secondsToMicros(event.time)\n if (at > maxAt) maxAt = at\n io.push({ at, direction: event.type === \"o\" ? \"out\" : \"in\", data: event.data })\n }\n // Header `duration` (float seconds) is authoritative when present; else use\n // the last event's timestamp.\n const durationMicros = cast.header.duration !== undefined ? secondsToMicros(cast.header.duration) : micros(maxAt)\n return createRecording({\n cols: cast.header.width,\n rows: cast.header.height,\n durationMicros,\n io,\n })\n}\n\n/** Convenience: parse `.cast` text and decode it into a {@link Recording}. */\nexport function decodeAsciicastSource(content: string): Recording {\n return decodeAsciicast(parseAsciicast(content))\n}\n\n/**\n * Encode a {@link Recording}'s `io` track back into asciicast v2 text.\n *\n * @throws {Error} when the recording has no `io` track — `.cast` is a\n * serialization of observed bytes, and a recording with only `commands`\n * (a hand-authored tape) has no byte stream to encode. Use the `.tape`\n * codegen for an intent-only recording.\n */\nexport function encodeAsciicast(recording: Recording, options?: EncodeAsciicastOptions): string {\n const io = recording.io\n if (io === undefined || io.length === 0) {\n throw new Error(\"encodeAsciicast: recording has no io track — nothing to encode as .cast\")\n }\n const header: AsciicastHeader = {\n version: 2,\n width: recording.cols,\n height: recording.rows,\n duration: recording.durationMicros / 1_000_000,\n }\n if (options?.title !== undefined) header.title = options.title\n if (options?.timestamp !== undefined) header.timestamp = options.timestamp\n\n const lines: string[] = [JSON.stringify(header)]\n for (const event of io) {\n // Integer-µs → float seconds (the asciicast timebase).\n const time = event.at / 1_000_000\n const type = event.direction === \"out\" ? \"o\" : \"i\"\n lines.push(JSON.stringify([time, type, event.data]))\n }\n return lines.join(\"\\n\") + \"\\n\"\n}\n","export type {\n Cell,\n CellView,\n CursorState,\n CursorStyle,\n EmulatorWarning,\n KeyDescriptor,\n MouseEvent,\n MouseModifiers,\n MouseOptions,\n OutputView,\n PngScreenshotOptions,\n RegionView,\n RGB,\n RowView,\n ScreenshotOptions,\n ScrollbackState,\n SpawnOptions,\n SvgScreenshotOptions,\n SvgTheme,\n Terminal,\n TerminalBackend,\n TerminalCapabilities,\n TerminalCreateOptions,\n TerminalMode,\n TerminalOptions,\n TerminalReadable,\n TextPosition,\n UnderlineStyle,\n WarningExtension,\n} from \"./terminal/types.ts\"\n\nexport { hasExtension } from \"./terminal/types.ts\"\nexport { createTerminal } from \"./terminal/terminal.ts\"\n// Renderer strategy (Phase 3): buffer → pixels (svg/png). Not a domain object.\nexport { screenshotSvg, screenshotPng } from \"./render/index.ts\"\nexport type { Renderer, VectorRenderer, RasterRenderer } from \"./render/index.ts\"\n// The raster renderer — canvas / resvg / auto SVG → pixels strategy.\nexport { selectRasterizer } from \"./view/rasterizer.ts\"\nexport type { RendererKind, Rasterizer, RasterBitmap } from \"./view/rasterizer.ts\"\n// Backwards-compat re-export: @termless/ghostty owns the cellsToAnsi + canvas\n// renderer surface in Phase 9+. The barrel re-exports cellsToAnsi so any\n// caller still doing `import { cellsToAnsi } from \"@termless/core\"` keeps\n// working without pulling the full ghostty backend.\nexport { cellsToAnsi } from \"@termless/ghostty\"\nexport type { CanvasTheme } from \"@termless/ghostty\"\nexport { createFrameTracer } from \"./recording/frame-trace.ts\"\nexport type { TraceFrame, FrameTraceOptions, FrameTraceSummary, FrameTracer } from \"./recording/frame-trace.ts\"\n// Recording-domain adapter (Phase 2): frame-trace → Recording frames projection.\nexport { traceToRecording, fingerprintFromCanvas } from \"./recording/frame-trace-recording.ts\"\nexport type { TraceToRecordingInput, TraceCanvasOptions } from \"./recording/frame-trace-recording.ts\"\n// Visual-trace disk I/O (Phase 4): own the frame-trace directory layout so\n// consumers (km's `toMatchVisualTrace`) read/write through these APIs instead\n// of parsing the on-disk shape directly.\nexport { loadVisualTrace } from \"./recording/load-visual-trace.ts\"\nexport type { LoadVisualTraceOptions } from \"./recording/load-visual-trace.ts\"\nexport { writeVisualTrace } from \"./recording/write-visual-trace.ts\"\nexport type { WriteVisualTraceOptions } from \"./recording/write-visual-trace.ts\"\n// Native `.rec` recording format (Phase 5): the canonical full-fidelity\n// on-disk form — a single-file ZIP container, superset of the frame-trace\n// layout.\nexport {\n readRecording,\n writeRecording,\n packRecording,\n unpackRecording,\n isRecPath,\n REC_FORMAT_VERSION,\n} from \"./recording/native/native-rec.ts\"\nexport type { RecManifest, ReadRecordingOptions, WriteRecordingOptions } from \"./recording/native/native-rec.ts\"\n// ZIP container helper backing the `.rec` format.\nexport { buildZip, parseZip } from \"./recording/native/zip-archive.ts\"\nexport type { ZipEntry } from \"./recording/native/zip-archive.ts\"\n// view verb + view/ module (Phase 3): one verb, one viewer, all presentation.\nexport { view } from \"./view.ts\"\nexport type { ViewMode, ViewOptions, ScrubViewOptions, AnimateViewOptions } from \"./view.ts\"\nexport { writeViewer, writeViewerFromRecording } from \"./view/viewer.ts\"\nexport type { WriteViewerResult } from \"./view/viewer.ts\"\nexport { generateSlideshow } from \"./view/slideshow.ts\"\nexport type { SlideshowFrame } from \"./view/slideshow.ts\"\nexport { captureCrossRenderer, pngDimensions, dHash, hashDistance } from \"./compare.ts\"\nexport type { CrossRendererOptions, CrossRendererResult, CrossRendererReport } from \"./compare.ts\"\nexport { parseKey, keyToAnsi } from \"./terminal/key-mapping.ts\"\nexport { encodeKeyToAnsi } from \"./terminal/key-encoding.ts\"\nexport { createCellView, createRegionView, createRowView } from \"./terminal/views.ts\"\nexport { termlessMatchers } from \"./jest-matchers.ts\"\nexport type { AssertionResult, CellAttrs, CursorProps } from \"./assertions.ts\"\n\n// Visual diff\nexport { diffBuffers } from \"./terminal/diff.ts\"\nexport type { CellDiff, CellSummary, DiffResult } from \"./terminal/diff.ts\"\n\n// The unified captured-session model — the canonical Recording type.\nexport { createRecording, trackAuthority, micros, secondsToMicros, millisToMicros } from \"./recording/recording.ts\"\nexport type {\n Recording,\n Command,\n IoEvent,\n IoDirection,\n Frame,\n Micros,\n RendererFingerprint,\n RecordingProvenance,\n TrackAuthority,\n CreateRecordingInput,\n} from \"./recording/recording.ts\"\n// Visual-state snapshotting — buffer change detection for the `record` verb.\nexport { snapshotVisualState } from \"./recording/visual-snapshot.ts\"\n\n// Mock timer for animation testing\nexport { createMockTimer } from \"./terminal/timer.ts\"\nexport type { MockTimerController } from \"./terminal/timer.ts\"\n\n// Emulator warning registry\nexport { pushWarning, drainWarnings, hasWarnings, clearWarnings } from \"./terminal/warnings.ts\"\n\n// Backend registry (core — user-facing)\nexport {\n backend,\n isReady,\n backends,\n entry,\n manifest,\n buildBackend,\n createTerminalByName,\n ensureCachedVersion,\n} from \"./backend/backends.ts\"\nexport type { BackendEntry, Manifest, ResolveOptions } from \"./backend/backends.ts\"\n\n// Tape format (VHS .tape parser, executor, comparison)\nexport { parseTape, parseDuration } from \"./recording/tape/parser.ts\"\nexport type { TapeCommand, TapeFile } from \"./recording/tape/parser.ts\"\nexport { executeTape } from \"./recording/tape/executor.ts\"\nexport type { TapeExecutorOptions, ScreenshotCapture, TapeResult } from \"./recording/tape/executor.ts\"\nexport { compareTape } from \"./recording/tape/compare.ts\"\nexport type {\n CompareMode,\n CompareOptions,\n CompareResult,\n BackendScreenshot,\n BackendSpec,\n} from \"./recording/tape/compare.ts\"\nexport { compareCanvas, composeSideBySide, composeDiff } from \"./recording/tape/compare-canvas.ts\"\nexport type {\n CanvasCompareMode,\n CanvasCompareOptions,\n CanvasCompareResult,\n CanvasBackendSpec,\n CanvasBackendResult,\n CanvasBackendFrame,\n} from \"./recording/tape/compare-canvas.ts\"\nexport { decodePngRgba, encodePng } from \"./recording/tape/png-codec.ts\"\nexport type { RgbaImage } from \"./recording/tape/png-codec.ts\"\nexport { overlayKeystroke } from \"./recording/tape/overlay.ts\"\nexport type { KeyOverlayOptions } from \"./recording/tape/overlay.ts\"\nexport { resolveTheme, listThemes, listAliases } from \"./recording/tape/themes.ts\"\n// Recording-domain adapters (Phase 2): .tape compiler + codegen.\nexport { compileTape, compileTapeSource, terminalForRecording } from \"./recording/tape/compile.ts\"\nexport type { CompileTapeOptions, CompileTapeResult } from \"./recording/tape/compile.ts\"\nexport { generateTape } from \"./recording/tape/codegen.ts\"\nexport type { GenerateTapeOptions } from \"./recording/tape/codegen.ts\"\n\n// Animation output formats (animated SVG, GIF, APNG) — view/ module (Phase 3)\nexport { createAnimatedSvg } from \"./view/animated-svg.ts\"\nexport { createGif, createGifFromPngs } from \"./view/gif.ts\"\nexport type { PngFrame } from \"./view/gif.ts\"\nexport { createApng } from \"./view/apng.ts\"\nexport { renderAnimation, detectFormat } from \"./view/animation.ts\"\nexport type { AnimationFrame, AnimationOptions, AnimationFormat } from \"./view/animation-types.ts\"\n// Recording-domain bridge (Phase 2): derive animation frames from a Recording.\nexport { recordingToPngFrames, recordingToAnimationFrames } from \"./view/from-recording.ts\"\nexport type { FromRecordingOptions } from \"./view/from-recording.ts\"\n\n// Asciicast v2 format\nexport { parseAsciicast, replayAsciicast } from \"./recording/asciicast/reader.ts\"\nexport type { ReplayOptions } from \"./recording/asciicast/reader.ts\"\nexport { createAsciicastWriter } from \"./recording/asciicast/writer.ts\"\nexport type { AsciicastWriter } from \"./recording/asciicast/writer.ts\"\n// Recording-domain adapter (Phase 2): .cast ⇄ Recording symmetric codec.\nexport { decodeAsciicast, decodeAsciicastSource, encodeAsciicast } from \"./recording/asciicast/recording-codec.ts\"\nexport type { EncodeAsciicastOptions } from \"./recording/asciicast/recording-codec.ts\"\nexport type {\n AsciicastHeader,\n AsciicastTheme,\n AsciicastEvent,\n AsciicastEventType,\n AsciicastRecording,\n} from \"./recording/asciicast/types.ts\"\n","(()=>{\"use strict\";var e={349:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CircularList=void 0;const s=i(460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;i<Math.min(e,this.length);i++)t[i]=this._array[this._getCyclicIndex(i)];this._array=t,this._maxLength=e,this._startIndex=0}get length(){return this._length}set length(e){if(e>this._length)for(let t=this._length;t<e;t++)this._array[t]=void 0;this._length=e}get(e){return this._array[this._getCyclicIndex(e)]}set(e,t){this._array[this._getCyclicIndex(e)]=t}push(e){this._array[this._getCyclicIndex(this._length)]=e,this._length===this._maxLength?(this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1)):this._length++}recycle(){if(this._length!==this._maxLength)throw new Error(\"Can only recycle when the buffer is full\");return this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1),this._array[this._getCyclicIndex(this._length-1)]}get isFull(){return this._length===this._maxLength}pop(){return this._array[this._getCyclicIndex(this._length---1)]}splice(e,t,...i){if(t){for(let i=e;i<this._length-t;i++)this._array[this._getCyclicIndex(i)]=this._array[this._getCyclicIndex(i+t)];this._length-=t,this.onDeleteEmitter.fire({index:e,amount:t})}for(let t=this._length-1;t>=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;t<i.length;t++)this._array[this._getCyclicIndex(e+t)]=i[t];if(i.length&&this.onInsertEmitter.fire({index:e,amount:i.length}),this._length+i.length>this._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error(\"start argument out of range\");if(e+i<0)throw new Error(\"Cannot shift elements in list beyond index 0\");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s<t;s++)this.set(e+s+i,this.get(e+s))}}_getCyclicIndex(e){return(this._startIndex+e)%this._maxLength}}t.CircularList=n},439:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if(\"object\"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},969:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(585),n=i(348),a=i(866),o=i(744),h=i(302),c=i(83),l=i(460),_=i(753),d=i(480),f=i(994),u=i(282),p=i(435),g=i(981),v=i(660);let b=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{this._onScrollApi?.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(o.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(a.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(_.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(d.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(f.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(v.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new p.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange([\"windowsMode\",\"windowsPty\"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new g.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!b&&(this._logService.warn(\"writeSync is unreliable and will be removed soon.\"),b=!0),this._writeBuffer.writeSync(e,t)}input(e,t=!0){this.coreService.triggerDataEvent(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,o.MINIMUM_COLS),t=Math.max(t,o.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!(\"conpty\"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(u.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:\"H\"},(()=>((0,u.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},460:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>{this._listeners.push(e);const t={dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}};return t}),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(584),a=i(116),o=i(15),h=i(844),c=i(482),l=i(437),_=i(460),d=i(643),f=i(511),u=i(734),p=i(585),g=i(480),v=i(242),b=i(351),S=i(941),m={\"(\":0,\")\":1,\"*\":2,\"+\":3,\"-\":1,\".\":2},C=131072;function y(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var w;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]=\"GET_WIN_SIZE_PIXELS\",e[e.GET_CELL_SIZE_PIXELS=1]=\"GET_CELL_SIZE_PIXELS\"}(w||(t.WindowsOptionsReportType=w={}));let B=0;class E extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,d,u,p=new o.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=d,this._unicodeService=u,this._parser=p,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new f.CellData,this._windowTitle=\"\",this._iconName=\"\",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new _.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new _.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new _.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new _.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new _.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new _.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new _.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new _.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new _.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new _.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new _.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new _.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new _.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new A(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug(\"Unknown CSI code: \",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug(\"Unknown ESC code: \",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug(\"Unknown EXECUTE code: \",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug(\"Unknown OSC code: \",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{\"HOOK\"===t&&(i=i.toArray()),this._logService.debug(\"Unknown DCS code: \",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:\"@\"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"@\"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:\"A\"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"A\"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:\"B\"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:\"C\"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:\"D\"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:\"E\"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:\"F\"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:\"G\"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:\"H\"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:\"I\"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:\"J\"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:\"?\",final:\"J\"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:\"K\"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:\"?\",final:\"K\"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:\"L\"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:\"M\"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:\"P\"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:\"S\"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:\"T\"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:\"X\"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:\"Z\"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:\"`\"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:\"a\"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:\"b\"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:\"c\"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:\">\",final:\"c\"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:\"d\"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:\"e\"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:\"f\"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:\"g\"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:\"h\"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"h\"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:\"l\"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"l\"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:\"m\"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:\"n\"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"n\"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:\"!\",final:\"p\"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"q\"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:\"r\"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:\"s\"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:\"t\"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:\"u\"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:\"'\",final:\"}\"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:\"'\",final:\"~\"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'\"',final:\"q\"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:\"$\",final:\"p\"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:\"?\",intermediates:\"$\",final:\"p\"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new v.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new v.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new v.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new v.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new v.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new v.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new v.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new v.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new v.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new v.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new v.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new v.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:\"7\"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:\"8\"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:\"D\"},(()=>this.index())),this._parser.registerEscHandler({final:\"E\"},(()=>this.nextLine())),this._parser.registerEscHandler({final:\"H\"},(()=>this.tabSet())),this._parser.registerEscHandler({final:\"M\"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:\"=\"},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:\">\"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:\"c\"},(()=>this.fullReset())),this._parser.registerEscHandler({final:\"n\"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:\"o\"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:\"|\"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:\"}\"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:\"~\"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:\"%\",final:\"@\"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:\"%\",final:\"G\"},(()=>this.selectDefaultCharset()));for(const e in a.CHARSETS)this._parser.registerEscHandler({intermediates:\"(\",final:e},(()=>this.selectCharset(\"(\"+e))),this._parser.registerEscHandler({intermediates:\")\",final:e},(()=>this.selectCharset(\")\"+e))),this._parser.registerEscHandler({intermediates:\"*\",final:e},(()=>this.selectCharset(\"*\"+e))),this._parser.registerEscHandler({intermediates:\"+\",final:e},(()=>this.selectCharset(\"+\"+e))),this._parser.registerEscHandler({intermediates:\"-\",final:e},(()=>this.selectCharset(\"-\"+e))),this._parser.registerEscHandler({intermediates:\".\",final:e},(()=>this.selectCharset(\".\"+e))),this._parser.registerEscHandler({intermediates:\"/\",final:e},(()=>this.selectCharset(\"/\"+e)));this._parser.registerEscHandler({intermediates:\"#\",final:\"8\"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error(\"Parsing error: \",e),e))),this._parser.registerDcsHandler({intermediates:\"$\",final:\"q\"},new b.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=p.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t(\"#SLOW_TIMEOUT\")),5e3)))]).catch((e=>{if(\"#SLOW_TIMEOUT\"!==e)throw e;console.warn(\"async parser handler taking longer than 5000 ms\")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const a=this._parseStack.paused;if(a){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>C&&(n=this._parseStack.position+C)}if(this._logService.logLevel<=p.LogLevelEnum.DEBUG&&this._logService.debug(\"parsing data\"+(\"string\"==typeof e?` \"${e}\"`:` \"${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join(\"\")}\"`),\"string\"==typeof e?e.split(\"\").map((e=>e.charCodeAt(0))):e),this._parseBuffer.length<e.length&&this._parseBuffer.length<C&&(this._parseBuffer=new Uint32Array(Math.min(e.length,C))),a||this._dirtyRowTracker.clearRange(),e.length>C)for(let t=n;t<e.length;t+=C){const n=t+C<e.length?t+C:e.length,a=\"string\"==typeof e?this._stringDecoder.decode(e.substring(t,n),this._parseBuffer):this._utf8Decoder.decode(e.subarray(t,n),this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,a))return this._preserveStack(s,r,a,t),this._logSlowResolvingAsync(i),i}else if(!a){const t=\"string\"==typeof e?this._stringDecoder.decode(e,this._parseBuffer):this._utf8Decoder.decode(e,this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,t))return this._preserveStack(s,r,t,0),this._logSlowResolvingAsync(i),i}this._activeBuffer.x===s&&this._activeBuffer.y===r||this._onCursorMove.fire();const o=this._dirtyRowTracker.end+(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp),h=this._dirtyRowTracker.start+(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp);h<this._bufferService.rows&&this._onRequestRefreshRows.fire(Math.min(h,this._bufferService.rows-1),Math.min(o,this._bufferService.rows-1))}print(e,t,i){let s,r;const n=this._charsetService.charset,a=this._optionsService.rawOptions.screenReaderMode,o=this._bufferService.cols,h=this._coreService.decPrivateModes.wraparound,_=this._coreService.modes.insertMode,f=this._curAttrData;let u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._activeBuffer.x&&i-t>0&&2===u.getWidth(this._activeBuffer.x-1)&&u.setCellFromCodepoint(this._activeBuffer.x-1,0,1,f);let p=this._parser.precedingJoinState;for(let v=t;v<i;++v){if(s=e[v],s<127&&n){const e=n[String.fromCharCode(s)];e&&(s=e.charCodeAt(0))}const t=this._unicodeService.charProperties(s,p);r=g.UnicodeService.extractWidth(t);const i=g.UnicodeService.extractShouldJoin(t),b=i?g.UnicodeService.extractWidth(p):0;if(p=t,a&&this._onA11yChar.fire((0,c.stringFromCodePoint)(s)),this._getCurrentLinkId()&&this._oscLinkService.addLineToLink(this._getCurrentLinkId(),this._activeBuffer.ybase+this._activeBuffer.y),this._activeBuffer.x+r-b>o)if(h){const e=u;let t=this._activeBuffer.x-b;for(this._activeBuffer.x=b,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),b>0&&u instanceof l.BufferLine&&u.copyCellsFrom(e,t,0,b,!1);t<o;)e.setCellFromCodepoint(t++,0,1,f)}else if(this._activeBuffer.x=o-1,2===r)continue;if(i&&this._activeBuffer.x){const e=u.getWidth(this._activeBuffer.x-1)?1:2;u.addCodepointToCell(this._activeBuffer.x-e,s,r);for(let e=r-b;--e>=0;)u.setCellFromCodepoint(this._activeBuffer.x++,0,0,f)}else if(_&&(u.insertCells(this._activeBuffer.x,r-b,this._activeBuffer.getNullCell(f)),2===u.getWidth(o-1)&&u.setCellFromCodepoint(o-1,d.NULL_CELL_CODE,d.NULL_CELL_WIDTH,f)),u.setCellFromCodepoint(this._activeBuffer.x++,s,r,f),r>0)for(;--r;)u.setCellFromCodepoint(this._activeBuffer.x++,0,0,f)}this._parser.precedingJoinState=p,this._activeBuffer.x<o&&i-t>0&&0===u.getWidth(this._activeBuffer.x)&&!u.hasContent(this._activeBuffer.x)&&u.setCellFromCodepoint(this._activeBuffer.x,0,1,f),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return\"t\"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!y(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new b.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new v.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)?.isWrapped){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i<this._bufferService.rows;i++)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(i);break;case 1:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i,0,this._activeBuffer.x+1,!0,t),this._activeBuffer.x+1>=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y,s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,r=this._bufferService.rows-1+this._activeBuffer.ybase-s+1;for(;t--;)this._activeBuffer.lines.splice(r-1,1),this._activeBuffer.lines.splice(i,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}deleteLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y;let s;for(s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,s=this._bufferService.rows-1+this._activeBuffer.ybase-s;t--;)this._activeBuffer.lines.splice(i,1),this._activeBuffer.lines.splice(s,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}insertChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.insertCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}deleteChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.deleteCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}scrollUp(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollDown(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,0,this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollLeft(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollRight(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}insertColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}deleteColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}eraseChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.replaceCells(this._activeBuffer.x,this._activeBuffer.x+(e.params[0]||1),this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}repeatPrecedingCharacter(e){const t=this._parser.precedingJoinState;if(!t)return!0;const i=e.params[0]||1,s=g.UnicodeService.extractWidth(t),r=this._activeBuffer.x-s,n=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).getString(r),a=new Uint32Array(n.length*i);let o=0;for(let e=0;e<n.length;){const t=n.codePointAt(e)||0;a[o++]=t,e+=t>65535?2:1}let h=o;for(let e=1;e<i;++e)a.copyWithin(h,0,o),h+=o;return this.print(a,0,h),!0}sendDeviceAttributesPrimary(e){return e.params[0]>0||(this._is(\"xterm\")||this._is(\"rxvt-unicode\")||this._is(\"screen\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[?1;2c\"):this._is(\"linux\")&&this._coreService.triggerDataEvent(n.C0.ESC+\"[?6c\")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is(\"xterm\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[>0;276;0c\"):this._is(\"rxvt-unicode\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[>85;95;0c\"):this._is(\"linux\")?this._coreService.triggerDataEvent(e.params[0]+\"c\"):this._is(\"screen\")&&this._coreService.triggerDataEvent(n.C0.ESC+\"[>83;40003;0c\")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+\"\").indexOf(e)}setMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!0;break;case 20:this._optionsService.options.convertEol=!0}return!0}setModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!0;break;case 2:this._charsetService.setgCharset(0,a.DEFAULT_CHARSET),this._charsetService.setgCharset(1,a.DEFAULT_CHARSET),this._charsetService.setgCharset(2,a.DEFAULT_CHARSET),this._charsetService.setgCharset(3,a.DEFAULT_CHARSET);break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(132,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!0,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!0;break;case 12:this._optionsService.options.cursorBlink=!0;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!0;break;case 66:this._logService.debug(\"Serial port requested application keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire();break;case 9:this._coreMouseService.activeProtocol=\"X10\";break;case 1e3:this._coreMouseService.activeProtocol=\"VT200\";break;case 1002:this._coreMouseService.activeProtocol=\"DRAG\";break;case 1003:this._coreMouseService.activeProtocol=\"ANY\";break;case 1004:this._coreService.decPrivateModes.sendFocus=!0,this._onRequestSendFocus.fire();break;case 1005:this._logService.debug(\"DECSET 1005 not supported (see #2507)\");break;case 1006:this._coreMouseService.activeEncoding=\"SGR\";break;case 1015:this._logService.debug(\"DECSET 1015 not supported (see #2507)\");break;case 1016:this._coreMouseService.activeEncoding=\"SGR_PIXELS\";break;case 25:this._coreService.isCursorHidden=!1;break;case 1048:this.saveCursor();break;case 1049:this.saveCursor();case 47:case 1047:this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!0}return!0}resetMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!1;break;case 20:this._optionsService.options.convertEol=!1}return!0}resetModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!1;break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(80,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!1,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!1;break;case 12:this._optionsService.options.cursorBlink=!1;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!1;break;case 66:this._logService.debug(\"Switching back to normal keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire();break;case 9:case 1e3:case 1002:case 1003:this._coreMouseService.activeProtocol=\"NONE\";break;case 1004:this._coreService.decPrivateModes.sendFocus=!1;break;case 1005:this._logService.debug(\"DECRST 1005 not supported (see #2507)\");break;case 1006:case 1016:this._coreMouseService.activeEncoding=\"DEFAULT\";break;case 1015:this._logService.debug(\"DECRST 1015 not supported (see #2507)\");break;case 25:this._coreService.isCursorHidden=!0;break;case 1048:this.restoreCursor();break;case 1049:case 47:case 1047:this._bufferService.buffers.activateNormalBuffer(),1049===e.params[t]&&this.restoreCursor(),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!1}return!0}requestMode(e,t){const i=this._coreService.decPrivateModes,{activeProtocol:s,activeEncoding:r}=this._coreMouseService,a=this._coreService,{buffers:o,cols:h}=this._bufferService,{active:c,alt:l}=o,_=this._optionsService.rawOptions,d=e=>e?1:2,f=e.params[0];return u=f,p=t?2===f?4:4===f?d(a.modes.insertMode):12===f?3:20===f?d(_.convertEol):0:1===f?d(i.applicationCursorKeys):3===f?_.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===f?d(i.origin):7===f?d(i.wraparound):8===f?3:9===f?d(\"X10\"===s):12===f?d(_.cursorBlink):25===f?d(!a.isCursorHidden):45===f?d(i.reverseWraparound):66===f?d(i.applicationKeypad):67===f?4:1e3===f?d(\"VT200\"===s):1002===f?d(\"DRAG\"===s):1003===f?d(\"ANY\"===s):1004===f?d(i.sendFocus):1005===f?4:1006===f?d(\"SGR\"===r):1015===f?4:1016===f?d(\"SGR_PIXELS\"===r):1048===f?1:47===f||1047===f||1049===f?d(c===l):2004===f?d(i.bracketedPasteMode):0,a.triggerDataEvent(`${n.C0.ESC}[${t?\"\":\"?\"}${u};${p}$y`),!0;var u,p}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=u.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let a=0;do{5===s[1]&&(r=1),s[n+a+1+r]=i[a]}while(++a<i.length&&a+n+1+r<s.length);break}if(5===s[1]&&n+r>=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t<e.length&&n+r<s.length);for(let e=2;e<s.length;++e)-1===s[e]&&(s[e]=0);switch(s[0]){case 38:i.fg=this._updateAttrColor(i.fg,s[1],s[3],s[4],s[5]);break;case 48:i.bg=this._updateAttrColor(i.bg,s[1],s[3],s[4],s[5]);break;case 58:i.extended=i.extended.clone(),i.extended.underlineColor=this._updateAttrColor(i.extended.underlineColor,s[1],s[3],s[4],s[5])}return n}_processUnderline(e,t){t.extended=t.extended.clone(),(!~e||e>5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r<t;r++)i=e.params[r],i>=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug(\"Unknown SGR attribute: %d.\",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle=\"block\";break;case 3:case 4:this._optionsService.options.cursorStyle=\"underline\";break;case 5:case 6:this._optionsService.options.cursorStyle=\"bar\"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!y(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(w.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(w.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(\";\");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\\d+$/.exec(e)){const i=parseInt(e);if(L(i))if(\"?\"===s)t.push({type:0,index:i});else{const e=(0,S.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(\";\");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(\":\");let s;const r=i.findIndex((e=>e.startsWith(\"id=\")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(\";\");for(let e=0;e<i.length&&!(t>=this._specialColors.length);++e,++t)if(\"?\"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,S.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(\";\");for(let e=0;e<i.length;++e)if(/^\\d+$/.exec(i[e])){const s=parseInt(i[e]);L(s)&&t.push({type:2,index:s})}return t.length&&this._onColor.fire(t),!0}restoreFgColor(e){return this._onColor.fire([{type:2,index:256}]),!0}restoreBgColor(e){return this._onColor.fire([{type:2,index:257}]),!0}restoreCursorColor(e){return this._onColor.fire([{type:2,index:258}]),!0}nextLine(){return this._activeBuffer.x=0,this.index(),!0}keypadApplicationMode(){return this._logService.debug(\"Serial port requested application keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire(),!0}keypadNumericMode(){return this._logService.debug(\"Switching back to normal keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire(),!0}selectDefaultCharset(){return this._charsetService.setgLevel(0),this._charsetService.setgCharset(0,a.DEFAULT_CHARSET),!0}selectCharset(e){return 2!==e.length?(this.selectDefaultCharset(),!0):(\"/\"===e[0]||this._charsetService.setgCharset(m[e[0]],a.CHARSETS[e[1]]||a.DEFAULT_CHARSET),!0)}index(){return this._restrictCursor(),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new f.CellData;e.content=1<<22|\"E\".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t<this._bufferService.rows;++t){const i=this._activeBuffer.ybase+this._activeBuffer.y+t,s=this._activeBuffer.lines.get(i);s&&(s.fill(e),s.isWrapped=!1)}return this._dirtyRowTracker.markAllDirty(),this._setCursor(0,0),!0}requestStatusString(e,t){const i=this._bufferService.buffer,s=this._optionsService.rawOptions;return(e=>(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\\\`),!0))('\"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}\"q`:'\"p'===e?'P1$r61;1\"p':\"r\"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:\"m\"===e?\"P1$r0m\":\" q\"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:\"P0$r\")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=E;let A=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){e<this.start?this.start=e:e>this.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(B=e,e=t,t=B),e<this.start&&(this.start=e),t>this.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}A=s([r(0,p.IBufferService)],A)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},114:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode=\"undefined\"!=typeof process&&\"title\"in process;const i=t.isNode?\"node\":navigator.userAgent,s=t.isNode?\"node\":navigator.platform;t.isFirefox=i.includes(\"Firefox\"),t.isLegacyEdge=i.includes(\"Edge\"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\\/(\\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=[\"Macintosh\",\"MacIntel\",\"MacPPC\",\"Mac68K\"].includes(s),t.isIpad=\"iPad\"===s,t.isIphone=\"iPhone\"===s,t.isWindows=[\"Windows\",\"Win16\",\"Win32\",\"WinCE\"].includes(s),t.isLinux=s.indexOf(\"Linux\")>=0,t.isChromeOS=/\\bCrOS\\b/.test(i)},226:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&\"requestIdleCallback\"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},282:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=t?.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},734:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},92:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(349),r=i(226),n=i(734),a=i(437),o=i(634),h=i(511),c=i(643),l=i(863),_=i(116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=a.DEFAULT_ATTR_DATA.clone(),this.savedCharset=_.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new a.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&e<this._rows}_getCorrectBufferLength(e){if(!this._hasScrollback)return e;const i=e+this._optionsService.rawOptions.scrollback;return i>t.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=a.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(a.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols<e)for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);let n=0;if(this._rows<t)for(let s=this._rows;s<t;s++)this.lines.length<t+this.ybase&&(this._optionsService.rawOptions.windowsMode||void 0!==this._optionsService.rawOptions.windowsPty.backend||void 0!==this._optionsService.rawOptions.windowsPty.buildNumber?this.lines.push(new a.BufferLine(e,i)):this.ybase>0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new a.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r<this.lines.maxLength){const e=this.lines.length-r;e>0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);this._cols=e,this._rows=t,this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition<this.lines.length;)if(t+=this.lines.get(this._memoryCleanupPosition++).cleanupMemory(),t>100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&\"conpty\"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,o.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(a.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,o.reflowLargerCreateNewLayout)(this.lines,i);(0,o.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(a.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length<t&&this.lines.push(new a.BufferLine(e,s))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-i,0)}_reflowSmaller(e,t){const i=this.getNullCell(a.DEFAULT_ATTR_DATA),s=[];let r=0;for(let n=this.lines.length-1;n>=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l<n+c.length)continue;const _=c[c.length-1].getTrimmedLength(),d=(0,o.reflowSmallerGetNewLineLengths)(c,this._cols,e),f=d.length-c.length;let u;u=0===this.ybase&&this.y!==this.lines.length-1?Math.max(0,this.y-this.lines.maxLength+f):Math.max(0,this.lines.length-this.lines.maxLength+f);const p=[];for(let e=0;e<f;e++){const e=this.getBlankLine(a.DEFAULT_ATTR_DATA,!0);p.push(e)}p.length>0&&(s.push({start:n+c.length+r,newLines:p}),r+=p.length),c.push(...p);let g=d.length-1,v=d[g];0===v&&(g--,v=d[g]);let b=c.length-f-1,S=_;for(;b>=0;){const e=Math.min(S,v);if(void 0===c[g])break;if(c[g].copyCellsFrom(c[b],S-e,v-e,e,!0),v-=e,0===v&&(g--,v=d[g]),S-=e,0===S){b--;const e=Math.max(b,0);S=(0,o.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t<c.length;t++)d[t]<e&&c[t].setCell(d[t],i);let m=f-u;for(;m-- >0;)0===this.ybase?this.y<t-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase<Math.min(this.lines.maxLength,this.lines.length+r)-t&&(this.ybase===this.ydisp&&this.ydisp++,this.ybase++);this.savedY=Math.min(this.savedY+f,this.ybase+t-1)}if(s.length>0){const e=[],t=[];for(let e=0;e<this.lines.length;e++)t.push(this.lines.get(e));const i=this.lines.length;let n=i-1,a=0,o=s[a];this.lines.length=Math.min(this.lines.maxLength,this.lines.length+r);let h=0;for(let c=Math.min(this.lines.maxLength-1,i+r-1);c>=0;c--)if(o&&o.start>n+h){for(let e=o.newLines.length-1;e>=0;e--)this.lines.set(c--,o.newLines[e]);c++,e.push({index:n+1,amount:o.newLines.length}),h+=o.newLines.length,o=s[++a]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):\"\"}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+1<this.lines.length&&this.lines.get(i+1).isWrapped;)i++;return{first:t,last:i}}setupTabStops(e){for(null!=e?this.tabs[e]||(e=this.prevStop(e)):(this.tabs={},e=0);e<this._cols;e+=this._optionsService.rawOptions.tabStopWidth)this.tabs[e]=!0}prevStop(e){for(null==e&&(e=this.x);!this.tabs[--e]&&e>0;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e<this._cols;);return e>=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t<this.markers.length;t++)this.markers[t].line===e&&(this.markers[t].dispose(),this.markers.splice(t--,1));this._isClearing=!1}clearAllMarkers(){this._isClearing=!0;for(let e=0;e<this.markers.length;e++)this.markers[e].dispose(),this.markers.splice(e--,1);this._isClearing=!1}addMarker(e){const t=new l.Marker(e);return this.markers.push(t),t.register(this.lines.onTrim((e=>{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.line<e.index+e.amount&&t.dispose(),t.line>e.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},437:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(734),r=i(511),n=i(643),a=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let o=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t<e;++t)this.setCell(t,s);this.length=e}get(e){const t=this._data[3*e+0],i=2097151&t;return[this._data[3*e+1],2097152&t?this._combined[e]:i?(0,a.stringFromCodePoint)(i):\"\",t>>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,a.stringFromCodePoint)(2097151&t):\"\"}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return o=3*e,t.content=this._data[o+0],t.fg=this._data[o+1],t.bg=this._data[o+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodepoint(e,t,i,s){268435456&s.bg&&(this._extendedAttrs[e]=s.extended),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s.fg,this._data[3*e+2]=s.bg}addCodepointToCell(e,t,i){let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,a.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,a.stringFromCodePoint)(2097151&s)+(0,a.stringFromCodePoint)(t),s&=-2097152,s|=2097152):s=t|1<<22,i&&(s&=-12582913,s|=i<<22),this._data[3*e+0]=s}insertCells(e,t,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length-e){const s=new r.CellData;for(let i=this.length-e-t-1;i>=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;s<t;++s)this.setCell(e+s,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);2===this.getWidth(this.length-1)&&this.setCellFromCodepoint(this.length-1,0,1,i)}deleteCells(e,t,i){if(e%=this.length,t<this.length-e){const s=new r.CellData;for(let i=0;i<this.length-e-t;++i)this.setCell(e+i,this.loadCell(e+t+i,s));for(let e=this.length-t;e<this.length;++e)this.setCell(e,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);e&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),0!==this.getWidth(e)||this.hasContent(e)||this.setCellFromCodepoint(e,0,1,i)}replaceCells(e,t,i,s=!1){if(s)for(e&&2===this.getWidth(e-1)&&!this.isProtected(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length&&2===this.getWidth(t-1)&&!this.isProtected(t)&&this.setCellFromCodepoint(t,0,1,i);e<t&&e<this.length;)this.isProtected(e)||this.setCell(e,i),e++;else for(e&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length&&2===this.getWidth(t-1)&&this.setCellFromCodepoint(t,0,1,i);e<t&&e<this.length;)this.setCell(e++,i)}resize(e,t){if(e===this.length)return 4*this._data.length*2<this._data.buffer.byteLength;const i=3*e;if(e>this.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i<e;++i)this.setCell(i,t)}else{this._data=this._data.subarray(0,i);const t=Object.keys(this._combined);for(let i=0;i<t.length;i++){const s=parseInt(t[i],10);s>=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t<s.length;t++){const i=parseInt(s[t],10);i>=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2<this._data.buffer.byteLength}cleanupMemory(){if(4*this._data.length*2<this._data.buffer.byteLength){const e=new Uint32Array(this._data.length);return e.set(this._data),this._data=e,1}return 0}fill(e,t=!1){if(t)for(let t=0;t<this.length;++t)this.isProtected(t)||this.setCell(t,e);else{this._combined={},this._extendedAttrs={};for(let t=0;t<this.length;++t)this.setCell(t,e)}}copyFrom(e){this.length!==e.length?this._data=new Uint32Array(e._data):this._data.set(e._data),this.length=e.length,this._combined={};for(const t in e._combined)this._combined[t]=e._combined[t];this._extendedAttrs={};for(const t in e._extendedAttrs)this._extendedAttrs[t]=e._extendedAttrs[t];this.isWrapped=e.isWrapped}clone(){const e=new h(0);e._data=new Uint32Array(this._data),e.length=this.length;for(const t in this._combined)e._combined[t]=this._combined[t];for(const t in this._extendedAttrs)e._extendedAttrs[t]=this._extendedAttrs[t];return e.isWrapped=this.isWrapped,e}getTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r<s;r++){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}const a=Object.keys(e._combined);for(let s=0;s<a.length;s++){const r=parseInt(a[s],10);r>=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e,t,i,s){t=t??0,i=i??this.length,e&&(i=Math.min(i,this.getTrimmedLength())),s&&(s.length=0);let r=\"\";for(;t<i;){const e=this._data[3*t+0],i=2097151&e,o=2097152&e?this._combined[t]:i?(0,a.stringFromCodePoint)(i):n.WHITESPACE_CELL_CHAR;if(r+=o,s)for(let e=0;e<o.length;++e)s.push(t);t+=e>>22||1}return s&&s.push(t),r}}t.BufferLine=h},634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const a=[];for(let o=0;o<e.length-1;o++){let h=o,c=e.get(++h);if(!c.isWrapped)continue;const l=[e.get(o)];for(;h<e.length&&c.isWrapped;)l.push(c),c=e.get(++h);if(r>=o&&r<h){o+=l.length-1;continue}let _=0,d=i(l,_,t),f=1,u=0;for(;f<l.length;){const e=i(l,f,t),r=e-u,a=s-d,o=Math.min(r,a);l[_].copyCellsFrom(l[f],u,d,o,!1),d+=o,d===s&&(_++,d=0),u+=o,u===e&&(f++,u=0),0===d&&0!==_&&2===l[_-1].getWidth(s-1)&&(l[_].copyCellsFrom(l[_-1],s-1,d++,1,!1),l[_-1].setCell(s-1,n))}l[_].replaceCells(d,s,n);let p=0;for(let e=l.length-1;e>0&&(e>_||0===l[e].getTrimmedLength());e--)p++;p>0&&(a.push(o+l.length-p),a.push(p)),o+=l.length-1}return a},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let a=0;a<e.length;a++)if(r===a){const i=t[++s];e.onDeleteEmitter.fire({index:a-n,amount:i}),a+=i-1,n+=i,r=t[++s]}else i.push(a);return{layout:i,countRemoved:n}},t.reflowLargerApplyNewLayout=function(e,t){const i=[];for(let s=0;s<t.length;s++)i.push(e.get(t[s]));for(let t=0;t<i.length;t++)e.set(t,i[t]);e.length=t.length},t.reflowSmallerGetNewLineLengths=function(e,t,s){const r=[],n=e.map(((s,r)=>i(e,r,t))).reduce(((e,t)=>e+t));let a=0,o=0,h=0;for(;h<n;){if(n-h<s){r.push(n-h);break}a+=s;const c=i(e,o,t);a>c&&(a-=c,o++);const l=2===e[o].getWidth(a-1);l&&a--;const _=l?s-1:s;r.push(_),h+=_}return r},t.getWrappedLineTrimmedLength=i},295:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferSet=void 0;const s=i(460),r=i(844),n=i(92);class a extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange(\"scrollback\",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange(\"tabStopWidth\",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=a},511:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(734);class a extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=\"\"}static fromCharData(e){const t=new a;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):\"\"}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=a},643:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR=\"\",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=\" \",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},863:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Marker=void 0;const s=i(460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},116:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={\"`\":\"◆\",a:\"▒\",b:\"␉\",c:\"␌\",d:\"␍\",e:\"␊\",f:\"°\",g:\"±\",h:\"␤\",i:\"␋\",j:\"┘\",k:\"┐\",l:\"┌\",m:\"└\",n:\"┼\",o:\"⎺\",p:\"⎻\",q:\"─\",r:\"⎼\",s:\"⎽\",t:\"├\",u:\"┤\",v:\"┴\",w:\"┬\",x:\"│\",y:\"≤\",z:\"≥\",\"{\":\"π\",\"|\":\"≠\",\"}\":\"£\",\"~\":\"·\"},t.CHARSETS.A={\"#\":\"£\"},t.CHARSETS.B=void 0,t.CHARSETS[4]={\"#\":\"£\",\"@\":\"¾\",\"[\":\"ij\",\"\\\\\":\"½\",\"]\":\"|\",\"{\":\"¨\",\"|\":\"f\",\"}\":\"¼\",\"~\":\"´\"},t.CHARSETS.C=t.CHARSETS[5]={\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.R={\"#\":\"£\",\"@\":\"à\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"§\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"¨\"},t.CHARSETS.Q={\"@\":\"à\",\"[\":\"â\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",\"`\":\"ô\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"û\"},t.CHARSETS.K={\"@\":\"§\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Ü\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"ß\"},t.CHARSETS.Y={\"#\":\"£\",\"@\":\"§\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"é\",\"`\":\"ù\",\"{\":\"à\",\"|\":\"ò\",\"}\":\"è\",\"~\":\"ì\"},t.CHARSETS.E=t.CHARSETS[6]={\"@\":\"Ä\",\"[\":\"Æ\",\"\\\\\":\"Ø\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"ä\",\"{\":\"æ\",\"|\":\"ø\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.Z={\"#\":\"£\",\"@\":\"§\",\"[\":\"¡\",\"\\\\\":\"Ñ\",\"]\":\"¿\",\"{\":\"°\",\"|\":\"ñ\",\"}\":\"ç\"},t.CHARSETS.H=t.CHARSETS[7]={\"@\":\"É\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS[\"=\"]={\"#\":\"ù\",\"@\":\"à\",\"[\":\"é\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",_:\"è\",\"`\":\"ô\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"û\"}},584:(e,t)=>{var i,s,r;Object.defineProperty(t,\"__esModule\",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL=\"\\0\",e.SOH=\"\u0001\",e.STX=\"\u0002\",e.ETX=\"\u0003\",e.EOT=\"\u0004\",e.ENQ=\"\u0005\",e.ACK=\"\u0006\",e.BEL=\"\u0007\",e.BS=\"\\b\",e.HT=\"\\t\",e.LF=\"\\n\",e.VT=\"\\v\",e.FF=\"\\f\",e.CR=\"\\r\",e.SO=\"\u000e\",e.SI=\"\u000f\",e.DLE=\"\u0010\",e.DC1=\"\u0011\",e.DC2=\"\u0012\",e.DC3=\"\u0013\",e.DC4=\"\u0014\",e.NAK=\"\u0015\",e.SYN=\"\u0016\",e.ETB=\"\u0017\",e.CAN=\"\u0018\",e.EM=\"\u0019\",e.SUB=\"\u001a\",e.ESC=\"\u001b\",e.FS=\"\u001c\",e.GS=\"\u001d\",e.RS=\"\u001e\",e.US=\"\u001f\",e.SP=\" \",e.DEL=\"\"}(i||(t.C0=i={})),function(e){e.PAD=\"€\",e.HOP=\"\",e.BPH=\"‚\",e.NBH=\"ƒ\",e.IND=\"„\",e.NEL=\"…\",e.SSA=\"†\",e.ESA=\"‡\",e.HTS=\"ˆ\",e.HTJ=\"‰\",e.VTS=\"Š\",e.PLD=\"‹\",e.PLU=\"Œ\",e.RI=\"\",e.SS2=\"Ž\",e.SS3=\"\",e.DCS=\"\",e.PU1=\"‘\",e.PU2=\"’\",e.STS=\"“\",e.CCH=\"”\",e.MW=\"•\",e.SPA=\"–\",e.EPA=\"—\",e.SOS=\"˜\",e.SGCI=\"™\",e.SCI=\"š\",e.CSI=\"›\",e.ST=\"œ\",e.OSC=\"\",e.PM=\"ž\",e.APC=\"Ÿ\"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\\\`}(r||(t.C1_ESCAPED=r={}))},482:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s=\"\";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n<i;++n){const r=e.charCodeAt(n);if(55296<=r&&r<=56319){if(++n>=i)return this._interim=r,s;const a=e.charCodeAt(n);56320<=a&&a<=57343?t[s++]=1024*(r-55296)+a-56320+65536:(t[s++]=r,t[s++]=a)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,a,o=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,a=0;for(;(n=63&this.interim[++a])&&a<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-a;for(;c<l;){if(c>=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[a++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[o++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[o++]=r):r<65536||r>1114111||(t[o++]=r)),this.interim.fill(0)}const l=i-4;let _=c;for(;_<i;){for(;!(!(_<l)||128&(s=e[_])||128&(r=e[_+1])||128&(n=e[_+2])||128&(a=e[_+3]));)t[o++]=s,t[o++]=r,t[o++]=n,t[o++]=a,_+=4;if(s=e[_++],s<128)t[o++]=s;else if(192==(224&s)){if(_>=i)return this.interim[0]=s,o;if(r=e[_++],128!=(192&r)){_--;continue}if(h=(31&s)<<6|63&r,h<128){_--;continue}t[o++]=h}else if(224==(240&s)){if(_>=i)return this.interim[0]=s,o;if(r=e[_++],128!=(192&r)){_--;continue}if(_>=i)return this.interim[0]=s,this.interim[1]=r,o;if(n=e[_++],128!=(192&n)){_--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[o++]=h}else if(240==(248&s)){if(_>=i)return this.interim[0]=s,o;if(r=e[_++],128!=(192&r)){_--;continue}if(_>=i)return this.interim[0]=s,this.interim[1]=r,o;if(n=e[_++],128!=(192&n)){_--;continue}if(_>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,o;if(a=e[_++],128!=(192&a)){_--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&a,h<65536||h>1114111)continue;t[o++]=h}}return o}}},225:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeV6=void 0;const s=i(480),r=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let a;t.UnicodeV6=class{constructor(){if(this.version=\"6\",!a){a=new Uint8Array(65536),a.fill(1),a[0]=0,a.fill(0,1,32),a.fill(0,127,160),a.fill(2,4352,4448),a[9001]=2,a[9002]=2,a.fill(2,11904,42192),a[12351]=1,a.fill(2,44032,55204),a.fill(2,63744,64256),a.fill(2,65040,65050),a.fill(2,65072,65136),a.fill(2,65280,65377),a.fill(2,65504,65511);for(let e=0;e<r.length;++e)a.fill(0,r[e][0],r[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?a[e]:function(e,t){let i,s=0,r=t.length-1;if(e<t[0][0]||e>t[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e<t[i][0]))return!0;r=i-1}return!1}(e,n)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),r=0===i&&0!==t;if(r){const e=s.UnicodeService.extractWidth(t);0===e?r=!1:e>i&&(i=e)}return s.UnicodeService.createPropertyValue(0,i,r)}}},981:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WriteBuffer=void 0;const s=i(460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error(\"write data discarded, use flow control to avoid losing data\");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},941:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/,s=/^[\\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?\"0\"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf(\"rgb:\")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf(\"#\")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},770:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},351:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(742),n=i(770),a=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=a,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=a}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=a,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||a,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,\"HOOK\",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,\"PUT\",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,\"UNHOOK\",e);this._active=a,this._ident=0}};const o=new r.Params;o.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data=\"\",this._params=o,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():o,this._data=\"\",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=o,this._data=\"\",this._hitLimit=!1,e)));return this._params=o,this._data=\"\",this._hitLimit=!1,t}}},15:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(742),n=i(242),a=i(351);class o{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;r<e.length;r++)this.table[t<<8|e[r]]=i<<4|s}}t.TransitionTable=o;const h=160;t.VT500_TRANSITION_TABLE=function(){const e=new o(4095),t=Array.apply(null,Array(256)).map(((e,t)=>t)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let a;for(a in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],a,3,0),e.addMany(i(128,144),a,3,0),e.addMany(i(144,152),a,3,0),e.add(156,a,0,0),e.add(27,a,11,1),e.add(157,a,4,8),e.addMany([152,158,159],a,0,7),e.add(155,a,11,3),e.add(144,a,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new a.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:\"\\\\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error(\"only one byte as prefix supported\");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error(\"prefix must be in range 0x3c .. 0x3f\")}if(e.intermediates){if(e.intermediates.length>2)throw new Error(\"only two bytes as intermediates are supported\");for(let t=0;t<e.intermediates.length;++t){const s=e.intermediates.charCodeAt(t);if(32>s||s>47)throw new Error(\"intermediate must be in range 0x20 .. 0x2f\");i<<=8,i|=s}}if(1!==e.final.length)throw new Error(\"final must be a single byte\");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join(\"\")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,a=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,a=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error(\"improper continuation due to previous async handler, giving up parsing\");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,a=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=15&this._parseStack.transition}for(let i=a;i<t;++i){switch(r=e[i],n=this._transitions.table[this.currentState<<8|(r<160?r:h)],n>>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}}break;case 3:this._executeHandlers[r]?this._executeHandlers[r]():this._executeHandlerFb(r),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:r,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const a=this._csiHandlers[this._collect<<8|r];let o=a?a.length-1:-1;for(;o>=0&&(s=a[o](this._params),!0!==s);o--)if(s instanceof Promise)return this._preserveStack(3,a,o,n,i),s;o<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingJoinState=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i<t&&(r=e[i])>47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingJoinState=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r<h){this._dcsParser.put(e,i,s),i=s-1;break}break;case 14:if(s=this._dcsParser.unhook(24!==r&&26!==r),s)return this._preserveStack(6,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0;break;case 4:this._oscParser.start();break;case 5:for(let s=i+1;;s++)if(s>=t||(r=e[s])<32||r>127&&r<h){this._oscParser.put(e,i,s),i=s-1;break}break;case 6:if(s=this._oscParser.end(24!==r&&26!==r),s)return this._preserveStack(5,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0}this.currentState=15&n}}}t.EscapeSequenceParser=c},242:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,\"START\")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,\"PUT\",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t<i;){const i=e[t++];if(59===i){this._state=2,this._start();break}if(i<48||57<i)return void(this._state=3);-1===this._id&&(this._id=0),this._id=10*this._id+i-48}2===this._state&&i-t>0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,\"END\",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data=\"\",this._hitLimit=!1}start(){this._data=\"\",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data=\"\",this._hitLimit=!1,e)));return this._data=\"\",this._hitLimit=!1,t}}},742:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i<e.length;++i){const s=e[i];if(Array.isArray(s))for(let e=0;e<s.length;++e)t.addSubParam(s[e]);else t.addParam(s)}return t}constructor(e=32,t=32){if(this.maxLength=e,this.maxSubParamsLength=t,t>256)throw new Error(\"maxSubParamsLength must not be greater than 256\");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t<this.length;++t){e.push(this.params[t]);const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t<this.length;++t){const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},741:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i<this._addons.length;i++)if(this._addons[i]===e){t=i;break}if(-1===t)throw new Error(\"Could not dispose an addon that has not been loaded\");e.isDisposed=!0,e.dispose.apply(e.instance),this._addons.splice(t,1)}}},771:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferApiView=void 0;const s=i(785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},785:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},285:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(771),r=i(460),n=i(844);class a extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,\"normal\"),this._alternate=new s.BufferApiView(this._core.buffers.alt,\"alternate\"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error(\"Active buffer is neither normal nor alternate\")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=a},975:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},90:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(460),a=i(844),o=i(295),h=i(585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends a.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new o.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},994:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreMouseService=void 0;const n=i(585),a=i(460),o=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,_={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?\"\":`\u001b[M${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?\"m\":\"M\";return`\u001b[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?\"m\":\"M\";return`\u001b[<${c(e,!0)};${e.x};${e.y}${t}`}};let d=t.CoreMouseService=class extends o.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol=\"\",this._activeEncoding=\"\",this._lastEvent=null,this._onProtocolChange=this.register(new a.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(_))this.addEncoding(e,_[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol \"${e}\"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding \"${e}\"`);this._activeEncoding=e}reset(){this.activeProtocol=\"NONE\",this.activeEncoding=\"DEFAULT\",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,\"SGR_PIXELS\"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&(\"DEFAULT\"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=d=s([r(0,n.IBufferService),r(1,n.ICoreService)],d)},83:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreService=void 0;const n=i(439),a=i(460),o=i(844),h=i(585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let _=t.CoreService=class extends o.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new a.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new a.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new a.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new a.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data \"${e}\"`,(()=>e.split(\"\").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary \"${e}\"`,(()=>e.split(\"\").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=_=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],_)},348:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(585),r=i(343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),a=i(585),o={trace:a.LogLevelEnum.TRACE,debug:a.LogLevelEnum.DEBUG,info:a.LogLevelEnum.INFO,warn:a.LogLevelEnum.WARN,error:a.LogLevelEnum.ERROR,off:a.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=a.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange(\"logLevel\",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=o[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)\"function\"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?\"\":\"xterm.js: \")+t,...i)}trace(e,...t){this._logLevel<=a.LogLevelEnum.TRACE&&this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger)??console.log,e,t)}debug(e,...t){this._logLevel<=a.LogLevelEnum.DEBUG&&this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger)??console.log,e,t)}info(e,...t){this._logLevel<=a.LogLevelEnum.INFO&&this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger)??console.info,e,t)}warn(e,...t){this._logLevel<=a.LogLevelEnum.WARN&&this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger)??console.warn,e,t)}error(e,...t){this._logLevel<=a.LogLevelEnum.ERROR&&this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger)??console.error,e,t)}};t.LogService=c=s([r(0,a.IOptionsService)],c),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if(\"function\"!=typeof i.value)throw new Error(\"not supported\");const s=i.value;i.value=function(...e){if(h.logLevel!==a.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(\", \")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},302:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(460),r=i(844),n=i(114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:\"block\",cursorWidth:1,cursorInactiveStyle:\"outline\",customGlyphs:!0,drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollModifier:\"alt\",fastScrollSensitivity:5,fontFamily:\"courier-new, courier, monospace\",fontSize:15,fontWeight:\"normal\",fontWeightBold:\"bold\",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:\"info\",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rescaleOverlappingGlyphs:!1,rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:\" ()[]{}',\\\"`\",altClickMovesCursor:!0,convertEol:!1,termName:\"xterm\",cancelEvents:!1,overviewRulerWidth:0};const a=[\"normal\",\"bold\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"];class o extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i={...t.DEFAULT_OPTIONS};for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options={...i},this._setupOptions(),this.register((0,r.toDisposable)((()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null})))}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key \"${e}\"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key \"${e}\"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case\"cursorStyle\":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return\"block\"===e||\"underline\"===e||\"bar\"===e}(i))throw new Error(`\"${i}\" is not a valid value for ${e}`);break;case\"wordSeparator\":i||(i=t.DEFAULT_OPTIONS[e]);break;case\"fontWeight\":case\"fontWeightBold\":if(\"number\"==typeof i&&1<=i&&i<=1e3)break;i=a.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case\"cursorWidth\":i=Math.floor(i);case\"lineHeight\":case\"tabStopWidth\":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case\"minimumContrastRatio\":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case\"scrollback\":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case\"fastScrollSensitivity\":case\"scrollSensitivity\":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case\"rows\":case\"cols\":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case\"windowsPty\":i=i??{}}return i}}t.OptionsService=o},660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,a=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(n<3?r(a):n>3?r(t,i,a):r(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscLinkService=void 0;const n=i(585);let a=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),a={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(a,n))),this._entriesWithId.set(a.key,a),this._dataByLinkId.set(a.id,a),a.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){return this._dataByLinkId.get(e)?.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=a=s([r(0,n.IBufferService)],a)},343:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i=\"di$target\",s=\"di$dependencies\";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error(\"@IServiceName-decorator can only be used to decorate a parameter\");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},585:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(343);var r;t.IBufferService=(0,s.createDecorator)(\"BufferService\"),t.ICoreMouseService=(0,s.createDecorator)(\"CoreMouseService\"),t.ICoreService=(0,s.createDecorator)(\"CoreService\"),t.ICharsetService=(0,s.createDecorator)(\"CharsetService\"),t.IInstantiationService=(0,s.createDecorator)(\"InstantiationService\"),function(e){e[e.TRACE=0]=\"TRACE\",e[e.DEBUG=1]=\"DEBUG\",e[e.INFO=2]=\"INFO\",e[e.WARN=3]=\"WARN\",e[e.ERROR=4]=\"ERROR\",e[e.OFF=5]=\"OFF\"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)(\"LogService\"),t.IOptionsService=(0,s.createDecorator)(\"OptionsService\"),t.IOscLinkService=(0,s.createDecorator)(\"OscLinkService\"),t.IUnicodeService=(0,s.createDecorator)(\"UnicodeService\"),t.IDecorationService=(0,s.createDecorator)(\"DecorationService\")},480:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeService=void 0;const s=i(460),r=i(225);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active=\"\",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version \"${e}\"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let r=0;r<s;++r){let a=e.charCodeAt(r);if(55296<=a&&a<=56319){if(++r>=s)return t+this.wcwidth(a);const i=e.charCodeAt(r);56320<=i&&i<=57343?a=1024*(a-55296)+i-56320+65536:t+=this.wcwidth(i)}const o=this.charProperties(a,i);let h=n.extractWidth(o);n.extractShouldJoin(o)&&(h-=n.extractWidth(i)),t+=h,i=o}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n},781:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Terminal=void 0;const s=i(437),r=i(969),n=i(460);class a extends r.CoreTerminal{constructor(e={}){super(e),this._onBell=this.register(new n.EventEmitter),this.onBell=this._onBell.event,this._onCursorMove=this.register(new n.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onTitleChange=this.register(new n.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onA11yCharEmitter=this.register(new n.EventEmitter),this.onA11yChar=this._onA11yCharEmitter.event,this._onA11yTabEmitter=this.register(new n.EventEmitter),this.onA11yTab=this._onA11yTabEmitter.event,this._setup(),this.register(this._inputHandler.onRequestBell((()=>this.bell()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register((0,n.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,n.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,n.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,n.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter))}get buffer(){return this.buffers.active}get markers(){return this.buffer.markers}addMarker(e){if(this.buffer===this.buffers.normal)return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}bell(){this._onBell.fire()}input(e,t=!0){this.coreService.triggerDataEvent(e,t)}resize(e,t){e===this.cols&&t===this.rows||super.resize(e,t)}clear(){if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e<this.rows;e++)this.buffer.lines.push(this.buffer.getBlankLine(s.DEFAULT_ATTR_DATA));this._onScroll.fire({position:this.buffer.ydisp,source:0})}}reset(){this.options.rows=this.rows,this.options.cols=this.cols,this._setup(),super.reset()}}t.Terminal=a}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};(()=>{var e=s;Object.defineProperty(e,\"__esModule\",{value:!0}),e.Terminal=void 0;const t=i(285),r=i(975),n=i(90),a=i(781),o=i(741),h=i(844),c=[\"cols\",\"rows\"];class l extends h.Disposable{constructor(e){super(),this._core=this.register(new a.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions={...this._core.options};const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){Object.defineProperty(this._publicOptions,e,{get:()=>this._core.options[e],set:t=>{this._checkReadonlyOptions(e),this._core.options[e]=t}});const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(c.includes(e))throw new Error(`Option \"${e}\" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.options.allowProposedApi)throw new Error(\"You must set the allowProposedApi option to true to use proposed API\")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onLineFeed(){return this._core.onLineFeed}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onTitleChange(){return this._core.onTitleChange}get parser(){return this._checkProposedApi(),this._parser||(this._parser=new r.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new n.UnicodeApi(this._core)}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._checkProposedApi(),this._buffer||(this._buffer=this.register(new t.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t=\"none\";switch(this._core.coreMouseService.activeProtocol){case\"X10\":t=\"x10\";break;case\"VT200\":t=\"vt200\";break;case\"DRAG\":t=\"drag\";break;case\"ANY\":t=\"any\"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}input(e,t=!0){this._core.input(e,t)}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}registerMarker(e=0){return this._checkProposedApi(),this._verifyIntegers(e),this._core.addMarker(e)}addMarker(e){return this.registerMarker(e)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write(\"\\r\\n\",t)}reset(){this._core.reset()}loadAddon(e){this._addonManager.loadAddon(this,e)}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error(\"This API only accepts integers\")}}e.Terminal=l})();var r=exports;for(var n in s)r[n]=s[n];s.__esModule&&Object.defineProperty(r,\"__esModule\",{value:!0})})();\n//# sourceMappingURL=xterm-headless.js.map","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Unicode11Addon=t():e.Unicode11Addon=t()}(globalThis,(()=>(()=>{\"use strict\";var e={384:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeV11=void 0;const r=s(765),n=[[768,879],[1155,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1541],[1552,1562],[1564,1564],[1611,1631],[1648,1648],[1750,1757],[1759,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2045,2045],[2070,2073],[2075,2083],[2085,2087],[2089,2093],[2137,2139],[2259,2306],[2362,2362],[2364,2364],[2369,2376],[2381,2381],[2385,2391],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2558,2558],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2641,2641],[2672,2673],[2677,2677],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2810,2815],[2817,2817],[2876,2876],[2879,2879],[2881,2884],[2893,2893],[2902,2902],[2914,2915],[2946,2946],[3008,3008],[3021,3021],[3072,3072],[3076,3076],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3170,3171],[3201,3201],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3328,3329],[3387,3388],[3393,3396],[3405,3405],[3426,3427],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3981,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4151],[4153,4154],[4157,4158],[4184,4185],[4190,4192],[4209,4212],[4226,4226],[4229,4230],[4237,4237],[4253,4253],[4448,4607],[4957,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6158],[6277,6278],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6683,6683],[6742,6742],[6744,6750],[6752,6752],[6754,6754],[6757,6764],[6771,6780],[6783,6783],[6832,6846],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7040,7041],[7074,7077],[7080,7081],[7083,7085],[7142,7142],[7144,7145],[7149,7149],[7151,7153],[7212,7219],[7222,7223],[7376,7378],[7380,7392],[7394,7400],[7405,7405],[7412,7412],[7416,7417],[7616,7673],[7675,7679],[8203,8207],[8234,8238],[8288,8292],[8294,8303],[8400,8432],[11503,11505],[11647,11647],[11744,11775],[12330,12333],[12441,12442],[42607,42610],[42612,42621],[42654,42655],[42736,42737],[43010,43010],[43014,43014],[43019,43019],[43045,43046],[43204,43205],[43232,43249],[43263,43263],[43302,43309],[43335,43345],[43392,43394],[43443,43443],[43446,43449],[43452,43453],[43493,43493],[43561,43566],[43569,43570],[43573,43574],[43587,43587],[43596,43596],[43644,43644],[43696,43696],[43698,43700],[43703,43704],[43710,43711],[43713,43713],[43756,43757],[43766,43766],[44005,44005],[44008,44008],[44013,44013],[64286,64286],[65024,65039],[65056,65071],[65279,65279],[65529,65531]],i=[[66045,66045],[66272,66272],[66422,66426],[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[68325,68326],[68900,68903],[69446,69456],[69633,69633],[69688,69702],[69759,69761],[69811,69814],[69817,69818],[69821,69821],[69837,69837],[69888,69890],[69927,69931],[69933,69940],[70003,70003],[70016,70017],[70070,70078],[70089,70092],[70191,70193],[70196,70196],[70198,70199],[70206,70206],[70367,70367],[70371,70378],[70400,70401],[70459,70460],[70464,70464],[70502,70508],[70512,70516],[70712,70719],[70722,70724],[70726,70726],[70750,70750],[70835,70840],[70842,70842],[70847,70848],[70850,70851],[71090,71093],[71100,71101],[71103,71104],[71132,71133],[71219,71226],[71229,71229],[71231,71232],[71339,71339],[71341,71341],[71344,71349],[71351,71351],[71453,71455],[71458,71461],[71463,71467],[71727,71735],[71737,71738],[72148,72151],[72154,72155],[72160,72160],[72193,72202],[72243,72248],[72251,72254],[72263,72263],[72273,72278],[72281,72283],[72330,72342],[72344,72345],[72752,72758],[72760,72765],[72767,72767],[72850,72871],[72874,72880],[72882,72883],[72885,72886],[73009,73014],[73018,73018],[73020,73021],[73023,73029],[73031,73031],[73104,73105],[73109,73109],[73111,73111],[73459,73460],[78896,78904],[92912,92916],[92976,92982],[94031,94031],[94095,94098],[113821,113822],[113824,113827],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[121344,121398],[121403,121452],[121461,121461],[121476,121476],[121499,121503],[121505,121519],[122880,122886],[122888,122904],[122907,122913],[122915,122916],[122918,122922],[123184,123190],[123628,123631],[125136,125142],[125252,125258],[917505,917505],[917536,917631],[917760,917999]],o=[[4352,4447],[8986,8987],[9001,9002],[9193,9196],[9200,9200],[9203,9203],[9725,9726],[9748,9749],[9800,9811],[9855,9855],[9875,9875],[9889,9889],[9898,9899],[9917,9918],[9924,9925],[9934,9934],[9940,9940],[9962,9962],[9970,9971],[9973,9973],[9978,9978],[9981,9981],[9989,9989],[9994,9995],[10024,10024],[10060,10060],[10062,10062],[10067,10069],[10071,10071],[10133,10135],[10160,10160],[10175,10175],[11035,11036],[11088,11088],[11093,11093],[11904,11929],[11931,12019],[12032,12245],[12272,12283],[12288,12329],[12334,12350],[12353,12438],[12443,12543],[12549,12591],[12593,12686],[12688,12730],[12736,12771],[12784,12830],[12832,12871],[12880,19903],[19968,42124],[42128,42182],[43360,43388],[44032,55203],[63744,64255],[65040,65049],[65072,65106],[65108,65126],[65128,65131],[65281,65376],[65504,65510]],a=[[94176,94179],[94208,100343],[100352,101106],[110592,110878],[110928,110930],[110948,110951],[110960,111355],[126980,126980],[127183,127183],[127374,127374],[127377,127386],[127488,127490],[127504,127547],[127552,127560],[127568,127569],[127584,127589],[127744,127776],[127789,127797],[127799,127868],[127870,127891],[127904,127946],[127951,127955],[127968,127984],[127988,127988],[127992,128062],[128064,128064],[128066,128252],[128255,128317],[128331,128334],[128336,128359],[128378,128378],[128405,128406],[128420,128420],[128507,128591],[128640,128709],[128716,128716],[128720,128722],[128725,128725],[128747,128748],[128756,128762],[128992,129003],[129293,129393],[129395,129398],[129402,129442],[129445,129450],[129454,129482],[129485,129535],[129648,129651],[129656,129658],[129664,129666],[129680,129685],[131072,196605],[196608,262141]];let l;function c(e,t){let s,r=0,n=t.length-1;if(e<t[0][0]||e>t[n][1])return!1;for(;n>=r;)if(s=r+n>>1,e>t[s][1])r=s+1;else{if(!(e<t[s][0]))return!0;n=s-1}return!1}t.UnicodeV11=class{constructor(){if(this.version=\"11\",!l){l=new Uint8Array(65536),l.fill(1),l[0]=0,l.fill(0,1,32),l.fill(0,127,160);for(let e=0;e<n.length;++e)l.fill(0,n[e][0],n[e][1]+1);for(let e=0;e<o.length;++e)l.fill(2,o[e][0],o[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?l[e]:c(e,i)?0:c(e,a)?2:1}charProperties(e,t){let s=this.wcwidth(e),n=0===s&&0!==t;if(n){const e=r.UnicodeService.extractWidth(t);0===e?n=!1:e>s&&(s=e)}return r.UnicodeService.createPropertyValue(0,s,n)}}},546:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeV6=void 0;const r=s(765),n=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],i=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version=\"6\",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;e<n.length;++e)o.fill(0,n[e][0],n[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?o[e]:function(e,t){let s,r=0,n=t.length-1;if(e<t[0][0]||e>t[n][1])return!1;for(;n>=r;)if(s=r+n>>1,e>t[s][1])r=s+1;else{if(!(e<t[s][0]))return!0;n=s-1}return!1}(e,i)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let s=this.wcwidth(e),n=0===s&&0!==t;if(n){const e=r.UnicodeService.extractWidth(t);0===e?n=!1:e>s&&(s=e)}return r.UnicodeService.createPropertyValue(0,s,n)}}},765:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeService=void 0;const r=s(546),n=s(276);class i{static extractShouldJoin(e){return!!(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,s=!1){return(16777215&e)<<3|(3&t)<<1|(s?1:0)}constructor(){this._providers=Object.create(null),this._active=\"\",this._onChange=new n.Emitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version \"${e}\"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,s=0;const r=e.length;for(let n=0;n<r;++n){let o=e.charCodeAt(n);if(55296<=o&&o<=56319){if(++n>=r)return t+this.wcwidth(o);const s=e.charCodeAt(n);56320<=s&&s<=57343?o=1024*(o-55296)+s-56320+65536:t+=this.wcwidth(s)}const a=this.charProperties(o,s);let l=i.extractWidth(a);i.extractShouldJoin(a)&&(l-=i.extractWidth(s)),t+=l,s=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=i},732:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Permutation=t.CallbackIterable=t.ArrayQueue=t.booleanComparator=t.numberComparator=t.CompareResult=void 0,t.tail=function(e,t=0){return e[e.length-(1+t)]},t.tail2=function(e){if(0===e.length)throw new Error(\"Invalid tail call\");return[e.slice(0,e.length-1),e[e.length-1]]},t.equals=function(e,t,s=(e,t)=>e===t){if(e===t)return!0;if(!e||!t)return!1;if(e.length!==t.length)return!1;for(let r=0,n=e.length;r<n;r++)if(!s(e[r],t[r]))return!1;return!0},t.removeFastWithoutKeepingOrder=function(e,t){const s=e.length-1;t<s&&(e[t]=e[s]),e.pop()},t.binarySearch=function(e,t,s){return i(e.length,(r=>s(e[r],t)))},t.binarySearch2=i,t.quickSelect=function e(t,s,r){if((t|=0)>=s.length)throw new TypeError(\"invalid index\");const n=s[Math.floor(s.length*Math.random())],i=[],o=[],a=[];for(const e of s){const t=r(e,n);t<0?i.push(e):t>0?o.push(e):a.push(e)}return t<i.length?e(t,i,r):t<i.length+a.length?a[0]:e(t-(i.length+a.length),o,r)},t.groupBy=function(e,t){const s=[];let r;for(const n of e.slice(0).sort(t))r&&0===t(r[0],n)?r.push(n):(r=[n],s.push(r));return s},t.groupAdjacentBy=function*(e,t){let s,r;for(const n of e)void 0!==r&&t(r,n)?s.push(n):(s&&(yield s),s=[n]),r=n;s&&(yield s)},t.forEachAdjacent=function(e,t){for(let s=0;s<=e.length;s++)t(0===s?void 0:e[s-1],s===e.length?void 0:e[s])},t.forEachWithNeighbors=function(e,t){for(let s=0;s<e.length;s++)t(0===s?void 0:e[s-1],e[s],s+1===e.length?void 0:e[s+1])},t.sortedDiff=o,t.delta=function(e,t,s){const r=o(e,t,s),n=[],i=[];for(const t of r)n.push(...e.slice(t.start,t.start+t.deleteCount)),i.push(...t.toInsert);return{removed:n,added:i}},t.top=function(e,t,s){if(0===s)return[];const r=e.slice(0,s).sort(t);return a(e,t,r,s,e.length),r},t.topAsync=function(e,t,s,n,i){return 0===s?Promise.resolve([]):new Promise(((o,l)=>{(async()=>{const o=e.length,l=e.slice(0,s).sort(t);for(let c=s,h=Math.min(s+n,o);c<o;c=h,h=Math.min(h+n,o)){if(c>s&&await new Promise((e=>setTimeout(e))),i&&i.isCancellationRequested)throw new r.CancellationError;a(e,t,l,c,h)}return l})().then(o,l)}))},t.coalesce=function(e){return e.filter((e=>!!e))},t.coalesceInPlace=function(e){let t=0;for(let s=0;s<e.length;s++)e[s]&&(e[t]=e[s],t+=1);e.length=t},t.move=function(e,t,s){e.splice(s,0,e.splice(t,1)[0])},t.isFalsyOrEmpty=function(e){return!Array.isArray(e)||0===e.length},t.isNonEmptyArray=function(e){return Array.isArray(e)&&e.length>0},t.distinct=function(e,t=e=>e){const s=new Set;return e.filter((e=>{const r=t(e);return!s.has(r)&&(s.add(r),!0)}))},t.uniqueFilter=function(e){const t=new Set;return s=>{const r=e(s);return!t.has(r)&&(t.add(r),!0)}},t.firstOrDefault=function(e,t){return e.length>0?e[0]:t},t.lastOrDefault=function(e,t){return e.length>0?e[e.length-1]:t},t.commonPrefixLength=function(e,t,s=(e,t)=>e===t){let r=0;for(let n=0,i=Math.min(e.length,t.length);n<i&&s(e[n],t[n]);n++)r++;return r},t.range=function(e,t){let s=\"number\"==typeof t?e:0;\"number\"==typeof t?s=e:(s=0,t=e);const r=[];if(s<=t)for(let e=s;e<t;e++)r.push(e);else for(let e=s;e>t;e--)r.push(e);return r},t.index=function(e,t,s){return e.reduce(((e,r)=>(e[t(r)]=s?s(r):r,e)),Object.create(null))},t.insert=function(e,t){return e.push(t),()=>l(e,t)},t.remove=l,t.arrayInsert=function(e,t,s){const r=e.slice(0,t),n=e.slice(t);return r.concat(s,n)},t.shuffle=function(e,t){let s;if(\"number\"==typeof t){let e=t;s=()=>{const t=179426549*Math.sin(e++);return t-Math.floor(t)}}else s=Math.random;for(let t=e.length-1;t>0;t-=1){const r=Math.floor(s()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}},t.pushToStart=function(e,t){const s=e.indexOf(t);s>-1&&(e.splice(s,1),e.unshift(t))},t.pushToEnd=function(e,t){const s=e.indexOf(t);s>-1&&(e.splice(s,1),e.push(t))},t.pushMany=function(e,t){for(const s of t)e.push(s)},t.mapArrayOrNot=function(e,t){return Array.isArray(e)?e.map(t):t(e)},t.asArray=function(e){return Array.isArray(e)?e:[e]},t.getRandomElement=function(e){return e[Math.floor(Math.random()*e.length)]},t.insertInto=c,t.splice=function(e,t,s,r){const n=h(e,t);let i=e.splice(n,s);return void 0===i&&(i=[]),c(e,n,r),i},t.compareBy=function(e,t){return(s,r)=>t(e(s),e(r))},t.tieBreakComparators=function(...e){return(t,s)=>{for(const r of e){const e=r(t,s);if(!u.isNeitherLessOrGreaterThan(e))return e}return u.neitherLessOrGreaterThan}},t.reverseOrder=function(e){return(t,s)=>-e(t,s)};const r=s(577),n=s(411);function i(e,t){let s=0,r=e-1;for(;s<=r;){const e=(s+r)/2|0,n=t(e);if(n<0)s=e+1;else{if(!(n>0))return e;r=e-1}}return-(s+1)}function o(e,t,s){const r=[];function n(e,t,s){if(0===t&&0===s.length)return;const n=r[r.length-1];n&&n.start+n.deleteCount===e?(n.deleteCount+=t,n.toInsert.push(...s)):r.push({start:e,deleteCount:t,toInsert:s})}let i=0,o=0;for(;;){if(i===e.length){n(i,0,t.slice(o));break}if(o===t.length){n(i,e.length-i,[]);break}const r=e[i],a=t[o],l=s(r,a);0===l?(i+=1,o+=1):l<0?(n(i,1,[]),i+=1):l>0&&(n(i,0,[a]),o+=1)}return r}function a(e,t,s,r,i){for(const o=s.length;r<i;r++){const i=e[r];if(t(i,s[o-1])<0){s.pop();const e=(0,n.findFirstIdxMonotonousOrArrLen)(s,(e=>t(i,e)<0));s.splice(e,0,i)}}}function l(e,t){const s=e.indexOf(t);if(s>-1)return e.splice(s,1),t}function c(e,t,s){const r=h(e,t),n=e.length,i=s.length;e.length=n+i;for(let t=n-1;t>=r;t--)e[t+i]=e[t];for(let t=0;t<i;t++)e[t+r]=s[t]}function h(e,t){return t<0?Math.max(t+e.length,0):Math.min(t,e.length)}var u;!function(e){e.isLessThan=function(e){return e<0},e.isLessThanOrEqual=function(e){return e<=0},e.isGreaterThan=function(e){return e>0},e.isNeitherLessOrGreaterThan=function(e){return 0===e},e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0}(u||(t.CompareResult=u={})),t.numberComparator=(e,t)=>e-t,t.booleanComparator=(e,s)=>(0,t.numberComparator)(e?1:0,s?1:0),t.ArrayQueue=class{constructor(e){this.items=e,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<this.items.length&&e(this.items[t]);)t++;const s=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,s}takeFromEndWhile(e){let t=this.lastIdx;for(;t>=0&&e(this.items[t]);)t--;const s=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,s}peek(){if(0!==this.length)return this.items[this.firstIdx]}peekLast(){if(0!==this.length)return this.items[this.lastIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}removeLast(){const e=this.items[this.lastIdx];return this.lastIdx--,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}};class d{static{this.empty=new d((e=>{}))}constructor(e){this.iterate=e}forEach(e){this.iterate((t=>(e(t),!0)))}toArray(){const e=[];return this.iterate((t=>(e.push(t),!0))),e}filter(e){return new d((t=>this.iterate((s=>!e(s)||t(s)))))}map(e){return new d((t=>this.iterate((s=>t(e(s))))))}some(e){let t=!1;return this.iterate((s=>(t=e(s),!t))),t}findFirst(e){let t;return this.iterate((s=>!e(s)||(t=s,!1))),t}findLast(e){let t;return this.iterate((s=>(e(s)&&(t=s),!0))),t}findLastMaxBy(e){let t,s=!0;return this.iterate((r=>((s||u.isGreaterThan(e(r,t)))&&(s=!1,t=r),!0))),t}}t.CallbackIterable=d;class f{constructor(e){this._indexMap=e}static createSortPermutation(e,t){const s=Array.from(e.keys()).sort(((s,r)=>t(e[s],e[r])));return new f(s)}apply(e){return e.map(((t,s)=>e[this._indexMap[s]]))}inverse(){const e=this._indexMap.slice();for(let t=0;t<this._indexMap.length;t++)e[this._indexMap[t]]=t;return new f(e)}}t.Permutation=f},411:(e,t)=>{function s(e,t,s=e.length-1){for(let r=s;r>=0;r--)if(t(e[r]))return r;return-1}function r(e,t,s=0,r=e.length){let n=s,i=r;for(;n<i;){const s=Math.floor((n+i)/2);t(e[s])?n=s+1:i=s}return n-1}function n(e,t,s=0,r=e.length){let n=s,i=r;for(;n<i;){const s=Math.floor((n+i)/2);t(e[s])?i=s:n=s+1}return n}Object.defineProperty(t,\"__esModule\",{value:!0}),t.MonotonousArray=void 0,t.findLast=function(e,t){const r=s(e,t);if(-1!==r)return e[r]},t.findLastIdx=s,t.findLastMonotonous=function(e,t){const s=r(e,t);return-1===s?void 0:e[s]},t.findLastIdxMonotonous=r,t.findFirstMonotonous=function(e,t){const s=n(e,t);return s===e.length?void 0:e[s]},t.findFirstIdxMonotonousOrArrLen=n,t.findFirstIdxMonotonous=function(e,t,s=0,r=e.length){const i=n(e,t,s,r);return i===e.length?-1:i},t.findFirstMax=o,t.findLastMax=function(e,t){if(0===e.length)return;let s=e[0];for(let r=1;r<e.length;r++){const n=e[r];t(n,s)>=0&&(s=n)}return s},t.findFirstMin=function(e,t){return o(e,((e,s)=>-t(e,s)))},t.findMaxIdx=function(e,t){if(0===e.length)return-1;let s=0;for(let r=1;r<e.length;r++)t(e[r],e[s])>0&&(s=r);return s},t.mapFindFirst=function(e,t){for(const s of e){const e=t(s);if(void 0!==e)return e}};class i{static{this.assertInvariants=!1}constructor(e){this._array=e,this._findLastMonotonousLastIdx=0}findLastMonotonous(e){if(i.assertInvariants){if(this._prevFindLastPredicate)for(const t of this._array)if(this._prevFindLastPredicate(t)&&!e(t))throw new Error(\"MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.\");this._prevFindLastPredicate=e}const t=r(this._array,e,this._findLastMonotonousLastIdx);return this._findLastMonotonousLastIdx=t+1,-1===t?void 0:this._array[t]}}function o(e,t){if(0===e.length)return;let s=e[0];for(let r=1;r<e.length;r++){const n=e[r];t(n,s)>0&&(s=n)}return s}t.MonotonousArray=i},33:(e,t)=>{var s;Object.defineProperty(t,\"__esModule\",{value:!0}),t.SetWithKey=void 0,t.groupBy=function(e,t){const s=Object.create(null);for(const r of e){const e=t(r);let n=s[e];n||(n=s[e]=[]),n.push(r)}return s},t.diffSets=function(e,t){const s=[],r=[];for(const r of e)t.has(r)||s.push(r);for(const s of t)e.has(s)||r.push(s);return{removed:s,added:r}},t.diffMaps=function(e,t){const s=[],r=[];for(const[r,n]of e)t.has(r)||s.push(n);for(const[s,n]of t)e.has(s)||r.push(n);return{removed:s,added:r}},t.intersection=function(e,t){const s=new Set;for(const r of t)e.has(r)&&s.add(r);return s};class r{static{s=Symbol.toStringTag}constructor(e,t){this.toKey=t,this._map=new Map,this[s]=\"SetWithKey\";for(const t of e)this.add(t)}get size(){return this._map.size}add(e){const t=this.toKey(e);return this._map.set(t,e),this}delete(e){return this._map.delete(this.toKey(e))}has(e){return this._map.has(this.toKey(e))}*entries(){for(const e of this._map.values())yield[e,e]}keys(){return this.values()}*values(){for(const e of this._map.values())yield e}clear(){this._map.clear()}forEach(e,t){this._map.forEach((s=>e.call(t,s,s,this)))}[Symbol.iterator](){return this.values()}}t.SetWithKey=r},577:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BugIndicatingError=t.ErrorNoTelemetry=t.ExpectedError=t.NotSupportedError=t.NotImplementedError=t.ReadonlyError=t.CancellationError=t.errorHandler=t.ErrorHandler=void 0,t.setUnexpectedErrorHandler=function(e){t.errorHandler.setUnexpectedErrorHandler(e)},t.isSigPipeError=function(e){if(!e||\"object\"!=typeof e)return!1;const t=e;return\"EPIPE\"===t.code&&\"WRITE\"===t.syscall?.toUpperCase()},t.onUnexpectedError=function(e){n(e)||t.errorHandler.onUnexpectedError(e)},t.onUnexpectedExternalError=function(e){n(e)||t.errorHandler.onUnexpectedExternalError(e)},t.transformErrorForSerialization=function(e){if(e instanceof Error){const{name:t,message:s}=e;return{$isError:!0,name:t,message:s,stack:e.stacktrace||e.stack,noTelemetry:h.isErrorNoTelemetry(e)}}return e},t.transformErrorFromSerialization=function(e){let t;return e.noTelemetry?t=new h:(t=new Error,t.name=e.name),t.message=e.message,t.stack=e.stack,t},t.isCancellationError=n,t.canceled=function(){const e=new Error(r);return e.name=e.message,e},t.illegalArgument=function(e){return e?new Error(`Illegal argument: ${e}`):new Error(\"Illegal argument\")},t.illegalState=function(e){return e?new Error(`Illegal state: ${e}`):new Error(\"Illegal state\")},t.getErrorMessage=function(e){return e?e.message?e.message:e.stack?e.stack.split(\"\\n\")[0]:String(e):\"Error\"};class s{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout((()=>{if(e.stack){if(h.isErrorNoTelemetry(e))throw new h(e.message+\"\\n\\n\"+e.stack);throw new Error(e.message+\"\\n\\n\"+e.stack)}throw e}),0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach((t=>{t(e)}))}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}}t.ErrorHandler=s,t.errorHandler=new s;const r=\"Canceled\";function n(e){return e instanceof i||e instanceof Error&&e.name===r&&e.message===r}class i extends Error{constructor(){super(r),this.name=this.message}}t.CancellationError=i;class o extends TypeError{constructor(e){super(e?`${e} is read-only and cannot be changed`:\"Cannot change read-only property\")}}t.ReadonlyError=o;class a extends Error{constructor(e){super(\"NotImplemented\"),e&&(this.message=e)}}t.NotImplementedError=a;class l extends Error{constructor(e){super(\"NotSupported\"),e&&(this.message=e)}}t.NotSupportedError=l;class c extends Error{constructor(){super(...arguments),this.isExpected=!0}}t.ExpectedError=c;class h extends Error{constructor(e){super(e),this.name=\"CodeExpectedError\"}static fromError(e){if(e instanceof h)return e;const t=new h;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return\"CodeExpectedError\"===e.name}}t.ErrorNoTelemetry=h;class u extends Error{constructor(e){super(e||\"An unexpected bug occurred.\"),Object.setPrototypeOf(this,u.prototype)}}t.BugIndicatingError=u},276:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ValueWithChangeEvent=t.Relay=t.EventBufferer=t.DynamicListEventMultiplexer=t.EventMultiplexer=t.MicrotaskEmitter=t.DebounceEmitter=t.PauseableEmitter=t.AsyncEmitter=t.createEventDeliveryQueue=t.Emitter=t.ListenerRefusalError=t.ListenerLeakError=t.EventProfiling=t.Event=void 0,t.setGlobalLeakWarningThreshold=function(e){const t=h;return h=e,{dispose(){h=t}}};const r=s(577),n=s(355),i=s(540),o=s(711),a=s(79);var l;!function(e){function t(e){return(t,s=null,r)=>{let n,i=!1;return n=e((e=>{if(!i)return n?n.dispose():i=!0,t.call(s,e)}),null,r),i&&n.dispose(),n}}function s(e,t,s){return n(((s,r=null,n)=>e((e=>s.call(r,t(e))),null,n)),s)}function r(e,t,s){return n(((s,r=null,n)=>e((e=>t(e)&&s.call(r,e)),null,n)),s)}function n(e,t){let s;const r=new m({onWillAddFirstListener(){s=e(r.fire,r)},onDidRemoveLastListener(){s?.dispose()}});return t?.add(r),r.event}function o(e,t,s=100,r=!1,n=!1,i,o){let a,l,c,h,u=0;const d=new m({leakWarningThreshold:i,onWillAddFirstListener(){a=e((e=>{u++,l=t(l,e),r&&!c&&(d.fire(l),l=void 0),h=()=>{const e=l;l=void 0,c=void 0,(!r||u>1)&&d.fire(e),u=0},\"number\"==typeof s?(clearTimeout(c),c=setTimeout(h,s)):void 0===c&&(c=0,queueMicrotask(h))}))},onWillRemoveListener(){n&&u>0&&h?.()},onDidRemoveLastListener(){h=void 0,a.dispose()}});return o?.add(d),d.event}e.None=()=>i.Disposable.None,e.defer=function(e,t){return o(e,(()=>{}),0,void 0,!0,void 0,t)},e.once=t,e.map=s,e.forEach=function(e,t,s){return n(((s,r=null,n)=>e((e=>{t(e),s.call(r,e)}),null,n)),s)},e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,s=null,r)=>{return n=(0,i.combinedDisposable)(...e.map((e=>e((e=>t.call(s,e)))))),(o=r)instanceof Array?o.push(n):o&&o.add(n),n;var n,o}},e.reduce=function(e,t,r,n){let i=r;return s(e,(e=>(i=t(i,e),i)),n)},e.debounce=o,e.accumulate=function(t,s=0,r){return e.debounce(t,((e,t)=>e?(e.push(t),e):[t]),s,void 0,!0,void 0,r)},e.latch=function(e,t=(e,t)=>e===t,s){let n,i=!0;return r(e,(e=>{const s=i||!t(e,n);return i=!1,n=e,s}),s)},e.split=function(t,s,r){return[e.filter(t,s,r),e.filter(t,(e=>!s(e)),r)]},e.buffer=function(e,t=!1,s=[],r){let n=s.slice(),i=e((e=>{n?n.push(e):a.fire(e)}));r&&r.add(i);const o=()=>{n?.forEach((e=>a.fire(e))),n=null},a=new m({onWillAddFirstListener(){i||(i=e((e=>a.fire(e))),r&&r.add(i))},onDidAddFirstListener(){n&&(t?setTimeout(o):o())},onDidRemoveLastListener(){i&&i.dispose(),i=null}});return r&&r.add(a),a.event},e.chain=function(e,t){return(s,r,n)=>{const i=t(new l);return e((function(e){const t=i.evaluate(e);t!==a&&s.call(r,t)}),void 0,n)}};const a=Symbol(\"HaltChainable\");class l{constructor(){this.steps=[]}map(e){return this.steps.push(e),this}forEach(e){return this.steps.push((t=>(e(t),t))),this}filter(e){return this.steps.push((t=>e(t)?t:a)),this}reduce(e,t){let s=t;return this.steps.push((t=>(s=e(s,t),s))),this}latch(e=(e,t)=>e===t){let t,s=!0;return this.steps.push((r=>{const n=s||!e(r,t);return s=!1,t=r,n?r:a})),this}evaluate(e){for(const t of this.steps)if((e=t(e))===a)break;return e}}e.fromNodeEventEmitter=function(e,t,s=e=>e){const r=(...e)=>n.fire(s(...e)),n=new m({onWillAddFirstListener:()=>e.on(t,r),onDidRemoveLastListener:()=>e.removeListener(t,r)});return n.event},e.fromDOMEventEmitter=function(e,t,s=e=>e){const r=(...e)=>n.fire(s(...e)),n=new m({onWillAddFirstListener:()=>e.addEventListener(t,r),onDidRemoveLastListener:()=>e.removeEventListener(t,r)});return n.event},e.toPromise=function(e){return new Promise((s=>t(e)(s)))},e.fromPromise=function(e){const t=new m;return e.then((e=>{t.fire(e)}),(()=>{t.fire(void 0)})).finally((()=>{t.dispose()})),t.event},e.forward=function(e,t){return e((e=>t.fire(e)))},e.runAndSubscribe=function(e,t,s){return t(s),e((e=>t(e)))};class c{constructor(e,t){this._observable=e,this._counter=0,this._hasChanged=!1;const s={onWillAddFirstListener:()=>{e.addObserver(this)},onDidRemoveLastListener:()=>{e.removeObserver(this)}};this.emitter=new m(s),t&&t.add(this.emitter)}beginUpdate(e){this._counter++}handlePossibleChange(e){}handleChange(e,t){this._hasChanged=!0}endUpdate(e){this._counter--,0===this._counter&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}e.fromObservable=function(e,t){return new c(e,t).emitter.event},e.fromObservableLight=function(e){return(t,s,r)=>{let n=0,o=!1;const a={beginUpdate(){n++},endUpdate(){n--,0===n&&(e.reportChanges(),o&&(o=!1,t.call(s)))},handlePossibleChange(){},handleChange(){o=!0}};e.addObserver(a),e.reportChanges();const l={dispose(){e.removeObserver(a)}};return r instanceof i.DisposableStore?r.add(l):Array.isArray(r)&&r.push(l),l}}}(l||(t.Event=l={}));class c{static{this.all=new Set}static{this._idPool=0}constructor(e){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${e}_${c._idPool++}`,c.all.add(this)}start(e){this._stopWatch=new a.StopWatch,this.listenerCount=e}stop(){if(this._stopWatch){const e=this._stopWatch.elapsed();this.durations.push(e),this.elapsedOverall+=e,this.invocationCount+=1,this._stopWatch=void 0}}}t.EventProfiling=c;let h=-1;class u{static{this._idPool=1}constructor(e,t,s=(u._idPool++).toString(16).padStart(3,\"0\")){this._errorHandler=e,this.threshold=t,this.name=s,this._warnCountdown=0}dispose(){this._stacks?.clear()}check(e,t){const s=this.threshold;if(s<=0||t<s)return;this._stacks||(this._stacks=new Map);const r=this._stacks.get(e.value)||0;if(this._stacks.set(e.value,r+1),this._warnCountdown-=1,this._warnCountdown<=0){this._warnCountdown=.5*s;const[e,r]=this.getMostFrequentStack(),n=`[${this.name}] potential listener LEAK detected, having ${t} listeners already. MOST frequent listener (${r}):`;console.warn(n),console.warn(e);const i=new f(n,e);this._errorHandler(i)}return()=>{const t=this._stacks.get(e.value)||0;this._stacks.set(e.value,t-1)}}getMostFrequentStack(){if(!this._stacks)return;let e,t=0;for(const[s,r]of this._stacks)(!e||t<r)&&(e=[s,r],t=r);return e}}class d{static create(){const e=new Error;return new d(e.stack??\"\")}constructor(e){this.value=e}print(){console.warn(this.value.split(\"\\n\").slice(2).join(\"\\n\"))}}class f extends Error{constructor(e,t){super(e),this.name=\"ListenerLeakError\",this.stack=t}}t.ListenerLeakError=f;class p extends Error{constructor(e,t){super(e),this.name=\"ListenerRefusalError\",this.stack=t}}t.ListenerRefusalError=p;let _=0;class v{constructor(e){this.value=e,this.id=_++}}class m{constructor(e){this._size=0,this._options=e,this._leakageMon=h>0||this._options?.leakWarningThreshold?new u(e?.onListenerError??r.onUnexpectedError,this._options?.leakWarningThreshold??h):void 0,this._perfMon=this._options?._profName?new c(this._options._profName):void 0,this._deliveryQueue=this._options?.deliveryQueue}dispose(){this._disposed||(this._disposed=!0,this._deliveryQueue?.current===this&&this._deliveryQueue.reset(),this._listeners&&(this._listeners=void 0,this._size=0),this._options?.onDidRemoveLastListener?.(),this._leakageMon?.dispose())}get event(){return this._event??=(e,t,s)=>{if(this._leakageMon&&this._size>this._leakageMon.threshold**2){const e=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(e);const t=this._leakageMon.getMostFrequentStack()??[\"UNKNOWN stack\",-1],s=new p(`${e}. HINT: Stack shows most frequent listener (${t[1]}-times)`,t[0]);return(this._options?.onListenerError||r.onUnexpectedError)(s),i.Disposable.None}if(this._disposed)return i.Disposable.None;t&&(e=e.bind(t));const n=new v(e);let o;this._leakageMon&&this._size>=Math.ceil(.2*this._leakageMon.threshold)&&(n.stack=d.create(),o=this._leakageMon.check(n.stack,this._size+1)),this._listeners?this._listeners instanceof v?(this._deliveryQueue??=new g,this._listeners=[this._listeners,n]):this._listeners.push(n):(this._options?.onWillAddFirstListener?.(this),this._listeners=n,this._options?.onDidAddFirstListener?.(this)),this._size++;const a=(0,i.toDisposable)((()=>{o?.(),this._removeListener(n)}));return s instanceof i.DisposableStore?s.add(a):Array.isArray(s)&&s.push(a),a},this._event}_removeListener(e){if(this._options?.onWillRemoveListener?.(this),!this._listeners)return;if(1===this._size)return this._listeners=void 0,this._options?.onDidRemoveLastListener?.(this),void(this._size=0);const t=this._listeners,s=t.indexOf(e);if(-1===s)throw console.log(\"disposed?\",this._disposed),console.log(\"size?\",this._size),console.log(\"arr?\",JSON.stringify(this._listeners)),new Error(\"Attempted to dispose unknown listener\");this._size--,t[s]=void 0;const r=this._deliveryQueue.current===this;if(2*this._size<=t.length){let e=0;for(let s=0;s<t.length;s++)t[s]?t[e++]=t[s]:r&&(this._deliveryQueue.end--,e<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=e}}_deliver(e,t){if(!e)return;const s=this._options?.onListenerError||r.onUnexpectedError;if(s)try{e.value(t)}catch(e){s(e)}else e.value(t)}_deliverQueue(e){const t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){if(this._deliveryQueue?.current&&(this._deliverQueue(this._deliveryQueue),this._perfMon?.stop()),this._perfMon?.start(this._size),this._listeners)if(this._listeners instanceof v)this._deliver(this._listeners,e);else{const t=this._deliveryQueue;t.enqueue(this,e,this._listeners.length),this._deliverQueue(t)}this._perfMon?.stop()}hasListeners(){return this._size>0}}t.Emitter=m,t.createEventDeliveryQueue=()=>new g;class g{constructor(){this.i=-1,this.end=0}enqueue(e,t,s){this.i=0,this.end=s,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}t.AsyncEmitter=class extends m{async fireAsync(e,t,s){if(this._listeners)for(this._asyncDeliveryQueue||(this._asyncDeliveryQueue=new o.LinkedList),((e,t)=>{if(e instanceof v)t(e);else for(let s=0;s<e.length;s++){const r=e[s];r&&t(r)}})(this._listeners,(t=>this._asyncDeliveryQueue.push([t.value,e])));this._asyncDeliveryQueue.size>0&&!t.isCancellationRequested;){const[e,n]=this._asyncDeliveryQueue.shift(),i=[],o={...n,token:t,waitUntil:t=>{if(Object.isFrozen(i))throw new Error(\"waitUntil can NOT be called asynchronous\");s&&(t=s(t,e)),i.push(t)}};try{e(o)}catch(e){(0,r.onUnexpectedError)(e);continue}Object.freeze(i),await Promise.allSettled(i).then((e=>{for(const t of e)\"rejected\"===t.status&&(0,r.onUnexpectedError)(t.reason)}))}}};class y extends m{get isPaused(){return 0!==this._isPaused}constructor(e){super(e),this._isPaused=0,this._eventQueue=new o.LinkedList,this._mergeFn=e?.merge}pause(){this._isPaused++}resume(){if(0!==this._isPaused&&0==--this._isPaused)if(this._mergeFn){if(this._eventQueue.size>0){const e=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(e))}}else for(;!this._isPaused&&0!==this._eventQueue.size;)super.fire(this._eventQueue.shift())}fire(e){this._size&&(0!==this._isPaused?this._eventQueue.push(e):super.fire(e))}}t.PauseableEmitter=y,t.DebounceEmitter=class extends y{constructor(e){super(e),this._delay=e.delay??100}fire(e){this._handle||(this.pause(),this._handle=setTimeout((()=>{this._handle=void 0,this.resume()}),this._delay)),super.fire(e)}},t.MicrotaskEmitter=class extends m{constructor(e){super(e),this._queuedEvents=[],this._mergeFn=e?.merge}fire(e){this.hasListeners()&&(this._queuedEvents.push(e),1===this._queuedEvents.length&&queueMicrotask((()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach((e=>super.fire(e))),this._queuedEvents=[]})))}};class b{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new m({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(e){const t={event:e,listener:null};return this.events.push(t),this.hasListeners&&this.hook(t),(0,i.toDisposable)((0,n.createSingleCallFunction)((()=>{this.hasListeners&&this.unhook(t);const e=this.events.indexOf(t);this.events.splice(e,1)})))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach((e=>this.hook(e)))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach((e=>this.unhook(e)))}hook(e){e.listener=e.event((e=>this.emitter.fire(e)))}unhook(e){e.listener?.dispose(),e.listener=null}dispose(){this.emitter.dispose();for(const e of this.events)e.listener?.dispose();this.events=[]}}t.EventMultiplexer=b,t.DynamicListEventMultiplexer=class{constructor(e,t,s,r){this._store=new i.DisposableStore;const n=this._store.add(new b),o=this._store.add(new i.DisposableMap);function a(e){o.set(e,n.add(r(e)))}for(const t of e)a(t);this._store.add(t((e=>{a(e)}))),this._store.add(s((e=>{o.deleteAndDispose(e)}))),this.event=n.event}dispose(){this._store.dispose()}},t.EventBufferer=class{constructor(){this.data=[]}wrapEvent(e,t,s){return(r,n,i)=>e((e=>{const i=this.data[this.data.length-1];if(!t)return void(i?i.buffers.push((()=>r.call(n,e))):r.call(n,e));const o=i;o?(o.items??=[],o.items.push(e),0===o.buffers.length&&i.buffers.push((()=>{o.reducedResult??=s?o.items.reduce(t,s):o.items.reduce(t),r.call(n,o.reducedResult)}))):r.call(n,t(s,e))}),void 0,i)}bufferEvents(e){const t={buffers:new Array};this.data.push(t);const s=e();return this.data.pop(),t.buffers.forEach((e=>e())),s}},t.Relay=class{constructor(){this.listening=!1,this.inputEvent=l.None,this.inputEventListener=i.Disposable.None,this.emitter=new m({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}},t.ValueWithChangeEvent=class{static const(e){return new E(e)}constructor(e){this._value=e,this._onDidChange=new m,this.onDidChange=this._onDidChange.event}get value(){return this._value}set value(e){e!==this._value&&(this._value=e,this._onDidChange.fire(void 0))}};class E{constructor(e){this.value=e,this.onDidChange=l.None}}},355:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.createSingleCallFunction=function(e,t){const s=this;let r,n=!1;return function(){if(n)return r;if(n=!0,t)try{r=e.apply(s,arguments)}finally{t()}else r=e.apply(s,arguments);return r}}},956:(e,t)=>{var s;Object.defineProperty(t,\"__esModule\",{value:!0}),t.Iterable=void 0,function(e){function t(e){return e&&\"object\"==typeof e&&\"function\"==typeof e[Symbol.iterator]}e.is=t;const s=Object.freeze([]);function*r(e){yield e}e.empty=function(){return s},e.single=r,e.wrap=function(e){return t(e)?e:r(e)},e.from=function(e){return e||s},e.reverse=function*(e){for(let t=e.length-1;t>=0;t--)yield e[t]},e.isEmpty=function(e){return!e||!0===e[Symbol.iterator]().next().done},e.first=function(e){return e[Symbol.iterator]().next().value},e.some=function(e,t){let s=0;for(const r of e)if(t(r,s++))return!0;return!1},e.find=function(e,t){for(const s of e)if(t(s))return s},e.filter=function*(e,t){for(const s of e)t(s)&&(yield s)},e.map=function*(e,t){let s=0;for(const r of e)yield t(r,s++)},e.flatMap=function*(e,t){let s=0;for(const r of e)yield*t(r,s++)},e.concat=function*(...e){for(const t of e)yield*t},e.reduce=function(e,t,s){let r=s;for(const s of e)r=t(r,s);return r},e.slice=function*(e,t,s=e.length){for(t<0&&(t+=e.length),s<0?s+=e.length:s>e.length&&(s=e.length);t<s;t++)yield e[t]},e.consume=function(t,s=Number.POSITIVE_INFINITY){const r=[];if(0===s)return[r,t];const n=t[Symbol.iterator]();for(let t=0;t<s;t++){const t=n.next();if(t.done)return[r,e.empty()];r.push(t.value)}return[r,{[Symbol.iterator]:()=>n}]},e.asyncToArray=async function(e){const t=[];for await(const s of e)t.push(s);return Promise.resolve(t)}}(s||(t.Iterable=s={}))},540:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DisposableMap=t.ImmortalReference=t.AsyncReferenceCollection=t.ReferenceCollection=t.SafeDisposable=t.RefCountedDisposable=t.MandatoryMutableDisposable=t.MutableDisposable=t.Disposable=t.DisposableStore=t.DisposableTracker=void 0,t.setDisposableTracker=function(e){l=e},t.trackDisposable=h,t.markAsDisposed=u,t.markAsSingleton=function(e){return l?.markAsSingleton(e),e},t.isDisposable=f,t.dispose=p,t.disposeIfDisposable=function(e){for(const t of e)f(t)&&t.dispose();return[]},t.combinedDisposable=function(...e){const t=_((()=>p(e)));return function(e,t){if(l)for(const s of e)l.setParent(s,t)}(e,t),t},t.toDisposable=_,t.disposeOnReturn=function(e){const t=new v;try{e(t)}finally{t.dispose()}};const r=s(732),n=s(33),i=s(714),o=s(355),a=s(956);let l=null;class c{constructor(){this.livingDisposables=new Map}static{this.idx=0}getDisposableData(e){let t=this.livingDisposables.get(e);return t||(t={parent:null,source:null,isSingleton:!1,value:e,idx:c.idx++},this.livingDisposables.set(e,t)),t}trackDisposable(e){const t=this.getDisposableData(e);t.source||(t.source=(new Error).stack)}setParent(e,t){this.getDisposableData(e).parent=t}markAsDisposed(e){this.livingDisposables.delete(e)}markAsSingleton(e){this.getDisposableData(e).isSingleton=!0}getRootParent(e,t){const s=t.get(e);if(s)return s;const r=e.parent?this.getRootParent(this.getDisposableData(e.parent),t):e;return t.set(e,r),r}getTrackedDisposables(){const e=new Map;return[...this.livingDisposables.entries()].filter((([,t])=>null!==t.source&&!this.getRootParent(t,e).isSingleton)).flatMap((([e])=>e))}computeLeakingDisposables(e=10,t){let s;if(t)s=t;else{const e=new Map,t=[...this.livingDisposables.values()].filter((t=>null!==t.source&&!this.getRootParent(t,e).isSingleton));if(0===t.length)return;const r=new Set(t.map((e=>e.value)));if(s=t.filter((e=>!(e.parent&&r.has(e.parent)))),0===s.length)throw new Error(\"There are cyclic diposable chains!\")}if(!s)return;function o(e){const t=e.source.split(\"\\n\").map((e=>e.trim().replace(\"at \",\"\"))).filter((e=>\"\"!==e));return function(e,t){for(;e.length>0&&t.some((t=>\"string\"==typeof t?t===e[0]:e[0].match(t)));)e.shift()}(t,[\"Error\",/^trackDisposable \\(.*\\)$/,/^DisposableTracker.trackDisposable \\(.*\\)$/]),t.reverse()}const a=new i.SetMap;for(const e of s){const t=o(e);for(let s=0;s<=t.length;s++)a.add(t.slice(0,s).join(\"\\n\"),e)}s.sort((0,r.compareBy)((e=>e.idx),r.numberComparator));let l=\"\",c=0;for(const t of s.slice(0,e)){c++;const e=o(t),r=[];for(let t=0;t<e.length;t++){let i=e[t];i=`(shared with ${a.get(e.slice(0,t+1).join(\"\\n\")).size}/${s.length} leaks) at ${i}`;const l=a.get(e.slice(0,t).join(\"\\n\")),c=(0,n.groupBy)([...l].map((e=>o(e)[t])),(e=>e));delete c[e[t]];for(const[e,t]of Object.entries(c))r.unshift(` - stacktraces of ${t.length} other leaks continue with ${e}`);r.unshift(i)}l+=`\\n\\n\\n==================== Leaking disposable ${c}/${s.length}: ${t.value.constructor.name} ====================\\n${r.join(\"\\n\")}\\n============================================================\\n\\n`}return s.length>e&&(l+=`\\n\\n\\n... and ${s.length-e} more leaking disposables\\n\\n`),{leaks:s,details:l}}}function h(e){return l?.trackDisposable(e),e}function u(e){l?.markAsDisposed(e)}function d(e,t){l?.setParent(e,t)}function f(e){return\"object\"==typeof e&&null!==e&&\"function\"==typeof e.dispose&&0===e.dispose.length}function p(e){if(a.Iterable.is(e)){const t=[];for(const s of e)if(s)try{s.dispose()}catch(e){t.push(e)}if(1===t.length)throw t[0];if(t.length>1)throw new AggregateError(t,\"Encountered errors while disposing of store\");return Array.isArray(e)?[]:e}if(e)return e.dispose(),e}function _(e){const t=h({dispose:(0,o.createSingleCallFunction)((()=>{u(t),e()}))});return t}t.DisposableTracker=c;class v{static{this.DISABLE_DISPOSED_WARNING=!1}constructor(){this._toDispose=new Set,this._isDisposed=!1,h(this)}dispose(){this._isDisposed||(u(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(0!==this._toDispose.size)try{p(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error(\"Cannot register a disposable on itself!\");return d(e,this),this._isDisposed?v.DISABLE_DISPOSED_WARNING||console.warn(new Error(\"Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!\").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error(\"Cannot dispose a disposable on itself!\");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),d(e,null))}}t.DisposableStore=v;class m{static{this.None=Object.freeze({dispose(){}})}constructor(){this._store=new v,h(this),d(this._store,this)}dispose(){u(this),this._store.dispose()}_register(e){if(e===this)throw new Error(\"Cannot register a disposable on itself!\");return this._store.add(e)}}t.Disposable=m;class g{constructor(){this._isDisposed=!1,h(this)}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),e&&d(e,this),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,u(this),this._value?.dispose(),this._value=void 0}clearAndLeak(){const e=this._value;return this._value=void 0,e&&d(e,null),e}}t.MutableDisposable=g,t.MandatoryMutableDisposable=class{constructor(e){this._disposable=new g,this._isDisposed=!1,this._disposable.value=e}get value(){return this._disposable.value}set value(e){this._isDisposed||e===this._disposable.value||(this._disposable.value=e)}dispose(){this._isDisposed=!0,this._disposable.dispose()}},t.RefCountedDisposable=class{constructor(e){this._disposable=e,this._counter=1}acquire(){return this._counter++,this}release(){return 0==--this._counter&&this._disposable.dispose(),this}},t.SafeDisposable=class{constructor(){this.dispose=()=>{},this.unset=()=>{},this.isset=()=>!1,h(this)}set(e){let t=e;return this.unset=()=>t=void 0,this.isset=()=>void 0!==t,this.dispose=()=>{t&&(t(),t=void 0,u(this))},this}},t.ReferenceCollection=class{constructor(){this.references=new Map}acquire(e,...t){let s=this.references.get(e);s||(s={counter:0,object:this.createReferencedObject(e,...t)},this.references.set(e,s));const{object:r}=s,n=(0,o.createSingleCallFunction)((()=>{0==--s.counter&&(this.destroyReferencedObject(e,s.object),this.references.delete(e))}));return s.counter++,{object:r,dispose:n}}},t.AsyncReferenceCollection=class{constructor(e){this.referenceCollection=e}async acquire(e,...t){const s=this.referenceCollection.acquire(e,...t);try{return{object:await s.object,dispose:()=>s.dispose()}}catch(e){throw s.dispose(),e}}},t.ImmortalReference=class{constructor(e){this.object=e}dispose(){}};class y{constructor(){this._store=new Map,this._isDisposed=!1,h(this)}dispose(){u(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{p(this._store.values())}finally{this._store.clear()}}has(e){return this._store.has(e)}get size(){return this._store.size}get(e){return this._store.get(e)}set(e,t,s=!1){this._isDisposed&&console.warn(new Error(\"Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!\").stack),s||this._store.get(e)?.dispose(),this._store.set(e,t)}deleteAndDispose(e){this._store.get(e)?.dispose(),this._store.delete(e)}deleteAndLeak(e){const t=this._store.get(e);return this._store.delete(e),t}keys(){return this._store.keys()}values(){return this._store.values()}[Symbol.iterator](){return this._store[Symbol.iterator]()}}t.DisposableMap=y},711:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.LinkedList=void 0;class s{static{this.Undefined=new s(void 0)}constructor(e){this.element=e,this.next=s.Undefined,this.prev=s.Undefined}}class r{constructor(){this._first=s.Undefined,this._last=s.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===s.Undefined}clear(){let e=this._first;for(;e!==s.Undefined;){const t=e.next;e.prev=s.Undefined,e.next=s.Undefined,e=t}this._first=s.Undefined,this._last=s.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const r=new s(e);if(this._first===s.Undefined)this._first=r,this._last=r;else if(t){const e=this._last;this._last=r,r.prev=e,e.next=r}else{const e=this._first;this._first=r,r.next=e,e.prev=r}this._size+=1;let n=!1;return()=>{n||(n=!0,this._remove(r))}}shift(){if(this._first!==s.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==s.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==s.Undefined&&e.next!==s.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===s.Undefined&&e.next===s.Undefined?(this._first=s.Undefined,this._last=s.Undefined):e.next===s.Undefined?(this._last=this._last.prev,this._last.next=s.Undefined):e.prev===s.Undefined&&(this._first=this._first.next,this._first.prev=s.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==s.Undefined;)yield e.element,e=e.next}}t.LinkedList=r},714:(e,t)=>{var s;Object.defineProperty(t,\"__esModule\",{value:!0}),t.SetMap=t.BidirectionalMap=t.CounterSet=t.Touch=void 0,t.getOrSet=function(e,t,s){let r=e.get(t);return void 0===r&&(r=s,e.set(t,r)),r},t.mapToString=function(e){const t=[];return e.forEach(((e,s)=>{t.push(`${s} => ${e}`)})),`Map(${e.size}) {${t.join(\", \")}}`},t.setToString=function(e){const t=[];return e.forEach((e=>{t.push(e)})),`Set(${e.size}) {${t.join(\", \")}}`},t.mapsStrictEqualIgnoreOrder=function(e,t){if(e===t)return!0;if(e.size!==t.size)return!1;for(const[s,r]of e)if(!t.has(s)||t.get(s)!==r)return!1;for(const[s]of t)if(!e.has(s))return!1;return!0},function(e){e[e.None=0]=\"None\",e[e.AsOld=1]=\"AsOld\",e[e.AsNew=2]=\"AsNew\"}(s||(t.Touch=s={})),t.CounterSet=class{constructor(){this.map=new Map}add(e){return this.map.set(e,(this.map.get(e)||0)+1),this}delete(e){let t=this.map.get(e)||0;return 0!==t&&(t--,0===t?this.map.delete(e):this.map.set(e,t),!0)}has(e){return this.map.has(e)}},t.BidirectionalMap=class{constructor(e){if(this._m1=new Map,this._m2=new Map,e)for(const[t,s]of e)this.set(t,s)}clear(){this._m1.clear(),this._m2.clear()}set(e,t){this._m1.set(e,t),this._m2.set(t,e)}get(e){return this._m1.get(e)}getKey(e){return this._m2.get(e)}delete(e){const t=this._m1.get(e);return void 0!==t&&(this._m1.delete(e),this._m2.delete(t),!0)}forEach(e,t){this._m1.forEach(((s,r)=>{e.call(t,s,r,this)}))}keys(){return this._m1.keys()}values(){return this._m1.values()}},t.SetMap=class{constructor(){this.map=new Map}add(e,t){let s=this.map.get(e);s||(s=new Set,this.map.set(e,s)),s.add(t)}delete(e,t){const s=this.map.get(e);s&&(s.delete(t),0===s.size&&this.map.delete(e))}forEach(e,t){const s=this.map.get(e);s&&s.forEach(t)}get(e){return this.map.get(e)||new Set}}},79:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.StopWatch=void 0;const s=globalThis.performance&&\"function\"==typeof globalThis.performance.now;class r{static create(e){return new r(e)}constructor(e){this._now=s&&!1===e?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return-1!==this._stopTime?this._stopTime-this._startTime:this._now()-this._startTime}}t.StopWatch=r}},t={};function s(r){var n=t[r];if(void 0!==n)return n.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,s),i.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,\"__esModule\",{value:!0}),e.Unicode11Addon=void 0;const t=s(384);e.Unicode11Addon=class{activate(e){e.unicode.register(new t.UnicodeV11)}dispose(){}}})(),r})()));\n//# sourceMappingURL=addon-unicode11.js.map","/**\n * xterm.js backend for termless.\n *\n * Wraps @xterm/headless to implement the TerminalBackend interface,\n * providing in-process terminal emulation with no browser dependency.\n */\n\n// @xterm/headless is CJS — use default import for Node.js ESM compat\nimport xterm from \"@xterm/headless\"\nconst { Terminal } = xterm\ntype XTerminal = InstanceType<typeof Terminal>\n\n// Unicode V11 addon: treats most emoji + many extended-grapheme codepoints as\n// wide (2-cell). Without it, xterm.js defaults to Unicode V6 wcwidth, where\n// many emoji are narrow (1-cell). Real modern terminals (Ghostty, iTerm 3.5+,\n// Alacritty 0.13+) use V11+ — and they emit byte streams assuming the parser\n// agrees. The mismatch produces visible duplication: when a TUI re-renders a\n// row containing an emoji, each render advances the cursor by 2 cells (V11)\n// but xterm.js advances by 1 (V6), so subsequent writes land at different\n// columns and the cumulative buffer state shows the emoji repeated in\n// adjacent cells. Loading + activating V11 fixes this.\nimport { Unicode11Addon } from \"@xterm/addon-unicode11\"\nimport type {\n TerminalBackend,\n TerminalOptions,\n Cell,\n CursorState,\n TerminalMode,\n ScrollbackState,\n TerminalCapabilities,\n RGB,\n} from \"../../../src/terminal/types.ts\"\nimport { encodeKeyToAnsi } from \"../../../src/terminal/key-encoding.ts\"\n\n// ═══════════════════════════════════════════════════════\n// ANSI 256-color palette\n// ═══════════════════════════════════════════════════════\n\n/** Standard 16-color ANSI palette */\nconst ANSI_16: readonly RGB[] = [\n { r: 0x00, g: 0x00, b: 0x00 }, // 0 Black\n { r: 0x80, g: 0x00, b: 0x00 }, // 1 Red\n { r: 0x00, g: 0x80, b: 0x00 }, // 2 Green\n { r: 0x80, g: 0x80, b: 0x00 }, // 3 Yellow\n { r: 0x00, g: 0x00, b: 0x80 }, // 4 Blue\n { r: 0x80, g: 0x00, b: 0x80 }, // 5 Magenta\n { r: 0x00, g: 0x80, b: 0x80 }, // 6 Cyan\n { r: 0xc0, g: 0xc0, b: 0xc0 }, // 7 White\n { r: 0x80, g: 0x80, b: 0x80 }, // 8 Bright Black\n { r: 0xff, g: 0x00, b: 0x00 }, // 9 Bright Red\n { r: 0x00, g: 0xff, b: 0x00 }, // 10 Bright Green\n { r: 0xff, g: 0xff, b: 0x00 }, // 11 Bright Yellow\n { r: 0x00, g: 0x00, b: 0xff }, // 12 Bright Blue\n { r: 0xff, g: 0x00, b: 0xff }, // 13 Bright Magenta\n { r: 0x00, g: 0xff, b: 0xff }, // 14 Bright Cyan\n { r: 0xff, g: 0xff, b: 0xff }, // 15 Bright White\n]\n\n/** Build the full 256-color palette (16 base + 216 cube + 24 grayscale) */\nfunction buildPalette256(): RGB[] {\n const palette: RGB[] = [...ANSI_16]\n\n // 6x6x6 color cube (indices 16-231)\n const levels = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n palette.push({ r: levels[r]!, g: levels[g]!, b: levels[b]! })\n }\n }\n }\n\n // Grayscale ramp (indices 232-255)\n for (let i = 0; i < 24; i++) {\n const v = 8 + i * 10\n palette.push({ r: v, g: v, b: v })\n }\n\n return palette\n}\n\nconst PALETTE_256 = buildPalette256()\n\n/** Convert a palette index (0-255) to RGB */\nfunction paletteToRgb(index: number): RGB {\n return PALETTE_256[index] ?? { r: 0, g: 0, b: 0 }\n}\n\n/** Extract RGB from a 24-bit color value (0xRRGGBB) */\nfunction truecolorToRgb(value: number): RGB {\n return {\n r: (value >> 16) & 0xff,\n g: (value >> 8) & 0xff,\n b: value & 0xff,\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Backend factory\n// ═══════════════════════════════════════════════════════\n\nconst DEFAULT_COLS = 80\nconst DEFAULT_ROWS = 24\n\n/**\n * Create an xterm.js backend for termless.\n *\n * Uses @xterm/headless for in-process terminal emulation — no browser needed.\n * The terminal is initialized lazily via init(), or eagerly if opts are provided.\n */\nexport function createXtermBackend(opts?: Partial<TerminalOptions>): TerminalBackend {\n let term: XTerminal | null = null\n let title = \"\"\n let decoder = new TextDecoder()\n\n /** Access the internal write buffer for synchronous writes */\n function writeSync(t: XTerminal, data: string): void {\n ;(t as any)._core._writeBuffer.writeSync(data)\n }\n\n function ensureTerm(): XTerminal {\n if (!term) throw new Error(\"xterm backend not initialized — call init() first\")\n return term\n }\n\n function init(options: TerminalOptions): void {\n if (term) term.dispose()\n decoder = new TextDecoder()\n\n term = new Terminal({\n cols: options.cols,\n rows: options.rows,\n scrollback: options.scrollbackLimit ?? 1000,\n allowProposedApi: true,\n // Answer CSI 18t (text-area size in cells) — xterm.js has a default\n // implementation that returns the configured rows/cols. We add 14t\n // (text-area pixel size) via our feed() intercept below since\n // xterm.js headless has no real window pixel size to report.\n windowOptions: {\n getWinSizeChars: true,\n getCellSizePixels: true,\n },\n })\n\n // Activate Unicode V11 wcwidth so wide emoji (📋📄💡⚠️📁 etc) advance the\n // cursor by 2 cells, matching real modern terminals. Default is V6 which\n // classifies many emoji as narrow — see import comment above for the\n // failure mode that motivated this.\n term.loadAddon(new Unicode11Addon())\n term.unicode.activeVersion = \"11\"\n\n title = \"\"\n term.onTitleChange((t: string) => {\n title = t\n })\n\n // Forward DA1/DA2/DSR + window-op responses to the terminal layer\n term.onData((data: string) => {\n if (backend.onResponse) {\n backend.onResponse(new TextEncoder().encode(data))\n }\n })\n }\n\n // Eagerly init if opts provided\n if (opts) {\n init({\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n scrollbackLimit: opts.scrollbackLimit,\n })\n }\n\n function destroy(): void {\n if (term) {\n term.dispose()\n term = null\n }\n }\n\n /**\n * Standard cell metrics used for the synthetic 14t (text-area pixel\n * size) response. xterm.js headless has no real window, so it can't\n * report pixel dimensions on its own. Real terminals (xterm.js in\n * VSCode, Ghostty, etc.) answer CSI 14t with the actual rendered\n * text-area pixel size — silvery's `resolveMouseOption()` divides\n * pixel dims by cell dims to obtain cell size for SGR-Pixels (1016)\n * mouse coordinate translation.\n *\n * 8 × 17 is the typical Iosevka/JetBrains Mono cell at 12pt on a 96 DPI\n * display. The exact value isn't load-bearing — what matters is the\n * ratio matches the backend's cell grid, which is invariant for a\n * headless emulator (one cell = one cell).\n */\n const CELL_W_PX = 8\n const CELL_H_PX = 17\n\n /** Intercept CSI 14t (text-area pixel size query). xterm.js's\n * windowOptions.getWinSizePixels has a default implementation that\n * returns 0;0 in headless contexts (no real window), which silvery\n * rejects via its isSanePositive guard. Synthesize a sensible\n * response from the configured rows/cols × standard cell metrics. */\n const CSI_14t_RE = /\\x1b\\[14t/g\n\n function feed(data: Uint8Array): void {\n const t = ensureTerm()\n const text = decoder.decode(data, { stream: true })\n\n // Synthesize 14t responses out-of-band BEFORE writing the bytes to\n // xterm.js (which would drop them as unhandled when the default\n // implementation reports 0;0).\n if (backend.onResponse && CSI_14t_RE.test(text)) {\n // Reset lastIndex — regex is /g, so a prior test() may leave state\n CSI_14t_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = CSI_14t_RE.exec(text)) !== null) {\n const heightPx = t.rows * CELL_H_PX\n const widthPx = t.cols * CELL_W_PX\n backend.onResponse(new TextEncoder().encode(`\\x1b[4;${heightPx};${widthPx}t`))\n }\n }\n\n // xterm.js write() is async — use internal writeSync for immediate buffer updates\n writeSync(t, text)\n }\n\n function resize(cols: number, rows: number): void {\n ensureTerm().resize(cols, rows)\n }\n\n function reset(): void {\n const t = ensureTerm()\n decoder = new TextDecoder()\n // RIS (Reset to Initial State) escape sequence\n writeSync(t, \"\\x1bc\")\n title = \"\"\n }\n\n function getText(): string {\n const t = ensureTerm()\n const buf = t.buffer.active\n const lines: string[] = []\n for (let i = 0; i < buf.length; i++) {\n const line = buf.getLine(i)\n if (line) lines.push(line.translateToString(true))\n }\n return lines.join(\"\\n\")\n }\n\n function getTextRange(startRow: number, startCol: number, endRow: number, endCol: number): string {\n const t = ensureTerm()\n const buf = t.buffer.active\n const parts: string[] = []\n\n for (let row = startRow; row <= endRow; row++) {\n const line = buf.getLine(row)\n if (!line) continue\n\n const colStart = row === startRow ? startCol : 0\n const colEnd = row === endRow ? endCol : line.length\n\n parts.push(line.translateToString(true, colStart, colEnd))\n }\n\n return parts.join(\"\\n\")\n }\n\n // Map xterm.js internal underlineStyle enum to our string values\n const UNDERLINE_STYLES: Record<number, Cell[\"underline\"]> = {\n 1: \"single\",\n 2: \"double\",\n 3: \"curly\",\n 4: \"dotted\",\n 5: \"dashed\",\n }\n\n /**\n * Read extended attributes from xterm.js internal line data.\n * The public IBufferCell API only exposes isUnderline (boolean),\n * but the internal _extendedAttrs stores the actual underline style and color.\n */\n function getExtendedAttrs(row: number, col: number): { underlineStyle?: number; underlineColor?: RGB | null } {\n const t = ensureTerm()\n try {\n const internalLine = (t as any)._core.buffer.lines.get(row + t.buffer.active.baseY)\n if (!internalLine?._extendedAttrs) return {}\n const ext = internalLine._extendedAttrs[col]\n if (!ext) return {}\n\n const style = ext.underlineStyle as number | undefined\n let color: RGB | null = null\n // Use the underlineColor getter which returns the raw 0xRRGGBB value\n const rawColor = ext.underlineColor as number | undefined\n if (rawColor && rawColor !== 0) {\n color = {\n r: (rawColor >> 16) & 0xff,\n g: (rawColor >> 8) & 0xff,\n b: rawColor & 0xff,\n }\n }\n return { underlineStyle: style, underlineColor: color ?? undefined }\n } catch {\n return {}\n }\n }\n\n // Note: cursor visibility (DECTCEM) and reverse video (DECSCNM) are handled\n // by the renderer in xterm.js and are not stored in headless mode.\n // These remain as genuine headless limitations.\n\n function convertCell(bufCell: import(\"@xterm/headless\").IBufferCell | undefined, row?: number, col?: number): Cell {\n if (!bufCell) {\n return {\n char: \"\",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n underlineColor: null,\n strikethrough: false,\n inverse: false,\n blink: false,\n hidden: false,\n wide: false,\n continuation: false,\n hyperlink: null,\n }\n }\n\n // Foreground color\n let fg: RGB | null = null\n if (bufCell.isFgRGB()) {\n fg = truecolorToRgb(bufCell.getFgColor())\n } else if (bufCell.isFgPalette()) {\n fg = paletteToRgb(bufCell.getFgColor())\n }\n\n // Background color\n let bg: RGB | null = null\n if (bufCell.isBgRGB()) {\n bg = truecolorToRgb(bufCell.getBgColor())\n } else if (bufCell.isBgPalette()) {\n bg = paletteToRgb(bufCell.getBgColor())\n }\n\n // Read extended attributes for accurate underline style\n let underline: Cell[\"underline\"] = false\n let underlineColor: RGB | null = null\n if (bufCell.isUnderline() !== 0 && row !== undefined && col !== undefined) {\n const ext = getExtendedAttrs(row, col)\n underline = (ext.underlineStyle ? UNDERLINE_STYLES[ext.underlineStyle] : \"single\") ?? \"single\"\n underlineColor = ext.underlineColor ?? null\n } else if (bufCell.isUnderline() !== 0) {\n underline = \"single\"\n }\n\n return {\n char: bufCell.getChars(),\n fg,\n bg,\n bold: bufCell.isBold() !== 0,\n dim: bufCell.isDim() !== 0,\n italic: bufCell.isItalic() !== 0,\n underline,\n underlineColor,\n strikethrough: bufCell.isStrikethrough() !== 0,\n inverse: bufCell.isInverse() !== 0,\n blink: bufCell.isBlink() !== 0,\n hidden: bufCell.isInvisible() !== 0,\n wide: bufCell.getWidth() > 1,\n continuation: false,\n hyperlink: null,\n }\n }\n\n function getCell(row: number, col: number): Cell {\n const t = ensureTerm()\n const line = t.buffer.active.getLine(row)\n if (!line) {\n return {\n char: \"\",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n underlineColor: null,\n strikethrough: false,\n inverse: false,\n blink: false,\n hidden: false,\n wide: false,\n continuation: false,\n hyperlink: null,\n }\n }\n return convertCell(line.getCell(col), row, col)\n }\n\n function getLine(row: number): Cell[] {\n const t = ensureTerm()\n const cols = t.cols\n const cells: Cell[] = []\n const line = t.buffer.active.getLine(row)\n for (let col = 0; col < cols; col++) {\n cells.push(line ? convertCell(line.getCell(col), row, col) : getCell(row, col))\n }\n return cells\n }\n\n function getLines(): Cell[][] {\n const t = ensureTerm()\n const rows = t.rows\n const result: Cell[][] = []\n for (let row = 0; row < rows; row++) {\n result.push(getLine(row))\n }\n return result\n }\n\n function getCursor(): CursorState {\n const t = ensureTerm()\n return {\n x: t.buffer.active.cursorX,\n y: t.buffer.active.cursorY,\n visible: true, // DECTCEM not available in headless mode\n style: \"block\", // default — headless doesn't expose cursor style\n }\n }\n\n function getMode(mode: TerminalMode): boolean {\n const t = ensureTerm()\n\n switch (mode) {\n case \"altScreen\":\n return t.buffer.active.type === \"alternate\"\n case \"cursorVisible\":\n return true // not easily trackable in headless\n case \"bracketedPaste\":\n return t.modes.bracketedPasteMode\n case \"applicationCursor\":\n return t.modes.applicationCursorKeysMode\n case \"applicationKeypad\":\n return t.modes.applicationKeypadMode\n case \"autoWrap\":\n return t.modes.wraparoundMode\n case \"mouseTracking\":\n return t.modes.mouseTrackingMode !== \"none\"\n case \"focusTracking\":\n return t.modes.sendFocusMode\n case \"originMode\":\n return t.modes.originMode\n case \"insertMode\":\n return t.modes.insertMode\n case \"reverseVideo\":\n return false // not exposed by xterm.js headless\n }\n }\n\n function getTitle(): string {\n return title\n }\n\n function getScrollback(): ScrollbackState {\n const t = ensureTerm()\n const buf = t.buffer.active\n return {\n viewportOffset: buf.viewportY,\n totalLines: buf.length,\n screenLines: t.rows,\n }\n }\n\n function scrollViewport(delta: number): void {\n ensureTerm().scrollLines(delta)\n }\n\n const capabilities: TerminalCapabilities = {\n name: \"xterm\",\n version: \"5.5.0\",\n truecolor: true,\n kittyKeyboard: false,\n kittyGraphics: false,\n sixel: false,\n osc8Hyperlinks: true,\n semanticPrompts: false,\n unicode: \"15.1\",\n reflow: true,\n extensions: new Set(),\n }\n\n const backend: TerminalBackend = {\n name: \"xterm\",\n init,\n destroy,\n feed,\n resize,\n reset,\n getText,\n getTextRange,\n getCell,\n getLine,\n getLines,\n getCursor,\n getMode,\n getTitle,\n getScrollback,\n scrollViewport,\n encodeKey: encodeKeyToAnsi,\n capabilities,\n }\n\n return backend\n}\n","/**\n * XtermAdapter — `@silvery/ag` ForeignSource implementation that wraps\n * `@xterm/headless` for embedding a PTY mirror inside a silvery `<Viewport>`.\n *\n * Termless rec-live-overlay paints chrome (recording badge, hotkey hints) via\n * silvery and mounts the PTY content inside a `<Viewport source={XtermAdapter}>`,\n * structurally bypassing silvery's bg-coherence invariant for the foreign cells.\n *\n * Lifecycle: silvery calls `connect(ctx)` on mount and `disconnect()` on unmount.\n * Between those, the adapter feeds ANSI bytes from the PTY child into its\n * private xterm.js Terminal, then mirrors the post-write buffer into the\n * Viewport via `ctx.blit()`. Cursor moves and title changes are forwarded\n * verbatim.\n *\n * On `connect()` the adapter calls `ctx.requestInputMode(opts.captureInput)`\n * (default `\"none\"`) so the parent host knows whether to route key/mouse\n * events into the Viewport. xterm's `onData` event (the encoded byte stream\n * the embedded Terminal would send back to a PTY) is forwarded to\n * `opts.child.stdin` for the `\"keys\"`/`\"all\"` modes; the host's own\n * key-event-into-Viewport wiring (the inverse direction) will land via the\n * Phase A reconciler work tracked in `@km/silvery/15513`.\n *\n * Design rationale: bead `@km/silvery/15513-surface-nested-composition-primitive`.\n */\n\nimport xtermPkg from \"@xterm/headless\"\nimport { Unicode11Addon } from \"@xterm/addon-unicode11\"\n\nimport type {\n Cell,\n CellAttrs,\n CellBuffer,\n ForeignSource,\n IslandContext,\n IslandGuest,\n IslandHandle,\n IslandInputEvent,\n IslandKeyEvent,\n IslandMouseEvent,\n IslandProtocolModes,\n ViewportContext,\n ViewportInputMode,\n ViewportRect,\n} from \"./silvery-compat.ts\"\n\ntype IBufferCell = import(\"@xterm/headless\").IBufferCell\n\nconst { Terminal } = xtermPkg\n\ntype XTerminal = InstanceType<typeof Terminal>\ntype XtermDataChunk = Buffer | Uint8Array | string\n\n/** Minimal PTY-child shape — duck-typed so the adapter doesn't depend on a specific spawn library. */\nexport interface XtermGuestChild {\n stdout?: {\n on(event: \"data\", listener: (chunk: XtermDataChunk) => void): unknown\n off?(event: \"data\", listener: (chunk: XtermDataChunk) => void): unknown\n }\n stdin?: {\n write(chunk: Uint8Array | string): unknown\n }\n write?(chunk: string): unknown\n resize?(cols: number, rows: number): unknown\n kill?(signal?: string | number): unknown\n close?(): unknown\n exited?: Promise<number | { code?: number; reason?: string }>\n}\n\n/** Legacy Viewport adapter child shape. */\nexport interface XtermAdapterChild extends XtermGuestChild {\n stdout: NonNullable<XtermGuestChild[\"stdout\"]>\n}\n\n/** Options accepted by {@link xtermGuest}. */\nexport interface XtermGuestOptions {\n cols: number\n rows: number\n child?: XtermGuestChild\n /** Scrollback rows kept by the embedded Terminal. Default: 0 (overlay-style use). */\n scrollback?: number\n /** Protocol modes the PTY guest asks the host to enable while focused. */\n modes?: IslandProtocolModes\n}\n\nexport interface XtermGuestHandle extends IslandHandle {\n /** Feed raw ANSI bytes directly into the embedded xterm Terminal mirror. */\n feedAnsi(chunk: Uint8Array | string): void\n}\n\ninterface XtermIslandHandleOptions extends XtermGuestOptions {\n onTitle?: (title: string) => void\n shouldForwardTerminalData?: () => boolean\n}\n\n/** Options accepted by {@link XtermAdapter}. */\nexport interface XtermAdapterOptions {\n cols: number\n rows: number\n /**\n * Optional PTY child. When supplied, the adapter pipes `child.stdout` into\n * the embedded xterm Terminal and forwards xterm's `onData` events to\n * `child.stdin` whenever `captureInput` is `\"keys\"` or `\"all\"`.\n */\n child?: XtermAdapterChild\n /**\n * Input mode the source declares to the parent on `connect()`. Default:\n * `\"none\"` (the source observes — replay frames, snapshots). Pass\n * `\"all\"` for an interactive PTY mirror.\n */\n captureInput?: ViewportInputMode\n /** Scrollback rows kept by the embedded Terminal. Default: 0 (overlay-style use). */\n scrollback?: number\n}\n\n/**\n * A {@link ForeignSource} extended with adapter-specific introspection.\n *\n * Apps that mirror a PTY child wire it via `opts.child`; tests and headless\n * fixtures push bytes through `feedAnsi()` instead.\n */\nexport interface XtermAdapterHandle extends ForeignSource {\n /** Feed raw ANSI bytes directly into the embedded xterm Terminal. */\n feedAnsi(chunk: Uint8Array | string): void\n /** Input mode requested at construction time (or via {@link setInputMode}). */\n readonly inputMode: ViewportInputMode\n /** Update the input mode; re-calls `ctx.requestInputMode()` if currently connected. */\n setInputMode(mode: ViewportInputMode): void\n}\n\n/** Hex string for a 0xRRGGBB integer (matches silvery's `string | null` Cell color shape). */\nfunction rgbHex(value: number): string {\n return \"#\" + value.toString(16).padStart(6, \"0\")\n}\n\nconst ANSI_16_HEX: readonly string[] = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n]\n\nfunction buildPalette256(): string[] {\n const palette: string[] = [...ANSI_16_HEX]\n const levels = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n const v = (levels[r]! << 16) | (levels[g]! << 8) | levels[b]!\n palette.push(rgbHex(v))\n }\n }\n }\n for (let i = 0; i < 24; i++) {\n const v = 8 + i * 10\n palette.push(rgbHex((v << 16) | (v << 8) | v))\n }\n return palette\n}\n\nconst PALETTE_256: readonly string[] = buildPalette256()\n\nconst BLANK_CELL: Cell = { char: \" \", fg: null, bg: null, attrs: {}, wide: false, continuation: false }\n\n/** Convert an xterm IBufferCell into a silvery Cell. */\nfunction convertCell(c: IBufferCell | undefined): Cell {\n if (!c) return BLANK_CELL\n\n const width = c.getWidth()\n // xterm continuation cells (width 0) carry the chars of the wide cell to\n // their left; silvery represents them as a slot with `continuation: true`.\n const continuation = width === 0\n const wide = width === 2\n\n let fg: string | null = null\n if (c.isFgRGB()) fg = rgbHex(c.getFgColor())\n else if (c.isFgPalette()) fg = PALETTE_256[c.getFgColor()] ?? null\n\n let bg: string | null = null\n if (c.isBgRGB()) bg = rgbHex(c.getBgColor())\n else if (c.isBgPalette()) bg = PALETTE_256[c.getBgColor()] ?? null\n\n const attrs: CellAttrs = {}\n if (c.isBold()) attrs.bold = true\n if (c.isDim()) attrs.dim = true\n if (c.isItalic()) attrs.italic = true\n if (c.isUnderline()) attrs.underline = true\n if (c.isStrikethrough()) attrs.strikethrough = true\n if (c.isInverse()) attrs.inverse = true\n // Note: blink + hidden are tracked in xterm but not in @silvery/ag's\n // CellAttrs (silvery treats them as out of scope for the v1 cell vocab).\n // Drop them at the boundary rather than smuggle private fields through.\n\n const chars = c.getChars()\n return {\n char: continuation ? \"\" : chars === \"\" ? \" \" : chars,\n fg,\n bg,\n attrs,\n wide,\n continuation,\n }\n}\n\n/**\n * Read the current xterm viewport into an immutable {@link CellBuffer}.\n *\n * The snapshot is taken once per blit so the silvery pipeline can read cells\n * during render without racing the xterm parser.\n */\nfunction snapshotBuffer(term: XTerminal): CellBuffer {\n const cols = term.cols\n const rows = term.rows\n const cells: Cell[] = new Array(cols * rows)\n const buf = term.buffer.active\n const baseY = buf.baseY\n for (let row = 0; row < rows; row++) {\n const line = buf.getLine(row + baseY)\n for (let col = 0; col < cols; col++) {\n cells[row * cols + col] = convertCell(line?.getCell(col))\n }\n }\n return {\n cols,\n rows,\n getCell(col: number, row: number): Cell {\n if (col < 0 || col >= cols || row < 0 || row >= rows) return BLANK_CELL\n return cells[row * cols + col]!\n },\n }\n}\n\n// xterm.js `write()` is async — the parser drains on the next microtask.\n// The internal `_writeBuffer.writeSync(...)` path parses immediately, which\n// is required so snapshots reflect the bytes just fed. Same trick the\n// termless backend uses for tests.\nfunction writeSync(t: XTerminal, data: string): void {\n ;(t as unknown as { _core: { _writeBuffer: { writeSync(d: string): void } } })._core._writeBuffer.writeSync(data)\n}\n\nfunction createXtermTerminal(opts: { cols: number; rows: number; scrollback?: number }): XTerminal {\n const term = new Terminal({\n cols: opts.cols,\n rows: opts.rows,\n scrollback: opts.scrollback ?? 0,\n allowProposedApi: true,\n })\n term.loadAddon(new Unicode11Addon())\n term.unicode.activeVersion = \"11\"\n return term\n}\n\nfunction defaultXtermGuestModes(): IslandProtocolModes {\n return {\n bracketedPaste: true,\n kittyKeyboard: true,\n mouseTracking: \"any\",\n focusReporting: true,\n }\n}\n\nfunction createAsyncEventStream(\n add: (listener: (event: IslandInputEvent) => void) => () => void,\n): AsyncIterable<IslandInputEvent> {\n return {\n [Symbol.asyncIterator]() {\n const queue: IslandInputEvent[] = []\n let pending: ((result: IteratorResult<IslandInputEvent>) => void) | null = null\n let done = false\n const unsubscribe = add((event) => {\n if (done) return\n if (pending) {\n const resolve = pending\n pending = null\n resolve({ value: event, done: false })\n } else {\n queue.push(event)\n }\n })\n\n return {\n next(): Promise<IteratorResult<IslandInputEvent>> {\n if (queue.length > 0) return Promise.resolve({ value: queue.shift()!, done: false })\n if (done) return Promise.resolve({ value: undefined, done: true })\n return new Promise((resolve) => {\n pending = resolve\n })\n },\n return(): Promise<IteratorResult<IslandInputEvent>> {\n done = true\n unsubscribe()\n if (pending) {\n const resolve = pending\n pending = null\n resolve({ value: undefined, done: true })\n }\n return Promise.resolve({ value: undefined, done: true })\n },\n }\n },\n }\n}\n\nfunction normalizeExit(result: number | { code?: number; reason?: string }): { code?: number; reason?: string } {\n return typeof result === \"number\" ? { code: result } : result\n}\n\nfunction createXtermIslandHandle(opts: XtermIslandHandleOptions): XtermGuestHandle {\n let term: XTerminal | null = createXtermTerminal(opts)\n let cols = opts.cols\n let rows = opts.rows\n let buffer: CellBuffer = snapshotBuffer(term)\n let disposed = false\n let outputScheduled = false\n const decoder = new TextDecoder()\n const sizeListeners = new Set<(size: { cols: number; rows: number }) => void>()\n const outputListeners = new Set<() => void>()\n const modeListeners = new Set<(modes: IslandProtocolModes) => void>()\n const keyListeners = new Set<(event: IslandKeyEvent) => void>()\n const mouseListeners = new Set<(event: IslandMouseEvent) => void>()\n const pasteListeners = new Set<(text: string) => void>()\n const inputEventListeners = new Set<(event: IslandInputEvent) => void>()\n const modes = opts.modes ?? defaultXtermGuestModes()\n const disposables: { dispose(): void }[] = []\n let resolveExit: ((exit: { code?: number; reason?: string }) => void) | null = null\n const exit = opts.child?.exited\n ? opts.child.exited.then(normalizeExit)\n : new Promise<{ code?: number; reason?: string }>((resolve) => {\n resolveExit = resolve\n })\n\n function notifySize(): void {\n const size = { cols, rows }\n for (const listener of sizeListeners) listener(size)\n }\n\n function notifyOutput(): void {\n for (const listener of outputListeners) listener()\n }\n\n function scheduleOutput(): void {\n if (outputScheduled || !term) return\n outputScheduled = true\n queueMicrotask(() => {\n outputScheduled = false\n if (!term || disposed) return\n buffer = snapshotBuffer(term)\n notifyOutput()\n })\n }\n\n function feedAnsi(chunk: Uint8Array | string): void {\n if (!term || disposed) return\n const data = typeof chunk === \"string\" ? chunk : decoder.decode(chunk)\n writeSync(term, data)\n scheduleOutput()\n }\n\n const onStdoutData = (chunk: XtermDataChunk): void => {\n feedAnsi(typeof chunk === \"string\" ? chunk : chunk instanceof Buffer ? chunk : new Uint8Array(chunk))\n }\n opts.child?.stdout?.on(\"data\", onStdoutData)\n if (opts.onTitle) {\n disposables.push(term.onTitleChange(opts.onTitle))\n }\n\n function writeToChild(data: string): void {\n if (opts.child?.write) {\n opts.child.write(data)\n } else {\n opts.child?.stdin?.write(data)\n }\n }\n\n if (opts.child && (opts.child.write || opts.child.stdin)) {\n disposables.push(\n term.onData((data: string) => {\n if (opts.shouldForwardTerminalData?.() ?? true) writeToChild(data)\n }),\n )\n }\n\n function signalChild(signal: \"SIGINT\" | \"SIGTSTP\" | \"SIGTERM\" | \"SIGKILL\", fallback: string | null): void {\n if (opts.child?.kill) {\n opts.child.kill(signal)\n return\n }\n if (fallback != null) {\n writeToChild(fallback)\n return\n }\n void opts.child?.close?.()\n }\n\n function resize(nextCols: number, nextRows: number): void {\n if (!term || disposed) return\n opts.child?.resize?.(nextCols, nextRows)\n term.resize(nextCols, nextRows)\n cols = nextCols\n rows = nextRows\n buffer = snapshotBuffer(term)\n notifySize()\n notifyOutput()\n }\n\n function emitInputEvent(event: IslandInputEvent): void {\n for (const listener of inputEventListeners) listener(event)\n }\n\n const handle: XtermGuestHandle = {\n size: {\n get cols() {\n return cols\n },\n get rows() {\n return rows\n },\n subscribe(listener) {\n sizeListeners.add(listener)\n return () => sizeListeners.delete(listener)\n },\n requestResize: resize,\n },\n output: {\n get buffer() {\n return buffer\n },\n get cursor() {\n if (!term) return null\n const active = term.buffer.active\n return { row: active.cursorY, col: active.cursorX, style: \"block\" as const }\n },\n get cursorVisible() {\n return term !== null\n },\n subscribe(listener) {\n outputListeners.add(listener)\n return () => outputListeners.delete(listener)\n },\n writeCells(_dirtyRects, nextBuffer) {\n buffer = nextBuffer\n notifyOutput()\n },\n invalidateAll() {\n notifyOutput()\n },\n },\n input: {\n onKey(handler) {\n keyListeners.add(handler)\n return () => keyListeners.delete(handler)\n },\n onMouse(handler) {\n mouseListeners.add(handler)\n return () => mouseListeners.delete(handler)\n },\n onPaste(handler) {\n pasteListeners.add(handler)\n return () => pasteListeners.delete(handler)\n },\n feed(bytes) {\n writeToChild(decoder.decode(bytes))\n emitInputEvent({ kind: \"feed\", bytes })\n },\n events() {\n return createAsyncEventStream((listener) => {\n inputEventListeners.add(listener)\n return () => inputEventListeners.delete(listener)\n })\n },\n sendEof() {\n writeToChild(\"\\x04\")\n },\n },\n modes: {\n get modes() {\n return modes\n },\n subscribe(listener) {\n modeListeners.add(listener)\n return () => modeListeners.delete(listener)\n },\n },\n signals: {\n sendSigint() {\n signalChild(\"SIGINT\", \"\\x03\")\n },\n sendSigtstp() {\n signalChild(\"SIGTSTP\", \"\\x1a\")\n },\n sendSigterm() {\n signalChild(\"SIGTERM\", null)\n },\n sendSigkill() {\n signalChild(\"SIGKILL\", null)\n },\n exit,\n },\n feedAnsi,\n dispose() {\n if (disposed) return\n disposed = true\n opts.child?.stdout?.off?.(\"data\", onStdoutData)\n for (const disposable of disposables) {\n try {\n disposable.dispose()\n } catch {\n // Ignore.\n }\n }\n disposables.length = 0\n sizeListeners.clear()\n outputListeners.clear()\n modeListeners.clear()\n keyListeners.clear()\n mouseListeners.clear()\n pasteListeners.clear()\n inputEventListeners.clear()\n if (term) {\n try {\n term.dispose()\n } catch {\n // Ignore.\n }\n term = null\n }\n resolveExit?.({ reason: \"disposed\" })\n resolveExit = null\n },\n }\n\n return handle\n}\n\nexport function xtermGuest(opts: XtermGuestOptions): IslandGuest {\n return {\n capabilities: { input: true, modes: true, resize: true },\n init(ctx: IslandContext): Promise<IslandHandle> {\n const handle = createXtermIslandHandle({ ...opts, cols: ctx.cols, rows: ctx.rows })\n ctx.abortSignal.addEventListener(\"abort\", () => void handle.dispose(), { once: true })\n ctx.emit({ type: \"ready\" })\n return Promise.resolve(handle)\n },\n }\n}\n\n/**\n * Construct an {@link XtermAdapter} ForeignSource.\n *\n * @deprecated Use {@link xtermGuest} with silvery `<Island>` instead. This\n * shim shares the same xterm island core during the Viewport migration window.\n *\n * @example\n * const adapter = XtermAdapter({ cols: 80, rows: 24, child: pty, captureInput: \"all\" })\n * <Viewport cols={80} rows={24} source={adapter} captureInput=\"all\" />\n */\nexport function XtermAdapter(opts: XtermAdapterOptions): XtermAdapterHandle {\n let ctx: ViewportContext | null = null\n let inputMode: ViewportInputMode = opts.captureInput ?? \"none\"\n let island: XtermGuestHandle | null = createXtermIslandHandle({\n ...opts,\n onTitle: (title) => ctx?.emitTitle?.(title),\n shouldForwardTerminalData: () => inputMode === \"keys\" || inputMode === \"all\",\n })\n let unsubscribeOutput: (() => void) | null = null\n\n function flush(): void {\n if (!island || !ctx) return\n const cols = island.size.cols\n const rows = island.size.rows\n const fullRect: ViewportRect = { row: 0, col: 0, width: cols, height: rows }\n ctx.blit([fullRect], island.output.buffer)\n const cursor = island.output.cursor\n if (cursor) ctx.setCursor({ row: cursor.row, col: cursor.col })\n }\n\n const handle: XtermAdapterHandle = {\n connect(c: ViewportContext): void {\n ctx = c\n if (!island) return\n unsubscribeOutput = island.output.subscribe(flush)\n\n ctx.requestInputMode(inputMode)\n\n // Initial paint — guarantees the Viewport renders a defined buffer on\n // the first frame, before any PTY bytes arrive.\n flush()\n },\n\n disconnect(): void {\n unsubscribeOutput?.()\n unsubscribeOutput = null\n void island?.dispose()\n island = null\n ctx = null\n },\n\n desiredSize(): { cols: number; rows: number } {\n return { cols: island?.size.cols ?? opts.cols, rows: island?.size.rows ?? opts.rows }\n },\n\n feedAnsi(chunk: Uint8Array | string): void {\n island?.feedAnsi(chunk)\n },\n\n get inputMode(): ViewportInputMode {\n return inputMode\n },\n\n setInputMode(mode: ViewportInputMode): void {\n inputMode = mode\n ctx?.requestInputMode(mode)\n },\n }\n\n return handle\n}\n","export { createXtermBackend } from \"./backend.ts\"\nexport {\n XtermAdapter,\n xtermGuest,\n type XtermAdapterChild,\n type XtermAdapterHandle,\n type XtermAdapterOptions,\n type XtermGuestChild,\n type XtermGuestHandle,\n type XtermGuestOptions,\n} from \"./viewport-adapter.ts\"\nexport type { ForeignSource } from \"./silvery-compat.ts\"\n\nimport { createXtermBackend } from \"./backend.ts\"\nimport type { TerminalBackend, TerminalOptions } from \"../../../src/terminal/types.ts\"\n\n/** Resolve this backend for the registry. Handles all initialization. */\nexport async function resolve(opts?: Partial<TerminalOptions>): Promise<TerminalBackend> {\n return createXtermBackend(opts)\n}\n","/**\n * STRICT/Verification code extracted from output-phase.ts.\n *\n * Contains: replayAnsiWithStyles (vt100 backend), captureStrictFailureArtifacts,\n * verifyOutputEquivalence, verifyAccumulatedOutput, verifyTerminalEquivalence,\n * compareTerminals, and all supporting types/helpers.\n *\n * These functions are only called when SILVERY_STRICT, SILVERY_STRICT_ACCUMULATE,\n * or SILVERY_STRICT_TERMINAL are enabled. Production builds can tree-shake this\n * entire module.\n */\n\nimport type { TerminalBuffer } from \"../buffer\"\nimport { IncrementalRenderMismatchError } from \"../errors\"\nimport { graphemeWidth, isTextPresentationEmoji } from \"../unicode\"\nimport { createLogger } from \"loggily\"\nimport type { OutputContext } from \"./output-phase\"\n\nconst log = createLogger(\"silvery:output\")\n\nconst _env =\n typeof process !== \"undefined\" ? process.env : ({} as Record<string, string | undefined>)\nconst DEBUG_OUTPUT = !!_env.SILVERY_DEBUG_OUTPUT\n\n// ============================================================================\n// Types for avoiding circular dependencies\n// ============================================================================\n\n/** Function signature for bufferToAnsi — passed from output-phase to avoid circular import. */\nexport type BufferToAnsiFn = (\n buffer: TerminalBuffer,\n ctx: OutputContext,\n maxRows?: number,\n) => string\n\n/** Function signature for outputGraphemeWidth. */\nexport type OutputGraphemeWidthFn = (g: string, ctx: OutputContext) => number\n\n/** Function signature for outputTextSizingEnabled. */\nexport type OutputTextSizingEnabledFn = (ctx: OutputContext) => boolean\n\n/** Per-instance state for SILVERY_STRICT_ACCUMULATE verification. */\nexport interface AccumulateState {\n accumulatedAnsi: string\n accumulateWidth: number\n accumulateHeight: number\n accumulateFrameCount: number\n}\n\n/** Per-instance state for SILVERY_STRICT_TERMINAL verification.\n * Holds persistent terminal(s) that accumulate incremental ANSI output\n * across frames, enabling comparison against a fresh render in an independent emulator. */\nexport interface TerminalVerifyState {\n /** The persistent xterm.js terminal accumulating incremental output */\n terminal: import(\"@termless/core\").Terminal | null\n /** Optional persistent Ghostty terminal for cross-backend verification */\n ghosttyTerminal: import(\"@termless/core\").Terminal | null\n /** Width of the terminal */\n width: number\n /** Height of the terminal */\n height: number\n /** Frame count for diagnostics */\n frameCount: number\n /** Which emulator backends to verify (xterm, ghostty — vt100 handled separately) */\n backends: Array<\"xterm\" | \"ghostty\">\n /** Whether the vt100 (replayAnsiWithStyles) backend is enabled */\n hasVt100: boolean\n}\n\n// ============================================================================\n// Strict environment helpers\n// ============================================================================\n\n/** Parse SILVERY_STRICT_TERMINAL into a list of backends.\n *\n * Accepts `all` (= `vt100,xterm,ghostty`) or a comma-separated list of\n * backend names (e.g., `vt100,xterm`).\n *\n * The `vt100` backend uses the internal `replayAnsiWithStyles` parser (stateless).\n * `xterm` and `ghostty` use persistent terminal emulators (stateful).\n */\nexport function strictTerminalBackends(): Array<\"vt100\" | \"xterm\" | \"ghostty\"> {\n const val = (typeof process !== \"undefined\" ? (process.env.SILVERY_STRICT_TERMINAL ?? \"\") : \"\")\n .toLowerCase()\n .trim()\n if (!val) return []\n if (val === \"all\") return [\"vt100\", \"xterm\", \"ghostty\"]\n // Comma-separated list\n const backends = val\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n const valid = new Set([\"vt100\", \"xterm\", \"ghostty\"])\n for (const b of backends) {\n if (!valid.has(b)) {\n log.warn?.(`SILVERY_STRICT_TERMINAL: unknown backend '${b}', ignoring`)\n }\n }\n return backends.filter((b) => valid.has(b)) as Array<\"vt100\" | \"xterm\" | \"ghostty\">\n}\n\n/** Create fresh terminal verify state. */\nexport function createTerminalVerifyState(): TerminalVerifyState {\n const allBackends = strictTerminalBackends()\n return {\n terminal: null,\n ghosttyTerminal: null,\n width: 0,\n height: 0,\n frameCount: 0,\n backends: allBackends.filter((b) => b !== \"vt100\") as Array<\"xterm\" | \"ghostty\">,\n hasVt100: allBackends.includes(\"vt100\"),\n }\n}\n\n// ============================================================================\n// Style-Aware ANSI Replay\n// ============================================================================\n\n/** SGR state tracked during ANSI replay. */\ninterface SgrState {\n fg: number | { r: number; g: number; b: number } | null\n bg: number | { r: number; g: number; b: number } | null\n bold: boolean\n dim: boolean\n italic: boolean\n underline: boolean\n blink: boolean\n inverse: boolean\n hidden: boolean\n strikethrough: boolean\n}\n\n/** A cell in the style-aware virtual terminal. */\nexport interface StyledCell {\n char: string\n fg: number | { r: number; g: number; b: number } | null\n bg: number | { r: number; g: number; b: number } | null\n bold: boolean\n dim: boolean\n italic: boolean\n underline: boolean\n blink: boolean\n inverse: boolean\n hidden: boolean\n strikethrough: boolean\n}\n\nfunction createDefaultSgr(): SgrState {\n return {\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n blink: false,\n inverse: false,\n hidden: false,\n strikethrough: false,\n }\n}\n\nfunction createDefaultStyledCell(): StyledCell {\n return {\n char: \" \",\n fg: null,\n bg: null,\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n blink: false,\n inverse: false,\n hidden: false,\n strikethrough: false,\n }\n}\n\nfunction cloneStyledCell(cell: StyledCell): StyledCell {\n return { ...cell }\n}\n\n/**\n * Apply SGR parameters to the current state.\n * Handles all SGR codes used by styleTransition().\n */\nfunction applySgrParams(params: string, sgr: SgrState): void {\n if (params === \"\" || params === \"0\") {\n // Reset\n sgr.fg = null\n sgr.bg = null\n sgr.bold = false\n sgr.dim = false\n sgr.italic = false\n sgr.underline = false\n sgr.blink = false\n sgr.inverse = false\n sgr.hidden = false\n sgr.strikethrough = false\n return\n }\n\n const parts = params.split(\";\")\n let i = 0\n while (i < parts.length) {\n const code = parts[i]!\n // Handle subparameters (e.g., \"4:3\" for curly underline)\n const colonIdx = code.indexOf(\":\")\n if (colonIdx >= 0) {\n const mainCode = parseInt(code.substring(0, colonIdx))\n if (mainCode === 4) {\n // Underline style subparameter\n const sub = parseInt(code.substring(colonIdx + 1))\n sgr.underline = sub > 0\n }\n // 58:5:N or 58:2:r:g:b — underline color, skip (we don't track underline color in styled cells)\n i++\n continue\n }\n\n const n = parseInt(code)\n if (n === 0) {\n sgr.fg = null\n sgr.bg = null\n sgr.bold = false\n sgr.dim = false\n sgr.italic = false\n sgr.underline = false\n sgr.blink = false\n sgr.inverse = false\n sgr.hidden = false\n sgr.strikethrough = false\n } else if (n === 1) {\n sgr.bold = true\n } else if (n === 2) {\n sgr.dim = true\n } else if (n === 3) {\n sgr.italic = true\n } else if (n === 4) {\n sgr.underline = true\n } else if (n === 5 || n === 6) {\n sgr.blink = true\n } else if (n === 7) {\n sgr.inverse = true\n } else if (n === 8) {\n sgr.hidden = true\n } else if (n === 9) {\n sgr.strikethrough = true\n } else if (n === 21) {\n // Double underline — we simplify to underline=true\n sgr.underline = true\n } else if (n === 22) {\n sgr.bold = false\n sgr.dim = false\n } else if (n === 23) {\n sgr.italic = false\n } else if (n === 24) {\n sgr.underline = false\n } else if (n === 25) {\n sgr.blink = false\n } else if (n === 27) {\n sgr.inverse = false\n } else if (n === 28) {\n sgr.hidden = false\n } else if (n === 29) {\n sgr.strikethrough = false\n } else if (n >= 30 && n <= 37) {\n sgr.fg = n - 30\n } else if (n === 38) {\n // Extended fg color\n if (parts[i + 1] === \"5\") {\n sgr.fg = parseInt(parts[i + 2]!)\n i += 2\n } else if (parts[i + 1] === \"2\") {\n sgr.fg = {\n r: parseInt(parts[i + 2]!),\n g: parseInt(parts[i + 3]!),\n b: parseInt(parts[i + 4]!),\n }\n i += 4\n }\n } else if (n === 39) {\n sgr.fg = null\n } else if (n >= 40 && n <= 47) {\n sgr.bg = n - 40\n } else if (n === 48) {\n // Extended bg color\n if (parts[i + 1] === \"5\") {\n sgr.bg = parseInt(parts[i + 2]!)\n i += 2\n } else if (parts[i + 1] === \"2\") {\n sgr.bg = {\n r: parseInt(parts[i + 2]!),\n g: parseInt(parts[i + 3]!),\n b: parseInt(parts[i + 4]!),\n }\n i += 4\n }\n } else if (n === 49) {\n sgr.bg = null\n } else if (n === 58) {\n // Underline color — semicolon-form (legacy): \"58;5;N\" (256-color) or\n // \"58;2;r;g;b\" (RGB). The colon-form (\"58:5:N\", \"58:2:r:g:b\") is handled\n // by the colon-detection branch above. We don't track underline color in\n // styled cells, but we MUST consume the sub-parameters here — otherwise\n // the next param (\"2\" or \"5\") will be re-interpreted as standalone SGR\n // 2 (dim) or 5 (blink), corrupting the cell style. The bug surfaced as\n // STRICT_OUTPUT mismatches with `dim: true vs false` at border cells\n // following links/tag refs that emit `58;2;r;g;b` underline color.\n if (parts[i + 1] === \"5\") {\n i += 2\n } else if (parts[i + 1] === \"2\") {\n i += 4\n }\n } else if (n === 59) {\n // Default underline color — no sub-params, nothing to track.\n } else if (n >= 90 && n <= 97) {\n // Bright fg\n sgr.fg = n - 90 + 8\n } else if (n >= 100 && n <= 107) {\n // Bright bg\n sgr.bg = n - 100 + 8\n }\n i++\n }\n}\n\n/**\n * Replay ANSI output into a virtual terminal grid with style tracking.\n *\n * Returns a 2D array [y][x] of StyledCells. This replays the same ANSI\n * escape sequences that outputPhase() produces (CUP, SGR, EL, text) and\n * tracks the resulting character + style at each position.\n *\n * Used by SILVERY_STRICT_OUTPUT to verify that incremental output produces\n * the same visual + style result as a fresh full render.\n *\n * @deprecated Use `SILVERY_STRICT_TERMINAL=vt100` instead. This function is now\n * the internal implementation of the `vt100` backend for STRICT_TERMINAL verification.\n * Direct usage is discouraged — prefer the unified STRICT_TERMINAL env var interface.\n *\n * Public-export removal tracked: km-silvery.unexport-replay-ansi-with-styles\n * (function remains internal to output-verify.ts; only the public re-export is removed)\n */\nexport function replayAnsiWithStyles(\n width: number,\n height: number,\n ansi: string,\n ctx: OutputContext = _defaultCtxForReplay,\n): StyledCell[][] {\n const screen: StyledCell[][] = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => createDefaultStyledCell()),\n )\n let cx = 0\n let cy = 0\n let scrollTop = 0\n let scrollBottom = height - 1\n let pendingWrap = false // VT100 pending wrap flag\n const sgr = createDefaultSgr()\n let i = 0\n\n while (i < ansi.length) {\n if (ansi[i] === \"\\x1b\") {\n if (ansi[i + 1] === \"[\") {\n i += 2\n let params = \"\"\n while (\n i < ansi.length &&\n ((ansi[i]! >= \"0\" && ansi[i]! <= \"9\") ||\n ansi[i] === \";\" ||\n ansi[i] === \"?\" ||\n ansi[i] === \":\")\n ) {\n params += ansi[i]\n i++\n }\n const cmd = ansi[i]\n i++\n if (cmd === \"H\") {\n // CUP clears pending wrap\n pendingWrap = false\n if (params === \"\") {\n cx = 0\n cy = 0\n } else {\n const cmdParts = params.split(\";\")\n // Clamp to screen bounds (real terminals clamp CUP to valid range)\n cy = Math.min(height - 1, Math.max(0, (parseInt(cmdParts[0]!) || 1) - 1))\n cx = Math.min(width - 1, Math.max(0, (parseInt(cmdParts[1]!) || 1) - 1))\n }\n } else if (cmd === \"K\") {\n // Erase to end of line — fills with current bg (or default)\n if (cy >= height) continue // out of bounds — skip\n for (let x = cx; x < width; x++) {\n const cell = screen[cy]![x]!\n cell.char = \" \"\n cell.fg = null\n cell.bg = sgr.bg\n cell.bold = false\n cell.dim = false\n cell.italic = false\n cell.underline = false\n cell.blink = false\n cell.inverse = false\n cell.hidden = false\n cell.strikethrough = false\n }\n } else if (cmd === \"J\") {\n // Erase from cursor to end of screen\n // Clear from cursor to end of current line\n if (cy < height) {\n for (let x = cx; x < width; x++) {\n const cell = screen[cy]![x]!\n cell.char = \" \"\n cell.fg = null\n cell.bg = sgr.bg\n cell.bold = false\n cell.dim = false\n cell.italic = false\n cell.underline = false\n cell.blink = false\n cell.inverse = false\n cell.hidden = false\n cell.strikethrough = false\n }\n }\n // Clear all subsequent lines\n for (let y = cy + 1; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const cell = screen[y]![x]!\n cell.char = \" \"\n cell.fg = null\n cell.bg = sgr.bg\n cell.bold = false\n cell.dim = false\n cell.italic = false\n cell.underline = false\n cell.blink = false\n cell.inverse = false\n cell.hidden = false\n cell.strikethrough = false\n }\n }\n } else if (cmd === \"m\") {\n applySgrParams(params, sgr)\n } else if (cmd === \"C\") {\n // Cursor forward — clears pending wrap\n pendingWrap = false\n const n = parseInt(params) || 1\n cx = Math.min(width - 1, cx + n)\n } else if (cmd === \"A\") {\n // Cursor up — clears pending wrap\n pendingWrap = false\n const n = parseInt(params) || 1\n cy = Math.max(0, cy - n)\n } else if (cmd === \"B\") {\n // Cursor down — clears pending wrap\n pendingWrap = false\n const n = parseInt(params) || 1\n cy = Math.min(height - 1, cy + n)\n } else if (cmd === \"r\") {\n // DECSTBM scrolling region (1-based inclusive). Empty params reset.\n pendingWrap = false\n if (params === \"\") {\n scrollTop = 0\n scrollBottom = height - 1\n } else {\n const [topParam, bottomParam] = params.split(\";\")\n const top = Math.max(0, (parseInt(topParam ?? \"1\") || 1) - 1)\n const bottom = Math.min(\n height - 1,\n (parseInt(bottomParam ?? String(height)) || height) - 1,\n )\n if (top < bottom) {\n scrollTop = top\n scrollBottom = bottom\n }\n }\n cx = 0\n cy = 0\n } else if (cmd === \"S\" || cmd === \"T\") {\n // SU / SD: scroll the active region up/down by N rows.\n pendingWrap = false\n const n = Math.min(parseInt(params) || 1, scrollBottom - scrollTop + 1)\n if (cmd === \"S\") {\n for (let y = scrollTop; y <= scrollBottom - n; y++) {\n screen[y] = screen[y + n]!.map(cloneStyledCell)\n }\n for (let y = scrollBottom - n + 1; y <= scrollBottom; y++) {\n screen[y] = Array.from({ length: width }, () => createDefaultStyledCell())\n }\n } else {\n for (let y = scrollBottom; y >= scrollTop + n; y--) {\n screen[y] = screen[y - n]!.map(cloneStyledCell)\n }\n for (let y = scrollTop; y < scrollTop + n; y++) {\n screen[y] = Array.from({ length: width }, () => createDefaultStyledCell())\n }\n }\n } else if (cmd === \"l\" || cmd === \"h\") {\n // Private mode set/reset (e.g., ?25l = hide cursor, ?25h = show cursor)\n // Skip — we don't model cursor visibility\n }\n continue\n } else if (ansi[i + 1] === \"]\") {\n // OSC sequence — skip until ST (BEL or ESC\\\\)\n i += 2\n while (i < ansi.length) {\n if (ansi[i] === \"\\x07\") {\n i++\n break\n }\n if (ansi[i] === \"\\x1b\" && ansi[i + 1] === \"\\\\\") {\n i += 2\n break\n }\n i++\n }\n continue\n }\n // Unknown escape — skip the ESC and next char\n i += 2\n continue\n }\n\n if (ansi[i] === \"\\r\") {\n // CR clears pending wrap, moves to column 0\n pendingWrap = false\n cx = 0\n i++\n continue\n }\n\n if (ansi[i] === \"\\n\") {\n // LF clears pending wrap and moves down one row\n pendingWrap = false\n cy++\n if (cy >= height) {\n // Scroll: shift all rows up by 1\n const first = screen.shift()!\n // Reset the row being recycled\n for (const cell of first) {\n cell.char = \" \"\n cell.fg = null\n cell.bg = null\n cell.bold = false\n cell.dim = false\n cell.italic = false\n cell.underline = false\n cell.blink = false\n cell.inverse = false\n cell.hidden = false\n cell.strikethrough = false\n }\n screen.push(first)\n cy = height - 1\n }\n i++\n continue\n }\n\n // Regular character — collect full grapheme cluster.\n //\n // A grapheme cluster may span multiple UTF-16 code units:\n // - Surrogate pairs for astral codepoints (e.g., emoji U+1F600)\n // - ZWJ sequences (e.g., 🏃‍♂️ = U+1F3C3 U+200D U+2642 U+FE0F)\n // - Variation selectors (U+FE0E text, U+FE0F emoji presentation)\n // - Combining marks, skin tone modifiers, regional indicators\n //\n // Strategy: extract the first codepoint (handling surrogates), then\n // greedily absorb subsequent zero-width joiners, variation selectors,\n // combining marks, and their targets into a single grapheme string.\n // This matches terminal behavior where the entire cluster occupies\n // the column count of the base character.\n let grapheme = \"\"\n let advance = 0\n // First-codepoint kind tracking — required for UAX #29 GB12/GB13\n // (regional indicators only pair with another RI; they MUST NOT extend\n // a non-RI base character). Also used to gate variation-selector and\n // skin-tone modifier absorption to graphemes that started with a\n // codepoint capable of taking that modifier — otherwise these can\n // glue onto e.g. an ASCII space and form a 3-column \"space + flag\"\n // cluster, which then writes 2 cells over the wrong columns and\n // leaves stale prev pixels at cx+1 and cx+2.\n let firstCpIsRegionalIndicator = false\n let firstCpIsEmojiBase = false\n\n // Extract the initial codepoint\n let firstCp: number\n const code0 = ansi.charCodeAt(i)\n if (code0 >= 0xd800 && code0 <= 0xdbff && i + 1 < ansi.length) {\n const low = ansi.charCodeAt(i + 1)\n if (low >= 0xdc00 && low <= 0xdfff) {\n grapheme = ansi[i]! + ansi[i + 1]!\n advance = 2\n firstCp = ((code0 - 0xd800) << 10) + (low - 0xdc00) + 0x10000\n } else {\n grapheme = ansi[i]!\n advance = 1\n firstCp = code0\n }\n } else {\n grapheme = ansi[i]!\n advance = 1\n firstCp = code0\n }\n firstCpIsRegionalIndicator = firstCp >= 0x1f1e6 && firstCp <= 0x1f1ff\n // Conservative emoji-base set: emoji-presentation codepoints plus\n // text-presentation emoji such as ↔, ™, and ❤️ bases. Skin-tone /\n // VS-16 only meaningfully extend these.\n if (firstCp >= 0x1f000) {\n firstCpIsEmojiBase = true\n } else if (firstCp >= 0x2600 && firstCp <= 0x27bf) {\n // Misc Symbols + Dingbats (☀, ✈, etc.)\n firstCpIsEmojiBase = true\n } else if (isTextPresentationEmoji(grapheme)) {\n firstCpIsEmojiBase = true\n }\n\n // Absorb combining/extending codepoints that follow:\n // ZWJ (U+200D), variation selectors (U+FE0E-FE0F), combining marks\n // (U+0300-036F, U+20D0-20FF, U+1AB0-1AFF, U+FE20-FE2F), skin tone\n // modifiers (U+1F3FB-1F3FF), regional indicators (U+1F1E6-1F1FF —\n // GATED: only when the first codepoint is itself an RI, and at most\n // ONE more RI per UAX #29 GB12/GB13), enclosing keycap (U+20E3), and\n // tag sequences (U+E0020-E007F).\n {\n let j = i + advance\n let absorbedRiCount = 0\n while (j < ansi.length) {\n const c = ansi.charCodeAt(j)\n // Decode the codepoint at j (handle surrogates)\n let cp: number\n let cpLen: number\n if (c >= 0xd800 && c <= 0xdbff && j + 1 < ansi.length) {\n const lo = ansi.charCodeAt(j + 1)\n if (lo >= 0xdc00 && lo <= 0xdfff) {\n cp = ((c - 0xd800) << 10) + (lo - 0xdc00) + 0x10000\n cpLen = 2\n } else {\n break\n }\n } else {\n cp = c\n cpLen = 1\n }\n\n // Truly-zero-width modifiers — always safe to absorb. These do\n // not start new graphemes regardless of base.\n const isCombiningMark =\n (cp >= 0x0300 && cp <= 0x036f) || // Combining diacritical marks\n (cp >= 0x20d0 && cp <= 0x20ff) || // Combining marks for symbols\n (cp >= 0x1ab0 && cp <= 0x1aff) || // Combining diacritical extended\n (cp >= 0xfe20 && cp <= 0xfe2f) || // Combining half marks\n cp === 0x20e3 // Combining enclosing keycap\n if (cp === 0x200d || isCombiningMark) {\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n continue\n }\n\n // Variation selectors and skin-tone modifiers only extend an\n // emoji-capable base. Without this gate, U+FE0F glues onto\n // arbitrary preceding ASCII and inflates grapheme width.\n if (cp === 0xfe0e || cp === 0xfe0f) {\n if (firstCpIsEmojiBase) {\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n continue\n }\n break\n }\n if (cp >= 0x1f3fb && cp <= 0x1f3ff) {\n if (firstCpIsEmojiBase) {\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n continue\n }\n break\n }\n\n // Tag sequences — only after an emoji base.\n if ((cp >= 0xe0020 && cp <= 0xe007f) || cp === 0xe0001) {\n if (firstCpIsEmojiBase) {\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n continue\n }\n break\n }\n\n // Regional indicators — UAX #29 GB12/GB13. An RI may extend a\n // grapheme ONLY when the grapheme started with an RI AND no\n // additional RI has been absorbed yet (a flag is exactly two\n // RIs; a third RI begins a new flag). This was the source of the\n // \"🇺🇸 written at col N renders at col N-1\" bug: previously, any\n // RI absorbed onto whatever preceded it (e.g., ' ' + RI + RI →\n // grapheme \" 🇺🇸\" of width 3, smearing one column to the left).\n if (cp >= 0x1f1e6 && cp <= 0x1f1ff) {\n if (firstCpIsRegionalIndicator && absorbedRiCount === 0) {\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n absorbedRiCount++\n continue\n }\n break\n }\n\n // After ZWJ, absorb the next codepoint (the ZWJ target)\n const prevCp =\n grapheme.length >= 2\n ? grapheme.charCodeAt(grapheme.length - 2) === 0x200d\n ? 0x200d\n : grapheme.charCodeAt(grapheme.length - 1)\n : grapheme.charCodeAt(grapheme.length - 1)\n if (prevCp === 0x200d && cp > 0x20) {\n // ZWJ target: absorb any codepoint after ZWJ\n grapheme += ansi.slice(j, j + cpLen)\n advance += cpLen\n j += cpLen\n continue\n }\n\n break\n }\n }\n\n const charWidth = graphemeWidth(grapheme)\n\n if (cy < height && cx < width) {\n // Resolve pending wrap before writing\n if (pendingWrap) {\n pendingWrap = false\n cx = 0\n cy++\n if (cy >= height) {\n // Scroll: shift all rows up by 1\n const first = screen.shift()!\n for (const cell of first) {\n cell.char = \" \"\n cell.fg = null\n cell.bg = null\n cell.bold = false\n cell.dim = false\n cell.italic = false\n cell.underline = false\n cell.blink = false\n cell.inverse = false\n cell.hidden = false\n cell.strikethrough = false\n }\n screen.push(first)\n cy = height - 1\n }\n }\n if (cy < height && cx < width) {\n const cell = screen[cy]![cx]!\n cell.char = grapheme\n cell.fg = sgr.fg\n cell.bg = sgr.bg\n cell.bold = sgr.bold\n cell.dim = sgr.dim\n cell.italic = sgr.italic\n cell.underline = sgr.underline\n cell.blink = sgr.blink\n cell.inverse = sgr.inverse\n cell.hidden = sgr.hidden\n cell.strikethrough = sgr.strikethrough\n\n // Wide character: clear the continuation cell at cx+1 (terminals\n // implicitly overwrite the second column when writing a wide char)\n if (charWidth === 2 && cx + 1 < width) {\n const cont = screen[cy]![cx + 1]!\n cont.char = \" \"\n cont.fg = sgr.fg\n cont.bg = sgr.bg\n cont.bold = sgr.bold\n cont.dim = sgr.dim\n cont.italic = sgr.italic\n cont.underline = sgr.underline\n cont.blink = sgr.blink\n cont.inverse = sgr.inverse\n cont.hidden = sgr.hidden\n cont.strikethrough = sgr.strikethrough\n }\n\n cx += charWidth\n if (cx >= width) {\n // Enter pending wrap state — cursor stays at last column\n cx = width - 1\n pendingWrap = true\n }\n }\n }\n i += advance\n }\n return screen\n}\n\n// Default context for replayAnsiWithStyles when called without ctx (by tests).\nconst _defaultCtxForReplay: OutputContext = {\n caps: {\n // Full per-style support — tests render at truecolor with all styles\n // available. Narrower caps are exercised via createOutputPhase({...}).\n underlineStyles: [\"single\", \"double\", \"curly\", \"dotted\", \"dashed\"],\n underlineColor: true,\n overline: true,\n colorLevel: \"truecolor\",\n },\n measurer: null,\n sgrCache: new Map(),\n transitionCache: new Map(),\n mode: \"fullscreen\",\n termRows: undefined,\n}\n\n/** Format a color value for display. */\nexport function formatColor(c: number | { r: number; g: number; b: number } | null): string {\n if (c === null) return \"default\"\n if (typeof c === \"number\") return `${c}`\n return `rgb(${c.r},${c.g},${c.b})`\n}\n\n// =============================================================================\n// STRICT failure artifact capture\n// =============================================================================\n\n/**\n * Capture debug artifacts to disk when a STRICT verification fails.\n * Saves prev/next buffer snapshots, ANSI sequences, terminal size, and test context\n * to /tmp/silvery-strict-failure-<timestamp>/.\n *\n * Returns the artifact directory path (included in the error message).\n */\nexport function captureStrictFailureArtifacts(opts: {\n source: string\n errorMessage: string\n prev?: TerminalBuffer | null\n next?: TerminalBuffer | null\n incrOutput?: string\n freshOutput?: string\n ctx?: OutputContext\n frameCount?: number\n /** Optional bufferToAnsi function for generating fresh-prev.ansi. */\n renderFull?: BufferToAnsiFn\n}): string {\n try {\n const fs = require(\"fs\")\n const path = require(\"path\")\n const timestamp = Date.now()\n const dir = `/tmp/silvery-strict-failure-${timestamp}`\n fs.mkdirSync(dir, { recursive: true })\n\n // Metadata\n const meta: Record<string, unknown> = {\n source: opts.source,\n timestamp: new Date().toISOString(),\n frameCount: opts.frameCount,\n prevSize: opts.prev ? { width: opts.prev.width, height: opts.prev.height } : null,\n nextSize: opts.next ? { width: opts.next.width, height: opts.next.height } : null,\n incrOutputLength: opts.incrOutput?.length,\n freshOutputLength: opts.freshOutput?.length,\n testName: (globalThis as any).__vitest_worker__?.current?.name as string | undefined,\n }\n fs.writeFileSync(path.join(dir, \"meta.json\"), JSON.stringify(meta, null, 2))\n\n // Error message\n fs.writeFileSync(path.join(dir, \"error.txt\"), opts.errorMessage)\n\n // ANSI sequences\n if (opts.incrOutput) {\n fs.writeFileSync(path.join(dir, \"incremental.ansi\"), opts.incrOutput)\n }\n if (opts.freshOutput) {\n fs.writeFileSync(path.join(dir, \"fresh.ansi\"), opts.freshOutput)\n }\n\n // Buffer snapshots (text representation)\n if (opts.prev) {\n const rows: string[] = []\n for (let y = 0; y < opts.prev.height; y++) {\n let row = \"\"\n for (let x = 0; x < opts.prev.width; x++) {\n const cell = opts.prev.getCell(x, y)\n row += cell.char || \" \"\n }\n rows.push(row.trimEnd())\n }\n fs.writeFileSync(path.join(dir, \"prev-buffer.txt\"), rows.join(\"\\n\"))\n }\n\n if (opts.next) {\n const rows: string[] = []\n for (let y = 0; y < opts.next.height; y++) {\n let row = \"\"\n for (let x = 0; x < opts.next.width; x++) {\n const cell = opts.next.getCell(x, y)\n row += cell.char || \" \"\n }\n rows.push(row.trimEnd())\n }\n fs.writeFileSync(path.join(dir, \"next-buffer.txt\"), rows.join(\"\\n\"))\n }\n\n // Fresh prev ANSI (for replay)\n if (opts.prev && opts.ctx && opts.renderFull) {\n const freshPrev = opts.renderFull(opts.prev, opts.ctx)\n fs.writeFileSync(path.join(dir, \"fresh-prev.ansi\"), freshPrev)\n }\n\n return dir\n } catch {\n return \"(artifact capture failed)\"\n }\n}\n\n// =============================================================================\n// Output Equivalence Verification (vt100 backend)\n// =============================================================================\n\n/**\n * Verify that applying changesToAnsi output to a previous terminal state\n * produces the same visible characters AND styles as a fresh render of the\n * next buffer. Throws on mismatch.\n *\n * @param prev Previous terminal buffer\n * @param next Next terminal buffer\n * @param incrOutput Incremental ANSI output from changesToAnsi\n * @param ctx Output context\n * @param renderFull Function to convert a buffer to full ANSI output\n * @param graphemeWidthFn Function to get grapheme width\n * @param textSizingEnabledFn Function to check if text sizing is enabled\n */\nexport function verifyOutputEquivalence(\n prev: TerminalBuffer,\n next: TerminalBuffer,\n incrOutput: string,\n ctx: OutputContext,\n renderFull: BufferToAnsiFn,\n graphemeWidthFn: OutputGraphemeWidthFn,\n textSizingEnabledFn: OutputTextSizingEnabledFn,\n): void {\n const w = Math.max(prev.width, next.width)\n // VT height must accommodate the larger buffer to prevent scrolling artifacts\n // when prev is taller than next (e.g., items removed from a scrollback list).\n // We only compare up to next.height rows — excess rows should be cleared.\n const vtHeight = Math.max(prev.height, next.height)\n // DEBUG: log buffer dimensions\n if (DEBUG_OUTPUT) {\n log.error?.(\n `[VERIFY] prev=${prev.width}x${prev.height} next=${next.width}x${next.height} vtSize=${w}x${vtHeight}`,\n )\n }\n // Replay: fresh prev render + incremental diff applied on top\n const freshPrev = renderFull(prev, ctx)\n if (DEBUG_OUTPUT) {\n log.error?.(`[VERIFY] freshPrev len=${freshPrev.length} incrOutput len=${incrOutput.length}`)\n // Show incrOutput as escaped string\n const escaped = incrOutput.replace(/\\x1b/g, \"\\\\e\").replace(/\\r/g, \"\\\\r\").replace(/\\n/g, \"\\\\n\")\n log.error?.(`[VERIFY] incrOutput: ${escaped.slice(0, 500)}`)\n }\n const screenIncr = replayAnsiWithStyles(w, vtHeight, freshPrev + incrOutput, ctx)\n // Replay: fresh render of next buffer\n const freshNext = renderFull(next, ctx)\n const screenFresh = replayAnsiWithStyles(w, vtHeight, freshNext, ctx)\n\n const _dumpRowWideCells = (buf: TerminalBuffer, row: number): string => {\n const parts: string[] = []\n for (let cx = 0; cx < buf.width; cx++) {\n const c = buf.getCell(cx, row)\n const cp = c.char\n ? [...c.char]\n .map(\n (ch) => \"U+\" + (ch.codePointAt(0) ?? 0).toString(16).toUpperCase().padStart(4, \"0\"),\n )\n .join(\",\")\n : \"empty\"\n if (c.wide) parts.push(`W@${cx}:${cp}(gw=${graphemeWidthFn(c.char, ctx)})`)\n if (c.continuation) parts.push(`C@${cx}`)\n // Flag cells where written char width differs from buffer expectation\n const charToWrite = c.char || \" \"\n const vtWidth = graphemeWidthFn(charToWrite, ctx)\n const bufWidth = c.wide ? 2 : 1\n if (!c.continuation && vtWidth !== bufWidth) {\n parts.push(\n `MISMATCH@${cx}:${cp}(vtW=${vtWidth},bufW=${bufWidth},tse=${textSizingEnabledFn(ctx)})`,\n )\n }\n }\n return parts.join(\" \")\n }\n\n // Compare character by character AND style by style.\n // Use vtHeight (not compareHeight) to catch stale rows after height shrink.\n // When prev.height > next.height, stale rows beyond next.height must be\n // verified as cleared — otherwise incremental output silently diverges.\n for (let y = 0; y < vtHeight; y++) {\n for (let x = 0; x < w; x++) {\n const incr = screenIncr[y]![x]!\n const fresh = screenFresh[y]![x]!\n\n // Check character\n if (incr.char !== fresh.char) {\n // Build context: show the row from both renders\n const incrRow = screenIncr[y]!.map((c) => c.char).join(\"\")\n const freshRow = screenFresh[y]!.map((c) => c.char).join(\"\")\n // Also show the prev buffer row for diagnosis\n const prevRow = screenIncr[y]!.map((_, cx) => {\n const prevCell = prev.getCell(cx, y)\n return prevCell.char\n }).join(\"\")\n // Show what changesToAnsi tried to write at this position\n const nextCell = next.getCell(x, y)\n const prevCell = prev.getCell(x, y)\n // Show detailed column-by-column comparison around the mismatch\n const contextStart = Math.max(0, x - 5)\n const contextEnd = Math.min(w, x + 10)\n const colDetails: string[] = []\n for (let cx = contextStart; cx < contextEnd; cx++) {\n const ic = screenIncr[y]![cx]!\n const fc = screenFresh[y]![cx]!\n const pc = prev.getCell(cx, y)\n const nc = next.getCell(cx, y)\n const marker = cx === x ? \" <<<\" : ic.char !== fc.char ? \" !!!\" : \"\"\n colDetails.push(\n ` col ${cx}: prev='${pc.char}'(w=${pc.wide},c=${pc.continuation}) next='${nc.char}' incr='${ic.char}' fresh='${fc.char}' wide=${nc.wide} cont=${nc.continuation}${marker}`,\n )\n }\n const msg =\n `STRICT_OUTPUT char mismatch at (${x},${y}): ` +\n `incremental='${incr.char}' fresh='${fresh.char}'\\n` +\n ` prev buffer cell: char='${prevCell.char}' bg=${prevCell.bg} wide=${prevCell.wide} cont=${prevCell.continuation}\\n` +\n ` next buffer cell: char='${nextCell.char}' bg=${nextCell.bg} wide=${nextCell.wide} cont=${nextCell.continuation}\\n` +\n ` incr row: ${incrRow}\\n` +\n ` fresh row: ${freshRow}\\n` +\n ` prev row: ${prevRow}\\n` +\n `Wide/cont cells on row ${y} (next buffer): ${_dumpRowWideCells(next, y)}\\n` +\n `Wide/cont cells on row ${y} (prev buffer): ${_dumpRowWideCells(prev, y)}\\n` +\n `Column detail around mismatch:\\n${colDetails.join(\"\\n\")}`\n const artifactDir = captureStrictFailureArtifacts({\n source: \"STRICT_OUTPUT\",\n errorMessage: msg,\n prev,\n next,\n incrOutput,\n freshOutput: freshNext,\n ctx,\n renderFull,\n })\n const fullMsg = `${msg}\\n Artifacts: ${artifactDir}`\n log.error?.(fullMsg)\n throw new IncrementalRenderMismatchError(fullMsg)\n }\n\n // Check styles\n const diffs: string[] = []\n if (!sgrColorEquals(incr.fg, fresh.fg))\n diffs.push(`fg: ${formatColor(incr.fg)} vs ${formatColor(fresh.fg)}`)\n if (!sgrColorEquals(incr.bg, fresh.bg))\n diffs.push(`bg: ${formatColor(incr.bg)} vs ${formatColor(fresh.bg)}`)\n if (incr.bold !== fresh.bold) diffs.push(`bold: ${incr.bold} vs ${fresh.bold}`)\n if (incr.dim !== fresh.dim) diffs.push(`dim: ${incr.dim} vs ${fresh.dim}`)\n if (incr.italic !== fresh.italic) diffs.push(`italic: ${incr.italic} vs ${fresh.italic}`)\n if (incr.underline !== fresh.underline)\n diffs.push(`underline: ${incr.underline} vs ${fresh.underline}`)\n if (incr.inverse !== fresh.inverse) diffs.push(`inverse: ${incr.inverse} vs ${fresh.inverse}`)\n if (incr.strikethrough !== fresh.strikethrough)\n diffs.push(`strikethrough: ${incr.strikethrough} vs ${fresh.strikethrough}`)\n\n if (diffs.length > 0) {\n const msg =\n `STRICT_OUTPUT style mismatch at (${x},${y}) char='${incr.char}': ` +\n diffs.join(\", \") +\n `\\n incremental: fg=${formatColor(incr.fg)} bg=${formatColor(incr.bg)} bold=${incr.bold} dim=${incr.dim}` +\n `\\n fresh: fg=${formatColor(fresh.fg)} bg=${formatColor(fresh.bg)} bold=${fresh.bold} dim=${fresh.dim}`\n const artifactDir2 = captureStrictFailureArtifacts({\n source: \"STRICT_OUTPUT\",\n errorMessage: msg,\n prev,\n next,\n incrOutput,\n freshOutput: freshNext,\n ctx,\n renderFull,\n })\n throw new IncrementalRenderMismatchError(`${msg}\\n Artifacts: ${artifactDir2}`)\n }\n }\n }\n}\n\n// =============================================================================\n// Accumulated Output Verification\n// =============================================================================\n\n/**\n * Verify that the accumulated output from all frames produces the same\n * terminal state as a fresh render of the current buffer.\n * Catches compounding errors across multiple render frames.\n */\nexport function verifyAccumulatedOutput(\n currentBuffer: TerminalBuffer,\n ctx: OutputContext,\n accState: AccumulateState,\n renderFull: BufferToAnsiFn,\n): void {\n const w = accState.accumulateWidth\n const h = accState.accumulateHeight\n // Replay all accumulated output (first render + all incremental updates)\n const screenAccumulated = replayAnsiWithStyles(w, h, accState.accumulatedAnsi, ctx)\n // Replay fresh render of current buffer\n const freshOutput = renderFull(currentBuffer, ctx)\n const screenFresh = replayAnsiWithStyles(w, h, freshOutput, ctx)\n\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const accum = screenAccumulated[y]![x]!\n const fresh = screenFresh[y]![x]!\n\n if (accum.char !== fresh.char) {\n const msg =\n `SILVERY_STRICT_ACCUMULATE char mismatch at (${x},${y}) after ${accState.accumulateFrameCount} frames: ` +\n `accumulated='${accum.char}' fresh='${fresh.char}'`\n const dir = captureStrictFailureArtifacts({\n source: \"STRICT_ACCUMULATE\",\n errorMessage: msg,\n next: currentBuffer,\n incrOutput: accState.accumulatedAnsi,\n freshOutput,\n ctx,\n frameCount: accState.accumulateFrameCount,\n renderFull,\n })\n log.error?.(`${msg}\\n Artifacts: ${dir}`)\n throw new IncrementalRenderMismatchError(`${msg}\\n Artifacts: ${dir}`)\n }\n\n const diffs: string[] = []\n if (!sgrColorEquals(accum.fg, fresh.fg))\n diffs.push(`fg: ${formatColor(accum.fg)} vs ${formatColor(fresh.fg)}`)\n if (!sgrColorEquals(accum.bg, fresh.bg))\n diffs.push(`bg: ${formatColor(accum.bg)} vs ${formatColor(fresh.bg)}`)\n if (accum.bold !== fresh.bold) diffs.push(`bold: ${accum.bold} vs ${fresh.bold}`)\n if (accum.dim !== fresh.dim) diffs.push(`dim: ${accum.dim} vs ${fresh.dim}`)\n if (accum.italic !== fresh.italic) diffs.push(`italic: ${accum.italic} vs ${fresh.italic}`)\n if (accum.underline !== fresh.underline)\n diffs.push(`underline: ${accum.underline} vs ${fresh.underline}`)\n if (accum.inverse !== fresh.inverse)\n diffs.push(`inverse: ${accum.inverse} vs ${fresh.inverse}`)\n if (accum.strikethrough !== fresh.strikethrough)\n diffs.push(`strikethrough: ${accum.strikethrough} vs ${fresh.strikethrough}`)\n\n if (diffs.length > 0) {\n const msg =\n `SILVERY_STRICT_ACCUMULATE style mismatch at (${x},${y}) char='${accum.char}' after ${accState.accumulateFrameCount} frames: ` +\n diffs.join(\", \")\n const dir2 = captureStrictFailureArtifacts({\n source: \"STRICT_ACCUMULATE\",\n errorMessage: msg,\n next: currentBuffer,\n freshOutput,\n ctx,\n frameCount: accState.accumulateFrameCount,\n renderFull,\n })\n log.error?.(`${msg}\\n Artifacts: ${dir2}`)\n throw new IncrementalRenderMismatchError(`${msg}\\n Artifacts: ${dir2}`)\n }\n }\n }\n}\n\n// =============================================================================\n// SILVERY_STRICT_TERMINAL: Independent xterm.js emulator verification\n// =============================================================================\n\n/** Lazily loaded termless factories — avoids import cost when STRICT_TERMINAL is off. */\nlet _createTerminal: typeof import(\"@termless/core\").createTerminal | null = null\nlet _createXtermBackend: typeof import(\"@termless/xtermjs\").createXtermBackend | null = null\nlet _createGhosttyBackend: typeof import(\"@termless/ghostty\").createGhosttyBackend | null = null\nlet _ghosttyInitPromise: Promise<void> | null = null\n\nfunction loadTermless(): {\n createTerminal: typeof import(\"@termless/core\").createTerminal\n createXtermBackend: typeof import(\"@termless/xtermjs\").createXtermBackend\n} {\n if (!_createTerminal || !_createXtermBackend) {\n _createTerminal = require(\"@termless/core\").createTerminal\n _createXtermBackend = require(\"@termless/xtermjs\").createXtermBackend\n }\n return { createTerminal: _createTerminal!, createXtermBackend: _createXtermBackend! }\n}\n\nfunction loadGhosttyBackend(): typeof import(\"@termless/ghostty\").createGhosttyBackend {\n if (!_createGhosttyBackend) {\n const mod = require(\"@termless/ghostty\")\n _createGhosttyBackend = mod.createGhosttyBackend\n // Start async WASM init — first call may block on this\n if (!_ghosttyInitPromise) {\n _ghosttyInitPromise = mod.initGhostty()\n }\n }\n return _createGhosttyBackend!\n}\n\n/**\n * Initialize the terminal verify state: create persistent terminal emulators\n * and feed the initial full render ANSI output.\n */\nexport function initTerminalVerifyState(\n state: TerminalVerifyState,\n width: number,\n height: number,\n initialAnsi: string,\n): void {\n // Close any existing terminals from a previous run\n if (state.terminal) void state.terminal.close()\n if (state.ghosttyTerminal) void state.ghosttyTerminal.close()\n\n // Create xterm.js terminal if requested\n if (state.backends.includes(\"xterm\")) {\n const { createTerminal, createXtermBackend } = loadTermless()\n state.terminal = createTerminal({ backend: createXtermBackend(), cols: width, rows: height })\n state.terminal.feed(initialAnsi)\n } else {\n state.terminal = null\n }\n\n // Create Ghostty terminal if requested\n if (state.backends.includes(\"ghostty\")) {\n const { createTerminal } = loadTermless()\n const createGhostty = loadGhosttyBackend()\n state.ghosttyTerminal = createTerminal({ backend: createGhostty(), cols: width, rows: height })\n state.ghosttyTerminal.feed(initialAnsi)\n } else {\n state.ghosttyTerminal = null\n }\n\n state.width = width\n state.height = height\n state.frameCount = 0\n}\n\n/**\n * Verify that the cumulative incremental ANSI output (fed through a persistent\n * xterm.js terminal) produces the same visible state as a fresh full render\n * (fed through a second, throwaway xterm.js terminal).\n *\n * This is the ONE invariant that catches both OSC 66 and buffer overflow bugs:\n * \"For a given terminal capability profile and viewport size, the actual\n * terminal state after incremental rendering must equal the actual terminal\n * state after a fresh full redraw\" — checked in an independent emulator.\n */\nexport function verifyTerminalEquivalence(\n state: TerminalVerifyState,\n incrOutput: string,\n nextBuffer: TerminalBuffer,\n ctx: OutputContext,\n renderFull: BufferToAnsiFn,\n): void {\n // Buffer dimensions may change between frames (test renderers use content-sized\n // buffers). When dimensions change, the persistent terminal can't be meaningfully\n // compared — CUP commands and scrolling behave differently at different sizes.\n // Reinitialize the persistent terminal with a fresh render at the new dimensions.\n if (nextBuffer.width !== state.width || nextBuffer.height !== state.height) {\n const freshAnsi = renderFull(nextBuffer, ctx)\n initTerminalVerifyState(state, nextBuffer.width, nextBuffer.height, freshAnsi)\n state.frameCount++\n return\n }\n\n const freshAnsi = renderFull(nextBuffer, ctx)\n\n // Verify xterm.js terminal\n if (state.terminal) {\n state.terminal.feed(incrOutput)\n const { createTerminal, createXtermBackend } = loadTermless()\n const freshTerm = createTerminal({\n backend: createXtermBackend(),\n cols: state.width,\n rows: state.height,\n })\n freshTerm.feed(freshAnsi)\n try {\n compareTerminals(state.terminal, freshTerm, state, \"xterm\")\n } catch (e) {\n if (e instanceof IncrementalRenderMismatchError) {\n const dir = captureStrictFailureArtifacts({\n source: \"STRICT_TERMINAL[xterm]\",\n errorMessage: e.message,\n next: nextBuffer,\n incrOutput,\n freshOutput: freshAnsi,\n ctx,\n frameCount: state.frameCount,\n renderFull,\n })\n throw new IncrementalRenderMismatchError(`${e.message}\\n Artifacts: ${dir}`)\n }\n throw e\n } finally {\n void freshTerm.close()\n }\n }\n\n // Verify Ghostty terminal\n if (state.ghosttyTerminal) {\n state.ghosttyTerminal.feed(incrOutput)\n const { createTerminal } = loadTermless()\n const createGhostty = loadGhosttyBackend()\n const freshTerm = createTerminal({\n backend: createGhostty(),\n cols: state.width,\n rows: state.height,\n })\n freshTerm.feed(freshAnsi)\n try {\n compareTerminals(state.ghosttyTerminal, freshTerm, state, \"ghostty\")\n } catch (e) {\n if (e instanceof IncrementalRenderMismatchError) {\n const dir = captureStrictFailureArtifacts({\n source: \"STRICT_TERMINAL[ghostty]\",\n errorMessage: e.message,\n next: nextBuffer,\n incrOutput,\n freshOutput: freshAnsi,\n ctx,\n frameCount: state.frameCount,\n renderFull,\n })\n throw new IncrementalRenderMismatchError(`${e.message}\\n Artifacts: ${dir}`)\n }\n throw e\n } finally {\n void freshTerm.close()\n }\n }\n}\n\n/** Compare two terminal states cell-by-cell. Throws IncrementalRenderMismatchError on divergence. */\nfunction compareTerminals(\n incrTerm: import(\"@termless/core\").Terminal,\n freshTerm: import(\"@termless/core\").Terminal,\n state: TerminalVerifyState,\n backendName: string,\n): void {\n const w = state.width\n const h = state.height\n const prefix = `SILVERY_STRICT_TERMINAL[${backendName}]`\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const incrCell = incrTerm.getCell(y, x)\n const freshCell = freshTerm.getCell(y, x)\n const incrChar = incrCell.char || \" \"\n const freshChar = freshCell.char || \" \"\n\n if (incrChar !== freshChar) {\n const incrRow = Array.from(\n { length: w },\n (_, cx) => incrTerm.getCell(y, cx).char || \" \",\n ).join(\"\")\n const freshRow = Array.from(\n { length: w },\n (_, cx) => freshTerm.getCell(y, cx).char || \" \",\n ).join(\"\")\n const msg =\n `${prefix} char mismatch at (${x},${y}) frame ${state.frameCount}: ` +\n `incremental='${incrChar}' fresh='${freshChar}'\\n` +\n ` incr row: ${incrRow.trimEnd()}\\n` +\n ` fresh row: ${freshRow.trimEnd()}`\n log.error?.(msg)\n throw new IncrementalRenderMismatchError(msg)\n }\n\n if (!rgbEquals(incrCell.fg, freshCell.fg)) {\n const msg =\n `${prefix} fg color mismatch at (${x},${y}) char='${incrChar}' frame ${state.frameCount}: ` +\n `incremental=${formatRgb(incrCell.fg)} fresh=${formatRgb(freshCell.fg)}`\n log.error?.(msg)\n throw new IncrementalRenderMismatchError(msg)\n }\n\n if (!rgbEquals(incrCell.bg, freshCell.bg)) {\n const msg =\n `${prefix} bg color mismatch at (${x},${y}) char='${incrChar}' frame ${state.frameCount}: ` +\n `incremental=${formatRgb(incrCell.bg)} fresh=${formatRgb(freshCell.bg)}`\n log.error?.(msg)\n throw new IncrementalRenderMismatchError(msg)\n }\n\n const attrDiffs: string[] = []\n if (incrCell.bold !== freshCell.bold)\n attrDiffs.push(`bold: ${incrCell.bold} vs ${freshCell.bold}`)\n if (incrCell.dim !== freshCell.dim) attrDiffs.push(`dim: ${incrCell.dim} vs ${freshCell.dim}`)\n if (incrCell.italic !== freshCell.italic)\n attrDiffs.push(`italic: ${incrCell.italic} vs ${freshCell.italic}`)\n if (incrCell.inverse !== freshCell.inverse)\n attrDiffs.push(`inverse: ${incrCell.inverse} vs ${freshCell.inverse}`)\n if (incrCell.strikethrough !== freshCell.strikethrough)\n attrDiffs.push(`strikethrough: ${incrCell.strikethrough} vs ${freshCell.strikethrough}`)\n\n if (attrDiffs.length > 0) {\n const msg =\n `${prefix} attr mismatch at (${x},${y}) char='${incrChar}' frame ${state.frameCount}: ` +\n attrDiffs.join(\", \")\n log.error?.(msg)\n throw new IncrementalRenderMismatchError(msg)\n }\n }\n }\n}\n\n/** Compare two RGB color values (from termless Cell). */\nfunction rgbEquals(\n a: { r: number; g: number; b: number } | null,\n b: { r: number; g: number; b: number } | null,\n): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n return a.r === b.r && a.g === b.g && a.b === b.b\n}\n\n/** Format an RGB value for diagnostic messages. */\nfunction formatRgb(c: { r: number; g: number; b: number } | null): string {\n if (c === null) return \"null\"\n return `rgb(${c.r},${c.g},${c.b})`\n}\n\n/** Compare two SGR color values. */\nexport function sgrColorEquals(\n a: number | { r: number; g: number; b: number } | null,\n b: number | { r: number; g: number; b: number } | null,\n): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a === \"number\" || typeof b === \"number\") return a === b\n return a.r === b.r && a.g === b.g && a.b === b.b\n}\n","/**\n * Buffer diffing for the output phase.\n *\n * Compares two TerminalBuffers and returns a list of changed cells via a\n * pre-allocated pool (zero per-frame allocation). Handles dimension changes\n * (growth and shrink) and wide→narrow character transitions.\n */\n\nimport type { TerminalBuffer } from \"../buffer\"\nimport type { CellChange } from \"./types\"\n\n// ============================================================================\n// Pre-allocated diff pool\n// ============================================================================\n\n/**\n * Create a fresh CellChange with empty cell data.\n * Used to populate the pre-allocated pool.\n */\nfunction createEmptyCellChange(): CellChange {\n return {\n x: 0,\n y: 0,\n cell: {\n char: \" \",\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n wide: false,\n continuation: false,\n hyperlink: undefined,\n },\n }\n}\n\n/** Pre-allocated pool of CellChange objects, reused across frames. */\nconst diffPool: CellChange[] = []\n\n/** Current pool capacity. */\nlet diffPoolCapacity = 0\n\n/**\n * Ensure the diff pool has at least `capacity` entries.\n * Grows the pool if needed; never shrinks.\n */\nfunction ensureDiffPoolCapacity(capacity: number): void {\n if (capacity <= diffPoolCapacity) return\n for (let i = diffPoolCapacity; i < capacity; i++) {\n diffPool.push(createEmptyCellChange())\n }\n diffPoolCapacity = capacity\n}\n\n/**\n * Write cell data from a buffer into a pre-allocated CellChange entry.\n * Uses readCellInto for zero-allocation reads.\n */\nfunction writeCellChange(change: CellChange, x: number, y: number, buffer: TerminalBuffer): void {\n change.x = x\n change.y = y\n buffer.readCellInto(x, y, change.cell)\n}\n\n/**\n * Write empty cell data into a pre-allocated CellChange entry.\n * Used for shrink regions where cells need to be cleared.\n */\nfunction writeEmptyCellChange(change: CellChange, x: number, y: number): void {\n change.x = x\n change.y = y\n const cell = change.cell\n cell.char = \" \"\n cell.fg = null\n cell.bg = null\n cell.underlineColor = null\n // Reset attrs fields\n const attrs = cell.attrs\n attrs.bold = undefined\n attrs.dim = undefined\n attrs.italic = undefined\n attrs.underline = undefined\n attrs.underlineStyle = undefined\n attrs.blink = undefined\n attrs.inverse = undefined\n attrs.hidden = undefined\n attrs.strikethrough = undefined\n attrs.overline = undefined\n cell.wide = false\n cell.continuation = false\n cell.hyperlink = undefined\n}\n\n/**\n * Diff result: pool reference + count (avoids per-frame array allocation).\n */\nexport interface DiffResult {\n pool: CellChange[]\n count: number\n}\n\n/** Reusable diff result object (avoids allocating a new one per frame). */\nconst diffResult: DiffResult = { pool: diffPool, count: 0 }\n\n/**\n * Diff two buffers and return changes via pre-allocated pool.\n *\n * Optimization: Uses a pre-allocated pool of CellChange objects to avoid\n * allocating new objects per changed cell. Uses readCellInto for\n * zero-allocation cell reads. The pool grows as needed but is reused\n * between frames. Returns a pool+count pair instead of slicing the array.\n */\nexport function diffBuffers(prev: TerminalBuffer, next: TerminalBuffer): DiffResult {\n // Ensure pool is large enough for worst case (all cells changed).\n // Wide→narrow transitions emit an extra change for the continuation cell,\n // so worst case is 1.5x (every other cell could be a wide→narrow transition).\n const cells = Math.max(prev.width, next.width) * Math.max(prev.height, next.height)\n const maxChanges = cells + (cells >> 1) // 1.5x\n ensureDiffPoolCapacity(maxChanges)\n\n let changeCount = 0\n\n // Dimension mismatch means we need to re-render everything visible\n const height = Math.min(prev.height, next.height)\n const width = Math.min(prev.width, next.width)\n\n // Use dirty row bounding box to narrow the scan range.\n // If no rows are dirty, minDirtyRow is -1 and the loop body is skipped.\n const startRow = next.minDirtyRow === -1 ? 0 : next.minDirtyRow\n const endRow = next.maxDirtyRow === -1 ? -1 : Math.min(next.maxDirtyRow, height - 1)\n\n for (let y = startRow; y <= endRow; y++) {\n // Skip individual clean rows within the bounding box\n if (!next.isRowDirty(y)) continue\n\n // Fast row-level pre-check: if all packed metadata, chars, AND Map-based\n // extras (true colors, underline colors, hyperlinks) match, skip per-cell\n // comparison entirely. This catches rows marked dirty by fill() or\n // scrollRegion() that didn't actually change content.\n // NOTE: rowExtrasEquals is essential — rowMetadataEquals only checks packed\n // flags (e.g., \"has true color fg\"), not the actual RGB values in the Maps.\n if (\n next.rowMetadataEquals(y, prev) &&\n next.rowCharsEquals(y, prev) &&\n next.rowExtrasEquals(y, prev)\n )\n continue\n\n for (let x = 0; x < width; x++) {\n // Use buffer's optimized cellEquals which compares packed metadata first\n if (!next.cellEquals(x, y, prev)) {\n writeCellChange(diffPool[changeCount]!, x, y, next)\n changeCount++\n\n // Wide char transition: when prev had a wide char and next doesn't,\n // we must also emit the continuation position (x+1) as a change.\n // The terminal's state at x+1 contains the second half of the wide\n // char, but the buffer may show x+1 as \"unchanged\" (both prev and\n // next are ' '). Without this explicit change, changesToAnsi skips\n // x+1 and the terminal retains the wide char remnant, causing\n // cursor drift.\n //\n // Skip when the next column already triggers its own change (next[x+1]\n // is itself a wide char or a continuation cell that differs from prev):\n // the normal scan at x+1 will emit it. Pushing here too would produce a\n // duplicate change at the same (x+1, y) position. changesToAnsi sorts\n // by position and processes both entries, emitting the wide char twice\n // (regression: km-silvery.wide-char-incr-render — wide char at column\n // N in prev frame, shifted to column N+1 in next frame produced\n // '🇯🇵🇯🇵' instead of ' 🇯🇵').\n if (\n x + 1 < width &&\n prev.isCellWide(x, y) &&\n !next.isCellWide(x, y) &&\n !next.isCellWide(x + 1, y) &&\n !next.isCellContinuation(x + 1, y)\n ) {\n writeCellChange(diffPool[changeCount]!, x + 1, y, next)\n changeCount++\n }\n }\n }\n }\n\n // Handle size growth: add all cells in new areas.\n // Width growth covers the right strip (x >= prev.width) for ALL rows.\n // Height growth covers the bottom strip (y >= prev.height) but only up to\n // prev.width to avoid double-counting the corner with width growth.\n const widthGrew = next.width > prev.width\n if (widthGrew) {\n for (let y = 0; y < next.height; y++) {\n for (let x = prev.width; x < next.width; x++) {\n writeCellChange(diffPool[changeCount]!, x, y, next)\n changeCount++\n }\n }\n }\n if (next.height > prev.height) {\n // When width also grew, only iterate x=0..prev.width (the rest was\n // already covered by width growth above). Otherwise iterate full width.\n const xEnd = widthGrew ? prev.width : next.width\n for (let y = prev.height; y < next.height; y++) {\n for (let x = 0; x < xEnd; x++) {\n writeCellChange(diffPool[changeCount]!, x, y, next)\n changeCount++\n }\n }\n }\n\n // Handle size shrink: clear cells in old-but-not-new areas.\n // Width shrink covers x >= next.width for the shared height.\n // Height shrink covers y >= next.height but only up to next.width when\n // width also shrank, to avoid double-counting the corner.\n const widthShrank = prev.width > next.width\n if (widthShrank) {\n for (let y = 0; y < height; y++) {\n for (let x = next.width; x < prev.width; x++) {\n writeEmptyCellChange(diffPool[changeCount]!, x, y)\n changeCount++\n }\n }\n }\n if (prev.height > next.height) {\n // When width also shrank, the corner (x >= next.width, y >= next.height)\n // was NOT covered by width shrink (which only iterates y < height =\n // min(prev.height, next.height) = next.height). So iterate full prev.width.\n for (let y = next.height; y < prev.height; y++) {\n for (let x = 0; x < prev.width; x++) {\n writeEmptyCellChange(diffPool[changeCount]!, x, y)\n changeCount++\n }\n }\n }\n\n if (changeCount > maxChanges) {\n throw new Error(\n `diffBuffers: changeCount ${changeCount} exceeds pool capacity ${maxChanges} ` +\n `(prev ${prev.width}x${prev.height}, next ${next.width}x${next.height})`,\n )\n }\n\n diffResult.pool = diffPool\n diffResult.count = changeCount\n return diffResult\n}\n","/**\n * Hybrid output emission — density analysis.\n *\n * Given a sorted dirty-cell pool, compute per-row density summaries and pick\n * the cheapest emission mode (whole-row / run-length / scatter).\n *\n * Tracking: km-silvery.known-limits.hybrid-output\n *\n * Phase 2 implementation. Phase 1 (scaffold) shipped earlier; Phase 3 will\n * wire these into output-phase.ts behind the SILVERY_HYBRID_OUTPUT feature\n * flag. Until then, this module is reachable only via direct unit tests.\n */\n\nimport type { CellChange } from \"./types\"\n\n/** Discriminator for the three emission modes defined in the design doc. */\nexport type EmissionMode = \"whole-row\" | \"run-length\" | \"scatter\"\n\n/**\n * A maximal contiguous run of dirty columns on a single row.\n *\n * `start` and `end` are inclusive column indices in the destination buffer.\n * A single-cell run has `start === end`.\n *\n * Wide characters whose main cell falls inside `[start, end]` are emitted as\n * a single unit by the run-length emitter; the continuation cell is widened\n * into the run automatically by the analyzer.\n */\nexport interface DirtyRunSpan {\n start: number\n end: number\n}\n\n/**\n * Per-row dirty summary produced by `analyzeRowDensity`. One instance per\n * row that has any dirty cells. Values are valid only until the next call\n * to `analyzeRowDensity` (the summary pool is reused across frames).\n */\nexport interface DirtyRowSummary {\n /** Row index in the destination buffer. */\n y: number\n /** Number of dirty cells on the row (wide-char continuations deduped). */\n dirty: number\n /** Leftmost dirty column on the row. */\n minX: number\n /** Rightmost dirty column on the row (inclusive). */\n maxX: number\n /** Number of maximal contiguous runs. */\n runCount: number\n /** Maximal contiguous dirty runs, ordered by `start`. */\n runs: DirtyRunSpan[]\n /** Inclusive pool index of the first cell change on this row. */\n poolStart: number\n /** Exclusive pool index of the last cell change on this row. */\n poolEnd: number\n}\n\n/**\n * Result of density analysis: a flat array of per-row summaries ordered by\n * ascending `y`. The array is module-scoped and reused across frames — do\n * not retain references beyond the current emission pass.\n */\nexport interface DensityAnalysis {\n /** One summary per dirty row. Reused across frames. */\n rows: readonly DirtyRowSummary[]\n /** Number of valid entries in `rows`. */\n rowCount: number\n}\n\n// ============================================================================\n// Module-scoped pools (zero per-frame allocation in steady state)\n// ============================================================================\n\n/** Per-row summaries — grow lazily. */\nconst summaryPool: DirtyRowSummary[] = []\n\n/**\n * Per-row run arrays. Each row owns its own `runs` array (sliced into via\n * length manipulation). The arrays themselves grow lazily; we never shrink\n * them so the JIT can keep monomorphic shapes.\n */\nfunction getOrCreateSummary(index: number): DirtyRowSummary {\n let summary = summaryPool[index]\n if (!summary) {\n summary = {\n y: -1,\n dirty: 0,\n minX: -1,\n maxX: -1,\n runCount: 0,\n runs: [],\n poolStart: -1,\n poolEnd: -1,\n }\n summaryPool[index] = summary\n }\n return summary\n}\n\n/** Cached result object — returned from every call. */\nconst cachedAnalysis: { rows: DirtyRowSummary[]; rowCount: number } = {\n rows: summaryPool,\n rowCount: 0,\n}\n\n// ============================================================================\n// Cost estimator constants — see design doc §4 of\n// hub/silvery/design/v05-layout/hybrid-output.md.\n//\n// These are byte-cost estimates for the emission paths:\n//\n// scatter: dirty * PER_CELL_SCATTER\n// runs: runCount * RUN_PREAMBLE + dirty * PER_CELL_IN_RUN\n// whole: ROW_PREAMBLE + width * PER_CELL_IN_ROW\n//\n// The scatter per-cell cost includes a cursor jump (CUP ≈ 6-8 bytes) plus a\n// short SGR transition plus the char itself, amortized to 12 bytes/cell.\n//\n// Run preamble = 1 CUP (~6 bytes) + 1 SGR transition (~4 bytes) per run\n// boundary, totaling ~10 bytes/run. Within a run the cursor auto-advances,\n// so the per-cell cost drops to ~2 bytes (char only, occasional SGR amortized).\n//\n// Whole-row preamble = 1 CUP to (y, 0) ≈ 8 bytes (slightly more than a same-\n// row CUF because it also resets the column). Per-cell-in-row mirrors the\n// run path since the cursor auto-advances and SGRs amortize across the row.\n// ============================================================================\n\n/** Per-cell amortized cost in scatter mode (CUP + SGR + char). */\nconst PER_CELL_SCATTER = 12\n/** Cost of one cursor jump + SGR transition per run preamble. */\nconst RUN_PREAMBLE = 10\n/** Per-cell cost inside a run (relies on auto-advance). */\nconst PER_CELL_IN_RUN = 2\n/** Cost of one absolute CUP to (y, 0) per whole-row preamble. */\nconst ROW_PREAMBLE = 8\n/** Per-cell cost inside a whole-row emission. */\nconst PER_CELL_IN_ROW = 2\n\n/**\n * Analyze a sorted dirty-cell pool and produce per-row summaries.\n *\n * Preconditions:\n * - `pool` is sorted by `(y, x)` ascending. The caller\n * (`sortPoolByPosition` in output-phase.ts) guarantees this.\n * - `count` is the number of valid entries in `pool`. Entries beyond\n * `count` may contain stale data and must be ignored.\n * - `width` is the destination buffer width in columns.\n *\n * Postconditions:\n * - Returns a `DensityAnalysis` with one summary per distinct `y`.\n * - Wide-char continuation cells are deduped from `dirty` but their columns\n * are still represented inside runs so the emitter can widen spans to\n * cover both halves of a wide char that straddles a run boundary.\n * - Zero per-frame allocation: summaries and runs come from module-scoped\n * pools that grow lazily.\n */\nexport function analyzeRowDensity(\n pool: readonly CellChange[],\n count: number,\n _width: number,\n): DensityAnalysis {\n cachedAnalysis.rowCount = 0\n\n if (count === 0) {\n return cachedAnalysis as DensityAnalysis\n }\n\n let rowIdx = 0\n let i = 0\n\n while (i < count) {\n const rowY = pool[i]!.y\n const summary = getOrCreateSummary(rowIdx)\n summary.y = rowY\n summary.dirty = 0\n summary.minX = pool[i]!.x\n summary.maxX = pool[i]!.x\n summary.runCount = 0\n summary.poolStart = i\n\n // Walk this row's contiguous slice in the sorted pool, building runs.\n let runStart = -1\n let runEnd = -1\n\n while (i < count && pool[i]!.y === rowY) {\n const change = pool[i]!\n const x = change.x\n const isContinuation = change.cell.continuation === true\n const isWide = change.cell.wide === true\n\n if (!isContinuation) {\n summary.dirty++\n }\n if (x < summary.minX) summary.minX = x\n // Track maxX as the rightmost column actually touched (continuations\n // count too, since the emitter must cover them).\n const rightCol = isWide ? x + 1 : x\n if (rightCol > summary.maxX) summary.maxX = rightCol\n\n // Run building. A new cell extends the current run when it is\n // adjacent to (or overlapping with) the previous run's end.\n // Wide-char continuations don't appear separately if their main cell\n // is in the pool (they share the same x+1 column the wide flag\n // already widened); for orphan continuations we still want a span\n // covering [x-1, x] so the emitter can re-emit the main cell.\n const cellStart = isContinuation ? Math.max(0, x - 1) : x\n const cellEnd = isContinuation ? x : isWide ? x + 1 : x\n\n if (runStart === -1) {\n runStart = cellStart\n runEnd = cellEnd\n } else if (cellStart <= runEnd + 1) {\n // Extend current run (adjacent or overlapping).\n if (cellEnd > runEnd) runEnd = cellEnd\n } else {\n // Close current run, open new one.\n appendRun(summary, runStart, runEnd)\n runStart = cellStart\n runEnd = cellEnd\n }\n\n i++\n }\n\n if (runStart !== -1) {\n appendRun(summary, runStart, runEnd)\n }\n\n summary.poolEnd = i\n rowIdx++\n }\n\n cachedAnalysis.rowCount = rowIdx\n return cachedAnalysis as DensityAnalysis\n}\n\n/** Append a run to a summary's run pool, growing the array lazily. */\nfunction appendRun(summary: DirtyRowSummary, start: number, end: number): void {\n const idx = summary.runCount\n const existing = summary.runs[idx]\n if (existing) {\n existing.start = start\n existing.end = end\n } else {\n summary.runs[idx] = { start, end }\n }\n summary.runCount++\n}\n\n/**\n * Pick the cheapest emission mode for a single row, given its density\n * summary and the destination buffer width.\n *\n * Uses the estimator in §4 of the design doc:\n *\n * scatterCost = dirty * PER_CELL_SCATTER\n * runCost = runCount * RUN_PREAMBLE + dirty * PER_CELL_IN_RUN\n * wholeCost = ROW_PREAMBLE + width * PER_CELL_IN_ROW\n *\n * Fast paths (no estimator):\n * - `dirty <= 2` → scatter\n * - `dirty * 2 >= width` → whole-row\n * - `runCount === 1` → run-length\n */\nexport function pickEmissionMode(row: DirtyRowSummary, width: number): EmissionMode {\n const { dirty, runCount } = row\n\n // Fast paths\n if (dirty <= 2) return \"scatter\"\n if (dirty * 2 >= width) return \"whole-row\"\n if (runCount === 1) return \"run-length\"\n\n // Estimator\n const scatterCost = dirty * PER_CELL_SCATTER\n const runCost = runCount * RUN_PREAMBLE + dirty * PER_CELL_IN_RUN\n const wholeCost = ROW_PREAMBLE + width * PER_CELL_IN_ROW\n\n // Pick the minimum. Ties favor run-length (least over-emission risk),\n // then whole-row (most predictable cursor state), then scatter.\n if (runCost <= scatterCost && runCost <= wholeCost) return \"run-length\"\n if (wholeCost <= scatterCost) return \"whole-row\"\n return \"scatter\"\n}\n","/**\n * Hybrid output emission — per-mode emitters.\n *\n * Three emission modes, picked per-row by `pickEmissionMode` in\n * `output-density.ts`. All three mutate a shared `OutputEmitState` so that\n * cursor and style state carries across rows (enabling the `\\r\\n` shortcut\n * and avoiding redundant SGR transitions).\n *\n * Tracking: km-silvery.known-limits.hybrid-output\n *\n * Phase 2 implementation. Phase 3 will wire these into output-phase.ts\n * behind the SILVERY_HYBRID_OUTPUT feature flag. Until then, the new\n * emitters are reachable only via direct unit tests; legacy `changesToAnsi`\n * is unchanged.\n */\n\nimport {\n type Style,\n type TerminalBuffer,\n createMutableCell,\n hasActiveAttrs,\n styleEquals,\n} from \"../buffer\"\nimport type { DirtyRowSummary } from \"./output-density\"\nimport type { CellChange } from \"./types\"\nimport {\n type OutputContext,\n _internalStyleTransition as styleTransition,\n _internalWrapTextSizing as wrapTextSizing,\n} from \"./output-phase\"\n\n/**\n * Mutable state threaded through each per-row emitter so that cross-row\n * cursor and style transitions are as cheap as the current `changesToAnsi`\n * single-pass implementation.\n *\n * Zero-allocation discipline: this is reused across rows and across frames.\n * The `OutputEmitState` lives in the `createOutputPhase` closure alongside\n * `InlineCursorState`.\n */\nexport interface OutputEmitState {\n /** Accumulated ANSI output for the current frame. */\n output: string\n /** Current terminal cursor column, render-relative. -1 means uninitialized. */\n cursorX: number\n /** Current terminal cursor row, render-relative. -1 means uninitialized. */\n cursorY: number\n /** Previous emitted row (for cross-row shortcut detection). */\n prevY: number\n /** Last emitted cell column (wide-char continuation tracking). */\n lastEmittedX: number\n /** Last emitted cell row (wide-char continuation tracking). */\n lastEmittedY: number\n /** Currently active SGR style, or null if reset. */\n currentStyle: Style | null\n /** Currently active OSC 8 hyperlink, or undefined if none. */\n currentHyperlink: string | undefined\n /** Inline mode adjustments: subtract from y to get render-relative row. */\n startLine: number\n /** True if emitting in inline mode (relative cursor positioning). */\n isInline: boolean\n}\n\n/** Create a fresh `OutputEmitState`. Reused across rows by emitters. */\nexport function createOutputEmitState(opts?: {\n startLine?: number\n isInline?: boolean\n}): OutputEmitState {\n return {\n output: \"\",\n cursorX: -1,\n cursorY: -1,\n prevY: -1,\n lastEmittedX: -1,\n lastEmittedY: -1,\n currentStyle: null,\n currentHyperlink: undefined,\n startLine: opts?.startLine ?? 0,\n isInline: opts?.isInline ?? false,\n }\n}\n\n// ============================================================================\n// Shared per-cell emission helper\n// ============================================================================\n\n/**\n * Pre-allocated style scratch object — reused across all emitter calls.\n * Per-frame emit state, not per-call.\n */\nconst reusableCellStyle: Style = {\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n}\n\n/** Pre-allocated cell scratch for buffer reads. */\nconst reusableCell = createMutableCell()\n\n/**\n * Move the cursor to `(renderY, x)`, choosing the cheapest escape sequence.\n * Mutates `state.output`, `state.cursorX`, `state.cursorY`.\n *\n * - First positioning (`cursorY === -1`): fullscreen uses absolute CUP,\n * inline uses `\\r` + CUF.\n * - Same-row forward jump: CUF (resetting bg first to prevent bleed).\n * - Next-row col-0: `\\r\\n` (resetting style first).\n * - Same-column down N rows: `\\r\\x1b[NB` or `\\r\\n` for N=1.\n * - Inline arbitrary positioning: relative `\\x1b[NA/B` + `\\r` + CUF.\n * - Fullscreen arbitrary: absolute CUP `\\x1b[Y;XH`.\n */\nfunction moveCursorTo(state: OutputEmitState, x: number, renderY: number): void {\n const { cursorX, cursorY, isInline } = state\n if (renderY === cursorY && x === cursorX) return\n\n // \\r\\n shortcut: next row at column 0.\n if (cursorY >= 0 && renderY === cursorY + 1 && x === 0) {\n if (\n state.currentStyle &&\n (state.currentStyle.bg !== null || hasActiveAttrs(state.currentStyle.attrs))\n ) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n state.output += \"\\r\\n\"\n } else if (cursorY >= 0 && renderY === cursorY && x > cursorX) {\n // Same row forward.\n if (state.currentStyle && state.currentStyle.bg !== null) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n const dx = x - cursorX\n state.output += dx === 1 ? \"\\x1b[C\" : `\\x1b[${dx}C`\n } else if (cursorY >= 0 && renderY > cursorY && x === 0) {\n // Same column 0 down N rows.\n if (\n state.currentStyle &&\n (state.currentStyle.bg !== null || hasActiveAttrs(state.currentStyle.attrs))\n ) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n const dy = renderY - cursorY\n state.output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n } else if (isInline) {\n if (\n state.currentStyle &&\n (state.currentStyle.bg !== null || hasActiveAttrs(state.currentStyle.attrs))\n ) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n const fromRow = cursorY >= 0 ? cursorY : 0\n if (renderY > fromRow) {\n state.output += `\\x1b[${renderY - fromRow}B\\r`\n } else if (renderY < fromRow) {\n state.output += `\\x1b[${fromRow - renderY}A\\r`\n } else {\n state.output += \"\\r\"\n }\n if (x > 0) state.output += x === 1 ? \"\\x1b[C\" : `\\x1b[${x}C`\n } else {\n state.output += `\\x1b[${renderY + 1};${x + 1}H`\n }\n\n state.cursorX = x\n state.cursorY = renderY\n}\n\n/**\n * Emit a single cell at the current cursor position.\n * Caller is responsible for moving the cursor first via `moveCursorTo`.\n *\n * Handles: hyperlink open/close, style transition, char write, wide-char\n * cursor resync. Mutates `state.output`, `state.currentStyle`,\n * `state.currentHyperlink`, `state.cursorX`, `state.lastEmittedX/Y`.\n */\nfunction emitCellAtCursor(\n state: OutputEmitState,\n x: number,\n renderY: number,\n cell: {\n char: string\n fg: Style[\"fg\"]\n bg: Style[\"bg\"]\n underlineColor: Style[\"underlineColor\"]\n attrs: Style[\"attrs\"]\n wide: boolean\n hyperlink?: string\n },\n ctx: OutputContext,\n): void {\n // Hyperlink transition.\n if (cell.hyperlink !== state.currentHyperlink) {\n if (state.currentHyperlink) {\n state.output += \"\\x1b]8;;\\x1b\\\\\"\n }\n if (cell.hyperlink) {\n state.output += `\\x1b]8;;${cell.hyperlink}\\x1b\\\\`\n }\n state.currentHyperlink = cell.hyperlink\n }\n\n // Style transition.\n reusableCellStyle.fg = cell.fg\n reusableCellStyle.bg = cell.bg\n reusableCellStyle.underlineColor = cell.underlineColor\n reusableCellStyle.attrs = cell.attrs\n if (!styleEquals(state.currentStyle, reusableCellStyle)) {\n const prev = state.currentStyle\n const snapshot: Style = {\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: { ...cell.attrs },\n }\n state.output += styleTransition(prev, snapshot, ctx)\n state.currentStyle = snapshot\n }\n\n // Char (empty → space so terminal advances cursor).\n const char = cell.char || \" \"\n state.output += wrapTextSizing(char, cell.wide, ctx)\n\n state.cursorX = x + (cell.wide ? 2 : 1)\n state.cursorY = renderY\n state.lastEmittedX = x\n state.lastEmittedY = renderY - state.startLine // store buffer-relative y\n\n // Wide-char cursor resync (terminal-bug workaround for flag emoji etc.).\n if (cell.wide) {\n if (state.isInline) {\n if (state.currentStyle && state.currentStyle.bg !== null) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n state.output += \"\\r\"\n if (state.cursorX > 0) {\n state.output += state.cursorX === 1 ? \"\\x1b[C\" : `\\x1b[${state.cursorX}C`\n }\n } else {\n state.output += `\\x1b[${state.cursorY + 1};${state.cursorX + 1}H`\n }\n }\n}\n\n/**\n * Reset row-level state (close hyperlinks, reset bg) when transitioning to\n * a new row. Called at the start of each emitter and at the end of\n * whole-row emissions to prevent right-margin bleed.\n */\nfunction endOfRowReset(state: OutputEmitState): void {\n if (state.currentHyperlink) {\n state.output += \"\\x1b]8;;\\x1b\\\\\"\n state.currentHyperlink = undefined\n }\n if (\n state.currentStyle &&\n (state.currentStyle.bg !== null || hasActiveAttrs(state.currentStyle.attrs))\n ) {\n state.output += \"\\x1b[0m\"\n state.currentStyle = null\n }\n}\n\n// ============================================================================\n// Mode A — whole-row emission\n// ============================================================================\n\n/**\n * Emit an entire row's worth of cells unconditionally, matching the\n * per-cell inner loop of `bufferToAnsi`. Used when `pickEmissionMode`\n * returns `\"whole-row\"`.\n *\n * Contract:\n * - Writes every cell in `[0, buffer.width)` on row `summary.y`.\n * - Starts with an absolute cursor jump to `(summary.y, 0)`.\n * - Mutates `state` to reflect the final cursor position at\n * `(summary.y, buffer.width)` (pending-wrap state).\n * - Appends to `state.output`.\n */\nexport function emitWholeRow(\n summary: DirtyRowSummary,\n buffer: TerminalBuffer,\n ctx: OutputContext,\n state: OutputEmitState,\n): void {\n const y = summary.y\n const renderY = state.isInline ? y - state.startLine : y\n\n // Close hyperlink on row change.\n if (y !== state.prevY && state.currentHyperlink) {\n state.output += \"\\x1b]8;;\\x1b\\\\\"\n state.currentHyperlink = undefined\n }\n state.prevY = y\n\n // Position cursor at start of row.\n moveCursorTo(state, 0, renderY)\n\n for (let x = 0; x < buffer.width; x++) {\n buffer.readCellInto(x, y, reusableCell)\n emitCellAtCursor(\n state,\n x,\n renderY,\n {\n char: reusableCell.char,\n fg: reusableCell.fg,\n bg: reusableCell.bg,\n underlineColor: reusableCell.underlineColor,\n attrs: reusableCell.attrs,\n wide: reusableCell.wide,\n hyperlink: reusableCell.hyperlink,\n },\n ctx,\n )\n if (reusableCell.wide) {\n x++ // skip continuation column\n }\n }\n\n endOfRowReset(state)\n state.cursorX = buffer.width\n state.cursorY = renderY\n state.lastEmittedX = buffer.width - 1\n state.lastEmittedY = y\n}\n\n// ============================================================================\n// Mode B — run-length emission\n// ============================================================================\n\n/**\n * Emit the maximal contiguous runs of dirty cells on a row. Used when\n * `pickEmissionMode` returns `\"run-length\"`.\n *\n * Contract:\n * - Iterates `summary.runs` in order. For each run, moves the cursor to\n * `(summary.y, run.start)` then emits cells `[run.start, run.end]`.\n * - Relies on cursor auto-advance within a run — no per-cell CUF.\n * - Mutates `state.cursorX` / `state.cursorY` to reflect the final position\n * of the last run on the row.\n * - Appends to `state.output`.\n *\n * Run bounds are trusted: `analyzeRowDensity` widens runs to cover both\n * halves of straddling wide chars.\n */\nexport function emitRuns(\n summary: DirtyRowSummary,\n pool: readonly CellChange[],\n buffer: TerminalBuffer,\n ctx: OutputContext,\n state: OutputEmitState,\n): void {\n const y = summary.y\n const renderY = state.isInline ? y - state.startLine : y\n\n if (y !== state.prevY && state.currentHyperlink) {\n state.output += \"\\x1b]8;;\\x1b\\\\\"\n state.currentHyperlink = undefined\n }\n state.prevY = y\n\n // Build a quick lookup for cells whose changes are in the pool, keyed\n // by x. For positions inside the run that are NOT in the pool (e.g., a\n // run widened to cover a wide-char half), read from the buffer.\n // Linear scan over the pool slice — the slice is small (one row).\n for (let r = 0; r < summary.runCount; r++) {\n const run = summary.runs[r]!\n moveCursorTo(state, run.start, renderY)\n\n let x = run.start\n while (x <= run.end) {\n // Locate the change in the pool slice for column x, if any.\n let change: CellChange | undefined\n for (let i = summary.poolStart; i < summary.poolEnd; i++) {\n const c = pool[i]!\n if (c.y !== y) break // pool may have other rows after — but slice limited\n if (c.x === x) {\n change = c\n break\n }\n }\n\n if (change && !change.cell.continuation) {\n emitCellAtCursor(\n state,\n x,\n renderY,\n {\n char: change.cell.char,\n fg: change.cell.fg,\n bg: change.cell.bg,\n underlineColor: change.cell.underlineColor,\n attrs: change.cell.attrs,\n wide: change.cell.wide,\n hyperlink: change.cell.hyperlink,\n },\n ctx,\n )\n x += change.cell.wide ? 2 : 1\n } else {\n // No change at this column (or only a continuation cell touched).\n // Read from buffer to repaint the cell. This covers wide-char\n // widening and gap-filling within a run.\n buffer.readCellInto(x, y, reusableCell)\n if (reusableCell.continuation && x > 0) {\n // Step back to main cell.\n x -= 1\n buffer.readCellInto(x, y, reusableCell)\n if (reusableCell.continuation) {\n // Should not happen with valid buffers — bail.\n x += 2\n continue\n }\n }\n emitCellAtCursor(\n state,\n x,\n renderY,\n {\n char: reusableCell.char,\n fg: reusableCell.fg,\n bg: reusableCell.bg,\n underlineColor: reusableCell.underlineColor,\n attrs: reusableCell.attrs,\n wide: reusableCell.wide,\n hyperlink: reusableCell.hyperlink,\n },\n ctx,\n )\n x += reusableCell.wide ? 2 : 1\n }\n }\n }\n}\n\n// ============================================================================\n// Mode C — scatter emission\n// ============================================================================\n\n/**\n * Emit dirty cells one by one with explicit cursor jumps between them.\n * Used when `pickEmissionMode` returns `\"scatter\"`. This is the current\n * behavior of `changesToAnsi`, refactored to take `OutputEmitState` and a\n * per-row pool slice.\n *\n * Contract:\n * - Iterates `pool[summary.poolStart..summary.poolEnd)` in order.\n * - Emits each cell with an explicit cursor jump if the cursor is not\n * already at the target position.\n * - Handles wide-char continuation cells by looking up the main cell from\n * the buffer (orphan handling, see `changesToAnsi`).\n * - Mutates `state` to reflect the final cursor position after the last\n * emitted cell.\n */\nexport function emitScatter(\n summary: DirtyRowSummary,\n pool: readonly CellChange[],\n buffer: TerminalBuffer,\n ctx: OutputContext,\n state: OutputEmitState,\n): void {\n const y = summary.y\n const renderY = state.isInline ? y - state.startLine : y\n\n if (y !== state.prevY && state.currentHyperlink) {\n state.output += \"\\x1b]8;;\\x1b\\\\\"\n state.currentHyperlink = undefined\n }\n state.prevY = y\n\n for (let i = summary.poolStart; i < summary.poolEnd; i++) {\n const change = pool[i]!\n let x = change.x\n let cell: typeof change.cell = change.cell\n\n if (cell.continuation) {\n // Main cell already emitted in this pass — skip.\n if (state.lastEmittedX === x - 1 && state.lastEmittedY === y) continue\n\n // Orphan continuation — repaint main cell from buffer.\n if (x > 0) {\n x = x - 1\n buffer.readCellInto(x, y, reusableCell)\n if (reusableCell.continuation || !reusableCell.wide) continue\n cell = reusableCell\n } else {\n continue\n }\n }\n\n moveCursorTo(state, x, renderY)\n emitCellAtCursor(\n state,\n x,\n renderY,\n {\n char: cell.char,\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: cell.attrs,\n wide: cell.wide,\n hyperlink: cell.hyperlink,\n },\n ctx,\n )\n // emitCellAtCursor stores buffer-relative y, but for scatter we want\n // the actual y for cross-cell continuation tracking.\n state.lastEmittedY = y\n }\n}\n","/**\n * Phase 4: Output Phase\n *\n * Diff two buffers and produce minimal ANSI output.\n *\n * Debug: Set SILVERY_DEBUG_OUTPUT=1 to log diff changes and ANSI sequences.\n */\n\nimport {\n type Style,\n type TerminalBuffer,\n type UnderlineStyle,\n VISIBLE_SPACE_ATTR_MASK,\n cellEquals as cellVisualEquals,\n colorEquals,\n createMutableCell,\n hasActiveAttrs,\n isDefaultBg,\n styleEquals,\n} from \"../buffer\"\nimport { fgColorCode, bgColorCode } from \"../ansi/sgr-codes\"\nimport type { CursorState } from \"@silvery/ag-react/hooks/useCursor\"\nimport { IncrementalRenderMismatchError } from \"../errors\"\nimport { textSized } from \"../text-sizing\"\nimport { graphemeWidth, isTextSizingEnabled } from \"../unicode\"\nimport type { CellChange } from \"./types\"\nimport { createLogger } from \"loggily\"\nimport {\n replayAnsiWithStyles,\n captureStrictFailureArtifacts as _captureArtifacts,\n verifyOutputEquivalence as _verifyOutputEquivalence,\n verifyAccumulatedOutput as _verifyAccumulatedOutput,\n verifyTerminalEquivalence as _verifyTerminalEquivalence,\n initTerminalVerifyState,\n createTerminalVerifyState,\n strictTerminalBackends,\n sgrColorEquals,\n formatColor,\n type AccumulateState,\n type TerminalVerifyState,\n} from \"./output-verify\"\n\nconst log = createLogger(\"silvery:output\")\n\nconst _env =\n typeof process !== \"undefined\" ? process.env : ({} as Record<string, string | undefined>)\nconst DEBUG_OUTPUT = !!_env.SILVERY_DEBUG_OUTPUT\nconst FULL_RENDER = !!_env.SILVERY_FULL_RENDER\nconst DEBUG_CAPTURE = !!_env.SILVERY_DEBUG_CAPTURE\nconst CAPTURE_RAW = !!_env.SILVERY_CAPTURE_RAW\n/**\n * Phase 3 hybrid-output feature flag. When set (`SILVERY_HYBRID_OUTPUT=1`)\n * and the render path can call into the new emitters (fullscreen mode +\n * buffer available), `changesToAnsi` dispatches per-row through\n * `analyzeRowDensity` + `pickEmissionMode` and the three mode-specific\n * emitters in `output-modes.ts`. Off by default during the soak period —\n * see `hub/silvery/design/v05-layout/hybrid-output.md` §8 (rollout plan).\n *\n * Read at call time (not module-load time) so integration tests can toggle\n * the flag without forcing module re-import. The cost is one `process.env`\n * lookup per frame, dominated by the surrounding diff/emit work.\n *\n * Inline mode is intentionally excluded in this phase — see design doc R4.\n */\nfunction isHybridOutputEnabled(): boolean {\n return (typeof process !== \"undefined\" ? process.env.SILVERY_HYBRID_OUTPUT : undefined) === \"1\"\n}\nlet _debugFrameCount = 0\nlet _captureRawFrameCount = 0\n\n// Re-export verification types only. `replayAnsiWithStyles` is internal —\n// tests that need it import from `./output-verify` directly. Bead:\n// km-silvery.unexport-replay-ansi-with-styles.\nexport type { StyledCell } from \"./output-verify\"\n// Wrap captureStrictFailureArtifacts to bind bufferToAnsi (avoids circular dep in output-verify.ts)\nexport function captureStrictFailureArtifacts(\n opts: Parameters<typeof _captureArtifacts>[0],\n): string {\n return _captureArtifacts({ ...opts, renderFull: opts.renderFull ?? bufferToAnsi })\n}\n\n// ============================================================================\n// Terminal Capability Flags (suppress unsupported SGR codes)\n// ============================================================================\n\nimport type { TerminalCaps } from \"../terminal-caps\"\n\n// ============================================================================\n// Output Phase Factory (per-term instance, no globals)\n// ============================================================================\n\n/**\n * Output-phase capabilities type.\n *\n * Post km-silvery.text-box-attr-props (2026-04-23):\n * `underlineStyles` is now the per-style set (not just a boolean), so the\n * output phase can downgrade individual styles — e.g. `\"curly\"` requested on\n * a terminal that only supports `\"single\"` emits plain `SGR 4` instead of\n * the unsupported `4:3`.\n *\n * Accepts either form at construction for backwards compatibility:\n * - `boolean` — back-compat shorthand. `true` = all styles supported\n * (modern terminals); `false` = only plain `SGR 4` works.\n * - `readonly UnderlineStyle[]` — per-style granular set, matches\n * `TerminalCaps.underlineStyles` directly.\n *\n * Internally the output phase always sees the array form (resolved by the\n * ctx factory). Consumers check per-style via the `supportsUnderlineStyle`\n * helper, or check \"any extended support\" via `caps.underlineStyles.length > 0`.\n */\nexport type OutputUnderlineStylesCap = boolean | readonly UnderlineStyle[]\n\n/** All five spelled-out underline styles — the full modern-terminal set. */\nconst ALL_EXTENDED_UNDERLINE_STYLES: readonly UnderlineStyle[] = [\n \"single\",\n \"double\",\n \"curly\",\n \"dotted\",\n \"dashed\",\n]\n\n/**\n * Normalize a (boolean | array) underline-styles cap to the array form used\n * by the output context.\n */\nexport function resolveUnderlineStylesCap(\n cap: OutputUnderlineStylesCap | undefined,\n): readonly UnderlineStyle[] {\n if (cap === undefined) return ALL_EXTENDED_UNDERLINE_STYLES\n if (typeof cap === \"boolean\") {\n return cap ? ALL_EXTENDED_UNDERLINE_STYLES : []\n }\n return cap\n}\n\n/**\n * Check whether a requested underline style is in the resolved cap set.\n * `\"single\"` is always supported (it's the base SGR 4), so this returns true\n * for `\"single\"` regardless of the array contents.\n */\nfunction supportsUnderlineStyle(\n styles: readonly UnderlineStyle[],\n requested: UnderlineStyle | undefined,\n): boolean {\n if (!requested) return false\n if (requested === \"single\") return true\n return styles.includes(requested)\n}\n\nexport interface OutputCaps {\n /**\n * Per-style underline support. Array form so the output phase can\n * downgrade individual unsupported styles to plain SGR 4 (single).\n * Empty array = plain SGR 4 only.\n */\n readonly underlineStyles: readonly UnderlineStyle[]\n readonly underlineColor: boolean\n /**\n * SGR 53 (overline) support. When false, the output phase skips\n * emitting SGR 53/55 — the cell attr is still packed/diffed, but no\n * escape sequence reaches the terminal. Defaults to true for modern\n * terminals (Ghostty, iTerm2, xterm with extended attrs enabled).\n */\n readonly overline: boolean\n readonly colorLevel: TerminalCaps[\"colorLevel\"]\n}\n\n// ============================================================================\n// Output Context (per-instance state, replaces module-level globals)\n// ============================================================================\n\n/**\n * Per-instance output context containing terminal capabilities, measurer,\n * caches, and per-frame viewport state. Threaded through internal functions\n * to eliminate module-level mutable state and prevent \"forgot to thread\n * parameter\" failures. Caches are per-context because SGR output depends on caps.\n *\n * Per-frame fields (mode, termRows) are set by the caller before each frame:\n * - createOutputPhase() closure sets them in scopedOutputPhase()\n * - bare outputPhase() sets them from its parameters\n */\nexport interface OutputContext {\n readonly caps: OutputCaps\n readonly measurer: OutputMeasurer | null\n readonly sgrCache: Map<string, string>\n readonly transitionCache: Map<string, string>\n /** Render mode for the current frame. Set per-frame by the output phase entry point. */\n mode: \"fullscreen\" | \"inline\"\n /** Terminal height in rows for the current frame. Caps output to prevent\n * scrollback corruption when content exceeds terminal height. Set per-frame. */\n termRows: number | undefined\n}\n\n/** Default context used by bare outputPhase() calls (full capability support, no measurer). */\nconst defaultContext: OutputContext = {\n caps: {\n underlineStyles: ALL_EXTENDED_UNDERLINE_STYLES,\n underlineColor: true,\n overline: true,\n colorLevel: \"truecolor\",\n },\n measurer: null,\n sgrCache: new Map(),\n transitionCache: new Map(),\n mode: \"fullscreen\",\n termRows: undefined,\n}\n\ninterface NativeScrollPlan {\n top: number\n height: number\n delta: number\n afterScroll: TerminalBuffer\n}\n\nconst nativeScrollPrevCell = createMutableCell()\nconst nativeScrollNextCell = createMutableCell()\n\nfunction rowsEqualWithOffset(\n prev: TerminalBuffer,\n next: TerminalBuffer,\n nextY: number,\n prevY: number,\n): boolean {\n if (nextY < 0 || nextY >= next.height || prevY < 0 || prevY >= prev.height) return false\n for (let x = 0; x < next.width; x++) {\n prev.readCellInto(x, prevY, nativeScrollPrevCell)\n next.readCellInto(x, nextY, nativeScrollNextCell)\n if (!cellVisualEquals(nativeScrollPrevCell, nativeScrollNextCell)) {\n return false\n }\n }\n return true\n}\n\nfunction detectNativeScrollPlan(\n prev: TerminalBuffer,\n next: TerminalBuffer,\n): NativeScrollPlan | null {\n if (prev.width !== next.width || prev.height !== next.height) return null\n if (next.minDirtyRow < 0 || next.maxDirtyRow < next.minDirtyRow) return null\n const top = next.minDirtyRow\n const bottom = next.maxDirtyRow\n const height = bottom - top + 1\n if (height < 4 || next.width < 4) return null\n\n let best: { delta: number; matchedRows: number } | null = null\n for (let absDelta = 1; absDelta < height; absDelta++) {\n let upMatches = true\n for (let y = top; y <= bottom - absDelta; y++) {\n if (!rowsEqualWithOffset(prev, next, y, y + absDelta)) {\n upMatches = false\n break\n }\n }\n if (upMatches) {\n const matchedRows = height - absDelta\n if (!best || matchedRows > best.matchedRows) best = { delta: absDelta, matchedRows }\n }\n\n let downMatches = true\n for (let y = top + absDelta; y <= bottom; y++) {\n if (!rowsEqualWithOffset(prev, next, y, y - absDelta)) {\n downMatches = false\n break\n }\n }\n if (downMatches) {\n const matchedRows = height - absDelta\n if (!best || matchedRows > best.matchedRows) best = { delta: -absDelta, matchedRows }\n }\n }\n\n if (!best || best.matchedRows < Math.max(3, Math.floor(height * 0.5))) return null\n const afterScroll = prev.clone()\n afterScroll.scrollRegion(0, top, next.width, height, best.delta)\n return { top, height, delta: best.delta, afterScroll }\n}\n\nfunction nativeScrollPrefix(plan: NativeScrollPlan): string {\n const top = plan.top + 1\n const bottom = plan.top + plan.height\n const amount = Math.abs(plan.delta)\n const command = plan.delta > 0 ? \"S\" : \"T\"\n return `\\x1b[${top};${bottom}r\\x1b[${top};1H\\x1b[${amount}${command}\\x1b[r`\n}\n\n/** Output phase function signature. */\nexport interface OutputPhaseFn {\n (\n prev: TerminalBuffer | null,\n next: TerminalBuffer,\n mode?: \"fullscreen\" | \"inline\",\n scrollbackOffset?: number,\n termRows?: number,\n cursorPos?: CursorState | null,\n ): string\n /** Reset inline cursor state. Used by useScrollback to clear cursor tracking on resize. */\n resetInlineState?: () => void\n /** Get the current inline cursor row (relative to render region start). -1 if unknown. */\n getInlineCursorRow?: () => number\n /** Promote frozen content to scrollback. Called by useScrollback to queue\n * frozen content for the next render — the output phase writes frozen + live\n * content in a single target.write() to avoid flicker. */\n promoteScrollback?: (frozenContent: string, frozenLineCount: number) => void\n}\n\n// ============================================================================\n// Output Phase Measurer (module-local, avoids dual-module-loading issues)\n// ============================================================================\n// bun can load the same .ts file via symlink + real path as separate module\n// instances. This means `_scopedMeasurer` set by `runWithMeasurer()` in\n// pipeline/index.ts's instance of unicode.ts is invisible to output-phase.ts's\n// instance. We avoid this by closing over the measurer in createOutputPhase()\n// and setting a module-local variable that all output-phase functions read.\n\nexport interface OutputMeasurer {\n graphemeWidth(grapheme: string): number\n readonly textSizing: boolean\n}\n\n/** Get grapheme width using the output context measurer (falls back to unicode.ts import). */\nfunction outputGraphemeWidth(g: string, ctx: OutputContext): number {\n return ctx.measurer ? ctx.measurer.graphemeWidth(g) : graphemeWidth(g)\n}\n\n/** Check if text sizing is enabled using the output context measurer. */\nfunction outputTextSizingEnabled(ctx: OutputContext): boolean {\n return ctx.measurer ? ctx.measurer.textSizing : isTextSizingEnabled()\n}\n\n/**\n * Create a scoped output phase that uses specific terminal capabilities.\n *\n * @param caps - Terminal capabilities for SGR code generation. Accepts\n * `underlineStyles` as either a boolean (back-compat) or the per-style\n * array form; see {@link OutputUnderlineStylesCap}.\n * @param measurer - Width measurer for graphemeWidth/textSizing (avoids dual-module-loading issues)\n */\nexport function createOutputPhase(\n caps: {\n underlineStyles?: OutputUnderlineStylesCap\n underlineColor?: boolean\n overline?: boolean\n colorLevel?: TerminalCaps[\"colorLevel\"]\n },\n measurer?: OutputMeasurer,\n): OutputPhaseFn {\n // Instance-scoped context — caps, measurer, and caches are all per-instance.\n // mode and termRows are set per-frame in scopedOutputPhase() below.\n // No module-level globals are read or modified.\n const ctx: OutputContext = {\n caps: {\n underlineStyles: resolveUnderlineStylesCap(caps.underlineStyles),\n underlineColor: caps.underlineColor ?? true,\n overline: caps.overline ?? true,\n colorLevel: caps.colorLevel ?? \"truecolor\",\n },\n measurer: measurer ?? null,\n sgrCache: new Map(),\n transitionCache: new Map(),\n mode: \"fullscreen\",\n termRows: undefined,\n }\n // Instance-scoped inline cursor state — persists across frames for incremental rendering.\n // Each createOutputPhase() call gets its own state, eliminating module-level globals.\n const inlineState = createInlineCursorState()\n\n // Instance-scoped accumulated ANSI state for SILVERY_STRICT_ACCUMULATE verification.\n // Tracks per-instance verification state rather than using module-level globals.\n const accState = {\n accumulatedAnsi: \"\",\n accumulateWidth: 0,\n accumulateHeight: 0,\n accumulateFrameCount: 0,\n }\n\n // Instance-scoped terminal verify state for SILVERY_STRICT_TERMINAL verification.\n const tvState = createTerminalVerifyState()\n\n // Pending scrollback promotion — queued by useScrollback, consumed by the next render.\n let pendingPromotion: { frozenContent: string; frozenLineCount: number } | null = null\n\n const fn: OutputPhaseFn = function scopedOutputPhase(\n prev: TerminalBuffer | null,\n next: TerminalBuffer,\n mode: \"fullscreen\" | \"inline\" = \"fullscreen\",\n scrollbackOffset = 0,\n termRows?: number,\n cursorPos?: CursorState | null,\n ): string {\n // Set per-frame viewport state on the context — internal functions read from ctx\n // instead of accepting mode/termRows as separate parameters.\n ctx.mode = mode\n ctx.termRows = termRows\n // Handle scrollback promotion: write frozen content + live content in one pass.\n if (pendingPromotion && mode === \"inline\") {\n const promo = pendingPromotion\n pendingPromotion = null\n return handleScrollbackPromotion(\n inlineState,\n promo.frozenContent,\n promo.frozenLineCount,\n next,\n cursorPos,\n ctx,\n tvState,\n accState,\n )\n }\n return outputPhase(\n prev,\n next,\n mode,\n scrollbackOffset,\n termRows,\n cursorPos,\n inlineState,\n ctx,\n accState,\n tvState,\n )\n }\n\n fn.resetInlineState = () => {\n Object.assign(inlineState, createInlineCursorState())\n inlineState.forceFirstRender = true\n // Clear any queued promotion — the resize handler re-emits all frozen items\n // directly, so any pending promotion from the freeze effect is redundant.\n // Without this, freeze+resize in the same frame causes duplicate frozen content.\n pendingPromotion = null\n }\n\n fn.getInlineCursorRow = () => inlineState.prevCursorRow\n\n fn.promoteScrollback = (frozenContent: string, frozenLineCount: number) => {\n if (pendingPromotion) {\n pendingPromotion.frozenContent += frozenContent\n pendingPromotion.frozenLineCount += frozenLineCount\n } else {\n pendingPromotion = { frozenContent, frozenLineCount }\n }\n }\n\n return fn\n}\n\n/**\n * Handle scrollback promotion: write frozen content + live content in a single output string.\n *\n * Instead of useScrollback writing directly to stdout (which blanks the screen and\n * causes flicker), this function builds one output string that:\n * 1. Moves cursor to the render region start (no clearing)\n * 2. Writes frozen content (each line overwrites in-place via \\x1b[K])\n * 3. Writes live content via bufferToAnsi (also with per-line \\x1b[K])\n * 4. Erases any leftover lines from the previous frame\n * 5. Positions the hardware cursor\n *\n * Result: a single target.write() with no blanking — no flicker.\n */\nfunction handleScrollbackPromotion(\n state: InlineCursorState,\n frozenContent: string,\n frozenLineCount: number,\n next: TerminalBuffer,\n cursorPos: CursorState | null | undefined,\n ctx: OutputContext,\n tvState?: TerminalVerifyState,\n accState?: AccumulateState,\n): string {\n const { termRows } = ctx\n // 1. Move cursor to render region start\n let output = \"\"\n if (state.prevCursorRow > 0) {\n output += `\\x1b[${state.prevCursorRow}A`\n }\n output += \"\\r\" // column 0, NO \\x1b[J clear\n\n // 2. Write frozen content (overwrites old content in-place, OSC markers included)\n output += frozenContent\n\n // 3. Write live content via bufferToAnsi (each line has \\x1b[K — no blanking)\n const nextContentLines = findLastContentLine(next) + 1\n const maxOutputLines = termRows != null ? Math.min(nextContentLines, termRows) : nextContentLines\n output += bufferToAnsi(next, ctx, maxOutputLines)\n\n // Total lines on-screen: frozen + live. The terminal may scroll if this exceeds\n // termRows, naturally pushing frozen lines into scrollback. No padding needed —\n // we track ALL on-screen lines so the next render can overwrite them cleanly.\n const totalOnScreen = frozenLineCount + maxOutputLines\n\n // 4. Erase leftover lines at bottom (if content shrank)\n const oldTotalLines = state.prevOutputLines\n const nextLastLine = totalOnScreen - 1\n const terminalScroll = termRows != null ? Math.max(0, totalOnScreen - termRows) : 0\n const lastOccupied = Math.max(oldTotalLines - 1 - terminalScroll, 0)\n if (lastOccupied > nextLastLine) {\n for (let y = nextLastLine + 1; y <= lastOccupied; y++) {\n output += \"\\n\\r\\x1b[K\"\n }\n const up = lastOccupied - nextLastLine\n if (up > 0) output += `\\x1b[${up}A`\n }\n\n // 5. Cursor suffix (hardware cursor positioning)\n // Cursor is at the end of live content (row totalOnScreen - 1 relative to\n // render region start). inlineCursorSuffix moves it to the useCursor position\n // within the live content area.\n output += inlineCursorSuffix(cursorPos ?? null, next, ctx)\n\n // 6. Update tracking for subsequent incremental renders.\n // Track cursor position and output lines relative to the LIVE content only.\n // Frozen content has been written as raw ANSI above the live content and is\n // now \"owned\" by the terminal — it stays on screen until natural scrolling\n // pushes it into terminal scrollback. The next render only needs to cursor-up\n // to the start of the live content area, not past the frozen content.\n //\n // This is critical for real terminals where pre-existing content (shell prompt,\n // direnv output) sits above the app. If prevCursorRow included frozenLineCount,\n // the cursor-up would overshoot into the shell prompt area, clearing it.\n let startLine = 0\n if (termRows != null && nextContentLines > termRows) startLine = nextContentLines - termRows\n state.prevBuffer = next\n\n // Cursor row within the LIVE content area only (not including frozen lines).\n // inlineCursorSuffix already positioned the cursor within the live content.\n if (cursorPos?.visible) {\n const visibleRow = cursorPos.y - startLine\n state.prevCursorRow =\n visibleRow >= 0 && visibleRow < maxOutputLines ? visibleRow : maxOutputLines - 1\n } else {\n state.prevCursorRow = maxOutputLines - 1\n }\n state.prevOutputLines = maxOutputLines\n\n // Realign STRICT verification state. Scrollback promotion writes frozen\n // content + live content as a single output, fundamentally remapping the\n // render region — re-initialize verification with a fresh fullscreen\n // rendering of `next` so subsequent incremental frames have a consistent\n // baseline. (Frozen content above the live render region is \"owned by the\n // terminal\" and not part of the buffer-equivalence invariant.)\n if (tvState || accState) {\n if ((tvState && tvState.backends.length > 0) || (accState && isStrictAccumulate())) {\n const savedMode = ctx.mode\n ctx.mode = \"fullscreen\"\n const fsFresh = bufferToAnsi(next, ctx)\n if (accState && isStrictAccumulate()) {\n accState.accumulatedAnsi = fsFresh\n accState.accumulateWidth = next.width\n accState.accumulateHeight = next.height\n accState.accumulateFrameCount = 0\n }\n if (tvState && tvState.backends.length > 0) {\n initTerminalVerifyState(tvState, next.width, next.height, fsFresh)\n }\n ctx.mode = savedMode\n }\n }\n\n return output\n}\n\n// These use getters so they can be set after module load (e.g., in test files).\n// SILVERY_STRICT enables buffer + output checks (per-frame), including vt100 output verification.\n// SILVERY_STRICT_ACCUMULATE is separate — it replays ALL frames (O(N²)) and is opt-in only.\n// Note: \"0\" and \"false\" are treated as disabled, consistent with renderer.ts strictMode check.\nfunction isStrictOutput(): boolean {\n if (typeof process === \"undefined\") return false\n const val = process.env.SILVERY_STRICT\n return !!val && val !== \"0\" && val !== \"false\"\n}\nfunction isStrictAccumulate(): boolean {\n if (typeof process === \"undefined\") return false\n const val = process.env.SILVERY_STRICT_ACCUMULATE\n return !!val && val !== \"0\" && val !== \"false\"\n}\n\n/** Default accumulate state used by bare outputPhase() calls. */\nconst defaultAccState: AccumulateState = {\n accumulatedAnsi: \"\",\n accumulateWidth: 0,\n accumulateHeight: 0,\n accumulateFrameCount: 0,\n}\n\n/** Default terminal verify state used by bare outputPhase() calls. */\nconst defaultTerminalVerifyState = createTerminalVerifyState()\n\n// ============================================================================\n// Inline Mode: Inter-frame Cursor Tracking (instance-scoped)\n// ============================================================================\n\n/**\n * Mutable state for inline mode inter-frame cursor tracking.\n * Captured in the createOutputPhase() closure — no module-level globals.\n */\ninterface InlineCursorState {\n /** Row within render region after last inline frame's cursor suffix. -1 = unknown. */\n prevCursorRow: number\n /** Total output lines rendered in last frame. Used to clear old content on resize. */\n prevOutputLines: number\n /** Previous frame's buffer — used for incremental rendering when runtime invalidates (resize). */\n prevBuffer: TerminalBuffer | null\n /** When true, the next inline render treats prev as null (first-render path).\n * Set by resetInlineState() after useScrollback clears and re-emits frozen items. */\n forceFirstRender: boolean\n}\n\n/** Create fresh inline cursor state (unknown position → first call falls back to full render). */\nfunction createInlineCursorState(): InlineCursorState {\n return {\n prevCursorRow: -1,\n prevOutputLines: 0,\n prevBuffer: null,\n forceFirstRender: false,\n }\n}\n\n/**\n * Update cursor tracking after an inline render frame.\n * Records where the terminal cursor ends up after inlineCursorSuffix().\n */\nfunction updateInlineCursorRow(\n state: InlineCursorState,\n cursorPos: CursorState | null | undefined,\n maxOutputLines: number,\n startLine: number,\n): void {\n if (cursorPos?.visible) {\n const visibleRow = cursorPos.y - startLine\n state.prevCursorRow =\n visibleRow >= 0 && visibleRow < maxOutputLines ? visibleRow : maxOutputLines - 1\n } else {\n // Cursor hidden: cursor stays at end of last content line\n state.prevCursorRow = maxOutputLines - 1\n }\n state.prevOutputLines = maxOutputLines\n}\n\n/**\n * Wrap a cell character in OSC 66 if text sizing is enabled and the cell is\n * wide. OSC 66 tells the terminal to render the character in exactly `width`\n * cells, matching the layout engine's measurement.\n *\n * Previously this only wrapped specific categories (PUA, text-presentation\n * emoji, flag emoji) — a whack-a-mole approach that missed new categories\n * as Unicode evolved. Now wraps ALL wide chars unconditionally: if the buffer\n * says width 2, the terminal is told width 2. CJK chars don't strictly need\n * it (terminals agree on their width), but the ~8-byte overhead per wide char\n * is negligible and eliminates any future width disagreement.\n */\nfunction wrapTextSizing(char: string, wide: boolean, ctx: OutputContext): string {\n if (!wide || !outputTextSizingEnabled(ctx)) return char\n return textSized(char, 2)\n}\n\n/**\n * Internal: exported for use by output-modes.ts (hybrid output emitters).\n * Not part of the public API — do not use outside the pipeline.\n */\nexport const _internalWrapTextSizing = wrapTextSizing\n\n// ============================================================================\n// Style Interning + SGR Cache\n// ============================================================================\n\n// SGR caches are now per-OutputContext (see OutputContext interface).\n// This is correct because SGR output depends on caps (underlineStyles,\n// underlineColor), so caches populated under one caps configuration\n// would produce wrong results under a different one.\n\n/**\n * Serialize a Style into a cache key string.\n * Fast path: most styles are simple (256-color or null fg/bg, no true color).\n */\nfunction styleToKey(style: Style): string {\n const fg = style.fg\n const bg = style.bg\n const attrs = style.attrs\n\n // Fast path: common case of simple colors + few attrs\n let key = \"\"\n\n // fg\n if (fg === null) {\n key = \"n\"\n } else if (typeof fg === \"number\") {\n key = `${fg}`\n } else {\n key = `r${fg.r},${fg.g},${fg.b}`\n }\n\n key += \"|\"\n\n // bg\n if (bg === null) {\n key += \"n\"\n } else if (typeof bg === \"number\") {\n key += `${bg}`\n } else {\n key += `r${bg.r},${bg.g},${bg.b}`\n }\n\n // attrs packed as bitmask for speed\n let attrBits = 0\n if (attrs.bold) attrBits |= 1\n if (attrs.dim) attrBits |= 2\n if (attrs.italic) attrBits |= 4\n if (attrs.underline) attrBits |= 8\n if (attrs.inverse) attrBits |= 16\n if (attrs.strikethrough) attrBits |= 32\n if (attrs.blink) attrBits |= 64\n if (attrs.hidden) attrBits |= 128\n if (attrs.overline) attrBits |= 256\n\n key += `|${attrBits}`\n\n // Underline style (rare)\n if (attrs.underlineStyle) {\n key += `|u${attrs.underlineStyle}`\n }\n\n // Underline color (rare)\n const ul = style.underlineColor\n if (ul !== null && ul !== undefined) {\n if (typeof ul === \"number\") {\n key += `|l${ul}`\n } else {\n key += `|lr${ul.r},${ul.g},${ul.b}`\n }\n }\n\n // Hyperlink URL (rare)\n if (style.hyperlink) {\n key += `|h${style.hyperlink}`\n }\n\n return key\n}\n\n/**\n * Get the SGR escape string for a style, using the intern cache.\n * Cache hit: O(1) Map lookup + key serialization.\n * Cache miss: builds the SGR string and caches it.\n */\nfunction cachedStyleToAnsi(style: Style, ctx: OutputContext): string {\n const key = styleToKey(style)\n let sgr = ctx.sgrCache.get(key)\n if (sgr !== undefined) return sgr\n sgr = styleToAnsi(style, ctx)\n ctx.sgrCache.set(key, sgr)\n if (ctx.sgrCache.size > 1000) ctx.sgrCache.clear()\n return sgr\n}\n\n/**\n * Compute the minimal SGR transition between two styles.\n *\n * When oldStyle is null (first cell or after reset), falls through to\n * full SGR generation via cachedStyleToAnsi. Otherwise, diffs attribute\n * by attribute and emits only changed SGR codes. Caches the result for\n * each (oldKey, newKey) pair.\n */\nfunction styleTransition(oldStyle: Style | null, newStyle: Style, ctx: OutputContext): string {\n // First cell or after reset — full generation\n if (!oldStyle) return cachedStyleToAnsi(newStyle, ctx)\n\n // Same style — nothing to emit\n if (styleEquals(oldStyle, newStyle)) return \"\"\n\n // Check transition cache\n const oldKey = styleToKey(oldStyle)\n const newKey = styleToKey(newStyle)\n const cacheKey = `${oldKey}\\x00${newKey}`\n const cached = ctx.transitionCache.get(cacheKey)\n if (cached !== undefined) return cached\n\n // Build minimal diff\n const codes: string[] = []\n\n // Check attributes that can only be \"turned off\" via reset or specific off-codes.\n // If an attribute was on and is now off, we need either the off-code or a full reset.\n const oa = oldStyle.attrs\n const na = newStyle.attrs\n\n // Bold and dim share SGR 22 as their off-code, so handle them together\n // to avoid emitting duplicate codes.\n const boldChanged = Boolean(oa.bold) !== Boolean(na.bold)\n const dimChanged = Boolean(oa.dim) !== Boolean(na.dim)\n if (boldChanged || dimChanged) {\n const boldOff = boldChanged && !na.bold\n const dimOff = dimChanged && !na.dim\n if (boldOff || dimOff) {\n // SGR 22 resets both bold and dim\n codes.push(\"22\")\n // Re-enable whichever should stay on\n if (na.bold) codes.push(\"1\")\n if (na.dim) codes.push(\"2\")\n } else {\n // Only turning attributes on\n if (boldChanged && na.bold) codes.push(\"1\")\n if (dimChanged && na.dim) codes.push(\"2\")\n }\n }\n if (Boolean(oa.italic) !== Boolean(na.italic)) {\n codes.push(na.italic ? \"3\" : \"23\")\n }\n\n // Underline: compare both underline flag and underlineStyle. Per-style\n // capability downgrade — unsupported styles fall back to plain SGR 4\n // (single) instead of silently emitting unsupported 4:x sequences.\n const oldUl = Boolean(oa.underline)\n const newUl = Boolean(na.underline)\n const oldUlStyle = oa.underlineStyle ?? false\n const newUlStyle = na.underlineStyle ?? false\n if (oldUl !== newUl || oldUlStyle !== newUlStyle) {\n const effectiveStyle = supportsUnderlineStyle(ctx.caps.underlineStyles, na.underlineStyle)\n ? na.underlineStyle\n : newUl || na.underlineStyle\n ? \"single\"\n : undefined\n const sgrSub = underlineStyleToSgr(effectiveStyle)\n if (sgrSub !== null && sgrSub !== 0 && sgrSub !== 1) {\n codes.push(`4:${sgrSub}`)\n } else if (newUl || effectiveStyle) {\n codes.push(\"4\")\n } else {\n codes.push(\"24\")\n }\n }\n\n if (Boolean(oa.inverse) !== Boolean(na.inverse)) {\n codes.push(na.inverse ? \"7\" : \"27\")\n }\n if (Boolean(oa.hidden) !== Boolean(na.hidden)) {\n codes.push(na.hidden ? \"8\" : \"28\")\n }\n if (Boolean(oa.strikethrough) !== Boolean(na.strikethrough)) {\n codes.push(na.strikethrough ? \"9\" : \"29\")\n }\n // Overline (SGR 53/55). Skip emit when terminal doesn't advertise support —\n // the cell attr is still packed and diffed, but we suppress the escape bytes\n // so older terminals don't render the literal `[53m` sequence as text.\n if (ctx.caps.overline && Boolean(oa.overline) !== Boolean(na.overline)) {\n codes.push(na.overline ? \"53\" : \"55\")\n }\n if (Boolean(oa.blink) !== Boolean(na.blink)) {\n codes.push(na.blink ? \"5\" : \"25\")\n }\n\n // Foreground color — stripped at monochrome tier (hierarchy via attrs)\n if (!colorEquals(oldStyle.fg, newStyle.fg)) {\n if (newStyle.fg === null || ctx.caps.colorLevel === \"mono\") {\n codes.push(\"39\")\n } else {\n codes.push(fgColorCode(newStyle.fg))\n }\n }\n\n // Background color — stripped at monochrome tier (hierarchy via attrs)\n if (!colorEquals(oldStyle.bg, newStyle.bg)) {\n if (newStyle.bg === null || ctx.caps.colorLevel === \"mono\") {\n codes.push(\"49\")\n } else {\n codes.push(bgColorCode(newStyle.bg))\n }\n }\n\n // Underline color (SGR 58/59) — skip for terminals that don't support it\n if (ctx.caps.underlineColor && !colorEquals(oldStyle.underlineColor, newStyle.underlineColor)) {\n if (newStyle.underlineColor === null || newStyle.underlineColor === undefined) {\n // SGR 59 resets underline color\n codes.push(\"59\")\n } else if (typeof newStyle.underlineColor === \"number\") {\n codes.push(`58;5;${newStyle.underlineColor}`)\n } else {\n codes.push(\n `58;2;${newStyle.underlineColor.r};${newStyle.underlineColor.g};${newStyle.underlineColor.b}`,\n )\n }\n }\n\n // Hyperlink (OSC 8) is handled separately in the render loops, not here.\n\n let result: string\n if (codes.length === 0) {\n // Styles differ but no SGR codes emitted (e.g., hyperlink-only change).\n // Fall back to full generation to be safe.\n result = cachedStyleToAnsi(newStyle, ctx)\n } else {\n result = `\\x1b[${codes.join(\";\")}m`\n }\n\n ctx.transitionCache.set(cacheKey, result)\n if (ctx.transitionCache.size > 1000) ctx.transitionCache.clear()\n return result\n}\n\n/**\n * Internal: exported for use by output-modes.ts (hybrid output emitters).\n * Not part of the public API — do not use outside the pipeline.\n */\nexport const _internalStyleTransition = styleTransition\n\n/**\n * Map underline style to SGR 4:x subparameter.\n */\nfunction underlineStyleToSgr(style: UnderlineStyle | undefined): number | null {\n switch (style) {\n case false:\n return 0 // SGR 4:0 = no underline\n case \"single\":\n return 1 // SGR 4:1 = single underline\n case \"double\":\n return 2 // SGR 4:2 = double underline\n case \"curly\":\n return 3 // SGR 4:3 = curly underline\n case \"dotted\":\n return 4 // SGR 4:4 = dotted underline\n case \"dashed\":\n return 5 // SGR 4:5 = dashed underline\n default:\n return null // Use simple SGR 4 or no underline\n }\n}\n\n/**\n * Diff two buffers and produce minimal ANSI output.\n *\n * @param prev Previous buffer (null on first render)\n * @param next Current buffer\n * @param mode Render mode: fullscreen or inline\n * @param scrollbackOffset Lines written to stdout between renders (inline mode)\n * @param termRows Terminal height in rows (inline mode) — caps output to prevent\n * scrollback corruption when content exceeds terminal height\n * @returns ANSI escape sequence string\n */\nexport function outputPhase(\n prev: TerminalBuffer | null,\n next: TerminalBuffer,\n mode: \"fullscreen\" | \"inline\" = \"fullscreen\",\n scrollbackOffset = 0,\n termRows?: number,\n cursorPos?: CursorState | null,\n _inlineState?: InlineCursorState,\n _ctx?: OutputContext,\n _accState?: AccumulateState,\n _tvState?: TerminalVerifyState,\n): string {\n // Bare outputPhase() calls use a fresh cursor state each time.\n // prevCursorRow = -1 means incremental rendering always falls back to full render.\n // Instance-scoped state (via createOutputPhase) enables incremental across frames.\n const inlineState = _inlineState ?? createInlineCursorState()\n const ctx = _ctx ?? defaultContext\n const accState = _accState ?? defaultAccState\n\n // Set per-frame viewport state on the context — internal functions read from ctx.\n // For bare outputPhase() calls (no createOutputPhase), this updates defaultContext\n // each call. For scoped calls, ctx.mode/termRows were already set by the closure.\n ctx.mode = mode\n ctx.termRows = termRows\n const tvState = _tvState ?? defaultTerminalVerifyState\n\n // After resetInlineState (e.g., useScrollback cleared and re-emitted frozen items),\n // treat the next render as a first render. The cursor is at a known position\n // (right after the re-emitted frozen items) and prev is stale.\n if (mode === \"inline\" && inlineState.forceFirstRender) {\n inlineState.forceFirstRender = false\n prev = null // may already be null (runtime.invalidate on resize), consume flag regardless\n }\n\n // First render: output entire buffer\n if (!prev) {\n // Accumulate timing for full-render path\n const fullRenderAcc = (globalThis as any).__silvery_bench_output_detail\n if (fullRenderAcc) {\n fullRenderAcc.fullRenderCalls = (fullRenderAcc.fullRenderCalls ?? 0) + 1\n fullRenderAcc.fullRenderCells =\n (fullRenderAcc.fullRenderCells ?? 0) + next.width * next.height\n }\n // Inline mode resize optimization: if the runtime invalidated prevBuffer (resize)\n // but we have a stored buffer with matching dimensions, use incremental rendering\n // instead of clear+full render. This avoids wiping content when the buffer is unchanged\n // (e.g., content narrower than both old and new terminal widths).\n if (mode === \"inline\" && inlineState.prevBuffer && inlineState.prevCursorRow >= 0) {\n const stored = inlineState.prevBuffer\n if (stored.width === next.width && stored.height === next.height) {\n // Dimensions match — use incremental rendering (skip clear entirely)\n inlineState.prevBuffer = next\n return inlineIncrementalRender(\n inlineState,\n stored,\n next,\n scrollbackOffset,\n cursorPos,\n ctx,\n tvState,\n accState,\n )\n }\n }\n\n // Cap output to terminal height to prevent scroll desync.\n // In inline mode: prevents scrollback corruption (cursor-up clamped at row 0).\n // In fullscreen mode: prevents terminal scroll that desynchronizes prevBuffer\n // from actual terminal state, causing ghost pixels on subsequent incremental renders.\n const tFullStart = performance.now()\n const firstOutput = bufferToAnsi(next, ctx, termRows)\n const tFullEnd = performance.now()\n if (fullRenderAcc) {\n fullRenderAcc.fullRenderMs = (fullRenderAcc.fullRenderMs ?? 0) + (tFullEnd - tFullStart)\n fullRenderAcc.fullRenderBytes = (fullRenderAcc.fullRenderBytes ?? 0) + firstOutput.length\n }\n // For inline first render, append cursor positioning and initialize tracking\n if (mode === \"inline\") {\n const firstContentLines = findLastContentLine(next) + 1\n const firstMaxOutput =\n termRows != null ? Math.min(firstContentLines, termRows) : firstContentLines\n let firstStartLine = 0\n if (termRows != null && firstContentLines > termRows)\n firstStartLine = firstContentLines - termRows\n\n // Resize: clear the entire visible screen and re-render.\n // Terminal reflow is unpredictable — lines wrap differently based on content,\n // unicode, wrap points. Rather than guessing cursor-up distances, overshoot:\n // ESC[nA is clamped at row 0 of the visible screen (can't touch scrollback),\n // so using termRows is safe. Frozen scrollback content above is preserved.\n let prefix = \"\"\n if (inlineState.prevCursorRow >= 0) {\n const clearDistance =\n termRows ?? Math.max(inlineState.prevCursorRow, inlineState.prevOutputLines - 1)\n if (clearDistance > 0) {\n prefix += `\\x1b[${clearDistance}A`\n }\n prefix += \"\\r\\x1b[J\" // column 0, clear from cursor to end of screen\n }\n\n // Initialize STRICT verification states using a FULLSCREEN-mode rendering\n // of the buffer. The persistent emulators (xterm/ghostty) and accumulated\n // ANSI tracker only verify buffer-diff correctness — they don't need to\n // mirror the terminal's actual cursor-relative state. Using fullscreen\n // output (absolute CUP positioning) gives a canonical reference frame\n // unaffected by inline cursor management (relative positioning,\n // scrollback promotion, prevCursorRow tracking). See the matching block\n // in inlineIncrementalRender for the per-frame counterpart.\n if (isStrictAccumulate() || tvState.backends.length > 0) {\n const savedMode = ctx.mode\n ctx.mode = \"fullscreen\"\n const fsFirstOutput = bufferToAnsi(next, ctx)\n if (isStrictAccumulate()) {\n accState.accumulatedAnsi = fsFirstOutput\n accState.accumulateWidth = next.width\n accState.accumulateHeight = next.height\n accState.accumulateFrameCount = 0\n }\n if (tvState.backends.length > 0) {\n initTerminalVerifyState(tvState, next.width, next.height, fsFirstOutput)\n }\n ctx.mode = savedMode\n }\n\n inlineState.prevBuffer = next\n updateInlineCursorRow(inlineState, cursorPos, firstMaxOutput, firstStartLine)\n return prefix + firstOutput + inlineCursorSuffix(cursorPos ?? null, next, ctx)\n }\n if (isStrictAccumulate()) {\n accState.accumulatedAnsi = firstOutput\n accState.accumulateWidth = next.width\n accState.accumulateHeight = next.height\n accState.accumulateFrameCount = 0\n }\n if (tvState.backends.length > 0) {\n initTerminalVerifyState(tvState, next.width, next.height, firstOutput)\n }\n if (CAPTURE_RAW) {\n try {\n const fs = require(\"fs\")\n _captureRawFrameCount = 0\n // Write initial render with frame separator\n fs.writeFileSync(\"/tmp/silvery-raw.ansi\", firstOutput)\n fs.writeFileSync(\n \"/tmp/silvery-raw-frames.jsonl\",\n JSON.stringify({\n frame: 0,\n type: \"full\",\n bytes: firstOutput.length,\n width: next.width,\n height: next.height,\n }) + \"\\n\",\n )\n } catch {}\n }\n return firstOutput\n }\n\n // Inline mode: use incremental rendering when safe, fall back to full render.\n if (mode === \"inline\") {\n inlineState.prevBuffer = next\n return inlineIncrementalRender(\n inlineState,\n prev,\n next,\n scrollbackOffset,\n cursorPos,\n ctx,\n tvState,\n accState,\n )\n }\n\n // SILVERY_FULL_RENDER: bypass incremental diff, always render full buffer.\n // Use to diagnose garbled rendering — if FULL_RENDER fixes it, the bug\n // is in changesToAnsi (diff → ANSI serialization).\n if (FULL_RENDER) {\n return bufferToAnsi(next, ctx, termRows)\n }\n\n // Dimension change: fall back to full render.\n // When prev and next buffers have different dimensions (e.g., terminal resize\n // without prevBuffer invalidation, or test renderer dimension changes),\n // incremental diff produces CUP sequences targeting positions beyond the\n // current terminal bounds. Terminals clamp out-of-bounds CUP to the last\n // valid row/column, causing stale cells from the diff's shrink-region clears\n // to overwrite valid content at the terminal edge.\n if (prev.width !== next.width || prev.height !== next.height) {\n return bufferToAnsi(next, ctx, termRows)\n }\n\n // Fullscreen mode: diff and emit only changes\n const tDiff0 = performance.now()\n const { pool, count: rawCount } = diffBuffers(prev, next)\n const tDiff1 = performance.now()\n\n // Filter out changes beyond terminal height to prevent CUP targeting rows\n // past the terminal, which causes scrolling and prevBuffer desync.\n let count = rawCount\n if (termRows != null) {\n let writeIdx = 0\n for (let i = 0; i < rawCount; i++) {\n if (pool[i]!.y < termRows) {\n pool[writeIdx++] = pool[i]!\n }\n }\n count = writeIdx\n }\n\n if (DEBUG_OUTPUT) {\n log.error?.(\n `diffBuffers: ${count} changes${rawCount !== count ? ` (${rawCount - count} clamped beyond termRows)` : \"\"}`,\n )\n const debugLimit = Math.min(count, 10)\n for (let i = 0; i < debugLimit; i++) {\n const change = pool[i]!\n log.error?.(` (${change.x},${change.y}): \"${change.cell.char}\"`)\n }\n if (count > 10) {\n log.error?.(` ... and ${count - 10} more`)\n }\n }\n\n if (count === 0) {\n // Accumulate timing even for zero-change frames\n const acc = (globalThis as any).__silvery_bench_output_detail\n if (acc) {\n acc.diffMs += tDiff1 - tDiff0\n acc.calls += 1\n }\n return \"\" // No changes\n }\n\n // Wide characters are handled atomically in changesToAnsi():\n // - Wide char main cells emit the character and advance cursor by 2\n // - Continuation cells are skipped (handled with their main cell)\n // - Orphaned continuation cells (main cell unchanged) trigger a\n // re-emit of the main cell from the buffer\n const tAnsi0 = performance.now()\n const nativeScrollPlan = ctx.mode === \"fullscreen\" ? detectNativeScrollPlan(prev, next) : null\n let incrOutput: string\n if (nativeScrollPlan) {\n const { pool: nativePool, count: nativeCount } = diffBuffers(nativeScrollPlan.afterScroll, next)\n let filteredNativeCount = nativeCount\n if (termRows != null) {\n let writeIdx = 0\n for (let i = 0; i < nativeCount; i++) {\n if (nativePool[i]!.y < termRows) {\n nativePool[writeIdx++] = nativePool[i]!\n }\n }\n filteredNativeCount = writeIdx\n }\n incrOutput =\n nativeScrollPrefix(nativeScrollPlan) +\n (filteredNativeCount === 0\n ? \"\"\n : changesToAnsi(nativePool, filteredNativeCount, ctx, next, 0, Infinity, prev).output)\n } else {\n incrOutput = changesToAnsi(pool, count, ctx, next, 0, Infinity, prev).output\n }\n const tAnsi1 = performance.now()\n\n // Accumulate output-phase sub-timing for benchmarks\n const outputDetailAcc = (globalThis as any).__silvery_bench_output_detail\n if (outputDetailAcc) {\n outputDetailAcc.diffMs += tDiff1 - tDiff0\n outputDetailAcc.ansiMs += tAnsi1 - tAnsi0\n outputDetailAcc.calls += 1\n outputDetailAcc.totalChanges += count\n // Count dirty rows\n let dirtyRowCount = 0\n const minRow = next.minDirtyRow\n const maxRow = next.maxDirtyRow\n if (minRow >= 0) {\n for (let r = minRow; r <= maxRow; r++) {\n if (next.isRowDirty(r)) dirtyRowCount++\n }\n }\n outputDetailAcc.dirtyRows += dirtyRowCount\n outputDetailAcc.outputBytes += incrOutput.length\n }\n\n // Log output sizes when debug or strict-accumulate is enabled\n if (DEBUG_OUTPUT || isStrictAccumulate()) {\n const bytes = Buffer.byteLength(incrOutput)\n try {\n const fs = require(\"fs\")\n fs.appendFileSync(\n \"/tmp/silvery-sizes.log\",\n `changesToAnsi: ${count} changes, ${bytes} bytes\\n`,\n )\n } catch {}\n }\n\n // Debug capture: write both incremental and fresh ANSI to files for comparison.\n if (DEBUG_CAPTURE) {\n _debugFrameCount++\n try {\n const fs = require(\"fs\")\n const freshOutput = bufferToAnsi(next, ctx)\n const freshPrev = prev ? bufferToAnsi(prev, ctx) : \"\"\n // Replay incremental on top of fresh prev\n const w = Math.max(prev?.width ?? next.width, next.width)\n const h = Math.max(prev?.height ?? next.height, next.height)\n const screenIncr = replayAnsiWithStyles(w, h, freshPrev + incrOutput, ctx)\n const screenFresh = replayAnsiWithStyles(w, h, freshOutput, ctx)\n // Find first mismatch\n let mismatchInfo = \"\"\n for (let y = 0; y < h && !mismatchInfo; y++) {\n for (let x = 0; x < w && !mismatchInfo; x++) {\n const ic = screenIncr[y]?.[x]\n const fc = screenFresh[y]?.[x]\n if (\n ic &&\n fc &&\n (ic.char !== fc.char || !sgrColorEquals(ic.fg, fc.fg) || !sgrColorEquals(ic.bg, fc.bg))\n ) {\n mismatchInfo = `MISMATCH at (${x},${y}): incr='${ic.char}' fresh='${fc.char}' incrFg=${formatColor(ic.fg)} freshFg=${formatColor(fc.fg)} incrBg=${formatColor(ic.bg)} freshBg=${formatColor(fc.bg)}`\n // Show row context\n const incrRow = screenIncr[y]!.map((c) => c.char).join(\"\")\n const freshRow = screenFresh[y]!.map((c) => c.char).join(\"\")\n mismatchInfo += `\\n incr row ${y}: ${incrRow.slice(Math.max(0, x - 20), x + 40)}\\n fresh row ${y}: ${freshRow.slice(Math.max(0, x - 20), x + 40)}`\n }\n }\n }\n const status = mismatchInfo || \"MATCH\"\n fs.appendFileSync(\n \"/tmp/silvery-capture.log\",\n `Frame ${_debugFrameCount}: ${count} changes, ${status}\\n`,\n )\n if (mismatchInfo) {\n fs.writeFileSync(`/tmp/silvery-incr-${_debugFrameCount}.ansi`, freshPrev + incrOutput)\n fs.writeFileSync(`/tmp/silvery-fresh-${_debugFrameCount}.ansi`, freshOutput)\n fs.appendFileSync(\n \"/tmp/silvery-capture.log\",\n ` Saved ANSI files: /tmp/silvery-incr-${_debugFrameCount}.ansi and /tmp/silvery-fresh-${_debugFrameCount}.ansi\\n`,\n )\n }\n } catch (e) {\n try {\n require(\"fs\").appendFileSync(\n \"/tmp/silvery-capture.log\",\n `Frame ${_debugFrameCount}: ERROR ${e}\\n`,\n )\n } catch {}\n }\n }\n\n // vt100 output verification: verify that the incremental ANSI output produces\n // the same visible terminal state as a fresh render. Uses the internal\n // replayAnsiWithStyles parser (stateless). Enabled by SILVERY_STRICT or\n // SILVERY_STRICT_TERMINAL containing \"vt100\".\n if (isStrictOutput() || tvState.hasVt100) {\n _verifyOutputEquivalence(\n prev,\n next,\n incrOutput,\n ctx,\n bufferToAnsi,\n outputGraphemeWidth,\n outputTextSizingEnabled,\n )\n }\n\n // SILVERY_STRICT_ACCUMULATE: verify that the accumulated output from ALL frames\n // produces the same terminal state as a fresh render of the current buffer.\n // Catches compounding errors that per-frame verification misses.\n if (isStrictAccumulate()) {\n accState.accumulatedAnsi += incrOutput\n accState.accumulateFrameCount++\n _verifyAccumulatedOutput(next, ctx, accState, bufferToAnsi)\n }\n\n // SILVERY_STRICT_TERMINAL (xterm/ghostty backends): verify via independent\n // terminal emulators that the cumulative incremental ANSI output produces the\n // same terminal state as a fresh full render. Unlike the vt100 backend (which\n // uses replayAnsiWithStyles — the same ANSI parser as the output generator),\n // these feed output through real terminal emulators, catching bugs where our\n // parser and generator agree but a real terminal disagrees (e.g., OSC 66, wide\n // char cursor drift, buffer overflow scrolling).\n if (tvState.backends.length > 0 && (tvState.terminal || tvState.ghosttyTerminal)) {\n tvState.frameCount++\n _verifyTerminalEquivalence(tvState, incrOutput, next, ctx, bufferToAnsi)\n }\n\n if (CAPTURE_RAW) {\n try {\n const fs = require(\"fs\")\n _captureRawFrameCount++\n // Append output to cumulative ANSI file\n fs.appendFileSync(\"/tmp/silvery-raw.ansi\", incrOutput)\n // Also save the fresh render of this frame for comparison\n const freshOutput = bufferToAnsi(next, ctx)\n fs.writeFileSync(`/tmp/silvery-raw-fresh-${_captureRawFrameCount}.ansi`, freshOutput)\n fs.appendFileSync(\n \"/tmp/silvery-raw-frames.jsonl\",\n JSON.stringify({\n frame: _captureRawFrameCount,\n type: \"incremental\",\n changes: count,\n bytes: incrOutput.length,\n width: next.width,\n height: next.height,\n }) + \"\\n\",\n )\n } catch {}\n }\n\n return incrOutput\n}\n\n/**\n * Check if a line has any non-space content or styling.\n * A row with only spaces but with background color or other styling\n * (bold, inverse, underline, etc.) is visually meaningful.\n */\nfunction lineHasContent(buffer: TerminalBuffer, y: number): boolean {\n for (let x = 0; x < buffer.width; x++) {\n const ch = buffer.getCellChar(x, y)\n if (ch !== \" \" && ch !== \"\") return true\n // Styled blank cells are visually meaningful:\n // - background color (colored spacer rows)\n // - inverse (visible block of fg color)\n // - underline (visible line under space)\n // - strikethrough (visible line through space)\n const bg = buffer.getCellBg(x, y)\n if (bg !== null) return true\n if (buffer.getCellAttrs(x, y) & VISIBLE_SPACE_ATTR_MASK) return true\n }\n return false\n}\n\n/**\n * Find the last line with content in the buffer.\n */\nfunction findLastContentLine(buffer: TerminalBuffer): number {\n for (let y = buffer.height - 1; y >= 0; y--) {\n if (lineHasContent(buffer, y)) {\n return y\n }\n }\n return 0 // At least render first line\n}\n\n/**\n * Compute the ANSI suffix that positions the real terminal cursor for inline mode.\n *\n * After inline rendering, the terminal cursor sits at the end of the last\n * content line. If a component used useCursor(), we move the cursor to\n * that position (relative to the rendered output). Otherwise we just show\n * the cursor at its current position.\n *\n * @param cursorPos The cursor state from useCursor() (or null if none)\n * @param buffer The rendered buffer\n * @param ctx Output context (termRows read from ctx.termRows)\n */\nfunction inlineCursorSuffix(\n cursorPos: CursorState | null | undefined,\n buffer: TerminalBuffer,\n ctx: OutputContext,\n): string {\n const { termRows } = ctx\n if (!cursorPos?.visible) {\n // No active cursor — hide it\n return \"\\x1b[?25l\"\n }\n\n // Determine the visible row range (same logic as bufferToAnsi for inline)\n const lastContentLine = findLastContentLine(buffer)\n const maxLine = lastContentLine\n let startLine = 0\n const maxOutputLines =\n termRows != null ? Math.min(lastContentLine + 1, termRows) : lastContentLine + 1\n if (termRows != null && maxLine >= termRows) {\n startLine = maxLine - termRows + 1\n }\n\n // Convert absolute buffer cursor position to visible row index\n const visibleRow = cursorPos.y - startLine\n if (visibleRow < 0 || visibleRow >= maxOutputLines) {\n // Cursor is outside the visible area (scrolled off) — hide it\n return \"\\x1b[?25l\"\n }\n\n // After rendering, the terminal cursor is at the end of the last output line.\n // The last output line is at visible row (maxOutputLines - 1).\n const currentRow = maxOutputLines - 1\n const rowDelta = currentRow - visibleRow\n\n let suffix = \"\"\n // Move up to the correct row\n if (rowDelta > 0) {\n suffix += `\\x1b[${rowDelta}A`\n }\n // Move to column 0, then right to the correct column\n suffix += \"\\r\"\n if (cursorPos.x > 0) {\n suffix += `\\x1b[${cursorPos.x}C`\n }\n // Show cursor\n suffix += \"\\x1b[?25h\"\n return suffix\n}\n\n/**\n * Incremental rendering for inline mode.\n *\n * When conditions are safe (no external writes, dimensions unchanged),\n * diffs prev/next buffers and emits only changed cells using relative\n * cursor positioning. Falls back to full render otherwise.\n *\n * This reduces output from ~5,848 bytes (full re-render at 50 items)\n * to ~50-100 bytes per keystroke, matching fullscreen efficiency.\n */\nfunction inlineIncrementalRender(\n state: InlineCursorState,\n prev: TerminalBuffer,\n next: TerminalBuffer,\n scrollbackOffset: number,\n cursorPos?: CursorState | null,\n ctx: OutputContext = defaultContext,\n tvState?: TerminalVerifyState,\n accState?: AccumulateState,\n): string {\n const { termRows } = ctx\n // Guard: fall back to full render for complex cases\n if (\n scrollbackOffset > 0 ||\n prev.width !== next.width ||\n prev.height !== next.height ||\n state.prevCursorRow < 0\n ) {\n return inlineFullRender(state, prev, next, scrollbackOffset, cursorPos, ctx, tvState, accState)\n }\n\n const nextContentLines = findLastContentLine(next) + 1\n const prevContentLines = findLastContentLine(prev) + 1\n\n // Compute visible ranges for both prev and next content\n const prevMaxOutputLines =\n termRows != null ? Math.min(prevContentLines, termRows) : prevContentLines\n const maxOutputLines = termRows != null ? Math.min(nextContentLines, termRows) : nextContentLines\n let prevStartLine = 0\n if (termRows != null && prevContentLines > termRows) {\n prevStartLine = prevContentLines - termRows\n }\n let startLine = 0\n if (termRows != null && nextContentLines > termRows) {\n startLine = nextContentLines - termRows\n }\n\n // When the visible window shifts (content exceeds termRows and startLine changes),\n // the entire visible region is different — fall back to full render.\n if (startLine !== prevStartLine) {\n return inlineFullRender(state, prev, next, scrollbackOffset, cursorPos, ctx, tvState, accState)\n }\n\n // Diff buffers\n const { pool, count } = diffBuffers(prev, next)\n if (count === 0 && nextContentLines === prevContentLines) {\n // No buffer changes, but cursor position may have changed.\n // Emit cursor suffix to update the terminal cursor.\n const suffix = inlineCursorSuffix(cursorPos ?? null, next, ctx)\n updateInlineCursorRow(state, cursorPos, maxOutputLines, startLine)\n return suffix\n }\n\n // Move cursor from tracked row to row 0 of render region\n let output = \"\"\n if (state.prevCursorRow > 0) {\n output += `\\x1b[${state.prevCursorRow}A`\n }\n output += \"\\r\"\n output += \"\\x1b[?25l\" // hide cursor during update\n\n // Emit changes with relative positioning.\n // Use the larger of prev/next output lines so changesToAnsi processes all\n // visible cells including rows that shrank (need clearing) or grew (need writing).\n const effectiveOutputLines = Math.max(prevMaxOutputLines, maxOutputLines)\n const changes = changesToAnsi(pool, count, ctx, next, startLine, effectiveOutputLines, prev)\n output += changes.output\n\n // After changesToAnsi, cursor is at changes.finalY (render-relative).\n // We need to position cursor at the effective bottom row, then handle\n // growth/shrinkage, and end at (maxOutputLines - 1) for inlineCursorSuffix.\n const finalY = changes.finalY\n const prevBottomRow = prevMaxOutputLines - 1\n const bottomRow = maxOutputLines - 1\n\n if (maxOutputLines > prevMaxOutputLines) {\n // Content grew: rows beyond the previous bottom don't exist on the terminal.\n // CUD (\\x1b[nB) is clamped at the terminal edge and won't create new lines.\n // Use \\r\\n for each new row to ensure the terminal extends naturally.\n //\n // changesToAnsi may have already moved past prevBottomRow using \\r\\n\n // (creating new terminal lines in the process). Only add \\r\\n for\n // rows beyond what changesToAnsi already reached.\n const fromRow = finalY >= 0 ? finalY : 0\n if (fromRow >= bottomRow) {\n // changesToAnsi already reached or passed the new bottom — nothing to do\n } else if (fromRow >= prevBottomRow) {\n // Cursor already past old bottom (changesToAnsi extended the terminal).\n // Only need \\r\\n for remaining rows.\n const remainingRows = bottomRow - fromRow\n for (let i = 0; i < remainingRows; i++) {\n output += \"\\r\\n\"\n }\n } else {\n // Cursor is still within the old content area.\n // First, move to the old bottom row using CUD (safe, rows exist on terminal)\n if (fromRow < prevBottomRow) {\n const dy = prevBottomRow - fromRow\n output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n }\n // Then extend to new bottom with \\r\\n for each new row\n const newRows = bottomRow - prevBottomRow\n for (let i = 0; i < newRows; i++) {\n output += \"\\r\\n\"\n }\n }\n } else if (maxOutputLines < prevMaxOutputLines) {\n // Content shrank: erase orphan lines below the new content.\n // changesToAnsi already wrote empty cells to clear the old content,\n // but we need \\x1b[K to clear any residual characters.\n // The cursor is at finalY after changesToAnsi — move to the new bottom first.\n const fromRow = finalY >= 0 ? finalY : 0\n if (fromRow < bottomRow) {\n const dy = bottomRow - fromRow\n output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n } else if (fromRow > bottomRow) {\n // Cursor is past the new bottom (was erasing orphan rows) — move back up\n output += `\\x1b[${fromRow - bottomRow}A`\n }\n // Now at new bottom row (bottomRow). Erase orphan lines below by moving\n // down one line at a time, erasing each. This leaves cursor at the last\n // orphan row (prevMaxOutputLines - 1).\n const orphanCount = prevMaxOutputLines - maxOutputLines\n for (let y = 0; y < orphanCount; y++) {\n output += \"\\n\\r\\x1b[K\"\n }\n // Move back up from last orphan row to new bottom row\n if (orphanCount > 0) output += `\\x1b[${orphanCount}A`\n } else {\n // Same height: move to bottom row if not already there\n if (finalY >= 0 && finalY < bottomRow) {\n const dy = bottomRow - finalY\n output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n }\n }\n\n output += inlineCursorSuffix(cursorPos ?? null, next, ctx)\n\n // STRICT verification for inline incremental renders.\n //\n // Inline mode uses relative cursor positioning (CUU/CUD/CR) instead of\n // absolute CUP. The inline `output` we just built is what the real terminal\n // sees, but it can't be fed directly to verifyOutputEquivalence (which\n // replays freshPrev + incrOutput — the cursor position after freshPrev\n // differs from the tracked prevCursorRow), nor to a persistent xterm/ghostty\n // terminal initialized in fullscreen mode (cursor positioning would diverge\n // from frame 1).\n //\n // The strategy: re-diff prev → next in FULLSCREEN mode and verify with that\n // canonical output. This is sound because all four verifiers ask the same\n // invariant — \"does applying the diff produce the same buffer state as a\n // fresh full render?\" — which is independent of cursor positioning. The\n // matching first-render block in outputPhase initializes tvState/accState\n // with a fullscreen-mode bufferToAnsi() so the persistent state is\n // canonical, fullscreen-style, across the whole session.\n //\n // Coverage: this catches buffer-diff regressions (changesToAnsi correctness,\n // OSC 66 / wide-char drift, SGR transitions) at the same fidelity as\n // fullscreen mode. It does NOT catch inline-specific cursor-positioning\n // bugs (relative CUU/CUD math, scrollback promotion, useCursor placement)\n // — those are covered by tests/inline-mode.test.ts and the rest of the\n // inline test suite, not by replay-equivalence STRICT checks.\n const needsFsDiff =\n isStrictOutput() ||\n tvState?.hasVt100 ||\n (tvState && tvState.backends.length > 0 && (tvState.terminal || tvState.ghosttyTerminal)) ||\n (accState && isStrictAccumulate())\n if (needsFsDiff) {\n const savedMode = ctx.mode\n ctx.mode = \"fullscreen\"\n const fsIncrOutput = changesToAnsi(pool, count, ctx, next, 0, Infinity, prev).output\n if (isStrictOutput() || tvState?.hasVt100) {\n _verifyOutputEquivalence(\n prev,\n next,\n fsIncrOutput,\n ctx,\n bufferToAnsi,\n outputGraphemeWidth,\n outputTextSizingEnabled,\n )\n }\n if (accState && isStrictAccumulate()) {\n accState.accumulatedAnsi += fsIncrOutput\n accState.accumulateFrameCount++\n _verifyAccumulatedOutput(next, ctx, accState, bufferToAnsi)\n }\n if (tvState && tvState.backends.length > 0 && (tvState.terminal || tvState.ghosttyTerminal)) {\n tvState.frameCount++\n _verifyTerminalEquivalence(tvState, fsIncrOutput, next, ctx, bufferToAnsi)\n }\n ctx.mode = savedMode\n }\n\n // Update tracking\n updateInlineCursorRow(state, cursorPos, maxOutputLines, startLine)\n\n return output\n}\n\n/**\n * Full re-render for inline mode.\n *\n * Moves cursor to the start of the render region, writes the entire\n * buffer fresh, and erases any leftover lines from the previous render.\n *\n * When content exceeds terminal height, output is capped to termRows lines.\n * Lines beyond the terminal can't be managed (cursor-up is clamped at row 0),\n * so we truncate to prevent scrollback corruption.\n */\nfunction inlineFullRender(\n state: InlineCursorState,\n prev: TerminalBuffer,\n next: TerminalBuffer,\n scrollbackOffset: number,\n cursorPos?: CursorState | null,\n ctx: OutputContext = defaultContext,\n tvState?: TerminalVerifyState,\n accState?: AccumulateState,\n): string {\n const { termRows } = ctx\n const nextContentLines = findLastContentLine(next) + 1\n\n // Use tracked state from the previous frame for cursor position and output height.\n // state.prevCursorRow tracks where the terminal cursor actually is (row within render\n // region), and state.prevOutputLines tracks how many lines the previous frame rendered.\n // Re-deriving from the prev buffer can disagree (e.g., when cursor was positioned at a\n // visible row via useCursor, not at the bottom), causing the cursor-up to overshoot\n // and leaving orphan lines below the content (\"inline-bleed\").\n // Fall back to prev-buffer derivation only when cursor tracking is uninitialized.\n let prevOutputLines: number\n let cursorRowInRegion: number\n if (state.prevCursorRow >= 0) {\n prevOutputLines = state.prevOutputLines\n cursorRowInRegion = state.prevCursorRow\n } else {\n const prevContentLines = findLastContentLine(prev) + 1\n prevOutputLines = termRows != null ? Math.min(prevContentLines, termRows) : prevContentLines\n cursorRowInRegion = prevOutputLines - 1\n }\n\n // How far the cursor is below the start of the render region:\n // tracked cursor row + any lines written to stdout between renders.\n // Cap to termRows-1: terminal clamps cursor-up at row 0.\n const rawCursorOffset = cursorRowInRegion + scrollbackOffset\n const cursorOffset =\n termRows != null && !isStrictOutput()\n ? Math.min(rawCursorOffset, termRows - 1)\n : rawCursorOffset\n\n // Cap output at terminal height to prevent scrollback corruption.\n // Content taller than the terminal pushes lines into scrollback where\n // they can never be overwritten (cursor-up is clamped at terminal row 0).\n const maxOutputLines = termRows != null ? Math.min(nextContentLines, termRows) : nextContentLines\n\n // Quick check: if nothing changed and no scrollback displacement, skip\n if (scrollbackOffset === 0) {\n const { count } = diffBuffers(prev, next)\n if (count === 0) return \"\"\n }\n\n // Move cursor up to the start of the render region\n let prefix = \"\"\n if (cursorOffset > 0) {\n prefix = `\\x1b[${cursorOffset}A\\r`\n }\n // bufferToAnsi handles: hide cursor, render content lines with\n // \\x1b[K (clear to EOL) on each line, and reset style at end.\n let output = prefix + bufferToAnsi(next, ctx, maxOutputLines)\n\n // Erase leftover lines if visible area shrank.\n // Account for terminal scroll: when useScrollback writes frozen items and the\n // cursor overflows the terminal, the terminal scrolls up. The scroll amount\n // equals how far rawCursorOffset exceeds termRows-1 (the terminal's last row).\n // That many old render lines were pushed into scrollback and no longer need\n // erasing. The remaining visible old render lines end at lastOccupiedLine.\n // Lines beyond that contain frozen items — those must NOT be erased.\n // Note: computed from terminal geometry, independent of strict-output cursor bypass.\n const terminalScroll = termRows != null ? Math.max(0, rawCursorOffset - (termRows - 1)) : 0\n const lastOccupiedLine = Math.max(prevOutputLines - 1 - terminalScroll, 0)\n const nextLastLine = maxOutputLines - 1\n if (lastOccupiedLine > nextLastLine) {\n for (let y = nextLastLine + 1; y <= lastOccupiedLine; y++) {\n output += \"\\n\\r\\x1b[K\"\n }\n const up = lastOccupiedLine - nextLastLine\n if (up > 0) output += `\\x1b[${up}A`\n }\n\n // Position the real terminal cursor and show it.\n // If a component called useCursor(), place the cursor there.\n // Otherwise, just show it at the current position (end of content).\n output += inlineCursorSuffix(cursorPos ?? null, next, ctx)\n\n // Update cursor tracking for incremental rendering on next frame\n let startLine = 0\n if (termRows != null && nextContentLines > termRows) startLine = nextContentLines - termRows\n updateInlineCursorRow(state, cursorPos, maxOutputLines, startLine)\n\n // Realign STRICT verification state. Inline full-render falls back from\n // incremental for reasons that invalidate the persistent buffer/emulator\n // state (dimension change, scrollback offset, uninitialized cursor). The\n // simplest correct response is to re-initialize the verification state\n // with a fullscreen rendering of `next` so subsequent incremental frames\n // resume comparison against a consistent baseline. See the matching\n // first-render block in outputPhase for the canonical-fullscreen rationale.\n if (tvState || accState) {\n if ((tvState && tvState.backends.length > 0) || (accState && isStrictAccumulate())) {\n const savedMode = ctx.mode\n ctx.mode = \"fullscreen\"\n const fsFresh = bufferToAnsi(next, ctx)\n if (accState && isStrictAccumulate()) {\n accState.accumulatedAnsi = fsFresh\n accState.accumulateWidth = next.width\n accState.accumulateHeight = next.height\n accState.accumulateFrameCount = 0\n }\n if (tvState && tvState.backends.length > 0) {\n initTerminalVerifyState(tvState, next.width, next.height, fsFresh)\n }\n ctx.mode = savedMode\n }\n }\n\n return output\n}\n\n/**\n * Convert entire buffer to ANSI string.\n *\n * Mode is read from ctx.mode. maxRows is an explicit parameter because callers\n * sometimes pass a pre-computed value (e.g., maxOutputLines) rather than raw\n * ctx.termRows.\n *\n * @param maxRows Optional cap on number of rows to output (inline mode).\n * When content exceeds terminal height, this prevents scrollback corruption.\n */\nfunction bufferToAnsi(\n buffer: TerminalBuffer,\n ctx: OutputContext = defaultContext,\n maxRows?: number,\n): string {\n const { mode } = ctx\n let output = \"\"\n let currentStyle: Style | null = null\n let currentHyperlink: string | undefined\n\n // Cap output to prevent rendering beyond terminal height.\n // Inline mode: render up to last content line; if taller than terminal, show bottom\n // (footer and latest content stay visible in scrollback).\n // Fullscreen mode: always start from top; cap at terminal height to prevent scroll\n // that desynchronizes prevBuffer from actual terminal state.\n let maxLine = mode === \"inline\" ? findLastContentLine(buffer) : buffer.height - 1\n let startLine = 0\n if (maxRows != null && maxLine >= maxRows) {\n if (mode === \"fullscreen\") {\n maxLine = maxRows - 1 // cap at terminal height, always from top\n } else {\n startLine = maxLine - maxRows + 1 // show bottom of content\n }\n }\n\n // Move cursor to start position based on mode\n if (mode === \"fullscreen\") {\n // Fullscreen: Move cursor to home position (top-left)\n output += \"\\x1b[H\"\n } else {\n // Inline: Hide cursor, start from current position\n output += \"\\x1b[?25l\"\n }\n\n // Reusable objects to avoid per-cell allocation in the inner loop\n const cell = createMutableCell()\n const cellStyle: Style = {\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n }\n\n for (let y = startLine; y <= maxLine; y++) {\n // Move to start of line.\n // Fullscreen: CUP (absolute positioning) for rows after startLine.\n // After writing exactly `cols` chars, cursor enters pending-wrap state.\n // \\r goes to col 0 of the CURRENT row (doesn't resolve wrap in real\n // terminals), overwriting the row. CUP is unambiguous across all\n // terminals and our internal ANSI parser (replayAnsiWithStyles).\n // First row skips CUP — cursor is already at home via \\x1b[H.\n // Inline: \\r on EVERY row (including first) to ensure column 0.\n if (mode === \"inline\") {\n output += \"\\r\"\n } else if (y > startLine) {\n output += `\\x1b[${y + 1};1H`\n }\n\n // Render the line content\n for (let x = 0; x < buffer.width; x++) {\n buffer.readCellInto(x, y, cell)\n\n // No continuation skip here. Valid continuation cells are never reached\n // because `if (cell.wide) x++` below jumps past them. Orphaned\n // continuation cells (wide char overwritten by region clear) must NOT\n // be skipped — they write a space to keep the VT cursor in sync.\n\n // Handle OSC 8 hyperlink transitions (separate from SGR style)\n const cellHyperlink = cell.hyperlink\n if (cellHyperlink !== currentHyperlink) {\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\" // Close previous hyperlink\n }\n if (cellHyperlink) {\n output += `\\x1b]8;;${cellHyperlink}\\x1b\\\\` // Open new hyperlink\n }\n currentHyperlink = cellHyperlink\n }\n\n // Build style from cell and check if changed.\n // readCellInto mutates cell.attrs in place, so we must snapshot attrs\n // only when the style actually changes (which is rare -- most adjacent\n // cells share the same style). This avoids per-cell object allocation.\n cellStyle.fg = cell.fg\n cellStyle.bg = cell.bg\n cellStyle.underlineColor = cell.underlineColor\n cellStyle.attrs = cell.attrs\n if (!styleEquals(currentStyle, cellStyle)) {\n // Snapshot: copy attrs so currentStyle isn't invalidated by next readCellInto\n const saved: Style = {\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: { ...cell.attrs },\n }\n output += styleTransition(currentStyle, saved, ctx)\n currentStyle = saved\n }\n\n // Write character — empty-string chars are treated as space to ensure\n // the terminal cursor advances (an empty string writes nothing, causing\n // all subsequent characters on the row to shift left by one column).\n const char = cell.char || \" \"\n output += wrapTextSizing(char, cell.wide, ctx)\n\n // Wide characters occupy 2 columns in the terminal. Skip the next cell\n // position since the terminal cursor already advanced by 2. We skip\n // unconditionally (not relying on the next cell's continuation flag)\n // because the buffer may have a corrupted continuation cell — e.g., when\n // an adjacent container's region clear overwrites the continuation.\n // Without this, the non-continuation cell at x+1 would also be written,\n // causing every subsequent character on the row to shift right by 1.\n if (cell.wide) {\n x++\n // Cursor re-sync: some terminals treat multi-codepoint wide chars\n // (flag emoji like 🇨🇦) as two width-1 chars instead of one width-2\n // char. This causes the terminal cursor to be 1 column behind where\n // we expect. Emit an explicit cursor position to re-sync, mirroring\n // the re-sync in changesToAnsi. Cost: ~8 bytes per wide char; wide\n // chars are rare so overhead is negligible.\n // After x++, x points to the continuation cell. The next character\n // to write is at x+1 (after the loop increment), so position the\n // cursor at 0-indexed column x+1 = 1-indexed column x+2.\n if (mode === \"fullscreen\") {\n output += `\\x1b[${y - startLine + 1};${x + 2}H`\n } else {\n // Inline: \\r resets to column 0, CUF moves to expected position.\n // Reset bg first to prevent bleed across traversed cells.\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n const nextCol = x + 1\n output += \"\\r\"\n if (nextCol > 0) output += nextCol === 1 ? \"\\x1b[C\" : `\\x1b[${nextCol}C`\n }\n }\n }\n\n // Close any open hyperlink at end of row\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n currentHyperlink = undefined\n }\n\n // Reset style before newline to prevent background color from\n // bleeding into the next line via the terminal's right margin fill.\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n // Note: \\x1b[K (Erase to End of Line) is intentionally omitted.\n // bufferToAnsi writes every cell in the row (buffer.width == terminal cols),\n // so there is nothing beyond the cursor to erase. More importantly, after\n // writing the last column the cursor enters pending-wrap state, and EL\n // behavior in pending-wrap is terminal-dependent — some terminals resolve\n // the wrap first, causing the next line's content to shift down by one row.\n\n // Move to next line (except for last line)\n if (y < maxLine) {\n if (mode === \"inline\") {\n // In inline mode, use \\r\\n to cancel DECAWM pending-wrap state.\n // When the line fills exactly `cols` characters, the cursor enters\n // pending-wrap. A bare \\n in that state causes a double line advance\n // in some terminals (Ghostty, iTerm2). The \\r first moves to column 0\n // (canceling pending-wrap), then \\n advances one row cleanly.\n output += \"\\r\\n\"\n }\n // Fullscreen: no \\n needed — CUP at the start of the next row handles\n // positioning. Bare \\n in pending-wrap state is terminal-dependent\n // (some terminals double-advance, potentially causing scroll at the\n // bottom of the alternate screen).\n }\n }\n\n // Close any open hyperlink at end\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n }\n\n // Reset style at end\n output += \"\\x1b[0m\"\n\n return output\n}\n\n// ============================================================================\n// Buffer diffing (extracted to diff-buffers.ts)\n// ============================================================================\n\nimport { diffBuffers } from \"./diff-buffers\"\nimport { analyzeRowDensity, pickEmissionMode } from \"./output-density\"\nimport {\n type OutputEmitState,\n createOutputEmitState,\n emitRuns,\n emitScatter,\n emitWholeRow,\n} from \"./output-modes\"\n\n/** Result from changesToAnsi: ANSI output string and final cursor position. */\ninterface ChangesResult {\n output: string\n /** Final render-relative cursor Y after emitting changes (-1 if no changes emitted). */\n finalY: number\n}\n\n/** Pre-allocated style object reused across changesToAnsi calls. */\nconst reusableCellStyle: Style = {\n fg: null,\n bg: null,\n underlineColor: null,\n attrs: {},\n}\n\n/**\n * Pre-allocated cell for looking up wide char main cells from the buffer\n * when an orphaned continuation cell is encountered in changesToAnsi.\n */\nconst wideCharLookupCell = createMutableCell()\n\n/**\n * Sort a sub-range of the pool by position for optimal cursor movement.\n * Uses a simple in-place sort on pool[0..count).\n */\nfunction sortPoolByPosition(pool: CellChange[], count: number): void {\n // Insertion sort is efficient for the typical case (mostly sorted or small count)\n for (let i = 1; i < count; i++) {\n const item = pool[i]!\n const iy = item.y\n const ix = item.x\n let j = i - 1\n while (j >= 0 && (pool[j]!.y > iy || (pool[j]!.y === iy && pool[j]!.x > ix))) {\n pool[j + 1] = pool[j]!\n j--\n }\n pool[j + 1] = item\n }\n}\n\n// ============================================================================\n// Phase 3 — hybrid output dispatch (SILVERY_HYBRID_OUTPUT=1)\n//\n// Module-scoped emit state, reused across frames so cross-row cursor and\n// style transitions stay zero-allocation. Only one fullscreen renderer reads\n// from this at a time, mirroring the existing module-level `denseRowCell` /\n// `wideCharLookupCell` discipline. Inline mode is intentionally not wired —\n// it has its own per-frame cursor arithmetic.\n// ============================================================================\n\nconst hybridEmitState: OutputEmitState = createOutputEmitState({ isInline: false })\n\n/**\n * Per-row analyze→pick→emit dispatch for fullscreen incremental renders.\n *\n * Pre-conditions:\n * - `pool` is sorted by `(y, x)` (the caller `changesToAnsi` already sorted).\n * - `buffer` is the current `next` buffer; the emitters use it to read main\n * cells for orphan continuations and to fill whole-row spans.\n * - `ctx.mode === \"fullscreen\"`.\n *\n * Outputs the same terminal-state-equivalent ANSI as the legacy emitter; the\n * STRICT verifier compares cell grids, not bytes (see design doc §6).\n */\nfunction hybridChangesToAnsi(\n pool: CellChange[],\n count: number,\n ctx: OutputContext,\n buffer: TerminalBuffer,\n): ChangesResult {\n // Reset emit state. Pool is reused across frames; we never carry cursor\n // tracking from a previous render because `changesToAnsi` is only entered\n // from `outputPhase` after the cursor is implicitly known to be at an\n // arbitrary terminal position. Each render emits its own absolute CUP for\n // the first cell, just like the legacy path's `cursorY === -1` branch.\n hybridEmitState.output = \"\"\n hybridEmitState.cursorX = -1\n hybridEmitState.cursorY = -1\n hybridEmitState.prevY = -1\n hybridEmitState.lastEmittedX = -1\n hybridEmitState.lastEmittedY = -1\n hybridEmitState.currentStyle = null\n hybridEmitState.currentHyperlink = undefined\n hybridEmitState.startLine = 0\n hybridEmitState.isInline = false\n\n const analysis = analyzeRowDensity(pool, count, buffer.width)\n\n // Telemetry — design doc §11 open question 5. Mode counts surface via\n // SILVERY_INSTRUMENT=1 so we can tune the estimator from real workloads.\n const acc = (globalThis as any).__silvery_bench_output_detail\n if (acc) {\n acc.hybridFrames = (acc.hybridFrames ?? 0) + 1\n acc.hybridRows = (acc.hybridRows ?? 0) + analysis.rowCount\n acc.modeCounts = acc.modeCounts ?? { wholeRow: 0, runLength: 0, scatter: 0 }\n }\n\n for (let r = 0; r < analysis.rowCount; r++) {\n const summary = analysis.rows[r]!\n const mode = pickEmissionMode(summary, buffer.width)\n\n if (acc) {\n if (mode === \"whole-row\") acc.modeCounts.wholeRow++\n else if (mode === \"run-length\") acc.modeCounts.runLength++\n else acc.modeCounts.scatter++\n }\n\n switch (mode) {\n case \"whole-row\":\n emitWholeRow(summary, buffer, ctx, hybridEmitState)\n break\n case \"run-length\":\n emitRuns(summary, pool, buffer, ctx, hybridEmitState)\n break\n case \"scatter\":\n emitScatter(summary, pool, buffer, ctx, hybridEmitState)\n break\n }\n }\n\n // Final teardown — match the legacy path's end-of-stream behavior:\n // close any open hyperlink and reset SGR so the terminal returns to a\n // known-clean state.\n if (hybridEmitState.currentHyperlink) {\n hybridEmitState.output += \"\\x1b]8;;\\x1b\\\\\"\n hybridEmitState.currentHyperlink = undefined\n }\n if (hybridEmitState.currentStyle) {\n hybridEmitState.output += \"\\x1b[0m\"\n hybridEmitState.currentStyle = null\n }\n\n return { output: hybridEmitState.output, finalY: hybridEmitState.cursorY }\n}\n\n/**\n * Convert cell changes to optimized ANSI output.\n *\n * Wide characters are handled atomically: the main cell (wide:true) and its\n * continuation cell are treated as a single unit. When the main cell is in\n * the pool, it's emitted and the cursor advances by 2. When only the\n * continuation cell changed (e.g., bg color), the main cell is read from\n * the buffer and emitted to cover both columns.\n *\n * @param pool Pre-allocated pool of CellChange objects\n * @param count Number of valid entries in the pool\n * @param ctx Output context (mode read from ctx.mode)\n * @param buffer The current buffer, used to look up main cells for orphaned\n * continuation cells (optional for backward compatibility)\n * @param startLine For inline mode: first visible buffer row (for termRows capping)\n * @param maxOutputLines For inline mode: number of visible rows\n */\nfunction changesToAnsi(\n pool: CellChange[],\n count: number,\n ctx: OutputContext = defaultContext,\n buffer?: TerminalBuffer,\n startLine = 0,\n maxOutputLines = Infinity,\n prevBuffer?: TerminalBuffer,\n): ChangesResult {\n const { mode } = ctx\n if (count === 0) return { output: \"\", finalY: -1 }\n\n // Sort by position for optimal cursor movement (in-place, no allocation)\n sortPoolByPosition(pool, count)\n\n // ========================================================================\n // Phase 3 hybrid output dispatch (SILVERY_HYBRID_OUTPUT=1).\n //\n // When the feature flag is on AND the render path supplies enough state\n // (fullscreen mode + buffer present), delegate to the per-row\n // analyze→pick→emit pipeline in output-density.ts + output-modes.ts.\n // Falls back to the legacy in-line implementation otherwise.\n //\n // Inline mode is excluded: the inline path uses relative cursor arithmetic\n // (\\x1b[nA/nB + \\r) and a per-frame `startLine` window that the new\n // emitters don't yet model. See design doc R4 (rollout plan §8).\n // ========================================================================\n if (mode === \"fullscreen\" && buffer && isHybridOutputEnabled()) {\n return hybridChangesToAnsi(pool, count, ctx, buffer)\n }\n\n // ========================================================================\n // Hybrid emission: analyze per-row density and choose strategy per row.\n //\n // Dense rows (>50% of cells changed): emit the entire row from the buffer\n // with a single cursor positioning — avoids per-cell CUP overhead.\n //\n // Sparse rows: cell-by-cell emission (current behavior) — optimal for\n // isolated changes since it skips unchanged cells entirely.\n //\n // The threshold is checked only when the buffer is available (incremental\n // renders always pass it; bare changesToAnsi calls may not).\n // ========================================================================\n\n // Build a set of dense rows by scanning the sorted pool.\n // A row is dense if its changed cell count exceeds 50% of the buffer width.\n // We collect row boundaries (start/end indices in the pool) for dense rows\n // so we can skip their individual changes in the main loop.\n const denseRows = new Set<number>()\n const bufWidth = buffer?.width ?? 0\n const densityThreshold = bufWidth > 0 ? bufWidth * 0.5 : Infinity\n\n if (buffer && bufWidth > 0) {\n let rowStart = 0\n while (rowStart < count) {\n const rowY = pool[rowStart]!.y\n let rowEnd = rowStart + 1\n while (rowEnd < count && pool[rowEnd]!.y === rowY) rowEnd++\n const rowChanges = rowEnd - rowStart\n if (rowChanges >= densityThreshold) {\n denseRows.add(rowY)\n }\n rowStart = rowEnd\n }\n }\n\n let output = \"\"\n let currentStyle: Style | null = null\n let currentHyperlink: string | undefined\n const isInline = mode === \"inline\"\n const endLine = startLine + maxOutputLines // exclusive upper bound for inline filtering\n let finalY = -1\n let cursorX = -1\n let cursorY = -1\n let prevY = -1\n // Track the last emitted cell position to detect when a continuation\n // cell's main cell was already emitted in this pass.\n let lastEmittedX = -1\n let lastEmittedY = -1\n\n // Pre-allocated cell for full-row reads (dense row emission).\n // Separate from wideCharLookupCell to avoid aliasing issues.\n const denseRowCell = createMutableCell()\n\n for (let i = 0; i < count; i++) {\n const change = pool[i]!\n let x = change.x\n const y = change.y\n let cell = change.cell\n\n // In inline mode, skip changes outside the visible range\n if (isInline && (y < startLine || y >= endLine)) continue\n\n // ====================================================================\n // Dense row: emit the full row from the buffer.\n // Skip all pool entries for this row — we read directly from the buffer.\n // ====================================================================\n if (buffer && denseRows.has(y)) {\n // Skip remaining pool entries for this row\n while (i + 1 < count && pool[i + 1]!.y === y) i++\n\n const renderY = isInline ? y - startLine : y\n\n // Close hyperlink on row change\n if (y !== prevY && currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n currentHyperlink = undefined\n }\n prevY = y\n\n // Position cursor at start of row (column 0)\n if (renderY !== cursorY || cursorX !== 0) {\n // Reset style before cursor movement to prevent bg bleed\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n\n if (cursorY >= 0 && renderY === cursorY + 1) {\n output += \"\\r\\n\"\n } else if (cursorY >= 0 && renderY > cursorY) {\n const dy = renderY - cursorY\n output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n } else if (isInline) {\n const fromRow = cursorY >= 0 ? cursorY : 0\n if (renderY > fromRow) {\n output += `\\x1b[${renderY - fromRow}B\\r`\n } else if (renderY < fromRow) {\n output += `\\x1b[${fromRow - renderY}A\\r`\n } else {\n output += \"\\r\"\n }\n } else {\n output += `\\x1b[${renderY + 1};1H`\n }\n }\n\n // Emit the entire row from the buffer (like bufferToAnsi per-row logic)\n for (let bx = 0; bx < bufWidth; bx++) {\n buffer.readCellInto(bx, y, denseRowCell)\n\n // Handle hyperlink transitions\n const cellHyperlink = denseRowCell.hyperlink\n if (cellHyperlink !== currentHyperlink) {\n if (currentHyperlink) output += \"\\x1b]8;;\\x1b\\\\\"\n if (cellHyperlink) output += `\\x1b]8;;${cellHyperlink}\\x1b\\\\`\n currentHyperlink = cellHyperlink\n }\n\n // Style transition\n reusableCellStyle.fg = denseRowCell.fg\n reusableCellStyle.bg = denseRowCell.bg\n reusableCellStyle.underlineColor = denseRowCell.underlineColor\n reusableCellStyle.attrs = denseRowCell.attrs\n if (!styleEquals(currentStyle, reusableCellStyle)) {\n const prevStyle = currentStyle\n currentStyle = {\n fg: denseRowCell.fg,\n bg: denseRowCell.bg,\n underlineColor: denseRowCell.underlineColor,\n attrs: { ...denseRowCell.attrs },\n }\n output += styleTransition(prevStyle, currentStyle, ctx)\n }\n\n // Write character\n const char = denseRowCell.char || \" \"\n output += wrapTextSizing(char, denseRowCell.wide, ctx)\n\n // Skip continuation cell for wide chars\n if (denseRowCell.wide) {\n bx++\n // Cursor re-sync for wide chars (same logic as bufferToAnsi)\n if (isInline) {\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n const nextCol = bx + 1\n output += \"\\r\"\n if (nextCol > 0) output += nextCol === 1 ? \"\\x1b[C\" : `\\x1b[${nextCol}C`\n } else {\n output += `\\x1b[${renderY + 1};${bx + 2}H`\n }\n }\n }\n\n // Close hyperlink at end of row\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n currentHyperlink = undefined\n }\n\n // Reset style at end of row to prevent bg bleed into next row\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n\n cursorX = bufWidth\n cursorY = renderY\n lastEmittedX = bufWidth - 1\n lastEmittedY = y\n continue\n }\n\n // ====================================================================\n // Sparse cell: standard cell-by-cell emission\n // ====================================================================\n\n // Handle continuation cells: these are the second column of a wide\n // character. If their main cell (x-1) was already emitted in this\n // pass, skip. Otherwise, look up and emit the main cell from the\n // buffer so the wide char covers both columns.\n if (cell.continuation) {\n // Main cell was already emitted — skip. Do not write into the\n // continuation column after emitting the wide character: xterm-compatible\n // backends treat that as editing the wide cell and clear the glyph.\n // The wide-char CUP resync below keeps the cursor model aligned.\n if (lastEmittedX === x - 1 && lastEmittedY === y) {\n continue\n }\n\n // Orphaned continuation cell: main cell didn't change but this\n // cell's style did. Read the main cell from the buffer and emit it.\n if (buffer && x > 0) {\n x = x - 1\n buffer.readCellInto(x, y, wideCharLookupCell)\n cell = wideCharLookupCell\n // If the looked-up cell is itself a continuation (shouldn't happen\n // with valid buffers) or not wide, fall back to skipping\n if (cell.continuation || !cell.wide) continue\n } else {\n continue\n }\n }\n\n // For inline mode, use render-region-relative row indices\n const renderY = isInline ? y - startLine : y\n\n // Close hyperlink on row change (hyperlinks must not span across rows)\n if (y !== prevY && currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n currentHyperlink = undefined\n }\n prevY = y\n\n // Move cursor if needed (cursor must be exactly at target position)\n if (renderY !== cursorY || x !== cursorX) {\n // Use \\r\\n optimization only if cursor is initialized AND we're moving\n // to the next line at column 0. Don't use it when cursorY is -1\n // (uninitialized) because that would incorrectly emit a newline at start.\n // Bug km-x7ih: This was causing the first row to appear at the bottom.\n if (cursorY >= 0 && renderY === cursorY + 1 && x === 0) {\n // Next line at column 0, use newline (more efficient)\n // Reset style before newline to prevent background color bleeding\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n output += \"\\r\\n\"\n } else if (cursorY >= 0 && renderY === cursorY && x > cursorX) {\n // Same row, forward: use CUF (Cursor Forward) for small jumps.\n // Reset bg before CUF to prevent background color bleeding into\n // skipped cells. Some terminals (e.g., Ghostty) may apply the\n // current bg to cells traversed by CUF, causing visual artifacts\n // when bg transitions from undefined→color (km-tui.col-header-dup).\n if (currentStyle && currentStyle.bg !== null) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n const dx = x - cursorX\n output += dx === 1 ? \"\\x1b[C\" : `\\x1b[${dx}C`\n } else if (cursorY >= 0 && renderY > cursorY && x === 0) {\n // Same column (0), down N rows: use \\r + CUD\n const dy = renderY - cursorY\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n output += dy === 1 ? \"\\r\\n\" : `\\r\\x1b[${dy}B`\n } else if (isInline) {\n // Inline mode: relative positioning (no absolute row numbers)\n if (currentStyle && (currentStyle.bg !== null || hasActiveAttrs(currentStyle.attrs))) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n // When cursorY === -1 (first change in incremental render),\n // the cursor is at row 0 (set by inlineIncrementalRender prefix).\n const fromRow = cursorY >= 0 ? cursorY : 0\n if (renderY > fromRow) {\n output += `\\x1b[${renderY - fromRow}B\\r`\n } else if (renderY < fromRow) {\n output += `\\x1b[${fromRow - renderY}A\\r`\n } else {\n output += \"\\r\"\n }\n if (x > 0) output += x === 1 ? \"\\x1b[C\" : `\\x1b[${x}C`\n } else {\n // Fullscreen: absolute position (1-indexed)\n output += `\\x1b[${renderY + 1};${x + 1}H`\n }\n }\n\n // Handle OSC 8 hyperlink transitions (separate from SGR style)\n const cellHyperlink = cell.hyperlink\n if (cellHyperlink !== currentHyperlink) {\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\" // Close previous hyperlink\n }\n if (cellHyperlink) {\n output += `\\x1b]8;;${cellHyperlink}\\x1b\\\\` // Open new hyperlink\n }\n currentHyperlink = cellHyperlink\n }\n\n // Update style if changed (reuse pre-allocated style object)\n reusableCellStyle.fg = cell.fg\n reusableCellStyle.bg = cell.bg\n reusableCellStyle.underlineColor = cell.underlineColor\n reusableCellStyle.attrs = cell.attrs\n if (!styleEquals(currentStyle, reusableCellStyle)) {\n // Snapshot: copy attrs so currentStyle isn't invalidated by next iteration\n const prevStyle = currentStyle\n currentStyle = {\n fg: cell.fg,\n bg: cell.bg,\n underlineColor: cell.underlineColor,\n attrs: { ...cell.attrs },\n }\n output += styleTransition(prevStyle, currentStyle, ctx)\n }\n\n // Write character — empty-string chars are treated as space to ensure\n // the terminal cursor advances and cursorX tracking stays correct.\n const char = cell.char || \" \"\n output += wrapTextSizing(char, cell.wide, ctx)\n cursorX = x + (cell.wide ? 2 : 1)\n cursorY = renderY\n lastEmittedX = x\n lastEmittedY = y\n\n // Wide char cursor re-sync: terminals may advance the cursor by 1\n // instead of 2 for certain emoji (flag sequences, text-presentation\n // emoji without OSC 66 support). In bufferToAnsi (full render) this\n // only causes a consistent per-row shift since every cell is written\n // sequentially. But in changesToAnsi, contiguous runs rely on cursor\n // auto-advance, so a width mismatch causes progressive drift —\n // characters appear at wrong positions, mixing old and new content.\n // Fix: emit an explicit cursor position after each wide char to\n // re-sync the terminal cursor with our tracking. Cost: ~8 bytes per\n // wide char (CUP in fullscreen, \\r+CUF in inline). Wide chars are\n // rare so the overhead is negligible.\n if (cell.wide) {\n if (isInline) {\n // Inline: \\r resets to column 0, CUF moves to expected position.\n // Reset bg first to prevent bleed across traversed cells.\n if (currentStyle && currentStyle.bg !== null) {\n output += \"\\x1b[0m\"\n currentStyle = null\n }\n output += \"\\r\"\n if (cursorX > 0) output += cursorX === 1 ? \"\\x1b[C\" : `\\x1b[${cursorX}C`\n } else {\n // Fullscreen: CUP (absolute position) — no style reset needed.\n output += `\\x1b[${cursorY + 1};${cursorX + 1}H`\n }\n }\n }\n\n finalY = cursorY\n\n // Close any open hyperlink\n if (currentHyperlink) {\n output += \"\\x1b]8;;\\x1b\\\\\"\n }\n\n // Reset style at end\n if (currentStyle) {\n output += \"\\x1b[0m\"\n }\n\n return { output, finalY }\n}\n\n// =============================================================================\n// Color code helpers (imported from ansi/sgr-codes.ts)\n// =============================================================================\n\n/**\n * Convert style to ANSI escape sequence (chalk-compatible format).\n *\n * Emits only non-default attributes with no reset prefix. Called when there\n * is no previous style context (first cell or after all attributes are off),\n * so the terminal is already in reset state.\n *\n * Uses native 4-bit codes for basic colors (0-7), 256-color for extended,\n * and true-color for RGB. Each attribute gets its own \\x1b[Xm sequence to\n * match chalk's output format.\n *\n * Emits SGR codes including:\n * - Basic colors (30-37, 40-47)\n * - 256-color (38;5;N, 48;5;N)\n * - True color (38;2;r;g;b, 48;2;r;g;b)\n * - Underline styles (4:x where x = 0-5)\n * - Underline color (58;5;N or 58;2;r;g;b)\n * - Inverse uses SGR 7 so terminals swap fg/bg correctly (including default colors)\n */\nfunction styleToAnsi(style: Style, ctx: OutputContext = defaultContext): string {\n const fg = style.fg\n const bg = style.bg\n const monoTier = ctx.caps.colorLevel === \"mono\"\n\n // Collect all SGR codes into one combined sequence: \\x1b[code1;code2;...m\n // This is more spec-compliant and produces fewer bytes than separate sequences.\n const codes: string[] = []\n\n // Foreground color — stripped at monochrome tier (hierarchy via attrs)\n if (fg !== null && !monoTier) {\n codes.push(fgColorCode(fg))\n }\n\n // Background color (DEFAULT_BG sentinel = terminal default, skip) — stripped at mono tier\n if (bg !== null && !isDefaultBg(bg) && !monoTier) {\n codes.push(bgColorCode(bg))\n }\n\n // Attributes\n if (style.attrs.bold) codes.push(\"1\")\n if (style.attrs.dim) codes.push(\"2\")\n if (style.attrs.italic) codes.push(\"3\")\n\n // Underline: per-style capability downgrade. Requested style falls back to\n // plain SGR 4 (single) when the terminal doesn't support that specific\n // extended variant.\n const requestedUl = style.attrs.underlineStyle\n if (requestedUl || style.attrs.underline) {\n const effectiveStyle = supportsUnderlineStyle(ctx.caps.underlineStyles, requestedUl)\n ? requestedUl\n : \"single\"\n const sgrSubparam = underlineStyleToSgr(effectiveStyle)\n if (sgrSubparam !== null && sgrSubparam !== 0 && sgrSubparam !== 1) {\n codes.push(`4:${sgrSubparam}`)\n } else {\n codes.push(\"4\")\n }\n }\n\n // Use SGR 7 for inverse — lets the terminal correctly swap fg/bg\n // (including default terminal colors that have no explicit ANSI code)\n if (style.attrs.blink) codes.push(\"5\")\n if (style.attrs.inverse) codes.push(\"7\")\n if (style.attrs.hidden) codes.push(\"8\")\n if (style.attrs.strikethrough) codes.push(\"9\")\n if (style.attrs.overline && ctx.caps.overline) codes.push(\"53\")\n\n // Append underline color if specified (SGR 58) — skip for limited terminals\n if (\n ctx.caps.underlineColor &&\n style.underlineColor !== null &&\n style.underlineColor !== undefined\n ) {\n if (typeof style.underlineColor === \"number\") {\n codes.push(`58;5;${style.underlineColor}`)\n } else {\n codes.push(\n `58;2;${style.underlineColor.r};${style.underlineColor.g};${style.underlineColor.b}`,\n )\n }\n }\n\n if (codes.length === 0) return \"\"\n return `\\x1b[${codes.join(\";\")}m`\n}\n\n// =============================================================================\n// STRICT/Verification code lives in output-verify.ts (~990 LOC extracted).\n// =============================================================================\n","// Post km-silvery.plateau-delete-legacy-shims (H6 /big review 2026-04-23):\n// `detectColor` and `detectTerminalCaps` are removed — callers consume\n// `term.caps` / `term.profile` when a Term is in scope, or call\n// `createTerminalProfile()` / `probeTerminalProfile()` one-shot.\n//\n// Post km-silvery.unicode-plateau Phase 1 (2026-04-23): `detectUnicode` and\n// `detectExtendedUnderline` are removed too — their logic moved into the\n// profile factory. Consumers read `caps.unicode` / `caps.underlineStyles`\n// / `caps.underlineColor` directly.\n//\n// Post km-silvery.unicode-plateau Phase 3 (2026-04-23): `detectCursor` is\n// also gone — its \"stdout.isTTY + TERM !== 'dumb'\" gate lives on\n// `caps.cursor`.\n//\n// Post km-silvery.unicode-plateau Phase 4 (2026-04-23): `detectInput` is\n// also absorbed — its \"stdin.isTTY + setRawMode\" gate lives on\n// `caps.input`, derived from the optional `stdin` argument on\n// `createTerminalProfile`. The profile factory is now the single\n// detection entry point for every TerminalCaps field.\nexport { defaultCaps, createTerminalProfile, probeTerminalProfile } from \"@silvery/ansi\"\nexport type {\n TerminalCaps,\n TerminalProfile,\n ColorProvenance,\n TerminalProfileStdout,\n CreateTerminalProfileOptions,\n ProbeTerminalProfileOptions,\n} from \"@silvery/ansi\"\n\nexport {\n createBgModeDetector,\n parseBgModeResponse,\n ENABLE_BG_MODE_REPORTING,\n DISABLE_BG_MODE_REPORTING,\n} from \"@silvery/ansi\"\nexport type { BgModeDetector, BgModeDetectorOptions, BgMode } from \"@silvery/ansi\"\n","/**\n * SGR mouse event parsing (mode 1006) and SGR-Pixels parsing (mode 1016).\n *\n * SGR format: CSI < button;x;y M (press) or CSI < button;x;y m (release)\n *\n * Button encoding:\n * - Bits 0-1: 0=left, 1=middle, 2=right, 3=release (X10 only, not SGR)\n * - Bit 2 (+4): Shift held\n * - Bit 3 (+8): Meta/Alt held\n * - Bit 4 (+16): Ctrl held\n * - Bit 5 (+32): Motion event (mouse moved while button held)\n * - Bits 6-7: 64=wheel-up, 65=wheel-down, 66=wheel-left, 67=wheel-right\n */\n\n/**\n * Parsed mouse event from SGR mouse protocol.\n */\nexport interface ParsedMouse {\n /** Mouse button: 0=left, 1=middle, 2=right */\n button: number\n /**\n * Silvery layout X coordinate, in terminal cells.\n * Integer in SGR 1006 mode; fractional when parsed from SGR-Pixels 1016.\n */\n x: number\n /**\n * Silvery layout Y coordinate, in terminal cells.\n * Integer in SGR 1006 mode; fractional when parsed from SGR-Pixels 1016.\n */\n y: number\n /** Physical pixel X coordinate, present only for SGR-Pixels 1016. */\n clientX?: number\n /** Physical pixel Y coordinate, present only for SGR-Pixels 1016. */\n clientY?: number\n /** Coordinate mode used by the parser. */\n coordinateMode: \"cell\" | \"pixel\"\n /** Event action */\n action: \"down\" | \"up\" | \"move\" | \"wheel\"\n /** Wheel delta: -1 for up, +1 for down */\n delta?: number\n /** Shift was held */\n shift: boolean\n /** Alt/Meta was held */\n meta: boolean\n /** Ctrl was held */\n ctrl: boolean\n /** Monotonic timestamp when the terminal input chunk was received. */\n receivedAt?: number\n /** Monotonic id shared by events parsed from the same terminal input chunk. */\n inputBatchId?: number\n}\n\nconst SGR_MOUSE_RE = /^\\x1b\\[<(\\d+);(\\d+);(\\d+)([Mm])$/\n\nexport interface ParseMouseOptions {\n coordinateMode?: \"cell\" | \"pixel\"\n cellSize?: { width: number; height: number }\n}\n\n/**\n * Parse an SGR mouse sequence.\n *\n * Return semantics (see ProtocolError in @silvery/ansi for the full contract):\n * - `null` — input does not match the SGR mouse shape `CSI < B;X;Y [Mm]`.\n * No \"committed but malformed\" branch exists here: either the full SGR\n * shape matches (parse succeeds) or it doesn't (null = next-parser-please).\n *\n * The bead 15127 audit listed this parser for review, but the regex-based\n * shape match means there's no place where the parser commits to \"this is\n * a mouse event\" and then fails on body validation — both happen at the\n * same point. Loud-error tightening here would require a stricter\n * sub-grammar (e.g. validating button-code ranges), tracked separately.\n *\n * @returns ParsedMouse or null if not a valid mouse sequence\n */\nexport function parseMouseSequence(input: string, options?: ParseMouseOptions): ParsedMouse | null {\n const m = SGR_MOUSE_RE.exec(input)\n if (!m) return null\n\n const raw = parseInt(m[1]!)\n const rawX = parseInt(m[2]!) - 1 // 1-indexed → 0-indexed\n const rawY = parseInt(m[3]!) - 1\n const coordinateMode = options?.coordinateMode ?? \"cell\"\n const cellWidth = Math.max(1, options?.cellSize?.width ?? 1)\n const cellHeight = Math.max(1, options?.cellSize?.height ?? 1)\n const x = coordinateMode === \"pixel\" ? rawX / cellWidth : rawX\n const y = coordinateMode === \"pixel\" ? rawY / cellHeight : rawY\n const clientX = coordinateMode === \"pixel\" ? rawX : undefined\n const clientY = coordinateMode === \"pixel\" ? rawY : undefined\n const terminator = m[4]!\n\n const shift = !!(raw & 4)\n const meta = !!(raw & 8)\n const ctrl = !!(raw & 16)\n const motion = !!(raw & 32)\n const isWheel = !!(raw & 64)\n\n if (isWheel) {\n const wheelButton = raw & 3 // 0=up, 1=down, 2=left, 3=right\n return {\n button: 0,\n x,\n y,\n ...(clientX === undefined ? {} : { clientX }),\n ...(clientY === undefined ? {} : { clientY }),\n coordinateMode,\n action: \"wheel\",\n delta: wheelButton === 0 ? -1 : 1,\n shift,\n meta,\n ctrl,\n }\n }\n\n const button = raw & 3\n const action = motion ? \"move\" : terminator === \"M\" ? \"down\" : \"up\"\n return {\n button,\n x,\n y,\n ...(clientX === undefined ? {} : { clientX }),\n ...(clientY === undefined ? {} : { clientY }),\n coordinateMode,\n action,\n shift,\n meta,\n ctrl,\n }\n}\n\nconst SGR_MOUSE_TEST_RE = /^\\x1b\\[<\\d+;\\d+;\\d+[Mm]$/\n\n/** Check if a raw input string is a mouse sequence */\nexport function isMouseSequence(input: string): boolean {\n return SGR_MOUSE_TEST_RE.test(input)\n}\n","/**\n * Bracketed Paste Mode\n *\n * Enables bracketed paste so the terminal wraps pasted text with markers.\n * This lets the app distinguish pasted text from typed input and receive\n * it as a single event rather than individual keystrokes.\n *\n * Protocol: DEC private mode 2004\n * - Enable: CSI ? 2004 h\n * - Disable: CSI ? 2004 l\n * - Paste start marker: CSI 200 ~\n * - Paste end marker: CSI 201 ~\n *\n * Supported by: Ghostty, Kitty, WezTerm, iTerm2, Alacritty, xterm, tmux, foot\n */\n\nimport { ProtocolError } from \"@silvery/ansi\"\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Escape sequence that marks the beginning of pasted text */\nexport const PASTE_START = \"\\x1b[200~\"\n\n/** Escape sequence that marks the end of pasted text */\nexport const PASTE_END = \"\\x1b[201~\"\n\n// ============================================================================\n// Protocol Control\n// ============================================================================\n\n/**\n * Enable bracketed paste mode.\n * Writes CSI ? 2004 h to the output stream.\n */\nexport function enableBracketedPaste(stdout: NodeJS.WriteStream): void {\n stdout.write(\"\\x1b[?2004h\")\n}\n\n/**\n * Disable bracketed paste mode.\n * Writes CSI ? 2004 l to the output stream.\n */\nexport function disableBracketedPaste(stdout: NodeJS.WriteStream): void {\n stdout.write(\"\\x1b[?2004l\")\n}\n\n// ============================================================================\n// Parsing\n// ============================================================================\n\n/** Result of parsing a bracketed paste sequence */\nexport interface BracketedPasteResult {\n type: \"paste\"\n content: string\n}\n\n/**\n * Detect and extract bracketed paste content from raw terminal input.\n *\n * Return semantics (see {@link ProtocolError} for the full contract):\n * - `null` — input contains no PASTE_START marker (this is not bracketed\n * paste input). Discriminator-chain \"next parser please\" signal.\n * - `throw ProtocolError` — input HAS PASTE_START (we committed to\n * bracketed paste) but no PASTE_END follows. This indicates either a\n * stream-split paste (caller should buffer and retry on the next chunk)\n * or a protocol violation. Loud failure surfaces the gap; the dispatch\n * layer catches and decides whether to buffer or log.\n */\nexport function parseBracketedPaste(input: string): BracketedPasteResult | null {\n const startIdx = input.indexOf(PASTE_START)\n if (startIdx === -1) return null\n\n const contentStart = startIdx + PASTE_START.length\n const endIdx = input.indexOf(PASTE_END, contentStart)\n if (endIdx === -1) {\n // PASTE_START found but no PASTE_END — protocol violation OR mid-stream\n // split. Throwing surfaces it; the dispatch boundary may catch and buffer.\n throw new ProtocolError({\n parser: \"parseBracketedPaste\",\n input,\n reason: \"PASTE_START present but no PASTE_END terminator in chunk\",\n })\n }\n\n return {\n type: \"paste\",\n content: input.slice(contentStart, endIdx),\n }\n}\n\n// ============================================================================\n// Paste Event\n// ============================================================================\n\n/**\n * Structured paste event with source tracking and optional rich data.\n *\n * Fired when text is pasted into the application, either from the system\n * clipboard (via bracketed paste) or from the internal clipboard store.\n */\nexport interface PasteEvent {\n /** The pasted plain text */\n text: string\n /** Where the paste came from */\n source: \"bracketed\" | \"internal\"\n /** Rich clipboard data, if available (internal paste only) */\n structured?: import(\"./clipboard\").ClipboardData\n}\n\n/**\n * Create a PasteEvent from a bracketed paste result.\n */\nexport function createBracketedPasteEvent(result: BracketedPasteResult): PasteEvent {\n return {\n text: result.content,\n source: \"bracketed\",\n }\n}\n\n/**\n * Create a PasteEvent from internal clipboard data.\n */\nexport function createInternalPasteEvent(data: import(\"./clipboard\").ClipboardData): PasteEvent {\n return {\n text: data.text,\n source: \"internal\",\n structured: data,\n }\n}\n","/**\n * Focus Reporting (CSI ?1004h)\n *\n * Enables/disables terminal focus-in/focus-out event reporting.\n * When enabled, the terminal sends CSI I on focus-in and CSI O on focus-out.\n *\n * Protocol:\n * - Enable: CSI ? 1004 h\n * - Disable: CSI ? 1004 l\n * - Focus In: CSI I (\\x1b[I)\n * - Focus Out: CSI O (\\x1b[O)\n *\n * Supported by: xterm (v282+), Ghostty, Kitty, WezTerm, iTerm2, foot, VTE\n */\n\nconst CSI = \"\\x1b[\"\n\n/**\n * Enable terminal focus reporting.\n * After enabling, the terminal will send CSI I / CSI O sequences\n * when the terminal window gains or loses focus.\n */\nexport function enableFocusReporting(write: (data: string) => void): void {\n write(`${CSI}?1004h`)\n}\n\n/**\n * Disable terminal focus reporting.\n */\nexport function disableFocusReporting(write: (data: string) => void): void {\n write(`${CSI}?1004l`)\n}\n\n/**\n * Parse a focus event from terminal input.\n *\n * Return semantics (see ProtocolError in @silvery/ansi for the full contract):\n * - `null` — input contains neither `CSI I` nor `CSI O` markers (not a\n * focus event). Discriminator-chain \"next parser please\" signal.\n *\n * The bead 15127 audit listed this parser for review, but there is no\n * \"committed but malformed\" branch — the marker either appears in the\n * input or it doesn't. No ProtocolError throw needed.\n *\n * @param input Raw terminal input string\n * @returns Parsed focus event, or null if not a focus sequence\n */\nexport function parseFocusEvent(input: string): { type: \"focus-in\" | \"focus-out\" } | null {\n if (input.includes(`${CSI}I`)) {\n return { type: \"focus-in\" }\n }\n if (input.includes(`${CSI}O`)) {\n return { type: \"focus-out\" }\n }\n return null\n}\n","/**\n * Input owner — mediates ALL stdin raw-mode + data access within a silvery\n * session. Mirrors `Output` (`./devices/output.ts`) for stdout and\n * `forwardConsole` in loggily's worker.ts for cross-process output: one owner\n * per resource, tenants issue capability requests.\n *\n * ## Why\n *\n * `process.stdin` is a global, multi-tenant resource. The historical pattern —\n * each probe captures `wasRaw = stdin.isRaw` on entry and restores it in a\n * `finally` — races silently under async. When the tenants overlap (e.g.\n * `probeColors` invoked from a React `useEffect` during `term-provider.events()`\n * startup), the last `finally` to run wins, silently disabling raw mode and\n * killing the host TUI's input. See silvery commits `2d9ab59f` + `cea0460b`\n * for tenant-side patches that make each probe *individually* race-safe via\n * the `didSetRaw + listenerCount > 0` guard. Those patches stopped the bleed\n * but the ownership vacuum remained.\n *\n * ## The shape\n *\n * One `stdin.on(\"data\", …)` listener for the owner's lifetime. Incoming\n * chunks drain through two phases:\n *\n * 1. **Probes** (registration-ordered) — `probe(opts)` callers consume\n * response bytes via a custom parser. First match wins, consumed bytes\n * are spliced out of the shared buffer.\n * 2. **Typed event parser** — whatever probes don't consume is parsed into\n * key/mouse/paste/focus events and fanned out to `onKey/onMouse/onPaste/onFocus`\n * subscribers. The parser handles bracketed paste, mouse sequences, focus\n * events, CSI/SS3 sequences, and cross-chunk incomplete CSI buffering.\n *\n * Raw mode and bracketed paste are set ONCE at construction (when `modes`\n * is provided) and restored ONCE at dispose. The owner never toggles these\n * mid-session. Tenants use `probe()` for one-shot OSC queries or subscribe\n * to the typed event handlers; neither touches termios directly.\n *\n * ## Relation to Output\n *\n * The owner is agnostic to whether Output is activated. If it is, the caller\n * passes a write function that routes through `output.write`; if not, a bare\n * `stdout.write` is fine. The owner's concern is stdin.\n */\n\nimport { isProtocolError } from \"@silvery/ansi\"\nimport { createLogger } from \"loggily\"\nimport { type Key, parseKey } from \"./keys\"\nimport {\n isMouseSequence,\n parseMouseSequence,\n type ParseMouseOptions,\n type ParsedMouse,\n} from \"../mouse\"\nimport { parseBracketedPaste } from \"../bracketed-paste\"\nimport { parseFocusEvent } from \"../focus-reporting\"\nimport type { Modes } from \"./devices/modes\"\n\nconst BRACKETED_PASTE_ON = \"\\x1b[?2004h\"\nconst BRACKETED_PASTE_OFF = \"\\x1b[?2004l\"\nconst ESC_DISAMBIGUATION_MS = 25\n\nconst log = createLogger(\"silvery:input-owner\")\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Structured key event — input string + parsed Key metadata. */\nexport interface KeyEvent {\n input: string\n key: Key\n}\n\n/** Structured paste event — the text that was pasted (without markers). */\nexport interface PasteEvent {\n text: string\n}\n\n/** Structured focus event — whether the terminal gained or lost focus. */\nexport interface FocusEvent {\n focused: boolean\n}\n\nexport interface InputOwner extends Disposable {\n /**\n * Write a query to stdout, accumulate stdin response bytes, run `parse`\n * against the accumulated buffer on each chunk. Resolves with the first\n * non-null parse result; resolves with `null` if `timeoutMs` elapses first.\n *\n * Consumed bytes (`consumed` from the parse result) are spliced out of the\n * shared buffer. Bytes before/after the consumed region remain available\n * to subsequent probes and/or the event parser.\n */\n probe<T>(opts: {\n /** Bytes to write to stdout. May be \"\" for pure-listen probes. */\n query: string\n /**\n * Run on the accumulated buffer each time new bytes arrive.\n * Return `null` when the buffer doesn't contain a parseable response yet;\n * return `{ result, consumed }` to resolve the probe with `result` and\n * splice `consumed` bytes out of the buffer.\n *\n * NOTE: `consumed` need not equal the full buffer length; probes may\n * consume a prefix or a middle slice. The owner splices the FIRST\n * `consumed` bytes from the buffer — parsers that match a non-prefix\n * region should locate + return the exact consumed prefix length.\n */\n parse: (acc: string) => { result: T; consumed: number } | null\n /** Maximum wait in ms before resolving with `null`. */\n timeoutMs: number\n }): Promise<T | null>\n\n /**\n * Subscribe to parsed key events (press, repeat, release — handler filters\n * as needed). Returns an unsubscribe function.\n */\n onKey(handler: (event: KeyEvent) => void): () => void\n\n /**\n * Subscribe to parsed mouse events (SGR-encoded button + motion). Returns\n * an unsubscribe function.\n */\n onMouse(handler: (event: ParsedMouse) => void): () => void\n\n /**\n * Subscribe to bracketed-paste events. The `text` field holds the pasted\n * content with markers stripped. Returns an unsubscribe function.\n */\n onPaste(handler: (event: PasteEvent) => void): () => void\n\n /**\n * Subscribe to focus-in / focus-out events (CSI I / CSI O). Returns an\n * unsubscribe function.\n */\n onFocus(handler: (event: FocusEvent) => void): () => void\n\n /**\n * Inject a synthetic key event. Used by emulator-backed terms\n * (`createTerm({ cols, rows, emulator })`) and test helpers to fan out to\n * the same subscribers as real stdin parsing would.\n */\n sendKey(event: KeyEvent): void\n\n /**\n * Inject a synthetic mouse event (same rationale as sendKey).\n */\n sendMouse(event: ParsedMouse): void\n\n /**\n * Inject a synthetic paste event (same rationale as sendKey).\n */\n sendPaste(event: PasteEvent): void\n\n /**\n * Inject a synthetic focus event (same rationale as sendKey).\n */\n sendFocus(event: FocusEvent): void\n\n /** True once construction succeeded and dispose() hasn't run. */\n readonly active: boolean\n /** Number of probes successfully resolved (result, not null) since activation. */\n readonly resolvedCount: number\n /** Number of probes that timed out since activation. */\n readonly timedOutCount: number\n\n dispose(): void\n [Symbol.dispose](): void\n}\n\nexport interface InputOwnerOptions {\n /**\n * Alternate writer for outgoing query bytes (e.g. `output.write`). Defaults\n * to `stdout.write.bind(stdout)`.\n */\n writeStdout?: (data: string) => boolean | void\n /**\n * When true, `dispose()` does NOT drop raw mode. The listener is still\n * removed and pending probes still resolve with null, but raw mode stays\n * set so the next owner (typically the term-provider's events() generator)\n * can take over seamlessly.\n *\n * Use this when the owner is the pre-session probe window AND a follow-up\n * stdin consumer will re-set raw=true immediately.\n */\n retainRawModeOnDispose?: boolean\n /**\n * Shared Modes owner (from Term). When provided, the input owner drives\n * `stdin.setRawMode` + bracketed paste through `modes.rawMode(true/false)`\n * + `modes.bracketedPaste(true/false)` so there is exactly one writer.\n * Fallback to direct stdin calls + no bracketed-paste toggle when absent\n * keeps the standalone/tests path working without a full Term.\n */\n modes?: Modes\n /**\n * Enable bracketed paste at construction. Defaults to true when `modes`\n * is provided and the owner is TTY-backed. Set to false for unit tests\n * that don't want any protocol bytes written to stdout.\n */\n enableBracketedPaste?: boolean\n /**\n * Mouse coordinate parser options. Use this when the terminal has been put\n * into SGR-Pixels mode 1016 and cell metrics are known.\n */\n mouse?: ParseMouseOptions\n}\n\ninterface ProbeEntry {\n parse: (acc: string) => { result: unknown; consumed: number } | null\n resolve: (value: unknown) => void\n timer: ReturnType<typeof setTimeout>\n settled: boolean\n}\n\n// ============================================================================\n// Input Splitting (moved from term-provider.ts)\n// ============================================================================\n\n/**\n * Result of splitting raw input — includes parsed sequences and any trailing\n * incomplete CSI sequence that needs cross-chunk buffering.\n */\ninterface SplitResult {\n sequences: string[]\n incomplete: string | null\n}\n\n/**\n * Split a raw stdin chunk into individual key sequences.\n *\n * When the OS buffers key repeat events, stdin delivers multiple keystrokes\n * in a single read (e.g., \"jjjjj\" for held 'j'). `parseKey` expects one\n * keystroke at a time, so we split first.\n *\n * When a CSI sequence (ESC [ ...) ends at the chunk boundary without a\n * terminator, it is returned as `incomplete` so the caller can buffer it\n * and prepend to the next chunk. This handles SGR mouse sequences that\n * split across stdin data events (e.g., '\\x1b[<0;58;8' + 'M').\n */\nfunction splitRawInput(raw: string): SplitResult {\n const sequences: string[] = []\n let i = 0\n while (i < raw.length) {\n if (raw[i] === \"\\x1b\") {\n // Escape sequence\n if (i + 1 >= raw.length) {\n // Bare ESC at the chunk boundary may be either the Escape key or the\n // prefix of a CSI/SS3/meta sequence arriving in the next read.\n return { sequences, incomplete: raw.slice(i) }\n }\n if (raw[i + 1] === \"[\") {\n // CSI sequence: ESC [ ... <letter or ~>\n let j = i + 2\n while (j < raw.length && !isCSITerminator(raw[j]!)) j++\n if (j < raw.length) {\n j++ // include terminator\n sequences.push(raw.slice(i, j))\n i = j\n } else {\n // Incomplete CSI — hit end of chunk without finding terminator.\n return { sequences, incomplete: raw.slice(i) }\n }\n } else if (raw[i + 1] === \"O\") {\n // SS3 sequence: ESC O <letter>\n const end = Math.min(i + 3, raw.length)\n sequences.push(raw.slice(i, end))\n i = end\n } else if (raw[i + 1] === \"\\x1b\") {\n // Double ESC: meta + escape, OR meta + CSI/SS3 sequence\n if (i + 2 < raw.length && raw[i + 2] === \"[\") {\n let j = i + 3\n while (j < raw.length && !isCSITerminator(raw[j]!)) j++\n if (j < raw.length) {\n j++\n sequences.push(raw.slice(i, j))\n i = j\n } else {\n return { sequences, incomplete: raw.slice(i) }\n }\n } else if (i + 2 < raw.length && raw[i + 2] === \"O\") {\n const end = Math.min(i + 4, raw.length)\n sequences.push(raw.slice(i, end))\n i = end\n } else {\n sequences.push(\"\\x1b\\x1b\")\n i += 2\n }\n } else {\n // Meta key: ESC + char\n sequences.push(raw.slice(i, i + 2))\n i += 2\n }\n } else {\n // Single byte (printable char, ctrl code, etc.)\n sequences.push(raw[i]!)\n i++\n }\n }\n return { sequences, incomplete: null }\n}\n\nfunction isCSITerminator(ch: string): boolean {\n return (ch >= \"A\" && ch <= \"Z\") || (ch >= \"a\" && ch <= \"z\") || ch === \"~\"\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nexport function createInputOwner(\n stdin: NodeJS.ReadStream,\n stdout: NodeJS.WriteStream,\n options: InputOwnerOptions = {},\n): InputOwner {\n const writeStdout = options.writeStdout ?? ((data: string) => stdout.write(data))\n\n // Termios setup — ONCE. When non-TTY, we become a no-op owner (probes time\n // out, event subscribers never fire); stdin is left untouched. We still\n // install the structure against an in-memory buffer so callers don't need\n // to branch.\n const isTTY = Boolean(stdin.isTTY)\n const injectedModes = options.modes\n let rawWasSet = false\n let bracketedPasteWasSet = false\n if (isTTY) {\n try {\n // Capture the prior state so dispose() decides whether to restore or\n // no-op. In the canonical TUI lifecycle the owner is the FIRST\n // raw-mode setter of the session; `wasRaw` should be false. We record\n // it defensively so an owner constructed inside an already-raw session\n // (e.g. nested run()) doesn't flip raw=false on dispose and kill the\n // outer owner's input.\n const wasRaw = stdin.isRaw\n if (!wasRaw) {\n // Single writer: drive through Modes when provided. Fallback to\n // direct stdin call when constructed without a Modes owner\n // (standalone / test path).\n if (injectedModes) injectedModes.rawMode(true)\n else stdin.setRawMode(true)\n rawWasSet = true\n }\n stdin.resume()\n stdin.setEncoding(\"utf8\")\n\n // Bracketed paste — default-on for any TTY-backed owner. Route through\n // Modes when provided (single-writer invariant); otherwise write the\n // protocol bytes directly through `writeStdout` so standalone/test\n // paths still get paste detection. Opt-out via `enableBracketedPaste:\n // false` for unit tests that don't want protocol bytes written.\n const shouldEnablePaste = options.enableBracketedPaste ?? true\n if (shouldEnablePaste) {\n if (injectedModes) injectedModes.bracketedPaste(true)\n else writeStdout(BRACKETED_PASTE_ON)\n bracketedPasteWasSet = true\n }\n } catch (err) {\n log?.warn?.(`termios setup failed: ${String(err)}`)\n }\n }\n\n // Per-owner state.\n let buffer = \"\"\n let incompleteSequence: string | null = null\n let incompleteSequenceTimer: ReturnType<typeof setTimeout> | null = null\n let incompleteSequenceImmediate: ReturnType<typeof setImmediate> | null = null\n const probes: ProbeEntry[] = []\n const keyHandlers = new Set<(e: KeyEvent) => void>()\n const mouseHandlers = new Set<(e: ParsedMouse) => void>()\n const pasteHandlers = new Set<(e: PasteEvent) => void>()\n const focusHandlers = new Set<(e: FocusEvent) => void>()\n let resolvedCount = 0\n let timedOutCount = 0\n let disposed = false\n let inputBatchSeq = 0\n\n // Fire an event to every handler in a set, catching throws so one broken\n // subscriber doesn't prevent others from seeing the event.\n function fire<T>(handlers: Set<(e: T) => void>, event: T): void {\n for (const handler of handlers) {\n try {\n handler(event)\n } catch (err) {\n log?.warn?.(`handler threw: ${String(err)}`)\n }\n }\n }\n\n /**\n * Parse one CSI/SS3/meta/control/printable sequence into the right event\n * type and fire it. Order: focus → mouse → key (catch-all).\n */\n function dispatchSequence(raw: string, receivedAt?: number, inputBatchId?: number): void {\n const focus = parseFocusEvent(raw)\n if (focus) {\n fire(focusHandlers, { focused: focus.type === \"focus-in\" })\n return\n }\n if (isMouseSequence(raw)) {\n const mouse = parseMouseSequence(raw, options.mouse)\n if (mouse) {\n const event = { ...mouse, receivedAt, inputBatchId }\n // Action-specific debug — silvery:input-owner only logs the\n // less-frequent wheel and click actions to avoid drowning move\n // streams. Use `silvery:input-owner` namespace for live capture.\n // Bead: @km/code/trackpad-wheel-not-scrolling.\n if (mouse.action === \"wheel\" || mouse.action === \"down\" || mouse.action === \"up\") {\n log?.debug?.(\n `parsed mouse: action=${mouse.action} button=${mouse.button} x=${mouse.x} y=${mouse.y} delta=${mouse.delta ?? 0} bytes=${JSON.stringify(raw)}`,\n )\n }\n fire(mouseHandlers, event)\n return\n }\n // Mouse sequence detected but failed to parse — log raw bytes so\n // we can spot terminal-specific formats the parser doesn't handle.\n log?.warn?.(`mouse sequence failed to parse: ${JSON.stringify(raw)}`)\n }\n const [input, key] = parseKey(raw)\n fire(keyHandlers, { input, key })\n }\n\n function clearIncompleteTimer(): void {\n if (incompleteSequenceTimer !== null) {\n clearTimeout(incompleteSequenceTimer)\n incompleteSequenceTimer = null\n }\n if (incompleteSequenceImmediate !== null) {\n clearImmediate(incompleteSequenceImmediate)\n incompleteSequenceImmediate = null\n }\n }\n\n function scheduleIncompleteFlush(receivedAt?: number, inputBatchId?: number): void {\n if (incompleteSequence !== \"\\x1b\") return\n clearIncompleteTimer()\n incompleteSequenceTimer = setTimeout(() => {\n incompleteSequenceTimer = null\n // Yield through the check phase before committing standalone Escape.\n // If the event loop was busy while the timeout expired, already-ready\n // stdin tail bytes get one poll phase to arrive and reassemble first.\n incompleteSequenceImmediate = setImmediate(() => {\n incompleteSequenceImmediate = null\n if (disposed || incompleteSequence !== \"\\x1b\") return\n incompleteSequence = null\n dispatchSequence(\"\\x1b\", receivedAt, inputBatchId)\n })\n }, ESC_DISAMBIGUATION_MS)\n }\n\n // Drain the current buffer against probes (in registration order). Anything\n // probes don't consume flows into the event parser, which fires typed\n // handlers for each parsed sequence.\n function drain(receivedAt?: number, inputBatchId?: number): void {\n if (disposed) return\n\n // Loop because one probe resolving may leave bytes that unblock the next.\n let progress = true\n while (progress && probes.length > 0 && buffer.length > 0) {\n progress = false\n for (let i = 0; i < probes.length; i++) {\n const entry = probes[i]!\n if (entry.settled) continue\n let parsed: { result: unknown; consumed: number } | null\n try {\n parsed = entry.parse(buffer)\n } catch (err) {\n log?.warn?.(`probe parse threw: ${String(err)}`)\n entry.settled = true\n clearTimeout(entry.timer)\n entry.resolve(null)\n progress = true\n break\n }\n if (parsed !== null) {\n const consumed = Math.max(0, Math.min(parsed.consumed, buffer.length))\n buffer = buffer.slice(consumed)\n entry.settled = true\n clearTimeout(entry.timer)\n resolvedCount++\n entry.resolve(parsed.result)\n progress = true\n break\n }\n }\n for (let i = probes.length - 1; i >= 0; i--) {\n if (probes[i]!.settled) probes.splice(i, 1)\n }\n }\n\n // Parser phase: run leftover bytes through the typed event parser.\n if (buffer.length === 0) return\n\n // Prepend any buffered incomplete escape/control sequence from a prior\n // chunk so split SGR mouse sequences (e.g. '\\x1b[<0;58;8' + 'M')\n // reassemble.\n let chunk = buffer\n buffer = \"\"\n if (incompleteSequence !== null) {\n clearIncompleteTimer()\n chunk = incompleteSequence + chunk\n incompleteSequence = null\n }\n\n // Bracketed paste is detected before splitting into individual keys —\n // paste content is one logical event, not a stream of keystrokes.\n //\n // The parser may throw ProtocolError when PASTE_START is found but no\n // PASTE_END follows in this chunk. That commonly indicates a stream-\n // split paste (the rest arrives in the next TTY read), so we log and\n // fall through to splitRawInput — preserving the prior \"best-effort\"\n // behavior while still emitting a debug-log breadcrumb so chronic\n // protocol-format problems become visible. Bead reference:\n // @km/silvery/15127-custom-protocol-implementation/protocol-loud-errors.\n let pasteResult: ReturnType<typeof parseBracketedPaste> = null\n try {\n pasteResult = parseBracketedPaste(chunk)\n } catch (err) {\n if (isProtocolError(err)) {\n log?.debug?.(\n `bracketed paste parser flagged malformed input: ${err.reason} (parser=${err.parser}, len=${err.inputLength})`,\n )\n } else {\n log?.warn?.(`bracketed paste parser threw: ${String(err)}`)\n }\n }\n if (pasteResult) {\n fire(pasteHandlers, { text: pasteResult.content })\n return\n }\n\n const { sequences, incomplete } = splitRawInput(chunk)\n incompleteSequence = incomplete\n scheduleIncompleteFlush(receivedAt, inputBatchId)\n for (const raw of sequences) dispatchSequence(raw, receivedAt, inputBatchId)\n }\n\n // Single stdin listener — the whole reason this file exists. No other\n // code in the session should call stdin.on(\"data\", …) or stdin.setRawMode.\n const onChunk = (chunk: string | Buffer) => {\n if (disposed) return\n const receivedAt = performance.now()\n const inputBatchId = ++inputBatchSeq\n buffer += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\")\n drain(receivedAt, inputBatchId)\n }\n if (isTTY) stdin.on(\"data\", onChunk)\n\n function probe<T>(opts: {\n query: string\n parse: (acc: string) => { result: T; consumed: number } | null\n timeoutMs: number\n }): Promise<T | null> {\n if (disposed) return Promise.resolve(null)\n if (!isTTY) {\n // Non-TTY owners still accept probes — they just time out.\n return new Promise((resolve) => setTimeout(() => resolve(null), opts.timeoutMs))\n }\n\n return new Promise<T | null>((resolve) => {\n let settled = false\n const entry: ProbeEntry = {\n parse: opts.parse as (acc: string) => { result: unknown; consumed: number } | null,\n resolve: (value) => {\n if (settled) return\n settled = true\n resolve(value as T | null)\n },\n timer: setTimeout(() => {\n if (entry.settled) return\n entry.settled = true\n const idx = probes.indexOf(entry)\n if (idx >= 0) probes.splice(idx, 1)\n timedOutCount++\n entry.resolve(null)\n }, opts.timeoutMs),\n settled: false,\n }\n probes.push(entry)\n\n // Write the query AFTER registering. Terminal responses typically\n // arrive async, but a mocked terminal may respond synchronously inside\n // the write — we need the probe registered first so the response\n // doesn't fall through to the event parser.\n if (opts.query.length > 0) {\n try {\n writeStdout(opts.query)\n } catch (err) {\n log?.warn?.(`probe query write failed: ${String(err)}`)\n clearTimeout(entry.timer)\n entry.settled = true\n const idx = probes.indexOf(entry)\n if (idx >= 0) probes.splice(idx, 1)\n entry.resolve(null)\n return\n }\n }\n\n // Drain eagerly so a probe registered against already-buffered bytes\n // resolves immediately.\n if (buffer.length > 0) drain()\n })\n }\n\n function onKey(handler: (e: KeyEvent) => void): () => void {\n keyHandlers.add(handler)\n return () => {\n keyHandlers.delete(handler)\n }\n }\n\n function onMouse(handler: (e: ParsedMouse) => void): () => void {\n mouseHandlers.add(handler)\n return () => {\n mouseHandlers.delete(handler)\n }\n }\n\n function onPaste(handler: (e: PasteEvent) => void): () => void {\n pasteHandlers.add(handler)\n return () => {\n pasteHandlers.delete(handler)\n }\n }\n\n function onFocus(handler: (e: FocusEvent) => void): () => void {\n focusHandlers.add(handler)\n return () => {\n focusHandlers.delete(handler)\n }\n }\n\n function sendKey(event: KeyEvent): void {\n if (disposed) return\n fire(keyHandlers, event)\n }\n\n function sendMouse(event: ParsedMouse): void {\n if (disposed) return\n fire(mouseHandlers, event)\n }\n\n function sendPaste(event: PasteEvent): void {\n if (disposed) return\n fire(pasteHandlers, event)\n }\n\n function sendFocus(event: FocusEvent): void {\n if (disposed) return\n fire(focusHandlers, event)\n }\n\n function dispose(): void {\n if (disposed) return\n disposed = true\n\n // Resolve pending probes with null so awaiting callers don't hang.\n for (const entry of probes) {\n if (entry.settled) continue\n entry.settled = true\n clearTimeout(entry.timer)\n try {\n entry.resolve(null)\n } catch {\n // downstream already handled\n }\n }\n probes.length = 0\n keyHandlers.clear()\n mouseHandlers.clear()\n pasteHandlers.clear()\n focusHandlers.clear()\n clearIncompleteTimer()\n buffer = \"\"\n incompleteSequence = null\n\n if (isTTY) {\n try {\n stdin.off(\"data\", onChunk)\n } catch {\n // listener already removed\n }\n if (!options.retainRawModeOnDispose) {\n try {\n // Disable bracketed paste FIRST (before raw-mode restore) so the\n // enable/disable pair nests inside the raw-mode lifetime.\n if (bracketedPasteWasSet) {\n if (injectedModes) injectedModes.bracketedPaste(false)\n else writeStdout(BRACKETED_PASTE_OFF)\n }\n } catch {\n // stdin may already be closed\n }\n try {\n if (rawWasSet) {\n if (injectedModes) injectedModes.rawMode(false)\n else stdin.setRawMode(false)\n }\n } catch {\n // stdin may already be closed\n }\n try {\n stdin.pause()\n } catch {\n // stdin may already be closed\n }\n }\n }\n\n log?.debug?.(`disposed (resolved=${resolvedCount}, timedOut=${timedOutCount})`)\n }\n\n return {\n probe,\n onKey,\n onMouse,\n onPaste,\n onFocus,\n sendKey,\n sendMouse,\n sendPaste,\n sendFocus,\n get active() {\n return !disposed\n },\n get resolvedCount() {\n return resolvedCount\n },\n get timedOutCount() {\n return timedOutCount\n },\n dispose,\n [Symbol.dispose]: dispose,\n }\n}\n","/**\n * ConsoleRouter — single patcher for `console.log/info/warn/error/debug`.\n *\n * Before this owner existed, `Console` and `Output` independently monkey-\n * patched `console.*` — the last patcher to activate stole the wrappers from\n * the earlier one. Pro review 2026-04-22 P0-3 flagged this; the structural\n * fix is exactly one patcher that both owners register policies against.\n *\n * The router owns the five `target[method] = ...` installs and the matching\n * restore. Console and Output call `registerTap` / `registerSink` to declare\n * intent; the router composes them in a single wrapper per method.\n *\n * ### Invocation order per `console.*` call\n *\n * 1. All registered **taps** fire in registration order.\n * Taps are pure observers — they see the call but cannot change it.\n * Used by `term.console` to record entries for later replay.\n *\n * 2. The **sink policy** decides forwarding:\n * - `suppress: true` → drop the call (no original forward, no redirect).\n * - `redirectFd` → write a formatted single-line copy to that fd\n * (canonical use: redirect stderr to DEBUG_LOG so\n * foreign console.warn doesn't corrupt the alt screen).\n * - neither → forward to the ORIGINAL console method captured\n * before any patching.\n * Only the most recently registered sink is consulted (last-one-wins).\n * Unregistering a sink reverts to the prior sink (stack discipline) —\n * or, if no sink is registered, the call is forwarded.\n *\n * ### Lifecycle\n *\n * Router construction is free. First `registerTap` or `registerSink` call\n * installs all five wrappers and captures originals. Last unregister (both\n * tap set empty AND sink stack empty) restores the originals and clears\n * the wrappers. Dispose is an explicit reset.\n */\n\nimport type { ConsoleMethod } from \"../../ansi/types\"\nimport { writeSync } from \"node:fs\"\n\nconst METHODS: ConsoleMethod[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"]\n\n/** Shape a tap handler receives on every console.* call. */\nexport interface ConsoleCall {\n method: ConsoleMethod\n args: unknown[]\n}\n\n/** Sink policy registered by a consumer (e.g. Output's alt-screen guard). */\nexport interface ConsoleSinkPolicy {\n /**\n * If true, the call is dropped (no forward to original, no redirect).\n * Default: false.\n */\n suppress?: boolean\n /**\n * If set, a single-line formatted copy of the call is written via\n * `fs.writeSync(redirectFd, …)`. Typical use: redirect console.* to\n * DEBUG_LOG during alt-screen. Mutually exclusive with `suppress: true`\n * at the semantic level (if both are set, `suppress` wins).\n */\n redirectFd?: number | null\n}\n\n/**\n * Public shape of a ConsoleRouter.\n */\nexport interface ConsoleRouter extends Disposable {\n /**\n * Register a tap: called on every console.* call in registration order,\n * before sink policy. Tap handlers are pure observers. Returns an\n * unregister function.\n */\n registerTap(handler: (call: ConsoleCall) => void): () => void\n\n /**\n * Register a sink policy. The most recently registered sink is the\n * active one (stack semantics). Unregister pops the stack back to the\n * prior sink. Returns an unregister function.\n */\n registerSink(policy: ConsoleSinkPolicy): () => void\n\n /** True while at least one tap OR sink is registered (i.e. wrappers installed). */\n readonly active: boolean\n\n /** Dispose — restore originals, clear taps + sinks. Idempotent. */\n dispose(): void\n [Symbol.dispose](): void\n}\n\n/**\n * Format a console call into a single line for DEBUG_LOG redirect.\n * Shape matches Console.replay's format: args joined with space, newline.\n */\nfunction formatLine(call: ConsoleCall): string {\n return (\n call.args\n .map((a) =>\n typeof a === \"string\"\n ? a\n : a instanceof Error\n ? `${a.name}: ${a.message}`\n : safeJsonStringify(a),\n )\n .join(\" \") + \"\\n\"\n )\n}\n\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Create a ConsoleRouter patching the given console global (defaults to\n * `globalThis.console`). Construction is cheap: no patching happens until\n * the first `registerTap` / `registerSink` call. Every subsequent register\n * joins the existing wrappers; unregister that drops the last registrant\n * restores the originals.\n */\nexport function createConsoleRouter(\n target: globalThis.Console = globalThis.console,\n): ConsoleRouter {\n const taps = new Set<(call: ConsoleCall) => void>()\n const sinkStack: ConsoleSinkPolicy[] = []\n const originals = new Map<ConsoleMethod, globalThis.Console[ConsoleMethod]>()\n let installed = false\n let disposed = false\n\n function currentSink(): ConsoleSinkPolicy | null {\n return sinkStack.length > 0 ? sinkStack[sinkStack.length - 1]! : null\n }\n\n function install() {\n if (installed || disposed) return\n installed = true\n for (const method of METHODS) {\n originals.set(method, target[method])\n const original = originals.get(method)!\n target[method] = ((...args: unknown[]) => {\n const call: ConsoleCall = { method, args }\n\n // 1. Fan out to taps. Isolated in try/catch — a broken tap must not\n // derail forwarding or other taps. (Matches the signals-owner\n // isolation pattern.)\n for (const tap of taps) {\n try {\n tap(call)\n } catch {\n /* isolate */\n }\n }\n\n // 2. Apply sink policy.\n const sink = currentSink()\n if (sink?.suppress) return\n if (sink?.redirectFd != null) {\n try {\n writeSync(sink.redirectFd, formatLine(call))\n } catch {\n /* fd may be closed */\n }\n return\n }\n // 3. No sink → forward to the captured original.\n ;(original as (...a: unknown[]) => void).call(target, ...args)\n }) as globalThis.Console[ConsoleMethod]\n }\n }\n\n function uninstall() {\n if (!installed) return\n for (const method of METHODS) {\n const original = originals.get(method)\n if (original) target[method] = original\n }\n originals.clear()\n installed = false\n }\n\n function maybeUninstall() {\n if (taps.size === 0 && sinkStack.length === 0) uninstall()\n }\n\n function registerTap(handler: (call: ConsoleCall) => void): () => void {\n if (disposed) return () => {}\n taps.add(handler)\n install()\n return () => {\n taps.delete(handler)\n maybeUninstall()\n }\n }\n\n function registerSink(policy: ConsoleSinkPolicy): () => void {\n if (disposed) return () => {}\n sinkStack.push(policy)\n install()\n return () => {\n const idx = sinkStack.lastIndexOf(policy)\n if (idx >= 0) sinkStack.splice(idx, 1)\n maybeUninstall()\n }\n }\n\n function dispose() {\n if (disposed) return\n disposed = true\n uninstall()\n taps.clear()\n sinkStack.length = 0\n }\n\n return {\n registerTap,\n registerSink,\n get active() {\n return installed\n },\n dispose,\n [Symbol.dispose]: dispose,\n }\n}\n","/**\n * Output — single-owner stdout/stderr/console mediator for a silvery session.\n *\n * Mirrors `InputOwner` (`../input-owner.ts`) for the write side: one owner per\n * Term, stable across the session. When active, intercepts process.stdout,\n * process.stderr, and console.* so only the render pipeline (via `output.write`)\n * reaches the terminal. Non-silvery writes are suppressed (stdout) or redirected\n * to `options.stderrLog`/`process.env.DEBUG_LOG` (stderr/console).\n *\n * ## Lifecycle\n *\n * Constructed once per Term, initially deactivated. `activate()` installs the\n * intercepts; `deactivate()` restores originals; `dispose()` does final cleanup\n * (closes stderr fd, flushes buffered stderr). The activate/deactivate cycle is\n * used by the runtime to temporarily pass writes through during pause/resume\n * (console mode, log dump).\n *\n * ## Relation to InputOwner\n *\n * InputOwner is constructed once at term creation, activated immediately (it\n * needs raw mode + stdin data listener to mediate probes). Output is\n * constructed deactivated because installing intercepts before protocol setup\n * (alt screen, kitty keyboard) would suppress the setup sequences themselves.\n * The runtime calls `activate()` after protocol setup completes.\n */\n\nimport { openSync, writeSync, closeSync } from \"node:fs\"\nimport { createLogger } from \"loggily\"\nimport { signal, type ReadSignal } from \"@silvery/signals\"\nimport type { ConsoleRouter } from \"./console-router\"\n\nconst log = createLogger(\"silvery:guard\")\n\nexport interface Output extends Disposable {\n /** Write data to stdout. When active, bypasses the intercept (silvery's render\n * pipeline writes go through here). When inactive, forwards to the raw\n * stdout.write. */\n write(data: string | Uint8Array): boolean\n /**\n * Whether intercepts are currently installed — a `ReadSignal<boolean>`.\n * Call `output.active()` to read; subscribe with\n * `effect(() => output.active())`. The owner writes it internally from\n * `activate()` / `deactivate()`.\n */\n readonly active: ReadSignal<boolean>\n /** Activate intercepts: installs stdout/stderr/console patches. Idempotent —\n * no-op if already active. Options override those passed at construction. */\n activate(options?: OutputOptions): void\n /** Deactivate intercepts: restores original stdout/stderr/console methods.\n * Idempotent. Closes stderr log fd if open. */\n deactivate(): void\n /** Number of stdout writes suppressed since construction (cumulative across\n * activate/deactivate cycles). Plain getter — changes on every write, not\n * worth the reactive cost. */\n readonly suppressedCount: number\n /** Number of stderr writes redirected since construction (cumulative across\n * activate/deactivate cycles). Plain getter — changes on every write. */\n readonly redirectedCount: number\n /** Final cleanup: deactivates + any teardown. Idempotent. */\n dispose(): void\n [Symbol.dispose](): void\n}\n\nexport interface OutputOptions {\n /** File path to redirect stderr to (default: process.env.DEBUG_LOG) */\n stderrLog?: string\n /** If true, buffer stderr and flush on deactivate instead of redirecting to file */\n bufferStderr?: boolean\n}\n\n/**\n * Create an Output owner. Starts deactivated — call `activate()` to install\n * intercepts. Call `dispose()` for final cleanup.\n *\n * A `ConsoleRouter` may be passed to route `console.*` redirect policy\n * through the shared patcher (so Console's tap and Output's sink layer\n * deterministically). When omitted, Output patches `console.*` via its own\n * private router — the behaviour is identical, but Console's tap cannot\n * share the patch site.\n */\nexport function createOutput(defaultOptions?: OutputOptions, router?: ConsoleRouter): Output {\n let disposed = false\n // Reactive `active` — internal writes from activate/deactivate only.\n // Exposed read-only via the `active` ReadSignal on the public Output shape.\n const _active = signal<boolean>(false)\n\n // Cumulative stats across activate/deactivate cycles\n let suppressedCount = 0\n let redirectedCount = 0\n\n // Saved originals — captured at activation time, restored at deactivation\n let savedStdoutWrite: typeof process.stdout.write | null = null\n let savedStderrWrite: typeof process.stderr.write | null = null\n let origStdoutWrite: ((chunk: unknown, ...args: unknown[]) => boolean) | null = null\n let origStderrWrite: ((chunk: unknown, ...args: unknown[]) => boolean) | null = null\n\n // Stderr redirection state (re-created on activate, torn down on deactivate)\n let stderrFd: number | null = null\n let stderrBuffer: string[] = []\n let bufferStderr = false\n\n // Router is the canonical patcher for console.*. `unregisterSink` holds\n // the disposer for the sink policy we registered in activate().\n const ownsRouter = !router\n const _router: ConsoleRouter =\n router ??\n // Lazy local-router import to avoid a circular dep between console.ts\n // and output.ts. `require` is safe here (node runtime) and dev-only.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n (require(\"./console-router\") as typeof import(\"./console-router\")).createConsoleRouter()\n let unregisterSink: (() => void) | null = null\n\n // Route flag — when true, stdout.write(…) inside the intercept forwards to the\n // original (silvery's own write() path toggles this briefly).\n let silveryWriting = false\n\n function activate(options?: OutputOptions): void {\n if (disposed) return\n if (_active()) return\n _active(true)\n\n const opts = { ...defaultOptions, ...options }\n bufferStderr = !!opts.bufferStderr\n\n savedStdoutWrite = process.stdout.write\n savedStderrWrite = process.stderr.write\n origStdoutWrite = savedStdoutWrite.bind(process.stdout) as typeof origStdoutWrite\n origStderrWrite = savedStderrWrite.bind(process.stderr) as typeof origStderrWrite\n\n const stderrLog = opts.stderrLog ?? process.env.DEBUG_LOG\n if (stderrLog) {\n try {\n stderrFd = openSync(stderrLog, \"a\")\n } catch {\n // If we can't open the log file, fall back to suppression\n }\n }\n\n process.stdout.write = function (chunk: unknown, ...args: unknown[]): boolean {\n if (silveryWriting) {\n return origStdoutWrite!(chunk, ...args)\n }\n // Non-silvery stdout write -- suppress in alt screen\n suppressedCount++\n const preview = typeof chunk === \"string\" ? chunk.slice(0, 60) : \"<binary>\"\n log?.debug?.(`suppressed stdout write (${suppressedCount}): ${JSON.stringify(preview)}`)\n return true\n } as typeof process.stdout.write\n\n process.stderr.write = function (chunk: unknown, ..._args: unknown[]): boolean {\n const str = typeof chunk === \"string\" ? chunk : String(chunk)\n redirectedCount++\n if (stderrFd !== null) {\n try {\n writeSync(stderrFd, str)\n } catch {\n // File may have been closed externally\n }\n return true\n }\n if (bufferStderr) {\n stderrBuffer.push(str)\n return true\n }\n return true\n } as typeof process.stderr.write\n\n // Intercept console methods via the shared ConsoleRouter — the router\n // owns the five `target[method] = wrapper` installs and composes Output's\n // redirect policy with whatever Console has registered as a tap. Using\n // the router (instead of patching console.* directly here) is what makes\n // the Console tap + Output sink coexist regardless of activation order\n // (Pro review 2026-04-22 P0-3 structural fix).\n unregisterSink = _router.registerSink({\n // If we have a fd to redirect to, drive the router's writeSync path.\n // Otherwise we'd want to buffer/drop — the router currently supports\n // suppress + redirect, so we emulate \"buffer\" by intercepting in our\n // own observer-style sink extension (via a tap that appends to the\n // stderrBuffer). Keep the canonical flow simple: fd-redirect is the\n // production case; buffering is the test case.\n redirectFd: stderrFd,\n })\n if (bufferStderr && stderrFd === null) {\n // Test/buffer mode: register a second sink that captures console.* into\n // stderrBuffer. The last-registered sink wins; register AFTER the\n // redirect sink so this one is active. Buffering also counts toward\n // redirectedCount so consumers see an accurate tally.\n unregisterSink?.()\n unregisterSink = _router.registerSink({\n // The router's sink currently has suppress/redirect semantics only;\n // buffering requires the caller to also register a tap for side effects.\n // We use suppress + a tap below.\n suppress: true,\n })\n // Tap: every call gets appended to stderrBuffer + counted.\n const unregisterBufferTap = _router.registerTap((call) => {\n const str = call.args.map((a) => (typeof a === \"string\" ? a : String(a))).join(\" \") + \"\\n\"\n redirectedCount++\n stderrBuffer.push(str)\n })\n const prevUnregister = unregisterSink\n unregisterSink = () => {\n unregisterBufferTap()\n prevUnregister()\n }\n } else {\n // Count fd-redirected writes by registering a tap alongside the redirect\n // sink. The tap fires BEFORE the sink runs writeSync, so count is in sync.\n const unregisterCountTap = _router.registerTap(() => {\n redirectedCount++\n })\n const prevUnregister = unregisterSink\n unregisterSink = () => {\n unregisterCountTap()\n prevUnregister!()\n }\n }\n\n log?.info?.(\"activated\" + (stderrLog ? ` (stderr -> ${stderrLog})` : \" (stderr suppressed)\"))\n }\n\n function deactivate(): void {\n if (!_active()) return\n _active(false)\n\n if (savedStdoutWrite) process.stdout.write = savedStdoutWrite\n if (savedStderrWrite) process.stderr.write = savedStderrWrite\n // Unregister the sink + redirect tap on the ConsoleRouter. The router\n // itself stays wired (Console may still be tapping) — this just pops\n // Output's policies off.\n unregisterSink?.()\n unregisterSink = null\n\n log?.info?.(\n `deactivated (suppressed ${suppressedCount} stdout, redirected ${redirectedCount} stderr)`,\n )\n\n // Flush buffered stderr through the original. Headed with a separator\n // so the operator can distinguish replayed log output from anything\n // that ran AFTER the alt-screen restored. Suppressed when there's\n // nothing to replay (no header on a clean run).\n if (origStderrWrite && stderrBuffer.length > 0) {\n origStderrWrite(\n `\\n— silvery: replaying ${stderrBuffer.length} captured stderr/console line(s) —\\n`,\n )\n for (const line of stderrBuffer) {\n origStderrWrite(line)\n }\n }\n stderrBuffer = []\n\n if (stderrFd !== null) {\n try {\n closeSync(stderrFd)\n } catch {\n // Already closed\n }\n stderrFd = null\n }\n\n savedStdoutWrite = null\n savedStderrWrite = null\n origStdoutWrite = null\n origStderrWrite = null\n }\n\n function dispose(): void {\n if (disposed) return\n disposed = true\n deactivate()\n if (ownsRouter) _router.dispose()\n }\n\n return {\n write(data) {\n if (_active() && origStdoutWrite) {\n silveryWriting = true\n try {\n return origStdoutWrite(data)\n } finally {\n silveryWriting = false\n }\n }\n // Not active — forward straight to the current stdout.write (whatever it\n // is now). Caller is responsible for any additional routing.\n return process.stdout.write(data as string | Uint8Array)\n },\n active: _active as ReadSignal<boolean>,\n activate,\n deactivate,\n get suppressedCount() {\n return suppressedCount\n },\n get redirectedCount() {\n return redirectedCount\n },\n dispose,\n [Symbol.dispose]: dispose,\n }\n}\n","/**\n * term.size — single source of truth for terminal dimensions, exposed as\n * reactive ReadSignals.\n *\n * Wraps the WriteStream's columns/rows behind an alien-signals signal so every\n * reader sees the same value and can participate in the reactive graph\n * (computed / effect). The signals are read-only from the outside — writes\n * happen internally on `resize` events (after coalescing).\n *\n * Resize coalescing: multiplexers (tmux, cmux, Ghostty tabs) can fire\n * multiple SIGWINCH bursts in rapid succession as the PTY re-syncs. Without\n * coalescing, each event triggers a full re-layout at an intermediate size,\n * producing visible multi-phase layout shift. The owner uses a **trailing-edge\n * debounce**: every incoming SIGWINCH resets a 200 ms timer, and the snapshot\n * publishes only after `coalesceMs` of silence. A four-event burst at ~80 ms\n * intervals (the observed cmux pattern) collapses to one published snapshot\n * carrying the final geometry. Same-size resize notifications still publish a\n * fresh snapshot: cmux/focus restores can corrupt terminal screen state\n * without changing cols/rows, and fullscreen runtimes need the event so they\n * can repaint/clear. Discrete resizes spaced further apart than `coalesceMs`\n * pass through individually. The cost is a small per-resize latency — fine for\n * \"settle after the workspace switch\" but perceptible for a continuous\n * drag-resize; consumers that want zero-latency live preview pass\n * `coalesceMs: 0`.\n *\n * ## API shape\n *\n * ```ts\n * size.cols() // current width\n * size.rows() // current height\n * size.snapshot() // { cols, rows }\n * effect(() => { … use size.cols() … }) // subscribe reactively\n * ```\n *\n * Ownership: one `Size` per terminal session. Constructed by `createTerm()`\n * (Node terminal) or the emulator path (termless). Readers never touch\n * `stdout.columns` / `stdout.rows` directly.\n */\n\nimport { signal, type ReadSignal } from \"@silvery/signals\"\nimport { appendFileSync } from \"node:fs\"\n\n// Optional instrumentation gated on DEBUG_LOG env var. Pattern mirrors\n// scheduler.ts:768 (existing silvery convention). Logs install + every\n// resize event + every publish so SIGWINCH plumbing is observable in\n// the live binary. Zero overhead when DEBUG_LOG is unset.\nfunction logSize(message: string): void {\n const path = process.env.DEBUG_LOG\n if (!path) return\n if (process.env.DEBUG && !/silvery(:size|:\\*|^)/.test(process.env.DEBUG)) return\n try {\n appendFileSync(path, `[silvery:size ${new Date().toISOString()}] ${message}\\n`)\n } catch {\n // Ignore — instrumentation must never crash the runtime.\n }\n}\n\n/** Snapshot of terminal dimensions. */\nexport interface SizeSnapshot {\n readonly cols: number\n readonly rows: number\n}\n\n// ---------------------------------------------------------------------------\n// Stream-shared listener (refcounted)\n//\n// Multiple `createSize(stream)` calls on the SAME WriteStream share ONE\n// underlying `stream.on(\"resize\", …)` attachment. Without sharing, every\n// `createTerm(process.stdout)` call site (km-cli has many module-level\n// singletons — `program.ts`, `index.ts`, every command module) would add\n// its own resize listener; Node's default 10-listener cap fires\n// `MaxListenersExceededWarning: 11 resize listeners added to [WriteStream]`\n// at startup. See bead `@km/silvery/resize-listener-leak` (P2).\n//\n// The shared registration installs lazily on first read of any public\n// signal (preserves the lazy-install contract — cold Terms that never read\n// `size.*` still pay zero listeners — see size.test.ts §\"lazy install\").\n// Each `createSize(stream)` instance gets its own private fanout slot, so\n// per-instance state (the trailing-edge debounce timer, the alien-signals\n// `_snapshot`, dispose semantics) is unchanged. The refcount tracks the\n// number of installed instances; when the last instance disposes, the\n// underlying `stream.on(\"resize\")` attachment is removed.\n//\n// Keyed off the stream identity, not just `process.stdout`, so test mocks\n// (each test gets its own `EventEmitter` \"stdout\") share within a test but\n// stay isolated across tests. WeakMap keeps GC-friendliness for synthetic\n// streams.\n// ---------------------------------------------------------------------------\n\ninterface SharedResizeEntry {\n /** Number of `createSize(stream)` instances currently subscribed. */\n count: number\n /** Per-instance fan-out — invoked on every stream \"resize\" event. */\n readonly fanout: Set<() => void>\n /** The single function attached to `stream.on(\"resize\", …)`. */\n readonly handler: () => void\n}\n\nconst sharedResizeRegistry: WeakMap<NodeJS.WriteStream, SharedResizeEntry> = new WeakMap()\n\n/**\n * Subscribe `onResize` to the stream's resize event via the shared\n * (refcounted) listener. Returns a `detach()` that removes this subscriber\n * and tears down the underlying `stream.on(...)` when the last subscriber\n * detaches.\n *\n * Calling this is what bumps the refcount — `createSize` defers the call\n * until first read so the lazy-install contract is preserved.\n */\nfunction subscribeShared(stream: NodeJS.WriteStream, onResize: () => void): () => void {\n let entry = sharedResizeRegistry.get(stream)\n if (!entry) {\n const fanout = new Set<() => void>()\n const handler = () => {\n // Iterate a snapshot — a subscriber's onResize may detach mid-fire\n // (e.g. a Size disposes inside its own resize handler).\n for (const cb of [...fanout]) {\n try {\n cb()\n } catch {\n // Per-instance handlers must not crash the shared dispatch loop.\n // Errors surface through the instance's own pathway (signal\n // updates are catch-free at the consumer level).\n }\n }\n }\n stream.on(\"resize\", handler)\n entry = { count: 0, fanout, handler }\n sharedResizeRegistry.set(stream, entry)\n }\n entry.fanout.add(onResize)\n entry.count += 1\n\n let detached = false\n return () => {\n if (detached) return\n detached = true\n const e = sharedResizeRegistry.get(stream)\n if (!e) return\n e.fanout.delete(onResize)\n e.count -= 1\n if (e.count === 0) {\n stream.off(\"resize\", e.handler)\n sharedResizeRegistry.delete(stream)\n }\n }\n}\n\n/**\n * Test/diagnostic helper — returns the current refcount for a stream's\n * shared resize listener. Zero if no Size is currently subscribed (whether\n * because none was constructed, or because every Size has disposed). Used\n * by the SILVERY_STRICT canary that bounds `process.stdout` resize listener\n * count after app teardown.\n *\n * @internal\n */\nexport function _sharedResizeRefcount(stream: NodeJS.WriteStream): number {\n return sharedResizeRegistry.get(stream)?.count ?? 0\n}\n\n/**\n * Terminal size sub-owner.\n *\n * `cols`, `rows`, and `snapshot` are alien-signals `ReadSignal`s — call them\n * as functions to read the current value and, inside an `effect`, to\n * subscribe to changes. The first read (inside or outside an effect)\n * installs the lazy `stdout.on(\"resize\")` listener.\n *\n * ```ts\n * // Read once\n * const { cols, rows } = term.size.snapshot()\n *\n * // Subscribe to changes\n * effect(() => {\n * layout(term.size.cols(), term.size.rows()) // re-runs on every resize\n * })\n *\n * // React\n * const cols = useSignal(term.size.cols)\n * ```\n */\nexport interface Size extends Disposable {\n /** Current terminal width in columns. */\n readonly cols: ReadSignal<number>\n\n /** Current terminal height in rows. */\n readonly rows: ReadSignal<number>\n\n /** Current dimensions as a plain snapshot. */\n readonly snapshot: ReadSignal<SizeSnapshot>\n}\n\n/**\n * Trailing-edge debounce window. Long enough to absorb a multiplexer SIGWINCH\n * burst (cmux fires 4–6 events at ~80 ms intervals across ~300 ms during a\n * workspace switch); short enough to feel like settle, not lag, for a discrete\n * resize. Tests can shorten this via `coalesceMs`; consumers that want every\n * resize event published synchronously pass `coalesceMs: 0`.\n */\nconst RESIZE_COALESCE_MS = 200\nconst DEFAULT_COLS = 80\nconst DEFAULT_ROWS = 24\n\n/**\n * Options for `createSize`.\n */\nexport interface CreateSizeOptions {\n /** Override initial cols (default: `stdout.columns || 80`). */\n cols?: number\n /** Override initial rows (default: `stdout.rows || 24`). */\n rows?: number\n /**\n * Trailing-edge debounce window in ms. Defaults to 200. Every incoming\n * `resize` event resets the timer; the snapshot publishes only after\n * `coalesceMs` of silence. Set to 0 to disable coalescing entirely (each\n * `resize` publishes synchronously) — useful in test scenarios where the\n * harness already controls timing.\n */\n coalesceMs?: number\n}\n\nfunction validDimension(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback\n}\n\nfunction isValidDimension(value: number | undefined): boolean {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n}\n\n/**\n * Create a `Size` owner from a WriteStream. Subscribes to the stream's\n * `resize` event, coalesces bursts, and publishes the final geometry to\n * subscribers via alien-signals.\n *\n * Idempotent dispose: removes the resize listener and clears any pending\n * coalesce timer. Subsequent reads still work — the last known cols/rows\n * remain in the signal.\n */\nexport function createSize(stdout: NodeJS.WriteStream, options: CreateSizeOptions = {}): Size {\n const coalesceMs = options.coalesceMs ?? RESIZE_COALESCE_MS\n // When callers override dims explicitly (tests, headless-emulator setup),\n // their values are authoritative — we don't sync from stdout on install.\n // When neither is overridden we treat stdout as truth and re-read on first\n // access so any resize between construction and first read isn't lost.\n const dimsOverridden = options.cols !== undefined || options.rows !== undefined\n const initialCols =\n options.cols !== undefined ? options.cols : validDimension(stdout.columns, DEFAULT_COLS)\n const initialRows =\n options.rows !== undefined ? options.rows : validDimension(stdout.rows, DEFAULT_ROWS)\n\n // Writable signal owned privately — readers see it only through the\n // ReadSignal-shaped exports below. Consumers subscribe via\n // `effect(() => size.cols())` (or React's `useSignal(size.cols)`).\n // Seed snapshot is frozen so external casts (`as any`) can't corrupt owner\n // state silently. Every subsequent publish freezes a fresh object.\n const _snapshot = signal<SizeSnapshot>(Object.freeze({ cols: initialCols, rows: initialRows }))\n\n let disposed = false\n let coalesceTimer: ReturnType<typeof setTimeout> | null = null\n let installed = false\n let detachShared: (() => void) | null = null\n\n /**\n * Publish a new snapshot when dims changed, or when a valid same-size\n * `resize` event needs to wake resize subscribers.\n */\n const publish = (cols: number, rows: number, opts: { force?: boolean } = {}) => {\n const prev = _snapshot()\n if (!opts.force && prev.cols === cols && prev.rows === rows) {\n logSize(`publish skipped — no change (cols=${cols} rows=${rows})`)\n return\n }\n const suffix = prev.cols === cols && prev.rows === rows ? \" (same-size resize)\" : \"\"\n logSize(`publish: ${prev.cols}x${prev.rows} → ${cols}x${rows}${suffix}`)\n _snapshot(Object.freeze({ cols, rows }))\n }\n\n const flush = () => {\n coalesceTimer = null\n if (disposed) return\n const prev = _snapshot()\n const rawCols = stdout.columns\n const rawRows = stdout.rows\n const liveCols = validDimension(rawCols, prev.cols)\n const liveRows = validDimension(rawRows, prev.rows)\n const validResize = isValidDimension(rawCols) && isValidDimension(rawRows)\n logSize(`flush: stdout=${liveCols}x${liveRows} prev=${prev.cols}x${prev.rows}`)\n publish(liveCols, liveRows, { force: validResize })\n }\n\n const onResize = () => {\n logSize(\n `onResize fired: stdout=${stdout.columns}x${stdout.rows} disposed=${disposed} coalesceMs=${coalesceMs}`,\n )\n if (disposed) return\n if (coalesceMs === 0) {\n flush()\n return\n }\n // Trailing-edge debounce: every event resets the pending timer so a burst\n // of SIGWINCHs settles to a single publish carrying the *final* geometry.\n // Replaces the prior first-edge-then-flush design which let bursts wider\n // than the coalesce window leak every intermediate value (cmux's ~80 ms\n // inter-event spacing escaped the 16 ms window and produced 4–6 publishes\n // per workspace switch).\n if (coalesceTimer !== null) clearTimeout(coalesceTimer)\n coalesceTimer = setTimeout(flush, coalesceMs)\n }\n\n // Lazy install — the resize listener is attached on first read of any\n // public ReadSignal. Consumers that never read (e.g. style-only\n // createTerm() usages from chalk-compat call sites in km-tui/text/*)\n // pay zero listeners. Prevents the MaxListenersExceededWarning that\n // surfaced when every createTerm() eagerly wired one.\n //\n // Install-time resync: if the terminal resized between construction and\n // this first read (no listener attached yet → missed event), re-read the\n // live stdout dims and publish if they differ from the seed. Fixes the\n // \"first read returns stale value forever\" bug flagged by Pro review.\n //\n // Skipped when the caller explicitly overrode dims — those options are\n // authoritative (simulated sizes for tests, emulator setup).\n const ensureInstalled = () => {\n if (installed || disposed) return\n installed = true\n logSize(\n `ensureInstalled: attaching stdout.on(\"resize\") listener (shared) — ` +\n `dimsOverridden=${dimsOverridden} initial=${initialCols}x${initialRows} ` +\n `live=${stdout.columns}x${stdout.rows}`,\n )\n // Shared, refcounted attachment — multiple Sizes on the same stream\n // share ONE underlying `stream.on(\"resize\")` listener. See\n // `subscribeShared` block at top of this file.\n detachShared = subscribeShared(stdout, onResize)\n if (!dimsOverridden) {\n const prev = _snapshot()\n publish(validDimension(stdout.columns, prev.cols), validDimension(stdout.rows, prev.rows))\n }\n }\n\n // Plain arrow functions — the derivation (`.cols` / `.rows` field access)\n // is O(1) and `computed()`'s memoization doesn't earn its keep here.\n const cols: ReadSignal<number> = () => {\n ensureInstalled()\n return _snapshot().cols\n }\n const rows: ReadSignal<number> = () => {\n ensureInstalled()\n return _snapshot().rows\n }\n const snapshot: ReadSignal<SizeSnapshot> = () => {\n ensureInstalled()\n return _snapshot()\n }\n\n return {\n cols,\n rows,\n snapshot,\n [Symbol.dispose]() {\n if (disposed) return\n disposed = true\n if (installed) {\n // Detach our subscriber from the shared registration. The\n // underlying `stream.on(\"resize\")` is removed only when the last\n // Size detaches; refcount drops to 0 → handler off.\n detachShared?.()\n detachShared = null\n installed = false\n }\n if (coalesceTimer !== null) {\n clearTimeout(coalesceTimer)\n coalesceTimer = null\n }\n },\n }\n}\n\n/**\n * Create a fixed-dimensions `Size` for headless / emulator terminals.\n *\n * No stream is observed. `update(cols, rows)` is the only way dimensions\n * change; the emulator-backed term calls it on explicit resize.\n */\nexport function createFixedSize(initial: SizeSnapshot): Size & {\n update(cols: number, rows: number): void\n} {\n const _snapshot = signal<SizeSnapshot>(Object.freeze({ cols: initial.cols, rows: initial.rows }))\n let disposed = false\n\n const cols: ReadSignal<number> = () => _snapshot().cols\n const rows: ReadSignal<number> = () => _snapshot().rows\n const snapshot: ReadSignal<SizeSnapshot> = () => _snapshot()\n\n return {\n cols,\n rows,\n snapshot,\n update(nextCols: number, nextRows: number) {\n if (disposed) return\n _snapshot(Object.freeze({ cols: nextCols, rows: nextRows }))\n },\n [Symbol.dispose]() {\n if (disposed) return\n disposed = true\n },\n }\n}\n","/**\n * term.modes — single owner for terminal protocol modes, exposed as signals.\n *\n * Consolidates the previously-scattered enable/disable calls for:\n * - raw mode (stdin termios)\n * - alternate screen buffer (DEC private mode 1049)\n * - bracketed paste (DEC private mode 2004)\n * - Kitty keyboard protocol (CSI > flags u / CSI < u)\n * - mouse tracking (modes 1003 + 1006, optional 1016 SGR-Pixels)\n * - focus reporting (DEC private mode 1004)\n *\n * ## Why\n *\n * Terminal protocol modes are *shared global state*. The historical pattern —\n * every subsystem (probe, runtime, provider) calls `enableX()` / `disableX()`\n * independently — produces the same race class that killed raw mode in the\n * 2026-04-22 `wasRaw` incident: multi-tenant toggling of global termios/\n * terminal state across async boundaries.\n *\n * ## API shape: signals\n *\n * Each mode is a callable alien-signals `Signal<T>`:\n *\n * - `modes.altScreen()` — read current value\n * - `modes.altScreen(true)` — write; internal effect emits ANSI on change\n * - `effect(() => modes.altScreen())` — subscribe to changes\n *\n * Idempotence is automatic: alien-signals doesn't fire dependents when the\n * new value equals the prior value, so `modes.altScreen(true)` twice produces\n * one ANSI write.\n *\n * ## Ownership contract\n *\n * One `Modes` instance per Term. Construction is cheap — no ANSI is emitted\n * until the first write to a signal. Callers write modes ONCE at session\n * start and restore them ONCE on dispose. Mid-session re-toggling is\n * permitted (e.g. suspend/resume flows need to drop protocols before SIGTSTP),\n * but MUST go through the owner so state stays consistent.\n *\n * Signals reflect the last value *this owner* wrote. They are the app's\n * source of truth — the terminal has no query-for-current-mode protocol for\n * most of these.\n *\n * ## Dispose\n *\n * Restores every mode this owner activated (ignores modes the owner never\n * touched — setting `rawMode=false` when we never enabled raw would be wrong\n * on a shared stdin). Dispose writes `false` to each ever-activated signal;\n * the internal effects emit the disable ANSI naturally. Idempotent.\n *\n * Bead: km-silvery.term-sub-owners (Phase 4) + km-silvery.modes-as-signals.\n */\n\nimport { signal, effect, type Signal } from \"@silvery/signals\"\n\nimport {\n enableMouse,\n disableMouse,\n enableKittyKeyboard,\n disableKittyKeyboard,\n enableBracketedPaste,\n disableBracketedPaste,\n} from \"@silvery/ansi\"\n\nconst CSI = \"\\x1b[\"\n\n/** DEC private mode 1004: focus-in / focus-out reporting. */\nconst ENABLE_FOCUS_REPORTING = `${CSI}?1004h`\nconst DISABLE_FOCUS_REPORTING = `${CSI}?1004l`\n\n/** DEC private mode 1049: alternate screen buffer (save + switch). */\nconst ENTER_ALT_SCREEN = `${CSI}?1049h`\nconst LEAVE_ALT_SCREEN = `${CSI}?1049l`\n\n/**\n * Kitty keyboard protocol flags (bitfield).\n *\n * | Flag | Bit | Description |\n * | ---- | --- | ----------------------------------------- |\n * | 1 | 0 | Disambiguate escape codes |\n * | 2 | 1 | Report event types (press/repeat/release) |\n * | 4 | 2 | Report alternate keys |\n * | 8 | 3 | Report all keys as escape codes |\n * | 16 | 4 | Report associated text |\n */\nexport const KittyFlags = {\n DISAMBIGUATE: 1,\n REPORT_EVENTS: 2,\n REPORT_ALTERNATE: 4,\n REPORT_ALL_KEYS: 8,\n REPORT_TEXT: 16,\n} as const\n\n/**\n * Mode names that can be passed to `modes.enable(...)`. These cover every\n * toggleable mode on the `Modes` owner. `kittyKeyboard` accepts a bitfield\n * rather than `true` and is handled via the per-mode signal directly (see\n * the `kittyKeyboard` signal below) — it's intentionally excluded from\n * `enable()` because the \"on\" value is not a single fixed boolean.\n */\nexport type ModeName = \"rawMode\" | \"altScreen\" | \"bracketedPaste\" | \"mouse\" | \"focusReporting\"\n\nexport type MouseTrackingMode = boolean | \"pixel\"\n\n/**\n * Terminal protocol modes sub-owner.\n *\n * Each property is a callable alien-signals `Signal`:\n * - read: `modes.altScreen()` → `boolean`\n * - write: `modes.altScreen(true)` — internal effect emits ANSI on change\n * - subscribe: `effect(() => modes.altScreen())`\n *\n * `dispose()` writes `false` to every signal that was ever activated, which\n * drives the same effects to emit the disable ANSI. Mode signals that were\n * never touched stay `false` — no ANSI is emitted for them, matching the\n * shared-stdin safety contract.\n *\n * For scope-style ownership (`scope.use(modes.enable(\"altScreen\"))`), use\n * `enable()` — it returns a `Disposable` that restores the mode to whatever\n * it was before the call, independent of the owner's full `dispose()`.\n */\nexport interface Modes extends Disposable {\n /**\n * stdin raw mode.\n *\n * wasRaw note: prefer a single `modes.rawMode(true)` at session start; do\n * not capture-and-restore around async work. See\n * `vendor/silvery/CLAUDE.md` \"Anti-pattern: wasRaw\".\n */\n readonly rawMode: Signal<boolean>\n\n /** Alternate screen buffer (DEC 1049). */\n readonly altScreen: Signal<boolean>\n\n /** Bracketed paste (DEC 2004). */\n readonly bracketedPaste: Signal<boolean>\n\n /**\n * Kitty keyboard protocol flags. Bitfield (see `KittyFlags`) to enable,\n * `false` to disable. A change from one non-false bitfield to another\n * emits a fresh `CSI > flags u` write.\n */\n readonly kittyKeyboard: Signal<number | false>\n\n /** SGR mouse tracking (xterm modes 1003 + 1006, or 1003 + 1006 + 1016). */\n readonly mouse: Signal<MouseTrackingMode>\n\n /** Focus-in / focus-out reporting (DEC 1004). */\n readonly focusReporting: Signal<boolean>\n\n /**\n * Enable a mode and return a `Disposable` that restores the mode to its\n * prior value on disposal. Complements the per-mode signals for callers\n * that want scope-style ownership:\n *\n * ```ts\n * scope.use(term.modes.enable(\"altScreen\"))\n * // …later, when the scope disposes, altScreen flips back to its\n * // pre-enable value.\n * ```\n *\n * Idempotent across repeated `enable(name)` calls (alien-signals equality\n * short-circuits same-value writes). Disposing the returned handle twice\n * is a no-op. The kitty keyboard bitfield is intentionally not covered —\n * write `modes.kittyKeyboard(flags)` directly for that shape.\n */\n enable(name: ModeName): Disposable\n}\n\n/**\n * Options for `createModes()`.\n *\n * The owner needs:\n * - a write function for ANSI sequences (routes through Output if activated,\n * else bare `stdout.write`)\n * - the stdin stream (for `rawMode` — termios toggle, not ANSI)\n */\nexport interface CreateModesOptions {\n /** Write raw ANSI bytes to stdout. */\n write: (data: string) => void\n /** stdin stream — used only for raw-mode termios toggles. */\n stdin: NodeJS.ReadStream\n}\n\n/**\n * Create a `Modes` sub-owner. Does not emit any ANSI at construction — all\n * sequences are written lazily on the first change to a mode signal.\n */\nexport function createModes(opts: CreateModesOptions): Modes {\n const { write, stdin } = opts\n\n const rawMode = signal<boolean>(false)\n const altScreen = signal<boolean>(false)\n const bracketedPaste = signal<boolean>(false)\n const kittyKeyboard = signal<number | false>(false)\n const mouse = signal<MouseTrackingMode>(false)\n const focusReporting = signal<boolean>(false)\n\n // Track which modes this owner ever activated. Dispose only restores those,\n // matching the pre-signals behaviour — we must not emit a disable sequence\n // for a mode a neighbouring owner intentionally set up.\n let touchedRawMode = false\n let touchedAltScreen = false\n let touchedBracketedPaste = false\n let touchedKittyKeyboard = false\n let touchedMouse = false\n let touchedFocusReporting = false\n\n let disposed = false\n let disposing = false\n\n // Each mode has a dedicated effect: when the signal changes, emit the\n // matching enable/disable ANSI. Same-value writes don't fire dependents\n // (alien-signals equality check), so idempotence is automatic.\n //\n // Each effect reads its signal once, which seeds the dependency. The first\n // firing is the \"seed\" read (value=false) — we skip emitting ANSI there so\n // construction stays free, matching the previous lazy-first-write contract.\n let rawSeeded = false\n const stopRawEffect = effect(() => {\n const on = rawMode()\n if (!rawSeeded) {\n rawSeeded = true\n return\n }\n if (disposed && !disposing) return\n if (on) touchedRawMode = true\n if (stdin.isTTY) {\n try {\n stdin.setRawMode(on)\n } catch {\n // stdin may be closed mid-call — ignore, signal value still tracked\n }\n }\n })\n\n let altSeeded = false\n const stopAltEffect = effect(() => {\n const on = altScreen()\n if (!altSeeded) {\n altSeeded = true\n return\n }\n if (disposed && !disposing) return\n if (on) touchedAltScreen = true\n try {\n write(on ? ENTER_ALT_SCREEN : LEAVE_ALT_SCREEN)\n } catch {\n // Terminal may already be gone (SSH disconnect, etc.)\n }\n })\n\n let pasteSeeded = false\n const stopPasteEffect = effect(() => {\n const on = bracketedPaste()\n if (!pasteSeeded) {\n pasteSeeded = true\n return\n }\n if (disposed && !disposing) return\n if (on) touchedBracketedPaste = true\n try {\n write(on ? enableBracketedPaste() : disableBracketedPaste())\n } catch {\n // Terminal may already be gone\n }\n })\n\n let kittySeeded = false\n const stopKittyEffect = effect(() => {\n const flags = kittyKeyboard()\n if (!kittySeeded) {\n kittySeeded = true\n return\n }\n if (disposed && !disposing) return\n if (flags !== false) touchedKittyKeyboard = true\n try {\n write(flags === false ? disableKittyKeyboard() : enableKittyKeyboard(flags))\n } catch {\n // Terminal may already be gone\n }\n })\n\n let mouseSeeded = false\n const stopMouseEffect = effect(() => {\n const on = mouse()\n if (!mouseSeeded) {\n mouseSeeded = true\n return\n }\n if (disposed && !disposing) return\n if (on) touchedMouse = true\n try {\n write(on ? enableMouse({ pixels: on === \"pixel\" }) : disableMouse())\n } catch {\n // Terminal may already be gone\n }\n })\n\n let focusSeeded = false\n const stopFocusEffect = effect(() => {\n const on = focusReporting()\n if (!focusSeeded) {\n focusSeeded = true\n return\n }\n if (disposed && !disposing) return\n if (on) touchedFocusReporting = true\n try {\n write(on ? ENABLE_FOCUS_REPORTING : DISABLE_FOCUS_REPORTING)\n } catch {\n // Terminal may already be gone\n }\n })\n\n const dispose = () => {\n if (disposed) return\n disposed = true\n disposing = true\n\n // Restore ONLY what this owner activated. Order matters: drop protocols\n // first (so the terminal stops sending their events), then leave the alt\n // screen, then drop raw. Mirrors the order of `restoreTerminalState()`\n // in terminal-lifecycle.ts.\n //\n // We flip each signal back to its inactive value; the per-mode effect\n // emits the disable ANSI as a side-effect. Effects that were never\n // activated stay at `false` (no value change → no emission).\n if (touchedFocusReporting) focusReporting(false)\n if (touchedMouse) mouse(false)\n if (touchedKittyKeyboard) kittyKeyboard(false)\n if (touchedBracketedPaste) bracketedPaste(false)\n if (touchedAltScreen) altScreen(false)\n if (touchedRawMode) rawMode(false)\n\n disposing = false\n\n // Tear down the effects now that the restore writes have fired. Any\n // further writes to the signals after this point update the values but\n // do not emit ANSI (effects are stopped, and the `disposed && !disposing`\n // guard blocks the edge case where tearDown order races).\n stopRawEffect()\n stopAltEffect()\n stopPasteEffect()\n stopKittyEffect()\n stopMouseEffect()\n stopFocusEffect()\n }\n\n function enable(name: ModeName): Disposable {\n const sig =\n name === \"rawMode\"\n ? rawMode\n : name === \"altScreen\"\n ? altScreen\n : name === \"bracketedPaste\"\n ? bracketedPaste\n : name === \"mouse\"\n ? mouse\n : focusReporting\n const prior = sig()\n sig(true)\n let disposed = false\n return {\n [Symbol.dispose]() {\n if (disposed) return\n disposed = true\n sig(prior)\n },\n }\n }\n\n return {\n rawMode,\n altScreen,\n bracketedPaste,\n kittyKeyboard,\n mouse,\n focusReporting,\n enable,\n [Symbol.dispose]: dispose,\n }\n}\n","/**\n * term.signals — single SignalScope per Term lifetime with topologically-ordered\n * teardown.\n *\n * ## Why\n *\n * The 2026-04-22 shared-global audit found 78 `process.on(\"SIGINT\" | \"SIGTERM\" |\n * \"SIGTSTP\" | \"SIGWINCH\" | \"exit\" | \"beforeExit\" | …)` registrations across km\n * + silvery with no documented cleanup order. Handlers fire in registration\n * order. If an earlier handler crashes, the Node.js default behaviour may skip\n * later handlers or the process may exit before their cleanup runs — the same\n * class of resource-leak race that the `wasRaw` finding exposed for raw mode.\n *\n * Signals is the same META-fix as Output / Modes / Input: one owner per Term\n * mediates every registration for a given signal. On dispose (or on signal\n * delivery) handlers fire in priority / dependency order, each wrapped in\n * try/catch so a single failing handler doesn't block the rest.\n *\n * ## API shape\n *\n * const unregister = term.signals.on(\"SIGINT\", () => closeDb(), {\n * priority: 10, // lower = runs first\n * before: [\"flush-logs\"], // or explicit dep graph\n * after: [\"save-state\"],\n * name: \"close-db\", // optional handle for before/after\n * })\n * term.signals.dispose() // cascades from term.dispose()\n *\n * `priority` is a simple sort key (number, default 0). `before` / `after`\n * reference handler `name`s. `dispose()` runs every registered handler in\n * topological order, catches errors, and is idempotent.\n *\n * The return value of `on()` is both callable (`unregister()`) and\n * `Disposable` (`using sub = term.signals.on(...)` and\n * `scope.use(term.signals.on(...))`). All three forms unregister the handler\n * without firing it.\n *\n * ## Not covered by this owner\n *\n * - `apps/km-tui/src/state/raw-signals.ts::restoreTerminal` stays as the\n * emergency last-ditch crash handler (runs on `uncaughtException`). It\n * must run even if the Term (and its Signals) has already been disposed.\n *\n * Bead: km-silvery.term-sub-owners (Phase 6).\n */\n\n/** Process signal / lifecycle event the owner understands. */\nexport type SignalName =\n | NodeJS.Signals\n | \"exit\"\n | \"beforeExit\"\n | \"uncaughtException\"\n | \"unhandledRejection\"\n\n/** Options per registration. */\nexport interface SignalOnOptions {\n /**\n * Sort key — lower runs first on dispose / signal delivery. Default 0.\n *\n * Rule of thumb:\n * - 0–9: app-level cleanup (close DB, cancel pending work)\n * - 10–19: runtime cleanup (stop schedulers, drain queues)\n * - 20–29: terminal cleanup (restore modes, leave alt screen)\n * - 30+: emergency / last-ditch\n *\n * `before` / `after` take precedence — priority is only a tiebreaker.\n */\n priority?: number\n\n /**\n * Handler name — required if you want `before`/`after` to reference this\n * handler. If omitted, a unique id is generated.\n */\n name?: string\n\n /** Handler names that must run AFTER this one. */\n before?: string[]\n\n /** Handler names that must run BEFORE this one. */\n after?: string[]\n\n /**\n * If `true`, the handler also runs on `dispose()` (before any process-level\n * signal handler is detached). Default: true — dispose is the primary\n * teardown path.\n */\n onDispose?: boolean\n\n /**\n * If `true`, the handler runs when the named signal is delivered to the\n * process (via `process.on(signal, …)`). Default: true.\n */\n onSignal?: boolean\n}\n\n/**\n * Unregister function returned by `signals.on(...)`. Callable as a plain\n * function (backward-compat: `unregister()`) and also implements both\n * `Symbol.dispose` and `Symbol.asyncDispose` so it works with sync `using`,\n * async `await using`, and `Scope` (which is `AsyncDisposableStack`-based\n * and only accepts values with `Symbol.asyncDispose`). All three forms\n * remove the handler from the owner's registry without firing it.\n */\nexport type SignalUnregister = (() => void) & Disposable & AsyncDisposable\n\n/**\n * Signals sub-owner.\n *\n * One per Term. Mediates every `process.on(signalName, …)` registration for\n * the Term's lifetime, running handlers in priority/dependency order on\n * signal delivery or on `dispose()`.\n */\nexport interface Signals extends Disposable {\n /**\n * Register a handler for a process signal or lifecycle event. Returns a\n * `SignalUnregister` — a callable `Disposable`. Either `unregister()` or\n * `unregister[Symbol.dispose]()` (implicitly via `using` / `scope.use`)\n * removes the handler from this owner's registry (does not fire the handler).\n *\n * The first registration for a given signal installs a shared\n * `process.on(signal, …)` listener; subsequent registrations reuse it.\n * `dispose()` removes the shared listener.\n */\n on(\n signal: SignalName,\n handler: () => void | Promise<void>,\n opts?: SignalOnOptions,\n ): SignalUnregister\n\n /**\n * Synchronous teardown. Runs every registered handler (with `onDispose:\n * true`, the default) in priority/dependency order, catching errors so one\n * failing handler can't block the rest. Idempotent.\n *\n * Handlers that return Promises are awaited best-effort via a microtask —\n * but `dispose()` itself is synchronous because it runs under `using` /\n * Symbol.dispose semantics, and on signal delivery the process may exit\n * before any async work resolves.\n */\n dispose(): void\n\n /** True after `dispose()` / `Symbol.dispose` has run. */\n readonly isDisposed: boolean\n\n /** Number of live registrations across all signals. */\n readonly size: number\n}\n\ninterface Entry {\n id: string\n name: string\n signal: SignalName\n handler: () => void | Promise<void>\n priority: number\n before: string[]\n after: string[]\n onDispose: boolean\n onSignal: boolean\n}\n\n/**\n * Options for `createSignals`.\n */\nexport interface CreateSignalsOptions {\n /**\n * Override the process-level event source. Tests pass a fake `process`\n * to drive signal delivery without touching real signals.\n * Defaults to Node's `process` global.\n */\n process?: NodeJS.Process\n\n /**\n * Error hook — called for every handler that throws. Default: swallow.\n * Tests use this to assert isolation semantics.\n */\n onError?: (error: unknown, entry: { name: string; signal: SignalName }) => void\n}\n\n/**\n * Create a `Signals` sub-owner. Installs no process-level listeners until the\n * first `on()` call; removes them on `dispose()`.\n */\nexport function createSignals(opts: CreateSignalsOptions = {}): Signals {\n const proc = opts.process ?? process\n const onError = opts.onError\n\n let disposed = false\n let nextId = 0\n\n /** All registrations, regardless of signal. */\n const entries = new Map<string, Entry>()\n\n /** Reverse index: every live handler name → its entry id. Used to reject\n * duplicate names in `on()`, which would otherwise produce an ambiguous\n * topological order when two handlers both claim the same `name` as a\n * `before`/`after` key. */\n const byName = new Map<string, string>()\n\n /** Shared `process.on(signal, …)` listeners, one per signal. */\n const installed = new Map<SignalName, () => void>()\n\n function makeId(): string {\n return `signals-${++nextId}`\n }\n\n /**\n * Wrap an unregister function so it's both callable and `Disposable`. This\n * keeps every existing `const off = signals.on(...); off()` caller working\n * while also enabling `using sub = signals.on(...)` and\n * `scope.use(signals.on(...))`.\n */\n function makeUnregister(fn: () => void): SignalUnregister {\n // Attach both Symbol.dispose (sync `using`) and Symbol.asyncDispose\n // (`await using` / `Scope.use(...)` — `AsyncDisposableStack` only\n // accepts values with Symbol.asyncDispose). The unregister itself is\n // synchronous; the async variant just resolves immediately.\n return Object.assign(fn, {\n [Symbol.dispose]() {\n fn()\n },\n [Symbol.asyncDispose]() {\n fn()\n return Promise.resolve()\n },\n })\n }\n\n function entriesFor(signal: SignalName): Entry[] {\n const out: Entry[] = []\n for (const e of entries.values()) {\n if (e.signal === signal) out.push(e)\n }\n return out\n }\n\n /**\n * Topological sort of entries respecting `before`/`after` deps, with\n * `priority` as the tiebreaker. Returns entries in the order they should\n * run. Cycles fall back to priority order (cycle edges silently dropped).\n */\n function ordered(subset: Entry[]): Entry[] {\n // Map name → entry for dep resolution.\n const byName = new Map<string, Entry>()\n for (const e of subset) byName.set(e.name, e)\n\n // Adjacency: edge from A → B means \"A must run before B\".\n const outgoing = new Map<string, Set<string>>()\n const incoming = new Map<string, number>()\n for (const e of subset) {\n outgoing.set(e.name, new Set())\n incoming.set(e.name, 0)\n }\n for (const e of subset) {\n // `before: [\"X\"]` — this entry runs before X → edge this → X\n for (const target of e.before) {\n if (!byName.has(target)) continue\n const set = outgoing.get(e.name)!\n if (!set.has(target)) {\n set.add(target)\n incoming.set(target, (incoming.get(target) ?? 0) + 1)\n }\n }\n // `after: [\"Y\"]` — this entry runs after Y → edge Y → this\n for (const source of e.after) {\n if (!byName.has(source)) continue\n const set = outgoing.get(source)!\n if (!set.has(e.name)) {\n set.add(e.name)\n incoming.set(e.name, (incoming.get(e.name) ?? 0) + 1)\n }\n }\n }\n\n // Kahn's algorithm, tiebroken by (priority, insertion order via id).\n const byKey = (a: Entry, b: Entry) => {\n if (a.priority !== b.priority) return a.priority - b.priority\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0\n }\n const ready: Entry[] = []\n for (const e of subset) {\n if ((incoming.get(e.name) ?? 0) === 0) ready.push(e)\n }\n ready.sort(byKey)\n\n const result: Entry[] = []\n const visited = new Set<string>()\n while (ready.length > 0) {\n const next = ready.shift()!\n if (visited.has(next.name)) continue\n visited.add(next.name)\n result.push(next)\n for (const downstream of outgoing.get(next.name) ?? []) {\n const count = (incoming.get(downstream) ?? 0) - 1\n incoming.set(downstream, count)\n if (count === 0) {\n const entry = byName.get(downstream)\n if (entry && !visited.has(entry.name)) {\n ready.push(entry)\n ready.sort(byKey)\n }\n }\n }\n }\n\n // Cycle fallback — any entry not yet visited gets appended in priority\n // order. Silently tolerates cyclic deps (they're a bug, but we prefer a\n // best-effort teardown over throwing during a crash handler).\n const remaining = subset.filter((e) => !visited.has(e.name)).sort(byKey)\n result.push(...remaining)\n return result\n }\n\n function runHandlers(list: Entry[]): void {\n for (const entry of list) {\n try {\n const maybe = entry.handler()\n // Async handlers are awaited best-effort — we can't block a sync\n // dispose. Any rejection after this point is caught below; we don't\n // want to hang the crash path on a slow Promise.\n if (maybe && typeof (maybe as Promise<unknown>).then === \"function\") {\n ;(maybe as Promise<unknown>).catch((err) => {\n if (onError) onError(err, { name: entry.name, signal: entry.signal })\n })\n }\n } catch (err) {\n if (onError) onError(err, { name: entry.name, signal: entry.signal })\n }\n }\n }\n\n function installIfNeeded(signal: SignalName): void {\n if (installed.has(signal)) return\n const listener = () => {\n if (disposed) return\n const list = ordered(entriesFor(signal).filter((e) => e.onSignal))\n runHandlers(list)\n }\n proc.on(signal, listener)\n installed.set(signal, listener)\n }\n\n function uninstall(signal: SignalName): void {\n const listener = installed.get(signal)\n if (!listener) return\n try {\n proc.off(signal, listener)\n } catch {\n // process may be exiting\n }\n installed.delete(signal)\n }\n\n function on(\n signal: SignalName,\n handler: () => void | Promise<void>,\n options: SignalOnOptions = {},\n ): SignalUnregister {\n if (disposed) {\n // After dispose, registrations are a no-op — callers that keep a stale\n // owner reference shouldn't accidentally re-install listeners.\n return makeUnregister(() => {})\n }\n const id = makeId()\n const name = options.name ?? id\n if (byName.has(name)) {\n throw new Error(\n `term.signals.on: handler name ${JSON.stringify(name)} is already registered. ` +\n `Names must be unique across the Signals owner so that before/after refs ` +\n `resolve unambiguously. Unregister the previous handler first, or pick a ` +\n `different name.`,\n )\n }\n const entry: Entry = {\n id,\n name,\n signal,\n handler,\n priority: options.priority ?? 0,\n before: options.before ?? [],\n after: options.after ?? [],\n onDispose: options.onDispose !== false,\n onSignal: options.onSignal !== false,\n }\n entries.set(id, entry)\n byName.set(name, id)\n if (entry.onSignal) installIfNeeded(signal)\n\n return makeUnregister(() => {\n const existing = entries.get(id)\n if (!existing) return\n entries.delete(id)\n byName.delete(existing.name)\n // If this was the last registration for the signal AND no other entries\n // need it for onSignal, drop the shared listener. Rare path — usually\n // dispose() handles the whole batch.\n if (!entriesFor(signal).some((e) => e.onSignal)) {\n uninstall(signal)\n }\n })\n }\n\n function dispose(): void {\n if (disposed) return\n disposed = true\n\n // Run dispose handlers once, across ALL signals, in a single unified\n // topological order. Using one global pass means cross-signal deps\n // (e.g. \"restore terminal after close DB\") work naturally; callers\n // don't have to remember which signal their handler was registered on.\n const disposalSet = [...entries.values()].filter((e) => e.onDispose)\n const sorted = ordered(disposalSet)\n runHandlers(sorted)\n\n // Remove every process-level listener we installed.\n for (const signal of [...installed.keys()]) {\n uninstall(signal)\n }\n\n entries.clear()\n byName.clear()\n }\n\n return {\n on,\n dispose,\n get isDisposed() {\n return disposed\n },\n get size() {\n return entries.size\n },\n [Symbol.dispose]: dispose,\n }\n}\n","/**\n * Console — single-owner console.* interceptor for a silvery session.\n *\n * Captures `console.log/info/warn/error/debug` during alt-screen rendering so\n * stray log output doesn't corrupt the TUI display. Entries are buffered and\n * can be replayed to the normal streams on exit (so the operator sees what\n * would have been printed) or rendered live inside the app via the `<Console>`\n * component (which reads `subscribe` + `getSnapshot`).\n *\n * Mirrors the other sub-owners in shape: constructed cheaply at term creation,\n * does nothing until `capture()` is called, `Symbol.dispose` is idempotent.\n *\n * ## Lifecycle\n *\n * One Console per Term. Capture is opt-in (`term.console.capture({suppress:true})`)\n * because hoisting it unconditionally at term creation would silently swallow\n * any log output from the caller's own setup code. `restore()` undoes the\n * patch; `dispose()` restores + clears subscribers.\n *\n * ## Relation to Output\n *\n * `Output` patches `process.stdout.write` / `process.stderr.write` / `console.*`\n * during alt-screen to suppress foreign writes and redirect stderr to\n * `DEBUG_LOG`. `Console` patches `console.*` alone to *capture* entries for\n * display + replay. They are complementary:\n *\n * - Output's console patch is a sink (write to DEBUG_LOG or drop).\n * - Console's patch is a tap (record for later use AND optionally forward).\n *\n * **Call order: Output first, then Console.** Last patch wins, so whichever\n * owner wraps `console.log` last is the one user calls hit first. With Output\n * first and Console second, `console.log(x)` hits Console's tap, Console\n * records the entry, and (unless `suppress: true`) forwards to its captured\n * \"original\" — which is Output's redirect wrapper. Net effect: tap fires for\n * every call, and Output's DEBUG_LOG redirect still applies to non-silvery\n * writes. Reversing the order (Console first, Output second) is the 2026-04-22\n * pro-review bug: Output overwrites Console's wrapper and the tap never fires.\n *\n * `restore()` in the reverse order — Console first, then Output — to unwind\n * the layering symmetrically.\n */\n\nimport { signal, type ReadSignal } from \"@silvery/signals\"\n\nimport type { ConsoleEntry, ConsoleMethod } from \"../../ansi/types\"\nimport { createConsoleRouter, type ConsoleRouter } from \"./console-router\"\n\n/**\n * Aggregate counts of captured console output by severity.\n */\nexport interface ConsoleStats {\n total: number\n errors: number\n warnings: number\n}\n\n/**\n * Options for `console.capture()`.\n */\nexport interface ConsoleCaptureOptions {\n /**\n * Suppress forwarding to the original console methods.\n * Use in TUI / alt-screen mode where the raw output would corrupt the display.\n * Default: false.\n */\n suppress?: boolean\n /**\n * Store full entries in memory (default: true).\n * Set false for count-only mode — `getSnapshot()` returns empty, but\n * `getStats()` still tracks counts. Avoids unbounded memory growth for\n * long-running sessions where you only care about warning/error badges.\n */\n capture?: boolean\n}\n\n/**\n * Console — single-owner console.* capture + replay for a silvery session.\n *\n * Constructed lazily by `createTerm()` (no patching until `capture()`).\n * `subscribe` + `getSnapshot` are shaped for React's `useSyncExternalStore` —\n * each change produces a new array reference.\n */\nexport interface Console extends Disposable {\n /**\n * Start patching `console.log/info/warn/error/debug`. Idempotent — calling\n * while already capturing is a no-op (options are ignored on re-entry;\n * `restore()` then `capture()` again to change behaviour).\n */\n capture(options?: ConsoleCaptureOptions): void\n\n /**\n * Restore original console methods. Idempotent. Subscribers survive; you can\n * `capture()` again without re-subscribing. `dispose()` is the terminal\n * variant that also clears subscribers.\n */\n restore(): void\n\n /**\n * Whether `capture()` is currently active — a `ReadSignal<boolean>`.\n * Call `console.capturing()` to read; subscribe via\n * `effect(() => console.capturing())`. The owner writes it internally from\n * `capture()` / `restore()`.\n */\n readonly capturing: ReadSignal<boolean>\n\n /**\n * Notification signal — increments by 1 per captured entry (stats.total).\n * Cheap: no array copy, no object allocation. Consumers subscribe via\n * `effect(() => console.count())` and pull the full list lazily (via\n * `entriesSnapshot()`) only when they need it — typically on a debounce\n * flush in a React hook. Replaces the per-entry frozen-slice publish that\n * degraded to O(n²) for long sessions (Pro review 2026-04-22 P1-9).\n */\n readonly count: ReadSignal<number>\n\n /**\n * Return a frozen snapshot of captured entries at this moment. Slices on\n * demand — callers pay O(n) only when they actually need the list, not\n * on every log. Returns an empty frozen array when `capture=false` was\n * passed.\n */\n entriesSnapshot(): readonly ConsoleEntry[]\n\n /** Aggregate counts. Tracked even when `capture=false`. */\n getStats(): ConsoleStats\n\n /**\n * Replay captured entries to explicit streams (typically `process.stdout` +\n * `process.stderr` after exiting alt-screen). Entries whose stream was\n * `'stderr'` go to the stderr stream; the rest go to stdout. Does not clear\n * entries — call this alongside `dispose()` at TUI exit.\n */\n replay(stdout: NodeJS.WriteStream, stderr: NodeJS.WriteStream): void\n\n dispose(): void\n [Symbol.dispose](): void\n}\n\nconst STDERR_METHODS = new Set<ConsoleMethod>([\"error\", \"warn\"])\nconst EMPTY_ENTRIES: readonly ConsoleEntry[] = Object.freeze([])\n\n/**\n * Create a Console owner backed by a ConsoleRouter. Starts in the restored\n * (non-capturing) state — call `capture()` to register the tap and (when\n * `suppress: true`) also push a suppress sink policy on the router.\n *\n * When no router is provided, Console constructs a private one patched\n * against the given `target` console global. Production Term factories\n * should pass a shared router so Console's tap and Output's sink layer\n * deterministically via a single patch site.\n */\nexport function createConsole(\n target: globalThis.Console = globalThis.console,\n router?: ConsoleRouter,\n): Console {\n let disposed = false\n // Reactive `capturing` — written only by capture()/restore(), read by the\n // public `capturing` ReadSignal.\n const _capturing = signal<boolean>(false)\n let captureEntries = true\n\n // Authoritative ConsoleEntry[] — kept mutable; snapshots are frozen on\n // demand via entriesSnapshot(). Replaces the per-log frozen-slice publish\n // that degraded to O(n²) over long sessions (Pro review P1-9).\n const buffer: ConsoleEntry[] = []\n // Notification signal — increments on every captured entry. Cheap: no\n // array copy. Consumers subscribe via effect(() => console.count()),\n // then pull the buffer lazily with entriesSnapshot().\n const _count = signal<number>(0)\n const stats: ConsoleStats = { total: 0, errors: 0, warnings: 0 }\n\n const ownsRouter = !router\n const _router: ConsoleRouter = router ?? createConsoleRouter(target)\n\n let unregisterTap: (() => void) | null = null\n let unregisterSink: (() => void) | null = null\n\n function capture(options?: ConsoleCaptureOptions): void {\n if (disposed) return\n if (_capturing()) return\n _capturing(true)\n captureEntries = options?.capture ?? true\n // Tap records each call into the entry buffer + stats.\n unregisterTap = _router.registerTap((call) => {\n stats.total++\n if (call.method === \"error\") stats.errors++\n else if (call.method === \"warn\") stats.warnings++\n if (captureEntries) {\n buffer.push({\n method: call.method,\n args: call.args,\n stream: STDERR_METHODS.has(call.method) ? \"stderr\" : \"stdout\",\n })\n }\n // Always advance count so non-capturing consumers (count-only mode)\n // still get a reactive heartbeat for badges / activity indicators.\n _count(stats.total)\n })\n // `suppress: true` asks the router to drop forwarding entirely.\n // Without it, the router forwards to the active sink (Output's redirect)\n // or, if no sink is registered, to the original method.\n if (options?.suppress) {\n unregisterSink = _router.registerSink({ suppress: true })\n }\n }\n\n function restore(): void {\n if (!_capturing()) return\n _capturing(false)\n unregisterTap?.()\n unregisterTap = null\n unregisterSink?.()\n unregisterSink = null\n }\n\n function replay(stdout: NodeJS.WriteStream, stderr: NodeJS.WriteStream): void {\n for (const entry of buffer) {\n const stream = entry.stream === \"stderr\" ? stderr : stdout\n const line =\n entry.args\n .map((a) =>\n typeof a === \"string\"\n ? a\n : a instanceof Error\n ? `${a.name}: ${a.message}`\n : safeJsonStringify(a),\n )\n .join(\" \") + \"\\n\"\n stream.write(line)\n }\n }\n\n function dispose(): void {\n if (disposed) return\n disposed = true\n restore()\n if (ownsRouter) _router.dispose()\n }\n\n return {\n capture,\n restore,\n capturing: _capturing as ReadSignal<boolean>,\n count: _count as ReadSignal<number>,\n entriesSnapshot(): readonly ConsoleEntry[] {\n if (!captureEntries) return EMPTY_ENTRIES\n return Object.freeze(buffer.slice())\n },\n getStats() {\n return { ...stats }\n },\n replay,\n dispose,\n [Symbol.dispose]: dispose,\n }\n}\n\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n","/**\n * Internal accessor for raw stdin/stdout on a Term.\n *\n * The public `Term` interface (`../ansi/term.ts`) deliberately omits\n * `stdin` / `stdout`: direct stream access is the leak vector that produced\n * the `wasRaw` race class. Sub-owners (`term.input`, `term.output`,\n * `term.modes`, etc.) are the supported surface for every consumer.\n *\n * At runtime, the raw streams are stored on the term's underlying object\n * under two non-enumerable `Symbol` keys so external `as any` casts cannot\n * reach them — only code that imports `STDIN_SYMBOL` / `STDOUT_SYMBOL` from\n * this module can read them, and the module's import is restricted to\n * silvery's own runtime/ and ansi/ directories by the ownership lint\n * (`packages/km-infra/scripts/check-stdin-ownership.sh` in km).\n *\n * BUT: silvery's own `run()` adapter still has to thread raw streams into the\n * legacy `createApp.run()` option bag (`stdin: ReadStream`, `stdout: WriteStream`)\n * for the emulator + real-terminal paths. Until createApp grows a Term-aware\n * overload, this internal accessor is the single legitimate bridge.\n */\n\nimport type { Term } from \"../ansi/term\"\n\n/** Private symbol key for the raw stdin stream on a term's underlying object. */\nexport const STDIN_SYMBOL: unique symbol = Symbol.for(\"silvery.internal.stdin\")\n/** Private symbol key for the raw stdout stream on a term's underlying object. */\nexport const STDOUT_SYMBOL: unique symbol = Symbol.for(\"silvery.internal.stdout\")\n\n/**\n * Internal shape — silvery runtime adapters only. Every Term factory in\n * `term.ts` (createNodeTerm, createHeadlessTerm, createBackendTerm) attaches\n * these symbol-keyed fields on the underlying termBase object; they're\n * absent from the public `Term` interface AND from enumerable property\n * inspection so user code can't reach them via `(term as any).stdin`.\n */\nexport interface TermInternalStreams {\n readonly stdin: NodeJS.ReadStream\n readonly stdout: NodeJS.WriteStream\n}\n\n/**\n * Read the raw stdin/stdout streams a Term wraps. ONLY for silvery runtime\n * adapters that bridge to legacy stream-based APIs (createApp.run()'s option\n * bag). User code MUST go through sub-owners — see the Term interface.\n *\n * Each factory attaches the streams under `STDIN_SYMBOL` / `STDOUT_SYMBOL`\n * as non-enumerable own properties on the underlying object.\n */\nexport function getInternalStreams(term: Term): TermInternalStreams {\n const obj = term as unknown as Record<symbol, unknown>\n return {\n stdin: obj[STDIN_SYMBOL] as NodeJS.ReadStream,\n stdout: obj[STDOUT_SYMBOL] as NodeJS.WriteStream,\n }\n}\n","/**\n * Term interface and createTerm() factory.\n *\n * Term is the central abstraction for terminal interaction:\n * - Caps + emulator identity: term.caps, term.emulator\n * - Dimensions: cols, rows (shorthand for term.size.cols() / .rows())\n * - I/O: write(), writeLine()\n * - Sub-owners: input, output, modes, size, signals, console\n * - Styling: Chainable styles via Proxy (term.bold.red('text'))\n * - Lifecycle: Disposable pattern via Symbol.dispose\n *\n * Post km-silvery.plateau-naming-polish (2026-04-23): `term.identity` became\n * `term.emulator` (matches TERM_PROGRAM provenance) and `term.heuristics` was\n * absorbed into `term.caps` with a `maybe` prefix per field\n * (`caps.maybeDarkBackground` etc.).\n *\n * Post km-silvery.caps-restructure (Phase 7, 2026-04-23): the legacy\n * `hasCursor()`/`hasInput()`/`hasColor()`/`hasUnicode()` methods are gone.\n * Callers read `term.caps.cursor`, `term.caps.input`, `term.caps.colorLevel`,\n * and `term.caps.unicode` directly — one source of truth.\n *\n * @example\n * ```ts\n * // Styling\n * const term = createTerm()\n * console.log(term.bold.red('error'))\n *\n * // Full terminal app\n * using term = createTerm()\n * await run(<App />, term)\n * ```\n */\n\nimport {\n createMixedStyle,\n createStyle,\n createTerminalProfile,\n type Style,\n type TerminalProfile,\n type TerminalEmulator,\n} from \"@silvery/ansi\"\nimport type {\n ColorLevel,\n CreateTermOptions,\n TermEmulator,\n TermEmulatorBackend,\n TermScreen,\n TerminalCaps,\n} from \"./types\"\nimport type { TerminalBuffer } from \"../buffer\"\nimport { createTextFrame } from \"../buffer\"\nimport type { TextFrame } from \"@silvery/ag/text-frame\"\nimport { outputPhase } from \"../pipeline/output-phase\"\nimport { defaultCaps } from \"./detection\"\nimport { createInputOwner, type InputOwner as Input } from \"../runtime/input-owner\"\nexport type { Input }\nimport { createOutput, type Output } from \"../runtime/devices/output\"\nexport type { Output }\nimport { createFixedSize, createSize, type Size, type SizeSnapshot } from \"../runtime/devices/size\"\nexport type { Size, SizeSnapshot }\nimport { createModes, type Modes } from \"../runtime/devices/modes\"\nexport type { Modes }\nimport { createSignals, type Signals } from \"../runtime/devices/signals\"\nexport type { Signals }\nimport {\n createConsole,\n type Console as DeviceConsole,\n type ConsoleCaptureOptions,\n type ConsoleStats,\n} from \"../runtime/devices/console\"\nimport { createConsoleRouter } from \"../runtime/devices/console-router\"\nexport type { DeviceConsole as Console, ConsoleCaptureOptions, ConsoleStats }\nimport { splitRawInput, parseKey } from \"@silvery/ag/keys\"\nimport { isMouseSequence, parseMouseSequence } from \"../mouse\"\nimport { parseFocusEvent } from \"../focus-reporting\"\nimport { parseBracketedPaste } from \"../bracketed-paste\"\nimport { STDIN_SYMBOL, STDOUT_SYMBOL } from \"../runtime/term-internal\"\n\nexport type { OutputOptions } from \"../runtime/devices/output\"\n\n// =============================================================================\n// ANSI Utilities\n// =============================================================================\n\n/**\n * ANSI escape code pattern for stripping.\n */\nconst ANSI_REGEX =\n /\\x1b\\[[0-9;:]*m|\\x9b[0-9;:]*m|\\x1b\\]8;;[^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x9d8;;[^\\x07\\x1b\\x9c]*(?:\\x07|\\x1b\\\\|\\x9c)/g\n\n/**\n * Strip all ANSI escape codes from a string.\n */\nfunction stripAnsi(text: string): string {\n return text.replace(ANSI_REGEX, \"\")\n}\n\n// =============================================================================\n// Style Chain Types\n// =============================================================================\n\n/**\n * All chalk style method names that can be chained.\n */\ntype ChalkStyleName =\n // Modifiers\n | \"reset\"\n | \"bold\"\n | \"dim\"\n | \"italic\"\n | \"underline\"\n | \"overline\"\n | \"inverse\"\n | \"hidden\"\n | \"strikethrough\"\n | \"visible\"\n // Foreground colors\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"grey\"\n | \"blackBright\"\n | \"redBright\"\n | \"greenBright\"\n | \"yellowBright\"\n | \"blueBright\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"whiteBright\"\n // Background colors\n | \"bgBlack\"\n | \"bgRed\"\n | \"bgGreen\"\n | \"bgYellow\"\n | \"bgBlue\"\n | \"bgMagenta\"\n | \"bgCyan\"\n | \"bgWhite\"\n | \"bgGray\"\n | \"bgGrey\"\n | \"bgBlackBright\"\n | \"bgRedBright\"\n | \"bgGreenBright\"\n | \"bgYellowBright\"\n | \"bgBlueBright\"\n | \"bgMagentaBright\"\n | \"bgCyanBright\"\n | \"bgWhiteBright\"\n\n/**\n * StyleChain provides chainable styling methods.\n * Each property returns a new chain, and the chain is callable.\n */\nexport type StyleChain = {\n /**\n * Apply styles to text.\n */\n (text: string): string\n (template: TemplateStringsArray, ...values: unknown[]): string\n\n /**\n * RGB foreground color.\n */\n rgb(r: number, g: number, b: number): StyleChain\n\n /**\n * Hex foreground color.\n */\n hex(color: string): StyleChain\n\n /**\n * 256-color foreground.\n */\n ansi256(code: number): StyleChain\n\n /**\n * RGB background color.\n */\n bgRgb(r: number, g: number, b: number): StyleChain\n\n /**\n * Hex background color.\n */\n bgHex(color: string): StyleChain\n\n /**\n * 256-color background.\n */\n bgAnsi256(code: number): StyleChain\n} & {\n /**\n * Chainable style properties.\n */\n readonly [K in ChalkStyleName]: StyleChain\n} & {\n // Extended underline terminators (Phase 6 of the unicode plateau,\n // 2026-04-23). These replaced the bare `curlyUnderline()` /\n // `styledUnderline()` etc. exports in `@silvery/ansi` — caps flow\n // through `createStyle(caps)` at Term construction instead of per-call.\n // Not chainable; take text as the final argument. Fall back to standard\n // SGR 4 when the requested style isn't in `term.caps.underlineStyles`\n // (post Phase 7 the field is an array, not a boolean). Declared in a separate\n // intersection member because TypeScript forbids mixing mapped types\n // with method signatures in the same object.\n curlyUnderline(text: string): string\n dottedUnderline(text: string): string\n dashedUnderline(text: string): string\n doubleUnderline(text: string): string\n underlineColor(r: number, g: number, b: number, text: string): string\n styledUnderline(\n name: import(\"./types.ts\").UnderlineStyle,\n rgb: import(\"./types.ts\").RGB,\n text: string,\n ): string\n}\n\n// =============================================================================\n// Term Interface\n// =============================================================================\n\n/**\n * Term — the central abstraction for terminal interaction.\n *\n * Term is both a styling helper (chainable ANSI via Proxy) and the umbrella\n * for typed sub-owners (input / output / modes / size / signals / console).\n * Pass it to `run()` or `createApp()`.\n *\n * Provides:\n * - Capability detection (cached on creation)\n * - Dimensions (shorthand getters over `term.size`)\n * - I/O (write, writeLine + the per-resource sub-owners)\n * - Sub-owners: input (stdin/probes/events), output (stdout guard),\n * modes (raw/alt-screen/paste/kitty/mouse/focus), size (dims + resize),\n * signals (process signal scope), console (console.* capture)\n * - Styling (chainable via Proxy)\n * - Disposable lifecycle\n *\n * @example\n * ```ts\n * using term = createTerm()\n * await run(<App />, term)\n * ```\n */\nexport interface Term extends Disposable, StyleChain {\n // -------------------------------------------------------------------------\n // Capability + identity surface (post km-silvery.caps-restructure Phase 7)\n //\n // The legacy hasCursor()/hasInput()/hasColor()/hasUnicode() methods are\n // deleted — they duplicated fields already on `caps`. Callers read:\n // term.caps.cursor\n // term.caps.input\n // term.caps.colorLevel\n // term.caps.unicode\n // -------------------------------------------------------------------------\n\n /**\n * Terminal capabilities profile.\n *\n * Always populated — every Term constructor commits to a full TerminalCaps.\n * Node-backed Terms with TTY stdin detect from the environment; non-TTY\n * Node terms, headless Terms, and emulator-backed Terms use sensible\n * deterministic defaults (`defaultCaps()` — truecolor, unicode, no kitty\n * keyboard). Override via `createTerm({ caps: { … } })`.\n *\n * Post km-silvery.terminal-profile-plateau Phase 2 this is non-optional —\n * callers no longer need `term.caps ?? detectTerminalCaps()` guards.\n *\n * Equivalent to `term.profile.caps`. The two views are guaranteed identical\n * — every Term constructor seeds `profile` from `caps` (or vice versa) via\n * `createTerminalProfile({ caps })` so there's only one source of truth.\n */\n readonly caps: TerminalCaps\n\n /**\n * Fully-resolved {@link TerminalProfile} for this Term — `caps`, `colorLevel`,\n * `colorForced`, and `colorProvenance` bundled into the single value\n * downstream consumers should pass through the pipeline.\n *\n * Every Term variant owns its profile. Node-backed Terms build it from the\n * TTY/env detection that populated `caps`; headless and emulator-backed\n * Terms build it from their deterministic caps. The profile's\n * `colorProvenance` is always `\"caller-caps\"` (and `colorForced` is `false`)\n * when the Term constructed it from `caps` — Term construction is not an\n * opportunity for env precedence (that happens at `run()` / `createApp()`\n * where `colorLevel` / `NO_COLOR` are applied).\n *\n * Prefer this over `term.caps` when calling downstream pipeline entry\n * points that accept a profile. run.tsx's Term branch reads it directly\n * instead of rebuilding via `createTerminalProfile({ caps: term.caps })`\n * — one detection, one profile, no double-pass.\n *\n * Post km-silvery.plateau-term-owns-profile (H15 of the /big review\n * 2026-04-23).\n */\n readonly profile: TerminalProfile\n\n /**\n * Environment identity — `program`, `version`, `TERM`. Convenience mirror\n * of `profile.emulator`. Callers that only need \"who is the terminal?\"\n * (diagnostics, probe-cache keys) read this instead of sitting on the full\n * protocol-flags surface of {@link caps}.\n *\n * Post km-silvery.plateau-naming-polish (2026-04-23): renamed from\n * `term.identity`; `TerminalIdentity` → `TerminalEmulator`.\n */\n readonly emulator: TerminalEmulator\n\n // -------------------------------------------------------------------------\n // Dimensions\n // -------------------------------------------------------------------------\n\n /**\n * Terminal width in columns.\n * Undefined if not a TTY or dimensions unavailable.\n */\n readonly cols: number | undefined\n\n /**\n * Terminal height in rows.\n * Undefined if not a TTY or dimensions unavailable.\n */\n readonly rows: number | undefined\n\n // -------------------------------------------------------------------------\n // Sub-owners replace direct stdin/stdout (Phase 8 of km-silvery.term-sub-owners)\n //\n // The public Term interface no longer exposes raw NodeJS.ReadStream /\n // WriteStream. Direct access was the leak vector that produced the\n // 2026-04-22 wasRaw race class. Use the typed sub-owners instead:\n // - term.input — reads / probes (was: term.stdin.on('data', …))\n // - term.output — writes (was: term.stdout.write(…))\n // - term.modes — raw mode + protocol toggles (was: term.stdin.setRawMode)\n // - term.size — cols/rows + resize subscription\n // - term.signals — process signal scope\n // - term.console — patched console capture\n //\n // Silvery's own runtime (run.tsx adapters) still needs the raw streams to\n // bridge to legacy createApp.run() options — those access them via the\n // package-private accessor `getInternalStreams(term)` from `./term-internal`.\n // -------------------------------------------------------------------------\n\n // -------------------------------------------------------------------------\n // Sub-owners (the typed I/O surface — see km-silvery.term-sub-owners)\n //\n // Each sub-owner owns one class of shared global I/O state for the Term's\n // lifetime. Race-free by construction: only one writer per resource.\n // -------------------------------------------------------------------------\n\n /**\n * Input owner — mediates ALL stdin reads + raw-mode + data subscription.\n * Use `term.input.probe(…)` for terminal queries (color, cursor, kitty, etc.)\n * and `term.input.onData(…)` for primary key/mouse stream consumers.\n *\n * Replaces direct `process.stdin.setRawMode` / `stdin.on('data', …)` —\n * those patterns race under async (the 2026-04-22 wasRaw class).\n *\n * Lazily constructed on first access for Node-backed Terms.\n * Undefined for headless Terms (no stdin to own).\n */\n readonly input: Input | undefined\n\n /**\n * Output owner — single-owner stdout/stderr/console mediator.\n * Use `term.output.write(…)` for render-pipeline output.\n *\n * When activated (after protocol setup), intercepts `process.stdout` /\n * `process.stderr` / `console.*` so only silvery's render pipeline reaches\n * the terminal. Non-silvery writes are suppressed (stdout) or redirected to\n * `DEBUG_LOG` / buffered (stderr). One stable owner per Term, toggled via\n * `activate()` / `deactivate()` for pause/resume cycles.\n *\n * Lazily constructed on first access for Node-backed Terms.\n * Undefined for headless and emulator-backed Terms (no real stdout to own).\n */\n readonly output: Output | undefined\n\n /**\n * Size owner — single source of truth for terminal dimensions, exposed as\n * alien-signals `ReadSignal`s.\n *\n * `term.size.cols()` / `term.size.rows()` / `term.size.snapshot()` read the\n * current value and, inside `computed` / `effect`, subscribe to changes.\n * The first read installs the stdout `resize` listener; SIGWINCH bursts\n * coalesce through the Size owner's 200ms trailing debounce.\n *\n * Replaces direct `process.stdout.columns` / `stdout.rows` reads — those\n * return stale snapshots under concurrent resize and scatter coalescing\n * logic across every consumer.\n *\n * `term.cols` / `term.rows` remain as shorthand getters that delegate to\n * this owner; they are slated for removal alongside `term.stdin/stdout` in\n * Phase 8.\n */\n readonly size: Size\n\n /**\n * Modes owner — single authority for terminal protocol modes, exposed as\n * alien-signals `Signal<T>`s.\n *\n * Each mode is a callable signal: `term.modes.rawMode`, `altScreen`,\n * `bracketedPaste`, `kittyKeyboard` (`number | false`), `mouse`,\n * `focusReporting`. Read via `modes.altScreen()`, write via\n * `modes.altScreen(true)`, subscribe via `effect(() => modes.altScreen())`.\n * Same-value writes don't re-emit ANSI (alien-signals equality). `dispose`\n * restores exactly what this owner activated.\n *\n * Replaces the scattered `enableMouse()` / `enableKittyKeyboard()` /\n * `enableBracketedPaste()` / `enableFocusReporting()` call sites that\n * previously toggled terminal state from every subsystem. Those shared\n * globals are the same leak vector that produced the 2026-04-22 wasRaw\n * race class — concentrating them behind one owner makes them race-free.\n */\n readonly modes: Modes\n\n /**\n * Signals owner — single coordinator for every process-signal handler\n * bound to this Term's lifetime.\n *\n * `term.signals.on(\"SIGINT\", handler, { priority, before, after, name })`\n * registers a teardown handler. One shared `process.on(signal, …)` listener\n * is installed per signal, regardless of how many handlers the owner\n * manages. On `dispose()` (called from `term[Symbol.dispose]`), every\n * handler runs in priority / dependency order, each wrapped in try/catch\n * so one failure doesn't block the rest.\n *\n * Replaces ad-hoc `process.on(\"SIGINT\", …)` / `process.once(\"SIGTERM\", …)`\n * call sites scattered across runtime + apps. The 2026-04-22 shared-global\n * audit found 78 such sites with no documented cleanup order — late\n * handlers could crash while earlier handlers' resources leaked. The owner\n * gives every Term exactly one entry-point to the signal graph.\n *\n * Present on every Term variant — even headless / emulator-backed — since\n * signal handling is cross-cutting and benefits from consistent teardown\n * semantics in tests as well as production.\n */\n readonly signals: Signals\n\n /**\n * Console owner — single-owner console.* interceptor for the Term's lifetime.\n *\n * Starts inert. Call `term.console.capture({suppress:true})` once the alt\n * screen is active to route `console.log/info/warn/error/debug` into a\n * buffer instead of the screen; then `term.console.replay(stdout, stderr)`\n * on exit to re-emit captured entries to the normal streams. React apps\n * read via `subscribe` + `getSnapshot` (see `<Console>` + `useConsole`).\n *\n * Replaces the standalone console-patching helper — same implementation,\n * Term-owned lifecycle. Undefined for Terms that don't own a real console\n * (headless dims + emulator-backed), which never render through the global\n * terminal and therefore have nothing to corrupt.\n */\n readonly console: DeviceConsole | undefined\n\n // -------------------------------------------------------------------------\n // I/O Methods\n // -------------------------------------------------------------------------\n\n /**\n * Write string to stdout.\n */\n write(str: string): void\n\n /**\n * Write string followed by newline to stdout.\n */\n writeLine(str: string): void\n\n // -------------------------------------------------------------------------\n // Utilities\n // -------------------------------------------------------------------------\n\n /**\n * Strip ANSI escape codes from string.\n */\n stripAnsi(str: string): string\n\n // -------------------------------------------------------------------------\n // Terminal Emulator (present when created with a termless backend)\n // -------------------------------------------------------------------------\n\n /**\n * Visible screen region. Only available when created with a terminal backend.\n * Provides getText(), getLines(), containsText() for assertions.\n */\n readonly screen?: TermScreen\n\n /**\n * Scrollback region. Only available when created with a terminal backend.\n * Provides getText(), getLines(), containsText() for assertions.\n */\n readonly scrollback?: TermScreen\n\n /**\n * Cell-level access for the visible screen — row-first order.\n * Returns resolved RGB colors, attributes, wide-char info.\n * Only available on emulator-backed terms (createTermless).\n */\n cell?(\n row: number,\n col: number,\n ): { readonly fg: unknown; readonly bg: unknown; readonly char: string }\n\n /**\n * Row-level access for the visible screen.\n * Only available on emulator-backed terms (createTermless).\n */\n row?(n: number): {\n getText(): string\n cell(col: number): { readonly fg: unknown; readonly bg: unknown; readonly char: string }\n }\n\n /**\n * Resize the terminal emulator. Only available when created with a terminal backend.\n * Resizes the underlying emulator and triggers a re-render in the app.\n */\n resize?(cols: number, rows: number): void\n\n // -------------------------------------------------------------------------\n // Paint (rendered buffer → output)\n // -------------------------------------------------------------------------\n\n /**\n * Paint a rendered buffer to produce ANSI output.\n * Diffs buffer against prev (fresh render if prev is null).\n * Updates term.frame with an immutable TextFrame snapshot.\n * Returns the ANSI output string.\n * For emulator backends, also feeds the output to the emulator.\n * For headless terms, returns empty string.\n */\n paint?(buffer: TerminalBuffer, prev: TerminalBuffer | null): string\n\n /**\n * Last painted TextFrame. Set after each paint() call.\n * Immutable snapshot with cell-level access and resolved RGB colors.\n */\n readonly frame?: TextFrame\n}\n\n// =============================================================================\n// Shared Helpers\n// =============================================================================\n\n/** Mock stdout that feeds a terminal emulator and supports resize events. */\nfunction createEmulatorStdout(feed: (data: string) => void, cols: number, rows: number) {\n const resizeListeners = new Set<() => void>()\n const stdout: { columns: number; rows: number } & Record<string, unknown> = {\n write: (data: string | Uint8Array) => {\n feed(typeof data === \"string\" ? data : new TextDecoder().decode(data))\n return true\n },\n on: (event: string, handler: () => void) => {\n if (event === \"resize\") resizeListeners.add(handler)\n },\n off: (event: string, handler: () => void) => {\n if (event === \"resize\") resizeListeners.delete(handler)\n },\n isTTY: true,\n columns: cols,\n rows: rows,\n }\n return {\n stdout: stdout as unknown as NodeJS.WriteStream,\n resizeListeners,\n updateDims(c: number, r: number) {\n stdout.columns = c\n stdout.rows = r\n },\n }\n}\n\n/**\n * Finalize termBase into a Term: add frame getter, delegate emulator properties,\n * wrap with style chain Proxy.\n */\nfunction finalizeTerm(\n style: Style,\n termBase: Record<string, unknown>,\n frame: { get: () => TextFrame | undefined },\n opts?: {\n defineProperties?: Record<string, PropertyDescriptor>\n delegateFrom?: object\n },\n): Term {\n Object.defineProperty(termBase, \"frame\", { get: frame.get, enumerable: true })\n if (opts?.defineProperties) Object.defineProperties(termBase, opts.defineProperties)\n if (opts?.delegateFrom) {\n for (const key of Object.keys(opts.delegateFrom)) {\n if (key in termBase) continue\n const val = (opts.delegateFrom as any)[key]\n Object.defineProperty(\n termBase,\n key,\n typeof val === \"function\"\n ? { value: (...args: unknown[]) => (opts.delegateFrom as any)[key](...args) }\n : { get: () => (opts.delegateFrom as any)[key] },\n )\n }\n }\n return createMixedStyle(style, termBase) as unknown as Term\n}\n\n// =============================================================================\n// createTerm Factory\n// =============================================================================\n\n/**\n * Create a Term instance.\n *\n * Factory overloads:\n * - `createTerm()` — Node.js terminal (auto-detect from process.stdin/stdout)\n * - `createTerm({ stdout, stdin, ... })` — Node.js with custom streams/overrides\n * - `createTerm({ cols, rows })` — Headless for testing (no I/O, fixed dims)\n * - `createTerm(backend, { cols, rows })` — Terminal emulator backend (termless) for testing\n * - `createTerm(emulator)` — Pre-created termless Terminal\n *\n * Detection results are cached at creation time for consistency.\n *\n * @example\n * ```ts\n * // Full terminal app\n * using term = createTerm()\n * await run(<App />, term)\n *\n * // Headless for testing\n * const term = createTerm({ cols: 80, rows: 24 })\n *\n * // Terminal emulator (termless) for full ANSI testing\n * using term = createTerm(createXtermBackend(), { cols: 80, rows: 24 })\n * await run(<App />, term)\n * expect(term.screen).toContainText(\"Hello\")\n *\n * // Custom streams\n * const term = createTerm({ stdout: customStream })\n * ```\n */\nexport function createTerm(options?: CreateTermOptions): Term\nexport function createTerm(dims: { cols: number; rows: number; caps?: Partial<TerminalCaps> }): Term\nexport function createTerm(\n backend: TermEmulatorBackend,\n dims: { cols: number; rows: number; caps?: Partial<TerminalCaps> },\n): Term\nexport function createTerm(emulator: TermEmulator, opts?: { caps?: Partial<TerminalCaps> }): Term\nexport function createTerm(\n first?:\n | CreateTermOptions\n | { cols: number; rows: number; caps?: Partial<TerminalCaps> }\n | TermEmulator\n | TermEmulatorBackend,\n second?:\n | { cols: number; rows: number; caps?: Partial<TerminalCaps> }\n | { caps?: Partial<TerminalCaps> },\n): Term {\n // Two-arg: createTerm(backend, { cols, rows, caps? }) — raw backend + dims\n if (second && first && isTermBackend(first)) {\n const dims = second as { cols: number; rows: number; caps?: Partial<TerminalCaps> }\n // Lazy require — @termless/core is an optional dependency, only needed\n // for emulator backends. Using a variable prevents static analysis from\n // trying to resolve it at bundle/parse time.\n const mod = \"@termless/core\"\n const { createTerminal } = require(mod) as {\n createTerminal: (opts: {\n backend: TermEmulatorBackend\n cols: number\n rows: number\n }) => TermEmulator\n }\n const emulator = createTerminal({\n backend: first as TermEmulatorBackend,\n cols: dims.cols,\n rows: dims.rows,\n })\n return createBackendTerm(emulator, dims.caps)\n }\n // Detect terminal emulator (termless Terminal): has feed + screen\n if (first && isTermEmulator(first)) {\n const opts = second as { caps?: Partial<TerminalCaps> } | undefined\n return createBackendTerm(first as TermEmulator, opts?.caps)\n }\n // Detect headless dims: has cols + rows but no stdout/stdin/color/caps\n if (first && isHeadlessDims(first)) {\n const dims = first as { cols: number; rows: number; caps?: Partial<TerminalCaps> }\n return createHeadlessTerm({ cols: dims.cols, rows: dims.rows }, dims.caps)\n }\n return createNodeTerm((first as CreateTermOptions) ?? {})\n}\n\n/** Detect terminal emulator (termless Terminal): has feed() + screen */\nfunction isTermEmulator(obj: unknown): obj is TermEmulator {\n if (typeof obj !== \"object\" || obj === null) return false\n const o = obj as Record<string, unknown>\n return typeof o.feed === \"function\" && typeof o.screen === \"object\" && o.screen !== null\n}\n\n/** Detect terminal emulator backend (termless TerminalBackend): has init() + name */\nfunction isTermBackend(obj: unknown): obj is TermEmulatorBackend {\n if (typeof obj !== \"object\" || obj === null) return false\n const o = obj as Record<string, unknown>\n return (\n typeof o.init === \"function\" && typeof o.name === \"string\" && typeof o.destroy === \"function\"\n )\n}\n\n/** Detect headless dims: has cols and rows numbers, no stdout */\nfunction isHeadlessDims(obj: unknown): boolean {\n if (typeof obj !== \"object\" || obj === null) return false\n const o = obj as Record<string, unknown>\n return (\n typeof o.cols === \"number\" && typeof o.rows === \"number\" && !(\"stdout\" in o) && !(\"stdin\" in o)\n )\n}\n\n/**\n * Create a Node.js terminal with full Provider capabilities.\n */\nfunction createNodeTerm(options: CreateTermOptions): Term {\n const stdout = options.stdout ?? process.stdout\n const stdin = options.stdin ?? process.stdin\n\n // Fully-resolved TerminalProfile — the single value that flows through\n // run() / createApp() for this Term's lifetime. Post km-silvery.plateau-\n // delete-legacy-shims (H6): this one call replaces the former\n // `detectColor(stdout)` + `detectTerminalCaps()` pair.\n //\n // Term-construction precedence (differs from profile-factory defaults):\n // - `options.caps` present → caps base + `colorLevel` = caps.colorLevel.\n // Treat explicit caps as a hard override that wins over env — a test\n // harness or adapter passing `caps: { colorLevel: \"truecolor\" }` wants\n // that tier regardless of what FORCE_COLOR / NO_COLOR say. This matches\n // the legacy `detectTerminalCaps()` path which short-circuited on\n // explicit caps.\n // - `options.colorLevel` (`ColorLevel | null`) → thread through\n // profile `colorLevel` so it participates in the normal precedence chain.\n // - non-TTY Node terms → `defaultCaps()` base + no caller override.\n // - TTY Node terms → full env-based auto-detection.\n const profileCapsBase: Partial<TerminalCaps> | undefined = options.caps\n ? options.caps\n : stdin.isTTY\n ? undefined // let profile factory run full env detection\n : defaultCaps() // non-TTY: deterministic defaults, skip env probe\n const explicitColor =\n options.colorLevel === undefined ? undefined : (options.colorLevel ?? \"mono\")\n // Explicit caps override the env chain — tests and adapters that pass\n // `caps: { colorLevel: ... }` rely on the tier they specified. Promoting\n // the caps tier into `colorLevel` mostly re-establishes that, but the\n // profile factory still lets NO_COLOR / FORCE_COLOR win over overrides\n // (that's the documented chain). So when caps is explicit, we build the\n // profile with `env: {}` to neutralize env precedence at the factory\n // level — the caller's caps are authoritative for the Term's lifetime.\n const baseProfile: TerminalProfile = options.caps\n ? createTerminalProfile({\n env: {},\n stdout,\n stdin,\n caps: options.caps,\n colorLevel: explicitColor ?? options.caps.colorLevel,\n })\n : createTerminalProfile({\n stdout,\n stdin,\n caps: profileCapsBase,\n colorLevel: explicitColor,\n })\n\n // Apply legacy `options.cursor` / `options.unicode` overrides to caps so\n // the Term's profile is the one source of truth. Without this the old\n // `hasCursor()` / `hasUnicode()` values would disagree with `caps.cursor`\n // / `caps.unicode` once those methods are gone.\n const profile: TerminalProfile =\n options.cursor !== undefined || options.unicode !== undefined\n ? {\n ...baseProfile,\n caps: {\n ...baseProfile.caps,\n cursor: options.cursor ?? baseProfile.caps.cursor,\n unicode: options.unicode ?? baseProfile.caps.unicode,\n },\n }\n : baseProfile\n\n const detectedCaps: TerminalCaps = profile.caps\n const cachedColor: ColorLevel = profile.colorLevel\n\n // Create style instance with appropriate color level + caps. Caps drive\n // the extended-underline methods on Style (Phase 6 of the unicode\n // plateau, 2026-04-23) — `term.curlyUnderline(\"err\")` respects the same\n // `term.caps.underlineStyles` gate the retired bare `curlyUnderline()`\n // export used. Post Phase 7: `underlineStyles` is an array; style.ts\n // projects that to a boolean \"any extended style supported\" for the\n // legacy style caps shape.\n const styleInstance = createStyle({\n level: cachedColor,\n caps: {\n underlineStyles: profile.caps.underlineStyles.length > 0,\n underlineColor: profile.caps.underlineColor,\n },\n })\n\n // Size owner — single source of truth for cols/rows. Subscribes to stdout's\n // `resize` event with trailing-edge coalescing so burst SIGWINCH from tmux/cmux/\n // Ghostty tab switches collapses to one notification. Constructed eagerly\n // so term.size and term.cols/rows are valid for any consumer.\n //\n // `resizeCoalesceMs` lets test / emulator paths opt out of debouncing — they\n // drive resize explicitly via `term.resize(...)` (no SIGWINCH bursts) and\n // want the snapshot to update synchronously so layout reflows within the\n // test's settle window. See `km-silvery.termless-resize-reflow-4-fails`.\n // See km-silvery.term-sub-owners Phase 5.\n const size =\n options.resizeCoalesceMs !== undefined\n ? createSize(stdout, { coalesceMs: options.resizeCoalesceMs })\n : createSize(stdout)\n\n // Force-install the SIGWINCH listener even if no React subscriber ever\n // reads `size.cols()` / `size.rows()` / `size.snapshot()`.\n //\n // `createSize()` installs the `stdout.on(\"resize\")` listener lazily on\n // first signal read (avoids piling listeners onto cold Terms during\n // startup orchestration — see size.ts:`ensureInstalled`). silvercode's\n // React tree drives layout from `Box.onLayout` rather than `term.size.*`,\n // so without this read the listener stays dormant and SIGWINCH events\n // are dropped — the live binary never repaints on terminal resize.\n //\n // Calling `snapshot()` once here triggers `ensureInstalled` exactly once\n // for every live Node Term, regardless of whether downstream code\n // subscribes to the signal. Tests / emulator paths use `createFixedSize`\n // which has no listener, so this read is a no-op there.\n size.snapshot()\n\n let _frame: TextFrame | undefined\n\n // Sub-owner storage declared up-front so `ownedWrite` below can reference\n // `_output` in its closure. `_input` is constructed eagerly for TTY-backed\n // terms (single stdin owner for the session's lifetime); `_output` is\n // populated lazily by `getOutput()`.\n let _output: Output | null = null\n\n // Writer router: every silvery-owned ANSI write (modes toggles, term.write,\n // probe queries via InputOwner) flows through this single function. When\n // `Output` is active, foreign `stdout.write` is patched into a\n // suppress/redirect sink, so owned writes MUST go through `output.write(...)`\n // which bypasses the sink. When `Output` is inactive, the raw `stdout.write`\n // is safe. Without this, any mode toggle or probe query after\n // `output.activate()` goes to the patched `process.stdout.write` and can\n // be dropped. Pro-review finding, 2026-04-22.\n const ownedWrite = (s: string): boolean => {\n const out = _output\n if (out && out.active()) return out.write(s)\n return stdout.write(s)\n }\n\n // Modes owner — single authority for terminal protocol modes (raw, alt-\n // screen, paste, kitty keyboard, mouse, focus reporting). Consolidates\n // the scattered enable*/disable* call sites. See Phase 4. Declared before\n // Input because Input routes raw-mode + bracketed-paste through modes.\n const modes = createModes({\n write: ownedWrite,\n stdin,\n })\n\n // Lazy Input — constructed on first access for TTY-backed Node terms.\n // Owns stdin's raw mode + data listener + bracketed-paste protocol for the\n // Term's lifetime once accessed. Lazy construction avoids piling up\n // listeners when cold Terms are constructed during startup orchestration\n // (km-cli's multi-step progress UI briefly instantiates several Terms\n // before the live TUI one — if Input were eager, each would attach an\n // 11th `data` listener on process.stdin). Non-TTY backed terms (tests,\n // piped stdin) get undefined; callers branch off `term.input` existence.\n // See km-silvery.term-sub-owners Phase 2 + km-silvery.input-structured-events.\n //\n // `options.input === false` is the explicit opt-out: the host process\n // owns stdin for its own purpose (e.g. piping to a child PTY) and silvery\n // must not race for it. The accessor permanently returns `undefined`,\n // so `term.input?.…` chains no-op and downstream code (probes, term\n // provider input subscription) skips the input pipeline by structural\n // check rather than a separate code path. See\n // `docs/design/terminal-component.md` § \"render({ input: false })\".\n const inputDisabled = options.input === false\n let _input: Input | null = null\n const getInput = (): Input | undefined => {\n if (inputDisabled) return undefined\n if (!stdin.isTTY) return undefined\n if (!_input) {\n _input = createInputOwner(stdin, stdout, {\n writeStdout: ownedWrite,\n modes,\n mouse: options.mouse,\n })\n }\n return _input\n }\n\n // Shared ConsoleRouter — the single patcher for console.*. Both Console\n // (tap) and Output (sink) register against it so activation order no\n // longer matters. Pro review 2026-04-22 P0-3 structural fix.\n const consoleRouter = createConsoleRouter(globalThis.console)\n\n // Lazy Output — constructed on first access. Owns stdout/stderr/console\n // intercepts for the Term's lifetime. Starts deactivated; caller activates\n // after protocol setup. See km-silvery.term-sub-owners Phase 3.\n // Only available when stdout is the real process.stdout (mocks + emulators\n // don't benefit from the global-patching guard).\n const getOutput = (): Output | undefined => {\n if (stdout !== process.stdout) return undefined\n if (!_output) {\n _output = createOutput(undefined, consoleRouter)\n }\n return _output\n }\n\n // Console owner — captures console.* during alt-screen rendering. Shares\n // the Term's ConsoleRouter so its tap lives on the same patch site as\n // Output's sink. See km-silvery.term-sub-owners Phase 7 + Phase C (Pro\n // review follow-up).\n const consoleOwner = createConsole(globalThis.console, consoleRouter)\n\n // Signals owner — coordinates process-signal handlers for this Term's\n // lifetime. No process-level listener is installed until the first `on()`\n // call. Replaces the 78+ scattered `process.on(SIG…, …)` sites found in the\n // 2026-04-22 shared-global audit. See Phase 6.\n const signals = createSignals()\n\n const termBase = {\n caps: detectedCaps,\n profile,\n emulator: profile.emulator,\n size,\n modes,\n signals,\n console: consoleOwner,\n write: (str: string) => {\n ownedWrite(str)\n },\n writeLine: (str: string) => {\n ownedWrite(str + \"\\n\")\n },\n stripAnsi,\n paint: (buffer: TerminalBuffer, prev: TerminalBuffer | null): string => {\n const output = outputPhase(prev, buffer)\n _frame = createTextFrame(buffer)\n return output\n },\n [Symbol.dispose]: () => {\n // Run signal teardown FIRST so handlers can still touch sub-owners\n // (input/output/modes) while they're alive. After this, we drop each\n // owner in reverse-construction order.\n signals.dispose()\n if (_input) _input[Symbol.dispose]()\n if (_output) _output[Symbol.dispose]()\n consoleOwner[Symbol.dispose]()\n // Dispose the shared router AFTER both Console and Output have been\n // torn down (above) so no latent taps/sinks reference a disposed\n // router.\n consoleRouter.dispose()\n modes[Symbol.dispose]()\n size[Symbol.dispose]()\n },\n }\n // Raw streams live under private Symbol keys — invisible to Object.keys\n // and unreachable via `(term as any).stdin`. Only `getInternalStreams()`\n // from runtime/term-internal.ts can read them, and that module's import\n // is restricted to silvery's runtime/ + ansi/ by the ownership lint.\n Object.defineProperty(termBase, STDIN_SYMBOL, {\n value: stdin,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n Object.defineProperty(termBase, STDOUT_SYMBOL, {\n value: stdout,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return finalizeTerm(\n styleInstance,\n termBase,\n { get: () => _frame },\n {\n defineProperties: {\n // cols / rows are shorthand for term.size.cols() / .rows(). Non-TTY\n // streams have no reliable dims — surface undefined then.\n cols: { get: () => (stdout.isTTY ? size.cols() : undefined), enumerable: true },\n rows: { get: () => (stdout.isTTY ? size.rows() : undefined), enumerable: true },\n input: { get: () => getInput(), enumerable: true },\n output: { get: () => getOutput(), enumerable: true },\n },\n },\n )\n}\n\n/** Stand-in ReadStream for Modes on headless / emulator-backed Terms.\n *\n * Not a TTY, so `setRawMode` is a no-op on the underlying stream. The Modes\n * owner tracks intent (e.g. `isRawMode`) but emits no ANSI and touches no\n * real termios — correct for testing / emulator backends.\n */\nconst HEADLESS_STDIN: NodeJS.ReadStream = {\n isTTY: false,\n setRawMode() {\n return this as NodeJS.ReadStream\n },\n} as unknown as NodeJS.ReadStream\n\n/** Create a headless terminal for testing — no I/O, fixed dimensions. */\nfunction createHeadlessTerm(\n dims: { cols: number; rows: number },\n capsOverride?: Partial<TerminalCaps>,\n): Term {\n let disposed = false\n let _frame: TextFrame | undefined\n const size = createFixedSize(dims)\n // Modes owner for the headless term: writes go to a sink, stdin is\n // non-TTY so raw-mode toggles are tracked but never applied. Keeps the\n // `term.modes` surface uniform across Term variants.\n const modes = createModes({ write: () => {}, stdin: HEADLESS_STDIN })\n // Signals owner — handlers register lazily; dispose removes them. Same\n // shape as Node-backed Term so test code that mounts a Signals consumer\n // works in both contexts.\n const signals = createSignals()\n\n // Headless Terms are declaratively mono/no-input but still publish a full\n // TerminalCaps so downstream code (pipeline, measurer) gets the guaranteed\n // shape `Term.caps: TerminalCaps` promises. Default to `mono` colorLevel;\n // callers wanting a richer test surface can pass\n // `{ caps: { colorLevel: 'truecolor' } }` through createTermless.\n const headlessCaps: TerminalCaps = {\n ...defaultCaps(),\n colorLevel: \"mono\",\n unicode: false,\n mouse: false,\n bracketedPaste: false,\n ...capsOverride,\n }\n\n // Fully-resolved profile — identical caps, `source: \"caller-caps\"`. See the\n // Node-backed path for the H15 rationale.\n const profile: TerminalProfile = createTerminalProfile({\n env: {},\n stdin: undefined,\n stdout: { isTTY: false },\n caps: headlessCaps,\n })\n\n const termBase = {\n caps: profile.caps,\n profile,\n emulator: profile.emulator,\n size,\n modes,\n signals,\n console: undefined as DeviceConsole | undefined,\n write: () => {},\n writeLine: () => {},\n stripAnsi,\n paint: (_buffer: TerminalBuffer, _prev: TerminalBuffer | null): string => {\n _frame = createTextFrame(_buffer)\n return \"\"\n },\n [Symbol.dispose]: () => {\n if (disposed) return\n disposed = true\n signals[Symbol.dispose]()\n modes[Symbol.dispose]()\n size[Symbol.dispose]()\n },\n }\n // Headless exposes process.stdin/stdout under the same symbol-keyed slots\n // so getInternalStreams() returns stable refs across Term variants.\n Object.defineProperty(termBase, STDIN_SYMBOL, {\n value: process.stdin,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n Object.defineProperty(termBase, STDOUT_SYMBOL, {\n value: process.stdout,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return finalizeTerm(\n // Headless: no color, no extended underline. Project the array form of\n // caps.underlineStyles to the boolean the Style caps shape expects.\n createStyle({\n level: null,\n caps: {\n underlineStyles: profile.caps.underlineStyles.length > 0,\n underlineColor: profile.caps.underlineColor,\n },\n }),\n termBase,\n { get: () => _frame },\n {\n defineProperties: {\n cols: { get: () => size.cols(), enumerable: true },\n rows: { get: () => size.rows(), enumerable: true },\n // Headless Terms have no real stdin to own — sub-owner is undefined.\n input: { get: () => undefined, enumerable: true },\n // Headless Terms have no real stdout to own — sub-owner is undefined.\n output: { get: () => undefined, enumerable: true },\n },\n },\n )\n}\n\n/** Create a terminal backed by a termless emulator — real ANSI processing, screen/scrollback. */\nfunction createBackendTerm(emulator: TermEmulator, capsOverride?: Partial<TerminalCaps>): Term {\n const { stdout, resizeListeners, updateDims } = createEmulatorStdout(\n (s) => emulator.feed(s),\n emulator.cols,\n emulator.rows,\n )\n let _frame: TextFrame | undefined\n const size = createFixedSize({ cols: emulator.cols, rows: emulator.rows })\n // Modes owner for emulator-backed terms: ANSI mode sequences would be\n // interpreted as input if fed to the emulator, so the write function is a\n // sink. The owner still tracks state (`modes.mouse()`, etc.) for parity\n // with Node terms, but the emulator itself decides what to accept.\n const modes = createModes({ write: () => {}, stdin: HEADLESS_STDIN })\n // Input sub-owner — non-TTY, pure event-bus mode. `sendInput(data)` parses\n // ANSI bytes and fans out to onKey/onMouse/onPaste/onFocus subscribers so\n // emulator-backed Terms share the same consumer shape as Node-backed.\n const input = createInputOwner(HEADLESS_STDIN, stdout, { enableBracketedPaste: false })\n let inputBatchSeq = 0\n // Signals owner — emulator-backed terms share the host process so exit /\n // SIGINT handlers remain meaningful. Construction is free (no process\n // listeners until first on()), and the contract promises signals on every\n // Term.\n const signals = createSignals()\n\n // Emulator-backed terms (termless / xterm.js) render a known-capability\n // virtual terminal: truecolor, unicode, mouse, bracketed paste. These are\n // deterministic (no env sniffing), which is exactly what tests want.\n // `defaultCaps()` already matches this shape — keep it as the base so any\n // future default changes propagate without a second source of truth.\n //\n // Post km-silvery.unicode-plateau Phase 3/4 (2026-04-23): caps.cursor and\n // caps.input were added to TerminalCaps. `defaultCaps()` defaults them to\n // `false` (safe for headless / non-TTY). Emulator-backed terms are the\n // exception — they simulate a full TTY, so we override both to `true` to\n // match the hardcoded `hasCursor()` / `hasInput()` methods below. Without\n // this override, `term.caps.cursor not matching the hard-coded hasCursor=true on emulator Term (historic API — removed in Phase 7)` — a subtle\n // divergence any caps consumer would hit.\n const emulatorCaps: TerminalCaps = {\n ...defaultCaps(),\n cursor: true,\n input: true,\n ...capsOverride,\n }\n\n // Fully-resolved profile — same reasoning as the Node-backed path. Source\n // is always `\"caller-caps\"` because Term construction commits to the caps\n // before env-level overrides get a say.\n const profile: TerminalProfile = createTerminalProfile({\n env: {},\n stdin: undefined,\n stdout: { isTTY: false },\n caps: emulatorCaps,\n })\n\n const termBase = {\n caps: profile.caps,\n profile,\n emulator: profile.emulator,\n size,\n modes,\n signals,\n console: undefined as DeviceConsole | undefined,\n write: (str: string) => emulator.feed(str),\n writeLine: (str: string) => emulator.feed(str + \"\\n\"),\n resize: (cols: number, rows: number) => {\n emulator.resize(cols, rows)\n updateDims(cols, rows)\n size.update(cols, rows)\n resizeListeners.forEach((l) => l())\n },\n sendInput: (data: string) => {\n // Parse the data into typed events and fan out via the input owner.\n const receivedAt = performance.now()\n const inputBatchId = ++inputBatchSeq\n const pasteResult = parseBracketedPaste(data)\n if (pasteResult) {\n input.sendPaste({ text: pasteResult.content })\n return\n }\n for (const raw of splitRawInput(data)) {\n const focusEvent = parseFocusEvent(raw)\n if (focusEvent) {\n input.sendFocus({ focused: focusEvent.type === \"focus-in\" })\n continue\n }\n if (isMouseSequence(raw)) {\n const parsed = parseMouseSequence(raw)\n if (parsed) input.sendMouse({ ...parsed, receivedAt, inputBatchId })\n continue\n }\n const [parsedInput, key] = parseKey(raw)\n input.sendKey({ input: parsedInput, key })\n }\n },\n stripAnsi,\n paint: (buffer: TerminalBuffer, prev: TerminalBuffer | null): string => {\n const output = outputPhase(prev, buffer)\n if (output) emulator.feed(output)\n _frame = createTextFrame(buffer)\n return output\n },\n _emulator: emulator,\n [Symbol.dispose]: () => {\n input[Symbol.dispose]()\n signals.dispose()\n modes[Symbol.dispose]()\n size[Symbol.dispose]()\n emulator.close().catch(() => {})\n },\n }\n // Emulator-backed terms expose the mock stdout (feed-into-emulator) and\n // the host's real stdin under the symbol slots so getInternalStreams()\n // returns stable refs for run()'s legacy options-bag bridge.\n Object.defineProperty(termBase, STDIN_SYMBOL, {\n value: process.stdin,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n Object.defineProperty(termBase, STDOUT_SYMBOL, {\n value: stdout,\n enumerable: false,\n writable: false,\n configurable: false,\n })\n\n return finalizeTerm(\n // Emulator-backed (termless / xterm.js): full truecolor + extended\n // underline — emulatorCaps defaults to the modern style set.\n createStyle({\n level: \"truecolor\",\n caps: {\n underlineStyles: profile.caps.underlineStyles.length > 0,\n underlineColor: profile.caps.underlineColor,\n },\n }),\n termBase,\n { get: () => _frame },\n {\n defineProperties: {\n cols: { get: () => size.cols(), enumerable: true },\n rows: { get: () => size.rows(), enumerable: true },\n screen: { get: () => emulator.screen, enumerable: true },\n scrollback: { get: () => emulator.scrollback, enumerable: true },\n // Emulator-backed Terms expose a non-TTY InputOwner as a pure event\n // bus: consumers subscribe via input.on*, and `term.sendInput(data)`\n // parses bytes into sendKey/sendMouse/sendPaste/sendFocus calls.\n input: { get: () => input, enumerable: true },\n // Termless-backed Terms write through emulator.feed, not process.stdout —\n // no Output guard needed.\n output: { get: () => undefined, enumerable: true },\n },\n delegateFrom: emulator,\n },\n )\n}\n","export { ANSI_REGEX, stripAnsi, displayLength } from \"@silvery/ansi\"\n","/**\n * Terminal hyperlink functions using OSC 8.\n *\n * The hyperlink function has moved to @silvery/ansi (hyperlink.ts).\n * Re-exported here to preserve the @silvery/ag-term/ansi import path.\n */\n\nexport { hyperlink } from \"@silvery/ansi\"\n","/**\n * ANSI terminal control helpers.\n *\n * All functions have moved to @silvery/ansi (terminal-control.ts).\n * Re-exported here to preserve the @silvery/ag-term/ansi import path.\n */\n\nexport {\n enterAltScreen,\n leaveAltScreen,\n clearScreen,\n clearLine,\n cursorTo,\n cursorHome,\n cursorHide,\n cursorShow,\n cursorStyle,\n setTitle,\n enableMouse,\n disableMouse,\n enableBracketedPaste,\n disableBracketedPaste,\n enableSyncUpdate,\n disableSyncUpdate,\n setScrollRegion,\n resetScrollRegion,\n scrollUp,\n scrollDown,\n enableKittyKeyboard,\n disableKittyKeyboard,\n} from \"@silvery/ansi\"\n","/**\n * Advanced Clipboard — OSC 5522 (Kitty clipboard protocol)\n *\n * Extends OSC 52 with MIME type support, large payload chunking,\n * and paste events. Falls back to OSC 52 when 5522 is not available.\n *\n * Protocol overview (from kitty docs):\n * - Write: ESC ] 5522 ; type=write ST → wdata chunks → empty wdata\n * - Read: ESC ] 5522 ; type=read ; <base64 mime list> ST\n * - Paste mode: CSI ? 5522 h (enable) / CSI ? 5522 l (disable)\n *\n * Metadata is colon-separated key=value pairs. Payloads are base64-encoded.\n * Data chunks are at most 4096 bytes before base64 encoding.\n *\n * Supported by: Kitty 0.28+. Ghostty is considering adoption.\n *\n * @see https://sw.kovidgoyal.net/kitty/clipboard/\n * @module\n */\n\nimport { isProtocolError, ProtocolError } from \"@silvery/ansi\"\nimport { createLogger } from \"loggily\"\n\nconst log = createLogger(\"silvery:advanced-clipboard\")\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst ESC = \"\\x1b\"\nconst ST = `${ESC}\\\\`\nconst OSC_5522 = `${ESC}]5522;`\n\n/** Default chunk size in bytes (before base64 encoding) */\nconst DEFAULT_CHUNK_SIZE = 4096\n\n/** Enable paste events mode */\nexport const ENABLE_PASTE_EVENTS = `${ESC}[?5522h`\n\n/** Disable paste events mode */\nexport const DISABLE_PASTE_EVENTS = `${ESC}[?5522l`\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A single clipboard entry with MIME type and data. */\nexport interface ClipboardEntry {\n /** MIME type (e.g. \"text/plain\", \"text/html\", \"image/png\") */\n mime: string\n /** Content — string for text types, Uint8Array for binary */\n data: string | Uint8Array\n}\n\n/** Options for creating an advanced clipboard. */\nexport interface AdvancedClipboardOptions {\n /** Write escape sequences to the terminal */\n write: (data: string) => void\n /** Subscribe to terminal input data. Returns unsubscribe function. */\n onData: (handler: (data: string) => void) => () => void\n /** Max bytes per chunk before base64 encoding (default: 4096) */\n chunkSize?: number\n /** Whether the terminal supports OSC 5522 (default: false — uses OSC 52 fallback) */\n supported?: boolean\n}\n\n/** Advanced clipboard with MIME type support and paste events. */\nexport interface AdvancedClipboard {\n /** Copy entries with MIME type support */\n copy(entries: ClipboardEntry[]): void\n /** Copy plain text (convenience) */\n copyText(text: string): void\n /** Copy with HTML alternative */\n copyRich(text: string, html: string): void\n /** Subscribe to paste events. Returns unsubscribe function. */\n onPaste(handler: (entries: ClipboardEntry[]) => void): () => void\n /** Whether the terminal supports OSC 5522 */\n readonly supported: boolean\n /** Clean up subscriptions */\n dispose(): void\n}\n\n// ============================================================================\n// Encoding Helpers\n// ============================================================================\n\n/** Encode string as base64 */\nfunction toBase64(text: string): string {\n return Buffer.from(text, \"utf-8\").toString(\"base64\")\n}\n\n/** Encode bytes as base64 */\nfunction bytesToBase64(data: Uint8Array): string {\n return Buffer.from(data).toString(\"base64\")\n}\n\n/** Decode base64 to string */\nfunction fromBase64(base64: string): string {\n return Buffer.from(base64, \"base64\").toString(\"utf-8\")\n}\n\n/** Decode base64 to bytes */\nfunction base64ToBytes(base64: string): Uint8Array {\n return new Uint8Array(Buffer.from(base64, \"base64\"))\n}\n\n/** Convert entry data to a Buffer for chunking */\nfunction entryDataToBuffer(data: string | Uint8Array): Buffer {\n if (typeof data === \"string\") {\n return Buffer.from(data, \"utf-8\")\n }\n return Buffer.from(data)\n}\n\n// ============================================================================\n// Protocol Helpers\n// ============================================================================\n\n/**\n * Build an OSC 5522 sequence.\n *\n * @param metadata - colon-separated key=value pairs\n * @param payload - optional base64 payload\n */\nfunction osc5522(metadata: string, payload?: string): string {\n if (payload !== undefined) {\n return `${OSC_5522}${metadata};${payload}${ST}`\n }\n return `${OSC_5522}${metadata}${ST}`\n}\n\n/**\n * Generate chunked wdata sequences for a single MIME entry.\n *\n * Each chunk is at most chunkSize bytes before base64 encoding.\n * An empty wdata with just the mime signals end of data for that type.\n */\nfunction* generateChunks(entry: ClipboardEntry, chunkSize: number): Generator<string> {\n const mimeB64 = toBase64(entry.mime)\n const raw = entryDataToBuffer(entry.data)\n\n if (raw.length === 0) {\n // Even empty data sends one chunk then a terminator\n yield osc5522(`type=wdata:mime=${mimeB64}`, \"\")\n } else {\n for (let offset = 0; offset < raw.length; offset += chunkSize) {\n const chunk = raw.subarray(offset, offset + chunkSize)\n const b64 = bytesToBase64(new Uint8Array(chunk))\n yield osc5522(`type=wdata:mime=${mimeB64}`, b64)\n }\n }\n\n // Empty wdata signals end of this MIME type's data\n yield osc5522(\"type=wdata\")\n}\n\n// ============================================================================\n// OSC 52 Fallback\n// ============================================================================\n\n/**\n * Copy plain text via OSC 52 (fallback for terminals without 5522 support).\n */\nfunction osc52Copy(write: (data: string) => void, text: string): void {\n const base64 = toBase64(text)\n write(`${ESC}]52;c;${base64}\\x07`)\n}\n\n// ============================================================================\n// Response Parsing\n// ============================================================================\n\n/** Parsed OSC 5522 response from terminal */\ninterface ParsedResponse {\n type: string\n status?: string\n mime?: string\n payload?: string\n}\n\n/**\n * Parse an OSC 5522 response sequence.\n *\n * Format: ESC ] 5522 ; metadata ; payload ST\n * Metadata: colon-separated key=value pairs\n *\n * Return semantics (see {@link ProtocolError} for the full contract):\n * - `null` — input does NOT contain the OSC 5522 prefix (not for us).\n * - `throw ProtocolError` — prefix matched (we committed to OSC 5522)\n * but the response is missing its ST terminator. Loud failure makes\n * the gap visible to the dispatcher boundary.\n */\nexport function parseOsc5522Response(input: string): ParsedResponse | null {\n // Find OSC 5522 prefix\n const prefixIdx = input.indexOf(OSC_5522)\n if (prefixIdx === -1) return null\n\n const afterPrefix = prefixIdx + OSC_5522.length\n\n // Find ST terminator (ESC \\)\n const stIdx = input.indexOf(ST, afterPrefix)\n if (stIdx === -1) {\n throw new ProtocolError({\n parser: \"parseOsc5522Response\",\n input,\n reason: \"OSC 5522 prefix present but missing ST terminator\",\n })\n }\n\n const body = input.slice(afterPrefix, stIdx)\n\n // Split metadata and payload at first semicolon\n const semiIdx = body.indexOf(\";\")\n const metadataStr = semiIdx === -1 ? body : body.slice(0, semiIdx)\n const payload = semiIdx === -1 ? undefined : body.slice(semiIdx + 1)\n\n // Parse metadata key=value pairs\n const pairs = metadataStr.split(\":\")\n const result: ParsedResponse = { type: \"\" }\n\n for (const pair of pairs) {\n const eqIdx = pair.indexOf(\"=\")\n if (eqIdx === -1) continue\n const key = pair.slice(0, eqIdx)\n const value = pair.slice(eqIdx + 1)\n\n switch (key) {\n case \"type\":\n result.type = value\n break\n case \"status\":\n result.status = value\n break\n case \"mime\":\n result.mime = value\n break\n }\n }\n\n if (payload !== undefined) {\n result.payload = payload\n }\n\n return result\n}\n\n/**\n * Parse a paste event notification from terminal.\n *\n * When paste events mode is enabled (CSI ? 5522 h), the terminal\n * sends available MIME types when the user pastes.\n *\n * Format: ESC ] 5522 ; type=read:status=DATA:mime=<b64mime> ; <b64data> ST\n *\n * Return semantics (see {@link ProtocolError} for the full contract):\n * - `null` — not an OSC 5522 response, OR not a `type=read status=DATA`\n * message (e.g. it's a DONE notification, a write response, or some\n * other valid 5522 message that just isn't paste DATA). Discriminator\n * chain \"next-please.\"\n * - `throw ProtocolError` — DATA message identified (the dispatcher\n * committed to it being a paste data chunk) but the mime field or\n * payload is missing. Loud failure surfaces the malformed terminal\n * output to the dispatch boundary.\n *\n * Note: a `ProtocolError` from {@link parseOsc5522Response} also bubbles\n * through this function (we deliberately do not catch it here — let the\n * single dispatch boundary handle it consistently).\n */\nexport function parsePasteData(input: string): ClipboardEntry | null {\n const parsed = parseOsc5522Response(input)\n if (!parsed) return null\n if (parsed.type !== \"read\" || parsed.status !== \"DATA\") return null\n if (!parsed.mime || parsed.payload === undefined) {\n throw new ProtocolError({\n parser: \"parsePasteData\",\n input,\n reason: \"OSC 5522 type=read status=DATA missing required mime or payload field\",\n })\n }\n\n const mime = fromBase64(parsed.mime)\n const isText = mime.startsWith(\"text/\")\n\n if (isText) {\n return { mime, data: fromBase64(parsed.payload) }\n }\n return { mime, data: base64ToBytes(parsed.payload) }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an advanced clipboard with OSC 5522 support.\n *\n * When `supported` is true, uses the full OSC 5522 protocol for\n * MIME-typed clipboard operations. When false (default), falls back\n * to OSC 52 for plain text only.\n *\n * @example\n * ```ts\n * const clipboard = createAdvancedClipboard({\n * write: (data) => process.stdout.write(data),\n * onData: (handler) => {\n * process.stdin.on(\"data\", (buf) => handler(buf.toString()))\n * return () => process.stdin.removeListener(\"data\", handler)\n * },\n * supported: true,\n * })\n *\n * // Copy with MIME types\n * clipboard.copy([\n * { mime: \"text/plain\", data: \"Hello\" },\n * { mime: \"text/html\", data: \"<b>Hello</b>\" },\n * ])\n *\n * // Subscribe to paste events\n * const unsub = clipboard.onPaste((entries) => {\n * for (const entry of entries) {\n * console.log(entry.mime, entry.data)\n * }\n * })\n *\n * clipboard.dispose()\n * ```\n */\nexport function createAdvancedClipboard(options: AdvancedClipboardOptions): AdvancedClipboard {\n const { write, onData, chunkSize = DEFAULT_CHUNK_SIZE, supported = false } = options\n\n const pasteHandlers = new Set<(entries: ClipboardEntry[]) => void>()\n let inputUnsub: (() => void) | undefined\n\n // Accumulate paste data entries from multiple DATA responses\n let pendingEntries: ClipboardEntry[] = []\n\n // Set up input listener for paste events when we have handlers\n function ensureInputListener(): void {\n if (inputUnsub) return\n\n inputUnsub = onData((data: string) => {\n if (pasteHandlers.size === 0) return\n\n // The parsers may throw ProtocolError on malformed OSC 5522 input\n // (prefix matched but missing ST terminator, or DATA message without\n // mime/payload). This is a dispatch boundary — log + continue, never\n // crash the app on protocol-format problems.\n // Bead: @km/silvery/15127-custom-protocol-implementation/protocol-loud-errors.\n let entry: ClipboardEntry | null = null\n try {\n entry = parsePasteData(data)\n } catch (err) {\n if (isProtocolError(err)) {\n log.debug?.(\n `parsePasteData flagged malformed OSC 5522 input: ${err.reason} (len=${err.inputLength})`,\n )\n } else {\n throw err\n }\n }\n if (entry) {\n pendingEntries.push(entry)\n }\n\n // Check for DONE signal — flush accumulated entries to handlers\n let parsed: ParsedResponse | null = null\n try {\n parsed = parseOsc5522Response(data)\n } catch (err) {\n if (isProtocolError(err)) {\n log.debug?.(\n `parseOsc5522Response flagged malformed input: ${err.reason} (len=${err.inputLength})`,\n )\n } else {\n throw err\n }\n }\n if (parsed?.type === \"read\" && parsed.status === \"DONE\") {\n if (pendingEntries.length > 0) {\n const entries = pendingEntries\n pendingEntries = []\n for (const handler of pasteHandlers) {\n handler(entries)\n }\n }\n }\n })\n }\n\n return {\n get supported(): boolean {\n return supported\n },\n\n copy(entries: ClipboardEntry[]): void {\n if (!supported) {\n // Fallback: find text/plain entry and use OSC 52\n const textEntry = entries.find((e) => e.mime === \"text/plain\")\n if (textEntry) {\n const text =\n typeof textEntry.data === \"string\"\n ? textEntry.data\n : fromBase64(bytesToBase64(textEntry.data))\n osc52Copy(write, text)\n }\n return\n }\n\n // OSC 5522 write protocol:\n // 1. Send write start\n write(osc5522(\"type=write\"))\n\n // 2. Send chunked data for each MIME entry\n for (const entry of entries) {\n for (const chunk of generateChunks(entry, chunkSize)) {\n write(chunk)\n }\n }\n },\n\n copyText(text: string): void {\n this.copy([{ mime: \"text/plain\", data: text }])\n },\n\n copyRich(text: string, html: string): void {\n this.copy([\n { mime: \"text/plain\", data: text },\n { mime: \"text/html\", data: html },\n ])\n },\n\n onPaste(handler: (entries: ClipboardEntry[]) => void): () => void {\n pasteHandlers.add(handler)\n ensureInputListener()\n\n return () => {\n pasteHandlers.delete(handler)\n if (pasteHandlers.size === 0 && inputUnsub) {\n inputUnsub()\n inputUnsub = undefined\n }\n }\n },\n\n dispose(): void {\n pasteHandlers.clear()\n pendingEntries = []\n if (inputUnsub) {\n inputUnsub()\n inputUnsub = undefined\n }\n },\n }\n}\n","/**\n * ANSI primitives — Term factory, styling, detection, underlines, hyperlinks.\n *\n * Pure ANSI utilities (detection, SGR codes, constants, types) live in\n * `@silvery/ansi` and are re-exported here for backwards compatibility.\n *\n * ```ts\n * import { createTerm } from '@silvery/ag-term'\n *\n * using term = createTerm()\n * term.red('error')\n * term.bold.green('success')\n *\n * term.console?.capture({ suppress: true })\n * term.console?.subscribe(() => {})\n * ```\n *\n * @module\n */\n\n// =============================================================================\n// Term API (NewWay)\n// =============================================================================\n\nexport { createTerm } from \"./term\"\nexport type { Term, StyleChain } from \"./term\"\n\nimport { createTerm as _createTerm } from \"./term\"\nimport type { Term } from \"./term\"\n\n/**\n * Default term instance for convenience, lazily initialized on first access.\n * This avoids running terminal detection (including spawnSync) at import time.\n * Use this for simple scripts. For apps, prefer createTerm() with `using`.\n *\n * @example\n * ```ts\n * import { term } from '@silvery/ag-term'\n *\n * console.log(term.green('success'))\n * if (term.caps.colorLevel) { ... }\n * ```\n */\nlet _lazyTerm: Term | undefined\nexport const term: Term = new Proxy({} as Term, {\n get(_target, prop, receiver) {\n if (!_lazyTerm) _lazyTerm = _createTerm()\n return Reflect.get(_lazyTerm, prop, receiver)\n },\n apply(_target, thisArg, args) {\n if (!_lazyTerm) _lazyTerm = _createTerm()\n return Reflect.apply(_lazyTerm as unknown as (...args: unknown[]) => unknown, thisArg, args)\n },\n has(_target, prop) {\n if (!_lazyTerm) _lazyTerm = _createTerm()\n return Reflect.has(_lazyTerm, prop)\n },\n})\n\nexport type { Output, OutputOptions } from \"../runtime/devices/output\"\nexport type { Console, ConsoleCaptureOptions, ConsoleStats } from \"../runtime/devices/console\"\nexport { createConsole } from \"../runtime/devices/console\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n UnderlineStyle,\n RGB,\n ColorLevel,\n Color,\n AnsiColorName,\n StyleOptions,\n ConsoleMethod,\n ConsoleEntry,\n CreateTermOptions,\n TermEmulator,\n TermEmulatorBackend,\n TermScreen,\n} from \"./types\"\n\n// =============================================================================\n// Detection Functions\n// =============================================================================\n\n// Post km-silvery.plateau-delete-legacy-shims (H6): `detectColor` and\n// `detectTerminalCaps` deleted — use `createTerminalProfile()` (sync) or\n// `probeTerminalProfile()` (async with theme) instead.\nexport {\n defaultCaps,\n createTerminalProfile,\n probeTerminalProfile,\n createBgModeDetector,\n parseBgModeResponse,\n ENABLE_BG_MODE_REPORTING,\n DISABLE_BG_MODE_REPORTING,\n} from \"./detection\"\nexport type {\n TerminalCaps,\n TerminalProfile,\n ColorProvenance,\n TerminalProfileStdout,\n CreateTerminalProfileOptions,\n ProbeTerminalProfileOptions,\n BgModeDetector,\n BgModeDetectorOptions,\n BgMode,\n} from \"./detection\"\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { ANSI_REGEX, stripAnsi, displayLength } from \"./utils\"\n\n// =============================================================================\n// Underline — moved to Style methods in Phase 6 of the unicode plateau\n// (2026-04-23). Consumers use `term.curlyUnderline(x)` etc., or build a\n// headless style: `createStyle({ caps }).curlyUnderline(x)`.\n// =============================================================================\n\n// =============================================================================\n// Hyperlink Functions\n// =============================================================================\n\nexport { hyperlink } from \"./hyperlink\"\n\n// =============================================================================\n// ANSI Terminal Control Helpers\n// =============================================================================\n\nexport {\n enterAltScreen,\n leaveAltScreen,\n clearScreen,\n clearLine,\n cursorTo,\n cursorHome,\n cursorHide,\n cursorShow,\n cursorStyle,\n setTitle,\n enableMouse,\n disableMouse,\n enableBracketedPaste,\n disableBracketedPaste,\n enableSyncUpdate,\n disableSyncUpdate,\n setScrollRegion,\n resetScrollRegion,\n scrollUp,\n scrollDown,\n enableKittyKeyboard,\n disableKittyKeyboard,\n} from \"./ansi\"\n\n// =============================================================================\n// Background Override — Compose styled text inside Box with backgroundColor\n// =============================================================================\n\n/**\n * SGR code recognized by silvery to signal intentional bg override.\n * When text is wrapped with this, silvery won't warn/throw about chalk bg + silvery bg conflicts.\n * Exported for silvery to detect this marker in text content.\n */\nexport const BG_OVERRIDE_CODE = 9999\n\n/**\n * Compose styled text with an explicit background inside a Box that has its own\n * `backgroundColor`. This is the correct way to layer chalk/term background\n * colors on top of an silvery Box background.\n *\n * Without `bgOverride`, silvery throws (by default) when it detects both an ANSI\n * background in the text content AND a `backgroundColor` prop on an ancestor\n * Box, because the two conflict and produce visual artifacts (the ANSI bg\n * only covers the text, leaving gaps at line edges).\n *\n * `bgOverride` wraps the text with a private SGR marker that tells silvery\n * \"this background is intentional — don't throw.\" Use it when you need\n * pixel-precise background control within a styled container.\n *\n * @param text - Text containing ANSI background codes (e.g. from `chalk.bgBlack()`)\n * @returns The same text prefixed with a marker SGR code\n *\n * @example\n * ```tsx\n * import { bgOverride } from '@silvery/chalk'\n *\n * // Without bgOverride — silvery throws:\n * <Box backgroundColor=\"cyan\">\n * <Text>{chalk.bgBlack('text')}</Text> // Error!\n * </Box>\n *\n * // With bgOverride — explicitly allowed:\n * <Box backgroundColor=\"cyan\">\n * <Text>{bgOverride(chalk.bgBlack('text'))}</Text> // OK\n * </Box>\n *\n * // Also works with term styling:\n * <Box backgroundColor=\"$surface-bg\">\n * <Text>{bgOverride(term.bgRgb(30, 30, 30)('highlighted'))}</Text>\n * </Box>\n * ```\n */\nexport function bgOverride(text: string): string {\n return `\\x1b[${BG_OVERRIDE_CODE}m${text}`\n}\n\n// =============================================================================\n// Advanced Clipboard (OSC 5522)\n// =============================================================================\n\nexport {\n createAdvancedClipboard,\n parseOsc5522Response,\n parsePasteData,\n ENABLE_PASTE_EVENTS,\n DISABLE_PASTE_EVENTS,\n} from \"./advanced-clipboard\"\nexport type {\n AdvancedClipboard,\n AdvancedClipboardOptions,\n ClipboardEntry,\n} from \"./advanced-clipboard\"\n"],"x_google_ignoreList":[39,40],"mappings":"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,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM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AK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,EAAC,IAAE;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,EAAC,IAAE;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,EAAC,IAAE;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC,CAAC,QAAO,OAAO;KAAC;IAAC,IAAI;IAAE,SAAS,EAAE,GAAE,GAAE;KAAC,IAAI,GAAE,IAAE,GAAE,IAAE,EAAE,SAAO;AAAE,SAAG,IAAE,EAAE,GAAG,MAAI,IAAE,EAAE,GAAG,GAAG,QAAM,CAAC;AAAE,YAAK,KAAG,GAAG,KAAG,IAAE,IAAE,KAAG,GAAE,IAAE,EAAE,GAAG,GAAG,KAAE,IAAE;UAAM;AAAC,UAAG,EAAE,IAAE,EAAE,GAAG,IAAI,QAAM,CAAC;AAAE,UAAE,IAAE;;AAAE,YAAM,CAAC;;AAAE,MAAE,aAAW,MAAK;KAAC,cAAa;AAAC,UAAG,KAAK,UAAQ,MAAK,CAAC,GAAE;AAAC,WAAE,IAAI,WAAW,MAAM,EAAC,EAAE,KAAK,EAAE,EAAC,EAAE,KAAG,GAAE,EAAE,KAAK,GAAE,GAAE,GAAG,EAAC,EAAE,KAAK,GAAE,KAAI,IAAI;AAAC,YAAI,IAAI,IAAE,GAAE,IAAE,EAAE,QAAO,EAAE,EAAE,GAAE,KAAK,GAAE,EAAE,GAAG,IAAG,EAAE,GAAG,KAAG,EAAE;AAAC,YAAI,IAAI,IAAE,GAAE,IAAE,EAAE,QAAO,EAAE,EAAE,GAAE,KAAK,GAAE,EAAE,GAAG,IAAG,EAAE,GAAG,KAAG,EAAE;;;KAAE,QAAQ,GAAE;AAAC,aAAO,IAAE,KAAG,IAAE,IAAE,MAAI,IAAE,IAAE,QAAM,EAAE,KAAG,EAAE,GAAE,EAAE,GAAC,IAAE,EAAE,GAAE,EAAE,GAAC,IAAE;;KAAE,eAAe,GAAE,GAAE;MAAC,IAAI,IAAE,KAAK,QAAQ,EAAE,EAAC,IAAE,MAAI,KAAG,MAAI;AAAE,UAAG,GAAE;OAAC,MAAM,IAAE,EAAE,eAAe,aAAa,EAAE;AAAC,aAAI,IAAE,IAAE,CAAC,IAAE,IAAE,MAAI,IAAE;;AAAG,aAAO,EAAE,eAAe,oBAAoB,GAAE,GAAE,EAAE;;;;GAAI,MAAK,GAAE,GAAE,MAAI;AAAC,WAAO,eAAe,GAAE,cAAa,EAAC,OAAM,CAAC,GAAE,CAAC,EAAC,EAAE,YAAU,KAAK;IAAE,MAAM,IAAE,EAAE,IAAI,EAAC,IAAE;KAAC,CAAC,KAAI,IAAI;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,MAAK,KAAK;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;KAAC,EAAC,IAAE;KAAC,CAAC,OAAM,MAAM;KAAC,CAAC,OAAM,MAAM;K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"}