nastech-tui 0.0.1

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 (424) hide show
  1. package/.prettierrc +11 -0
  2. package/README.md +346 -0
  3. package/eslint.config.mjs +111 -0
  4. package/package.json +51 -0
  5. package/packages/nastech-ink/ambient.d.ts +83 -0
  6. package/packages/nastech-ink/index.d.ts +40 -0
  7. package/packages/nastech-ink/index.js +1 -0
  8. package/packages/nastech-ink/nastech-ink/ambient.d.ts +83 -0
  9. package/packages/nastech-ink/nastech-ink/index.d.ts +40 -0
  10. package/packages/nastech-ink/nastech-ink/index.js +1 -0
  11. package/packages/nastech-ink/nastech-ink/package.json +54 -0
  12. package/packages/nastech-ink/nastech-ink/src/bootstrap/state.ts +9 -0
  13. package/packages/nastech-ink/nastech-ink/src/entry-exports.ts +32 -0
  14. package/packages/nastech-ink/nastech-ink/src/hooks/use-stderr.ts +15 -0
  15. package/packages/nastech-ink/nastech-ink/src/hooks/use-stdout.ts +15 -0
  16. package/packages/nastech-ink/nastech-ink/src/ink/Ansi.tsx +435 -0
  17. package/packages/nastech-ink/nastech-ink/src/ink/app-mouse.test.ts +123 -0
  18. package/packages/nastech-ink/nastech-ink/src/ink/bidi.ts +145 -0
  19. package/packages/nastech-ink/nastech-ink/src/ink/cache-eviction.ts +45 -0
  20. package/packages/nastech-ink/nastech-ink/src/ink/clearTerminal.ts +68 -0
  21. package/packages/nastech-ink/nastech-ink/src/ink/colorize.test.ts +60 -0
  22. package/packages/nastech-ink/nastech-ink/src/ink/colorize.ts +277 -0
  23. package/packages/nastech-ink/nastech-ink/src/ink/components/AlternateScreen.tsx +133 -0
  24. package/packages/nastech-ink/nastech-ink/src/ink/components/App.tsx +830 -0
  25. package/packages/nastech-ink/nastech-ink/src/ink/components/AppContext.ts +20 -0
  26. package/packages/nastech-ink/nastech-ink/src/ink/components/Box.tsx +294 -0
  27. package/packages/nastech-ink/nastech-ink/src/ink/components/Button.tsx +236 -0
  28. package/packages/nastech-ink/nastech-ink/src/ink/components/ClockContext.tsx +133 -0
  29. package/packages/nastech-ink/nastech-ink/src/ink/components/CursorAdvanceContext.ts +35 -0
  30. package/packages/nastech-ink/nastech-ink/src/ink/components/CursorDeclarationContext.ts +28 -0
  31. package/packages/nastech-ink/nastech-ink/src/ink/components/ErrorOverview.tsx +130 -0
  32. package/packages/nastech-ink/nastech-ink/src/ink/components/Link.tsx +38 -0
  33. package/packages/nastech-ink/nastech-ink/src/ink/components/Newline.tsx +43 -0
  34. package/packages/nastech-ink/nastech-ink/src/ink/components/NoSelect.tsx +73 -0
  35. package/packages/nastech-ink/nastech-ink/src/ink/components/RawAnsi.tsx +61 -0
  36. package/packages/nastech-ink/nastech-ink/src/ink/components/ScrollBox.tsx +290 -0
  37. package/packages/nastech-ink/nastech-ink/src/ink/components/Spacer.tsx +23 -0
  38. package/packages/nastech-ink/nastech-ink/src/ink/components/StdinContext.ts +25 -0
  39. package/packages/nastech-ink/nastech-ink/src/ink/components/TerminalFocusContext.tsx +63 -0
  40. package/packages/nastech-ink/nastech-ink/src/ink/components/TerminalSizeContext.tsx +7 -0
  41. package/packages/nastech-ink/nastech-ink/src/ink/components/Text.test.ts +38 -0
  42. package/packages/nastech-ink/nastech-ink/src/ink/components/Text.tsx +336 -0
  43. package/packages/nastech-ink/nastech-ink/src/ink/constants.ts +6 -0
  44. package/packages/nastech-ink/nastech-ink/src/ink/cursor.ts +5 -0
  45. package/packages/nastech-ink/nastech-ink/src/ink/devtools.ts +2 -0
  46. package/packages/nastech-ink/nastech-ink/src/ink/dom.ts +495 -0
  47. package/packages/nastech-ink/nastech-ink/src/ink/events/click-event.ts +38 -0
  48. package/packages/nastech-ink/nastech-ink/src/ink/events/cmd-shortcuts.test.ts +65 -0
  49. package/packages/nastech-ink/nastech-ink/src/ink/events/dispatcher.ts +242 -0
  50. package/packages/nastech-ink/nastech-ink/src/ink/events/emitter.ts +40 -0
  51. package/packages/nastech-ink/nastech-ink/src/ink/events/event-handlers.ts +84 -0
  52. package/packages/nastech-ink/nastech-ink/src/ink/events/event.ts +11 -0
  53. package/packages/nastech-ink/nastech-ink/src/ink/events/focus-event.ts +18 -0
  54. package/packages/nastech-ink/nastech-ink/src/ink/events/input-event.ts +176 -0
  55. package/packages/nastech-ink/nastech-ink/src/ink/events/keyboard-event.ts +57 -0
  56. package/packages/nastech-ink/nastech-ink/src/ink/events/mouse-event.ts +18 -0
  57. package/packages/nastech-ink/nastech-ink/src/ink/events/paste-event.ts +10 -0
  58. package/packages/nastech-ink/nastech-ink/src/ink/events/resize-event.ts +12 -0
  59. package/packages/nastech-ink/nastech-ink/src/ink/events/terminal-event.ts +107 -0
  60. package/packages/nastech-ink/nastech-ink/src/ink/events/terminal-focus-event.ts +19 -0
  61. package/packages/nastech-ink/nastech-ink/src/ink/focus.ts +219 -0
  62. package/packages/nastech-ink/nastech-ink/src/ink/frame.ts +124 -0
  63. package/packages/nastech-ink/nastech-ink/src/ink/get-max-width.ts +27 -0
  64. package/packages/nastech-ink/nastech-ink/src/ink/global.d.ts +1 -0
  65. package/packages/nastech-ink/nastech-ink/src/ink/hit-test.test.ts +38 -0
  66. package/packages/nastech-ink/nastech-ink/src/ink/hit-test.ts +224 -0
  67. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-animation-frame.ts +62 -0
  68. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-app.ts +9 -0
  69. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-cursor-advance.ts +33 -0
  70. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-declared-cursor.ts +75 -0
  71. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-external-process.ts +27 -0
  72. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-input.ts +95 -0
  73. package/packages/nastech-ink/nastech-ink/src/ink/hooks/use-interval.ts +71 -0
  74. package/packages/nastech-ink/package.json +57 -0
  75. package/packages/nastech-ink/src/bootstrap/state.ts +9 -0
  76. package/packages/nastech-ink/src/entry-exports.ts +32 -0
  77. package/packages/nastech-ink/src/hooks/use-stderr.ts +15 -0
  78. package/packages/nastech-ink/src/hooks/use-stdout.ts +15 -0
  79. package/packages/nastech-ink/src/ink/Ansi.tsx +435 -0
  80. package/packages/nastech-ink/src/ink/app-mouse.test.ts +123 -0
  81. package/packages/nastech-ink/src/ink/app-rawmode-mouse.test.ts +91 -0
  82. package/packages/nastech-ink/src/ink/bidi.ts +145 -0
  83. package/packages/nastech-ink/src/ink/cache-eviction.ts +45 -0
  84. package/packages/nastech-ink/src/ink/clearTerminal.ts +68 -0
  85. package/packages/nastech-ink/src/ink/colorize.test.ts +60 -0
  86. package/packages/nastech-ink/src/ink/colorize.ts +277 -0
  87. package/packages/nastech-ink/src/ink/components/AlternateScreen.tsx +133 -0
  88. package/packages/nastech-ink/src/ink/components/App.tsx +855 -0
  89. package/packages/nastech-ink/src/ink/components/AppContext.ts +20 -0
  90. package/packages/nastech-ink/src/ink/components/Box.tsx +294 -0
  91. package/packages/nastech-ink/src/ink/components/Button.tsx +236 -0
  92. package/packages/nastech-ink/src/ink/components/ClockContext.tsx +133 -0
  93. package/packages/nastech-ink/src/ink/components/CursorAdvanceContext.ts +35 -0
  94. package/packages/nastech-ink/src/ink/components/CursorDeclarationContext.ts +28 -0
  95. package/packages/nastech-ink/src/ink/components/ErrorOverview.tsx +130 -0
  96. package/packages/nastech-ink/src/ink/components/Link.tsx +38 -0
  97. package/packages/nastech-ink/src/ink/components/Newline.tsx +43 -0
  98. package/packages/nastech-ink/src/ink/components/NoSelect.tsx +73 -0
  99. package/packages/nastech-ink/src/ink/components/RawAnsi.tsx +61 -0
  100. package/packages/nastech-ink/src/ink/components/ScrollBox.tsx +290 -0
  101. package/packages/nastech-ink/src/ink/components/Spacer.tsx +23 -0
  102. package/packages/nastech-ink/src/ink/components/StdinContext.ts +25 -0
  103. package/packages/nastech-ink/src/ink/components/TerminalFocusContext.tsx +63 -0
  104. package/packages/nastech-ink/src/ink/components/TerminalSizeContext.tsx +7 -0
  105. package/packages/nastech-ink/src/ink/components/Text.test.ts +38 -0
  106. package/packages/nastech-ink/src/ink/components/Text.tsx +336 -0
  107. package/packages/nastech-ink/src/ink/constants.ts +6 -0
  108. package/packages/nastech-ink/src/ink/cursor.ts +5 -0
  109. package/packages/nastech-ink/src/ink/devtools.ts +2 -0
  110. package/packages/nastech-ink/src/ink/dom.ts +495 -0
  111. package/packages/nastech-ink/src/ink/events/click-event.ts +38 -0
  112. package/packages/nastech-ink/src/ink/events/cmd-shortcuts.test.ts +65 -0
  113. package/packages/nastech-ink/src/ink/events/dispatcher.ts +242 -0
  114. package/packages/nastech-ink/src/ink/events/emitter.ts +40 -0
  115. package/packages/nastech-ink/src/ink/events/event-handlers.ts +84 -0
  116. package/packages/nastech-ink/src/ink/events/event.ts +11 -0
  117. package/packages/nastech-ink/src/ink/events/focus-event.ts +18 -0
  118. package/packages/nastech-ink/src/ink/events/input-event.ts +176 -0
  119. package/packages/nastech-ink/src/ink/events/keyboard-event.ts +57 -0
  120. package/packages/nastech-ink/src/ink/events/mouse-event.ts +18 -0
  121. package/packages/nastech-ink/src/ink/events/paste-event.ts +10 -0
  122. package/packages/nastech-ink/src/ink/events/resize-event.ts +12 -0
  123. package/packages/nastech-ink/src/ink/events/terminal-event.ts +107 -0
  124. package/packages/nastech-ink/src/ink/events/terminal-focus-event.ts +19 -0
  125. package/packages/nastech-ink/src/ink/focus.ts +219 -0
  126. package/packages/nastech-ink/src/ink/frame.ts +124 -0
  127. package/packages/nastech-ink/src/ink/get-max-width.ts +27 -0
  128. package/packages/nastech-ink/src/ink/global.d.ts +1 -0
  129. package/packages/nastech-ink/src/ink/hit-test.test.ts +38 -0
  130. package/packages/nastech-ink/src/ink/hit-test.ts +224 -0
  131. package/packages/nastech-ink/src/ink/hooks/use-animation-frame.ts +62 -0
  132. package/packages/nastech-ink/src/ink/hooks/use-app.ts +9 -0
  133. package/packages/nastech-ink/src/ink/hooks/use-cursor-advance.ts +33 -0
  134. package/packages/nastech-ink/src/ink/hooks/use-declared-cursor.ts +75 -0
  135. package/packages/nastech-ink/src/ink/hooks/use-external-process.ts +27 -0
  136. package/packages/nastech-ink/src/ink/hooks/use-input.ts +95 -0
  137. package/packages/nastech-ink/src/ink/hooks/use-interval.ts +71 -0
  138. package/packages/nastech-ink/src/ink/hooks/use-search-highlight.ts +56 -0
  139. package/packages/nastech-ink/src/ink/hooks/use-selection.ts +101 -0
  140. package/packages/nastech-ink/src/ink/hooks/use-stdin.ts +9 -0
  141. package/packages/nastech-ink/src/ink/hooks/use-tab-status.ts +71 -0
  142. package/packages/nastech-ink/src/ink/hooks/use-terminal-focus.ts +18 -0
  143. package/packages/nastech-ink/src/ink/hooks/use-terminal-title.ts +34 -0
  144. package/packages/nastech-ink/src/ink/hooks/use-terminal-viewport.ts +100 -0
  145. package/packages/nastech-ink/src/ink/hyperlinkHover.ts +52 -0
  146. package/packages/nastech-ink/src/ink/ink-cursor-advance.test.ts +234 -0
  147. package/packages/nastech-ink/src/ink/ink-resize.test.ts +50 -0
  148. package/packages/nastech-ink/src/ink/ink.tsx +2705 -0
  149. package/packages/nastech-ink/src/ink/instances.ts +10 -0
  150. package/packages/nastech-ink/src/ink/layout/engine.ts +6 -0
  151. package/packages/nastech-ink/src/ink/layout/geometry.ts +98 -0
  152. package/packages/nastech-ink/src/ink/layout/node.ts +145 -0
  153. package/packages/nastech-ink/src/ink/layout/yoga.ts +313 -0
  154. package/packages/nastech-ink/src/ink/line-width-cache.ts +38 -0
  155. package/packages/nastech-ink/src/ink/log-update.test.ts +223 -0
  156. package/packages/nastech-ink/src/ink/log-update.ts +752 -0
  157. package/packages/nastech-ink/src/ink/lru.ts +14 -0
  158. package/packages/nastech-ink/src/ink/measure-element.ts +23 -0
  159. package/packages/nastech-ink/src/ink/measure-text.ts +50 -0
  160. package/packages/nastech-ink/src/ink/node-cache.ts +53 -0
  161. package/packages/nastech-ink/src/ink/optimizer.ts +99 -0
  162. package/packages/nastech-ink/src/ink/output.ts +845 -0
  163. package/packages/nastech-ink/src/ink/parse-keypress.test.ts +133 -0
  164. package/packages/nastech-ink/src/ink/parse-keypress.ts +848 -0
  165. package/packages/nastech-ink/src/ink/reconciler.ts +382 -0
  166. package/packages/nastech-ink/src/ink/render-border.ts +206 -0
  167. package/packages/nastech-ink/src/ink/render-node-to-output.ts +1582 -0
  168. package/packages/nastech-ink/src/ink/render-to-screen.ts +236 -0
  169. package/packages/nastech-ink/src/ink/renderer.ts +169 -0
  170. package/packages/nastech-ink/src/ink/root.ts +204 -0
  171. package/packages/nastech-ink/src/ink/screen.ts +1590 -0
  172. package/packages/nastech-ink/src/ink/searchHighlight.ts +91 -0
  173. package/packages/nastech-ink/src/ink/selection.test.ts +82 -0
  174. package/packages/nastech-ink/src/ink/selection.ts +1143 -0
  175. package/packages/nastech-ink/src/ink/squash-text-nodes.ts +74 -0
  176. package/packages/nastech-ink/src/ink/stringWidth.ts +341 -0
  177. package/packages/nastech-ink/src/ink/styles.ts +750 -0
  178. package/packages/nastech-ink/src/ink/supports-hyperlinks.ts +51 -0
  179. package/packages/nastech-ink/src/ink/tabstops.ts +44 -0
  180. package/packages/nastech-ink/src/ink/terminal-focus-state.ts +52 -0
  181. package/packages/nastech-ink/src/ink/terminal-querier.ts +222 -0
  182. package/packages/nastech-ink/src/ink/terminal.test.ts +15 -0
  183. package/packages/nastech-ink/src/ink/terminal.ts +299 -0
  184. package/packages/nastech-ink/src/ink/termio/ansi.ts +75 -0
  185. package/packages/nastech-ink/src/ink/termio/csi.ts +334 -0
  186. package/packages/nastech-ink/src/ink/termio/dec.ts +99 -0
  187. package/packages/nastech-ink/src/ink/termio/esc.ts +69 -0
  188. package/packages/nastech-ink/src/ink/termio/osc.test.ts +191 -0
  189. package/packages/nastech-ink/src/ink/termio/osc.ts +724 -0
  190. package/packages/nastech-ink/src/ink/termio/parser.ts +467 -0
  191. package/packages/nastech-ink/src/ink/termio/sgr.ts +362 -0
  192. package/packages/nastech-ink/src/ink/termio/tokenize.test.ts +185 -0
  193. package/packages/nastech-ink/src/ink/termio/tokenize.ts +350 -0
  194. package/packages/nastech-ink/src/ink/termio/types.ts +230 -0
  195. package/packages/nastech-ink/src/ink/termio.ts +42 -0
  196. package/packages/nastech-ink/src/ink/useTerminalNotification.ts +110 -0
  197. package/packages/nastech-ink/src/ink/warn.ts +15 -0
  198. package/packages/nastech-ink/src/ink/widest-line.ts +22 -0
  199. package/packages/nastech-ink/src/ink/wrap-text.test.ts +17 -0
  200. package/packages/nastech-ink/src/ink/wrap-text.ts +144 -0
  201. package/packages/nastech-ink/src/ink/wrapAnsi.ts +13 -0
  202. package/packages/nastech-ink/src/native-ts/yoga-layout/enums.ts +112 -0
  203. package/packages/nastech-ink/src/native-ts/yoga-layout/index.ts +2326 -0
  204. package/packages/nastech-ink/src/utils/debug.ts +6 -0
  205. package/packages/nastech-ink/src/utils/earlyInput.ts +131 -0
  206. package/packages/nastech-ink/src/utils/env.ts +66 -0
  207. package/packages/nastech-ink/src/utils/envUtils.ts +13 -0
  208. package/packages/nastech-ink/src/utils/execFileNoThrow.test.ts +146 -0
  209. package/packages/nastech-ink/src/utils/execFileNoThrow.ts +115 -0
  210. package/packages/nastech-ink/src/utils/fullscreen.ts +3 -0
  211. package/packages/nastech-ink/src/utils/intl.ts +87 -0
  212. package/packages/nastech-ink/src/utils/log.ts +7 -0
  213. package/packages/nastech-ink/src/utils/semver.ts +57 -0
  214. package/packages/nastech-ink/src/utils/sliceAnsi.ts +106 -0
  215. package/packages/nastech-ink/text-input.d.ts +2 -0
  216. package/packages/nastech-ink/text-input.js +1 -0
  217. package/scripts/build.mjs +61 -0
  218. package/scripts/profile-tui.mjs +121 -0
  219. package/src/__tests__/activeSessionSwitcher.test.ts +157 -0
  220. package/src/__tests__/appChromeStatusRule.test.tsx +84 -0
  221. package/src/__tests__/appChromeStatusRuleDevCredits.test.tsx +73 -0
  222. package/src/__tests__/approvalAction.test.ts +50 -0
  223. package/src/__tests__/asCommandDispatch.test.ts +27 -0
  224. package/src/__tests__/blockLayout.test.ts +122 -0
  225. package/src/__tests__/clipboard.test.ts +369 -0
  226. package/src/__tests__/constants.test.ts +53 -0
  227. package/src/__tests__/createGatewayEventHandler.test.ts +1091 -0
  228. package/src/__tests__/createSlashHandler.test.ts +822 -0
  229. package/src/__tests__/creditsCommand.test.ts +144 -0
  230. package/src/__tests__/cursorDriftRegression.test.ts +114 -0
  231. package/src/__tests__/details.test.ts +115 -0
  232. package/src/__tests__/emoji.test.ts +64 -0
  233. package/src/__tests__/externalLink.test.ts +144 -0
  234. package/src/__tests__/forceTruecolor.test.ts +191 -0
  235. package/src/__tests__/gatewayClient.test.ts +394 -0
  236. package/src/__tests__/gatewayRecovery.test.ts +47 -0
  237. package/src/__tests__/markdown.test.ts +331 -0
  238. package/src/__tests__/mathUnicode.test.ts +293 -0
  239. package/src/__tests__/memoryMonitor.test.ts +102 -0
  240. package/src/__tests__/messageLine.test.ts +19 -0
  241. package/src/__tests__/messages.test.ts +92 -0
  242. package/src/__tests__/orchestratorPromptSession.test.ts +64 -0
  243. package/src/__tests__/osc52.test.ts +67 -0
  244. package/src/__tests__/parentLog.test.ts +75 -0
  245. package/src/__tests__/paths.test.ts +70 -0
  246. package/src/__tests__/platform.test.ts +556 -0
  247. package/src/__tests__/precisionWheel.test.ts +44 -0
  248. package/src/__tests__/prompt.test.ts +31 -0
  249. package/src/__tests__/providers.test.ts +65 -0
  250. package/src/__tests__/reasoning.test.ts +76 -0
  251. package/src/__tests__/rpc.test.ts +27 -0
  252. package/src/__tests__/scroll.test.ts +99 -0
  253. package/src/__tests__/slashParity.test.ts +123 -0
  254. package/src/__tests__/spawnHistoryStore.test.ts +46 -0
  255. package/src/__tests__/stateIsolation.test.ts +46 -0
  256. package/src/__tests__/statusBarTicker.test.ts +18 -0
  257. package/src/__tests__/statusRule.test.ts +32 -0
  258. package/src/__tests__/streamingMarkdown.test.ts +121 -0
  259. package/src/__tests__/subagentTree.test.ts +407 -0
  260. package/src/__tests__/syntax.test.ts +45 -0
  261. package/src/__tests__/terminalModes.test.ts +39 -0
  262. package/src/__tests__/terminalParity.test.ts +77 -0
  263. package/src/__tests__/terminalSetup.test.ts +386 -0
  264. package/src/__tests__/termux.test.ts +35 -0
  265. package/src/__tests__/termuxComposerLayout.test.ts +40 -0
  266. package/src/__tests__/text.test.ts +233 -0
  267. package/src/__tests__/textInputBurstInput.test.ts +40 -0
  268. package/src/__tests__/textInputCursorSourceOfTruth.test.ts +50 -0
  269. package/src/__tests__/textInputFastEcho.test.ts +200 -0
  270. package/src/__tests__/textInputLineNav.test.ts +55 -0
  271. package/src/__tests__/textInputPassThrough.test.ts +59 -0
  272. package/src/__tests__/textInputRightClick.test.ts +48 -0
  273. package/src/__tests__/textInputWrap.test.ts +151 -0
  274. package/src/__tests__/theme.test.ts +311 -0
  275. package/src/__tests__/turnControllerNotice.test.ts +43 -0
  276. package/src/__tests__/turnStore.test.ts +66 -0
  277. package/src/__tests__/useCompletion.test.ts +35 -0
  278. package/src/__tests__/useComposerState.test.ts +59 -0
  279. package/src/__tests__/useConfigSync.test.ts +460 -0
  280. package/src/__tests__/useInputHandlers.test.ts +77 -0
  281. package/src/__tests__/useQueue.test.ts +28 -0
  282. package/src/__tests__/useSessionLifecycle.test.ts +60 -0
  283. package/src/__tests__/useVirtualHistoryHeights.test.ts +39 -0
  284. package/src/__tests__/viewport.test.ts +58 -0
  285. package/src/__tests__/viewportStore.test.ts +85 -0
  286. package/src/__tests__/virtualHeights.test.ts +96 -0
  287. package/src/__tests__/virtualHistoryClamp.test.ts +19 -0
  288. package/src/__tests__/virtualHistoryOffsetCache.test.ts +282 -0
  289. package/src/__tests__/wheelAccel.test.ts +138 -0
  290. package/src/app/createGatewayEventHandler.ts +833 -0
  291. package/src/app/createSlashHandler.ts +130 -0
  292. package/src/app/delegationStore.ts +77 -0
  293. package/src/app/gatewayContext.tsx +19 -0
  294. package/src/app/gatewayRecovery.ts +35 -0
  295. package/src/app/inputSelectionStore.ts +15 -0
  296. package/src/app/interfaces.ts +394 -0
  297. package/src/app/overlayStore.ts +53 -0
  298. package/src/app/scroll.ts +71 -0
  299. package/src/app/setupHandoff.ts +54 -0
  300. package/src/app/slash/commands/core.ts +648 -0
  301. package/src/app/slash/commands/credits.ts +57 -0
  302. package/src/app/slash/commands/debug.ts +48 -0
  303. package/src/app/slash/commands/ops.ts +717 -0
  304. package/src/app/slash/commands/session.ts +554 -0
  305. package/src/app/slash/commands/setup.ts +20 -0
  306. package/src/app/slash/registry.ts +20 -0
  307. package/src/app/slash/types.ts +21 -0
  308. package/src/app/spawnHistoryStore.ts +159 -0
  309. package/src/app/turnController.ts +866 -0
  310. package/src/app/turnStore.ts +85 -0
  311. package/src/app/uiStore.ts +44 -0
  312. package/src/app/useComposerState.ts +367 -0
  313. package/src/app/useConfigSync.ts +288 -0
  314. package/src/app/useInputHandlers.ts +576 -0
  315. package/src/app/useLongRunToolCharms.ts +69 -0
  316. package/src/app/useMainApp.ts +1039 -0
  317. package/src/app/useSessionLifecycle.ts +366 -0
  318. package/src/app/useSubmission.ts +429 -0
  319. package/src/app.tsx +25 -0
  320. package/src/banner.ts +93 -0
  321. package/src/components/activeSessionSwitcher.tsx +635 -0
  322. package/src/components/agentsOverlay.tsx +1073 -0
  323. package/src/components/appChrome.tsx +554 -0
  324. package/src/components/appLayout.tsx +444 -0
  325. package/src/components/appOverlays.tsx +254 -0
  326. package/src/components/branding.tsx +466 -0
  327. package/src/components/fpsOverlay.tsx +30 -0
  328. package/src/components/helpHint.tsx +73 -0
  329. package/src/components/markdown.tsx +1119 -0
  330. package/src/components/maskedPrompt.tsx +34 -0
  331. package/src/components/messageLine.tsx +237 -0
  332. package/src/components/modelPicker.tsx +527 -0
  333. package/src/components/overlayControls.tsx +50 -0
  334. package/src/components/pluginsHub.tsx +238 -0
  335. package/src/components/prompts.tsx +276 -0
  336. package/src/components/queuedMessages.tsx +64 -0
  337. package/src/components/sessionPicker.tsx +227 -0
  338. package/src/components/skillsHub.tsx +308 -0
  339. package/src/components/streamingAssistant.tsx +110 -0
  340. package/src/components/streamingMarkdown.tsx +174 -0
  341. package/src/components/textInput.tsx +1340 -0
  342. package/src/components/themed.tsx +30 -0
  343. package/src/components/thinking.tsx +1224 -0
  344. package/src/components/todoPanel.tsx +93 -0
  345. package/src/config/env.ts +64 -0
  346. package/src/config/limits.ts +13 -0
  347. package/src/config/timing.ts +6 -0
  348. package/src/content/charms.ts +1 -0
  349. package/src/content/faces.ts +17 -0
  350. package/src/content/fortunes.ts +30 -0
  351. package/src/content/hotkeys.ts +37 -0
  352. package/src/content/placeholders.ts +13 -0
  353. package/src/content/setup.ts +17 -0
  354. package/src/content/verbs.ts +38 -0
  355. package/src/domain/blockLayout.ts +146 -0
  356. package/src/domain/details.ts +76 -0
  357. package/src/domain/messages.ts +91 -0
  358. package/src/domain/paths.ts +16 -0
  359. package/src/domain/providers.ts +11 -0
  360. package/src/domain/roles.ts +9 -0
  361. package/src/domain/slash.ts +10 -0
  362. package/src/domain/usage.ts +3 -0
  363. package/src/domain/viewport.ts +51 -0
  364. package/src/entry.tsx +104 -0
  365. package/src/gatewayClient.ts +730 -0
  366. package/src/gatewayTypes.ts +568 -0
  367. package/src/hooks/useCompletion.ts +112 -0
  368. package/src/hooks/useGitBranch.ts +72 -0
  369. package/src/hooks/useInputHistory.ts +11 -0
  370. package/src/hooks/useQueue.ts +76 -0
  371. package/src/hooks/useVirtualHistory.ts +554 -0
  372. package/src/lib/circularBuffer.ts +48 -0
  373. package/src/lib/clipboard.ts +182 -0
  374. package/src/lib/editor.test.ts +74 -0
  375. package/src/lib/editor.ts +47 -0
  376. package/src/lib/emoji.ts +55 -0
  377. package/src/lib/externalCli.ts +16 -0
  378. package/src/lib/externalLink.ts +435 -0
  379. package/src/lib/forceTruecolor.ts +60 -0
  380. package/src/lib/fpsStore.ts +51 -0
  381. package/src/lib/fuzzy.test.ts +109 -0
  382. package/src/lib/fuzzy.ts +177 -0
  383. package/src/lib/gracefulExit.ts +47 -0
  384. package/src/lib/history.ts +82 -0
  385. package/src/lib/inputMetrics.ts +203 -0
  386. package/src/lib/liveProgress.test.ts +116 -0
  387. package/src/lib/liveProgress.ts +79 -0
  388. package/src/lib/mathUnicode.ts +770 -0
  389. package/src/lib/memory.test.ts +155 -0
  390. package/src/lib/memory.ts +188 -0
  391. package/src/lib/memoryMonitor.ts +109 -0
  392. package/src/lib/messages.test.ts +29 -0
  393. package/src/lib/messages.ts +8 -0
  394. package/src/lib/openExternalUrl.test.ts +217 -0
  395. package/src/lib/openExternalUrl.ts +158 -0
  396. package/src/lib/osc52.ts +73 -0
  397. package/src/lib/parentLog.ts +57 -0
  398. package/src/lib/perfPane.tsx +107 -0
  399. package/src/lib/platform.ts +409 -0
  400. package/src/lib/precisionWheel.ts +48 -0
  401. package/src/lib/prompt.ts +35 -0
  402. package/src/lib/reasoning.ts +55 -0
  403. package/src/lib/rpc.ts +41 -0
  404. package/src/lib/subagentTree.ts +355 -0
  405. package/src/lib/syntax.ts +117 -0
  406. package/src/lib/terminalModes.ts +51 -0
  407. package/src/lib/terminalParity.ts +78 -0
  408. package/src/lib/terminalSetup.ts +444 -0
  409. package/src/lib/termux.ts +29 -0
  410. package/src/lib/text.test.ts +18 -0
  411. package/src/lib/text.ts +339 -0
  412. package/src/lib/todo.test.ts +21 -0
  413. package/src/lib/todo.ts +9 -0
  414. package/src/lib/viewportStore.ts +124 -0
  415. package/src/lib/virtualHeights.ts +145 -0
  416. package/src/lib/wheelAccel.ts +190 -0
  417. package/src/protocol/interpolation.ts +3 -0
  418. package/src/protocol/paste.ts +1 -0
  419. package/src/theme.ts +589 -0
  420. package/src/types/nastech-ink.d.ts +176 -0
  421. package/src/types.ts +212 -0
  422. package/tsconfig.build.json +9 -0
  423. package/tsconfig.json +19 -0
  424. package/vitest.config.ts +7 -0
