thaddeus 1.0.26 → 1.0.28

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 (2082) hide show
  1. package/package.json +14 -5
  2. package/src/QueryEngine.js +926 -0
  3. package/src/Task.js +49 -0
  4. package/src/Tool.js +61 -0
  5. package/src/assistant/gate.js +5 -0
  6. package/src/assistant/index.js +106 -0
  7. package/src/assistant/sessionHistory.js +145 -0
  8. package/src/bootstrap/state.js +1163 -0
  9. package/src/bridge/bridgeApi.js +304 -0
  10. package/src/bridge/bridgeConfig.js +39 -0
  11. package/src/bridge/bridgeDebug.js +73 -0
  12. package/src/bridge/bridgeEnabled.js +185 -0
  13. package/src/bridge/bridgeMain.js +2289 -0
  14. package/src/bridge/bridgeMessaging.js +353 -0
  15. package/src/bridge/bridgePermissionCallbacks.js +10 -0
  16. package/src/bridge/bridgePointer.js +175 -0
  17. package/src/bridge/bridgeStatusUtil.js +105 -0
  18. package/src/bridge/bridgeUI.js +411 -0
  19. package/src/bridge/capacityWake.js +35 -0
  20. package/src/bridge/codeSessionApi.js +111 -0
  21. package/src/bridge/createSession.js +273 -0
  22. package/src/bridge/debugUtils.js +115 -0
  23. package/src/bridge/envLessBridgeConfig.js +120 -0
  24. package/src/bridge/flushGate.js +65 -0
  25. package/src/bridge/inboundAttachments.js +152 -0
  26. package/src/bridge/inboundMessages.js +63 -0
  27. package/src/bridge/initReplBridge.js +431 -0
  28. package/src/bridge/jwtUtils.js +185 -0
  29. package/src/bridge/peerSessions.js +5 -0
  30. package/src/bridge/pollConfig.js +85 -0
  31. package/src/bridge/pollConfigDefaults.js +62 -0
  32. package/src/bridge/remoteBridgeCore.js +712 -0
  33. package/src/bridge/replBridge.js +1719 -0
  34. package/src/bridge/replBridgeHandle.js +30 -0
  35. package/src/bridge/replBridgeTransport.js +236 -0
  36. package/src/bridge/sessionIdCompat.js +56 -0
  37. package/src/bridge/sessionRunner.js +421 -0
  38. package/src/bridge/trustedDevice.js +170 -0
  39. package/src/bridge/types.js +9 -0
  40. package/src/bridge/webhookSanitizer.js +6 -0
  41. package/src/bridge/workSecret.js +99 -0
  42. package/src/buddy/CompanionSprite.js +348 -0
  43. package/src/buddy/companion.js +107 -0
  44. package/src/buddy/prompt.js +33 -0
  45. package/src/buddy/sprites.js +488 -0
  46. package/src/buddy/types.js +90 -0
  47. package/src/buddy/useBuddyNotification.js +85 -0
  48. package/src/cli/bg.js +17 -0
  49. package/src/cli/exit.js +30 -0
  50. package/src/cli/handlers/agents.js +55 -0
  51. package/src/cli/handlers/auth.js +249 -0
  52. package/src/cli/handlers/autoMode.js +128 -0
  53. package/src/cli/handlers/mcp.js +335 -0
  54. package/src/cli/handlers/plugins.js +634 -0
  55. package/src/cli/handlers/templateJobs.js +19 -0
  56. package/src/cli/handlers/util.js +76 -0
  57. package/src/cli/ndjsonSafeStringify.js +27 -0
  58. package/src/cli/print.js +4294 -0
  59. package/src/cli/remoteIO.js +208 -0
  60. package/src/cli/structuredIO.js +644 -0
  61. package/src/cli/transports/HybridTransport.js +233 -0
  62. package/src/cli/transports/SSETransport.js +538 -0
  63. package/src/cli/transports/SerialBatchEventUploader.js +224 -0
  64. package/src/cli/transports/WebSocketTransport.js +613 -0
  65. package/src/cli/transports/WorkerStateUploader.js +88 -0
  66. package/src/cli/transports/ccrClient.js +711 -0
  67. package/src/cli/transports/transportUtils.js +39 -0
  68. package/src/cli/update.js +314 -0
  69. package/src/commandCenter/launch.js +39 -0
  70. package/src/commandCenter/phoneApi.js +168 -0
  71. package/src/commandCenter/phoneStore.js +159 -0
  72. package/src/commandCenter/reactorBus.js +130 -0
  73. package/src/commandCenter/server.js +288 -0
  74. package/src/commandCenter/server.ts +42 -7
  75. package/src/commandCenter/tunnel.js +199 -0
  76. package/src/commands/add-dir/add-dir.js +121 -0
  77. package/src/commands/add-dir/index.js +8 -0
  78. package/src/commands/add-dir/validation.js +76 -0
  79. package/src/commands/advisor.js +88 -0
  80. package/src/commands/agents/agents.js +10 -0
  81. package/src/commands/agents/index.js +7 -0
  82. package/src/commands/agents-platform/index.js +2 -0
  83. package/src/commands/assistant/index.js +86 -0
  84. package/src/commands/backup/index.js +31 -0
  85. package/src/commands/branch/branch.js +205 -0
  86. package/src/commands/branch/index.js +11 -0
  87. package/src/commands/bridge/bridge.js +513 -0
  88. package/src/commands/bridge/index.js +22 -0
  89. package/src/commands/bridge-kick.js +179 -0
  90. package/src/commands/brief.js +89 -0
  91. package/src/commands/btw/btw.js +235 -0
  92. package/src/commands/btw/index.js +9 -0
  93. package/src/commands/buddy/buddy.js +100 -0
  94. package/src/commands/buddy/index.js +11 -0
  95. package/src/commands/chrome/chrome.js +291 -0
  96. package/src/commands/chrome/index.js +10 -0
  97. package/src/commands/clear/caches.js +116 -0
  98. package/src/commands/clear/clear.js +5 -0
  99. package/src/commands/clear/conversation.js +189 -0
  100. package/src/commands/clear/index.js +9 -0
  101. package/src/commands/color/color.js +58 -0
  102. package/src/commands/color/index.js +9 -0
  103. package/src/commands/commit-push-pr.js +137 -0
  104. package/src/commands/commit.js +80 -0
  105. package/src/commands/compact/compact.js +194 -0
  106. package/src/commands/compact/index.js +11 -0
  107. package/src/commands/config/config.js +6 -0
  108. package/src/commands/config/index.js +8 -0
  109. package/src/commands/context/context-noninteractive.js +219 -0
  110. package/src/commands/context/context.js +45 -0
  111. package/src/commands/context/index.js +21 -0
  112. package/src/commands/coordinator.js +34 -0
  113. package/src/commands/copy/copy.js +366 -0
  114. package/src/commands/copy/index.js +7 -0
  115. package/src/commands/cost/cost.js +21 -0
  116. package/src/commands/cost/index.js +16 -0
  117. package/src/commands/createMovedToPluginCommand.js +33 -0
  118. package/src/commands/desktop/desktop.js +6 -0
  119. package/src/commands/desktop/index.js +22 -0
  120. package/src/commands/diff/diff.js +6 -0
  121. package/src/commands/diff/index.js +6 -0
  122. package/src/commands/doctor/doctor.js +6 -0
  123. package/src/commands/doctor/index.js +9 -0
  124. package/src/commands/effort/effort.js +166 -0
  125. package/src/commands/effort/index.js +11 -0
  126. package/src/commands/exit/exit.js +32 -0
  127. package/src/commands/exit/index.js +9 -0
  128. package/src/commands/export/export.js +87 -0
  129. package/src/commands/export/index.js +8 -0
  130. package/src/commands/extra-usage/extra-usage-core.js +99 -0
  131. package/src/commands/extra-usage/extra-usage-noninteractive.js +13 -0
  132. package/src/commands/extra-usage/extra-usage.js +15 -0
  133. package/src/commands/extra-usage/index.js +29 -0
  134. package/src/commands/fast/fast.js +276 -0
  135. package/src/commands/fast/index.js +19 -0
  136. package/src/commands/feedback/feedback.js +11 -0
  137. package/src/commands/feedback/index.js +20 -0
  138. package/src/commands/files/files.js +11 -0
  139. package/src/commands/files/index.js +9 -0
  140. package/src/commands/force-snip.js +19 -0
  141. package/src/commands/fork/index.js +67 -0
  142. package/src/commands/heapdump/heapdump.js +14 -0
  143. package/src/commands/heapdump/index.js +9 -0
  144. package/src/commands/help/help.js +6 -0
  145. package/src/commands/help/index.js +7 -0
  146. package/src/commands/hooks/hooks.js +12 -0
  147. package/src/commands/hooks/index.js +8 -0
  148. package/src/commands/ide/ide.js +615 -0
  149. package/src/commands/ide/index.js +8 -0
  150. package/src/commands/init-verifiers.js +258 -0
  151. package/src/commands/init.js +248 -0
  152. package/src/commands/insights.js +2554 -0
  153. package/src/commands/install-github-app/ApiKeyStep.js +230 -0
  154. package/src/commands/install-github-app/CheckExistingSecretStep.js +194 -0
  155. package/src/commands/install-github-app/CheckGitHubStep.js +16 -0
  156. package/src/commands/install-github-app/ChooseRepoStep.js +211 -0
  157. package/src/commands/install-github-app/CreatingStep.js +53 -0
  158. package/src/commands/install-github-app/ErrorStep.js +84 -0
  159. package/src/commands/install-github-app/ExistingWorkflowStep.js +105 -0
  160. package/src/commands/install-github-app/InstallAppStep.js +97 -0
  161. package/src/commands/install-github-app/OAuthFlowStep.js +190 -0
  162. package/src/commands/install-github-app/SuccessStep.js +94 -0
  163. package/src/commands/install-github-app/WarningsStep.js +71 -0
  164. package/src/commands/install-github-app/index.js +10 -0
  165. package/src/commands/install-github-app/install-github-app.js +593 -0
  166. package/src/commands/install-github-app/setupGitHubActions.js +227 -0
  167. package/src/commands/install-slack-app/index.js +9 -0
  168. package/src/commands/install-slack-app/install-slack-app.js +25 -0
  169. package/src/commands/install.js +198 -0
  170. package/src/commands/keybindings/index.js +10 -0
  171. package/src/commands/keybindings/keybindings.js +47 -0
  172. package/src/commands/login/index.js +21 -0
  173. package/src/commands/login/login.js +135 -0
  174. package/src/commands/logout/index.js +11 -0
  175. package/src/commands/logout/logout.js +75 -0
  176. package/src/commands/mcp/addCommand.js +183 -0
  177. package/src/commands/mcp/index.js +9 -0
  178. package/src/commands/mcp/mcp.js +78 -0
  179. package/src/commands/mcp/xaaIdpCommand.js +193 -0
  180. package/src/commands/memories/index.js +9 -0
  181. package/src/commands/memories/index.ts +12 -0
  182. package/src/commands/memories/memories.tsx +949 -0
  183. package/src/commands/memory/index.js +7 -0
  184. package/src/commands/memory/memory.js +71 -0
  185. package/src/commands/mobile/index.js +9 -0
  186. package/src/commands/mobile/mobile.js +279 -0
  187. package/src/commands/model/index.js +14 -0
  188. package/src/commands/model/model.js +284 -0
  189. package/src/commands/output-style/index.js +8 -0
  190. package/src/commands/output-style/output-style.js +6 -0
  191. package/src/commands/passes/index.js +17 -0
  192. package/src/commands/passes/passes.js +23 -0
  193. package/src/commands/peers/index.js +68 -0
  194. package/src/commands/permissions/index.js +8 -0
  195. package/src/commands/permissions/permissions.js +9 -0
  196. package/src/commands/plan/index.js +8 -0
  197. package/src/commands/plan/plan.js +116 -0
  198. package/src/commands/plugin/AddMarketplace.js +96 -0
  199. package/src/commands/plugin/BrowseMarketplace.js +582 -0
  200. package/src/commands/plugin/DiscoverPlugins.js +613 -0
  201. package/src/commands/plugin/ManageMarketplaces.js +583 -0
  202. package/src/commands/plugin/ManagePlugins.js +1783 -0
  203. package/src/commands/plugin/PluginErrors.js +124 -0
  204. package/src/commands/plugin/PluginOptionsDialog.js +367 -0
  205. package/src/commands/plugin/PluginOptionsFlow.js +97 -0
  206. package/src/commands/plugin/PluginSettings.js +1041 -0
  207. package/src/commands/plugin/PluginTrustWarning.js +35 -0
  208. package/src/commands/plugin/UnifiedInstalledCell.js +616 -0
  209. package/src/commands/plugin/ValidatePlugin.js +96 -0
  210. package/src/commands/plugin/index.js +10 -0
  211. package/src/commands/plugin/parseArgs.js +71 -0
  212. package/src/commands/plugin/plugin.js +6 -0
  213. package/src/commands/plugin/pluginDetailsHelpers.js +95 -0
  214. package/src/commands/plugin/usePagination.js +89 -0
  215. package/src/commands/pr_comments/index.js +49 -0
  216. package/src/commands/privacy-settings/index.js +11 -0
  217. package/src/commands/privacy-settings/privacy-settings.js +55 -0
  218. package/src/commands/proactive.js +29 -0
  219. package/src/commands/rate-limit-options/index.js +15 -0
  220. package/src/commands/rate-limit-options/rate-limit-options.js +213 -0
  221. package/src/commands/release-notes/index.js +8 -0
  222. package/src/commands/release-notes/release-notes.js +38 -0
  223. package/src/commands/reload-plugins/index.js +11 -0
  224. package/src/commands/reload-plugins/reload-plugins.js +52 -0
  225. package/src/commands/remote-env/index.js +12 -0
  226. package/src/commands/remote-env/remote-env.js +6 -0
  227. package/src/commands/remote-setup/api.js +155 -0
  228. package/src/commands/remote-setup/index.js +15 -0
  229. package/src/commands/remote-setup/remote-setup.js +150 -0
  230. package/src/commands/remoteControlServer/index.js +58 -0
  231. package/src/commands/rename/generateSessionName.js +58 -0
  232. package/src/commands/rename/index.js +9 -0
  233. package/src/commands/rename/rename.js +52 -0
  234. package/src/commands/resume/index.js +9 -0
  235. package/src/commands/resume/resume.js +239 -0
  236. package/src/commands/review/UltrareviewOverageDialog.js +97 -0
  237. package/src/commands/review/reviewRemote.js +259 -0
  238. package/src/commands/review/ultrareviewCommand.js +58 -0
  239. package/src/commands/review/ultrareviewEnabled.js +10 -0
  240. package/src/commands/review.js +53 -0
  241. package/src/commands/rewind/index.js +10 -0
  242. package/src/commands/rewind/rewind.js +7 -0
  243. package/src/commands/sandbox-toggle/index.js +41 -0
  244. package/src/commands/sandbox-toggle/sandbox-toggle.js +73 -0
  245. package/src/commands/security-review.js +231 -0
  246. package/src/commands/session/index.js +13 -0
  247. package/src/commands/session/session.js +143 -0
  248. package/src/commands/skills/index.js +7 -0
  249. package/src/commands/skills/skills.js +6 -0
  250. package/src/commands/speak.js +21 -0
  251. package/src/commands/start-business.js +1575 -0
  252. package/src/commands/start-business.ts +1581 -0
  253. package/src/commands/stats/index.js +7 -0
  254. package/src/commands/stats/stats.js +6 -0
  255. package/src/commands/status/index.js +8 -0
  256. package/src/commands/status/status.js +6 -0
  257. package/src/commands/statusline.js +22 -0
  258. package/src/commands/stickers/index.js +8 -0
  259. package/src/commands/stickers/stickers.js +14 -0
  260. package/src/commands/subscribe-pr.js +131 -0
  261. package/src/commands/tag/index.js +9 -0
  262. package/src/commands/tag/tag.js +215 -0
  263. package/src/commands/tasks/index.js +8 -0
  264. package/src/commands/tasks/tasks.js +6 -0
  265. package/src/commands/terminalSetup/index.js +18 -0
  266. package/src/commands/terminalSetup/terminalSetup.js +491 -0
  267. package/src/commands/thaddeus-usage/index.js +17 -0
  268. package/src/commands/theme/index.js +7 -0
  269. package/src/commands/theme/theme.js +51 -0
  270. package/src/commands/thinkback/index.js +9 -0
  271. package/src/commands/thinkback/thinkback.js +528 -0
  272. package/src/commands/thinkback-play/index.js +13 -0
  273. package/src/commands/thinkback-play/thinkback-play.js +34 -0
  274. package/src/commands/torch.js +122 -0
  275. package/src/commands/ultraplan.js +416 -0
  276. package/src/commands/upgrade/index.js +12 -0
  277. package/src/commands/upgrade/upgrade.js +38 -0
  278. package/src/commands/usage/index.js +7 -0
  279. package/src/commands/usage/usage.js +6 -0
  280. package/src/commands/version.js +17 -0
  281. package/src/commands/vim/index.js +8 -0
  282. package/src/commands/vim/vim.js +25 -0
  283. package/src/commands/voice/index.js +13 -0
  284. package/src/commands/voice/voice.js +44 -0
  285. package/src/commands/workflows/index.js +123 -0
  286. package/src/commands.js +614 -0
  287. package/src/commands.ts +4 -0
  288. package/src/components/AgentProgressLine.js +112 -0
  289. package/src/components/AntModelSwitchCallout.js +8 -0
  290. package/src/components/App.js +46 -0
  291. package/src/components/ApproveApiKey.js +125 -0
  292. package/src/components/AutoModeOptInDialog.js +140 -0
  293. package/src/components/AutoUpdater.js +156 -0
  294. package/src/components/AutoUpdaterWrapper.js +78 -0
  295. package/src/components/AwsAuthStatusBox.js +88 -0
  296. package/src/components/BaseTextInput.js +105 -0
  297. package/src/components/BashModeProgress.js +49 -0
  298. package/src/components/BridgeDialog.js +415 -0
  299. package/src/components/BypassPermissionsModeDialog.js +87 -0
  300. package/src/components/ChannelDowngradeDialog.js +101 -0
  301. package/src/components/ClaudeInChromeOnboarding.js +126 -0
  302. package/src/components/ClaudeMdExternalIncludesDialog.js +137 -0
  303. package/src/components/ClickableImageRef.js +65 -0
  304. package/src/components/CompactSummary.js +120 -0
  305. package/src/components/ConfigurableShortcutHint.js +35 -0
  306. package/src/components/ConsoleOAuthFlow.js +554 -0
  307. package/src/components/ContextSuggestions.js +44 -0
  308. package/src/components/ContextVisualization.js +482 -0
  309. package/src/components/CoordinatorAgentStatus.js +261 -0
  310. package/src/components/CostThresholdDialog.js +49 -0
  311. package/src/components/CtrlOToExpand.js +50 -0
  312. package/src/components/CustomSelect/SelectMulti.js +150 -0
  313. package/src/components/CustomSelect/index.js +2 -0
  314. package/src/components/CustomSelect/option-map.js +32 -0
  315. package/src/components/CustomSelect/select-input-option.js +426 -0
  316. package/src/components/CustomSelect/select-option.js +24 -0
  317. package/src/components/CustomSelect/select.js +518 -0
  318. package/src/components/CustomSelect/use-multi-select-state.js +214 -0
  319. package/src/components/CustomSelect/use-select-input.js +170 -0
  320. package/src/components/CustomSelect/use-select-navigation.js +366 -0
  321. package/src/components/CustomSelect/use-select-state.js +22 -0
  322. package/src/components/DesktopHandoff.js +195 -0
  323. package/src/components/DesktopUpsell/DesktopUpsellStartup.js +174 -0
  324. package/src/components/DevBar.js +51 -0
  325. package/src/components/DevChannelsDialog.js +104 -0
  326. package/src/components/DiagnosticsDisplay.js +91 -0
  327. package/src/components/EffortCallout.js +264 -0
  328. package/src/components/EffortIndicator.js +28 -0
  329. package/src/components/ExitFlow.js +41 -0
  330. package/src/components/ExportDialog.js +101 -0
  331. package/src/components/FallbackToolUseErrorMessage.js +116 -0
  332. package/src/components/FallbackToolUseRejectedMessage.js +17 -0
  333. package/src/components/FastIcon.js +43 -0
  334. package/src/components/Feedback.js +369 -0
  335. package/src/components/FeedbackSurvey/FeedbackSurvey.js +151 -0
  336. package/src/components/FeedbackSurvey/FeedbackSurveyView.js +104 -0
  337. package/src/components/FeedbackSurvey/TranscriptSharePrompt.js +84 -0
  338. package/src/components/FeedbackSurvey/submitTranscriptShare.js +10 -0
  339. package/src/components/FeedbackSurvey/useDebouncedDigitInput.js +51 -0
  340. package/src/components/FeedbackSurvey/useFeedbackSurvey.js +258 -0
  341. package/src/components/FeedbackSurvey/useFrustrationDetection.js +8 -0
  342. package/src/components/FeedbackSurvey/useMemorySurvey.js +191 -0
  343. package/src/components/FeedbackSurvey/usePostCompactSurvey.js +202 -0
  344. package/src/components/FeedbackSurvey/useSurveyState.js +80 -0
  345. package/src/components/FileEditToolDiff.js +167 -0
  346. package/src/components/FileEditToolUpdatedMessage.js +112 -0
  347. package/src/components/FileEditToolUseRejectedMessage.js +158 -0
  348. package/src/components/FilePathLink.js +35 -0
  349. package/src/components/FullscreenLayout.js +578 -0
  350. package/src/components/GlobalSearchDialog.js +340 -0
  351. package/src/components/HelpV2/Commands.js +66 -0
  352. package/src/components/HelpV2/General.js +25 -0
  353. package/src/components/HelpV2/HelpV2.js +186 -0
  354. package/src/components/HighlightedCode/Fallback.js +193 -0
  355. package/src/components/HighlightedCode.js +185 -0
  356. package/src/components/HistorySearchDialog.js +93 -0
  357. package/src/components/IdeAutoConnectDialog.js +154 -0
  358. package/src/components/IdeOnboardingDialog.js +175 -0
  359. package/src/components/IdeStatusIndicator.js +50 -0
  360. package/src/components/IdleReturnDialog.js +117 -0
  361. package/src/components/InterruptedByUser.js +16 -0
  362. package/src/components/InvalidConfigDialog.js +135 -0
  363. package/src/components/InvalidSettingsDialog.js +85 -0
  364. package/src/components/KeybindingWarnings.js +55 -0
  365. package/src/components/LanguagePicker.js +84 -0
  366. package/src/components/LogSelector.js +1579 -0
  367. package/src/components/LogoV2/AnimatedAsterisk.js +43 -0
  368. package/src/components/LogoV2/AnimatedClawd.js +64 -0
  369. package/src/components/LogoV2/ChannelsNotice.js +262 -0
  370. package/src/components/LogoV2/Clawd.js +33 -0
  371. package/src/components/LogoV2/CondensedLogo.js +160 -0
  372. package/src/components/LogoV2/EmergencyTip.js +48 -0
  373. package/src/components/LogoV2/Feed.js +85 -0
  374. package/src/components/LogoV2/FeedColumn.js +55 -0
  375. package/src/components/LogoV2/GuestPassesUpsell.js +71 -0
  376. package/src/components/LogoV2/LogoV2.js +565 -0
  377. package/src/components/LogoV2/Opus1mMergeNotice.js +57 -0
  378. package/src/components/LogoV2/OverageCreditUpsell.js +161 -0
  379. package/src/components/LogoV2/VoiceModeNotice.js +71 -0
  380. package/src/components/LogoV2/WelcomeV2.js +14 -0
  381. package/src/components/LogoV2/feedConfigs.js +79 -0
  382. package/src/components/LspRecommendation/LspRecommendationMenu.js +46 -0
  383. package/src/components/MCPServerApprovalDialog.js +114 -0
  384. package/src/components/MCPServerDesktopImportDialog.js +206 -0
  385. package/src/components/MCPServerDialogCopy.js +16 -0
  386. package/src/components/MCPServerMultiselectDialog.js +134 -0
  387. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.js +150 -0
  388. package/src/components/ManagedSettingsSecurityDialog/utils.js +105 -0
  389. package/src/components/Markdown.js +233 -0
  390. package/src/components/MarkdownTable.js +280 -0
  391. package/src/components/MemoryUsageIndicator.js +28 -0
  392. package/src/components/Message.js +564 -0
  393. package/src/components/MessageModel.js +37 -0
  394. package/src/components/MessageResponse.js +73 -0
  395. package/src/components/MessageRow.js +346 -0
  396. package/src/components/MessageSelector.js +744 -0
  397. package/src/components/MessageTimestamp.js +58 -0
  398. package/src/components/Messages.js +645 -0
  399. package/src/components/ModelPicker.js +452 -0
  400. package/src/components/NativeAutoUpdater.js +152 -0
  401. package/src/components/NotebookEditToolUseRejectedMessage.js +84 -0
  402. package/src/components/OffscreenFreeze.js +35 -0
  403. package/src/components/Onboarding.js +174 -0
  404. package/src/components/OutputStylePicker.js +103 -0
  405. package/src/components/PackageManagerAutoUpdater.js +99 -0
  406. package/src/components/Passes/Passes.js +114 -0
  407. package/src/components/PrBadge.js +91 -0
  408. package/src/components/PressEnterToContinue.js +16 -0
  409. package/src/components/PromptInput/HistorySearchInput.js +45 -0
  410. package/src/components/PromptInput/IssueFlagBanner.js +8 -0
  411. package/src/components/PromptInput/Notifications.js +220 -0
  412. package/src/components/PromptInput/PromptInput.js +2014 -0
  413. package/src/components/PromptInput/PromptInputFooter.js +85 -0
  414. package/src/components/PromptInput/PromptInputFooterLeftSide.js +408 -0
  415. package/src/components/PromptInput/PromptInputFooterSuggestions.js +281 -0
  416. package/src/components/PromptInput/PromptInputHelpMenu.js +380 -0
  417. package/src/components/PromptInput/PromptInputModeIndicator.js +73 -0
  418. package/src/components/PromptInput/PromptInputQueuedCommands.js +105 -0
  419. package/src/components/PromptInput/PromptInputStashNotice.js +21 -0
  420. package/src/components/PromptInput/SandboxPromptFooterHint.js +66 -0
  421. package/src/components/PromptInput/ShimmeredInput.js +133 -0
  422. package/src/components/PromptInput/VoiceIndicator.js +137 -0
  423. package/src/components/PromptInput/inputModes.js +24 -0
  424. package/src/components/PromptInput/inputPaste.js +62 -0
  425. package/src/components/PromptInput/useMaybeTruncateInput.js +33 -0
  426. package/src/components/PromptInput/usePromptInputPlaceholder.js +53 -0
  427. package/src/components/PromptInput/useShowFastIconHint.js +23 -0
  428. package/src/components/PromptInput/useSwarmBanner.js +112 -0
  429. package/src/components/PromptInput/utils.js +50 -0
  430. package/src/components/QuickOpenDialog.js +244 -0
  431. package/src/components/RemoteCallout.js +53 -0
  432. package/src/components/RemoteEnvironmentDialog.js +346 -0
  433. package/src/components/ResumeTask.js +173 -0
  434. package/src/components/SandboxViolationExpandedView.js +106 -0
  435. package/src/components/ScrollKeybindingHandler.js +982 -0
  436. package/src/components/SearchBox.js +56 -0
  437. package/src/components/SentryErrorBoundary.js +16 -0
  438. package/src/components/SessionBackgroundHint.js +105 -0
  439. package/src/components/SessionPreview.js +200 -0
  440. package/src/components/Settings/Config.js +1626 -0
  441. package/src/components/Settings/Settings.js +131 -0
  442. package/src/components/Settings/Status.js +230 -0
  443. package/src/components/Settings/Usage.js +341 -0
  444. package/src/components/ShowInIDEPrompt.js +152 -0
  445. package/src/components/SkillImprovementSurvey.js +130 -0
  446. package/src/components/Spinner/FlashingChar.js +52 -0
  447. package/src/components/Spinner/GlimmerMessage.js +329 -0
  448. package/src/components/Spinner/ShimmerChar.js +23 -0
  449. package/src/components/Spinner/SpinnerAnimationRow.js +170 -0
  450. package/src/components/Spinner/SpinnerGlyph.js +70 -0
  451. package/src/components/Spinner/TeammateSpinnerLine.js +171 -0
  452. package/src/components/Spinner/TeammateSpinnerTree.js +269 -0
  453. package/src/components/Spinner/index.js +9 -0
  454. package/src/components/Spinner/teammateSelectHint.js +1 -0
  455. package/src/components/Spinner/useShimmerAnimation.js +22 -0
  456. package/src/components/Spinner/useStalledAnimation.js +63 -0
  457. package/src/components/Spinner/utils.js +78 -0
  458. package/src/components/Spinner.js +474 -0
  459. package/src/components/Stats.js +1000 -0
  460. package/src/components/StatusLine.js +286 -0
  461. package/src/components/StatusNotices.js +50 -0
  462. package/src/components/StructuredDiff/Fallback.js +336 -0
  463. package/src/components/StructuredDiff/colorDiff.js +37 -0
  464. package/src/components/StructuredDiff.js +153 -0
  465. package/src/components/StructuredDiffList.js +9 -0
  466. package/src/components/TagTabs.js +101 -0
  467. package/src/components/TaskListV2.js +333 -0
  468. package/src/components/TeammateViewHeader.js +88 -0
  469. package/src/components/TeleportError.js +191 -0
  470. package/src/components/TeleportProgress.js +131 -0
  471. package/src/components/TeleportRepoMismatchDialog.js +98 -0
  472. package/src/components/TeleportResumeWrapper.js +158 -0
  473. package/src/components/TeleportStash.js +82 -0
  474. package/src/components/TextInput.js +108 -0
  475. package/src/components/ThaddeusHint/PluginHintMenu.js +37 -0
  476. package/src/components/ThemePicker.js +331 -0
  477. package/src/components/ThinkingToggle.js +154 -0
  478. package/src/components/TokenWarning.js +171 -0
  479. package/src/components/ToolUseLoader.js +35 -0
  480. package/src/components/TrustDialog/TrustDialog.js +301 -0
  481. package/src/components/TrustDialog/utils.js +199 -0
  482. package/src/components/UndercoverAutoCallout.js +5 -0
  483. package/src/components/ValidationErrorsList.js +147 -0
  484. package/src/components/VimTextInput.js +136 -0
  485. package/src/components/VirtualMessageList.js +893 -0
  486. package/src/components/WorkflowMultiselectDialog.js +118 -0
  487. package/src/components/WorktreeExitDialog.js +220 -0
  488. package/src/components/agents/AgentDetail.js +227 -0
  489. package/src/components/agents/AgentEditor.js +147 -0
  490. package/src/components/agents/AgentNavigationFooter.js +22 -0
  491. package/src/components/agents/AgentsList.js +436 -0
  492. package/src/components/agents/AgentsMenu.js +849 -0
  493. package/src/components/agents/ColorPicker.js +110 -0
  494. package/src/components/agents/ModelSelector.js +63 -0
  495. package/src/components/agents/SnapshotUpdateDialog.js +14 -0
  496. package/src/components/agents/ToolSelector.js +557 -0
  497. package/src/components/agents/agentFileUtils.js +179 -0
  498. package/src/components/agents/generateAgent.js +161 -0
  499. package/src/components/agents/new-agent-creation/CreateAgentWizard.js +89 -0
  500. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.js +81 -0
  501. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.js +387 -0
  502. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.js +63 -0
  503. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.js +126 -0
  504. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.js +118 -0
  505. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.js +80 -0
  506. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.js +108 -0
  507. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.js +80 -0
  508. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.js +49 -0
  509. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.js +131 -0
  510. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.js +52 -0
  511. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.js +100 -0
  512. package/src/components/agents/types.js +4 -0
  513. package/src/components/agents/utils.js +14 -0
  514. package/src/components/agents/validateAgent.js +79 -0
  515. package/src/components/design-system/Byline.js +72 -0
  516. package/src/components/design-system/Dialog.js +117 -0
  517. package/src/components/design-system/Divider.js +110 -0
  518. package/src/components/design-system/FuzzyPicker.js +191 -0
  519. package/src/components/design-system/KeyboardShortcutHint.js +68 -0
  520. package/src/components/design-system/ListItem.js +184 -0
  521. package/src/components/design-system/LoadingState.js +69 -0
  522. package/src/components/design-system/Pane.js +69 -0
  523. package/src/components/design-system/ProgressBar.js +63 -0
  524. package/src/components/design-system/Ratchet.js +71 -0
  525. package/src/components/design-system/StatusIcon.js +70 -0
  526. package/src/components/design-system/Tabs.js +269 -0
  527. package/src/components/design-system/ThemeProvider.js +137 -0
  528. package/src/components/design-system/ThemedBox.js +126 -0
  529. package/src/components/design-system/ThemedText.js +60 -0
  530. package/src/components/design-system/color.js +22 -0
  531. package/src/components/diff/DiffDetailView.js +285 -0
  532. package/src/components/diff/DiffDialog.js +387 -0
  533. package/src/components/diff/DiffFileList.js +292 -0
  534. package/src/components/grove/Grove.js +483 -0
  535. package/src/components/hooks/HooksConfigMenu.js +583 -0
  536. package/src/components/hooks/PromptDialog.js +82 -0
  537. package/src/components/hooks/SelectEventMode.js +118 -0
  538. package/src/components/hooks/SelectHookMode.js +101 -0
  539. package/src/components/hooks/SelectMatcherMode.js +131 -0
  540. package/src/components/hooks/ViewHookMode.js +204 -0
  541. package/src/components/mcp/CapabilitiesSection.js +56 -0
  542. package/src/components/mcp/ElicitationDialog.js +945 -0
  543. package/src/components/mcp/MCPAgentServerMenu.js +95 -0
  544. package/src/components/mcp/MCPListPanel.js +505 -0
  545. package/src/components/mcp/MCPReconnect.js +168 -0
  546. package/src/components/mcp/MCPRemoteServerMenu.js +460 -0
  547. package/src/components/mcp/MCPSettings.js +414 -0
  548. package/src/components/mcp/MCPStdioServerMenu.js +95 -0
  549. package/src/components/mcp/MCPToolDetailView.js +219 -0
  550. package/src/components/mcp/MCPToolListView.js +137 -0
  551. package/src/components/mcp/McpParsingWarnings.js +212 -0
  552. package/src/components/mcp/index.js +8 -0
  553. package/src/components/mcp/utils/reconnectHelpers.js +35 -0
  554. package/src/components/memory/MemoryFileSelector.js +454 -0
  555. package/src/components/memory/MemoryUpdateNotification.js +43 -0
  556. package/src/components/messageActions.js +418 -0
  557. package/src/components/messages/AdvisorMessage.js +152 -0
  558. package/src/components/messages/AssistantRedactedThinkingMessage.js +28 -0
  559. package/src/components/messages/AssistantTextMessage.js +287 -0
  560. package/src/components/messages/AssistantThinkingMessage.js +70 -0
  561. package/src/components/messages/AssistantToolUseMessage.js +324 -0
  562. package/src/components/messages/AttachmentMessage.js +418 -0
  563. package/src/components/messages/CollapsedReadSearchContent.js +363 -0
  564. package/src/components/messages/CompactBoundaryMessage.js +19 -0
  565. package/src/components/messages/GroupedToolUseContent.js +37 -0
  566. package/src/components/messages/HighlightedThinkingText.js +165 -0
  567. package/src/components/messages/HookProgressMessage.js +111 -0
  568. package/src/components/messages/PlanApprovalMessage.js +213 -0
  569. package/src/components/messages/RateLimitMessage.js +149 -0
  570. package/src/components/messages/ShutdownMessage.js +124 -0
  571. package/src/components/messages/SnipBoundaryMessage.js +7 -0
  572. package/src/components/messages/SystemAPIErrorMessage.js +136 -0
  573. package/src/components/messages/SystemTextMessage.js +842 -0
  574. package/src/components/messages/TaskAssignmentMessage.js +72 -0
  575. package/src/components/messages/UserAgentNotificationMessage.js +78 -0
  576. package/src/components/messages/UserBashInputMessage.js +52 -0
  577. package/src/components/messages/UserBashOutputMessage.js +55 -0
  578. package/src/components/messages/UserChannelMessage.js +130 -0
  579. package/src/components/messages/UserCommandMessage.js +107 -0
  580. package/src/components/messages/UserCrossSessionMessage.js +11 -0
  581. package/src/components/messages/UserForkBoilerplateMessage.js +11 -0
  582. package/src/components/messages/UserGitHubWebhookMessage.js +12 -0
  583. package/src/components/messages/UserImageMessage.js +54 -0
  584. package/src/components/messages/UserLocalCommandOutputMessage.js +170 -0
  585. package/src/components/messages/UserMemoryInputMessage.js +73 -0
  586. package/src/components/messages/UserPlanMessage.js +38 -0
  587. package/src/components/messages/UserPromptMessage.js +63 -0
  588. package/src/components/messages/UserResourceUpdateMessage.js +102 -0
  589. package/src/components/messages/UserTeammateMessage.js +156 -0
  590. package/src/components/messages/UserTextMessage.js +270 -0
  591. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.js +28 -0
  592. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.js +17 -0
  593. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +17 -0
  594. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.js +92 -0
  595. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.js +74 -0
  596. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.js +84 -0
  597. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +58 -0
  598. package/src/components/messages/UserToolResultMessage/utils.js +43 -0
  599. package/src/components/messages/nullRenderingAttachments.js +58 -0
  600. package/src/components/messages/teamMemCollapsed.js +142 -0
  601. package/src/components/messages/teamMemSaved.js +16 -0
  602. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.js +659 -0
  603. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.js +219 -0
  604. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.js +227 -0
  605. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.js +175 -0
  606. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.js +444 -0
  607. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.js +137 -0
  608. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.js +100 -0
  609. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.js +404 -0
  610. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.js +110 -0
  611. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.js +449 -0
  612. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.js +126 -0
  613. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.js +653 -0
  614. package/src/components/permissions/FallbackPermissionRequest.js +349 -0
  615. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +185 -0
  616. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.js +108 -0
  617. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.js +13 -0
  618. package/src/components/permissions/FilePermissionDialog/permissionOptions.js +137 -0
  619. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.js +131 -0
  620. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.js +86 -0
  621. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +164 -0
  622. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +79 -0
  623. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +113 -0
  624. package/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.js +7 -0
  625. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.js +164 -0
  626. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.js +218 -0
  627. package/src/components/permissions/PermissionDecisionDebugInfo.js +467 -0
  628. package/src/components/permissions/PermissionDialog.js +55 -0
  629. package/src/components/permissions/PermissionExplanation.js +269 -0
  630. package/src/components/permissions/PermissionPrompt.js +316 -0
  631. package/src/components/permissions/PermissionRequest.js +159 -0
  632. package/src/components/permissions/PermissionRequestTitle.js +58 -0
  633. package/src/components/permissions/PermissionRuleExplanation.js +110 -0
  634. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.js +178 -0
  635. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.js +73 -0
  636. package/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.js +7 -0
  637. package/src/components/permissions/SandboxPermissionRequest.js +162 -0
  638. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.js +228 -0
  639. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.js +385 -0
  640. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.js +259 -0
  641. package/src/components/permissions/WorkerBadge.js +44 -0
  642. package/src/components/permissions/WorkerPendingPermission.js +107 -0
  643. package/src/components/permissions/hooks.js +163 -0
  644. package/src/components/permissions/rules/AddPermissionRules.js +171 -0
  645. package/src/components/permissions/rules/AddWorkspaceDirectory.js +335 -0
  646. package/src/components/permissions/rules/PermissionRuleDescription.js +78 -0
  647. package/src/components/permissions/rules/PermissionRuleInput.js +136 -0
  648. package/src/components/permissions/rules/PermissionRuleList.js +1190 -0
  649. package/src/components/permissions/rules/RecentDenialsTab.js +205 -0
  650. package/src/components/permissions/rules/RemoveWorkspaceDirectory.js +103 -0
  651. package/src/components/permissions/rules/WorkspaceTab.js +133 -0
  652. package/src/components/permissions/shellPermissionHelpers.js +112 -0
  653. package/src/components/permissions/useShellPermissionFeedback.js +108 -0
  654. package/src/components/permissions/utils.js +14 -0
  655. package/src/components/sandbox/SandboxConfigTab.js +48 -0
  656. package/src/components/sandbox/SandboxDependenciesTab.js +123 -0
  657. package/src/components/sandbox/SandboxDoctorSection.js +47 -0
  658. package/src/components/sandbox/SandboxOverridesTab.js +193 -0
  659. package/src/components/sandbox/SandboxSettings.js +297 -0
  660. package/src/components/shell/ExpandShellOutputContext.js +33 -0
  661. package/src/components/shell/OutputLine.js +110 -0
  662. package/src/components/shell/ShellProgressMessage.js +144 -0
  663. package/src/components/shell/ShellTimeDisplay.js +72 -0
  664. package/src/components/skills/SkillsMenu.js +239 -0
  665. package/src/components/tasks/AsyncAgentDetailDialog.js +235 -0
  666. package/src/components/tasks/BackgroundTask.js +364 -0
  667. package/src/components/tasks/BackgroundTaskStatus.js +419 -0
  668. package/src/components/tasks/BackgroundTasksDialog.js +494 -0
  669. package/src/components/tasks/DreamDetailDialog.js +251 -0
  670. package/src/components/tasks/InProcessTeammateDetailDialog.js +275 -0
  671. package/src/components/tasks/MonitorMcpDetailDialog.js +7 -0
  672. package/src/components/tasks/RemoteSessionDetailDialog.js +868 -0
  673. package/src/components/tasks/RemoteSessionProgress.js +249 -0
  674. package/src/components/tasks/ShellDetailDialog.js +403 -0
  675. package/src/components/tasks/ShellProgress.js +77 -0
  676. package/src/components/tasks/WorkflowDetailDialog.js +7 -0
  677. package/src/components/tasks/renderToolActivity.js +29 -0
  678. package/src/components/tasks/taskStatusUtils.js +94 -0
  679. package/src/components/teams/TeamStatus.js +77 -0
  680. package/src/components/teams/TeamsDialog.js +673 -0
  681. package/src/components/ui/OrderedList.js +66 -0
  682. package/src/components/ui/OrderedListItem.js +41 -0
  683. package/src/components/ui/TreeSelect.js +300 -0
  684. package/src/components/wizard/WizardDialogLayout.js +48 -0
  685. package/src/components/wizard/WizardNavigationFooter.js +11 -0
  686. package/src/components/wizard/WizardProvider.js +217 -0
  687. package/src/components/wizard/index.js +4 -0
  688. package/src/components/wizard/useWizard.js +9 -0
  689. package/src/constants/apiLimits.js +81 -0
  690. package/src/constants/betas.js +45 -0
  691. package/src/constants/common.js +29 -0
  692. package/src/constants/cyberRiskInstruction.js +23 -0
  693. package/src/constants/errorIds.js +14 -0
  694. package/src/constants/figures.js +38 -0
  695. package/src/constants/files.js +150 -0
  696. package/src/constants/github-app.js +139 -0
  697. package/src/constants/identity.js +112 -0
  698. package/src/constants/keys.js +10 -0
  699. package/src/constants/messages.js +1 -0
  700. package/src/constants/oauth.js +175 -0
  701. package/src/constants/outputStyles.js +162 -0
  702. package/src/constants/product.js +54 -0
  703. package/src/constants/prompts.js +994 -0
  704. package/src/constants/spinnerVerbs.js +98 -0
  705. package/src/constants/system.js +77 -0
  706. package/src/constants/systemPromptSections.js +39 -0
  707. package/src/constants/toolLimits.js +50 -0
  708. package/src/constants/tools.js +103 -0
  709. package/src/constants/turnCompletionVerbs.js +12 -0
  710. package/src/constants/xml.js +73 -0
  711. package/src/context/QueuedMessageContext.js +51 -0
  712. package/src/context/fpsMetrics.js +22 -0
  713. package/src/context/mailbox.js +35 -0
  714. package/src/context/modalContext.js +34 -0
  715. package/src/context/notifications.js +199 -0
  716. package/src/context/overlayContext.js +149 -0
  717. package/src/context/promptOverlayContext.js +118 -0
  718. package/src/context/stats.js +207 -0
  719. package/src/context/voice.js +74 -0
  720. package/src/context.js +146 -0
  721. package/src/coordinator/coordinatorMode.js +345 -0
  722. package/src/coordinator/workerAgent.js +24 -0
  723. package/src/cost-tracker.js +208 -0
  724. package/src/costHook.js +17 -0
  725. package/src/daemon/main.js +19 -0
  726. package/src/dialogLaunchers.js +77 -0
  727. package/src/entrypoints/agentSdkTypes.js +202 -0
  728. package/src/entrypoints/cli.js +226 -0
  729. package/src/entrypoints/init.js +265 -0
  730. package/src/entrypoints/mcp.js +141 -0
  731. package/src/entrypoints/sandboxTypes.js +112 -0
  732. package/src/entrypoints/sdk/controlSchemas.js +452 -0
  733. package/src/entrypoints/sdk/controlTypes.js +1 -0
  734. package/src/entrypoints/sdk/coreSchemas.js +1331 -0
  735. package/src/entrypoints/sdk/coreTypes.generated.js +3 -0
  736. package/src/entrypoints/sdk/coreTypes.js +49 -0
  737. package/src/entrypoints/sdk/runtimeTypes.js +1 -0
  738. package/src/entrypoints/sdk/sdkUtilityTypes.js +1 -0
  739. package/src/entrypoints/sdk/settingsTypes.generated.js +1 -0
  740. package/src/entrypoints/sdk/toolTypes.js +1 -0
  741. package/src/environment-runner/main.js +8 -0
  742. package/src/history.js +386 -0
  743. package/src/hooks/fileSuggestions.js +635 -0
  744. package/src/hooks/notifs/useAntOrgWarningNotification.js +5 -0
  745. package/src/hooks/notifs/useAutoModeUnavailableNotification.js +47 -0
  746. package/src/hooks/notifs/useCanSwitchToExistingSubscription.js +58 -0
  747. package/src/hooks/notifs/useDeprecationWarningNotification.js +43 -0
  748. package/src/hooks/notifs/useFastModeNotification.js +164 -0
  749. package/src/hooks/notifs/useIDEStatusIndicator.js +174 -0
  750. package/src/hooks/notifs/useInstallMessages.js +27 -0
  751. package/src/hooks/notifs/useLspInitializationNotification.js +144 -0
  752. package/src/hooks/notifs/useMcpConnectivityStatus.js +81 -0
  753. package/src/hooks/notifs/useModelMigrationNotifications.js +53 -0
  754. package/src/hooks/notifs/useNpmDeprecationNotification.js +25 -0
  755. package/src/hooks/notifs/usePluginAutoupdateNotification.js +83 -0
  756. package/src/hooks/notifs/usePluginInstallationStatus.js +128 -0
  757. package/src/hooks/notifs/useRateLimitWarningNotification.js +119 -0
  758. package/src/hooks/notifs/useSettingsErrors.js +64 -0
  759. package/src/hooks/notifs/useStartupNotification.js +33 -0
  760. package/src/hooks/notifs/useTeammateShutdownNotification.js +64 -0
  761. package/src/hooks/renderPlaceholder.js +26 -0
  762. package/src/hooks/toolPermission/PermissionContext.js +211 -0
  763. package/src/hooks/toolPermission/handlers/coordinatorHandler.js +44 -0
  764. package/src/hooks/toolPermission/handlers/interactiveHandler.js +397 -0
  765. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.js +108 -0
  766. package/src/hooks/toolPermission/permissionLogging.js +145 -0
  767. package/src/hooks/unifiedSuggestions.js +130 -0
  768. package/src/hooks/useAfterFirstRender.js +12 -0
  769. package/src/hooks/useApiKeyVerification.js +63 -0
  770. package/src/hooks/useArrowKeyHistory.js +203 -0
  771. package/src/hooks/useAssistantHistory.js +193 -0
  772. package/src/hooks/useAwaySummary.js +105 -0
  773. package/src/hooks/useBackgroundTaskNavigation.js +204 -0
  774. package/src/hooks/useBlink.js +28 -0
  775. package/src/hooks/useCanUseTool.js +193 -0
  776. package/src/hooks/useCancelRequest.js +195 -0
  777. package/src/hooks/useChromeExtensionNotification.js +50 -0
  778. package/src/hooks/useClipboardImageHint.js +59 -0
  779. package/src/hooks/useCommandKeybindings.js +87 -0
  780. package/src/hooks/useCommandQueue.js +10 -0
  781. package/src/hooks/useCopyOnSelect.js +88 -0
  782. package/src/hooks/useDeferredHookMessages.js +43 -0
  783. package/src/hooks/useDiffData.js +69 -0
  784. package/src/hooks/useDiffInIDE.js +252 -0
  785. package/src/hooks/useDirectConnect.js +150 -0
  786. package/src/hooks/useDoublePress.js +44 -0
  787. package/src/hooks/useDynamicConfig.js +17 -0
  788. package/src/hooks/useElapsedTime.js +25 -0
  789. package/src/hooks/useExitOnCtrlCD.js +57 -0
  790. package/src/hooks/useExitOnCtrlCDWithKeybindings.js +17 -0
  791. package/src/hooks/useFileHistorySnapshotInit.js +14 -0
  792. package/src/hooks/useGlobalKeybindings.js +213 -0
  793. package/src/hooks/useHistorySearch.js +241 -0
  794. package/src/hooks/useIDEIntegration.js +56 -0
  795. package/src/hooks/useIdeAtMentioned.js +51 -0
  796. package/src/hooks/useIdeConnectionStatus.js +21 -0
  797. package/src/hooks/useIdeLogging.js +29 -0
  798. package/src/hooks/useIdeSelection.js +106 -0
  799. package/src/hooks/useInboxPoller.js +709 -0
  800. package/src/hooks/useInputBuffer.js +73 -0
  801. package/src/hooks/useIssueFlagBanner.js +115 -0
  802. package/src/hooks/useLogMessages.js +98 -0
  803. package/src/hooks/useLspPluginRecommendation.js +176 -0
  804. package/src/hooks/useMailboxBridge.js +15 -0
  805. package/src/hooks/useMainLoopModel.js +25 -0
  806. package/src/hooks/useManagePlugins.js +261 -0
  807. package/src/hooks/useMemoryUsage.js +28 -0
  808. package/src/hooks/useMergedClients.js +11 -0
  809. package/src/hooks/useMergedCommands.js +10 -0
  810. package/src/hooks/useMergedTools.js +32 -0
  811. package/src/hooks/useMinDisplayTime.js +26 -0
  812. package/src/hooks/useNotifyAfterTimeout.js +51 -0
  813. package/src/hooks/useOfficialMarketplaceNotification.js +47 -0
  814. package/src/hooks/usePasteHandler.js +195 -0
  815. package/src/hooks/usePluginRecommendationBase.js +101 -0
  816. package/src/hooks/usePrStatus.js +91 -0
  817. package/src/hooks/usePromptSuggestion.js +128 -0
  818. package/src/hooks/usePromptsFromClaudeInChrome.js +66 -0
  819. package/src/hooks/useQueueProcessor.js +46 -0
  820. package/src/hooks/useRemoteSession.js +431 -0
  821. package/src/hooks/useReplBridge.js +715 -0
  822. package/src/hooks/useSSHSession.js +167 -0
  823. package/src/hooks/useScheduledTasks.js +104 -0
  824. package/src/hooks/useSearchInput.js +302 -0
  825. package/src/hooks/useSessionBackgrounding.js +132 -0
  826. package/src/hooks/useSettings.js +10 -0
  827. package/src/hooks/useSettingsChange.js +13 -0
  828. package/src/hooks/useSkillImprovementSurvey.js +69 -0
  829. package/src/hooks/useSkillsChange.js +51 -0
  830. package/src/hooks/useSwarmInitialization.js +67 -0
  831. package/src/hooks/useSwarmPermissionPoller.js +215 -0
  832. package/src/hooks/useTaskListWatcher.js +157 -0
  833. package/src/hooks/useTasksV2.js +220 -0
  834. package/src/hooks/useTeammateViewAutoExit.js +55 -0
  835. package/src/hooks/useTeleportResume.js +81 -0
  836. package/src/hooks/useTerminalSize.js +9 -0
  837. package/src/hooks/useTextInput.js +397 -0
  838. package/src/hooks/useThaddeusHintRecommendation.js +117 -0
  839. package/src/hooks/useTimeout.js +10 -0
  840. package/src/hooks/useTurnDiffs.js +160 -0
  841. package/src/hooks/useTypeahead.js +1250 -0
  842. package/src/hooks/useUpdateNotification.js +21 -0
  843. package/src/hooks/useVimInput.js +232 -0
  844. package/src/hooks/useVirtualScroll.js +627 -0
  845. package/src/hooks/useVoice.js +952 -0
  846. package/src/hooks/useVoiceEnabled.js +21 -0
  847. package/src/hooks/useVoiceIntegration.js +629 -0
  848. package/src/infrastructure/audit.js +210 -0
  849. package/src/infrastructure/guardrails.js +513 -0
  850. package/src/infrastructure/index.js +11 -0
  851. package/src/ink/Ansi.js +269 -0
  852. package/src/ink/bidi.js +117 -0
  853. package/src/ink/clearTerminal.js +58 -0
  854. package/src/ink/colorize.js +198 -0
  855. package/src/ink/components/AlternateScreen.js +74 -0
  856. package/src/ink/components/App.js +562 -0
  857. package/src/ink/components/AppContext.js +11 -0
  858. package/src/ink/components/Box.js +155 -0
  859. package/src/ink/components/Button.js +166 -0
  860. package/src/ink/components/ClockContext.js +108 -0
  861. package/src/ink/components/CursorDeclarationContext.js +3 -0
  862. package/src/ink/components/ErrorOverview.js +50 -0
  863. package/src/ink/components/Link.js +34 -0
  864. package/src/ink/components/Newline.js +30 -0
  865. package/src/ink/components/NoSelect.js +57 -0
  866. package/src/ink/components/RawAnsi.js +46 -0
  867. package/src/ink/components/ScrollBox.js +171 -0
  868. package/src/ink/components/Spacer.js +20 -0
  869. package/src/ink/components/StdinContext.js +16 -0
  870. package/src/ink/components/TerminalFocusContext.js +45 -0
  871. package/src/ink/components/TerminalSizeContext.js +3 -0
  872. package/src/ink/components/Text.js +195 -0
  873. package/src/ink/constants.js +2 -0
  874. package/src/ink/dom.js +298 -0
  875. package/src/ink/events/click-event.js +36 -0
  876. package/src/ink/events/dispatcher.js +172 -0
  877. package/src/ink/events/emitter.js +31 -0
  878. package/src/ink/events/event-handlers.js +30 -0
  879. package/src/ink/events/event.js +9 -0
  880. package/src/ink/events/focus-event.js +16 -0
  881. package/src/ink/events/input-event.js +161 -0
  882. package/src/ink/events/keyboard-event.js +46 -0
  883. package/src/ink/events/terminal-event.js +78 -0
  884. package/src/ink/events/terminal-focus-event.js +15 -0
  885. package/src/ink/focus.js +158 -0
  886. package/src/ink/frame.js +30 -0
  887. package/src/ink/get-max-width.js +23 -0
  888. package/src/ink/hit-test.js +113 -0
  889. package/src/ink/hooks/use-animation-frame.js +48 -0
  890. package/src/ink/hooks/use-app.js +7 -0
  891. package/src/ink/hooks/use-declared-cursor.js +60 -0
  892. package/src/ink/hooks/use-input.js +70 -0
  893. package/src/ink/hooks/use-interval.js +54 -0
  894. package/src/ink/hooks/use-search-highlight.js +32 -0
  895. package/src/ink/hooks/use-selection.js +60 -0
  896. package/src/ink/hooks/use-stdin.js +7 -0
  897. package/src/ink/hooks/use-tab-status.js +57 -0
  898. package/src/ink/hooks/use-terminal-focus.js +15 -0
  899. package/src/ink/hooks/use-terminal-title.js +29 -0
  900. package/src/ink/hooks/use-terminal-viewport.js +77 -0
  901. package/src/ink/ink.js +1645 -0
  902. package/src/ink/instances.js +7 -0
  903. package/src/ink/layout/engine.js +4 -0
  904. package/src/ink/layout/geometry.js +61 -0
  905. package/src/ink/layout/node.js +62 -0
  906. package/src/ink/layout/yoga.js +237 -0
  907. package/src/ink/line-width-cache.js +19 -0
  908. package/src/ink/log-update.js +583 -0
  909. package/src/ink/measure-element.js +8 -0
  910. package/src/ink/measure-text.js +35 -0
  911. package/src/ink/node-cache.js +30 -0
  912. package/src/ink/optimizer.js +81 -0
  913. package/src/ink/output.js +556 -0
  914. package/src/ink/parse-keypress.js +695 -0
  915. package/src/ink/reconciler.js +384 -0
  916. package/src/ink/render-border.js +134 -0
  917. package/src/ink/render-node-to-output.js +1216 -0
  918. package/src/ink/render-to-screen.js +171 -0
  919. package/src/ink/renderer.js +129 -0
  920. package/src/ink/root.js +80 -0
  921. package/src/ink/screen.js +1132 -0
  922. package/src/ink/searchHighlight.js +78 -0
  923. package/src/ink/selection.js +792 -0
  924. package/src/ink/squash-text-nodes.js +56 -0
  925. package/src/ink/stringWidth.js +200 -0
  926. package/src/ink/styles.js +299 -0
  927. package/src/ink/supports-hyperlinks.js +40 -0
  928. package/src/ink/tabstops.js +39 -0
  929. package/src/ink/terminal-focus-state.js +35 -0
  930. package/src/ink/terminal-querier.js +173 -0
  931. package/src/ink/terminal.js +208 -0
  932. package/src/ink/termio/ansi.js +70 -0
  933. package/src/ink/termio/csi.js +260 -0
  934. package/src/ink/termio/dec.js +53 -0
  935. package/src/ink/termio/esc.js +55 -0
  936. package/src/ink/termio/osc.js +432 -0
  937. package/src/ink/termio/parser.js +356 -0
  938. package/src/ink/termio/sgr.js +292 -0
  939. package/src/ink/termio/tokenize.js +264 -0
  940. package/src/ink/termio/types.js +55 -0
  941. package/src/ink/termio.js +24 -0
  942. package/src/ink/useTerminalNotification.js +57 -0
  943. package/src/ink/warn.js +10 -0
  944. package/src/ink/widest-line.js +14 -0
  945. package/src/ink/wrap-text.js +54 -0
  946. package/src/ink/wrapAnsi.js +6 -0
  947. package/src/ink.js +50 -0
  948. package/src/integrations/credentialStore.js +176 -0
  949. package/src/integrations/index.js +5 -0
  950. package/src/integrations/integrationManager.js +180 -0
  951. package/src/integrations/providers/BaseProvider.js +180 -0
  952. package/src/integrations/providers/GitHubProvider.js +217 -0
  953. package/src/integrations/providers/GmailProvider.js +204 -0
  954. package/src/integrations/providers/GoogleCalendarProvider.js +113 -0
  955. package/src/integrations/providers/HubSpotProvider.js +159 -0
  956. package/src/integrations/providers/JiraProvider.js +216 -0
  957. package/src/integrations/providers/NotionProvider.js +221 -0
  958. package/src/integrations/providers/QuickBooksProvider.js +176 -0
  959. package/src/integrations/providers/SlackProvider.js +174 -0
  960. package/src/integrations/providers/StripeProvider.js +206 -0
  961. package/src/integrations/providers/TwilioProvider.js +239 -0
  962. package/src/integrations/providers/_template.js +112 -0
  963. package/src/integrations/types.js +7 -0
  964. package/src/interactiveHelpers.js +308 -0
  965. package/src/jobs/classifier.js +6 -0
  966. package/src/keybindings/KeybindingContext.js +184 -0
  967. package/src/keybindings/KeybindingProviderSetup.js +259 -0
  968. package/src/keybindings/defaultBindings.js +333 -0
  969. package/src/keybindings/loadUserBindings.js +393 -0
  970. package/src/keybindings/match.js +111 -0
  971. package/src/keybindings/parser.js +184 -0
  972. package/src/keybindings/reservedShortcuts.js +109 -0
  973. package/src/keybindings/resolver.js +182 -0
  974. package/src/keybindings/schema.js +205 -0
  975. package/src/keybindings/shortcutFormat.js +48 -0
  976. package/src/keybindings/template.js +40 -0
  977. package/src/keybindings/useKeybinding.js +161 -0
  978. package/src/keybindings/useShortcutDisplay.js +43 -0
  979. package/src/keybindings/validate.js +395 -0
  980. package/src/main.js +4128 -0
  981. package/src/memdir/findRelevantMemories.js +99 -0
  982. package/src/memdir/memdir.js +406 -0
  983. package/src/memdir/memoryAge.js +52 -0
  984. package/src/memdir/memoryScan.js +65 -0
  985. package/src/memdir/memoryShapeTelemetry.js +8 -0
  986. package/src/memdir/memoryTypes.js +260 -0
  987. package/src/memdir/paths.js +235 -0
  988. package/src/memdir/teamMemPaths.js +261 -0
  989. package/src/memdir/teamMemPrompts.js +82 -0
  990. package/src/migrations/migrateAutoUpdatesToSettings.js +47 -0
  991. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.js +32 -0
  992. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.js +83 -0
  993. package/src/migrations/migrateFennecToOpus.js +39 -0
  994. package/src/migrations/migrateLegacyOpusToCurrent.js +44 -0
  995. package/src/migrations/migrateOpusToOpus1m.js +31 -0
  996. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.js +23 -0
  997. package/src/migrations/migrateSonnet1mToSonnet45.js +38 -0
  998. package/src/migrations/migrateSonnet45ToSonnet46.js +48 -0
  999. package/src/migrations/resetAutoModeOptInForDefaultOffer.js +47 -0
  1000. package/src/migrations/resetProToOpusDefault.js +46 -0
  1001. package/src/moreright/useMoreRight.js +13 -0
  1002. package/src/native-ts/color-diff/index.js +819 -0
  1003. package/src/native-ts/file-index/index.js +328 -0
  1004. package/src/native-ts/yoga-layout/enums.js +101 -0
  1005. package/src/native-ts/yoga-layout/index.js +2113 -0
  1006. package/src/outputStyles/loadOutputStylesDir.js +71 -0
  1007. package/src/plugins/builtinPlugins.js +132 -0
  1008. package/src/plugins/bundled/index.js +22 -0
  1009. package/src/proactive/index.js +138 -0
  1010. package/src/proactive/useProactive.js +82 -0
  1011. package/src/projectOnboardingState.js +61 -0
  1012. package/src/query/config.js +17 -0
  1013. package/src/query/deps.js +12 -0
  1014. package/src/query/stopHooks.js +332 -0
  1015. package/src/query/tokenBudget.js +49 -0
  1016. package/src/query.js +1264 -0
  1017. package/src/remote/RemoteSessionManager.js +172 -0
  1018. package/src/remote/SessionsWebSocket.js +308 -0
  1019. package/src/remote/remotePermissionBridge.js +70 -0
  1020. package/src/remote/sdkMessageAdapter.js +227 -0
  1021. package/src/replLauncher.js +7 -0
  1022. package/src/schemas/hooks.js +174 -0
  1023. package/src/screens/Doctor.js +580 -0
  1024. package/src/screens/REPL.js +4500 -0
  1025. package/src/screens/ResumeConversation.js +339 -0
  1026. package/src/self-hosted-runner/main.js +8 -0
  1027. package/src/server/backends/dangerousBackend.js +8 -0
  1028. package/src/server/connectHeadless.js +6 -0
  1029. package/src/server/createDirectConnectSession.js +62 -0
  1030. package/src/server/directConnectManager.js +153 -0
  1031. package/src/server/lockfile.js +11 -0
  1032. package/src/server/parseConnectUrl.js +20 -0
  1033. package/src/server/server.js +12 -0
  1034. package/src/server/serverBanner.js +9 -0
  1035. package/src/server/serverLog.js +11 -0
  1036. package/src/server/sessionManager.js +19 -0
  1037. package/src/server/types.js +7 -0
  1038. package/src/services/AgentSummary/agentSummary.js +147 -0
  1039. package/src/services/MagicDocs/magicDocs.js +193 -0
  1040. package/src/services/MagicDocs/prompts.js +110 -0
  1041. package/src/services/PromptSuggestion/promptSuggestion.js +402 -0
  1042. package/src/services/PromptSuggestion/speculation.js +643 -0
  1043. package/src/services/SessionMemory/prompts.js +254 -0
  1044. package/src/services/SessionMemory/sessionMemory.js +358 -0
  1045. package/src/services/SessionMemory/sessionMemoryUtils.js +157 -0
  1046. package/src/services/analytics/config.js +27 -0
  1047. package/src/services/analytics/datadog.js +26 -0
  1048. package/src/services/analytics/firstPartyEventLogger.js +65 -0
  1049. package/src/services/analytics/firstPartyEventLoggingExporter.js +595 -0
  1050. package/src/services/analytics/growthbook.js +103 -0
  1051. package/src/services/analytics/index.js +91 -0
  1052. package/src/services/analytics/metadata.js +696 -0
  1053. package/src/services/analytics/sink.js +19 -0
  1054. package/src/services/analytics/sinkKillswitch.js +19 -0
  1055. package/src/services/api/adminRequests.js +57 -0
  1056. package/src/services/api/bootstrap.js +118 -0
  1057. package/src/services/api/claude.js +2466 -0
  1058. package/src/services/api/client.js +335 -0
  1059. package/src/services/api/dumpPrompts.js +174 -0
  1060. package/src/services/api/emptyUsage.js +20 -0
  1061. package/src/services/api/errorUtils.js +203 -0
  1062. package/src/services/api/errors.js +926 -0
  1063. package/src/services/api/filesApi.js +523 -0
  1064. package/src/services/api/firstTokenDate.js +49 -0
  1065. package/src/services/api/grove.js +44 -0
  1066. package/src/services/api/logging.js +484 -0
  1067. package/src/services/api/metricsOptOut.js +15 -0
  1068. package/src/services/api/overageCreditGrant.js +123 -0
  1069. package/src/services/api/promptCacheBreakDetection.js +510 -0
  1070. package/src/services/api/referral.js +219 -0
  1071. package/src/services/api/sessionIngress.js +358 -0
  1072. package/src/services/api/ultrareviewQuota.js +29 -0
  1073. package/src/services/api/usage.js +31 -0
  1074. package/src/services/api/withRetry.js +587 -0
  1075. package/src/services/api/xai/anthropic-shim.js +885 -0
  1076. package/src/services/api/xai/brightDataSearch.js +161 -0
  1077. package/src/services/api/xai/thaddeus-engine.js +605 -0
  1078. package/src/services/api/xai/xai-client.js +276 -0
  1079. package/src/services/autoDream/autoDream.js +244 -0
  1080. package/src/services/autoDream/config.js +17 -0
  1081. package/src/services/autoDream/consolidationLock.js +122 -0
  1082. package/src/services/autoDream/consolidationPrompt.js +55 -0
  1083. package/src/services/awaySummary.js +61 -0
  1084. package/src/services/claudeAiLimits.js +331 -0
  1085. package/src/services/claudeAiLimitsHook.js +15 -0
  1086. package/src/services/compact/apiMicrocompact.js +97 -0
  1087. package/src/services/compact/autoCompact.js +234 -0
  1088. package/src/services/compact/cachedMCConfig.js +5 -0
  1089. package/src/services/compact/compact.js +1256 -0
  1090. package/src/services/compact/compactWarningHook.js +12 -0
  1091. package/src/services/compact/compactWarningState.js +15 -0
  1092. package/src/services/compact/grouping.js +58 -0
  1093. package/src/services/compact/microCompact.js +414 -0
  1094. package/src/services/compact/postCompactCleanup.js +70 -0
  1095. package/src/services/compact/prompt.js +325 -0
  1096. package/src/services/compact/reactiveCompact.js +20 -0
  1097. package/src/services/compact/sessionMemoryCompact.js +467 -0
  1098. package/src/services/compact/snipCompact.js +23 -0
  1099. package/src/services/compact/snipProjection.js +11 -0
  1100. package/src/services/compact/timeBasedMCConfig.js +11 -0
  1101. package/src/services/contextCollapse/index.js +33 -0
  1102. package/src/services/contextCollapse/operations.js +5 -0
  1103. package/src/services/contextCollapse/persist.js +5 -0
  1104. package/src/services/diagnosticTracking.js +282 -0
  1105. package/src/services/elevenlabsTTS.js +245 -0
  1106. package/src/services/extractMemories/extractMemories.js +442 -0
  1107. package/src/services/extractMemories/prompts.js +129 -0
  1108. package/src/services/internalLogging.js +68 -0
  1109. package/src/services/lsp/LSPClient.js +306 -0
  1110. package/src/services/lsp/LSPDiagnosticRegistry.js +277 -0
  1111. package/src/services/lsp/LSPServerInstance.js +388 -0
  1112. package/src/services/lsp/LSPServerManager.js +305 -0
  1113. package/src/services/lsp/config.js +57 -0
  1114. package/src/services/lsp/manager.js +246 -0
  1115. package/src/services/lsp/passiveFeedback.js +226 -0
  1116. package/src/services/mcp/InProcessTransport.js +54 -0
  1117. package/src/services/mcp/MCPConnectionManager.js +50 -0
  1118. package/src/services/mcp/SdkControlTransport.js +115 -0
  1119. package/src/services/mcp/auth.js +1882 -0
  1120. package/src/services/mcp/channelAllowlist.js +57 -0
  1121. package/src/services/mcp/channelNotification.js +235 -0
  1122. package/src/services/mcp/channelPermissions.js +192 -0
  1123. package/src/services/mcp/claudeai.js +123 -0
  1124. package/src/services/mcp/client.js +2478 -0
  1125. package/src/services/mcp/config.js +1271 -0
  1126. package/src/services/mcp/elicitationHandler.js +192 -0
  1127. package/src/services/mcp/envExpansion.js +30 -0
  1128. package/src/services/mcp/headersHelper.js +93 -0
  1129. package/src/services/mcp/mcpStringUtils.js +85 -0
  1130. package/src/services/mcp/normalization.js +21 -0
  1131. package/src/services/mcp/oauthPort.js +69 -0
  1132. package/src/services/mcp/officialRegistry.js +20 -0
  1133. package/src/services/mcp/types.js +94 -0
  1134. package/src/services/mcp/useManageMCPConnections.js +818 -0
  1135. package/src/services/mcp/utils.js +433 -0
  1136. package/src/services/mcp/vscodeSdkMcp.js +69 -0
  1137. package/src/services/mcp/xaa.js +342 -0
  1138. package/src/services/mcp/xaaIdpLogin.js +377 -0
  1139. package/src/services/mcpServerApproval.js +30 -0
  1140. package/src/services/mockRateLimits.js +666 -0
  1141. package/src/services/notifier.js +114 -0
  1142. package/src/services/oauth/auth-code-listener.js +165 -0
  1143. package/src/services/oauth/client.js +397 -0
  1144. package/src/services/oauth/crypto.js +19 -0
  1145. package/src/services/oauth/getOauthProfile.js +48 -0
  1146. package/src/services/oauth/index.js +133 -0
  1147. package/src/services/plugins/PluginInstallationManager.js +139 -0
  1148. package/src/services/plugins/pluginCliCommands.js +230 -0
  1149. package/src/services/plugins/pluginOperations.js +826 -0
  1150. package/src/services/policyLimits/index.js +547 -0
  1151. package/src/services/policyLimits/types.js +9 -0
  1152. package/src/services/preventSleep.js +143 -0
  1153. package/src/services/rateLimitMessages.js +271 -0
  1154. package/src/services/rateLimitMocking.js +91 -0
  1155. package/src/services/remoteManagedSettings/index.js +534 -0
  1156. package/src/services/remoteManagedSettings/securityCheck.js +60 -0
  1157. package/src/services/remoteManagedSettings/syncCache.js +90 -0
  1158. package/src/services/remoteManagedSettings/syncCacheState.js +89 -0
  1159. package/src/services/remoteManagedSettings/types.js +12 -0
  1160. package/src/services/sessionTranscript/sessionTranscript.js +5 -0
  1161. package/src/services/settingsSync/index.js +478 -0
  1162. package/src/services/settingsSync/types.js +35 -0
  1163. package/src/services/skillSearch/featureCheck.js +8 -0
  1164. package/src/services/skillSearch/localSearch.js +5 -0
  1165. package/src/services/skillSearch/prefetch.js +8 -0
  1166. package/src/services/skillSearch/remoteSkillLoader.js +8 -0
  1167. package/src/services/skillSearch/remoteSkillState.js +11 -0
  1168. package/src/services/skillSearch/signals.js +3 -0
  1169. package/src/services/skillSearch/telemetry.js +8 -0
  1170. package/src/services/teamMemorySync/index.js +976 -0
  1171. package/src/services/teamMemorySync/secretScanner.js +275 -0
  1172. package/src/services/teamMemorySync/teamMemSecretGuard.js +33 -0
  1173. package/src/services/teamMemorySync/types.js +47 -0
  1174. package/src/services/teamMemorySync/watcher.js +326 -0
  1175. package/src/services/thaddeusAuth.js +485 -0
  1176. package/src/services/thaddeusAuthTypes.js +9 -0
  1177. package/src/services/thaddeusLoginFlow.js +236 -0
  1178. package/src/services/tips/tipHistory.js +17 -0
  1179. package/src/services/tips/tipRegistry.js +593 -0
  1180. package/src/services/tips/tipScheduler.js +40 -0
  1181. package/src/services/tokenEstimation.js +365 -0
  1182. package/src/services/toolUseSummary/toolUseSummaryGenerator.js +87 -0
  1183. package/src/services/tools/StreamingToolExecutor.js +413 -0
  1184. package/src/services/tools/toolExecution.js +1309 -0
  1185. package/src/services/tools/toolHooks.js +454 -0
  1186. package/src/services/tools/toolOrchestration.js +110 -0
  1187. package/src/services/vcr.js +291 -0
  1188. package/src/services/voice.js +392 -0
  1189. package/src/services/voiceKeyterms.js +94 -0
  1190. package/src/services/voiceStreamSTT.js +405 -0
  1191. package/src/setup.js +310 -0
  1192. package/src/skills/bundled/batch.js +114 -0
  1193. package/src/skills/bundled/claudeApi.js +145 -0
  1194. package/src/skills/bundled/claudeApiContent.js +71 -0
  1195. package/src/skills/bundled/claudeInChrome.js +27 -0
  1196. package/src/skills/bundled/debug.js +99 -0
  1197. package/src/skills/bundled/dream.js +49 -0
  1198. package/src/skills/bundled/emailSetup.js +196 -0
  1199. package/src/skills/bundled/hunter.js +28 -0
  1200. package/src/skills/bundled/index.js +80 -0
  1201. package/src/skills/bundled/keybindings.js +292 -0
  1202. package/src/skills/bundled/loop.js +81 -0
  1203. package/src/skills/bundled/loremIpsum.js +264 -0
  1204. package/src/skills/bundled/reactor.js +31 -0
  1205. package/src/skills/bundled/remember.js +73 -0
  1206. package/src/skills/bundled/runSkillGenerator.js +12 -0
  1207. package/src/skills/bundled/scheduleRemoteAgents.js +373 -0
  1208. package/src/skills/bundled/simplify.js +66 -0
  1209. package/src/skills/bundled/skillify.js +182 -0
  1210. package/src/skills/bundled/stuck.js +69 -0
  1211. package/src/skills/bundled/updateConfig.js +463 -0
  1212. package/src/skills/bundled/verify.js +23 -0
  1213. package/src/skills/bundled/verifyContent.js +10 -0
  1214. package/src/skills/bundledSkills.js +159 -0
  1215. package/src/skills/loadSkillsDir.js +736 -0
  1216. package/src/skills/mcpSkillBuilders.js +10 -0
  1217. package/src/skills/mcpSkills.js +5 -0
  1218. package/src/state/AppState.js +182 -0
  1219. package/src/state/AppStateStore.js +117 -0
  1220. package/src/state/onChangeAppState.js +132 -0
  1221. package/src/state/selectors.js +51 -0
  1222. package/src/state/store.js +21 -0
  1223. package/src/state/teammateViewHelpers.js +124 -0
  1224. package/src/stubs/ant-chrome-mcp/index.js +4 -0
  1225. package/src/stubs/ant-computer-use-input/index.js +2 -0
  1226. package/src/stubs/ant-computer-use-mcp/index.js +7 -0
  1227. package/src/stubs/ant-computer-use-mcp/sentinelApps.js +2 -0
  1228. package/src/stubs/ant-computer-use-mcp/types.js +3 -0
  1229. package/src/stubs/ant-computer-use-swift/index.js +1 -0
  1230. package/src/stubs/anthropic-sandbox/index.js +34 -0
  1231. package/src/tasks/DreamTask/DreamTask.js +99 -0
  1232. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.js +116 -0
  1233. package/src/tasks/InProcessTeammateTask/types.js +35 -0
  1234. package/src/tasks/LocalAgentTask/LocalAgentTask.js +507 -0
  1235. package/src/tasks/LocalMainSessionTask.js +338 -0
  1236. package/src/tasks/LocalShellTask/LocalShellTask.js +475 -0
  1237. package/src/tasks/LocalShellTask/guards.js +9 -0
  1238. package/src/tasks/LocalShellTask/killShellTasks.js +59 -0
  1239. package/src/tasks/LocalWorkflowTask/LocalWorkflowTask.js +7 -0
  1240. package/src/tasks/MonitorMcpTask/MonitorMcpTask.js +20 -0
  1241. package/src/tasks/RemoteAgentTask/RemoteAgentTask.js +742 -0
  1242. package/src/tasks/pillLabel.js +69 -0
  1243. package/src/tasks/stopTask.js +67 -0
  1244. package/src/tasks/types.js +18 -0
  1245. package/src/tasks.js +37 -0
  1246. package/src/tools/AIEmployeesTool/AIEmployeesTool.js +674 -0
  1247. package/src/tools/AIEmployeesTool/constants.js +1 -0
  1248. package/src/tools/AIEmployeesTool/prompt.js +56 -0
  1249. package/src/tools/AgentTool/AgentTool.js +1221 -0
  1250. package/src/tools/AgentTool/UI.js +593 -0
  1251. package/src/tools/AgentTool/agentColorManager.js +43 -0
  1252. package/src/tools/AgentTool/agentDisplay.js +72 -0
  1253. package/src/tools/AgentTool/agentMemory.js +125 -0
  1254. package/src/tools/AgentTool/agentMemorySnapshot.js +136 -0
  1255. package/src/tools/AgentTool/agentToolUtils.js +456 -0
  1256. package/src/tools/AgentTool/built-in/exploreAgent.js +76 -0
  1257. package/src/tools/AgentTool/built-in/generalPurposeAgent.js +28 -0
  1258. package/src/tools/AgentTool/built-in/planAgent.js +87 -0
  1259. package/src/tools/AgentTool/built-in/statuslineSetup.js +140 -0
  1260. package/src/tools/AgentTool/built-in/thaddeusGuideAgent.js +174 -0
  1261. package/src/tools/AgentTool/built-in/verificationAgent.js +146 -0
  1262. package/src/tools/AgentTool/builtInAgents.js +56 -0
  1263. package/src/tools/AgentTool/constants.js +11 -0
  1264. package/src/tools/AgentTool/forkSubagent.js +177 -0
  1265. package/src/tools/AgentTool/loadAgentsDir.js +497 -0
  1266. package/src/tools/AgentTool/prompt.js +260 -0
  1267. package/src/tools/AgentTool/resumeAgent.js +182 -0
  1268. package/src/tools/AgentTool/runAgent.js +627 -0
  1269. package/src/tools/AppointmentsTool/AppointmentsTool.js +628 -0
  1270. package/src/tools/AppointmentsTool/constants.js +1 -0
  1271. package/src/tools/AppointmentsTool/prompt.js +15 -0
  1272. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.js +238 -0
  1273. package/src/tools/AskUserQuestionTool/prompt.js +38 -0
  1274. package/src/tools/BashTool/BashTool.js +1009 -0
  1275. package/src/tools/BashTool/BashToolResultMessage.js +169 -0
  1276. package/src/tools/BashTool/UI.js +134 -0
  1277. package/src/tools/BashTool/bashCommandHelpers.js +184 -0
  1278. package/src/tools/BashTool/bashPermissions.js +2023 -0
  1279. package/src/tools/BashTool/bashSecurity.js +2267 -0
  1280. package/src/tools/BashTool/commandSemantics.js +105 -0
  1281. package/src/tools/BashTool/commentLabel.js +14 -0
  1282. package/src/tools/BashTool/destructiveCommandWarning.js +88 -0
  1283. package/src/tools/BashTool/modeValidation.js +86 -0
  1284. package/src/tools/BashTool/pathValidation.js +1079 -0
  1285. package/src/tools/BashTool/prompt.js +333 -0
  1286. package/src/tools/BashTool/readOnlyValidation.js +1794 -0
  1287. package/src/tools/BashTool/sedEditParser.js +282 -0
  1288. package/src/tools/BashTool/sedValidation.js +580 -0
  1289. package/src/tools/BashTool/shouldUseSandbox.js +125 -0
  1290. package/src/tools/BashTool/toolName.js +2 -0
  1291. package/src/tools/BashTool/utils.js +180 -0
  1292. package/src/tools/BriefTool/BriefTool.js +173 -0
  1293. package/src/tools/BriefTool/UI.js +67 -0
  1294. package/src/tools/BriefTool/attachments.js +86 -0
  1295. package/src/tools/BriefTool/prompt.js +19 -0
  1296. package/src/tools/BriefTool/upload.js +136 -0
  1297. package/src/tools/CalendarTool/CalendarTool.js +498 -0
  1298. package/src/tools/CalendarTool/constants.js +1 -0
  1299. package/src/tools/CalendarTool/prompt.js +11 -0
  1300. package/src/tools/ConfigTool/ConfigTool.js +398 -0
  1301. package/src/tools/ConfigTool/UI.js +25 -0
  1302. package/src/tools/ConfigTool/constants.js +1 -0
  1303. package/src/tools/ConfigTool/prompt.js +82 -0
  1304. package/src/tools/ConfigTool/supportedSettings.js +180 -0
  1305. package/src/tools/ContactsTool/ContactsTool.js +648 -0
  1306. package/src/tools/ContactsTool/constants.js +1 -0
  1307. package/src/tools/ContactsTool/prompt.js +15 -0
  1308. package/src/tools/CtxInspectTool/CtxInspectTool.js +44 -0
  1309. package/src/tools/DiscoverSkillsTool/prompt.js +4 -0
  1310. package/src/tools/EmailReadTool/index.js +410 -0
  1311. package/src/tools/EmailSendTool/index.js +178 -0
  1312. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.js +98 -0
  1313. package/src/tools/EnterPlanModeTool/UI.js +14 -0
  1314. package/src/tools/EnterPlanModeTool/constants.js +1 -0
  1315. package/src/tools/EnterPlanModeTool/prompt.js +164 -0
  1316. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.js +104 -0
  1317. package/src/tools/EnterWorktreeTool/UI.js +9 -0
  1318. package/src/tools/EnterWorktreeTool/constants.js +1 -0
  1319. package/src/tools/EnterWorktreeTool/prompt.js +30 -0
  1320. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.js +383 -0
  1321. package/src/tools/ExitPlanModeTool/UI.js +32 -0
  1322. package/src/tools/ExitPlanModeTool/constants.js +2 -0
  1323. package/src/tools/ExitPlanModeTool/prompt.js +27 -0
  1324. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.js +257 -0
  1325. package/src/tools/ExitWorktreeTool/UI.js +10 -0
  1326. package/src/tools/ExitWorktreeTool/constants.js +1 -0
  1327. package/src/tools/ExitWorktreeTool/prompt.js +32 -0
  1328. package/src/tools/FileEditTool/FileEditTool.js +480 -0
  1329. package/src/tools/FileEditTool/UI.js +202 -0
  1330. package/src/tools/FileEditTool/constants.js +7 -0
  1331. package/src/tools/FileEditTool/prompt.js +24 -0
  1332. package/src/tools/FileEditTool/types.js +50 -0
  1333. package/src/tools/FileEditTool/utils.js +579 -0
  1334. package/src/tools/FileReadTool/FileReadTool.js +889 -0
  1335. package/src/tools/FileReadTool/UI.js +126 -0
  1336. package/src/tools/FileReadTool/imageProcessor.js +46 -0
  1337. package/src/tools/FileReadTool/limits.js +70 -0
  1338. package/src/tools/FileReadTool/prompt.js +31 -0
  1339. package/src/tools/FileWriteTool/FileWriteTool.js +341 -0
  1340. package/src/tools/FileWriteTool/UI.js +339 -0
  1341. package/src/tools/FileWriteTool/prompt.js +15 -0
  1342. package/src/tools/GlobTool/GlobTool.js +161 -0
  1343. package/src/tools/GlobTool/UI.js +40 -0
  1344. package/src/tools/GlobTool/prompt.js +6 -0
  1345. package/src/tools/GrepTool/GrepTool.js +439 -0
  1346. package/src/tools/GrepTool/UI.js +155 -0
  1347. package/src/tools/GrepTool/prompt.js +16 -0
  1348. package/src/tools/IntegrationsTool/IntegrationsTool.js +217 -0
  1349. package/src/tools/IntegrationsTool/constants.js +1 -0
  1350. package/src/tools/IntegrationsTool/prompt.js +41 -0
  1351. package/src/tools/InteractionsTool/InteractionsTool.js +525 -0
  1352. package/src/tools/InteractionsTool/constants.js +1 -0
  1353. package/src/tools/InteractionsTool/prompt.js +14 -0
  1354. package/src/tools/InvoicesTool/InvoicesTool.js +581 -0
  1355. package/src/tools/InvoicesTool/constants.js +1 -0
  1356. package/src/tools/InvoicesTool/prompt.js +15 -0
  1357. package/src/tools/LSPTool/LSPTool.js +660 -0
  1358. package/src/tools/LSPTool/UI.js +205 -0
  1359. package/src/tools/LSPTool/formatters.js +445 -0
  1360. package/src/tools/LSPTool/prompt.js +20 -0
  1361. package/src/tools/LSPTool/schemas.js +197 -0
  1362. package/src/tools/LSPTool/symbolContext.js +75 -0
  1363. package/src/tools/LeadScorerTool/LeadScorerTool.js +509 -0
  1364. package/src/tools/LeadScorerTool/constants.js +1 -0
  1365. package/src/tools/LeadScorerTool/prompt.js +11 -0
  1366. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +100 -0
  1367. package/src/tools/ListMcpResourcesTool/UI.js +17 -0
  1368. package/src/tools/ListMcpResourcesTool/prompt.js +18 -0
  1369. package/src/tools/ListPeersTool/ListPeersTool.js +45 -0
  1370. package/src/tools/MCPTool/MCPTool.js +60 -0
  1371. package/src/tools/MCPTool/UI.js +343 -0
  1372. package/src/tools/MCPTool/classifyForCollapse.js +597 -0
  1373. package/src/tools/MCPTool/prompt.js +3 -0
  1374. package/src/tools/McpAuthTool/McpAuthTool.js +162 -0
  1375. package/src/tools/MonitorTool/MonitorTool.js +55 -0
  1376. package/src/tools/NotebookEditTool/NotebookEditTool.js +421 -0
  1377. package/src/tools/NotebookEditTool/UI.js +41 -0
  1378. package/src/tools/NotebookEditTool/constants.js +2 -0
  1379. package/src/tools/NotebookEditTool/prompt.js +2 -0
  1380. package/src/tools/OverflowTestTool/OverflowTestTool.js +51 -0
  1381. package/src/tools/PhoneBridgeTool/PhoneBridgeTool.js +301 -0
  1382. package/src/tools/PhoneBridgeTool/constants.js +1 -0
  1383. package/src/tools/PhoneBridgeTool/prompt.js +26 -0
  1384. package/src/tools/PowerShellTool/PowerShellTool.js +900 -0
  1385. package/src/tools/PowerShellTool/UI.js +58 -0
  1386. package/src/tools/PowerShellTool/clmTypes.js +207 -0
  1387. package/src/tools/PowerShellTool/commandSemantics.js +115 -0
  1388. package/src/tools/PowerShellTool/commonParameters.js +27 -0
  1389. package/src/tools/PowerShellTool/destructiveCommandWarning.js +92 -0
  1390. package/src/tools/PowerShellTool/gitSafety.js +185 -0
  1391. package/src/tools/PowerShellTool/modeValidation.js +357 -0
  1392. package/src/tools/PowerShellTool/pathValidation.js +1712 -0
  1393. package/src/tools/PowerShellTool/powershellPermissions.js +1351 -0
  1394. package/src/tools/PowerShellTool/powershellSecurity.js +942 -0
  1395. package/src/tools/PowerShellTool/prompt.js +132 -0
  1396. package/src/tools/PowerShellTool/readOnlyValidation.js +1633 -0
  1397. package/src/tools/PowerShellTool/toolName.js +2 -0
  1398. package/src/tools/PushNotificationTool/PushNotificationTool.js +35 -0
  1399. package/src/tools/REPLTool/REPLTool.js +44 -0
  1400. package/src/tools/REPLTool/constants.js +43 -0
  1401. package/src/tools/REPLTool/primitiveTools.js +36 -0
  1402. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +112 -0
  1403. package/src/tools/ReadMcpResourceTool/UI.js +24 -0
  1404. package/src/tools/ReadMcpResourceTool/prompt.js +15 -0
  1405. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.js +142 -0
  1406. package/src/tools/RemoteTriggerTool/UI.js +12 -0
  1407. package/src/tools/RemoteTriggerTool/prompt.js +12 -0
  1408. package/src/tools/ReviewArtifactTool/ReviewArtifactTool.js +51 -0
  1409. package/src/tools/ScheduleCronTool/CronCreateTool.js +120 -0
  1410. package/src/tools/ScheduleCronTool/CronDeleteTool.js +74 -0
  1411. package/src/tools/ScheduleCronTool/CronListTool.js +77 -0
  1412. package/src/tools/ScheduleCronTool/UI.js +29 -0
  1413. package/src/tools/ScheduleCronTool/prompt.js +115 -0
  1414. package/src/tools/SendMessageTool/SendMessageTool.js +673 -0
  1415. package/src/tools/SendMessageTool/UI.js +24 -0
  1416. package/src/tools/SendMessageTool/constants.js +1 -0
  1417. package/src/tools/SendMessageTool/prompt.js +47 -0
  1418. package/src/tools/SendUserFileTool/SendUserFileTool.js +35 -0
  1419. package/src/tools/SendUserFileTool/prompt.js +5 -0
  1420. package/src/tools/SkillTool/SkillTool.js +825 -0
  1421. package/src/tools/SkillTool/UI.js +61 -0
  1422. package/src/tools/SkillTool/constants.js +1 -0
  1423. package/src/tools/SkillTool/prompt.js +184 -0
  1424. package/src/tools/SleepTool/SleepTool.js +42 -0
  1425. package/src/tools/SleepTool/prompt.js +14 -0
  1426. package/src/tools/SnipTool/SnipTool.js +47 -0
  1427. package/src/tools/SnipTool/prompt.js +5 -0
  1428. package/src/tools/SubscribePRTool/SubscribePRTool.js +49 -0
  1429. package/src/tools/SuggestBackgroundPRTool/SuggestBackgroundPRTool.js +44 -0
  1430. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.js +138 -0
  1431. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +1 -1
  1432. package/src/tools/TaskCreateTool/TaskCreateTool.js +104 -0
  1433. package/src/tools/TaskCreateTool/constants.js +1 -0
  1434. package/src/tools/TaskCreateTool/prompt.js +52 -0
  1435. package/src/tools/TaskGetTool/TaskGetTool.js +106 -0
  1436. package/src/tools/TaskGetTool/constants.js +1 -0
  1437. package/src/tools/TaskGetTool/prompt.js +23 -0
  1438. package/src/tools/TaskListTool/TaskListTool.js +89 -0
  1439. package/src/tools/TaskListTool/constants.js +1 -0
  1440. package/src/tools/TaskListTool/prompt.js +44 -0
  1441. package/src/tools/TaskOutputTool/TaskOutputTool.js +536 -0
  1442. package/src/tools/TaskOutputTool/constants.js +1 -0
  1443. package/src/tools/TaskStopTool/TaskStopTool.js +110 -0
  1444. package/src/tools/TaskStopTool/UI.js +31 -0
  1445. package/src/tools/TaskStopTool/prompt.js +7 -0
  1446. package/src/tools/TaskUpdateTool/TaskUpdateTool.js +301 -0
  1447. package/src/tools/TaskUpdateTool/constants.js +1 -0
  1448. package/src/tools/TaskUpdateTool/prompt.js +76 -0
  1449. package/src/tools/TeamCreateTool/TeamCreateTool.js +177 -0
  1450. package/src/tools/TeamCreateTool/UI.js +4 -0
  1451. package/src/tools/TeamCreateTool/constants.js +1 -0
  1452. package/src/tools/TeamCreateTool/prompt.js +113 -0
  1453. package/src/tools/TeamDeleteTool/TeamDeleteTool.js +102 -0
  1454. package/src/tools/TeamDeleteTool/UI.js +13 -0
  1455. package/src/tools/TeamDeleteTool/constants.js +1 -0
  1456. package/src/tools/TeamDeleteTool/prompt.js +16 -0
  1457. package/src/tools/TerminalCaptureTool/TerminalCaptureTool.js +47 -0
  1458. package/src/tools/TerminalCaptureTool/prompt.js +11 -0
  1459. package/src/tools/TodoWriteTool/TodoWriteTool.js +99 -0
  1460. package/src/tools/TodoWriteTool/constants.js +1 -0
  1461. package/src/tools/TodoWriteTool/prompt.js +181 -0
  1462. package/src/tools/ToolSearchTool/ToolSearchTool.js +357 -0
  1463. package/src/tools/ToolSearchTool/constants.js +1 -0
  1464. package/src/tools/ToolSearchTool/prompt.js +97 -0
  1465. package/src/tools/TungstenTool/TungstenLiveMonitor.js +7 -0
  1466. package/src/tools/TungstenTool/TungstenTool.js +3 -0
  1467. package/src/tools/VerifyPlanExecutionTool/VerifyPlanExecutionTool.js +45 -0
  1468. package/src/tools/VerifyPlanExecutionTool/constants.js +2 -0
  1469. package/src/tools/WebBrowserTool/WebBrowserPanel.js +5 -0
  1470. package/src/tools/WebBrowserTool/WebBrowserTool.js +58 -0
  1471. package/src/tools/WebFetchTool/UI.js +31 -0
  1472. package/src/tools/WebFetchTool/WebFetchTool.js +246 -0
  1473. package/src/tools/WebFetchTool/preapproved.js +154 -0
  1474. package/src/tools/WebFetchTool/prompt.js +39 -0
  1475. package/src/tools/WebFetchTool/utils.js +368 -0
  1476. package/src/tools/WebSearchTool/UI.js +67 -0
  1477. package/src/tools/WebSearchTool/WebSearchTool.js +396 -0
  1478. package/src/tools/WebSearchTool/prompt.js +32 -0
  1479. package/src/tools/WorkflowTool/WorkflowPermissionRequest.js +7 -0
  1480. package/src/tools/WorkflowTool/WorkflowTool.js +51 -0
  1481. package/src/tools/WorkflowTool/bundled/index.js +5 -0
  1482. package/src/tools/WorkflowTool/constants.js +1 -0
  1483. package/src/tools/WorkflowTool/createWorkflowCommand.js +5 -0
  1484. package/src/tools/shared/gitOperationTracking.js +220 -0
  1485. package/src/tools/shared/spawnMultiAgent.js +805 -0
  1486. package/src/tools/testing/TestingPermissionTool.js +72 -0
  1487. package/src/tools/utils.js +24 -0
  1488. package/src/tools.js +365 -0
  1489. package/src/types/command.js +8 -0
  1490. package/src/types/connectorText.js +3 -0
  1491. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.js +673 -0
  1492. package/src/types/generated/events_mono/common/v1/auth.js +49 -0
  1493. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.js +147 -0
  1494. package/src/types/generated/google/protobuf/timestamp.js +38 -0
  1495. package/src/types/hooks.js +153 -0
  1496. package/src/types/ids.js +27 -0
  1497. package/src/types/logs.js +11 -0
  1498. package/src/types/permissions.js +25 -0
  1499. package/src/types/plugin.js +72 -0
  1500. package/src/types/textInputTypes.js +20 -0
  1501. package/src/upstreamproxy/relay.js +346 -0
  1502. package/src/upstreamproxy/upstreamproxy.js +234 -0
  1503. package/src/utils/CircularBuffer.js +75 -0
  1504. package/src/utils/Cursor.js +1229 -0
  1505. package/src/utils/QueryGuard.js +115 -0
  1506. package/src/utils/Shell.js +374 -0
  1507. package/src/utils/ShellCommand.js +336 -0
  1508. package/src/utils/abortController.js +74 -0
  1509. package/src/utils/activityManager.js +127 -0
  1510. package/src/utils/advisor.js +77 -0
  1511. package/src/utils/agentContext.js +91 -0
  1512. package/src/utils/agentId.js +83 -0
  1513. package/src/utils/agentSwarmsEnabled.js +37 -0
  1514. package/src/utils/agenticSessionSearch.js +255 -0
  1515. package/src/utils/analyzeContext.js +846 -0
  1516. package/src/utils/ansiToPng.js +259 -0
  1517. package/src/utils/ansiToSvg.js +207 -0
  1518. package/src/utils/api.js +555 -0
  1519. package/src/utils/apiPreconnect.js +62 -0
  1520. package/src/utils/appleTerminalBackup.js +95 -0
  1521. package/src/utils/argumentSubstitution.js +114 -0
  1522. package/src/utils/array.js +12 -0
  1523. package/src/utils/asciicast.js +200 -0
  1524. package/src/utils/attachments.js +2518 -0
  1525. package/src/utils/attribution.js +308 -0
  1526. package/src/utils/auth.js +1598 -0
  1527. package/src/utils/authFileDescriptor.js +152 -0
  1528. package/src/utils/authPortable.js +14 -0
  1529. package/src/utils/autoModeDenials.js +15 -0
  1530. package/src/utils/autoRunIssue.js +113 -0
  1531. package/src/utils/autoUpdater.js +457 -0
  1532. package/src/utils/aws.js +44 -0
  1533. package/src/utils/awsAuthStatusManager.js +66 -0
  1534. package/src/utils/background/remote/preconditions.js +175 -0
  1535. package/src/utils/background/remote/remoteSession.js +53 -0
  1536. package/src/utils/backgroundHousekeeping.js +64 -0
  1537. package/src/utils/bash/ParsedCommand.js +241 -0
  1538. package/src/utils/bash/ShellSnapshot.js +489 -0
  1539. package/src/utils/bash/ast.js +2590 -0
  1540. package/src/utils/bash/bashParser.js +4355 -0
  1541. package/src/utils/bash/bashPipeCommand.js +249 -0
  1542. package/src/utils/bash/commands.js +1131 -0
  1543. package/src/utils/bash/heredoc.js +647 -0
  1544. package/src/utils/bash/parser.js +195 -0
  1545. package/src/utils/bash/prefix.js +154 -0
  1546. package/src/utils/bash/registry.js +23 -0
  1547. package/src/utils/bash/shellCompletion.js +196 -0
  1548. package/src/utils/bash/shellPrefix.js +25 -0
  1549. package/src/utils/bash/shellQuote.js +253 -0
  1550. package/src/utils/bash/shellQuoting.js +106 -0
  1551. package/src/utils/bash/specs/alias.js +11 -0
  1552. package/src/utils/bash/specs/index.js +16 -0
  1553. package/src/utils/bash/specs/nohup.js +10 -0
  1554. package/src/utils/bash/specs/pyright.js +88 -0
  1555. package/src/utils/bash/specs/sleep.js +10 -0
  1556. package/src/utils/bash/specs/srun.js +28 -0
  1557. package/src/utils/bash/specs/time.js +10 -0
  1558. package/src/utils/bash/specs/timeout.js +17 -0
  1559. package/src/utils/bash/treeSitterAnalysis.js +407 -0
  1560. package/src/utils/betas.js +331 -0
  1561. package/src/utils/billing.js +54 -0
  1562. package/src/utils/binaryCheck.js +40 -0
  1563. package/src/utils/browser.js +58 -0
  1564. package/src/utils/bufferedWriter.js +77 -0
  1565. package/src/utils/bundledMode.js +19 -0
  1566. package/src/utils/businessDb.js +390 -0
  1567. package/src/utils/caCerts.js +91 -0
  1568. package/src/utils/caCertsConfig.js +77 -0
  1569. package/src/utils/cachePaths.js +28 -0
  1570. package/src/utils/classifierApprovals.js +66 -0
  1571. package/src/utils/classifierApprovalsHook.js +10 -0
  1572. package/src/utils/claudeDesktop.js +108 -0
  1573. package/src/utils/claudeInChrome/chromeNativeHost.js +416 -0
  1574. package/src/utils/claudeInChrome/common.js +466 -0
  1575. package/src/utils/claudeInChrome/mcpServer.js +237 -0
  1576. package/src/utils/claudeInChrome/prompt.js +79 -0
  1577. package/src/utils/claudeInChrome/setup.js +304 -0
  1578. package/src/utils/claudeInChrome/setupPortable.js +172 -0
  1579. package/src/utils/claudeInChrome/toolRendering.js +235 -0
  1580. package/src/utils/claudemd.js +1052 -0
  1581. package/src/utils/cleanup.js +514 -0
  1582. package/src/utils/cleanupRegistry.js +22 -0
  1583. package/src/utils/cliArgs.js +53 -0
  1584. package/src/utils/cliHighlight.js +45 -0
  1585. package/src/utils/codeIndexing.js +149 -0
  1586. package/src/utils/collapseBackgroundBashNotifications.js +70 -0
  1587. package/src/utils/collapseHookSummaries.js +48 -0
  1588. package/src/utils/collapseReadSearch.js +869 -0
  1589. package/src/utils/collapseTeammateShutdowns.js +44 -0
  1590. package/src/utils/combinedAbortSignal.js +40 -0
  1591. package/src/utils/commandLifecycle.js +7 -0
  1592. package/src/utils/commitAttribution.js +718 -0
  1593. package/src/utils/completionCache.js +138 -0
  1594. package/src/utils/computerUse/appNames.js +170 -0
  1595. package/src/utils/computerUse/cleanup.js +65 -0
  1596. package/src/utils/computerUse/common.js +56 -0
  1597. package/src/utils/computerUse/computerUseLock.js +183 -0
  1598. package/src/utils/computerUse/drainRunLoop.js +71 -0
  1599. package/src/utils/computerUse/escHotkey.js +53 -0
  1600. package/src/utils/computerUse/executor.js +480 -0
  1601. package/src/utils/computerUse/gates.js +55 -0
  1602. package/src/utils/computerUse/hostAdapter.js +62 -0
  1603. package/src/utils/computerUse/inputLoader.js +25 -0
  1604. package/src/utils/computerUse/mcpServer.js +84 -0
  1605. package/src/utils/computerUse/setup.js +42 -0
  1606. package/src/utils/computerUse/swiftLoader.js +18 -0
  1607. package/src/utils/computerUse/toolRendering.js +101 -0
  1608. package/src/utils/computerUse/wrapper.js +317 -0
  1609. package/src/utils/concurrentSessions.js +179 -0
  1610. package/src/utils/config.js +1078 -0
  1611. package/src/utils/configConstants.js +18 -0
  1612. package/src/utils/contentArray.js +45 -0
  1613. package/src/utils/context.js +185 -0
  1614. package/src/utils/contextAnalysis.js +171 -0
  1615. package/src/utils/contextSuggestions.js +158 -0
  1616. package/src/utils/controlMessageCompat.js +31 -0
  1617. package/src/utils/conversationRecovery.js +434 -0
  1618. package/src/utils/cron.js +260 -0
  1619. package/src/utils/cronJitterConfig.js +62 -0
  1620. package/src/utils/cronScheduler.js +388 -0
  1621. package/src/utils/cronTasks.js +328 -0
  1622. package/src/utils/cronTasksLock.js +159 -0
  1623. package/src/utils/crossProjectResume.js +46 -0
  1624. package/src/utils/crypto.js +13 -0
  1625. package/src/utils/cwd.js +29 -0
  1626. package/src/utils/debug.js +220 -0
  1627. package/src/utils/debugFilter.js +125 -0
  1628. package/src/utils/deepLink/banner.js +103 -0
  1629. package/src/utils/deepLink/parseDeepLink.js +138 -0
  1630. package/src/utils/deepLink/protocolHandler.js +119 -0
  1631. package/src/utils/deepLink/registerProtocol.js +291 -0
  1632. package/src/utils/deepLink/terminalLauncher.js +455 -0
  1633. package/src/utils/deepLink/terminalPreference.js +51 -0
  1634. package/src/utils/desktopDeepLink.js +208 -0
  1635. package/src/utils/detectRepository.js +157 -0
  1636. package/src/utils/diagLogs.js +74 -0
  1637. package/src/utils/diff.js +108 -0
  1638. package/src/utils/directMemberMessage.js +34 -0
  1639. package/src/utils/displayTags.js +46 -0
  1640. package/src/utils/doctorContextWarnings.js +179 -0
  1641. package/src/utils/doctorDiagnostic.js +494 -0
  1642. package/src/utils/dxt/helpers.js +64 -0
  1643. package/src/utils/dxt/zip.js +167 -0
  1644. package/src/utils/earlyInput.js +166 -0
  1645. package/src/utils/editor.js +163 -0
  1646. package/src/utils/effort.js +271 -0
  1647. package/src/utils/embeddedTools.js +26 -0
  1648. package/src/utils/employeeChat.js +271 -0
  1649. package/src/utils/employeeDb.js +326 -0
  1650. package/src/utils/env.js +358 -0
  1651. package/src/utils/envDynamic.js +130 -0
  1652. package/src/utils/envUtils.js +161 -0
  1653. package/src/utils/envValidation.js +26 -0
  1654. package/src/utils/errorLogSink.js +196 -0
  1655. package/src/utils/errors.js +207 -0
  1656. package/src/utils/exampleCommands.js +165 -0
  1657. package/src/utils/execFileNoThrow.js +93 -0
  1658. package/src/utils/execFileNoThrowPortable.js +49 -0
  1659. package/src/utils/execSyncWrapper.js +6 -0
  1660. package/src/utils/exportRenderer.js +71 -0
  1661. package/src/utils/extraUsage.js +19 -0
  1662. package/src/utils/fastMode.js +393 -0
  1663. package/src/utils/file.js +467 -0
  1664. package/src/utils/fileHistory.js +851 -0
  1665. package/src/utils/fileOperationAnalytics.js +45 -0
  1666. package/src/utils/filePersistence/filePersistence.js +212 -0
  1667. package/src/utils/filePersistence/outputsScanner.js +104 -0
  1668. package/src/utils/filePersistence/types.js +4 -0
  1669. package/src/utils/fileRead.js +81 -0
  1670. package/src/utils/fileReadCache.js +78 -0
  1671. package/src/utils/fileStateCache.js +99 -0
  1672. package/src/utils/findExecutable.js +13 -0
  1673. package/src/utils/fingerprint.js +58 -0
  1674. package/src/utils/forkedAgent.js +410 -0
  1675. package/src/utils/format.js +238 -0
  1676. package/src/utils/formatBriefTimestamp.js +72 -0
  1677. package/src/utils/fpsTracker.js +34 -0
  1678. package/src/utils/frontmatterParser.js +260 -0
  1679. package/src/utils/fsOperations.js +555 -0
  1680. package/src/utils/fullscreen.js +194 -0
  1681. package/src/utils/generatedFiles.js +122 -0
  1682. package/src/utils/generators.js +67 -0
  1683. package/src/utils/genericProcessUtils.js +155 -0
  1684. package/src/utils/getWorktreePaths.js +56 -0
  1685. package/src/utils/getWorktreePathsPortable.js +23 -0
  1686. package/src/utils/ghPrStatus.js +71 -0
  1687. package/src/utils/git/gitConfigParser.js +226 -0
  1688. package/src/utils/git/gitFilesystem.js +606 -0
  1689. package/src/utils/git/gitignore.js +84 -0
  1690. package/src/utils/git.js +725 -0
  1691. package/src/utils/gitDiff.js +395 -0
  1692. package/src/utils/gitSettings.js +18 -0
  1693. package/src/utils/github/ghAuthStatus.js +23 -0
  1694. package/src/utils/githubRepoPathMapping.js +135 -0
  1695. package/src/utils/glob.js +90 -0
  1696. package/src/utils/gracefulShutdown.js +447 -0
  1697. package/src/utils/groupToolUses.js +126 -0
  1698. package/src/utils/handlePromptSubmit.js +398 -0
  1699. package/src/utils/hash.js +44 -0
  1700. package/src/utils/headlessProfiler.js +147 -0
  1701. package/src/utils/heapDumpService.js +201 -0
  1702. package/src/utils/heatmap.js +151 -0
  1703. package/src/utils/highlightMatch.js +29 -0
  1704. package/src/utils/hooks/AsyncHookRegistry.js +187 -0
  1705. package/src/utils/hooks/apiQueryHookHelper.js +77 -0
  1706. package/src/utils/hooks/execAgentHook.js +257 -0
  1707. package/src/utils/hooks/execHttpHook.js +184 -0
  1708. package/src/utils/hooks/execPromptHook.js +171 -0
  1709. package/src/utils/hooks/fileChangedWatcher.js +161 -0
  1710. package/src/utils/hooks/hookEvents.js +111 -0
  1711. package/src/utils/hooks/hookHelpers.js +60 -0
  1712. package/src/utils/hooks/hooksConfigManager.js +323 -0
  1713. package/src/utils/hooks/hooksConfigSnapshot.js +114 -0
  1714. package/src/utils/hooks/hooksSettings.js +204 -0
  1715. package/src/utils/hooks/postSamplingHooks.js +39 -0
  1716. package/src/utils/hooks/registerFrontmatterHooks.js +47 -0
  1717. package/src/utils/hooks/registerSkillHooks.js +40 -0
  1718. package/src/utils/hooks/sessionHooks.js +252 -0
  1719. package/src/utils/hooks/skillImprovement.js +211 -0
  1720. package/src/utils/hooks/ssrfGuard.js +258 -0
  1721. package/src/utils/hooks.js +3668 -0
  1722. package/src/utils/horizontalScroll.js +108 -0
  1723. package/src/utils/http.js +120 -0
  1724. package/src/utils/hyperlink.js +28 -0
  1725. package/src/utils/iTermBackup.js +48 -0
  1726. package/src/utils/ide.js +1195 -0
  1727. package/src/utils/idePathConversion.js +66 -0
  1728. package/src/utils/idleTimeout.js +44 -0
  1729. package/src/utils/imagePaste.js +343 -0
  1730. package/src/utils/imageResizer.js +664 -0
  1731. package/src/utils/imageStore.js +150 -0
  1732. package/src/utils/imageValidation.js +92 -0
  1733. package/src/utils/immediateCommand.js +12 -0
  1734. package/src/utils/inProcessTeammateHelpers.js +71 -0
  1735. package/src/utils/ink.js +20 -0
  1736. package/src/utils/intl.js +83 -0
  1737. package/src/utils/jetbrains.js +152 -0
  1738. package/src/utils/json.js +231 -0
  1739. package/src/utils/jsonRead.js +14 -0
  1740. package/src/utils/keyboardShortcuts.js +11 -0
  1741. package/src/utils/lazySchema.js +8 -0
  1742. package/src/utils/listSessionsImpl.js +332 -0
  1743. package/src/utils/localInstaller.js +130 -0
  1744. package/src/utils/lockfile.js +30 -0
  1745. package/src/utils/log.js +280 -0
  1746. package/src/utils/logoV2Utils.js +256 -0
  1747. package/src/utils/mailbox.js +50 -0
  1748. package/src/utils/managedEnv.js +160 -0
  1749. package/src/utils/managedEnvConstants.js +185 -0
  1750. package/src/utils/markdown.js +315 -0
  1751. package/src/utils/markdownConfigLoader.js +480 -0
  1752. package/src/utils/mcp/dateTimeParser.js +102 -0
  1753. package/src/utils/mcp/elicitationValidation.js +259 -0
  1754. package/src/utils/mcpInstructionsDelta.js +97 -0
  1755. package/src/utils/mcpOutputStorage.js +159 -0
  1756. package/src/utils/mcpValidation.js +165 -0
  1757. package/src/utils/mcpWebSocketTransport.js +180 -0
  1758. package/src/utils/memoize.js +205 -0
  1759. package/src/utils/memory/types.js +9 -0
  1760. package/src/utils/memory/versions.js +7 -0
  1761. package/src/utils/memoryFileDetection.js +245 -0
  1762. package/src/utils/messagePredicates.js +6 -0
  1763. package/src/utils/messageQueueManager.js +430 -0
  1764. package/src/utils/messages/mappers.js +240 -0
  1765. package/src/utils/messages/systemInit.js +72 -0
  1766. package/src/utils/messages.js +4286 -0
  1767. package/src/utils/model/agent.js +128 -0
  1768. package/src/utils/model/aliases.js +21 -0
  1769. package/src/utils/model/antModels.js +25 -0
  1770. package/src/utils/model/bedrock.js +220 -0
  1771. package/src/utils/model/check1mAccess.js +64 -0
  1772. package/src/utils/model/configs.js +86 -0
  1773. package/src/utils/model/contextWindowUpgradeCheck.js +41 -0
  1774. package/src/utils/model/deprecation.js +72 -0
  1775. package/src/utils/model/model.js +533 -0
  1776. package/src/utils/model/modelAllowlist.js +148 -0
  1777. package/src/utils/model/modelCapabilities.js +105 -0
  1778. package/src/utils/model/modelOptions.js +450 -0
  1779. package/src/utils/model/modelStrings.js +144 -0
  1780. package/src/utils/model/modelSupportOverrides.js +40 -0
  1781. package/src/utils/model/providers.js +35 -0
  1782. package/src/utils/model/validateModel.js +131 -0
  1783. package/src/utils/modelCost.js +160 -0
  1784. package/src/utils/modifiers.js +39 -0
  1785. package/src/utils/mtls.js +132 -0
  1786. package/src/utils/nativeInstaller/download.js +370 -0
  1787. package/src/utils/nativeInstaller/index.js +8 -0
  1788. package/src/utils/nativeInstaller/installer.js +1395 -0
  1789. package/src/utils/nativeInstaller/packageManagers.js +258 -0
  1790. package/src/utils/nativeInstaller/pidLock.js +347 -0
  1791. package/src/utils/notebook.js +176 -0
  1792. package/src/utils/objectGroupBy.js +15 -0
  1793. package/src/utils/pasteStore.js +93 -0
  1794. package/src/utils/path.js +140 -0
  1795. package/src/utils/pdf.js +236 -0
  1796. package/src/utils/pdfUtils.js +61 -0
  1797. package/src/utils/peerAddress.js +20 -0
  1798. package/src/utils/permissions/PermissionMode.js +95 -0
  1799. package/src/utils/permissions/PermissionPromptToolResultSchema.js +85 -0
  1800. package/src/utils/permissions/PermissionResult.js +11 -0
  1801. package/src/utils/permissions/PermissionRule.js +19 -0
  1802. package/src/utils/permissions/PermissionUpdate.js +268 -0
  1803. package/src/utils/permissions/PermissionUpdateSchema.js +61 -0
  1804. package/src/utils/permissions/autoModeState.js +31 -0
  1805. package/src/utils/permissions/bashClassifier.js +30 -0
  1806. package/src/utils/permissions/bypassPermissionsKillswitch.js +115 -0
  1807. package/src/utils/permissions/classifierDecision.js +86 -0
  1808. package/src/utils/permissions/classifierShared.js +28 -0
  1809. package/src/utils/permissions/dangerousPatterns.js +78 -0
  1810. package/src/utils/permissions/denialTracking.js +34 -0
  1811. package/src/utils/permissions/filesystem.js +1411 -0
  1812. package/src/utils/permissions/getNextPermissionMode.js +74 -0
  1813. package/src/utils/permissions/pathValidation.js +351 -0
  1814. package/src/utils/permissions/permissionExplainer.js +188 -0
  1815. package/src/utils/permissions/permissionRuleParser.js +175 -0
  1816. package/src/utils/permissions/permissionSetup.js +1162 -0
  1817. package/src/utils/permissions/permissions.js +1063 -0
  1818. package/src/utils/permissions/permissionsLoader.js +217 -0
  1819. package/src/utils/permissions/shadowedRuleDetection.js +149 -0
  1820. package/src/utils/permissions/shellRuleMatching.js +174 -0
  1821. package/src/utils/permissions/yoloClassifier.js +1193 -0
  1822. package/src/utils/planModeV2.js +75 -0
  1823. package/src/utils/plans.js +334 -0
  1824. package/src/utils/platform.js +122 -0
  1825. package/src/utils/plugins/addDirPluginSettings.js +53 -0
  1826. package/src/utils/plugins/cacheUtils.js +174 -0
  1827. package/src/utils/plugins/dependencyResolver.js +244 -0
  1828. package/src/utils/plugins/fetchTelemetry.js +108 -0
  1829. package/src/utils/plugins/gitAvailability.js +65 -0
  1830. package/src/utils/plugins/headlessPluginInstall.js +136 -0
  1831. package/src/utils/plugins/hintRecommendation.js +136 -0
  1832. package/src/utils/plugins/installCounts.js +221 -0
  1833. package/src/utils/plugins/installedPluginsManager.js +1003 -0
  1834. package/src/utils/plugins/loadPluginAgents.js +219 -0
  1835. package/src/utils/plugins/loadPluginCommands.js +595 -0
  1836. package/src/utils/plugins/loadPluginHooks.js +239 -0
  1837. package/src/utils/plugins/loadPluginOutputStyles.js +112 -0
  1838. package/src/utils/plugins/lspPluginIntegration.js +293 -0
  1839. package/src/utils/plugins/lspRecommendation.js +278 -0
  1840. package/src/utils/plugins/managedPlugins.js +26 -0
  1841. package/src/utils/plugins/marketplaceHelpers.js +470 -0
  1842. package/src/utils/plugins/marketplaceManager.js +1939 -0
  1843. package/src/utils/plugins/mcpPluginIntegration.js +465 -0
  1844. package/src/utils/plugins/mcpbHandler.js +708 -0
  1845. package/src/utils/plugins/officialMarketplace.js +19 -0
  1846. package/src/utils/plugins/officialMarketplaceGcs.js +202 -0
  1847. package/src/utils/plugins/officialMarketplaceStartupCheck.js +344 -0
  1848. package/src/utils/plugins/orphanedPluginFilter.js +96 -0
  1849. package/src/utils/plugins/parseMarketplaceInput.js +143 -0
  1850. package/src/utils/plugins/performStartupChecks.js +66 -0
  1851. package/src/utils/plugins/pluginAutoupdate.js +210 -0
  1852. package/src/utils/plugins/pluginBlocklist.js +93 -0
  1853. package/src/utils/plugins/pluginDirectories.js +170 -0
  1854. package/src/utils/plugins/pluginFlagging.js +173 -0
  1855. package/src/utils/plugins/pluginIdentifier.js +78 -0
  1856. package/src/utils/plugins/pluginInstallationHelpers.js +400 -0
  1857. package/src/utils/plugins/pluginLoader.js +2426 -0
  1858. package/src/utils/plugins/pluginOptionsStorage.js +311 -0
  1859. package/src/utils/plugins/pluginPolicy.js +18 -0
  1860. package/src/utils/plugins/pluginStartupCheck.js +261 -0
  1861. package/src/utils/plugins/pluginVersioning.js +128 -0
  1862. package/src/utils/plugins/reconciler.js +181 -0
  1863. package/src/utils/plugins/refresh.js +162 -0
  1864. package/src/utils/plugins/schemas.js +1283 -0
  1865. package/src/utils/plugins/validatePlugin.js +765 -0
  1866. package/src/utils/plugins/walkPluginMarkdown.js +49 -0
  1867. package/src/utils/plugins/zipCache.js +346 -0
  1868. package/src/utils/plugins/zipCacheAdapters.js +133 -0
  1869. package/src/utils/powershell/dangerousCmdlets.js +174 -0
  1870. package/src/utils/powershell/parser.js +1357 -0
  1871. package/src/utils/powershell/staticPrefix.js +277 -0
  1872. package/src/utils/preflightChecks.js +147 -0
  1873. package/src/utils/privacyLevel.js +49 -0
  1874. package/src/utils/process.js +56 -0
  1875. package/src/utils/processUserInput/processBashCommand.js +118 -0
  1876. package/src/utils/processUserInput/processSlashCommand.js +845 -0
  1877. package/src/utils/processUserInput/processTextPrompt.js +68 -0
  1878. package/src/utils/processUserInput/processUserInput.js +344 -0
  1879. package/src/utils/profilerBase.js +32 -0
  1880. package/src/utils/promptCategory.js +39 -0
  1881. package/src/utils/promptEditor.js +151 -0
  1882. package/src/utils/promptShellExecution.js +117 -0
  1883. package/src/utils/protectedNamespace.js +4 -0
  1884. package/src/utils/proxy.js +345 -0
  1885. package/src/utils/queryContext.js +110 -0
  1886. package/src/utils/queryHelpers.js +436 -0
  1887. package/src/utils/queryProfiler.js +242 -0
  1888. package/src/utils/queueProcessor.js +70 -0
  1889. package/src/utils/readEditContext.js +176 -0
  1890. package/src/utils/readFileInRange.js +278 -0
  1891. package/src/utils/releaseNotes.js +307 -0
  1892. package/src/utils/renderOptions.js +67 -0
  1893. package/src/utils/ripgrep.js +521 -0
  1894. package/src/utils/sandbox/sandbox-adapter.js +750 -0
  1895. package/src/utils/sandbox/sandbox-ui-utils.js +11 -0
  1896. package/src/utils/sanitization.js +72 -0
  1897. package/src/utils/screenshotClipboard.js +89 -0
  1898. package/src/utils/sdkEventQueue.js +49 -0
  1899. package/src/utils/secureStorage/fallbackStorage.js +59 -0
  1900. package/src/utils/secureStorage/index.js +13 -0
  1901. package/src/utils/secureStorage/keychainPrefetch.js +91 -0
  1902. package/src/utils/secureStorage/macOsKeychainHelpers.js +91 -0
  1903. package/src/utils/secureStorage/macOsKeychainStorage.js +192 -0
  1904. package/src/utils/secureStorage/plainTextStorage.js +81 -0
  1905. package/src/utils/semanticBoolean.js +23 -0
  1906. package/src/utils/semanticNumber.js +34 -0
  1907. package/src/utils/semver.js +51 -0
  1908. package/src/utils/sequential.js +43 -0
  1909. package/src/utils/sessionActivity.js +120 -0
  1910. package/src/utils/sessionEnvVars.js +18 -0
  1911. package/src/utils/sessionEnvironment.js +131 -0
  1912. package/src/utils/sessionFileAccessHooks.js +205 -0
  1913. package/src/utils/sessionIngressAuth.js +113 -0
  1914. package/src/utils/sessionRestore.js +357 -0
  1915. package/src/utils/sessionStart.js +165 -0
  1916. package/src/utils/sessionState.js +76 -0
  1917. package/src/utils/sessionStorage.js +4162 -0
  1918. package/src/utils/sessionStoragePortable.js +665 -0
  1919. package/src/utils/sessionTitle.js +120 -0
  1920. package/src/utils/sessionUrl.js +50 -0
  1921. package/src/utils/set.js +50 -0
  1922. package/src/utils/settings/allErrors.js +29 -0
  1923. package/src/utils/settings/applySettingsChange.js +65 -0
  1924. package/src/utils/settings/changeDetector.js +409 -0
  1925. package/src/utils/settings/constants.js +166 -0
  1926. package/src/utils/settings/internalWrites.js +33 -0
  1927. package/src/utils/settings/managedPath.js +29 -0
  1928. package/src/utils/settings/mdm/constants.js +62 -0
  1929. package/src/utils/settings/mdm/rawRead.js +97 -0
  1930. package/src/utils/settings/mdm/settings.js +254 -0
  1931. package/src/utils/settings/permissionValidation.js +224 -0
  1932. package/src/utils/settings/pluginOnlyPolicy.js +53 -0
  1933. package/src/utils/settings/schemaOutput.js +7 -0
  1934. package/src/utils/settings/settings.js +791 -0
  1935. package/src/utils/settings/settingsCache.js +47 -0
  1936. package/src/utils/settings/toolValidationConfig.js +76 -0
  1937. package/src/utils/settings/types.js +846 -0
  1938. package/src/utils/settings/validateEditTool.js +34 -0
  1939. package/src/utils/settings/validation.js +192 -0
  1940. package/src/utils/settings/validationTips.js +111 -0
  1941. package/src/utils/shell/bashProvider.js +202 -0
  1942. package/src/utils/shell/outputLimits.js +7 -0
  1943. package/src/utils/shell/powershellDetection.js +96 -0
  1944. package/src/utils/shell/powershellProvider.js +104 -0
  1945. package/src/utils/shell/prefix.js +246 -0
  1946. package/src/utils/shell/readOnlyCommandValidation.js +1776 -0
  1947. package/src/utils/shell/resolveDefaultShell.js +13 -0
  1948. package/src/utils/shell/shellProvider.js +2 -0
  1949. package/src/utils/shell/shellToolUtils.js +21 -0
  1950. package/src/utils/shell/specPrefix.js +198 -0
  1951. package/src/utils/shellConfig.js +136 -0
  1952. package/src/utils/sideQuery.js +134 -0
  1953. package/src/utils/sideQuestion.js +121 -0
  1954. package/src/utils/signal.js +34 -0
  1955. package/src/utils/sinks.js +15 -0
  1956. package/src/utils/skills/skillChangeDetector.js +264 -0
  1957. package/src/utils/slashCommandParsing.js +46 -0
  1958. package/src/utils/sleep.js +72 -0
  1959. package/src/utils/sliceAnsi.js +74 -0
  1960. package/src/utils/slowOperations.js +216 -0
  1961. package/src/utils/standaloneAgent.js +20 -0
  1962. package/src/utils/startupProfiler.js +149 -0
  1963. package/src/utils/staticRender.js +104 -0
  1964. package/src/utils/stats.js +802 -0
  1965. package/src/utils/statsCache.js +330 -0
  1966. package/src/utils/status.js +359 -0
  1967. package/src/utils/statusNoticeDefinitions.js +123 -0
  1968. package/src/utils/statusNoticeHelpers.js +15 -0
  1969. package/src/utils/stream.js +73 -0
  1970. package/src/utils/streamJsonStdoutGuard.js +107 -0
  1971. package/src/utils/streamlinedTransform.js +162 -0
  1972. package/src/utils/stringUtils.js +202 -0
  1973. package/src/utils/subprocessEnv.js +87 -0
  1974. package/src/utils/suggestions/commandSuggestions.js +458 -0
  1975. package/src/utils/suggestions/directoryCompletion.js +191 -0
  1976. package/src/utils/suggestions/shellHistoryCompletion.js +95 -0
  1977. package/src/utils/suggestions/skillUsageTracking.js +50 -0
  1978. package/src/utils/suggestions/slackChannelSuggestions.js +169 -0
  1979. package/src/utils/swarm/It2SetupPrompt.js +386 -0
  1980. package/src/utils/swarm/backends/ITermBackend.js +276 -0
  1981. package/src/utils/swarm/backends/InProcessBackend.js +237 -0
  1982. package/src/utils/swarm/backends/PaneBackendExecutor.js +250 -0
  1983. package/src/utils/swarm/backends/TmuxBackend.js +574 -0
  1984. package/src/utils/swarm/backends/detection.js +112 -0
  1985. package/src/utils/swarm/backends/it2Setup.js +185 -0
  1986. package/src/utils/swarm/backends/registry.js +369 -0
  1987. package/src/utils/swarm/backends/teammateModeSnapshot.js +68 -0
  1988. package/src/utils/swarm/backends/types.js +9 -0
  1989. package/src/utils/swarm/constants.js +29 -0
  1990. package/src/utils/swarm/inProcessRunner.js +1021 -0
  1991. package/src/utils/swarm/leaderPermissionBridge.js +31 -0
  1992. package/src/utils/swarm/permissionSync.js +667 -0
  1993. package/src/utils/swarm/reconnection.js +82 -0
  1994. package/src/utils/swarm/spawnInProcess.js +218 -0
  1995. package/src/utils/swarm/spawnUtils.js +123 -0
  1996. package/src/utils/swarm/teamHelpers.js +484 -0
  1997. package/src/utils/swarm/teammateInit.js +87 -0
  1998. package/src/utils/swarm/teammateLayoutManager.js +82 -0
  1999. package/src/utils/swarm/teammateModel.js +9 -0
  2000. package/src/utils/swarm/teammatePromptAddendum.js +17 -0
  2001. package/src/utils/systemDirectories.js +51 -0
  2002. package/src/utils/systemPrompt.js +88 -0
  2003. package/src/utils/systemPromptType.js +9 -0
  2004. package/src/utils/systemTheme.js +108 -0
  2005. package/src/utils/taggedId.js +49 -0
  2006. package/src/utils/task/TaskOutput.js +320 -0
  2007. package/src/utils/task/diskOutput.js +387 -0
  2008. package/src/utils/task/framework.js +236 -0
  2009. package/src/utils/task/outputFormatting.js +24 -0
  2010. package/src/utils/task/sdkProgress.js +24 -0
  2011. package/src/utils/taskSummary.js +3 -0
  2012. package/src/utils/tasks.js +672 -0
  2013. package/src/utils/teamDiscovery.js +48 -0
  2014. package/src/utils/teamMemoryOps.js +67 -0
  2015. package/src/utils/teammate.js +237 -0
  2016. package/src/utils/teammateContext.js +56 -0
  2017. package/src/utils/teammateMailbox.js +793 -0
  2018. package/src/utils/telemetry/betaSessionTracing.js +25 -0
  2019. package/src/utils/telemetry/bigqueryExporter.js +17 -0
  2020. package/src/utils/telemetry/events.js +7 -0
  2021. package/src/utils/telemetry/instrumentation.js +16 -0
  2022. package/src/utils/telemetry/logger.js +25 -0
  2023. package/src/utils/telemetry/perfettoTracing.js +882 -0
  2024. package/src/utils/telemetry/pluginTelemetry.js +76 -0
  2025. package/src/utils/telemetry/sessionTracing.js +62 -0
  2026. package/src/utils/telemetry/skillLoadedEvent.js +4 -0
  2027. package/src/utils/telemetryAttributes.js +56 -0
  2028. package/src/utils/teleport/api.js +299 -0
  2029. package/src/utils/teleport/environmentSelection.js +55 -0
  2030. package/src/utils/teleport/environments.js +84 -0
  2031. package/src/utils/teleport/gitBundle.js +192 -0
  2032. package/src/utils/teleport.js +1047 -0
  2033. package/src/utils/tempfile.js +26 -0
  2034. package/src/utils/terminal.js +105 -0
  2035. package/src/utils/terminalPanel.js +155 -0
  2036. package/src/utils/textHighlighting.js +113 -0
  2037. package/src/utils/thaddeusHints.js +142 -0
  2038. package/src/utils/theme.js +525 -0
  2039. package/src/utils/thinking.js +130 -0
  2040. package/src/utils/timeouts.js +35 -0
  2041. package/src/utils/tmuxSocket.js +373 -0
  2042. package/src/utils/todo/types.js +9 -0
  2043. package/src/utils/tokenBudget.js +62 -0
  2044. package/src/utils/tokens.js +223 -0
  2045. package/src/utils/toolErrors.js +101 -0
  2046. package/src/utils/toolPool.js +61 -0
  2047. package/src/utils/toolResultStorage.js +768 -0
  2048. package/src/utils/toolSchemaCache.js +7 -0
  2049. package/src/utils/toolSearch.js +551 -0
  2050. package/src/utils/transcriptSearch.js +200 -0
  2051. package/src/utils/treeify.js +111 -0
  2052. package/src/utils/truncate.js +164 -0
  2053. package/src/utils/udsClient.js +5 -0
  2054. package/src/utils/udsMessaging.js +23 -0
  2055. package/src/utils/ultraplan/ccrSession.js +264 -0
  2056. package/src/utils/ultraplan/keyword.js +122 -0
  2057. package/src/utils/unaryLogging.js +16 -0
  2058. package/src/utils/undercover.js +89 -0
  2059. package/src/utils/user.js +137 -0
  2060. package/src/utils/userAgent.js +9 -0
  2061. package/src/utils/userPromptKeywords.js +21 -0
  2062. package/src/utils/uuid.js +22 -0
  2063. package/src/utils/warningHandler.js +97 -0
  2064. package/src/utils/which.js +75 -0
  2065. package/src/utils/windowsPaths.js +146 -0
  2066. package/src/utils/withResolvers.js +13 -0
  2067. package/src/utils/words.js +793 -0
  2068. package/src/utils/workforceIntent.js +192 -0
  2069. package/src/utils/workloadContext.js +42 -0
  2070. package/src/utils/worktree.js +1142 -0
  2071. package/src/utils/worktreeModeEnabled.js +11 -0
  2072. package/src/utils/xdg.js +52 -0
  2073. package/src/utils/xml.js +15 -0
  2074. package/src/utils/yaml.js +14 -0
  2075. package/src/utils/zodToJsonSchema.js +19 -0
  2076. package/src/vim/motions.js +73 -0
  2077. package/src/vim/operators.js +401 -0
  2078. package/src/vim/textObjects.js +153 -0
  2079. package/src/vim/transitions.js +340 -0
  2080. package/src/vim/types.js +93 -0
  2081. package/src/voice/voiceModeEnabled.js +20 -0
  2082. package/thaddeus-terminal.ts +401 -3
