@deepseek-harness-tui/dsh-tui 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/bin/dsh-tui.js +95 -0
  4. package/cordis.patch.yml +218 -0
  5. package/cordis.yml +185 -0
  6. package/lib/invariant.js +28 -0
  7. package/lib/types/activityPrefs.d.ts +29 -0
  8. package/lib/types/activityPrefs.d.ts.map +1 -0
  9. package/lib/types/activityPrefs.js +60 -0
  10. package/lib/types/bootstrap/state.d.ts +13 -0
  11. package/lib/types/bootstrap/state.d.ts.map +1 -0
  12. package/lib/types/bootstrap/state.js +12 -0
  13. package/lib/types/cc/cliHighlight.d.ts +20 -0
  14. package/lib/types/cc/cliHighlight.d.ts.map +1 -0
  15. package/lib/types/cc/cliHighlight.js +53 -0
  16. package/lib/types/cc/figures.d.ts +59 -0
  17. package/lib/types/cc/figures.d.ts.map +1 -0
  18. package/lib/types/cc/figures.js +69 -0
  19. package/lib/types/cc/format.d.ts +26 -0
  20. package/lib/types/cc/format.d.ts.map +1 -0
  21. package/lib/types/cc/format.js +55 -0
  22. package/lib/types/cc/hash.d.ts +25 -0
  23. package/lib/types/cc/hash.d.ts.map +1 -0
  24. package/lib/types/cc/hash.js +41 -0
  25. package/lib/types/cc/hyperlink.d.ts +21 -0
  26. package/lib/types/cc/hyperlink.d.ts.map +1 -0
  27. package/lib/types/cc/hyperlink.js +31 -0
  28. package/lib/types/cc/markdown.d.ts +43 -0
  29. package/lib/types/cc/markdown.d.ts.map +1 -0
  30. package/lib/types/cc/markdown.js +345 -0
  31. package/lib/types/cc/spinnerVerbs.d.ts +3 -0
  32. package/lib/types/cc/spinnerVerbs.d.ts.map +1 -0
  33. package/lib/types/cc/spinnerVerbs.js +190 -0
  34. package/lib/types/cc/terminal.d.ts +15 -0
  35. package/lib/types/cc/terminal.d.ts.map +1 -0
  36. package/lib/types/cc/terminal.js +84 -0
  37. package/lib/types/channel.d.ts +672 -0
  38. package/lib/types/channel.d.ts.map +1 -0
  39. package/lib/types/channel.js +2427 -0
  40. package/lib/types/childStderr.d.ts +63 -0
  41. package/lib/types/childStderr.d.ts.map +1 -0
  42. package/lib/types/childStderr.js +161 -0
  43. package/lib/types/commands.d.ts +55 -0
  44. package/lib/types/commands.d.ts.map +1 -0
  45. package/lib/types/commands.js +101 -0
  46. package/lib/types/components/ActivityLine.d.ts +29 -0
  47. package/lib/types/components/ActivityLine.d.ts.map +1 -0
  48. package/lib/types/components/ActivityLine.js +47 -0
  49. package/lib/types/components/ActivityPicker.d.ts +13 -0
  50. package/lib/types/components/ActivityPicker.d.ts.map +1 -0
  51. package/lib/types/components/ActivityPicker.js +24 -0
  52. package/lib/types/components/CommandSuggestions.d.ts +14 -0
  53. package/lib/types/components/CommandSuggestions.d.ts.map +1 -0
  54. package/lib/types/components/CommandSuggestions.js +33 -0
  55. package/lib/types/components/FileSuggestions.d.ts +12 -0
  56. package/lib/types/components/FileSuggestions.d.ts.map +1 -0
  57. package/lib/types/components/FileSuggestions.js +26 -0
  58. package/lib/types/components/GoalTodoPanel.d.ts +13 -0
  59. package/lib/types/components/GoalTodoPanel.d.ts.map +1 -0
  60. package/lib/types/components/GoalTodoPanel.js +57 -0
  61. package/lib/types/components/HelpMenu.d.ts +12 -0
  62. package/lib/types/components/HelpMenu.d.ts.map +1 -0
  63. package/lib/types/components/HelpMenu.js +12 -0
  64. package/lib/types/components/HistorySearchDialog.d.ts +16 -0
  65. package/lib/types/components/HistorySearchDialog.d.ts.map +1 -0
  66. package/lib/types/components/HistorySearchDialog.js +31 -0
  67. package/lib/types/components/InterruptedByUser.d.ts +7 -0
  68. package/lib/types/components/InterruptedByUser.d.ts.map +1 -0
  69. package/lib/types/components/InterruptedByUser.js +9 -0
  70. package/lib/types/components/LoadedContextPanel.d.ts +20 -0
  71. package/lib/types/components/LoadedContextPanel.d.ts.map +1 -0
  72. package/lib/types/components/LoadedContextPanel.js +30 -0
  73. package/lib/types/components/LogoV2.d.ts +23 -0
  74. package/lib/types/components/LogoV2.d.ts.map +1 -0
  75. package/lib/types/components/LogoV2.js +95 -0
  76. package/lib/types/components/Markdown.d.ts +24 -0
  77. package/lib/types/components/Markdown.d.ts.map +1 -0
  78. package/lib/types/components/Markdown.js +106 -0
  79. package/lib/types/components/MarkdownTable.d.ts +17 -0
  80. package/lib/types/components/MarkdownTable.d.ts.map +1 -0
  81. package/lib/types/components/MarkdownTable.js +272 -0
  82. package/lib/types/components/MessageList.d.ts +41 -0
  83. package/lib/types/components/MessageList.d.ts.map +1 -0
  84. package/lib/types/components/MessageList.js +303 -0
  85. package/lib/types/components/ModelPicker.d.ts +14 -0
  86. package/lib/types/components/ModelPicker.d.ts.map +1 -0
  87. package/lib/types/components/ModelPicker.js +15 -0
  88. package/lib/types/components/PresetPicker.d.ts +17 -0
  89. package/lib/types/components/PresetPicker.d.ts.map +1 -0
  90. package/lib/types/components/PresetPicker.js +25 -0
  91. package/lib/types/components/PromptInput.d.ts +67 -0
  92. package/lib/types/components/PromptInput.d.ts.map +1 -0
  93. package/lib/types/components/PromptInput.js +778 -0
  94. package/lib/types/components/ResumePicker.d.ts +15 -0
  95. package/lib/types/components/ResumePicker.d.ts.map +1 -0
  96. package/lib/types/components/ResumePicker.js +34 -0
  97. package/lib/types/components/RewindPicker.d.ts +14 -0
  98. package/lib/types/components/RewindPicker.d.ts.map +1 -0
  99. package/lib/types/components/RewindPicker.js +23 -0
  100. package/lib/types/components/SearchBox.d.ts +20 -0
  101. package/lib/types/components/SearchBox.d.ts.map +1 -0
  102. package/lib/types/components/SearchBox.js +33 -0
  103. package/lib/types/components/Select.d.ts +22 -0
  104. package/lib/types/components/Select.d.ts.map +1 -0
  105. package/lib/types/components/Select.js +19 -0
  106. package/lib/types/components/Spinner/GlimmerMessage.d.ts +19 -0
  107. package/lib/types/components/Spinner/GlimmerMessage.d.ts.map +1 -0
  108. package/lib/types/components/Spinner/GlimmerMessage.js +78 -0
  109. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts +31 -0
  110. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts.map +1 -0
  111. package/lib/types/components/Spinner/SpinnerAnimationRow.js +162 -0
  112. package/lib/types/components/Spinner/SpinnerGlyph.d.ts +16 -0
  113. package/lib/types/components/Spinner/SpinnerGlyph.d.ts.map +1 -0
  114. package/lib/types/components/Spinner/SpinnerGlyph.js +36 -0
  115. package/lib/types/components/Spinner/spinnerMode.d.ts +6 -0
  116. package/lib/types/components/Spinner/spinnerMode.d.ts.map +1 -0
  117. package/lib/types/components/Spinner/spinnerMode.js +1 -0
  118. package/lib/types/components/Spinner/spinnerUtils.d.ts +41 -0
  119. package/lib/types/components/Spinner/spinnerUtils.d.ts.map +1 -0
  120. package/lib/types/components/Spinner/spinnerUtils.js +104 -0
  121. package/lib/types/components/Spinner/useStalledAnimation.d.ts +16 -0
  122. package/lib/types/components/Spinner/useStalledAnimation.d.ts.map +1 -0
  123. package/lib/types/components/Spinner/useStalledAnimation.js +71 -0
  124. package/lib/types/components/StreamingMarkdown.d.ts +12 -0
  125. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -0
  126. package/lib/types/components/StreamingMarkdown.js +39 -0
  127. package/lib/types/components/ThemePicker.d.ts +22 -0
  128. package/lib/types/components/ThemePicker.d.ts.map +1 -0
  129. package/lib/types/components/ThemePicker.js +51 -0
  130. package/lib/types/components/ThinkingToggle.d.ts +17 -0
  131. package/lib/types/components/ThinkingToggle.d.ts.map +1 -0
  132. package/lib/types/components/ThinkingToggle.js +30 -0
  133. package/lib/types/components/ToolUseLoader.d.ts +13 -0
  134. package/lib/types/components/ToolUseLoader.d.ts.map +1 -0
  135. package/lib/types/components/ToolUseLoader.js +17 -0
  136. package/lib/types/components/Whale.d.ts +22 -0
  137. package/lib/types/components/Whale.d.ts.map +1 -0
  138. package/lib/types/components/Whale.js +78 -0
  139. package/lib/types/components/WorkingSpinner.d.ts +26 -0
  140. package/lib/types/components/WorkingSpinner.d.ts.map +1 -0
  141. package/lib/types/components/WorkingSpinner.js +68 -0
  142. package/lib/types/components/activityFrames.d.ts +31 -0
  143. package/lib/types/components/activityFrames.d.ts.map +1 -0
  144. package/lib/types/components/activityFrames.js +83 -0
  145. package/lib/types/components/bigfont.d.ts +28 -0
  146. package/lib/types/components/bigfont.d.ts.map +1 -0
  147. package/lib/types/components/bigfont.js +91 -0
  148. package/lib/types/components/design-system/Byline.d.ts +14 -0
  149. package/lib/types/components/design-system/Byline.d.ts.map +1 -0
  150. package/lib/types/components/design-system/Byline.js +17 -0
  151. package/lib/types/components/design-system/Divider.d.ts +40 -0
  152. package/lib/types/components/design-system/Divider.d.ts.map +1 -0
  153. package/lib/types/components/design-system/Divider.js +24 -0
  154. package/lib/types/components/design-system/KeyboardShortcutHint.d.ts +19 -0
  155. package/lib/types/components/design-system/KeyboardShortcutHint.d.ts.map +1 -0
  156. package/lib/types/components/design-system/KeyboardShortcutHint.js +14 -0
  157. package/lib/types/components/design-system/ListItem.d.ts +36 -0
  158. package/lib/types/components/design-system/ListItem.d.ts.map +1 -0
  159. package/lib/types/components/design-system/ListItem.js +48 -0
  160. package/lib/types/components/design-system/LoadingState.d.ts +19 -0
  161. package/lib/types/components/design-system/LoadingState.d.ts.map +1 -0
  162. package/lib/types/components/design-system/LoadingState.js +22 -0
  163. package/lib/types/components/design-system/Pane.d.ts +17 -0
  164. package/lib/types/components/design-system/Pane.d.ts.map +1 -0
  165. package/lib/types/components/design-system/Pane.js +15 -0
  166. package/lib/types/components/design-system/ProgressBar.d.ts +22 -0
  167. package/lib/types/components/design-system/ProgressBar.d.ts.map +1 -0
  168. package/lib/types/components/design-system/ProgressBar.js +27 -0
  169. package/lib/types/components/design-system/StatusIcon.d.ts +15 -0
  170. package/lib/types/components/design-system/StatusIcon.d.ts.map +1 -0
  171. package/lib/types/components/design-system/StatusIcon.js +20 -0
  172. package/lib/types/components/design-system/ThemeProvider.d.ts +11 -0
  173. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -0
  174. package/lib/types/components/design-system/ThemeProvider.js +135 -0
  175. package/lib/types/components/design-system/ThemedBox.d.ts +37 -0
  176. package/lib/types/components/design-system/ThemedBox.d.ts.map +1 -0
  177. package/lib/types/components/design-system/ThemedBox.js +26 -0
  178. package/lib/types/components/design-system/ThemedText.d.ts +56 -0
  179. package/lib/types/components/design-system/ThemedText.d.ts.map +1 -0
  180. package/lib/types/components/design-system/ThemedText.js +45 -0
  181. package/lib/types/components/messages/AssistantTextMessage.d.ts +18 -0
  182. package/lib/types/components/messages/AssistantTextMessage.d.ts.map +1 -0
  183. package/lib/types/components/messages/AssistantTextMessage.js +15 -0
  184. package/lib/types/components/messages/AssistantThinkingMessage.d.ts +23 -0
  185. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -0
  186. package/lib/types/components/messages/AssistantThinkingMessage.js +23 -0
  187. package/lib/types/components/messages/AssistantToolUseMessage.d.ts +23 -0
  188. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -0
  189. package/lib/types/components/messages/AssistantToolUseMessage.js +220 -0
  190. package/lib/types/components/messages/MessageMetadata.d.ts +15 -0
  191. package/lib/types/components/messages/MessageMetadata.d.ts.map +1 -0
  192. package/lib/types/components/messages/MessageMetadata.js +20 -0
  193. package/lib/types/components/messages/UserPromptMessage.d.ts +19 -0
  194. package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -0
  195. package/lib/types/components/messages/UserPromptMessage.js +15 -0
  196. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +39 -0
  197. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -0
  198. package/lib/types/components/questions/AskUserQuestionPanel.js +228 -0
  199. package/lib/types/components/shimmer.d.ts +35 -0
  200. package/lib/types/components/shimmer.d.ts.map +1 -0
  201. package/lib/types/components/shimmer.js +43 -0
  202. package/lib/types/components/whaleFrames.d.ts +25 -0
  203. package/lib/types/components/whaleFrames.d.ts.map +1 -0
  204. package/lib/types/components/whaleFrames.js +419 -0
  205. package/lib/types/customTheme.d.ts +104 -0
  206. package/lib/types/customTheme.d.ts.map +1 -0
  207. package/lib/types/customTheme.js +268 -0
  208. package/lib/types/effortPrefs.d.ts +22 -0
  209. package/lib/types/effortPrefs.d.ts.map +1 -0
  210. package/lib/types/effortPrefs.js +45 -0
  211. package/lib/types/history.d.ts +24 -0
  212. package/lib/types/history.d.ts.map +1 -0
  213. package/lib/types/history.js +75 -0
  214. package/lib/types/hooks/useBlink.d.ts +11 -0
  215. package/lib/types/hooks/useBlink.d.ts.map +1 -0
  216. package/lib/types/hooks/useBlink.js +20 -0
  217. package/lib/types/i18n.d.ts +926 -0
  218. package/lib/types/i18n.d.ts.map +1 -0
  219. package/lib/types/i18n.js +356 -0
  220. package/lib/types/index.d.ts +70 -0
  221. package/lib/types/index.d.ts.map +1 -0
  222. package/lib/types/index.js +31 -0
  223. package/lib/types/ink/Ansi.d.ts +11 -0
  224. package/lib/types/ink/Ansi.d.ts.map +1 -0
  225. package/lib/types/ink/Ansi.js +269 -0
  226. package/lib/types/ink/bidi.d.ts +18 -0
  227. package/lib/types/ink/bidi.d.ts.map +1 -0
  228. package/lib/types/ink/bidi.js +119 -0
  229. package/lib/types/ink/clearTerminal.d.ts +22 -0
  230. package/lib/types/ink/clearTerminal.d.ts.map +1 -0
  231. package/lib/types/ink/clearTerminal.js +72 -0
  232. package/lib/types/ink/colorize.d.ts +33 -0
  233. package/lib/types/ink/colorize.d.ts.map +1 -0
  234. package/lib/types/ink/colorize.js +213 -0
  235. package/lib/types/ink/components/AlternateScreen.d.ts +22 -0
  236. package/lib/types/ink/components/AlternateScreen.d.ts.map +1 -0
  237. package/lib/types/ink/components/AlternateScreen.js +74 -0
  238. package/lib/types/ink/components/App.d.ts +73 -0
  239. package/lib/types/ink/components/App.d.ts.map +1 -0
  240. package/lib/types/ink/components/App.js +597 -0
  241. package/lib/types/ink/components/AppContext.d.ts +15 -0
  242. package/lib/types/ink/components/AppContext.d.ts.map +1 -0
  243. package/lib/types/ink/components/AppContext.js +11 -0
  244. package/lib/types/ink/components/Box.d.ts +49 -0
  245. package/lib/types/ink/components/Box.d.ts.map +1 -0
  246. package/lib/types/ink/components/Box.js +153 -0
  247. package/lib/types/ink/components/Button.d.ts +37 -0
  248. package/lib/types/ink/components/Button.d.ts.map +1 -0
  249. package/lib/types/ink/components/Button.js +166 -0
  250. package/lib/types/ink/components/ClockContext.d.ts +10 -0
  251. package/lib/types/ink/components/ClockContext.d.ts.map +1 -0
  252. package/lib/types/ink/components/ClockContext.js +108 -0
  253. package/lib/types/ink/components/CursorDeclarationContext.d.ts +30 -0
  254. package/lib/types/ink/components/CursorDeclarationContext.d.ts.map +1 -0
  255. package/lib/types/ink/components/CursorDeclarationContext.js +6 -0
  256. package/lib/types/ink/components/ErrorOverview.d.ts +7 -0
  257. package/lib/types/ink/components/ErrorOverview.d.ts.map +1 -0
  258. package/lib/types/ink/components/ErrorOverview.js +49 -0
  259. package/lib/types/ink/components/Link.d.ts +8 -0
  260. package/lib/types/ink/components/Link.d.ts.map +1 -0
  261. package/lib/types/ink/components/Link.js +33 -0
  262. package/lib/types/ink/components/Newline.d.ts +13 -0
  263. package/lib/types/ink/components/Newline.d.ts.map +1 -0
  264. package/lib/types/ink/components/Newline.js +29 -0
  265. package/lib/types/ink/components/NoSelect.d.ts +20 -0
  266. package/lib/types/ink/components/NoSelect.d.ts.map +1 -0
  267. package/lib/types/ink/components/NoSelect.js +56 -0
  268. package/lib/types/ink/components/RawAnsi.d.ts +17 -0
  269. package/lib/types/ink/components/RawAnsi.d.ts.map +1 -0
  270. package/lib/types/ink/components/RawAnsi.js +45 -0
  271. package/lib/types/ink/components/ScrollBox.d.ts +78 -0
  272. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -0
  273. package/lib/types/ink/components/ScrollBox.js +174 -0
  274. package/lib/types/ink/components/Spacer.d.ts +6 -0
  275. package/lib/types/ink/components/Spacer.d.ts.map +1 -0
  276. package/lib/types/ink/components/Spacer.js +19 -0
  277. package/lib/types/ink/components/StdinContext.d.ts +32 -0
  278. package/lib/types/ink/components/StdinContext.d.ts.map +1 -0
  279. package/lib/types/ink/components/StdinContext.js +16 -0
  280. package/lib/types/ink/components/TerminalFocusContext.d.ts +11 -0
  281. package/lib/types/ink/components/TerminalFocusContext.d.ts.map +1 -0
  282. package/lib/types/ink/components/TerminalFocusContext.js +45 -0
  283. package/lib/types/ink/components/TerminalSizeContext.d.ts +6 -0
  284. package/lib/types/ink/components/TerminalSizeContext.d.ts.map +1 -0
  285. package/lib/types/ink/components/TerminalSizeContext.js +3 -0
  286. package/lib/types/ink/components/Text.d.ts +56 -0
  287. package/lib/types/ink/components/Text.d.ts.map +1 -0
  288. package/lib/types/ink/components/Text.js +194 -0
  289. package/lib/types/ink/constants.d.ts +3 -0
  290. package/lib/types/ink/constants.d.ts.map +1 -0
  291. package/lib/types/ink/constants.js +2 -0
  292. package/lib/types/ink/cursor.d.ts +11 -0
  293. package/lib/types/ink/cursor.d.ts.map +1 -0
  294. package/lib/types/ink/cursor.js +1 -0
  295. package/lib/types/ink/devtools.d.ts +7 -0
  296. package/lib/types/ink/devtools.d.ts.map +1 -0
  297. package/lib/types/ink/devtools.js +1 -0
  298. package/lib/types/ink/dom.d.ts +178 -0
  299. package/lib/types/ink/dom.d.ts.map +1 -0
  300. package/lib/types/ink/dom.js +424 -0
  301. package/lib/types/ink/events/click-event.d.ts +32 -0
  302. package/lib/types/ink/events/click-event.d.ts.map +1 -0
  303. package/lib/types/ink/events/click-event.js +36 -0
  304. package/lib/types/ink/events/dispatcher.d.ts +63 -0
  305. package/lib/types/ink/events/dispatcher.d.ts.map +1 -0
  306. package/lib/types/ink/events/dispatcher.js +194 -0
  307. package/lib/types/ink/events/emitter.d.ts +20 -0
  308. package/lib/types/ink/events/emitter.d.ts.map +1 -0
  309. package/lib/types/ink/events/emitter.js +43 -0
  310. package/lib/types/ink/events/event-handlers.d.ts +47 -0
  311. package/lib/types/ink/events/event-handlers.d.ts.map +1 -0
  312. package/lib/types/ink/events/event-handlers.js +30 -0
  313. package/lib/types/ink/events/event.d.ts +19 -0
  314. package/lib/types/ink/events/event.d.ts.map +1 -0
  315. package/lib/types/ink/events/event.js +22 -0
  316. package/lib/types/ink/events/focus-event.d.ts +19 -0
  317. package/lib/types/ink/events/focus-event.d.ts.map +1 -0
  318. package/lib/types/ink/events/focus-event.js +21 -0
  319. package/lib/types/ink/events/input-event.d.ts +53 -0
  320. package/lib/types/ink/events/input-event.d.ts.map +1 -0
  321. package/lib/types/ink/events/input-event.js +180 -0
  322. package/lib/types/ink/events/keyboard-event.d.ts +40 -0
  323. package/lib/types/ink/events/keyboard-event.d.ts.map +1 -0
  324. package/lib/types/ink/events/keyboard-event.js +65 -0
  325. package/lib/types/ink/events/paste-event.d.ts +11 -0
  326. package/lib/types/ink/events/paste-event.d.ts.map +1 -0
  327. package/lib/types/ink/events/paste-event.js +13 -0
  328. package/lib/types/ink/events/resize-event.d.ts +13 -0
  329. package/lib/types/ink/events/resize-event.d.ts.map +1 -0
  330. package/lib/types/ink/events/resize-event.js +16 -0
  331. package/lib/types/ink/events/terminal-event.d.ts +112 -0
  332. package/lib/types/ink/events/terminal-event.d.ts.map +1 -0
  333. package/lib/types/ink/events/terminal-event.js +131 -0
  334. package/lib/types/ink/events/terminal-focus-event.d.ts +21 -0
  335. package/lib/types/ink/events/terminal-focus-event.d.ts.map +1 -0
  336. package/lib/types/ink/events/terminal-focus-event.js +18 -0
  337. package/lib/types/ink/focus.d.ts +74 -0
  338. package/lib/types/ink/focus.d.ts.map +1 -0
  339. package/lib/types/ink/focus.js +188 -0
  340. package/lib/types/ink/frame.d.ts +119 -0
  341. package/lib/types/ink/frame.d.ts.map +1 -0
  342. package/lib/types/ink/frame.js +43 -0
  343. package/lib/types/ink/get-max-width.d.ts +20 -0
  344. package/lib/types/ink/get-max-width.d.ts.map +1 -0
  345. package/lib/types/ink/get-max-width.js +25 -0
  346. package/lib/types/ink/hit-test.d.ts +47 -0
  347. package/lib/types/ink/hit-test.d.ts.map +1 -0
  348. package/lib/types/ink/hit-test.js +126 -0
  349. package/lib/types/ink/hooks/use-animation-frame.d.ts +27 -0
  350. package/lib/types/ink/hooks/use-animation-frame.d.ts.map +1 -0
  351. package/lib/types/ink/hooks/use-animation-frame.js +48 -0
  352. package/lib/types/ink/hooks/use-app.d.ts +8 -0
  353. package/lib/types/ink/hooks/use-app.d.ts.map +1 -0
  354. package/lib/types/ink/hooks/use-app.js +8 -0
  355. package/lib/types/ink/hooks/use-copy-on-select.d.ts +22 -0
  356. package/lib/types/ink/hooks/use-copy-on-select.d.ts.map +1 -0
  357. package/lib/types/ink/hooks/use-copy-on-select.js +40 -0
  358. package/lib/types/ink/hooks/use-declared-cursor.d.ts +31 -0
  359. package/lib/types/ink/hooks/use-declared-cursor.d.ts.map +1 -0
  360. package/lib/types/ink/hooks/use-declared-cursor.js +65 -0
  361. package/lib/types/ink/hooks/use-input.d.ts +41 -0
  362. package/lib/types/ink/hooks/use-input.d.ts.map +1 -0
  363. package/lib/types/ink/hooks/use-input.js +73 -0
  364. package/lib/types/ink/hooks/use-interval.d.ts +23 -0
  365. package/lib/types/ink/hooks/use-interval.d.ts.map +1 -0
  366. package/lib/types/ink/hooks/use-interval.js +58 -0
  367. package/lib/types/ink/hooks/use-search-highlight.d.ts +34 -0
  368. package/lib/types/ink/hooks/use-search-highlight.d.ts.map +1 -0
  369. package/lib/types/ink/hooks/use-search-highlight.js +35 -0
  370. package/lib/types/ink/hooks/use-selection.d.ts +44 -0
  371. package/lib/types/ink/hooks/use-selection.d.ts.map +1 -0
  372. package/lib/types/ink/hooks/use-selection.js +64 -0
  373. package/lib/types/ink/hooks/use-stdin.d.ts +8 -0
  374. package/lib/types/ink/hooks/use-stdin.d.ts.map +1 -0
  375. package/lib/types/ink/hooks/use-stdin.js +8 -0
  376. package/lib/types/ink/hooks/use-tab-status.d.ts +18 -0
  377. package/lib/types/ink/hooks/use-tab-status.d.ts.map +1 -0
  378. package/lib/types/ink/hooks/use-tab-status.js +58 -0
  379. package/lib/types/ink/hooks/use-terminal-focus.d.ts +11 -0
  380. package/lib/types/ink/hooks/use-terminal-focus.d.ts.map +1 -0
  381. package/lib/types/ink/hooks/use-terminal-focus.js +15 -0
  382. package/lib/types/ink/hooks/use-terminal-size.d.ts +6 -0
  383. package/lib/types/ink/hooks/use-terminal-size.d.ts.map +1 -0
  384. package/lib/types/ink/hooks/use-terminal-size.js +12 -0
  385. package/lib/types/ink/hooks/use-terminal-title.d.ts +14 -0
  386. package/lib/types/ink/hooks/use-terminal-title.d.ts.map +1 -0
  387. package/lib/types/ink/hooks/use-terminal-title.js +30 -0
  388. package/lib/types/ink/hooks/use-terminal-viewport.d.ts +32 -0
  389. package/lib/types/ink/hooks/use-terminal-viewport.d.ts.map +1 -0
  390. package/lib/types/ink/hooks/use-terminal-viewport.js +79 -0
  391. package/lib/types/ink/ink.d.ts +370 -0
  392. package/lib/types/ink/ink.d.ts.map +1 -0
  393. package/lib/types/ink/ink.js +1665 -0
  394. package/lib/types/ink/instances.d.ts +10 -0
  395. package/lib/types/ink/instances.d.ts.map +1 -0
  396. package/lib/types/ink/instances.js +13 -0
  397. package/lib/types/ink/layout/engine.d.ts +7 -0
  398. package/lib/types/ink/layout/engine.d.ts.map +1 -0
  399. package/lib/types/ink/layout/engine.js +8 -0
  400. package/lib/types/ink/layout/geometry.d.ts +86 -0
  401. package/lib/types/ink/layout/geometry.d.ts.map +1 -0
  402. package/lib/types/ink/layout/geometry.js +95 -0
  403. package/lib/types/ink/layout/node.d.ts +151 -0
  404. package/lib/types/ink/layout/node.d.ts.map +1 -0
  405. package/lib/types/ink/layout/node.js +72 -0
  406. package/lib/types/ink/layout/yoga.d.ts +69 -0
  407. package/lib/types/ink/layout/yoga.d.ts.map +1 -0
  408. package/lib/types/ink/layout/yoga.js +249 -0
  409. package/lib/types/ink/line-width-cache.d.ts +9 -0
  410. package/lib/types/ink/line-width-cache.d.ts.map +1 -0
  411. package/lib/types/ink/line-width-cache.js +45 -0
  412. package/lib/types/ink/log-update.d.ts +57 -0
  413. package/lib/types/ink/log-update.d.ts.map +1 -0
  414. package/lib/types/ink/log-update.js +710 -0
  415. package/lib/types/ink/measure-element.d.ts +19 -0
  416. package/lib/types/ink/measure-element.d.ts.map +1 -0
  417. package/lib/types/ink/measure-element.js +10 -0
  418. package/lib/types/ink/measure-text.d.ts +13 -0
  419. package/lib/types/ink/measure-text.d.ts.map +1 -0
  420. package/lib/types/ink/measure-text.js +38 -0
  421. package/lib/types/ink/node-cache.d.ts +33 -0
  422. package/lib/types/ink/node-cache.d.ts.map +1 -0
  423. package/lib/types/ink/node-cache.js +42 -0
  424. package/lib/types/ink/optimizer.d.ts +18 -0
  425. package/lib/types/ink/optimizer.d.ts.map +1 -0
  426. package/lib/types/ink/optimizer.js +83 -0
  427. package/lib/types/ink/output.d.ts +200 -0
  428. package/lib/types/ink/output.d.ts.map +1 -0
  429. package/lib/types/ink/output.js +663 -0
  430. package/lib/types/ink/parse-keypress.d.ts +132 -0
  431. package/lib/types/ink/parse-keypress.d.ts.map +1 -0
  432. package/lib/types/ink/parse-keypress.js +707 -0
  433. package/lib/types/ink/reconciler.d.ts +43 -0
  434. package/lib/types/ink/reconciler.d.ts.map +1 -0
  435. package/lib/types/ink/reconciler.js +413 -0
  436. package/lib/types/ink/render-border.d.ts +36 -0
  437. package/lib/types/ink/render-border.d.ts.map +1 -0
  438. package/lib/types/ink/render-border.js +143 -0
  439. package/lib/types/ink/render-node-to-output.d.ts +93 -0
  440. package/lib/types/ink/render-node-to-output.d.ts.map +1 -0
  441. package/lib/types/ink/render-node-to-output.js +1290 -0
  442. package/lib/types/ink/render-to-screen.d.ts +65 -0
  443. package/lib/types/ink/render-to-screen.d.ts.map +1 -0
  444. package/lib/types/ink/render-to-screen.js +189 -0
  445. package/lib/types/ink/renderer.d.ts +24 -0
  446. package/lib/types/ink/renderer.d.ts.map +1 -0
  447. package/lib/types/ink/renderer.js +136 -0
  448. package/lib/types/ink/root.d.ts +91 -0
  449. package/lib/types/ink/root.d.ts.map +1 -0
  450. package/lib/types/ink/root.js +93 -0
  451. package/lib/types/ink/screen.d.ts +443 -0
  452. package/lib/types/ink/screen.d.ts.map +1 -0
  453. package/lib/types/ink/screen.js +1295 -0
  454. package/lib/types/ink/searchHighlight.d.ts +25 -0
  455. package/lib/types/ink/searchHighlight.d.ts.map +1 -0
  456. package/lib/types/ink/searchHighlight.js +82 -0
  457. package/lib/types/ink/selection.d.ts +323 -0
  458. package/lib/types/ink/selection.d.ts.map +1 -0
  459. package/lib/types/ink/selection.js +881 -0
  460. package/lib/types/ink/squash-text-nodes.d.ts +30 -0
  461. package/lib/types/ink/squash-text-nodes.d.ts.map +1 -0
  462. package/lib/types/ink/squash-text-nodes.js +63 -0
  463. package/lib/types/ink/stringWidth.d.ts +11 -0
  464. package/lib/types/ink/stringWidth.d.ts.map +1 -0
  465. package/lib/types/ink/stringWidth.js +209 -0
  466. package/lib/types/ink/styles.d.ts +324 -0
  467. package/lib/types/ink/styles.d.ts.map +1 -0
  468. package/lib/types/ink/styles.js +307 -0
  469. package/lib/types/ink/supports-hyperlinks.d.ts +20 -0
  470. package/lib/types/ink/supports-hyperlinks.d.ts.map +1 -0
  471. package/lib/types/ink/supports-hyperlinks.js +44 -0
  472. package/lib/types/ink/tabstops.d.ts +9 -0
  473. package/lib/types/ink/tabstops.d.ts.map +1 -0
  474. package/lib/types/ink/tabstops.js +46 -0
  475. package/lib/types/ink/terminal-focus-state.d.ts +35 -0
  476. package/lib/types/ink/terminal-focus-state.d.ts.map +1 -0
  477. package/lib/types/ink/terminal-focus-state.js +57 -0
  478. package/lib/types/ink/terminal-querier.d.ts +161 -0
  479. package/lib/types/ink/terminal-querier.d.ts.map +1 -0
  480. package/lib/types/ink/terminal-querier.js +204 -0
  481. package/lib/types/ink/terminal.d.ts +80 -0
  482. package/lib/types/ink/terminal.d.ts.map +1 -0
  483. package/lib/types/ink/terminal.js +268 -0
  484. package/lib/types/ink/termio/ansi.d.ts +75 -0
  485. package/lib/types/ink/termio/ansi.d.ts.map +1 -0
  486. package/lib/types/ink/termio/ansi.js +79 -0
  487. package/lib/types/ink/termio/csi.d.ts +253 -0
  488. package/lib/types/ink/termio/csi.d.ts.map +1 -0
  489. package/lib/types/ink/termio/csi.js +347 -0
  490. package/lib/types/ink/termio/dec.d.ts +61 -0
  491. package/lib/types/ink/termio/dec.d.ts.map +1 -0
  492. package/lib/types/ink/termio/dec.js +76 -0
  493. package/lib/types/ink/termio/esc.d.ts +15 -0
  494. package/lib/types/ink/termio/esc.d.ts.map +1 -0
  495. package/lib/types/ink/termio/esc.js +57 -0
  496. package/lib/types/ink/termio/osc.d.ts +208 -0
  497. package/lib/types/ink/termio/osc.d.ts.map +1 -0
  498. package/lib/types/ink/termio/osc.js +466 -0
  499. package/lib/types/ink/termio/parser.d.ts +46 -0
  500. package/lib/types/ink/termio/parser.d.ts.map +1 -0
  501. package/lib/types/ink/termio/parser.js +366 -0
  502. package/lib/types/ink/termio/sgr.d.ts +17 -0
  503. package/lib/types/ink/termio/sgr.d.ts.map +1 -0
  504. package/lib/types/ink/termio/sgr.js +300 -0
  505. package/lib/types/ink/termio/tokenize.d.ts +50 -0
  506. package/lib/types/ink/termio/tokenize.d.ts.map +1 -0
  507. package/lib/types/ink/termio/tokenize.js +266 -0
  508. package/lib/types/ink/termio/types.d.ts +211 -0
  509. package/lib/types/ink/termio/types.d.ts.map +1 -0
  510. package/lib/types/ink/termio/types.js +68 -0
  511. package/lib/types/ink/termio.d.ts +25 -0
  512. package/lib/types/ink/termio.d.ts.map +1 -0
  513. package/lib/types/ink/termio.js +24 -0
  514. package/lib/types/ink/truncateToWidth.d.ts +7 -0
  515. package/lib/types/ink/truncateToWidth.d.ts.map +1 -0
  516. package/lib/types/ink/truncateToWidth.js +18 -0
  517. package/lib/types/ink/useTerminalNotification.d.ts +45 -0
  518. package/lib/types/ink/useTerminalNotification.d.ts.map +1 -0
  519. package/lib/types/ink/useTerminalNotification.js +70 -0
  520. package/lib/types/ink/warn.d.ts +7 -0
  521. package/lib/types/ink/warn.d.ts.map +1 -0
  522. package/lib/types/ink/warn.js +15 -0
  523. package/lib/types/ink/widest-line.d.ts +7 -0
  524. package/lib/types/ink/widest-line.d.ts.map +1 -0
  525. package/lib/types/ink/widest-line.js +19 -0
  526. package/lib/types/ink/wrap-text.d.ts +10 -0
  527. package/lib/types/ink/wrap-text.d.ts.map +1 -0
  528. package/lib/types/ink/wrap-text.js +61 -0
  529. package/lib/types/ink/wrapAnsi.d.ts +18 -0
  530. package/lib/types/ink/wrapAnsi.d.ts.map +1 -0
  531. package/lib/types/ink/wrapAnsi.js +16 -0
  532. package/lib/types/invariant.d.ts +20 -0
  533. package/lib/types/invariant.d.ts.map +1 -0
  534. package/lib/types/invariant.js +26 -0
  535. package/lib/types/modelPrefs.d.ts +37 -0
  536. package/lib/types/modelPrefs.d.ts.map +1 -0
  537. package/lib/types/modelPrefs.js +66 -0
  538. package/lib/types/modelRoute.d.ts +79 -0
  539. package/lib/types/modelRoute.d.ts.map +1 -0
  540. package/lib/types/modelRoute.js +96 -0
  541. package/lib/types/native-ts/yoga-layout/enums.d.ts +183 -0
  542. package/lib/types/native-ts/yoga-layout/enums.d.ts.map +1 -0
  543. package/lib/types/native-ts/yoga-layout/enums.js +150 -0
  544. package/lib/types/native-ts/yoga-layout/index.d.ts +788 -0
  545. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -0
  546. package/lib/types/native-ts/yoga-layout/index.js +2571 -0
  547. package/lib/types/packaged-skills.d.ts +10 -0
  548. package/lib/types/packaged-skills.d.ts.map +1 -0
  549. package/lib/types/packaged-skills.js +63 -0
  550. package/lib/types/plugin.d.ts +33 -0
  551. package/lib/types/plugin.d.ts.map +1 -0
  552. package/lib/types/plugin.js +454 -0
  553. package/lib/types/presetPrefs.d.ts +29 -0
  554. package/lib/types/presetPrefs.d.ts.map +1 -0
  555. package/lib/types/presetPrefs.js +61 -0
  556. package/lib/types/presets.d.ts +110 -0
  557. package/lib/types/presets.d.ts.map +1 -0
  558. package/lib/types/presets.js +114 -0
  559. package/lib/types/questions.d.ts +97 -0
  560. package/lib/types/questions.d.ts.map +1 -0
  561. package/lib/types/questions.js +201 -0
  562. package/lib/types/screens/Chat.d.ts +23 -0
  563. package/lib/types/screens/Chat.d.ts.map +1 -0
  564. package/lib/types/screens/Chat.js +1263 -0
  565. package/lib/types/screens/StatusLine.d.ts +16 -0
  566. package/lib/types/screens/StatusLine.d.ts.map +1 -0
  567. package/lib/types/screens/StatusLine.js +105 -0
  568. package/lib/types/screens/StatusMetrics.d.ts +87 -0
  569. package/lib/types/screens/StatusMetrics.d.ts.map +1 -0
  570. package/lib/types/screens/StatusMetrics.js +252 -0
  571. package/lib/types/sessionHistory.d.ts +32 -0
  572. package/lib/types/sessionHistory.d.ts.map +1 -0
  573. package/lib/types/sessionHistory.js +87 -0
  574. package/lib/types/theme.d.ts +115 -0
  575. package/lib/types/theme.d.ts.map +1 -0
  576. package/lib/types/theme.js +300 -0
  577. package/lib/types/themePrefs.d.ts +28 -0
  578. package/lib/types/themePrefs.d.ts.map +1 -0
  579. package/lib/types/themePrefs.js +59 -0
  580. package/lib/types/ui.d.ts +28 -0
  581. package/lib/types/ui.d.ts.map +1 -0
  582. package/lib/types/ui.js +25 -0
  583. package/lib/types/update.d.ts +76 -0
  584. package/lib/types/update.d.ts.map +1 -0
  585. package/lib/types/update.js +203 -0
  586. package/lib/types/utils/clipboard.d.ts +43 -0
  587. package/lib/types/utils/clipboard.d.ts.map +1 -0
  588. package/lib/types/utils/clipboard.js +82 -0
  589. package/lib/types/utils/debug.d.ts +8 -0
  590. package/lib/types/utils/debug.d.ts.map +1 -0
  591. package/lib/types/utils/debug.js +12 -0
  592. package/lib/types/utils/earlyInput.d.ts +7 -0
  593. package/lib/types/utils/earlyInput.d.ts.map +1 -0
  594. package/lib/types/utils/earlyInput.js +6 -0
  595. package/lib/types/utils/env.d.ts +10 -0
  596. package/lib/types/utils/env.d.ts.map +1 -0
  597. package/lib/types/utils/env.js +9 -0
  598. package/lib/types/utils/envUtils.d.ts +8 -0
  599. package/lib/types/utils/envUtils.d.ts.map +1 -0
  600. package/lib/types/utils/envUtils.js +13 -0
  601. package/lib/types/utils/execFileNoThrow.d.ts +34 -0
  602. package/lib/types/utils/execFileNoThrow.d.ts.map +1 -0
  603. package/lib/types/utils/execFileNoThrow.js +31 -0
  604. package/lib/types/utils/fullscreen.d.ts +8 -0
  605. package/lib/types/utils/fullscreen.d.ts.map +1 -0
  606. package/lib/types/utils/fullscreen.js +10 -0
  607. package/lib/types/utils/intl.d.ts +7 -0
  608. package/lib/types/utils/intl.d.ts.map +1 -0
  609. package/lib/types/utils/intl.js +9 -0
  610. package/lib/types/utils/loaded-context.d.ts +20 -0
  611. package/lib/types/utils/loaded-context.d.ts.map +1 -0
  612. package/lib/types/utils/loaded-context.js +36 -0
  613. package/lib/types/utils/log.d.ts +7 -0
  614. package/lib/types/utils/log.d.ts.map +1 -0
  615. package/lib/types/utils/log.js +9 -0
  616. package/lib/types/utils/mentions.d.ts +30 -0
  617. package/lib/types/utils/mentions.d.ts.map +1 -0
  618. package/lib/types/utils/mentions.js +72 -0
  619. package/lib/types/utils/narration.d.ts +11 -0
  620. package/lib/types/utils/narration.d.ts.map +1 -0
  621. package/lib/types/utils/narration.js +16 -0
  622. package/lib/types/utils/semver.d.ts +9 -0
  623. package/lib/types/utils/semver.d.ts.map +1 -0
  624. package/lib/types/utils/semver.js +24 -0
  625. package/lib/types/utils/sliceAnsi.d.ts +12 -0
  626. package/lib/types/utils/sliceAnsi.d.ts.map +1 -0
  627. package/lib/types/utils/sliceAnsi.js +79 -0
  628. package/lib/types/working-activity.d.ts +19 -0
  629. package/lib/types/working-activity.d.ts.map +1 -0
  630. package/lib/types/working-activity.js +18 -0
  631. package/package.json +141 -0
  632. package/skills/audit/SKILL.md +24 -0
  633. package/skills/bug/SKILL.md +27 -0
  634. package/skills/pr-comments/SKILL.md +20 -0
  635. package/skills/practice/SKILL.md +22 -0
  636. package/skills/release-notes/SKILL.md +25 -0
  637. package/skills/review/SKILL.md +25 -0
  638. package/skills/vuln-check/SKILL.md +25 -0
