@xelauvas/xela-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1920) hide show
  1. package/README.md +200 -0
  2. package/bin/xela +100 -0
  3. package/package.json +88 -0
  4. package/src/QueryEngine.ts +1295 -0
  5. package/src/Task.ts +125 -0
  6. package/src/Tool.ts +792 -0
  7. package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
  8. package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
  9. package/src/_shims/bun_bundle.js +9 -0
  10. package/src/_shims/cjs_stub.cjs +23 -0
  11. package/src/_shims/empty_stub.js +33 -0
  12. package/src/_shims/loader.js +352 -0
  13. package/src/_shims/openai_adapter.ts +486 -0
  14. package/src/_shims/react_compiler_runtime.js +17 -0
  15. package/src/_shims/register.js +148 -0
  16. package/src/assistant/sessionHistory.ts +87 -0
  17. package/src/bootstrap/state.ts +1759 -0
  18. package/src/bridge/bridgeApi.ts +539 -0
  19. package/src/bridge/bridgeConfig.ts +48 -0
  20. package/src/bridge/bridgeDebug.ts +135 -0
  21. package/src/bridge/bridgeEnabled.ts +202 -0
  22. package/src/bridge/bridgeMain.ts +2999 -0
  23. package/src/bridge/bridgeMessaging.ts +461 -0
  24. package/src/bridge/bridgePermissionCallbacks.ts +43 -0
  25. package/src/bridge/bridgePointer.ts +210 -0
  26. package/src/bridge/bridgeStatusUtil.ts +163 -0
  27. package/src/bridge/bridgeUI.ts +530 -0
  28. package/src/bridge/capacityWake.ts +56 -0
  29. package/src/bridge/codeSessionApi.ts +168 -0
  30. package/src/bridge/createSession.ts +384 -0
  31. package/src/bridge/debugUtils.ts +141 -0
  32. package/src/bridge/envLessBridgeConfig.ts +165 -0
  33. package/src/bridge/flushGate.ts +71 -0
  34. package/src/bridge/inboundAttachments.ts +175 -0
  35. package/src/bridge/inboundMessages.ts +80 -0
  36. package/src/bridge/initReplBridge.ts +569 -0
  37. package/src/bridge/jwtUtils.ts +256 -0
  38. package/src/bridge/pollConfig.ts +110 -0
  39. package/src/bridge/pollConfigDefaults.ts +82 -0
  40. package/src/bridge/remoteBridgeCore.ts +1008 -0
  41. package/src/bridge/replBridge.ts +2406 -0
  42. package/src/bridge/replBridgeHandle.ts +36 -0
  43. package/src/bridge/replBridgeTransport.ts +370 -0
  44. package/src/bridge/sessionIdCompat.ts +57 -0
  45. package/src/bridge/sessionRunner.ts +550 -0
  46. package/src/bridge/trustedDevice.ts +210 -0
  47. package/src/bridge/types.ts +262 -0
  48. package/src/bridge/workSecret.ts +127 -0
  49. package/src/buddy/CompanionSprite.tsx +371 -0
  50. package/src/buddy/companion.ts +133 -0
  51. package/src/buddy/prompt.ts +36 -0
  52. package/src/buddy/sprites.ts +514 -0
  53. package/src/buddy/types.ts +148 -0
  54. package/src/buddy/useBuddyNotification.tsx +98 -0
  55. package/src/cli/exit.ts +31 -0
  56. package/src/cli/handlers/agents.ts +70 -0
  57. package/src/cli/handlers/auth.ts +330 -0
  58. package/src/cli/handlers/autoMode.ts +170 -0
  59. package/src/cli/handlers/mcp.tsx +362 -0
  60. package/src/cli/handlers/plugins.ts +878 -0
  61. package/src/cli/handlers/util.tsx +110 -0
  62. package/src/cli/ndjsonSafeStringify.ts +32 -0
  63. package/src/cli/print.ts +5594 -0
  64. package/src/cli/remoteIO.ts +255 -0
  65. package/src/cli/structuredIO.ts +859 -0
  66. package/src/cli/transports/HybridTransport.ts +282 -0
  67. package/src/cli/transports/SSETransport.ts +711 -0
  68. package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
  69. package/src/cli/transports/WebSocketTransport.ts +800 -0
  70. package/src/cli/transports/WorkerStateUploader.ts +131 -0
  71. package/src/cli/transports/ccrClient.ts +998 -0
  72. package/src/cli/transports/transportUtils.ts +45 -0
  73. package/src/cli/update.ts +422 -0
  74. package/src/commands/add-dir/add-dir.tsx +126 -0
  75. package/src/commands/add-dir/index.ts +11 -0
  76. package/src/commands/add-dir/validation.ts +110 -0
  77. package/src/commands/advisor.ts +109 -0
  78. package/src/commands/agents/agents.tsx +12 -0
  79. package/src/commands/agents/index.ts +10 -0
  80. package/src/commands/ant-trace/index.js +1 -0
  81. package/src/commands/autofix-pr/index.js +1 -0
  82. package/src/commands/backfill-sessions/index.js +1 -0
  83. package/src/commands/branch/branch.ts +296 -0
  84. package/src/commands/branch/index.ts +14 -0
  85. package/src/commands/break-cache/index.js +1 -0
  86. package/src/commands/bridge/bridge.tsx +509 -0
  87. package/src/commands/bridge/index.ts +26 -0
  88. package/src/commands/bridge-kick.ts +200 -0
  89. package/src/commands/brief.ts +130 -0
  90. package/src/commands/btw/btw.tsx +243 -0
  91. package/src/commands/btw/index.ts +13 -0
  92. package/src/commands/bughunter/index.js +1 -0
  93. package/src/commands/chrome/chrome.tsx +285 -0
  94. package/src/commands/chrome/index.ts +13 -0
  95. package/src/commands/clear/caches.ts +144 -0
  96. package/src/commands/clear/clear.ts +7 -0
  97. package/src/commands/clear/conversation.ts +251 -0
  98. package/src/commands/clear/index.ts +19 -0
  99. package/src/commands/color/color.ts +93 -0
  100. package/src/commands/color/index.ts +16 -0
  101. package/src/commands/commit-push-pr.ts +158 -0
  102. package/src/commands/commit.ts +92 -0
  103. package/src/commands/compact/compact.ts +287 -0
  104. package/src/commands/compact/index.ts +15 -0
  105. package/src/commands/config/config.tsx +7 -0
  106. package/src/commands/config/index.ts +11 -0
  107. package/src/commands/context/context-noninteractive.ts +325 -0
  108. package/src/commands/context/context.tsx +64 -0
  109. package/src/commands/context/index.ts +24 -0
  110. package/src/commands/copy/copy.tsx +371 -0
  111. package/src/commands/copy/index.ts +15 -0
  112. package/src/commands/cost/cost.ts +24 -0
  113. package/src/commands/cost/index.ts +23 -0
  114. package/src/commands/createMovedToPluginCommand.ts +65 -0
  115. package/src/commands/ctx_viz/index.js +1 -0
  116. package/src/commands/debug-tool-call/index.js +1 -0
  117. package/src/commands/desktop/desktop.tsx +9 -0
  118. package/src/commands/desktop/index.ts +26 -0
  119. package/src/commands/diff/diff.tsx +9 -0
  120. package/src/commands/diff/index.ts +8 -0
  121. package/src/commands/doctor/doctor.tsx +7 -0
  122. package/src/commands/doctor/index.ts +12 -0
  123. package/src/commands/effort/effort.tsx +183 -0
  124. package/src/commands/effort/index.ts +13 -0
  125. package/src/commands/env/index.js +1 -0
  126. package/src/commands/exit/exit.tsx +33 -0
  127. package/src/commands/exit/index.ts +12 -0
  128. package/src/commands/export/export.tsx +91 -0
  129. package/src/commands/export/index.ts +11 -0
  130. package/src/commands/extra-usage/extra-usage-core.ts +118 -0
  131. package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  132. package/src/commands/extra-usage/extra-usage.tsx +17 -0
  133. package/src/commands/extra-usage/index.ts +31 -0
  134. package/src/commands/fast/fast.tsx +269 -0
  135. package/src/commands/fast/index.ts +26 -0
  136. package/src/commands/feedback/feedback.tsx +25 -0
  137. package/src/commands/feedback/index.ts +26 -0
  138. package/src/commands/files/files.ts +19 -0
  139. package/src/commands/files/index.ts +12 -0
  140. package/src/commands/good-claude/index.js +1 -0
  141. package/src/commands/heapdump/heapdump.ts +17 -0
  142. package/src/commands/heapdump/index.ts +12 -0
  143. package/src/commands/help/help.tsx +11 -0
  144. package/src/commands/help/index.ts +10 -0
  145. package/src/commands/hooks/hooks.tsx +13 -0
  146. package/src/commands/hooks/index.ts +11 -0
  147. package/src/commands/ide/ide.tsx +646 -0
  148. package/src/commands/ide/index.ts +11 -0
  149. package/src/commands/init-verifiers.ts +262 -0
  150. package/src/commands/init.ts +256 -0
  151. package/src/commands/insights.ts +3200 -0
  152. package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
  153. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  154. package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  155. package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  156. package/src/commands/install-github-app/CreatingStep.tsx +65 -0
  157. package/src/commands/install-github-app/ErrorStep.tsx +85 -0
  158. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  159. package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
  160. package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  161. package/src/commands/install-github-app/SuccessStep.tsx +96 -0
  162. package/src/commands/install-github-app/WarningsStep.tsx +73 -0
  163. package/src/commands/install-github-app/index.ts +13 -0
  164. package/src/commands/install-github-app/install-github-app.tsx +587 -0
  165. package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
  166. package/src/commands/install-slack-app/index.ts +12 -0
  167. package/src/commands/install-slack-app/install-slack-app.ts +30 -0
  168. package/src/commands/install.tsx +300 -0
  169. package/src/commands/issue/index.js +1 -0
  170. package/src/commands/keybindings/index.ts +13 -0
  171. package/src/commands/keybindings/keybindings.ts +53 -0
  172. package/src/commands/login/index.ts +14 -0
  173. package/src/commands/login/login.tsx +104 -0
  174. package/src/commands/logout/index.ts +10 -0
  175. package/src/commands/logout/logout.tsx +82 -0
  176. package/src/commands/mcp/addCommand.ts +280 -0
  177. package/src/commands/mcp/index.ts +12 -0
  178. package/src/commands/mcp/mcp.tsx +85 -0
  179. package/src/commands/mcp/xaaIdpCommand.ts +266 -0
  180. package/src/commands/memory/index.ts +10 -0
  181. package/src/commands/memory/memory.tsx +90 -0
  182. package/src/commands/mobile/index.ts +11 -0
  183. package/src/commands/mobile/mobile.tsx +274 -0
  184. package/src/commands/mock-limits/index.js +1 -0
  185. package/src/commands/model/index.ts +16 -0
  186. package/src/commands/model/model.tsx +297 -0
  187. package/src/commands/oauth-refresh/index.js +1 -0
  188. package/src/commands/onboarding/index.js +1 -0
  189. package/src/commands/output-style/index.ts +11 -0
  190. package/src/commands/output-style/output-style.tsx +7 -0
  191. package/src/commands/passes/index.ts +22 -0
  192. package/src/commands/passes/passes.tsx +24 -0
  193. package/src/commands/perf-issue/index.js +1 -0
  194. package/src/commands/permissions/index.ts +11 -0
  195. package/src/commands/permissions/permissions.tsx +10 -0
  196. package/src/commands/plan/index.ts +11 -0
  197. package/src/commands/plan/plan.tsx +122 -0
  198. package/src/commands/plugin/AddMarketplace.tsx +162 -0
  199. package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
  200. package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
  201. package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
  202. package/src/commands/plugin/ManagePlugins.tsx +2215 -0
  203. package/src/commands/plugin/PluginErrors.tsx +124 -0
  204. package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
  205. package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
  206. package/src/commands/plugin/PluginSettings.tsx +1072 -0
  207. package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
  208. package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  209. package/src/commands/plugin/ValidatePlugin.tsx +98 -0
  210. package/src/commands/plugin/index.tsx +11 -0
  211. package/src/commands/plugin/parseArgs.ts +103 -0
  212. package/src/commands/plugin/plugin.tsx +7 -0
  213. package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  214. package/src/commands/plugin/usePagination.ts +171 -0
  215. package/src/commands/pr_comments/index.ts +50 -0
  216. package/src/commands/privacy-settings/index.ts +14 -0
  217. package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
  218. package/src/commands/rate-limit-options/index.ts +19 -0
  219. package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  220. package/src/commands/release-notes/index.ts +11 -0
  221. package/src/commands/release-notes/release-notes.ts +50 -0
  222. package/src/commands/reload-plugins/index.ts +18 -0
  223. package/src/commands/reload-plugins/reload-plugins.ts +61 -0
  224. package/src/commands/remote-env/index.ts +15 -0
  225. package/src/commands/remote-env/remote-env.tsx +7 -0
  226. package/src/commands/remote-setup/api.ts +182 -0
  227. package/src/commands/remote-setup/index.ts +20 -0
  228. package/src/commands/remote-setup/remote-setup.tsx +187 -0
  229. package/src/commands/rename/generateSessionName.ts +67 -0
  230. package/src/commands/rename/index.ts +12 -0
  231. package/src/commands/rename/rename.ts +87 -0
  232. package/src/commands/reset-limits/index.js +4 -0
  233. package/src/commands/resume/index.ts +12 -0
  234. package/src/commands/resume/resume.tsx +275 -0
  235. package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
  236. package/src/commands/review/reviewRemote.ts +316 -0
  237. package/src/commands/review/ultrareviewCommand.tsx +58 -0
  238. package/src/commands/review/ultrareviewEnabled.ts +14 -0
  239. package/src/commands/review.ts +57 -0
  240. package/src/commands/rewind/index.ts +13 -0
  241. package/src/commands/rewind/rewind.ts +13 -0
  242. package/src/commands/sandbox-toggle/index.ts +50 -0
  243. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  244. package/src/commands/security-review.ts +243 -0
  245. package/src/commands/session/index.ts +16 -0
  246. package/src/commands/session/session.tsx +140 -0
  247. package/src/commands/share/index.js +1 -0
  248. package/src/commands/skills/index.ts +10 -0
  249. package/src/commands/skills/skills.tsx +8 -0
  250. package/src/commands/stats/index.ts +10 -0
  251. package/src/commands/stats/stats.tsx +7 -0
  252. package/src/commands/status/index.ts +12 -0
  253. package/src/commands/status/status.tsx +8 -0
  254. package/src/commands/statusline.tsx +24 -0
  255. package/src/commands/stickers/index.ts +11 -0
  256. package/src/commands/stickers/stickers.ts +16 -0
  257. package/src/commands/summary/index.js +1 -0
  258. package/src/commands/tag/index.ts +12 -0
  259. package/src/commands/tag/tag.tsx +215 -0
  260. package/src/commands/tasks/index.ts +11 -0
  261. package/src/commands/tasks/tasks.tsx +8 -0
  262. package/src/commands/teleport/index.js +1 -0
  263. package/src/commands/terminalSetup/index.ts +23 -0
  264. package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
  265. package/src/commands/theme/index.ts +10 -0
  266. package/src/commands/theme/theme.tsx +57 -0
  267. package/src/commands/thinkback/index.ts +13 -0
  268. package/src/commands/thinkback/thinkback.tsx +554 -0
  269. package/src/commands/thinkback-play/index.ts +17 -0
  270. package/src/commands/thinkback-play/thinkback-play.ts +43 -0
  271. package/src/commands/ultraplan.tsx +471 -0
  272. package/src/commands/upgrade/index.ts +16 -0
  273. package/src/commands/upgrade/upgrade.tsx +38 -0
  274. package/src/commands/usage/index.ts +9 -0
  275. package/src/commands/usage/usage.tsx +7 -0
  276. package/src/commands/version.ts +22 -0
  277. package/src/commands/vim/index.ts +11 -0
  278. package/src/commands/vim/vim.ts +38 -0
  279. package/src/commands/voice/index.ts +20 -0
  280. package/src/commands/voice/voice.ts +150 -0
  281. package/src/commands.ts +754 -0
  282. package/src/components/AgentProgressLine.tsx +136 -0
  283. package/src/components/App.tsx +56 -0
  284. package/src/components/ApproveApiKey.tsx +123 -0
  285. package/src/components/AutoModeOptInDialog.tsx +142 -0
  286. package/src/components/AutoUpdater.tsx +198 -0
  287. package/src/components/AutoUpdaterWrapper.tsx +91 -0
  288. package/src/components/AwsAuthStatusBox.tsx +82 -0
  289. package/src/components/BaseTextInput.tsx +136 -0
  290. package/src/components/BashModeProgress.tsx +56 -0
  291. package/src/components/BridgeDialog.tsx +401 -0
  292. package/src/components/BypassPermissionsModeDialog.tsx +87 -0
  293. package/src/components/ChannelDowngradeDialog.tsx +102 -0
  294. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  295. package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
  296. package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  297. package/src/components/ClickableImageRef.tsx +73 -0
  298. package/src/components/CompactSummary.tsx +118 -0
  299. package/src/components/ConfigurableShortcutHint.tsx +57 -0
  300. package/src/components/ConsoleOAuthFlow.tsx +631 -0
  301. package/src/components/ContextSuggestions.tsx +47 -0
  302. package/src/components/ContextVisualization.tsx +489 -0
  303. package/src/components/CoordinatorAgentStatus.tsx +273 -0
  304. package/src/components/CostThresholdDialog.tsx +50 -0
  305. package/src/components/CtrlOToExpand.tsx +51 -0
  306. package/src/components/CustomSelect/SelectMulti.tsx +213 -0
  307. package/src/components/CustomSelect/index.ts +3 -0
  308. package/src/components/CustomSelect/option-map.ts +50 -0
  309. package/src/components/CustomSelect/select-input-option.tsx +488 -0
  310. package/src/components/CustomSelect/select-option.tsx +68 -0
  311. package/src/components/CustomSelect/select.tsx +690 -0
  312. package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
  313. package/src/components/CustomSelect/use-select-input.ts +287 -0
  314. package/src/components/CustomSelect/use-select-navigation.ts +653 -0
  315. package/src/components/CustomSelect/use-select-state.ts +157 -0
  316. package/src/components/DesktopHandoff.tsx +193 -0
  317. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  318. package/src/components/DevBar.tsx +49 -0
  319. package/src/components/DevChannelsDialog.tsx +105 -0
  320. package/src/components/DiagnosticsDisplay.tsx +95 -0
  321. package/src/components/EffortCallout.tsx +265 -0
  322. package/src/components/EffortIndicator.ts +42 -0
  323. package/src/components/ExitFlow.tsx +48 -0
  324. package/src/components/ExportDialog.tsx +128 -0
  325. package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
  326. package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
  327. package/src/components/FastIcon.tsx +46 -0
  328. package/src/components/Feedback.tsx +592 -0
  329. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  330. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  331. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  332. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  333. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  334. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  335. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  336. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  337. package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  338. package/src/components/FileEditToolDiff.tsx +181 -0
  339. package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
  340. package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
  341. package/src/components/FilePathLink.tsx +43 -0
  342. package/src/components/FullscreenLayout.tsx +637 -0
  343. package/src/components/GlobalSearchDialog.tsx +343 -0
  344. package/src/components/HelpV2/Commands.tsx +82 -0
  345. package/src/components/HelpV2/General.tsx +23 -0
  346. package/src/components/HelpV2/HelpV2.tsx +184 -0
  347. package/src/components/HighlightedCode/Fallback.tsx +193 -0
  348. package/src/components/HighlightedCode.tsx +190 -0
  349. package/src/components/HistorySearchDialog.tsx +118 -0
  350. package/src/components/IdeAutoConnectDialog.tsx +154 -0
  351. package/src/components/IdeOnboardingDialog.tsx +167 -0
  352. package/src/components/IdeStatusIndicator.tsx +58 -0
  353. package/src/components/IdleReturnDialog.tsx +118 -0
  354. package/src/components/InterruptedByUser.tsx +15 -0
  355. package/src/components/InvalidConfigDialog.tsx +156 -0
  356. package/src/components/InvalidSettingsDialog.tsx +89 -0
  357. package/src/components/KeybindingWarnings.tsx +55 -0
  358. package/src/components/LanguagePicker.tsx +86 -0
  359. package/src/components/LogSelector.tsx +1575 -0
  360. package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  361. package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
  362. package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
  363. package/src/components/LogoV2/Clawd.tsx +240 -0
  364. package/src/components/LogoV2/CondensedLogo.tsx +161 -0
  365. package/src/components/LogoV2/EmergencyTip.tsx +58 -0
  366. package/src/components/LogoV2/Feed.tsx +112 -0
  367. package/src/components/LogoV2/FeedColumn.tsx +59 -0
  368. package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  369. package/src/components/LogoV2/LogoV2.tsx +543 -0
  370. package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  371. package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  372. package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
  373. package/src/components/LogoV2/WelcomeV2.tsx +433 -0
  374. package/src/components/LogoV2/feedConfigs.tsx +92 -0
  375. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  376. package/src/components/MCPServerApprovalDialog.tsx +115 -0
  377. package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
  378. package/src/components/MCPServerDialogCopy.tsx +15 -0
  379. package/src/components/MCPServerMultiselectDialog.tsx +133 -0
  380. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  381. package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  382. package/src/components/Markdown.tsx +236 -0
  383. package/src/components/MarkdownTable.tsx +322 -0
  384. package/src/components/MemoryUsageIndicator.tsx +37 -0
  385. package/src/components/Message.tsx +627 -0
  386. package/src/components/MessageModel.tsx +43 -0
  387. package/src/components/MessageResponse.tsx +78 -0
  388. package/src/components/MessageRow.tsx +383 -0
  389. package/src/components/MessageSelector.tsx +831 -0
  390. package/src/components/MessageTimestamp.tsx +63 -0
  391. package/src/components/Messages.tsx +834 -0
  392. package/src/components/ModelPicker.tsx +448 -0
  393. package/src/components/NativeAutoUpdater.tsx +193 -0
  394. package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  395. package/src/components/OffscreenFreeze.tsx +44 -0
  396. package/src/components/Onboarding.tsx +244 -0
  397. package/src/components/OutputStylePicker.tsx +112 -0
  398. package/src/components/PackageManagerAutoUpdater.tsx +104 -0
  399. package/src/components/Passes/Passes.tsx +184 -0
  400. package/src/components/PrBadge.tsx +97 -0
  401. package/src/components/PressEnterToContinue.tsx +15 -0
  402. package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
  403. package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
  404. package/src/components/PromptInput/Notifications.tsx +332 -0
  405. package/src/components/PromptInput/PromptInput.tsx +2339 -0
  406. package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
  407. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  408. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  409. package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  410. package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  411. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  412. package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  413. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  414. package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
  415. package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
  416. package/src/components/PromptInput/inputModes.ts +33 -0
  417. package/src/components/PromptInput/inputPaste.ts +90 -0
  418. package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  419. package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  420. package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
  421. package/src/components/PromptInput/useSwarmBanner.ts +155 -0
  422. package/src/components/PromptInput/utils.ts +60 -0
  423. package/src/components/QuickOpenDialog.tsx +244 -0
  424. package/src/components/RemoteCallout.tsx +76 -0
  425. package/src/components/RemoteEnvironmentDialog.tsx +340 -0
  426. package/src/components/ResumeTask.tsx +268 -0
  427. package/src/components/SandboxViolationExpandedView.tsx +99 -0
  428. package/src/components/ScrollKeybindingHandler.tsx +1012 -0
  429. package/src/components/SearchBox.tsx +72 -0
  430. package/src/components/SentryErrorBoundary.ts +28 -0
  431. package/src/components/SessionBackgroundHint.tsx +108 -0
  432. package/src/components/SessionPreview.tsx +194 -0
  433. package/src/components/Settings/Config.tsx +1822 -0
  434. package/src/components/Settings/Settings.tsx +137 -0
  435. package/src/components/Settings/Status.tsx +241 -0
  436. package/src/components/Settings/Usage.tsx +377 -0
  437. package/src/components/ShowInIDEPrompt.tsx +170 -0
  438. package/src/components/SkillImprovementSurvey.tsx +152 -0
  439. package/src/components/Spinner/FlashingChar.tsx +61 -0
  440. package/src/components/Spinner/GlimmerMessage.tsx +328 -0
  441. package/src/components/Spinner/ShimmerChar.tsx +36 -0
  442. package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  443. package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
  444. package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  445. package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  446. package/src/components/Spinner/index.ts +10 -0
  447. package/src/components/Spinner/teammateSelectHint.ts +1 -0
  448. package/src/components/Spinner/useShimmerAnimation.ts +31 -0
  449. package/src/components/Spinner/useStalledAnimation.ts +75 -0
  450. package/src/components/Spinner/utils.ts +84 -0
  451. package/src/components/Spinner.tsx +562 -0
  452. package/src/components/Stats.tsx +1228 -0
  453. package/src/components/StatusLine.tsx +324 -0
  454. package/src/components/StatusNotices.tsx +55 -0
  455. package/src/components/StructuredDiff/Fallback.tsx +487 -0
  456. package/src/components/StructuredDiff/colorDiff.ts +37 -0
  457. package/src/components/StructuredDiff.tsx +190 -0
  458. package/src/components/StructuredDiffList.tsx +30 -0
  459. package/src/components/TagTabs.tsx +139 -0
  460. package/src/components/TaskListV2.tsx +378 -0
  461. package/src/components/TeammateViewHeader.tsx +82 -0
  462. package/src/components/TeleportError.tsx +189 -0
  463. package/src/components/TeleportProgress.tsx +140 -0
  464. package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
  465. package/src/components/TeleportResumeWrapper.tsx +167 -0
  466. package/src/components/TeleportStash.tsx +116 -0
  467. package/src/components/TextInput.tsx +124 -0
  468. package/src/components/ThemePicker.tsx +333 -0
  469. package/src/components/ThinkingToggle.tsx +153 -0
  470. package/src/components/TokenWarning.tsx +179 -0
  471. package/src/components/ToolUseLoader.tsx +42 -0
  472. package/src/components/TrustDialog/TrustDialog.tsx +290 -0
  473. package/src/components/TrustDialog/utils.ts +245 -0
  474. package/src/components/ValidationErrorsList.tsx +148 -0
  475. package/src/components/VimTextInput.tsx +140 -0
  476. package/src/components/VirtualMessageList.tsx +1082 -0
  477. package/src/components/WorkflowMultiselectDialog.tsx +128 -0
  478. package/src/components/WorktreeExitDialog.tsx +231 -0
  479. package/src/components/agents/AgentDetail.tsx +220 -0
  480. package/src/components/agents/AgentEditor.tsx +178 -0
  481. package/src/components/agents/AgentNavigationFooter.tsx +26 -0
  482. package/src/components/agents/AgentsList.tsx +440 -0
  483. package/src/components/agents/AgentsMenu.tsx +800 -0
  484. package/src/components/agents/ColorPicker.tsx +112 -0
  485. package/src/components/agents/ModelSelector.tsx +68 -0
  486. package/src/components/agents/ToolSelector.tsx +562 -0
  487. package/src/components/agents/agentFileUtils.ts +272 -0
  488. package/src/components/agents/generateAgent.ts +197 -0
  489. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  490. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  491. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  492. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  493. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  494. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  495. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  496. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  497. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  498. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  499. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  500. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  501. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  502. package/src/components/agents/types.ts +27 -0
  503. package/src/components/agents/utils.ts +18 -0
  504. package/src/components/agents/validateAgent.ts +109 -0
  505. package/src/components/design-system/Byline.tsx +77 -0
  506. package/src/components/design-system/Dialog.tsx +138 -0
  507. package/src/components/design-system/Divider.tsx +149 -0
  508. package/src/components/design-system/FuzzyPicker.tsx +312 -0
  509. package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
  510. package/src/components/design-system/ListItem.tsx +244 -0
  511. package/src/components/design-system/LoadingState.tsx +94 -0
  512. package/src/components/design-system/Pane.tsx +77 -0
  513. package/src/components/design-system/ProgressBar.tsx +86 -0
  514. package/src/components/design-system/Ratchet.tsx +80 -0
  515. package/src/components/design-system/StatusIcon.tsx +95 -0
  516. package/src/components/design-system/Tabs.tsx +340 -0
  517. package/src/components/design-system/ThemeProvider.tsx +174 -0
  518. package/src/components/design-system/ThemedBox.tsx +156 -0
  519. package/src/components/design-system/ThemedText.tsx +124 -0
  520. package/src/components/design-system/color.ts +30 -0
  521. package/src/components/diff/DiffDetailView.tsx +281 -0
  522. package/src/components/diff/DiffDialog.tsx +383 -0
  523. package/src/components/diff/DiffFileList.tsx +292 -0
  524. package/src/components/grove/Grove.tsx +463 -0
  525. package/src/components/hooks/HooksConfigMenu.tsx +578 -0
  526. package/src/components/hooks/PromptDialog.tsx +90 -0
  527. package/src/components/hooks/SelectEventMode.tsx +127 -0
  528. package/src/components/hooks/SelectHookMode.tsx +112 -0
  529. package/src/components/hooks/SelectMatcherMode.tsx +144 -0
  530. package/src/components/hooks/ViewHookMode.tsx +199 -0
  531. package/src/components/mcp/CapabilitiesSection.tsx +61 -0
  532. package/src/components/mcp/ElicitationDialog.tsx +1169 -0
  533. package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
  534. package/src/components/mcp/MCPListPanel.tsx +504 -0
  535. package/src/components/mcp/MCPReconnect.tsx +167 -0
  536. package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  537. package/src/components/mcp/MCPSettings.tsx +398 -0
  538. package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  539. package/src/components/mcp/MCPToolDetailView.tsx +212 -0
  540. package/src/components/mcp/MCPToolListView.tsx +141 -0
  541. package/src/components/mcp/McpParsingWarnings.tsx +213 -0
  542. package/src/components/mcp/index.ts +9 -0
  543. package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
  544. package/src/components/memory/MemoryFileSelector.tsx +438 -0
  545. package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
  546. package/src/components/messageActions.tsx +450 -0
  547. package/src/components/messages/AdvisorMessage.tsx +158 -0
  548. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  549. package/src/components/messages/AssistantTextMessage.tsx +270 -0
  550. package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
  551. package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
  552. package/src/components/messages/AttachmentMessage.tsx +536 -0
  553. package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  554. package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
  555. package/src/components/messages/GroupedToolUseContent.tsx +58 -0
  556. package/src/components/messages/HighlightedThinkingText.tsx +162 -0
  557. package/src/components/messages/HookProgressMessage.tsx +116 -0
  558. package/src/components/messages/PlanApprovalMessage.tsx +222 -0
  559. package/src/components/messages/RateLimitMessage.tsx +161 -0
  560. package/src/components/messages/ShutdownMessage.tsx +132 -0
  561. package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
  562. package/src/components/messages/SystemTextMessage.tsx +827 -0
  563. package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
  564. package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
  565. package/src/components/messages/UserBashInputMessage.tsx +58 -0
  566. package/src/components/messages/UserBashOutputMessage.tsx +54 -0
  567. package/src/components/messages/UserChannelMessage.tsx +137 -0
  568. package/src/components/messages/UserCommandMessage.tsx +108 -0
  569. package/src/components/messages/UserImageMessage.tsx +59 -0
  570. package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  571. package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
  572. package/src/components/messages/UserPlanMessage.tsx +42 -0
  573. package/src/components/messages/UserPromptMessage.tsx +80 -0
  574. package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  575. package/src/components/messages/UserTeammateMessage.tsx +206 -0
  576. package/src/components/messages/UserTextMessage.tsx +275 -0
  577. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  578. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  579. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  580. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  581. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  582. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  583. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  584. package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
  585. package/src/components/messages/nullRenderingAttachments.ts +70 -0
  586. package/src/components/messages/teamMemCollapsed.tsx +140 -0
  587. package/src/components/messages/teamMemSaved.ts +19 -0
  588. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  589. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  590. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  591. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  592. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  593. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  594. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  595. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  596. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  597. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  598. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  599. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  600. package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
  601. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  602. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  603. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  604. package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  605. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  606. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  607. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  608. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  609. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  610. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  611. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  612. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  613. package/src/components/permissions/PermissionDialog.tsx +72 -0
  614. package/src/components/permissions/PermissionExplanation.tsx +272 -0
  615. package/src/components/permissions/PermissionPrompt.tsx +336 -0
  616. package/src/components/permissions/PermissionRequest.tsx +217 -0
  617. package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
  618. package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
  619. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  620. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  621. package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
  622. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  623. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  624. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  625. package/src/components/permissions/WorkerBadge.tsx +49 -0
  626. package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
  627. package/src/components/permissions/hooks.ts +209 -0
  628. package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
  629. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  630. package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  631. package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  632. package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  633. package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  634. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  635. package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
  636. package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
  637. package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
  638. package/src/components/permissions/utils.ts +25 -0
  639. package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
  640. package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  641. package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
  642. package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
  643. package/src/components/sandbox/SandboxSettings.tsx +296 -0
  644. package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
  645. package/src/components/shell/OutputLine.tsx +118 -0
  646. package/src/components/shell/ShellProgressMessage.tsx +150 -0
  647. package/src/components/shell/ShellTimeDisplay.tsx +74 -0
  648. package/src/components/skills/SkillsMenu.tsx +237 -0
  649. package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  650. package/src/components/tasks/BackgroundTask.tsx +345 -0
  651. package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
  652. package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
  653. package/src/components/tasks/DreamDetailDialog.tsx +251 -0
  654. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  655. package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  656. package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
  657. package/src/components/tasks/ShellDetailDialog.tsx +404 -0
  658. package/src/components/tasks/ShellProgress.tsx +87 -0
  659. package/src/components/tasks/renderToolActivity.tsx +33 -0
  660. package/src/components/tasks/taskStatusUtils.tsx +107 -0
  661. package/src/components/teams/TeamStatus.tsx +80 -0
  662. package/src/components/teams/TeamsDialog.tsx +715 -0
  663. package/src/components/ui/OrderedList.tsx +71 -0
  664. package/src/components/ui/OrderedListItem.tsx +45 -0
  665. package/src/components/ui/TreeSelect.tsx +397 -0
  666. package/src/components/wizard/WizardDialogLayout.tsx +65 -0
  667. package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
  668. package/src/components/wizard/WizardProvider.tsx +213 -0
  669. package/src/components/wizard/index.ts +9 -0
  670. package/src/components/wizard/useWizard.ts +13 -0
  671. package/src/constants/apiLimits.ts +94 -0
  672. package/src/constants/betas.ts +52 -0
  673. package/src/constants/common.ts +33 -0
  674. package/src/constants/cyberRiskInstruction.ts +24 -0
  675. package/src/constants/errorIds.ts +15 -0
  676. package/src/constants/figures.ts +45 -0
  677. package/src/constants/files.ts +156 -0
  678. package/src/constants/github-app.ts +144 -0
  679. package/src/constants/keys.ts +11 -0
  680. package/src/constants/messages.ts +1 -0
  681. package/src/constants/oauth.ts +234 -0
  682. package/src/constants/outputStyles.ts +216 -0
  683. package/src/constants/product.ts +76 -0
  684. package/src/constants/prompts.ts +914 -0
  685. package/src/constants/spinnerVerbs.ts +204 -0
  686. package/src/constants/system.ts +95 -0
  687. package/src/constants/systemPromptSections.ts +68 -0
  688. package/src/constants/toolLimits.ts +56 -0
  689. package/src/constants/tools.ts +112 -0
  690. package/src/constants/turnCompletionVerbs.ts +12 -0
  691. package/src/constants/xml.ts +86 -0
  692. package/src/context/QueuedMessageContext.tsx +63 -0
  693. package/src/context/fpsMetrics.tsx +30 -0
  694. package/src/context/mailbox.tsx +38 -0
  695. package/src/context/modalContext.tsx +58 -0
  696. package/src/context/notifications.tsx +240 -0
  697. package/src/context/overlayContext.tsx +151 -0
  698. package/src/context/promptOverlayContext.tsx +125 -0
  699. package/src/context/stats.tsx +220 -0
  700. package/src/context/voice.tsx +88 -0
  701. package/src/context.ts +189 -0
  702. package/src/coordinator/coordinatorMode.ts +369 -0
  703. package/src/cost-tracker.ts +323 -0
  704. package/src/costHook.ts +22 -0
  705. package/src/dialogLaunchers.tsx +133 -0
  706. package/src/entrypoints/agentSdkTypes.ts +443 -0
  707. package/src/entrypoints/cli.tsx +303 -0
  708. package/src/entrypoints/init.ts +340 -0
  709. package/src/entrypoints/mcp.ts +196 -0
  710. package/src/entrypoints/sandboxTypes.ts +156 -0
  711. package/src/entrypoints/sdk/controlSchemas.ts +663 -0
  712. package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
  713. package/src/entrypoints/sdk/coreTypes.ts +62 -0
  714. package/src/history.ts +464 -0
  715. package/src/hooks/fileSuggestions.ts +811 -0
  716. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  717. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  718. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  719. package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
  720. package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  721. package/src/hooks/notifs/useInstallMessages.tsx +26 -0
  722. package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  723. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  724. package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  725. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  726. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  727. package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  728. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  729. package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
  730. package/src/hooks/notifs/useStartupNotification.ts +41 -0
  731. package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  732. package/src/hooks/renderPlaceholder.ts +51 -0
  733. package/src/hooks/toolPermission/PermissionContext.ts +388 -0
  734. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  735. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  736. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  737. package/src/hooks/toolPermission/permissionLogging.ts +238 -0
  738. package/src/hooks/unifiedSuggestions.ts +202 -0
  739. package/src/hooks/useAfterFirstRender.ts +17 -0
  740. package/src/hooks/useApiKeyVerification.ts +84 -0
  741. package/src/hooks/useArrowKeyHistory.tsx +229 -0
  742. package/src/hooks/useAssistantHistory.ts +250 -0
  743. package/src/hooks/useAwaySummary.ts +125 -0
  744. package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
  745. package/src/hooks/useBlink.ts +34 -0
  746. package/src/hooks/useCanUseTool.tsx +204 -0
  747. package/src/hooks/useCancelRequest.ts +276 -0
  748. package/src/hooks/useChromeExtensionNotification.tsx +50 -0
  749. package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  750. package/src/hooks/useClipboardImageHint.ts +77 -0
  751. package/src/hooks/useCommandKeybindings.tsx +108 -0
  752. package/src/hooks/useCommandQueue.ts +15 -0
  753. package/src/hooks/useCopyOnSelect.ts +98 -0
  754. package/src/hooks/useDeferredHookMessages.ts +46 -0
  755. package/src/hooks/useDiffData.ts +110 -0
  756. package/src/hooks/useDiffInIDE.ts +379 -0
  757. package/src/hooks/useDirectConnect.ts +229 -0
  758. package/src/hooks/useDoublePress.ts +62 -0
  759. package/src/hooks/useDynamicConfig.ts +22 -0
  760. package/src/hooks/useElapsedTime.ts +37 -0
  761. package/src/hooks/useExitOnCtrlCD.ts +95 -0
  762. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  763. package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
  764. package/src/hooks/useGlobalKeybindings.tsx +249 -0
  765. package/src/hooks/useHistorySearch.ts +303 -0
  766. package/src/hooks/useIDEIntegration.tsx +70 -0
  767. package/src/hooks/useIdeAtMentioned.ts +76 -0
  768. package/src/hooks/useIdeConnectionStatus.ts +33 -0
  769. package/src/hooks/useIdeLogging.ts +41 -0
  770. package/src/hooks/useIdeSelection.ts +150 -0
  771. package/src/hooks/useInboxPoller.ts +969 -0
  772. package/src/hooks/useInputBuffer.ts +132 -0
  773. package/src/hooks/useIssueFlagBanner.ts +133 -0
  774. package/src/hooks/useLogMessages.ts +119 -0
  775. package/src/hooks/useLspPluginRecommendation.tsx +194 -0
  776. package/src/hooks/useMailboxBridge.ts +21 -0
  777. package/src/hooks/useMainLoopModel.ts +34 -0
  778. package/src/hooks/useManagePlugins.ts +304 -0
  779. package/src/hooks/useMemoryUsage.ts +39 -0
  780. package/src/hooks/useMergedClients.ts +23 -0
  781. package/src/hooks/useMergedCommands.ts +15 -0
  782. package/src/hooks/useMergedTools.ts +44 -0
  783. package/src/hooks/useMinDisplayTime.ts +35 -0
  784. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  785. package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  786. package/src/hooks/usePasteHandler.ts +285 -0
  787. package/src/hooks/usePluginRecommendationBase.tsx +105 -0
  788. package/src/hooks/usePrStatus.ts +106 -0
  789. package/src/hooks/usePromptSuggestion.ts +177 -0
  790. package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  791. package/src/hooks/useQueueProcessor.ts +68 -0
  792. package/src/hooks/useRemoteSession.ts +605 -0
  793. package/src/hooks/useReplBridge.tsx +723 -0
  794. package/src/hooks/useSSHSession.ts +241 -0
  795. package/src/hooks/useScheduledTasks.ts +139 -0
  796. package/src/hooks/useSearchInput.ts +364 -0
  797. package/src/hooks/useSessionBackgrounding.ts +158 -0
  798. package/src/hooks/useSettings.ts +17 -0
  799. package/src/hooks/useSettingsChange.ts +25 -0
  800. package/src/hooks/useSkillImprovementSurvey.ts +105 -0
  801. package/src/hooks/useSkillsChange.ts +62 -0
  802. package/src/hooks/useSwarmInitialization.ts +81 -0
  803. package/src/hooks/useSwarmPermissionPoller.ts +330 -0
  804. package/src/hooks/useTaskListWatcher.ts +221 -0
  805. package/src/hooks/useTasksV2.ts +250 -0
  806. package/src/hooks/useTeammateViewAutoExit.ts +63 -0
  807. package/src/hooks/useTeleportResume.tsx +85 -0
  808. package/src/hooks/useTerminalSize.ts +15 -0
  809. package/src/hooks/useTextInput.ts +529 -0
  810. package/src/hooks/useTimeout.ts +14 -0
  811. package/src/hooks/useTurnDiffs.ts +213 -0
  812. package/src/hooks/useTypeahead.tsx +1385 -0
  813. package/src/hooks/useUpdateNotification.ts +34 -0
  814. package/src/hooks/useVimInput.ts +316 -0
  815. package/src/hooks/useVirtualScroll.ts +721 -0
  816. package/src/hooks/useVoice.ts +1144 -0
  817. package/src/hooks/useVoiceEnabled.ts +25 -0
  818. package/src/hooks/useVoiceIntegration.tsx +677 -0
  819. package/src/ink/Ansi.tsx +292 -0
  820. package/src/ink/bidi.ts +139 -0
  821. package/src/ink/clearTerminal.ts +74 -0
  822. package/src/ink/colorize.ts +231 -0
  823. package/src/ink/components/AlternateScreen.tsx +80 -0
  824. package/src/ink/components/App.tsx +659 -0
  825. package/src/ink/components/AppContext.ts +21 -0
  826. package/src/ink/components/Box.tsx +214 -0
  827. package/src/ink/components/Button.tsx +192 -0
  828. package/src/ink/components/ClockContext.tsx +112 -0
  829. package/src/ink/components/CursorDeclarationContext.ts +32 -0
  830. package/src/ink/components/ErrorOverview.tsx +109 -0
  831. package/src/ink/components/Link.tsx +42 -0
  832. package/src/ink/components/Newline.tsx +39 -0
  833. package/src/ink/components/NoSelect.tsx +68 -0
  834. package/src/ink/components/RawAnsi.tsx +57 -0
  835. package/src/ink/components/ScrollBox.tsx +237 -0
  836. package/src/ink/components/Spacer.tsx +20 -0
  837. package/src/ink/components/StdinContext.ts +49 -0
  838. package/src/ink/components/TerminalFocusContext.tsx +52 -0
  839. package/src/ink/components/TerminalSizeContext.tsx +7 -0
  840. package/src/ink/components/Text.tsx +254 -0
  841. package/src/ink/constants.ts +2 -0
  842. package/src/ink/dom.ts +484 -0
  843. package/src/ink/events/click-event.ts +38 -0
  844. package/src/ink/events/dispatcher.ts +233 -0
  845. package/src/ink/events/emitter.ts +39 -0
  846. package/src/ink/events/event-handlers.ts +73 -0
  847. package/src/ink/events/event.ts +11 -0
  848. package/src/ink/events/focus-event.ts +21 -0
  849. package/src/ink/events/input-event.ts +205 -0
  850. package/src/ink/events/keyboard-event.ts +51 -0
  851. package/src/ink/events/terminal-event.ts +107 -0
  852. package/src/ink/events/terminal-focus-event.ts +19 -0
  853. package/src/ink/focus.ts +181 -0
  854. package/src/ink/frame.ts +124 -0
  855. package/src/ink/get-max-width.ts +27 -0
  856. package/src/ink/hit-test.ts +130 -0
  857. package/src/ink/hooks/use-animation-frame.ts +57 -0
  858. package/src/ink/hooks/use-app.ts +8 -0
  859. package/src/ink/hooks/use-declared-cursor.ts +73 -0
  860. package/src/ink/hooks/use-input.ts +92 -0
  861. package/src/ink/hooks/use-interval.ts +67 -0
  862. package/src/ink/hooks/use-search-highlight.ts +53 -0
  863. package/src/ink/hooks/use-selection.ts +104 -0
  864. package/src/ink/hooks/use-stdin.ts +8 -0
  865. package/src/ink/hooks/use-tab-status.ts +72 -0
  866. package/src/ink/hooks/use-terminal-focus.ts +16 -0
  867. package/src/ink/hooks/use-terminal-title.ts +31 -0
  868. package/src/ink/hooks/use-terminal-viewport.ts +96 -0
  869. package/src/ink/ink.tsx +1728 -0
  870. package/src/ink/instances.ts +10 -0
  871. package/src/ink/layout/engine.ts +6 -0
  872. package/src/ink/layout/geometry.ts +97 -0
  873. package/src/ink/layout/node.ts +152 -0
  874. package/src/ink/layout/yoga.ts +308 -0
  875. package/src/ink/line-width-cache.ts +24 -0
  876. package/src/ink/log-update.ts +773 -0
  877. package/src/ink/measure-element.ts +23 -0
  878. package/src/ink/measure-text.ts +47 -0
  879. package/src/ink/node-cache.ts +54 -0
  880. package/src/ink/optimizer.ts +93 -0
  881. package/src/ink/output.ts +797 -0
  882. package/src/ink/parse-keypress.ts +801 -0
  883. package/src/ink/reconciler.ts +512 -0
  884. package/src/ink/render-border.ts +231 -0
  885. package/src/ink/render-node-to-output.ts +1462 -0
  886. package/src/ink/render-to-screen.ts +231 -0
  887. package/src/ink/renderer.ts +178 -0
  888. package/src/ink/root.ts +184 -0
  889. package/src/ink/screen.ts +1486 -0
  890. package/src/ink/searchHighlight.ts +93 -0
  891. package/src/ink/selection.ts +917 -0
  892. package/src/ink/squash-text-nodes.ts +92 -0
  893. package/src/ink/stringWidth.ts +222 -0
  894. package/src/ink/styles.ts +771 -0
  895. package/src/ink/supports-hyperlinks.ts +57 -0
  896. package/src/ink/tabstops.ts +46 -0
  897. package/src/ink/terminal-focus-state.ts +47 -0
  898. package/src/ink/terminal-querier.ts +212 -0
  899. package/src/ink/terminal.ts +248 -0
  900. package/src/ink/termio/ansi.ts +75 -0
  901. package/src/ink/termio/csi.ts +319 -0
  902. package/src/ink/termio/dec.ts +60 -0
  903. package/src/ink/termio/esc.ts +67 -0
  904. package/src/ink/termio/osc.ts +493 -0
  905. package/src/ink/termio/parser.ts +394 -0
  906. package/src/ink/termio/sgr.ts +308 -0
  907. package/src/ink/termio/tokenize.ts +319 -0
  908. package/src/ink/termio/types.ts +236 -0
  909. package/src/ink/termio.ts +42 -0
  910. package/src/ink/useTerminalNotification.ts +126 -0
  911. package/src/ink/warn.ts +9 -0
  912. package/src/ink/widest-line.ts +19 -0
  913. package/src/ink/wrap-text.ts +74 -0
  914. package/src/ink/wrapAnsi.ts +20 -0
  915. package/src/ink.ts +85 -0
  916. package/src/interactiveHelpers.tsx +367 -0
  917. package/src/keybindings/KeybindingContext.tsx +243 -0
  918. package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
  919. package/src/keybindings/defaultBindings.ts +340 -0
  920. package/src/keybindings/loadUserBindings.ts +472 -0
  921. package/src/keybindings/match.ts +120 -0
  922. package/src/keybindings/parser.ts +203 -0
  923. package/src/keybindings/reservedShortcuts.ts +127 -0
  924. package/src/keybindings/resolver.ts +244 -0
  925. package/src/keybindings/schema.ts +236 -0
  926. package/src/keybindings/shortcutFormat.ts +63 -0
  927. package/src/keybindings/template.ts +52 -0
  928. package/src/keybindings/useKeybinding.ts +196 -0
  929. package/src/keybindings/useShortcutDisplay.ts +59 -0
  930. package/src/keybindings/validate.ts +498 -0
  931. package/src/main.tsx +4684 -0
  932. package/src/memdir/findRelevantMemories.ts +141 -0
  933. package/src/memdir/memdir.ts +507 -0
  934. package/src/memdir/memoryAge.ts +53 -0
  935. package/src/memdir/memoryScan.ts +94 -0
  936. package/src/memdir/memoryTypes.ts +271 -0
  937. package/src/memdir/paths.ts +278 -0
  938. package/src/memdir/teamMemPaths.ts +292 -0
  939. package/src/memdir/teamMemPrompts.ts +100 -0
  940. package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  941. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  942. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  943. package/src/migrations/migrateFennecToOpus.ts +45 -0
  944. package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  945. package/src/migrations/migrateOpusToOpus1m.ts +43 -0
  946. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  947. package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  948. package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  949. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  950. package/src/migrations/resetProToOpusDefault.ts +51 -0
  951. package/src/moreright/useMoreRight.tsx +26 -0
  952. package/src/native-ts/color-diff/index.ts +999 -0
  953. package/src/native-ts/file-index/index.ts +370 -0
  954. package/src/native-ts/yoga-layout/enums.ts +134 -0
  955. package/src/native-ts/yoga-layout/index.ts +2578 -0
  956. package/src/outputStyles/loadOutputStylesDir.ts +98 -0
  957. package/src/plugins/builtinPlugins.ts +159 -0
  958. package/src/plugins/bundled/index.ts +23 -0
  959. package/src/projectOnboardingState.ts +83 -0
  960. package/src/query/config.ts +46 -0
  961. package/src/query/deps.ts +40 -0
  962. package/src/query/stopHooks.ts +473 -0
  963. package/src/query/tokenBudget.ts +93 -0
  964. package/src/query.ts +1729 -0
  965. package/src/remote/RemoteSessionManager.ts +343 -0
  966. package/src/remote/SessionsWebSocket.ts +404 -0
  967. package/src/remote/remotePermissionBridge.ts +78 -0
  968. package/src/remote/sdkMessageAdapter.ts +302 -0
  969. package/src/replLauncher.tsx +23 -0
  970. package/src/schemas/hooks.ts +222 -0
  971. package/src/screens/Doctor.tsx +575 -0
  972. package/src/screens/REPL.tsx +5006 -0
  973. package/src/screens/ResumeConversation.tsx +399 -0
  974. package/src/server/createDirectConnectSession.ts +88 -0
  975. package/src/server/directConnectManager.ts +213 -0
  976. package/src/server/types.ts +57 -0
  977. package/src/services/AgentSummary/agentSummary.ts +179 -0
  978. package/src/services/MagicDocs/magicDocs.ts +254 -0
  979. package/src/services/MagicDocs/prompts.ts +127 -0
  980. package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
  981. package/src/services/PromptSuggestion/speculation.ts +991 -0
  982. package/src/services/SessionMemory/prompts.ts +324 -0
  983. package/src/services/SessionMemory/sessionMemory.ts +495 -0
  984. package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  985. package/src/services/analytics/config.ts +38 -0
  986. package/src/services/analytics/datadog.ts +307 -0
  987. package/src/services/analytics/firstPartyEventLogger.ts +449 -0
  988. package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  989. package/src/services/analytics/growthbook.ts +1157 -0
  990. package/src/services/analytics/index.ts +173 -0
  991. package/src/services/analytics/metadata.ts +973 -0
  992. package/src/services/analytics/sink.ts +114 -0
  993. package/src/services/analytics/sinkKillswitch.ts +25 -0
  994. package/src/services/api/adminRequests.ts +119 -0
  995. package/src/services/api/bootstrap.ts +142 -0
  996. package/src/services/api/claude.ts +3433 -0
  997. package/src/services/api/client.ts +395 -0
  998. package/src/services/api/dumpPrompts.ts +226 -0
  999. package/src/services/api/emptyUsage.ts +22 -0
  1000. package/src/services/api/errorUtils.ts +260 -0
  1001. package/src/services/api/errors.ts +1207 -0
  1002. package/src/services/api/filesApi.ts +748 -0
  1003. package/src/services/api/firstTokenDate.ts +60 -0
  1004. package/src/services/api/grove.ts +357 -0
  1005. package/src/services/api/logging.ts +788 -0
  1006. package/src/services/api/metricsOptOut.ts +159 -0
  1007. package/src/services/api/overageCreditGrant.ts +137 -0
  1008. package/src/services/api/promptCacheBreakDetection.ts +727 -0
  1009. package/src/services/api/referral.ts +281 -0
  1010. package/src/services/api/sessionIngress.ts +514 -0
  1011. package/src/services/api/ultrareviewQuota.ts +38 -0
  1012. package/src/services/api/usage.ts +63 -0
  1013. package/src/services/api/withRetry.ts +826 -0
  1014. package/src/services/autoDream/autoDream.ts +324 -0
  1015. package/src/services/autoDream/config.ts +21 -0
  1016. package/src/services/autoDream/consolidationLock.ts +140 -0
  1017. package/src/services/autoDream/consolidationPrompt.ts +65 -0
  1018. package/src/services/awaySummary.ts +74 -0
  1019. package/src/services/claudeAiLimits.ts +515 -0
  1020. package/src/services/claudeAiLimitsHook.ts +23 -0
  1021. package/src/services/compact/apiMicrocompact.ts +153 -0
  1022. package/src/services/compact/autoCompact.ts +351 -0
  1023. package/src/services/compact/compact.ts +1705 -0
  1024. package/src/services/compact/compactWarningHook.ts +16 -0
  1025. package/src/services/compact/compactWarningState.ts +18 -0
  1026. package/src/services/compact/grouping.ts +63 -0
  1027. package/src/services/compact/microCompact.ts +530 -0
  1028. package/src/services/compact/postCompactCleanup.ts +77 -0
  1029. package/src/services/compact/prompt.ts +374 -0
  1030. package/src/services/compact/sessionMemoryCompact.ts +630 -0
  1031. package/src/services/compact/timeBasedMCConfig.ts +43 -0
  1032. package/src/services/diagnosticTracking.ts +397 -0
  1033. package/src/services/extractMemories/extractMemories.ts +615 -0
  1034. package/src/services/extractMemories/prompts.ts +154 -0
  1035. package/src/services/internalLogging.ts +90 -0
  1036. package/src/services/lsp/LSPClient.ts +447 -0
  1037. package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  1038. package/src/services/lsp/LSPServerInstance.ts +511 -0
  1039. package/src/services/lsp/LSPServerManager.ts +420 -0
  1040. package/src/services/lsp/config.ts +79 -0
  1041. package/src/services/lsp/manager.ts +289 -0
  1042. package/src/services/lsp/passiveFeedback.ts +328 -0
  1043. package/src/services/mcp/InProcessTransport.ts +63 -0
  1044. package/src/services/mcp/MCPConnectionManager.tsx +73 -0
  1045. package/src/services/mcp/SdkControlTransport.ts +136 -0
  1046. package/src/services/mcp/auth.ts +2465 -0
  1047. package/src/services/mcp/channelAllowlist.ts +76 -0
  1048. package/src/services/mcp/channelNotification.ts +316 -0
  1049. package/src/services/mcp/channelPermissions.ts +240 -0
  1050. package/src/services/mcp/claudeai.ts +164 -0
  1051. package/src/services/mcp/client.ts +3348 -0
  1052. package/src/services/mcp/config.ts +1578 -0
  1053. package/src/services/mcp/elicitationHandler.ts +313 -0
  1054. package/src/services/mcp/envExpansion.ts +38 -0
  1055. package/src/services/mcp/headersHelper.ts +138 -0
  1056. package/src/services/mcp/mcpStringUtils.ts +106 -0
  1057. package/src/services/mcp/normalization.ts +23 -0
  1058. package/src/services/mcp/oauthPort.ts +78 -0
  1059. package/src/services/mcp/officialRegistry.ts +72 -0
  1060. package/src/services/mcp/types.ts +258 -0
  1061. package/src/services/mcp/useManageMCPConnections.ts +1141 -0
  1062. package/src/services/mcp/utils.ts +575 -0
  1063. package/src/services/mcp/vscodeSdkMcp.ts +112 -0
  1064. package/src/services/mcp/xaa.ts +511 -0
  1065. package/src/services/mcp/xaaIdpLogin.ts +487 -0
  1066. package/src/services/mcpServerApproval.tsx +41 -0
  1067. package/src/services/mockRateLimits.ts +882 -0
  1068. package/src/services/notifier.ts +156 -0
  1069. package/src/services/oauth/auth-code-listener.ts +211 -0
  1070. package/src/services/oauth/client.ts +566 -0
  1071. package/src/services/oauth/crypto.ts +23 -0
  1072. package/src/services/oauth/getOauthProfile.ts +53 -0
  1073. package/src/services/oauth/index.ts +198 -0
  1074. package/src/services/plugins/PluginInstallationManager.ts +184 -0
  1075. package/src/services/plugins/pluginCliCommands.ts +344 -0
  1076. package/src/services/plugins/pluginOperations.ts +1088 -0
  1077. package/src/services/policyLimits/index.ts +664 -0
  1078. package/src/services/policyLimits/types.ts +27 -0
  1079. package/src/services/preventSleep.ts +165 -0
  1080. package/src/services/rateLimitMessages.ts +344 -0
  1081. package/src/services/rateLimitMocking.ts +144 -0
  1082. package/src/services/remoteManagedSettings/index.ts +639 -0
  1083. package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
  1084. package/src/services/remoteManagedSettings/syncCache.ts +112 -0
  1085. package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
  1086. package/src/services/remoteManagedSettings/types.ts +31 -0
  1087. package/src/services/settingsSync/index.ts +581 -0
  1088. package/src/services/settingsSync/types.ts +67 -0
  1089. package/src/services/teamMemorySync/index.ts +1256 -0
  1090. package/src/services/teamMemorySync/secretScanner.ts +324 -0
  1091. package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  1092. package/src/services/teamMemorySync/types.ts +156 -0
  1093. package/src/services/teamMemorySync/watcher.ts +387 -0
  1094. package/src/services/tips/tipHistory.ts +17 -0
  1095. package/src/services/tips/tipRegistry.ts +686 -0
  1096. package/src/services/tips/tipScheduler.ts +58 -0
  1097. package/src/services/tokenEstimation.ts +495 -0
  1098. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1099. package/src/services/tools/StreamingToolExecutor.ts +530 -0
  1100. package/src/services/tools/toolExecution.ts +1745 -0
  1101. package/src/services/tools/toolHooks.ts +650 -0
  1102. package/src/services/tools/toolOrchestration.ts +188 -0
  1103. package/src/services/vcr.ts +406 -0
  1104. package/src/services/voice.ts +525 -0
  1105. package/src/services/voiceKeyterms.ts +106 -0
  1106. package/src/services/voiceStreamSTT.ts +544 -0
  1107. package/src/setup.ts +477 -0
  1108. package/src/skills/bundled/batch.ts +124 -0
  1109. package/src/skills/bundled/claudeApi.ts +196 -0
  1110. package/src/skills/bundled/claudeApiContent.ts +75 -0
  1111. package/src/skills/bundled/claudeInChrome.ts +34 -0
  1112. package/src/skills/bundled/debug.ts +103 -0
  1113. package/src/skills/bundled/index.ts +79 -0
  1114. package/src/skills/bundled/keybindings.ts +339 -0
  1115. package/src/skills/bundled/loop.ts +92 -0
  1116. package/src/skills/bundled/loremIpsum.ts +282 -0
  1117. package/src/skills/bundled/remember.ts +82 -0
  1118. package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
  1119. package/src/skills/bundled/simplify.ts +69 -0
  1120. package/src/skills/bundled/skillify.ts +197 -0
  1121. package/src/skills/bundled/stuck.ts +79 -0
  1122. package/src/skills/bundled/updateConfig.ts +475 -0
  1123. package/src/skills/bundled/verify.ts +30 -0
  1124. package/src/skills/bundled/verifyContent.ts +13 -0
  1125. package/src/skills/bundledSkills.ts +220 -0
  1126. package/src/skills/loadSkillsDir.ts +1086 -0
  1127. package/src/skills/mcpSkillBuilders.ts +44 -0
  1128. package/src/state/AppState.tsx +200 -0
  1129. package/src/state/AppStateStore.ts +569 -0
  1130. package/src/state/onChangeAppState.ts +171 -0
  1131. package/src/state/selectors.ts +76 -0
  1132. package/src/state/store.ts +34 -0
  1133. package/src/state/teammateViewHelpers.ts +141 -0
  1134. package/src/tasks/DreamTask/DreamTask.ts +157 -0
  1135. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  1136. package/src/tasks/InProcessTeammateTask/types.ts +121 -0
  1137. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  1138. package/src/tasks/LocalMainSessionTask.ts +479 -0
  1139. package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  1140. package/src/tasks/LocalShellTask/guards.ts +41 -0
  1141. package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
  1142. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  1143. package/src/tasks/pillLabel.ts +82 -0
  1144. package/src/tasks/stopTask.ts +100 -0
  1145. package/src/tasks/types.ts +46 -0
  1146. package/src/tasks.ts +39 -0
  1147. package/src/tools/AgentTool/AgentTool.tsx +1398 -0
  1148. package/src/tools/AgentTool/UI.tsx +872 -0
  1149. package/src/tools/AgentTool/agentColorManager.ts +66 -0
  1150. package/src/tools/AgentTool/agentDisplay.ts +104 -0
  1151. package/src/tools/AgentTool/agentMemory.ts +177 -0
  1152. package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1153. package/src/tools/AgentTool/agentToolUtils.ts +686 -0
  1154. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1155. package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1156. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1157. package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
  1158. package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1159. package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1160. package/src/tools/AgentTool/builtInAgents.ts +72 -0
  1161. package/src/tools/AgentTool/constants.ts +12 -0
  1162. package/src/tools/AgentTool/forkSubagent.ts +210 -0
  1163. package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
  1164. package/src/tools/AgentTool/prompt.ts +287 -0
  1165. package/src/tools/AgentTool/resumeAgent.ts +265 -0
  1166. package/src/tools/AgentTool/runAgent.ts +973 -0
  1167. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1168. package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
  1169. package/src/tools/BashTool/BashTool.tsx +1144 -0
  1170. package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1171. package/src/tools/BashTool/UI.tsx +185 -0
  1172. package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
  1173. package/src/tools/BashTool/bashPermissions.ts +2621 -0
  1174. package/src/tools/BashTool/bashSecurity.ts +2592 -0
  1175. package/src/tools/BashTool/commandSemantics.ts +140 -0
  1176. package/src/tools/BashTool/commentLabel.ts +13 -0
  1177. package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1178. package/src/tools/BashTool/modeValidation.ts +115 -0
  1179. package/src/tools/BashTool/pathValidation.ts +1303 -0
  1180. package/src/tools/BashTool/prompt.ts +369 -0
  1181. package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
  1182. package/src/tools/BashTool/sedEditParser.ts +322 -0
  1183. package/src/tools/BashTool/sedValidation.ts +684 -0
  1184. package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
  1185. package/src/tools/BashTool/toolName.ts +2 -0
  1186. package/src/tools/BashTool/utils.ts +223 -0
  1187. package/src/tools/BriefTool/BriefTool.ts +204 -0
  1188. package/src/tools/BriefTool/UI.tsx +101 -0
  1189. package/src/tools/BriefTool/attachments.ts +110 -0
  1190. package/src/tools/BriefTool/prompt.ts +22 -0
  1191. package/src/tools/BriefTool/upload.ts +174 -0
  1192. package/src/tools/ConfigTool/ConfigTool.ts +467 -0
  1193. package/src/tools/ConfigTool/UI.tsx +38 -0
  1194. package/src/tools/ConfigTool/constants.ts +1 -0
  1195. package/src/tools/ConfigTool/prompt.ts +93 -0
  1196. package/src/tools/ConfigTool/supportedSettings.ts +211 -0
  1197. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1198. package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
  1199. package/src/tools/EnterPlanModeTool/constants.ts +1 -0
  1200. package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
  1201. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1202. package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
  1203. package/src/tools/EnterWorktreeTool/constants.ts +1 -0
  1204. package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
  1205. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1206. package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
  1207. package/src/tools/ExitPlanModeTool/constants.ts +2 -0
  1208. package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
  1209. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1210. package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
  1211. package/src/tools/ExitWorktreeTool/constants.ts +1 -0
  1212. package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
  1213. package/src/tools/FileEditTool/FileEditTool.ts +625 -0
  1214. package/src/tools/FileEditTool/UI.tsx +289 -0
  1215. package/src/tools/FileEditTool/constants.ts +11 -0
  1216. package/src/tools/FileEditTool/prompt.ts +28 -0
  1217. package/src/tools/FileEditTool/types.ts +85 -0
  1218. package/src/tools/FileEditTool/utils.ts +775 -0
  1219. package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
  1220. package/src/tools/FileReadTool/UI.tsx +185 -0
  1221. package/src/tools/FileReadTool/imageProcessor.ts +94 -0
  1222. package/src/tools/FileReadTool/limits.ts +92 -0
  1223. package/src/tools/FileReadTool/prompt.ts +49 -0
  1224. package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
  1225. package/src/tools/FileWriteTool/UI.tsx +405 -0
  1226. package/src/tools/FileWriteTool/prompt.ts +18 -0
  1227. package/src/tools/GlobTool/GlobTool.ts +198 -0
  1228. package/src/tools/GlobTool/UI.tsx +63 -0
  1229. package/src/tools/GlobTool/prompt.ts +7 -0
  1230. package/src/tools/GrepTool/GrepTool.ts +577 -0
  1231. package/src/tools/GrepTool/UI.tsx +201 -0
  1232. package/src/tools/GrepTool/prompt.ts +18 -0
  1233. package/src/tools/LSPTool/LSPTool.ts +860 -0
  1234. package/src/tools/LSPTool/UI.tsx +228 -0
  1235. package/src/tools/LSPTool/formatters.ts +592 -0
  1236. package/src/tools/LSPTool/prompt.ts +21 -0
  1237. package/src/tools/LSPTool/schemas.ts +215 -0
  1238. package/src/tools/LSPTool/symbolContext.ts +90 -0
  1239. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1240. package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1241. package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1242. package/src/tools/MCPTool/MCPTool.ts +77 -0
  1243. package/src/tools/MCPTool/UI.tsx +403 -0
  1244. package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
  1245. package/src/tools/MCPTool/prompt.ts +3 -0
  1246. package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1247. package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  1248. package/src/tools/NotebookEditTool/UI.tsx +93 -0
  1249. package/src/tools/NotebookEditTool/constants.ts +2 -0
  1250. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  1251. package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1252. package/src/tools/PowerShellTool/UI.tsx +131 -0
  1253. package/src/tools/PowerShellTool/clmTypes.ts +211 -0
  1254. package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
  1255. package/src/tools/PowerShellTool/commonParameters.ts +30 -0
  1256. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1257. package/src/tools/PowerShellTool/gitSafety.ts +176 -0
  1258. package/src/tools/PowerShellTool/modeValidation.ts +404 -0
  1259. package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
  1260. package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1261. package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1262. package/src/tools/PowerShellTool/prompt.ts +145 -0
  1263. package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1264. package/src/tools/PowerShellTool/toolName.ts +2 -0
  1265. package/src/tools/REPLTool/constants.ts +46 -0
  1266. package/src/tools/REPLTool/primitiveTools.ts +39 -0
  1267. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1268. package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1269. package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1270. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1271. package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
  1272. package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
  1273. package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1274. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1275. package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1276. package/src/tools/ScheduleCronTool/UI.tsx +60 -0
  1277. package/src/tools/ScheduleCronTool/prompt.ts +135 -0
  1278. package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1279. package/src/tools/SendMessageTool/UI.tsx +31 -0
  1280. package/src/tools/SendMessageTool/constants.ts +1 -0
  1281. package/src/tools/SendMessageTool/prompt.ts +49 -0
  1282. package/src/tools/SkillTool/SkillTool.ts +1108 -0
  1283. package/src/tools/SkillTool/UI.tsx +128 -0
  1284. package/src/tools/SkillTool/constants.ts +1 -0
  1285. package/src/tools/SkillTool/prompt.ts +241 -0
  1286. package/src/tools/SleepTool/prompt.ts +17 -0
  1287. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1288. package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1289. package/src/tools/TaskCreateTool/constants.ts +1 -0
  1290. package/src/tools/TaskCreateTool/prompt.ts +56 -0
  1291. package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1292. package/src/tools/TaskGetTool/constants.ts +1 -0
  1293. package/src/tools/TaskGetTool/prompt.ts +24 -0
  1294. package/src/tools/TaskListTool/TaskListTool.ts +116 -0
  1295. package/src/tools/TaskListTool/constants.ts +1 -0
  1296. package/src/tools/TaskListTool/prompt.ts +49 -0
  1297. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1298. package/src/tools/TaskOutputTool/constants.ts +1 -0
  1299. package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1300. package/src/tools/TaskStopTool/UI.tsx +41 -0
  1301. package/src/tools/TaskStopTool/prompt.ts +8 -0
  1302. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1303. package/src/tools/TaskUpdateTool/constants.ts +1 -0
  1304. package/src/tools/TaskUpdateTool/prompt.ts +77 -0
  1305. package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1306. package/src/tools/TeamCreateTool/UI.tsx +6 -0
  1307. package/src/tools/TeamCreateTool/constants.ts +1 -0
  1308. package/src/tools/TeamCreateTool/prompt.ts +113 -0
  1309. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1310. package/src/tools/TeamDeleteTool/UI.tsx +20 -0
  1311. package/src/tools/TeamDeleteTool/constants.ts +1 -0
  1312. package/src/tools/TeamDeleteTool/prompt.ts +16 -0
  1313. package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1314. package/src/tools/TodoWriteTool/constants.ts +1 -0
  1315. package/src/tools/TodoWriteTool/prompt.ts +184 -0
  1316. package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1317. package/src/tools/ToolSearchTool/constants.ts +1 -0
  1318. package/src/tools/ToolSearchTool/prompt.ts +121 -0
  1319. package/src/tools/TungstenTool/TungstenTool.js +2 -0
  1320. package/src/tools/TungstenTool/TungstenTool.ts +1 -0
  1321. package/src/tools/WebFetchTool/UI.tsx +72 -0
  1322. package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1323. package/src/tools/WebFetchTool/preapproved.ts +166 -0
  1324. package/src/tools/WebFetchTool/prompt.ts +46 -0
  1325. package/src/tools/WebFetchTool/utils.ts +530 -0
  1326. package/src/tools/WebSearchTool/UI.tsx +101 -0
  1327. package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
  1328. package/src/tools/WebSearchTool/prompt.ts +34 -0
  1329. package/src/tools/shared/gitOperationTracking.ts +277 -0
  1330. package/src/tools/shared/spawnMultiAgent.ts +1093 -0
  1331. package/src/tools/testing/TestingPermissionTool.tsx +74 -0
  1332. package/src/tools/utils.ts +40 -0
  1333. package/src/tools.ts +389 -0
  1334. package/src/types/command.ts +216 -0
  1335. package/src/types/connectorText.js +5 -0
  1336. package/src/types/connectorText.ts +1 -0
  1337. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1338. package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
  1339. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1340. package/src/types/generated/google/protobuf/timestamp.ts +187 -0
  1341. package/src/types/hooks.ts +290 -0
  1342. package/src/types/ids.ts +44 -0
  1343. package/src/types/logs.ts +330 -0
  1344. package/src/types/permissions.ts +441 -0
  1345. package/src/types/plugin.ts +363 -0
  1346. package/src/types/textInputTypes.ts +387 -0
  1347. package/src/upstreamproxy/relay.ts +455 -0
  1348. package/src/upstreamproxy/upstreamproxy.ts +285 -0
  1349. package/src/utils/CircularBuffer.ts +84 -0
  1350. package/src/utils/Cursor.ts +1530 -0
  1351. package/src/utils/QueryGuard.ts +121 -0
  1352. package/src/utils/Shell.ts +474 -0
  1353. package/src/utils/ShellCommand.ts +465 -0
  1354. package/src/utils/abortController.ts +99 -0
  1355. package/src/utils/activityManager.ts +164 -0
  1356. package/src/utils/advisor.ts +145 -0
  1357. package/src/utils/agentContext.ts +178 -0
  1358. package/src/utils/agentId.ts +99 -0
  1359. package/src/utils/agentSwarmsEnabled.ts +44 -0
  1360. package/src/utils/agenticSessionSearch.ts +307 -0
  1361. package/src/utils/analyzeContext.ts +1382 -0
  1362. package/src/utils/ansiToPng.ts +334 -0
  1363. package/src/utils/ansiToSvg.ts +272 -0
  1364. package/src/utils/api.ts +718 -0
  1365. package/src/utils/apiPreconnect.ts +72 -0
  1366. package/src/utils/appleTerminalBackup.ts +124 -0
  1367. package/src/utils/argumentSubstitution.ts +145 -0
  1368. package/src/utils/array.ts +13 -0
  1369. package/src/utils/asciicast.ts +239 -0
  1370. package/src/utils/attachments.ts +3997 -0
  1371. package/src/utils/attribution.ts +393 -0
  1372. package/src/utils/auth.ts +2007 -0
  1373. package/src/utils/authFileDescriptor.ts +196 -0
  1374. package/src/utils/authPortable.ts +19 -0
  1375. package/src/utils/autoModeDenials.ts +26 -0
  1376. package/src/utils/autoRunIssue.tsx +122 -0
  1377. package/src/utils/autoUpdater.ts +562 -0
  1378. package/src/utils/aws.ts +74 -0
  1379. package/src/utils/awsAuthStatusManager.ts +81 -0
  1380. package/src/utils/background/remote/preconditions.ts +235 -0
  1381. package/src/utils/background/remote/remoteSession.ts +98 -0
  1382. package/src/utils/backgroundHousekeeping.ts +94 -0
  1383. package/src/utils/bash/ParsedCommand.ts +318 -0
  1384. package/src/utils/bash/ShellSnapshot.ts +582 -0
  1385. package/src/utils/bash/ast.ts +2679 -0
  1386. package/src/utils/bash/bashParser.ts +4436 -0
  1387. package/src/utils/bash/bashPipeCommand.ts +294 -0
  1388. package/src/utils/bash/commands.ts +1339 -0
  1389. package/src/utils/bash/heredoc.ts +733 -0
  1390. package/src/utils/bash/parser.ts +230 -0
  1391. package/src/utils/bash/prefix.ts +204 -0
  1392. package/src/utils/bash/registry.ts +53 -0
  1393. package/src/utils/bash/shellCompletion.ts +259 -0
  1394. package/src/utils/bash/shellPrefix.ts +28 -0
  1395. package/src/utils/bash/shellQuote.ts +304 -0
  1396. package/src/utils/bash/shellQuoting.ts +128 -0
  1397. package/src/utils/bash/specs/alias.ts +14 -0
  1398. package/src/utils/bash/specs/index.ts +18 -0
  1399. package/src/utils/bash/specs/nohup.ts +13 -0
  1400. package/src/utils/bash/specs/pyright.ts +91 -0
  1401. package/src/utils/bash/specs/sleep.ts +13 -0
  1402. package/src/utils/bash/specs/srun.ts +31 -0
  1403. package/src/utils/bash/specs/time.ts +13 -0
  1404. package/src/utils/bash/specs/timeout.ts +20 -0
  1405. package/src/utils/bash/treeSitterAnalysis.ts +506 -0
  1406. package/src/utils/betas.ts +438 -0
  1407. package/src/utils/billing.ts +78 -0
  1408. package/src/utils/binaryCheck.ts +53 -0
  1409. package/src/utils/browser.ts +68 -0
  1410. package/src/utils/bufferedWriter.ts +100 -0
  1411. package/src/utils/bundledMode.ts +22 -0
  1412. package/src/utils/caCerts.ts +115 -0
  1413. package/src/utils/caCertsConfig.ts +88 -0
  1414. package/src/utils/cachePaths.ts +38 -0
  1415. package/src/utils/classifierApprovals.ts +88 -0
  1416. package/src/utils/classifierApprovalsHook.ts +17 -0
  1417. package/src/utils/claudeCodeHints.ts +193 -0
  1418. package/src/utils/claudeDesktop.ts +152 -0
  1419. package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1420. package/src/utils/claudeInChrome/common.ts +540 -0
  1421. package/src/utils/claudeInChrome/mcpServer.ts +293 -0
  1422. package/src/utils/claudeInChrome/prompt.ts +83 -0
  1423. package/src/utils/claudeInChrome/setup.ts +400 -0
  1424. package/src/utils/claudeInChrome/setupPortable.ts +233 -0
  1425. package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
  1426. package/src/utils/claudemd.ts +1479 -0
  1427. package/src/utils/cleanup.ts +602 -0
  1428. package/src/utils/cleanupRegistry.ts +25 -0
  1429. package/src/utils/cliArgs.ts +60 -0
  1430. package/src/utils/cliHighlight.ts +54 -0
  1431. package/src/utils/codeIndexing.ts +206 -0
  1432. package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
  1433. package/src/utils/collapseHookSummaries.ts +59 -0
  1434. package/src/utils/collapseReadSearch.ts +1109 -0
  1435. package/src/utils/collapseTeammateShutdowns.ts +55 -0
  1436. package/src/utils/combinedAbortSignal.ts +47 -0
  1437. package/src/utils/commandLifecycle.ts +21 -0
  1438. package/src/utils/commitAttribution.ts +961 -0
  1439. package/src/utils/completionCache.ts +166 -0
  1440. package/src/utils/computerUse/appNames.ts +196 -0
  1441. package/src/utils/computerUse/cleanup.ts +86 -0
  1442. package/src/utils/computerUse/common.ts +61 -0
  1443. package/src/utils/computerUse/computerUseLock.ts +215 -0
  1444. package/src/utils/computerUse/drainRunLoop.ts +79 -0
  1445. package/src/utils/computerUse/escHotkey.ts +54 -0
  1446. package/src/utils/computerUse/executor.ts +658 -0
  1447. package/src/utils/computerUse/gates.ts +72 -0
  1448. package/src/utils/computerUse/hostAdapter.ts +69 -0
  1449. package/src/utils/computerUse/inputLoader.ts +30 -0
  1450. package/src/utils/computerUse/mcpServer.ts +106 -0
  1451. package/src/utils/computerUse/setup.ts +53 -0
  1452. package/src/utils/computerUse/swiftLoader.ts +23 -0
  1453. package/src/utils/computerUse/toolRendering.tsx +125 -0
  1454. package/src/utils/computerUse/wrapper.tsx +336 -0
  1455. package/src/utils/concurrentSessions.ts +204 -0
  1456. package/src/utils/config.ts +1817 -0
  1457. package/src/utils/configConstants.ts +21 -0
  1458. package/src/utils/contentArray.ts +51 -0
  1459. package/src/utils/context.ts +221 -0
  1460. package/src/utils/contextAnalysis.ts +272 -0
  1461. package/src/utils/contextSuggestions.ts +235 -0
  1462. package/src/utils/controlMessageCompat.ts +32 -0
  1463. package/src/utils/conversationRecovery.ts +597 -0
  1464. package/src/utils/cron.ts +308 -0
  1465. package/src/utils/cronJitterConfig.ts +75 -0
  1466. package/src/utils/cronScheduler.ts +565 -0
  1467. package/src/utils/cronTasks.ts +458 -0
  1468. package/src/utils/cronTasksLock.ts +195 -0
  1469. package/src/utils/crossProjectResume.ts +75 -0
  1470. package/src/utils/crypto.ts +13 -0
  1471. package/src/utils/cwd.ts +32 -0
  1472. package/src/utils/debug.ts +268 -0
  1473. package/src/utils/debugFilter.ts +157 -0
  1474. package/src/utils/deepLink/banner.ts +123 -0
  1475. package/src/utils/deepLink/parseDeepLink.ts +170 -0
  1476. package/src/utils/deepLink/protocolHandler.ts +136 -0
  1477. package/src/utils/deepLink/registerProtocol.ts +348 -0
  1478. package/src/utils/deepLink/terminalLauncher.ts +557 -0
  1479. package/src/utils/deepLink/terminalPreference.ts +54 -0
  1480. package/src/utils/desktopDeepLink.ts +236 -0
  1481. package/src/utils/detectRepository.ts +178 -0
  1482. package/src/utils/diagLogs.ts +94 -0
  1483. package/src/utils/diff.ts +177 -0
  1484. package/src/utils/directMemberMessage.ts +69 -0
  1485. package/src/utils/displayTags.ts +51 -0
  1486. package/src/utils/doctorContextWarnings.ts +265 -0
  1487. package/src/utils/doctorDiagnostic.ts +625 -0
  1488. package/src/utils/dxt/helpers.ts +88 -0
  1489. package/src/utils/dxt/zip.ts +226 -0
  1490. package/src/utils/earlyInput.ts +191 -0
  1491. package/src/utils/editor.ts +183 -0
  1492. package/src/utils/effort.ts +329 -0
  1493. package/src/utils/embeddedTools.ts +29 -0
  1494. package/src/utils/env.ts +347 -0
  1495. package/src/utils/envDynamic.ts +151 -0
  1496. package/src/utils/envUtils.ts +183 -0
  1497. package/src/utils/envValidation.ts +38 -0
  1498. package/src/utils/errorLogSink.ts +235 -0
  1499. package/src/utils/errors.ts +238 -0
  1500. package/src/utils/exampleCommands.ts +184 -0
  1501. package/src/utils/execFileNoThrow.ts +150 -0
  1502. package/src/utils/execFileNoThrowPortable.ts +89 -0
  1503. package/src/utils/execSyncWrapper.ts +38 -0
  1504. package/src/utils/exportRenderer.tsx +98 -0
  1505. package/src/utils/extraUsage.ts +23 -0
  1506. package/src/utils/fastMode.ts +532 -0
  1507. package/src/utils/file.ts +584 -0
  1508. package/src/utils/fileHistory.ts +1115 -0
  1509. package/src/utils/fileOperationAnalytics.ts +71 -0
  1510. package/src/utils/filePersistence/filePersistence.ts +287 -0
  1511. package/src/utils/filePersistence/outputsScanner.ts +126 -0
  1512. package/src/utils/fileRead.ts +102 -0
  1513. package/src/utils/fileReadCache.ts +96 -0
  1514. package/src/utils/fileStateCache.ts +142 -0
  1515. package/src/utils/findExecutable.ts +17 -0
  1516. package/src/utils/fingerprint.ts +76 -0
  1517. package/src/utils/forkedAgent.ts +689 -0
  1518. package/src/utils/format.ts +308 -0
  1519. package/src/utils/formatBriefTimestamp.ts +81 -0
  1520. package/src/utils/fpsTracker.ts +47 -0
  1521. package/src/utils/frontmatterParser.ts +370 -0
  1522. package/src/utils/fsOperations.ts +770 -0
  1523. package/src/utils/fullscreen.ts +202 -0
  1524. package/src/utils/generatedFiles.ts +136 -0
  1525. package/src/utils/generators.ts +88 -0
  1526. package/src/utils/genericProcessUtils.ts +184 -0
  1527. package/src/utils/getWorktreePaths.ts +70 -0
  1528. package/src/utils/getWorktreePathsPortable.ts +27 -0
  1529. package/src/utils/ghPrStatus.ts +106 -0
  1530. package/src/utils/git/gitConfigParser.ts +277 -0
  1531. package/src/utils/git/gitFilesystem.ts +699 -0
  1532. package/src/utils/git/gitignore.ts +99 -0
  1533. package/src/utils/git.ts +926 -0
  1534. package/src/utils/gitDiff.ts +532 -0
  1535. package/src/utils/gitSettings.ts +18 -0
  1536. package/src/utils/github/ghAuthStatus.ts +29 -0
  1537. package/src/utils/githubRepoPathMapping.ts +162 -0
  1538. package/src/utils/glob.ts +130 -0
  1539. package/src/utils/gracefulShutdown.ts +529 -0
  1540. package/src/utils/groupToolUses.ts +182 -0
  1541. package/src/utils/handlePromptSubmit.ts +610 -0
  1542. package/src/utils/hash.ts +46 -0
  1543. package/src/utils/headlessProfiler.ts +178 -0
  1544. package/src/utils/heapDumpService.ts +303 -0
  1545. package/src/utils/heatmap.ts +198 -0
  1546. package/src/utils/highlightMatch.tsx +28 -0
  1547. package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
  1548. package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
  1549. package/src/utils/hooks/execAgentHook.ts +339 -0
  1550. package/src/utils/hooks/execHttpHook.ts +242 -0
  1551. package/src/utils/hooks/execPromptHook.ts +211 -0
  1552. package/src/utils/hooks/fileChangedWatcher.ts +191 -0
  1553. package/src/utils/hooks/hookEvents.ts +192 -0
  1554. package/src/utils/hooks/hookHelpers.ts +83 -0
  1555. package/src/utils/hooks/hooksConfigManager.ts +400 -0
  1556. package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1557. package/src/utils/hooks/hooksSettings.ts +271 -0
  1558. package/src/utils/hooks/postSamplingHooks.ts +70 -0
  1559. package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1560. package/src/utils/hooks/registerSkillHooks.ts +64 -0
  1561. package/src/utils/hooks/sessionHooks.ts +447 -0
  1562. package/src/utils/hooks/skillImprovement.ts +267 -0
  1563. package/src/utils/hooks/ssrfGuard.ts +294 -0
  1564. package/src/utils/hooks.ts +5022 -0
  1565. package/src/utils/horizontalScroll.ts +137 -0
  1566. package/src/utils/http.ts +136 -0
  1567. package/src/utils/hyperlink.ts +39 -0
  1568. package/src/utils/iTermBackup.ts +73 -0
  1569. package/src/utils/ide.ts +1494 -0
  1570. package/src/utils/idePathConversion.ts +90 -0
  1571. package/src/utils/idleTimeout.ts +53 -0
  1572. package/src/utils/imagePaste.ts +416 -0
  1573. package/src/utils/imageResizer.ts +880 -0
  1574. package/src/utils/imageStore.ts +167 -0
  1575. package/src/utils/imageValidation.ts +104 -0
  1576. package/src/utils/immediateCommand.ts +15 -0
  1577. package/src/utils/inProcessTeammateHelpers.ts +102 -0
  1578. package/src/utils/ink.ts +26 -0
  1579. package/src/utils/intl.ts +94 -0
  1580. package/src/utils/jetbrains.ts +191 -0
  1581. package/src/utils/json.ts +277 -0
  1582. package/src/utils/jsonRead.ts +16 -0
  1583. package/src/utils/keyboardShortcuts.ts +14 -0
  1584. package/src/utils/lazySchema.ts +8 -0
  1585. package/src/utils/listSessionsImpl.ts +454 -0
  1586. package/src/utils/localInstaller.ts +162 -0
  1587. package/src/utils/lockfile.ts +43 -0
  1588. package/src/utils/log.ts +362 -0
  1589. package/src/utils/logoV2Utils.ts +350 -0
  1590. package/src/utils/mailbox.ts +73 -0
  1591. package/src/utils/managedEnv.ts +199 -0
  1592. package/src/utils/managedEnvConstants.ts +191 -0
  1593. package/src/utils/markdown.ts +381 -0
  1594. package/src/utils/markdownConfigLoader.ts +600 -0
  1595. package/src/utils/mcp/dateTimeParser.ts +121 -0
  1596. package/src/utils/mcp/elicitationValidation.ts +336 -0
  1597. package/src/utils/mcpInstructionsDelta.ts +130 -0
  1598. package/src/utils/mcpOutputStorage.ts +189 -0
  1599. package/src/utils/mcpValidation.ts +208 -0
  1600. package/src/utils/mcpWebSocketTransport.ts +200 -0
  1601. package/src/utils/memoize.ts +269 -0
  1602. package/src/utils/memory/types.ts +12 -0
  1603. package/src/utils/memory/versions.ts +8 -0
  1604. package/src/utils/memoryFileDetection.ts +289 -0
  1605. package/src/utils/messagePredicates.ts +8 -0
  1606. package/src/utils/messageQueueManager.ts +547 -0
  1607. package/src/utils/messages/mappers.ts +290 -0
  1608. package/src/utils/messages/systemInit.ts +96 -0
  1609. package/src/utils/messages.ts +5512 -0
  1610. package/src/utils/model/agent.ts +157 -0
  1611. package/src/utils/model/aliases.ts +25 -0
  1612. package/src/utils/model/antModels.ts +64 -0
  1613. package/src/utils/model/bedrock.ts +265 -0
  1614. package/src/utils/model/check1mAccess.ts +72 -0
  1615. package/src/utils/model/configs.ts +118 -0
  1616. package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1617. package/src/utils/model/deprecation.ts +101 -0
  1618. package/src/utils/model/model.ts +634 -0
  1619. package/src/utils/model/modelAllowlist.ts +170 -0
  1620. package/src/utils/model/modelCapabilities.ts +118 -0
  1621. package/src/utils/model/modelOptions.ts +540 -0
  1622. package/src/utils/model/modelStrings.ts +166 -0
  1623. package/src/utils/model/modelSupportOverrides.ts +50 -0
  1624. package/src/utils/model/providers.ts +46 -0
  1625. package/src/utils/model/validateModel.ts +159 -0
  1626. package/src/utils/modelCost.ts +235 -0
  1627. package/src/utils/modifiers.ts +36 -0
  1628. package/src/utils/mtls.ts +179 -0
  1629. package/src/utils/nativeInstaller/download.ts +523 -0
  1630. package/src/utils/nativeInstaller/index.ts +18 -0
  1631. package/src/utils/nativeInstaller/installer.ts +1708 -0
  1632. package/src/utils/nativeInstaller/packageManagers.ts +336 -0
  1633. package/src/utils/nativeInstaller/pidLock.ts +433 -0
  1634. package/src/utils/notebook.ts +224 -0
  1635. package/src/utils/objectGroupBy.ts +18 -0
  1636. package/src/utils/pasteStore.ts +104 -0
  1637. package/src/utils/path.ts +155 -0
  1638. package/src/utils/pdf.ts +300 -0
  1639. package/src/utils/pdfUtils.ts +70 -0
  1640. package/src/utils/peerAddress.ts +21 -0
  1641. package/src/utils/permissions/PermissionMode.ts +141 -0
  1642. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1643. package/src/utils/permissions/PermissionResult.ts +35 -0
  1644. package/src/utils/permissions/PermissionRule.ts +40 -0
  1645. package/src/utils/permissions/PermissionUpdate.ts +389 -0
  1646. package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1647. package/src/utils/permissions/autoModeState.ts +39 -0
  1648. package/src/utils/permissions/bashClassifier.ts +61 -0
  1649. package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1650. package/src/utils/permissions/classifierDecision.ts +98 -0
  1651. package/src/utils/permissions/classifierShared.ts +39 -0
  1652. package/src/utils/permissions/dangerousPatterns.ts +80 -0
  1653. package/src/utils/permissions/denialTracking.ts +45 -0
  1654. package/src/utils/permissions/filesystem.ts +1777 -0
  1655. package/src/utils/permissions/getNextPermissionMode.ts +101 -0
  1656. package/src/utils/permissions/pathValidation.ts +485 -0
  1657. package/src/utils/permissions/permissionExplainer.ts +250 -0
  1658. package/src/utils/permissions/permissionRuleParser.ts +198 -0
  1659. package/src/utils/permissions/permissionSetup.ts +1532 -0
  1660. package/src/utils/permissions/permissions.ts +1486 -0
  1661. package/src/utils/permissions/permissionsLoader.ts +296 -0
  1662. package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
  1663. package/src/utils/permissions/shellRuleMatching.ts +228 -0
  1664. package/src/utils/permissions/yoloClassifier.ts +1495 -0
  1665. package/src/utils/planModeV2.ts +95 -0
  1666. package/src/utils/plans.ts +397 -0
  1667. package/src/utils/platform.ts +150 -0
  1668. package/src/utils/plugins/addDirPluginSettings.ts +71 -0
  1669. package/src/utils/plugins/cacheUtils.ts +196 -0
  1670. package/src/utils/plugins/dependencyResolver.ts +305 -0
  1671. package/src/utils/plugins/fetchTelemetry.ts +135 -0
  1672. package/src/utils/plugins/gitAvailability.ts +69 -0
  1673. package/src/utils/plugins/headlessPluginInstall.ts +174 -0
  1674. package/src/utils/plugins/hintRecommendation.ts +164 -0
  1675. package/src/utils/plugins/installCounts.ts +292 -0
  1676. package/src/utils/plugins/installedPluginsManager.ts +1268 -0
  1677. package/src/utils/plugins/loadPluginAgents.ts +348 -0
  1678. package/src/utils/plugins/loadPluginCommands.ts +946 -0
  1679. package/src/utils/plugins/loadPluginHooks.ts +287 -0
  1680. package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1681. package/src/utils/plugins/lspPluginIntegration.ts +387 -0
  1682. package/src/utils/plugins/lspRecommendation.ts +374 -0
  1683. package/src/utils/plugins/managedPlugins.ts +27 -0
  1684. package/src/utils/plugins/marketplaceHelpers.ts +592 -0
  1685. package/src/utils/plugins/marketplaceManager.ts +2643 -0
  1686. package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
  1687. package/src/utils/plugins/mcpbHandler.ts +968 -0
  1688. package/src/utils/plugins/officialMarketplace.ts +25 -0
  1689. package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1690. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1691. package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
  1692. package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
  1693. package/src/utils/plugins/performStartupChecks.tsx +70 -0
  1694. package/src/utils/plugins/pluginAutoupdate.ts +284 -0
  1695. package/src/utils/plugins/pluginBlocklist.ts +127 -0
  1696. package/src/utils/plugins/pluginDirectories.ts +178 -0
  1697. package/src/utils/plugins/pluginFlagging.ts +208 -0
  1698. package/src/utils/plugins/pluginIdentifier.ts +123 -0
  1699. package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1700. package/src/utils/plugins/pluginLoader.ts +3302 -0
  1701. package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
  1702. package/src/utils/plugins/pluginPolicy.ts +20 -0
  1703. package/src/utils/plugins/pluginStartupCheck.ts +341 -0
  1704. package/src/utils/plugins/pluginVersioning.ts +157 -0
  1705. package/src/utils/plugins/reconciler.ts +265 -0
  1706. package/src/utils/plugins/refresh.ts +215 -0
  1707. package/src/utils/plugins/schemas.ts +1681 -0
  1708. package/src/utils/plugins/validatePlugin.ts +903 -0
  1709. package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
  1710. package/src/utils/plugins/zipCache.ts +406 -0
  1711. package/src/utils/plugins/zipCacheAdapters.ts +164 -0
  1712. package/src/utils/powershell/dangerousCmdlets.ts +185 -0
  1713. package/src/utils/powershell/parser.ts +1804 -0
  1714. package/src/utils/powershell/staticPrefix.ts +316 -0
  1715. package/src/utils/preflightChecks.tsx +151 -0
  1716. package/src/utils/privacyLevel.ts +55 -0
  1717. package/src/utils/process.ts +68 -0
  1718. package/src/utils/processUserInput/processBashCommand.tsx +140 -0
  1719. package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
  1720. package/src/utils/processUserInput/processTextPrompt.ts +100 -0
  1721. package/src/utils/processUserInput/processUserInput.ts +605 -0
  1722. package/src/utils/profilerBase.ts +46 -0
  1723. package/src/utils/promptCategory.ts +49 -0
  1724. package/src/utils/promptEditor.ts +188 -0
  1725. package/src/utils/promptShellExecution.ts +183 -0
  1726. package/src/utils/proxy.ts +426 -0
  1727. package/src/utils/queryContext.ts +179 -0
  1728. package/src/utils/queryHelpers.ts +552 -0
  1729. package/src/utils/queryProfiler.ts +301 -0
  1730. package/src/utils/queueProcessor.ts +95 -0
  1731. package/src/utils/readEditContext.ts +227 -0
  1732. package/src/utils/readFileInRange.ts +383 -0
  1733. package/src/utils/releaseNotes.ts +360 -0
  1734. package/src/utils/renderOptions.ts +77 -0
  1735. package/src/utils/ripgrep.ts +679 -0
  1736. package/src/utils/sandbox/sandbox-adapter.ts +985 -0
  1737. package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1738. package/src/utils/sanitization.ts +91 -0
  1739. package/src/utils/screenshotClipboard.ts +121 -0
  1740. package/src/utils/sdkEventQueue.ts +134 -0
  1741. package/src/utils/secureStorage/fallbackStorage.ts +70 -0
  1742. package/src/utils/secureStorage/index.ts +17 -0
  1743. package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
  1744. package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1745. package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1746. package/src/utils/secureStorage/plainTextStorage.ts +84 -0
  1747. package/src/utils/semanticBoolean.ts +29 -0
  1748. package/src/utils/semanticNumber.ts +36 -0
  1749. package/src/utils/semver.ts +59 -0
  1750. package/src/utils/sequential.ts +56 -0
  1751. package/src/utils/sessionActivity.ts +133 -0
  1752. package/src/utils/sessionEnvVars.ts +22 -0
  1753. package/src/utils/sessionEnvironment.ts +166 -0
  1754. package/src/utils/sessionFileAccessHooks.ts +250 -0
  1755. package/src/utils/sessionIngressAuth.ts +140 -0
  1756. package/src/utils/sessionRestore.ts +551 -0
  1757. package/src/utils/sessionStart.ts +232 -0
  1758. package/src/utils/sessionState.ts +150 -0
  1759. package/src/utils/sessionStorage.ts +5105 -0
  1760. package/src/utils/sessionStoragePortable.ts +793 -0
  1761. package/src/utils/sessionTitle.ts +129 -0
  1762. package/src/utils/sessionUrl.ts +64 -0
  1763. package/src/utils/set.ts +53 -0
  1764. package/src/utils/settings/allErrors.ts +32 -0
  1765. package/src/utils/settings/applySettingsChange.ts +92 -0
  1766. package/src/utils/settings/changeDetector.ts +488 -0
  1767. package/src/utils/settings/constants.ts +202 -0
  1768. package/src/utils/settings/internalWrites.ts +37 -0
  1769. package/src/utils/settings/managedPath.ts +34 -0
  1770. package/src/utils/settings/mdm/constants.ts +81 -0
  1771. package/src/utils/settings/mdm/rawRead.ts +130 -0
  1772. package/src/utils/settings/mdm/settings.ts +316 -0
  1773. package/src/utils/settings/permissionValidation.ts +262 -0
  1774. package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
  1775. package/src/utils/settings/schemaOutput.ts +8 -0
  1776. package/src/utils/settings/settings.ts +1015 -0
  1777. package/src/utils/settings/settingsCache.ts +80 -0
  1778. package/src/utils/settings/toolValidationConfig.ts +103 -0
  1779. package/src/utils/settings/types.ts +1148 -0
  1780. package/src/utils/settings/validateEditTool.ts +45 -0
  1781. package/src/utils/settings/validation.ts +265 -0
  1782. package/src/utils/settings/validationTips.ts +164 -0
  1783. package/src/utils/shell/bashProvider.ts +255 -0
  1784. package/src/utils/shell/outputLimits.ts +14 -0
  1785. package/src/utils/shell/powershellDetection.ts +107 -0
  1786. package/src/utils/shell/powershellProvider.ts +123 -0
  1787. package/src/utils/shell/prefix.ts +367 -0
  1788. package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1789. package/src/utils/shell/resolveDefaultShell.ts +14 -0
  1790. package/src/utils/shell/shellProvider.ts +33 -0
  1791. package/src/utils/shell/shellToolUtils.ts +22 -0
  1792. package/src/utils/shell/specPrefix.ts +241 -0
  1793. package/src/utils/shellConfig.ts +167 -0
  1794. package/src/utils/sideQuery.ts +222 -0
  1795. package/src/utils/sideQuestion.ts +155 -0
  1796. package/src/utils/signal.ts +43 -0
  1797. package/src/utils/sinks.ts +16 -0
  1798. package/src/utils/skills/skillChangeDetector.ts +311 -0
  1799. package/src/utils/slashCommandParsing.ts +60 -0
  1800. package/src/utils/sleep.ts +84 -0
  1801. package/src/utils/sliceAnsi.ts +91 -0
  1802. package/src/utils/slowOperations.ts +286 -0
  1803. package/src/utils/standaloneAgent.ts +23 -0
  1804. package/src/utils/startupProfiler.ts +194 -0
  1805. package/src/utils/staticRender.tsx +116 -0
  1806. package/src/utils/stats.ts +1061 -0
  1807. package/src/utils/statsCache.ts +434 -0
  1808. package/src/utils/status.tsx +362 -0
  1809. package/src/utils/statusNoticeDefinitions.tsx +198 -0
  1810. package/src/utils/statusNoticeHelpers.ts +20 -0
  1811. package/src/utils/stream.ts +76 -0
  1812. package/src/utils/streamJsonStdoutGuard.ts +123 -0
  1813. package/src/utils/streamlinedTransform.ts +201 -0
  1814. package/src/utils/stringUtils.ts +235 -0
  1815. package/src/utils/subprocessEnv.ts +99 -0
  1816. package/src/utils/suggestions/commandSuggestions.ts +567 -0
  1817. package/src/utils/suggestions/directoryCompletion.ts +263 -0
  1818. package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1819. package/src/utils/suggestions/skillUsageTracking.ts +55 -0
  1820. package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1821. package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
  1822. package/src/utils/swarm/backends/ITermBackend.ts +370 -0
  1823. package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
  1824. package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1825. package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
  1826. package/src/utils/swarm/backends/detection.ts +128 -0
  1827. package/src/utils/swarm/backends/it2Setup.ts +245 -0
  1828. package/src/utils/swarm/backends/registry.ts +464 -0
  1829. package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1830. package/src/utils/swarm/backends/types.ts +311 -0
  1831. package/src/utils/swarm/constants.ts +33 -0
  1832. package/src/utils/swarm/inProcessRunner.ts +1552 -0
  1833. package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
  1834. package/src/utils/swarm/permissionSync.ts +928 -0
  1835. package/src/utils/swarm/reconnection.ts +119 -0
  1836. package/src/utils/swarm/spawnInProcess.ts +328 -0
  1837. package/src/utils/swarm/spawnUtils.ts +146 -0
  1838. package/src/utils/swarm/teamHelpers.ts +683 -0
  1839. package/src/utils/swarm/teammateInit.ts +129 -0
  1840. package/src/utils/swarm/teammateLayoutManager.ts +107 -0
  1841. package/src/utils/swarm/teammateModel.ts +10 -0
  1842. package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
  1843. package/src/utils/systemDirectories.ts +74 -0
  1844. package/src/utils/systemPrompt.ts +123 -0
  1845. package/src/utils/systemPromptType.ts +14 -0
  1846. package/src/utils/systemTheme.ts +119 -0
  1847. package/src/utils/taggedId.ts +54 -0
  1848. package/src/utils/task/TaskOutput.ts +390 -0
  1849. package/src/utils/task/diskOutput.ts +451 -0
  1850. package/src/utils/task/framework.ts +308 -0
  1851. package/src/utils/task/outputFormatting.ts +38 -0
  1852. package/src/utils/task/sdkProgress.ts +36 -0
  1853. package/src/utils/tasks.ts +862 -0
  1854. package/src/utils/teamDiscovery.ts +81 -0
  1855. package/src/utils/teamMemoryOps.ts +88 -0
  1856. package/src/utils/teammate.ts +292 -0
  1857. package/src/utils/teammateContext.ts +96 -0
  1858. package/src/utils/teammateMailbox.ts +1183 -0
  1859. package/src/utils/telemetry/betaSessionTracing.ts +491 -0
  1860. package/src/utils/telemetry/bigqueryExporter.ts +252 -0
  1861. package/src/utils/telemetry/events.ts +75 -0
  1862. package/src/utils/telemetry/instrumentation.ts +825 -0
  1863. package/src/utils/telemetry/logger.ts +26 -0
  1864. package/src/utils/telemetry/perfettoTracing.ts +1120 -0
  1865. package/src/utils/telemetry/pluginTelemetry.ts +289 -0
  1866. package/src/utils/telemetry/sessionTracing.ts +927 -0
  1867. package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
  1868. package/src/utils/telemetryAttributes.ts +71 -0
  1869. package/src/utils/teleport/api.ts +466 -0
  1870. package/src/utils/teleport/environmentSelection.ts +77 -0
  1871. package/src/utils/teleport/environments.ts +120 -0
  1872. package/src/utils/teleport/gitBundle.ts +292 -0
  1873. package/src/utils/teleport.tsx +1226 -0
  1874. package/src/utils/tempfile.ts +31 -0
  1875. package/src/utils/terminal.ts +131 -0
  1876. package/src/utils/terminalPanel.ts +191 -0
  1877. package/src/utils/textHighlighting.ts +166 -0
  1878. package/src/utils/theme.ts +639 -0
  1879. package/src/utils/thinking.ts +162 -0
  1880. package/src/utils/timeouts.ts +39 -0
  1881. package/src/utils/tmuxSocket.ts +427 -0
  1882. package/src/utils/todo/types.ts +18 -0
  1883. package/src/utils/tokenBudget.ts +73 -0
  1884. package/src/utils/tokens.ts +261 -0
  1885. package/src/utils/toolErrors.ts +132 -0
  1886. package/src/utils/toolPool.ts +79 -0
  1887. package/src/utils/toolResultStorage.ts +1040 -0
  1888. package/src/utils/toolSchemaCache.ts +26 -0
  1889. package/src/utils/toolSearch.ts +756 -0
  1890. package/src/utils/transcriptSearch.ts +202 -0
  1891. package/src/utils/treeify.ts +170 -0
  1892. package/src/utils/truncate.ts +179 -0
  1893. package/src/utils/ultraplan/ccrSession.ts +349 -0
  1894. package/src/utils/ultraplan/keyword.ts +127 -0
  1895. package/src/utils/ultraplan/prompt.txt +1 -0
  1896. package/src/utils/unaryLogging.ts +39 -0
  1897. package/src/utils/undercover.ts +89 -0
  1898. package/src/utils/user.ts +194 -0
  1899. package/src/utils/userAgent.ts +10 -0
  1900. package/src/utils/userPromptKeywords.ts +27 -0
  1901. package/src/utils/uuid.ts +27 -0
  1902. package/src/utils/warningHandler.ts +121 -0
  1903. package/src/utils/which.ts +82 -0
  1904. package/src/utils/windowsPaths.ts +173 -0
  1905. package/src/utils/withResolvers.ts +13 -0
  1906. package/src/utils/words.ts +800 -0
  1907. package/src/utils/workloadContext.ts +57 -0
  1908. package/src/utils/worktree.ts +1519 -0
  1909. package/src/utils/worktreeModeEnabled.ts +11 -0
  1910. package/src/utils/xdg.ts +65 -0
  1911. package/src/utils/xml.ts +16 -0
  1912. package/src/utils/yaml.ts +15 -0
  1913. package/src/utils/zodToJsonSchema.ts +23 -0
  1914. package/src/vim/motions.ts +82 -0
  1915. package/src/vim/operators.ts +556 -0
  1916. package/src/vim/textObjects.ts +186 -0
  1917. package/src/vim/transitions.ts +490 -0
  1918. package/src/vim/types.ts +199 -0
  1919. package/src/voice/voiceModeEnabled.ts +54 -0
  1920. package/start.js +1 -0