package/src/ink/ink.js ADDED
@@ -0,0 +1,1645 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import autoBind from 'auto-bind';
3
+ import { closeSync, constants as fsConstants, openSync, readSync, writeSync } from 'fs';
4
+ import noop from 'lodash-es/noop.js';
5
+ import throttle from 'lodash-es/throttle.js';
6
+ import React from 'react';
7
+ import { ConcurrentRoot } from 'react-reconciler/constants.js';
8
+ import { onExit } from 'signal-exit';
9
+ import { flushInteractionTime } from 'src/bootstrap/state.js';
10
+ import { getYogaCounters } from 'src/native-ts/yoga-layout/index.js';
11
+ import { logForDebugging } from 'src/utils/debug.js';
12
+ import { logError } from 'src/utils/log.js';
13
+ import { format } from 'util';
14
+ import { colorize } from './colorize.js';
15
+ import App from './components/App.js';
16
+ import { FRAME_INTERVAL_MS } from './constants.js';
17
+ import * as dom from './dom.js';
18
+ import { KeyboardEvent } from './events/keyboard-event.js';
19
+ import { FocusManager } from './focus.js';
20
+ import { emptyFrame } from './frame.js';
21
+ import { dispatchClick, dispatchHover } from './hit-test.js';
22
+ import instances from './instances.js';
23
+ import { LogUpdate } from './log-update.js';
24
+ import { nodeCache } from './node-cache.js';
25
+ import { optimize } from './optimizer.js';
26
+ import Output from './output.js';
27
+ import reconciler, { dispatcher, getLastCommitMs, getLastYogaMs, isDebugRepaintsEnabled, recordYogaMs, resetProfileCounters } from './reconciler.js';
28
+ import renderNodeToOutput, { consumeFollowScroll, didLayoutShift } from './render-node-to-output.js';
29
+ import { applyPositionedHighlight, scanPositions } from './render-to-screen.js';
30
+ import createRenderer from './renderer.js';
31
+ import { CharPool, cellAt, createScreen, HyperlinkPool, isEmptyCellAt, migrateScreenPools, StylePool } from './screen.js';
32
+ import { applySearchHighlight } from './searchHighlight.js';
33
+ import { applySelectionOverlay, captureScrolledRows, clearSelection, createSelectionState, extendSelection, findPlainTextUrlAt, getSelectedText, hasSelection, moveFocus, selectLineAt, selectWordAt, shiftAnchor, shiftSelection, shiftSelectionForFollow, startSelection, updateSelection } from './selection.js';
34
+ import { SYNC_OUTPUT_SUPPORTED, supportsExtendedKeys, writeDiffToTerminal } from './terminal.js';
35
+ import { CURSOR_HOME, cursorMove, cursorPosition, DISABLE_KITTY_KEYBOARD, DISABLE_MODIFY_OTHER_KEYS, ENABLE_KITTY_KEYBOARD, ENABLE_MODIFY_OTHER_KEYS, ERASE_SCREEN } from './termio/csi.js';
36
+ import { DBP, DFE, DISABLE_MOUSE_TRACKING, ENABLE_MOUSE_TRACKING, ENTER_ALT_SCREEN, EXIT_ALT_SCREEN, SHOW_CURSOR } from './termio/dec.js';
37
+ import { CLEAR_ITERM2_PROGRESS, CLEAR_TAB_STATUS, setClipboard, supportsTabStatus, wrapForMultiplexer } from './termio/osc.js';
38
+ import { TerminalWriteProvider } from './useTerminalNotification.js';
39
+ // Alt-screen: renderer.ts sets cursor.visible = !isTTY || screen.height===0,
40
+ // which is always false in alt-screen (TTY + content fills screen).
41
+ // Reusing a frozen object saves 1 allocation per frame.
42
+ const ALT_SCREEN_ANCHOR_CURSOR = Object.freeze({
43
+ x: 0,
44
+ y: 0,
45
+ visible: false
46
+ });
47
+ const CURSOR_HOME_PATCH = Object.freeze({
48
+ type: 'stdout',
49
+ content: CURSOR_HOME
50
+ });
51
+ const ERASE_THEN_HOME_PATCH = Object.freeze({
52
+ type: 'stdout',
53
+ content: ERASE_SCREEN + CURSOR_HOME
54
+ });
55
+ // Cached per-Ink-instance, invalidated on resize. frame.cursor.y for
56
+ // alt-screen is always terminalRows - 1 (renderer.ts).
57
+ function makeAltScreenParkPatch(terminalRows) {
58
+ return Object.freeze({
59
+ type: 'stdout',
60
+ content: cursorPosition(terminalRows, 1)
61
+ });
62
+ }
63
+ export default class Ink {
64
+ options;
65
+ log;
66
+ terminal;
67
+ scheduleRender;
68
+ // Ignore last render after unmounting a tree to prevent empty output before exit
69
+ isUnmounted = false;
70
+ isPaused = false;
71
+ container;
72
+ rootNode;
73
+ focusManager;
74
+ renderer;
75
+ stylePool;
76
+ charPool;
77
+ hyperlinkPool;
78
+ exitPromise;
79
+ restoreConsole;
80
+ restoreStderr;
81
+ unsubscribeTTYHandlers;
82
+ terminalColumns;
83
+ terminalRows;
84
+ currentNode = null;
85
+ frontFrame;
86
+ backFrame;
87
+ lastPoolResetTime = performance.now();
88
+ drainTimer = null;
89
+ lastYogaCounters = {
90
+ ms: 0,
91
+ visited: 0,
92
+ measured: 0,
93
+ cacheHits: 0,
94
+ live: 0
95
+ };
96
+ altScreenParkPatch;
97
+ // Text selection state (alt-screen only). Owned here so the overlay
98
+ // pass in onRender can read it and App.tsx can update it from mouse
99
+ // events. Public so instances.get() callers can access.
100
+ selection = createSelectionState();
101
+ // Search highlight query (alt-screen only). Setter below triggers
102
+ // scheduleRender; applySearchHighlight in onRender inverts matching cells.
103
+ searchHighlightQuery = '';
104
+ // Position-based highlight. VML scans positions ONCE (via
105
+ // scanElementSubtree, when the target message is mounted), stores them
106
+ // message-relative, sets this for every-frame apply. rowOffset =
107
+ // message's current screen-top. currentIdx = which position is
108
+ // "current" (yellow). null clears. Positions are known upfront —
109
+ // navigation is index arithmetic, no scan-feedback loop.
110
+ searchPositions = null;
111
+ // React-land subscribers for selection state changes (useHasSelection).
112
+ // Fired alongside the terminal repaint whenever the selection mutates
113
+ // so UI (e.g. footer hints) can react to selection appearing/clearing.
114
+ selectionListeners = new Set();
115
+ // DOM nodes currently under the pointer (mode-1003 motion). Held here
116
+ // so App.tsx's handleMouseEvent is stateless — dispatchHover diffs
117
+ // against this set and mutates it in place.
118
+ hoveredNodes = new Set();
119
+ // Set by <AlternateScreen> via setAltScreenActive(). Controls the
120
+ // renderer's cursor.y clamping (keeps cursor in-viewport to avoid
121
+ // LF-induced scroll when screen.height === terminalRows) and gates
122
+ // alt-screen-aware SIGCONT/resize/unmount handling.
123
+ altScreenActive = false;
124
+ // Set alongside altScreenActive so SIGCONT resume knows whether to
125
+ // re-enable mouse tracking (not all <AlternateScreen> uses want it).
126
+ altScreenMouseTracking = false;
127
+ // True when the previous frame's screen buffer cannot be trusted for
128
+ // blit — selection overlay mutated it, resetFramesForAltScreen()
129
+ // replaced it with blanks, or forceRedraw() reset it to 0×0. Forces
130
+ // one full-render frame; steady-state frames after clear it and regain
131
+ // the blit + narrow-damage fast path.
132
+ prevFrameContaminated = false;
133
+ // Set by handleResize: prepend ERASE_SCREEN to the next onRender's patches
134
+ // INSIDE the BSU/ESU block so clear+paint is atomic. Writing ERASE_SCREEN
135
+ // synchronously in handleResize would leave the screen blank for the ~80ms
136
+ // render() takes; deferring into the atomic block means old content stays
137
+ // visible until the new frame is fully ready.
138
+ needsEraseBeforePaint = false;
139
+ // Native cursor positioning: a component (via useDeclaredCursor) declares
140
+ // where the terminal cursor should be parked after each frame. Terminal
141
+ // emulators render IME preedit text at the physical cursor position, and
142
+ // screen readers / screen magnifiers track it — so parking at the text
143
+ // input's caret makes CJK input appear inline and lets a11y tools follow.
144
+ cursorDeclaration = null;
145
+ // Main-screen: physical cursor position after the declared-cursor move,
146
+ // tracked separately from frame.cursor (which must stay at content-bottom
147
+ // for log-update's relative-move invariants). Alt-screen doesn't need
148
+ // this — every frame begins with CSI H. null = no move emitted last frame.
149
+ displayCursor = null;
150
+ constructor(options) {
151
+ this.options = options;
152
+ autoBind(this);
153
+ if (this.options.patchConsole) {
154
+ this.restoreConsole = this.patchConsole();
155
+ this.restoreStderr = this.patchStderr();
156
+ }
157
+ this.terminal = {
158
+ stdout: options.stdout,
159
+ stderr: options.stderr
160
+ };
161
+ this.terminalColumns = options.stdout.columns || 80;
162
+ this.terminalRows = options.stdout.rows || 24;
163
+ this.altScreenParkPatch = makeAltScreenParkPatch(this.terminalRows);
164
+ this.stylePool = new StylePool();
165
+ this.charPool = new CharPool();
166
+ this.hyperlinkPool = new HyperlinkPool();
167
+ this.frontFrame = emptyFrame(this.terminalRows, this.terminalColumns, this.stylePool, this.charPool, this.hyperlinkPool);
168
+ this.backFrame = emptyFrame(this.terminalRows, this.terminalColumns, this.stylePool, this.charPool, this.hyperlinkPool);
169
+ this.log = new LogUpdate({
170
+ isTTY: options.stdout.isTTY || false,
171
+ stylePool: this.stylePool
172
+ });
173
+ // scheduleRender is called from the reconciler's resetAfterCommit, which
174
+ // runs BEFORE React's layout phase (ref attach + useLayoutEffect). Any
175
+ // state set in layout effects — notably the cursorDeclaration from
176
+ // useDeclaredCursor — would lag one commit behind if we rendered
177
+ // synchronously. Deferring to a microtask runs onRender after layout
178
+ // effects have committed, so the native cursor tracks the caret without
179
+ // a one-keystroke lag. Same event-loop tick, so throughput is unchanged.
180
+ // Test env uses onImmediateRender (direct onRender, no throttle) so
181
+ // existing synchronous lastFrame() tests are unaffected.
182
+ const deferredRender = () => queueMicrotask(this.onRender);
183
+ this.scheduleRender = throttle(deferredRender, FRAME_INTERVAL_MS, {
184
+ leading: true,
185
+ trailing: true
186
+ });
187
+ // Ignore last render after unmounting a tree to prevent empty output before exit
188
+ this.isUnmounted = false;
189
+ // Unmount when process exits
190
+ this.unsubscribeExit = onExit(this.unmount, {
191
+ alwaysLast: false
192
+ });
193
+ if (options.stdout.isTTY) {
194
+ options.stdout.on('resize', this.handleResize);
195
+ process.on('SIGCONT', this.handleResume);
196
+ this.unsubscribeTTYHandlers = () => {
197
+ options.stdout.off('resize', this.handleResize);
198
+ process.off('SIGCONT', this.handleResume);
199
+ };
200
+ }
201
+ this.rootNode = dom.createNode('ink-root');
202
+ this.focusManager = new FocusManager((target, event) => dispatcher.dispatchDiscrete(target, event));
203
+ this.rootNode.focusManager = this.focusManager;
204
+ this.renderer = createRenderer(this.rootNode, this.stylePool);
205
+ this.rootNode.onRender = this.scheduleRender;
206
+ this.rootNode.onImmediateRender = this.onRender;
207
+ this.rootNode.onComputeLayout = () => {
208
+ // Calculate layout during React's commit phase so useLayoutEffect hooks
209
+ // have access to fresh layout data
210
+ // Guard against accessing freed Yoga nodes after unmount
211
+ if (this.isUnmounted) {
212
+ return;
213
+ }
214
+ if (this.rootNode.yogaNode) {
215
+ const t0 = performance.now();
216
+ this.rootNode.yogaNode.setWidth(this.terminalColumns);
217
+ this.rootNode.yogaNode.calculateLayout(this.terminalColumns);
218
+ const ms = performance.now() - t0;
219
+ recordYogaMs(ms);
220
+ const c = getYogaCounters();
221
+ this.lastYogaCounters = {
222
+ ms,
223
+ ...c
224
+ };
225
+ }
226
+ };
227
+ // @ts-expect-error @types/react-reconciler@0.32.3 declares 11 args with transitionCallbacks,
228
+ // but react-reconciler 0.33.0 source only accepts 10 args (no transitionCallbacks)
229
+ this.container = reconciler.createContainer(this.rootNode, ConcurrentRoot, null, false, null, 'id', noop,
230
+ // onUncaughtError
231
+ noop,
232
+ // onCaughtError
233
+ noop,
234
+ // onRecoverableError
235
+ noop // onDefaultTransitionIndicator
236
+ );
237
+ if ("production" === 'development') {
238
+ reconciler.injectIntoDevTools({
239
+ bundleType: 0,
240
+ // Reporting React DOM's version, not Ink's
241
+ // See https://github.com/facebook/react/issues/16666#issuecomment-532639905
242
+ version: '16.13.1',
243
+ rendererPackageName: 'ink'
244
+ });
245
+ }
246
+ }
247
+ handleResume = () => {
248
+ if (!this.options.stdout.isTTY) {
249
+ return;
250
+ }
251
+ // Alt screen: after SIGCONT, content is stale (shell may have written
252
+ // to main screen, switching focus away) and mouse tracking was
253
+ // disabled by handleSuspend.
254
+ if (this.altScreenActive) {
255
+ this.reenterAltScreen();
256
+ return;
257
+ }
258
+ // Main screen: start fresh to prevent clobbering terminal content
259
+ this.frontFrame = emptyFrame(this.frontFrame.viewport.height, this.frontFrame.viewport.width, this.stylePool, this.charPool, this.hyperlinkPool);
260
+ this.backFrame = emptyFrame(this.backFrame.viewport.height, this.backFrame.viewport.width, this.stylePool, this.charPool, this.hyperlinkPool);
261
+ this.log.reset();
262
+ // Physical cursor position is unknown after the shell took over during
263
+ // suspend. Clear displayCursor so the next frame's cursor preamble
264
+ // doesn't emit a relative move from a stale park position.
265
+ this.displayCursor = null;
266
+ };
267
+ // NOT debounced. A debounce opens a window where stdout.columns is NEW
268
+ // but this.terminalColumns/Yoga are OLD — any scheduleRender during that
269
+ // window (spinner, clock) makes log-update detect a width change and
270
+ // clear the screen, then the debounce fires and clears again (double
271
+ // blank→paint flicker). useVirtualScroll's height scaling already bounds
272
+ // the per-resize cost; synchronous handling keeps dimensions consistent.
273
+ handleResize = () => {
274
+ const cols = this.options.stdout.columns || 80;
275
+ const rows = this.options.stdout.rows || 24;
276
+ // Terminals often emit 2+ resize events for one user action (window
277
+ // settling). Same-dimension events are no-ops; skip to avoid redundant
278
+ // frame resets and renders.
279
+ if (cols === this.terminalColumns && rows === this.terminalRows)
280
+ return;
281
+ this.terminalColumns = cols;
282
+ this.terminalRows = rows;
283
+ this.altScreenParkPatch = makeAltScreenParkPatch(this.terminalRows);
284
+ // Alt screen: reset frame buffers so the next render repaints from
285
+ // scratch (prevFrameContaminated → every cell written, wrapped in
286
+ // BSU/ESU — old content stays visible until the new frame swaps
287
+ // atomically). Re-assert mouse tracking (some emulators reset it on
288
+ // resize). Do NOT write ENTER_ALT_SCREEN: iTerm2 treats ?1049h as a
289
+ // buffer clear even when already in alt — that's the blank flicker.
290
+ // Self-healing re-entry (if something kicked us out of alt) is handled
291
+ // by handleResume (SIGCONT) and the sleep-wake detector; resize itself
292
+ // doesn't exit alt-screen. Do NOT write ERASE_SCREEN: render() below
293
+ // can take ~80ms; erasing first leaves the screen blank that whole time.
294
+ if (this.altScreenActive && !this.isPaused && this.options.stdout.isTTY) {
295
+ if (this.altScreenMouseTracking) {
296
+ this.options.stdout.write(ENABLE_MOUSE_TRACKING);
297
+ }
298
+ this.resetFramesForAltScreen();
299
+ this.needsEraseBeforePaint = true;
300
+ }
301
+ // Re-render the React tree with updated props so the context value changes.
302
+ // React's commit phase will call onComputeLayout() to recalculate yoga layout
303
+ // with the new dimensions, then call onRender() to render the updated frame.
304
+ // We don't call scheduleRender() here because that would render before the
305
+ // layout is updated, causing a mismatch between viewport and content dimensions.
306
+ if (this.currentNode !== null) {
307
+ this.render(this.currentNode);
308
+ }
309
+ };
310
+ resolveExitPromise = () => { };
311
+ rejectExitPromise = () => { };
312
+ unsubscribeExit = () => { };
313
+ /**
314
+ * Pause Ink and hand the terminal over to an external TUI (e.g. git
315
+ * commit editor). In non-fullscreen mode this enters the alt screen;
316
+ * in fullscreen mode we're already in alt so we just clear it.
317
+ * Call `exitAlternateScreen()` when done to restore Ink.
318
+ */
319
+ enterAlternateScreen() {
320
+ this.pause();
321
+ this.suspendStdin();
322
+ this.options.stdout.write(
323
+ // Disable extended key reporting first — editors that don't speak
324
+ // CSI-u (e.g. nano) show "Unknown sequence" for every Ctrl-<key> if
325
+ // kitty/modifyOtherKeys stays active. exitAlternateScreen re-enables.
326
+ DISABLE_KITTY_KEYBOARD + DISABLE_MODIFY_OTHER_KEYS + (this.altScreenMouseTracking ? DISABLE_MOUSE_TRACKING : '') + (
327
+ // disable mouse (no-op if off)
328
+ this.altScreenActive ? '' : '\x1b[?1049h') +
329
+ // enter alt (already in alt if fullscreen)
330
+ '\x1b[?1004l' +
331
+ // disable focus reporting
332
+ '\x1b[0m' +
333
+ // reset attributes
334
+ '\x1b[?25h' +
335
+ // show cursor
336
+ '\x1b[2J' +
337
+ // clear screen
338
+ '\x1b[H' // cursor home
339
+ );
340
+ }
341
+ /**
342
+ * Resume Ink after an external TUI handoff with a full repaint.
343
+ * In non-fullscreen mode this exits the alt screen back to main;
344
+ * in fullscreen mode we re-enter alt and clear + repaint.
345
+ *
346
+ * The re-enter matters: terminal editors (vim, nano, less) write
347
+ * smcup/rmcup (?1049h/?1049l), so even though we started in alt,
348
+ * the editor's rmcup on exit drops us to main screen. Without
349
+ * re-entering, the 2J below wipes the user's main-screen scrollback
350
+ * and subsequent renders land in main — native terminal scroll
351
+ * returns, fullscreen scroll is dead.
352
+ */
353
+ exitAlternateScreen() {
354
+ this.options.stdout.write((this.altScreenActive ? ENTER_ALT_SCREEN : '') +
355
+ // re-enter alt — vim's rmcup dropped us to main
356
+ '\x1b[2J' +
357
+ // clear screen (now alt if fullscreen)
358
+ '\x1b[H' + (
359
+ // cursor home
360
+ this.altScreenMouseTracking ? ENABLE_MOUSE_TRACKING : '') + (
361
+ // re-enable mouse (skip if THADDEUS_DISABLE_MOUSE)
362
+ this.altScreenActive ? '' : '\x1b[?1049l') +
363
+ // exit alt (non-fullscreen only)
364
+ '\x1b[?25l' // hide cursor (Ink manages)
365
+ );
366
+ this.resumeStdin();
367
+ if (this.altScreenActive) {
368
+ this.resetFramesForAltScreen();
369
+ }
370
+ else {
371
+ this.repaint();
372
+ }
373
+ this.resume();
374
+ // Re-enable focus reporting and extended key reporting — terminal
375
+ // editors (vim, nano, etc.) write their own modifyOtherKeys level on
376
+ // entry and reset it on exit, leaving us unable to distinguish
377
+ // ctrl+shift+<letter> from ctrl+<letter>. Pop-before-push keeps the
378
+ // Kitty stack balanced (a well-behaved editor restores our entry, so
379
+ // without the pop we'd accumulate depth on each editor round-trip).
380
+ this.options.stdout.write('\x1b[?1004h' + (supportsExtendedKeys() ? DISABLE_KITTY_KEYBOARD + ENABLE_KITTY_KEYBOARD + ENABLE_MODIFY_OTHER_KEYS : ''));
381
+ }
382
+ onRender() {
383
+ if (this.isUnmounted || this.isPaused) {
384
+ return;
385
+ }
386
+ // Entering a render cancels any pending drain tick — this render will
387
+ // handle the drain (and re-schedule below if needed). Prevents a
388
+ // wheel-event-triggered render AND a drain-timer render both firing.
389
+ if (this.drainTimer !== null) {
390
+ clearTimeout(this.drainTimer);
391
+ this.drainTimer = null;
392
+ }
393
+ // Flush deferred interaction-time update before rendering so we call
394
+ // Date.now() at most once per frame instead of once per keypress.
395
+ // Done before the render to avoid dirtying state that would trigger
396
+ // an extra React re-render cycle.
397
+ flushInteractionTime();
398
+ const renderStart = performance.now();
399
+ const terminalWidth = this.options.stdout.columns || 80;
400
+ const terminalRows = this.options.stdout.rows || 24;
401
+ const frame = this.renderer({
402
+ frontFrame: this.frontFrame,
403
+ backFrame: this.backFrame,
404
+ isTTY: this.options.stdout.isTTY,
405
+ terminalWidth,
406
+ terminalRows,
407
+ altScreen: this.altScreenActive,
408
+ prevFrameContaminated: this.prevFrameContaminated
409
+ });
410
+ const rendererMs = performance.now() - renderStart;
411
+ // Sticky/auto-follow scrolled the ScrollBox this frame. Translate the
412
+ // selection by the same delta so the highlight stays anchored to the
413
+ // TEXT (native terminal behavior — the selection walks up the screen
414
+ // as content scrolls, eventually clipping at the top). frontFrame
415
+ // still holds the PREVIOUS frame's screen (swap is at ~500 below), so
416
+ // captureScrolledRows reads the rows that are about to scroll out
417
+ // before they're overwritten — the text stays copyable until the
418
+ // selection scrolls entirely off. During drag, focus tracks the mouse
419
+ // (screen-local) so only anchor shifts — selection grows toward the
420
+ // mouse as the anchor walks up. After release, both ends are text-
421
+ // anchored and move as a block.
422
+ const follow = consumeFollowScroll();
423
+ if (follow && this.selection.anchor &&
424
+ // Only translate if the selection is ON scrollbox content. Selections
425
+ // in the footer/prompt/StickyPromptHeader are on static text — the
426
+ // scroll doesn't move what's under them. Without this guard, a
427
+ // footer selection would be shifted by -delta then clamped to
428
+ // viewportBottom, teleporting it into the scrollbox. Mirror the
429
+ // bounds check the deleted check() in ScrollKeybindingHandler had.
430
+ this.selection.anchor.row >= follow.viewportTop && this.selection.anchor.row <= follow.viewportBottom) {
431
+ const { delta, viewportTop, viewportBottom } = follow;
432
+ // captureScrolledRows and shift* are a pair: capture grabs rows about
433
+ // to scroll off, shift moves the selection endpoint so the same rows
434
+ // won't intersect again next frame. Capturing without shifting leaves
435
+ // the endpoint in place, so the SAME viewport rows re-intersect every
436
+ // frame and scrolledOffAbove grows without bound — getSelectedText
437
+ // then returns ever-growing text on each re-copy. Keep capture inside
438
+ // each shift branch so the pairing can't be broken by a new guard.
439
+ if (this.selection.isDragging) {
440
+ if (hasSelection(this.selection)) {
441
+ captureScrolledRows(this.selection, this.frontFrame.screen, viewportTop, viewportTop + delta - 1, 'above');
442
+ }
443
+ shiftAnchor(this.selection, -delta, viewportTop, viewportBottom);
444
+ }
445
+ else if (
446
+ // Flag-3 guard: the anchor check above only proves ONE endpoint is
447
+ // on scrollbox content. A drag from row 3 (scrollbox) into the
448
+ // footer at row 6, then release, leaves focus outside the viewport
449
+ // — shiftSelectionForFollow would clamp it to viewportBottom,
450
+ // teleporting the highlight from static footer into the scrollbox.
451
+ // Symmetric check: require BOTH ends inside to translate. A
452
+ // straddling selection falls through to NEITHER shift NOR capture:
453
+ // the footer endpoint pins the selection, text scrolls away under
454
+ // the highlight, and getSelectedText reads the CURRENT screen
455
+ // contents — no accumulation. Dragging branch doesn't need this:
456
+ // shiftAnchor ignores focus, and the anchor DOES shift (so capture
457
+ // is correct there even when focus is in the footer).
458
+ !this.selection.focus || this.selection.focus.row >= viewportTop && this.selection.focus.row <= viewportBottom) {
459
+ if (hasSelection(this.selection)) {
460
+ captureScrolledRows(this.selection, this.frontFrame.screen, viewportTop, viewportTop + delta - 1, 'above');
461
+ }
462
+ const cleared = shiftSelectionForFollow(this.selection, -delta, viewportTop, viewportBottom);
463
+ // Auto-clear (both ends overshot minRow) must notify React-land
464
+ // so useHasSelection re-renders and the footer copy/escape hint
465
+ // disappears. notifySelectionChange() would recurse into onRender;
466
+ // fire the listeners directly — they schedule a React update for
467
+ // LATER, they don't re-enter this frame.
468
+ if (cleared)
469
+ for (const cb of this.selectionListeners)
470
+ cb();
471
+ }
472
+ }
473
+ // Selection overlay: invert cell styles in the screen buffer itself,
474
+ // so the diff picks up selection as ordinary cell changes and
475
+ // LogUpdate remains a pure diff engine.
476
+ //
477
+ // Full-screen damage (PR #20120) is a correctness backstop for the
478
+ // sibling-resize bleed: when flexbox siblings resize between frames
479
+ // (spinner appears → bottom grows → scrollbox shrinks), the
480
+ // cached-clear + clip-and-cull + setCellAt damage union can miss
481
+ // transition cells at the boundary. But that only happens when layout
482
+ // actually SHIFTS — didLayoutShift() tracks exactly this (any node's
483
+ // cached yoga position/size differs from current, or a child was
484
+ // removed). Steady-state frames (spinner rotate, clock tick, text
485
+ // stream into fixed-height box) don't shift layout, so normal damage
486
+ // bounds are correct and diffEach only compares the damaged region.
487
+ //
488
+ // Selection also requires full damage: overlay writes via setCellStyleId
489
+ // which doesn't track damage, and prev-frame overlay cells need to be
490
+ // compared when selection moves/clears. prevFrameContaminated covers
491
+ // the frame-after-selection-clears case.
492
+ let selActive = false;
493
+ let hlActive = false;
494
+ if (this.altScreenActive) {
495
+ selActive = hasSelection(this.selection);
496
+ if (selActive) {
497
+ applySelectionOverlay(frame.screen, this.selection, this.stylePool);
498
+ }
499
+ // Scan-highlight: inverse on ALL visible matches (less/vim style).
500
+ // Position-highlight (below) overlays CURRENT (yellow) on top.
501
+ hlActive = applySearchHighlight(frame.screen, this.searchHighlightQuery, this.stylePool);
502
+ // Position-based CURRENT: write yellow at positions[currentIdx] +
503
+ // rowOffset. No scanning — positions came from a prior scan when
504
+ // the message first mounted. Message-relative + rowOffset = screen.
505
+ if (this.searchPositions) {
506
+ const sp = this.searchPositions;
507
+ const posApplied = applyPositionedHighlight(frame.screen, this.stylePool, sp.positions, sp.rowOffset, sp.currentIdx);
508
+ hlActive = hlActive || posApplied;
509
+ }
510
+ }
511
+ // Full-damage backstop: applies on BOTH alt-screen and main-screen.
512
+ // Layout shifts (spinner appears, status line resizes) can leave stale
513
+ // cells at sibling boundaries that per-node damage tracking misses.
514
+ // Selection/highlight overlays write via setCellStyleId which doesn't
515
+ // track damage. prevFrameContaminated covers the cleanup frame.
516
+ if (didLayoutShift() || selActive || hlActive || this.prevFrameContaminated) {
517
+ frame.screen.damage = {
518
+ x: 0,
519
+ y: 0,
520
+ width: frame.screen.width,
521
+ height: frame.screen.height
522
+ };
523
+ }
524
+ // Alt-screen: anchor the physical cursor to (0,0) before every diff.
525
+ // All cursor moves in log-update are RELATIVE to prev.cursor; if tmux
526
+ // (or any emulator) perturbs the physical cursor out-of-band (status
527
+ // bar refresh, pane redraw, Cmd+K wipe), the relative moves drift and
528
+ // content creeps up 1 row/frame. CSI H resets the physical cursor;
529
+ // passing prev.cursor=(0,0) makes the diff compute from the same spot.
530
+ // Self-healing against any external cursor manipulation. Main-screen
531
+ // can't do this — cursor.y tracks scrollback rows CSI H can't reach.
532
+ // The CSI H write is deferred until after the diff is computed so we
533
+ // can skip it for empty diffs (no writes → physical cursor unused).
534
+ let prevFrame = this.frontFrame;
535
+ if (this.altScreenActive) {
536
+ prevFrame = {
537
+ ...this.frontFrame,
538
+ cursor: ALT_SCREEN_ANCHOR_CURSOR
539
+ };
540
+ }
541
+ const tDiff = performance.now();
542
+ const diff = this.log.render(prevFrame, frame, this.altScreenActive,
543
+ // DECSTBM needs BSU/ESU atomicity — without it the outer terminal
544
+ // renders the scrolled-but-not-yet-repainted intermediate state.
545
+ // tmux is the main case (re-emits DECSTBM with its own timing and
546
+ // doesn't implement DEC 2026, so SYNC_OUTPUT_SUPPORTED is false).
547
+ SYNC_OUTPUT_SUPPORTED);
548
+ const diffMs = performance.now() - tDiff;
549
+ // Swap buffers
550
+ this.backFrame = this.frontFrame;
551
+ this.frontFrame = frame;
552
+ // Periodically reset char/hyperlink pools to prevent unbounded growth
553
+ // during long sessions. 5 minutes is infrequent enough that the O(cells)
554
+ // migration cost is negligible. Reuses renderStart to avoid extra clock call.
555
+ if (renderStart - this.lastPoolResetTime > 5 * 60 * 1000) {
556
+ this.resetPools();
557
+ this.lastPoolResetTime = renderStart;
558
+ }
559
+ const flickers = [];
560
+ for (const patch of diff) {
561
+ if (patch.type === 'clearTerminal') {
562
+ flickers.push({
563
+ desiredHeight: frame.screen.height,
564
+ availableHeight: frame.viewport.height,
565
+ reason: patch.reason
566
+ });
567
+ if (isDebugRepaintsEnabled() && patch.debug) {
568
+ const chain = dom.findOwnerChainAtRow(this.rootNode, patch.debug.triggerY);
569
+ logForDebugging(`[REPAINT] full reset · ${patch.reason} · row ${patch.debug.triggerY}\n` + ` prev: "${patch.debug.prevLine}"\n` + ` next: "${patch.debug.nextLine}"\n` + ` culprit: ${chain.length ? chain.join(' < ') : '(no owner chain captured)'}`, {
570
+ level: 'warn'
571
+ });
572
+ }
573
+ }
574
+ }
575
+ const tOptimize = performance.now();
576
+ const optimized = optimize(diff);
577
+ const optimizeMs = performance.now() - tOptimize;
578
+ const hasDiff = optimized.length > 0;
579
+ if (this.altScreenActive && hasDiff) {
580
+ // Prepend CSI H to anchor the physical cursor to (0,0) so
581
+ // log-update's relative moves compute from a known spot (self-healing
582
+ // against out-of-band cursor drift, see the ALT_SCREEN_ANCHOR_CURSOR
583
+ // comment above). Append CSI row;1 H to park the cursor at the bottom
584
+ // row (where the prompt input is) — without this, the cursor ends
585
+ // wherever the last diff write landed (a different row every frame),
586
+ // making iTerm2's cursor guide flicker as it chases the cursor.
587
+ // BSU/ESU protects content atomicity but iTerm2's guide tracks cursor
588
+ // position independently. Parking at bottom (not 0,0) keeps the guide
589
+ // where the user's attention is.
590
+ //
591
+ // After resize, prepend ERASE_SCREEN too. The diff only writes cells
592
+ // that changed; cells where new=blank and prev-buffer=blank get skipped
593
+ // — but the physical terminal still has stale content there (shorter
594
+ // lines at new width leave old-width text tails visible). ERASE inside
595
+ // BSU/ESU is atomic: old content stays visible until the whole
596
+ // erase+paint lands, then swaps in one go. Writing ERASE_SCREEN
597
+ // synchronously in handleResize would blank the screen for the ~80ms
598
+ // render() takes.
599
+ if (this.needsEraseBeforePaint) {
600
+ this.needsEraseBeforePaint = false;
601
+ optimized.unshift(ERASE_THEN_HOME_PATCH);
602
+ }
603
+ else {
604
+ optimized.unshift(CURSOR_HOME_PATCH);
605
+ }
606
+ optimized.push(this.altScreenParkPatch);
607
+ }
608
+ // Native cursor positioning: park the terminal cursor at the declared
609
+ // position so IME preedit text renders inline and screen readers /
610
+ // magnifiers can follow the input. nodeCache holds the absolute screen
611
+ // rect populated by renderNodeToOutput this frame (including scrollTop
612
+ // translation) — if the declared node didn't render (stale declaration
613
+ // after remount, or scrolled out of view), it won't be in the cache
614
+ // and no move is emitted.
615
+ const decl = this.cursorDeclaration;
616
+ const rect = decl !== null ? nodeCache.get(decl.node) : undefined;
617
+ const target = decl !== null && rect !== undefined ? {
618
+ x: rect.x + decl.relativeX,
619
+ y: rect.y + decl.relativeY
620
+ } : null;
621
+ const parked = this.displayCursor;
622
+ // Preserve the empty-diff zero-write fast path: skip all cursor writes
623
+ // when nothing rendered AND the park target is unchanged.
624
+ const targetMoved = target !== null && (parked === null || parked.x !== target.x || parked.y !== target.y);
625
+ if (hasDiff || targetMoved || target === null && parked !== null) {
626
+ // Main-screen preamble: log-update's relative moves assume the
627
+ // physical cursor is at prevFrame.cursor. If last frame parked it
628
+ // elsewhere, move back before the diff runs. Alt-screen's CSI H
629
+ // already resets to (0,0) so no preamble needed.
630
+ if (parked !== null && !this.altScreenActive && hasDiff) {
631
+ const pdx = prevFrame.cursor.x - parked.x;
632
+ const pdy = prevFrame.cursor.y - parked.y;
633
+ if (pdx !== 0 || pdy !== 0) {
634
+ optimized.unshift({
635
+ type: 'stdout',
636
+ content: cursorMove(pdx, pdy)
637
+ });
638
+ }
639
+ }
640
+ if (target !== null) {
641
+ if (this.altScreenActive) {
642
+ // Absolute CUP (1-indexed); next frame's CSI H resets regardless.
643
+ // Emitted after altScreenParkPatch so the declared position wins.
644
+ const row = Math.min(Math.max(target.y + 1, 1), terminalRows);
645
+ const col = Math.min(Math.max(target.x + 1, 1), terminalWidth);
646
+ optimized.push({
647
+ type: 'stdout',
648
+ content: cursorPosition(row, col)
649
+ });
650
+ }
651
+ else {
652
+ // After the diff (or preamble), cursor is at frame.cursor. If no
653
+ // diff AND previously parked, it's still at the old park position
654
+ // (log-update wrote nothing). Otherwise it's at frame.cursor.
655
+ const from = !hasDiff && parked !== null ? parked : {
656
+ x: frame.cursor.x,
657
+ y: frame.cursor.y
658
+ };
659
+ const dx = target.x - from.x;
660
+ const dy = target.y - from.y;
661
+ if (dx !== 0 || dy !== 0) {
662
+ optimized.push({
663
+ type: 'stdout',
664
+ content: cursorMove(dx, dy)
665
+ });
666
+ }
667
+ }
668
+ this.displayCursor = target;
669
+ }
670
+ else {
671
+ // Declaration cleared (input blur, unmount). Restore physical cursor
672
+ // to frame.cursor before forgetting the park position — otherwise
673
+ // displayCursor=null lies about where the cursor is, and the NEXT
674
+ // frame's preamble (or log-update's relative moves) computes from a
675
+ // wrong spot. The preamble above handles hasDiff; this handles
676
+ // !hasDiff (e.g. accessibility mode where blur doesn't change
677
+ // renderedValue since invert is identity).
678
+ if (parked !== null && !this.altScreenActive && !hasDiff) {
679
+ const rdx = frame.cursor.x - parked.x;
680
+ const rdy = frame.cursor.y - parked.y;
681
+ if (rdx !== 0 || rdy !== 0) {
682
+ optimized.push({
683
+ type: 'stdout',
684
+ content: cursorMove(rdx, rdy)
685
+ });
686
+ }
687
+ }
688
+ this.displayCursor = null;
689
+ }
690
+ }
691
+ const tWrite = performance.now();
692
+ writeDiffToTerminal(this.terminal, optimized, this.altScreenActive && !SYNC_OUTPUT_SUPPORTED);
693
+ const writeMs = performance.now() - tWrite;
694
+ // Update blit safety for the NEXT frame. The frame just rendered
695
+ // becomes frontFrame (= next frame's prevScreen). If we applied the
696
+ // selection overlay, that buffer has inverted cells. selActive/hlActive
697
+ // are only ever true in alt-screen; in main-screen this is false→false.
698
+ this.prevFrameContaminated = selActive || hlActive;
699
+ // A ScrollBox has pendingScrollDelta left to drain — schedule the next
700
+ // frame. MUST NOT call this.scheduleRender() here: we're inside a
701
+ // trailing-edge throttle invocation, timerId is undefined, and lodash's
702
+ // debounce sees timeSinceLastCall >= wait (last call was at the start
703
+ // of this window) → leadingEdge fires IMMEDIATELY → double render ~0.1ms
704
+ // apart → jank. Use a plain timeout. If a wheel event arrives first,
705
+ // its scheduleRender path fires a render which clears this timer at
706
+ // the top of onRender — no double.
707
+ //
708
+ // Drain frames are cheap (DECSTBM + ~10 patches, ~200 bytes) so run at
709
+ // quarter interval (~250fps, setTimeout practical floor) for max scroll
710
+ // speed. Regular renders stay at FRAME_INTERVAL_MS via the throttle.
711
+ if (frame.scrollDrainPending) {
712
+ this.drainTimer = setTimeout(() => this.onRender(), FRAME_INTERVAL_MS >> 2);
713
+ }
714
+ const yogaMs = getLastYogaMs();
715
+ const commitMs = getLastCommitMs();
716
+ const yc = this.lastYogaCounters;
717
+ // Reset so drain-only frames (no React commit) don't repeat stale values.
718
+ resetProfileCounters();
719
+ this.lastYogaCounters = {
720
+ ms: 0,
721
+ visited: 0,
722
+ measured: 0,
723
+ cacheHits: 0,
724
+ live: 0
725
+ };
726
+ this.options.onFrame?.({
727
+ durationMs: performance.now() - renderStart,
728
+ phases: {
729
+ renderer: rendererMs,
730
+ diff: diffMs,
731
+ optimize: optimizeMs,
732
+ write: writeMs,
733
+ patches: diff.length,
734
+ yoga: yogaMs,
735
+ commit: commitMs,
736
+ yogaVisited: yc.visited,
737
+ yogaMeasured: yc.measured,
738
+ yogaCacheHits: yc.cacheHits,
739
+ yogaLive: yc.live
740
+ },
741
+ flickers
742
+ });
743
+ }
744
+ pause() {
745
+ // Flush pending React updates and render before pausing.
746
+ // @ts-expect-error flushSyncFromReconciler exists in react-reconciler 0.31 but not in @types/react-reconciler
747
+ reconciler.flushSyncFromReconciler();
748
+ this.onRender();
749
+ this.isPaused = true;
750
+ }
751
+ resume() {
752
+ this.isPaused = false;
753
+ this.onRender();
754
+ }
755
+ /**
756
+ * Reset frame buffers so the next render writes the full screen from scratch.
757
+ * Call this before resume() when the terminal content has been corrupted by
758
+ * an external process (e.g. tmux, shell, full-screen TUI).
759
+ */
760
+ repaint() {
761
+ this.frontFrame = emptyFrame(this.frontFrame.viewport.height, this.frontFrame.viewport.width, this.stylePool, this.charPool, this.hyperlinkPool);
762
+ this.backFrame = emptyFrame(this.backFrame.viewport.height, this.backFrame.viewport.width, this.stylePool, this.charPool, this.hyperlinkPool);
763
+ this.log.reset();
764
+ // Physical cursor position is unknown after external terminal corruption.
765
+ // Clear displayCursor so the cursor preamble doesn't emit a stale
766
+ // relative move from where we last parked it.
767
+ this.displayCursor = null;
768
+ }
769
+ /**
770
+ * Clear the physical terminal and force a full redraw.
771
+ *
772
+ * The traditional readline ctrl+l — clears the visible screen and
773
+ * redraws the current content. Also the recovery path when the terminal
774
+ * was cleared externally (macOS Cmd+K) and Ink's diff engine thinks
775
+ * unchanged cells don't need repainting. Scrollback is preserved.
776
+ */
777
+ forceRedraw() {
778
+ if (!this.options.stdout.isTTY || this.isUnmounted || this.isPaused)
779
+ return;
780
+ this.options.stdout.write(ERASE_SCREEN + CURSOR_HOME);
781
+ if (this.altScreenActive) {
782
+ this.resetFramesForAltScreen();
783
+ }
784
+ else {
785
+ this.repaint();
786
+ // repaint() resets frontFrame to 0×0. Without this flag the next
787
+ // frame's blit optimization copies from that empty screen and the
788
+ // diff sees no content. onRender resets the flag at frame end.
789
+ this.prevFrameContaminated = true;
790
+ }
791
+ this.onRender();
792
+ }
793
+ /**
794
+ * Mark the previous frame as untrustworthy for blit, forcing the next
795
+ * render to do a full-damage diff instead of the per-node fast path.
796
+ *
797
+ * Lighter than forceRedraw() — no screen clear, no extra write. Call
798
+ * from a useLayoutEffect cleanup when unmounting a tall overlay: the
799
+ * blit fast path can copy stale cells from the overlay frame into rows
800
+ * the shrunken layout no longer reaches, leaving a ghost title/divider.
801
+ * onRender resets the flag at frame end so it's one-shot.
802
+ */
803
+ invalidatePrevFrame() {
804
+ this.prevFrameContaminated = true;
805
+ }
806
+ /**
807
+ * Called by the <AlternateScreen> component on mount/unmount.
808
+ * Controls cursor.y clamping in the renderer and gates alt-screen-aware
809
+ * behavior in SIGCONT/resize/unmount handlers. Repaints on change so
810
+ * the first alt-screen frame (and first main-screen frame on exit) is
811
+ * a full redraw with no stale diff state.
812
+ */
813
+ setAltScreenActive(active, mouseTracking = false) {
814
+ if (this.altScreenActive === active)
815
+ return;
816
+ this.altScreenActive = active;
817
+ this.altScreenMouseTracking = active && mouseTracking;
818
+ if (active) {
819
+ this.resetFramesForAltScreen();
820
+ }
821
+ else {
822
+ this.repaint();
823
+ }
824
+ }
825
+ get isAltScreenActive() {
826
+ return this.altScreenActive;
827
+ }
828
+ /**
829
+ * Re-assert terminal modes after a gap (>5s stdin silence or event-loop
830
+ * stall). Catches tmux detach→attach, ssh reconnect, and laptop
831
+ * sleep/wake — none of which send SIGCONT. The terminal may reset DEC
832
+ * private modes on reconnect; this method restores them.
833
+ *
834
+ * Always re-asserts extended key reporting and mouse tracking. Mouse
835
+ * tracking is idempotent (DEC private mode set-when-set is a no-op). The
836
+ * Kitty keyboard protocol is NOT — CSI >1u is a stack push, so we pop
837
+ * first to keep depth balanced (pop on empty stack is a no-op per spec,
838
+ * so after a terminal reset this still restores depth 0→1). Without the
839
+ * pop, each >5s idle gap adds a stack entry, and the single pop on exit
840
+ * or suspend can't drain them — the shell is left in CSI u mode where
841
+ * Ctrl+C/Ctrl+D leak as escape sequences. The alt-screen
842
+ * re-entry (ERASE_SCREEN + frame reset) is NOT idempotent — it blanks the
843
+ * screen — so it's opt-in via includeAltScreen. The stdin-gap caller fires
844
+ * on ordinary >5s idle + keypress and must not erase; the event-loop stall
845
+ * detector fires on genuine sleep/wake and opts in. tmux attach / ssh
846
+ * reconnect typically send a resize, which already covers alt-screen via
847
+ * handleResize.
848
+ */
849
+ reassertTerminalModes = (includeAltScreen = false) => {
850
+ if (!this.options.stdout.isTTY)
851
+ return;
852
+ // Don't touch the terminal during an editor handoff — re-enabling kitty
853
+ // keyboard here would undo enterAlternateScreen's disable and nano would
854
+ // start seeing CSI-u sequences again.
855
+ if (this.isPaused)
856
+ return;
857
+ // Extended keys — re-assert if enabled (App.tsx enables these on
858
+ // allowlisted terminals at raw-mode entry; a terminal reset clears them).
859
+ // Pop-before-push keeps Kitty stack depth at 1 instead of accumulating
860
+ // on each call.
861
+ if (supportsExtendedKeys()) {
862
+ this.options.stdout.write(DISABLE_KITTY_KEYBOARD + ENABLE_KITTY_KEYBOARD + ENABLE_MODIFY_OTHER_KEYS);
863
+ }
864
+ if (!this.altScreenActive)
865
+ return;
866
+ // Mouse tracking — idempotent, safe to re-assert on every stdin gap.
867
+ if (this.altScreenMouseTracking) {
868
+ this.options.stdout.write(ENABLE_MOUSE_TRACKING);
869
+ }
870
+ // Alt-screen re-entry — destructive (ERASE_SCREEN). Only for callers that
871
+ // have a strong signal the terminal actually dropped mode 1049.
872
+ if (includeAltScreen) {
873
+ this.reenterAltScreen();
874
+ }
875
+ };
876
+ /**
877
+ * Mark this instance as unmounted so future unmount() calls early-return.
878
+ * Called by gracefulShutdown's cleanupTerminalModes() after it has sent
879
+ * EXIT_ALT_SCREEN but before the remaining terminal-reset sequences.
880
+ * Without this, signal-exit's deferred ink.unmount() (triggered by
881
+ * process.exit()) runs the full unmount path: onRender() + writeSync
882
+ * cleanup block + updateContainerSync → AlternateScreen unmount cleanup.
883
+ * The result is 2-3 redundant EXIT_ALT_SCREEN sequences landing on the
884
+ * main screen AFTER printResumeHint(), which tmux (at least) interprets
885
+ * as restoring the saved cursor position — clobbering the resume hint.
886
+ */
887
+ detachForShutdown() {
888
+ this.isUnmounted = true;
889
+ // Cancel any pending throttled render so it doesn't fire between
890
+ // cleanupTerminalModes() and process.exit() and write to main screen.
891
+ this.scheduleRender.cancel?.();
892
+ // Restore stdin from raw mode. unmount() used to do this via React
893
+ // unmount (App.componentWillUnmount → handleSetRawMode(false)) but we're
894
+ // short-circuiting that path. Must use this.options.stdin — NOT
895
+ // process.stdin — because getStdinOverride() may have opened /dev/tty
896
+ // when stdin is piped.
897
+ const stdin = this.options.stdin;
898
+ this.drainStdin();
899
+ if (stdin.isTTY && stdin.isRaw && stdin.setRawMode) {
900
+ stdin.setRawMode(false);
901
+ }
902
+ }
903
+ /** @see drainStdin */
904
+ drainStdin() {
905
+ drainStdin(this.options.stdin);
906
+ }
907
+ /**
908
+ * Re-enter alt-screen, clear, home, re-enable mouse tracking, and reset
909
+ * frame buffers so the next render repaints from scratch. Self-heal for
910
+ * SIGCONT, resize, and stdin-gap/event-loop-stall (sleep/wake) — any of
911
+ * which can leave the terminal in main-screen mode while altScreenActive
912
+ * stays true. ENTER_ALT_SCREEN is a terminal-side no-op if already in alt.
913
+ */
914
+ reenterAltScreen() {
915
+ this.options.stdout.write(ENTER_ALT_SCREEN + ERASE_SCREEN + CURSOR_HOME + (this.altScreenMouseTracking ? ENABLE_MOUSE_TRACKING : ''));
916
+ this.resetFramesForAltScreen();
917
+ }
918
+ /**
919
+ * Seed prev/back frames with full-size BLANK screens (rows×cols of empty
920
+ * cells, not 0×0). In alt-screen mode, next.screen.height is always
921
+ * terminalRows; if prev.screen.height is 0 (emptyFrame's default),
922
+ * log-update sees heightDelta > 0 ('growing') and calls renderFrameSlice,
923
+ * whose trailing per-row CR+LF at the last row scrolls the alt screen,
924
+ * permanently desyncing the virtual and physical cursors by 1 row.
925
+ *
926
+ * With a rows×cols blank prev, heightDelta === 0 → standard diffEach
927
+ * → moveCursorTo (CSI cursorMove, no LF, no scroll).
928
+ *
929
+ * viewport.height = rows + 1 matches the renderer's alt-screen output,
930
+ * preventing a spurious resize trigger on the first frame. cursor.y = 0
931
+ * matches the physical cursor after ENTER_ALT_SCREEN + CSI H (home).
932
+ */
933
+ resetFramesForAltScreen() {
934
+ const rows = this.terminalRows;
935
+ const cols = this.terminalColumns;
936
+ const blank = () => ({
937
+ screen: createScreen(cols, rows, this.stylePool, this.charPool, this.hyperlinkPool),
938
+ viewport: {
939
+ width: cols,
940
+ height: rows + 1
941
+ },
942
+ cursor: {
943
+ x: 0,
944
+ y: 0,
945
+ visible: true
946
+ }
947
+ });
948
+ this.frontFrame = blank();
949
+ this.backFrame = blank();
950
+ this.log.reset();
951
+ // Defense-in-depth: alt-screen skips the cursor preamble anyway (CSI H
952
+ // resets), but a stale displayCursor would be misleading if we later
953
+ // exit to main-screen without an intervening render.
954
+ this.displayCursor = null;
955
+ // Fresh frontFrame is blank rows×cols — blitting from it would copy
956
+ // blanks over content. Next alt-screen frame must full-render.
957
+ this.prevFrameContaminated = true;
958
+ }
959
+ /**
960
+ * Copy the current selection to the clipboard without clearing the
961
+ * highlight. Matches iTerm2's copy-on-select behavior where the selected
962
+ * region stays visible after the automatic copy.
963
+ */
964
+ copySelectionNoClear() {
965
+ if (!hasSelection(this.selection))
966
+ return '';
967
+ const text = getSelectedText(this.selection, this.frontFrame.screen);
968
+ if (text) {
969
+ // Raw OSC 52, or DCS-passthrough-wrapped OSC 52 inside tmux (tmux
970
+ // drops it silently unless allow-passthrough is on — no regression).
971
+ void setClipboard(text).then(raw => {
972
+ if (raw)
973
+ this.options.stdout.write(raw);
974
+ });
975
+ }
976
+ return text;
977
+ }
978
+ /**
979
+ * Copy the current text selection to the system clipboard via OSC 52
980
+ * and clear the selection. Returns the copied text (empty if no selection).
981
+ */
982
+ copySelection() {
983
+ if (!hasSelection(this.selection))
984
+ return '';
985
+ const text = this.copySelectionNoClear();
986
+ clearSelection(this.selection);
987
+ this.notifySelectionChange();
988
+ return text;
989
+ }
990
+ /** Clear the current text selection without copying. */
991
+ clearTextSelection() {
992
+ if (!hasSelection(this.selection))
993
+ return;
994
+ clearSelection(this.selection);
995
+ this.notifySelectionChange();
996
+ }
997
+ /**
998
+ * Set the search highlight query. Non-empty → all visible occurrences
999
+ * are inverted (SGR 7) on the next frame; first one also underlined.
1000
+ * Empty → clears (prevFrameContaminated handles the frame after). Same
1001
+ * damage-tracking machinery as selection — setCellStyleId doesn't track
1002
+ * damage, so the overlay forces full-frame damage while active.
1003
+ */
1004
+ setSearchHighlight(query) {
1005
+ if (this.searchHighlightQuery === query)
1006
+ return;
1007
+ this.searchHighlightQuery = query;
1008
+ this.scheduleRender();
1009
+ }
1010
+ /** Paint an EXISTING DOM subtree to a fresh Screen at its natural
1011
+ * height, scan for query. Returns positions relative to the element's
1012
+ * bounding box (row 0 = element top).
1013
+ *
1014
+ * The element comes from the MAIN tree — built with all real
1015
+ * providers, yoga already computed. We paint it to a fresh buffer
1016
+ * with offsets so it lands at (0,0). Same paint path as the main
1017
+ * render. Zero drift. No second React root, no context bridge.
1018
+ *
1019
+ * ~1-2ms (paint only, no reconcile — the DOM is already built). */
1020
+ scanElementSubtree(el) {
1021
+ if (!this.searchHighlightQuery || !el.yogaNode)
1022
+ return [];
1023
+ const width = Math.ceil(el.yogaNode.getComputedWidth());
1024
+ const height = Math.ceil(el.yogaNode.getComputedHeight());
1025
+ if (width <= 0 || height <= 0)
1026
+ return [];
1027
+ // renderNodeToOutput adds el's OWN computedLeft/Top to offsetX/Y.
1028
+ // Passing -elLeft/-elTop nets to 0 → paints at (0,0) in our buffer.
1029
+ const elLeft = el.yogaNode.getComputedLeft();
1030
+ const elTop = el.yogaNode.getComputedTop();
1031
+ const screen = createScreen(width, height, this.stylePool, this.charPool, this.hyperlinkPool);
1032
+ const output = new Output({
1033
+ width,
1034
+ height,
1035
+ stylePool: this.stylePool,
1036
+ screen
1037
+ });
1038
+ renderNodeToOutput(el, output, {
1039
+ offsetX: -elLeft,
1040
+ offsetY: -elTop,
1041
+ prevScreen: undefined
1042
+ });
1043
+ const rendered = output.get();
1044
+ // renderNodeToOutput wrote our offset positions to nodeCache —
1045
+ // corrupts the main render (it'd blit from wrong coords). Mark the
1046
+ // subtree dirty so the next main render repaints + re-caches
1047
+ // correctly. One extra paint of this message, but correct > fast.
1048
+ dom.markDirty(el);
1049
+ const positions = scanPositions(rendered, this.searchHighlightQuery);
1050
+ logForDebugging(`scanElementSubtree: q='${this.searchHighlightQuery}' ` + `el=${width}x${height}@(${elLeft},${elTop}) n=${positions.length} ` + `[${positions.slice(0, 10).map(p => `${p.row}:${p.col}`).join(',')}` + `${positions.length > 10 ? ',…' : ''}]`);
1051
+ return positions;
1052
+ }
1053
+ /** Set the position-based highlight state. Every frame, writes CURRENT
1054
+ * style at positions[currentIdx] + rowOffset. null clears. The scan-
1055
+ * highlight (inverse on all matches) still runs — this overlays yellow
1056
+ * on top. rowOffset changes as the user scrolls (= message's current
1057
+ * screen-top); positions stay stable (message-relative). */
1058
+ setSearchPositions(state) {
1059
+ this.searchPositions = state;
1060
+ this.scheduleRender();
1061
+ }
1062
+ /**
1063
+ * Set the selection highlight background color. Replaces the per-cell
1064
+ * SGR-7 inverse with a solid theme-aware bg (matches native terminal
1065
+ * selection). Accepts the same color formats as Text backgroundColor
1066
+ * (rgb(), ansi:name, #hex, ansi256()) — colorize() routes through
1067
+ * chalk so the tmux/xterm.js level clamps in colorize.ts apply and
1068
+ * the emitted SGR is correct for the current terminal.
1069
+ *
1070
+ * Called by React-land once theme is known (ScrollKeybindingHandler's
1071
+ * useEffect watching useTheme). Before that call, withSelectionBg
1072
+ * falls back to withInverse so selection still renders on the first
1073
+ * frame; the effect fires before any mouse input so the fallback is
1074
+ * unobservable in practice.
1075
+ */
1076
+ setSelectionBgColor(color) {
1077
+ // Wrap a NUL marker, then split on it to extract the open/close SGR.
1078
+ // colorize returns the input unchanged if the color string is bad —
1079
+ // no NUL-split then, so fall through to null (inverse fallback).
1080
+ const wrapped = colorize('\0', color, 'background');
1081
+ const nul = wrapped.indexOf('\0');
1082
+ if (nul <= 0 || nul === wrapped.length - 1) {
1083
+ this.stylePool.setSelectionBg(null);
1084
+ return;
1085
+ }
1086
+ this.stylePool.setSelectionBg({
1087
+ type: 'ansi',
1088
+ code: wrapped.slice(0, nul),
1089
+ endCode: wrapped.slice(nul + 1) // always \x1b[49m for bg
1090
+ });
1091
+ // No scheduleRender: this is called from a React effect that already
1092
+ // runs inside the render cycle, and the bg only matters once a
1093
+ // selection exists (which itself triggers a full-damage frame).
1094
+ }
1095
+ /**
1096
+ * Capture text from rows about to scroll out of the viewport during
1097
+ * drag-to-scroll. Must be called BEFORE the ScrollBox scrolls so the
1098
+ * screen buffer still holds the outgoing content. Accumulated into
1099
+ * the selection state and joined back in by getSelectedText.
1100
+ */
1101
+ captureScrolledRows(firstRow, lastRow, side) {
1102
+ captureScrolledRows(this.selection, this.frontFrame.screen, firstRow, lastRow, side);
1103
+ }
1104
+ /**
1105
+ * Shift anchor AND focus by dRow, clamped to [minRow, maxRow]. Used by
1106
+ * keyboard scroll handlers (PgUp/PgDn etc.) so the highlight tracks the
1107
+ * content instead of disappearing. Unlike shiftAnchor (drag-to-scroll),
1108
+ * this moves BOTH endpoints — the user isn't holding the mouse at one
1109
+ * edge. Supplies screen.width for the col-reset-on-clamp boundary.
1110
+ */
1111
+ shiftSelectionForScroll(dRow, minRow, maxRow) {
1112
+ const hadSel = hasSelection(this.selection);
1113
+ shiftSelection(this.selection, dRow, minRow, maxRow, this.frontFrame.screen.width);
1114
+ // shiftSelection clears when both endpoints overshoot the same edge
1115
+ // (Home/g/End/G page-jump past the selection). Notify subscribers so
1116
+ // useHasSelection updates. Safe to call notifySelectionChange here —
1117
+ // this runs from keyboard handlers, not inside onRender().
1118
+ if (hadSel && !hasSelection(this.selection)) {
1119
+ this.notifySelectionChange();
1120
+ }
1121
+ }
1122
+ /**
1123
+ * Keyboard selection extension (shift+arrow/home/end). Moves focus;
1124
+ * anchor stays fixed so the highlight grows or shrinks relative to it.
1125
+ * Left/right wrap across row boundaries — native macOS text-edit
1126
+ * behavior: shift+left at col 0 wraps to end of the previous row.
1127
+ * Up/down clamp at viewport edges (no scroll-to-extend yet). Drops to
1128
+ * char mode. No-op outside alt-screen or without an active selection.
1129
+ */
1130
+ moveSelectionFocus(move) {
1131
+ if (!this.altScreenActive)
1132
+ return;
1133
+ const { focus } = this.selection;
1134
+ if (!focus)
1135
+ return;
1136
+ const { width, height } = this.frontFrame.screen;
1137
+ const maxCol = width - 1;
1138
+ const maxRow = height - 1;
1139
+ let { col, row } = focus;
1140
+ switch (move) {
1141
+ case 'left':
1142
+ if (col > 0)
1143
+ col--;
1144
+ else if (row > 0) {
1145
+ col = maxCol;
1146
+ row--;
1147
+ }
1148
+ break;
1149
+ case 'right':
1150
+ if (col < maxCol)
1151
+ col++;
1152
+ else if (row < maxRow) {
1153
+ col = 0;
1154
+ row++;
1155
+ }
1156
+ break;
1157
+ case 'up':
1158
+ if (row > 0)
1159
+ row--;
1160
+ break;
1161
+ case 'down':
1162
+ if (row < maxRow)
1163
+ row++;
1164
+ break;
1165
+ case 'lineStart':
1166
+ col = 0;
1167
+ break;
1168
+ case 'lineEnd':
1169
+ col = maxCol;
1170
+ break;
1171
+ }
1172
+ if (col === focus.col && row === focus.row)
1173
+ return;
1174
+ moveFocus(this.selection, col, row);
1175
+ this.notifySelectionChange();
1176
+ }
1177
+ /** Whether there is an active text selection. */
1178
+ hasTextSelection() {
1179
+ return hasSelection(this.selection);
1180
+ }
1181
+ /**
1182
+ * Subscribe to selection state changes. Fires whenever the selection
1183
+ * is started, updated, cleared, or copied. Returns an unsubscribe fn.
1184
+ */
1185
+ subscribeToSelectionChange(cb) {
1186
+ this.selectionListeners.add(cb);
1187
+ return () => this.selectionListeners.delete(cb);
1188
+ }
1189
+ notifySelectionChange() {
1190
+ this.onRender();
1191
+ for (const cb of this.selectionListeners)
1192
+ cb();
1193
+ }
1194
+ /**
1195
+ * Hit-test the rendered DOM tree at (col, row) and bubble a ClickEvent
1196
+ * from the deepest hit node up through ancestors with onClick handlers.
1197
+ * Returns true if a DOM handler consumed the click. Gated on
1198
+ * altScreenActive — clicks only make sense with a fixed viewport where
1199
+ * nodeCache rects map 1:1 to terminal cells (no scrollback offset).
1200
+ */
1201
+ dispatchClick(col, row) {
1202
+ if (!this.altScreenActive)
1203
+ return false;
1204
+ const blank = isEmptyCellAt(this.frontFrame.screen, col, row);
1205
+ return dispatchClick(this.rootNode, col, row, blank);
1206
+ }
1207
+ dispatchHover(col, row) {
1208
+ if (!this.altScreenActive)
1209
+ return;
1210
+ dispatchHover(this.rootNode, col, row, this.hoveredNodes);
1211
+ }
1212
+ dispatchKeyboardEvent(parsedKey) {
1213
+ const target = this.focusManager.activeElement ?? this.rootNode;
1214
+ const event = new KeyboardEvent(parsedKey);
1215
+ dispatcher.dispatchDiscrete(target, event);
1216
+ // Tab cycling is the default action — only fires if no handler
1217
+ // called preventDefault(). Mirrors browser behavior.
1218
+ if (!event.defaultPrevented && parsedKey.name === 'tab' && !parsedKey.ctrl && !parsedKey.meta) {
1219
+ if (parsedKey.shift) {
1220
+ this.focusManager.focusPrevious(this.rootNode);
1221
+ }
1222
+ else {
1223
+ this.focusManager.focusNext(this.rootNode);
1224
+ }
1225
+ }
1226
+ }
1227
+ /**
1228
+ * Look up the URL at (col, row) in the current front frame. Checks for
1229
+ * an OSC 8 hyperlink first, then falls back to scanning the row for a
1230
+ * plain-text URL (mouse tracking intercepts the terminal's native
1231
+ * Cmd+Click URL detection, so we replicate it). This is a pure lookup
1232
+ * with no side effects — call it synchronously at click time so the
1233
+ * result reflects the screen the user actually clicked on, then defer
1234
+ * the browser-open action via a timer.
1235
+ */
1236
+ getHyperlinkAt(col, row) {
1237
+ if (!this.altScreenActive)
1238
+ return undefined;
1239
+ const screen = this.frontFrame.screen;
1240
+ const cell = cellAt(screen, col, row);
1241
+ let url = cell?.hyperlink;
1242
+ // SpacerTail cells (right half of wide/CJK/emoji chars) store the
1243
+ // hyperlink on the head cell at col-1.
1244
+ if (!url && cell?.width === 2 /* CellWidth.SpacerTail */ && col > 0) {
1245
+ url = cellAt(screen, col - 1, row)?.hyperlink;
1246
+ }
1247
+ return url ?? findPlainTextUrlAt(screen, col, row);
1248
+ }
1249
+ /**
1250
+ * Optional callback fired when clicking an OSC 8 hyperlink in fullscreen
1251
+ * mode. Set by FullscreenLayout via useLayoutEffect.
1252
+ */
1253
+ onHyperlinkClick;
1254
+ /**
1255
+ * Stable prototype wrapper for onHyperlinkClick. Passed to <App> as
1256
+ * onOpenHyperlink so the prop is a bound method (autoBind'd) that reads
1257
+ * the mutable field at call time — not the undefined-at-render value.
1258
+ */
1259
+ openHyperlink(url) {
1260
+ this.onHyperlinkClick?.(url);
1261
+ }
1262
+ /**
1263
+ * Handle a double- or triple-click at (col, row): select the word or
1264
+ * line under the cursor by reading the current screen buffer. Called on
1265
+ * PRESS (not release) so the highlight appears immediately and drag can
1266
+ * extend the selection word-by-word / line-by-line. Falls back to
1267
+ * char-mode startSelection if the click lands on a noSelect cell.
1268
+ */
1269
+ handleMultiClick(col, row, count) {
1270
+ if (!this.altScreenActive)
1271
+ return;
1272
+ const screen = this.frontFrame.screen;
1273
+ // selectWordAt/selectLineAt no-op on noSelect/out-of-bounds. Seed with
1274
+ // a char-mode selection so the press still starts a drag even if the
1275
+ // word/line scan finds nothing selectable.
1276
+ startSelection(this.selection, col, row);
1277
+ if (count === 2)
1278
+ selectWordAt(this.selection, screen, col, row);
1279
+ else
1280
+ selectLineAt(this.selection, screen, row);
1281
+ // Ensure hasSelection is true so release doesn't re-dispatch onClickAt.
1282
+ // selectWordAt no-ops on noSelect; selectLineAt no-ops out-of-bounds.
1283
+ if (!this.selection.focus)
1284
+ this.selection.focus = this.selection.anchor;
1285
+ this.notifySelectionChange();
1286
+ }
1287
+ /**
1288
+ * Handle a drag-motion at (col, row). In char mode updates focus to the
1289
+ * exact cell. In word/line mode snaps to word/line boundaries so the
1290
+ * selection extends by word/line like native macOS. Gated on
1291
+ * altScreenActive for the same reason as dispatchClick.
1292
+ */
1293
+ handleSelectionDrag(col, row) {
1294
+ if (!this.altScreenActive)
1295
+ return;
1296
+ const sel = this.selection;
1297
+ if (sel.anchorSpan) {
1298
+ extendSelection(sel, this.frontFrame.screen, col, row);
1299
+ }
1300
+ else {
1301
+ updateSelection(sel, col, row);
1302
+ }
1303
+ this.notifySelectionChange();
1304
+ }
1305
+ // Methods to properly suspend stdin for external editor usage
1306
+ // This is needed to prevent Ink from swallowing keystrokes when an external editor is active
1307
+ stdinListeners = [];
1308
+ wasRawMode = false;
1309
+ suspendStdin() {
1310
+ const stdin = this.options.stdin;
1311
+ if (!stdin.isTTY) {
1312
+ return;
1313
+ }
1314
+ // Store and remove all 'readable' event listeners temporarily
1315
+ // This prevents Ink from consuming stdin while the editor is active
1316
+ const readableListeners = stdin.listeners('readable');
1317
+ logForDebugging(`[stdin] suspendStdin: removing ${readableListeners.length} readable listener(s), wasRawMode=${stdin.isRaw ?? false}`);
1318
+ readableListeners.forEach(listener => {
1319
+ this.stdinListeners.push({
1320
+ event: 'readable',
1321
+ listener: listener
1322
+ });
1323
+ stdin.removeListener('readable', listener);
1324
+ });
1325
+ // If raw mode is enabled, disable it temporarily
1326
+ const stdinWithRaw = stdin;
1327
+ if (stdinWithRaw.isRaw && stdinWithRaw.setRawMode) {
1328
+ stdinWithRaw.setRawMode(false);
1329
+ this.wasRawMode = true;
1330
+ }
1331
+ }
1332
+ resumeStdin() {
1333
+ const stdin = this.options.stdin;
1334
+ if (!stdin.isTTY) {
1335
+ return;
1336
+ }
1337
+ // Re-attach all the stored listeners
1338
+ if (this.stdinListeners.length === 0 && !this.wasRawMode) {
1339
+ logForDebugging('[stdin] resumeStdin: called with no stored listeners and wasRawMode=false (possible desync)', {
1340
+ level: 'warn'
1341
+ });
1342
+ }
1343
+ logForDebugging(`[stdin] resumeStdin: re-attaching ${this.stdinListeners.length} listener(s), wasRawMode=${this.wasRawMode}`);
1344
+ this.stdinListeners.forEach(({ event, listener }) => {
1345
+ stdin.addListener(event, listener);
1346
+ });
1347
+ this.stdinListeners = [];
1348
+ // Re-enable raw mode if it was enabled before
1349
+ if (this.wasRawMode) {
1350
+ const stdinWithRaw = stdin;
1351
+ if (stdinWithRaw.setRawMode) {
1352
+ stdinWithRaw.setRawMode(true);
1353
+ }
1354
+ this.wasRawMode = false;
1355
+ }
1356
+ }
1357
+ // Stable identity for TerminalWriteContext. An inline arrow here would
1358
+ // change on every render() call (initial mount + each resize), which
1359
+ // cascades through useContext → <AlternateScreen>'s useLayoutEffect dep
1360
+ // array → spurious exit+re-enter of the alt screen on every SIGWINCH.
1361
+ writeRaw(data) {
1362
+ this.options.stdout.write(data);
1363
+ }
1364
+ setCursorDeclaration = (decl, clearIfNode) => {
1365
+ if (decl === null && clearIfNode !== undefined && this.cursorDeclaration?.node !== clearIfNode) {
1366
+ return;
1367
+ }
1368
+ this.cursorDeclaration = decl;
1369
+ };
1370
+ render(node) {
1371
+ this.currentNode = node;
1372
+ const tree = _jsx(App, { stdin: this.options.stdin, stdout: this.options.stdout, stderr: this.options.stderr, exitOnCtrlC: this.options.exitOnCtrlC, onExit: this.unmount, terminalColumns: this.terminalColumns, terminalRows: this.terminalRows, selection: this.selection, onSelectionChange: this.notifySelectionChange, onClickAt: this.dispatchClick, onHoverAt: this.dispatchHover, getHyperlinkAt: this.getHyperlinkAt, onOpenHyperlink: this.openHyperlink, onMultiClick: this.handleMultiClick, onSelectionDrag: this.handleSelectionDrag, onStdinResume: this.reassertTerminalModes, onCursorDeclaration: this.setCursorDeclaration, dispatchKeyboardEvent: this.dispatchKeyboardEvent, children: _jsx(TerminalWriteProvider, { value: this.writeRaw, children: node }) });
1373
+ // @ts-expect-error updateContainerSync exists in react-reconciler but not in @types/react-reconciler
1374
+ reconciler.updateContainerSync(tree, this.container, null, noop);
1375
+ // @ts-expect-error flushSyncWork exists in react-reconciler but not in @types/react-reconciler
1376
+ reconciler.flushSyncWork();
1377
+ }
1378
+ unmount(error) {
1379
+ if (this.isUnmounted) {
1380
+ return;
1381
+ }
1382
+ this.onRender();
1383
+ this.unsubscribeExit();
1384
+ if (typeof this.restoreConsole === 'function') {
1385
+ this.restoreConsole();
1386
+ }
1387
+ this.restoreStderr?.();
1388
+ this.unsubscribeTTYHandlers?.();
1389
+ // Non-TTY environments don't handle erasing ansi escapes well, so it's better to
1390
+ // only render last frame of non-static output
1391
+ const diff = this.log.renderPreviousOutput_DEPRECATED(this.frontFrame);
1392
+ writeDiffToTerminal(this.terminal, optimize(diff));
1393
+ // Clean up terminal modes synchronously before process exit.
1394
+ // React's componentWillUnmount won't run in time when process.exit() is called,
1395
+ // so we must reset terminal modes here to prevent escape sequence leakage.
1396
+ // Use writeSync to stdout (fd 1) to ensure writes complete before exit.
1397
+ // We unconditionally send all disable sequences because terminal detection
1398
+ // may not work correctly (e.g., in tmux, screen) and these are no-ops on
1399
+ // terminals that don't support them.
1400
+ /* eslint-disable custom-rules/no-sync-fs -- process exiting; async writes would be dropped */
1401
+ if (this.options.stdout.isTTY) {
1402
+ if (this.altScreenActive) {
1403
+ // <AlternateScreen>'s unmount effect won't run during signal-exit.
1404
+ // Exit alt screen FIRST so other cleanup sequences go to the main screen.
1405
+ writeSync(1, EXIT_ALT_SCREEN);
1406
+ }
1407
+ // Disable mouse tracking — unconditional because altScreenActive can be
1408
+ // stale if AlternateScreen's unmount (which flips the flag) raced a
1409
+ // blocked event loop + SIGINT. No-op if tracking was never enabled.
1410
+ writeSync(1, DISABLE_MOUSE_TRACKING);
1411
+ // Drain stdin so in-flight mouse events don't leak to the shell
1412
+ this.drainStdin();
1413
+ // Disable extended key reporting (both kitty and modifyOtherKeys)
1414
+ writeSync(1, DISABLE_MODIFY_OTHER_KEYS);
1415
+ writeSync(1, DISABLE_KITTY_KEYBOARD);
1416
+ // Disable focus events (DECSET 1004)
1417
+ writeSync(1, DFE);
1418
+ // Disable bracketed paste mode
1419
+ writeSync(1, DBP);
1420
+ // Show cursor
1421
+ writeSync(1, SHOW_CURSOR);
1422
+ // Clear iTerm2 progress bar
1423
+ writeSync(1, CLEAR_ITERM2_PROGRESS);
1424
+ // Clear tab status (OSC 21337) so a stale dot doesn't linger
1425
+ if (supportsTabStatus())
1426
+ writeSync(1, wrapForMultiplexer(CLEAR_TAB_STATUS));
1427
+ }
1428
+ /* eslint-enable custom-rules/no-sync-fs */
1429
+ this.isUnmounted = true;
1430
+ // Cancel any pending throttled renders to prevent accessing freed Yoga nodes
1431
+ this.scheduleRender.cancel?.();
1432
+ if (this.drainTimer !== null) {
1433
+ clearTimeout(this.drainTimer);
1434
+ this.drainTimer = null;
1435
+ }
1436
+ // @ts-expect-error updateContainerSync exists in react-reconciler but not in @types/react-reconciler
1437
+ reconciler.updateContainerSync(null, this.container, null, noop);
1438
+ // @ts-expect-error flushSyncWork exists in react-reconciler but not in @types/react-reconciler
1439
+ reconciler.flushSyncWork();
1440
+ instances.delete(this.options.stdout);
1441
+ // Free the root yoga node, then clear its reference. Children are already
1442
+ // freed by the reconciler's removeChildFromContainer; using .free() (not
1443
+ // .freeRecursive()) avoids double-freeing them.
1444
+ this.rootNode.yogaNode?.free();
1445
+ this.rootNode.yogaNode = undefined;
1446
+ if (error instanceof Error) {
1447
+ this.rejectExitPromise(error);
1448
+ }
1449
+ else {
1450
+ this.resolveExitPromise();
1451
+ }
1452
+ }
1453
+ async waitUntilExit() {
1454
+ this.exitPromise ||= new Promise((resolve, reject) => {
1455
+ this.resolveExitPromise = resolve;
1456
+ this.rejectExitPromise = reject;
1457
+ });
1458
+ return this.exitPromise;
1459
+ }
1460
+ resetLineCount() {
1461
+ if (this.options.stdout.isTTY) {
1462
+ // Swap so old front becomes back (for screen reuse), then reset front
1463
+ this.backFrame = this.frontFrame;
1464
+ this.frontFrame = emptyFrame(this.frontFrame.viewport.height, this.frontFrame.viewport.width, this.stylePool, this.charPool, this.hyperlinkPool);
1465
+ this.log.reset();
1466
+ // frontFrame is reset, so frame.cursor on the next render is (0,0).
1467
+ // Clear displayCursor so the preamble doesn't compute a stale delta.
1468
+ this.displayCursor = null;
1469
+ }
1470
+ }
1471
+ /**
1472
+ * Replace char/hyperlink pools with fresh instances to prevent unbounded
1473
+ * growth during long sessions. Migrates the front frame's screen IDs into
1474
+ * the new pools so diffing remains correct. The back frame doesn't need
1475
+ * migration — resetScreen zeros it before any reads.
1476
+ *
1477
+ * Call between conversation turns or periodically.
1478
+ */
1479
+ resetPools() {
1480
+ this.charPool = new CharPool();
1481
+ this.hyperlinkPool = new HyperlinkPool();
1482
+ migrateScreenPools(this.frontFrame.screen, this.charPool, this.hyperlinkPool);
1483
+ // Back frame's data is zeroed by resetScreen before reads, but its pool
1484
+ // references are used by the renderer to intern new characters. Point
1485
+ // them at the new pools so the next frame's IDs are comparable.
1486
+ this.backFrame.screen.charPool = this.charPool;
1487
+ this.backFrame.screen.hyperlinkPool = this.hyperlinkPool;
1488
+ }
1489
+ patchConsole() {
1490
+ // biome-ignore lint/suspicious/noConsole: intentionally patching global console
1491
+ const con = console;
1492
+ const originals = {};
1493
+ const toDebug = (...args) => logForDebugging(`console.log: ${format(...args)}`);
1494
+ const toError = (...args) => logError(new Error(`console.error: ${format(...args)}`));
1495
+ for (const m of CONSOLE_STDOUT_METHODS) {
1496
+ originals[m] = con[m];
1497
+ con[m] = toDebug;
1498
+ }
1499
+ for (const m of CONSOLE_STDERR_METHODS) {
1500
+ originals[m] = con[m];
1501
+ con[m] = toError;
1502
+ }
1503
+ originals.assert = con.assert;
1504
+ con.assert = (condition, ...args) => {
1505
+ if (!condition)
1506
+ toError(...args);
1507
+ };
1508
+ return () => Object.assign(con, originals);
1509
+ }
1510
+ /**
1511
+ * Intercept process.stderr.write so stray writes (config.ts, hooks.ts,
1512
+ * third-party deps) don't corrupt the alt-screen buffer. patchConsole only
1513
+ * hooks console.* methods — direct stderr writes bypass it, land at the
1514
+ * parked cursor, scroll the alt-screen, and desync frontFrame from the
1515
+ * physical terminal. Next diff writes only changed-in-React cells at
1516
+ * absolute coords → interleaved garbage.
1517
+ *
1518
+ * Swallows the write (routes text to the debug log) and, in alt-screen,
1519
+ * forces a full-damage repaint as a defensive recovery. Not patching
1520
+ * process.stdout — Ink itself writes there.
1521
+ */
1522
+ patchStderr() {
1523
+ const stderr = process.stderr;
1524
+ const originalWrite = stderr.write;
1525
+ let reentered = false;
1526
+ const intercept = (chunk, encodingOrCb, cb) => {
1527
+ const callback = typeof encodingOrCb === 'function' ? encodingOrCb : cb;
1528
+ // Reentrancy guard: logForDebugging → writeToStderr → here. Pass
1529
+ // through to the original so --debug-to-stderr still works and we
1530
+ // don't stack-overflow.
1531
+ if (reentered) {
1532
+ const encoding = typeof encodingOrCb === 'string' ? encodingOrCb : undefined;
1533
+ return originalWrite.call(stderr, chunk, encoding, callback);
1534
+ }
1535
+ reentered = true;
1536
+ try {
1537
+ const text = typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8');
1538
+ logForDebugging(`[stderr] ${text}`, {
1539
+ level: 'warn'
1540
+ });
1541
+ if (this.altScreenActive && !this.isUnmounted && !this.isPaused) {
1542
+ this.prevFrameContaminated = true;
1543
+ this.scheduleRender();
1544
+ }
1545
+ }
1546
+ finally {
1547
+ reentered = false;
1548
+ callback?.();
1549
+ }
1550
+ return true;
1551
+ };
1552
+ stderr.write = intercept;
1553
+ return () => {
1554
+ if (stderr.write === intercept) {
1555
+ stderr.write = originalWrite;
1556
+ }
1557
+ };
1558
+ }
1559
+ }
1560
+ /**
1561
+ * Discard pending stdin bytes so in-flight escape sequences (mouse tracking
1562
+ * reports, bracketed-paste markers) don't leak to the shell after exit.
1563
+ *
1564
+ * Two layers of trickiness:
1565
+ *
1566
+ * 1. setRawMode is termios, not fcntl — the stdin fd stays blocking, so
1567
+ * readSync on it would hang forever. Node doesn't expose fcntl, so we
1568
+ * open /dev/tty fresh with O_NONBLOCK (all fds to the controlling
1569
+ * terminal share one line-discipline input queue).
1570
+ *
1571
+ * 2. By the time forceExit calls this, detachForShutdown has already put
1572
+ * the TTY back in cooked (canonical) mode. Canonical mode line-buffers
1573
+ * input until newline, so O_NONBLOCK reads return EAGAIN even when
1574
+ * mouse bytes are sitting in the buffer. We briefly re-enter raw mode
1575
+ * so reads return any available bytes, then restore cooked mode.
1576
+ *
1577
+ * Safe to call multiple times. Call as LATE as possible in the exit path:
1578
+ * DISABLE_MOUSE_TRACKING has terminal round-trip latency, so events can
1579
+ * arrive for a few ms after it's written.
1580
+ */
1581
+ /* eslint-disable custom-rules/no-sync-fs -- must be sync; called from signal handler / unmount */
1582
+ export function drainStdin(stdin = process.stdin) {
1583
+ if (!stdin.isTTY)
1584
+ return;
1585
+ // Drain Node's stream buffer (bytes libuv already pulled in). read()
1586
+ // returns null when empty — never blocks.
1587
+ try {
1588
+ while (stdin.read() !== null) {
1589
+ /* discard */
1590
+ }
1591
+ }
1592
+ catch {
1593
+ /* stream may be destroyed */
1594
+ }
1595
+ // No /dev/tty on Windows; CONIN$ doesn't support O_NONBLOCK semantics.
1596
+ // Windows Terminal also doesn't buffer mouse reports the same way.
1597
+ if (process.platform === 'win32')
1598
+ return;
1599
+ // termios is per-device: flip stdin to raw so canonical-mode line
1600
+ // buffering doesn't hide partial input from the non-blocking read.
1601
+ // Restored in the finally block.
1602
+ const tty = stdin;
1603
+ const wasRaw = tty.isRaw === true;
1604
+ // Drain the kernel TTY buffer via a fresh O_NONBLOCK fd. Bounded at 64
1605
+ // reads (64KB) — a real mouse burst is a few hundred bytes; the cap
1606
+ // guards against a terminal that ignores O_NONBLOCK.
1607
+ let fd = -1;
1608
+ try {
1609
+ // setRawMode inside try: on revoked TTY (SIGHUP/SSH disconnect) the
1610
+ // ioctl throws EBADF — same recovery path as openSync/readSync below.
1611
+ if (!wasRaw)
1612
+ tty.setRawMode?.(true);
1613
+ fd = openSync('/dev/tty', fsConstants.O_RDONLY | fsConstants.O_NONBLOCK);
1614
+ const buf = Buffer.alloc(1024);
1615
+ for (let i = 0; i < 64; i++) {
1616
+ if (readSync(fd, buf, 0, buf.length, null) <= 0)
1617
+ break;
1618
+ }
1619
+ }
1620
+ catch {
1621
+ // EAGAIN (buffer empty — expected), ENXIO/ENOENT (no controlling tty),
1622
+ // EBADF/EIO (TTY revoked — SIGHUP, SSH disconnect)
1623
+ }
1624
+ finally {
1625
+ if (fd >= 0) {
1626
+ try {
1627
+ closeSync(fd);
1628
+ }
1629
+ catch {
1630
+ /* ignore */
1631
+ }
1632
+ }
1633
+ if (!wasRaw) {
1634
+ try {
1635
+ tty.setRawMode?.(false);
1636
+ }
1637
+ catch {
1638
+ /* TTY may be gone */
1639
+ }
1640
+ }
1641
+ }
1642
+ }
1643
+ /* eslint-enable custom-rules/no-sync-fs */
1644
+ const CONSOLE_STDOUT_METHODS = ['log', 'info', 'debug', 'dir', 'dirxml', 'count', 'countReset', 'group', 'groupCollapsed', 'groupEnd', 'table', 'time', 'timeEnd', 'timeLog'];
1645
+ const CONSOLE_STDERR_METHODS = ['warn', 'error', 'trace'];