ashishcode 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 (1936) hide show
  1. package/README.md +189 -0
  2. package/bun.lock +895 -0
  3. package/package.json +109 -0
  4. package/public/claude-files.png +0 -0
  5. package/public/leak-tweet.png +0 -0
  6. package/scripts/ashishcode.mjs +41 -0
  7. package/scripts/claude-local.mjs +41 -0
  8. package/src/QueryEngine.ts +1295 -0
  9. package/src/Task.ts +125 -0
  10. package/src/Tool.ts +792 -0
  11. package/src/assistant/sessionHistory.ts +87 -0
  12. package/src/bootstrap/state.ts +1758 -0
  13. package/src/bridge/bridgeApi.ts +539 -0
  14. package/src/bridge/bridgeConfig.ts +48 -0
  15. package/src/bridge/bridgeDebug.ts +135 -0
  16. package/src/bridge/bridgeEnabled.ts +203 -0
  17. package/src/bridge/bridgeMain.ts +3000 -0
  18. package/src/bridge/bridgeMessaging.ts +461 -0
  19. package/src/bridge/bridgePermissionCallbacks.ts +43 -0
  20. package/src/bridge/bridgePointer.ts +210 -0
  21. package/src/bridge/bridgeStatusUtil.ts +163 -0
  22. package/src/bridge/bridgeUI.ts +531 -0
  23. package/src/bridge/capacityWake.ts +56 -0
  24. package/src/bridge/codeSessionApi.ts +168 -0
  25. package/src/bridge/createSession.ts +384 -0
  26. package/src/bridge/debugUtils.ts +141 -0
  27. package/src/bridge/envLessBridgeConfig.ts +166 -0
  28. package/src/bridge/flushGate.ts +71 -0
  29. package/src/bridge/inboundAttachments.ts +175 -0
  30. package/src/bridge/inboundMessages.ts +80 -0
  31. package/src/bridge/initReplBridge.ts +569 -0
  32. package/src/bridge/jwtUtils.ts +256 -0
  33. package/src/bridge/pollConfig.ts +110 -0
  34. package/src/bridge/pollConfigDefaults.ts +82 -0
  35. package/src/bridge/remoteBridgeCore.ts +1008 -0
  36. package/src/bridge/replBridge.ts +2407 -0
  37. package/src/bridge/replBridgeHandle.ts +36 -0
  38. package/src/bridge/replBridgeTransport.ts +370 -0
  39. package/src/bridge/sessionIdCompat.ts +57 -0
  40. package/src/bridge/sessionRunner.ts +550 -0
  41. package/src/bridge/trustedDevice.ts +210 -0
  42. package/src/bridge/types.ts +262 -0
  43. package/src/bridge/workSecret.ts +127 -0
  44. package/src/buddy/CompanionSprite.tsx +371 -0
  45. package/src/buddy/companion.ts +133 -0
  46. package/src/buddy/prompt.ts +36 -0
  47. package/src/buddy/sprites.ts +514 -0
  48. package/src/buddy/types.ts +148 -0
  49. package/src/buddy/useBuddyNotification.tsx +98 -0
  50. package/src/cli/exit.ts +31 -0
  51. package/src/cli/handlers/agents.ts +70 -0
  52. package/src/cli/handlers/auth.ts +482 -0
  53. package/src/cli/handlers/autoMode.ts +170 -0
  54. package/src/cli/handlers/mcp.tsx +362 -0
  55. package/src/cli/handlers/plugins.ts +878 -0
  56. package/src/cli/handlers/util.tsx +110 -0
  57. package/src/cli/ndjsonSafeStringify.ts +32 -0
  58. package/src/cli/print.ts +5594 -0
  59. package/src/cli/remoteIO.ts +255 -0
  60. package/src/cli/structuredIO.ts +859 -0
  61. package/src/cli/transports/HybridTransport.ts +282 -0
  62. package/src/cli/transports/SSETransport.ts +711 -0
  63. package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
  64. package/src/cli/transports/WebSocketTransport.ts +800 -0
  65. package/src/cli/transports/WorkerStateUploader.ts +131 -0
  66. package/src/cli/transports/ccrClient.ts +998 -0
  67. package/src/cli/transports/transportUtils.ts +45 -0
  68. package/src/cli/update.ts +423 -0
  69. package/src/commands/add-dir/add-dir.tsx +126 -0
  70. package/src/commands/add-dir/index.ts +11 -0
  71. package/src/commands/add-dir/validation.ts +110 -0
  72. package/src/commands/advisor.ts +109 -0
  73. package/src/commands/agents/agents.tsx +12 -0
  74. package/src/commands/agents/index.ts +10 -0
  75. package/src/commands/ant-trace/index.js +1 -0
  76. package/src/commands/autofix-pr/index.js +1 -0
  77. package/src/commands/backfill-sessions/index.js +1 -0
  78. package/src/commands/branch/branch.ts +296 -0
  79. package/src/commands/branch/index.ts +14 -0
  80. package/src/commands/break-cache/index.js +1 -0
  81. package/src/commands/bridge/bridge.tsx +509 -0
  82. package/src/commands/bridge/index.ts +26 -0
  83. package/src/commands/bridge-kick.ts +200 -0
  84. package/src/commands/brief.ts +130 -0
  85. package/src/commands/btw/btw.tsx +243 -0
  86. package/src/commands/btw/index.ts +13 -0
  87. package/src/commands/bughunter/index.js +1 -0
  88. package/src/commands/chrome/chrome.tsx +285 -0
  89. package/src/commands/chrome/index.ts +13 -0
  90. package/src/commands/clear/caches.ts +144 -0
  91. package/src/commands/clear/clear.ts +7 -0
  92. package/src/commands/clear/conversation.ts +251 -0
  93. package/src/commands/clear/index.ts +19 -0
  94. package/src/commands/color/color.ts +93 -0
  95. package/src/commands/color/index.ts +16 -0
  96. package/src/commands/commit-push-pr.ts +158 -0
  97. package/src/commands/commit.ts +92 -0
  98. package/src/commands/compact/compact.ts +287 -0
  99. package/src/commands/compact/index.ts +15 -0
  100. package/src/commands/config/config.tsx +7 -0
  101. package/src/commands/config/index.ts +11 -0
  102. package/src/commands/context/context-noninteractive.ts +325 -0
  103. package/src/commands/context/context.tsx +64 -0
  104. package/src/commands/context/index.ts +24 -0
  105. package/src/commands/copy/copy.tsx +371 -0
  106. package/src/commands/copy/index.ts +15 -0
  107. package/src/commands/cost/cost.ts +24 -0
  108. package/src/commands/cost/index.ts +23 -0
  109. package/src/commands/createMovedToPluginCommand.ts +65 -0
  110. package/src/commands/ctx_viz/index.js +1 -0
  111. package/src/commands/debug-tool-call/index.js +1 -0
  112. package/src/commands/desktop/desktop.tsx +9 -0
  113. package/src/commands/desktop/index.ts +26 -0
  114. package/src/commands/diff/diff.tsx +9 -0
  115. package/src/commands/diff/index.ts +8 -0
  116. package/src/commands/doctor/doctor.tsx +7 -0
  117. package/src/commands/doctor/index.ts +12 -0
  118. package/src/commands/effort/effort.tsx +183 -0
  119. package/src/commands/effort/index.ts +13 -0
  120. package/src/commands/env/index.js +1 -0
  121. package/src/commands/exit/exit.tsx +33 -0
  122. package/src/commands/exit/index.ts +12 -0
  123. package/src/commands/export/export.tsx +91 -0
  124. package/src/commands/export/index.ts +11 -0
  125. package/src/commands/extra-usage/extra-usage-core.ts +118 -0
  126. package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  127. package/src/commands/extra-usage/extra-usage.tsx +17 -0
  128. package/src/commands/extra-usage/index.ts +31 -0
  129. package/src/commands/fast/fast.tsx +269 -0
  130. package/src/commands/fast/index.ts +26 -0
  131. package/src/commands/feedback/feedback.tsx +25 -0
  132. package/src/commands/feedback/index.ts +28 -0
  133. package/src/commands/files/files.ts +19 -0
  134. package/src/commands/files/index.ts +12 -0
  135. package/src/commands/good-claude/index.js +1 -0
  136. package/src/commands/heapdump/heapdump.ts +17 -0
  137. package/src/commands/heapdump/index.ts +12 -0
  138. package/src/commands/help/help.tsx +11 -0
  139. package/src/commands/help/index.ts +10 -0
  140. package/src/commands/hooks/hooks.tsx +13 -0
  141. package/src/commands/hooks/index.ts +11 -0
  142. package/src/commands/ide/ide.tsx +646 -0
  143. package/src/commands/ide/index.ts +11 -0
  144. package/src/commands/init-verifiers.ts +262 -0
  145. package/src/commands/init.ts +256 -0
  146. package/src/commands/insights.ts +3201 -0
  147. package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
  148. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  149. package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  150. package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  151. package/src/commands/install-github-app/CreatingStep.tsx +65 -0
  152. package/src/commands/install-github-app/ErrorStep.tsx +85 -0
  153. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  154. package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
  155. package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  156. package/src/commands/install-github-app/SuccessStep.tsx +96 -0
  157. package/src/commands/install-github-app/WarningsStep.tsx +73 -0
  158. package/src/commands/install-github-app/index.ts +13 -0
  159. package/src/commands/install-github-app/install-github-app.tsx +587 -0
  160. package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
  161. package/src/commands/install-slack-app/index.ts +12 -0
  162. package/src/commands/install-slack-app/install-slack-app.ts +30 -0
  163. package/src/commands/install.tsx +300 -0
  164. package/src/commands/issue/index.js +1 -0
  165. package/src/commands/keybindings/index.ts +13 -0
  166. package/src/commands/keybindings/keybindings.ts +53 -0
  167. package/src/commands/login/index.ts +14 -0
  168. package/src/commands/login/login.tsx +147 -0
  169. package/src/commands/logout/index.ts +10 -0
  170. package/src/commands/logout/logout.tsx +82 -0
  171. package/src/commands/mcp/addCommand.ts +280 -0
  172. package/src/commands/mcp/index.ts +12 -0
  173. package/src/commands/mcp/mcp.tsx +85 -0
  174. package/src/commands/mcp/xaaIdpCommand.ts +266 -0
  175. package/src/commands/memory/index.ts +10 -0
  176. package/src/commands/memory/memory.tsx +90 -0
  177. package/src/commands/mobile/index.ts +11 -0
  178. package/src/commands/mobile/mobile.tsx +274 -0
  179. package/src/commands/mock-limits/index.js +1 -0
  180. package/src/commands/model/index.ts +16 -0
  181. package/src/commands/model/model.tsx +383 -0
  182. package/src/commands/oauth-refresh/index.js +1 -0
  183. package/src/commands/onboarding/index.js +1 -0
  184. package/src/commands/output-style/index.ts +11 -0
  185. package/src/commands/output-style/output-style.tsx +7 -0
  186. package/src/commands/passes/index.ts +22 -0
  187. package/src/commands/passes/passes.tsx +24 -0
  188. package/src/commands/perf-issue/index.js +1 -0
  189. package/src/commands/permissions/index.ts +11 -0
  190. package/src/commands/permissions/permissions.tsx +10 -0
  191. package/src/commands/plan/index.ts +11 -0
  192. package/src/commands/plan/plan.tsx +122 -0
  193. package/src/commands/plugin/AddMarketplace.tsx +162 -0
  194. package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
  195. package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
  196. package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
  197. package/src/commands/plugin/ManagePlugins.tsx +2215 -0
  198. package/src/commands/plugin/PluginErrors.tsx +124 -0
  199. package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
  200. package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
  201. package/src/commands/plugin/PluginSettings.tsx +1072 -0
  202. package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
  203. package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  204. package/src/commands/plugin/ValidatePlugin.tsx +98 -0
  205. package/src/commands/plugin/index.tsx +11 -0
  206. package/src/commands/plugin/parseArgs.ts +103 -0
  207. package/src/commands/plugin/plugin.tsx +7 -0
  208. package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  209. package/src/commands/plugin/usePagination.ts +171 -0
  210. package/src/commands/pr_comments/index.ts +50 -0
  211. package/src/commands/privacy-settings/index.ts +14 -0
  212. package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
  213. package/src/commands/provider/index.ts +27 -0
  214. package/src/commands/provider/provider.tsx +686 -0
  215. package/src/commands/rate-limit-options/index.ts +19 -0
  216. package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  217. package/src/commands/release-notes/index.ts +11 -0
  218. package/src/commands/release-notes/release-notes.ts +50 -0
  219. package/src/commands/reload-plugins/index.ts +18 -0
  220. package/src/commands/reload-plugins/reload-plugins.ts +61 -0
  221. package/src/commands/remote-env/index.ts +15 -0
  222. package/src/commands/remote-env/remote-env.tsx +7 -0
  223. package/src/commands/remote-setup/api.ts +182 -0
  224. package/src/commands/remote-setup/index.ts +20 -0
  225. package/src/commands/remote-setup/remote-setup.tsx +187 -0
  226. package/src/commands/rename/generateSessionName.ts +67 -0
  227. package/src/commands/rename/index.ts +12 -0
  228. package/src/commands/rename/rename.ts +87 -0
  229. package/src/commands/reset-limits/index.js +4 -0
  230. package/src/commands/resume/index.ts +12 -0
  231. package/src/commands/resume/resume.tsx +275 -0
  232. package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
  233. package/src/commands/review/reviewRemote.ts +316 -0
  234. package/src/commands/review/ultrareviewCommand.tsx +58 -0
  235. package/src/commands/review/ultrareviewEnabled.ts +14 -0
  236. package/src/commands/review.ts +57 -0
  237. package/src/commands/rewind/index.ts +13 -0
  238. package/src/commands/rewind/rewind.ts +13 -0
  239. package/src/commands/sandbox-toggle/index.ts +50 -0
  240. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  241. package/src/commands/security-review.ts +243 -0
  242. package/src/commands/session/index.ts +16 -0
  243. package/src/commands/session/session.tsx +140 -0
  244. package/src/commands/share/index.js +1 -0
  245. package/src/commands/skills/index.ts +10 -0
  246. package/src/commands/skills/skills.tsx +8 -0
  247. package/src/commands/stats/index.ts +10 -0
  248. package/src/commands/stats/stats.tsx +7 -0
  249. package/src/commands/status/index.ts +12 -0
  250. package/src/commands/status/status.tsx +8 -0
  251. package/src/commands/statusline.tsx +24 -0
  252. package/src/commands/stickers/index.ts +11 -0
  253. package/src/commands/stickers/stickers.ts +16 -0
  254. package/src/commands/summary/index.js +1 -0
  255. package/src/commands/tag/index.ts +12 -0
  256. package/src/commands/tag/tag.tsx +215 -0
  257. package/src/commands/tasks/index.ts +11 -0
  258. package/src/commands/tasks/tasks.tsx +8 -0
  259. package/src/commands/teleport/index.js +1 -0
  260. package/src/commands/terminalSetup/index.ts +23 -0
  261. package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
  262. package/src/commands/theme/index.ts +10 -0
  263. package/src/commands/theme/theme.tsx +57 -0
  264. package/src/commands/thinkback/index.ts +13 -0
  265. package/src/commands/thinkback/thinkback.tsx +554 -0
  266. package/src/commands/thinkback-play/index.ts +17 -0
  267. package/src/commands/thinkback-play/thinkback-play.ts +43 -0
  268. package/src/commands/ultraplan.tsx +471 -0
  269. package/src/commands/upgrade/index.ts +16 -0
  270. package/src/commands/upgrade/upgrade.tsx +38 -0
  271. package/src/commands/usage/index.ts +9 -0
  272. package/src/commands/usage/usage.tsx +7 -0
  273. package/src/commands/version.ts +24 -0
  274. package/src/commands/vim/index.ts +11 -0
  275. package/src/commands/vim/vim.ts +38 -0
  276. package/src/commands/voice/index.ts +20 -0
  277. package/src/commands/voice/voice.ts +150 -0
  278. package/src/commands.ts +756 -0
  279. package/src/components/AgentProgressLine.tsx +136 -0
  280. package/src/components/App.tsx +56 -0
  281. package/src/components/ApproveApiKey.tsx +123 -0
  282. package/src/components/AutoModeOptInDialog.tsx +142 -0
  283. package/src/components/AutoUpdater.tsx +199 -0
  284. package/src/components/AutoUpdaterWrapper.tsx +91 -0
  285. package/src/components/AwsAuthStatusBox.tsx +82 -0
  286. package/src/components/BaseTextInput.tsx +136 -0
  287. package/src/components/BashModeProgress.tsx +56 -0
  288. package/src/components/BridgeDialog.tsx +401 -0
  289. package/src/components/BypassPermissionsModeDialog.tsx +87 -0
  290. package/src/components/ChannelDowngradeDialog.tsx +102 -0
  291. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  292. package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
  293. package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  294. package/src/components/ClickableImageRef.tsx +73 -0
  295. package/src/components/CompactSummary.tsx +118 -0
  296. package/src/components/ConfigurableShortcutHint.tsx +57 -0
  297. package/src/components/ConsoleOAuthFlow.tsx +631 -0
  298. package/src/components/ContextSuggestions.tsx +47 -0
  299. package/src/components/ContextVisualization.tsx +489 -0
  300. package/src/components/CoordinatorAgentStatus.tsx +273 -0
  301. package/src/components/CostThresholdDialog.tsx +50 -0
  302. package/src/components/CtrlOToExpand.tsx +51 -0
  303. package/src/components/CustomSelect/SelectMulti.tsx +213 -0
  304. package/src/components/CustomSelect/index.ts +3 -0
  305. package/src/components/CustomSelect/option-map.ts +50 -0
  306. package/src/components/CustomSelect/select-input-option.tsx +488 -0
  307. package/src/components/CustomSelect/select-option.tsx +68 -0
  308. package/src/components/CustomSelect/select.tsx +690 -0
  309. package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
  310. package/src/components/CustomSelect/use-select-input.ts +287 -0
  311. package/src/components/CustomSelect/use-select-navigation.ts +653 -0
  312. package/src/components/CustomSelect/use-select-state.ts +157 -0
  313. package/src/components/DesktopHandoff.tsx +193 -0
  314. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  315. package/src/components/DevBar.tsx +49 -0
  316. package/src/components/DevChannelsDialog.tsx +105 -0
  317. package/src/components/DiagnosticsDisplay.tsx +95 -0
  318. package/src/components/EffortCallout.tsx +265 -0
  319. package/src/components/EffortIndicator.ts +42 -0
  320. package/src/components/ExitFlow.tsx +48 -0
  321. package/src/components/ExportDialog.tsx +128 -0
  322. package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
  323. package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
  324. package/src/components/FastIcon.tsx +46 -0
  325. package/src/components/Feedback.tsx +593 -0
  326. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  327. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  328. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  329. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +113 -0
  330. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  331. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  332. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  333. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  334. package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  335. package/src/components/FileEditToolDiff.tsx +181 -0
  336. package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
  337. package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
  338. package/src/components/FilePathLink.tsx +43 -0
  339. package/src/components/FullscreenLayout.tsx +637 -0
  340. package/src/components/GlobalSearchDialog.tsx +343 -0
  341. package/src/components/HelpV2/Commands.tsx +82 -0
  342. package/src/components/HelpV2/General.tsx +23 -0
  343. package/src/components/HelpV2/HelpV2.tsx +185 -0
  344. package/src/components/HighlightedCode/Fallback.tsx +193 -0
  345. package/src/components/HighlightedCode.tsx +190 -0
  346. package/src/components/HistorySearchDialog.tsx +118 -0
  347. package/src/components/IdeAutoConnectDialog.tsx +154 -0
  348. package/src/components/IdeOnboardingDialog.tsx +167 -0
  349. package/src/components/IdeStatusIndicator.tsx +58 -0
  350. package/src/components/IdleReturnDialog.tsx +118 -0
  351. package/src/components/InterruptedByUser.tsx +15 -0
  352. package/src/components/InvalidConfigDialog.tsx +156 -0
  353. package/src/components/InvalidSettingsDialog.tsx +89 -0
  354. package/src/components/KeybindingWarnings.tsx +55 -0
  355. package/src/components/LanguagePicker.tsx +86 -0
  356. package/src/components/LogSelector.tsx +1575 -0
  357. package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  358. package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
  359. package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
  360. package/src/components/LogoV2/Clawd.tsx +238 -0
  361. package/src/components/LogoV2/CondensedLogo.tsx +161 -0
  362. package/src/components/LogoV2/EmergencyTip.tsx +58 -0
  363. package/src/components/LogoV2/Feed.tsx +112 -0
  364. package/src/components/LogoV2/FeedColumn.tsx +59 -0
  365. package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  366. package/src/components/LogoV2/LogoV2.tsx +544 -0
  367. package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  368. package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  369. package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
  370. package/src/components/LogoV2/WelcomeV2.tsx +434 -0
  371. package/src/components/LogoV2/feedConfigs.tsx +92 -0
  372. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  373. package/src/components/MCPServerApprovalDialog.tsx +115 -0
  374. package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
  375. package/src/components/MCPServerDialogCopy.tsx +15 -0
  376. package/src/components/MCPServerMultiselectDialog.tsx +133 -0
  377. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  378. package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  379. package/src/components/Markdown.tsx +236 -0
  380. package/src/components/MarkdownTable.tsx +322 -0
  381. package/src/components/MemoryUsageIndicator.tsx +37 -0
  382. package/src/components/Message.tsx +627 -0
  383. package/src/components/MessageModel.tsx +43 -0
  384. package/src/components/MessageResponse.tsx +78 -0
  385. package/src/components/MessageRow.tsx +383 -0
  386. package/src/components/MessageSelector.tsx +831 -0
  387. package/src/components/MessageTimestamp.tsx +63 -0
  388. package/src/components/Messages.tsx +834 -0
  389. package/src/components/ModelPicker.tsx +458 -0
  390. package/src/components/NativeAutoUpdater.tsx +194 -0
  391. package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  392. package/src/components/OffscreenFreeze.tsx +44 -0
  393. package/src/components/Onboarding.tsx +635 -0
  394. package/src/components/OutputStylePicker.tsx +112 -0
  395. package/src/components/PackageManagerAutoUpdater.tsx +105 -0
  396. package/src/components/Passes/Passes.tsx +184 -0
  397. package/src/components/PrBadge.tsx +97 -0
  398. package/src/components/PressEnterToContinue.tsx +15 -0
  399. package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
  400. package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
  401. package/src/components/PromptInput/Notifications.tsx +332 -0
  402. package/src/components/PromptInput/PromptInput.tsx +2366 -0
  403. package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
  404. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  405. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  406. package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  407. package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  408. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  409. package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  410. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  411. package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
  412. package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
  413. package/src/components/PromptInput/inputModes.ts +33 -0
  414. package/src/components/PromptInput/inputPaste.ts +90 -0
  415. package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  416. package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  417. package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
  418. package/src/components/PromptInput/useSwarmBanner.ts +155 -0
  419. package/src/components/PromptInput/utils.ts +60 -0
  420. package/src/components/ProviderPicker.tsx +111 -0
  421. package/src/components/QuickOpenDialog.tsx +244 -0
  422. package/src/components/RemoteCallout.tsx +76 -0
  423. package/src/components/RemoteEnvironmentDialog.tsx +340 -0
  424. package/src/components/ResumeTask.tsx +268 -0
  425. package/src/components/SandboxViolationExpandedView.tsx +99 -0
  426. package/src/components/ScrollKeybindingHandler.tsx +1012 -0
  427. package/src/components/SearchBox.tsx +72 -0
  428. package/src/components/SentryErrorBoundary.ts +28 -0
  429. package/src/components/SessionBackgroundHint.tsx +108 -0
  430. package/src/components/SessionPreview.tsx +194 -0
  431. package/src/components/Settings/Config.tsx +1903 -0
  432. package/src/components/Settings/Settings.tsx +137 -0
  433. package/src/components/Settings/Status.tsx +242 -0
  434. package/src/components/Settings/Usage.tsx +377 -0
  435. package/src/components/ShowInIDEPrompt.tsx +170 -0
  436. package/src/components/SkillImprovementSurvey.tsx +152 -0
  437. package/src/components/Spinner/FlashingChar.tsx +61 -0
  438. package/src/components/Spinner/GlimmerMessage.tsx +328 -0
  439. package/src/components/Spinner/ShimmerChar.tsx +36 -0
  440. package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  441. package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
  442. package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  443. package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  444. package/src/components/Spinner/index.ts +10 -0
  445. package/src/components/Spinner/teammateSelectHint.ts +1 -0
  446. package/src/components/Spinner/useShimmerAnimation.ts +31 -0
  447. package/src/components/Spinner/useStalledAnimation.ts +75 -0
  448. package/src/components/Spinner/utils.ts +84 -0
  449. package/src/components/Spinner.tsx +562 -0
  450. package/src/components/Stats.tsx +1228 -0
  451. package/src/components/StatusLine.tsx +325 -0
  452. package/src/components/StatusNotices.tsx +55 -0
  453. package/src/components/StructuredDiff/Fallback.tsx +487 -0
  454. package/src/components/StructuredDiff/colorDiff.ts +37 -0
  455. package/src/components/StructuredDiff.tsx +190 -0
  456. package/src/components/StructuredDiffList.tsx +30 -0
  457. package/src/components/TagTabs.tsx +139 -0
  458. package/src/components/TaskListV2.tsx +378 -0
  459. package/src/components/TeammateViewHeader.tsx +82 -0
  460. package/src/components/TeleportError.tsx +189 -0
  461. package/src/components/TeleportProgress.tsx +140 -0
  462. package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
  463. package/src/components/TeleportResumeWrapper.tsx +167 -0
  464. package/src/components/TeleportStash.tsx +116 -0
  465. package/src/components/TextInput.tsx +124 -0
  466. package/src/components/ThemePicker.tsx +333 -0
  467. package/src/components/ThinkingToggle.tsx +153 -0
  468. package/src/components/TokenWarning.tsx +179 -0
  469. package/src/components/ToolUseLoader.tsx +42 -0
  470. package/src/components/TrustDialog/TrustDialog.tsx +290 -0
  471. package/src/components/TrustDialog/utils.ts +245 -0
  472. package/src/components/ValidationErrorsList.tsx +148 -0
  473. package/src/components/VimTextInput.tsx +140 -0
  474. package/src/components/VirtualMessageList.tsx +1082 -0
  475. package/src/components/WorkflowMultiselectDialog.tsx +128 -0
  476. package/src/components/WorktreeExitDialog.tsx +231 -0
  477. package/src/components/agents/AgentDetail.tsx +220 -0
  478. package/src/components/agents/AgentEditor.tsx +178 -0
  479. package/src/components/agents/AgentNavigationFooter.tsx +26 -0
  480. package/src/components/agents/AgentsList.tsx +440 -0
  481. package/src/components/agents/AgentsMenu.tsx +800 -0
  482. package/src/components/agents/ColorPicker.tsx +112 -0
  483. package/src/components/agents/ModelSelector.tsx +68 -0
  484. package/src/components/agents/ToolSelector.tsx +568 -0
  485. package/src/components/agents/agentFileUtils.ts +272 -0
  486. package/src/components/agents/generateAgent.ts +197 -0
  487. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  488. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  489. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  490. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  491. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  492. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  493. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  494. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  495. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  496. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  497. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  498. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  499. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  500. package/src/components/agents/types.ts +27 -0
  501. package/src/components/agents/utils.ts +18 -0
  502. package/src/components/agents/validateAgent.ts +109 -0
  503. package/src/components/design-system/Byline.tsx +77 -0
  504. package/src/components/design-system/Dialog.tsx +138 -0
  505. package/src/components/design-system/Divider.tsx +149 -0
  506. package/src/components/design-system/FuzzyPicker.tsx +312 -0
  507. package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
  508. package/src/components/design-system/ListItem.tsx +244 -0
  509. package/src/components/design-system/LoadingState.tsx +94 -0
  510. package/src/components/design-system/Pane.tsx +77 -0
  511. package/src/components/design-system/ProgressBar.tsx +86 -0
  512. package/src/components/design-system/Ratchet.tsx +80 -0
  513. package/src/components/design-system/StatusIcon.tsx +95 -0
  514. package/src/components/design-system/Tabs.tsx +340 -0
  515. package/src/components/design-system/ThemeProvider.tsx +170 -0
  516. package/src/components/design-system/ThemedBox.tsx +156 -0
  517. package/src/components/design-system/ThemedText.tsx +124 -0
  518. package/src/components/design-system/color.ts +30 -0
  519. package/src/components/diff/DiffDetailView.tsx +281 -0
  520. package/src/components/diff/DiffDialog.tsx +383 -0
  521. package/src/components/diff/DiffFileList.tsx +292 -0
  522. package/src/components/grove/Grove.tsx +463 -0
  523. package/src/components/hooks/HooksConfigMenu.tsx +578 -0
  524. package/src/components/hooks/PromptDialog.tsx +90 -0
  525. package/src/components/hooks/SelectEventMode.tsx +127 -0
  526. package/src/components/hooks/SelectHookMode.tsx +112 -0
  527. package/src/components/hooks/SelectMatcherMode.tsx +144 -0
  528. package/src/components/hooks/ViewHookMode.tsx +199 -0
  529. package/src/components/mcp/CapabilitiesSection.tsx +61 -0
  530. package/src/components/mcp/ElicitationDialog.tsx +1169 -0
  531. package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
  532. package/src/components/mcp/MCPListPanel.tsx +504 -0
  533. package/src/components/mcp/MCPReconnect.tsx +167 -0
  534. package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  535. package/src/components/mcp/MCPSettings.tsx +398 -0
  536. package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  537. package/src/components/mcp/MCPToolDetailView.tsx +212 -0
  538. package/src/components/mcp/MCPToolListView.tsx +141 -0
  539. package/src/components/mcp/McpParsingWarnings.tsx +213 -0
  540. package/src/components/mcp/index.ts +9 -0
  541. package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
  542. package/src/components/memory/MemoryFileSelector.tsx +438 -0
  543. package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
  544. package/src/components/messageActions.tsx +450 -0
  545. package/src/components/messages/AdvisorMessage.tsx +158 -0
  546. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  547. package/src/components/messages/AssistantTextMessage.tsx +270 -0
  548. package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
  549. package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
  550. package/src/components/messages/AttachmentMessage.tsx +536 -0
  551. package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  552. package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
  553. package/src/components/messages/GroupedToolUseContent.tsx +58 -0
  554. package/src/components/messages/HighlightedThinkingText.tsx +162 -0
  555. package/src/components/messages/HookProgressMessage.tsx +116 -0
  556. package/src/components/messages/PlanApprovalMessage.tsx +222 -0
  557. package/src/components/messages/RateLimitMessage.tsx +161 -0
  558. package/src/components/messages/ShutdownMessage.tsx +132 -0
  559. package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
  560. package/src/components/messages/SystemTextMessage.tsx +827 -0
  561. package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
  562. package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
  563. package/src/components/messages/UserBashInputMessage.tsx +58 -0
  564. package/src/components/messages/UserBashOutputMessage.tsx +54 -0
  565. package/src/components/messages/UserChannelMessage.tsx +137 -0
  566. package/src/components/messages/UserCommandMessage.tsx +108 -0
  567. package/src/components/messages/UserImageMessage.tsx +59 -0
  568. package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  569. package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
  570. package/src/components/messages/UserPlanMessage.tsx +42 -0
  571. package/src/components/messages/UserPromptMessage.tsx +80 -0
  572. package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  573. package/src/components/messages/UserTeammateMessage.tsx +206 -0
  574. package/src/components/messages/UserTextMessage.tsx +275 -0
  575. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  576. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  577. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  578. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  579. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  580. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  581. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  582. package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
  583. package/src/components/messages/nullRenderingAttachments.ts +70 -0
  584. package/src/components/messages/teamMemCollapsed.tsx +140 -0
  585. package/src/components/messages/teamMemSaved.ts +19 -0
  586. package/src/components/modelPickerHelpers.test.ts +74 -0
  587. package/src/components/modelPickerHelpers.ts +67 -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 +915 -0
  685. package/src/constants/spinnerVerbs.ts +204 -0
  686. package/src/constants/system.ts +96 -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 +327 -0
  708. package/src/entrypoints/init.ts +340 -0
  709. package/src/entrypoints/mcp.ts +197 -0
  710. package/src/entrypoints/sandboxTypes.ts +156 -0
  711. package/src/entrypoints/sdk/controlSchemas.ts +663 -0
  712. package/src/entrypoints/sdk/controlTypes.ts +87 -0
  713. package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
  714. package/src/entrypoints/sdk/coreTypes.generated.ts +255 -0
  715. package/src/entrypoints/sdk/coreTypes.ts +62 -0
  716. package/src/entrypoints/sdk/runtimeTypes.ts +29 -0
  717. package/src/entrypoints/sdk/settingsTypes.generated.ts +5 -0
  718. package/src/entrypoints/sdk/toolTypes.ts +5 -0
  719. package/src/history.ts +464 -0
  720. package/src/hooks/fileSuggestions.ts +811 -0
  721. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  722. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  723. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  724. package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
  725. package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  726. package/src/hooks/notifs/useInstallMessages.tsx +26 -0
  727. package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  728. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  729. package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  730. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  731. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  732. package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  733. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  734. package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
  735. package/src/hooks/notifs/useStartupNotification.ts +41 -0
  736. package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  737. package/src/hooks/renderPlaceholder.ts +51 -0
  738. package/src/hooks/toolPermission/PermissionContext.ts +388 -0
  739. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  740. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  741. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  742. package/src/hooks/toolPermission/permissionLogging.ts +238 -0
  743. package/src/hooks/unifiedSuggestions.ts +202 -0
  744. package/src/hooks/useAfterFirstRender.ts +17 -0
  745. package/src/hooks/useApiKeyVerification.ts +84 -0
  746. package/src/hooks/useArrowKeyHistory.tsx +229 -0
  747. package/src/hooks/useAssistantHistory.ts +250 -0
  748. package/src/hooks/useAwaySummary.ts +125 -0
  749. package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
  750. package/src/hooks/useBlink.ts +34 -0
  751. package/src/hooks/useCanUseTool.tsx +204 -0
  752. package/src/hooks/useCancelRequest.ts +276 -0
  753. package/src/hooks/useChromeExtensionNotification.tsx +50 -0
  754. package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  755. package/src/hooks/useClipboardImageHint.ts +77 -0
  756. package/src/hooks/useCommandKeybindings.tsx +108 -0
  757. package/src/hooks/useCommandQueue.ts +15 -0
  758. package/src/hooks/useCopyOnSelect.ts +98 -0
  759. package/src/hooks/useDeferredHookMessages.ts +46 -0
  760. package/src/hooks/useDiffData.ts +110 -0
  761. package/src/hooks/useDiffInIDE.ts +379 -0
  762. package/src/hooks/useDirectConnect.ts +229 -0
  763. package/src/hooks/useDoublePress.ts +62 -0
  764. package/src/hooks/useDynamicConfig.ts +22 -0
  765. package/src/hooks/useElapsedTime.ts +37 -0
  766. package/src/hooks/useExitOnCtrlCD.ts +95 -0
  767. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  768. package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
  769. package/src/hooks/useGlobalKeybindings.tsx +249 -0
  770. package/src/hooks/useHistorySearch.ts +303 -0
  771. package/src/hooks/useIDEIntegration.tsx +70 -0
  772. package/src/hooks/useIdeAtMentioned.ts +76 -0
  773. package/src/hooks/useIdeConnectionStatus.ts +33 -0
  774. package/src/hooks/useIdeLogging.ts +41 -0
  775. package/src/hooks/useIdeSelection.ts +150 -0
  776. package/src/hooks/useInboxPoller.ts +969 -0
  777. package/src/hooks/useInputBuffer.ts +132 -0
  778. package/src/hooks/useIssueFlagBanner.ts +133 -0
  779. package/src/hooks/useLogMessages.ts +119 -0
  780. package/src/hooks/useLspPluginRecommendation.tsx +194 -0
  781. package/src/hooks/useMailboxBridge.ts +21 -0
  782. package/src/hooks/useMainLoopModel.ts +34 -0
  783. package/src/hooks/useManagePlugins.ts +304 -0
  784. package/src/hooks/useMemoryUsage.ts +39 -0
  785. package/src/hooks/useMergedClients.ts +23 -0
  786. package/src/hooks/useMergedCommands.ts +15 -0
  787. package/src/hooks/useMergedTools.ts +44 -0
  788. package/src/hooks/useMinDisplayTime.ts +35 -0
  789. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  790. package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  791. package/src/hooks/usePasteHandler.ts +285 -0
  792. package/src/hooks/usePluginRecommendationBase.tsx +105 -0
  793. package/src/hooks/usePrStatus.ts +106 -0
  794. package/src/hooks/usePromptSuggestion.ts +177 -0
  795. package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  796. package/src/hooks/useQueueProcessor.ts +68 -0
  797. package/src/hooks/useRemoteSession.ts +605 -0
  798. package/src/hooks/useReplBridge.tsx +723 -0
  799. package/src/hooks/useSSHSession.ts +241 -0
  800. package/src/hooks/useScheduledTasks.ts +139 -0
  801. package/src/hooks/useSearchInput.ts +364 -0
  802. package/src/hooks/useSessionBackgrounding.ts +158 -0
  803. package/src/hooks/useSettings.ts +17 -0
  804. package/src/hooks/useSettingsChange.ts +25 -0
  805. package/src/hooks/useSkillImprovementSurvey.ts +105 -0
  806. package/src/hooks/useSkillsChange.ts +62 -0
  807. package/src/hooks/useSwarmInitialization.ts +81 -0
  808. package/src/hooks/useSwarmPermissionPoller.ts +330 -0
  809. package/src/hooks/useTaskListWatcher.ts +221 -0
  810. package/src/hooks/useTasksV2.ts +250 -0
  811. package/src/hooks/useTeammateViewAutoExit.ts +63 -0
  812. package/src/hooks/useTeleportResume.tsx +85 -0
  813. package/src/hooks/useTerminalSize.ts +15 -0
  814. package/src/hooks/useTextInput.ts +529 -0
  815. package/src/hooks/useTimeout.ts +14 -0
  816. package/src/hooks/useTurnDiffs.ts +213 -0
  817. package/src/hooks/useTypeahead.tsx +1385 -0
  818. package/src/hooks/useUpdateNotification.ts +35 -0
  819. package/src/hooks/useVimInput.ts +316 -0
  820. package/src/hooks/useVirtualScroll.ts +721 -0
  821. package/src/hooks/useVoice.ts +1144 -0
  822. package/src/hooks/useVoiceEnabled.ts +25 -0
  823. package/src/hooks/useVoiceIntegration.tsx +677 -0
  824. package/src/ink/Ansi.tsx +292 -0
  825. package/src/ink/bidi.ts +139 -0
  826. package/src/ink/clearTerminal.ts +74 -0
  827. package/src/ink/colorize.ts +231 -0
  828. package/src/ink/components/AlternateScreen.tsx +80 -0
  829. package/src/ink/components/App.tsx +658 -0
  830. package/src/ink/components/AppContext.ts +21 -0
  831. package/src/ink/components/Box.tsx +214 -0
  832. package/src/ink/components/Button.tsx +192 -0
  833. package/src/ink/components/ClockContext.tsx +112 -0
  834. package/src/ink/components/CursorDeclarationContext.ts +32 -0
  835. package/src/ink/components/ErrorOverview.tsx +109 -0
  836. package/src/ink/components/Link.tsx +42 -0
  837. package/src/ink/components/Newline.tsx +39 -0
  838. package/src/ink/components/NoSelect.tsx +68 -0
  839. package/src/ink/components/RawAnsi.tsx +57 -0
  840. package/src/ink/components/ScrollBox.tsx +237 -0
  841. package/src/ink/components/Spacer.tsx +20 -0
  842. package/src/ink/components/StdinContext.ts +49 -0
  843. package/src/ink/components/TerminalFocusContext.tsx +52 -0
  844. package/src/ink/components/TerminalSizeContext.tsx +7 -0
  845. package/src/ink/components/Text.tsx +254 -0
  846. package/src/ink/constants.ts +2 -0
  847. package/src/ink/dom.ts +484 -0
  848. package/src/ink/events/click-event.ts +38 -0
  849. package/src/ink/events/dispatcher.ts +233 -0
  850. package/src/ink/events/emitter.ts +39 -0
  851. package/src/ink/events/event-handlers.ts +73 -0
  852. package/src/ink/events/event.ts +11 -0
  853. package/src/ink/events/focus-event.ts +21 -0
  854. package/src/ink/events/input-event.ts +205 -0
  855. package/src/ink/events/keyboard-event.ts +51 -0
  856. package/src/ink/events/terminal-event.ts +107 -0
  857. package/src/ink/events/terminal-focus-event.ts +19 -0
  858. package/src/ink/focus.ts +181 -0
  859. package/src/ink/frame.ts +124 -0
  860. package/src/ink/get-max-width.ts +27 -0
  861. package/src/ink/global.ts +2 -0
  862. package/src/ink/hit-test.ts +130 -0
  863. package/src/ink/hooks/use-animation-frame.ts +57 -0
  864. package/src/ink/hooks/use-app.ts +8 -0
  865. package/src/ink/hooks/use-declared-cursor.ts +73 -0
  866. package/src/ink/hooks/use-input.ts +92 -0
  867. package/src/ink/hooks/use-interval.ts +67 -0
  868. package/src/ink/hooks/use-search-highlight.ts +53 -0
  869. package/src/ink/hooks/use-selection.ts +104 -0
  870. package/src/ink/hooks/use-stdin.ts +8 -0
  871. package/src/ink/hooks/use-tab-status.ts +72 -0
  872. package/src/ink/hooks/use-terminal-focus.ts +16 -0
  873. package/src/ink/hooks/use-terminal-title.ts +31 -0
  874. package/src/ink/hooks/use-terminal-viewport.ts +96 -0
  875. package/src/ink/ink.tsx +1723 -0
  876. package/src/ink/instances.ts +10 -0
  877. package/src/ink/layout/engine.ts +6 -0
  878. package/src/ink/layout/geometry.ts +97 -0
  879. package/src/ink/layout/node.ts +152 -0
  880. package/src/ink/layout/yoga.ts +308 -0
  881. package/src/ink/line-width-cache.ts +24 -0
  882. package/src/ink/log-update.ts +773 -0
  883. package/src/ink/measure-element.ts +23 -0
  884. package/src/ink/measure-text.ts +47 -0
  885. package/src/ink/node-cache.ts +54 -0
  886. package/src/ink/optimizer.ts +93 -0
  887. package/src/ink/output.ts +797 -0
  888. package/src/ink/parse-keypress.ts +801 -0
  889. package/src/ink/reconciler.ts +512 -0
  890. package/src/ink/render-border.ts +231 -0
  891. package/src/ink/render-node-to-output.ts +1462 -0
  892. package/src/ink/render-to-screen.ts +231 -0
  893. package/src/ink/renderer.ts +178 -0
  894. package/src/ink/root.ts +184 -0
  895. package/src/ink/screen.ts +1486 -0
  896. package/src/ink/searchHighlight.ts +93 -0
  897. package/src/ink/selection.ts +917 -0
  898. package/src/ink/squash-text-nodes.ts +92 -0
  899. package/src/ink/stringWidth.ts +222 -0
  900. package/src/ink/styles.ts +771 -0
  901. package/src/ink/supports-hyperlinks.ts +57 -0
  902. package/src/ink/tabstops.ts +46 -0
  903. package/src/ink/terminal-focus-state.ts +47 -0
  904. package/src/ink/terminal-querier.ts +212 -0
  905. package/src/ink/terminal.ts +248 -0
  906. package/src/ink/termio/ansi.ts +75 -0
  907. package/src/ink/termio/csi.ts +319 -0
  908. package/src/ink/termio/dec.ts +60 -0
  909. package/src/ink/termio/esc.ts +67 -0
  910. package/src/ink/termio/osc.ts +493 -0
  911. package/src/ink/termio/parser.ts +394 -0
  912. package/src/ink/termio/sgr.ts +308 -0
  913. package/src/ink/termio/tokenize.ts +319 -0
  914. package/src/ink/termio/types.ts +236 -0
  915. package/src/ink/termio.ts +42 -0
  916. package/src/ink/useTerminalNotification.ts +126 -0
  917. package/src/ink/warn.ts +9 -0
  918. package/src/ink/widest-line.ts +19 -0
  919. package/src/ink/wrap-text.ts +74 -0
  920. package/src/ink/wrapAnsi.ts +20 -0
  921. package/src/ink.ts +85 -0
  922. package/src/interactiveHelpers.tsx +367 -0
  923. package/src/keybindings/KeybindingContext.tsx +243 -0
  924. package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
  925. package/src/keybindings/defaultBindings.ts +340 -0
  926. package/src/keybindings/loadUserBindings.ts +472 -0
  927. package/src/keybindings/match.ts +120 -0
  928. package/src/keybindings/parser.ts +203 -0
  929. package/src/keybindings/reservedShortcuts.ts +127 -0
  930. package/src/keybindings/resolver.ts +244 -0
  931. package/src/keybindings/schema.ts +236 -0
  932. package/src/keybindings/shortcutFormat.ts +63 -0
  933. package/src/keybindings/template.ts +52 -0
  934. package/src/keybindings/useKeybinding.ts +196 -0
  935. package/src/keybindings/useShortcutDisplay.ts +59 -0
  936. package/src/keybindings/validate.ts +498 -0
  937. package/src/main.tsx +4756 -0
  938. package/src/memdir/findRelevantMemories.ts +141 -0
  939. package/src/memdir/memdir.ts +507 -0
  940. package/src/memdir/memoryAge.ts +53 -0
  941. package/src/memdir/memoryScan.ts +94 -0
  942. package/src/memdir/memoryTypes.ts +271 -0
  943. package/src/memdir/paths.ts +278 -0
  944. package/src/memdir/teamMemPaths.ts +292 -0
  945. package/src/memdir/teamMemPrompts.ts +100 -0
  946. package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  947. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  948. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  949. package/src/migrations/migrateFennecToOpus.ts +45 -0
  950. package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  951. package/src/migrations/migrateOpusToOpus1m.ts +43 -0
  952. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  953. package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  954. package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  955. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  956. package/src/migrations/resetProToOpusDefault.ts +51 -0
  957. package/src/moreright/useMoreRight.tsx +26 -0
  958. package/src/native-ts/color-diff/index.ts +999 -0
  959. package/src/native-ts/file-index/index.ts +370 -0
  960. package/src/native-ts/yoga-layout/enums.ts +134 -0
  961. package/src/native-ts/yoga-layout/index.ts +2578 -0
  962. package/src/outputStyles/loadOutputStylesDir.ts +98 -0
  963. package/src/plugins/builtinPlugins.ts +159 -0
  964. package/src/plugins/bundled/index.ts +23 -0
  965. package/src/projectOnboardingState.ts +83 -0
  966. package/src/query/config.ts +48 -0
  967. package/src/query/deps.ts +40 -0
  968. package/src/query/stopHooks.ts +473 -0
  969. package/src/query/tokenBudget.ts +93 -0
  970. package/src/query.ts +1729 -0
  971. package/src/remote/RemoteSessionManager.ts +343 -0
  972. package/src/remote/SessionsWebSocket.ts +404 -0
  973. package/src/remote/remotePermissionBridge.ts +78 -0
  974. package/src/remote/sdkMessageAdapter.ts +302 -0
  975. package/src/replLauncher.tsx +22 -0
  976. package/src/schemas/hooks.ts +222 -0
  977. package/src/screens/Doctor.tsx +575 -0
  978. package/src/screens/REPL.tsx +5052 -0
  979. package/src/screens/ResumeConversation.tsx +399 -0
  980. package/src/server/createDirectConnectSession.ts +88 -0
  981. package/src/server/directConnectManager.ts +213 -0
  982. package/src/server/types.ts +57 -0
  983. package/src/services/AgentSummary/agentSummary.ts +179 -0
  984. package/src/services/MagicDocs/magicDocs.ts +254 -0
  985. package/src/services/MagicDocs/prompts.ts +127 -0
  986. package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
  987. package/src/services/PromptSuggestion/speculation.ts +991 -0
  988. package/src/services/SessionMemory/prompts.ts +324 -0
  989. package/src/services/SessionMemory/sessionMemory.ts +495 -0
  990. package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  991. package/src/services/analytics/config.ts +40 -0
  992. package/src/services/analytics/datadog.ts +307 -0
  993. package/src/services/analytics/firstPartyEventLogger.ts +450 -0
  994. package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  995. package/src/services/analytics/growthbook.ts +1155 -0
  996. package/src/services/analytics/index.ts +173 -0
  997. package/src/services/analytics/metadata.ts +974 -0
  998. package/src/services/analytics/sink.ts +114 -0
  999. package/src/services/analytics/sinkKillswitch.ts +25 -0
  1000. package/src/services/api/adminRequests.ts +119 -0
  1001. package/src/services/api/bootstrap.ts +190 -0
  1002. package/src/services/api/claude.ts +3419 -0
  1003. package/src/services/api/client.ts +425 -0
  1004. package/src/services/api/dumpPrompts.ts +226 -0
  1005. package/src/services/api/emptyUsage.ts +22 -0
  1006. package/src/services/api/errorUtils.ts +260 -0
  1007. package/src/services/api/errors.ts +1207 -0
  1008. package/src/services/api/filesApi.ts +748 -0
  1009. package/src/services/api/firstTokenDate.ts +60 -0
  1010. package/src/services/api/grove.ts +357 -0
  1011. package/src/services/api/logging.ts +788 -0
  1012. package/src/services/api/metricsOptOut.ts +159 -0
  1013. package/src/services/api/overageCreditGrant.ts +137 -0
  1014. package/src/services/api/promptCacheBreakDetection.ts +727 -0
  1015. package/src/services/api/referral.ts +281 -0
  1016. package/src/services/api/sessionIngress.ts +514 -0
  1017. package/src/services/api/ultrareviewQuota.ts +38 -0
  1018. package/src/services/api/usage.ts +63 -0
  1019. package/src/services/api/withRetry.ts +822 -0
  1020. package/src/services/autoDream/autoDream.ts +324 -0
  1021. package/src/services/autoDream/config.ts +21 -0
  1022. package/src/services/autoDream/consolidationLock.ts +140 -0
  1023. package/src/services/autoDream/consolidationPrompt.ts +65 -0
  1024. package/src/services/awaySummary.ts +74 -0
  1025. package/src/services/claudeAiLimits.ts +515 -0
  1026. package/src/services/claudeAiLimitsHook.ts +23 -0
  1027. package/src/services/compact/apiMicrocompact.ts +153 -0
  1028. package/src/services/compact/autoCompact.ts +351 -0
  1029. package/src/services/compact/compact.ts +1705 -0
  1030. package/src/services/compact/compactWarningHook.ts +16 -0
  1031. package/src/services/compact/compactWarningState.ts +18 -0
  1032. package/src/services/compact/grouping.ts +63 -0
  1033. package/src/services/compact/microCompact.ts +530 -0
  1034. package/src/services/compact/postCompactCleanup.ts +77 -0
  1035. package/src/services/compact/prompt.ts +374 -0
  1036. package/src/services/compact/sessionMemoryCompact.ts +630 -0
  1037. package/src/services/compact/timeBasedMCConfig.ts +43 -0
  1038. package/src/services/copilot/provider.ts +1603 -0
  1039. package/src/services/diagnosticTracking.ts +397 -0
  1040. package/src/services/extractMemories/extractMemories.ts +615 -0
  1041. package/src/services/extractMemories/prompts.ts +154 -0
  1042. package/src/services/internalLogging.ts +90 -0
  1043. package/src/services/lsp/LSPClient.ts +447 -0
  1044. package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  1045. package/src/services/lsp/LSPServerInstance.ts +511 -0
  1046. package/src/services/lsp/LSPServerManager.ts +420 -0
  1047. package/src/services/lsp/config.ts +79 -0
  1048. package/src/services/lsp/manager.ts +289 -0
  1049. package/src/services/lsp/passiveFeedback.ts +328 -0
  1050. package/src/services/mcp/InProcessTransport.ts +63 -0
  1051. package/src/services/mcp/MCPConnectionManager.tsx +73 -0
  1052. package/src/services/mcp/SdkControlTransport.ts +136 -0
  1053. package/src/services/mcp/auth.ts +2465 -0
  1054. package/src/services/mcp/channelAllowlist.ts +76 -0
  1055. package/src/services/mcp/channelNotification.ts +316 -0
  1056. package/src/services/mcp/channelPermissions.ts +240 -0
  1057. package/src/services/mcp/claudeai.ts +164 -0
  1058. package/src/services/mcp/client.ts +3349 -0
  1059. package/src/services/mcp/config.ts +1578 -0
  1060. package/src/services/mcp/elicitationHandler.ts +313 -0
  1061. package/src/services/mcp/envExpansion.ts +38 -0
  1062. package/src/services/mcp/headersHelper.ts +138 -0
  1063. package/src/services/mcp/mcpStringUtils.ts +106 -0
  1064. package/src/services/mcp/normalization.ts +23 -0
  1065. package/src/services/mcp/oauthPort.ts +78 -0
  1066. package/src/services/mcp/officialRegistry.ts +72 -0
  1067. package/src/services/mcp/types.ts +258 -0
  1068. package/src/services/mcp/useManageMCPConnections.ts +1141 -0
  1069. package/src/services/mcp/utils.ts +575 -0
  1070. package/src/services/mcp/vscodeSdkMcp.ts +112 -0
  1071. package/src/services/mcp/xaa.ts +511 -0
  1072. package/src/services/mcp/xaaIdpLogin.ts +487 -0
  1073. package/src/services/mcpServerApproval.tsx +41 -0
  1074. package/src/services/mockRateLimits.ts +882 -0
  1075. package/src/services/notifier.ts +156 -0
  1076. package/src/services/oauth/auth-code-listener.ts +211 -0
  1077. package/src/services/oauth/client.ts +566 -0
  1078. package/src/services/oauth/crypto.ts +23 -0
  1079. package/src/services/oauth/getOauthProfile.ts +53 -0
  1080. package/src/services/oauth/index.ts +198 -0
  1081. package/src/services/openrouter/provider.ts +129 -0
  1082. package/src/services/plugins/PluginInstallationManager.ts +184 -0
  1083. package/src/services/plugins/pluginCliCommands.ts +344 -0
  1084. package/src/services/plugins/pluginOperations.ts +1088 -0
  1085. package/src/services/policyLimits/index.ts +663 -0
  1086. package/src/services/policyLimits/types.ts +27 -0
  1087. package/src/services/preventSleep.ts +165 -0
  1088. package/src/services/providerCatalog.test.ts +124 -0
  1089. package/src/services/rateLimitMessages.ts +344 -0
  1090. package/src/services/rateLimitMocking.ts +144 -0
  1091. package/src/services/remoteManagedSettings/index.ts +638 -0
  1092. package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
  1093. package/src/services/remoteManagedSettings/syncCache.ts +112 -0
  1094. package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
  1095. package/src/services/remoteManagedSettings/types.ts +31 -0
  1096. package/src/services/settingsSync/index.ts +581 -0
  1097. package/src/services/settingsSync/types.ts +67 -0
  1098. package/src/services/teamMemorySync/index.ts +1256 -0
  1099. package/src/services/teamMemorySync/secretScanner.ts +324 -0
  1100. package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  1101. package/src/services/teamMemorySync/types.ts +156 -0
  1102. package/src/services/teamMemorySync/watcher.ts +387 -0
  1103. package/src/services/tips/tipHistory.ts +17 -0
  1104. package/src/services/tips/tipRegistry.ts +686 -0
  1105. package/src/services/tips/tipScheduler.ts +58 -0
  1106. package/src/services/tokenEstimation.ts +503 -0
  1107. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1108. package/src/services/tools/StreamingToolExecutor.ts +530 -0
  1109. package/src/services/tools/toolExecution.ts +1745 -0
  1110. package/src/services/tools/toolHooks.ts +650 -0
  1111. package/src/services/tools/toolOrchestration.ts +188 -0
  1112. package/src/services/vcr.ts +406 -0
  1113. package/src/services/voice.ts +525 -0
  1114. package/src/services/voiceKeyterms.ts +106 -0
  1115. package/src/services/voiceStreamSTT.ts +544 -0
  1116. package/src/setup.ts +477 -0
  1117. package/src/skills/bundled/batch.ts +124 -0
  1118. package/src/skills/bundled/claudeApi.ts +196 -0
  1119. package/src/skills/bundled/claudeApiContent.ts +75 -0
  1120. package/src/skills/bundled/claudeInChrome.ts +34 -0
  1121. package/src/skills/bundled/debug.ts +103 -0
  1122. package/src/skills/bundled/index.ts +79 -0
  1123. package/src/skills/bundled/keybindings.ts +339 -0
  1124. package/src/skills/bundled/loop.ts +92 -0
  1125. package/src/skills/bundled/loremIpsum.ts +282 -0
  1126. package/src/skills/bundled/remember.ts +82 -0
  1127. package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
  1128. package/src/skills/bundled/simplify.ts +69 -0
  1129. package/src/skills/bundled/skillify.ts +197 -0
  1130. package/src/skills/bundled/stuck.ts +79 -0
  1131. package/src/skills/bundled/updateConfig.ts +475 -0
  1132. package/src/skills/bundled/verify/SKILL.md +3 -0
  1133. package/src/skills/bundled/verify/examples/cli.md +3 -0
  1134. package/src/skills/bundled/verify/examples/server.md +3 -0
  1135. package/src/skills/bundled/verify.ts +30 -0
  1136. package/src/skills/bundled/verifyContent.ts +13 -0
  1137. package/src/skills/bundledSkills.ts +220 -0
  1138. package/src/skills/loadSkillsDir.ts +1086 -0
  1139. package/src/skills/mcpSkillBuilders.ts +44 -0
  1140. package/src/state/AppState.tsx +200 -0
  1141. package/src/state/AppStateStore.ts +572 -0
  1142. package/src/state/onChangeAppState.ts +181 -0
  1143. package/src/state/selectors.ts +76 -0
  1144. package/src/state/store.ts +34 -0
  1145. package/src/state/teammateViewHelpers.ts +141 -0
  1146. package/src/tasks/DreamTask/DreamTask.ts +157 -0
  1147. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  1148. package/src/tasks/InProcessTeammateTask/types.ts +121 -0
  1149. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  1150. package/src/tasks/LocalMainSessionTask.ts +479 -0
  1151. package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  1152. package/src/tasks/LocalShellTask/guards.ts +41 -0
  1153. package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
  1154. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  1155. package/src/tasks/pillLabel.ts +82 -0
  1156. package/src/tasks/stopTask.ts +100 -0
  1157. package/src/tasks/types.ts +46 -0
  1158. package/src/tasks.ts +39 -0
  1159. package/src/tools/AgentTool/AgentTool.tsx +1398 -0
  1160. package/src/tools/AgentTool/UI.tsx +872 -0
  1161. package/src/tools/AgentTool/agentColorManager.ts +66 -0
  1162. package/src/tools/AgentTool/agentDisplay.ts +104 -0
  1163. package/src/tools/AgentTool/agentMemory.ts +177 -0
  1164. package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1165. package/src/tools/AgentTool/agentToolUtils.ts +686 -0
  1166. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1167. package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1168. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1169. package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
  1170. package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1171. package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1172. package/src/tools/AgentTool/builtInAgents.ts +72 -0
  1173. package/src/tools/AgentTool/constants.ts +12 -0
  1174. package/src/tools/AgentTool/forkSubagent.ts +210 -0
  1175. package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
  1176. package/src/tools/AgentTool/prompt.ts +287 -0
  1177. package/src/tools/AgentTool/resumeAgent.ts +265 -0
  1178. package/src/tools/AgentTool/runAgent.ts +973 -0
  1179. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1180. package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
  1181. package/src/tools/BashTool/BashTool.tsx +1144 -0
  1182. package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1183. package/src/tools/BashTool/UI.tsx +185 -0
  1184. package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
  1185. package/src/tools/BashTool/bashPermissions.ts +2621 -0
  1186. package/src/tools/BashTool/bashSecurity.ts +2592 -0
  1187. package/src/tools/BashTool/commandSemantics.ts +140 -0
  1188. package/src/tools/BashTool/commentLabel.ts +13 -0
  1189. package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1190. package/src/tools/BashTool/modeValidation.ts +115 -0
  1191. package/src/tools/BashTool/pathValidation.ts +1303 -0
  1192. package/src/tools/BashTool/prompt.ts +369 -0
  1193. package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
  1194. package/src/tools/BashTool/sedEditParser.ts +322 -0
  1195. package/src/tools/BashTool/sedValidation.ts +684 -0
  1196. package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
  1197. package/src/tools/BashTool/toolName.ts +2 -0
  1198. package/src/tools/BashTool/utils.ts +223 -0
  1199. package/src/tools/BriefTool/BriefTool.ts +204 -0
  1200. package/src/tools/BriefTool/UI.tsx +101 -0
  1201. package/src/tools/BriefTool/attachments.ts +110 -0
  1202. package/src/tools/BriefTool/prompt.ts +22 -0
  1203. package/src/tools/BriefTool/upload.ts +174 -0
  1204. package/src/tools/ConfigTool/ConfigTool.ts +467 -0
  1205. package/src/tools/ConfigTool/UI.tsx +38 -0
  1206. package/src/tools/ConfigTool/constants.ts +1 -0
  1207. package/src/tools/ConfigTool/prompt.ts +93 -0
  1208. package/src/tools/ConfigTool/supportedSettings.ts +211 -0
  1209. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1210. package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
  1211. package/src/tools/EnterPlanModeTool/constants.ts +1 -0
  1212. package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
  1213. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1214. package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
  1215. package/src/tools/EnterWorktreeTool/constants.ts +1 -0
  1216. package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
  1217. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1218. package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
  1219. package/src/tools/ExitPlanModeTool/constants.ts +2 -0
  1220. package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
  1221. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1222. package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
  1223. package/src/tools/ExitWorktreeTool/constants.ts +1 -0
  1224. package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
  1225. package/src/tools/FileEditTool/FileEditTool.ts +628 -0
  1226. package/src/tools/FileEditTool/UI.tsx +289 -0
  1227. package/src/tools/FileEditTool/constants.ts +11 -0
  1228. package/src/tools/FileEditTool/prompt.ts +28 -0
  1229. package/src/tools/FileEditTool/types.ts +85 -0
  1230. package/src/tools/FileEditTool/utils.ts +775 -0
  1231. package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
  1232. package/src/tools/FileReadTool/UI.tsx +185 -0
  1233. package/src/tools/FileReadTool/imageProcessor.ts +94 -0
  1234. package/src/tools/FileReadTool/limits.ts +92 -0
  1235. package/src/tools/FileReadTool/prompt.ts +49 -0
  1236. package/src/tools/FileWriteTool/FileWriteTool.ts +437 -0
  1237. package/src/tools/FileWriteTool/UI.tsx +405 -0
  1238. package/src/tools/FileWriteTool/prompt.ts +18 -0
  1239. package/src/tools/GlobTool/GlobTool.ts +198 -0
  1240. package/src/tools/GlobTool/UI.tsx +63 -0
  1241. package/src/tools/GlobTool/prompt.ts +7 -0
  1242. package/src/tools/GrepTool/GrepTool.ts +577 -0
  1243. package/src/tools/GrepTool/UI.tsx +201 -0
  1244. package/src/tools/GrepTool/prompt.ts +18 -0
  1245. package/src/tools/LSPTool/LSPTool.ts +860 -0
  1246. package/src/tools/LSPTool/UI.tsx +228 -0
  1247. package/src/tools/LSPTool/formatters.ts +592 -0
  1248. package/src/tools/LSPTool/prompt.ts +21 -0
  1249. package/src/tools/LSPTool/schemas.ts +215 -0
  1250. package/src/tools/LSPTool/symbolContext.ts +90 -0
  1251. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1252. package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1253. package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1254. package/src/tools/MCPTool/MCPTool.ts +77 -0
  1255. package/src/tools/MCPTool/UI.tsx +403 -0
  1256. package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
  1257. package/src/tools/MCPTool/prompt.ts +3 -0
  1258. package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1259. package/src/tools/NotebookEditTool/NotebookEditTool.ts +493 -0
  1260. package/src/tools/NotebookEditTool/UI.tsx +93 -0
  1261. package/src/tools/NotebookEditTool/constants.ts +2 -0
  1262. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  1263. package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1264. package/src/tools/PowerShellTool/UI.tsx +131 -0
  1265. package/src/tools/PowerShellTool/clmTypes.ts +211 -0
  1266. package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
  1267. package/src/tools/PowerShellTool/commonParameters.ts +30 -0
  1268. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1269. package/src/tools/PowerShellTool/gitSafety.ts +176 -0
  1270. package/src/tools/PowerShellTool/modeValidation.ts +404 -0
  1271. package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
  1272. package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1273. package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1274. package/src/tools/PowerShellTool/prompt.ts +145 -0
  1275. package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1276. package/src/tools/PowerShellTool/toolName.ts +2 -0
  1277. package/src/tools/REPLTool/constants.ts +46 -0
  1278. package/src/tools/REPLTool/primitiveTools.ts +39 -0
  1279. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1280. package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1281. package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1282. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1283. package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
  1284. package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
  1285. package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1286. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1287. package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1288. package/src/tools/ScheduleCronTool/UI.tsx +60 -0
  1289. package/src/tools/ScheduleCronTool/prompt.ts +135 -0
  1290. package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1291. package/src/tools/SendMessageTool/UI.tsx +31 -0
  1292. package/src/tools/SendMessageTool/constants.ts +1 -0
  1293. package/src/tools/SendMessageTool/prompt.ts +49 -0
  1294. package/src/tools/SkillTool/SkillTool.ts +1108 -0
  1295. package/src/tools/SkillTool/UI.tsx +128 -0
  1296. package/src/tools/SkillTool/constants.ts +1 -0
  1297. package/src/tools/SkillTool/prompt.ts +241 -0
  1298. package/src/tools/SleepTool/prompt.ts +17 -0
  1299. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1300. package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1301. package/src/tools/TaskCreateTool/constants.ts +1 -0
  1302. package/src/tools/TaskCreateTool/prompt.ts +56 -0
  1303. package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1304. package/src/tools/TaskGetTool/constants.ts +1 -0
  1305. package/src/tools/TaskGetTool/prompt.ts +24 -0
  1306. package/src/tools/TaskListTool/TaskListTool.ts +116 -0
  1307. package/src/tools/TaskListTool/constants.ts +1 -0
  1308. package/src/tools/TaskListTool/prompt.ts +49 -0
  1309. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1310. package/src/tools/TaskOutputTool/constants.ts +1 -0
  1311. package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1312. package/src/tools/TaskStopTool/UI.tsx +41 -0
  1313. package/src/tools/TaskStopTool/prompt.ts +8 -0
  1314. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1315. package/src/tools/TaskUpdateTool/constants.ts +1 -0
  1316. package/src/tools/TaskUpdateTool/prompt.ts +77 -0
  1317. package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1318. package/src/tools/TeamCreateTool/UI.tsx +6 -0
  1319. package/src/tools/TeamCreateTool/constants.ts +1 -0
  1320. package/src/tools/TeamCreateTool/prompt.ts +113 -0
  1321. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1322. package/src/tools/TeamDeleteTool/UI.tsx +20 -0
  1323. package/src/tools/TeamDeleteTool/constants.ts +1 -0
  1324. package/src/tools/TeamDeleteTool/prompt.ts +16 -0
  1325. package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1326. package/src/tools/TodoWriteTool/constants.ts +1 -0
  1327. package/src/tools/TodoWriteTool/prompt.ts +184 -0
  1328. package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1329. package/src/tools/ToolSearchTool/constants.ts +1 -0
  1330. package/src/tools/ToolSearchTool/prompt.ts +121 -0
  1331. package/src/tools/WebFetchTool/UI.tsx +72 -0
  1332. package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1333. package/src/tools/WebFetchTool/preapproved.ts +166 -0
  1334. package/src/tools/WebFetchTool/prompt.ts +46 -0
  1335. package/src/tools/WebFetchTool/utils.ts +530 -0
  1336. package/src/tools/WebSearchTool/UI.tsx +101 -0
  1337. package/src/tools/WebSearchTool/WebSearchTool.ts +444 -0
  1338. package/src/tools/WebSearchTool/prompt.ts +34 -0
  1339. package/src/tools/WorkflowTool/constants.ts +2 -0
  1340. package/src/tools/shared/gitOperationTracking.ts +277 -0
  1341. package/src/tools/shared/spawnMultiAgent.ts +1026 -0
  1342. package/src/tools/testing/TestingPermissionTool.tsx +74 -0
  1343. package/src/tools/utils.ts +40 -0
  1344. package/src/tools.ts +392 -0
  1345. package/src/types/command.ts +216 -0
  1346. package/src/types/connectorText.ts +24 -0
  1347. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1348. package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
  1349. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1350. package/src/types/generated/google/protobuf/timestamp.ts +187 -0
  1351. package/src/types/hooks.ts +290 -0
  1352. package/src/types/ids.ts +44 -0
  1353. package/src/types/logs.ts +330 -0
  1354. package/src/types/permissions.ts +441 -0
  1355. package/src/types/plugin.ts +363 -0
  1356. package/src/types/textInputTypes.ts +387 -0
  1357. package/src/upstreamproxy/relay.ts +455 -0
  1358. package/src/upstreamproxy/upstreamproxy.ts +285 -0
  1359. package/src/utils/CircularBuffer.ts +84 -0
  1360. package/src/utils/Cursor.ts +1530 -0
  1361. package/src/utils/QueryGuard.ts +121 -0
  1362. package/src/utils/Shell.ts +474 -0
  1363. package/src/utils/ShellCommand.ts +465 -0
  1364. package/src/utils/abortController.ts +99 -0
  1365. package/src/utils/activityManager.ts +164 -0
  1366. package/src/utils/advisor.ts +145 -0
  1367. package/src/utils/agentContext.ts +178 -0
  1368. package/src/utils/agentId.ts +99 -0
  1369. package/src/utils/agentSwarmsEnabled.ts +44 -0
  1370. package/src/utils/agenticSessionSearch.ts +307 -0
  1371. package/src/utils/analyzeContext.ts +1382 -0
  1372. package/src/utils/ansiToPng.ts +334 -0
  1373. package/src/utils/ansiToSvg.ts +272 -0
  1374. package/src/utils/api.ts +718 -0
  1375. package/src/utils/apiPreconnect.ts +75 -0
  1376. package/src/utils/appVersion.ts +6 -0
  1377. package/src/utils/appleTerminalBackup.ts +124 -0
  1378. package/src/utils/argumentSubstitution.ts +145 -0
  1379. package/src/utils/array.ts +13 -0
  1380. package/src/utils/asciicast.ts +239 -0
  1381. package/src/utils/attachments.ts +3997 -0
  1382. package/src/utils/attribution.ts +393 -0
  1383. package/src/utils/auth.ts +2056 -0
  1384. package/src/utils/authFileDescriptor.ts +196 -0
  1385. package/src/utils/authPortable.ts +19 -0
  1386. package/src/utils/autoModeDenials.ts +26 -0
  1387. package/src/utils/autoRunIssue.tsx +122 -0
  1388. package/src/utils/autoUpdater.ts +567 -0
  1389. package/src/utils/aws.ts +74 -0
  1390. package/src/utils/awsAuthStatusManager.ts +81 -0
  1391. package/src/utils/background/remote/preconditions.ts +235 -0
  1392. package/src/utils/background/remote/remoteSession.ts +98 -0
  1393. package/src/utils/backgroundHousekeeping.ts +94 -0
  1394. package/src/utils/bash/ParsedCommand.ts +318 -0
  1395. package/src/utils/bash/ShellSnapshot.ts +582 -0
  1396. package/src/utils/bash/ast.ts +2679 -0
  1397. package/src/utils/bash/bashParser.ts +4436 -0
  1398. package/src/utils/bash/bashPipeCommand.ts +294 -0
  1399. package/src/utils/bash/commands.ts +1339 -0
  1400. package/src/utils/bash/heredoc.ts +733 -0
  1401. package/src/utils/bash/parser.ts +230 -0
  1402. package/src/utils/bash/prefix.ts +204 -0
  1403. package/src/utils/bash/registry.ts +53 -0
  1404. package/src/utils/bash/shellCompletion.ts +259 -0
  1405. package/src/utils/bash/shellPrefix.ts +28 -0
  1406. package/src/utils/bash/shellQuote.ts +304 -0
  1407. package/src/utils/bash/shellQuoting.ts +128 -0
  1408. package/src/utils/bash/specs/alias.ts +14 -0
  1409. package/src/utils/bash/specs/index.ts +18 -0
  1410. package/src/utils/bash/specs/nohup.ts +13 -0
  1411. package/src/utils/bash/specs/pyright.ts +91 -0
  1412. package/src/utils/bash/specs/sleep.ts +13 -0
  1413. package/src/utils/bash/specs/srun.ts +31 -0
  1414. package/src/utils/bash/specs/time.ts +13 -0
  1415. package/src/utils/bash/specs/timeout.ts +20 -0
  1416. package/src/utils/bash/treeSitterAnalysis.ts +506 -0
  1417. package/src/utils/betas.ts +440 -0
  1418. package/src/utils/billing.ts +78 -0
  1419. package/src/utils/binaryCheck.ts +53 -0
  1420. package/src/utils/browser.ts +68 -0
  1421. package/src/utils/bufferedWriter.ts +100 -0
  1422. package/src/utils/bundledMode.ts +22 -0
  1423. package/src/utils/caCerts.ts +115 -0
  1424. package/src/utils/caCertsConfig.ts +88 -0
  1425. package/src/utils/cachePaths.ts +38 -0
  1426. package/src/utils/classifierApprovals.ts +88 -0
  1427. package/src/utils/classifierApprovalsHook.ts +17 -0
  1428. package/src/utils/claudeCodeHints.ts +193 -0
  1429. package/src/utils/claudeDesktop.ts +152 -0
  1430. package/src/utils/claudeInChrome/browserTools.ts +19 -0
  1431. package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1432. package/src/utils/claudeInChrome/common.ts +540 -0
  1433. package/src/utils/claudeInChrome/mcpServer.ts +293 -0
  1434. package/src/utils/claudeInChrome/prompt.ts +83 -0
  1435. package/src/utils/claudeInChrome/setup.ts +400 -0
  1436. package/src/utils/claudeInChrome/setupPortable.ts +233 -0
  1437. package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
  1438. package/src/utils/claudemd.ts +1479 -0
  1439. package/src/utils/cleanup.ts +602 -0
  1440. package/src/utils/cleanupRegistry.ts +25 -0
  1441. package/src/utils/cliArgs.ts +60 -0
  1442. package/src/utils/cliHighlight.ts +54 -0
  1443. package/src/utils/cliSessionEnv.ts +42 -0
  1444. package/src/utils/codeIndexing.ts +206 -0
  1445. package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
  1446. package/src/utils/collapseHookSummaries.ts +59 -0
  1447. package/src/utils/collapseReadSearch.ts +1109 -0
  1448. package/src/utils/collapseTeammateShutdowns.ts +55 -0
  1449. package/src/utils/combinedAbortSignal.ts +47 -0
  1450. package/src/utils/commandLifecycle.ts +21 -0
  1451. package/src/utils/commitAttribution.ts +961 -0
  1452. package/src/utils/completionCache.ts +166 -0
  1453. package/src/utils/computerUse/appNames.ts +196 -0
  1454. package/src/utils/computerUse/cleanup.ts +86 -0
  1455. package/src/utils/computerUse/common.ts +61 -0
  1456. package/src/utils/computerUse/computerUseLock.ts +215 -0
  1457. package/src/utils/computerUse/drainRunLoop.ts +79 -0
  1458. package/src/utils/computerUse/escHotkey.ts +54 -0
  1459. package/src/utils/computerUse/executor.ts +658 -0
  1460. package/src/utils/computerUse/gates.ts +72 -0
  1461. package/src/utils/computerUse/hostAdapter.ts +69 -0
  1462. package/src/utils/computerUse/inputLoader.ts +30 -0
  1463. package/src/utils/computerUse/mcpServer.ts +106 -0
  1464. package/src/utils/computerUse/setup.ts +53 -0
  1465. package/src/utils/computerUse/swiftLoader.ts +23 -0
  1466. package/src/utils/computerUse/toolRendering.tsx +125 -0
  1467. package/src/utils/computerUse/wrapper.tsx +336 -0
  1468. package/src/utils/concurrentSessions.ts +204 -0
  1469. package/src/utils/config.ts +1817 -0
  1470. package/src/utils/configConstants.ts +21 -0
  1471. package/src/utils/contentArray.ts +51 -0
  1472. package/src/utils/context.ts +221 -0
  1473. package/src/utils/contextAnalysis.ts +272 -0
  1474. package/src/utils/contextSuggestions.ts +235 -0
  1475. package/src/utils/controlMessageCompat.ts +32 -0
  1476. package/src/utils/conversationRecovery.ts +597 -0
  1477. package/src/utils/cron.ts +308 -0
  1478. package/src/utils/cronJitterConfig.ts +75 -0
  1479. package/src/utils/cronScheduler.ts +565 -0
  1480. package/src/utils/cronTasks.ts +458 -0
  1481. package/src/utils/cronTasksLock.ts +195 -0
  1482. package/src/utils/crossProjectResume.ts +75 -0
  1483. package/src/utils/crypto.ts +13 -0
  1484. package/src/utils/cwd.ts +32 -0
  1485. package/src/utils/debug.ts +268 -0
  1486. package/src/utils/debugFilter.ts +157 -0
  1487. package/src/utils/deepLink/banner.ts +123 -0
  1488. package/src/utils/deepLink/parseDeepLink.ts +170 -0
  1489. package/src/utils/deepLink/protocolHandler.ts +136 -0
  1490. package/src/utils/deepLink/registerProtocol.ts +348 -0
  1491. package/src/utils/deepLink/terminalLauncher.ts +557 -0
  1492. package/src/utils/deepLink/terminalPreference.ts +54 -0
  1493. package/src/utils/desktopDeepLink.ts +236 -0
  1494. package/src/utils/detectRepository.ts +178 -0
  1495. package/src/utils/diagLogs.ts +94 -0
  1496. package/src/utils/diff.ts +177 -0
  1497. package/src/utils/directMemberMessage.ts +69 -0
  1498. package/src/utils/displayTags.ts +51 -0
  1499. package/src/utils/doctorContextWarnings.ts +265 -0
  1500. package/src/utils/doctorDiagnostic.ts +626 -0
  1501. package/src/utils/dxt/helpers.ts +88 -0
  1502. package/src/utils/dxt/zip.ts +226 -0
  1503. package/src/utils/earlyInput.ts +221 -0
  1504. package/src/utils/editor.ts +183 -0
  1505. package/src/utils/effort.ts +329 -0
  1506. package/src/utils/embeddedTools.ts +29 -0
  1507. package/src/utils/env.ts +347 -0
  1508. package/src/utils/envDynamic.ts +151 -0
  1509. package/src/utils/envUtils.ts +183 -0
  1510. package/src/utils/envValidation.ts +38 -0
  1511. package/src/utils/errorLogSink.ts +236 -0
  1512. package/src/utils/errors.ts +238 -0
  1513. package/src/utils/exampleCommands.ts +184 -0
  1514. package/src/utils/execFileNoThrow.ts +150 -0
  1515. package/src/utils/execFileNoThrowPortable.ts +89 -0
  1516. package/src/utils/execSyncWrapper.ts +38 -0
  1517. package/src/utils/exportRenderer.tsx +98 -0
  1518. package/src/utils/extraUsage.ts +23 -0
  1519. package/src/utils/fastMode.ts +532 -0
  1520. package/src/utils/file.ts +584 -0
  1521. package/src/utils/fileHistory.ts +1115 -0
  1522. package/src/utils/fileOperationAnalytics.ts +71 -0
  1523. package/src/utils/filePersistence/filePersistence.ts +287 -0
  1524. package/src/utils/filePersistence/outputsScanner.ts +126 -0
  1525. package/src/utils/fileRead.ts +102 -0
  1526. package/src/utils/fileReadCache.ts +96 -0
  1527. package/src/utils/fileStateCache.ts +142 -0
  1528. package/src/utils/findExecutable.ts +17 -0
  1529. package/src/utils/fingerprint.ts +77 -0
  1530. package/src/utils/forkedAgent.ts +689 -0
  1531. package/src/utils/format.ts +308 -0
  1532. package/src/utils/formatBriefTimestamp.ts +81 -0
  1533. package/src/utils/fpsTracker.ts +47 -0
  1534. package/src/utils/frontmatterParser.ts +370 -0
  1535. package/src/utils/fsOperations.ts +770 -0
  1536. package/src/utils/fullscreen.ts +202 -0
  1537. package/src/utils/generatedFiles.ts +136 -0
  1538. package/src/utils/generators.ts +88 -0
  1539. package/src/utils/genericProcessUtils.ts +184 -0
  1540. package/src/utils/getWorktreePaths.ts +70 -0
  1541. package/src/utils/getWorktreePathsPortable.ts +27 -0
  1542. package/src/utils/ghPrStatus.ts +106 -0
  1543. package/src/utils/git/gitConfigParser.ts +277 -0
  1544. package/src/utils/git/gitFilesystem.ts +699 -0
  1545. package/src/utils/git/gitignore.ts +99 -0
  1546. package/src/utils/git.ts +926 -0
  1547. package/src/utils/gitDiff.ts +532 -0
  1548. package/src/utils/gitSettings.ts +18 -0
  1549. package/src/utils/github/ghAuthStatus.ts +29 -0
  1550. package/src/utils/githubRepoPathMapping.ts +162 -0
  1551. package/src/utils/glob.ts +130 -0
  1552. package/src/utils/gracefulShutdown.ts +529 -0
  1553. package/src/utils/groupToolUses.ts +182 -0
  1554. package/src/utils/handlePromptSubmit.ts +610 -0
  1555. package/src/utils/hash.ts +46 -0
  1556. package/src/utils/headlessProfiler.ts +178 -0
  1557. package/src/utils/heapDumpService.ts +304 -0
  1558. package/src/utils/heatmap.ts +198 -0
  1559. package/src/utils/highlightMatch.tsx +28 -0
  1560. package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
  1561. package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
  1562. package/src/utils/hooks/execAgentHook.ts +339 -0
  1563. package/src/utils/hooks/execHttpHook.ts +242 -0
  1564. package/src/utils/hooks/execPromptHook.ts +211 -0
  1565. package/src/utils/hooks/fileChangedWatcher.ts +191 -0
  1566. package/src/utils/hooks/hookEvents.ts +192 -0
  1567. package/src/utils/hooks/hookHelpers.ts +83 -0
  1568. package/src/utils/hooks/hooksConfigManager.ts +400 -0
  1569. package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1570. package/src/utils/hooks/hooksSettings.ts +271 -0
  1571. package/src/utils/hooks/postSamplingHooks.ts +70 -0
  1572. package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1573. package/src/utils/hooks/registerSkillHooks.ts +64 -0
  1574. package/src/utils/hooks/sessionHooks.ts +447 -0
  1575. package/src/utils/hooks/skillImprovement.ts +267 -0
  1576. package/src/utils/hooks/ssrfGuard.ts +294 -0
  1577. package/src/utils/hooks.ts +5022 -0
  1578. package/src/utils/horizontalScroll.ts +137 -0
  1579. package/src/utils/http.ts +137 -0
  1580. package/src/utils/hyperlink.ts +39 -0
  1581. package/src/utils/iTermBackup.ts +73 -0
  1582. package/src/utils/ide.ts +1495 -0
  1583. package/src/utils/idePathConversion.ts +90 -0
  1584. package/src/utils/idleTimeout.ts +53 -0
  1585. package/src/utils/imagePaste.ts +416 -0
  1586. package/src/utils/imageResizer.ts +880 -0
  1587. package/src/utils/imageStore.ts +167 -0
  1588. package/src/utils/imageValidation.ts +104 -0
  1589. package/src/utils/immediateCommand.ts +15 -0
  1590. package/src/utils/inProcessTeammateHelpers.ts +102 -0
  1591. package/src/utils/ink.ts +26 -0
  1592. package/src/utils/intl.ts +94 -0
  1593. package/src/utils/jetbrains.ts +191 -0
  1594. package/src/utils/json.ts +277 -0
  1595. package/src/utils/jsonRead.ts +16 -0
  1596. package/src/utils/keyboardShortcuts.ts +14 -0
  1597. package/src/utils/lazySchema.ts +8 -0
  1598. package/src/utils/listSessionsImpl.ts +454 -0
  1599. package/src/utils/localInstaller.ts +162 -0
  1600. package/src/utils/lockfile.ts +43 -0
  1601. package/src/utils/log.ts +364 -0
  1602. package/src/utils/logoV2Utils.ts +351 -0
  1603. package/src/utils/mailbox.ts +73 -0
  1604. package/src/utils/managedEnv.ts +199 -0
  1605. package/src/utils/managedEnvConstants.ts +205 -0
  1606. package/src/utils/markdown.ts +381 -0
  1607. package/src/utils/markdownConfigLoader.ts +600 -0
  1608. package/src/utils/mcp/dateTimeParser.ts +121 -0
  1609. package/src/utils/mcp/elicitationValidation.ts +336 -0
  1610. package/src/utils/mcpInstructionsDelta.ts +130 -0
  1611. package/src/utils/mcpOutputStorage.ts +189 -0
  1612. package/src/utils/mcpValidation.ts +208 -0
  1613. package/src/utils/mcpWebSocketTransport.ts +200 -0
  1614. package/src/utils/memoize.ts +269 -0
  1615. package/src/utils/memory/types.ts +12 -0
  1616. package/src/utils/memory/versions.ts +8 -0
  1617. package/src/utils/memoryFileDetection.ts +289 -0
  1618. package/src/utils/messagePredicates.ts +8 -0
  1619. package/src/utils/messageQueueManager.ts +547 -0
  1620. package/src/utils/messages/mappers.ts +290 -0
  1621. package/src/utils/messages/systemInit.ts +97 -0
  1622. package/src/utils/messages.ts +5512 -0
  1623. package/src/utils/model/agent.ts +157 -0
  1624. package/src/utils/model/aliases.ts +25 -0
  1625. package/src/utils/model/antModels.ts +64 -0
  1626. package/src/utils/model/bedrock.ts +265 -0
  1627. package/src/utils/model/check1mAccess.ts +72 -0
  1628. package/src/utils/model/configs.ts +140 -0
  1629. package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1630. package/src/utils/model/deprecation.ts +104 -0
  1631. package/src/utils/model/model.ts +630 -0
  1632. package/src/utils/model/modelAllowlist.ts +170 -0
  1633. package/src/utils/model/modelCapabilities.ts +118 -0
  1634. package/src/utils/model/modelOptions.ts +651 -0
  1635. package/src/utils/model/modelStrings.ts +181 -0
  1636. package/src/utils/model/modelSupportOverrides.ts +50 -0
  1637. package/src/utils/model/providers.ts +50 -0
  1638. package/src/utils/model/validateModel.ts +173 -0
  1639. package/src/utils/modelCost.ts +231 -0
  1640. package/src/utils/modelSelection.ts +43 -0
  1641. package/src/utils/modifiers.ts +36 -0
  1642. package/src/utils/mtls.ts +179 -0
  1643. package/src/utils/nativeInstaller/download.ts +523 -0
  1644. package/src/utils/nativeInstaller/index.ts +18 -0
  1645. package/src/utils/nativeInstaller/installer.ts +1709 -0
  1646. package/src/utils/nativeInstaller/packageManagers.ts +336 -0
  1647. package/src/utils/nativeInstaller/pidLock.ts +433 -0
  1648. package/src/utils/notebook.ts +224 -0
  1649. package/src/utils/objectGroupBy.ts +18 -0
  1650. package/src/utils/pasteStore.ts +104 -0
  1651. package/src/utils/path.ts +155 -0
  1652. package/src/utils/pdf.ts +300 -0
  1653. package/src/utils/pdfUtils.ts +70 -0
  1654. package/src/utils/peerAddress.ts +21 -0
  1655. package/src/utils/permissions/PermissionMode.ts +166 -0
  1656. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1657. package/src/utils/permissions/PermissionResult.ts +35 -0
  1658. package/src/utils/permissions/PermissionRule.ts +40 -0
  1659. package/src/utils/permissions/PermissionUpdate.ts +389 -0
  1660. package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1661. package/src/utils/permissions/autoModeState.ts +39 -0
  1662. package/src/utils/permissions/bashClassifier.ts +61 -0
  1663. package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1664. package/src/utils/permissions/classifierDecision.ts +98 -0
  1665. package/src/utils/permissions/classifierShared.ts +39 -0
  1666. package/src/utils/permissions/dangerousPatterns.ts +80 -0
  1667. package/src/utils/permissions/denialTracking.ts +45 -0
  1668. package/src/utils/permissions/filesystem.ts +1778 -0
  1669. package/src/utils/permissions/getNextPermissionMode.ts +101 -0
  1670. package/src/utils/permissions/pathValidation.ts +485 -0
  1671. package/src/utils/permissions/permissionExplainer.ts +250 -0
  1672. package/src/utils/permissions/permissionRuleParser.ts +198 -0
  1673. package/src/utils/permissions/permissionSetup.ts +1544 -0
  1674. package/src/utils/permissions/permissions.ts +1486 -0
  1675. package/src/utils/permissions/permissionsLoader.ts +296 -0
  1676. package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
  1677. package/src/utils/permissions/shellRuleMatching.ts +228 -0
  1678. package/src/utils/permissions/yoloClassifier.ts +1495 -0
  1679. package/src/utils/planModeV2.ts +95 -0
  1680. package/src/utils/plans.ts +397 -0
  1681. package/src/utils/platform.ts +150 -0
  1682. package/src/utils/plugins/addDirPluginSettings.ts +71 -0
  1683. package/src/utils/plugins/cacheUtils.ts +196 -0
  1684. package/src/utils/plugins/dependencyResolver.ts +305 -0
  1685. package/src/utils/plugins/fetchTelemetry.ts +135 -0
  1686. package/src/utils/plugins/gitAvailability.ts +69 -0
  1687. package/src/utils/plugins/headlessPluginInstall.ts +174 -0
  1688. package/src/utils/plugins/hintRecommendation.ts +164 -0
  1689. package/src/utils/plugins/installCounts.ts +292 -0
  1690. package/src/utils/plugins/installedPluginsManager.ts +1268 -0
  1691. package/src/utils/plugins/loadPluginAgents.ts +348 -0
  1692. package/src/utils/plugins/loadPluginCommands.ts +946 -0
  1693. package/src/utils/plugins/loadPluginHooks.ts +287 -0
  1694. package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1695. package/src/utils/plugins/lspPluginIntegration.ts +387 -0
  1696. package/src/utils/plugins/lspRecommendation.ts +374 -0
  1697. package/src/utils/plugins/managedPlugins.ts +27 -0
  1698. package/src/utils/plugins/marketplaceHelpers.ts +592 -0
  1699. package/src/utils/plugins/marketplaceManager.ts +2643 -0
  1700. package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
  1701. package/src/utils/plugins/mcpbHandler.ts +968 -0
  1702. package/src/utils/plugins/officialMarketplace.ts +25 -0
  1703. package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1704. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1705. package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
  1706. package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
  1707. package/src/utils/plugins/performStartupChecks.tsx +70 -0
  1708. package/src/utils/plugins/pluginAutoupdate.ts +284 -0
  1709. package/src/utils/plugins/pluginBlocklist.ts +127 -0
  1710. package/src/utils/plugins/pluginDirectories.ts +178 -0
  1711. package/src/utils/plugins/pluginFlagging.ts +208 -0
  1712. package/src/utils/plugins/pluginIdentifier.ts +123 -0
  1713. package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1714. package/src/utils/plugins/pluginLoader.ts +3302 -0
  1715. package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
  1716. package/src/utils/plugins/pluginPolicy.ts +20 -0
  1717. package/src/utils/plugins/pluginStartupCheck.ts +341 -0
  1718. package/src/utils/plugins/pluginVersioning.ts +157 -0
  1719. package/src/utils/plugins/reconciler.ts +265 -0
  1720. package/src/utils/plugins/refresh.ts +215 -0
  1721. package/src/utils/plugins/schemas.ts +1681 -0
  1722. package/src/utils/plugins/validatePlugin.ts +903 -0
  1723. package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
  1724. package/src/utils/plugins/zipCache.ts +406 -0
  1725. package/src/utils/plugins/zipCacheAdapters.ts +164 -0
  1726. package/src/utils/powershell/dangerousCmdlets.ts +185 -0
  1727. package/src/utils/powershell/parser.ts +1804 -0
  1728. package/src/utils/powershell/staticPrefix.ts +316 -0
  1729. package/src/utils/preflightChecks.tsx +151 -0
  1730. package/src/utils/privacyLevel.ts +55 -0
  1731. package/src/utils/process.ts +68 -0
  1732. package/src/utils/processUserInput/processBashCommand.tsx +140 -0
  1733. package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
  1734. package/src/utils/processUserInput/processTextPrompt.ts +100 -0
  1735. package/src/utils/processUserInput/processUserInput.ts +605 -0
  1736. package/src/utils/profilerBase.ts +46 -0
  1737. package/src/utils/promptCategory.ts +49 -0
  1738. package/src/utils/promptEditor.ts +188 -0
  1739. package/src/utils/promptShellExecution.ts +183 -0
  1740. package/src/utils/providerModelCache.ts +30 -0
  1741. package/src/utils/providerSelection.ts +364 -0
  1742. package/src/utils/proxy.ts +426 -0
  1743. package/src/utils/queryContext.ts +179 -0
  1744. package/src/utils/queryHelpers.ts +552 -0
  1745. package/src/utils/queryProfiler.ts +301 -0
  1746. package/src/utils/queueProcessor.ts +95 -0
  1747. package/src/utils/readEditContext.ts +227 -0
  1748. package/src/utils/readFileInRange.ts +383 -0
  1749. package/src/utils/releaseNotes.ts +361 -0
  1750. package/src/utils/renderOptions.ts +77 -0
  1751. package/src/utils/ripgrep.ts +679 -0
  1752. package/src/utils/sandbox/sandbox-adapter.ts +985 -0
  1753. package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1754. package/src/utils/sanitization.ts +91 -0
  1755. package/src/utils/screenshotClipboard.ts +121 -0
  1756. package/src/utils/sdkEventQueue.ts +134 -0
  1757. package/src/utils/secureStorage/fallbackStorage.ts +70 -0
  1758. package/src/utils/secureStorage/index.ts +17 -0
  1759. package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
  1760. package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1761. package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1762. package/src/utils/secureStorage/plainTextStorage.ts +84 -0
  1763. package/src/utils/semanticBoolean.ts +29 -0
  1764. package/src/utils/semanticNumber.ts +36 -0
  1765. package/src/utils/semver.ts +59 -0
  1766. package/src/utils/sequential.ts +56 -0
  1767. package/src/utils/sessionActivity.ts +133 -0
  1768. package/src/utils/sessionEnvVars.ts +22 -0
  1769. package/src/utils/sessionEnvironment.ts +166 -0
  1770. package/src/utils/sessionFileAccessHooks.ts +250 -0
  1771. package/src/utils/sessionIngressAuth.ts +140 -0
  1772. package/src/utils/sessionRestore.ts +551 -0
  1773. package/src/utils/sessionStart.ts +232 -0
  1774. package/src/utils/sessionState.ts +150 -0
  1775. package/src/utils/sessionStorage.ts +5106 -0
  1776. package/src/utils/sessionStoragePortable.ts +793 -0
  1777. package/src/utils/sessionTitle.ts +129 -0
  1778. package/src/utils/sessionUrl.ts +64 -0
  1779. package/src/utils/set.ts +53 -0
  1780. package/src/utils/settings/allErrors.ts +32 -0
  1781. package/src/utils/settings/applySettingsChange.ts +92 -0
  1782. package/src/utils/settings/changeDetector.ts +488 -0
  1783. package/src/utils/settings/constants.ts +202 -0
  1784. package/src/utils/settings/internalWrites.ts +37 -0
  1785. package/src/utils/settings/managedPath.ts +34 -0
  1786. package/src/utils/settings/mdm/constants.ts +81 -0
  1787. package/src/utils/settings/mdm/rawRead.ts +130 -0
  1788. package/src/utils/settings/mdm/settings.ts +316 -0
  1789. package/src/utils/settings/permissionValidation.ts +262 -0
  1790. package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
  1791. package/src/utils/settings/schemaOutput.ts +8 -0
  1792. package/src/utils/settings/settings.ts +1015 -0
  1793. package/src/utils/settings/settingsCache.ts +80 -0
  1794. package/src/utils/settings/toolValidationConfig.ts +103 -0
  1795. package/src/utils/settings/types.ts +1171 -0
  1796. package/src/utils/settings/validateEditTool.ts +45 -0
  1797. package/src/utils/settings/validation.ts +265 -0
  1798. package/src/utils/settings/validationTips.ts +164 -0
  1799. package/src/utils/shell/bashProvider.ts +255 -0
  1800. package/src/utils/shell/outputLimits.ts +14 -0
  1801. package/src/utils/shell/powershellDetection.ts +107 -0
  1802. package/src/utils/shell/powershellProvider.ts +123 -0
  1803. package/src/utils/shell/prefix.ts +367 -0
  1804. package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1805. package/src/utils/shell/resolveDefaultShell.ts +14 -0
  1806. package/src/utils/shell/shellProvider.ts +33 -0
  1807. package/src/utils/shell/shellToolUtils.ts +22 -0
  1808. package/src/utils/shell/specPrefix.ts +241 -0
  1809. package/src/utils/shellConfig.ts +167 -0
  1810. package/src/utils/sideQuery.ts +223 -0
  1811. package/src/utils/sideQuestion.ts +155 -0
  1812. package/src/utils/signal.ts +43 -0
  1813. package/src/utils/sinks.ts +16 -0
  1814. package/src/utils/skills/skillChangeDetector.ts +311 -0
  1815. package/src/utils/slashCommandParsing.ts +60 -0
  1816. package/src/utils/sleep.ts +84 -0
  1817. package/src/utils/sliceAnsi.ts +91 -0
  1818. package/src/utils/slowOperations.ts +286 -0
  1819. package/src/utils/standaloneAgent.ts +23 -0
  1820. package/src/utils/startupProfiler.ts +194 -0
  1821. package/src/utils/staticRender.tsx +116 -0
  1822. package/src/utils/stats.ts +1061 -0
  1823. package/src/utils/statsCache.ts +434 -0
  1824. package/src/utils/status.tsx +372 -0
  1825. package/src/utils/statusNoticeDefinitions.tsx +198 -0
  1826. package/src/utils/statusNoticeHelpers.ts +20 -0
  1827. package/src/utils/stream.ts +76 -0
  1828. package/src/utils/streamJsonStdoutGuard.ts +123 -0
  1829. package/src/utils/streamlinedTransform.ts +201 -0
  1830. package/src/utils/stringUtils.ts +235 -0
  1831. package/src/utils/subprocessEnv.ts +99 -0
  1832. package/src/utils/suggestions/commandSuggestions.ts +567 -0
  1833. package/src/utils/suggestions/directoryCompletion.ts +263 -0
  1834. package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1835. package/src/utils/suggestions/skillUsageTracking.ts +55 -0
  1836. package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1837. package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
  1838. package/src/utils/swarm/backends/ITermBackend.ts +370 -0
  1839. package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
  1840. package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1841. package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
  1842. package/src/utils/swarm/backends/detection.ts +128 -0
  1843. package/src/utils/swarm/backends/it2Setup.ts +245 -0
  1844. package/src/utils/swarm/backends/registry.ts +464 -0
  1845. package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1846. package/src/utils/swarm/backends/types.ts +311 -0
  1847. package/src/utils/swarm/constants.ts +33 -0
  1848. package/src/utils/swarm/inProcessRunner.ts +1552 -0
  1849. package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
  1850. package/src/utils/swarm/permissionSync.ts +928 -0
  1851. package/src/utils/swarm/reconnection.ts +119 -0
  1852. package/src/utils/swarm/spawnInProcess.ts +328 -0
  1853. package/src/utils/swarm/spawnUtils.ts +168 -0
  1854. package/src/utils/swarm/teamHelpers.ts +683 -0
  1855. package/src/utils/swarm/teammateInit.ts +129 -0
  1856. package/src/utils/swarm/teammateLayoutManager.ts +107 -0
  1857. package/src/utils/swarm/teammateModel.ts +10 -0
  1858. package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
  1859. package/src/utils/systemDirectories.ts +74 -0
  1860. package/src/utils/systemPrompt.ts +123 -0
  1861. package/src/utils/systemPromptType.ts +14 -0
  1862. package/src/utils/systemTheme.ts +119 -0
  1863. package/src/utils/taggedId.ts +54 -0
  1864. package/src/utils/task/TaskOutput.ts +390 -0
  1865. package/src/utils/task/diskOutput.ts +451 -0
  1866. package/src/utils/task/framework.ts +308 -0
  1867. package/src/utils/task/outputFormatting.ts +38 -0
  1868. package/src/utils/task/sdkProgress.ts +36 -0
  1869. package/src/utils/tasks.ts +862 -0
  1870. package/src/utils/teamDiscovery.ts +81 -0
  1871. package/src/utils/teamMemoryOps.ts +88 -0
  1872. package/src/utils/teammate.ts +292 -0
  1873. package/src/utils/teammateContext.ts +96 -0
  1874. package/src/utils/teammateMailbox.ts +1183 -0
  1875. package/src/utils/telemetry/betaSessionTracing.ts +491 -0
  1876. package/src/utils/telemetry/bigqueryExporter.ts +252 -0
  1877. package/src/utils/telemetry/events.ts +75 -0
  1878. package/src/utils/telemetry/instrumentation.ts +826 -0
  1879. package/src/utils/telemetry/logger.ts +26 -0
  1880. package/src/utils/telemetry/perfettoTracing.ts +1120 -0
  1881. package/src/utils/telemetry/pluginTelemetry.ts +289 -0
  1882. package/src/utils/telemetry/sessionTracing.ts +927 -0
  1883. package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
  1884. package/src/utils/telemetryAttributes.ts +72 -0
  1885. package/src/utils/teleport/api.ts +466 -0
  1886. package/src/utils/teleport/environmentSelection.ts +77 -0
  1887. package/src/utils/teleport/environments.ts +120 -0
  1888. package/src/utils/teleport/gitBundle.ts +292 -0
  1889. package/src/utils/teleport.tsx +1226 -0
  1890. package/src/utils/tempfile.ts +31 -0
  1891. package/src/utils/terminal.ts +131 -0
  1892. package/src/utils/terminalPanel.ts +191 -0
  1893. package/src/utils/textHighlighting.ts +166 -0
  1894. package/src/utils/theme.ts +639 -0
  1895. package/src/utils/thinking.ts +170 -0
  1896. package/src/utils/timeouts.ts +39 -0
  1897. package/src/utils/tmuxSocket.ts +427 -0
  1898. package/src/utils/todo/types.ts +18 -0
  1899. package/src/utils/tokenBudget.ts +73 -0
  1900. package/src/utils/tokens.ts +261 -0
  1901. package/src/utils/toolErrors.ts +132 -0
  1902. package/src/utils/toolPool.ts +79 -0
  1903. package/src/utils/toolResultStorage.ts +1040 -0
  1904. package/src/utils/toolSchemaCache.ts +26 -0
  1905. package/src/utils/toolSearch.ts +756 -0
  1906. package/src/utils/transcriptSearch.ts +202 -0
  1907. package/src/utils/treeify.ts +170 -0
  1908. package/src/utils/truncate.ts +179 -0
  1909. package/src/utils/ultraplan/ccrSession.ts +349 -0
  1910. package/src/utils/ultraplan/keyword.ts +127 -0
  1911. package/src/utils/ultraplan/prompt.txt +12 -0
  1912. package/src/utils/unaryLogging.ts +39 -0
  1913. package/src/utils/undercover.ts +89 -0
  1914. package/src/utils/user.ts +195 -0
  1915. package/src/utils/userAgent.ts +11 -0
  1916. package/src/utils/userPromptKeywords.ts +27 -0
  1917. package/src/utils/uuid.ts +27 -0
  1918. package/src/utils/warningHandler.ts +121 -0
  1919. package/src/utils/webSearchEnabled.ts +16 -0
  1920. package/src/utils/which.ts +82 -0
  1921. package/src/utils/windowsPaths.ts +173 -0
  1922. package/src/utils/withResolvers.ts +13 -0
  1923. package/src/utils/words.ts +800 -0
  1924. package/src/utils/workloadContext.ts +57 -0
  1925. package/src/utils/worktree.ts +1519 -0
  1926. package/src/utils/worktreeModeEnabled.ts +11 -0
  1927. package/src/utils/xdg.ts +65 -0
  1928. package/src/utils/xml.ts +16 -0
  1929. package/src/utils/yaml.ts +15 -0
  1930. package/src/utils/zodToJsonSchema.ts +23 -0
  1931. package/src/vim/motions.ts +82 -0
  1932. package/src/vim/operators.ts +556 -0
  1933. package/src/vim/textObjects.ts +186 -0
  1934. package/src/vim/transitions.ts +490 -0
  1935. package/src/vim/types.ts +199 -0
  1936. package/src/voice/voiceModeEnabled.ts +54 -0