@@ -0,0 +1,663 @@
1
+ import { styledCharsFromTokens, tokenize, } from '@alcalzone/ansi-tokenize';
2
+ import { logForDebugging } from '../utils/debug.js';
3
+ import { getGraphemeSegmenter } from '../utils/intl.js';
4
+ import sliceAnsi from '../utils/sliceAnsi.js';
5
+ import { reorderBidi } from './bidi.js';
6
+ import { unionRect } from './layout/geometry.js';
7
+ import { blitRegion, extractHyperlinkFromStyles, filterOutHyperlinkStyles, markNoSelectRegion, OSC8_PREFIX, resetScreen, setCellAt, shiftRows, } from './screen.js';
8
+ import { stringWidth } from './stringWidth.js';
9
+ import { widestLine } from './widest-line.js';
10
+ /**
11
+ * charCache bounds. The entry-count cap alone was not enough: a streaming
12
+ * line produces a NEW cache key on every frame, and each entry's cost is
13
+ * proportional to the line length (one object per character, plus the key
14
+ * string itself). A 16384-entry cache of 80KB-line entries is tens of GB —
15
+ * the process OOMs long before reaching the count cap. Two extra guards:
16
+ *
17
+ * 1. Lines longer than MAX_CACHEABLE_LINE are never cached. During
18
+ * streaming the growing last line changes every frame, so a cached
19
+ * entry would be used for exactly one frame — pure cost, zero hits.
20
+ * Long lines are also rare in settled transcripts (minified code,
21
+ * base64, URLs), so skipping them barely affects the hit rate.
22
+ * 2. A byte budget (total characters of cached keys) caps retained
23
+ * memory regardless of the entry size distribution.
24
+ *
25
+ * Keys are detached from their parent string before caching: a line
26
+ * sliced out of a large streaming buffer is a V8 SlicedString that pins
27
+ * the whole parent, turning one 200-char entry into a 100KB retention.
28
+ */
29
+ const MAX_CACHEABLE_LINE = 500;
30
+ const CHAR_CACHE_MAX_ENTRIES = 16384;
31
+ const CHAR_CACHE_MAX_CHARS = 100_000;
32
+ /** Copy a string into a fresh flat string with no parent references. */
33
+ function detachString(s) {
34
+ // Buffer round-trip guarantees a newly allocated flat string; cheaper
35
+ // tricks (' '+s).slice(1) are optimized back into SlicedStrings by V8.
36
+ return Buffer.from(s, 'utf8').toString('utf8');
37
+ }
38
+ /**
39
+ * Bounded cache of line → clustered characters. Enforces all three guards
40
+ * (line-length threshold, entry count, byte budget) at insertion time, so
41
+ * no caller can accidentally grow it unboundedly.
42
+ */
43
+ export class CharCache {
44
+ map = new Map();
45
+ chars = 0;
46
+ /**
47
+ * Return the cached clustered characters for a line, if present.
48
+ * @param line - the line to look up.
49
+ * @returns the cached characters, or undefined on a miss.
50
+ */
51
+ get(line) {
52
+ return this.map.get(line);
53
+ }
54
+ /**
55
+ * Cache clustered characters for a line, enforcing the cache bounds.
56
+ * @param line - the line key.
57
+ * @param characters - the clustered characters to cache.
58
+ */
59
+ set(line, characters) {
60
+ if (line.length > MAX_CACHEABLE_LINE)
61
+ return;
62
+ if (this.map.size >= CHAR_CACHE_MAX_ENTRIES ||
63
+ this.chars + line.length > CHAR_CACHE_MAX_CHARS) {
64
+ this.map.clear();
65
+ this.chars = 0;
66
+ }
67
+ this.map.set(detachString(line), characters);
68
+ this.chars += line.length;
69
+ }
70
+ /** Retained-key character total, exposed for diagnostics/tests. */
71
+ get retainedChars() {
72
+ return this.chars;
73
+ }
74
+ /** Number of cached line entries. */
75
+ get size() {
76
+ return this.map.size;
77
+ }
78
+ }
79
+ /**
80
+ * Intersect two clips. `undefined` on an axis means unbounded; the other
81
+ * clip's bound wins. If both are bounded, take the tighter constraint
82
+ * (max of mins, min of maxes). If the resulting region is empty
83
+ * (x1 >= x2 or y1 >= y2), writes clipped by it will be dropped.
84
+ */
85
+ function intersectClip(parent, child) {
86
+ if (!parent)
87
+ return child;
88
+ return {
89
+ x1: maxDefined(parent.x1, child.x1),
90
+ x2: minDefined(parent.x2, child.x2),
91
+ y1: maxDefined(parent.y1, child.y1),
92
+ y2: minDefined(parent.y2, child.y2),
93
+ };
94
+ }
95
+ function maxDefined(a, b) {
96
+ if (a === undefined)
97
+ return b;
98
+ if (b === undefined)
99
+ return a;
100
+ return Math.max(a, b);
101
+ }
102
+ function minDefined(a, b) {
103
+ if (a === undefined)
104
+ return b;
105
+ if (b === undefined)
106
+ return a;
107
+ return Math.min(a, b);
108
+ }
109
+ /**
110
+ * Collects write/blit/clear/clip operations from the render tree, then
111
+ * applies them to a Screen buffer in get(). The Screen is what gets
112
+ * diffed against the previous frame to produce terminal updates.
113
+ */
114
+ export default class Output {
115
+ /** Screen width in columns. */
116
+ width;
117
+ /** Screen height in rows. */
118
+ height;
119
+ stylePool;
120
+ screen;
121
+ operations = [];
122
+ charCache = new CharCache();
123
+ constructor(options) {
124
+ const { width, height, stylePool, screen } = options;
125
+ this.width = width;
126
+ this.height = height;
127
+ this.stylePool = stylePool;
128
+ this.screen = screen;
129
+ resetScreen(screen, width, height);
130
+ }
131
+ /**
132
+ * Reuse this Output for a new frame. Zeroes the screen buffer, clears
133
+ * the operation list (backing storage is retained), and caps charCache
134
+ * growth. Preserving charCache across frames is the main win — most
135
+ * lines don't change between renders, so tokenize + grapheme clustering
136
+ * becomes a cache hit.
137
+ * @param width - the new screen width in columns.
138
+ * @param height - the new screen height in rows.
139
+ * @param screen - the screen buffer to render into.
140
+ */
141
+ reset(width, height, screen) {
142
+ this.width = width;
143
+ this.height = height;
144
+ this.screen = screen;
145
+ this.operations.length = 0;
146
+ resetScreen(screen, width, height);
147
+ // Bounds are enforced at insertion time (CharCache.set); nothing to
148
+ // do here. The cache intentionally survives frames — most lines don't
149
+ // change between renders, so tokenize + clustering becomes a hit.
150
+ }
151
+ /**
152
+ * Copy cells from a source screen region (blit = block image transfer).
153
+ * @param src - the source screen.
154
+ * @param x - the destination left column.
155
+ * @param y - the destination top row.
156
+ * @param width - the region width in columns.
157
+ * @param height - the region height in rows.
158
+ */
159
+ blit(src, x, y, width, height) {
160
+ this.operations.push({ type: 'blit', src, x, y, width, height });
161
+ }
162
+ /**
163
+ * Shift full-width rows within [top, bottom] by n. n > 0 = up. Mirrors
164
+ * what DECSTBM + SU/SD does to the terminal. Paired with blit() to reuse
165
+ * prevScreen content during pure scroll, avoiding full child re-render.
166
+ * @param top - the first row of the shift region.
167
+ * @param bottom - the last row of the shift region.
168
+ * @param n - the shift amount; positive moves content up.
169
+ */
170
+ shift(top, bottom, n) {
171
+ this.operations.push({ type: 'shift', top, bottom, n });
172
+ }
173
+ /**
174
+ * Clear a region by writing empty cells. Used when a node shrinks to
175
+ * ensure stale content from the previous frame is removed.
176
+ * @param region - the region to clear.
177
+ * @param fromAbsolute - whether the clear is for an absolute-positioned node's old bounds.
178
+ */
179
+ clear(region, fromAbsolute) {
180
+ this.operations.push({ type: 'clear', region, fromAbsolute });
181
+ }
182
+ /**
183
+ * Mark a region as non-selectable (excluded from fullscreen text
184
+ * selection copy + highlight). Used by <NoSelect> to fence off
185
+ * gutters (line numbers, diff sigils). Applied AFTER blit/write so
186
+ * the mark wins regardless of what's blitted into the region.
187
+ * @param region - the region to mark.
188
+ */
189
+ noSelect(region) {
190
+ this.operations.push({ type: 'noSelect', region });
191
+ }
192
+ /**
193
+ * Queue a text write at a position, split across lines on newlines.
194
+ * @param x - the left column.
195
+ * @param y - the top row.
196
+ * @param text - the text to write.
197
+ * @param softWrap - per-line soft-wrap flags parallel to text.split('\n').
198
+ */
199
+ write(x, y, text, softWrap) {
200
+ if (!text) {
201
+ return;
202
+ }
203
+ this.operations.push({
204
+ type: 'write',
205
+ x,
206
+ y,
207
+ text,
208
+ softWrap,
209
+ });
210
+ }
211
+ /**
212
+ * Push a clip region; subsequent writes are restricted to it.
213
+ * @param clip - the clip region to apply.
214
+ */
215
+ clip(clip) {
216
+ this.operations.push({
217
+ type: 'clip',
218
+ clip,
219
+ });
220
+ }
221
+ /** Pop the most recent clip region. */
222
+ unclip() {
223
+ this.operations.push({
224
+ type: 'unclip',
225
+ });
226
+ }
227
+ /**
228
+ * Apply all queued operations to the screen buffer and return it.
229
+ * @returns the rendered screen, diffable against the previous frame.
230
+ */
231
+ get() {
232
+ const screen = this.screen;
233
+ const screenWidth = this.width;
234
+ const screenHeight = this.height;
235
+ // Track blit vs write cell counts for debugging
236
+ let blitCells = 0;
237
+ let writeCells = 0;
238
+ // Pass 1: expand damage to cover clear regions. The buffer is freshly
239
+ // zeroed by resetScreen, so this pass only marks damage so diff()
240
+ // checks these regions against the previous frame.
241
+ //
242
+ // Also collect clears from absolute-positioned nodes. An absolute
243
+ // node overlays normal-flow siblings; when it shrinks, its clear is
244
+ // pushed AFTER those siblings' clean-subtree blits (DOM order). The
245
+ // blit copies the absolute node's own stale paint from prevScreen,
246
+ // and since clear is damage-only, the ghost survives diff. Normal-
247
+ // flow clears don't need this — a normal-flow node's old position
248
+ // can't have been painted on top of a sibling's current position.
249
+ const absoluteClears = [];
250
+ for (const operation of this.operations) {
251
+ if (operation.type !== 'clear')
252
+ continue;
253
+ const { x, y, width, height } = operation.region;
254
+ const startX = Math.max(0, x);
255
+ const startY = Math.max(0, y);
256
+ const maxX = Math.min(x + width, screenWidth);
257
+ const maxY = Math.min(y + height, screenHeight);
258
+ if (startX >= maxX || startY >= maxY)
259
+ continue;
260
+ const rect = {
261
+ x: startX,
262
+ y: startY,
263
+ width: maxX - startX,
264
+ height: maxY - startY,
265
+ };
266
+ screen.damage = screen.damage ? unionRect(screen.damage, rect) : rect;
267
+ if (operation.fromAbsolute)
268
+ absoluteClears.push(rect);
269
+ }
270
+ const clips = [];
271
+ for (const operation of this.operations) {
272
+ switch (operation.type) {
273
+ case 'clear':
274
+ // handled in pass 1
275
+ continue;
276
+ case 'clip':
277
+ // Intersect with the parent clip (if any) so nested
278
+ // overflow:hidden boxes can't write outside their ancestor's
279
+ // clip region. Without this, a message with overflow:hidden at
280
+ // the bottom of a scrollbox pushes its OWN clip (based on its
281
+ // layout bounds, already translated by -scrollTop) which can
282
+ // extend below the scrollbox viewport — writes escape into
283
+ // the sibling bottom section's rows.
284
+ clips.push(intersectClip(clips.at(-1), operation.clip));
285
+ continue;
286
+ case 'unclip':
287
+ clips.pop();
288
+ continue;
289
+ case 'blit': {
290
+ // Bulk-copy cells from source screen region using TypedArray.set().
291
+ // Tracking damage ensures diff() checks blitted cells for stale content
292
+ // when a parent blits an area that previously contained child content.
293
+ const { src, x: regionX, y: regionY, width: regionWidth, height: regionHeight, } = operation;
294
+ // Intersect with active clip — a child's clean-blit passes its full
295
+ // cached rect, but the parent ScrollBox may have shrunk (pill mount).
296
+ // Without this, the blit writes past the ScrollBox's new bottom edge
297
+ // into the pill's row.
298
+ const clip = clips.at(-1);
299
+ const startX = Math.max(regionX, clip?.x1 ?? 0);
300
+ const startY = Math.max(regionY, clip?.y1 ?? 0);
301
+ const maxY = Math.min(regionY + regionHeight, screenHeight, src.height, clip?.y2 ?? Infinity);
302
+ const maxX = Math.min(regionX + regionWidth, screenWidth, src.width, clip?.x2 ?? Infinity);
303
+ if (startX >= maxX || startY >= maxY)
304
+ continue;
305
+ // Skip rows covered by an absolute-positioned node's clear.
306
+ // Absolute nodes overlay normal-flow siblings, so prevScreen in
307
+ // that region holds the absolute node's stale paint — blitting
308
+ // it back would ghost. See absoluteClears collection above.
309
+ if (absoluteClears.length === 0) {
310
+ blitRegion(screen, src, startX, startY, maxX, maxY);
311
+ blitCells += (maxY - startY) * (maxX - startX);
312
+ continue;
313
+ }
314
+ let rowStart = startY;
315
+ for (let row = startY; row <= maxY; row++) {
316
+ const excluded = row < maxY &&
317
+ absoluteClears.some(r => row >= r.y &&
318
+ row < r.y + r.height &&
319
+ startX >= r.x &&
320
+ maxX <= r.x + r.width);
321
+ if (excluded || row === maxY) {
322
+ if (row > rowStart) {
323
+ blitRegion(screen, src, startX, rowStart, maxX, row);
324
+ blitCells += (row - rowStart) * (maxX - startX);
325
+ }
326
+ rowStart = row + 1;
327
+ }
328
+ }
329
+ continue;
330
+ }
331
+ case 'shift': {
332
+ shiftRows(screen, operation.top, operation.bottom, operation.n);
333
+ continue;
334
+ }
335
+ case 'write': {
336
+ const { text, softWrap } = operation;
337
+ let { x, y } = operation;
338
+ let lines = text.split('\n');
339
+ let swFrom = 0;
340
+ let prevContentEnd = 0;
341
+ const clip = clips.at(-1);
342
+ if (clip) {
343
+ const clipHorizontally = typeof clip?.x1 === 'number' && typeof clip?.x2 === 'number';
344
+ const clipVertically = typeof clip?.y1 === 'number' && typeof clip?.y2 === 'number';
345
+ // If text is positioned outside of clipping area altogether,
346
+ // skip to the next operation to avoid unnecessary calculations
347
+ if (clipHorizontally) {
348
+ const width = widestLine(text);
349
+ if (x + width <= clip.x1 || x >= clip.x2) {
350
+ continue;
351
+ }
352
+ }
353
+ if (clipVertically) {
354
+ const height = lines.length;
355
+ if (y + height <= clip.y1 || y >= clip.y2) {
356
+ continue;
357
+ }
358
+ }
359
+ if (clipHorizontally) {
360
+ lines = lines.map(line => {
361
+ const from = x < clip.x1 ? clip.x1 - x : 0;
362
+ const width = stringWidth(line);
363
+ const to = x + width > clip.x2 ? clip.x2 - x : width;
364
+ let sliced = sliceAnsi(line, from, to);
365
+ // Wide chars (CJK, emoji) occupy 2 cells. When `to` lands
366
+ // on the first cell of a wide char, sliceAnsi includes the
367
+ // entire glyph and the result overflows clip.x2 by one cell,
368
+ // writing a SpacerTail into the adjacent sibling. Re-slice
369
+ // one cell earlier; wide chars are exactly 2 cells, so a
370
+ // single retry always fits.
371
+ if (stringWidth(sliced) > to - from) {
372
+ sliced = sliceAnsi(line, from, to - 1);
373
+ }
374
+ return sliced;
375
+ });
376
+ if (x < clip.x1) {
377
+ x = clip.x1;
378
+ }
379
+ }
380
+ if (clipVertically) {
381
+ const from = y < clip.y1 ? clip.y1 - y : 0;
382
+ const height = lines.length;
383
+ const to = y + height > clip.y2 ? clip.y2 - y : height;
384
+ // If the first visible line is a soft-wrap continuation, we
385
+ // need the clipped previous line's content end so
386
+ // screen.softWrap[lineY] correctly records the join point
387
+ // even though that line's cells were never written.
388
+ if (softWrap && from > 0 && softWrap[from] === true) {
389
+ prevContentEnd = x + stringWidth(lines[from - 1]);
390
+ }
391
+ lines = lines.slice(from, to);
392
+ swFrom = from;
393
+ if (y < clip.y1) {
394
+ y = clip.y1;
395
+ }
396
+ }
397
+ }
398
+ const swBits = screen.softWrap;
399
+ let offsetY = 0;
400
+ for (const line of lines) {
401
+ const lineY = y + offsetY;
402
+ // Line can be outside screen if `text` is taller than screen height
403
+ if (lineY >= screenHeight) {
404
+ break;
405
+ }
406
+ const contentEnd = writeLineToScreen(screen, line, x, lineY, screenWidth, this.stylePool, this.charCache);
407
+ writeCells += contentEnd - x;
408
+ // See Screen.softWrap docstring for the encoding. contentEnd
409
+ // from writeLineToScreen is tab-expansion-aware, unlike
410
+ // x+stringWidth(line) which treats tabs as width 0.
411
+ if (softWrap) {
412
+ const isSW = softWrap[swFrom + offsetY] === true;
413
+ swBits[lineY] = isSW ? prevContentEnd : 0;
414
+ prevContentEnd = contentEnd;
415
+ }
416
+ offsetY++;
417
+ }
418
+ continue;
419
+ }
420
+ }
421
+ }
422
+ // noSelect ops go LAST so they win over blits (which copy noSelect
423
+ // from prevScreen) and writes (which don't touch noSelect). This way
424
+ // a <NoSelect> box correctly fences its region even when the parent
425
+ // blits, and moving a <NoSelect> between frames correctly clears the
426
+ // old region (resetScreen already zeroed the bitmap).
427
+ for (const operation of this.operations) {
428
+ if (operation.type === 'noSelect') {
429
+ const { x, y, width, height } = operation.region;
430
+ markNoSelectRegion(screen, x, y, width, height);
431
+ }
432
+ }
433
+ // Log blit/write ratio for debugging - high write count suggests blitting isn't working
434
+ const totalCells = blitCells + writeCells;
435
+ if (totalCells > 1000 && writeCells > blitCells) {
436
+ logForDebugging(`High write ratio: blit=${blitCells}, write=${writeCells} (${((writeCells / totalCells) * 100).toFixed(1)}% writes), screen=${screenHeight}x${screenWidth}`);
437
+ }
438
+ return screen;
439
+ }
440
+ }
441
+ function stylesEqual(a, b) {
442
+ if (a === b)
443
+ return true; // Reference equality fast path
444
+ const len = a.length;
445
+ if (len !== b.length)
446
+ return false;
447
+ if (len === 0)
448
+ return true; // Both empty
449
+ for (let i = 0; i < len; i++) {
450
+ if (a[i].code !== b[i].code)
451
+ return false;
452
+ }
453
+ return true;
454
+ }
455
+ /**
456
+ * Convert a string with ANSI codes into styled characters with proper grapheme
457
+ * clustering. Fixes ansi-tokenize splitting grapheme clusters (like family
458
+ * emojis) into individual code points.
459
+ *
460
+ * Also precomputes styleId + hyperlink per style run (not per char) — an
461
+ * 80-char line with 3 style runs does 3 intern calls instead of 80.
462
+ */
463
+ function styledCharsWithGraphemeClustering(chars, stylePool) {
464
+ const charCount = chars.length;
465
+ if (charCount === 0)
466
+ return [];
467
+ const result = [];
468
+ const bufferChars = [];
469
+ let bufferStyles = chars[0].styles;
470
+ for (let i = 0; i < charCount; i++) {
471
+ const char = chars[i];
472
+ const styles = char.styles;
473
+ // Different styles means we need to flush and start new buffer
474
+ if (bufferChars.length > 0 && !stylesEqual(styles, bufferStyles)) {
475
+ flushBuffer(bufferChars.join(''), bufferStyles, stylePool, result);
476
+ bufferChars.length = 0;
477
+ }
478
+ bufferChars.push(char.value);
479
+ bufferStyles = styles;
480
+ }
481
+ // Final flush
482
+ if (bufferChars.length > 0) {
483
+ flushBuffer(bufferChars.join(''), bufferStyles, stylePool, result);
484
+ }
485
+ return result;
486
+ }
487
+ function flushBuffer(buffer, styles, stylePool, out) {
488
+ // Compute styleId + hyperlink ONCE for the whole style run.
489
+ // Every grapheme in this buffer shares the same styles.
490
+ //
491
+ // Extract and track hyperlinks separately, filter from styles.
492
+ // Always check for OSC 8 codes to filter, not just when a URL is
493
+ // extracted. The tokenizer treats OSC 8 close codes (empty URL) as
494
+ // active styles, so they must be filtered even when no hyperlink
495
+ // URL is present.
496
+ const hyperlink = extractHyperlinkFromStyles(styles) ?? undefined;
497
+ const hasOsc8Styles = hyperlink !== undefined ||
498
+ styles.some(s => s.code.length >= OSC8_PREFIX.length && s.code.startsWith(OSC8_PREFIX));
499
+ const filteredStyles = hasOsc8Styles
500
+ ? filterOutHyperlinkStyles(styles)
501
+ : styles;
502
+ const styleId = stylePool.intern(filteredStyles);
503
+ for (const { segment: grapheme } of getGraphemeSegmenter().segment(buffer)) {
504
+ out.push({
505
+ value: grapheme,
506
+ width: stringWidth(grapheme),
507
+ styleId,
508
+ hyperlink,
509
+ });
510
+ }
511
+ }
512
+ /**
513
+ * Write a single line's characters into the screen buffer.
514
+ * Extracted from Output.get() so JSC can optimize this tight,
515
+ * monomorphic loop independently — better register allocation,
516
+ * setCellAt inlining, and type feedback than when buried inside
517
+ * a 300-line dispatch function.
518
+ *
519
+ * Returns the end column (x + visual width, including tab expansion) so
520
+ * the caller can record it in screen.softWrap without re-walking the
521
+ * line via stringWidth(). Caller computes the debug cell-count as end-x.
522
+ */
523
+ function writeLineToScreen(screen, line, x, y, screenWidth, stylePool, charCache) {
524
+ let characters = charCache.get(line);
525
+ if (!characters) {
526
+ characters = reorderBidi(styledCharsWithGraphemeClustering(styledCharsFromTokens(tokenize(line)), stylePool));
527
+ charCache.set(line, characters);
528
+ }
529
+ let offsetX = x;
530
+ for (let charIdx = 0; charIdx < characters.length; charIdx++) {
531
+ const character = characters[charIdx];
532
+ const codePoint = character.value.codePointAt(0);
533
+ // Handle C0 control characters (0x00-0x1F) that cause cursor movement
534
+ // mismatches. stringWidth treats these as width 0, but terminals may
535
+ // move the cursor differently.
536
+ if (codePoint !== undefined && codePoint <= 0x1f) {
537
+ // Tab (0x09): expand to spaces to reach next tab stop
538
+ if (codePoint === 0x09) {
539
+ const tabWidth = 8;
540
+ const spacesToNextStop = tabWidth - (offsetX % tabWidth);
541
+ for (let i = 0; i < spacesToNextStop && offsetX < screenWidth; i++) {
542
+ setCellAt(screen, offsetX, y, {
543
+ char: ' ',
544
+ styleId: stylePool.none,
545
+ width: 0 /* CellWidth.Narrow */,
546
+ hyperlink: undefined,
547
+ });
548
+ offsetX++;
549
+ }
550
+ }
551
+ // ESC (0x1B): skip incomplete escape sequences that ansi-tokenize
552
+ // didn't recognize. ansi-tokenize only parses SGR sequences (ESC[...m)
553
+ // and OSC 8 hyperlinks (ESC]8;;url BEL). Other sequences like cursor
554
+ // movement, screen clearing, or terminal title become individual char
555
+ // tokens that we need to skip here.
556
+ else if (codePoint === 0x1b) {
557
+ const nextChar = characters[charIdx + 1]?.value;
558
+ const nextCode = nextChar?.codePointAt(0);
559
+ if (nextChar === '(' ||
560
+ nextChar === ')' ||
561
+ nextChar === '*' ||
562
+ nextChar === '+') {
563
+ // Charset selection: ESC ( X, ESC ) X, etc.
564
+ // Skip the intermediate char and the charset designator
565
+ charIdx += 2;
566
+ }
567
+ else if (nextChar === '[') {
568
+ // CSI sequence: ESC [ ... final-byte
569
+ // Final byte is in range 0x40-0x7E (@, A-Z, [\]^_`, a-z, {|}~)
570
+ // Examples: ESC[2J (clear), ESC[?25l (cursor hide), ESC[H (home)
571
+ charIdx++; // skip the [
572
+ while (charIdx < characters.length - 1) {
573
+ charIdx++;
574
+ const c = characters[charIdx]?.value.codePointAt(0);
575
+ // Final byte terminates the sequence
576
+ if (c !== undefined && c >= 0x40 && c <= 0x7e) {
577
+ break;
578
+ }
579
+ }
580
+ }
581
+ else if (nextChar === ']' ||
582
+ nextChar === 'P' ||
583
+ nextChar === '_' ||
584
+ nextChar === '^' ||
585
+ nextChar === 'X') {
586
+ // String-based sequences terminated by BEL (0x07) or ST (ESC \):
587
+ // - OSC: ESC ] ... (Operating System Command)
588
+ // - DCS: ESC P ... (Device Control String)
589
+ // - APC: ESC _ ... (Application Program Command)
590
+ // - PM: ESC ^ ... (Privacy Message)
591
+ // - SOS: ESC X ... (Start of String)
592
+ charIdx++; // skip the introducer char
593
+ while (charIdx < characters.length - 1) {
594
+ charIdx++;
595
+ const c = characters[charIdx]?.value;
596
+ // BEL (0x07) terminates the sequence
597
+ if (c === '\x07') {
598
+ break;
599
+ }
600
+ // ST (String Terminator) is ESC \
601
+ // When we see ESC, check if next char is backslash
602
+ if (c === '\x1b') {
603
+ const nextC = characters[charIdx + 1]?.value;
604
+ if (nextC === '\\') {
605
+ charIdx++; // skip the backslash too
606
+ break;
607
+ }
608
+ }
609
+ }
610
+ }
611
+ else if (nextCode !== undefined &&
612
+ nextCode >= 0x30 &&
613
+ nextCode <= 0x7e) {
614
+ // Single-character escape sequences: ESC followed by 0x30-0x7E
615
+ // (excluding the multi-char introducers already handled above)
616
+ // - Fp range (0x30-0x3F): ESC 7 (save cursor), ESC 8 (restore)
617
+ // - Fe range (0x40-0x5F): ESC D (index), ESC M (reverse index)
618
+ // - Fs range (0x60-0x7E): ESC c (reset)
619
+ charIdx++; // skip the command char
620
+ }
621
+ }
622
+ // Carriage return (0x0D): would move cursor to column 0, skip it
623
+ // Backspace (0x08): would move cursor left, skip it
624
+ // Bell (0x07), vertical tab (0x0B), form feed (0x0C): skip
625
+ // All other control chars (0x00-0x06, 0x0E-0x1F): skip
626
+ // Note: newline (0x0A) is already handled by line splitting
627
+ continue;
628
+ }
629
+ // Zero-width characters (combining marks, ZWNJ, ZWS, etc.)
630
+ // don't occupy terminal cells — storing them as Narrow cells
631
+ // desyncs the virtual cursor from the real terminal cursor.
632
+ // Width was computed once during clustering (cached via charCache).
633
+ const charWidth = character.width;
634
+ if (charWidth === 0) {
635
+ continue;
636
+ }
637
+ const isWideCharacter = charWidth >= 2;
638
+ // Wide char at last column can't fit — terminal would wrap it to
639
+ // the next line, desyncing our cursor model. Place a SpacerHead
640
+ // to mark the blank column, matching terminal behavior.
641
+ if (isWideCharacter && offsetX + 2 > screenWidth) {
642
+ setCellAt(screen, offsetX, y, {
643
+ char: ' ',
644
+ styleId: stylePool.none,
645
+ width: 3 /* CellWidth.SpacerHead */,
646
+ hyperlink: undefined,
647
+ });
648
+ offsetX++;
649
+ continue;
650
+ }
651
+ // styleId + hyperlink were precomputed during clustering (once per
652
+ // style run, cached via charCache). Hot loop is now just property
653
+ // reads — no intern, no extract, no filter per frame.
654
+ setCellAt(screen, offsetX, y, {
655
+ char: character.value,
656
+ styleId: character.styleId,
657
+ width: isWideCharacter ? 1 /* CellWidth.Wide */ : 0 /* CellWidth.Narrow */,
658
+ hyperlink: character.hyperlink,
659
+ });
660
+ offsetX += isWideCharacter ? 2 : 1;
661
+ }
662
+ return offsetX;
663
+ }