yzcode-cli 1.0.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 (1782) hide show
  1. package/QueryEngine.ts +1295 -0
  2. package/Task.ts +125 -0
  3. package/Tool.ts +792 -0
  4. package/bin/yzcode-init.js +31 -0
  5. package/bin/yzcode.js +35 -0
  6. package/cli/exit.ts +31 -0
  7. package/cli/handlers/agents.ts +70 -0
  8. package/cli/handlers/auth.ts +330 -0
  9. package/cli/handlers/autoMode.ts +170 -0
  10. package/cli/handlers/mcp.tsx +362 -0
  11. package/cli/handlers/plugins.ts +878 -0
  12. package/cli/handlers/util.tsx +110 -0
  13. package/cli/ndjsonSafeStringify.ts +32 -0
  14. package/cli/print.ts +5594 -0
  15. package/cli/remoteIO.ts +255 -0
  16. package/cli/structuredIO.ts +859 -0
  17. package/cli/transports/HybridTransport.ts +282 -0
  18. package/cli/transports/SSETransport.ts +711 -0
  19. package/cli/transports/SerialBatchEventUploader.ts +275 -0
  20. package/cli/transports/WebSocketTransport.ts +800 -0
  21. package/cli/transports/WorkerStateUploader.ts +131 -0
  22. package/cli/transports/ccrClient.ts +998 -0
  23. package/cli/transports/transportUtils.ts +45 -0
  24. package/cli/update.ts +422 -0
  25. package/commands/add-dir/add-dir.tsx +126 -0
  26. package/commands/add-dir/index.ts +11 -0
  27. package/commands/add-dir/validation.ts +110 -0
  28. package/commands/advisor.ts +109 -0
  29. package/commands/agents/agents.tsx +12 -0
  30. package/commands/agents/index.ts +10 -0
  31. package/commands/ant-trace/index.js +1 -0
  32. package/commands/autofix-pr/index.js +1 -0
  33. package/commands/backfill-sessions/index.js +1 -0
  34. package/commands/branch/branch.ts +296 -0
  35. package/commands/branch/index.ts +14 -0
  36. package/commands/break-cache/index.js +1 -0
  37. package/commands/bridge/bridge.tsx +509 -0
  38. package/commands/bridge/index.ts +26 -0
  39. package/commands/bridge-kick.ts +200 -0
  40. package/commands/brief.ts +130 -0
  41. package/commands/btw/btw.tsx +243 -0
  42. package/commands/btw/index.ts +13 -0
  43. package/commands/bughunter/index.js +1 -0
  44. package/commands/chrome/chrome.tsx +285 -0
  45. package/commands/chrome/index.ts +13 -0
  46. package/commands/clear/caches.ts +144 -0
  47. package/commands/clear/clear.ts +7 -0
  48. package/commands/clear/conversation.ts +251 -0
  49. package/commands/clear/index.ts +19 -0
  50. package/commands/color/color.ts +93 -0
  51. package/commands/color/index.ts +16 -0
  52. package/commands/commit-push-pr.ts +158 -0
  53. package/commands/commit.ts +92 -0
  54. package/commands/compact/compact.ts +287 -0
  55. package/commands/compact/index.ts +15 -0
  56. package/commands/config/config.tsx +7 -0
  57. package/commands/config/index.ts +11 -0
  58. package/commands/context/context-noninteractive.ts +325 -0
  59. package/commands/context/context.tsx +64 -0
  60. package/commands/context/index.ts +24 -0
  61. package/commands/copy/copy.tsx +371 -0
  62. package/commands/copy/index.ts +15 -0
  63. package/commands/cost/cost.ts +24 -0
  64. package/commands/cost/index.ts +23 -0
  65. package/commands/createMovedToPluginCommand.ts +65 -0
  66. package/commands/ctx_viz/index.js +1 -0
  67. package/commands/debug-tool-call/index.js +1 -0
  68. package/commands/desktop/desktop.tsx +9 -0
  69. package/commands/desktop/index.ts +26 -0
  70. package/commands/diff/diff.tsx +9 -0
  71. package/commands/diff/index.ts +8 -0
  72. package/commands/doctor/doctor.tsx +7 -0
  73. package/commands/doctor/index.ts +12 -0
  74. package/commands/effort/effort.tsx +183 -0
  75. package/commands/effort/index.ts +13 -0
  76. package/commands/env/index.js +1 -0
  77. package/commands/exit/exit.tsx +33 -0
  78. package/commands/exit/index.ts +12 -0
  79. package/commands/export/export.tsx +91 -0
  80. package/commands/export/index.ts +11 -0
  81. package/commands/extra-usage/extra-usage-core.ts +118 -0
  82. package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  83. package/commands/extra-usage/extra-usage.tsx +17 -0
  84. package/commands/extra-usage/index.ts +31 -0
  85. package/commands/fast/fast.tsx +269 -0
  86. package/commands/fast/index.ts +26 -0
  87. package/commands/feedback/feedback.tsx +25 -0
  88. package/commands/feedback/index.ts +26 -0
  89. package/commands/files/files.ts +19 -0
  90. package/commands/files/index.ts +12 -0
  91. package/commands/good-claude/index.js +1 -0
  92. package/commands/heapdump/heapdump.ts +17 -0
  93. package/commands/heapdump/index.ts +12 -0
  94. package/commands/help/help.tsx +11 -0
  95. package/commands/help/index.ts +10 -0
  96. package/commands/hooks/hooks.tsx +13 -0
  97. package/commands/hooks/index.ts +11 -0
  98. package/commands/ide/ide.tsx +646 -0
  99. package/commands/ide/index.ts +11 -0
  100. package/commands/init-verifiers.ts +262 -0
  101. package/commands/init.ts +256 -0
  102. package/commands/insights.ts +3200 -0
  103. package/commands/install-github-app/ApiKeyStep.tsx +231 -0
  104. package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  105. package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  106. package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  107. package/commands/install-github-app/CreatingStep.tsx +65 -0
  108. package/commands/install-github-app/ErrorStep.tsx +85 -0
  109. package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  110. package/commands/install-github-app/InstallAppStep.tsx +94 -0
  111. package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  112. package/commands/install-github-app/SuccessStep.tsx +96 -0
  113. package/commands/install-github-app/WarningsStep.tsx +73 -0
  114. package/commands/install-github-app/index.ts +13 -0
  115. package/commands/install-github-app/install-github-app.tsx +587 -0
  116. package/commands/install-github-app/setupGitHubActions.ts +325 -0
  117. package/commands/install-slack-app/index.ts +12 -0
  118. package/commands/install-slack-app/install-slack-app.ts +30 -0
  119. package/commands/install.tsx +300 -0
  120. package/commands/issue/index.js +1 -0
  121. package/commands/keybindings/index.ts +13 -0
  122. package/commands/keybindings/keybindings.ts +53 -0
  123. package/commands/login/index.ts +14 -0
  124. package/commands/login/login.tsx +104 -0
  125. package/commands/logout/index.ts +10 -0
  126. package/commands/logout/logout.tsx +82 -0
  127. package/commands/mcp/addCommand.ts +280 -0
  128. package/commands/mcp/index.ts +12 -0
  129. package/commands/mcp/mcp.tsx +85 -0
  130. package/commands/mcp/xaaIdpCommand.ts +266 -0
  131. package/commands/memory/index.ts +10 -0
  132. package/commands/memory/memory.tsx +90 -0
  133. package/commands/mobile/index.ts +11 -0
  134. package/commands/mobile/mobile.tsx +274 -0
  135. package/commands/mock-limits/index.js +1 -0
  136. package/commands/model/index.ts +16 -0
  137. package/commands/model/model.tsx +297 -0
  138. package/commands/oauth-refresh/index.js +1 -0
  139. package/commands/onboarding/index.js +1 -0
  140. package/commands/output-style/index.ts +11 -0
  141. package/commands/output-style/output-style.tsx +7 -0
  142. package/commands/passes/index.ts +22 -0
  143. package/commands/passes/passes.tsx +24 -0
  144. package/commands/perf-issue/index.js +1 -0
  145. package/commands/permissions/index.ts +11 -0
  146. package/commands/permissions/permissions.tsx +10 -0
  147. package/commands/plan/index.ts +11 -0
  148. package/commands/plan/plan.tsx +122 -0
  149. package/commands/plugin/AddMarketplace.tsx +162 -0
  150. package/commands/plugin/BrowseMarketplace.tsx +802 -0
  151. package/commands/plugin/DiscoverPlugins.tsx +781 -0
  152. package/commands/plugin/ManageMarketplaces.tsx +838 -0
  153. package/commands/plugin/ManagePlugins.tsx +2215 -0
  154. package/commands/plugin/PluginErrors.tsx +124 -0
  155. package/commands/plugin/PluginOptionsDialog.tsx +357 -0
  156. package/commands/plugin/PluginOptionsFlow.tsx +135 -0
  157. package/commands/plugin/PluginSettings.tsx +1072 -0
  158. package/commands/plugin/PluginTrustWarning.tsx +32 -0
  159. package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  160. package/commands/plugin/ValidatePlugin.tsx +98 -0
  161. package/commands/plugin/index.tsx +11 -0
  162. package/commands/plugin/parseArgs.ts +103 -0
  163. package/commands/plugin/plugin.tsx +7 -0
  164. package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  165. package/commands/plugin/usePagination.ts +171 -0
  166. package/commands/pr_comments/index.ts +50 -0
  167. package/commands/privacy-settings/index.ts +14 -0
  168. package/commands/privacy-settings/privacy-settings.tsx +58 -0
  169. package/commands/rate-limit-options/index.ts +19 -0
  170. package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  171. package/commands/release-notes/index.ts +11 -0
  172. package/commands/release-notes/release-notes.ts +50 -0
  173. package/commands/reload-plugins/index.ts +18 -0
  174. package/commands/reload-plugins/reload-plugins.ts +61 -0
  175. package/commands/remote-env/index.ts +15 -0
  176. package/commands/remote-env/remote-env.tsx +7 -0
  177. package/commands/remote-setup/api.ts +182 -0
  178. package/commands/remote-setup/index.ts +20 -0
  179. package/commands/remote-setup/remote-setup.tsx +187 -0
  180. package/commands/rename/generateSessionName.ts +67 -0
  181. package/commands/rename/index.ts +12 -0
  182. package/commands/rename/rename.ts +87 -0
  183. package/commands/reset-limits/index.js +4 -0
  184. package/commands/resume/index.ts +12 -0
  185. package/commands/resume/resume.tsx +275 -0
  186. package/commands/review/UltrareviewOverageDialog.tsx +96 -0
  187. package/commands/review/reviewRemote.ts +316 -0
  188. package/commands/review/ultrareviewCommand.tsx +58 -0
  189. package/commands/review/ultrareviewEnabled.ts +14 -0
  190. package/commands/review.ts +57 -0
  191. package/commands/rewind/index.ts +13 -0
  192. package/commands/rewind/rewind.ts +13 -0
  193. package/commands/sandbox-toggle/index.ts +50 -0
  194. package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  195. package/commands/security-review.ts +243 -0
  196. package/commands/session/index.ts +16 -0
  197. package/commands/session/session.tsx +140 -0
  198. package/commands/share/index.js +1 -0
  199. package/commands/skills/index.ts +10 -0
  200. package/commands/skills/skills.tsx +8 -0
  201. package/commands/stats/index.ts +10 -0
  202. package/commands/stats/stats.tsx +7 -0
  203. package/commands/status/index.ts +12 -0
  204. package/commands/status/status.tsx +8 -0
  205. package/commands/statusline.tsx +24 -0
  206. package/commands/stickers/index.ts +11 -0
  207. package/commands/stickers/stickers.ts +16 -0
  208. package/commands/summary/index.js +1 -0
  209. package/commands/tag/index.ts +12 -0
  210. package/commands/tag/tag.tsx +215 -0
  211. package/commands/tasks/index.ts +11 -0
  212. package/commands/tasks/tasks.tsx +8 -0
  213. package/commands/teleport/index.js +1 -0
  214. package/commands/terminalSetup/index.ts +23 -0
  215. package/commands/terminalSetup/terminalSetup.tsx +531 -0
  216. package/commands/theme/index.ts +10 -0
  217. package/commands/theme/theme.tsx +57 -0
  218. package/commands/thinkback/index.ts +13 -0
  219. package/commands/thinkback/thinkback.tsx +554 -0
  220. package/commands/thinkback-play/index.ts +17 -0
  221. package/commands/thinkback-play/thinkback-play.ts +43 -0
  222. package/commands/ultraplan.tsx +471 -0
  223. package/commands/upgrade/index.ts +16 -0
  224. package/commands/upgrade/upgrade.tsx +38 -0
  225. package/commands/usage/index.ts +9 -0
  226. package/commands/usage/usage.tsx +7 -0
  227. package/commands/version.ts +22 -0
  228. package/commands/vim/index.ts +11 -0
  229. package/commands/vim/vim.ts +38 -0
  230. package/commands/voice/index.ts +20 -0
  231. package/commands/voice/voice.ts +150 -0
  232. package/commands.ts +754 -0
  233. package/components/AgentProgressLine.tsx +136 -0
  234. package/components/App.tsx +56 -0
  235. package/components/ApproveApiKey.tsx +123 -0
  236. package/components/AutoModeOptInDialog.tsx +142 -0
  237. package/components/AutoUpdater.tsx +198 -0
  238. package/components/AutoUpdaterWrapper.tsx +91 -0
  239. package/components/AwsAuthStatusBox.tsx +82 -0
  240. package/components/BaseTextInput.tsx +136 -0
  241. package/components/BashModeProgress.tsx +56 -0
  242. package/components/BridgeDialog.tsx +401 -0
  243. package/components/BypassPermissionsModeDialog.tsx +87 -0
  244. package/components/ChannelDowngradeDialog.tsx +102 -0
  245. package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  246. package/components/ClaudeInChromeOnboarding.tsx +121 -0
  247. package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  248. package/components/ClickableImageRef.tsx +73 -0
  249. package/components/CompactSummary.tsx +118 -0
  250. package/components/ConfigurableShortcutHint.tsx +57 -0
  251. package/components/ConsoleOAuthFlow.tsx +631 -0
  252. package/components/ContextSuggestions.tsx +47 -0
  253. package/components/ContextVisualization.tsx +489 -0
  254. package/components/CoordinatorAgentStatus.tsx +273 -0
  255. package/components/CostThresholdDialog.tsx +50 -0
  256. package/components/CtrlOToExpand.tsx +51 -0
  257. package/components/CustomSelect/SelectMulti.tsx +213 -0
  258. package/components/CustomSelect/index.ts +3 -0
  259. package/components/CustomSelect/option-map.ts +50 -0
  260. package/components/CustomSelect/select-input-option.tsx +488 -0
  261. package/components/CustomSelect/select-option.tsx +68 -0
  262. package/components/CustomSelect/select.tsx +690 -0
  263. package/components/CustomSelect/use-multi-select-state.ts +414 -0
  264. package/components/CustomSelect/use-select-input.ts +287 -0
  265. package/components/CustomSelect/use-select-navigation.ts +653 -0
  266. package/components/CustomSelect/use-select-state.ts +157 -0
  267. package/components/DesktopHandoff.tsx +193 -0
  268. package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  269. package/components/DevBar.tsx +49 -0
  270. package/components/DevChannelsDialog.tsx +105 -0
  271. package/components/DiagnosticsDisplay.tsx +95 -0
  272. package/components/EffortCallout.tsx +265 -0
  273. package/components/EffortIndicator.ts +42 -0
  274. package/components/ExitFlow.tsx +48 -0
  275. package/components/ExportDialog.tsx +128 -0
  276. package/components/FallbackToolUseErrorMessage.tsx +116 -0
  277. package/components/FallbackToolUseRejectedMessage.tsx +16 -0
  278. package/components/FastIcon.tsx +46 -0
  279. package/components/Feedback.tsx +592 -0
  280. package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  281. package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  282. package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  283. package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  284. package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  285. package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  286. package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  287. package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  288. package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  289. package/components/FileEditToolDiff.tsx +181 -0
  290. package/components/FileEditToolUpdatedMessage.tsx +124 -0
  291. package/components/FileEditToolUseRejectedMessage.tsx +170 -0
  292. package/components/FilePathLink.tsx +43 -0
  293. package/components/FullscreenLayout.tsx +637 -0
  294. package/components/GlobalSearchDialog.tsx +343 -0
  295. package/components/HelpV2/Commands.tsx +82 -0
  296. package/components/HelpV2/General.tsx +23 -0
  297. package/components/HelpV2/HelpV2.tsx +184 -0
  298. package/components/HighlightedCode/Fallback.tsx +193 -0
  299. package/components/HighlightedCode.tsx +190 -0
  300. package/components/HistorySearchDialog.tsx +118 -0
  301. package/components/IdeAutoConnectDialog.tsx +154 -0
  302. package/components/IdeOnboardingDialog.tsx +167 -0
  303. package/components/IdeStatusIndicator.tsx +58 -0
  304. package/components/IdleReturnDialog.tsx +118 -0
  305. package/components/InterruptedByUser.tsx +15 -0
  306. package/components/InvalidConfigDialog.tsx +156 -0
  307. package/components/InvalidSettingsDialog.tsx +89 -0
  308. package/components/KeybindingWarnings.tsx +55 -0
  309. package/components/LanguagePicker.tsx +86 -0
  310. package/components/LogSelector.tsx +1575 -0
  311. package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  312. package/components/LogoV2/AnimatedClawd.tsx +124 -0
  313. package/components/LogoV2/ChannelsNotice.tsx +266 -0
  314. package/components/LogoV2/Clawd.tsx +240 -0
  315. package/components/LogoV2/CondensedLogo.tsx +161 -0
  316. package/components/LogoV2/EmergencyTip.tsx +58 -0
  317. package/components/LogoV2/Feed.tsx +112 -0
  318. package/components/LogoV2/FeedColumn.tsx +59 -0
  319. package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  320. package/components/LogoV2/LogoV2.tsx +543 -0
  321. package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  322. package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  323. package/components/LogoV2/VoiceModeNotice.tsx +68 -0
  324. package/components/LogoV2/WelcomeV2.tsx +433 -0
  325. package/components/LogoV2/feedConfigs.tsx +92 -0
  326. package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  327. package/components/MCPServerApprovalDialog.tsx +115 -0
  328. package/components/MCPServerDesktopImportDialog.tsx +203 -0
  329. package/components/MCPServerDialogCopy.tsx +15 -0
  330. package/components/MCPServerMultiselectDialog.tsx +133 -0
  331. package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  332. package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  333. package/components/Markdown.tsx +236 -0
  334. package/components/MarkdownTable.tsx +322 -0
  335. package/components/MemoryUsageIndicator.tsx +37 -0
  336. package/components/Message.tsx +627 -0
  337. package/components/MessageModel.tsx +43 -0
  338. package/components/MessageResponse.tsx +78 -0
  339. package/components/MessageRow.tsx +383 -0
  340. package/components/MessageSelector.tsx +831 -0
  341. package/components/MessageTimestamp.tsx +63 -0
  342. package/components/Messages.tsx +834 -0
  343. package/components/ModelPicker.tsx +448 -0
  344. package/components/NativeAutoUpdater.tsx +193 -0
  345. package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  346. package/components/OffscreenFreeze.tsx +44 -0
  347. package/components/Onboarding.tsx +244 -0
  348. package/components/OutputStylePicker.tsx +112 -0
  349. package/components/PackageManagerAutoUpdater.tsx +104 -0
  350. package/components/Passes/Passes.tsx +184 -0
  351. package/components/PrBadge.tsx +97 -0
  352. package/components/PressEnterToContinue.tsx +15 -0
  353. package/components/PromptInput/HistorySearchInput.tsx +51 -0
  354. package/components/PromptInput/IssueFlagBanner.tsx +12 -0
  355. package/components/PromptInput/Notifications.tsx +332 -0
  356. package/components/PromptInput/PromptInput.tsx +2339 -0
  357. package/components/PromptInput/PromptInputFooter.tsx +191 -0
  358. package/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  359. package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  360. package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  361. package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  362. package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  363. package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  364. package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  365. package/components/PromptInput/ShimmeredInput.tsx +143 -0
  366. package/components/PromptInput/VoiceIndicator.tsx +137 -0
  367. package/components/PromptInput/inputModes.ts +33 -0
  368. package/components/PromptInput/inputPaste.ts +90 -0
  369. package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  370. package/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  371. package/components/PromptInput/useShowFastIconHint.ts +31 -0
  372. package/components/PromptInput/useSwarmBanner.ts +155 -0
  373. package/components/PromptInput/utils.ts +60 -0
  374. package/components/QuickOpenDialog.tsx +244 -0
  375. package/components/RemoteCallout.tsx +76 -0
  376. package/components/RemoteEnvironmentDialog.tsx +340 -0
  377. package/components/ResumeTask.tsx +268 -0
  378. package/components/SandboxViolationExpandedView.tsx +99 -0
  379. package/components/ScrollKeybindingHandler.tsx +1012 -0
  380. package/components/SearchBox.tsx +72 -0
  381. package/components/SentryErrorBoundary.ts +28 -0
  382. package/components/SessionBackgroundHint.tsx +108 -0
  383. package/components/SessionPreview.tsx +194 -0
  384. package/components/Settings/Config.tsx +1822 -0
  385. package/components/Settings/Settings.tsx +137 -0
  386. package/components/Settings/Status.tsx +241 -0
  387. package/components/Settings/Usage.tsx +377 -0
  388. package/components/ShowInIDEPrompt.tsx +170 -0
  389. package/components/SkillImprovementSurvey.tsx +152 -0
  390. package/components/Spinner/FlashingChar.tsx +61 -0
  391. package/components/Spinner/GlimmerMessage.tsx +328 -0
  392. package/components/Spinner/ShimmerChar.tsx +36 -0
  393. package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  394. package/components/Spinner/SpinnerGlyph.tsx +80 -0
  395. package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  396. package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  397. package/components/Spinner/index.ts +10 -0
  398. package/components/Spinner/teammateSelectHint.ts +1 -0
  399. package/components/Spinner/useShimmerAnimation.ts +31 -0
  400. package/components/Spinner/useStalledAnimation.ts +75 -0
  401. package/components/Spinner/utils.ts +84 -0
  402. package/components/Spinner.tsx +562 -0
  403. package/components/Stats.tsx +1228 -0
  404. package/components/StatusLine.tsx +324 -0
  405. package/components/StatusNotices.tsx +55 -0
  406. package/components/StructuredDiff/Fallback.tsx +487 -0
  407. package/components/StructuredDiff/colorDiff.ts +37 -0
  408. package/components/StructuredDiff.tsx +190 -0
  409. package/components/StructuredDiffList.tsx +30 -0
  410. package/components/TagTabs.tsx +139 -0
  411. package/components/TaskListV2.tsx +378 -0
  412. package/components/TeammateViewHeader.tsx +82 -0
  413. package/components/TeleportError.tsx +189 -0
  414. package/components/TeleportProgress.tsx +140 -0
  415. package/components/TeleportRepoMismatchDialog.tsx +104 -0
  416. package/components/TeleportResumeWrapper.tsx +167 -0
  417. package/components/TeleportStash.tsx +116 -0
  418. package/components/TextInput.tsx +124 -0
  419. package/components/ThemePicker.tsx +333 -0
  420. package/components/ThinkingToggle.tsx +153 -0
  421. package/components/TokenWarning.tsx +179 -0
  422. package/components/ToolUseLoader.tsx +42 -0
  423. package/components/TrustDialog/TrustDialog.tsx +290 -0
  424. package/components/TrustDialog/utils.ts +245 -0
  425. package/components/ValidationErrorsList.tsx +148 -0
  426. package/components/VimTextInput.tsx +140 -0
  427. package/components/VirtualMessageList.tsx +1082 -0
  428. package/components/WorkflowMultiselectDialog.tsx +128 -0
  429. package/components/WorktreeExitDialog.tsx +231 -0
  430. package/components/agents/AgentDetail.tsx +220 -0
  431. package/components/agents/AgentEditor.tsx +178 -0
  432. package/components/agents/AgentNavigationFooter.tsx +26 -0
  433. package/components/agents/AgentsList.tsx +440 -0
  434. package/components/agents/AgentsMenu.tsx +800 -0
  435. package/components/agents/ColorPicker.tsx +112 -0
  436. package/components/agents/ModelSelector.tsx +68 -0
  437. package/components/agents/ToolSelector.tsx +562 -0
  438. package/components/agents/agentFileUtils.ts +272 -0
  439. package/components/agents/generateAgent.ts +197 -0
  440. package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  441. package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  442. package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  443. package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  444. package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  445. package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  446. package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  447. package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  448. package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  449. package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  450. package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  451. package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  452. package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  453. package/components/agents/types.ts +27 -0
  454. package/components/agents/utils.ts +18 -0
  455. package/components/agents/validateAgent.ts +109 -0
  456. package/components/design-system/Byline.tsx +77 -0
  457. package/components/design-system/Dialog.tsx +138 -0
  458. package/components/design-system/Divider.tsx +149 -0
  459. package/components/design-system/FuzzyPicker.tsx +312 -0
  460. package/components/design-system/KeyboardShortcutHint.tsx +81 -0
  461. package/components/design-system/ListItem.tsx +244 -0
  462. package/components/design-system/LoadingState.tsx +94 -0
  463. package/components/design-system/Pane.tsx +77 -0
  464. package/components/design-system/ProgressBar.tsx +86 -0
  465. package/components/design-system/Ratchet.tsx +80 -0
  466. package/components/design-system/StatusIcon.tsx +95 -0
  467. package/components/design-system/Tabs.tsx +340 -0
  468. package/components/design-system/ThemeProvider.tsx +170 -0
  469. package/components/design-system/ThemedBox.tsx +156 -0
  470. package/components/design-system/ThemedText.tsx +124 -0
  471. package/components/design-system/color.ts +30 -0
  472. package/components/diff/DiffDetailView.tsx +281 -0
  473. package/components/diff/DiffDialog.tsx +383 -0
  474. package/components/diff/DiffFileList.tsx +292 -0
  475. package/components/grove/Grove.tsx +463 -0
  476. package/components/hooks/HooksConfigMenu.tsx +578 -0
  477. package/components/hooks/PromptDialog.tsx +90 -0
  478. package/components/hooks/SelectEventMode.tsx +127 -0
  479. package/components/hooks/SelectHookMode.tsx +112 -0
  480. package/components/hooks/SelectMatcherMode.tsx +144 -0
  481. package/components/hooks/ViewHookMode.tsx +199 -0
  482. package/components/mcp/CapabilitiesSection.tsx +61 -0
  483. package/components/mcp/ElicitationDialog.tsx +1169 -0
  484. package/components/mcp/MCPAgentServerMenu.tsx +183 -0
  485. package/components/mcp/MCPListPanel.tsx +504 -0
  486. package/components/mcp/MCPReconnect.tsx +167 -0
  487. package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  488. package/components/mcp/MCPSettings.tsx +398 -0
  489. package/components/mcp/MCPStdioServerMenu.tsx +177 -0
  490. package/components/mcp/MCPToolDetailView.tsx +212 -0
  491. package/components/mcp/MCPToolListView.tsx +141 -0
  492. package/components/mcp/McpParsingWarnings.tsx +213 -0
  493. package/components/mcp/index.ts +9 -0
  494. package/components/mcp/utils/reconnectHelpers.tsx +49 -0
  495. package/components/memory/MemoryFileSelector.tsx +438 -0
  496. package/components/memory/MemoryUpdateNotification.tsx +45 -0
  497. package/components/messageActions.tsx +450 -0
  498. package/components/messages/AdvisorMessage.tsx +158 -0
  499. package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  500. package/components/messages/AssistantTextMessage.tsx +270 -0
  501. package/components/messages/AssistantThinkingMessage.tsx +86 -0
  502. package/components/messages/AssistantToolUseMessage.tsx +368 -0
  503. package/components/messages/AttachmentMessage.tsx +536 -0
  504. package/components/messages/CollapsedReadSearchContent.tsx +484 -0
  505. package/components/messages/CompactBoundaryMessage.tsx +18 -0
  506. package/components/messages/GroupedToolUseContent.tsx +58 -0
  507. package/components/messages/HighlightedThinkingText.tsx +162 -0
  508. package/components/messages/HookProgressMessage.tsx +116 -0
  509. package/components/messages/PlanApprovalMessage.tsx +222 -0
  510. package/components/messages/RateLimitMessage.tsx +161 -0
  511. package/components/messages/ShutdownMessage.tsx +132 -0
  512. package/components/messages/SystemAPIErrorMessage.tsx +141 -0
  513. package/components/messages/SystemTextMessage.tsx +827 -0
  514. package/components/messages/TaskAssignmentMessage.tsx +76 -0
  515. package/components/messages/UserAgentNotificationMessage.tsx +83 -0
  516. package/components/messages/UserBashInputMessage.tsx +58 -0
  517. package/components/messages/UserBashOutputMessage.tsx +54 -0
  518. package/components/messages/UserChannelMessage.tsx +137 -0
  519. package/components/messages/UserCommandMessage.tsx +108 -0
  520. package/components/messages/UserImageMessage.tsx +59 -0
  521. package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  522. package/components/messages/UserMemoryInputMessage.tsx +75 -0
  523. package/components/messages/UserPlanMessage.tsx +42 -0
  524. package/components/messages/UserPromptMessage.tsx +80 -0
  525. package/components/messages/UserResourceUpdateMessage.tsx +121 -0
  526. package/components/messages/UserTeammateMessage.tsx +206 -0
  527. package/components/messages/UserTextMessage.tsx +275 -0
  528. package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  529. package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  530. package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  531. package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  532. package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  533. package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  534. package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  535. package/components/messages/UserToolResultMessage/utils.tsx +44 -0
  536. package/components/messages/nullRenderingAttachments.ts +70 -0
  537. package/components/messages/teamMemCollapsed.tsx +140 -0
  538. package/components/messages/teamMemSaved.ts +19 -0
  539. package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  540. package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  541. package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  542. package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  543. package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  544. package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  545. package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  546. package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  547. package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  548. package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  549. package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  550. package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  551. package/components/permissions/FallbackPermissionRequest.tsx +333 -0
  552. package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  553. package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  554. package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  555. package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  556. package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  557. package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  558. package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  559. package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  560. package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  561. package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  562. package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  563. package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  564. package/components/permissions/PermissionDialog.tsx +72 -0
  565. package/components/permissions/PermissionExplanation.tsx +272 -0
  566. package/components/permissions/PermissionPrompt.tsx +336 -0
  567. package/components/permissions/PermissionRequest.tsx +217 -0
  568. package/components/permissions/PermissionRequestTitle.tsx +66 -0
  569. package/components/permissions/PermissionRuleExplanation.tsx +121 -0
  570. package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  571. package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  572. package/components/permissions/SandboxPermissionRequest.tsx +163 -0
  573. package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  574. package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  575. package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  576. package/components/permissions/WorkerBadge.tsx +49 -0
  577. package/components/permissions/WorkerPendingPermission.tsx +105 -0
  578. package/components/permissions/hooks.ts +209 -0
  579. package/components/permissions/rules/AddPermissionRules.tsx +180 -0
  580. package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  581. package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  582. package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  583. package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  584. package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  585. package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  586. package/components/permissions/rules/WorkspaceTab.tsx +150 -0
  587. package/components/permissions/shellPermissionHelpers.tsx +164 -0
  588. package/components/permissions/useShellPermissionFeedback.ts +148 -0
  589. package/components/permissions/utils.ts +25 -0
  590. package/components/sandbox/SandboxConfigTab.tsx +45 -0
  591. package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  592. package/components/sandbox/SandboxDoctorSection.tsx +46 -0
  593. package/components/sandbox/SandboxOverridesTab.tsx +193 -0
  594. package/components/sandbox/SandboxSettings.tsx +296 -0
  595. package/components/shell/ExpandShellOutputContext.tsx +36 -0
  596. package/components/shell/OutputLine.tsx +118 -0
  597. package/components/shell/ShellProgressMessage.tsx +150 -0
  598. package/components/shell/ShellTimeDisplay.tsx +74 -0
  599. package/components/skills/SkillsMenu.tsx +237 -0
  600. package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  601. package/components/tasks/BackgroundTask.tsx +345 -0
  602. package/components/tasks/BackgroundTaskStatus.tsx +429 -0
  603. package/components/tasks/BackgroundTasksDialog.tsx +652 -0
  604. package/components/tasks/DreamDetailDialog.tsx +251 -0
  605. package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  606. package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  607. package/components/tasks/RemoteSessionProgress.tsx +243 -0
  608. package/components/tasks/ShellDetailDialog.tsx +404 -0
  609. package/components/tasks/ShellProgress.tsx +87 -0
  610. package/components/tasks/renderToolActivity.tsx +33 -0
  611. package/components/tasks/taskStatusUtils.tsx +107 -0
  612. package/components/teams/TeamStatus.tsx +80 -0
  613. package/components/teams/TeamsDialog.tsx +715 -0
  614. package/components/ui/OrderedList.tsx +71 -0
  615. package/components/ui/OrderedListItem.tsx +45 -0
  616. package/components/ui/TreeSelect.tsx +397 -0
  617. package/components/wizard/WizardDialogLayout.tsx +65 -0
  618. package/components/wizard/WizardNavigationFooter.tsx +24 -0
  619. package/components/wizard/WizardProvider.tsx +213 -0
  620. package/components/wizard/index.ts +9 -0
  621. package/components/wizard/useWizard.ts +13 -0
  622. package/constants/apiLimits.ts +94 -0
  623. package/constants/betas.ts +52 -0
  624. package/constants/common.ts +33 -0
  625. package/constants/cyberRiskInstruction.ts +24 -0
  626. package/constants/errorIds.ts +15 -0
  627. package/constants/figures.ts +45 -0
  628. package/constants/files.ts +156 -0
  629. package/constants/github-app.ts +144 -0
  630. package/constants/keys.ts +11 -0
  631. package/constants/messages.ts +1 -0
  632. package/constants/oauth.ts +234 -0
  633. package/constants/outputStyles.ts +216 -0
  634. package/constants/product.ts +76 -0
  635. package/constants/prompts.ts +914 -0
  636. package/constants/spinnerVerbs.ts +204 -0
  637. package/constants/system.ts +95 -0
  638. package/constants/systemPromptSections.ts +68 -0
  639. package/constants/toolLimits.ts +56 -0
  640. package/constants/tools.ts +112 -0
  641. package/constants/turnCompletionVerbs.ts +12 -0
  642. package/constants/xml.ts +86 -0
  643. package/context/QueuedMessageContext.tsx +63 -0
  644. package/context/fpsMetrics.tsx +30 -0
  645. package/context/mailbox.tsx +38 -0
  646. package/context/modalContext.tsx +58 -0
  647. package/context/notifications.tsx +240 -0
  648. package/context/overlayContext.tsx +151 -0
  649. package/context/promptOverlayContext.tsx +125 -0
  650. package/context/stats.tsx +220 -0
  651. package/context/voice.tsx +88 -0
  652. package/context.ts +189 -0
  653. package/cost-tracker.ts +323 -0
  654. package/costHook.ts +22 -0
  655. package/dialogLaunchers.tsx +133 -0
  656. package/entrypoints/agentSdkTypes.ts +443 -0
  657. package/entrypoints/cli.tsx +310 -0
  658. package/entrypoints/init.ts +340 -0
  659. package/entrypoints/mcp.ts +196 -0
  660. package/entrypoints/sandboxTypes.ts +156 -0
  661. package/entrypoints/sdk/controlSchemas.ts +663 -0
  662. package/entrypoints/sdk/coreSchemas.ts +1889 -0
  663. package/entrypoints/sdk/coreTypes.generated.ts +73 -0
  664. package/entrypoints/sdk/coreTypes.ts +62 -0
  665. package/entrypoints/sdk/runtimeTypes.ts +74 -0
  666. package/entrypoints/sdk/toolTypes.ts +12 -0
  667. package/global.d.ts +18 -0
  668. package/history.ts +464 -0
  669. package/hooks/fileSuggestions.ts +811 -0
  670. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  671. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  672. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  673. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  674. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  675. package/hooks/notifs/useInstallMessages.tsx +26 -0
  676. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  677. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  678. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  679. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  680. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  681. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  682. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  683. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  684. package/hooks/notifs/useStartupNotification.ts +41 -0
  685. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  686. package/hooks/renderPlaceholder.ts +51 -0
  687. package/hooks/toolPermission/PermissionContext.ts +388 -0
  688. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  689. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  690. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  691. package/hooks/toolPermission/permissionLogging.ts +238 -0
  692. package/hooks/unifiedSuggestions.ts +202 -0
  693. package/hooks/useAfterFirstRender.ts +17 -0
  694. package/hooks/useApiKeyVerification.ts +84 -0
  695. package/hooks/useArrowKeyHistory.tsx +229 -0
  696. package/hooks/useAssistantHistory.ts +250 -0
  697. package/hooks/useAwaySummary.ts +125 -0
  698. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  699. package/hooks/useBlink.ts +34 -0
  700. package/hooks/useCanUseTool.tsx +204 -0
  701. package/hooks/useCancelRequest.ts +276 -0
  702. package/hooks/useChromeExtensionNotification.tsx +50 -0
  703. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  704. package/hooks/useClipboardImageHint.ts +77 -0
  705. package/hooks/useCommandKeybindings.tsx +108 -0
  706. package/hooks/useCommandQueue.ts +15 -0
  707. package/hooks/useCopyOnSelect.ts +98 -0
  708. package/hooks/useDeferredHookMessages.ts +46 -0
  709. package/hooks/useDiffData.ts +110 -0
  710. package/hooks/useDiffInIDE.ts +379 -0
  711. package/hooks/useDirectConnect.ts +229 -0
  712. package/hooks/useDoublePress.ts +62 -0
  713. package/hooks/useDynamicConfig.ts +22 -0
  714. package/hooks/useElapsedTime.ts +37 -0
  715. package/hooks/useExitOnCtrlCD.ts +95 -0
  716. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  717. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  718. package/hooks/useGlobalKeybindings.tsx +249 -0
  719. package/hooks/useHistorySearch.ts +303 -0
  720. package/hooks/useIDEIntegration.tsx +70 -0
  721. package/hooks/useIdeAtMentioned.ts +76 -0
  722. package/hooks/useIdeConnectionStatus.ts +33 -0
  723. package/hooks/useIdeLogging.ts +41 -0
  724. package/hooks/useIdeSelection.ts +150 -0
  725. package/hooks/useInboxPoller.ts +969 -0
  726. package/hooks/useInputBuffer.ts +132 -0
  727. package/hooks/useIssueFlagBanner.ts +133 -0
  728. package/hooks/useLogMessages.ts +119 -0
  729. package/hooks/useLspPluginRecommendation.tsx +194 -0
  730. package/hooks/useMailboxBridge.ts +21 -0
  731. package/hooks/useMainLoopModel.ts +34 -0
  732. package/hooks/useManagePlugins.ts +304 -0
  733. package/hooks/useMemoryUsage.ts +39 -0
  734. package/hooks/useMergedClients.ts +23 -0
  735. package/hooks/useMergedCommands.ts +15 -0
  736. package/hooks/useMergedTools.ts +44 -0
  737. package/hooks/useMinDisplayTime.ts +35 -0
  738. package/hooks/useNotifyAfterTimeout.ts +65 -0
  739. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  740. package/hooks/usePasteHandler.ts +285 -0
  741. package/hooks/usePluginRecommendationBase.tsx +105 -0
  742. package/hooks/usePrStatus.ts +106 -0
  743. package/hooks/usePromptSuggestion.ts +177 -0
  744. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  745. package/hooks/useQueueProcessor.ts +68 -0
  746. package/hooks/useRemoteSession.ts +605 -0
  747. package/hooks/useReplBridge.tsx +723 -0
  748. package/hooks/useSSHSession.ts +241 -0
  749. package/hooks/useScheduledTasks.ts +139 -0
  750. package/hooks/useSearchInput.ts +364 -0
  751. package/hooks/useSessionBackgrounding.ts +158 -0
  752. package/hooks/useSettings.ts +17 -0
  753. package/hooks/useSettingsChange.ts +25 -0
  754. package/hooks/useSkillImprovementSurvey.ts +105 -0
  755. package/hooks/useSkillsChange.ts +62 -0
  756. package/hooks/useSwarmInitialization.ts +81 -0
  757. package/hooks/useSwarmPermissionPoller.ts +330 -0
  758. package/hooks/useTaskListWatcher.ts +221 -0
  759. package/hooks/useTasksV2.ts +250 -0
  760. package/hooks/useTeammateViewAutoExit.ts +63 -0
  761. package/hooks/useTeleportResume.tsx +85 -0
  762. package/hooks/useTerminalSize.ts +15 -0
  763. package/hooks/useTextInput.ts +529 -0
  764. package/hooks/useTimeout.ts +14 -0
  765. package/hooks/useTurnDiffs.ts +213 -0
  766. package/hooks/useTypeahead.tsx +1385 -0
  767. package/hooks/useUpdateNotification.ts +34 -0
  768. package/hooks/useVimInput.ts +316 -0
  769. package/hooks/useVirtualScroll.ts +721 -0
  770. package/hooks/useVoice.ts +1144 -0
  771. package/hooks/useVoiceEnabled.ts +25 -0
  772. package/hooks/useVoiceIntegration.tsx +677 -0
  773. package/ink/Ansi.tsx +292 -0
  774. package/ink/bidi.ts +139 -0
  775. package/ink/clearTerminal.ts +74 -0
  776. package/ink/colorize.ts +231 -0
  777. package/ink/components/AlternateScreen.tsx +80 -0
  778. package/ink/components/App.tsx +658 -0
  779. package/ink/components/AppContext.ts +21 -0
  780. package/ink/components/Box.tsx +214 -0
  781. package/ink/components/Button.tsx +192 -0
  782. package/ink/components/ClockContext.tsx +112 -0
  783. package/ink/components/CursorDeclarationContext.ts +32 -0
  784. package/ink/components/ErrorOverview.tsx +109 -0
  785. package/ink/components/Link.tsx +42 -0
  786. package/ink/components/Newline.tsx +39 -0
  787. package/ink/components/NoSelect.tsx +68 -0
  788. package/ink/components/RawAnsi.tsx +57 -0
  789. package/ink/components/ScrollBox.tsx +237 -0
  790. package/ink/components/Spacer.tsx +20 -0
  791. package/ink/components/StdinContext.ts +49 -0
  792. package/ink/components/TerminalFocusContext.tsx +52 -0
  793. package/ink/components/TerminalSizeContext.tsx +7 -0
  794. package/ink/components/Text.tsx +254 -0
  795. package/ink/constants.ts +2 -0
  796. package/ink/dom.ts +484 -0
  797. package/ink/events/click-event.ts +38 -0
  798. package/ink/events/dispatcher.ts +235 -0
  799. package/ink/events/emitter.ts +39 -0
  800. package/ink/events/event-handlers.ts +73 -0
  801. package/ink/events/event.ts +11 -0
  802. package/ink/events/focus-event.ts +21 -0
  803. package/ink/events/input-event.ts +205 -0
  804. package/ink/events/keyboard-event.ts +51 -0
  805. package/ink/events/terminal-event.ts +107 -0
  806. package/ink/events/terminal-focus-event.ts +19 -0
  807. package/ink/focus.ts +181 -0
  808. package/ink/frame.ts +124 -0
  809. package/ink/get-max-width.ts +27 -0
  810. package/ink/global.d.ts +14 -0
  811. package/ink/hit-test.ts +130 -0
  812. package/ink/hooks/use-animation-frame.ts +57 -0
  813. package/ink/hooks/use-app.ts +8 -0
  814. package/ink/hooks/use-declared-cursor.ts +73 -0
  815. package/ink/hooks/use-input.ts +92 -0
  816. package/ink/hooks/use-interval.ts +67 -0
  817. package/ink/hooks/use-search-highlight.ts +53 -0
  818. package/ink/hooks/use-selection.ts +104 -0
  819. package/ink/hooks/use-stdin.ts +8 -0
  820. package/ink/hooks/use-tab-status.ts +72 -0
  821. package/ink/hooks/use-terminal-focus.ts +16 -0
  822. package/ink/hooks/use-terminal-title.ts +31 -0
  823. package/ink/hooks/use-terminal-viewport.ts +96 -0
  824. package/ink/ink.tsx +1723 -0
  825. package/ink/instances.ts +10 -0
  826. package/ink/layout/engine.ts +6 -0
  827. package/ink/layout/geometry.ts +97 -0
  828. package/ink/layout/node.ts +152 -0
  829. package/ink/layout/yoga.ts +308 -0
  830. package/ink/line-width-cache.ts +24 -0
  831. package/ink/log-update.ts +773 -0
  832. package/ink/measure-element.ts +23 -0
  833. package/ink/measure-text.ts +47 -0
  834. package/ink/node-cache.ts +54 -0
  835. package/ink/optimizer.ts +93 -0
  836. package/ink/output.ts +797 -0
  837. package/ink/parse-keypress.ts +801 -0
  838. package/ink/reconciler.ts +512 -0
  839. package/ink/render-border.ts +231 -0
  840. package/ink/render-node-to-output.ts +1462 -0
  841. package/ink/render-to-screen.ts +231 -0
  842. package/ink/renderer.ts +178 -0
  843. package/ink/root.ts +184 -0
  844. package/ink/screen.ts +1486 -0
  845. package/ink/searchHighlight.ts +93 -0
  846. package/ink/selection.ts +917 -0
  847. package/ink/squash-text-nodes.ts +92 -0
  848. package/ink/stringWidth.ts +222 -0
  849. package/ink/styles.ts +771 -0
  850. package/ink/supports-hyperlinks.ts +57 -0
  851. package/ink/tabstops.ts +46 -0
  852. package/ink/terminal-focus-state.ts +47 -0
  853. package/ink/terminal-querier.ts +212 -0
  854. package/ink/terminal.ts +248 -0
  855. package/ink/termio/ansi.ts +75 -0
  856. package/ink/termio/csi.ts +319 -0
  857. package/ink/termio/dec.ts +60 -0
  858. package/ink/termio/esc.ts +67 -0
  859. package/ink/termio/osc.ts +493 -0
  860. package/ink/termio/parser.ts +394 -0
  861. package/ink/termio/sgr.ts +308 -0
  862. package/ink/termio/tokenize.ts +319 -0
  863. package/ink/termio/types.ts +236 -0
  864. package/ink/termio.ts +42 -0
  865. package/ink/useTerminalNotification.ts +126 -0
  866. package/ink/warn.ts +9 -0
  867. package/ink/widest-line.ts +19 -0
  868. package/ink/wrap-text.ts +74 -0
  869. package/ink/wrapAnsi.ts +20 -0
  870. package/ink.ts +85 -0
  871. package/interactiveHelpers.tsx +366 -0
  872. package/main.tsx +4702 -0
  873. package/package.json +95 -0
  874. package/projectOnboardingState.ts +83 -0
  875. package/query/config.ts +46 -0
  876. package/query/deps.ts +40 -0
  877. package/query/stopHooks.ts +473 -0
  878. package/query/tokenBudget.ts +93 -0
  879. package/query.ts +1729 -0
  880. package/replLauncher.tsx +23 -0
  881. package/services/AgentSummary/agentSummary.ts +179 -0
  882. package/services/MagicDocs/magicDocs.ts +254 -0
  883. package/services/MagicDocs/prompts.ts +127 -0
  884. package/services/PromptSuggestion/promptSuggestion.ts +523 -0
  885. package/services/PromptSuggestion/speculation.ts +991 -0
  886. package/services/SessionMemory/prompts.ts +324 -0
  887. package/services/SessionMemory/sessionMemory.ts +495 -0
  888. package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  889. package/services/analytics/config.ts +38 -0
  890. package/services/analytics/datadog.ts +307 -0
  891. package/services/analytics/firstPartyEventLogger.ts +449 -0
  892. package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  893. package/services/analytics/growthbook.ts +1155 -0
  894. package/services/analytics/index.ts +173 -0
  895. package/services/analytics/metadata.ts +973 -0
  896. package/services/analytics/sink.ts +114 -0
  897. package/services/analytics/sinkKillswitch.ts +25 -0
  898. package/services/api/adminRequests.ts +119 -0
  899. package/services/api/bootstrap.ts +141 -0
  900. package/services/api/claude.ts +3419 -0
  901. package/services/api/client.ts +389 -0
  902. package/services/api/dumpPrompts.ts +226 -0
  903. package/services/api/emptyUsage.ts +22 -0
  904. package/services/api/errorUtils.ts +260 -0
  905. package/services/api/errors.ts +1207 -0
  906. package/services/api/filesApi.ts +748 -0
  907. package/services/api/firstTokenDate.ts +60 -0
  908. package/services/api/grove.ts +357 -0
  909. package/services/api/logging.ts +788 -0
  910. package/services/api/metricsOptOut.ts +159 -0
  911. package/services/api/overageCreditGrant.ts +137 -0
  912. package/services/api/promptCacheBreakDetection.ts +727 -0
  913. package/services/api/referral.ts +281 -0
  914. package/services/api/sessionIngress.ts +514 -0
  915. package/services/api/ultrareviewQuota.ts +38 -0
  916. package/services/api/usage.ts +63 -0
  917. package/services/api/withRetry.ts +822 -0
  918. package/services/autoDream/autoDream.ts +324 -0
  919. package/services/autoDream/config.ts +21 -0
  920. package/services/autoDream/consolidationLock.ts +140 -0
  921. package/services/autoDream/consolidationPrompt.ts +65 -0
  922. package/services/awaySummary.ts +74 -0
  923. package/services/claudeAiLimits.ts +515 -0
  924. package/services/claudeAiLimitsHook.ts +23 -0
  925. package/services/compact/apiMicrocompact.ts +153 -0
  926. package/services/compact/autoCompact.ts +351 -0
  927. package/services/compact/compact.ts +1705 -0
  928. package/services/compact/compactWarningHook.ts +16 -0
  929. package/services/compact/compactWarningState.ts +18 -0
  930. package/services/compact/grouping.ts +63 -0
  931. package/services/compact/microCompact.ts +530 -0
  932. package/services/compact/postCompactCleanup.ts +77 -0
  933. package/services/compact/prompt.ts +374 -0
  934. package/services/compact/sessionMemoryCompact.ts +630 -0
  935. package/services/compact/timeBasedMCConfig.ts +43 -0
  936. package/services/diagnosticTracking.ts +397 -0
  937. package/services/extractMemories/extractMemories.ts +615 -0
  938. package/services/extractMemories/prompts.ts +154 -0
  939. package/services/internalLogging.ts +90 -0
  940. package/services/lsp/LSPClient.ts +447 -0
  941. package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  942. package/services/lsp/LSPServerInstance.ts +511 -0
  943. package/services/lsp/LSPServerManager.ts +420 -0
  944. package/services/lsp/config.ts +79 -0
  945. package/services/lsp/manager.ts +289 -0
  946. package/services/lsp/passiveFeedback.ts +328 -0
  947. package/services/mcp/InProcessTransport.ts +63 -0
  948. package/services/mcp/MCPConnectionManager.tsx +73 -0
  949. package/services/mcp/SdkControlTransport.ts +136 -0
  950. package/services/mcp/auth.ts +2465 -0
  951. package/services/mcp/channelAllowlist.ts +76 -0
  952. package/services/mcp/channelNotification.ts +316 -0
  953. package/services/mcp/channelPermissions.ts +240 -0
  954. package/services/mcp/claudeai.ts +164 -0
  955. package/services/mcp/client.ts +3348 -0
  956. package/services/mcp/config.ts +1578 -0
  957. package/services/mcp/elicitationHandler.ts +313 -0
  958. package/services/mcp/envExpansion.ts +38 -0
  959. package/services/mcp/headersHelper.ts +138 -0
  960. package/services/mcp/mcpStringUtils.ts +106 -0
  961. package/services/mcp/normalization.ts +23 -0
  962. package/services/mcp/oauthPort.ts +78 -0
  963. package/services/mcp/officialRegistry.ts +72 -0
  964. package/services/mcp/types.ts +258 -0
  965. package/services/mcp/useManageMCPConnections.ts +1141 -0
  966. package/services/mcp/utils.ts +575 -0
  967. package/services/mcp/vscodeSdkMcp.ts +112 -0
  968. package/services/mcp/xaa.ts +511 -0
  969. package/services/mcp/xaaIdpLogin.ts +487 -0
  970. package/services/mcpServerApproval.tsx +41 -0
  971. package/services/mockRateLimits.ts +882 -0
  972. package/services/notifier.ts +156 -0
  973. package/services/oauth/auth-code-listener.ts +211 -0
  974. package/services/oauth/client.ts +566 -0
  975. package/services/oauth/crypto.ts +23 -0
  976. package/services/oauth/getOauthProfile.ts +53 -0
  977. package/services/oauth/index.ts +198 -0
  978. package/services/plugins/PluginInstallationManager.ts +184 -0
  979. package/services/plugins/pluginCliCommands.ts +344 -0
  980. package/services/plugins/pluginOperations.ts +1088 -0
  981. package/services/policyLimits/index.ts +663 -0
  982. package/services/policyLimits/types.ts +27 -0
  983. package/services/preventSleep.ts +165 -0
  984. package/services/rateLimitMessages.ts +344 -0
  985. package/services/rateLimitMocking.ts +144 -0
  986. package/services/remoteManagedSettings/index.ts +638 -0
  987. package/services/remoteManagedSettings/securityCheck.tsx +74 -0
  988. package/services/remoteManagedSettings/syncCache.ts +112 -0
  989. package/services/remoteManagedSettings/syncCacheState.ts +96 -0
  990. package/services/remoteManagedSettings/types.ts +31 -0
  991. package/services/settingsSync/index.ts +581 -0
  992. package/services/settingsSync/types.ts +67 -0
  993. package/services/teamMemorySync/index.ts +1256 -0
  994. package/services/teamMemorySync/secretScanner.ts +324 -0
  995. package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  996. package/services/teamMemorySync/types.ts +156 -0
  997. package/services/teamMemorySync/watcher.ts +387 -0
  998. package/services/tips/tipHistory.ts +17 -0
  999. package/services/tips/tipRegistry.ts +686 -0
  1000. package/services/tips/tipScheduler.ts +58 -0
  1001. package/services/tokenEstimation.ts +495 -0
  1002. package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1003. package/services/tools/StreamingToolExecutor.ts +530 -0
  1004. package/services/tools/toolExecution.ts +1745 -0
  1005. package/services/tools/toolHooks.ts +650 -0
  1006. package/services/tools/toolOrchestration.ts +188 -0
  1007. package/services/vcr.ts +406 -0
  1008. package/services/voice.ts +525 -0
  1009. package/services/voiceKeyterms.ts +106 -0
  1010. package/services/voiceStreamSTT.ts +544 -0
  1011. package/setup.ts +477 -0
  1012. package/state/AppState.tsx +200 -0
  1013. package/state/AppStateStore.ts +569 -0
  1014. package/state/onChangeAppState.ts +171 -0
  1015. package/state/selectors.ts +76 -0
  1016. package/state/store.ts +34 -0
  1017. package/state/teammateViewHelpers.ts +141 -0
  1018. package/tasks.ts +39 -0
  1019. package/tools/AgentTool/AgentTool.tsx +1398 -0
  1020. package/tools/AgentTool/UI.tsx +872 -0
  1021. package/tools/AgentTool/agentColorManager.ts +66 -0
  1022. package/tools/AgentTool/agentDisplay.ts +104 -0
  1023. package/tools/AgentTool/agentMemory.ts +177 -0
  1024. package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1025. package/tools/AgentTool/agentToolUtils.ts +686 -0
  1026. package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1027. package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1028. package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1029. package/tools/AgentTool/built-in/planAgent.ts +92 -0
  1030. package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1031. package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1032. package/tools/AgentTool/builtInAgents.ts +72 -0
  1033. package/tools/AgentTool/constants.ts +12 -0
  1034. package/tools/AgentTool/forkSubagent.ts +210 -0
  1035. package/tools/AgentTool/loadAgentsDir.ts +755 -0
  1036. package/tools/AgentTool/prompt.ts +287 -0
  1037. package/tools/AgentTool/resumeAgent.ts +265 -0
  1038. package/tools/AgentTool/runAgent.ts +973 -0
  1039. package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1040. package/tools/AskUserQuestionTool/prompt.ts +44 -0
  1041. package/tools/BashTool/BashTool.tsx +1144 -0
  1042. package/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1043. package/tools/BashTool/UI.tsx +185 -0
  1044. package/tools/BashTool/bashCommandHelpers.ts +265 -0
  1045. package/tools/BashTool/bashPermissions.ts +2621 -0
  1046. package/tools/BashTool/bashSecurity.ts +2592 -0
  1047. package/tools/BashTool/commandSemantics.ts +140 -0
  1048. package/tools/BashTool/commentLabel.ts +13 -0
  1049. package/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1050. package/tools/BashTool/modeValidation.ts +115 -0
  1051. package/tools/BashTool/pathValidation.ts +1303 -0
  1052. package/tools/BashTool/prompt.ts +369 -0
  1053. package/tools/BashTool/readOnlyValidation.ts +1990 -0
  1054. package/tools/BashTool/sedEditParser.ts +322 -0
  1055. package/tools/BashTool/sedValidation.ts +684 -0
  1056. package/tools/BashTool/shouldUseSandbox.ts +153 -0
  1057. package/tools/BashTool/toolName.ts +2 -0
  1058. package/tools/BashTool/utils.ts +223 -0
  1059. package/tools/BriefTool/BriefTool.ts +204 -0
  1060. package/tools/BriefTool/UI.tsx +101 -0
  1061. package/tools/BriefTool/attachments.ts +110 -0
  1062. package/tools/BriefTool/prompt.ts +22 -0
  1063. package/tools/BriefTool/upload.ts +174 -0
  1064. package/tools/ConfigTool/ConfigTool.ts +467 -0
  1065. package/tools/ConfigTool/UI.tsx +38 -0
  1066. package/tools/ConfigTool/constants.ts +1 -0
  1067. package/tools/ConfigTool/prompt.ts +93 -0
  1068. package/tools/ConfigTool/supportedSettings.ts +211 -0
  1069. package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1070. package/tools/EnterPlanModeTool/UI.tsx +33 -0
  1071. package/tools/EnterPlanModeTool/constants.ts +1 -0
  1072. package/tools/EnterPlanModeTool/prompt.ts +170 -0
  1073. package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1074. package/tools/EnterWorktreeTool/UI.tsx +20 -0
  1075. package/tools/EnterWorktreeTool/constants.ts +1 -0
  1076. package/tools/EnterWorktreeTool/prompt.ts +30 -0
  1077. package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1078. package/tools/ExitPlanModeTool/UI.tsx +82 -0
  1079. package/tools/ExitPlanModeTool/constants.ts +2 -0
  1080. package/tools/ExitPlanModeTool/prompt.ts +29 -0
  1081. package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1082. package/tools/ExitWorktreeTool/UI.tsx +25 -0
  1083. package/tools/ExitWorktreeTool/constants.ts +1 -0
  1084. package/tools/ExitWorktreeTool/prompt.ts +32 -0
  1085. package/tools/FileEditTool/FileEditTool.ts +625 -0
  1086. package/tools/FileEditTool/UI.tsx +289 -0
  1087. package/tools/FileEditTool/constants.ts +11 -0
  1088. package/tools/FileEditTool/prompt.ts +28 -0
  1089. package/tools/FileEditTool/types.ts +85 -0
  1090. package/tools/FileEditTool/utils.ts +775 -0
  1091. package/tools/FileReadTool/FileReadTool.ts +1183 -0
  1092. package/tools/FileReadTool/UI.tsx +185 -0
  1093. package/tools/FileReadTool/imageProcessor.ts +94 -0
  1094. package/tools/FileReadTool/limits.ts +92 -0
  1095. package/tools/FileReadTool/prompt.ts +49 -0
  1096. package/tools/FileWriteTool/FileWriteTool.ts +434 -0
  1097. package/tools/FileWriteTool/UI.tsx +405 -0
  1098. package/tools/FileWriteTool/prompt.ts +18 -0
  1099. package/tools/GlobTool/GlobTool.ts +198 -0
  1100. package/tools/GlobTool/UI.tsx +63 -0
  1101. package/tools/GlobTool/prompt.ts +7 -0
  1102. package/tools/GrepTool/GrepTool.ts +577 -0
  1103. package/tools/GrepTool/UI.tsx +201 -0
  1104. package/tools/GrepTool/prompt.ts +18 -0
  1105. package/tools/LSPTool/LSPTool.ts +860 -0
  1106. package/tools/LSPTool/UI.tsx +228 -0
  1107. package/tools/LSPTool/formatters.ts +592 -0
  1108. package/tools/LSPTool/prompt.ts +21 -0
  1109. package/tools/LSPTool/schemas.ts +215 -0
  1110. package/tools/LSPTool/symbolContext.ts +90 -0
  1111. package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1112. package/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1113. package/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1114. package/tools/MCPTool/MCPTool.ts +77 -0
  1115. package/tools/MCPTool/UI.tsx +403 -0
  1116. package/tools/MCPTool/classifyForCollapse.ts +604 -0
  1117. package/tools/MCPTool/prompt.ts +3 -0
  1118. package/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1119. package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  1120. package/tools/NotebookEditTool/UI.tsx +93 -0
  1121. package/tools/NotebookEditTool/constants.ts +2 -0
  1122. package/tools/NotebookEditTool/prompt.ts +3 -0
  1123. package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1124. package/tools/PowerShellTool/UI.tsx +131 -0
  1125. package/tools/PowerShellTool/clmTypes.ts +211 -0
  1126. package/tools/PowerShellTool/commandSemantics.ts +142 -0
  1127. package/tools/PowerShellTool/commonParameters.ts +30 -0
  1128. package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1129. package/tools/PowerShellTool/gitSafety.ts +176 -0
  1130. package/tools/PowerShellTool/modeValidation.ts +404 -0
  1131. package/tools/PowerShellTool/pathValidation.ts +2049 -0
  1132. package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1133. package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1134. package/tools/PowerShellTool/prompt.ts +145 -0
  1135. package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1136. package/tools/PowerShellTool/toolName.ts +2 -0
  1137. package/tools/REPLTool/constants.ts +46 -0
  1138. package/tools/REPLTool/primitiveTools.ts +39 -0
  1139. package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1140. package/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1141. package/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1142. package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1143. package/tools/RemoteTriggerTool/UI.tsx +17 -0
  1144. package/tools/RemoteTriggerTool/prompt.ts +15 -0
  1145. package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1146. package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1147. package/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1148. package/tools/ScheduleCronTool/UI.tsx +60 -0
  1149. package/tools/ScheduleCronTool/prompt.ts +135 -0
  1150. package/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1151. package/tools/SendMessageTool/UI.tsx +31 -0
  1152. package/tools/SendMessageTool/constants.ts +1 -0
  1153. package/tools/SendMessageTool/prompt.ts +49 -0
  1154. package/tools/SkillTool/SkillTool.ts +1108 -0
  1155. package/tools/SkillTool/UI.tsx +128 -0
  1156. package/tools/SkillTool/constants.ts +1 -0
  1157. package/tools/SkillTool/prompt.ts +241 -0
  1158. package/tools/SleepTool/prompt.ts +17 -0
  1159. package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1160. package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1161. package/tools/TaskCreateTool/constants.ts +1 -0
  1162. package/tools/TaskCreateTool/prompt.ts +56 -0
  1163. package/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1164. package/tools/TaskGetTool/constants.ts +1 -0
  1165. package/tools/TaskGetTool/prompt.ts +24 -0
  1166. package/tools/TaskListTool/TaskListTool.ts +116 -0
  1167. package/tools/TaskListTool/constants.ts +1 -0
  1168. package/tools/TaskListTool/prompt.ts +49 -0
  1169. package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1170. package/tools/TaskOutputTool/constants.ts +1 -0
  1171. package/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1172. package/tools/TaskStopTool/UI.tsx +41 -0
  1173. package/tools/TaskStopTool/prompt.ts +8 -0
  1174. package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1175. package/tools/TaskUpdateTool/constants.ts +1 -0
  1176. package/tools/TaskUpdateTool/prompt.ts +77 -0
  1177. package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1178. package/tools/TeamCreateTool/UI.tsx +6 -0
  1179. package/tools/TeamCreateTool/constants.ts +1 -0
  1180. package/tools/TeamCreateTool/prompt.ts +113 -0
  1181. package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1182. package/tools/TeamDeleteTool/UI.tsx +20 -0
  1183. package/tools/TeamDeleteTool/constants.ts +1 -0
  1184. package/tools/TeamDeleteTool/prompt.ts +16 -0
  1185. package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1186. package/tools/TodoWriteTool/constants.ts +1 -0
  1187. package/tools/TodoWriteTool/prompt.ts +184 -0
  1188. package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1189. package/tools/ToolSearchTool/constants.ts +1 -0
  1190. package/tools/ToolSearchTool/prompt.ts +121 -0
  1191. package/tools/WebFetchTool/UI.tsx +72 -0
  1192. package/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1193. package/tools/WebFetchTool/preapproved.ts +166 -0
  1194. package/tools/WebFetchTool/prompt.ts +46 -0
  1195. package/tools/WebFetchTool/utils.ts +530 -0
  1196. package/tools/WebSearchTool/UI.tsx +101 -0
  1197. package/tools/WebSearchTool/WebSearchTool.ts +435 -0
  1198. package/tools/WebSearchTool/prompt.ts +34 -0
  1199. package/tools/WorkflowTool/constants.ts +5 -0
  1200. package/tools/shared/gitOperationTracking.ts +277 -0
  1201. package/tools/shared/spawnMultiAgent.ts +1093 -0
  1202. package/tools/testing/TestingPermissionTool.tsx +74 -0
  1203. package/tools/utils.ts +40 -0
  1204. package/tools.ts +392 -0
  1205. package/types/command.ts +216 -0
  1206. package/types/connectorText.ts +21 -0
  1207. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1208. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  1209. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1210. package/types/generated/google/protobuf/timestamp.ts +187 -0
  1211. package/types/hooks.ts +290 -0
  1212. package/types/ids.ts +44 -0
  1213. package/types/logs.ts +330 -0
  1214. package/types/permissions.ts +441 -0
  1215. package/types/plugin.ts +363 -0
  1216. package/types/textInputTypes.ts +387 -0
  1217. package/utils/CircularBuffer.ts +84 -0
  1218. package/utils/Cursor.ts +1530 -0
  1219. package/utils/QueryGuard.ts +121 -0
  1220. package/utils/Shell.ts +474 -0
  1221. package/utils/ShellCommand.ts +465 -0
  1222. package/utils/abortController.ts +99 -0
  1223. package/utils/activityManager.ts +164 -0
  1224. package/utils/advisor.ts +145 -0
  1225. package/utils/agentContext.ts +178 -0
  1226. package/utils/agentId.ts +99 -0
  1227. package/utils/agentSwarmsEnabled.ts +44 -0
  1228. package/utils/agenticSessionSearch.ts +307 -0
  1229. package/utils/analyzeContext.ts +1382 -0
  1230. package/utils/ansiToPng.ts +334 -0
  1231. package/utils/ansiToSvg.ts +272 -0
  1232. package/utils/api.ts +718 -0
  1233. package/utils/apiPreconnect.ts +71 -0
  1234. package/utils/appleTerminalBackup.ts +124 -0
  1235. package/utils/argumentSubstitution.ts +145 -0
  1236. package/utils/array.ts +13 -0
  1237. package/utils/asciicast.ts +239 -0
  1238. package/utils/attachments.ts +3997 -0
  1239. package/utils/attribution.ts +393 -0
  1240. package/utils/auth.ts +2002 -0
  1241. package/utils/authFileDescriptor.ts +196 -0
  1242. package/utils/authPortable.ts +19 -0
  1243. package/utils/autoModeDenials.ts +26 -0
  1244. package/utils/autoRunIssue.tsx +122 -0
  1245. package/utils/autoUpdater.ts +561 -0
  1246. package/utils/aws.ts +74 -0
  1247. package/utils/awsAuthStatusManager.ts +81 -0
  1248. package/utils/background/remote/preconditions.ts +235 -0
  1249. package/utils/background/remote/remoteSession.ts +98 -0
  1250. package/utils/backgroundHousekeeping.ts +94 -0
  1251. package/utils/bash/ParsedCommand.ts +318 -0
  1252. package/utils/bash/ShellSnapshot.ts +582 -0
  1253. package/utils/bash/ast.ts +2679 -0
  1254. package/utils/bash/bashParser.ts +4436 -0
  1255. package/utils/bash/bashPipeCommand.ts +294 -0
  1256. package/utils/bash/commands.ts +1339 -0
  1257. package/utils/bash/heredoc.ts +733 -0
  1258. package/utils/bash/parser.ts +230 -0
  1259. package/utils/bash/prefix.ts +204 -0
  1260. package/utils/bash/registry.ts +53 -0
  1261. package/utils/bash/shellCompletion.ts +259 -0
  1262. package/utils/bash/shellPrefix.ts +28 -0
  1263. package/utils/bash/shellQuote.ts +304 -0
  1264. package/utils/bash/shellQuoting.ts +128 -0
  1265. package/utils/bash/specs/alias.ts +14 -0
  1266. package/utils/bash/specs/index.ts +18 -0
  1267. package/utils/bash/specs/nohup.ts +13 -0
  1268. package/utils/bash/specs/pyright.ts +91 -0
  1269. package/utils/bash/specs/sleep.ts +13 -0
  1270. package/utils/bash/specs/srun.ts +31 -0
  1271. package/utils/bash/specs/time.ts +13 -0
  1272. package/utils/bash/specs/timeout.ts +20 -0
  1273. package/utils/bash/treeSitterAnalysis.ts +506 -0
  1274. package/utils/betas.ts +434 -0
  1275. package/utils/billing.ts +78 -0
  1276. package/utils/binaryCheck.ts +53 -0
  1277. package/utils/browser.ts +68 -0
  1278. package/utils/bufferedWriter.ts +100 -0
  1279. package/utils/bundledMode.ts +22 -0
  1280. package/utils/caCerts.ts +115 -0
  1281. package/utils/caCertsConfig.ts +88 -0
  1282. package/utils/cachePaths.ts +38 -0
  1283. package/utils/classifierApprovals.ts +88 -0
  1284. package/utils/classifierApprovalsHook.ts +17 -0
  1285. package/utils/claudeCodeHints.ts +193 -0
  1286. package/utils/claudeDesktop.ts +152 -0
  1287. package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1288. package/utils/claudeInChrome/common.ts +540 -0
  1289. package/utils/claudeInChrome/mcpServer.ts +293 -0
  1290. package/utils/claudeInChrome/prompt.ts +83 -0
  1291. package/utils/claudeInChrome/setup.ts +400 -0
  1292. package/utils/claudeInChrome/setupPortable.ts +233 -0
  1293. package/utils/claudeInChrome/toolRendering.tsx +262 -0
  1294. package/utils/claudemd.ts +1479 -0
  1295. package/utils/cleanup.ts +602 -0
  1296. package/utils/cleanupRegistry.ts +25 -0
  1297. package/utils/cliArgs.ts +60 -0
  1298. package/utils/cliHighlight.ts +54 -0
  1299. package/utils/codeIndexing.ts +206 -0
  1300. package/utils/collapseBackgroundBashNotifications.ts +84 -0
  1301. package/utils/collapseHookSummaries.ts +59 -0
  1302. package/utils/collapseReadSearch.ts +1109 -0
  1303. package/utils/collapseTeammateShutdowns.ts +55 -0
  1304. package/utils/combinedAbortSignal.ts +47 -0
  1305. package/utils/commandLifecycle.ts +21 -0
  1306. package/utils/commitAttribution.ts +961 -0
  1307. package/utils/completionCache.ts +166 -0
  1308. package/utils/computerUse/appNames.ts +196 -0
  1309. package/utils/computerUse/cleanup.ts +86 -0
  1310. package/utils/computerUse/common.ts +61 -0
  1311. package/utils/computerUse/computerUseLock.ts +215 -0
  1312. package/utils/computerUse/drainRunLoop.ts +79 -0
  1313. package/utils/computerUse/escHotkey.ts +54 -0
  1314. package/utils/computerUse/executor.ts +658 -0
  1315. package/utils/computerUse/gates.ts +72 -0
  1316. package/utils/computerUse/hostAdapter.ts +69 -0
  1317. package/utils/computerUse/inputLoader.ts +30 -0
  1318. package/utils/computerUse/mcpServer.ts +106 -0
  1319. package/utils/computerUse/setup.ts +53 -0
  1320. package/utils/computerUse/swiftLoader.ts +23 -0
  1321. package/utils/computerUse/toolRendering.tsx +125 -0
  1322. package/utils/computerUse/wrapper.tsx +336 -0
  1323. package/utils/concurrentSessions.ts +204 -0
  1324. package/utils/config.ts +1817 -0
  1325. package/utils/configConstants.ts +21 -0
  1326. package/utils/contentArray.ts +51 -0
  1327. package/utils/context.ts +221 -0
  1328. package/utils/contextAnalysis.ts +272 -0
  1329. package/utils/contextSuggestions.ts +235 -0
  1330. package/utils/controlMessageCompat.ts +32 -0
  1331. package/utils/conversationRecovery.ts +597 -0
  1332. package/utils/cron.ts +308 -0
  1333. package/utils/cronJitterConfig.ts +75 -0
  1334. package/utils/cronScheduler.ts +565 -0
  1335. package/utils/cronTasks.ts +458 -0
  1336. package/utils/cronTasksLock.ts +195 -0
  1337. package/utils/crossProjectResume.ts +75 -0
  1338. package/utils/crypto.ts +13 -0
  1339. package/utils/cwd.ts +32 -0
  1340. package/utils/debug.ts +268 -0
  1341. package/utils/debugFilter.ts +157 -0
  1342. package/utils/deepLink/banner.ts +123 -0
  1343. package/utils/deepLink/parseDeepLink.ts +170 -0
  1344. package/utils/deepLink/protocolHandler.ts +136 -0
  1345. package/utils/deepLink/registerProtocol.ts +348 -0
  1346. package/utils/deepLink/terminalLauncher.ts +557 -0
  1347. package/utils/deepLink/terminalPreference.ts +54 -0
  1348. package/utils/desktopDeepLink.ts +236 -0
  1349. package/utils/detectRepository.ts +178 -0
  1350. package/utils/diagLogs.ts +94 -0
  1351. package/utils/diff.ts +177 -0
  1352. package/utils/directMemberMessage.ts +69 -0
  1353. package/utils/displayTags.ts +51 -0
  1354. package/utils/doctorContextWarnings.ts +265 -0
  1355. package/utils/doctorDiagnostic.ts +625 -0
  1356. package/utils/dxt/helpers.ts +88 -0
  1357. package/utils/dxt/zip.ts +226 -0
  1358. package/utils/earlyInput.ts +191 -0
  1359. package/utils/editor.ts +183 -0
  1360. package/utils/effort.ts +329 -0
  1361. package/utils/embeddedTools.ts +29 -0
  1362. package/utils/env.ts +347 -0
  1363. package/utils/envDynamic.ts +151 -0
  1364. package/utils/envUtils.ts +183 -0
  1365. package/utils/envValidation.ts +38 -0
  1366. package/utils/errorLogSink.ts +235 -0
  1367. package/utils/errors.ts +238 -0
  1368. package/utils/exampleCommands.ts +184 -0
  1369. package/utils/execFileNoThrow.ts +150 -0
  1370. package/utils/execFileNoThrowPortable.ts +89 -0
  1371. package/utils/execSyncWrapper.ts +38 -0
  1372. package/utils/exportRenderer.tsx +98 -0
  1373. package/utils/extraUsage.ts +23 -0
  1374. package/utils/fastMode.ts +532 -0
  1375. package/utils/file.ts +584 -0
  1376. package/utils/fileHistory.ts +1115 -0
  1377. package/utils/fileOperationAnalytics.ts +71 -0
  1378. package/utils/filePersistence/filePersistence.ts +287 -0
  1379. package/utils/filePersistence/outputsScanner.ts +126 -0
  1380. package/utils/filePersistence/types.ts +28 -0
  1381. package/utils/fileRead.ts +102 -0
  1382. package/utils/fileReadCache.ts +96 -0
  1383. package/utils/fileStateCache.ts +142 -0
  1384. package/utils/findExecutable.ts +17 -0
  1385. package/utils/fingerprint.ts +76 -0
  1386. package/utils/forkedAgent.ts +689 -0
  1387. package/utils/format.ts +308 -0
  1388. package/utils/formatBriefTimestamp.ts +81 -0
  1389. package/utils/fpsTracker.ts +47 -0
  1390. package/utils/frontmatterParser.ts +370 -0
  1391. package/utils/fsOperations.ts +770 -0
  1392. package/utils/fullscreen.ts +202 -0
  1393. package/utils/generatedFiles.ts +136 -0
  1394. package/utils/generators.ts +88 -0
  1395. package/utils/genericProcessUtils.ts +184 -0
  1396. package/utils/getWorktreePaths.ts +70 -0
  1397. package/utils/getWorktreePathsPortable.ts +27 -0
  1398. package/utils/ghPrStatus.ts +106 -0
  1399. package/utils/git/gitConfigParser.ts +277 -0
  1400. package/utils/git/gitFilesystem.ts +699 -0
  1401. package/utils/git/gitignore.ts +99 -0
  1402. package/utils/git.ts +926 -0
  1403. package/utils/gitDiff.ts +532 -0
  1404. package/utils/gitSettings.ts +18 -0
  1405. package/utils/github/ghAuthStatus.ts +29 -0
  1406. package/utils/githubRepoPathMapping.ts +162 -0
  1407. package/utils/glob.ts +130 -0
  1408. package/utils/gracefulShutdown.ts +529 -0
  1409. package/utils/groupToolUses.ts +182 -0
  1410. package/utils/handlePromptSubmit.ts +610 -0
  1411. package/utils/hash.ts +46 -0
  1412. package/utils/headlessProfiler.ts +178 -0
  1413. package/utils/heapDumpService.ts +303 -0
  1414. package/utils/heatmap.ts +198 -0
  1415. package/utils/highlightMatch.tsx +28 -0
  1416. package/utils/hooks/AsyncHookRegistry.ts +309 -0
  1417. package/utils/hooks/apiQueryHookHelper.ts +141 -0
  1418. package/utils/hooks/execAgentHook.ts +339 -0
  1419. package/utils/hooks/execHttpHook.ts +242 -0
  1420. package/utils/hooks/execPromptHook.ts +211 -0
  1421. package/utils/hooks/fileChangedWatcher.ts +191 -0
  1422. package/utils/hooks/hookEvents.ts +192 -0
  1423. package/utils/hooks/hookHelpers.ts +83 -0
  1424. package/utils/hooks/hooksConfigManager.ts +400 -0
  1425. package/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1426. package/utils/hooks/hooksSettings.ts +271 -0
  1427. package/utils/hooks/postSamplingHooks.ts +70 -0
  1428. package/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1429. package/utils/hooks/registerSkillHooks.ts +64 -0
  1430. package/utils/hooks/sessionHooks.ts +447 -0
  1431. package/utils/hooks/skillImprovement.ts +267 -0
  1432. package/utils/hooks/ssrfGuard.ts +294 -0
  1433. package/utils/hooks.ts +5022 -0
  1434. package/utils/horizontalScroll.ts +137 -0
  1435. package/utils/http.ts +136 -0
  1436. package/utils/hyperlink.ts +39 -0
  1437. package/utils/iTermBackup.ts +73 -0
  1438. package/utils/ide.ts +1494 -0
  1439. package/utils/idePathConversion.ts +90 -0
  1440. package/utils/idleTimeout.ts +53 -0
  1441. package/utils/imagePaste.ts +416 -0
  1442. package/utils/imageResizer.ts +880 -0
  1443. package/utils/imageStore.ts +167 -0
  1444. package/utils/imageValidation.ts +104 -0
  1445. package/utils/immediateCommand.ts +15 -0
  1446. package/utils/inProcessTeammateHelpers.ts +102 -0
  1447. package/utils/ink.ts +26 -0
  1448. package/utils/intl.ts +94 -0
  1449. package/utils/jetbrains.ts +191 -0
  1450. package/utils/json.ts +277 -0
  1451. package/utils/jsonRead.ts +16 -0
  1452. package/utils/keyboardShortcuts.ts +14 -0
  1453. package/utils/lazySchema.ts +8 -0
  1454. package/utils/listSessionsImpl.ts +454 -0
  1455. package/utils/localInstaller.ts +162 -0
  1456. package/utils/lockfile.ts +43 -0
  1457. package/utils/log.ts +362 -0
  1458. package/utils/logoV2Utils.ts +350 -0
  1459. package/utils/mailbox.ts +73 -0
  1460. package/utils/managedEnv.ts +199 -0
  1461. package/utils/managedEnvConstants.ts +191 -0
  1462. package/utils/markdown.ts +381 -0
  1463. package/utils/markdownConfigLoader.ts +600 -0
  1464. package/utils/mcp/dateTimeParser.ts +121 -0
  1465. package/utils/mcp/elicitationValidation.ts +336 -0
  1466. package/utils/mcpInstructionsDelta.ts +130 -0
  1467. package/utils/mcpOutputStorage.ts +189 -0
  1468. package/utils/mcpValidation.ts +208 -0
  1469. package/utils/mcpWebSocketTransport.ts +200 -0
  1470. package/utils/memoize.ts +269 -0
  1471. package/utils/memory/types.ts +12 -0
  1472. package/utils/memory/versions.ts +8 -0
  1473. package/utils/memoryFileDetection.ts +289 -0
  1474. package/utils/messagePredicates.ts +8 -0
  1475. package/utils/messageQueueManager.ts +547 -0
  1476. package/utils/messages/mappers.ts +290 -0
  1477. package/utils/messages/systemInit.ts +96 -0
  1478. package/utils/messages.ts +5512 -0
  1479. package/utils/model/agent.ts +157 -0
  1480. package/utils/model/aliases.ts +25 -0
  1481. package/utils/model/antModels.ts +64 -0
  1482. package/utils/model/bedrock.ts +265 -0
  1483. package/utils/model/check1mAccess.ts +72 -0
  1484. package/utils/model/configs.ts +118 -0
  1485. package/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1486. package/utils/model/deprecation.ts +101 -0
  1487. package/utils/model/model.ts +618 -0
  1488. package/utils/model/modelAllowlist.ts +170 -0
  1489. package/utils/model/modelCapabilities.ts +118 -0
  1490. package/utils/model/modelOptions.ts +540 -0
  1491. package/utils/model/modelStrings.ts +166 -0
  1492. package/utils/model/modelSupportOverrides.ts +50 -0
  1493. package/utils/model/providers.ts +40 -0
  1494. package/utils/model/validateModel.ts +159 -0
  1495. package/utils/modelCost.ts +231 -0
  1496. package/utils/modifiers.ts +36 -0
  1497. package/utils/mtls.ts +179 -0
  1498. package/utils/nativeInstaller/download.ts +523 -0
  1499. package/utils/nativeInstaller/index.ts +18 -0
  1500. package/utils/nativeInstaller/installer.ts +1708 -0
  1501. package/utils/nativeInstaller/packageManagers.ts +336 -0
  1502. package/utils/nativeInstaller/pidLock.ts +433 -0
  1503. package/utils/notebook.ts +224 -0
  1504. package/utils/objectGroupBy.ts +18 -0
  1505. package/utils/pasteStore.ts +104 -0
  1506. package/utils/path.ts +155 -0
  1507. package/utils/pdf.ts +300 -0
  1508. package/utils/pdfUtils.ts +70 -0
  1509. package/utils/peerAddress.ts +21 -0
  1510. package/utils/permissions/PermissionMode.ts +141 -0
  1511. package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1512. package/utils/permissions/PermissionResult.ts +35 -0
  1513. package/utils/permissions/PermissionRule.ts +40 -0
  1514. package/utils/permissions/PermissionUpdate.ts +389 -0
  1515. package/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1516. package/utils/permissions/autoModeState.ts +39 -0
  1517. package/utils/permissions/bashClassifier.ts +61 -0
  1518. package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1519. package/utils/permissions/classifierDecision.ts +98 -0
  1520. package/utils/permissions/classifierShared.ts +39 -0
  1521. package/utils/permissions/dangerousPatterns.ts +80 -0
  1522. package/utils/permissions/denialTracking.ts +45 -0
  1523. package/utils/permissions/filesystem.ts +1777 -0
  1524. package/utils/permissions/getNextPermissionMode.ts +101 -0
  1525. package/utils/permissions/pathValidation.ts +485 -0
  1526. package/utils/permissions/permissionExplainer.ts +250 -0
  1527. package/utils/permissions/permissionRuleParser.ts +198 -0
  1528. package/utils/permissions/permissionSetup.ts +1532 -0
  1529. package/utils/permissions/permissions.ts +1486 -0
  1530. package/utils/permissions/permissionsLoader.ts +296 -0
  1531. package/utils/permissions/shadowedRuleDetection.ts +234 -0
  1532. package/utils/permissions/shellRuleMatching.ts +228 -0
  1533. package/utils/permissions/yoloClassifier.ts +1495 -0
  1534. package/utils/planModeV2.ts +95 -0
  1535. package/utils/plans.ts +397 -0
  1536. package/utils/platform.ts +150 -0
  1537. package/utils/plugins/addDirPluginSettings.ts +71 -0
  1538. package/utils/plugins/cacheUtils.ts +196 -0
  1539. package/utils/plugins/dependencyResolver.ts +305 -0
  1540. package/utils/plugins/fetchTelemetry.ts +135 -0
  1541. package/utils/plugins/gitAvailability.ts +69 -0
  1542. package/utils/plugins/headlessPluginInstall.ts +174 -0
  1543. package/utils/plugins/hintRecommendation.ts +164 -0
  1544. package/utils/plugins/installCounts.ts +292 -0
  1545. package/utils/plugins/installedPluginsManager.ts +1268 -0
  1546. package/utils/plugins/loadPluginAgents.ts +348 -0
  1547. package/utils/plugins/loadPluginCommands.ts +946 -0
  1548. package/utils/plugins/loadPluginHooks.ts +287 -0
  1549. package/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1550. package/utils/plugins/lspPluginIntegration.ts +387 -0
  1551. package/utils/plugins/lspRecommendation.ts +374 -0
  1552. package/utils/plugins/managedPlugins.ts +27 -0
  1553. package/utils/plugins/marketplaceHelpers.ts +592 -0
  1554. package/utils/plugins/marketplaceManager.ts +2643 -0
  1555. package/utils/plugins/mcpPluginIntegration.ts +634 -0
  1556. package/utils/plugins/mcpbHandler.ts +968 -0
  1557. package/utils/plugins/officialMarketplace.ts +25 -0
  1558. package/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1559. package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1560. package/utils/plugins/orphanedPluginFilter.ts +114 -0
  1561. package/utils/plugins/parseMarketplaceInput.ts +162 -0
  1562. package/utils/plugins/performStartupChecks.tsx +70 -0
  1563. package/utils/plugins/pluginAutoupdate.ts +284 -0
  1564. package/utils/plugins/pluginBlocklist.ts +127 -0
  1565. package/utils/plugins/pluginDirectories.ts +178 -0
  1566. package/utils/plugins/pluginFlagging.ts +208 -0
  1567. package/utils/plugins/pluginIdentifier.ts +123 -0
  1568. package/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1569. package/utils/plugins/pluginLoader.ts +3302 -0
  1570. package/utils/plugins/pluginOptionsStorage.ts +400 -0
  1571. package/utils/plugins/pluginPolicy.ts +20 -0
  1572. package/utils/plugins/pluginStartupCheck.ts +341 -0
  1573. package/utils/plugins/pluginVersioning.ts +157 -0
  1574. package/utils/plugins/reconciler.ts +265 -0
  1575. package/utils/plugins/refresh.ts +215 -0
  1576. package/utils/plugins/schemas.ts +1681 -0
  1577. package/utils/plugins/validatePlugin.ts +903 -0
  1578. package/utils/plugins/walkPluginMarkdown.ts +69 -0
  1579. package/utils/plugins/zipCache.ts +406 -0
  1580. package/utils/plugins/zipCacheAdapters.ts +164 -0
  1581. package/utils/powershell/dangerousCmdlets.ts +185 -0
  1582. package/utils/powershell/parser.ts +1804 -0
  1583. package/utils/powershell/staticPrefix.ts +316 -0
  1584. package/utils/preflightChecks.tsx +151 -0
  1585. package/utils/privacyLevel.ts +55 -0
  1586. package/utils/process.ts +68 -0
  1587. package/utils/processUserInput/processBashCommand.tsx +140 -0
  1588. package/utils/processUserInput/processSlashCommand.tsx +922 -0
  1589. package/utils/processUserInput/processTextPrompt.ts +100 -0
  1590. package/utils/processUserInput/processUserInput.ts +605 -0
  1591. package/utils/profilerBase.ts +46 -0
  1592. package/utils/promptCategory.ts +49 -0
  1593. package/utils/promptEditor.ts +188 -0
  1594. package/utils/promptShellExecution.ts +183 -0
  1595. package/utils/proxy.ts +426 -0
  1596. package/utils/queryContext.ts +179 -0
  1597. package/utils/queryHelpers.ts +552 -0
  1598. package/utils/queryProfiler.ts +301 -0
  1599. package/utils/queueProcessor.ts +95 -0
  1600. package/utils/readEditContext.ts +227 -0
  1601. package/utils/readFileInRange.ts +383 -0
  1602. package/utils/releaseNotes.ts +360 -0
  1603. package/utils/renderOptions.ts +77 -0
  1604. package/utils/ripgrep.ts +679 -0
  1605. package/utils/sandbox/sandbox-adapter.ts +987 -0
  1606. package/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1607. package/utils/sanitization.ts +91 -0
  1608. package/utils/screenshotClipboard.ts +121 -0
  1609. package/utils/sdkEventQueue.ts +134 -0
  1610. package/utils/secureStorage/fallbackStorage.ts +70 -0
  1611. package/utils/secureStorage/index.ts +17 -0
  1612. package/utils/secureStorage/keychainPrefetch.ts +116 -0
  1613. package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1614. package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1615. package/utils/secureStorage/plainTextStorage.ts +84 -0
  1616. package/utils/semanticBoolean.ts +29 -0
  1617. package/utils/semanticNumber.ts +36 -0
  1618. package/utils/semver.ts +59 -0
  1619. package/utils/sequential.ts +56 -0
  1620. package/utils/sessionActivity.ts +133 -0
  1621. package/utils/sessionEnvVars.ts +22 -0
  1622. package/utils/sessionEnvironment.ts +166 -0
  1623. package/utils/sessionFileAccessHooks.ts +250 -0
  1624. package/utils/sessionIngressAuth.ts +140 -0
  1625. package/utils/sessionRestore.ts +551 -0
  1626. package/utils/sessionStart.ts +232 -0
  1627. package/utils/sessionState.ts +150 -0
  1628. package/utils/sessionStorage.ts +5105 -0
  1629. package/utils/sessionStoragePortable.ts +793 -0
  1630. package/utils/sessionTitle.ts +129 -0
  1631. package/utils/sessionUrl.ts +64 -0
  1632. package/utils/set.ts +53 -0
  1633. package/utils/settings/allErrors.ts +32 -0
  1634. package/utils/settings/applySettingsChange.ts +92 -0
  1635. package/utils/settings/changeDetector.ts +488 -0
  1636. package/utils/settings/constants.ts +202 -0
  1637. package/utils/settings/internalWrites.ts +37 -0
  1638. package/utils/settings/managedPath.ts +34 -0
  1639. package/utils/settings/mdm/constants.ts +81 -0
  1640. package/utils/settings/mdm/rawRead.ts +130 -0
  1641. package/utils/settings/mdm/settings.ts +316 -0
  1642. package/utils/settings/permissionValidation.ts +262 -0
  1643. package/utils/settings/pluginOnlyPolicy.ts +60 -0
  1644. package/utils/settings/schemaOutput.ts +8 -0
  1645. package/utils/settings/settings.ts +1015 -0
  1646. package/utils/settings/settingsCache.ts +80 -0
  1647. package/utils/settings/toolValidationConfig.ts +103 -0
  1648. package/utils/settings/types.ts +1148 -0
  1649. package/utils/settings/validateEditTool.ts +45 -0
  1650. package/utils/settings/validation.ts +265 -0
  1651. package/utils/settings/validationTips.ts +164 -0
  1652. package/utils/shell/bashProvider.ts +255 -0
  1653. package/utils/shell/outputLimits.ts +14 -0
  1654. package/utils/shell/powershellDetection.ts +107 -0
  1655. package/utils/shell/powershellProvider.ts +123 -0
  1656. package/utils/shell/prefix.ts +367 -0
  1657. package/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1658. package/utils/shell/resolveDefaultShell.ts +14 -0
  1659. package/utils/shell/shellProvider.ts +33 -0
  1660. package/utils/shell/shellToolUtils.ts +22 -0
  1661. package/utils/shell/specPrefix.ts +241 -0
  1662. package/utils/shellConfig.ts +167 -0
  1663. package/utils/sideQuery.ts +222 -0
  1664. package/utils/sideQuestion.ts +155 -0
  1665. package/utils/signal.ts +43 -0
  1666. package/utils/sinks.ts +16 -0
  1667. package/utils/skills/skillChangeDetector.ts +311 -0
  1668. package/utils/slashCommandParsing.ts +60 -0
  1669. package/utils/sleep.ts +84 -0
  1670. package/utils/sliceAnsi.ts +91 -0
  1671. package/utils/slowOperations.ts +286 -0
  1672. package/utils/standaloneAgent.ts +23 -0
  1673. package/utils/startupProfiler.ts +194 -0
  1674. package/utils/staticRender.tsx +116 -0
  1675. package/utils/stats.ts +1061 -0
  1676. package/utils/statsCache.ts +434 -0
  1677. package/utils/status.tsx +362 -0
  1678. package/utils/statusNoticeDefinitions.tsx +198 -0
  1679. package/utils/statusNoticeHelpers.ts +20 -0
  1680. package/utils/stream.ts +76 -0
  1681. package/utils/streamJsonStdoutGuard.ts +123 -0
  1682. package/utils/streamlinedTransform.ts +201 -0
  1683. package/utils/stringUtils.ts +235 -0
  1684. package/utils/subprocessEnv.ts +99 -0
  1685. package/utils/suggestions/commandSuggestions.ts +567 -0
  1686. package/utils/suggestions/directoryCompletion.ts +263 -0
  1687. package/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1688. package/utils/suggestions/skillUsageTracking.ts +55 -0
  1689. package/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1690. package/utils/swarm/It2SetupPrompt.tsx +380 -0
  1691. package/utils/swarm/backends/ITermBackend.ts +370 -0
  1692. package/utils/swarm/backends/InProcessBackend.ts +339 -0
  1693. package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1694. package/utils/swarm/backends/TmuxBackend.ts +764 -0
  1695. package/utils/swarm/backends/detection.ts +128 -0
  1696. package/utils/swarm/backends/it2Setup.ts +245 -0
  1697. package/utils/swarm/backends/registry.ts +464 -0
  1698. package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1699. package/utils/swarm/backends/types.ts +311 -0
  1700. package/utils/swarm/constants.ts +33 -0
  1701. package/utils/swarm/inProcessRunner.ts +1552 -0
  1702. package/utils/swarm/leaderPermissionBridge.ts +54 -0
  1703. package/utils/swarm/permissionSync.ts +928 -0
  1704. package/utils/swarm/reconnection.ts +119 -0
  1705. package/utils/swarm/spawnInProcess.ts +328 -0
  1706. package/utils/swarm/spawnUtils.ts +146 -0
  1707. package/utils/swarm/teamHelpers.ts +683 -0
  1708. package/utils/swarm/teammateInit.ts +129 -0
  1709. package/utils/swarm/teammateLayoutManager.ts +107 -0
  1710. package/utils/swarm/teammateModel.ts +10 -0
  1711. package/utils/swarm/teammatePromptAddendum.ts +18 -0
  1712. package/utils/systemDirectories.ts +74 -0
  1713. package/utils/systemPrompt.ts +123 -0
  1714. package/utils/systemPromptType.ts +14 -0
  1715. package/utils/systemTheme.ts +119 -0
  1716. package/utils/taggedId.ts +54 -0
  1717. package/utils/task/TaskOutput.ts +390 -0
  1718. package/utils/task/diskOutput.ts +451 -0
  1719. package/utils/task/framework.ts +308 -0
  1720. package/utils/task/outputFormatting.ts +38 -0
  1721. package/utils/task/sdkProgress.ts +36 -0
  1722. package/utils/tasks.ts +862 -0
  1723. package/utils/teamDiscovery.ts +81 -0
  1724. package/utils/teamMemoryOps.ts +88 -0
  1725. package/utils/teammate.ts +292 -0
  1726. package/utils/teammateContext.ts +96 -0
  1727. package/utils/teammateMailbox.ts +1183 -0
  1728. package/utils/telemetry/betaSessionTracing.ts +491 -0
  1729. package/utils/telemetry/bigqueryExporter.ts +252 -0
  1730. package/utils/telemetry/events.ts +75 -0
  1731. package/utils/telemetry/instrumentation.ts +825 -0
  1732. package/utils/telemetry/logger.ts +26 -0
  1733. package/utils/telemetry/perfettoTracing.ts +1120 -0
  1734. package/utils/telemetry/pluginTelemetry.ts +289 -0
  1735. package/utils/telemetry/sessionTracing.ts +927 -0
  1736. package/utils/telemetry/skillLoadedEvent.ts +39 -0
  1737. package/utils/telemetryAttributes.ts +71 -0
  1738. package/utils/teleport/api.ts +466 -0
  1739. package/utils/teleport/environmentSelection.ts +77 -0
  1740. package/utils/teleport/environments.ts +120 -0
  1741. package/utils/teleport/gitBundle.ts +292 -0
  1742. package/utils/teleport.tsx +1226 -0
  1743. package/utils/tempfile.ts +31 -0
  1744. package/utils/terminal.ts +131 -0
  1745. package/utils/terminalPanel.ts +191 -0
  1746. package/utils/textHighlighting.ts +166 -0
  1747. package/utils/theme.ts +639 -0
  1748. package/utils/thinking.ts +162 -0
  1749. package/utils/timeouts.ts +39 -0
  1750. package/utils/tmuxSocket.ts +427 -0
  1751. package/utils/todo/types.ts +18 -0
  1752. package/utils/tokenBudget.ts +73 -0
  1753. package/utils/tokens.ts +261 -0
  1754. package/utils/toolErrors.ts +132 -0
  1755. package/utils/toolPool.ts +79 -0
  1756. package/utils/toolResultStorage.ts +1040 -0
  1757. package/utils/toolSchemaCache.ts +26 -0
  1758. package/utils/toolSearch.ts +756 -0
  1759. package/utils/transcriptSearch.ts +202 -0
  1760. package/utils/treeify.ts +170 -0
  1761. package/utils/truncate.ts +179 -0
  1762. package/utils/ultraplan/ccrSession.ts +349 -0
  1763. package/utils/ultraplan/keyword.ts +127 -0
  1764. package/utils/unaryLogging.ts +39 -0
  1765. package/utils/undercover.ts +89 -0
  1766. package/utils/user.ts +194 -0
  1767. package/utils/userAgent.ts +10 -0
  1768. package/utils/userConfig.ts +181 -0
  1769. package/utils/userPromptKeywords.ts +27 -0
  1770. package/utils/uuid.ts +27 -0
  1771. package/utils/warningHandler.ts +121 -0
  1772. package/utils/which.ts +82 -0
  1773. package/utils/windowsPaths.ts +173 -0
  1774. package/utils/withResolvers.ts +13 -0
  1775. package/utils/words.ts +800 -0
  1776. package/utils/workloadContext.ts +57 -0
  1777. package/utils/worktree.ts +1519 -0
  1778. package/utils/worktreeModeEnabled.ts +11 -0
  1779. package/utils/xdg.ts +65 -0
  1780. package/utils/xml.ts +16 -0
  1781. package/utils/yaml.ts +15 -0
  1782. package/utils/zodToJsonSchema.ts +23 -0
