silvery 0.19.2 → 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-CDCeYkS3.mjs → render-string-BcoCpjCB.mjs} +1 -1
  100. package/dist/{render-string-Darrg7ku.mjs → render-string-DkQacASz.mjs} +2707 -549
  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-CF-6UN01.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-Darrg7ku.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-CChwjk0Z.mjs +0 -738
  206. package/dist/src-CChwjk0Z.mjs.map +0 -1
  207. package/dist/src-CF-6UN01.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":"backends-DIVYzKqd.mjs","names":[],"sources":["../../termless/src/terminal/spawn.ts","../../termless/src/terminal/pty.ts","../../termless/src/render/png.ts","../../termless/src/terminal/views.ts","../../termless/src/terminal/terminal.ts","../../termless/src/backend/backends.ts"],"sourcesContent":["/**\n * Portable PTY spawn abstraction.\n *\n * Detects the runtime (Bun vs Node.js) and uses the appropriate PTY backend:\n * - Bun: native `Bun.spawn()` with `terminal` option\n * - Node.js: `node-pty` (optional peer dependency — throws if not installed)\n */\n\nimport { createRequire } from \"node:module\"\n\nexport interface PortablePtyProcess {\n /** Write data to the PTY stdin. */\n write(data: string): void\n /** Resize the PTY. */\n resize(cols: number, rows: number): void\n /** Close/destroy the PTY write channel. */\n closePty(): void\n /** Send a signal to the process (default: SIGTERM). */\n kill(signal?: number): void\n /** The process exit code (null if still running). */\n readonly exitCode: number | null\n /** A promise that resolves with the exit code when the process exits. */\n readonly exited: Promise<number>\n /** The process ID. */\n readonly pid: number\n}\n\nexport interface PortablePtySpawnOptions {\n argv: string[]\n cols: number\n rows: number\n cwd?: string\n env?: Record<string, string>\n onData: (data: Uint8Array) => void\n}\n\nconst isBun = typeof globalThis.Bun !== \"undefined\"\n\n/**\n * Spawn a process with a PTY, using the appropriate runtime backend.\n *\n * - On Bun: uses `Bun.spawn()` with the `terminal` option (built-in PTY support).\n * - On Node.js: uses `node-pty` (loaded via createRequire). Throws a clear error if not installed.\n */\nexport function spawnPortablePty(options: PortablePtySpawnOptions): PortablePtyProcess {\n if (isBun) {\n return spawnBunPty(options)\n }\n return spawnNodePty(options)\n}\n\n/**\n * Pre-load node-pty for Node.js environments.\n *\n * Call this once at startup if you want to verify node-pty is available before\n * the first spawn attempt. On Bun, this is a no-op.\n *\n * Not required -- spawnPortablePty() loads node-pty on demand. But calling this\n * early gives a better error message at startup instead of at first spawn.\n */\nexport async function preloadNodePty(): Promise<void> {\n if (isBun) return\n loadNodePty() // will throw if not installed\n}\n\n// ── Bun implementation ──\n\nfunction spawnBunPty(options: PortablePtySpawnOptions): PortablePtyProcess {\n const { argv, cols, rows, cwd, env, onData } = options\n\n const proc = Bun.spawn(argv, {\n cwd,\n env: { ...process.env, ...env },\n terminal: {\n cols,\n rows,\n data: (_terminal: unknown, data: Uint8Array) => {\n try {\n onData(data)\n } catch {\n // Swallow callback errors to prevent crashing the event loop.\n }\n },\n },\n })\n\n const pty = proc.terminal as {\n write: (data: string) => void\n close: () => void\n resize: (cols: number, rows: number) => void\n }\n\n return {\n write(data: string): void {\n pty.write(data)\n },\n resize(newCols: number, newRows: number): void {\n pty.resize(newCols, newRows)\n },\n closePty(): void {\n try {\n pty.close()\n } catch {\n // Ignore cleanup errors\n }\n },\n kill(signal?: number): void {\n proc.kill(signal)\n },\n get exitCode(): number | null {\n return proc.exitCode\n },\n get exited(): Promise<number> {\n return proc.exited\n },\n get pid(): number {\n return proc.pid\n },\n }\n}\n\n// ── Node.js implementation (node-pty) ──\n\n/** Minimal interface matching what we use from node-pty's IPty. */\ninterface NodePtyInstance {\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(signal?: string): void\n destroy(): void\n onData: (callback: (data: string) => void) => { dispose(): void }\n onExit: (callback: (e: { exitCode: number; signal?: number }) => void) => { dispose(): void }\n pid: number\n}\n\n/** Minimal interface for the node-pty module. */\ninterface NodePtyModule {\n spawn(\n file: string,\n args: string[],\n options: {\n name?: string\n cols: number\n rows: number\n cwd?: string\n env?: Record<string, string>\n },\n ): NodePtyInstance\n}\n\n/**\n * Load node-pty synchronously using createRequire.\n *\n * node-pty is a CommonJS native addon, so createRequire is the correct way\n * to load it from ESM. This keeps spawnPortablePty() synchronous.\n */\nfunction loadNodePty(): NodePtyModule {\n try {\n const nodeRequire = createRequire(import.meta.url)\n return nodeRequire(\"node-pty\") as NodePtyModule\n } catch {\n throw new Error(\n \"node-pty is required for PTY support on Node.js but was not found.\\n\" +\n \"Install it with: npm install node-pty\\n\" +\n \"Note: node-pty requires native compilation tools (Python, C++ compiler).\",\n )\n }\n}\n\nfunction spawnNodePty(options: PortablePtySpawnOptions): PortablePtyProcess {\n const { argv, cols, rows, cwd, env, onData } = options\n\n const nodePty = loadNodePty()\n\n const ptyProcess = nodePty.spawn(argv[0]!, argv.slice(1), {\n name: \"xterm-256color\",\n cols,\n rows,\n cwd,\n env: { ...process.env, ...env } as Record<string, string>,\n })\n\n // Bridge node-pty's string-based onData to Uint8Array\n const encoder = new TextEncoder()\n ptyProcess.onData((data: string) => {\n try {\n onData(encoder.encode(data))\n } catch {\n // Swallow callback errors to prevent crashing the event loop.\n }\n })\n\n // Track exit\n let _exitCode: number | null = null\n let _exitResolve: ((code: number) => void) | null = null\n const exitedPromise = new Promise<number>((resolve) => {\n _exitResolve = resolve\n })\n ptyProcess.onExit((e: { exitCode: number }) => {\n _exitCode = e.exitCode\n _exitResolve?.(e.exitCode)\n })\n\n return {\n write(data: string): void {\n ptyProcess.write(data)\n },\n resize(newCols: number, newRows: number): void {\n ptyProcess.resize(newCols, newRows)\n },\n closePty(): void {\n try {\n ptyProcess.destroy()\n } catch {\n // Ignore cleanup errors\n }\n },\n kill(signal?: number): void {\n // node-pty uses string signals\n const sig = signal === 9 ? \"SIGKILL\" : \"SIGTERM\"\n try {\n ptyProcess.kill(sig)\n } catch {\n // Ignore if already dead\n }\n },\n get exitCode(): number | null {\n return _exitCode\n },\n get exited(): Promise<number> {\n return exitedPromise\n },\n get pid(): number {\n return ptyProcess.pid\n },\n }\n}\n","/**\n * PTY module for termless.\n *\n * Spawns a child process with a pseudo-terminal and bridges its I/O to a\n * TerminalBackend via callbacks. Works on both Bun (native PTY) and Node.js\n * (via node-pty optional peer dependency).\n */\n\nimport { spawnPortablePty, type PortablePtyProcess } from \"./spawn.ts\"\n\n// ── Types ──\n\nexport interface PtyHandle {\n /** Write raw data to the PTY (forwarded to the child process stdin). */\n write(data: string): void\n /** Resize the PTY dimensions. */\n resize(cols: number, rows: number): void\n /** Whether the child process is still running. */\n readonly alive: boolean\n /** Exit info string (e.g., \"exit=0\") when process has exited, null otherwise. */\n readonly exitInfo: string | null\n /** Gracefully close the PTY: SIGTERM, wait 2s, SIGKILL if needed. */\n close(): Promise<void>\n}\n\nexport interface PtySpawnOptions {\n /** Command to execute as [program, ...args]. Spawned directly without a shell. */\n command: string[]\n /** Additional environment variables (merged with process.env). */\n env?: Record<string, string>\n /** Working directory for the child process. */\n cwd?: string\n /** Terminal columns. */\n cols: number\n /** Terminal rows. */\n rows: number\n /** Callback invoked when the child process writes output data. */\n onData: (data: Uint8Array) => void\n}\n\nexport interface PtyShellOptions {\n /** Shell command string to execute via `bash -c`. Use when you need shell features (pipes, globbing, etc.). */\n shellCommand: string\n /** Additional environment variables (merged with process.env). */\n env?: Record<string, string>\n /** Working directory for the child process. */\n cwd?: string\n /** Terminal columns. */\n cols: number\n /** Terminal rows. */\n rows: number\n /** Callback invoked when the child process writes output data. */\n onData: (data: Uint8Array) => void\n}\n\n// ── Implementation ──\n\n/**\n * Spawn a child process with a PTY and return a handle for interacting with it.\n *\n * The command is spawned directly (no shell wrapper) to avoid shell injection.\n * Sets FORCE_COLOR=1 and TERM=xterm-256color to ensure proper color output.\n *\n * Runtime support:\n * - Bun: uses native `Bun.spawn()` with `terminal` option (built-in PTY)\n * - Node.js: uses `node-pty` (must be installed as a peer dependency)\n */\nexport function spawnPty(options: PtySpawnOptions | PtyShellOptions): PtyHandle {\n const { env, cwd, cols, rows, onData } = options\n\n // Determine the argv: direct command or shell-wrapped\n const argv = \"shellCommand\" in options ? [\"bash\", \"-c\", options.shellCommand] : options.command\n\n const proc: PortablePtyProcess = spawnPortablePty({\n argv,\n cols,\n rows,\n cwd,\n env: {\n FORCE_COLOR: \"1\",\n TERM: \"xterm-256color\",\n ...env,\n },\n onData,\n })\n\n let closed = false\n let exitCode: number | null = null\n\n // Track exit code (fire-and-forget)\n void (async () => {\n try {\n exitCode = await proc.exited\n } catch {\n // Process may have been killed before exit\n }\n })()\n\n async function close(): Promise<void> {\n if (closed) return\n closed = true\n\n // Close PTY write channel\n proc.closePty()\n\n // SIGTERM, then wait up to 2s, then SIGKILL\n try {\n proc.kill()\n const exited = await Promise.race([\n proc.exited.then(() => true as const),\n new Promise<false>((resolve) => setTimeout(() => resolve(false), 2000)),\n ])\n if (!exited) {\n proc.kill(9) // SIGKILL\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n return {\n write(data: string): void {\n if (closed) throw new Error(\"PTY is closed\")\n proc.write(data)\n },\n\n resize(newCols: number, newRows: number): void {\n if (closed) throw new Error(\"PTY is closed\")\n proc.resize(newCols, newRows)\n },\n\n get alive(): boolean {\n return !closed && exitCode === null\n },\n\n get exitInfo(): string | null {\n if (exitCode !== null) return `exit=${exitCode}`\n return null\n },\n\n close,\n }\n}\n","/**\n * PNG screenshot renderer for termless.\n *\n * Renders the terminal as SVG via screenshotSvg(), then rasterizes to PNG\n * using @resvg/resvg-js (optional dependency). Throws a clear error if\n * @resvg/resvg-js is not installed.\n */\n\nimport type { TerminalReadable, SvgScreenshotOptions } from \"../terminal/types.ts\"\nimport { screenshotSvg } from \"./svg.ts\"\nimport { bundledFontFiles } from \"./fonts.ts\"\n\nexport interface PngScreenshotOptions extends SvgScreenshotOptions {\n /** Render scale factor (default: 2 for retina-quality output). */\n scale?: number\n}\n\n// Lazy-cached import of @resvg/resvg-js\nlet resvgModule: { Resvg: any } | null = null\n\nasync function loadResvg() {\n if (resvgModule) return resvgModule\n try {\n resvgModule = await import(\"@resvg/resvg-js\")\n return resvgModule\n } catch {\n throw new Error(\"screenshotPng() requires @resvg/resvg-js. Install it:\\n\" + \" bun add -d @resvg/resvg-js\")\n }\n}\n\n/**\n * Render a terminal screenshot as a PNG buffer.\n *\n * Requires `@resvg/resvg-js` as an optional dependency:\n * bun add -d @resvg/resvg-js\n */\nexport async function screenshotPng(terminal: TerminalReadable, options?: PngScreenshotOptions): Promise<Uint8Array> {\n const svg = screenshotSvg(terminal, options)\n const scale = options?.scale ?? 2\n\n const { Resvg } = await loadResvg()\n\n const resvg = new Resvg(svg, {\n fitTo: { mode: \"zoom\" as const, value: scale },\n font: {\n loadSystemFonts: true,\n defaultFontFamily: \"Menlo\",\n // Bundled emoji + symbol fallback faces — without these, resvg-js\n // renders emoji / rarer symbol code points as `.notdef` tofu.\n fontFiles: bundledFontFiles(),\n },\n })\n return resvg.render().asPng()\n}\n","/**\n * View factories for composable terminal regions.\n *\n * Views are lightweight wrappers that read from a TerminalReadable on demand.\n * All row-based views are lazy — they recompute buffer offsets on every access\n * so auto-retry matchers see fresh data when polled across time.\n */\n\nimport type { Cell, CellView, RegionView, RowView, TerminalReadable, UnderlineStyle } from \"./types.ts\"\n\n// ── Helpers ──\n\n/** Convert a Cell[] to trimmed text. */\nfunction cellsToText(cells: Cell[]): string {\n return cells\n .map((c) => c.char || \" \")\n .join(\"\")\n .trimEnd()\n}\n\n/** Get rows of text from a TerminalReadable for an absolute row range. */\nfunction getRowTexts(readable: TerminalReadable, startRow: number, endRow: number): string[] {\n const lines: string[] = []\n for (let i = startRow; i < endRow; i++) {\n lines.push(cellsToText(readable.getLine(i)))\n }\n return lines\n}\n\n/**\n * Create a lazy RegionView from a row-range resolver.\n * The resolver is called on every getText()/getLines() access,\n * so the view always reflects current terminal state.\n */\nfunction createLazyRegionView(\n readable: TerminalReadable,\n resolveRange: () => [start: number, end: number],\n): RegionView {\n return {\n getText(): string {\n const [start, end] = resolveRange()\n return getRowTexts(readable, start, end).join(\"\\n\")\n },\n getLines(): string[] {\n const [start, end] = resolveRange()\n return getRowTexts(readable, start, end)\n },\n containsText(text: string): boolean {\n return this.getText().includes(text)\n },\n }\n}\n\n// ── CellView ──\n\n/** Create a CellView from a Cell with positional context. */\nexport function createCellView(cell: Cell, row: number, col: number): CellView {\n return {\n char: cell.char,\n row,\n col,\n fg: cell.fg,\n bg: cell.bg,\n bold: cell.bold,\n dim: cell.dim,\n italic: cell.italic,\n underline: cell.underline,\n underlineColor: cell.underlineColor,\n strikethrough: cell.strikethrough,\n inverse: cell.inverse,\n blink: cell.blink,\n hidden: cell.hidden,\n wide: cell.wide,\n continuation: cell.continuation,\n hyperlink: cell.hyperlink,\n }\n}\n\n// ── RegionView ──\n\n/** Create a RegionView for a fixed absolute row range [startRow, endRow). */\nexport function createRegionView(readable: TerminalReadable, startRow: number, endRow: number): RegionView {\n return createLazyRegionView(readable, () => [startRow, endRow])\n}\n\n// ── RowView ──\n\n/** Create a RowView for an absolute row position. screenRow is the display row number. */\nexport function createRowView(readable: TerminalReadable, absRow: number, screenRow: number): RowView {\n return {\n get row() {\n return screenRow\n },\n get cells() {\n return readable.getLine(absRow)\n },\n getText(): string {\n return cellsToText(readable.getLine(absRow))\n },\n getLines(): string[] {\n return [this.getText()]\n },\n containsText(text: string): boolean {\n return this.getText().includes(text)\n },\n cellAt(col: number): CellView {\n return createCellView(readable.getCell(absRow, col), screenRow, col)\n },\n }\n}\n\n// ── Specialized Region Views ──\n\n/**\n * Screen view: the fixed rows × cols grid at the bottom of the buffer.\n * In alt mode, this is the entire alt buffer.\n */\nexport function createScreenView(readable: TerminalReadable): RegionView {\n return createLazyRegionView(readable, () => {\n const { totalLines, screenLines } = readable.getScrollback()\n const base = totalLines - screenLines\n return [base, base + screenLines]\n })\n}\n\n/**\n * Scrollback view: history lines above the screen.\n * Empty in alt screen mode.\n * @param n - If provided, only the last N scrollback lines.\n */\nexport function createScrollbackView(readable: TerminalReadable, n?: number): RegionView {\n return createLazyRegionView(readable, () => {\n const { totalLines, screenLines } = readable.getScrollback()\n const base = totalLines - screenLines\n if (base <= 0) return [0, 0]\n const start = n != null ? Math.max(0, base - n) : 0\n return [start, base]\n })\n}\n\n/**\n * Buffer view: everything (scrollback + screen).\n * Uses readable.getText() directly — not row-based.\n */\nexport function createBufferView(readable: TerminalReadable): RegionView {\n return {\n getText(): string {\n return readable.getText()\n },\n getLines(): string[] {\n return readable.getText().split(\"\\n\")\n },\n containsText(text: string): boolean {\n return readable.getText().includes(text)\n },\n }\n}\n\n/**\n * Viewport view: what's visible at the current scroll position.\n * At bottom (viewportOffset = totalLines - screenLines): same as screen.\n * Scrolled up: shows older scrollback lines.\n */\nexport function createViewportView(readable: TerminalReadable): RegionView {\n return createLazyRegionView(readable, () => {\n const { viewportOffset, screenLines } = readable.getScrollback()\n return [viewportOffset, viewportOffset + screenLines]\n })\n}\n\n/**\n * Range view: a rectangular region of the screen.\n * Coordinates are screen-relative. Uses getTextRange() — not row-based.\n */\nexport function createRangeView(\n readable: TerminalReadable,\n r1: number,\n c1: number,\n r2: number,\n c2: number,\n): RegionView {\n return {\n getText(): string {\n const { totalLines, screenLines } = readable.getScrollback()\n const base = totalLines - screenLines\n return readable.getTextRange(base + r1, c1, base + r2, c2)\n },\n getLines(): string[] {\n return this.getText().split(\"\\n\")\n },\n containsText(text: string): boolean {\n return this.getText().includes(text)\n },\n }\n}\n","/**\n * Terminal — high-level API wrapping a TerminalBackend + optional PTY.\n *\n * Provides the main createTerminal() factory that composes a backend with\n * optional process spawning, key input, text search, and screenshot capabilities.\n */\n\nimport type {\n Cell,\n CellView,\n CursorState,\n PngScreenshotOptions,\n RegionView,\n RowView,\n ScreenshotOptions,\n ScrollbackState,\n SvgScreenshotOptions,\n Terminal,\n TerminalBackend,\n TerminalCreateOptions,\n TerminalMode,\n TextPosition,\n MouseOptions,\n MouseModifiers,\n OutputView,\n} from \"./types.ts\"\nimport { parseKey, keyToAnsi } from \"./key-mapping.ts\"\nimport { spawnPty, type PtyHandle } from \"./pty.ts\"\nimport { screenshotSvg } from \"../render/svg.ts\"\nimport { screenshotPng } from \"../render/png.ts\"\nimport {\n createBufferView,\n createCellView,\n createRangeView,\n createRowView,\n createScreenView,\n createScrollbackView,\n createViewportView,\n} from \"./views.ts\"\n\n// ── Constants ──\n\nconst POLL_INTERVAL = 50\nconst DEFAULT_COLS = 80\nconst DEFAULT_ROWS = 24\nconst DEFAULT_WAIT_TIMEOUT = 5000\nconst DEFAULT_STABLE_MS = 200\n\n// ── Text encoder (shared) ──\n\nconst encoder = new TextEncoder()\n\n// ── Factory ──\n\n/**\n * Create a Terminal instance wrapping a backend with optional PTY support.\n *\n * The terminal initializes the backend immediately and provides methods for:\n * - Feeding data directly (no PTY)\n * - Spawning a child process with a PTY\n * - Sending key presses and typed text to the PTY\n * - Waiting for terminal content to appear or stabilize\n * - Searching terminal text\n * - Taking SVG and PNG screenshots\n */\nexport function createTerminal(options: TerminalCreateOptions): Terminal {\n const { backend, scrollbackLimit } = options\n let cols = options.cols ?? DEFAULT_COLS\n let rows = options.rows ?? DEFAULT_ROWS\n\n // Initialize the backend\n backend.init({ cols, rows, scrollbackLimit })\n\n let ptyHandle: PtyHandle | null = null\n let closed = false\n\n // ── OSC 52 clipboard capture ──\n\n /** OSC 52 regex: \\x1b]52;c;<base64>\\x07 or \\x1b]52;c;<base64>\\x1b\\\\ */\n const osc52Re = /\\x1b\\]52;[a-z]*;([A-Za-z0-9+/=]+)(?:\\x07|\\x1b\\\\)/g\n\n const clipboardWrites: string[] = []\n const outputChunks: string[] = []\n let outputDecoder = new TextDecoder()\n\n const out: OutputView = {\n getText() {\n return outputChunks.join(\"\")\n },\n getChunks() {\n return [...outputChunks]\n },\n containsOutput(text: string) {\n return this.getText().includes(text)\n },\n clear() {\n outputChunks.length = 0\n outputDecoder = new TextDecoder()\n },\n }\n\n function captureOutput(data: string): void {\n if (data.length > 0) outputChunks.push(data)\n }\n\n function scanOsc52(data: string): void {\n osc52Re.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = osc52Re.exec(data)) !== null) {\n try {\n const decoded = atob(match[1]!)\n clipboardWrites.push(decoded)\n } catch {\n // Ignore invalid base64\n }\n }\n }\n\n // ── TerminalReadable delegation ──\n\n function getText(): string {\n return backend.getText()\n }\n\n function getTextRange(startRow: number, startCol: number, endRow: number, endCol: number): string {\n return backend.getTextRange(startRow, startCol, endRow, endCol)\n }\n\n function getCell(row: number, col: number): Cell {\n return backend.getCell(row, col)\n }\n\n function getLine(row: number): Cell[] {\n return backend.getLine(row)\n }\n\n function getLines(): Cell[][] {\n return backend.getLines()\n }\n\n function getCursor(): CursorState {\n return backend.getCursor()\n }\n\n function getMode(mode: TerminalMode): boolean {\n return backend.getMode(mode)\n }\n\n function getTitle(): string {\n return backend.getTitle()\n }\n\n function getScrollback(): ScrollbackState {\n return backend.getScrollback()\n }\n\n // ── Data feed ──\n\n function feed(data: Uint8Array | string): void {\n if (closed) throw new Error(\"Terminal is closed\")\n const text = typeof data === \"string\" ? data : outputDecoder.decode(data, { stream: true })\n captureOutput(text)\n scanOsc52(text)\n const bytes = typeof data === \"string\" ? encoder.encode(data) : data\n backend.feed(bytes)\n options.onAfterWrite?.(bytes)\n }\n\n // ── PTY lifecycle ──\n\n async function spawn(command: string[], spawnOpts?: { env?: Record<string, string>; cwd?: string }): Promise<void> {\n if (closed) throw new Error(\"Terminal is closed\")\n if (ptyHandle) throw new Error(\"Terminal already has a spawned process\")\n\n ptyHandle = spawnPty({\n command,\n env: spawnOpts?.env,\n cwd: spawnOpts?.cwd,\n cols,\n rows,\n onData: (data) => {\n const text = outputDecoder.decode(data, { stream: true })\n captureOutput(text)\n scanOsc52(text)\n backend.feed(data)\n options.onAfterWrite?.(data)\n },\n })\n\n // Wire emulator→PTY response path (e.g., cursor position reports, DA responses)\n backend.onResponse = (data) => {\n if (ptyHandle?.alive) {\n ptyHandle.write(new TextDecoder().decode(data))\n }\n }\n }\n\n // ── Input ──\n\n function press(key: string): void {\n if (closed) throw new Error(\"Terminal is closed\")\n if (!ptyHandle) throw new Error(\"No PTY spawned — call spawn() first\")\n\n const desc = parseKey(key)\n const encoded = backend.encodeKey(desc)\n\n // encodeKey returns backend-specific encoding; fall back to ANSI if empty\n if (encoded.length > 0) {\n ptyHandle.write(new TextDecoder().decode(encoded))\n } else {\n const ansi = keyToAnsi(desc)\n if (ansi) ptyHandle.write(ansi)\n }\n }\n\n function type(text: string): void {\n if (closed) throw new Error(\"Terminal is closed\")\n if (!ptyHandle) throw new Error(\"No PTY spawned — call spawn() first\")\n ptyHandle.write(text)\n }\n\n // ── Mouse (SGR mode 1006) ──\n\n /** Encode SGR button byte: button number + modifier bits. */\n function sgrButton(options?: MouseOptions): number {\n let btn = options?.button ?? 0\n if (options?.shift) btn += 4\n if (options?.alt) btn += 8\n if (options?.ctrl) btn += 16\n return btn\n }\n\n function requirePty(): PtyHandle {\n if (closed) throw new Error(\"Terminal is closed\")\n if (!ptyHandle) throw new Error(\"No PTY spawned — call spawn() first\")\n return ptyHandle\n }\n\n function click(x: number, y: number, options?: MouseOptions): void {\n const pty = requirePty()\n const col = x + 1\n const row = y + 1\n const btn = sgrButton(options)\n pty.write(`\\x1b[<${btn};${col};${row}M`) // press\n pty.write(`\\x1b[<${btn};${col};${row}m`) // release\n }\n\n async function dblclick(x: number, y: number, options?: MouseOptions & { delay?: number }): Promise<void> {\n const delay = options?.delay ?? 50\n click(x, y, options)\n await new Promise((r) => setTimeout(r, delay))\n click(x, y, options)\n }\n\n function mouseDown(x: number, y: number, options?: MouseOptions): void {\n const pty = requirePty()\n const btn = sgrButton(options)\n pty.write(`\\x1b[<${btn};${x + 1};${y + 1}M`)\n }\n\n function mouseUp(x: number, y: number, options?: MouseOptions): void {\n const pty = requirePty()\n const btn = sgrButton(options)\n pty.write(`\\x1b[<${btn};${x + 1};${y + 1}m`)\n }\n\n function mouseMove(x: number, y: number, options?: MouseOptions): void {\n const pty = requirePty()\n // SGR motion: button 32 + modifier bits (drag with no button = just move)\n const btn = 32 + sgrButton(options)\n pty.write(`\\x1b[<${btn};${x + 1};${y + 1}M`)\n }\n\n function wheel(deltaX: number, deltaY: number, options?: { x?: number; y?: number } & MouseModifiers): void {\n const pty = requirePty()\n const col = (options?.x ?? 0) + 1\n const row = (options?.y ?? 0) + 1\n let mods = 0\n if (options?.shift) mods += 4\n if (options?.alt) mods += 8\n if (options?.ctrl) mods += 16\n // SGR wheel: button 64=up, 65=down. Horizontal: future extension.\n if (deltaY < 0) {\n for (let i = 0; i < Math.abs(deltaY); i++) pty.write(`\\x1b[<${64 + mods};${col};${row}M`)\n } else if (deltaY > 0) {\n for (let i = 0; i < deltaY; i++) pty.write(`\\x1b[<${65 + mods};${col};${row}M`)\n }\n }\n\n // ── Waiting ──\n\n /** @deprecated Use `await expect(term.screen).toContainText(\"text\", { timeout })` instead. */\n async function waitFor(text: string, timeout = DEFAULT_WAIT_TIMEOUT): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < timeout) {\n if (getText().includes(text)) return\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL))\n }\n throw new Error(`Timeout waiting for \"${text}\" after ${timeout}ms`)\n }\n\n async function waitForStable(stableMs = DEFAULT_STABLE_MS, timeout = DEFAULT_WAIT_TIMEOUT): Promise<void> {\n const start = Date.now()\n let lastContent = \"\"\n let stableStart = Date.now()\n\n while (Date.now() - start < timeout) {\n const content = getText()\n if (content === lastContent) {\n if (Date.now() - stableStart >= stableMs) return\n } else {\n lastContent = content\n stableStart = Date.now()\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL))\n }\n throw new Error(`Terminal did not stabilize within ${timeout}ms`)\n }\n\n // ── Search ──\n\n function find(text: string): TextPosition | null {\n const content = getText()\n const lines = content.split(\"\\n\")\n for (let row = 0; row < lines.length; row++) {\n const col = lines[row]!.indexOf(text)\n if (col !== -1) {\n return { row, col, text }\n }\n }\n return null\n }\n\n function findAll(pattern: RegExp): TextPosition[] {\n const content = getText()\n const lines = content.split(\"\\n\")\n const results: TextPosition[] = []\n\n for (let row = 0; row < lines.length; row++) {\n const line = lines[row]!\n // Use a new regex per line to reset lastIndex for global patterns\n const re = new RegExp(pattern.source, pattern.flags.includes(\"g\") ? pattern.flags : `${pattern.flags}g`)\n let match: RegExpExecArray | null\n while ((match = re.exec(line)) !== null) {\n results.push({ row, col: match.index, text: match[0] })\n // Prevent infinite loop on zero-length matches\n if (match[0].length === 0) re.lastIndex++\n }\n }\n\n return results\n }\n\n // ── Screenshot ──\n\n function screenshot(svgOptions?: SvgScreenshotOptions): string {\n return screenshotSvg(terminal, svgOptions)\n }\n\n function screenshotAsPng(pngOptions?: PngScreenshotOptions): Promise<Uint8Array> {\n return screenshotPng(terminal, pngOptions)\n }\n\n function screenshotOptionsToPng(opts?: ScreenshotOptions): PngScreenshotOptions | undefined {\n if (!opts) return undefined\n return { ...opts, scale: opts.dpr ?? 2 } as PngScreenshotOptions\n }\n\n /**\n * Auto-picking screenshot — see Terminal.screenshot in types.ts for the\n * decision tree.\n *\n * `opts.renderer` is a *force* override:\n * - `canvas` — always the native-canvas path (`screenshotCanvasPng`).\n * - `resvg` — always the resvg SVG → PNG path (`screenshotPng`).\n * - `auto` / unset — the decision tree below:\n * 1. Backend has its own raster renderer (ghostty) — use it directly.\n * 2. `@termless/ghostty` is installed — proxy via cellsToAnsi + renderAnsiPng.\n * 3. Fall back to resvg-based SVG → PNG (cross-platform safe; lower fidelity).\n */\n async function screenshotAuto(opts?: ScreenshotOptions): Promise<Uint8Array> {\n // Forced renderer — bypass the decision tree.\n if (opts?.renderer === \"canvas\") return screenshotAsCanvasPng(opts)\n if (opts?.renderer === \"resvg\") return screenshotPng(terminal, screenshotOptionsToPng(opts))\n if (opts?.renderer === \"swash\") return screenshotAsSwashPng(opts)\n if (opts?.renderer === \"browser\") return screenshotAsBrowserPng(opts)\n\n // 1. Backend's own renderer.\n if (backend.screenshot) {\n return backend.screenshot(opts)\n }\n\n // 2. Try the @termless/ghostty proxy path.\n try {\n const ghosttyMod = (await import(\"@termless/ghostty\")) as {\n renderAnsiPng: (ansi: string | Uint8Array, opts?: unknown) => Promise<Uint8Array>\n cellsToAnsi: (term: TerminalBackend, opts?: { cols?: number; rows?: number }) => string\n }\n const ansi = ghosttyMod.cellsToAnsi(backend, {\n cols: opts?.cols ?? cols,\n rows: opts?.rows ?? rows,\n })\n return ghosttyMod.renderAnsiPng(ansi, { cols, rows, ...opts })\n } catch (err) {\n if (\n err instanceof Error &&\n /Cannot find (module|package)|MODULE_NOT_FOUND|ERR_MODULE_NOT_FOUND/.test(err.message)\n ) {\n // 3. resvg fallback.\n return screenshotPng(terminal, screenshotOptionsToPng(opts))\n }\n throw err\n }\n }\n\n /**\n * Explicit swash path — rasterizes the cell grid directly via\n * `@termless/swash-render` (pure-Rust swash). The cells path is swash's\n * fidelity edge: color-emoji glyphs composite their native color bitmaps,\n * which the SVG-flattening canvas / resvg paths lose. Fails loudly if the\n * native binding is not built.\n */\n async function screenshotAsSwashPng(opts?: ScreenshotOptions): Promise<Uint8Array> {\n const { selectRasterizer } = await import(\"../view/rasterizer.ts\")\n const rasterizer = await selectRasterizer(\"swash\")\n if (!rasterizer.cellsToPng) {\n throw new Error(\"swash renderer did not expose a cells path\")\n }\n const scale = opts?.dpr ?? 2\n return rasterizer.cellsToPng(terminal, scale)\n }\n\n /**\n * Explicit browser path — rasterizes the SVG via headless Chromium\n * (Playwright). The absolute-max-fidelity renderer: a real browser text\n * engine gives Chrome-identical shaping, font fallback, ligatures, and\n * color emoji. Opt-in only — Playwright is an optional dependency, and\n * `selectRasterizer(\"browser\")` throws a clear install hint if absent.\n */\n async function screenshotAsBrowserPng(opts?: ScreenshotOptions): Promise<Uint8Array> {\n const { selectRasterizer } = await import(\"../view/rasterizer.ts\")\n const rasterizer = await selectRasterizer(\"browser\")\n const scale = opts?.dpr ?? 2\n // The browser renderer needs a self-contained SVG — embed the bundled\n // fonts so Chromium renders deterministically, not from host fonts.\n const svgOpts: SvgScreenshotOptions = {\n embedFonts: true,\n ...(opts?.fontFamily ? { fontFamily: opts.fontFamily } : {}),\n ...(opts?.fontSize ? { fontSize: opts.fontSize } : {}),\n ...(opts?.cellWidth ? { cellWidth: opts.cellWidth } : {}),\n ...(opts?.cellHeight ? { cellHeight: opts.cellHeight } : {}),\n }\n const svg = screenshot(svgOpts)\n try {\n return await rasterizer.toPng(svg, scale)\n } finally {\n await rasterizer.dispose?.()\n }\n }\n\n /**\n * Explicit native-canvas path — always routes through `@termless/ghostty`'s\n * `renderAnsiPng`. Fails loudly if the package is missing.\n */\n async function screenshotAsCanvasPng(opts?: ScreenshotOptions): Promise<Uint8Array> {\n const ghosttyMod = (await import(\"@termless/ghostty\")) as {\n renderAnsiPng: (ansi: string | Uint8Array, opts?: unknown) => Promise<Uint8Array>\n cellsToAnsi: (term: TerminalBackend, opts?: { cols?: number; rows?: number }) => string\n }\n const ansi = ghosttyMod.cellsToAnsi(backend, {\n cols: opts?.cols ?? cols,\n rows: opts?.rows ?? rows,\n })\n return ghosttyMod.renderAnsiPng(ansi, { cols, rows, ...opts })\n }\n\n // ── Resize ──\n\n function resize(newCols: number, newRows: number): void {\n if (closed) throw new Error(\"Terminal is closed\")\n cols = newCols\n rows = newRows\n backend.resize(newCols, newRows)\n if (ptyHandle?.alive) {\n ptyHandle.resize(newCols, newRows)\n }\n }\n\n // ── Cleanup ──\n\n async function close(): Promise<void> {\n if (closed) return\n closed = true\n\n // Disconnect emulator→PTY response path\n backend.onResponse = undefined\n\n if (ptyHandle) {\n await ptyHandle.close()\n ptyHandle = null\n }\n\n backend.destroy()\n }\n\n // ── Terminal object ──\n\n const terminal: Terminal = {\n get cols() {\n return cols\n },\n get rows() {\n return rows\n },\n get backend() {\n return backend\n },\n\n // TerminalReadable\n getText,\n getTextRange,\n getCell,\n getLine,\n getLines,\n getCursor,\n getMode,\n getTitle,\n getScrollback,\n\n // Region selectors\n get screen(): RegionView {\n return createScreenView(backend)\n },\n get scrollback(): RegionView {\n return createScrollbackView(backend)\n },\n get buffer(): RegionView {\n return createBufferView(backend)\n },\n get viewport(): RegionView {\n return createViewportView(backend)\n },\n get out(): OutputView {\n return out\n },\n row(n: number): RowView {\n const { totalLines, screenLines } = backend.getScrollback()\n const base = totalLines - screenLines\n const screenRow = n >= 0 ? n : screenLines + n\n return createRowView(backend, base + screenRow, screenRow)\n },\n cell(r: number, c: number): CellView {\n const { totalLines, screenLines } = backend.getScrollback()\n const base = totalLines - screenLines\n const screenRow = r >= 0 ? r : screenLines + r\n return createCellView(backend.getCell(base + screenRow, c), screenRow, c)\n },\n range(r1: number, c1: number, r2: number, c2: number): RegionView {\n return createRangeView(backend, r1, c1, r2, c2)\n },\n firstRow(): RowView {\n return this.row(0)\n },\n lastRow(): RowView {\n return this.row(-1)\n },\n\n // Data feed\n feed,\n\n // PTY\n spawn,\n get alive() {\n return ptyHandle?.alive ?? false\n },\n get exitInfo() {\n return ptyHandle?.exitInfo ?? null\n },\n\n // Input — keyboard\n press,\n type,\n\n // Clipboard\n clipboardWrites,\n\n // Input — mouse\n click,\n dblclick,\n mouseDown,\n mouseUp,\n mouseMove,\n wheel,\n\n // Waiting\n waitFor,\n waitForStable,\n\n // Search\n find,\n findAll,\n\n // Screenshot\n screenshotSvg: screenshot,\n screenshotPng: screenshotAsPng,\n screenshot: screenshotAuto,\n screenshotCanvasPng: screenshotAsCanvasPng,\n\n // Resize\n resize,\n\n // Cleanup\n close,\n [Symbol.asyncDispose]: close,\n }\n\n return terminal\n}\n","/**\n * Backend registry — one function, everything derived.\n *\n * @example\n * ```typescript\n * import { backend } from \"termless\"\n *\n * const b = await backend(\"ghostty\")\n * const b = await backend(\"xtermjs\", { version: \"5.4.0\" })\n * ```\n */\n\nimport { readFileSync, existsSync, readdirSync, mkdirSync, writeFileSync } from \"node:fs\"\nimport { dirname, join } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\nimport { execSync } from \"node:child_process\"\nimport type { TerminalBackend, TerminalOptions, Terminal } from \"../terminal/types.ts\"\nimport { createTerminal } from \"../terminal/terminal.ts\"\n\n// ═══════════════════════════════════════════════════════\n// Manifest\n// ═══════════════════════════════════════════════════════\n\nexport interface BackendEntry {\n package: string\n upstream: string | null\n version: string | null\n type: \"js\" | \"wasm\" | \"native\" | \"os\"\n default?: boolean\n platforms?: string[]\n label?: string\n description?: string\n url?: string\n caveat?: string\n slug?: string\n terminal?: {\n name: string\n description: string\n body?: string\n url?: string\n repo?: string\n author?: string\n }\n}\n\nexport interface Manifest {\n version: string\n backends: Record<string, BackendEntry>\n}\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n// `backends.json` lives at the package root; this file is `src/backend/`.\nconst PACKAGE_ROOT = join(__dirname, \"..\", \"..\")\nconst MANIFEST_PATH = join(PACKAGE_ROOT, \"backends.json\")\n\nlet _manifest: Manifest | null = null\n\nexport function manifest(): Manifest {\n if (_manifest) return _manifest\n const raw = JSON.parse(readFileSync(MANIFEST_PATH, \"utf-8\")) as any\n // Normalize: map upstreamVersion → version for cleaner access\n const backends: Record<string, BackendEntry> = {}\n for (const [name, entry] of Object.entries(raw.backends) as [string, any][]) {\n backends[name] = {\n package: entry.package,\n upstream: entry.upstream ?? null,\n version: entry.upstreamVersion ?? null,\n type: entry.type,\n default: entry.default,\n platforms: entry.platforms,\n label: entry.label,\n description: entry.description,\n url: entry.url,\n caveat: entry.caveat,\n slug: entry.slug,\n terminal: entry.terminal,\n }\n }\n _manifest = { version: raw.version, backends }\n return _manifest\n}\n\n// ═══════════════════════════════════════════════════════\n// Backend types — polymorphic on js/wasm/native/os\n// ═══════════════════════════════════════════════════════\n\ninterface BackendType {\n /** Check if the backend is built and ready to use. */\n isReady(pkgDir: string): boolean\n /** Build the backend from source. No-op if already ready. */\n build(pkgDir: string): void\n /** Resolve (import + initialize) the backend. */\n resolve(packageName: string, opts?: Partial<TerminalOptions>): Promise<TerminalBackend>\n}\n\nfunction hasFilesWithExt(dir: string, ext: string, subdirs: string[] = []): boolean {\n const dirs = [dir, ...subdirs.map((s) => join(dir, s))]\n for (const d of dirs) {\n if (!existsSync(d)) continue\n try {\n for (const f of readdirSync(d)) {\n if (f.endsWith(ext)) return true\n }\n } catch {}\n }\n return false\n}\n\nfunction resolveModule(pkg: string, opts?: Partial<TerminalOptions>) {\n return async () => {\n const mod = await import(pkg)\n return typeof mod.resolve === \"function\"\n ? mod.resolve(opts)\n : mod[Object.keys(mod).find((k) => k.startsWith(\"create\"))!](opts)\n }\n}\n\n/** Run a backend's build/build.sh, falling back to nix if tools aren't in PATH. */\nfunction runBuildScript(pkgDir: string): void {\n const buildScript = join(pkgDir, \"build\", \"build.sh\")\n if (!existsSync(buildScript)) return\n console.log(` Building in ${pkgDir}...`)\n try {\n execSync(`bash build/build.sh`, { cwd: pkgDir, stdio: \"inherit\" })\n } catch {\n const flakeDir = PACKAGE_ROOT\n if (existsSync(join(flakeDir, \"flake.nix\"))) {\n execSync(`nix develop ${flakeDir} --command bash build/build.sh`, { cwd: pkgDir, stdio: \"inherit\" })\n } else {\n throw new Error(`Build failed. Install dependencies or use the nix flake: nix develop`)\n }\n }\n}\n\nconst backendTypes: Record<string, BackendType> = {\n js: {\n isReady: () => true,\n build: () => {},\n resolve: async (pkg, opts) => resolveModule(pkg, opts)(),\n },\n\n wasm: {\n isReady: (pkgDir) => {\n // WASM backends distributed via npm are ready immediately (wasm bundled in package).\n // WASM backends built from source need a .wasm file.\n return hasFilesWithExt(pkgDir, \".wasm\", [\"wasm\", \"build\"]) || !existsSync(join(pkgDir, \"build\"))\n },\n build: (pkgDir) => runBuildScript(pkgDir),\n resolve: async (pkg, opts) => resolveModule(pkg, opts)(),\n },\n\n native: {\n isReady: (pkgDir) => hasFilesWithExt(pkgDir, \".node\", [\"build\", \"native\"]),\n build: (pkgDir) => runBuildScript(pkgDir),\n resolve: async (pkg, opts) => resolveModule(pkg, opts)(),\n },\n\n os: {\n isReady: () => true,\n build: () => {},\n resolve: async (pkg, opts) => resolveModule(pkg, opts)(),\n },\n}\n\n// ═══════════════════════════════════════════════════════\n// Build\n// ═══════════════════════════════════════════════════════\n\n/** Build a backend's native artifacts if not already ready. */\nexport function buildBackend(name: string): void {\n const m = manifest()\n const e = m.backends[name]\n if (!e) throw new Error(`Unknown backend: ${name}`)\n\n const type = backendTypes[e.type]\n if (!type) return\n\n const pkgDir = findPackageDir(e.package)\n if (!pkgDir) return\n\n if (!type.isReady(pkgDir)) {\n type.build(pkgDir)\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Core API\n// ═══════════════════════════════════════════════════════\n\n/**\n * Resolve a backend by name. The one function you need.\n *\n * @example\n * ```typescript\n * const b = await backend(\"ghostty\")\n * const b = await backend(\"xtermjs\", { version: \"5.4.0\" })\n * ```\n */\nexport async function backend(\n name: string,\n opts?: Partial<TerminalOptions> & { version?: string },\n): Promise<TerminalBackend> {\n const m = manifest()\n const entry = m.backends[name]\n\n if (!entry) {\n throw new Error(`Unknown backend \"${name}\". Available: ${Object.keys(m.backends).join(\", \")}`)\n }\n\n const type = backendTypes[entry.type]\n if (!type) throw new Error(`Unknown backend type \"${entry.type}\" for \"${name}\"`)\n\n // Version-pinned resolution\n if (opts?.version && opts.version !== entry.version) {\n return resolveVersioned(name, entry, type, opts.version, opts)\n }\n\n // Check if package is importable\n try {\n import.meta.resolve(entry.package)\n } catch {\n throw new Error(`Backend \"${name}\" is not installed.\\n` + `Run: bunx termless backend install ${name}`)\n }\n\n // Check if built\n const pkgDir = findPackageDir(entry.package)\n if (pkgDir && !type.isReady(pkgDir)) {\n throw new Error(`Backend \"${name}\" is installed but not built.\\n` + `Run: cd ${pkgDir} && ${getBuildHint(entry)}`)\n }\n\n return type.resolve(entry.package, opts)\n}\n\n/** Check if a backend is installed and ready. */\nexport function isReady(name: string): boolean {\n const m = manifest()\n const entry = m.backends[name]\n if (!entry) return false\n\n try {\n import.meta.resolve(entry.package)\n } catch {\n return false\n }\n\n const type = backendTypes[entry.type]\n if (!type) return false\n\n const pkgDir = findPackageDir(entry.package)\n return pkgDir ? type.isReady(pkgDir) : false\n}\n\n/** List all backend names. */\nexport function backends(): string[] {\n return Object.keys(manifest().backends)\n}\n\n/** Get entry for a backend. */\nexport function entry(name: string): BackendEntry | undefined {\n return manifest().backends[name]\n}\n\n/** Create a Terminal by backend name. */\nexport async function createTerminalByName(\n name: string,\n opts?: { cols?: number; rows?: number; scrollbackLimit?: number; version?: string },\n): Promise<Terminal> {\n const b = await backend(name, opts)\n return createTerminal({ backend: b, ...opts })\n}\n\n// ═══════════════════════════════════════════════════════\n// Version-pinned resolution\n// ═══════════════════════════════════════════════════════\n\nconst CACHE_DIR = join(process.env.XDG_CACHE_HOME ?? join(homedir(), \".cache\"), \"termless\", \"backends\")\n\nasync function resolveVersioned(\n name: string,\n entry: BackendEntry,\n type: BackendType,\n version: string,\n opts?: Partial<TerminalOptions>,\n): Promise<TerminalBackend> {\n if (entry.type === \"native\") {\n throw new Error(\n `Version-pinned resolution for native backend \"${name}\" requires nix.\\n` +\n `Run: nix develop .#${name}-${version.replace(/\\./g, \"_\")}`,\n )\n }\n\n if (!entry.upstream) {\n throw new Error(`Backend \"${name}\" has no upstream to version-pin.`)\n }\n\n const cacheDir = ensureCachedVersion(entry.upstream, version)\n\n const origNodePath = process.env.NODE_PATH\n process.env.NODE_PATH = join(cacheDir, \"node_modules\") + (origNodePath ? `:${origNodePath}` : \"\")\n\n try {\n return await type.resolve(entry.package, opts)\n } finally {\n if (origNodePath) process.env.NODE_PATH = origNodePath\n else delete process.env.NODE_PATH\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Version cache (shared by backend() and census)\n// ═══════════════════════════════════════════════════════\n\n/**\n * Install an upstream package at a specific version to the cache directory.\n * Returns the cache dir path (contains node_modules/).\n * Shared by backend() version-pinned resolution and census versioned runs.\n */\nexport function ensureCachedVersion(upstream: string, version: string): string {\n const cacheDir = join(CACHE_DIR, `${upstream.replace(/[/@]/g, \"_\")}-${version}`)\n\n if (!existsSync(join(cacheDir, \"node_modules\"))) {\n mkdirSync(cacheDir, { recursive: true })\n writeFileSync(\n join(cacheDir, \"package.json\"),\n JSON.stringify({ private: true, dependencies: { [upstream]: version } }),\n )\n execSync(\"bun install --no-save\", { cwd: cacheDir, stdio: \"pipe\" })\n }\n\n return cacheDir\n}\n\n// ═══════════════════════════════════════════════════════\n// Helpers\n// ═══════════════════════════════════════════════════════\n\nfunction findPackageDir(packageName: string): string | null {\n try {\n const resolved = fileURLToPath(import.meta.resolve(packageName))\n let dir = dirname(resolved)\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, \"package.json\"))) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, \"package.json\"), \"utf-8\")) as any\n if (pkg.name === packageName) return dir\n } catch {}\n }\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n } catch {}\n return null\n}\n\nfunction getBuildHint(entry: BackendEntry): string {\n if (entry.type === \"native\") return \"cargo build --release\"\n if (entry.type === \"wasm\") return \"bash build/build.sh\"\n return \"bun install\"\n}\n\n/** Get installed version of a backend package. */\nexport function getInstalledVersion(packageName: string): string | null {\n const dir = findPackageDir(packageName)\n if (!dir) return null\n try {\n const pkg = JSON.parse(readFileSync(join(dir, \"package.json\"), \"utf-8\")) as Record<string, any>\n return pkg.version ?? null\n } catch {\n return null\n }\n}\n\n/** Detect package manager from lockfiles. */\nexport function detectPackageManager(): \"bun\" | \"npm\" | \"pnpm\" | \"yarn\" {\n const cwd = process.cwd()\n if (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\"))) return \"bun\"\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\"\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\"\n return \"npm\"\n}\n\nexport type ResolveOptions = Partial<TerminalOptions> & { version?: string }\n"],"mappings":"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"}