@@ -0,0 +1,75 @@
1
+ /**
2
+ * ANSI Control Characters and Escape Sequence Introducers
3
+ *
4
+ * Based on ECMA-48 / ANSI X3.64 standards.
5
+ */
6
+
7
+ /**
8
+ * C0 (7-bit) control characters
9
+ */
10
+ export const C0 = {
11
+ NUL: 0x00,
12
+ SOH: 0x01,
13
+ STX: 0x02,
14
+ ETX: 0x03,
15
+ EOT: 0x04,
16
+ ENQ: 0x05,
17
+ ACK: 0x06,
18
+ BEL: 0x07,
19
+ BS: 0x08,
20
+ HT: 0x09,
21
+ LF: 0x0a,
22
+ VT: 0x0b,
23
+ FF: 0x0c,
24
+ CR: 0x0d,
25
+ SO: 0x0e,
26
+ SI: 0x0f,
27
+ DLE: 0x10,
28
+ DC1: 0x11,
29
+ DC2: 0x12,
30
+ DC3: 0x13,
31
+ DC4: 0x14,
32
+ NAK: 0x15,
33
+ SYN: 0x16,
34
+ ETB: 0x17,
35
+ CAN: 0x18,
36
+ EM: 0x19,
37
+ SUB: 0x1a,
38
+ ESC: 0x1b,
39
+ FS: 0x1c,
40
+ GS: 0x1d,
41
+ RS: 0x1e,
42
+ US: 0x1f,
43
+ DEL: 0x7f
44
+ } as const
45
+
46
+ // String constants for output generation
47
+ export const ESC = '\x1b'
48
+ export const BEL = '\x07'
49
+ export const SEP = ';'
50
+
51
+ /**
52
+ * Escape sequence type introducers (byte after ESC)
53
+ */
54
+ export const ESC_TYPE = {
55
+ CSI: 0x5b, // [ - Control Sequence Introducer
56
+ OSC: 0x5d, // ] - Operating System Command
57
+ DCS: 0x50, // P - Device Control String
58
+ APC: 0x5f, // _ - Application Program Command
59
+ PM: 0x5e, // ^ - Privacy Message
60
+ SOS: 0x58, // X - Start of String
61
+ ST: 0x5c // \ - String Terminator
62
+ } as const
63
+
64
+ /** Check if a byte is a C0 control character */
65
+ export function isC0(byte: number): boolean {
66
+ return byte < 0x20 || byte === 0x7f
67
+ }
68
+
69
+ /**
70
+ * Check if a byte is an ESC sequence final byte (0-9, :, ;, <, =, >, ?, @ through ~)
71
+ * ESC sequences have a wider final byte range than CSI
72
+ */
73
+ export function isEscFinal(byte: number): boolean {
74
+ return byte >= 0x30 && byte <= 0x7e
75
+ }
@@ -0,0 +1,334 @@
1
+ /**
2
+ * CSI (Control Sequence Introducer) Types
3
+ *
4
+ * Enums and types for CSI command parameters.
5
+ */
6
+
7
+ import { ESC, ESC_TYPE, SEP } from './ansi.js'
8
+
9
+ export const CSI_PREFIX = ESC + String.fromCharCode(ESC_TYPE.CSI)
10
+
11
+ /**
12
+ * CSI parameter byte ranges
13
+ */
14
+ export const CSI_RANGE = {
15
+ PARAM_START: 0x30,
16
+ PARAM_END: 0x3f,
17
+ INTERMEDIATE_START: 0x20,
18
+ INTERMEDIATE_END: 0x2f,
19
+ FINAL_START: 0x40,
20
+ FINAL_END: 0x7e
21
+ } as const
22
+
23
+ /** Check if a byte is a CSI parameter byte */
24
+ export function isCSIParam(byte: number): boolean {
25
+ return byte >= CSI_RANGE.PARAM_START && byte <= CSI_RANGE.PARAM_END
26
+ }
27
+
28
+ /** Check if a byte is a CSI intermediate byte */
29
+ export function isCSIIntermediate(byte: number): boolean {
30
+ return byte >= CSI_RANGE.INTERMEDIATE_START && byte <= CSI_RANGE.INTERMEDIATE_END
31
+ }
32
+
33
+ /** Check if a byte is a CSI final byte (@ through ~) */
34
+ export function isCSIFinal(byte: number): boolean {
35
+ return byte >= CSI_RANGE.FINAL_START && byte <= CSI_RANGE.FINAL_END
36
+ }
37
+
38
+ /**
39
+ * Generate a CSI sequence: ESC [ p1;p2;...;pN final
40
+ * Single arg: treated as raw body
41
+ * Multiple args: last is final byte, rest are params joined by ;
42
+ */
43
+ export function csi(...args: (string | number)[]): string {
44
+ if (args.length === 0) {
45
+ return CSI_PREFIX
46
+ }
47
+
48
+ if (args.length === 1) {
49
+ return `${CSI_PREFIX}${args[0]}`
50
+ }
51
+
52
+ const params = args.slice(0, -1)
53
+ const final = args[args.length - 1]
54
+
55
+ return `${CSI_PREFIX}${params.join(SEP)}${final}`
56
+ }
57
+
58
+ /**
59
+ * CSI final bytes - the command identifier
60
+ */
61
+ export const CSI = {
62
+ // Cursor movement
63
+ CUU: 0x41, // A - Cursor Up
64
+ CUD: 0x42, // B - Cursor Down
65
+ CUF: 0x43, // C - Cursor Forward
66
+ CUB: 0x44, // D - Cursor Back
67
+ CNL: 0x45, // E - Cursor Next Line
68
+ CPL: 0x46, // F - Cursor Previous Line
69
+ CHA: 0x47, // G - Cursor Horizontal Absolute
70
+ CUP: 0x48, // H - Cursor Position
71
+ CHT: 0x49, // I - Cursor Horizontal Tab
72
+ VPA: 0x64, // d - Vertical Position Absolute
73
+ HVP: 0x66, // f - Horizontal Vertical Position
74
+
75
+ // Erase
76
+ ED: 0x4a, // J - Erase in Display
77
+ EL: 0x4b, // K - Erase in Line
78
+ ECH: 0x58, // X - Erase Character
79
+
80
+ // Insert/Delete
81
+ IL: 0x4c, // L - Insert Lines
82
+ DL: 0x4d, // M - Delete Lines
83
+ ICH: 0x40, // @ - Insert Characters
84
+ DCH: 0x50, // P - Delete Characters
85
+
86
+ // Scroll
87
+ SU: 0x53, // S - Scroll Up
88
+ SD: 0x54, // T - Scroll Down
89
+
90
+ // Modes
91
+ SM: 0x68, // h - Set Mode
92
+ RM: 0x6c, // l - Reset Mode
93
+
94
+ // SGR
95
+ SGR: 0x6d, // m - Select Graphic Rendition
96
+
97
+ // Other
98
+ DSR: 0x6e, // n - Device Status Report
99
+ DECSCUSR: 0x71, // q - Set Cursor Style (with space intermediate)
100
+ DECSTBM: 0x72, // r - Set Top and Bottom Margins
101
+ SCOSC: 0x73, // s - Save Cursor Position
102
+ SCORC: 0x75, // u - Restore Cursor Position
103
+ CBT: 0x5a // Z - Cursor Backward Tabulation
104
+ } as const
105
+
106
+ /**
107
+ * Erase in Display regions (ED command parameter)
108
+ */
109
+ export const ERASE_DISPLAY = ['toEnd', 'toStart', 'all', 'scrollback'] as const
110
+
111
+ /**
112
+ * Erase in Line regions (EL command parameter)
113
+ */
114
+ export const ERASE_LINE_REGION = ['toEnd', 'toStart', 'all'] as const
115
+
116
+ /**
117
+ * Cursor styles (DECSCUSR)
118
+ */
119
+ export type CursorStyle = 'block' | 'underline' | 'bar'
120
+
121
+ export const CURSOR_STYLES: Array<{ style: CursorStyle; blinking: boolean }> = [
122
+ { style: 'block', blinking: true }, // 0 - default
123
+ { style: 'block', blinking: true }, // 1
124
+ { style: 'block', blinking: false }, // 2
125
+ { style: 'underline', blinking: true }, // 3
126
+ { style: 'underline', blinking: false }, // 4
127
+ { style: 'bar', blinking: true }, // 5
128
+ { style: 'bar', blinking: false } // 6
129
+ ]
130
+
131
+ // Cursor movement generators
132
+
133
+ /** Move cursor up n lines (CSI n A) */
134
+ export function cursorUp(n = 1): string {
135
+ return n === 0 ? '' : csi(n, 'A')
136
+ }
137
+
138
+ /** Move cursor down n lines (CSI n B) */
139
+ export function cursorDown(n = 1): string {
140
+ return n === 0 ? '' : csi(n, 'B')
141
+ }
142
+
143
+ /** Move cursor forward n columns (CSI n C) */
144
+ export function cursorForward(n = 1): string {
145
+ return n === 0 ? '' : csi(n, 'C')
146
+ }
147
+
148
+ /** Move cursor back n columns (CSI n D) */
149
+ export function cursorBack(n = 1): string {
150
+ return n === 0 ? '' : csi(n, 'D')
151
+ }
152
+
153
+ /** Move cursor to column n (1-indexed) (CSI n G) */
154
+ export function cursorTo(col: number): string {
155
+ return csi(col, 'G')
156
+ }
157
+
158
+ /** Move cursor to column 1 (CSI G) */
159
+ export const CURSOR_LEFT = csi('G')
160
+
161
+ /** Move cursor to row, col (1-indexed) (CSI row ; col H) */
162
+ export function cursorPosition(row: number, col: number): string {
163
+ return csi(row, col, 'H')
164
+ }
165
+
166
+ /** Move cursor to home position (CSI H) */
167
+ export const CURSOR_HOME = csi('H')
168
+
169
+ /**
170
+ * Move cursor relative to current position
171
+ * Positive x = right, negative x = left
172
+ * Positive y = down, negative y = up
173
+ */
174
+ export function cursorMove(x: number, y: number): string {
175
+ let result = ''
176
+
177
+ // Horizontal first (matches ansi-escapes behavior)
178
+ if (x < 0) {
179
+ result += cursorBack(-x)
180
+ } else if (x > 0) {
181
+ result += cursorForward(x)
182
+ }
183
+
184
+ // Then vertical
185
+ if (y < 0) {
186
+ result += cursorUp(-y)
187
+ } else if (y > 0) {
188
+ result += cursorDown(y)
189
+ }
190
+
191
+ return result
192
+ }
193
+
194
+ // Save/restore cursor position
195
+
196
+ /** Save cursor position (CSI s) */
197
+ export const CURSOR_SAVE = csi('s')
198
+
199
+ /** Restore cursor position (CSI u) */
200
+ export const CURSOR_RESTORE = csi('u')
201
+
202
+ // Erase generators
203
+
204
+ /** Erase from cursor to end of line (CSI K) */
205
+ export function eraseToEndOfLine(): string {
206
+ return csi('K')
207
+ }
208
+
209
+ /** Erase from cursor to start of line (CSI 1 K) */
210
+ export function eraseToStartOfLine(): string {
211
+ return csi(1, 'K')
212
+ }
213
+
214
+ /** Erase entire line (CSI 2 K) */
215
+ export function eraseLine(): string {
216
+ return csi(2, 'K')
217
+ }
218
+
219
+ /** Erase entire line - constant form */
220
+ export const ERASE_LINE = csi(2, 'K')
221
+
222
+ /** Erase from cursor to end of screen (CSI J) */
223
+ export function eraseToEndOfScreen(): string {
224
+ return csi('J')
225
+ }
226
+
227
+ /** Erase from cursor to start of screen (CSI 1 J) */
228
+ export function eraseToStartOfScreen(): string {
229
+ return csi(1, 'J')
230
+ }
231
+
232
+ /** Erase entire screen (CSI 2 J) */
233
+ export function eraseScreen(): string {
234
+ return csi(2, 'J')
235
+ }
236
+
237
+ /** Erase entire screen - constant form */
238
+ export const ERASE_SCREEN = csi(2, 'J')
239
+
240
+ /** Erase scrollback buffer (CSI 3 J) */
241
+ export const ERASE_SCROLLBACK = csi(3, 'J')
242
+
243
+ /**
244
+ * Erase n lines starting from cursor line, moving cursor up
245
+ * This erases each line and moves up, ending at column 1
246
+ */
247
+ export function eraseLines(n: number): string {
248
+ if (n <= 0) {
249
+ return ''
250
+ }
251
+
252
+ let result = ''
253
+
254
+ for (let i = 0; i < n; i++) {
255
+ result += ERASE_LINE
256
+
257
+ if (i < n - 1) {
258
+ result += cursorUp(1)
259
+ }
260
+ }
261
+
262
+ result += CURSOR_LEFT
263
+
264
+ return result
265
+ }
266
+
267
+ // Scroll
268
+
269
+ /** Scroll up n lines (CSI n S) */
270
+ export function scrollUp(n = 1): string {
271
+ return n === 0 ? '' : csi(n, 'S')
272
+ }
273
+
274
+ /** Scroll down n lines (CSI n T) */
275
+ export function scrollDown(n = 1): string {
276
+ return n === 0 ? '' : csi(n, 'T')
277
+ }
278
+
279
+ /** Set scroll region (DECSTBM, CSI top;bottom r). 1-indexed, inclusive. */
280
+ export function setScrollRegion(top: number, bottom: number): string {
281
+ return csi(top, bottom, 'r')
282
+ }
283
+
284
+ /** Reset scroll region to full screen (DECSTBM, CSI r). Homes the cursor. */
285
+ export const RESET_SCROLL_REGION = csi('r')
286
+
287
+ // Bracketed paste markers (input from terminal, not output)
288
+ // These are sent by the terminal to delimit pasted content when
289
+ // bracketed paste mode is enabled (via DEC mode 2004)
290
+
291
+ /** Sent by terminal before pasted content (CSI 200 ~) */
292
+ export const PASTE_START = csi('200~')
293
+
294
+ /** Sent by terminal after pasted content (CSI 201 ~) */
295
+ export const PASTE_END = csi('201~')
296
+
297
+ // Focus event markers (input from terminal, not output)
298
+ // These are sent by the terminal when focus changes while
299
+ // focus events mode is enabled (via DEC mode 1004)
300
+
301
+ /** Sent by terminal when it gains focus (CSI I) */
302
+ export const FOCUS_IN = csi('I')
303
+
304
+ /** Sent by terminal when it loses focus (CSI O) */
305
+ export const FOCUS_OUT = csi('O')
306
+
307
+ // Kitty keyboard protocol (CSI u)
308
+ // Enables enhanced key reporting with modifier information
309
+ // See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/
310
+
311
+ /**
312
+ * Enable Kitty keyboard protocol with basic modifier reporting
313
+ * CSI > 1 u - pushes mode with flags=1 (disambiguate escape codes)
314
+ * This makes Shift+Enter send CSI 13;2 u instead of just CR
315
+ */
316
+ export const ENABLE_KITTY_KEYBOARD = csi('>1u')
317
+
318
+ /**
319
+ * Disable Kitty keyboard protocol
320
+ * CSI < u - pops the keyboard mode stack
321
+ */
322
+ export const DISABLE_KITTY_KEYBOARD = csi('<u')
323
+
324
+ /**
325
+ * Enable xterm modifyOtherKeys level 2.
326
+ * tmux accepts this (not the kitty stack) to enable extended keys — when
327
+ * extended-keys-format is csi-u, tmux then emits keys in kitty format.
328
+ */
329
+ export const ENABLE_MODIFY_OTHER_KEYS = csi('>4;2m')
330
+
331
+ /**
332
+ * Disable xterm modifyOtherKeys (reset to default).
333
+ */
334
+ export const DISABLE_MODIFY_OTHER_KEYS = csi('>4m')
@@ -0,0 +1,99 @@
1
+ /**
2
+ * DEC (Digital Equipment Corporation) Private Mode Sequences
3
+ *
4
+ * DEC private modes use CSI ? N h (set) and CSI ? N l (reset) format.
5
+ * These are terminal-specific extensions to the ANSI standard.
6
+ */
7
+
8
+ import { csi } from './csi.js'
9
+
10
+ /**
11
+ * DEC private mode numbers
12
+ */
13
+ export const DEC = {
14
+ CURSOR_VISIBLE: 25,
15
+ ALT_SCREEN: 47,
16
+ ALT_SCREEN_CLEAR: 1049,
17
+ MOUSE_NORMAL: 1000,
18
+ MOUSE_BUTTON: 1002,
19
+ MOUSE_ANY: 1003,
20
+ MOUSE_SGR: 1006,
21
+ FOCUS_EVENTS: 1004,
22
+ BRACKETED_PASTE: 2004,
23
+ SYNCHRONIZED_UPDATE: 2026
24
+ } as const
25
+
26
+ /** Generate CSI ? N h sequence (set mode) */
27
+ export function decset(mode: number): string {
28
+ return csi(`?${mode}h`)
29
+ }
30
+
31
+ /** Generate CSI ? N l sequence (reset mode) */
32
+ export function decreset(mode: number): string {
33
+ return csi(`?${mode}l`)
34
+ }
35
+
36
+ // Pre-generated sequences for common modes
37
+ export const BSU = decset(DEC.SYNCHRONIZED_UPDATE)
38
+ export const ESU = decreset(DEC.SYNCHRONIZED_UPDATE)
39
+ export const EBP = decset(DEC.BRACKETED_PASTE)
40
+ export const DBP = decreset(DEC.BRACKETED_PASTE)
41
+ export const EFE = decset(DEC.FOCUS_EVENTS)
42
+ export const DFE = decreset(DEC.FOCUS_EVENTS)
43
+ export const SHOW_CURSOR = decset(DEC.CURSOR_VISIBLE)
44
+ export const HIDE_CURSOR = decreset(DEC.CURSOR_VISIBLE)
45
+ export const ENTER_ALT_SCREEN = decset(DEC.ALT_SCREEN_CLEAR)
46
+ export const EXIT_ALT_SCREEN = decreset(DEC.ALT_SCREEN_CLEAR)
47
+ // Mouse tracking: 1000 reports button press/release/wheel, 1002 adds drag
48
+ // events (button-motion), 1003 adds all-motion (no button held — for
49
+ // hover), 1006 uses SGR format (CSI < btn;col;row M/m) instead of legacy
50
+ // X10 bytes.
51
+ //
52
+ // Modes are addressable as a preset so users can opt out of 1003 (hover),
53
+ // which is the noisy one inside tmux — every cursor cross of the prompt
54
+ // row triggers a clipboard probe that surfaces as "No image in clipboard".
55
+ // Presets:
56
+ // - 'off' — no DECSET, terminal/tmux native selection + scroll work
57
+ // - 'wheel' — 1000 + 1006: click + wheel only, no drag, no hover
58
+ // - 'buttons' — 1000 + 1002 + 1006: adds drag (text selection), no hover
59
+ // - 'all' — 1000 + 1002 + 1003 + 1006: legacy behavior, hover-driven
60
+ // UI (scrollbar paginate-on-hover, link mouseenter, etc.)
61
+ export type MouseTrackingMode = 'all' | 'buttons' | 'off' | 'wheel'
62
+
63
+ const MOUSE_NORMAL = decset(DEC.MOUSE_NORMAL)
64
+ const MOUSE_BUTTON = decset(DEC.MOUSE_BUTTON)
65
+ const MOUSE_ANY = decset(DEC.MOUSE_ANY)
66
+ const MOUSE_SGR = decset(DEC.MOUSE_SGR)
67
+
68
+ /** Sequence to enable the requested mouse tracking preset, or '' for 'off'. */
69
+ export function enableMouseTrackingFor(mode: MouseTrackingMode): string {
70
+ switch (mode) {
71
+ case 'all':
72
+ return MOUSE_NORMAL + MOUSE_BUTTON + MOUSE_ANY + MOUSE_SGR
73
+
74
+ case 'buttons':
75
+ return MOUSE_NORMAL + MOUSE_BUTTON + MOUSE_SGR
76
+
77
+ case 'wheel':
78
+ return MOUSE_NORMAL + MOUSE_SGR
79
+
80
+ case 'off':
81
+ return ''
82
+
83
+ default:
84
+ // Defensive fallback: the type system guarantees exhaustiveness, but
85
+ // JS callers / corrupted config / hot-reloads in dev could reach this
86
+ // with an unknown value. Without a default, an unmatched mode returns
87
+ // undefined which then concatenates as the literal string "undefined"
88
+ // into the terminal byte stream — visibly garbling output. Treat
89
+ // unknown as 'off' (no DEC sequences) so the worst case is silent
90
+ // input loss rather than a wrecked screen.
91
+ return ''
92
+ }
93
+ }
94
+
95
+ /** Legacy alias for the maximal preset (1000 + 1002 + 1003 + 1006). */
96
+ export const ENABLE_MOUSE_TRACKING = enableMouseTrackingFor('all')
97
+ /** Reset every mouse mode unconditionally — safe to send when any subset is on. */
98
+ export const DISABLE_MOUSE_TRACKING =
99
+ decreset(DEC.MOUSE_SGR) + decreset(DEC.MOUSE_ANY) + decreset(DEC.MOUSE_BUTTON) + decreset(DEC.MOUSE_NORMAL)
@@ -0,0 +1,69 @@
1
+ /**
2
+ * ESC Sequence Parser
3
+ *
4
+ * Handles simple escape sequences: ESC + one or two characters
5
+ */
6
+
7
+ import type { Action } from './types.js'
8
+
9
+ /**
10
+ * Parse a simple ESC sequence
11
+ *
12
+ * @param chars - Characters after ESC (not including ESC itself)
13
+ */
14
+ export function parseEsc(chars: string): Action | null {
15
+ if (chars.length === 0) {
16
+ return null
17
+ }
18
+
19
+ const first = chars[0]!
20
+
21
+ // Full reset (RIS)
22
+ if (first === 'c') {
23
+ return { type: 'reset' }
24
+ }
25
+
26
+ // Cursor save (DECSC)
27
+ if (first === '7') {
28
+ return { type: 'cursor', action: { type: 'save' } }
29
+ }
30
+
31
+ // Cursor restore (DECRC)
32
+ if (first === '8') {
33
+ return { type: 'cursor', action: { type: 'restore' } }
34
+ }
35
+
36
+ // Index - move cursor down (IND)
37
+ if (first === 'D') {
38
+ return {
39
+ type: 'cursor',
40
+ action: { type: 'move', direction: 'down', count: 1 }
41
+ }
42
+ }
43
+
44
+ // Reverse index - move cursor up (RI)
45
+ if (first === 'M') {
46
+ return {
47
+ type: 'cursor',
48
+ action: { type: 'move', direction: 'up', count: 1 }
49
+ }
50
+ }
51
+
52
+ // Next line (NEL)
53
+ if (first === 'E') {
54
+ return { type: 'cursor', action: { type: 'nextLine', count: 1 } }
55
+ }
56
+
57
+ // Horizontal tab set (HTS)
58
+ if (first === 'H') {
59
+ return null // Tab stop, not commonly needed
60
+ }
61
+
62
+ // Charset selection (ESC ( X, ESC ) X, etc.) - silently ignore
63
+ if ('()'.includes(first) && chars.length >= 2) {
64
+ return null
65
+ }
66
+
67
+ // Unknown
68
+ return { type: 'unknown', sequence: `\x1b${chars}` }
69
+ }