@effect-tui/react 0.1.3 → 0.1.5

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 (442) hide show
  1. package/dist/jsx-runtime.d.ts +13 -0
  2. package/dist/jsx-runtime.d.ts.map +1 -1
  3. package/dist/jsx-runtime.js.map +1 -1
  4. package/dist/src/codeblock.d.ts.map +1 -1
  5. package/dist/src/codeblock.js.map +1 -1
  6. package/dist/src/components/Divider.d.ts +18 -0
  7. package/dist/src/components/Divider.d.ts.map +1 -0
  8. package/dist/src/components/Divider.js +17 -0
  9. package/dist/src/components/Divider.js.map +1 -0
  10. package/dist/src/components/Markdown.d.ts +66 -0
  11. package/dist/src/components/Markdown.d.ts.map +1 -0
  12. package/dist/src/components/Markdown.js +226 -0
  13. package/dist/src/components/Markdown.js.map +1 -0
  14. package/dist/src/components/MultilineTextInput.d.ts +65 -0
  15. package/dist/src/components/MultilineTextInput.d.ts.map +1 -0
  16. package/dist/src/components/MultilineTextInput.js +607 -0
  17. package/dist/src/components/MultilineTextInput.js.map +1 -0
  18. package/dist/src/components/Overlay.d.ts +46 -0
  19. package/dist/src/components/Overlay.d.ts.map +1 -0
  20. package/dist/src/components/Overlay.js +11 -0
  21. package/dist/src/components/Overlay.js.map +1 -0
  22. package/dist/src/components/Static.d.ts +44 -0
  23. package/dist/src/components/Static.d.ts.map +1 -0
  24. package/dist/src/components/Static.js +53 -0
  25. package/dist/src/components/Static.js.map +1 -0
  26. package/dist/src/components/TextInput.d.ts +55 -0
  27. package/dist/src/components/TextInput.d.ts.map +1 -0
  28. package/dist/src/components/TextInput.js +277 -0
  29. package/dist/src/components/TextInput.js.map +1 -0
  30. package/dist/src/components/index.d.ts +7 -0
  31. package/dist/src/components/index.d.ts.map +1 -0
  32. package/dist/src/components/index.js +7 -0
  33. package/dist/src/components/index.js.map +1 -0
  34. package/dist/src/components/text-editing.d.ts +62 -0
  35. package/dist/src/components/text-editing.d.ts.map +1 -0
  36. package/dist/src/components/text-editing.js +385 -0
  37. package/dist/src/components/text-editing.js.map +1 -0
  38. package/dist/src/console/ConsoleCapture.d.ts +36 -0
  39. package/dist/src/console/ConsoleCapture.d.ts.map +1 -0
  40. package/dist/src/console/ConsoleCapture.js +210 -0
  41. package/dist/src/console/ConsoleCapture.js.map +1 -0
  42. package/dist/src/console/ConsolePopover.d.ts +18 -0
  43. package/dist/src/console/ConsolePopover.d.ts.map +1 -0
  44. package/dist/src/console/ConsolePopover.js +324 -0
  45. package/dist/src/console/ConsolePopover.js.map +1 -0
  46. package/dist/src/console/clipboard.d.ts +10 -0
  47. package/dist/src/console/clipboard.d.ts.map +1 -0
  48. package/dist/src/console/clipboard.js +74 -0
  49. package/dist/src/console/clipboard.js.map +1 -0
  50. package/dist/src/console/index.d.ts +5 -0
  51. package/dist/src/console/index.d.ts.map +1 -0
  52. package/dist/src/console/index.js +33 -0
  53. package/dist/src/console/index.js.map +1 -0
  54. package/dist/src/console/useConsole.d.ts +44 -0
  55. package/dist/src/console/useConsole.d.ts.map +1 -0
  56. package/dist/src/console/useConsole.js +91 -0
  57. package/dist/src/console/useConsole.js.map +1 -0
  58. package/dist/src/debug/DebugOverlay.d.ts +49 -0
  59. package/dist/src/debug/DebugOverlay.d.ts.map +1 -0
  60. package/dist/src/debug/DebugOverlay.js +438 -0
  61. package/dist/src/debug/DebugOverlay.js.map +1 -0
  62. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -1
  63. package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
  64. package/dist/src/dev/Toast.d.ts +19 -0
  65. package/dist/src/dev/Toast.d.ts.map +1 -0
  66. package/dist/src/dev/Toast.js +72 -0
  67. package/dist/src/dev/Toast.js.map +1 -0
  68. package/dist/src/dev/index.d.ts +2 -0
  69. package/dist/src/dev/index.d.ts.map +1 -0
  70. package/dist/src/dev/index.js +3 -0
  71. package/dist/src/dev/index.js.map +1 -0
  72. package/dist/src/dev.d.ts +114 -0
  73. package/dist/src/dev.d.ts.map +1 -0
  74. package/dist/src/dev.js +373 -0
  75. package/dist/src/dev.js.map +1 -0
  76. package/dist/src/highlight.d.ts +3 -3
  77. package/dist/src/highlight.d.ts.map +1 -1
  78. package/dist/src/highlight.js.map +1 -1
  79. package/dist/src/hmr-plugin.d.ts +2 -0
  80. package/dist/src/hmr-plugin.d.ts.map +1 -0
  81. package/dist/src/hmr-plugin.js +53 -0
  82. package/dist/src/hmr-plugin.js.map +1 -0
  83. package/dist/src/hooks/index.d.ts +4 -0
  84. package/dist/src/hooks/index.d.ts.map +1 -1
  85. package/dist/src/hooks/index.js +2 -0
  86. package/dist/src/hooks/index.js.map +1 -1
  87. package/dist/src/hooks/use-keyboard.d.ts +11 -0
  88. package/dist/src/hooks/use-keyboard.d.ts.map +1 -1
  89. package/dist/src/hooks/use-keyboard.js +22 -4
  90. package/dist/src/hooks/use-keyboard.js.map +1 -1
  91. package/dist/src/hooks/use-mouse.d.ts +24 -0
  92. package/dist/src/hooks/use-mouse.d.ts.map +1 -0
  93. package/dist/src/hooks/use-mouse.js +41 -0
  94. package/dist/src/hooks/use-mouse.js.map +1 -0
  95. package/dist/src/hooks/use-paste.d.ts +11 -0
  96. package/dist/src/hooks/use-paste.d.ts.map +1 -1
  97. package/dist/src/hooks/use-paste.js +17 -3
  98. package/dist/src/hooks/use-paste.js.map +1 -1
  99. package/dist/src/hooks/use-scroll.d.ts +79 -0
  100. package/dist/src/hooks/use-scroll.d.ts.map +1 -0
  101. package/dist/src/hooks/use-scroll.js +239 -0
  102. package/dist/src/hooks/use-scroll.js.map +1 -0
  103. package/dist/src/hooks/useFrameStats.js.map +1 -1
  104. package/dist/src/hosts/base.d.ts +62 -1
  105. package/dist/src/hosts/base.d.ts.map +1 -1
  106. package/dist/src/hosts/base.js +118 -5
  107. package/dist/src/hosts/base.js.map +1 -1
  108. package/dist/src/hosts/box.d.ts +7 -7
  109. package/dist/src/hosts/box.d.ts.map +1 -1
  110. package/dist/src/hosts/box.js +30 -23
  111. package/dist/src/hosts/box.js.map +1 -1
  112. package/dist/src/hosts/canvas.d.ts +16 -8
  113. package/dist/src/hosts/canvas.d.ts.map +1 -1
  114. package/dist/src/hosts/canvas.js +27 -22
  115. package/dist/src/hosts/canvas.js.map +1 -1
  116. package/dist/src/hosts/codeblock.d.ts +7 -7
  117. package/dist/src/hosts/codeblock.d.ts.map +1 -1
  118. package/dist/src/hosts/codeblock.js +11 -20
  119. package/dist/src/hosts/codeblock.js.map +1 -1
  120. package/dist/src/hosts/flex-container.d.ts +45 -0
  121. package/dist/src/hosts/flex-container.d.ts.map +1 -0
  122. package/dist/src/hosts/flex-container.js +90 -0
  123. package/dist/src/hosts/flex-container.js.map +1 -0
  124. package/dist/src/hosts/hstack.d.ts +6 -11
  125. package/dist/src/hosts/hstack.d.ts.map +1 -1
  126. package/dist/src/hosts/hstack.js +6 -41
  127. package/dist/src/hosts/hstack.js.map +1 -1
  128. package/dist/src/hosts/index.d.ts +4 -0
  129. package/dist/src/hosts/index.d.ts.map +1 -1
  130. package/dist/src/hosts/index.js +10 -0
  131. package/dist/src/hosts/index.js.map +1 -1
  132. package/dist/src/hosts/overlay-item.d.ts +32 -0
  133. package/dist/src/hosts/overlay-item.d.ts.map +1 -0
  134. package/dist/src/hosts/overlay-item.js +54 -0
  135. package/dist/src/hosts/overlay-item.js.map +1 -0
  136. package/dist/src/hosts/overlay.d.ts +30 -0
  137. package/dist/src/hosts/overlay.d.ts.map +1 -0
  138. package/dist/src/hosts/overlay.js +105 -0
  139. package/dist/src/hosts/overlay.js.map +1 -0
  140. package/dist/src/hosts/scroll.d.ts +56 -0
  141. package/dist/src/hosts/scroll.d.ts.map +1 -0
  142. package/dist/src/hosts/scroll.js +204 -0
  143. package/dist/src/hosts/scroll.js.map +1 -0
  144. package/dist/src/hosts/single-child.d.ts +16 -0
  145. package/dist/src/hosts/single-child.d.ts.map +1 -0
  146. package/dist/src/hosts/single-child.js +45 -0
  147. package/dist/src/hosts/single-child.js.map +1 -0
  148. package/dist/src/hosts/spacer.d.ts.map +1 -1
  149. package/dist/src/hosts/spacer.js +7 -3
  150. package/dist/src/hosts/spacer.js.map +1 -1
  151. package/dist/src/hosts/text.d.ts +9 -6
  152. package/dist/src/hosts/text.d.ts.map +1 -1
  153. package/dist/src/hosts/text.js +49 -22
  154. package/dist/src/hosts/text.js.map +1 -1
  155. package/dist/src/hosts/vstack.d.ts +6 -11
  156. package/dist/src/hosts/vstack.d.ts.map +1 -1
  157. package/dist/src/hosts/vstack.js +6 -41
  158. package/dist/src/hosts/vstack.js.map +1 -1
  159. package/dist/src/hosts/zstack.d.ts.map +1 -1
  160. package/dist/src/hosts/zstack.js +16 -5
  161. package/dist/src/hosts/zstack.js.map +1 -1
  162. package/dist/src/index.d.ts +9 -2
  163. package/dist/src/index.d.ts.map +1 -1
  164. package/dist/src/index.js +10 -2
  165. package/dist/src/index.js.map +1 -1
  166. package/dist/src/inline/index.d.ts.map +1 -1
  167. package/dist/src/inline/index.js.map +1 -1
  168. package/dist/src/motion/color-motion-value.d.ts.map +1 -1
  169. package/dist/src/motion/color-motion-value.js.map +1 -1
  170. package/dist/src/motion/color.d.ts +1 -29
  171. package/dist/src/motion/color.d.ts.map +1 -1
  172. package/dist/src/motion/color.js +2 -170
  173. package/dist/src/motion/color.js.map +1 -1
  174. package/dist/src/motion/color.test.js.map +1 -1
  175. package/dist/src/motion/event-emitter.d.ts.map +1 -1
  176. package/dist/src/motion/event-emitter.js.map +1 -1
  177. package/dist/src/motion/frame.js.map +1 -1
  178. package/dist/src/motion/hooks.d.ts.map +1 -1
  179. package/dist/src/motion/hooks.js +8 -3
  180. package/dist/src/motion/hooks.js.map +1 -1
  181. package/dist/src/motion/index.d.ts.map +1 -1
  182. package/dist/src/motion/index.js.map +1 -1
  183. package/dist/src/motion/motion-value.d.ts.map +1 -1
  184. package/dist/src/motion/motion-value.js.map +1 -1
  185. package/dist/src/motion/motion-value.test.js.map +1 -1
  186. package/dist/src/motion/spring-math.d.ts +6 -1
  187. package/dist/src/motion/spring-math.d.ts.map +1 -1
  188. package/dist/src/motion/spring-math.js +6 -1
  189. package/dist/src/motion/spring-math.js.map +1 -1
  190. package/dist/src/motion/types.d.ts.map +1 -1
  191. package/dist/src/motion/types.js.map +1 -1
  192. package/dist/src/profiler.js.map +1 -1
  193. package/dist/src/reconciler/host-config.d.ts +5 -5
  194. package/dist/src/reconciler/host-config.d.ts.map +1 -1
  195. package/dist/src/reconciler/host-config.js +43 -51
  196. package/dist/src/reconciler/host-config.js.map +1 -1
  197. package/dist/src/reconciler/noop-methods.d.ts +29 -0
  198. package/dist/src/reconciler/noop-methods.d.ts.map +1 -0
  199. package/dist/src/reconciler/noop-methods.js +43 -0
  200. package/dist/src/reconciler/noop-methods.js.map +1 -0
  201. package/dist/src/reconciler/types.d.ts +68 -14
  202. package/dist/src/reconciler/types.d.ts.map +1 -1
  203. package/dist/src/remote/Procedures.d.ts +22 -0
  204. package/dist/src/remote/Procedures.d.ts.map +1 -0
  205. package/dist/src/remote/Procedures.js +42 -0
  206. package/dist/src/remote/Procedures.js.map +1 -0
  207. package/dist/src/remote/Router.d.ts +20 -0
  208. package/dist/src/remote/Router.d.ts.map +1 -0
  209. package/dist/src/remote/Router.js +26 -0
  210. package/dist/src/remote/Router.js.map +1 -0
  211. package/dist/src/remote/Server.d.ts +6 -0
  212. package/dist/src/remote/Server.d.ts.map +1 -0
  213. package/dist/src/remote/Server.js +53 -0
  214. package/dist/src/remote/Server.js.map +1 -0
  215. package/dist/src/remote/index.d.ts +18 -0
  216. package/dist/src/remote/index.d.ts.map +1 -0
  217. package/dist/src/remote/index.js +74 -0
  218. package/dist/src/remote/index.js.map +1 -0
  219. package/dist/src/renderer/core/FrameBuilder.d.ts +18 -0
  220. package/dist/src/renderer/core/FrameBuilder.d.ts.map +1 -0
  221. package/dist/src/renderer/core/FrameBuilder.js +38 -0
  222. package/dist/src/renderer/core/FrameBuilder.js.map +1 -0
  223. package/dist/src/renderer/core/RendererState.d.ts +41 -0
  224. package/dist/src/renderer/core/RendererState.d.ts.map +1 -0
  225. package/dist/src/renderer/core/RendererState.js +70 -0
  226. package/dist/src/renderer/core/RendererState.js.map +1 -0
  227. package/dist/src/renderer/core/index.d.ts +3 -0
  228. package/dist/src/renderer/core/index.d.ts.map +1 -0
  229. package/dist/src/renderer/core/index.js +3 -0
  230. package/dist/src/renderer/core/index.js.map +1 -0
  231. package/dist/src/renderer/input/InputProcessor.d.ts +25 -0
  232. package/dist/src/renderer/input/InputProcessor.d.ts.map +1 -0
  233. package/dist/src/renderer/input/InputProcessor.js +81 -0
  234. package/dist/src/renderer/input/InputProcessor.js.map +1 -0
  235. package/dist/src/renderer/input/index.d.ts +2 -0
  236. package/dist/src/renderer/input/index.d.ts.map +1 -0
  237. package/dist/src/renderer/input/index.js +2 -0
  238. package/dist/src/renderer/input/index.js.map +1 -0
  239. package/dist/src/renderer/lifecycle/EventBus.d.ts +41 -0
  240. package/dist/src/renderer/lifecycle/EventBus.d.ts.map +1 -0
  241. package/dist/src/renderer/lifecycle/EventBus.js +78 -0
  242. package/dist/src/renderer/lifecycle/EventBus.js.map +1 -0
  243. package/dist/src/renderer/lifecycle/ResizeManager.d.ts +34 -0
  244. package/dist/src/renderer/lifecycle/ResizeManager.d.ts.map +1 -0
  245. package/dist/src/renderer/lifecycle/ResizeManager.js +47 -0
  246. package/dist/src/renderer/lifecycle/ResizeManager.js.map +1 -0
  247. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts +36 -0
  248. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts.map +1 -0
  249. package/dist/src/renderer/lifecycle/TerminalSetup.js +82 -0
  250. package/dist/src/renderer/lifecycle/TerminalSetup.js.map +1 -0
  251. package/dist/src/renderer/lifecycle/index.d.ts +4 -0
  252. package/dist/src/renderer/lifecycle/index.d.ts.map +1 -0
  253. package/dist/src/renderer/lifecycle/index.js +4 -0
  254. package/dist/src/renderer/lifecycle/index.js.map +1 -0
  255. package/dist/src/renderer/modes/FullscreenRenderer.d.ts +12 -0
  256. package/dist/src/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
  257. package/dist/src/renderer/modes/FullscreenRenderer.js +52 -0
  258. package/dist/src/renderer/modes/FullscreenRenderer.js.map +1 -0
  259. package/dist/src/renderer/modes/InlineRenderer.d.ts +25 -0
  260. package/dist/src/renderer/modes/InlineRenderer.d.ts.map +1 -0
  261. package/dist/src/renderer/modes/InlineRenderer.js +161 -0
  262. package/dist/src/renderer/modes/InlineRenderer.js.map +1 -0
  263. package/dist/src/renderer/modes/RendererMode.d.ts +42 -0
  264. package/dist/src/renderer/modes/RendererMode.d.ts.map +1 -0
  265. package/dist/src/renderer/modes/RendererMode.js +2 -0
  266. package/dist/src/renderer/modes/RendererMode.js.map +1 -0
  267. package/dist/src/renderer/modes/StaticContentRenderer.d.ts +25 -0
  268. package/dist/src/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
  269. package/dist/src/renderer/modes/StaticContentRenderer.js +47 -0
  270. package/dist/src/renderer/modes/StaticContentRenderer.js.map +1 -0
  271. package/dist/src/renderer/modes/index.d.ts +5 -0
  272. package/dist/src/renderer/modes/index.d.ts.map +1 -0
  273. package/dist/src/renderer/modes/index.js +4 -0
  274. package/dist/src/renderer/modes/index.js.map +1 -0
  275. package/dist/src/renderer-context.d.ts +9 -0
  276. package/dist/src/renderer-context.d.ts.map +1 -0
  277. package/dist/src/renderer-context.js +22 -0
  278. package/dist/src/renderer-context.js.map +1 -0
  279. package/dist/src/renderer-types.d.ts +103 -0
  280. package/dist/src/renderer-types.d.ts.map +1 -0
  281. package/dist/src/renderer-types.js +2 -0
  282. package/dist/src/renderer-types.js.map +1 -0
  283. package/dist/src/renderer.d.ts +4 -86
  284. package/dist/src/renderer.d.ts.map +1 -1
  285. package/dist/src/renderer.js +214 -384
  286. package/dist/src/renderer.js.map +1 -1
  287. package/dist/src/test/index.d.ts.map +1 -1
  288. package/dist/src/test/index.js.map +1 -1
  289. package/dist/src/test/mock-streams.d.ts.map +1 -1
  290. package/dist/src/test/mock-streams.js.map +1 -1
  291. package/dist/src/test/render-tui.d.ts.map +1 -1
  292. package/dist/src/test/render-tui.js +2 -5
  293. package/dist/src/test/render-tui.js.map +1 -1
  294. package/dist/src/trace/SpanTree.d.ts.map +1 -1
  295. package/dist/src/trace/SpanTree.js +21 -11
  296. package/dist/src/trace/SpanTree.js.map +1 -1
  297. package/dist/src/trace/format-value.d.ts +15 -0
  298. package/dist/src/trace/format-value.d.ts.map +1 -0
  299. package/dist/src/trace/format-value.js +77 -0
  300. package/dist/src/trace/format-value.js.map +1 -0
  301. package/dist/src/trace/index.d.ts.map +1 -1
  302. package/dist/src/trace/index.js.map +1 -1
  303. package/dist/src/trace/location.js +1 -1
  304. package/dist/src/trace/location.js.map +1 -1
  305. package/dist/src/trace/span-processor.d.ts.map +1 -1
  306. package/dist/src/trace/span-processor.js.map +1 -1
  307. package/dist/src/trace/span-state.d.ts +19 -2
  308. package/dist/src/trace/span-state.d.ts.map +1 -1
  309. package/dist/src/trace/span-state.js +62 -31
  310. package/dist/src/trace/span-state.js.map +1 -1
  311. package/dist/src/trace/tui-logger.js.map +1 -1
  312. package/dist/src/utils/border.d.ts +1 -1
  313. package/dist/src/utils/border.d.ts.map +1 -1
  314. package/dist/src/utils/border.js +6 -0
  315. package/dist/src/utils/border.js.map +1 -1
  316. package/dist/src/utils/flex-layout.d.ts +2 -1
  317. package/dist/src/utils/flex-layout.d.ts.map +1 -1
  318. package/dist/src/utils/flex-layout.js +22 -33
  319. package/dist/src/utils/flex-layout.js.map +1 -1
  320. package/dist/src/utils/index.d.ts +1 -1
  321. package/dist/src/utils/index.d.ts.map +1 -1
  322. package/dist/src/utils/index.js +1 -1
  323. package/dist/src/utils/index.js.map +1 -1
  324. package/dist/src/utils/padding.d.ts.map +1 -1
  325. package/dist/src/utils/padding.js.map +1 -1
  326. package/dist/src/utils/styles.d.ts +20 -1
  327. package/dist/src/utils/styles.d.ts.map +1 -1
  328. package/dist/src/utils/styles.js +36 -1
  329. package/dist/src/utils/styles.js.map +1 -1
  330. package/dist/src/visualize/index.d.ts +8 -19
  331. package/dist/src/visualize/index.d.ts.map +1 -1
  332. package/dist/src/visualize/index.js +11 -25
  333. package/dist/src/visualize/index.js.map +1 -1
  334. package/dist/tsconfig.tsbuildinfo +1 -1
  335. package/jsx-dev-runtime.ts +5 -0
  336. package/jsx-runtime.ts +54 -0
  337. package/package.json +124 -92
  338. package/src/codeblock.tsx +34 -34
  339. package/src/components/Divider.tsx +23 -0
  340. package/src/components/Markdown.tsx +380 -0
  341. package/src/components/MultilineTextInput.tsx +749 -0
  342. package/src/components/Overlay.tsx +56 -0
  343. package/src/components/Static.tsx +68 -0
  344. package/src/components/TextInput.tsx +356 -0
  345. package/src/components/index.ts +6 -0
  346. package/src/components/text-editing.ts +464 -0
  347. package/src/console/ConsoleCapture.ts +272 -0
  348. package/src/console/ConsolePopover.tsx +487 -0
  349. package/src/console/clipboard.ts +81 -0
  350. package/src/console/index.ts +42 -0
  351. package/src/console/useConsole.ts +129 -0
  352. package/src/debug/DebugOverlay.ts +557 -0
  353. package/src/debug/DiagnosticsPanel.tsx +27 -27
  354. package/src/dev/Toast.tsx +117 -0
  355. package/src/dev/index.ts +2 -0
  356. package/src/dev.tsx +489 -0
  357. package/src/highlight.ts +46 -46
  358. package/src/hmr-plugin.ts +61 -0
  359. package/src/hooks/index.ts +4 -0
  360. package/src/hooks/use-keyboard.ts +44 -24
  361. package/src/hooks/use-mouse.ts +51 -0
  362. package/src/hooks/use-paste.ts +21 -6
  363. package/src/hooks/use-scroll.ts +386 -0
  364. package/src/hooks/useFrameStats.ts +17 -17
  365. package/src/hosts/base.ts +180 -59
  366. package/src/hosts/box.ts +117 -94
  367. package/src/hosts/canvas.ts +170 -141
  368. package/src/hosts/codeblock.ts +117 -133
  369. package/src/hosts/flex-container.ts +124 -0
  370. package/src/hosts/hstack.ts +11 -59
  371. package/src/hosts/index.ts +24 -14
  372. package/src/hosts/overlay-item.ts +72 -0
  373. package/src/hosts/overlay.ts +125 -0
  374. package/src/hosts/scroll.ts +255 -0
  375. package/src/hosts/single-child.ts +52 -0
  376. package/src/hosts/spacer.ts +30 -26
  377. package/src/hosts/text.ts +198 -164
  378. package/src/hosts/vstack.ts +11 -59
  379. package/src/hosts/zstack.ts +79 -67
  380. package/src/index.ts +44 -19
  381. package/src/inline/index.tsx +123 -123
  382. package/src/motion/color-motion-value.ts +67 -67
  383. package/src/motion/color.test.ts +107 -107
  384. package/src/motion/color.ts +9 -190
  385. package/src/motion/event-emitter.ts +20 -20
  386. package/src/motion/frame.ts +35 -35
  387. package/src/motion/hooks.ts +144 -139
  388. package/src/motion/index.ts +10 -10
  389. package/src/motion/motion-value.test.ts +207 -207
  390. package/src/motion/motion-value.ts +112 -112
  391. package/src/motion/spring-math.ts +88 -83
  392. package/src/motion/types.ts +25 -25
  393. package/src/profiler.ts +50 -50
  394. package/src/reconciler/host-config.ts +152 -174
  395. package/src/reconciler/noop-methods.ts +55 -0
  396. package/src/reconciler/types.ts +112 -46
  397. package/src/remote/Procedures.ts +52 -0
  398. package/src/remote/Router.ts +58 -0
  399. package/src/remote/Server.ts +76 -0
  400. package/src/remote/index.ts +90 -0
  401. package/src/renderer/core/FrameBuilder.ts +49 -0
  402. package/src/renderer/core/RendererState.ts +80 -0
  403. package/src/renderer/core/index.ts +2 -0
  404. package/src/renderer/input/InputProcessor.ts +94 -0
  405. package/src/renderer/input/index.ts +1 -0
  406. package/src/renderer/lifecycle/EventBus.ts +90 -0
  407. package/src/renderer/lifecycle/ResizeManager.ts +65 -0
  408. package/src/renderer/lifecycle/TerminalSetup.ts +105 -0
  409. package/src/renderer/lifecycle/index.ts +3 -0
  410. package/src/renderer/modes/FullscreenRenderer.ts +53 -0
  411. package/src/renderer/modes/InlineRenderer.ts +186 -0
  412. package/src/renderer/modes/RendererMode.ts +46 -0
  413. package/src/renderer/modes/StaticContentRenderer.ts +56 -0
  414. package/src/renderer/modes/index.ts +4 -0
  415. package/src/renderer-context.ts +27 -0
  416. package/src/renderer-types.ts +109 -0
  417. package/src/renderer.ts +392 -642
  418. package/src/test/index.ts +5 -5
  419. package/src/test/mock-streams.ts +115 -115
  420. package/src/test/render-tui.ts +84 -87
  421. package/src/utils/border.ts +79 -73
  422. package/src/utils/flex-layout.ts +80 -93
  423. package/src/utils/index.ts +1 -1
  424. package/src/utils/padding.ts +27 -27
  425. package/src/utils/styles.ts +50 -7
  426. package/src/visualize/index.tsx +225 -240
  427. package/dist/src/output.d.ts +0 -47
  428. package/dist/src/output.d.ts.map +0 -1
  429. package/dist/src/output.js +0 -125
  430. package/dist/src/output.js.map +0 -1
  431. package/dist/src/terminal.d.ts +0 -37
  432. package/dist/src/terminal.d.ts.map +0 -1
  433. package/dist/src/terminal.js +0 -65
  434. package/dist/src/terminal.js.map +0 -1
  435. package/src/output.ts +0 -156
  436. package/src/terminal.ts +0 -67
  437. package/src/trace/SpanTree.tsx +0 -195
  438. package/src/trace/index.tsx +0 -205
  439. package/src/trace/location.ts +0 -90
  440. package/src/trace/span-processor.ts +0 -65
  441. package/src/trace/span-state.ts +0 -286
  442. package/src/trace/tui-logger.ts +0 -72
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/reconciler/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IAEZ,qBAAqB;IACrB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,uBAAuB;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAA;IAExB,qDAAqD;IACrD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IAEjB,6CAA6C;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAEzC,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IAExB,uBAAuB;IACvB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAElD,8BAA8B;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAEjD,yBAAyB;IACzB,OAAO,IAAI,IAAI,CAAA;IAEf,gBAAgB;IAChB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;IAEtC,mBAAmB;IACnB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;IAEtC,kCAAkC;IAClC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAC9D;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,IAAI,IAAI,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/reconciler/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAGvE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAE1B,MAAM,WAAW,YAAY;IAC5B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IAEZ,qBAAqB;IACrB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,uBAAuB;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAA;IAExB,qDAAqD;IACrD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IAEjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,6CAA6C;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAEzC,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IAExB,uBAAuB;IACvB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAElD,8BAA8B;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAEjD,yBAAyB;IACzB,OAAO,IAAI,IAAI,CAAA;IAEf,gBAAgB;IAChB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;IAEtC,mBAAmB;IACnB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;IAEtC,kCAAkC;IAClC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAC7D;AAED,MAAM,WAAW,WAAW;IAC3B,aAAa,IAAI,IAAI,CAAA;IACrB,kFAAkF;IAClF,sBAAsB,CAAC,IAAI,IAAI,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,WAAW,WAAW;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAA;IAMnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,gEAAgE;IAChE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB"}
@@ -0,0 +1,22 @@
1
+ import { Rpc, RpcGroup } from "@effect/rpc";
2
+ import { Schema } from "effect";
3
+ declare const TuiRpcs_base: RpcGroup.RpcGroup<Rpc.Rpc<"Screenshot", typeof Schema.Void, typeof Schema.String, typeof Schema.Never, never> | Rpc.Rpc<"SendKey", Schema.Struct<{
4
+ name: typeof Schema.String;
5
+ text: Schema.optional<typeof Schema.String>;
6
+ ctrl: Schema.optional<typeof Schema.Boolean>;
7
+ shift: Schema.optional<typeof Schema.Boolean>;
8
+ meta: Schema.optional<typeof Schema.Boolean>;
9
+ }>, typeof Schema.Void, typeof Schema.Never, never> | Rpc.Rpc<"Paste", Schema.Struct<{
10
+ text: typeof Schema.String;
11
+ }>, typeof Schema.Void, typeof Schema.Never, never> | Rpc.Rpc<"Resize", Schema.Struct<{
12
+ width: typeof Schema.Number;
13
+ height: typeof Schema.Number;
14
+ }>, typeof Schema.Void, typeof Schema.Never, never> | Rpc.Rpc<"Info", typeof Schema.Void, Schema.Struct<{
15
+ pid: typeof Schema.Number;
16
+ width: typeof Schema.Number;
17
+ height: typeof Schema.Number;
18
+ }>, typeof Schema.Never, never>>;
19
+ export declare class TuiRpcs extends TuiRpcs_base {
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=Procedures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Procedures.d.ts","sourceRoot":"","sources":["../../../src/remote/Procedures.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;;;;;;;;;;;;;;AA2C/B,qBAAa,OAAQ,SAAQ,YAM5B;CAAG"}
@@ -0,0 +1,42 @@
1
+ // RPC procedure definitions for remote session control
2
+ import { Rpc, RpcGroup } from "@effect/rpc";
3
+ import { Schema } from "effect";
4
+ // Screenshot - returns the current screen as ANSI string
5
+ const Screenshot = Rpc.make("Screenshot", {
6
+ success: Schema.String,
7
+ });
8
+ // SendKey - fires a key event into the TUI
9
+ const SendKey = Rpc.make("SendKey", {
10
+ payload: {
11
+ name: Schema.String,
12
+ text: Schema.optional(Schema.String),
13
+ ctrl: Schema.optional(Schema.Boolean),
14
+ shift: Schema.optional(Schema.Boolean),
15
+ meta: Schema.optional(Schema.Boolean),
16
+ },
17
+ });
18
+ // Paste - sends text as a paste event
19
+ const Paste = Rpc.make("Paste", {
20
+ payload: {
21
+ text: Schema.String,
22
+ },
23
+ });
24
+ // Resize - simulate terminal resize
25
+ const Resize = Rpc.make("Resize", {
26
+ payload: {
27
+ width: Schema.Number,
28
+ height: Schema.Number,
29
+ },
30
+ });
31
+ // Info - get session info
32
+ const Info = Rpc.make("Info", {
33
+ success: Schema.Struct({
34
+ pid: Schema.Number,
35
+ width: Schema.Number,
36
+ height: Schema.Number,
37
+ }),
38
+ });
39
+ // Group all RPCs together
40
+ export class TuiRpcs extends RpcGroup.make(Screenshot, SendKey, Paste, Resize, Info) {
41
+ }
42
+ //# sourceMappingURL=Procedures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Procedures.js","sourceRoot":"","sources":["../../../src/remote/Procedures.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,yDAAyD;AACzD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC,CAAA;AAEF,2CAA2C;AAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE;IACnC,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;QACtC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;KACrC;CACD,CAAC,CAAA;AAEF,sCAAsC;AACtC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;IAC/B,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,CAAC,MAAM;KACnB;CACD,CAAC,CAAA;AAEF,oCAAoC;AACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;KACrB;CACD,CAAC,CAAA;AAEF,0BAA0B;AAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC,MAAM;QAClB,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;KACrB,CAAC;CACF,CAAC,CAAA;AAEF,0BAA0B;AAC1B,MAAM,OAAO,OAAQ,SAAQ,QAAQ,CAAC,IAAI,CACzC,UAAU,EACV,OAAO,EACP,KAAK,EACL,MAAM,EACN,IAAI,CACJ;CAAG"}
@@ -0,0 +1,20 @@
1
+ import type { Rpc } from "@effect/rpc";
2
+ import { Layer, Context } from "effect";
3
+ import type { KeyMsg } from "@effect-tui/core";
4
+ export interface TuiSessionImpl {
5
+ readonly getScreenshot: () => string;
6
+ readonly dispatchKey: (key: KeyMsg) => void;
7
+ readonly dispatchPaste: (text: string) => void;
8
+ readonly dispatchResize: (width: number, height: number) => void;
9
+ readonly getInfo: () => {
10
+ pid: number;
11
+ width: number;
12
+ height: number;
13
+ };
14
+ }
15
+ declare const TuiSession_base: Context.TagClass<TuiSession, "TuiSession", TuiSessionImpl>;
16
+ export declare class TuiSession extends TuiSession_base {
17
+ }
18
+ export declare const HandlersLive: Layer.Layer<Rpc.Handler<"Screenshot"> | Rpc.Handler<"SendKey"> | Rpc.Handler<"Paste"> | Rpc.Handler<"Resize"> | Rpc.Handler<"Info">, never, TuiSession>;
19
+ export {};
20
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../src/remote/Router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAU,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAI9C,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9C,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACtE;;AAED,qBAAa,UAAW,SAAQ,eAG7B;CAAG;AAGN,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CACnC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GACzB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GACtB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GACpB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GACrB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EACrB,KAAK,EACL,UAAU,CA6BV,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { Effect, Layer, Context } from "effect";
2
+ import { TuiRpcs } from "./Procedures.js";
3
+ export class TuiSession extends Context.Tag("TuiSession")() {
4
+ }
5
+ // Create the RPC handlers layer
6
+ export const HandlersLive = TuiRpcs.toLayer(Effect.gen(function* () {
7
+ const session = yield* TuiSession;
8
+ return {
9
+ Screenshot: () => Effect.sync(() => session.getScreenshot()),
10
+ SendKey: ({ name, text, ctrl, shift, meta }) => Effect.sync(() => {
11
+ const key = {
12
+ type: "key",
13
+ name: name,
14
+ text,
15
+ ctrl: ctrl ?? false,
16
+ shift: shift ?? false,
17
+ meta: meta ?? false,
18
+ };
19
+ session.dispatchKey(key);
20
+ }),
21
+ Paste: ({ text }) => Effect.sync(() => session.dispatchPaste(text)),
22
+ Resize: ({ width, height }) => Effect.sync(() => session.dispatchResize(width, height)),
23
+ Info: () => Effect.sync(() => session.getInfo()),
24
+ };
25
+ }));
26
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../../src/remote/Router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAWzC,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAGtD;CAAG;AAEN,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAQrB,OAAO,CAAC,OAAO,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;IAEjC,OAAO;QACN,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAE5D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,MAAM,GAAG,GAAW;gBACnB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,IAAsB;gBAC5B,IAAI;gBACJ,IAAI,EAAE,IAAI,IAAI,KAAK;gBACnB,KAAK,EAAE,KAAK,IAAI,KAAK;gBACrB,IAAI,EAAE,IAAI,IAAI,KAAK;aACnB,CAAA;YACD,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC,CAAC;QAEH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAEnE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEzD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAChD,CAAA;AACF,CAAC,CAAC,CACF,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { Layer } from "effect";
2
+ import { RpcServer } from "@effect/rpc";
3
+ import { type TuiSessionImpl } from "./Router.js";
4
+ export declare const getSocketPath: (pid?: number) => string;
5
+ export declare const makeServerLayer: (sessionImpl: TuiSessionImpl, socketPath?: string) => Layer.Layer<RpcServer.Protocol, import("@effect/platform/SocketServer").SocketServerError, never>;
6
+ //# sourceMappingURL=Server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../../../src/remote/Server.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAoB,SAAS,EAAE,MAAM,aAAa,CAAA;AAKzD,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAa3E,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,WACU,CAAA;AAepD,eAAO,MAAM,eAAe,GAC3B,aAAa,cAAc,EAC3B,aAAa,MAAM,sGAqCnB,CAAA"}
@@ -0,0 +1,53 @@
1
+ // Remote server that exposes TUI session via Unix socket
2
+ import { Effect, Layer } from "effect";
3
+ import { RpcSerialization, RpcServer } from "@effect/rpc";
4
+ import { BunSocketServer } from "@effect/platform-bun";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import { TuiRpcs } from "./Procedures.js";
8
+ import { HandlersLive, TuiSession } from "./Router.js";
9
+ // Default socket directory
10
+ const SOCKET_DIR = "/tmp/effect-tui-sessions";
11
+ // Ensure socket directory exists
12
+ const ensureSocketDir = Effect.sync(() => {
13
+ if (!fs.existsSync(SOCKET_DIR)) {
14
+ fs.mkdirSync(SOCKET_DIR, { recursive: true });
15
+ }
16
+ });
17
+ // Get socket path for current process
18
+ export const getSocketPath = (pid) => path.join(SOCKET_DIR, `${pid ?? process.pid}.sock`);
19
+ // Clean up socket file
20
+ const cleanupSocket = (socketPath) => Effect.sync(() => {
21
+ try {
22
+ if (fs.existsSync(socketPath)) {
23
+ fs.unlinkSync(socketPath);
24
+ }
25
+ }
26
+ catch {
27
+ // Ignore cleanup errors
28
+ }
29
+ });
30
+ // Create the server layer
31
+ export const makeServerLayer = (sessionImpl, socketPath) => {
32
+ const actualPath = socketPath ?? getSocketPath();
33
+ // Setup layer - creates directory, cleans stale socket
34
+ const SetupLive = Layer.scopedDiscard(Effect.gen(function* () {
35
+ yield* ensureSocketDir;
36
+ yield* cleanupSocket(actualPath);
37
+ yield* Effect.addFinalizer(() => cleanupSocket(actualPath));
38
+ // Use console.log so it gets captured by the debug console panel
39
+ console.log(`[remote] Listening on ${actualPath}`);
40
+ }));
41
+ // RPC handlers layer (needs TuiSession)
42
+ const HandlersLayer = HandlersLive.pipe(Layer.provide(Layer.succeed(TuiSession, sessionImpl)));
43
+ // Full RPC server stack:
44
+ // 1. RpcServer.layer creates the RPC server, needs handlers
45
+ // 2. Handlers provide the implementation
46
+ // 3. Protocol layer provides socket protocol
47
+ // 4. Socket server provides the actual socket
48
+ const RpcLive = RpcServer.layer(TuiRpcs).pipe(Layer.provide(HandlersLayer), Layer.provideMerge(RpcServer.layerProtocolSocketServer), Layer.provide(RpcSerialization.layerNdjson), Layer.provide(BunSocketServer.layer({
49
+ path: actualPath,
50
+ })));
51
+ return Layer.merge(SetupLive, RpcLive);
52
+ };
53
+ //# sourceMappingURL=Server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Server.js","sourceRoot":"","sources":["../../../src/remote/Server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export { TuiRpcs } from "./Procedures.js";
2
+ export { TuiSession, HandlersLive } from "./Router.js";
3
+ export { makeServerLayer, getSocketPath } from "./Server.js";
4
+ import type { TuiRenderer } from "../renderer-types.js";
5
+ /**
6
+ * Enable remote control for a TUI renderer.
7
+ * Starts an RPC server on a Unix socket at /tmp/effect-tui-sessions/<pid>.sock
8
+ *
9
+ * @param renderer - The TUI renderer to control
10
+ * @param socketPath - Optional custom socket path
11
+ * @returns A cleanup function to stop the server
12
+ */
13
+ export declare function enableRemote(renderer: TuiRenderer, socketPath?: string): () => void;
14
+ /**
15
+ * Check if remote control should be enabled (via EFFECT_TUI_REMOTE=1 env var)
16
+ */
17
+ export declare function shouldEnableRemote(): boolean;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/remote/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIvD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,WAAW,EACrB,UAAU,CAAC,EAAE,MAAM,GACjB,MAAM,IAAI,CAoDZ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
@@ -0,0 +1,74 @@
1
+ // Remote session control for effect-tui
2
+ //
3
+ // Allows external tools (like Claude Code) to connect to a running TUI session
4
+ // to send keypresses and get screenshots.
5
+ //
6
+ // Usage:
7
+ // 1. Run app with EFFECT_TUI_REMOTE=1 to enable remote control
8
+ // 2. Connect using etui CLI or raw socket at /tmp/effect-tui-sessions/<pid>.sock
9
+ export { TuiRpcs } from "./Procedures.js";
10
+ export { TuiSession, HandlersLive } from "./Router.js";
11
+ export { makeServerLayer, getSocketPath } from "./Server.js";
12
+ import { Effect, Exit, Layer, Scope } from "effect";
13
+ import * as fs from "node:fs";
14
+ import { makeServerLayer, getSocketPath } from "./Server.js";
15
+ /**
16
+ * Enable remote control for a TUI renderer.
17
+ * Starts an RPC server on a Unix socket at /tmp/effect-tui-sessions/<pid>.sock
18
+ *
19
+ * @param renderer - The TUI renderer to control
20
+ * @param socketPath - Optional custom socket path
21
+ * @returns A cleanup function to stop the server
22
+ */
23
+ export function enableRemote(renderer, socketPath) {
24
+ const actualPath = socketPath ?? getSocketPath();
25
+ // Create session implementation from renderer
26
+ const session = {
27
+ getScreenshot: () => renderer.getScreenshot(),
28
+ dispatchKey: (key) => renderer.dispatchKey?.(key),
29
+ dispatchPaste: (text) => renderer.dispatchPaste?.(text),
30
+ dispatchResize: (width, height) => renderer.dispatchResize?.(width, height),
31
+ getInfo: () => ({
32
+ pid: process.pid,
33
+ width: renderer.width,
34
+ height: renderer.height,
35
+ }),
36
+ };
37
+ // Build and run the server layer
38
+ const serverLayer = makeServerLayer(session, actualPath);
39
+ // Use Effect runtime to manage the server lifecycle
40
+ let scope = null;
41
+ Effect.runPromise(Effect.gen(function* () {
42
+ scope = yield* Scope.make();
43
+ yield* Layer.buildWithScope(serverLayer, scope);
44
+ })).catch((err) => {
45
+ console.error("[effect-tui] Remote server error:", err);
46
+ });
47
+ // Ensure socket cleanup on process exit (Effect finalizers may not run on abrupt exit)
48
+ const cleanupSocket = () => {
49
+ try {
50
+ if (fs.existsSync(actualPath)) {
51
+ fs.unlinkSync(actualPath);
52
+ }
53
+ }
54
+ catch {
55
+ // Ignore cleanup errors
56
+ }
57
+ };
58
+ // "exit" event fires synchronously on any exit (normal, SIGINT, SIGTERM, etc.)
59
+ process.on("exit", cleanupSocket);
60
+ return () => {
61
+ process.off("exit", cleanupSocket);
62
+ cleanupSocket();
63
+ if (scope) {
64
+ Effect.runPromise(Scope.close(scope, Exit.void));
65
+ }
66
+ };
67
+ }
68
+ /**
69
+ * Check if remote control should be enabled (via EFFECT_TUI_REMOTE=1 env var)
70
+ */
71
+ export function shouldEnableRemote() {
72
+ return process.env.EFFECT_TUI_REMOTE === "1";
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/remote/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CellBuffer, Palette } from "@effect-tui/core";
2
+ import type { HostInstance } from "../../reconciler/types.js";
3
+ export interface FrameTimings {
4
+ clear: number;
5
+ layout: number;
6
+ render: number;
7
+ }
8
+ /**
9
+ * Handles the measure → layout → render pipeline for a single frame.
10
+ */
11
+ export declare class FrameBuilder {
12
+ /**
13
+ * Execute the frame pipeline: clear buffer, measure, layout, and render.
14
+ * Returns timing information for each phase.
15
+ */
16
+ build(root: HostInstance, buffer: CellBuffer, palette: Palette, width: number, height: number): FrameTimings;
17
+ }
18
+ //# sourceMappingURL=FrameBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../../src/renderer/core/FrameBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAG7D,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;CA6B5G"}
@@ -0,0 +1,38 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import * as Prof from "../../profiler.js";
3
+ /**
4
+ * Handles the measure → layout → render pipeline for a single frame.
5
+ */
6
+ export class FrameBuilder {
7
+ /**
8
+ * Execute the frame pipeline: clear buffer, measure, layout, and render.
9
+ * Returns timing information for each phase.
10
+ */
11
+ build(root, buffer, palette, width, height) {
12
+ // Clear buffer
13
+ let t = Prof.startPhase();
14
+ const clearStart = performance.now();
15
+ buffer.clear(0);
16
+ const clearMs = performance.now() - clearStart;
17
+ Prof.endPhase("clear", t);
18
+ // Layout (measure + position)
19
+ t = Prof.startPhase();
20
+ const layoutStart = performance.now();
21
+ root.measure(width, height);
22
+ root.layout({ x: 0, y: 0, w: width, h: height });
23
+ const layoutMs = performance.now() - layoutStart;
24
+ Prof.endPhase("layout", t);
25
+ // Render
26
+ t = Prof.startPhase();
27
+ const renderStart = performance.now();
28
+ root.render(buffer, palette);
29
+ const renderMs = performance.now() - renderStart;
30
+ Prof.endPhase("render", t);
31
+ return {
32
+ clear: clearMs,
33
+ layout: layoutMs,
34
+ render: renderMs,
35
+ };
36
+ }
37
+ }
38
+ //# sourceMappingURL=FrameBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../../src/renderer/core/FrameBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AAQzC;;GAEG;AACH,MAAM,OAAO,YAAY;IACxB;;;OAGG;IACH,KAAK,CAAC,IAAkB,EAAE,MAAkB,EAAE,OAAgB,EAAE,KAAa,EAAE,MAAc;QAC5F,eAAe;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAA;QAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAEzB,8BAA8B;QAC9B,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACrB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE1B,SAAS;QACT,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACrB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE1B,OAAO;YACN,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SAChB,CAAA;IACF,CAAC;CACD"}
@@ -0,0 +1,41 @@
1
+ import { CellBuffer, Palette } from "@effect-tui/core";
2
+ /**
3
+ * Mutable state for the renderer.
4
+ * Centralized to make state management explicit and easier to track.
5
+ */
6
+ export declare class RendererState {
7
+ width: number;
8
+ height: number;
9
+ lastWidth: number;
10
+ dirty: boolean;
11
+ running: boolean;
12
+ prevBuffer: CellBuffer | null;
13
+ nextBuffer: CellBuffer | null;
14
+ readonly palette: Palette;
15
+ loop: ReturnType<typeof setInterval> | null;
16
+ inputHandler: ((data: Buffer) => void) | null;
17
+ resizeHandler: (() => void) | null;
18
+ constructor(width: number, height: number);
19
+ /**
20
+ * Ensure buffers exist and are correctly sized.
21
+ * Call this at the start of each frame.
22
+ */
23
+ ensureBuffers(width: number, height: number): void;
24
+ /**
25
+ * Swap prev and next buffers after rendering.
26
+ */
27
+ swapBuffers(): void;
28
+ /**
29
+ * Invalidate buffers (e.g., on resize).
30
+ */
31
+ invalidateBuffers(): void;
32
+ /**
33
+ * Mark as needing render.
34
+ */
35
+ markDirty(): void;
36
+ /**
37
+ * Update dimensions.
38
+ */
39
+ updateDimensions(width: number, height: number): void;
40
+ }
41
+ //# sourceMappingURL=RendererState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendererState.d.ts","sourceRoot":"","sources":["../../../../src/renderer/core/RendererState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;;GAGG;AACH,qBAAa,aAAa;IAEzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IAGjB,KAAK,UAAO;IACZ,OAAO,UAAO;IAGd,UAAU,EAAE,UAAU,GAAG,IAAI,CAAO;IACpC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAO;IACpC,QAAQ,CAAC,OAAO,UAAgB;IAGhC,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAO;IAGlD,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAO;IACpD,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAO;gBAE7B,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASlD;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAKrD"}
@@ -0,0 +1,70 @@
1
+ import { CellBuffer, Palette } from "@effect-tui/core";
2
+ /**
3
+ * Mutable state for the renderer.
4
+ * Centralized to make state management explicit and easier to track.
5
+ */
6
+ export class RendererState {
7
+ // Dimensions
8
+ width;
9
+ height;
10
+ lastWidth;
11
+ // Rendering flags
12
+ dirty = true;
13
+ running = true;
14
+ // Buffers (double-buffered for diffing)
15
+ prevBuffer = null;
16
+ nextBuffer = null;
17
+ palette = new Palette();
18
+ // Loop handle
19
+ loop = null;
20
+ // Event handler references for cleanup
21
+ inputHandler = null;
22
+ resizeHandler = null;
23
+ constructor(width, height) {
24
+ this.width = width;
25
+ this.height = height;
26
+ this.lastWidth = width;
27
+ }
28
+ /**
29
+ * Ensure buffers exist and are correctly sized.
30
+ * Call this at the start of each frame.
31
+ */
32
+ ensureBuffers(width, height) {
33
+ if (!this.prevBuffer || !this.nextBuffer || this.prevBuffer.w !== width || this.prevBuffer.h !== height) {
34
+ this.prevBuffer = new CellBuffer(width, height);
35
+ this.nextBuffer = new CellBuffer(width, height);
36
+ this.prevBuffer.clear(0);
37
+ this.nextBuffer.clear(0);
38
+ }
39
+ }
40
+ /**
41
+ * Swap prev and next buffers after rendering.
42
+ */
43
+ swapBuffers() {
44
+ const tmp = this.prevBuffer;
45
+ this.prevBuffer = this.nextBuffer;
46
+ this.nextBuffer = tmp;
47
+ }
48
+ /**
49
+ * Invalidate buffers (e.g., on resize).
50
+ */
51
+ invalidateBuffers() {
52
+ this.prevBuffer = null;
53
+ this.nextBuffer = null;
54
+ }
55
+ /**
56
+ * Mark as needing render.
57
+ */
58
+ markDirty() {
59
+ this.dirty = true;
60
+ }
61
+ /**
62
+ * Update dimensions.
63
+ */
64
+ updateDimensions(width, height) {
65
+ this.width = width;
66
+ this.height = height;
67
+ this.lastWidth = width;
68
+ }
69
+ }
70
+ //# sourceMappingURL=RendererState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendererState.js","sourceRoot":"","sources":["../../../../src/renderer/core/RendererState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACzB,aAAa;IACb,KAAK,CAAQ;IACb,MAAM,CAAQ;IACd,SAAS,CAAQ;IAEjB,kBAAkB;IAClB,KAAK,GAAG,IAAI,CAAA;IACZ,OAAO,GAAG,IAAI,CAAA;IAEd,wCAAwC;IACxC,UAAU,GAAsB,IAAI,CAAA;IACpC,UAAU,GAAsB,IAAI,CAAA;IAC3B,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAEhC,cAAc;IACd,IAAI,GAA0C,IAAI,CAAA;IAElD,uCAAuC;IACvC,YAAY,GAAoC,IAAI,CAAA;IACpD,aAAa,GAAwB,IAAI,CAAA;IAEzC,YAAY,KAAa,EAAE,MAAc;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACvB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,KAAa,EAAE,MAAc;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACzG,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACxB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACzB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,WAAW;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACjC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,iBAAiB;QAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,SAAS;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa,EAAE,MAAc;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACvB,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ export { FrameBuilder, type FrameTimings } from "./FrameBuilder.js";
2
+ export { RendererState } from "./RendererState.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/renderer/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { FrameBuilder } from "./FrameBuilder.js";
2
+ export { RendererState } from "./RendererState.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/renderer/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { type KeyMsg, type MouseMsg } from "@effect-tui/core";
2
+ export interface InputProcessorConfig {
3
+ exitOnCtrlC: boolean;
4
+ dispatchKey: (key: KeyMsg) => boolean;
5
+ dispatchMouse: (mouse: MouseMsg) => void;
6
+ dispatchPaste: (text: string) => void;
7
+ flushSync: <T>(fn: () => T) => T;
8
+ onInputProcessed: () => void;
9
+ }
10
+ /**
11
+ * Processes raw terminal input, handling keyboard, mouse, and bracketed paste.
12
+ */
13
+ export declare class InputProcessor {
14
+ private config;
15
+ private pasteActive;
16
+ private pasteBuffer;
17
+ constructor(config: InputProcessorConfig);
18
+ /**
19
+ * Process incoming data from stdin.
20
+ * Handles bracketed paste detection, key/mouse event decoding, and dispatch.
21
+ */
22
+ process(data: Buffer): void;
23
+ private emitInput;
24
+ }
25
+ //# sourceMappingURL=InputProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputProcessor.d.ts","sourceRoot":"","sources":["../../../../src/renderer/input/InputProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAA;CAC5B;AAED;;GAEG;AACH,qBAAa,cAAc;IAId,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAK;gBAEJ,MAAM,EAAE,oBAAoB;IAEhD;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAuC3B,OAAO,CAAC,SAAS;CA8BjB"}
@@ -0,0 +1,81 @@
1
+ import { decodeInput, ANSI } from "@effect-tui/core";
2
+ /**
3
+ * Processes raw terminal input, handling keyboard, mouse, and bracketed paste.
4
+ */
5
+ export class InputProcessor {
6
+ config;
7
+ pasteActive = false;
8
+ pasteBuffer = "";
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ /**
13
+ * Process incoming data from stdin.
14
+ * Handles bracketed paste detection, key/mouse event decoding, and dispatch.
15
+ */
16
+ process(data) {
17
+ let chunk = data.toString("utf8");
18
+ while (chunk.length > 0) {
19
+ if (this.pasteActive) {
20
+ const endIdx = chunk.indexOf(ANSI.paste.endMarker);
21
+ if (endIdx >= 0) {
22
+ this.pasteBuffer += chunk.slice(0, endIdx);
23
+ this.config.dispatchPaste(this.pasteBuffer);
24
+ this.pasteBuffer = "";
25
+ this.pasteActive = false;
26
+ chunk = chunk.slice(endIdx + ANSI.paste.endMarker.length);
27
+ continue;
28
+ }
29
+ else {
30
+ this.pasteBuffer += chunk;
31
+ chunk = "";
32
+ break;
33
+ }
34
+ }
35
+ const startIdx = chunk.indexOf(ANSI.paste.startMarker);
36
+ if (startIdx >= 0) {
37
+ // Emit any input before the paste start
38
+ this.emitInput(chunk.slice(0, startIdx));
39
+ this.pasteActive = true;
40
+ this.pasteBuffer = "";
41
+ chunk = chunk.slice(startIdx + ANSI.paste.startMarker.length);
42
+ continue;
43
+ }
44
+ // No paste markers; treat as normal input
45
+ this.emitInput(chunk);
46
+ chunk = "";
47
+ }
48
+ // Notify that input processing is complete
49
+ this.config.onInputProcessed();
50
+ }
51
+ emitInput(str) {
52
+ if (!str)
53
+ return;
54
+ const events = decodeInput(Buffer.from(str, "utf8"));
55
+ for (const event of events) {
56
+ if (event.type === "mouse") {
57
+ this.config.flushSync(() => {
58
+ this.config.dispatchMouse(event);
59
+ });
60
+ }
61
+ else {
62
+ const wrapped = {
63
+ ...event,
64
+ defaultPrevented: false,
65
+ preventDefault() {
66
+ wrapped.defaultPrevented = true;
67
+ },
68
+ };
69
+ this.config.flushSync(() => {
70
+ this.config.dispatchKey(wrapped);
71
+ });
72
+ // Default Ctrl+C handling - exit unless user called preventDefault()
73
+ // Only match Ctrl+C (not Ctrl+Shift+C which should be available for copy)
74
+ if (this.config.exitOnCtrlC && !wrapped.defaultPrevented && event.ctrl && !event.shift && event.text === "c") {
75
+ process.exit(0);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=InputProcessor.js.map