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,74 @@
1
+ import type { DOMElement } from './dom.js'
2
+ import type { TextStyles } from './styles.js'
3
+
4
+ /**
5
+ * A segment of text with its associated styles.
6
+ * Used for structured rendering without ANSI string transforms.
7
+ */
8
+ export type StyledSegment = {
9
+ text: string
10
+ styles: TextStyles
11
+ hyperlink?: string
12
+ }
13
+
14
+ /**
15
+ * Squash text nodes into styled segments, propagating styles down through the tree.
16
+ * This allows structured styling without relying on ANSI string transforms.
17
+ */
18
+ export function squashTextNodesToSegments(
19
+ node: DOMElement,
20
+ inheritedStyles: TextStyles = {},
21
+ inheritedHyperlink?: string,
22
+ out: StyledSegment[] = []
23
+ ): StyledSegment[] {
24
+ const mergedStyles = node.textStyles ? { ...inheritedStyles, ...node.textStyles } : inheritedStyles
25
+
26
+ for (const childNode of node.childNodes) {
27
+ if (childNode === undefined) {
28
+ continue
29
+ }
30
+
31
+ if (childNode.nodeName === '#text') {
32
+ if (childNode.nodeValue.length > 0) {
33
+ out.push({
34
+ text: childNode.nodeValue,
35
+ styles: mergedStyles,
36
+ hyperlink: inheritedHyperlink
37
+ })
38
+ }
39
+ } else if (childNode.nodeName === 'ink-text' || childNode.nodeName === 'ink-virtual-text') {
40
+ squashTextNodesToSegments(childNode, mergedStyles, inheritedHyperlink, out)
41
+ } else if (childNode.nodeName === 'ink-link') {
42
+ const href = childNode.attributes['href'] as string | undefined
43
+ squashTextNodesToSegments(childNode, mergedStyles, href || inheritedHyperlink, out)
44
+ }
45
+ }
46
+
47
+ return out
48
+ }
49
+
50
+ /**
51
+ * Squash text nodes into a plain string (without styles).
52
+ * Used for text measurement in layout calculations.
53
+ */
54
+ function squashTextNodes(node: DOMElement): string {
55
+ let text = ''
56
+
57
+ for (const childNode of node.childNodes) {
58
+ if (childNode === undefined) {
59
+ continue
60
+ }
61
+
62
+ if (childNode.nodeName === '#text') {
63
+ text += childNode.nodeValue
64
+ } else if (childNode.nodeName === 'ink-text' || childNode.nodeName === 'ink-virtual-text') {
65
+ text += squashTextNodes(childNode)
66
+ } else if (childNode.nodeName === 'ink-link') {
67
+ text += squashTextNodes(childNode)
68
+ }
69
+ }
70
+
71
+ return text
72
+ }
73
+
74
+ export default squashTextNodes
@@ -0,0 +1,341 @@
1
+ import emojiRegex from 'emoji-regex'
2
+ import { eastAsianWidth } from 'get-east-asian-width'
3
+ import stripAnsi from 'strip-ansi'
4
+
5
+ import { getGraphemeSegmenter } from '../utils/intl.js'
6
+
7
+ import { lruEvict } from './lru.js'
8
+
9
+ const EMOJI_REGEX = emojiRegex()
10
+
11
+ /**
12
+ * Fallback JavaScript implementation of stringWidth when Bun.stringWidth is not available.
13
+ *
14
+ * Get the display width of a string as it would appear in a terminal.
15
+ *
16
+ * This is a more accurate alternative to the string-width package that correctly handles
17
+ * characters like ⚠ (U+26A0) which string-width incorrectly reports as width 2.
18
+ *
19
+ * The implementation uses eastAsianWidth directly with ambiguousAsWide: false,
20
+ * which correctly treats ambiguous-width characters as narrow (width 1) as
21
+ * recommended by the Unicode standard for Western contexts.
22
+ */
23
+ function stringWidthJavaScript(str: string): number {
24
+ if (typeof str !== 'string' || str.length === 0) {
25
+ return 0
26
+ }
27
+
28
+ // Fast path: pure ASCII string (no ANSI codes, no wide chars)
29
+ let isPureAscii = true
30
+
31
+ for (let i = 0; i < str.length; i++) {
32
+ const code = str.charCodeAt(i)
33
+
34
+ // Check for non-ASCII or ANSI escape (0x1b)
35
+ if (code >= 127 || code === 0x1b) {
36
+ isPureAscii = false
37
+
38
+ break
39
+ }
40
+ }
41
+
42
+ if (isPureAscii) {
43
+ // Count printable characters (exclude control chars)
44
+ let width = 0
45
+
46
+ for (let i = 0; i < str.length; i++) {
47
+ const code = str.charCodeAt(i)
48
+
49
+ if (code > 0x1f) {
50
+ width++
51
+ }
52
+ }
53
+
54
+ return width
55
+ }
56
+
57
+ // Strip ANSI if escape character is present
58
+ if (str.includes('\x1b')) {
59
+ str = stripAnsi(str)
60
+
61
+ if (str.length === 0) {
62
+ return 0
63
+ }
64
+ }
65
+
66
+ // Fast path: simple Unicode (no emoji, variation selectors, or joiners)
67
+ if (!needsSegmentation(str)) {
68
+ let width = 0
69
+
70
+ for (const char of str) {
71
+ const codePoint = char.codePointAt(0)!
72
+
73
+ if (!isZeroWidth(codePoint)) {
74
+ width += eastAsianWidth(codePoint, { ambiguousAsWide: false })
75
+ }
76
+ }
77
+
78
+ return width
79
+ }
80
+
81
+ let width = 0
82
+
83
+ for (const { segment: grapheme } of getGraphemeSegmenter().segment(str)) {
84
+ // Check for emoji first (most emoji sequences are width 2)
85
+ EMOJI_REGEX.lastIndex = 0
86
+
87
+ if (EMOJI_REGEX.test(grapheme)) {
88
+ width += getEmojiWidth(grapheme)
89
+
90
+ continue
91
+ }
92
+
93
+ // Calculate width for non-emoji graphemes
94
+ // For grapheme clusters (like Devanagari conjuncts with virama+ZWJ), only count
95
+ // the first non-zero-width character's width since the cluster renders as one glyph
96
+ for (const char of grapheme) {
97
+ const codePoint = char.codePointAt(0)!
98
+
99
+ if (!isZeroWidth(codePoint)) {
100
+ width += eastAsianWidth(codePoint, { ambiguousAsWide: false })
101
+
102
+ break
103
+ }
104
+ }
105
+ }
106
+
107
+ return width
108
+ }
109
+
110
+ function needsSegmentation(str: string): boolean {
111
+ for (const char of str) {
112
+ const cp = char.codePointAt(0)!
113
+
114
+ // Emoji ranges
115
+ if (cp >= 0x1f300 && cp <= 0x1faff) {
116
+ return true
117
+ }
118
+
119
+ if (cp >= 0x2600 && cp <= 0x27bf) {
120
+ return true
121
+ }
122
+
123
+ if (cp >= 0x1f1e6 && cp <= 0x1f1ff) {
124
+ return true
125
+ }
126
+
127
+ // Variation selectors, ZWJ
128
+ if (cp >= 0xfe00 && cp <= 0xfe0f) {
129
+ return true
130
+ }
131
+
132
+ if (cp === 0x200d) {
133
+ return true
134
+ }
135
+ }
136
+
137
+ return false
138
+ }
139
+
140
+ function getEmojiWidth(grapheme: string): number {
141
+ // Regional indicators: single = 1, pair = 2
142
+ const first = grapheme.codePointAt(0)!
143
+
144
+ if (first >= 0x1f1e6 && first <= 0x1f1ff) {
145
+ let count = 0
146
+
147
+ for (const _ of grapheme) {
148
+ count++
149
+ }
150
+
151
+ return count === 1 ? 1 : 2
152
+ }
153
+
154
+ // Incomplete keycap: digit/symbol + VS16 without U+20E3
155
+ if (grapheme.length === 2) {
156
+ const second = grapheme.codePointAt(1)
157
+
158
+ if (second === 0xfe0f && ((first >= 0x30 && first <= 0x39) || first === 0x23 || first === 0x2a)) {
159
+ return 1
160
+ }
161
+ }
162
+
163
+ return 2
164
+ }
165
+
166
+ function isZeroWidth(codePoint: number): boolean {
167
+ // Fast path for common printable range
168
+ if (codePoint >= 0x20 && codePoint < 0x7f) {
169
+ return false
170
+ }
171
+
172
+ if (codePoint >= 0xa0 && codePoint < 0x0300) {
173
+ return codePoint === 0x00ad
174
+ }
175
+
176
+ // Control characters
177
+ if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {
178
+ return true
179
+ }
180
+
181
+ // Zero-width and invisible characters
182
+ if (
183
+ (codePoint >= 0x200b && codePoint <= 0x200d) || // ZW space/joiner
184
+ codePoint === 0xfeff || // BOM
185
+ (codePoint >= 0x2060 && codePoint <= 0x2064) // Word joiner etc.
186
+ ) {
187
+ return true
188
+ }
189
+
190
+ // Variation selectors
191
+ if ((codePoint >= 0xfe00 && codePoint <= 0xfe0f) || (codePoint >= 0xe0100 && codePoint <= 0xe01ef)) {
192
+ return true
193
+ }
194
+
195
+ // Combining diacritical marks
196
+ if (
197
+ (codePoint >= 0x0300 && codePoint <= 0x036f) ||
198
+ (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||
199
+ (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||
200
+ (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||
201
+ (codePoint >= 0xfe20 && codePoint <= 0xfe2f)
202
+ ) {
203
+ return true
204
+ }
205
+
206
+ // Indic script combining marks (covers Devanagari through Malayalam)
207
+ if (codePoint >= 0x0900 && codePoint <= 0x0d4f) {
208
+ // Signs and vowel marks at start of each script block
209
+ const offset = codePoint & 0x7f
210
+
211
+ if (offset <= 0x03) {
212
+ return true
213
+ } // Signs at block start
214
+
215
+ if (offset >= 0x3a && offset <= 0x4f) {
216
+ return true
217
+ } // Vowel signs, virama
218
+
219
+ if (offset >= 0x51 && offset <= 0x57) {
220
+ return true
221
+ } // Stress signs
222
+
223
+ if (offset >= 0x62 && offset <= 0x63) {
224
+ return true
225
+ } // Vowel signs
226
+ }
227
+
228
+ // Thai/Lao combining marks
229
+ // Note: U+0E32 (SARA AA), U+0E33 (SARA AM), U+0EB2, U+0EB3 are spacing vowels (width 1), not combining marks
230
+ if (
231
+ codePoint === 0x0e31 || // Thai MAI HAN-AKAT
232
+ (codePoint >= 0x0e34 && codePoint <= 0x0e3a) || // Thai vowel signs (skip U+0E32, U+0E33)
233
+ (codePoint >= 0x0e47 && codePoint <= 0x0e4e) || // Thai vowel signs and marks
234
+ codePoint === 0x0eb1 || // Lao MAI KAN
235
+ (codePoint >= 0x0eb4 && codePoint <= 0x0ebc) || // Lao vowel signs (skip U+0EB2, U+0EB3)
236
+ (codePoint >= 0x0ec8 && codePoint <= 0x0ecd) // Lao tone marks
237
+ ) {
238
+ return true
239
+ }
240
+
241
+ // Arabic formatting
242
+ if (
243
+ (codePoint >= 0x0600 && codePoint <= 0x0605) ||
244
+ codePoint === 0x06dd ||
245
+ codePoint === 0x070f ||
246
+ codePoint === 0x08e2
247
+ ) {
248
+ return true
249
+ }
250
+
251
+ // Surrogates, tag characters
252
+ if (codePoint >= 0xd800 && codePoint <= 0xdfff) {
253
+ return true
254
+ }
255
+
256
+ if (codePoint >= 0xe0000 && codePoint <= 0xe007f) {
257
+ return true
258
+ }
259
+
260
+ return false
261
+ }
262
+
263
+ // Note: complex-script graphemes like Devanagari क्ष (ka+virama+ZWJ+ssa) render
264
+ // as a single ligature glyph but occupy 2 terminal cells (wcwidth sums the base
265
+ // consonants). Bun.stringWidth=2 matches terminal cell allocation, which is what
266
+ // we need for cursor positioning — the JS fallback's grapheme-cluster width of 1
267
+ // would desync Ink's layout from the terminal.
268
+ //
269
+ // Bun.stringWidth is resolved once at module scope rather than checked on every
270
+ // call — typeof guards deopt property access and this is a hot path (~100k calls/frame).
271
+ const bunStringWidth = typeof Bun !== 'undefined' && typeof Bun.stringWidth === 'function' ? Bun.stringWidth : null
272
+
273
+ const BUN_STRING_WIDTH_OPTS = { ambiguousIsNarrow: true } as const
274
+
275
+ const rawStringWidth: (str: string) => number = bunStringWidth
276
+ ? str => bunStringWidth(str, BUN_STRING_WIDTH_OPTS)
277
+ : stringWidthJavaScript
278
+
279
+ // Memoize stringWidth — it's pure, hot (~100k calls/frame per the comment
280
+ // above), and the underlying impl scans every grapheme + tests EMOJI_REGEX.
281
+ // CPU profile (Apr 2026) showed stringWidth dominating at 21% of total
282
+ // runtime during scroll. Cache is global (vs per-frame) since the same
283
+ // strings recur across frames in a stable transcript.
284
+ //
285
+ // Pure-ASCII short-strings (the >90% common case) skip the cache: the inline
286
+ // loop in stringWidthJavaScript is already faster than a Map.get for them.
287
+ const widthCache = new Map<string, number>()
288
+ const WIDTH_CACHE_LIMIT = 8192
289
+
290
+ export const stringWidth: (str: string) => number = str => {
291
+ if (!str) {
292
+ return 0
293
+ }
294
+
295
+ // ASCII fast-path detection — for short ASCII, skip the cache.
296
+ if (str.length <= 64) {
297
+ let asciiOnly = true
298
+
299
+ for (let i = 0; i < str.length; i++) {
300
+ const code = str.charCodeAt(i)
301
+
302
+ if (code >= 127 || code === 0x1b) {
303
+ asciiOnly = false
304
+
305
+ break
306
+ }
307
+ }
308
+
309
+ if (asciiOnly) {
310
+ return rawStringWidth(str)
311
+ }
312
+ }
313
+
314
+ const cached = widthCache.get(str)
315
+
316
+ if (cached !== undefined) {
317
+ // True LRU: refresh recency by re-inserting (Map iteration is insertion order).
318
+ widthCache.delete(str)
319
+ widthCache.set(str, cached)
320
+
321
+ return cached
322
+ }
323
+
324
+ const w = rawStringWidth(str)
325
+
326
+ if (widthCache.size >= WIDTH_CACHE_LIMIT) {
327
+ widthCache.delete(widthCache.keys().next().value!)
328
+ }
329
+
330
+ widthCache.set(str, w)
331
+
332
+ return w
333
+ }
334
+
335
+ export function widthCacheSize(): number {
336
+ return widthCache.size
337
+ }
338
+
339
+ export function evictWidthCache(keepRatio = 0): void {
340
+ lruEvict(widthCache, keepRatio)
341
+ }