@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,208 @@
1
+ /**
2
+ * OSC (Operating System Command) Types and Parser
3
+ */
4
+ import type { Action, Color, TabStatusAction } from './types.js';
5
+ /** OSC introducer prefix: ESC followed by `]`. */
6
+ export declare const OSC_PREFIX: string;
7
+ /** String Terminator (ESC \) - alternative to BEL for terminating OSC */
8
+ export declare const ST: string;
9
+ /**
10
+ * Generate an OSC sequence: ESC ] p1;p2;...;pN <terminator>.
11
+ * Uses the ST terminator for Kitty (avoids beeps) and BEL for others.
12
+ * @param parts - the sequence parts, joined by semicolons.
13
+ * @returns the complete OSC sequence string.
14
+ */
15
+ export declare function osc(...parts: (string | number)[]): string;
16
+ /**
17
+ * Wrap an escape sequence for terminal multiplexer passthrough.
18
+ * tmux and GNU screen intercept escape sequences; DCS passthrough
19
+ * tunnels them to the outer terminal unmodified.
20
+ *
21
+ * tmux 3.3+ gates this behind `allow-passthrough` (default off). When off,
22
+ * tmux silently drops the whole DCS — no junk, no worse than unwrapped OSC.
23
+ * Users who want passthrough set it in their .tmux.conf; we don't mutate it.
24
+ *
25
+ * Do NOT wrap BEL: raw \x07 triggers tmux's bell-action (window flag);
26
+ * wrapped \x07 is opaque DCS payload and tmux never sees the bell.
27
+ * @param sequence - the escape sequence to wrap.
28
+ * @returns the DCS-passthrough-wrapped sequence inside tmux or GNU screen,
29
+ * or the sequence unchanged otherwise.
30
+ */
31
+ export declare function wrapForMultiplexer(sequence: string): string;
32
+ /**
33
+ * Which path setClipboard() will take, based on env state. Synchronous so
34
+ * callers can show an honest toast without awaiting the copy itself.
35
+ *
36
+ * - 'native': pbcopy (or equivalent) will run — high-confidence system
37
+ * clipboard write. tmux buffer may also be loaded as a bonus.
38
+ * - 'tmux-buffer': tmux load-buffer will run, but no native tool — paste
39
+ * with prefix+] works. System clipboard depends on tmux's set-clipboard
40
+ * option + outer terminal OSC 52 support; can't know from here.
41
+ * - 'osc52': only the raw OSC 52 sequence will be written to stdout.
42
+ * Best-effort; iTerm2 disables OSC 52 by default.
43
+ *
44
+ * pbcopy gating uses SSH_CONNECTION specifically, not SSH_TTY — tmux panes
45
+ * inherit SSH_TTY forever even after local reattach, but SSH_CONNECTION is
46
+ * in tmux's default update-environment set and gets cleared.
47
+ */
48
+ export type ClipboardPath = 'native' | 'tmux-buffer' | 'osc52';
49
+ /**
50
+ * Determine the clipboard path setClipboard() will take, based on env state.
51
+ * @returns 'native' when a local clipboard tool is available, 'tmux-buffer'
52
+ * inside tmux, or 'osc52' otherwise.
53
+ */
54
+ export declare function getClipboardPath(): ClipboardPath;
55
+ /**
56
+ * Load text into tmux's paste buffer via `tmux load-buffer`.
57
+ * -w (tmux 3.2+) propagates to the outer terminal's clipboard via tmux's
58
+ * own OSC 52 emission. -w is dropped for iTerm2: tmux's OSC 52 emission
59
+ * crashes the iTerm2 session over SSH.
60
+ *
61
+ * @param text - the text to load into the tmux paste buffer.
62
+ * @returns true when the buffer was loaded successfully, false when not in
63
+ * tmux or the tmux command failed.
64
+ */
65
+ export declare function tmuxLoadBuffer(text: string): Promise<boolean>;
66
+ /**
67
+ * OSC 52 clipboard write: ESC ] 52 ; c ; <base64> BEL/ST
68
+ * 'c' selects the clipboard (vs 'p' for primary selection on X11).
69
+ *
70
+ * When inside tmux ($TMUX set), `tmux load-buffer -w -` is the primary
71
+ * path. tmux's buffer is always reachable — works over SSH, survives
72
+ * detach/reattach, immune to stale env vars. The -w flag (tmux 3.2+) tells
73
+ * tmux to also propagate to the outer terminal via its own OSC 52 path,
74
+ * which tmux wraps correctly for the attached client. On older tmux, -w is
75
+ * ignored and the buffer is still loaded. -w is dropped for iTerm2 (#22432)
76
+ * because tmux's own OSC 52 emission (empty selection param: ESC]52;;b64)
77
+ * crashes iTerm2 over SSH.
78
+ *
79
+ * After load-buffer succeeds, we ALSO return a DCS-passthrough-wrapped
80
+ * OSC 52 for the caller to write to stdout. Our sequence uses explicit `c`
81
+ * (not tmux's crashy empty-param variant), so it sidesteps the #22432 path.
82
+ * With `allow-passthrough on` + an OSC-52-capable outer terminal, selection
83
+ * reaches the system clipboard; with either off, tmux silently drops the
84
+ * DCS and prefix+] still works. See Greg Smith's "free pony" in
85
+ * https://anthropic.slack.com/archives/C07VBSHV7EV/p1773177228548119.
86
+ *
87
+ * If load-buffer fails entirely, fall through to raw OSC 52.
88
+ *
89
+ * Outside tmux, write raw OSC 52 to stdout (caller handles the write).
90
+ *
91
+ * Local (no SSH_CONNECTION): also shell out to a native clipboard utility.
92
+ * OSC 52 and tmux -w both depend on terminal settings — iTerm2 disables
93
+ * OSC 52 by default, VS Code shows a permission prompt on first use. Native
94
+ * utilities (pbcopy/wl-copy/xclip/xsel/clip.exe) always work locally. Over
95
+ * SSH these would write to the remote clipboard — OSC 52 is the right path there.
96
+ *
97
+ * @param text - the text to place on the clipboard.
98
+ * @returns the sequence for the caller to write to stdout (raw OSC 52
99
+ * outside tmux, DCS-wrapped inside).
100
+ */
101
+ export declare function setClipboard(text: string): Promise<string>;
102
+ /**
103
+ * Reset the cached Linux clipboard tool probe, forcing the next copy to
104
+ * re-probe wl-copy/xclip/xsel.
105
+ * @internal test-only
106
+ */
107
+ export declare function _resetLinuxCopyCache(): void;
108
+ /**
109
+ * OSC command numbers
110
+ */
111
+ export declare const OSC: {
112
+ readonly SET_TITLE_AND_ICON: 0;
113
+ readonly SET_ICON: 1;
114
+ readonly SET_TITLE: 2;
115
+ readonly SET_COLOR: 4;
116
+ readonly SET_CWD: 7;
117
+ readonly HYPERLINK: 8;
118
+ readonly ITERM2: 9;
119
+ readonly SET_FG_COLOR: 10;
120
+ readonly SET_BG_COLOR: 11;
121
+ readonly SET_CURSOR_COLOR: 12;
122
+ readonly CLIPBOARD: 52;
123
+ readonly KITTY: 99;
124
+ readonly RESET_COLOR: 104;
125
+ readonly RESET_FG_COLOR: 110;
126
+ readonly RESET_BG_COLOR: 111;
127
+ readonly RESET_CURSOR_COLOR: 112;
128
+ readonly SEMANTIC_PROMPT: 133;
129
+ readonly GHOSTTY: 777;
130
+ readonly TAB_STATUS: 21337;
131
+ };
132
+ /**
133
+ * Parse an OSC sequence into an action.
134
+ *
135
+ * @param content - The sequence content (without ESC ] and terminator).
136
+ * @returns the parsed action; unrecognized commands yield an
137
+ * unknown-sequence action.
138
+ */
139
+ export declare function parseOSC(content: string): Action | null;
140
+ /**
141
+ * Parse an XParseColor-style color spec into an RGB Color.
142
+ * Accepts `#RRGGBB` and `rgb:R/G/B` (1–4 hex digits per component, scaled
143
+ * to 8-bit). Returns null on parse failure.
144
+ * @param spec - the color spec string to parse.
145
+ * @returns the parsed RGB color, or null when the spec does not match.
146
+ */
147
+ export declare function parseOscColor(spec: string): Color | null;
148
+ /**
149
+ * Start a hyperlink (OSC 8). Auto-assigns an id= param derived from the URL
150
+ * so terminals group wrapped lines of the same link together (the spec says
151
+ * cells with matching URI *and* nonempty id are joined; without an id each
152
+ * wrapped line is a separate link — inconsistent hover, partial tooltips).
153
+ * Empty url = close sequence (empty params per spec).
154
+ * @param url - the link target URL; an empty string emits the close sequence.
155
+ * @param params - optional OSC 8 parameters, merged over the auto-assigned id.
156
+ * @returns the OSC 8 sequence.
157
+ */
158
+ export declare function link(url: string, params?: Record<string, string>): string;
159
+ /** End a hyperlink (OSC 8) */
160
+ export declare const LINK_END: string;
161
+ /** iTerm2 OSC 9 subcommand numbers */
162
+ export declare const ITERM2: {
163
+ readonly NOTIFY: 0;
164
+ readonly BADGE: 2;
165
+ readonly PROGRESS: 4;
166
+ };
167
+ /** Progress operation codes (for use with ITERM2.PROGRESS) */
168
+ export declare const PROGRESS: {
169
+ readonly CLEAR: 0;
170
+ readonly SET: 1;
171
+ readonly ERROR: 2;
172
+ readonly INDETERMINATE: 3;
173
+ };
174
+ /**
175
+ * Clear iTerm2 progress bar sequence (OSC 9;4;0;BEL)
176
+ * Uses BEL terminator since this is for cleanup (not runtime notification)
177
+ * and we want to ensure it's always sent regardless of terminal type.
178
+ */
179
+ export declare const CLEAR_ITERM2_PROGRESS: string;
180
+ /**
181
+ * Clear terminal title sequence (OSC 0 with empty string + BEL).
182
+ * Uses BEL terminator for cleanup — safe on all terminals.
183
+ */
184
+ export declare const CLEAR_TERMINAL_TITLE: string;
185
+ /** Clear all three OSC 21337 tab-status fields. Used on exit. */
186
+ export declare const CLEAR_TAB_STATUS: string;
187
+ /**
188
+ * Gate for emitting OSC 21337 (tab-status indicator). Ant-only while the
189
+ * spec is unstable. Terminals that don't recognize it discard silently, so
190
+ * emission is safe unconditionally — we don't gate on terminal detection
191
+ * since support is expected across several terminals.
192
+ *
193
+ * Callers must wrap output with wrapForMultiplexer() so tmux/screen
194
+ * DCS-passthrough carries the sequence to the outer terminal.
195
+ * @returns true when the current user is Ant, the only environment emitting
196
+ * OSC 21337 today.
197
+ */
198
+ export declare function supportsTabStatus(): boolean;
199
+ /**
200
+ * Emit an OSC 21337 tab-status sequence. Omitted fields are left unchanged
201
+ * by the receiving terminal; `null` sends an empty value to clear.
202
+ * `;` and `\` in status text are escaped per the spec.
203
+ * @param fields - the tab-status fields to emit; omitted fields are left
204
+ * unchanged by the terminal, null values clear the field.
205
+ * @returns the OSC 21337 sequence.
206
+ */
207
+ export declare function tabStatus(fields: TabStatusAction): string;
208
+ //# sourceMappingURL=osc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osc.d.ts","sourceRoot":"","sources":["../../../../src/ink/termio/osc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE,kDAAkD;AAClD,eAAO,MAAM,UAAU,QAA0C,CAAA;AAEjE,yEAAyE;AACzE,eAAO,MAAM,EAAE,QAAa,CAAA;AAE5B;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAGzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAA;AAE9D;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD;AAYD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhE;AA+DD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;CAoBN,CAAA;AAEV;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsDvD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAyBxD;AAwDD;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAOzE;AASD,8BAA8B;AAC9B,eAAO,MAAM,QAAQ,QAA6B,CAAA;AAIlD,sCAAsC;AACtC,eAAO,MAAM,MAAM;;;;CAIT,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,QAAQ;;;;;CAKX,CAAA;AAEV;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAA2E,CAAA;AAE7G;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAkD,CAAA;AAEnF,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,QAG5B,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiBzD"}
@@ -0,0 +1,466 @@
1
+ /**
2
+ * OSC (Operating System Command) Types and Parser
3
+ */
4
+ import { Buffer } from 'buffer';
5
+ import { env } from '../../utils/env.js';
6
+ import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
7
+ import { BEL, ESC, ESC_TYPE, SEP } from './ansi.js';
8
+ /** OSC introducer prefix: ESC followed by `]`. */
9
+ export const OSC_PREFIX = ESC + String.fromCharCode(ESC_TYPE.OSC);
10
+ /** String Terminator (ESC \) - alternative to BEL for terminating OSC */
11
+ export const ST = ESC + '\\';
12
+ /**
13
+ * Generate an OSC sequence: ESC ] p1;p2;...;pN <terminator>.
14
+ * Uses the ST terminator for Kitty (avoids beeps) and BEL for others.
15
+ * @param parts - the sequence parts, joined by semicolons.
16
+ * @returns the complete OSC sequence string.
17
+ */
18
+ export function osc(...parts) {
19
+ const terminator = env.terminal === 'kitty' ? ST : BEL;
20
+ return `${OSC_PREFIX}${parts.join(SEP)}${terminator}`;
21
+ }
22
+ /**
23
+ * Wrap an escape sequence for terminal multiplexer passthrough.
24
+ * tmux and GNU screen intercept escape sequences; DCS passthrough
25
+ * tunnels them to the outer terminal unmodified.
26
+ *
27
+ * tmux 3.3+ gates this behind `allow-passthrough` (default off). When off,
28
+ * tmux silently drops the whole DCS — no junk, no worse than unwrapped OSC.
29
+ * Users who want passthrough set it in their .tmux.conf; we don't mutate it.
30
+ *
31
+ * Do NOT wrap BEL: raw \x07 triggers tmux's bell-action (window flag);
32
+ * wrapped \x07 is opaque DCS payload and tmux never sees the bell.
33
+ * @param sequence - the escape sequence to wrap.
34
+ * @returns the DCS-passthrough-wrapped sequence inside tmux or GNU screen,
35
+ * or the sequence unchanged otherwise.
36
+ */
37
+ export function wrapForMultiplexer(sequence) {
38
+ if (process.env['TMUX']) {
39
+ const escaped = sequence.replaceAll('\x1b', '\x1b\x1b');
40
+ return `\x1bPtmux;${escaped}\x1b\\`;
41
+ }
42
+ if (process.env['STY']) {
43
+ return `\x1bP${sequence}\x1b\\`;
44
+ }
45
+ return sequence;
46
+ }
47
+ /**
48
+ * Determine the clipboard path setClipboard() will take, based on env state.
49
+ * @returns 'native' when a local clipboard tool is available, 'tmux-buffer'
50
+ * inside tmux, or 'osc52' otherwise.
51
+ */
52
+ export function getClipboardPath() {
53
+ const nativeAvailable = process.platform === 'darwin' && !process.env['SSH_CONNECTION'];
54
+ if (nativeAvailable)
55
+ return 'native';
56
+ if (process.env['TMUX'])
57
+ return 'tmux-buffer';
58
+ return 'osc52';
59
+ }
60
+ /**
61
+ * Wrap a payload in tmux's DCS passthrough: ESC P tmux ; <payload> ESC \
62
+ * tmux forwards the payload to the outer terminal, bypassing its own parser.
63
+ * Inner ESCs must be doubled. Requires `set -g allow-passthrough on` in
64
+ * ~/.tmux.conf; without it, tmux silently drops the whole DCS (no regression).
65
+ */
66
+ function tmuxPassthrough(payload) {
67
+ return `${ESC}Ptmux;${payload.replaceAll(ESC, ESC + ESC)}${ST}`;
68
+ }
69
+ /**
70
+ * Load text into tmux's paste buffer via `tmux load-buffer`.
71
+ * -w (tmux 3.2+) propagates to the outer terminal's clipboard via tmux's
72
+ * own OSC 52 emission. -w is dropped for iTerm2: tmux's OSC 52 emission
73
+ * crashes the iTerm2 session over SSH.
74
+ *
75
+ * @param text - the text to load into the tmux paste buffer.
76
+ * @returns true when the buffer was loaded successfully, false when not in
77
+ * tmux or the tmux command failed.
78
+ */
79
+ export async function tmuxLoadBuffer(text) {
80
+ if (!process.env['TMUX'])
81
+ return false;
82
+ const args = process.env['LC_TERMINAL'] === 'iTerm2'
83
+ ? ['load-buffer', '-']
84
+ : ['load-buffer', '-w', '-'];
85
+ const { code } = await execFileNoThrow('tmux', args, {
86
+ input: text,
87
+ useCwd: false,
88
+ timeout: 2000,
89
+ });
90
+ return code === 0;
91
+ }
92
+ /**
93
+ * OSC 52 clipboard write: ESC ] 52 ; c ; <base64> BEL/ST
94
+ * 'c' selects the clipboard (vs 'p' for primary selection on X11).
95
+ *
96
+ * When inside tmux ($TMUX set), `tmux load-buffer -w -` is the primary
97
+ * path. tmux's buffer is always reachable — works over SSH, survives
98
+ * detach/reattach, immune to stale env vars. The -w flag (tmux 3.2+) tells
99
+ * tmux to also propagate to the outer terminal via its own OSC 52 path,
100
+ * which tmux wraps correctly for the attached client. On older tmux, -w is
101
+ * ignored and the buffer is still loaded. -w is dropped for iTerm2 (#22432)
102
+ * because tmux's own OSC 52 emission (empty selection param: ESC]52;;b64)
103
+ * crashes iTerm2 over SSH.
104
+ *
105
+ * After load-buffer succeeds, we ALSO return a DCS-passthrough-wrapped
106
+ * OSC 52 for the caller to write to stdout. Our sequence uses explicit `c`
107
+ * (not tmux's crashy empty-param variant), so it sidesteps the #22432 path.
108
+ * With `allow-passthrough on` + an OSC-52-capable outer terminal, selection
109
+ * reaches the system clipboard; with either off, tmux silently drops the
110
+ * DCS and prefix+] still works. See Greg Smith's "free pony" in
111
+ * https://anthropic.slack.com/archives/C07VBSHV7EV/p1773177228548119.
112
+ *
113
+ * If load-buffer fails entirely, fall through to raw OSC 52.
114
+ *
115
+ * Outside tmux, write raw OSC 52 to stdout (caller handles the write).
116
+ *
117
+ * Local (no SSH_CONNECTION): also shell out to a native clipboard utility.
118
+ * OSC 52 and tmux -w both depend on terminal settings — iTerm2 disables
119
+ * OSC 52 by default, VS Code shows a permission prompt on first use. Native
120
+ * utilities (pbcopy/wl-copy/xclip/xsel/clip.exe) always work locally. Over
121
+ * SSH these would write to the remote clipboard — OSC 52 is the right path there.
122
+ *
123
+ * @param text - the text to place on the clipboard.
124
+ * @returns the sequence for the caller to write to stdout (raw OSC 52
125
+ * outside tmux, DCS-wrapped inside).
126
+ */
127
+ export async function setClipboard(text) {
128
+ const b64 = Buffer.from(text, 'utf8').toString('base64');
129
+ const raw = osc(OSC.CLIPBOARD, 'c', b64);
130
+ // Native safety net — fire FIRST, before the tmux await, so a quick
131
+ // focus-switch after selecting doesn't race pbcopy. Previously this ran
132
+ // AFTER awaiting tmux load-buffer, adding ~50-100ms of subprocess latency
133
+ // before pbcopy even started — fast cmd+tab → paste would beat it
134
+ // (https://anthropic.slack.com/archives/C07VBSHV7EV/p1773943921788829).
135
+ // Gated on SSH_CONNECTION (not SSH_TTY) since tmux panes inherit SSH_TTY
136
+ // forever but SSH_CONNECTION is in tmux's default update-environment and
137
+ // clears on local attach. Fire-and-forget.
138
+ if (!process.env['SSH_CONNECTION'])
139
+ copyNative(text);
140
+ const tmuxBufferLoaded = await tmuxLoadBuffer(text);
141
+ // Inner OSC uses BEL directly (not osc()) — ST's ESC would need doubling
142
+ // too, and BEL works everywhere for OSC 52.
143
+ if (tmuxBufferLoaded)
144
+ return tmuxPassthrough(`${ESC}]52;c;${b64}${BEL}`);
145
+ return raw;
146
+ }
147
+ // Linux clipboard tool: undefined = not yet probed, null = none available.
148
+ // Probe order: wl-copy (Wayland) → xclip (X11) → xsel (X11 fallback).
149
+ // Cached after first attempt so repeated mouse-ups skip the probe chain.
150
+ let linuxCopy;
151
+ /**
152
+ * Shell out to a native clipboard utility as a safety net for OSC 52.
153
+ * Only called when not in an SSH session (over SSH, these would write to
154
+ * the remote machine's clipboard — OSC 52 is the right path there).
155
+ * Fire-and-forget: failures are silent since OSC 52 may have succeeded.
156
+ */
157
+ function copyNative(text) {
158
+ const opts = { input: text, useCwd: false, timeout: 2000 };
159
+ switch (process.platform) {
160
+ case 'darwin':
161
+ void execFileNoThrow('pbcopy', [], opts);
162
+ return;
163
+ case 'linux': {
164
+ if (linuxCopy === null)
165
+ return;
166
+ if (linuxCopy === 'wl-copy') {
167
+ void execFileNoThrow('wl-copy', [], opts);
168
+ return;
169
+ }
170
+ if (linuxCopy === 'xclip') {
171
+ void execFileNoThrow('xclip', ['-selection', 'clipboard'], opts);
172
+ return;
173
+ }
174
+ if (linuxCopy === 'xsel') {
175
+ void execFileNoThrow('xsel', ['--clipboard', '--input'], opts);
176
+ return;
177
+ }
178
+ // First call: probe wl-copy (Wayland) then xclip/xsel (X11), cache winner.
179
+ void execFileNoThrow('wl-copy', [], opts).then(r => {
180
+ if (r.code === 0) {
181
+ linuxCopy = 'wl-copy';
182
+ return;
183
+ }
184
+ void execFileNoThrow('xclip', ['-selection', 'clipboard'], opts).then(r2 => {
185
+ if (r2.code === 0) {
186
+ linuxCopy = 'xclip';
187
+ return;
188
+ }
189
+ void execFileNoThrow('xsel', ['--clipboard', '--input'], opts).then(r3 => {
190
+ linuxCopy = r3.code === 0 ? 'xsel' : null;
191
+ });
192
+ });
193
+ });
194
+ return;
195
+ }
196
+ case 'win32':
197
+ // clip.exe is always available on Windows. Unicode handling is
198
+ // imperfect (system locale encoding) but good enough for a fallback.
199
+ void execFileNoThrow('clip', [], opts);
200
+ return;
201
+ }
202
+ }
203
+ /**
204
+ * Reset the cached Linux clipboard tool probe, forcing the next copy to
205
+ * re-probe wl-copy/xclip/xsel.
206
+ * @internal test-only
207
+ */
208
+ export function _resetLinuxCopyCache() {
209
+ linuxCopy = undefined;
210
+ }
211
+ /**
212
+ * OSC command numbers
213
+ */
214
+ export const OSC = {
215
+ SET_TITLE_AND_ICON: 0,
216
+ SET_ICON: 1,
217
+ SET_TITLE: 2,
218
+ SET_COLOR: 4,
219
+ SET_CWD: 7,
220
+ HYPERLINK: 8,
221
+ ITERM2: 9, // iTerm2 proprietary sequences
222
+ SET_FG_COLOR: 10,
223
+ SET_BG_COLOR: 11,
224
+ SET_CURSOR_COLOR: 12,
225
+ CLIPBOARD: 52,
226
+ KITTY: 99, // Kitty notification protocol
227
+ RESET_COLOR: 104,
228
+ RESET_FG_COLOR: 110,
229
+ RESET_BG_COLOR: 111,
230
+ RESET_CURSOR_COLOR: 112,
231
+ SEMANTIC_PROMPT: 133,
232
+ GHOSTTY: 777, // Ghostty notification protocol
233
+ TAB_STATUS: 21337, // Tab status extension
234
+ };
235
+ /**
236
+ * Parse an OSC sequence into an action.
237
+ *
238
+ * @param content - The sequence content (without ESC ] and terminator).
239
+ * @returns the parsed action; unrecognized commands yield an
240
+ * unknown-sequence action.
241
+ */
242
+ export function parseOSC(content) {
243
+ const semicolonIdx = content.indexOf(';');
244
+ const command = semicolonIdx >= 0 ? content.slice(0, semicolonIdx) : content;
245
+ const data = semicolonIdx >= 0 ? content.slice(semicolonIdx + 1) : '';
246
+ const commandNum = parseInt(command, 10);
247
+ // Window/icon title
248
+ if (commandNum === OSC.SET_TITLE_AND_ICON) {
249
+ return { type: 'title', action: { type: 'both', title: data } };
250
+ }
251
+ if (commandNum === OSC.SET_ICON) {
252
+ return { type: 'title', action: { type: 'iconName', name: data } };
253
+ }
254
+ if (commandNum === OSC.SET_TITLE) {
255
+ return { type: 'title', action: { type: 'windowTitle', title: data } };
256
+ }
257
+ // Hyperlinks (OSC 8)
258
+ if (commandNum === OSC.HYPERLINK) {
259
+ const parts = data.split(';');
260
+ const paramsStr = parts[0] ?? '';
261
+ const url = parts.slice(1).join(';');
262
+ if (url === '') {
263
+ return { type: 'link', action: { type: 'end' } };
264
+ }
265
+ const params = {};
266
+ if (paramsStr) {
267
+ for (const pair of paramsStr.split(':')) {
268
+ const eqIdx = pair.indexOf('=');
269
+ if (eqIdx >= 0) {
270
+ params[pair.slice(0, eqIdx)] = pair.slice(eqIdx + 1);
271
+ }
272
+ }
273
+ }
274
+ return {
275
+ type: 'link',
276
+ action: {
277
+ type: 'start',
278
+ url,
279
+ params: Object.keys(params).length > 0 ? params : undefined,
280
+ },
281
+ };
282
+ }
283
+ // Tab status (OSC 21337)
284
+ if (commandNum === OSC.TAB_STATUS) {
285
+ return { type: 'tabStatus', action: parseTabStatus(data) };
286
+ }
287
+ return { type: 'unknown', sequence: `\x1b]${content}` };
288
+ }
289
+ /**
290
+ * Parse an XParseColor-style color spec into an RGB Color.
291
+ * Accepts `#RRGGBB` and `rgb:R/G/B` (1–4 hex digits per component, scaled
292
+ * to 8-bit). Returns null on parse failure.
293
+ * @param spec - the color spec string to parse.
294
+ * @returns the parsed RGB color, or null when the spec does not match.
295
+ */
296
+ export function parseOscColor(spec) {
297
+ const hex = spec.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
298
+ if (hex) {
299
+ return {
300
+ type: 'rgb',
301
+ r: parseInt(hex[1], 16),
302
+ g: parseInt(hex[2], 16),
303
+ b: parseInt(hex[3], 16),
304
+ };
305
+ }
306
+ const rgb = spec.match(/^rgb:([0-9a-f]{1,4})\/([0-9a-f]{1,4})\/([0-9a-f]{1,4})$/i);
307
+ if (rgb) {
308
+ // XParseColor: N hex digits → value / (16^N - 1), scale to 0-255
309
+ const scale = (s) => Math.round((parseInt(s, 16) / (16 ** s.length - 1)) * 255);
310
+ return {
311
+ type: 'rgb',
312
+ r: scale(rgb[1]),
313
+ g: scale(rgb[2]),
314
+ b: scale(rgb[3]),
315
+ };
316
+ }
317
+ return null;
318
+ }
319
+ /**
320
+ * Parse OSC 21337 payload: `key=value;key=value;...` with `\;` and `\\`
321
+ * escapes inside values. Bare key or `key=` clears that field; unknown
322
+ * keys are ignored.
323
+ */
324
+ function parseTabStatus(data) {
325
+ const action = {};
326
+ for (const [key, value] of splitTabStatusPairs(data)) {
327
+ switch (key) {
328
+ case 'indicator':
329
+ action.indicator = value === '' ? null : parseOscColor(value);
330
+ break;
331
+ case 'status':
332
+ action.status = value === '' ? null : value;
333
+ break;
334
+ case 'status-color':
335
+ action.statusColor = value === '' ? null : parseOscColor(value);
336
+ break;
337
+ }
338
+ }
339
+ return action;
340
+ }
341
+ /** Split `k=v;k=v` honoring `\;` and `\\` escapes. Yields [key, unescapedValue]. */
342
+ function* splitTabStatusPairs(data) {
343
+ let key = '';
344
+ let val = '';
345
+ let inVal = false;
346
+ let esc = false;
347
+ for (const c of data) {
348
+ if (esc) {
349
+ if (inVal)
350
+ val += c;
351
+ else
352
+ key += c;
353
+ esc = false;
354
+ }
355
+ else if (c === '\\') {
356
+ esc = true;
357
+ }
358
+ else if (c === ';') {
359
+ yield [key, val];
360
+ key = '';
361
+ val = '';
362
+ inVal = false;
363
+ }
364
+ else if (c === '=' && !inVal) {
365
+ inVal = true;
366
+ }
367
+ else if (inVal) {
368
+ val += c;
369
+ }
370
+ else {
371
+ key += c;
372
+ }
373
+ }
374
+ if (key || inVal)
375
+ yield [key, val];
376
+ }
377
+ // Output generators
378
+ /**
379
+ * Start a hyperlink (OSC 8). Auto-assigns an id= param derived from the URL
380
+ * so terminals group wrapped lines of the same link together (the spec says
381
+ * cells with matching URI *and* nonempty id are joined; without an id each
382
+ * wrapped line is a separate link — inconsistent hover, partial tooltips).
383
+ * Empty url = close sequence (empty params per spec).
384
+ * @param url - the link target URL; an empty string emits the close sequence.
385
+ * @param params - optional OSC 8 parameters, merged over the auto-assigned id.
386
+ * @returns the OSC 8 sequence.
387
+ */
388
+ export function link(url, params) {
389
+ if (!url)
390
+ return LINK_END;
391
+ const p = { id: osc8Id(url), ...params };
392
+ const paramStr = Object.entries(p)
393
+ .map(([k, v]) => `${k}=${v}`)
394
+ .join(':');
395
+ return osc(OSC.HYPERLINK, paramStr, url);
396
+ }
397
+ function osc8Id(url) {
398
+ let h = 0;
399
+ for (let i = 0; i < url.length; i++)
400
+ h = ((h << 5) - h + url.charCodeAt(i)) | 0;
401
+ return (h >>> 0).toString(36);
402
+ }
403
+ /** End a hyperlink (OSC 8) */
404
+ export const LINK_END = osc(OSC.HYPERLINK, '', '');
405
+ // iTerm2 OSC 9 subcommands
406
+ /** iTerm2 OSC 9 subcommand numbers */
407
+ export const ITERM2 = {
408
+ NOTIFY: 0,
409
+ BADGE: 2,
410
+ PROGRESS: 4,
411
+ };
412
+ /** Progress operation codes (for use with ITERM2.PROGRESS) */
413
+ export const PROGRESS = {
414
+ CLEAR: 0,
415
+ SET: 1,
416
+ ERROR: 2,
417
+ INDETERMINATE: 3,
418
+ };
419
+ /**
420
+ * Clear iTerm2 progress bar sequence (OSC 9;4;0;BEL)
421
+ * Uses BEL terminator since this is for cleanup (not runtime notification)
422
+ * and we want to ensure it's always sent regardless of terminal type.
423
+ */
424
+ export const CLEAR_ITERM2_PROGRESS = `${OSC_PREFIX}${OSC.ITERM2};${ITERM2.PROGRESS};${PROGRESS.CLEAR};${BEL}`;
425
+ /**
426
+ * Clear terminal title sequence (OSC 0 with empty string + BEL).
427
+ * Uses BEL terminator for cleanup — safe on all terminals.
428
+ */
429
+ export const CLEAR_TERMINAL_TITLE = `${OSC_PREFIX}${OSC.SET_TITLE_AND_ICON};${BEL}`;
430
+ /** Clear all three OSC 21337 tab-status fields. Used on exit. */
431
+ export const CLEAR_TAB_STATUS = osc(OSC.TAB_STATUS, 'indicator=;status=;status-color=');
432
+ /**
433
+ * Gate for emitting OSC 21337 (tab-status indicator). Ant-only while the
434
+ * spec is unstable. Terminals that don't recognize it discard silently, so
435
+ * emission is safe unconditionally — we don't gate on terminal detection
436
+ * since support is expected across several terminals.
437
+ *
438
+ * Callers must wrap output with wrapForMultiplexer() so tmux/screen
439
+ * DCS-passthrough carries the sequence to the outer terminal.
440
+ * @returns true when the current user is Ant, the only environment emitting
441
+ * OSC 21337 today.
442
+ */
443
+ export function supportsTabStatus() {
444
+ return process.env.USER_TYPE === 'ant';
445
+ }
446
+ /**
447
+ * Emit an OSC 21337 tab-status sequence. Omitted fields are left unchanged
448
+ * by the receiving terminal; `null` sends an empty value to clear.
449
+ * `;` and `\` in status text are escaped per the spec.
450
+ * @param fields - the tab-status fields to emit; omitted fields are left
451
+ * unchanged by the terminal, null values clear the field.
452
+ * @returns the OSC 21337 sequence.
453
+ */
454
+ export function tabStatus(fields) {
455
+ const parts = [];
456
+ const rgb = (c) => c.type === 'rgb'
457
+ ? `#${[c.r, c.g, c.b].map(n => n.toString(16).padStart(2, '0')).join('')}`
458
+ : '';
459
+ if ('indicator' in fields)
460
+ parts.push(`indicator=${fields.indicator ? rgb(fields.indicator) : ''}`);
461
+ if ('status' in fields)
462
+ parts.push(`status=${fields.status?.replaceAll('\\', '\\\\').replaceAll(';', '\\;') ?? ''}`);
463
+ if ('statusColor' in fields)
464
+ parts.push(`status-color=${fields.statusColor ? rgb(fields.statusColor) : ''}`);
465
+ return osc(OSC.TAB_STATUS, parts.join(';'));
466
+ }