@@ -0,0 +1,1115 @@
1
+ import { createHash, type UUID } from 'crypto'
2
+ import { diffLines } from 'diff'
3
+ import type { Stats } from 'fs'
4
+ import {
5
+ chmod,
6
+ copyFile,
7
+ link,
8
+ mkdir,
9
+ readFile,
10
+ stat,
11
+ unlink,
12
+ } from 'fs/promises'
13
+ import { dirname, isAbsolute, join, relative } from 'path'
14
+ import {
15
+ getIsNonInteractiveSession,
16
+ getOriginalCwd,
17
+ getSessionId,
18
+ } from 'src/bootstrap/state.js'
19
+ import { logEvent } from 'src/services/analytics/index.js'
20
+ import { notifyVscodeFileUpdated } from 'src/services/mcp/vscodeSdkMcp.js'
21
+ import type { LogOption } from 'src/types/logs.js'
22
+ import { inspect } from 'util'
23
+ import { getGlobalConfig } from './config.js'
24
+ import { logForDebugging } from './debug.js'
25
+ import { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'
26
+ import { getErrnoCode, isENOENT } from './errors.js'
27
+ import { pathExists } from './file.js'
28
+ import { logError } from './log.js'
29
+ import { recordFileHistorySnapshot } from './sessionStorage.js'
30
+
31
+ type BackupFileName = string | null // The null value means the file does not exist in this version
32
+
33
+ export type FileHistoryBackup = {
34
+ backupFileName: BackupFileName
35
+ version: number
36
+ backupTime: Date
37
+ }
38
+
39
+ export type FileHistorySnapshot = {
40
+ messageId: UUID // The associated message ID for this snapshot
41
+ trackedFileBackups: Record<string, FileHistoryBackup> // Map of file paths to backup versions
42
+ timestamp: Date
43
+ }
44
+
45
+ export type FileHistoryState = {
46
+ snapshots: FileHistorySnapshot[]
47
+ trackedFiles: Set<string>
48
+ // Monotonically-increasing counter incremented on every snapshot, even when
49
+ // old snapshots are evicted. Used by useGitDiffStats as an activity signal
50
+ // (snapshots.length plateaus once the cap is reached).
51
+ snapshotSequence: number
52
+ }
53
+
54
+ const MAX_SNAPSHOTS = 100
55
+ export type DiffStats =
56
+ | {
57
+ filesChanged?: string[]
58
+ insertions: number
59
+ deletions: number
60
+ }
61
+ | undefined
62
+
63
+ export function fileHistoryEnabled(): boolean {
64
+ if (getIsNonInteractiveSession()) {
65
+ return fileHistoryEnabledSdk()
66
+ }
67
+ return (
68
+ getGlobalConfig().fileCheckpointingEnabled !== false &&
69
+ !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING)
70
+ )
71
+ }
72
+
73
+ function fileHistoryEnabledSdk(): boolean {
74
+ return (
75
+ isEnvTruthy(process.env.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING) &&
76
+ !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING)
77
+ )
78
+ }
79
+
80
+ /**
81
+ * Tracks a file edit (and add) by creating a backup of its current contents (if necessary).
82
+ *
83
+ * This must be called before the file is actually added or edited, so we can save
84
+ * its contents before the edit.
85
+ */
86
+ export async function fileHistoryTrackEdit(
87
+ updateFileHistoryState: (
88
+ updater: (prev: FileHistoryState) => FileHistoryState,
89
+ ) => void,
90
+ filePath: string,
91
+ messageId: UUID,
92
+ ): Promise<void> {
93
+ if (!fileHistoryEnabled()) {
94
+ return
95
+ }
96
+
97
+ const trackingPath = maybeShortenFilePath(filePath)
98
+
99
+ // Phase 1: check if backup is needed. Speculative writes would overwrite
100
+ // the deterministic {hash}@v1 backup on every repeat call — a second
101
+ // trackEdit after an edit would corrupt v1 with post-edit content.
102
+ let captured: FileHistoryState | undefined
103
+ updateFileHistoryState(state => {
104
+ captured = state
105
+ return state
106
+ })
107
+ if (!captured) return
108
+ const mostRecent = captured.snapshots.at(-1)
109
+ if (!mostRecent) {
110
+ logError(new Error('FileHistory: Missing most recent snapshot'))
111
+ logEvent('tengu_file_history_track_edit_failed', {})
112
+ return
113
+ }
114
+ if (mostRecent.trackedFileBackups[trackingPath]) {
115
+ // Already tracked in the most recent snapshot; next makeSnapshot will
116
+ // re-check mtime and re-backup if changed. Do not touch v1 backup.
117
+ return
118
+ }
119
+
120
+ // Phase 2: async backup.
121
+ let backup: FileHistoryBackup
122
+ try {
123
+ backup = await createBackup(filePath, 1)
124
+ } catch (error) {
125
+ logError(error)
126
+ logEvent('tengu_file_history_track_edit_failed', {})
127
+ return
128
+ }
129
+ const isAddingFile = backup.backupFileName === null
130
+
131
+ // Phase 3: commit. Re-check tracked (another trackEdit may have raced).
132
+ updateFileHistoryState((state: FileHistoryState) => {
133
+ try {
134
+ const mostRecentSnapshot = state.snapshots.at(-1)
135
+ if (
136
+ !mostRecentSnapshot ||
137
+ mostRecentSnapshot.trackedFileBackups[trackingPath]
138
+ ) {
139
+ return state
140
+ }
141
+
142
+ // This file has not already been tracked in the most recent snapshot, so we
143
+ // need to retroactively track a backup there.
144
+ const updatedTrackedFiles = state.trackedFiles.has(trackingPath)
145
+ ? state.trackedFiles
146
+ : new Set(state.trackedFiles).add(trackingPath)
147
+
148
+ // Shallow-spread is sufficient: backup values are never mutated after
149
+ // insertion, so we only need fresh top-level + trackedFileBackups refs
150
+ // for React change detection. A deep clone would copy every existing
151
+ // backup's Date/string fields — O(n) cost to add one entry.
152
+ const updatedMostRecentSnapshot = {
153
+ ...mostRecentSnapshot,
154
+ trackedFileBackups: {
155
+ ...mostRecentSnapshot.trackedFileBackups,
156
+ [trackingPath]: backup,
157
+ },
158
+ }
159
+
160
+ const updatedState = {
161
+ ...state,
162
+ snapshots: (() => {
163
+ const copy = state.snapshots.slice()
164
+ copy[copy.length - 1] = updatedMostRecentSnapshot
165
+ return copy
166
+ })(),
167
+ trackedFiles: updatedTrackedFiles,
168
+ }
169
+ maybeDumpStateForDebug(updatedState)
170
+
171
+ // Record a snapshot update since it has changed.
172
+ void recordFileHistorySnapshot(
173
+ messageId,
174
+ updatedMostRecentSnapshot,
175
+ true, // isSnapshotUpdate
176
+ ).catch(error => {
177
+ logError(new Error(`FileHistory: Failed to record snapshot: ${error}`))
178
+ })
179
+
180
+ logEvent('tengu_file_history_track_edit_success', {
181
+ isNewFile: isAddingFile,
182
+ version: backup.version,
183
+ })
184
+ logForDebugging(`FileHistory: Tracked file modification for ${filePath}`)
185
+
186
+ return updatedState
187
+ } catch (error) {
188
+ logError(error)
189
+ logEvent('tengu_file_history_track_edit_failed', {})
190
+ return state
191
+ }
192
+ })
193
+ }
194
+
195
+ /**
196
+ * Adds a snapshot in the file history and backs up any modified tracked files.
197
+ */
198
+ export async function fileHistoryMakeSnapshot(
199
+ updateFileHistoryState: (
200
+ updater: (prev: FileHistoryState) => FileHistoryState,
201
+ ) => void,
202
+ messageId: UUID,
203
+ ): Promise<void> {
204
+ if (!fileHistoryEnabled()) {
205
+ return undefined
206
+ }
207
+
208
+ // Phase 1: capture current state with a no-op updater so we know which
209
+ // files to back up. Returning the same reference keeps this a true no-op
210
+ // for any wrapper that honors same-ref returns (src/CLAUDE.md wrapper
211
+ // rule). Wrappers that unconditionally spread will trigger one extra
212
+ // re-render; acceptable for a once-per-turn call.
213
+ let captured: FileHistoryState | undefined
214
+ updateFileHistoryState(state => {
215
+ captured = state
216
+ return state
217
+ })
218
+ if (!captured) return // updateFileHistoryState was a no-op stub (e.g. mcp.ts)
219
+
220
+ // Phase 2: do all IO async, outside the updater.
221
+ const trackedFileBackups: Record<string, FileHistoryBackup> = {}
222
+ const mostRecentSnapshot = captured.snapshots.at(-1)
223
+ if (mostRecentSnapshot) {
224
+ logForDebugging(`FileHistory: Making snapshot for message ${messageId}`)
225
+ await Promise.all(
226
+ Array.from(captured.trackedFiles, async trackingPath => {
227
+ try {
228
+ const filePath = maybeExpandFilePath(trackingPath)
229
+ const latestBackup =
230
+ mostRecentSnapshot.trackedFileBackups[trackingPath]
231
+ const nextVersion = latestBackup ? latestBackup.version + 1 : 1
232
+
233
+ // Stat the file once; ENOENT means the tracked file was deleted.
234
+ let fileStats: Stats | undefined
235
+ try {
236
+ fileStats = await stat(filePath)
237
+ } catch (e: unknown) {
238
+ if (!isENOENT(e)) throw e
239
+ }
240
+
241
+ if (!fileStats) {
242
+ trackedFileBackups[trackingPath] = {
243
+ backupFileName: null, // Use null to denote missing tracked file
244
+ version: nextVersion,
245
+ backupTime: new Date(),
246
+ }
247
+ logEvent('tengu_file_history_backup_deleted_file', {
248
+ version: nextVersion,
249
+ })
250
+ logForDebugging(
251
+ `FileHistory: Missing tracked file: ${trackingPath}`,
252
+ )
253
+ return
254
+ }
255
+
256
+ // File exists - check if it needs to be backed up
257
+ if (
258
+ latestBackup &&
259
+ latestBackup.backupFileName !== null &&
260
+ !(await checkOriginFileChanged(
261
+ filePath,
262
+ latestBackup.backupFileName,
263
+ fileStats,
264
+ ))
265
+ ) {
266
+ // File hasn't been modified since the latest version, reuse it
267
+ trackedFileBackups[trackingPath] = latestBackup
268
+ return
269
+ }
270
+
271
+ // File is newer than the latest backup, create a new backup
272
+ trackedFileBackups[trackingPath] = await createBackup(
273
+ filePath,
274
+ nextVersion,
275
+ )
276
+ } catch (error) {
277
+ logError(error)
278
+ logEvent('tengu_file_history_backup_file_failed', {})
279
+ }
280
+ }),
281
+ )
282
+ }
283
+
284
+ // Phase 3: commit the new snapshot to state. Read state.trackedFiles FRESH
285
+ // — if fileHistoryTrackEdit added a file during phase 2's async window, it
286
+ // wrote the backup to state.snapshots[-1].trackedFileBackups. Inherit those
287
+ // so the new snapshot covers every currently-tracked file.
288
+ updateFileHistoryState((state: FileHistoryState) => {
289
+ try {
290
+ const lastSnapshot = state.snapshots.at(-1)
291
+ if (lastSnapshot) {
292
+ for (const trackingPath of state.trackedFiles) {
293
+ if (trackingPath in trackedFileBackups) continue
294
+ const inherited = lastSnapshot.trackedFileBackups[trackingPath]
295
+ if (inherited) trackedFileBackups[trackingPath] = inherited
296
+ }
297
+ }
298
+ const now = new Date()
299
+ const newSnapshot: FileHistorySnapshot = {
300
+ messageId,
301
+ trackedFileBackups,
302
+ timestamp: now,
303
+ }
304
+
305
+ const allSnapshots = [...state.snapshots, newSnapshot]
306
+ const updatedState: FileHistoryState = {
307
+ ...state,
308
+ snapshots:
309
+ allSnapshots.length > MAX_SNAPSHOTS
310
+ ? allSnapshots.slice(-MAX_SNAPSHOTS)
311
+ : allSnapshots,
312
+ snapshotSequence: (state.snapshotSequence ?? 0) + 1,
313
+ }
314
+ maybeDumpStateForDebug(updatedState)
315
+
316
+ void notifyVscodeSnapshotFilesUpdated(state, updatedState).catch(logError)
317
+
318
+ // Record the file history snapshot to session storage for resume support
319
+ void recordFileHistorySnapshot(
320
+ messageId,
321
+ newSnapshot,
322
+ false, // isSnapshotUpdate
323
+ ).catch(error => {
324
+ logError(new Error(`FileHistory: Failed to record snapshot: ${error}`))
325
+ })
326
+
327
+ logForDebugging(
328
+ `FileHistory: Added snapshot for ${messageId}, tracking ${state.trackedFiles.size} files`,
329
+ )
330
+ logEvent('tengu_file_history_snapshot_success', {
331
+ trackedFilesCount: state.trackedFiles.size,
332
+ snapshotCount: updatedState.snapshots.length,
333
+ })
334
+
335
+ return updatedState
336
+ } catch (error) {
337
+ logError(error)
338
+ logEvent('tengu_file_history_snapshot_failed', {})
339
+ return state
340
+ }
341
+ })
342
+ }
343
+
344
+ /**
345
+ * Rewinds the file system to a previous snapshot.
346
+ */
347
+ export async function fileHistoryRewind(
348
+ updateFileHistoryState: (
349
+ updater: (prev: FileHistoryState) => FileHistoryState,
350
+ ) => void,
351
+ messageId: UUID,
352
+ ): Promise<void> {
353
+ if (!fileHistoryEnabled()) {
354
+ return
355
+ }
356
+
357
+ // Rewind is a pure filesystem side-effect and does not mutate
358
+ // FileHistoryState. Capture state with a no-op updater, then do IO async.
359
+ let captured: FileHistoryState | undefined
360
+ updateFileHistoryState(state => {
361
+ captured = state
362
+ return state
363
+ })
364
+ if (!captured) return
365
+
366
+ const targetSnapshot = captured.snapshots.findLast(
367
+ snapshot => snapshot.messageId === messageId,
368
+ )
369
+ if (!targetSnapshot) {
370
+ logError(new Error(`FileHistory: Snapshot for ${messageId} not found`))
371
+ logEvent('tengu_file_history_rewind_failed', {
372
+ trackedFilesCount: captured.trackedFiles.size,
373
+ snapshotFound: false,
374
+ })
375
+ throw new Error('The selected snapshot was not found')
376
+ }
377
+
378
+ try {
379
+ logForDebugging(
380
+ `FileHistory: [Rewind] Rewinding to snapshot for ${messageId}`,
381
+ )
382
+ const filesChanged = await applySnapshot(captured, targetSnapshot)
383
+
384
+ logForDebugging(`FileHistory: [Rewind] Finished rewinding to ${messageId}`)
385
+ logEvent('tengu_file_history_rewind_success', {
386
+ trackedFilesCount: captured.trackedFiles.size,
387
+ filesChangedCount: filesChanged.length,
388
+ })
389
+ } catch (error) {
390
+ logError(error)
391
+ logEvent('tengu_file_history_rewind_failed', {
392
+ trackedFilesCount: captured.trackedFiles.size,
393
+ snapshotFound: true,
394
+ })
395
+ throw error
396
+ }
397
+ }
398
+
399
+ export function fileHistoryCanRestore(
400
+ state: FileHistoryState,
401
+ messageId: UUID,
402
+ ): boolean {
403
+ if (!fileHistoryEnabled()) {
404
+ return false
405
+ }
406
+
407
+ return state.snapshots.some(snapshot => snapshot.messageId === messageId)
408
+ }
409
+
410
+ /**
411
+ * Computes diff stats for a file snapshot by counting the number of files that would be changed
412
+ * if reverting to that snapshot.
413
+ */
414
+ export async function fileHistoryGetDiffStats(
415
+ state: FileHistoryState,
416
+ messageId: UUID,
417
+ ): Promise<DiffStats> {
418
+ if (!fileHistoryEnabled()) {
419
+ return undefined
420
+ }
421
+
422
+ const targetSnapshot = state.snapshots.findLast(
423
+ snapshot => snapshot.messageId === messageId,
424
+ )
425
+
426
+ if (!targetSnapshot) {
427
+ return undefined
428
+ }
429
+
430
+ const results = await Promise.all(
431
+ Array.from(state.trackedFiles, async trackingPath => {
432
+ try {
433
+ const filePath = maybeExpandFilePath(trackingPath)
434
+ const targetBackup = targetSnapshot.trackedFileBackups[trackingPath]
435
+
436
+ const backupFileName: BackupFileName | undefined = targetBackup
437
+ ? targetBackup.backupFileName
438
+ : getBackupFileNameFirstVersion(trackingPath, state)
439
+
440
+ if (backupFileName === undefined) {
441
+ // Error resolving the backup, so don't touch the file
442
+ logError(
443
+ new Error('FileHistory: Error finding the backup file to apply'),
444
+ )
445
+ logEvent('tengu_file_history_rewind_restore_file_failed', {
446
+ dryRun: true,
447
+ })
448
+ return null
449
+ }
450
+
451
+ const stats = await computeDiffStatsForFile(
452
+ filePath,
453
+ backupFileName === null ? undefined : backupFileName,
454
+ )
455
+ if (stats?.insertions || stats?.deletions) {
456
+ return { filePath, stats }
457
+ }
458
+ if (backupFileName === null && (await pathExists(filePath))) {
459
+ // Zero-byte file created after snapshot: counts as changed even
460
+ // though diffLines reports 0/0.
461
+ return { filePath, stats }
462
+ }
463
+ return null
464
+ } catch (error) {
465
+ logError(error)
466
+ logEvent('tengu_file_history_rewind_restore_file_failed', {
467
+ dryRun: true,
468
+ })
469
+ return null
470
+ }
471
+ }),
472
+ )
473
+
474
+ const filesChanged: string[] = []
475
+ let insertions = 0
476
+ let deletions = 0
477
+ for (const r of results) {
478
+ if (!r) continue
479
+ filesChanged.push(r.filePath)
480
+ insertions += r.stats?.insertions || 0
481
+ deletions += r.stats?.deletions || 0
482
+ }
483
+ return { filesChanged, insertions, deletions }
484
+ }
485
+
486
+ /**
487
+ * Lightweight boolean-only check: would rewinding to this message change any
488
+ * file on disk? Uses the same stat/content comparison as the non-dry-run path
489
+ * of applySnapshot (checkOriginFileChanged) instead of computeDiffStatsForFile,
490
+ * so it never calls diffLines. Early-exits on the first changed file. Use when
491
+ * the caller only needs a yes/no answer; fileHistoryGetDiffStats remains for
492
+ * callers that display insertions/deletions.
493
+ */
494
+ export async function fileHistoryHasAnyChanges(
495
+ state: FileHistoryState,
496
+ messageId: UUID,
497
+ ): Promise<boolean> {
498
+ if (!fileHistoryEnabled()) {
499
+ return false
500
+ }
501
+
502
+ const targetSnapshot = state.snapshots.findLast(
503
+ snapshot => snapshot.messageId === messageId,
504
+ )
505
+ if (!targetSnapshot) {
506
+ return false
507
+ }
508
+
509
+ for (const trackingPath of state.trackedFiles) {
510
+ try {
511
+ const filePath = maybeExpandFilePath(trackingPath)
512
+ const targetBackup = targetSnapshot.trackedFileBackups[trackingPath]
513
+ const backupFileName: BackupFileName | undefined = targetBackup
514
+ ? targetBackup.backupFileName
515
+ : getBackupFileNameFirstVersion(trackingPath, state)
516
+
517
+ if (backupFileName === undefined) {
518
+ continue
519
+ }
520
+ if (backupFileName === null) {
521
+ // Backup says file did not exist; probe via stat (operate-then-catch).
522
+ if (await pathExists(filePath)) return true
523
+ continue
524
+ }
525
+ if (await checkOriginFileChanged(filePath, backupFileName)) return true
526
+ } catch (error) {
527
+ logError(error)
528
+ }
529
+ }
530
+ return false
531
+ }
532
+
533
+ /**
534
+ * Applies the given file snapshot state to the tracked files (writes/deletes
535
+ * on disk), returning the list of changed file paths. Async IO only.
536
+ */
537
+ async function applySnapshot(
538
+ state: FileHistoryState,
539
+ targetSnapshot: FileHistorySnapshot,
540
+ ): Promise<string[]> {
541
+ const filesChanged: string[] = []
542
+ for (const trackingPath of state.trackedFiles) {
543
+ try {
544
+ const filePath = maybeExpandFilePath(trackingPath)
545
+ const targetBackup = targetSnapshot.trackedFileBackups[trackingPath]
546
+
547
+ const backupFileName: BackupFileName | undefined = targetBackup
548
+ ? targetBackup.backupFileName
549
+ : getBackupFileNameFirstVersion(trackingPath, state)
550
+
551
+ if (backupFileName === undefined) {
552
+ // Error resolving the backup, so don't touch the file
553
+ logError(
554
+ new Error('FileHistory: Error finding the backup file to apply'),
555
+ )
556
+ logEvent('tengu_file_history_rewind_restore_file_failed', {
557
+ dryRun: false,
558
+ })
559
+ continue
560
+ }
561
+
562
+ if (backupFileName === null) {
563
+ // File did not exist at the target version; delete it if present.
564
+ try {
565
+ await unlink(filePath)
566
+ logForDebugging(`FileHistory: [Rewind] Deleted ${filePath}`)
567
+ filesChanged.push(filePath)
568
+ } catch (e: unknown) {
569
+ if (!isENOENT(e)) throw e
570
+ // Already absent; nothing to do.
571
+ }
572
+ continue
573
+ }
574
+
575
+ // File should exist at a specific version. Restore only if it differs.
576
+ if (await checkOriginFileChanged(filePath, backupFileName)) {
577
+ await restoreBackup(filePath, backupFileName)
578
+ logForDebugging(
579
+ `FileHistory: [Rewind] Restored ${filePath} from ${backupFileName}`,
580
+ )
581
+ filesChanged.push(filePath)
582
+ }
583
+ } catch (error) {
584
+ logError(error)
585
+ logEvent('tengu_file_history_rewind_restore_file_failed', {
586
+ dryRun: false,
587
+ })
588
+ }
589
+ }
590
+ return filesChanged
591
+ }
592
+
593
+ /**
594
+ * Checks if the original file has been changed compared to the backup file.
595
+ * Optionally reuses a pre-fetched stat for the original file (when the caller
596
+ * already stat'd it to check existence, we avoid a second syscall).
597
+ *
598
+ * Exported for testing.
599
+ */
600
+ export async function checkOriginFileChanged(
601
+ originalFile: string,
602
+ backupFileName: string,
603
+ originalStatsHint?: Stats,
604
+ ): Promise<boolean> {
605
+ const backupPath = resolveBackupPath(backupFileName)
606
+
607
+ let originalStats: Stats | null = originalStatsHint ?? null
608
+ if (!originalStats) {
609
+ try {
610
+ originalStats = await stat(originalFile)
611
+ } catch (e: unknown) {
612
+ if (!isENOENT(e)) return true
613
+ }
614
+ }
615
+ let backupStats: Stats | null = null
616
+ try {
617
+ backupStats = await stat(backupPath)
618
+ } catch (e: unknown) {
619
+ if (!isENOENT(e)) return true
620
+ }
621
+
622
+ return compareStatsAndContent(originalStats, backupStats, async () => {
623
+ try {
624
+ const [originalContent, backupContent] = await Promise.all([
625
+ readFile(originalFile, 'utf-8'),
626
+ readFile(backupPath, 'utf-8'),
627
+ ])
628
+ return originalContent !== backupContent
629
+ } catch {
630
+ // File deleted between stat and read -> treat as changed.
631
+ return true
632
+ }
633
+ })
634
+ }
635
+
636
+ /**
637
+ * Shared stat/content comparison logic for sync and async change checks.
638
+ * Returns true if the file has changed relative to the backup.
639
+ */
640
+ function compareStatsAndContent<T extends boolean | Promise<boolean>>(
641
+ originalStats: Stats | null,
642
+ backupStats: Stats | null,
643
+ compareContent: () => T,
644
+ ): T | boolean {
645
+ // One exists, one missing -> changed
646
+ if ((originalStats === null) !== (backupStats === null)) {
647
+ return true
648
+ }
649
+ // Both missing -> no change
650
+ if (originalStats === null || backupStats === null) {
651
+ return false
652
+ }
653
+
654
+ // Check file stats like permission and file size
655
+ if (
656
+ originalStats.mode !== backupStats.mode ||
657
+ originalStats.size !== backupStats.size
658
+ ) {
659
+ return true
660
+ }
661
+
662
+ // This is an optimization that depends on the correct setting of the modified
663
+ // time. If the original file's modified time was before the backup time, then
664
+ // we can skip the file content comparison.
665
+ if (originalStats.mtimeMs < backupStats.mtimeMs) {
666
+ return false
667
+ }
668
+
669
+ // Use the more expensive file content comparison. The callback handles its
670
+ // own read errors — a try/catch here is dead for async callbacks anyway.
671
+ return compareContent()
672
+ }
673
+
674
+ /**
675
+ * Computes the number of lines changed in the diff.
676
+ */
677
+ async function computeDiffStatsForFile(
678
+ originalFile: string,
679
+ backupFileName?: string,
680
+ ): Promise<DiffStats> {
681
+ const filesChanged: string[] = []
682
+ let insertions = 0
683
+ let deletions = 0
684
+ try {
685
+ const backupPath = backupFileName
686
+ ? resolveBackupPath(backupFileName)
687
+ : undefined
688
+
689
+ const [originalContent, backupContent] = await Promise.all([
690
+ readFileAsyncOrNull(originalFile),
691
+ backupPath ? readFileAsyncOrNull(backupPath) : null,
692
+ ])
693
+
694
+ if (originalContent === null && backupContent === null) {
695
+ return {
696
+ filesChanged,
697
+ insertions,
698
+ deletions,
699
+ }
700
+ }
701
+
702
+ filesChanged.push(originalFile)
703
+
704
+ // Compute the diff
705
+ const changes = diffLines(originalContent ?? '', backupContent ?? '')
706
+ changes.forEach(c => {
707
+ if (c.added) {
708
+ insertions += c.count || 0
709
+ }
710
+ if (c.removed) {
711
+ deletions += c.count || 0
712
+ }
713
+ })
714
+ } catch (error) {
715
+ logError(new Error(`FileHistory: Error generating diffStats: ${error}`))
716
+ }
717
+
718
+ return {
719
+ filesChanged,
720
+ insertions,
721
+ deletions,
722
+ }
723
+ }
724
+
725
+ function getBackupFileName(filePath: string, version: number): string {
726
+ const fileNameHash = createHash('sha256')
727
+ .update(filePath)
728
+ .digest('hex')
729
+ .slice(0, 16)
730
+ return `${fileNameHash}@v${version}`
731
+ }
732
+
733
+ function resolveBackupPath(backupFileName: string, sessionId?: string): string {
734
+ const configDir = getClaudeConfigHomeDir()
735
+ return join(
736
+ configDir,
737
+ 'file-history',
738
+ sessionId || getSessionId(),
739
+ backupFileName,
740
+ )
741
+ }
742
+
743
+ /**
744
+ * Creates a backup of the file at filePath. If the file does not exist
745
+ * (ENOENT), records a null backup (file-did-not-exist marker). All IO is
746
+ * async. Lazy mkdir: tries copyFile first, creates the directory on ENOENT.
747
+ */
748
+ async function createBackup(
749
+ filePath: string | null,
750
+ version: number,
751
+ ): Promise<FileHistoryBackup> {
752
+ if (filePath === null) {
753
+ return { backupFileName: null, version, backupTime: new Date() }
754
+ }
755
+
756
+ const backupFileName = getBackupFileName(filePath, version)
757
+ const backupPath = resolveBackupPath(backupFileName)
758
+
759
+ // Stat first: if the source is missing, record a null backup and skip the
760
+ // copy. Separates "source missing" from "backup dir missing" cleanly —
761
+ // sharing a catch for both meant a file deleted between copyFile-success
762
+ // and stat would leave an orphaned backup with a null state record.
763
+ let srcStats: Stats
764
+ try {
765
+ srcStats = await stat(filePath)
766
+ } catch (e: unknown) {
767
+ if (isENOENT(e)) {
768
+ return { backupFileName: null, version, backupTime: new Date() }
769
+ }
770
+ throw e
771
+ }
772
+
773
+ // copyFile preserves content and avoids reading the whole file into the JS
774
+ // heap (which the previous readFileSync+writeFileSync pipeline did, OOMing
775
+ // on large tracked files). Lazy mkdir: 99% of calls hit the fast path
776
+ // (directory already exists); on ENOENT, mkdir then retry.
777
+ try {
778
+ await copyFile(filePath, backupPath)
779
+ } catch (e: unknown) {
780
+ if (!isENOENT(e)) throw e
781
+ await mkdir(dirname(backupPath), { recursive: true })
782
+ await copyFile(filePath, backupPath)
783
+ }
784
+
785
+ // Preserve file permissions on the backup.
786
+ await chmod(backupPath, srcStats.mode)
787
+
788
+ logEvent('tengu_file_history_backup_file_created', {
789
+ version: version,
790
+ fileSize: srcStats.size,
791
+ })
792
+
793
+ return {
794
+ backupFileName,
795
+ version,
796
+ backupTime: new Date(),
797
+ }
798
+ }
799
+
800
+ /**
801
+ * Restores a file from its backup path with proper directory creation and permissions.
802
+ * Lazy mkdir: tries copyFile first, creates the directory on ENOENT.
803
+ */
804
+ async function restoreBackup(
805
+ filePath: string,
806
+ backupFileName: string,
807
+ ): Promise<void> {
808
+ const backupPath = resolveBackupPath(backupFileName)
809
+
810
+ // Stat first: if the backup is missing, log and bail before attempting
811
+ // the copy. Separates "backup missing" from "destination dir missing".
812
+ let backupStats: Stats
813
+ try {
814
+ backupStats = await stat(backupPath)
815
+ } catch (e: unknown) {
816
+ if (isENOENT(e)) {
817
+ logEvent('tengu_file_history_rewind_restore_file_failed', {})
818
+ logError(
819
+ new Error(`FileHistory: [Rewind] Backup file not found: ${backupPath}`),
820
+ )
821
+ return
822
+ }
823
+ throw e
824
+ }
825
+
826
+ // Lazy mkdir: 99% of calls hit the fast path (destination dir exists).
827
+ try {
828
+ await copyFile(backupPath, filePath)
829
+ } catch (e: unknown) {
830
+ if (!isENOENT(e)) throw e
831
+ await mkdir(dirname(filePath), { recursive: true })
832
+ await copyFile(backupPath, filePath)
833
+ }
834
+
835
+ // Restore the file permissions
836
+ await chmod(filePath, backupStats.mode)
837
+ }
838
+
839
+ /**
840
+ * Gets the first (earliest) backup version for a file, used when rewinding
841
+ * to a target backup point where the file has not been tracked yet.
842
+ *
843
+ * @returns The backup file name for the first version, or null if the file
844
+ * did not exist in the first version, or undefined if we cannot find a
845
+ * first version at all
846
+ */
847
+ function getBackupFileNameFirstVersion(
848
+ trackingPath: string,
849
+ state: FileHistoryState,
850
+ ): BackupFileName | undefined {
851
+ for (const snapshot of state.snapshots) {
852
+ const backup = snapshot.trackedFileBackups[trackingPath]
853
+ if (backup !== undefined && backup.version === 1) {
854
+ // This can be either a file name or null, with null meaning the file
855
+ // did not exist in the first version.
856
+ return backup.backupFileName
857
+ }
858
+ }
859
+
860
+ // The undefined means there was an error resolving the first version.
861
+ return undefined
862
+ }
863
+
864
+ /**
865
+ * Use the relative path as the key to reduce session storage space for tracking.
866
+ */
867
+ function maybeShortenFilePath(filePath: string): string {
868
+ if (!isAbsolute(filePath)) {
869
+ return filePath
870
+ }
871
+ const cwd = getOriginalCwd()
872
+ if (filePath.startsWith(cwd)) {
873
+ return relative(cwd, filePath)
874
+ }
875
+ return filePath
876
+ }
877
+
878
+ function maybeExpandFilePath(filePath: string): string {
879
+ if (isAbsolute(filePath)) {
880
+ return filePath
881
+ }
882
+ return join(getOriginalCwd(), filePath)
883
+ }
884
+
885
+ /**
886
+ * Restores file history snapshot state for a given log option.
887
+ */
888
+ export function fileHistoryRestoreStateFromLog(
889
+ fileHistorySnapshots: FileHistorySnapshot[],
890
+ onUpdateState: (newState: FileHistoryState) => void,
891
+ ): void {
892
+ if (!fileHistoryEnabled()) {
893
+ return
894
+ }
895
+ // Make a copy of the snapshots as we migrate from absolute path to
896
+ // shortened relative tracking path.
897
+ const snapshots: FileHistorySnapshot[] = []
898
+ // Rebuild the tracked files from the snapshots
899
+ const trackedFiles = new Set<string>()
900
+ for (const snapshot of fileHistorySnapshots) {
901
+ const trackedFileBackups: Record<string, FileHistoryBackup> = {}
902
+ for (const [path, backup] of Object.entries(snapshot.trackedFileBackups)) {
903
+ const trackingPath = maybeShortenFilePath(path)
904
+ trackedFiles.add(trackingPath)
905
+ trackedFileBackups[trackingPath] = backup
906
+ }
907
+ snapshots.push({
908
+ ...snapshot,
909
+ trackedFileBackups: trackedFileBackups,
910
+ })
911
+ }
912
+ onUpdateState({
913
+ snapshots: snapshots,
914
+ trackedFiles: trackedFiles,
915
+ snapshotSequence: snapshots.length,
916
+ })
917
+ }
918
+
919
+ /**
920
+ * Copy file history snapshots for a given log option.
921
+ */
922
+ export async function copyFileHistoryForResume(log: LogOption): Promise<void> {
923
+ if (!fileHistoryEnabled()) {
924
+ return
925
+ }
926
+
927
+ const fileHistorySnapshots = log.fileHistorySnapshots
928
+ if (!fileHistorySnapshots || log.messages.length === 0) {
929
+ return
930
+ }
931
+ const lastMessage = log.messages[log.messages.length - 1]
932
+ const previousSessionId = lastMessage?.sessionId
933
+ if (!previousSessionId) {
934
+ logError(
935
+ new Error(
936
+ `FileHistory: Failed to copy backups on restore (no previous session id)`,
937
+ ),
938
+ )
939
+ return
940
+ }
941
+
942
+ const sessionId = getSessionId()
943
+ if (previousSessionId === sessionId) {
944
+ logForDebugging(
945
+ `FileHistory: No need to copy file history for resuming with same session id: ${sessionId}`,
946
+ )
947
+ return
948
+ }
949
+
950
+ try {
951
+ // All backups share the same directory: {configDir}/file-history/{sessionId}/
952
+ // Create it once upfront instead of once per backup file
953
+ const newBackupDir = join(
954
+ getClaudeConfigHomeDir(),
955
+ 'file-history',
956
+ sessionId,
957
+ )
958
+ await mkdir(newBackupDir, { recursive: true })
959
+
960
+ // Migrate all backup files from the previous session to current session.
961
+ // Process all snapshots in parallel; within each snapshot, links also run in parallel.
962
+ let failedSnapshots = 0
963
+ await Promise.allSettled(
964
+ fileHistorySnapshots.map(async snapshot => {
965
+ const backupEntries = Object.values(snapshot.trackedFileBackups).filter(
966
+ (backup): backup is typeof backup & { backupFileName: string } =>
967
+ backup.backupFileName !== null,
968
+ )
969
+
970
+ const results = await Promise.allSettled(
971
+ backupEntries.map(async ({ backupFileName }) => {
972
+ const oldBackupPath = resolveBackupPath(
973
+ backupFileName,
974
+ previousSessionId,
975
+ )
976
+ const newBackupPath = join(newBackupDir, backupFileName)
977
+
978
+ try {
979
+ await link(oldBackupPath, newBackupPath)
980
+ } catch (e: unknown) {
981
+ const code = getErrnoCode(e)
982
+ if (code === 'EEXIST') {
983
+ // Already migrated, skip
984
+ return
985
+ }
986
+ if (code === 'ENOENT') {
987
+ logError(
988
+ new Error(
989
+ `FileHistory: Failed to copy backup ${backupFileName} on restore (backup file does not exist in ${previousSessionId})`,
990
+ ),
991
+ )
992
+ throw e
993
+ }
994
+ logError(
995
+ new Error(
996
+ `FileHistory: Error hard linking backup file from previous session`,
997
+ ),
998
+ )
999
+ // Fallback to copy if hard link fails
1000
+ try {
1001
+ await copyFile(oldBackupPath, newBackupPath)
1002
+ } catch (copyErr) {
1003
+ logError(
1004
+ new Error(
1005
+ `FileHistory: Error copying over backup from previous session`,
1006
+ ),
1007
+ )
1008
+ throw copyErr
1009
+ }
1010
+ }
1011
+
1012
+ logForDebugging(
1013
+ `FileHistory: Copied backup ${backupFileName} from session ${previousSessionId} to ${sessionId}`,
1014
+ )
1015
+ }),
1016
+ )
1017
+
1018
+ const copyFailed = results.some(r => r.status === 'rejected')
1019
+
1020
+ // Record the snapshot only if we have successfully migrated the backup files
1021
+ if (!copyFailed) {
1022
+ void recordFileHistorySnapshot(
1023
+ snapshot.messageId,
1024
+ snapshot,
1025
+ false, // isSnapshotUpdate
1026
+ ).catch(_ => {
1027
+ logError(
1028
+ new Error(`FileHistory: Failed to record copy backup snapshot`),
1029
+ )
1030
+ })
1031
+ } else {
1032
+ failedSnapshots++
1033
+ }
1034
+ }),
1035
+ )
1036
+
1037
+ if (failedSnapshots > 0) {
1038
+ logEvent('tengu_file_history_resume_copy_failed', {
1039
+ numSnapshots: fileHistorySnapshots.length,
1040
+ failedSnapshots,
1041
+ })
1042
+ }
1043
+ } catch (error) {
1044
+ logError(error)
1045
+ }
1046
+ }
1047
+
1048
+ /**
1049
+ * Notifies VSCode about files that have changed between snapshots.
1050
+ * Compares the previous snapshot with the new snapshot and sends file_updated
1051
+ * notifications for any files whose content has changed.
1052
+ * Fire-and-forget (void-dispatched from fileHistoryMakeSnapshot).
1053
+ */
1054
+ async function notifyVscodeSnapshotFilesUpdated(
1055
+ oldState: FileHistoryState,
1056
+ newState: FileHistoryState,
1057
+ ): Promise<void> {
1058
+ const oldSnapshot = oldState.snapshots.at(-1)
1059
+ const newSnapshot = newState.snapshots.at(-1)
1060
+
1061
+ if (!newSnapshot) {
1062
+ return
1063
+ }
1064
+
1065
+ for (const trackingPath of newState.trackedFiles) {
1066
+ const filePath = maybeExpandFilePath(trackingPath)
1067
+ const oldBackup = oldSnapshot?.trackedFileBackups[trackingPath]
1068
+ const newBackup = newSnapshot.trackedFileBackups[trackingPath]
1069
+
1070
+ // Skip if both backups reference the same version (no change)
1071
+ if (
1072
+ oldBackup?.backupFileName === newBackup?.backupFileName &&
1073
+ oldBackup?.version === newBackup?.version
1074
+ ) {
1075
+ continue
1076
+ }
1077
+
1078
+ // Get old content from the previous backup
1079
+ let oldContent: string | null = null
1080
+ if (oldBackup?.backupFileName) {
1081
+ const backupPath = resolveBackupPath(oldBackup.backupFileName)
1082
+ oldContent = await readFileAsyncOrNull(backupPath)
1083
+ }
1084
+
1085
+ // Get new content from the new backup or current file
1086
+ let newContent: string | null = null
1087
+ if (newBackup?.backupFileName) {
1088
+ const backupPath = resolveBackupPath(newBackup.backupFileName)
1089
+ newContent = await readFileAsyncOrNull(backupPath)
1090
+ }
1091
+ // If newBackup?.backupFileName === null, the file was deleted; newContent stays null.
1092
+
1093
+ // Only notify if content actually changed
1094
+ if (oldContent !== newContent) {
1095
+ notifyVscodeFileUpdated(filePath, oldContent, newContent)
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ /** Async read that swallows all errors and returns null (best-effort). */
1101
+ async function readFileAsyncOrNull(path: string): Promise<string | null> {
1102
+ try {
1103
+ return await readFile(path, 'utf-8')
1104
+ } catch {
1105
+ return null
1106
+ }
1107
+ }
1108
+
1109
+ const ENABLE_DUMP_STATE = false
1110
+ function maybeDumpStateForDebug(state: FileHistoryState): void {
1111
+ if (ENABLE_DUMP_STATE) {
1112
+ // biome-ignore lint/suspicious/noConsole:: intentional console output
1113
+ console.error(inspect(state, false, 5))
1114
+ }
1115
+ }