@@ -0,0 +1,1709 @@
1
+ import { getAppVersion } from '../appVersion.js'
2
+ /**
3
+ * Native Installer Implementation
4
+ *
5
+ * This module implements the file-based native installer system described in
6
+ * docs/native-installer.md. It provides:
7
+ * - Directory structure management with symlinks
8
+ * - Version installation and activation
9
+ * - Multi-process safety with locking
10
+ * - Simple fallback mechanism using modification time
11
+ * - Support for both JS and native builds
12
+ */
13
+
14
+ import { constants as fsConstants, type Stats } from 'fs'
15
+ import {
16
+ access,
17
+ chmod,
18
+ copyFile,
19
+ lstat,
20
+ mkdir,
21
+ readdir,
22
+ readlink,
23
+ realpath,
24
+ rename,
25
+ rm,
26
+ rmdir,
27
+ stat,
28
+ symlink,
29
+ unlink,
30
+ writeFile,
31
+ } from 'fs/promises'
32
+ import { homedir } from 'os'
33
+ import { basename, delimiter, dirname, join, resolve } from 'path'
34
+ import {
35
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
36
+ logEvent,
37
+ } from 'src/services/analytics/index.js'
38
+ import { getMaxVersion, shouldSkipVersion } from '../autoUpdater.js'
39
+ import { registerCleanup } from '../cleanupRegistry.js'
40
+ import { getGlobalConfig, saveGlobalConfig } from '../config.js'
41
+ import { logForDebugging } from '../debug.js'
42
+ import { getCurrentInstallationType } from '../doctorDiagnostic.js'
43
+ import { env } from '../env.js'
44
+ import { envDynamic } from '../envDynamic.js'
45
+ import { isEnvTruthy } from '../envUtils.js'
46
+ import { errorMessage, getErrnoCode, isENOENT, toError } from '../errors.js'
47
+ import { execFileNoThrowWithCwd } from '../execFileNoThrow.js'
48
+ import { getShellType } from '../localInstaller.js'
49
+ import * as lockfile from '../lockfile.js'
50
+ import { logError } from '../log.js'
51
+ import { gt, gte } from '../semver.js'
52
+ import {
53
+ filterClaudeAliases,
54
+ getShellConfigPaths,
55
+ readFileLines,
56
+ writeFileLines,
57
+ } from '../shellConfig.js'
58
+ import { sleep } from '../sleep.js'
59
+ import {
60
+ getUserBinDir,
61
+ getXDGCacheHome,
62
+ getXDGDataHome,
63
+ getXDGStateHome,
64
+ } from '../xdg.js'
65
+ import { downloadVersion, getLatestVersion } from './download.js'
66
+ import {
67
+ acquireProcessLifetimeLock,
68
+ cleanupStaleLocks,
69
+ isLockActive,
70
+ isPidBasedLockingEnabled,
71
+ readLockContent,
72
+ withLock,
73
+ } from './pidLock.js'
74
+
75
+ export const VERSION_RETENTION_COUNT = 2
76
+
77
+ // 7 days in milliseconds - used for mtime-based lock stale timeout.
78
+ // This is long enough to survive laptop sleep durations while still
79
+ // allowing cleanup of abandoned locks from crashed processes within a reasonable time.
80
+ const LOCK_STALE_MS = 7 * 24 * 60 * 60 * 1000
81
+
82
+ export type SetupMessage = {
83
+ message: string
84
+ userActionRequired: boolean
85
+ type: 'path' | 'alias' | 'info' | 'error'
86
+ }
87
+
88
+ export function getPlatform(): string {
89
+ // Use env.platform which already handles platform detection and defaults to 'linux'
90
+ const os = env.platform
91
+
92
+ const arch =
93
+ process.arch === 'x64' ? 'x64' : process.arch === 'arm64' ? 'arm64' : null
94
+
95
+ if (!arch) {
96
+ const error = new Error(`Unsupported architecture: ${process.arch}`)
97
+ logForDebugging(
98
+ `Native installer does not support architecture: ${process.arch}`,
99
+ { level: 'error' },
100
+ )
101
+ throw error
102
+ }
103
+
104
+ // Check for musl on Linux and adjust platform accordingly
105
+ if (os === 'linux' && envDynamic.isMuslEnvironment()) {
106
+ return `linux-${arch}-musl`
107
+ }
108
+
109
+ return `${os}-${arch}`
110
+ }
111
+
112
+ export function getBinaryName(platform: string): string {
113
+ return platform.startsWith('win32') ? 'claude.exe' : 'claude'
114
+ }
115
+
116
+ function getBaseDirectories() {
117
+ const platform = getPlatform()
118
+ const executableName = getBinaryName(platform)
119
+
120
+ return {
121
+ // Data directories (permanent storage)
122
+ versions: join(getXDGDataHome(), 'claude', 'versions'),
123
+
124
+ // Cache directories (can be deleted)
125
+ staging: join(getXDGCacheHome(), 'claude', 'staging'),
126
+
127
+ // State directories
128
+ locks: join(getXDGStateHome(), 'claude', 'locks'),
129
+
130
+ // User bin
131
+ executable: join(getUserBinDir(), executableName),
132
+ }
133
+ }
134
+
135
+ async function isPossibleClaudeBinary(filePath: string): Promise<boolean> {
136
+ try {
137
+ const stats = await stat(filePath)
138
+ // before download, the version lock file (located at the same filePath) will be size 0
139
+ // also, we allow small sizes because we want to treat small wrapper scripts as valid
140
+ if (!stats.isFile() || stats.size === 0) {
141
+ return false
142
+ }
143
+
144
+ // Check if file is executable. Note: On Windows, this relies on file extensions
145
+ // (.exe, .bat, .cmd) and ACL permissions rather than Unix permission bits,
146
+ // so it may not work perfectly for all executable files on Windows.
147
+ await access(filePath, fsConstants.X_OK)
148
+ return true
149
+ } catch {
150
+ return false
151
+ }
152
+ }
153
+
154
+ async function getVersionPaths(version: string) {
155
+ const dirs = getBaseDirectories()
156
+
157
+ // Create directories, but not the executable path (which is a file)
158
+ const dirsToCreate = [dirs.versions, dirs.staging, dirs.locks]
159
+ await Promise.all(dirsToCreate.map(dir => mkdir(dir, { recursive: true })))
160
+
161
+ // Ensure parent directory of executable exists
162
+ const executableParentDir = dirname(dirs.executable)
163
+ await mkdir(executableParentDir, { recursive: true })
164
+
165
+ const installPath = join(dirs.versions, version)
166
+
167
+ // Create an empty file if it doesn't exist
168
+ try {
169
+ await stat(installPath)
170
+ } catch {
171
+ await writeFile(installPath, '', { encoding: 'utf8' })
172
+ }
173
+
174
+ return {
175
+ stagingPath: join(dirs.staging, version),
176
+ installPath,
177
+ }
178
+ }
179
+
180
+ // Execute a callback while holding a lock on a version file
181
+ // Returns false if the file is already locked, true if callback executed
182
+ async function tryWithVersionLock(
183
+ versionFilePath: string,
184
+ callback: () => void | Promise<void>,
185
+ retries = 0,
186
+ ): Promise<boolean> {
187
+ const dirs = getBaseDirectories()
188
+
189
+ const lockfilePath = getLockFilePathFromVersionPath(dirs, versionFilePath)
190
+
191
+ // Ensure the locks directory exists
192
+ await mkdir(dirs.locks, { recursive: true })
193
+
194
+ if (isPidBasedLockingEnabled()) {
195
+ // Use PID-based locking with optional retries
196
+ let attempts = 0
197
+ const maxAttempts = retries + 1
198
+ const minTimeout = retries > 0 ? 1000 : 100
199
+ const maxTimeout = retries > 0 ? 5000 : 500
200
+
201
+ while (attempts < maxAttempts) {
202
+ const success = await withLock(
203
+ versionFilePath,
204
+ lockfilePath,
205
+ async () => {
206
+ try {
207
+ await callback()
208
+ } catch (error) {
209
+ logError(error)
210
+ throw error
211
+ }
212
+ },
213
+ )
214
+
215
+ if (success) {
216
+ logEvent('tengu_version_lock_acquired', {
217
+ is_pid_based: true,
218
+ is_lifetime_lock: false,
219
+ attempts: attempts + 1,
220
+ })
221
+ return true
222
+ }
223
+
224
+ attempts++
225
+ if (attempts < maxAttempts) {
226
+ // Wait before retrying with exponential backoff
227
+ const timeout = Math.min(
228
+ minTimeout * Math.pow(2, attempts - 1),
229
+ maxTimeout,
230
+ )
231
+ await sleep(timeout)
232
+ }
233
+ }
234
+
235
+ logEvent('tengu_version_lock_failed', {
236
+ is_pid_based: true,
237
+ is_lifetime_lock: false,
238
+ attempts: maxAttempts,
239
+ })
240
+ logLockAcquisitionError(
241
+ versionFilePath,
242
+ new Error('Lock held by another process'),
243
+ )
244
+ return false
245
+ }
246
+
247
+ // Use mtime-based locking (proper-lockfile) with 30-day stale timeout
248
+ let release: (() => Promise<void>) | null = null
249
+ try {
250
+ // Lock acquisition phase - catch lock errors and return false
251
+ // Use 30 days for stale to match lockCurrentVersion() - this ensures we never
252
+ // consider a running process's lock as stale during normal usage (including
253
+ // laptop sleep). 30 days allows eventual cleanup of abandoned locks from
254
+ // crashed processes while being long enough for any realistic session.
255
+ try {
256
+ release = await lockfile.lock(versionFilePath, {
257
+ stale: LOCK_STALE_MS,
258
+ retries: {
259
+ retries,
260
+ minTimeout: retries > 0 ? 1000 : 100,
261
+ maxTimeout: retries > 0 ? 5000 : 500,
262
+ },
263
+ lockfilePath,
264
+ // Handle lock compromise gracefully to prevent unhandled rejections
265
+ // This can happen if another process deletes the lock directory while we hold it
266
+ onCompromised: (err: Error) => {
267
+ logForDebugging(
268
+ `NON-FATAL: Version lock was compromised during operation: ${err.message}`,
269
+ { level: 'info' },
270
+ )
271
+ },
272
+ })
273
+ } catch (lockError) {
274
+ logEvent('tengu_version_lock_failed', {
275
+ is_pid_based: false,
276
+ is_lifetime_lock: false,
277
+ })
278
+ logLockAcquisitionError(versionFilePath, lockError)
279
+ return false
280
+ }
281
+
282
+ // Operation phase - log errors but let them propagate
283
+ try {
284
+ await callback()
285
+ logEvent('tengu_version_lock_acquired', {
286
+ is_pid_based: false,
287
+ is_lifetime_lock: false,
288
+ })
289
+ return true
290
+ } catch (error) {
291
+ logError(error)
292
+ throw error
293
+ }
294
+ } finally {
295
+ if (release) {
296
+ await release()
297
+ }
298
+ }
299
+ }
300
+
301
+ async function atomicMoveToInstallPath(
302
+ stagedBinaryPath: string,
303
+ installPath: string,
304
+ ) {
305
+ // Create installation directory if it doesn't exist
306
+ await mkdir(dirname(installPath), { recursive: true })
307
+
308
+ // Move from staging to final location atomically
309
+ const tempInstallPath = `${installPath}.tmp.${process.pid}.${Date.now()}`
310
+
311
+ try {
312
+ // Copy to temp next to install path, then rename. A direct rename from staging
313
+ // would fail with EXDEV if staging and install are on different filesystems.
314
+ await copyFile(stagedBinaryPath, tempInstallPath)
315
+ await chmod(tempInstallPath, 0o755)
316
+ await rename(tempInstallPath, installPath)
317
+ logForDebugging(`Atomically installed binary to ${installPath}`)
318
+ } catch (error) {
319
+ // Clean up temp file if it exists
320
+ try {
321
+ await unlink(tempInstallPath)
322
+ } catch {
323
+ // Ignore cleanup errors
324
+ }
325
+ throw error
326
+ }
327
+ }
328
+
329
+ async function installVersionFromPackage(
330
+ stagingPath: string,
331
+ installPath: string,
332
+ ) {
333
+ try {
334
+ // Extract binary from npm package structure in staging
335
+ const nodeModulesDir = join(stagingPath, 'node_modules', '@anthropic-ai')
336
+ const entries = await readdir(nodeModulesDir)
337
+ const nativePackage = entries.find((entry: string) =>
338
+ entry.startsWith('claude-cli-native-'),
339
+ )
340
+
341
+ if (!nativePackage) {
342
+ logEvent('tengu_native_install_package_failure', {
343
+ stage_find_package: true,
344
+ error_package_not_found: true,
345
+ })
346
+ const error = new Error('Could not find platform-specific native package')
347
+ throw error
348
+ }
349
+
350
+ const stagedBinaryPath = join(nodeModulesDir, nativePackage, 'cli')
351
+
352
+ try {
353
+ await stat(stagedBinaryPath)
354
+ } catch {
355
+ logEvent('tengu_native_install_package_failure', {
356
+ stage_binary_exists: true,
357
+ error_binary_not_found: true,
358
+ })
359
+ const error = new Error('Native binary not found in staged package')
360
+ throw error
361
+ }
362
+
363
+ await atomicMoveToInstallPath(stagedBinaryPath, installPath)
364
+
365
+ // Clean up staging directory
366
+ await rm(stagingPath, { recursive: true, force: true })
367
+
368
+ logEvent('tengu_native_install_package_success', {})
369
+ } catch (error) {
370
+ // Log if not already logged above
371
+ const msg = errorMessage(error)
372
+ if (
373
+ !msg.includes('Could not find platform-specific') &&
374
+ !msg.includes('Native binary not found')
375
+ ) {
376
+ logEvent('tengu_native_install_package_failure', {
377
+ stage_atomic_move: true,
378
+ error_move_failed: true,
379
+ })
380
+ }
381
+ logError(toError(error))
382
+ throw error
383
+ }
384
+ }
385
+
386
+ async function installVersionFromBinary(
387
+ stagingPath: string,
388
+ installPath: string,
389
+ ) {
390
+ try {
391
+ // For direct binary downloads (GCS, generic bucket), the binary is directly in staging
392
+ const platform = getPlatform()
393
+ const binaryName = getBinaryName(platform)
394
+ const stagedBinaryPath = join(stagingPath, binaryName)
395
+
396
+ try {
397
+ await stat(stagedBinaryPath)
398
+ } catch {
399
+ logEvent('tengu_native_install_binary_failure', {
400
+ stage_binary_exists: true,
401
+ error_binary_not_found: true,
402
+ })
403
+ const error = new Error('Staged binary not found')
404
+ throw error
405
+ }
406
+
407
+ await atomicMoveToInstallPath(stagedBinaryPath, installPath)
408
+
409
+ // Clean up staging directory
410
+ await rm(stagingPath, { recursive: true, force: true })
411
+
412
+ logEvent('tengu_native_install_binary_success', {})
413
+ } catch (error) {
414
+ if (!errorMessage(error).includes('Staged binary not found')) {
415
+ logEvent('tengu_native_install_binary_failure', {
416
+ stage_atomic_move: true,
417
+ error_move_failed: true,
418
+ })
419
+ }
420
+ logError(toError(error))
421
+ throw error
422
+ }
423
+ }
424
+
425
+ async function installVersion(
426
+ stagingPath: string,
427
+ installPath: string,
428
+ downloadType: 'npm' | 'binary',
429
+ ) {
430
+ // Use the explicit download type instead of guessing
431
+ if (downloadType === 'npm') {
432
+ await installVersionFromPackage(stagingPath, installPath)
433
+ } else {
434
+ await installVersionFromBinary(stagingPath, installPath)
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Performs the core update operation: download (if needed), install, and update symlink.
440
+ * Returns whether a new install was performed (vs just updating symlink).
441
+ */
442
+ async function performVersionUpdate(
443
+ version: string,
444
+ forceReinstall: boolean,
445
+ ): Promise<boolean> {
446
+ const { stagingPath: baseStagingPath, installPath } =
447
+ await getVersionPaths(version)
448
+ const { executable: executablePath } = getBaseDirectories()
449
+
450
+ // For lockless updates, use a unique staging path to avoid conflicts between concurrent downloads
451
+ const stagingPath = isEnvTruthy(process.env.ENABLE_LOCKLESS_UPDATES)
452
+ ? `${baseStagingPath}.${process.pid}.${Date.now()}`
453
+ : baseStagingPath
454
+
455
+ // Only download if not already installed (or if force reinstall)
456
+ const needsInstall = !(await versionIsAvailable(version)) || forceReinstall
457
+ if (needsInstall) {
458
+ logForDebugging(
459
+ forceReinstall
460
+ ? `Force reinstalling native installer version ${version}`
461
+ : `Downloading native installer version ${version}`,
462
+ )
463
+ const downloadType = await downloadVersion(version, stagingPath)
464
+ await installVersion(stagingPath, installPath, downloadType)
465
+ } else {
466
+ logForDebugging(`Version ${version} already installed, updating symlink`)
467
+ }
468
+
469
+ // Create direct symlink from ~/.local/bin/claude to the version binary
470
+ await removeDirectoryIfEmpty(executablePath)
471
+ await updateSymlink(executablePath, installPath)
472
+
473
+ // Verify the executable was actually created/updated
474
+ if (!(await isPossibleClaudeBinary(executablePath))) {
475
+ let installPathExists = false
476
+ try {
477
+ await stat(installPath)
478
+ installPathExists = true
479
+ } catch {
480
+ // installPath doesn't exist
481
+ }
482
+ throw new Error(
483
+ `Failed to create executable at ${executablePath}. ` +
484
+ `Source file exists: ${installPathExists}. ` +
485
+ `Check write permissions to ${executablePath}.`,
486
+ )
487
+ }
488
+ return needsInstall
489
+ }
490
+
491
+ async function versionIsAvailable(version: string): Promise<boolean> {
492
+ const { installPath } = await getVersionPaths(version)
493
+ return isPossibleClaudeBinary(installPath)
494
+ }
495
+
496
+ async function updateLatest(
497
+ channelOrVersion: string,
498
+ forceReinstall: boolean = false,
499
+ ): Promise<{
500
+ success: boolean
501
+ latestVersion: string
502
+ lockFailed?: boolean
503
+ lockHolderPid?: number
504
+ }> {
505
+ const startTime = Date.now()
506
+ let version = await getLatestVersion(channelOrVersion)
507
+ const { executable: executablePath } = getBaseDirectories()
508
+
509
+ logForDebugging(`Checking for native installer update to version ${version}`)
510
+
511
+ // Check if max version is set (server-side kill switch for auto-updates)
512
+ if (!forceReinstall) {
513
+ const maxVersion = await getMaxVersion()
514
+ if (maxVersion && gt(version, maxVersion)) {
515
+ logForDebugging(
516
+ `Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`,
517
+ )
518
+ // If we're already at or above maxVersion, skip the update entirely
519
+ if (gte(getAppVersion(), maxVersion)) {
520
+ logForDebugging(
521
+ `Native installer: current version ${getAppVersion()} is already at or above maxVersion ${maxVersion}, skipping update`,
522
+ )
523
+ logEvent('tengu_native_update_skipped_max_version', {
524
+ latency_ms: Date.now() - startTime,
525
+ max_version:
526
+ maxVersion as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
527
+ available_version:
528
+ version as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
529
+ })
530
+ return { success: true, latestVersion: version }
531
+ }
532
+ version = maxVersion
533
+ }
534
+ }
535
+
536
+ // Early exit: if we're already running this exact version AND both the version binary
537
+ // and executable exist and are valid. We need to proceed if the executable doesn't exist,
538
+ // is invalid (e.g., empty/corrupted from a failed install), or we're running via npx.
539
+ if (
540
+ !forceReinstall &&
541
+ version === getAppVersion() &&
542
+ (await versionIsAvailable(version)) &&
543
+ (await isPossibleClaudeBinary(executablePath))
544
+ ) {
545
+ logForDebugging(`Found ${version} at ${executablePath}, skipping install`)
546
+ logEvent('tengu_native_update_complete', {
547
+ latency_ms: Date.now() - startTime,
548
+ was_new_install: false,
549
+ was_force_reinstall: false,
550
+ was_already_running: true,
551
+ })
552
+ return { success: true, latestVersion: version }
553
+ }
554
+
555
+ // Check if this version should be skipped due to minimumVersion setting
556
+ if (!forceReinstall && shouldSkipVersion(version)) {
557
+ logEvent('tengu_native_update_skipped_minimum_version', {
558
+ latency_ms: Date.now() - startTime,
559
+ target_version:
560
+ version as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
561
+ })
562
+ return { success: true, latestVersion: version }
563
+ }
564
+
565
+ // Track if we're actually installing or just symlinking
566
+ let wasNewInstall = false
567
+ let latencyMs: number
568
+
569
+ if (isEnvTruthy(process.env.ENABLE_LOCKLESS_UPDATES)) {
570
+ // Lockless: rely on atomic operations, errors propagate
571
+ wasNewInstall = await performVersionUpdate(version, forceReinstall)
572
+ latencyMs = Date.now() - startTime
573
+ } else {
574
+ // Lock-based updates
575
+ const { installPath } = await getVersionPaths(version)
576
+ // If force reinstall, remove any existing lock to bypass stale locks
577
+ if (forceReinstall) {
578
+ await forceRemoveLock(installPath)
579
+ }
580
+
581
+ const lockAcquired = await tryWithVersionLock(
582
+ installPath,
583
+ async () => {
584
+ wasNewInstall = await performVersionUpdate(version, forceReinstall)
585
+ },
586
+ 3, // retries
587
+ )
588
+
589
+ latencyMs = Date.now() - startTime
590
+
591
+ // Lock acquisition failed - get lock holder PID for error message
592
+ if (!lockAcquired) {
593
+ const dirs = getBaseDirectories()
594
+ let lockHolderPid: number | undefined
595
+ if (isPidBasedLockingEnabled()) {
596
+ const lockfilePath = getLockFilePathFromVersionPath(dirs, installPath)
597
+ if (isLockActive(lockfilePath)) {
598
+ lockHolderPid = readLockContent(lockfilePath)?.pid
599
+ }
600
+ }
601
+ logEvent('tengu_native_update_lock_failed', {
602
+ latency_ms: latencyMs,
603
+ lock_holder_pid: lockHolderPid,
604
+ })
605
+ return {
606
+ success: false,
607
+ latestVersion: version,
608
+ lockFailed: true,
609
+ lockHolderPid,
610
+ }
611
+ }
612
+ }
613
+
614
+ logEvent('tengu_native_update_complete', {
615
+ latency_ms: latencyMs,
616
+ was_new_install: wasNewInstall,
617
+ was_force_reinstall: forceReinstall,
618
+ })
619
+ logForDebugging(`Successfully updated to version ${version}`)
620
+ return { success: true, latestVersion: version }
621
+ }
622
+
623
+ // Exported for testing
624
+ export async function removeDirectoryIfEmpty(path: string): Promise<void> {
625
+ // rmdir alone handles all cases: ENOTDIR if path is a file, ENOTEMPTY if
626
+ // directory is non-empty, ENOENT if missing. No need to stat+readdir first.
627
+ try {
628
+ await rmdir(path)
629
+ logForDebugging(`Removed empty directory at ${path}`)
630
+ } catch (error) {
631
+ const code = getErrnoCode(error)
632
+ // Expected cases (not-a-dir, missing, not-empty) — silently skip.
633
+ // ENOTDIR is the normal path: executablePath is typically a symlink.
634
+ if (code !== 'ENOTDIR' && code !== 'ENOENT' && code !== 'ENOTEMPTY') {
635
+ logForDebugging(`Could not remove directory at ${path}: ${error}`)
636
+ }
637
+ }
638
+ }
639
+
640
+ async function updateSymlink(
641
+ symlinkPath: string,
642
+ targetPath: string,
643
+ ): Promise<boolean> {
644
+ const platform = getPlatform()
645
+ const isWindows = platform.startsWith('win32')
646
+
647
+ // On Windows, directly copy the executable instead of creating a symlink
648
+ if (isWindows) {
649
+ try {
650
+ // Ensure parent directory exists
651
+ const parentDir = dirname(symlinkPath)
652
+ await mkdir(parentDir, { recursive: true })
653
+
654
+ // Check if file already exists and has same content
655
+ let existingStats: Stats | undefined
656
+ try {
657
+ existingStats = await stat(symlinkPath)
658
+ } catch {
659
+ // symlinkPath doesn't exist
660
+ }
661
+
662
+ if (existingStats) {
663
+ try {
664
+ const targetStats = await stat(targetPath)
665
+ // If sizes match, assume files are the same (avoid reading large files)
666
+ if (existingStats.size === targetStats.size) {
667
+ return false
668
+ }
669
+ } catch {
670
+ // Continue with copy if we can't compare
671
+ }
672
+ // Use rename strategy to handle file locking on Windows
673
+ // Rename always works even for running executables, unlike delete
674
+ const oldFileName = `${symlinkPath}.old.${Date.now()}`
675
+ await rename(symlinkPath, oldFileName)
676
+
677
+ // Try to copy new executable, with rollback on failure
678
+ try {
679
+ await copyFile(targetPath, symlinkPath)
680
+ // Success - try immediate cleanup of old file (non-blocking)
681
+ try {
682
+ await unlink(oldFileName)
683
+ } catch {
684
+ // File still running - ignore, Windows will clean up eventually
685
+ }
686
+ } catch (copyError) {
687
+ // Copy failed - restore the old executable
688
+ try {
689
+ await rename(oldFileName, symlinkPath)
690
+ } catch (restoreError) {
691
+ // Critical: User left without working executable - prioritize restore error
692
+ const errorWithCause = new Error(
693
+ `Failed to restore old executable: ${restoreError}`,
694
+ { cause: copyError },
695
+ )
696
+ logError(errorWithCause)
697
+ throw errorWithCause
698
+ }
699
+ throw copyError
700
+ }
701
+ } else {
702
+ // First-time installation (no existing file to rename)
703
+ // Copy the executable directly; handle ENOENT from copyFile itself
704
+ // rather than a stat() pre-check (avoids TOCTOU + extra syscall)
705
+ try {
706
+ await copyFile(targetPath, symlinkPath)
707
+ } catch (e) {
708
+ if (isENOENT(e)) {
709
+ throw new Error(`Source file does not exist: ${targetPath}`)
710
+ }
711
+ throw e
712
+ }
713
+ }
714
+ // chmod is not needed on Windows - executability is determined by .exe extension
715
+ return true
716
+ } catch (error) {
717
+ logError(
718
+ new Error(
719
+ `Failed to copy executable from ${targetPath} to ${symlinkPath}: ${error}`,
720
+ ),
721
+ )
722
+ return false
723
+ }
724
+ }
725
+
726
+ // For non-Windows platforms, use symlinks as before
727
+ // Ensure parent directory exists (same as Windows path above)
728
+ const parentDir = dirname(symlinkPath)
729
+ try {
730
+ await mkdir(parentDir, { recursive: true })
731
+ logForDebugging(`Created directory ${parentDir} for symlink`)
732
+ } catch (mkdirError) {
733
+ logError(
734
+ new Error(`Failed to create directory ${parentDir}: ${mkdirError}`),
735
+ )
736
+ return false
737
+ }
738
+
739
+ // Check if symlink already exists and points to the correct target
740
+ try {
741
+ let symlinkExists = false
742
+ try {
743
+ await stat(symlinkPath)
744
+ symlinkExists = true
745
+ } catch {
746
+ // symlinkPath doesn't exist
747
+ }
748
+
749
+ if (symlinkExists) {
750
+ try {
751
+ const currentTarget = await readlink(symlinkPath)
752
+ const resolvedCurrentTarget = resolve(
753
+ dirname(symlinkPath),
754
+ currentTarget,
755
+ )
756
+ const resolvedTargetPath = resolve(targetPath)
757
+
758
+ if (resolvedCurrentTarget === resolvedTargetPath) {
759
+ return false
760
+ }
761
+ } catch {
762
+ // Path exists but is not a symlink - will remove it below
763
+ }
764
+
765
+ // Remove existing file/symlink before creating new one
766
+ await unlink(symlinkPath)
767
+ }
768
+ } catch (error) {
769
+ logError(new Error(`Failed to check/remove existing symlink: ${error}`))
770
+ }
771
+
772
+ // Use atomic rename to avoid race conditions. Create symlink with temporary name
773
+ // then atomically rename to final name. This ensures the symlink always exists
774
+ // and is always valid, even with concurrent updates.
775
+ const tempSymlink = `${symlinkPath}.tmp.${process.pid}.${Date.now()}`
776
+ try {
777
+ await symlink(targetPath, tempSymlink)
778
+
779
+ // Atomically rename to final name (replaces existing)
780
+ await rename(tempSymlink, symlinkPath)
781
+ logForDebugging(
782
+ `Atomically updated symlink ${symlinkPath} -> ${targetPath}`,
783
+ )
784
+ return true
785
+ } catch (error) {
786
+ // Clean up temp symlink if it exists
787
+ try {
788
+ await unlink(tempSymlink)
789
+ } catch {
790
+ // Ignore cleanup errors
791
+ }
792
+ logError(
793
+ new Error(
794
+ `Failed to create symlink from ${symlinkPath} to ${targetPath}: ${error}`,
795
+ ),
796
+ )
797
+ return false
798
+ }
799
+ }
800
+
801
+ export async function checkInstall(
802
+ force: boolean = false,
803
+ ): Promise<SetupMessage[]> {
804
+ // Skip all installation checks if disabled via environment variable
805
+ if (isEnvTruthy(process.env.DISABLE_INSTALLATION_CHECKS)) {
806
+ return []
807
+ }
808
+
809
+ // Get the actual installation type and config
810
+ const installationType = await getCurrentInstallationType()
811
+
812
+ // Skip checks for development builds - config.installMethod from a previous
813
+ // native installation shouldn't trigger warnings when running dev builds
814
+ if (installationType === 'development') {
815
+ return []
816
+ }
817
+
818
+ const config = getGlobalConfig()
819
+
820
+ // Only show warnings if:
821
+ // 1. User is actually running from native installation, OR
822
+ // 2. User has explicitly set installMethod to 'native' in config (they're trying to use native)
823
+ // 3. force is true (used during installation process)
824
+ const shouldCheckNative =
825
+ force || installationType === 'native' || config.installMethod === 'native'
826
+
827
+ if (!shouldCheckNative) {
828
+ return []
829
+ }
830
+
831
+ const dirs = getBaseDirectories()
832
+ const messages: SetupMessage[] = []
833
+ const localBinDir = dirname(dirs.executable)
834
+ const resolvedLocalBinPath = resolve(localBinDir)
835
+ const platform = getPlatform()
836
+ const isWindows = platform.startsWith('win32')
837
+
838
+ // Check if bin directory exists
839
+ try {
840
+ await access(localBinDir)
841
+ } catch {
842
+ messages.push({
843
+ message: `installMethod is native, but directory ${localBinDir} does not exist`,
844
+ userActionRequired: true,
845
+ type: 'error',
846
+ })
847
+ }
848
+
849
+ // Check if claude executable exists and is valid.
850
+ // On non-Windows, call readlink directly and route errno — ENOENT means
851
+ // the executable is missing, EINVAL means it exists but isn't a symlink.
852
+ // This avoids an access()→readlink() TOCTOU where deletion between the
853
+ // two calls produces a misleading "Not a symlink" diagnostic.
854
+ // isPossibleClaudeBinary stats the path internally, so we don't pre-check
855
+ // with access() — that would be a TOCTOU between access and the stat.
856
+ if (isWindows) {
857
+ // On Windows it's a copied executable, not a symlink
858
+ if (!(await isPossibleClaudeBinary(dirs.executable))) {
859
+ messages.push({
860
+ message: `installMethod is native, but claude command is missing or invalid at ${dirs.executable}`,
861
+ userActionRequired: true,
862
+ type: 'error',
863
+ })
864
+ }
865
+ } else {
866
+ try {
867
+ const target = await readlink(dirs.executable)
868
+ const absoluteTarget = resolve(dirname(dirs.executable), target)
869
+ if (!(await isPossibleClaudeBinary(absoluteTarget))) {
870
+ messages.push({
871
+ message: `Claude symlink points to missing or invalid binary: ${target}`,
872
+ userActionRequired: true,
873
+ type: 'error',
874
+ })
875
+ }
876
+ } catch (e) {
877
+ if (isENOENT(e)) {
878
+ messages.push({
879
+ message: `installMethod is native, but claude command not found at ${dirs.executable}`,
880
+ userActionRequired: true,
881
+ type: 'error',
882
+ })
883
+ } else {
884
+ // EINVAL (not a symlink) or other — check as regular binary
885
+ if (!(await isPossibleClaudeBinary(dirs.executable))) {
886
+ messages.push({
887
+ message: `${dirs.executable} exists but is not a valid Claude binary`,
888
+ userActionRequired: true,
889
+ type: 'error',
890
+ })
891
+ }
892
+ }
893
+ }
894
+ }
895
+
896
+ // Check if bin directory is in PATH
897
+ const isInCurrentPath = (process.env.PATH || '')
898
+ .split(delimiter)
899
+ .some(entry => {
900
+ try {
901
+ const resolvedEntry = resolve(entry)
902
+ // On Windows, perform case-insensitive comparison for paths
903
+ if (isWindows) {
904
+ return (
905
+ resolvedEntry.toLowerCase() === resolvedLocalBinPath.toLowerCase()
906
+ )
907
+ }
908
+ return resolvedEntry === resolvedLocalBinPath
909
+ } catch {
910
+ return false
911
+ }
912
+ })
913
+
914
+ if (!isInCurrentPath) {
915
+ if (isWindows) {
916
+ // Windows-specific PATH instructions
917
+ const windowsBinPath = localBinDir.replace(/\//g, '\\')
918
+ messages.push({
919
+ message: `Native installation exists but ${windowsBinPath} is not in your PATH. Add it by opening: System Properties → Environment Variables → Edit User PATH → New → Add the path above. Then restart your terminal.`,
920
+ userActionRequired: true,
921
+ type: 'path',
922
+ })
923
+ } else {
924
+ // Unix-style PATH instructions
925
+ const shellType = getShellType()
926
+ const configPaths = getShellConfigPaths()
927
+ const configFile = configPaths[shellType as keyof typeof configPaths]
928
+ const displayPath = configFile
929
+ ? configFile.replace(homedir(), '~')
930
+ : 'your shell config file'
931
+
932
+ messages.push({
933
+ message: `Native installation exists but ~/.local/bin is not in your PATH. Run:\n\necho 'export PATH="$HOME/.local/bin:$PATH"' >> ${displayPath} && source ${displayPath}`,
934
+ userActionRequired: true,
935
+ type: 'path',
936
+ })
937
+ }
938
+ }
939
+
940
+ return messages
941
+ }
942
+
943
+ type InstallLatestResult = {
944
+ latestVersion: string | null
945
+ wasUpdated: boolean
946
+ lockFailed?: boolean
947
+ lockHolderPid?: number
948
+ }
949
+
950
+ // In-process singleflight guard. NativeAutoUpdater remounts whenever the
951
+ // prompt suggestions overlay toggles (PromptInput.tsx:2916), and the
952
+ // isUpdating guard does not survive the remount. Each remount kicked off a
953
+ // fresh 271MB binary download while previous ones were still in flight.
954
+ // Telemetry: session 42fed33f saw arrayBuffers climb to 91GB at ~650MB/s.
955
+ let inFlightInstall: Promise<InstallLatestResult> | null = null
956
+
957
+ export function installLatest(
958
+ channelOrVersion: string,
959
+ forceReinstall: boolean = false,
960
+ ): Promise<InstallLatestResult> {
961
+ if (forceReinstall) {
962
+ return installLatestImpl(channelOrVersion, forceReinstall)
963
+ }
964
+ if (inFlightInstall) {
965
+ logForDebugging('installLatest: joining in-flight call')
966
+ return inFlightInstall
967
+ }
968
+ const promise = installLatestImpl(channelOrVersion, forceReinstall)
969
+ inFlightInstall = promise
970
+ const clear = (): void => {
971
+ inFlightInstall = null
972
+ }
973
+ void promise.then(clear, clear)
974
+ return promise
975
+ }
976
+
977
+ async function installLatestImpl(
978
+ channelOrVersion: string,
979
+ forceReinstall: boolean = false,
980
+ ): Promise<InstallLatestResult> {
981
+ const updateResult = await updateLatest(channelOrVersion, forceReinstall)
982
+
983
+ if (!updateResult.success) {
984
+ return {
985
+ latestVersion: null,
986
+ wasUpdated: false,
987
+ lockFailed: updateResult.lockFailed,
988
+ lockHolderPid: updateResult.lockHolderPid,
989
+ }
990
+ }
991
+
992
+ // Installation succeeded (early return above covers failure). Mark as native
993
+ // and disable legacy auto-updater to protect symlinks.
994
+ const config = getGlobalConfig()
995
+ if (config.installMethod !== 'native') {
996
+ saveGlobalConfig(current => ({
997
+ ...current,
998
+ installMethod: 'native',
999
+ // Disable legacy auto-updater to prevent npm sessions from deleting native symlinks.
1000
+ // Native installations use NativeAutoUpdater instead, which respects native installation.
1001
+ autoUpdates: false,
1002
+ // Mark this as protection-based, not user preference
1003
+ autoUpdatesProtectedForNative: true,
1004
+ }))
1005
+ logForDebugging(
1006
+ 'Native installer: Set installMethod to "native" and disabled legacy auto-updater for protection',
1007
+ )
1008
+ }
1009
+
1010
+ void cleanupOldVersions()
1011
+
1012
+ return {
1013
+ latestVersion: updateResult.latestVersion,
1014
+ wasUpdated: updateResult.success,
1015
+ lockFailed: false,
1016
+ }
1017
+ }
1018
+
1019
+ async function getVersionFromSymlink(
1020
+ symlinkPath: string,
1021
+ ): Promise<string | null> {
1022
+ try {
1023
+ const target = await readlink(symlinkPath)
1024
+ const absoluteTarget = resolve(dirname(symlinkPath), target)
1025
+ if (await isPossibleClaudeBinary(absoluteTarget)) {
1026
+ return absoluteTarget
1027
+ }
1028
+ } catch {
1029
+ // Not a symlink / doesn't exist / target doesn't exist
1030
+ }
1031
+ return null
1032
+ }
1033
+
1034
+ function getLockFilePathFromVersionPath(
1035
+ dirs: ReturnType<typeof getBaseDirectories>,
1036
+ versionPath: string,
1037
+ ) {
1038
+ const versionName = basename(versionPath)
1039
+ return join(dirs.locks, `${versionName}.lock`)
1040
+ }
1041
+
1042
+ /**
1043
+ * Acquire a lock on the current running version to prevent it from being deleted
1044
+ * This lock is held for the entire lifetime of the process
1045
+ *
1046
+ * Uses PID-based locking (when enabled) which can immediately detect crashed processes
1047
+ * (unlike mtime-based locking which requires a 30-day timeout)
1048
+ */
1049
+ export async function lockCurrentVersion(): Promise<void> {
1050
+ const dirs = getBaseDirectories()
1051
+
1052
+ // Only lock if we're running from the versions directory
1053
+ if (!process.execPath.includes(dirs.versions)) {
1054
+ return
1055
+ }
1056
+
1057
+ const versionPath = resolve(process.execPath)
1058
+ try {
1059
+ const lockfilePath = getLockFilePathFromVersionPath(dirs, versionPath)
1060
+
1061
+ // Ensure locks directory exists
1062
+ await mkdir(dirs.locks, { recursive: true })
1063
+
1064
+ if (isPidBasedLockingEnabled()) {
1065
+ // Acquire PID-based lock and hold it for the process lifetime
1066
+ // PID-based locking allows immediate detection of crashed processes
1067
+ // while still surviving laptop sleep (process is suspended but PID exists)
1068
+ const acquired = await acquireProcessLifetimeLock(
1069
+ versionPath,
1070
+ lockfilePath,
1071
+ )
1072
+
1073
+ if (!acquired) {
1074
+ logEvent('tengu_version_lock_failed', {
1075
+ is_pid_based: true,
1076
+ is_lifetime_lock: true,
1077
+ })
1078
+ logLockAcquisitionError(
1079
+ versionPath,
1080
+ new Error('Lock already held by another process'),
1081
+ )
1082
+ return
1083
+ }
1084
+
1085
+ logEvent('tengu_version_lock_acquired', {
1086
+ is_pid_based: true,
1087
+ is_lifetime_lock: true,
1088
+ })
1089
+ logForDebugging(`Acquired PID lock on running version: ${versionPath}`)
1090
+ } else {
1091
+ // Acquire mtime-based lock and never release it (until process exits)
1092
+ // Use 30 days for stale to prevent the lock from being considered stale during
1093
+ // normal usage. This is critical because laptop sleep suspends the process,
1094
+ // stopping the mtime heartbeat. 30 days is long enough for any realistic session
1095
+ // while still allowing eventual cleanup of abandoned locks.
1096
+ let release: (() => Promise<void>) | undefined
1097
+ try {
1098
+ release = await lockfile.lock(versionPath, {
1099
+ stale: LOCK_STALE_MS,
1100
+ retries: 0, // Don't retry - if we can't lock, that's fine
1101
+ lockfilePath,
1102
+ // Handle lock compromise gracefully (e.g., if another process deletes the lock directory)
1103
+ onCompromised: (err: Error) => {
1104
+ logForDebugging(
1105
+ `NON-FATAL: Lock on running version was compromised: ${err.message}`,
1106
+ { level: 'info' },
1107
+ )
1108
+ },
1109
+ })
1110
+ logEvent('tengu_version_lock_acquired', {
1111
+ is_pid_based: false,
1112
+ is_lifetime_lock: true,
1113
+ })
1114
+ logForDebugging(
1115
+ `Acquired mtime-based lock on running version: ${versionPath}`,
1116
+ )
1117
+
1118
+ // Release lock explicitly; proper-lockfile's cleanup is unreliable with signal-exit v3+v4
1119
+ registerCleanup(async () => {
1120
+ try {
1121
+ await release?.()
1122
+ } catch {
1123
+ // Lock may already be released
1124
+ }
1125
+ })
1126
+ } catch (lockError) {
1127
+ if (isENOENT(lockError)) {
1128
+ logForDebugging(
1129
+ `Cannot lock current version - file does not exist: ${versionPath}`,
1130
+ { level: 'info' },
1131
+ )
1132
+ return
1133
+ }
1134
+ logEvent('tengu_version_lock_failed', {
1135
+ is_pid_based: false,
1136
+ is_lifetime_lock: true,
1137
+ })
1138
+ logLockAcquisitionError(versionPath, lockError)
1139
+ return
1140
+ }
1141
+ }
1142
+ } catch (error) {
1143
+ if (isENOENT(error)) {
1144
+ logForDebugging(
1145
+ `Cannot lock current version - file does not exist: ${versionPath}`,
1146
+ { level: 'info' },
1147
+ )
1148
+ return
1149
+ }
1150
+ // We fallback to previous behavior where we don't acquire a lock on a running version
1151
+ // This ~mostly works but using native binaries like ripgrep will fail
1152
+ logForDebugging(
1153
+ `NON-FATAL: Failed to lock current version during execution ${errorMessage(error)}`,
1154
+ { level: 'info' },
1155
+ )
1156
+ }
1157
+ }
1158
+
1159
+ function logLockAcquisitionError(versionPath: string, lockError: unknown) {
1160
+ logError(
1161
+ new Error(
1162
+ `NON-FATAL: Lock acquisition failed for ${versionPath} (expected in multi-process scenarios)`,
1163
+ { cause: lockError },
1164
+ ),
1165
+ )
1166
+ }
1167
+
1168
+ /**
1169
+ * Force-remove a lock file for a given version path.
1170
+ * Used when --force is specified to bypass stale locks.
1171
+ */
1172
+ async function forceRemoveLock(versionFilePath: string): Promise<void> {
1173
+ const dirs = getBaseDirectories()
1174
+ const lockfilePath = getLockFilePathFromVersionPath(dirs, versionFilePath)
1175
+
1176
+ try {
1177
+ await unlink(lockfilePath)
1178
+ logForDebugging(`Force-removed lock file at ${lockfilePath}`)
1179
+ } catch (error) {
1180
+ // Log but don't throw - we'll try to acquire the lock anyway
1181
+ logForDebugging(`Failed to force-remove lock file: ${errorMessage(error)}`)
1182
+ }
1183
+ }
1184
+
1185
+ export async function cleanupOldVersions(): Promise<void> {
1186
+ // Yield to ensure we don't block startup
1187
+ await Promise.resolve()
1188
+
1189
+ const dirs = getBaseDirectories()
1190
+ const oneHourAgo = Date.now() - 3600000
1191
+
1192
+ // Clean up old renamed executables on Windows (no longer running at startup)
1193
+ if (getPlatform().startsWith('win32')) {
1194
+ const executableDir = dirname(dirs.executable)
1195
+ try {
1196
+ const files = await readdir(executableDir)
1197
+ let cleanedCount = 0
1198
+ for (const file of files) {
1199
+ if (!/^claude\.exe\.old\.\d+$/.test(file)) continue
1200
+ try {
1201
+ await unlink(join(executableDir, file))
1202
+ cleanedCount++
1203
+ } catch {
1204
+ // File might still be in use by another process
1205
+ }
1206
+ }
1207
+ if (cleanedCount > 0) {
1208
+ logForDebugging(
1209
+ `Cleaned up ${cleanedCount} old Windows executables on startup`,
1210
+ )
1211
+ }
1212
+ } catch (error) {
1213
+ if (!isENOENT(error)) {
1214
+ logForDebugging(`Failed to clean up old Windows executables: ${error}`)
1215
+ }
1216
+ }
1217
+ }
1218
+
1219
+ // Clean up orphaned staging directories older than 1 hour
1220
+ try {
1221
+ const stagingEntries = await readdir(dirs.staging)
1222
+ let stagingCleanedCount = 0
1223
+ for (const entry of stagingEntries) {
1224
+ const stagingPath = join(dirs.staging, entry)
1225
+ try {
1226
+ // stat() is load-bearing here (we need mtime). There is a theoretical
1227
+ // TOCTOU where a concurrent installer could freshen a stale staging
1228
+ // dir between stat and rm — but the 1-hour threshold makes this
1229
+ // vanishingly unlikely, and rm({force:true}) tolerates concurrent
1230
+ // deletion.
1231
+ const stats = await stat(stagingPath)
1232
+ if (stats.mtime.getTime() < oneHourAgo) {
1233
+ await rm(stagingPath, { recursive: true, force: true })
1234
+ stagingCleanedCount++
1235
+ logForDebugging(`Cleaned up old staging directory: ${entry}`)
1236
+ }
1237
+ } catch {
1238
+ // Ignore individual errors
1239
+ }
1240
+ }
1241
+ if (stagingCleanedCount > 0) {
1242
+ logForDebugging(
1243
+ `Cleaned up ${stagingCleanedCount} orphaned staging directories`,
1244
+ )
1245
+ logEvent('tengu_native_staging_cleanup', {
1246
+ cleaned_count: stagingCleanedCount,
1247
+ })
1248
+ }
1249
+ } catch (error) {
1250
+ if (!isENOENT(error)) {
1251
+ logForDebugging(`Failed to clean up staging directories: ${error}`)
1252
+ }
1253
+ }
1254
+
1255
+ // Clean up stale PID locks (crashed processes) — cleanupStaleLocks handles ENOENT
1256
+ if (isPidBasedLockingEnabled()) {
1257
+ const staleLocksCleaned = cleanupStaleLocks(dirs.locks)
1258
+ if (staleLocksCleaned > 0) {
1259
+ logForDebugging(`Cleaned up ${staleLocksCleaned} stale version locks`)
1260
+ logEvent('tengu_native_stale_locks_cleanup', {
1261
+ cleaned_count: staleLocksCleaned,
1262
+ })
1263
+ }
1264
+ }
1265
+
1266
+ // Single readdir of versions dir. Partition into temp files vs candidate binaries,
1267
+ // stat'ing each entry at most once.
1268
+ let versionEntries: string[]
1269
+ try {
1270
+ versionEntries = await readdir(dirs.versions)
1271
+ } catch (error) {
1272
+ if (!isENOENT(error)) {
1273
+ logForDebugging(`Failed to readdir versions directory: ${error}`)
1274
+ }
1275
+ return
1276
+ }
1277
+
1278
+ type VersionInfo = {
1279
+ name: string
1280
+ path: string
1281
+ resolvedPath: string
1282
+ mtime: Date
1283
+ }
1284
+ const versionFiles: VersionInfo[] = []
1285
+ let tempFilesCleanedCount = 0
1286
+
1287
+ for (const entry of versionEntries) {
1288
+ const entryPath = join(dirs.versions, entry)
1289
+ if (/\.tmp\.\d+\.\d+$/.test(entry)) {
1290
+ // Orphaned temp install file — pattern: {version}.tmp.{pid}.{timestamp}
1291
+ try {
1292
+ const stats = await stat(entryPath)
1293
+ if (stats.mtime.getTime() < oneHourAgo) {
1294
+ await unlink(entryPath)
1295
+ tempFilesCleanedCount++
1296
+ logForDebugging(`Cleaned up orphaned temp install file: ${entry}`)
1297
+ }
1298
+ } catch {
1299
+ // Ignore individual errors
1300
+ }
1301
+ continue
1302
+ }
1303
+ // Candidate version binary — stat once, reuse for isFile/size/mtime/mode
1304
+ try {
1305
+ const stats = await stat(entryPath)
1306
+ if (!stats.isFile()) continue
1307
+ if (
1308
+ process.platform !== 'win32' &&
1309
+ stats.size > 0 &&
1310
+ (stats.mode & 0o111) === 0
1311
+ ) {
1312
+ // Check executability via mode bits from the existing stat result —
1313
+ // avoids a second syscall (access(X_OK)) and the TOCTOU window between
1314
+ // stat and access. Skip on Windows: libuv only sets execute bits for
1315
+ // .exe/.com/.bat/.cmd, but version files are extensionless semver
1316
+ // strings (e.g. "1.2.3"), so this check would reject all of them.
1317
+ // The previous access(X_OK) passed any readable file on Windows anyway.
1318
+ continue
1319
+ }
1320
+ versionFiles.push({
1321
+ name: entry,
1322
+ path: entryPath,
1323
+ resolvedPath: resolve(entryPath),
1324
+ mtime: stats.mtime,
1325
+ })
1326
+ } catch {
1327
+ // Skip files we can't stat
1328
+ }
1329
+ }
1330
+
1331
+ if (tempFilesCleanedCount > 0) {
1332
+ logForDebugging(
1333
+ `Cleaned up ${tempFilesCleanedCount} orphaned temp install files`,
1334
+ )
1335
+ logEvent('tengu_native_temp_files_cleanup', {
1336
+ cleaned_count: tempFilesCleanedCount,
1337
+ })
1338
+ }
1339
+
1340
+ if (versionFiles.length === 0) {
1341
+ return
1342
+ }
1343
+
1344
+ try {
1345
+ // Identify protected versions
1346
+ const currentBinaryPath = process.execPath
1347
+ const protectedVersions = new Set<string>()
1348
+ if (currentBinaryPath && currentBinaryPath.includes(dirs.versions)) {
1349
+ protectedVersions.add(resolve(currentBinaryPath))
1350
+ }
1351
+
1352
+ const currentSymlinkVersion = await getVersionFromSymlink(dirs.executable)
1353
+ if (currentSymlinkVersion) {
1354
+ protectedVersions.add(currentSymlinkVersion)
1355
+ }
1356
+
1357
+ // Protect versions with active locks (running in other processes)
1358
+ for (const v of versionFiles) {
1359
+ if (protectedVersions.has(v.resolvedPath)) continue
1360
+
1361
+ const lockFilePath = getLockFilePathFromVersionPath(dirs, v.resolvedPath)
1362
+ let hasActiveLock = false
1363
+ if (isPidBasedLockingEnabled()) {
1364
+ hasActiveLock = isLockActive(lockFilePath)
1365
+ } else {
1366
+ try {
1367
+ hasActiveLock = await lockfile.check(v.resolvedPath, {
1368
+ stale: LOCK_STALE_MS,
1369
+ lockfilePath: lockFilePath,
1370
+ })
1371
+ } catch {
1372
+ hasActiveLock = false
1373
+ }
1374
+ }
1375
+ if (hasActiveLock) {
1376
+ protectedVersions.add(v.resolvedPath)
1377
+ logForDebugging(`Protecting locked version from cleanup: ${v.name}`)
1378
+ }
1379
+ }
1380
+
1381
+ // Eligible versions: not protected, sorted newest first (reuse cached mtime)
1382
+ const eligibleVersions = versionFiles
1383
+ .filter(v => !protectedVersions.has(v.resolvedPath))
1384
+ .sort((a, b) => b.mtime.getTime() - a.mtime.getTime())
1385
+
1386
+ const versionsToDelete = eligibleVersions.slice(VERSION_RETENTION_COUNT)
1387
+
1388
+ if (versionsToDelete.length === 0) {
1389
+ logEvent('tengu_native_version_cleanup', {
1390
+ total_count: versionFiles.length,
1391
+ deleted_count: 0,
1392
+ protected_count: protectedVersions.size,
1393
+ retained_count: VERSION_RETENTION_COUNT,
1394
+ lock_failed_count: 0,
1395
+ error_count: 0,
1396
+ })
1397
+ return
1398
+ }
1399
+
1400
+ let deletedCount = 0
1401
+ let lockFailedCount = 0
1402
+ let errorCount = 0
1403
+
1404
+ await Promise.all(
1405
+ versionsToDelete.map(async version => {
1406
+ try {
1407
+ const deleted = await tryWithVersionLock(version.path, async () => {
1408
+ await unlink(version.path)
1409
+ })
1410
+ if (deleted) {
1411
+ deletedCount++
1412
+ } else {
1413
+ lockFailedCount++
1414
+ logForDebugging(
1415
+ `Skipping deletion of ${version.name} - locked by another process`,
1416
+ )
1417
+ }
1418
+ } catch (error) {
1419
+ errorCount++
1420
+ logError(
1421
+ new Error(`Failed to delete version ${version.name}: ${error}`),
1422
+ )
1423
+ }
1424
+ }),
1425
+ )
1426
+
1427
+ logEvent('tengu_native_version_cleanup', {
1428
+ total_count: versionFiles.length,
1429
+ deleted_count: deletedCount,
1430
+ protected_count: protectedVersions.size,
1431
+ retained_count: VERSION_RETENTION_COUNT,
1432
+ lock_failed_count: lockFailedCount,
1433
+ error_count: errorCount,
1434
+ })
1435
+ } catch (error) {
1436
+ if (!isENOENT(error)) {
1437
+ logError(new Error(`Version cleanup failed: ${error}`))
1438
+ }
1439
+ }
1440
+ }
1441
+
1442
+ /**
1443
+ * Check if a given path is managed by npm
1444
+ * @param executablePath - The path to check (can be a symlink)
1445
+ * @returns true if the path is npm-managed, false otherwise
1446
+ */
1447
+ async function isNpmSymlink(executablePath: string): Promise<boolean> {
1448
+ // Resolve symlink to its target if applicable
1449
+ let targetPath = executablePath
1450
+ const stats = await lstat(executablePath)
1451
+ if (stats.isSymbolicLink()) {
1452
+ targetPath = await realpath(executablePath)
1453
+ }
1454
+
1455
+ // checking npm prefix isn't guaranteed to work, as prefix can change
1456
+ // and users may set --prefix manually when installing
1457
+ // thus we use this heuristic:
1458
+ return targetPath.endsWith('.js') || targetPath.includes('node_modules')
1459
+ }
1460
+
1461
+ /**
1462
+ * Remove the claude symlink from the executable directory
1463
+ * This is used when switching away from native installation
1464
+ * Will only remove if it's a native binary symlink, not npm-managed JS files
1465
+ */
1466
+ export async function removeInstalledSymlink(): Promise<void> {
1467
+ const dirs = getBaseDirectories()
1468
+
1469
+ try {
1470
+ // Check if this is an npm-managed installation
1471
+ if (await isNpmSymlink(dirs.executable)) {
1472
+ logForDebugging(
1473
+ `Skipping removal of ${dirs.executable} - appears to be npm-managed`,
1474
+ )
1475
+ return
1476
+ }
1477
+
1478
+ // It's a native binary symlink, safe to remove
1479
+ await unlink(dirs.executable)
1480
+ logForDebugging(`Removed claude symlink at ${dirs.executable}`)
1481
+ } catch (error) {
1482
+ if (isENOENT(error)) {
1483
+ return
1484
+ }
1485
+ logError(new Error(`Failed to remove claude symlink: ${error}`))
1486
+ }
1487
+ }
1488
+
1489
+ /**
1490
+ * Clean up old claude aliases from shell configuration files
1491
+ * Only handles alias removal, not PATH setup
1492
+ */
1493
+ export async function cleanupShellAliases(): Promise<SetupMessage[]> {
1494
+ const messages: SetupMessage[] = []
1495
+ const configMap = getShellConfigPaths()
1496
+
1497
+ for (const [shellType, configFile] of Object.entries(configMap)) {
1498
+ try {
1499
+ const lines = await readFileLines(configFile)
1500
+ if (!lines) continue
1501
+
1502
+ const { filtered, hadAlias } = filterClaudeAliases(lines)
1503
+
1504
+ if (hadAlias) {
1505
+ await writeFileLines(configFile, filtered)
1506
+ messages.push({
1507
+ message: `Removed claude alias from ${configFile}. Run: unalias claude`,
1508
+ userActionRequired: true,
1509
+ type: 'alias',
1510
+ })
1511
+ logForDebugging(`Cleaned up claude alias from ${shellType} config`)
1512
+ }
1513
+ } catch (error) {
1514
+ logError(error)
1515
+ messages.push({
1516
+ message: `Failed to clean up ${configFile}: ${error}`,
1517
+ userActionRequired: false,
1518
+ type: 'error',
1519
+ })
1520
+ }
1521
+ }
1522
+
1523
+ return messages
1524
+ }
1525
+
1526
+ async function manualRemoveNpmPackage(
1527
+ packageName: string,
1528
+ ): Promise<{ success: boolean; error?: string; warning?: string }> {
1529
+ try {
1530
+ // Get npm global prefix
1531
+ const prefixResult = await execFileNoThrowWithCwd('npm', [
1532
+ 'config',
1533
+ 'get',
1534
+ 'prefix',
1535
+ ])
1536
+ if (prefixResult.code !== 0 || !prefixResult.stdout) {
1537
+ return {
1538
+ success: false,
1539
+ error: 'Failed to get npm global prefix',
1540
+ }
1541
+ }
1542
+
1543
+ const globalPrefix = prefixResult.stdout.trim()
1544
+ let manuallyRemoved = false
1545
+
1546
+ // Helper to try removing a file. unlink alone is sufficient — it throws
1547
+ // ENOENT if the file is missing, which the catch handles identically.
1548
+ // A stat() pre-check would add a syscall and a TOCTOU window where
1549
+ // concurrent cleanup causes a false-negative return.
1550
+ async function tryRemove(filePath: string, description: string) {
1551
+ try {
1552
+ await unlink(filePath)
1553
+ logForDebugging(`Manually removed ${description}: ${filePath}`)
1554
+ return true
1555
+ } catch {
1556
+ return false
1557
+ }
1558
+ }
1559
+
1560
+ if (getPlatform().startsWith('win32')) {
1561
+ // Windows - only remove executables, not the package directory
1562
+ const binCmd = join(globalPrefix, 'claude.cmd')
1563
+ const binPs1 = join(globalPrefix, 'claude.ps1')
1564
+ const binExe = join(globalPrefix, 'claude')
1565
+
1566
+ if (await tryRemove(binCmd, 'bin script')) {
1567
+ manuallyRemoved = true
1568
+ }
1569
+
1570
+ if (await tryRemove(binPs1, 'PowerShell script')) {
1571
+ manuallyRemoved = true
1572
+ }
1573
+
1574
+ if (await tryRemove(binExe, 'bin executable')) {
1575
+ manuallyRemoved = true
1576
+ }
1577
+ } else {
1578
+ // Unix/Mac - only remove symlink, not the package directory
1579
+ const binSymlink = join(globalPrefix, 'bin', 'claude')
1580
+
1581
+ if (await tryRemove(binSymlink, 'bin symlink')) {
1582
+ manuallyRemoved = true
1583
+ }
1584
+ }
1585
+
1586
+ if (manuallyRemoved) {
1587
+ logForDebugging(`Successfully removed ${packageName} manually`)
1588
+ const nodeModulesPath = getPlatform().startsWith('win32')
1589
+ ? join(globalPrefix, 'node_modules', packageName)
1590
+ : join(globalPrefix, 'lib', 'node_modules', packageName)
1591
+
1592
+ return {
1593
+ success: true,
1594
+ warning: `${packageName} executables removed, but node_modules directory was left intact for safety. You may manually delete it later at: ${nodeModulesPath}`,
1595
+ }
1596
+ } else {
1597
+ return { success: false }
1598
+ }
1599
+ } catch (manualError) {
1600
+ logForDebugging(`Manual removal failed: ${manualError}`, {
1601
+ level: 'error',
1602
+ })
1603
+ return {
1604
+ success: false,
1605
+ error: `Manual removal failed: ${manualError}`,
1606
+ }
1607
+ }
1608
+ }
1609
+
1610
+ async function attemptNpmUninstall(
1611
+ packageName: string,
1612
+ ): Promise<{ success: boolean; error?: string; warning?: string }> {
1613
+ const { code, stderr } = await execFileNoThrowWithCwd(
1614
+ 'npm',
1615
+ ['uninstall', '-g', packageName],
1616
+ // eslint-disable-next-line custom-rules/no-process-cwd -- matches original behavior
1617
+ { cwd: process.cwd() },
1618
+ )
1619
+
1620
+ if (code === 0) {
1621
+ logForDebugging(`Removed global npm installation of ${packageName}`)
1622
+ return { success: true }
1623
+ } else if (stderr && !stderr.includes('npm ERR! code E404')) {
1624
+ // Check for ENOTEMPTY error and try manual removal
1625
+ if (stderr.includes('npm error code ENOTEMPTY')) {
1626
+ logForDebugging(
1627
+ `Failed to uninstall global npm package ${packageName}: ${stderr}`,
1628
+ { level: 'error' },
1629
+ )
1630
+ logForDebugging(`Attempting manual removal due to ENOTEMPTY error`)
1631
+
1632
+ const manualResult = await manualRemoveNpmPackage(packageName)
1633
+ if (manualResult.success) {
1634
+ return { success: true, warning: manualResult.warning }
1635
+ } else if (manualResult.error) {
1636
+ return {
1637
+ success: false,
1638
+ error: `Failed to remove global npm installation of ${packageName}: ${stderr}. Manual removal also failed: ${manualResult.error}`,
1639
+ }
1640
+ }
1641
+ }
1642
+
1643
+ // Only report as error if it's not a "package not found" error
1644
+ logForDebugging(
1645
+ `Failed to uninstall global npm package ${packageName}: ${stderr}`,
1646
+ { level: 'error' },
1647
+ )
1648
+ return {
1649
+ success: false,
1650
+ error: `Failed to remove global npm installation of ${packageName}: ${stderr}`,
1651
+ }
1652
+ }
1653
+
1654
+ return { success: false } // Package not found, not an error
1655
+ }
1656
+
1657
+ export async function cleanupNpmInstallations(): Promise<{
1658
+ removed: number
1659
+ errors: string[]
1660
+ warnings: string[]
1661
+ }> {
1662
+ const errors: string[] = []
1663
+ const warnings: string[] = []
1664
+ let removed = 0
1665
+
1666
+ // Always attempt to remove @anthropic-ai/claude-code
1667
+ const codePackageResult = await attemptNpmUninstall(
1668
+ '@anthropic-ai/claude-code',
1669
+ )
1670
+ if (codePackageResult.success) {
1671
+ removed++
1672
+ if (codePackageResult.warning) {
1673
+ warnings.push(codePackageResult.warning)
1674
+ }
1675
+ } else if (codePackageResult.error) {
1676
+ errors.push(codePackageResult.error)
1677
+ }
1678
+
1679
+ // Also attempt to remove MACRO.PACKAGE_URL if it's defined and different
1680
+ if (MACRO.PACKAGE_URL && MACRO.PACKAGE_URL !== '@anthropic-ai/claude-code') {
1681
+ const macroPackageResult = await attemptNpmUninstall(MACRO.PACKAGE_URL)
1682
+ if (macroPackageResult.success) {
1683
+ removed++
1684
+ if (macroPackageResult.warning) {
1685
+ warnings.push(macroPackageResult.warning)
1686
+ }
1687
+ } else if (macroPackageResult.error) {
1688
+ errors.push(macroPackageResult.error)
1689
+ }
1690
+ }
1691
+
1692
+ // Check for local installation at ~/.claude/local
1693
+ const localInstallDir = join(homedir(), '.claude', 'local')
1694
+
1695
+ try {
1696
+ await rm(localInstallDir, { recursive: true })
1697
+ removed++
1698
+ logForDebugging(`Removed local installation at ${localInstallDir}`)
1699
+ } catch (error) {
1700
+ if (!isENOENT(error)) {
1701
+ errors.push(`Failed to remove ${localInstallDir}: ${error}`)
1702
+ logForDebugging(`Failed to remove local installation: ${error}`, {
1703
+ level: 'error',
1704
+ })
1705
+ }
1706
+ }
1707
+
1708
+ return { removed, errors, warnings }
1709
+ }