@@ -0,0 +1,1462 @@
1
+ import indentString from 'indent-string'
2
+ import { applyTextStyles } from './colorize.js'
3
+ import type { DOMElement } from './dom.js'
4
+ import getMaxWidth from './get-max-width.js'
5
+ import type { Rectangle } from './layout/geometry.js'
6
+ import { LayoutDisplay, LayoutEdge, type LayoutNode } from './layout/node.js'
7
+ import { nodeCache, pendingClears } from './node-cache.js'
8
+ import type Output from './output.js'
9
+ import renderBorder from './render-border.js'
10
+ import type { Screen } from './screen.js'
11
+ import {
12
+ type StyledSegment,
13
+ squashTextNodesToSegments,
14
+ } from './squash-text-nodes.js'
15
+ import type { Color } from './styles.js'
16
+ import { isXtermJs } from './terminal.js'
17
+ import { widestLine } from './widest-line.js'
18
+ import wrapText from './wrap-text.js'
19
+
20
+ // Matches detectXtermJsWheel() in ScrollKeybindingHandler.tsx — the curve
21
+ // and drain must agree on terminal detection. TERM_PROGRAM check is the sync
22
+ // fallback; isXtermJs() is the authoritative XTVERSION-probe result.
23
+ function isXtermJsHost(): boolean {
24
+ return process.env.TERM_PROGRAM === 'vscode' || isXtermJs()
25
+ }
26
+
27
+ // Per-frame scratch: set when any node's yoga position/size differs from
28
+ // its cached value, or a child was removed. Read by ink.tsx to decide
29
+ // whether the full-damage sledgehammer (PR #20120) is needed this frame.
30
+ // Applies on both alt-screen and main-screen. Steady-state frames
31
+ // (spinner tick, clock tick, text append into a fixed-height box) don't
32
+ // shift layout → narrow damage bounds → O(changed cells) diff instead of
33
+ // O(rows×cols).
34
+ let layoutShifted = false
35
+
36
+ export function resetLayoutShifted(): void {
37
+ layoutShifted = false
38
+ }
39
+
40
+ export function didLayoutShift(): boolean {
41
+ return layoutShifted
42
+ }
43
+
44
+ // DECSTBM scroll optimization hint. When a ScrollBox's scrollTop changes
45
+ // between frames (and nothing else moved), log-update.ts can emit a
46
+ // hardware scroll (DECSTBM + SU/SD) instead of rewriting the whole
47
+ // viewport. top/bottom are 0-indexed inclusive screen rows; delta > 0 =
48
+ // content moved up (scrollTop increased, CSI n S).
49
+ export type ScrollHint = { top: number; bottom: number; delta: number }
50
+ let scrollHint: ScrollHint | null = null
51
+
52
+ // Rects of position:absolute nodes from the PREVIOUS frame, used by
53
+ // ScrollBox's blit+shift third-pass repair (see usage site). Recorded at
54
+ // three paths — full-render nodeCache.set, node-level blit early-return,
55
+ // blitEscapingAbsoluteDescendants — so clean-overlay consecutive scrolls
56
+ // still have the rect.
57
+ let absoluteRectsPrev: Rectangle[] = []
58
+ let absoluteRectsCur: Rectangle[] = []
59
+
60
+ export function resetScrollHint(): void {
61
+ scrollHint = null
62
+ absoluteRectsPrev = absoluteRectsCur
63
+ absoluteRectsCur = []
64
+ }
65
+
66
+ export function getScrollHint(): ScrollHint | null {
67
+ return scrollHint
68
+ }
69
+
70
+ // The ScrollBox DOM node (if any) with pendingScrollDelta left after this
71
+ // frame's drain. renderer.ts calls markDirty(it) post-render so the NEXT
72
+ // frame's root blit check fails and we descend to continue draining.
73
+ // Without this, after the scrollbox's dirty flag is cleared (line ~721),
74
+ // the next frame blits root and never reaches the scrollbox — drain stalls.
75
+ let scrollDrainNode: DOMElement | null = null
76
+
77
+ export function resetScrollDrainNode(): void {
78
+ scrollDrainNode = null
79
+ }
80
+
81
+ export function getScrollDrainNode(): DOMElement | null {
82
+ return scrollDrainNode
83
+ }
84
+
85
+ // At-bottom follow scroll event this frame. When streaming content
86
+ // triggers scrollTop = maxScroll, the ScrollBox records the delta +
87
+ // viewport bounds here. ink.tsx consumes it post-render to translate any active
88
+ // text selection by -delta so the highlight stays anchored to the TEXT
89
+ // (native terminal behavior — the selection walks up the screen as content
90
+ // scrolls, eventually clipping at the top). The frontFrame screen buffer
91
+ // still holds the old content at that point — captureScrolledRows reads
92
+ // from it before the front/back swap to preserve the text for copy.
93
+ export type FollowScroll = {
94
+ delta: number
95
+ viewportTop: number
96
+ viewportBottom: number
97
+ }
98
+ let followScroll: FollowScroll | null = null
99
+
100
+ export function consumeFollowScroll(): FollowScroll | null {
101
+ const f = followScroll
102
+ followScroll = null
103
+ return f
104
+ }
105
+
106
+ // ── Native terminal drain (iTerm2/Ghostty/etc. — proportional events) ──
107
+ // Minimum rows applied per frame. Above this, drain is proportional (~3/4
108
+ // of remaining) so big bursts catch up in log₄ frames while the tail
109
+ // decelerates smoothly. Hard cap is innerHeight-1 so DECSTBM hint fires.
110
+ const SCROLL_MIN_PER_FRAME = 4
111
+
112
+ // ── xterm.js (VS Code) smooth drain ──
113
+ // Low pending (≤5) drains ALL in one frame — slow wheel clicks should be
114
+ // instant (click → visible jump → done), not micro-stutter 1-row frames.
115
+ // Higher pending drains at a small fixed step so fast-scroll animation
116
+ // stays smooth (no big jumps). Pending >MAX snaps excess.
117
+ const SCROLL_INSTANT_THRESHOLD = 5 // ≤ this: drain all at once
118
+ const SCROLL_HIGH_PENDING = 12 // threshold for HIGH step
119
+ const SCROLL_STEP_MED = 2 // pending (INSTANT, HIGH): catch-up
120
+ const SCROLL_STEP_HIGH = 3 // pending ≥ HIGH: fast flick
121
+ const SCROLL_MAX_PENDING = 30 // snap excess beyond this
122
+
123
+ // xterm.js adaptive drain. Returns rows applied; mutates pendingScrollDelta.
124
+ function drainAdaptive(
125
+ node: DOMElement,
126
+ pending: number,
127
+ innerHeight: number,
128
+ ): number {
129
+ const sign = pending > 0 ? 1 : -1
130
+ let abs = Math.abs(pending)
131
+ let applied = 0
132
+ // Snap excess beyond animation window so big flicks don't coast.
133
+ if (abs > SCROLL_MAX_PENDING) {
134
+ applied += sign * (abs - SCROLL_MAX_PENDING)
135
+ abs = SCROLL_MAX_PENDING
136
+ }
137
+ // ≤5: drain all (slow click = instant). Above: small fixed step.
138
+ const step =
139
+ abs <= SCROLL_INSTANT_THRESHOLD
140
+ ? abs
141
+ : abs < SCROLL_HIGH_PENDING
142
+ ? SCROLL_STEP_MED
143
+ : SCROLL_STEP_HIGH
144
+ applied += sign * step
145
+ const rem = abs - step
146
+ // Cap total at innerHeight-1 so DECSTBM blit+shift fast path fires
147
+ // (matches drainProportional). Excess stays in pendingScrollDelta.
148
+ const cap = Math.max(1, innerHeight - 1)
149
+ const totalAbs = Math.abs(applied)
150
+ if (totalAbs > cap) {
151
+ const excess = totalAbs - cap
152
+ node.pendingScrollDelta = sign * (rem + excess)
153
+ return sign * cap
154
+ }
155
+ node.pendingScrollDelta = rem > 0 ? sign * rem : undefined
156
+ return applied
157
+ }
158
+
159
+ // Native proportional drain. step = max(MIN, floor(abs*3/4)), capped at
160
+ // innerHeight-1 so DECSTBM + blit+shift fast path fire.
161
+ function drainProportional(
162
+ node: DOMElement,
163
+ pending: number,
164
+ innerHeight: number,
165
+ ): number {
166
+ const abs = Math.abs(pending)
167
+ const cap = Math.max(1, innerHeight - 1)
168
+ const step = Math.min(cap, Math.max(SCROLL_MIN_PER_FRAME, (abs * 3) >> 2))
169
+ if (abs <= step) {
170
+ node.pendingScrollDelta = undefined
171
+ return pending
172
+ }
173
+ const applied = pending > 0 ? step : -step
174
+ node.pendingScrollDelta = pending - applied
175
+ return applied
176
+ }
177
+
178
+ // OSC 8 hyperlink escape sequences. Empty params (;;) — ansi-tokenize only
179
+ // recognizes this exact prefix. The id= param (for grouping wrapped lines)
180
+ // is added at terminal-output time in termio/osc.ts link().
181
+ const OSC = '\u001B]'
182
+ const BEL = '\u0007'
183
+
184
+ function wrapWithOsc8Link(text: string, url: string): string {
185
+ return `${OSC}8;;${url}${BEL}${text}${OSC}8;;${BEL}`
186
+ }
187
+
188
+ /**
189
+ * Build a mapping from each character position in the plain text to its segment index.
190
+ * Returns an array where charToSegment[i] is the segment index for character i.
191
+ */
192
+ function buildCharToSegmentMap(segments: StyledSegment[]): number[] {
193
+ const map: number[] = []
194
+ for (let i = 0; i < segments.length; i++) {
195
+ const len = segments[i]!.text.length
196
+ for (let j = 0; j < len; j++) {
197
+ map.push(i)
198
+ }
199
+ }
200
+ return map
201
+ }
202
+
203
+ /**
204
+ * Apply styles to wrapped text by mapping each character back to its original segment.
205
+ * This preserves per-segment styles even when text wraps across lines.
206
+ *
207
+ * @param trimEnabled - Whether whitespace trimming is enabled (wrap-trim mode).
208
+ * When true, we skip whitespace in the original that was trimmed from the output.
209
+ * When false (wrap mode), all whitespace is preserved so no skipping is needed.
210
+ */
211
+ function applyStylesToWrappedText(
212
+ wrappedPlain: string,
213
+ segments: StyledSegment[],
214
+ charToSegment: number[],
215
+ originalPlain: string,
216
+ trimEnabled: boolean = false,
217
+ ): string {
218
+ const lines = wrappedPlain.split('\n')
219
+ const resultLines: string[] = []
220
+
221
+ let charIndex = 0
222
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
223
+ const line = lines[lineIdx]!
224
+
225
+ // In trim mode, skip leading whitespace that was trimmed from this line.
226
+ // Only skip if the original has whitespace but the output line doesn't start
227
+ // with whitespace (meaning it was trimmed). If both have whitespace, the
228
+ // whitespace was preserved and we shouldn't skip.
229
+ if (trimEnabled && line.length > 0) {
230
+ const lineStartsWithWhitespace = /\s/.test(line[0]!)
231
+ const originalHasWhitespace =
232
+ charIndex < originalPlain.length && /\s/.test(originalPlain[charIndex]!)
233
+
234
+ // Only skip if original has whitespace but line doesn't
235
+ if (originalHasWhitespace && !lineStartsWithWhitespace) {
236
+ while (
237
+ charIndex < originalPlain.length &&
238
+ /\s/.test(originalPlain[charIndex]!)
239
+ ) {
240
+ charIndex++
241
+ }
242
+ }
243
+ }
244
+
245
+ let styledLine = ''
246
+ let runStart = 0
247
+ let runSegmentIndex = charToSegment[charIndex] ?? 0
248
+
249
+ for (let i = 0; i < line.length; i++) {
250
+ const currentSegmentIndex = charToSegment[charIndex] ?? runSegmentIndex
251
+
252
+ if (currentSegmentIndex !== runSegmentIndex) {
253
+ // Flush the current run
254
+ const runText = line.slice(runStart, i)
255
+ const segment = segments[runSegmentIndex]
256
+ if (segment) {
257
+ let styled = applyTextStyles(runText, segment.styles)
258
+ if (segment.hyperlink) {
259
+ styled = wrapWithOsc8Link(styled, segment.hyperlink)
260
+ }
261
+ styledLine += styled
262
+ } else {
263
+ styledLine += runText
264
+ }
265
+ runStart = i
266
+ runSegmentIndex = currentSegmentIndex
267
+ }
268
+
269
+ charIndex++
270
+ }
271
+
272
+ // Flush the final run
273
+ const runText = line.slice(runStart)
274
+ const segment = segments[runSegmentIndex]
275
+ if (segment) {
276
+ let styled = applyTextStyles(runText, segment.styles)
277
+ if (segment.hyperlink) {
278
+ styled = wrapWithOsc8Link(styled, segment.hyperlink)
279
+ }
280
+ styledLine += styled
281
+ } else {
282
+ styledLine += runText
283
+ }
284
+
285
+ resultLines.push(styledLine)
286
+
287
+ // Skip newline character in original that corresponds to this line break.
288
+ // This is needed when the original text contains actual newlines (not just
289
+ // wrapping-inserted newlines). Without this, charIndex gets out of sync
290
+ // because the newline is in originalPlain/charToSegment but not in the
291
+ // split lines.
292
+ if (charIndex < originalPlain.length && originalPlain[charIndex] === '\n') {
293
+ charIndex++
294
+ }
295
+
296
+ // In trim mode, skip whitespace that was replaced by newline when wrapping.
297
+ // We skip whitespace in the original until we reach a character that matches
298
+ // the first character of the next line. This handles cases like:
299
+ // - "AB \tD" wrapped to "AB\n\tD" - skip spaces until we hit the tab
300
+ // In non-trim mode, whitespace is preserved so no skipping is needed.
301
+ if (trimEnabled && lineIdx < lines.length - 1) {
302
+ const nextLine = lines[lineIdx + 1]!
303
+ const nextLineFirstChar = nextLine.length > 0 ? nextLine[0] : null
304
+
305
+ // Skip whitespace until we hit a char that matches the next line's first char
306
+ while (
307
+ charIndex < originalPlain.length &&
308
+ /\s/.test(originalPlain[charIndex]!)
309
+ ) {
310
+ // Stop if we found the character that starts the next line
311
+ if (
312
+ nextLineFirstChar !== null &&
313
+ originalPlain[charIndex] === nextLineFirstChar
314
+ ) {
315
+ break
316
+ }
317
+ charIndex++
318
+ }
319
+ }
320
+ }
321
+
322
+ return resultLines.join('\n')
323
+ }
324
+
325
+ /**
326
+ * Wrap text and record which output lines are soft-wrap continuations
327
+ * (i.e. the `\n` before them was inserted by word-wrap, not in the
328
+ * source). wrapAnsi already processes each input line independently, so
329
+ * wrapping per-input-line here gives identical output to a single
330
+ * whole-string wrap while letting us mark per-piece provenance.
331
+ * Truncate modes never add newlines (cli-truncate is whole-string) so
332
+ * they fall through with softWrap undefined — no tracking, no behavior
333
+ * change from the pre-softWrap path.
334
+ */
335
+ function wrapWithSoftWrap(
336
+ plainText: string,
337
+ maxWidth: number,
338
+ textWrap: Parameters<typeof wrapText>[2],
339
+ ): { wrapped: string; softWrap: boolean[] | undefined } {
340
+ if (textWrap !== 'wrap' && textWrap !== 'wrap-trim') {
341
+ return {
342
+ wrapped: wrapText(plainText, maxWidth, textWrap),
343
+ softWrap: undefined,
344
+ }
345
+ }
346
+ const origLines = plainText.split('\n')
347
+ const outLines: string[] = []
348
+ const softWrap: boolean[] = []
349
+ for (const orig of origLines) {
350
+ const pieces = wrapText(orig, maxWidth, textWrap).split('\n')
351
+ for (let i = 0; i < pieces.length; i++) {
352
+ outLines.push(pieces[i]!)
353
+ softWrap.push(i > 0)
354
+ }
355
+ }
356
+ return { wrapped: outLines.join('\n'), softWrap }
357
+ }
358
+
359
+ // If parent container is `<Box>`, text nodes will be treated as separate nodes in
360
+ // the tree and will have their own coordinates in the layout.
361
+ // To ensure text nodes are aligned correctly, take X and Y of the first text node
362
+ // and use it as offset for the rest of the nodes
363
+ // Only first node is taken into account, because other text nodes can't have margin or padding,
364
+ // so their coordinates will be relative to the first node anyway
365
+ function applyPaddingToText(
366
+ node: DOMElement,
367
+ text: string,
368
+ softWrap?: boolean[],
369
+ ): string {
370
+ const yogaNode = node.childNodes[0]?.yogaNode
371
+
372
+ if (yogaNode) {
373
+ const offsetX = yogaNode.getComputedLeft()
374
+ const offsetY = yogaNode.getComputedTop()
375
+ text = '\n'.repeat(offsetY) + indentString(text, offsetX)
376
+ if (softWrap && offsetY > 0) {
377
+ // Prepend `false` for each padding line so indices stay aligned
378
+ // with text.split('\n'). Mutate in place — caller owns the array.
379
+ softWrap.unshift(...Array<boolean>(offsetY).fill(false))
380
+ }
381
+ }
382
+
383
+ return text
384
+ }
385
+
386
+ // After nodes are laid out, render each to output object, which later gets rendered to terminal
387
+ function renderNodeToOutput(
388
+ node: DOMElement,
389
+ output: Output,
390
+ {
391
+ offsetX = 0,
392
+ offsetY = 0,
393
+ prevScreen,
394
+ skipSelfBlit = false,
395
+ inheritedBackgroundColor,
396
+ }: {
397
+ offsetX?: number
398
+ offsetY?: number
399
+ prevScreen: Screen | undefined
400
+ // Force this node to descend instead of blitting its own rect, while
401
+ // still passing prevScreen to children. Used for non-opaque absolute
402
+ // overlays over a dirty clipped region: the overlay's full rect has
403
+ // transparent gaps (stale underlying content in prevScreen), but its
404
+ // opaque descendants' narrower rects are safe to blit.
405
+ skipSelfBlit?: boolean
406
+ inheritedBackgroundColor?: Color
407
+ },
408
+ ): void {
409
+ const { yogaNode } = node
410
+
411
+ if (yogaNode) {
412
+ if (yogaNode.getDisplay() === LayoutDisplay.None) {
413
+ // Clear old position if node was visible before becoming hidden
414
+ if (node.dirty) {
415
+ const cached = nodeCache.get(node)
416
+ if (cached) {
417
+ output.clear({
418
+ x: Math.floor(cached.x),
419
+ y: Math.floor(cached.y),
420
+ width: Math.floor(cached.width),
421
+ height: Math.floor(cached.height),
422
+ })
423
+ // Drop descendants' cache too — hideInstance's markDirty walks UP
424
+ // only, so descendants' .dirty stays false. Their nodeCache entries
425
+ // survive with pre-hide rects. On unhide, if position didn't shift,
426
+ // the blit check at line ~432 passes and copies EMPTY cells from
427
+ // prevScreen (cleared here) → content vanishes.
428
+ dropSubtreeCache(node)
429
+ layoutShifted = true
430
+ }
431
+ }
432
+ return
433
+ }
434
+
435
+ // Left and top positions in Yoga are relative to their parent node
436
+ const x = offsetX + yogaNode.getComputedLeft()
437
+ const yogaTop = yogaNode.getComputedTop()
438
+ let y = offsetY + yogaTop
439
+ const width = yogaNode.getComputedWidth()
440
+ const height = yogaNode.getComputedHeight()
441
+
442
+ // Absolute-positioned overlays (e.g. autocomplete menus with bottom='100%')
443
+ // can compute negative screen y when they extend above the viewport. Without
444
+ // clamping, setCellAt drops cells at y<0, clipping the TOP of the content
445
+ // (best matches in an autocomplete). By clamping to 0, we shift the element
446
+ // down so the top rows are visible and the bottom overflows below — the
447
+ // opaque prop ensures it paints over whatever is underneath.
448
+ if (y < 0 && node.style.position === 'absolute') {
449
+ y = 0
450
+ }
451
+
452
+ // Check if we can skip this subtree (clean node with unchanged layout).
453
+ // Blit cells from previous screen instead of re-rendering.
454
+ const cached = nodeCache.get(node)
455
+ if (
456
+ !node.dirty &&
457
+ !skipSelfBlit &&
458
+ node.pendingScrollDelta === undefined &&
459
+ cached &&
460
+ cached.x === x &&
461
+ cached.y === y &&
462
+ cached.width === width &&
463
+ cached.height === height &&
464
+ prevScreen
465
+ ) {
466
+ const fx = Math.floor(x)
467
+ const fy = Math.floor(y)
468
+ const fw = Math.floor(width)
469
+ const fh = Math.floor(height)
470
+ output.blit(prevScreen, fx, fy, fw, fh)
471
+ if (node.style.position === 'absolute') {
472
+ absoluteRectsCur.push(cached)
473
+ }
474
+ // Absolute descendants can paint outside this node's layout bounds
475
+ // (e.g. a slash menu with position='absolute' bottom='100%' floats
476
+ // above). If a dirty clipped sibling re-rendered and overwrote those
477
+ // cells, the blit above only restored this node's own rect — the
478
+ // absolute descendants' cells are lost. Re-blit them from prevScreen
479
+ // so the overlays survive.
480
+ blitEscapingAbsoluteDescendants(node, output, prevScreen, fx, fy, fw, fh)
481
+ return
482
+ }
483
+
484
+ // Clear stale content from the old position when re-rendering.
485
+ // Dirty: content changed. Moved: position/size changed (e.g., sibling
486
+ // above changed height), old cells still on the terminal.
487
+ const positionChanged =
488
+ cached !== undefined &&
489
+ (cached.x !== x ||
490
+ cached.y !== y ||
491
+ cached.width !== width ||
492
+ cached.height !== height)
493
+ if (positionChanged) {
494
+ layoutShifted = true
495
+ }
496
+ if (cached && (node.dirty || positionChanged)) {
497
+ output.clear(
498
+ {
499
+ x: Math.floor(cached.x),
500
+ y: Math.floor(cached.y),
501
+ width: Math.floor(cached.width),
502
+ height: Math.floor(cached.height),
503
+ },
504
+ node.style.position === 'absolute',
505
+ )
506
+ }
507
+
508
+ // Read before deleting — hasRemovedChild disables prevScreen blitting
509
+ // for siblings to prevent stale overflow content from being restored.
510
+ const clears = pendingClears.get(node)
511
+ const hasRemovedChild = clears !== undefined
512
+ if (hasRemovedChild) {
513
+ layoutShifted = true
514
+ for (const rect of clears) {
515
+ output.clear({
516
+ x: Math.floor(rect.x),
517
+ y: Math.floor(rect.y),
518
+ width: Math.floor(rect.width),
519
+ height: Math.floor(rect.height),
520
+ })
521
+ }
522
+ pendingClears.delete(node)
523
+ }
524
+
525
+ // Yoga squeezed this node to zero height (overflow in a height-constrained
526
+ // parent) AND a sibling lands at the same y. Skip rendering — both would
527
+ // write to the same row; if the sibling's content is shorter, this node's
528
+ // tail chars ghost (e.g. "false" + "true" = "truee"). The clear above
529
+ // already handled the visible→squeezed transition.
530
+ //
531
+ // The sibling-overlap check is load-bearing: Yoga's pixel-grid rounding
532
+ // can give a box h=0 while still leaving a row for it (next sibling at
533
+ // y+1, not y). HelpV2's third shortcuts column hits this — skipping
534
+ // unconditionally drops "ctrl + z to suspend" from /help output.
535
+ if (height === 0 && siblingSharesY(node, yogaNode)) {
536
+ nodeCache.set(node, { x, y, width, height, top: yogaTop })
537
+ node.dirty = false
538
+ return
539
+ }
540
+
541
+ if (node.nodeName === 'ink-raw-ansi') {
542
+ // Pre-rendered ANSI content. The producer already wrapped to width and
543
+ // emitted terminal-ready escape codes. Skip squash, measure, wrap, and
544
+ // style re-application — output.write() parses ANSI directly into cells.
545
+ const text = node.attributes['rawText'] as string
546
+ if (text) {
547
+ output.write(x, y, text)
548
+ }
549
+ } else if (node.nodeName === 'ink-text') {
550
+ const segments = squashTextNodesToSegments(
551
+ node,
552
+ inheritedBackgroundColor
553
+ ? { backgroundColor: inheritedBackgroundColor }
554
+ : undefined,
555
+ )
556
+
557
+ // First, get plain text to check if wrapping is needed
558
+ const plainText = segments.map(s => s.text).join('')
559
+
560
+ if (plainText.length > 0) {
561
+ // Upstream Ink uses getMaxWidth(yogaNode) unclamped here. That
562
+ // width comes from Yoga's AtMost pass and can exceed the actual
563
+ // screen space (see getMaxWidth docstring). Yoga's height for this
564
+ // node already reflects the constrained Exactly pass, so clamping
565
+ // the wrap width here keeps line count consistent with layout.
566
+ // Without this, characters past the screen edge are dropped by
567
+ // setCellAt's bounds check.
568
+ const maxWidth = Math.min(getMaxWidth(yogaNode), output.width - x)
569
+ const textWrap = node.style.textWrap ?? 'wrap'
570
+
571
+ // Check if wrapping is needed
572
+ const needsWrapping = widestLine(plainText) > maxWidth
573
+
574
+ let text: string
575
+ let softWrap: boolean[] | undefined
576
+ if (needsWrapping && segments.length === 1) {
577
+ // Single segment: wrap plain text first, then apply styles to each line
578
+ const segment = segments[0]!
579
+ const w = wrapWithSoftWrap(plainText, maxWidth, textWrap)
580
+ softWrap = w.softWrap
581
+ text = w.wrapped
582
+ .split('\n')
583
+ .map(line => {
584
+ let styled = applyTextStyles(line, segment.styles)
585
+ // Apply OSC 8 hyperlink per-line so each line is independently
586
+ // clickable. output.ts splits on newlines and tokenizes each
587
+ // line separately, so a single wrapper around the whole block
588
+ // would only apply the hyperlink to the first line.
589
+ if (segment.hyperlink) {
590
+ styled = wrapWithOsc8Link(styled, segment.hyperlink)
591
+ }
592
+ return styled
593
+ })
594
+ .join('\n')
595
+ } else if (needsWrapping) {
596
+ // Multiple segments with wrapping: wrap plain text first, then re-apply
597
+ // each segment's styles based on character positions. This preserves
598
+ // per-segment styles even when text wraps across lines.
599
+ const w = wrapWithSoftWrap(plainText, maxWidth, textWrap)
600
+ softWrap = w.softWrap
601
+ const charToSegment = buildCharToSegmentMap(segments)
602
+ text = applyStylesToWrappedText(
603
+ w.wrapped,
604
+ segments,
605
+ charToSegment,
606
+ plainText,
607
+ textWrap === 'wrap-trim',
608
+ )
609
+ // Hyperlinks are handled per-run in applyStylesToWrappedText via
610
+ // wrapWithOsc8Link, similar to how styles are applied per-run.
611
+ } else {
612
+ // No wrapping needed: apply styles directly
613
+ text = segments
614
+ .map(segment => {
615
+ let styledText = applyTextStyles(segment.text, segment.styles)
616
+ if (segment.hyperlink) {
617
+ styledText = wrapWithOsc8Link(styledText, segment.hyperlink)
618
+ }
619
+ return styledText
620
+ })
621
+ .join('')
622
+ }
623
+
624
+ text = applyPaddingToText(node, text, softWrap)
625
+
626
+ output.write(x, y, text, softWrap)
627
+ }
628
+ } else if (node.nodeName === 'ink-box') {
629
+ const boxBackgroundColor =
630
+ node.style.backgroundColor ?? inheritedBackgroundColor
631
+
632
+ // Mark this box's region as non-selectable (fullscreen text
633
+ // selection). noSelect ops are applied AFTER blits/writes in
634
+ // output.get(), so this wins regardless of what's rendered into
635
+ // the region — including blits from prevScreen when the box is
636
+ // clean (the op is emitted on both the dirty-render path here
637
+ // AND on the blit fast-path at line ~235 since blitRegion copies
638
+ // the noSelect bitmap alongside cells).
639
+ //
640
+ // 'from-left-edge' extends the exclusion from col 0 so any
641
+ // upstream indentation (tool prefix, tree lines) is covered too
642
+ // — a multi-row drag over a diff gutter shouldn't pick up the
643
+ // ` ⎿ ` prefix on row 0 or the blank cells under it on row 1+.
644
+ if (node.style.noSelect) {
645
+ const boxX = Math.floor(x)
646
+ const fromEdge = node.style.noSelect === 'from-left-edge'
647
+ output.noSelect({
648
+ x: fromEdge ? 0 : boxX,
649
+ y: Math.floor(y),
650
+ width: fromEdge ? boxX + Math.floor(width) : Math.floor(width),
651
+ height: Math.floor(height),
652
+ })
653
+ }
654
+
655
+ const overflowX = node.style.overflowX ?? node.style.overflow
656
+ const overflowY = node.style.overflowY ?? node.style.overflow
657
+ const clipHorizontally = overflowX === 'hidden' || overflowX === 'scroll'
658
+ const clipVertically = overflowY === 'hidden' || overflowY === 'scroll'
659
+ const isScrollY = overflowY === 'scroll'
660
+
661
+ const needsClip = clipHorizontally || clipVertically
662
+ let y1: number | undefined
663
+ let y2: number | undefined
664
+ if (needsClip) {
665
+ const x1 = clipHorizontally
666
+ ? x + yogaNode.getComputedBorder(LayoutEdge.Left)
667
+ : undefined
668
+
669
+ const x2 = clipHorizontally
670
+ ? x +
671
+ yogaNode.getComputedWidth() -
672
+ yogaNode.getComputedBorder(LayoutEdge.Right)
673
+ : undefined
674
+
675
+ y1 = clipVertically
676
+ ? y + yogaNode.getComputedBorder(LayoutEdge.Top)
677
+ : undefined
678
+
679
+ y2 = clipVertically
680
+ ? y +
681
+ yogaNode.getComputedHeight() -
682
+ yogaNode.getComputedBorder(LayoutEdge.Bottom)
683
+ : undefined
684
+
685
+ output.clip({ x1, x2, y1, y2 })
686
+ }
687
+
688
+ if (isScrollY) {
689
+ // Scroll containers follow the ScrollBox component structure:
690
+ // a single content-wrapper child with flexShrink:0 (doesn't shrink
691
+ // to fit), whose children are the scrollable items. scrollHeight
692
+ // comes from the wrapper's intrinsic Yoga height. The wrapper is
693
+ // rendered with its Y translated by -scrollTop; its children are
694
+ // culled against the visible window.
695
+ const padTop = yogaNode.getComputedPadding(LayoutEdge.Top)
696
+ const innerHeight = Math.max(
697
+ 0,
698
+ (y2 ?? y + height) -
699
+ (y1 ?? y) -
700
+ padTop -
701
+ yogaNode.getComputedPadding(LayoutEdge.Bottom),
702
+ )
703
+
704
+ const content = node.childNodes.find(c => (c as DOMElement).yogaNode) as
705
+ | DOMElement
706
+ | undefined
707
+ const contentYoga = content?.yogaNode
708
+ // scrollHeight is the intrinsic height of the content wrapper.
709
+ // Do NOT add getComputedTop() — that's the wrapper's offset
710
+ // within the viewport (equal to the scroll container's
711
+ // paddingTop), and innerHeight already subtracts padding, so
712
+ // including it double-counts padding and inflates maxScroll.
713
+ const scrollHeight = contentYoga?.getComputedHeight() ?? 0
714
+ // Capture previous scroll bounds BEFORE overwriting — the at-bottom
715
+ // follow check compares against last frame's max.
716
+ const prevScrollHeight = node.scrollHeight ?? scrollHeight
717
+ const prevInnerHeight = node.scrollViewportHeight ?? innerHeight
718
+ node.scrollHeight = scrollHeight
719
+ node.scrollViewportHeight = innerHeight
720
+ // Absolute screen-buffer row where the scrollable area (inside
721
+ // padding) begins. Exposed via ScrollBoxHandle.getViewportTop() so
722
+ // drag-to-scroll can detect when the drag leaves the scroll viewport.
723
+ node.scrollViewportTop = (y1 ?? y) + padTop
724
+
725
+ const maxScroll = Math.max(0, scrollHeight - innerHeight)
726
+ // scrollAnchor: scroll so the anchored element's top is at the
727
+ // viewport top (plus offset). Yoga is FRESH — same calculateLayout
728
+ // pass that just produced scrollHeight. Deterministic alternative
729
+ // to scrollTo(N) which bakes a number that's stale by the throttled
730
+ // render; the element ref defers the read to now. One-shot snap.
731
+ // A prior eased-seek version (proportional drain over ~5 frames)
732
+ // moved scrollTop without firing React's notify → parent's quantized
733
+ // store snapshot never updated → StickyTracker got stale range props
734
+ // → firstVisible wrong. Also: SCROLL_MIN_PER_FRAME=4 with snap-at-1
735
+ // ping-ponged forever at delta=2. Smooth needs drain-end notify
736
+ // plumbing; shipping instant first. stickyScroll overrides.
737
+ if (node.scrollAnchor) {
738
+ const anchorTop = node.scrollAnchor.el.yogaNode?.getComputedTop()
739
+ if (anchorTop != null) {
740
+ node.scrollTop = anchorTop + node.scrollAnchor.offset
741
+ node.pendingScrollDelta = undefined
742
+ }
743
+ node.scrollAnchor = undefined
744
+ }
745
+ // At-bottom follow. Positional: if scrollTop was at (or past) the
746
+ // previous max, pin to the new max. Scroll away → stop following;
747
+ // scroll back (or scrollToBottom/sticky attr) → resume. The sticky
748
+ // flag is OR'd in for cold start (scrollTop=0 before first layout)
749
+ // and scrollToBottom-from-far-away (flag set before scrollTop moves)
750
+ // — the imperative field takes precedence over the attribute so
751
+ // scrollTo/scrollBy can break stickiness. pendingDelta<0 guard:
752
+ // don't cancel an in-flight scroll-up when content races in.
753
+ // Capture scrollTop before follow so ink.tsx can translate any
754
+ // active text selection by the same delta (native terminal behavior:
755
+ // view keeps scrolling, highlight walks up with the text).
756
+ const scrollTopBeforeFollow = node.scrollTop ?? 0
757
+ const sticky =
758
+ node.stickyScroll ?? Boolean(node.attributes['stickyScroll'])
759
+ const prevMaxScroll = Math.max(0, prevScrollHeight - prevInnerHeight)
760
+ // Positional check only valid when content grew — virtualization can
761
+ // transiently SHRINK scrollHeight (tail unmount + stale heightCache
762
+ // spacer) making scrollTop >= prevMaxScroll true by artifact, not
763
+ // because the user was at bottom.
764
+ const grew = scrollHeight >= prevScrollHeight
765
+ const atBottom =
766
+ sticky || (grew && scrollTopBeforeFollow >= prevMaxScroll)
767
+ if (atBottom && (node.pendingScrollDelta ?? 0) >= 0) {
768
+ node.scrollTop = maxScroll
769
+ node.pendingScrollDelta = undefined
770
+ // Sync flag so useVirtualScroll's isSticky() agrees with positional
771
+ // state — sticky-broken-but-at-bottom (wheel tremor, click-select
772
+ // at max) otherwise leaves useVirtualScroll's clamp holding the
773
+ // viewport short of new streaming content. scrollTo/scrollBy set
774
+ // false; this restores true, same as scrollToBottom() would.
775
+ // Only restore when (a) positionally at bottom and (b) the flag
776
+ // was explicitly broken (===false) by scrollTo/scrollBy. When
777
+ // undefined (never set by user action) leave it alone — setting it
778
+ // would make the sticky flag sticky-by-default and lock out
779
+ // direct scrollTop writes (e.g. the alt-screen-perf test).
780
+ if (
781
+ node.stickyScroll === false &&
782
+ scrollTopBeforeFollow >= prevMaxScroll
783
+ ) {
784
+ node.stickyScroll = true
785
+ }
786
+ }
787
+ const followDelta = (node.scrollTop ?? 0) - scrollTopBeforeFollow
788
+ if (followDelta > 0) {
789
+ const vpTop = node.scrollViewportTop ?? 0
790
+ followScroll = {
791
+ delta: followDelta,
792
+ viewportTop: vpTop,
793
+ viewportBottom: vpTop + innerHeight - 1,
794
+ }
795
+ }
796
+ // Drain pendingScrollDelta. Native terminals (proportional burst
797
+ // events) use proportional drain; xterm.js (VS Code, sparse events +
798
+ // app-side accel curve) uses adaptive small-step drain. isXtermJs()
799
+ // depends on the async XTVERSION probe, but by the time this runs
800
+ // (pendingScrollDelta is only set by wheel events, >>50ms after
801
+ // startup) the probe has resolved — same timing guarantee the
802
+ // wheel-accel curve relies on.
803
+ let cur = node.scrollTop ?? 0
804
+ const pending = node.pendingScrollDelta
805
+ const cMin = node.scrollClampMin
806
+ const cMax = node.scrollClampMax
807
+ const haveClamp = cMin !== undefined && cMax !== undefined
808
+ if (pending !== undefined && pending !== 0) {
809
+ // Drain continues even past the clamp — the render-clamp below
810
+ // holds the VISUAL at the mounted edge regardless. Hard-stopping
811
+ // here caused stop-start jutter: drain hits edge → pause → React
812
+ // commits → clamp widens → drain resumes → edge again. Letting
813
+ // scrollTop advance smoothly while the clamp lags gives continuous
814
+ // visual scroll at React's commit rate (the clamp catches up each
815
+ // commit). But THROTTLE the drain when already past the clamp so
816
+ // scrollTop doesn't race 5000 rows ahead of the mounted range
817
+ // (slide-cap would then take 200 commits to catch up = long
818
+ // perceived stall at the edge). Past-clamp drain caps at ~4 rows/
819
+ // frame, roughly matching React's slide rate so the gap stays
820
+ // bounded and catch-up is quick once input stops.
821
+ const pastClamp =
822
+ haveClamp &&
823
+ ((pending < 0 && cur < cMin) || (pending > 0 && cur > cMax))
824
+ const eff = pastClamp ? Math.min(4, innerHeight >> 3) : innerHeight
825
+ cur += isXtermJsHost()
826
+ ? drainAdaptive(node, pending, eff)
827
+ : drainProportional(node, pending, eff)
828
+ } else if (pending === 0) {
829
+ // Opposite scrollBy calls cancelled to zero — clear so we don't
830
+ // schedule an infinite loop of no-op drain frames.
831
+ node.pendingScrollDelta = undefined
832
+ }
833
+ let scrollTop = Math.max(0, Math.min(cur, maxScroll))
834
+ // Virtual-scroll clamp: if scrollTop raced past the currently-mounted
835
+ // range (burst PageUp before React re-renders), render at the EDGE of
836
+ // the mounted children instead of blank spacer. Do NOT write back to
837
+ // node.scrollTop — the clamped value is for this paint only; the real
838
+ // scrollTop stays so React's next commit sees the target and mounts
839
+ // the right range. Not scheduling scrollDrainNode here keeps the
840
+ // clamp passive — React's commit → resetAfterCommit → onRender will
841
+ // paint again with fresh bounds.
842
+ const clamped = haveClamp
843
+ ? Math.max(cMin, Math.min(scrollTop, cMax))
844
+ : scrollTop
845
+ node.scrollTop = scrollTop
846
+ // Clamp hitting top/bottom consumes any remainder. Set drainPending
847
+ // only after clamp so a wasted no-op frame isn't scheduled.
848
+ if (scrollTop !== cur) node.pendingScrollDelta = undefined
849
+ if (node.pendingScrollDelta !== undefined) scrollDrainNode = node
850
+ scrollTop = clamped
851
+
852
+ if (content && contentYoga) {
853
+ // Compute content wrapper's absolute render position with scroll
854
+ // offset applied, then render its children with culling.
855
+ const contentX = x + contentYoga.getComputedLeft()
856
+ const contentY = y + contentYoga.getComputedTop() - scrollTop
857
+ // layoutShifted detection gap: when scrollTop moves by >= viewport
858
+ // height (batched PageUps, fast wheel), every visible child gets
859
+ // culled (cache dropped) and every newly-visible child has no
860
+ // cache — so the children's positionChanged check can't fire.
861
+ // The content wrapper's cached y (which encodes -scrollTop) is
862
+ // the only node that survives to witness the scroll.
863
+ const contentCached = nodeCache.get(content)
864
+ let hint: ScrollHint | null = null
865
+ if (contentCached && contentCached.y !== contentY) {
866
+ // delta = newScrollTop - oldScrollTop (positive = scrolled down).
867
+ // Capture a DECSTBM hint if the container itself didn't move
868
+ // and the shift fits within the viewport — otherwise the full
869
+ // rewrite is needed anyway, and layoutShifted stays the fallback.
870
+ const delta = contentCached.y - contentY
871
+ const regionTop = Math.floor(y + contentYoga.getComputedTop())
872
+ const regionBottom = regionTop + innerHeight - 1
873
+ if (
874
+ cached?.y === y &&
875
+ cached.height === height &&
876
+ innerHeight > 0 &&
877
+ Math.abs(delta) < innerHeight
878
+ ) {
879
+ hint = { top: regionTop, bottom: regionBottom, delta }
880
+ scrollHint = hint
881
+ } else {
882
+ layoutShifted = true
883
+ }
884
+ }
885
+ // Fast path: scroll (hint captured) with usable prevScreen.
886
+ // Blit prevScreen's scroll region into next.screen, shift in-place
887
+ // by delta (mirrors DECSTBM), then render ONLY the edge rows. The
888
+ // nested clip keeps child writes out of stable rows — a tall child
889
+ // that spans edge+stable still renders but stable cells are
890
+ // clipped, preserving the blit. Avoids re-rendering every visible
891
+ // child (expensive for long syntax-highlighted transcripts).
892
+ //
893
+ // When content.dirty (e.g. streaming text at the bottom of the
894
+ // scroll), we still use the fast path — the dirty child is almost
895
+ // always in the edge rows (the bottom, where new content appears).
896
+ // After edge rendering, any dirty children in stable rows are
897
+ // re-rendered in a second pass to avoid showing stale blitted
898
+ // content.
899
+ //
900
+ // Guard: the fast path only handles pure scroll or bottom-append.
901
+ // Child removal/insertion changes the content height in a way that
902
+ // doesn't match the scroll delta — fall back to the full path so
903
+ // removed children don't leave stale cells and shifted siblings
904
+ // render at their new positions.
905
+ const scrollHeight = contentYoga.getComputedHeight()
906
+ const prevHeight = contentCached?.height ?? scrollHeight
907
+ const heightDelta = scrollHeight - prevHeight
908
+ const safeForFastPath =
909
+ !hint ||
910
+ heightDelta === 0 ||
911
+ (hint.delta > 0 && heightDelta === hint.delta)
912
+ // scrollHint is set above when hint is captured. If safeForFastPath
913
+ // is false the full path renders a next.screen that doesn't match
914
+ // the DECSTBM shift — emitting DECSTBM leaves stale rows (seen as
915
+ // content bleeding through during scroll-up + streaming). Clear it.
916
+ if (!safeForFastPath) scrollHint = null
917
+ if (hint && prevScreen && safeForFastPath) {
918
+ const { top, bottom, delta } = hint
919
+ const w = Math.floor(width)
920
+ output.blit(prevScreen, Math.floor(x), top, w, bottom - top + 1)
921
+ output.shift(top, bottom, delta)
922
+ // Edge rows: new content entering the viewport.
923
+ const edgeTop = delta > 0 ? bottom - delta + 1 : top
924
+ const edgeBottom = delta > 0 ? bottom : top - delta - 1
925
+ output.clear({
926
+ x: Math.floor(x),
927
+ y: edgeTop,
928
+ width: w,
929
+ height: edgeBottom - edgeTop + 1,
930
+ })
931
+ output.clip({
932
+ x1: undefined,
933
+ x2: undefined,
934
+ y1: edgeTop,
935
+ y2: edgeBottom + 1,
936
+ })
937
+ // Snapshot dirty children before the first pass — the first
938
+ // pass clears dirty flags, and edge-spanning children would be
939
+ // missed by the second pass without this snapshot.
940
+ const dirtyChildren = content.dirty
941
+ ? new Set(content.childNodes.filter(c => (c as DOMElement).dirty))
942
+ : null
943
+ renderScrolledChildren(
944
+ content,
945
+ output,
946
+ contentX,
947
+ contentY,
948
+ hasRemovedChild,
949
+ undefined,
950
+ // Cull to edge in child-local coords (inverse of contentY offset).
951
+ edgeTop - contentY,
952
+ edgeBottom + 1 - contentY,
953
+ boxBackgroundColor,
954
+ true,
955
+ )
956
+ output.unclip()
957
+
958
+ // Second pass: re-render children in stable rows whose screen
959
+ // position doesn't match where the shift put their old pixels.
960
+ // Covers TWO cases:
961
+ // 1. Dirty children — their content changed, blitted pixels are
962
+ // stale regardless of position.
963
+ // 2. Clean children BELOW a middle-growth point — when a dirty
964
+ // sibling above them grows, their yogaTop increases but
965
+ // scrollTop increases by the same amount (sticky), so their
966
+ // screenY is CONSTANT. The shift moved their old pixels to
967
+ // screenY-delta (wrong); they should stay at screenY. Without
968
+ // this, the spinner/tmux-monitor ghost at shifted positions
969
+ // during streaming (e.g. triple spinner, pill duplication).
970
+ // For bottom-append (the common case), all clean children are
971
+ // ABOVE the growth point; their screenY decreased by delta and
972
+ // the shift put them at the right place — skipped here, fast
973
+ // path preserved.
974
+ if (dirtyChildren) {
975
+ const edgeTopLocal = edgeTop - contentY
976
+ const edgeBottomLocal = edgeBottom + 1 - contentY
977
+ const spaces = ' '.repeat(w)
978
+ // Track cumulative height change of children iterated so far.
979
+ // A clean child's yogaTop is unchanged iff this is zero (no
980
+ // sibling above it grew/shrank/mounted). When zero, the skip
981
+ // check cached.y−delta === screenY reduces to delta === delta
982
+ // (tautology) → skip without yoga reads. Restores O(dirty)
983
+ // that #24536 traded away: for bottom-append the dirty child
984
+ // is last (all clean children skip); for virtual-scroll range
985
+ // shift the topSpacer shrink + new-item heights self-balance
986
+ // to zero before reaching the clean block. Middle-growth
987
+ // leaves shift non-zero → clean children after the growth
988
+ // point fall through to yoga + the fine-grained check below,
989
+ // preserving the ghost-box fix.
990
+ let cumHeightShift = 0
991
+ for (const childNode of content.childNodes) {
992
+ const childElem = childNode as DOMElement
993
+ const isDirty = dirtyChildren.has(childNode)
994
+ if (!isDirty && cumHeightShift === 0) {
995
+ if (nodeCache.has(childElem)) continue
996
+ // Uncached = culled last frame, now re-entering. blit
997
+ // never painted it → fall through to yoga + render.
998
+ // Height unchanged (clean), so cumHeightShift stays 0.
999
+ }
1000
+ const cy = childElem.yogaNode
1001
+ if (!cy) continue
1002
+ const childTop = cy.getComputedTop()
1003
+ const childH = cy.getComputedHeight()
1004
+ const childBottom = childTop + childH
1005
+ if (isDirty) {
1006
+ const prev = nodeCache.get(childElem)
1007
+ cumHeightShift += childH - (prev ? prev.height : 0)
1008
+ }
1009
+ // Skip culled children (outside viewport)
1010
+ if (
1011
+ childBottom <= scrollTop ||
1012
+ childTop >= scrollTop + innerHeight
1013
+ )
1014
+ continue
1015
+ // Skip children entirely within edge rows (already rendered)
1016
+ if (childTop >= edgeTopLocal && childBottom <= edgeBottomLocal)
1017
+ continue
1018
+ const screenY = Math.floor(contentY + childTop)
1019
+ // Clean children reaching here have cumHeightShift ≠ 0 OR
1020
+ // no cache. Re-check precisely: cached.y − delta is where
1021
+ // the shift left old pixels; if it equals new screenY the
1022
+ // blit is correct (shift re-balanced at this child, or
1023
+ // yogaTop happens to net out). No cache → blit never
1024
+ // painted it → render.
1025
+ if (!isDirty) {
1026
+ const childCached = nodeCache.get(childElem)
1027
+ if (
1028
+ childCached &&
1029
+ Math.floor(childCached.y) - delta === screenY
1030
+ ) {
1031
+ continue
1032
+ }
1033
+ }
1034
+ // Wipe this child's region with spaces to overwrite stale
1035
+ // blitted content — output.clear() only expands damage and
1036
+ // cannot zero cells that the blit already wrote.
1037
+ const screenBottom = Math.min(
1038
+ Math.floor(contentY + childBottom),
1039
+ Math.floor((y1 ?? y) + padTop + innerHeight),
1040
+ )
1041
+ if (screenY < screenBottom) {
1042
+ const fill = Array(screenBottom - screenY)
1043
+ .fill(spaces)
1044
+ .join('\n')
1045
+ output.write(Math.floor(x), screenY, fill)
1046
+ output.clip({
1047
+ x1: undefined,
1048
+ x2: undefined,
1049
+ y1: screenY,
1050
+ y2: screenBottom,
1051
+ })
1052
+ renderNodeToOutput(childElem, output, {
1053
+ offsetX: contentX,
1054
+ offsetY: contentY,
1055
+ prevScreen: undefined,
1056
+ inheritedBackgroundColor: boxBackgroundColor,
1057
+ })
1058
+ output.unclip()
1059
+ }
1060
+ }
1061
+ }
1062
+
1063
+ // Third pass: repair rows where shifted copies of absolute
1064
+ // overlays landed. The blit copied prevScreen cells INCLUDING
1065
+ // overlay pixels (overlays render AFTER this ScrollBox so they
1066
+ // painted into prevScreen's scroll region). After shift, those
1067
+ // pixels sit at (rect.y - delta) — neither edge render nor the
1068
+ // overlay's own re-render covers them. Wipe and re-render
1069
+ // ScrollBox content so the diff writes correct cells.
1070
+ const spaces = absoluteRectsPrev.length ? ' '.repeat(w) : ''
1071
+ for (const r of absoluteRectsPrev) {
1072
+ if (r.y >= bottom + 1 || r.y + r.height <= top) continue
1073
+ const shiftedTop = Math.max(top, Math.floor(r.y) - delta)
1074
+ const shiftedBottom = Math.min(
1075
+ bottom + 1,
1076
+ Math.floor(r.y + r.height) - delta,
1077
+ )
1078
+ // Skip if entirely within edge rows (already rendered).
1079
+ if (shiftedTop >= edgeTop && shiftedBottom <= edgeBottom + 1)
1080
+ continue
1081
+ if (shiftedTop >= shiftedBottom) continue
1082
+ const fill = Array(shiftedBottom - shiftedTop)
1083
+ .fill(spaces)
1084
+ .join('\n')
1085
+ output.write(Math.floor(x), shiftedTop, fill)
1086
+ output.clip({
1087
+ x1: undefined,
1088
+ x2: undefined,
1089
+ y1: shiftedTop,
1090
+ y2: shiftedBottom,
1091
+ })
1092
+ renderScrolledChildren(
1093
+ content,
1094
+ output,
1095
+ contentX,
1096
+ contentY,
1097
+ hasRemovedChild,
1098
+ undefined,
1099
+ shiftedTop - contentY,
1100
+ shiftedBottom - contentY,
1101
+ boxBackgroundColor,
1102
+ true,
1103
+ )
1104
+ output.unclip()
1105
+ }
1106
+ } else {
1107
+ // Full path. Two sub-cases:
1108
+ //
1109
+ // Scrolled without a usable hint (big jump, container moved):
1110
+ // child positions in prevScreen are stale. Clear the viewport
1111
+ // and disable blit so children don't restore shifted content.
1112
+ //
1113
+ // No scroll (spinner tick, content edit): child positions in
1114
+ // prevScreen are still valid. Skip the viewport clear and pass
1115
+ // prevScreen so unchanged children blit. Dirty children already
1116
+ // self-clear via their own cached-rect clear. Without this, a
1117
+ // spinner inside ScrollBox forces a full-content rewrite every
1118
+ // frame — on wide terminals over tmux (no BSU/ESU) the
1119
+ // bandwidth crosses the chunk boundary and the frame tears.
1120
+ const scrolled = contentCached && contentCached.y !== contentY
1121
+ if (scrolled && y1 !== undefined && y2 !== undefined) {
1122
+ output.clear({
1123
+ x: Math.floor(x),
1124
+ y: Math.floor(y1),
1125
+ width: Math.floor(width),
1126
+ height: Math.floor(y2 - y1),
1127
+ })
1128
+ }
1129
+ // positionChanged (ScrollBox height shrunk — pill mount) means a
1130
+ // child spanning the old bottom edge would blit its full cached
1131
+ // rect past the new clip. output.ts clips blits now, but also
1132
+ // disable prevScreen here so the partial-row child re-renders at
1133
+ // correct bounds instead of blitting a clipped (truncated) old
1134
+ // rect.
1135
+ renderScrolledChildren(
1136
+ content,
1137
+ output,
1138
+ contentX,
1139
+ contentY,
1140
+ hasRemovedChild,
1141
+ scrolled || positionChanged ? undefined : prevScreen,
1142
+ scrollTop,
1143
+ scrollTop + innerHeight,
1144
+ boxBackgroundColor,
1145
+ )
1146
+ }
1147
+ nodeCache.set(content, {
1148
+ x: contentX,
1149
+ y: contentY,
1150
+ width: contentYoga.getComputedWidth(),
1151
+ height: contentYoga.getComputedHeight(),
1152
+ })
1153
+ content.dirty = false
1154
+ }
1155
+ } else {
1156
+ // Fill interior with background color before rendering children.
1157
+ // This covers padding areas and empty space; child text inherits
1158
+ // the color via inheritedBackgroundColor so written cells also
1159
+ // get the background.
1160
+ // Disable prevScreen for children: the fill overwrites the entire
1161
+ // interior each render, so child blits from prevScreen would restore
1162
+ // stale cells (wrong bg if it changed) on top of the fresh fill.
1163
+ const ownBackgroundColor = node.style.backgroundColor
1164
+ if (ownBackgroundColor || node.style.opaque) {
1165
+ const borderLeft = yogaNode.getComputedBorder(LayoutEdge.Left)
1166
+ const borderRight = yogaNode.getComputedBorder(LayoutEdge.Right)
1167
+ const borderTop = yogaNode.getComputedBorder(LayoutEdge.Top)
1168
+ const borderBottom = yogaNode.getComputedBorder(LayoutEdge.Bottom)
1169
+ const innerWidth = Math.floor(width) - borderLeft - borderRight
1170
+ const innerHeight = Math.floor(height) - borderTop - borderBottom
1171
+ if (innerWidth > 0 && innerHeight > 0) {
1172
+ const spaces = ' '.repeat(innerWidth)
1173
+ const fillLine = ownBackgroundColor
1174
+ ? applyTextStyles(spaces, { backgroundColor: ownBackgroundColor })
1175
+ : spaces
1176
+ const fill = Array(innerHeight).fill(fillLine).join('\n')
1177
+ output.write(x + borderLeft, y + borderTop, fill)
1178
+ }
1179
+ }
1180
+
1181
+ renderChildren(
1182
+ node,
1183
+ output,
1184
+ x,
1185
+ y,
1186
+ hasRemovedChild,
1187
+ // backgroundColor and opaque both disable child blit: the fill
1188
+ // overwrites the entire interior each render, so any child whose
1189
+ // layout position shifted would blit stale cells from prevScreen
1190
+ // on top of the fresh fill. Previously opaque kept blit enabled
1191
+ // on the assumption that plain-space fill + unchanged children =
1192
+ // valid composite, but children CAN reposition (ScrollBox remeasure
1193
+ // on re-render → /permissions body blanked on Down arrow, #25436).
1194
+ ownBackgroundColor || node.style.opaque ? undefined : prevScreen,
1195
+ boxBackgroundColor,
1196
+ )
1197
+ }
1198
+
1199
+ if (needsClip) {
1200
+ output.unclip()
1201
+ }
1202
+
1203
+ // Render border AFTER children to ensure it's not overwritten by child
1204
+ // clearing operations. When a child shrinks, it clears its old area,
1205
+ // which may overlap with where the parent's border now is.
1206
+ renderBorder(x, y, node, output)
1207
+ } else if (node.nodeName === 'ink-root') {
1208
+ renderChildren(
1209
+ node,
1210
+ output,
1211
+ x,
1212
+ y,
1213
+ hasRemovedChild,
1214
+ prevScreen,
1215
+ inheritedBackgroundColor,
1216
+ )
1217
+ }
1218
+
1219
+ // Cache layout bounds for dirty tracking
1220
+ const rect = { x, y, width, height, top: yogaTop }
1221
+ nodeCache.set(node, rect)
1222
+ if (node.style.position === 'absolute') {
1223
+ absoluteRectsCur.push(rect)
1224
+ }
1225
+ node.dirty = false
1226
+ }
1227
+ }
1228
+
1229
+ // Overflow contamination: content overflows right/down, so clean siblings
1230
+ // AFTER a dirty/removed sibling can contain stale overflow in prevScreen.
1231
+ // Disable blit for siblings after a dirty child — but still pass prevScreen
1232
+ // TO the dirty child itself so its clean descendants can blit. The dirty
1233
+ // child's own blit check already fails (node.dirty=true at line 216), so
1234
+ // passing prevScreen only benefits its subtree.
1235
+ // For removed children we don't know their original position, so
1236
+ // conservatively disable blit for all.
1237
+ //
1238
+ // Clipped children (overflow hidden/scroll on both axes) cannot overflow
1239
+ // onto later siblings — their content is confined to their layout bounds.
1240
+ // Skip the contamination guard for them so later siblings can still blit.
1241
+ // Without this, a spinner inside a ScrollBox dirties the wrapper on every
1242
+ // tick and the bottom prompt section never blits → 100% writes every frame.
1243
+ //
1244
+ // Exception: absolute-positioned clipped children may have layout bounds
1245
+ // that overlap arbitrary siblings, so the clipping does not help.
1246
+ //
1247
+ // Overlap contamination (seenDirtyClipped): a later ABSOLUTE sibling whose
1248
+ // rect sits inside a dirty clipped child's bounds would blit stale cells
1249
+ // from prevScreen — the clipped child just rewrote those cells this frame.
1250
+ // The clipsBothAxes skip only protects against OVERFLOW (clipped child
1251
+ // painting outside its bounds), not overlap (absolute sibling painting
1252
+ // inside them). For non-opaque absolute siblings, skipSelfBlit forces
1253
+ // descent (the full-width rect has transparent gaps → stale blit) while
1254
+ // still passing prevScreen so opaque descendants can blit their narrower
1255
+ // rects (NewMessagesPill's inner Text with backgroundColor). Opaque
1256
+ // absolute siblings fill their entire rect — direct blit is safe.
1257
+ function renderChildren(
1258
+ node: DOMElement,
1259
+ output: Output,
1260
+ offsetX: number,
1261
+ offsetY: number,
1262
+ hasRemovedChild: boolean,
1263
+ prevScreen: Screen | undefined,
1264
+ inheritedBackgroundColor: Color | undefined,
1265
+ ): void {
1266
+ let seenDirtyChild = false
1267
+ let seenDirtyClipped = false
1268
+ for (const childNode of node.childNodes) {
1269
+ const childElem = childNode as DOMElement
1270
+ // Capture dirty before rendering — renderNodeToOutput clears the flag
1271
+ const wasDirty = childElem.dirty
1272
+ const isAbsolute = childElem.style.position === 'absolute'
1273
+ renderNodeToOutput(childElem, output, {
1274
+ offsetX,
1275
+ offsetY,
1276
+ prevScreen: hasRemovedChild || seenDirtyChild ? undefined : prevScreen,
1277
+ // Short-circuits on seenDirtyClipped (false in the common case) so
1278
+ // the opaque/bg reads don't happen per-child per-frame.
1279
+ skipSelfBlit:
1280
+ seenDirtyClipped &&
1281
+ isAbsolute &&
1282
+ !childElem.style.opaque &&
1283
+ childElem.style.backgroundColor === undefined,
1284
+ inheritedBackgroundColor,
1285
+ })
1286
+ if (wasDirty && !seenDirtyChild) {
1287
+ if (!clipsBothAxes(childElem) || isAbsolute) {
1288
+ seenDirtyChild = true
1289
+ } else {
1290
+ seenDirtyClipped = true
1291
+ }
1292
+ }
1293
+ }
1294
+ }
1295
+
1296
+ function clipsBothAxes(node: DOMElement): boolean {
1297
+ const ox = node.style.overflowX ?? node.style.overflow
1298
+ const oy = node.style.overflowY ?? node.style.overflow
1299
+ return (
1300
+ (ox === 'hidden' || ox === 'scroll') && (oy === 'hidden' || oy === 'scroll')
1301
+ )
1302
+ }
1303
+
1304
+ // When Yoga squeezes a box to h=0, the ghost only happens if a sibling
1305
+ // lands at the same computed top — then both write to that row and the
1306
+ // shorter content leaves the longer's tail visible. Yoga's pixel-grid
1307
+ // rounding can give h=0 while still advancing the next sibling's top
1308
+ // (HelpV2's third shortcuts column), so h=0 alone isn't sufficient.
1309
+ function siblingSharesY(node: DOMElement, yogaNode: LayoutNode): boolean {
1310
+ const parent = node.parentNode
1311
+ if (!parent) return false
1312
+ const myTop = yogaNode.getComputedTop()
1313
+ const siblings = parent.childNodes
1314
+ const idx = siblings.indexOf(node)
1315
+ for (let i = idx + 1; i < siblings.length; i++) {
1316
+ const sib = (siblings[i] as DOMElement).yogaNode
1317
+ if (!sib) continue
1318
+ return sib.getComputedTop() === myTop
1319
+ }
1320
+ // No next sibling with a yoga node — check previous. A run of h=0 boxes
1321
+ // at the tail would all share y with each other.
1322
+ for (let i = idx - 1; i >= 0; i--) {
1323
+ const sib = (siblings[i] as DOMElement).yogaNode
1324
+ if (!sib) continue
1325
+ return sib.getComputedTop() === myTop
1326
+ }
1327
+ return false
1328
+ }
1329
+
1330
+ // When a node blits, its absolute-positioned descendants that paint outside
1331
+ // the node's layout bounds are NOT covered by the blit (which only copies
1332
+ // the node's own rect). If a dirty sibling re-rendered and overwrote those
1333
+ // cells, we must re-blit them from prevScreen so the overlays survive.
1334
+ // Example: PromptInputFooter's slash menu uses position='absolute' bottom='100%'
1335
+ // to float above the prompt; a spinner tick in the ScrollBox above re-renders
1336
+ // and overwrites those cells. Without this, the menu vanishes on the next frame.
1337
+ function blitEscapingAbsoluteDescendants(
1338
+ node: DOMElement,
1339
+ output: Output,
1340
+ prevScreen: Screen,
1341
+ px: number,
1342
+ py: number,
1343
+ pw: number,
1344
+ ph: number,
1345
+ ): void {
1346
+ const pr = px + pw
1347
+ const pb = py + ph
1348
+ for (const child of node.childNodes) {
1349
+ if (child.nodeName === '#text') continue
1350
+ const elem = child as DOMElement
1351
+ if (elem.style.position === 'absolute') {
1352
+ const cached = nodeCache.get(elem)
1353
+ if (cached) {
1354
+ absoluteRectsCur.push(cached)
1355
+ const cx = Math.floor(cached.x)
1356
+ const cy = Math.floor(cached.y)
1357
+ const cw = Math.floor(cached.width)
1358
+ const ch = Math.floor(cached.height)
1359
+ // Only blit rects that extend outside the parent's layout bounds —
1360
+ // cells within the parent rect are already covered by the parent blit.
1361
+ if (cx < px || cy < py || cx + cw > pr || cy + ch > pb) {
1362
+ output.blit(prevScreen, cx, cy, cw, ch)
1363
+ }
1364
+ }
1365
+ }
1366
+ // Recurse — absolute descendants can be nested arbitrarily deep
1367
+ blitEscapingAbsoluteDescendants(elem, output, prevScreen, px, py, pw, ph)
1368
+ }
1369
+ }
1370
+
1371
+ // Render children of a scroll container with viewport culling.
1372
+ // scrollTopY..scrollBottomY are the visible window in CHILD-LOCAL Yoga coords
1373
+ // (i.e. what getComputedTop() returns). Children entirely outside this window
1374
+ // are skipped; their nodeCache entry is deleted so if they re-enter the
1375
+ // viewport later they don't emit a stale clear for a position now occupied
1376
+ // by a sibling.
1377
+ function renderScrolledChildren(
1378
+ node: DOMElement,
1379
+ output: Output,
1380
+ offsetX: number,
1381
+ offsetY: number,
1382
+ hasRemovedChild: boolean,
1383
+ prevScreen: Screen | undefined,
1384
+ scrollTopY: number,
1385
+ scrollBottomY: number,
1386
+ inheritedBackgroundColor: Color | undefined,
1387
+ // When true (DECSTBM fast path), culled children keep their cache —
1388
+ // the blit+shift put stable rows in next.screen so stale cache is
1389
+ // never read. Avoids walking O(total_children * subtree_depth) per frame.
1390
+ preserveCulledCache = false,
1391
+ ): void {
1392
+ let seenDirtyChild = false
1393
+ // Track cumulative height shift of dirty children iterated so far. When
1394
+ // zero, a clean child's yogaTop is unchanged (no sibling above it grew),
1395
+ // so cached.top is fresh and the cull check skips yoga. Bottom-append
1396
+ // has the dirty child last → all prior clean children hit cache →
1397
+ // O(dirty) not O(mounted). Middle-growth leaves shift non-zero after
1398
+ // the dirty child → subsequent children yoga-read (needed for correct
1399
+ // culling since their yogaTop shifted).
1400
+ let cumHeightShift = 0
1401
+ for (const childNode of node.childNodes) {
1402
+ const childElem = childNode as DOMElement
1403
+ const cy = childElem.yogaNode
1404
+ if (cy) {
1405
+ const cached = nodeCache.get(childElem)
1406
+ let top: number
1407
+ let height: number
1408
+ if (
1409
+ cached?.top !== undefined &&
1410
+ !childElem.dirty &&
1411
+ cumHeightShift === 0
1412
+ ) {
1413
+ top = cached.top
1414
+ height = cached.height
1415
+ } else {
1416
+ top = cy.getComputedTop()
1417
+ height = cy.getComputedHeight()
1418
+ if (childElem.dirty) {
1419
+ cumHeightShift += height - (cached ? cached.height : 0)
1420
+ }
1421
+ // Refresh cached top so next frame's cumShift===0 path stays
1422
+ // correct. For culled children with preserveCulledCache=true this
1423
+ // is the ONLY refresh point — without it, a middle-growth frame
1424
+ // leaves stale tops that misfire next frame.
1425
+ if (cached) cached.top = top
1426
+ }
1427
+ const bottom = top + height
1428
+ if (bottom <= scrollTopY || top >= scrollBottomY) {
1429
+ // Culled — outside visible window. Drop stale cache entries from
1430
+ // the subtree so when this child re-enters it doesn't fire clears
1431
+ // at positions now occupied by siblings. The viewport-clear on
1432
+ // scroll-change handles the visible-area repaint.
1433
+ if (!preserveCulledCache) dropSubtreeCache(childElem)
1434
+ continue
1435
+ }
1436
+ }
1437
+ const wasDirty = childElem.dirty
1438
+ renderNodeToOutput(childElem, output, {
1439
+ offsetX,
1440
+ offsetY,
1441
+ prevScreen: hasRemovedChild || seenDirtyChild ? undefined : prevScreen,
1442
+ inheritedBackgroundColor,
1443
+ })
1444
+ if (wasDirty) {
1445
+ seenDirtyChild = true
1446
+ }
1447
+ }
1448
+ }
1449
+
1450
+ function dropSubtreeCache(node: DOMElement): void {
1451
+ nodeCache.delete(node)
1452
+ for (const child of node.childNodes) {
1453
+ if (child.nodeName !== '#text') {
1454
+ dropSubtreeCache(child as DOMElement)
1455
+ }
1456
+ }
1457
+ }
1458
+
1459
+ // Exported for testing
1460
+ export { buildCharToSegmentMap, applyStylesToWrappedText }
1461
+
1462
+ export default renderNodeToOutput