ashishcode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1936) hide show
  1. package/README.md +189 -0
  2. package/bun.lock +895 -0
  3. package/package.json +109 -0
  4. package/public/claude-files.png +0 -0
  5. package/public/leak-tweet.png +0 -0
  6. package/scripts/ashishcode.mjs +41 -0
  7. package/scripts/claude-local.mjs +41 -0
  8. package/src/QueryEngine.ts +1295 -0
  9. package/src/Task.ts +125 -0
  10. package/src/Tool.ts +792 -0
  11. package/src/assistant/sessionHistory.ts +87 -0
  12. package/src/bootstrap/state.ts +1758 -0
  13. package/src/bridge/bridgeApi.ts +539 -0
  14. package/src/bridge/bridgeConfig.ts +48 -0
  15. package/src/bridge/bridgeDebug.ts +135 -0
  16. package/src/bridge/bridgeEnabled.ts +203 -0
  17. package/src/bridge/bridgeMain.ts +3000 -0
  18. package/src/bridge/bridgeMessaging.ts +461 -0
  19. package/src/bridge/bridgePermissionCallbacks.ts +43 -0
  20. package/src/bridge/bridgePointer.ts +210 -0
  21. package/src/bridge/bridgeStatusUtil.ts +163 -0
  22. package/src/bridge/bridgeUI.ts +531 -0
  23. package/src/bridge/capacityWake.ts +56 -0
  24. package/src/bridge/codeSessionApi.ts +168 -0
  25. package/src/bridge/createSession.ts +384 -0
  26. package/src/bridge/debugUtils.ts +141 -0
  27. package/src/bridge/envLessBridgeConfig.ts +166 -0
  28. package/src/bridge/flushGate.ts +71 -0
  29. package/src/bridge/inboundAttachments.ts +175 -0
  30. package/src/bridge/inboundMessages.ts +80 -0
  31. package/src/bridge/initReplBridge.ts +569 -0
  32. package/src/bridge/jwtUtils.ts +256 -0
  33. package/src/bridge/pollConfig.ts +110 -0
  34. package/src/bridge/pollConfigDefaults.ts +82 -0
  35. package/src/bridge/remoteBridgeCore.ts +1008 -0
  36. package/src/bridge/replBridge.ts +2407 -0
  37. package/src/bridge/replBridgeHandle.ts +36 -0
  38. package/src/bridge/replBridgeTransport.ts +370 -0
  39. package/src/bridge/sessionIdCompat.ts +57 -0
  40. package/src/bridge/sessionRunner.ts +550 -0
  41. package/src/bridge/trustedDevice.ts +210 -0
  42. package/src/bridge/types.ts +262 -0
  43. package/src/bridge/workSecret.ts +127 -0
  44. package/src/buddy/CompanionSprite.tsx +371 -0
  45. package/src/buddy/companion.ts +133 -0
  46. package/src/buddy/prompt.ts +36 -0
  47. package/src/buddy/sprites.ts +514 -0
  48. package/src/buddy/types.ts +148 -0
  49. package/src/buddy/useBuddyNotification.tsx +98 -0
  50. package/src/cli/exit.ts +31 -0
  51. package/src/cli/handlers/agents.ts +70 -0
  52. package/src/cli/handlers/auth.ts +482 -0
  53. package/src/cli/handlers/autoMode.ts +170 -0
  54. package/src/cli/handlers/mcp.tsx +362 -0
  55. package/src/cli/handlers/plugins.ts +878 -0
  56. package/src/cli/handlers/util.tsx +110 -0
  57. package/src/cli/ndjsonSafeStringify.ts +32 -0
  58. package/src/cli/print.ts +5594 -0
  59. package/src/cli/remoteIO.ts +255 -0
  60. package/src/cli/structuredIO.ts +859 -0
  61. package/src/cli/transports/HybridTransport.ts +282 -0
  62. package/src/cli/transports/SSETransport.ts +711 -0
  63. package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
  64. package/src/cli/transports/WebSocketTransport.ts +800 -0
  65. package/src/cli/transports/WorkerStateUploader.ts +131 -0
  66. package/src/cli/transports/ccrClient.ts +998 -0
  67. package/src/cli/transports/transportUtils.ts +45 -0
  68. package/src/cli/update.ts +423 -0
  69. package/src/commands/add-dir/add-dir.tsx +126 -0
  70. package/src/commands/add-dir/index.ts +11 -0
  71. package/src/commands/add-dir/validation.ts +110 -0
  72. package/src/commands/advisor.ts +109 -0
  73. package/src/commands/agents/agents.tsx +12 -0
  74. package/src/commands/agents/index.ts +10 -0
  75. package/src/commands/ant-trace/index.js +1 -0
  76. package/src/commands/autofix-pr/index.js +1 -0
  77. package/src/commands/backfill-sessions/index.js +1 -0
  78. package/src/commands/branch/branch.ts +296 -0
  79. package/src/commands/branch/index.ts +14 -0
  80. package/src/commands/break-cache/index.js +1 -0
  81. package/src/commands/bridge/bridge.tsx +509 -0
  82. package/src/commands/bridge/index.ts +26 -0
  83. package/src/commands/bridge-kick.ts +200 -0
  84. package/src/commands/brief.ts +130 -0
  85. package/src/commands/btw/btw.tsx +243 -0
  86. package/src/commands/btw/index.ts +13 -0
  87. package/src/commands/bughunter/index.js +1 -0
  88. package/src/commands/chrome/chrome.tsx +285 -0
  89. package/src/commands/chrome/index.ts +13 -0
  90. package/src/commands/clear/caches.ts +144 -0
  91. package/src/commands/clear/clear.ts +7 -0
  92. package/src/commands/clear/conversation.ts +251 -0
  93. package/src/commands/clear/index.ts +19 -0
  94. package/src/commands/color/color.ts +93 -0
  95. package/src/commands/color/index.ts +16 -0
  96. package/src/commands/commit-push-pr.ts +158 -0
  97. package/src/commands/commit.ts +92 -0
  98. package/src/commands/compact/compact.ts +287 -0
  99. package/src/commands/compact/index.ts +15 -0
  100. package/src/commands/config/config.tsx +7 -0
  101. package/src/commands/config/index.ts +11 -0
  102. package/src/commands/context/context-noninteractive.ts +325 -0
  103. package/src/commands/context/context.tsx +64 -0
  104. package/src/commands/context/index.ts +24 -0
  105. package/src/commands/copy/copy.tsx +371 -0
  106. package/src/commands/copy/index.ts +15 -0
  107. package/src/commands/cost/cost.ts +24 -0
  108. package/src/commands/cost/index.ts +23 -0
  109. package/src/commands/createMovedToPluginCommand.ts +65 -0
  110. package/src/commands/ctx_viz/index.js +1 -0
  111. package/src/commands/debug-tool-call/index.js +1 -0
  112. package/src/commands/desktop/desktop.tsx +9 -0
  113. package/src/commands/desktop/index.ts +26 -0
  114. package/src/commands/diff/diff.tsx +9 -0
  115. package/src/commands/diff/index.ts +8 -0
  116. package/src/commands/doctor/doctor.tsx +7 -0
  117. package/src/commands/doctor/index.ts +12 -0
  118. package/src/commands/effort/effort.tsx +183 -0
  119. package/src/commands/effort/index.ts +13 -0
  120. package/src/commands/env/index.js +1 -0
  121. package/src/commands/exit/exit.tsx +33 -0
  122. package/src/commands/exit/index.ts +12 -0
  123. package/src/commands/export/export.tsx +91 -0
  124. package/src/commands/export/index.ts +11 -0
  125. package/src/commands/extra-usage/extra-usage-core.ts +118 -0
  126. package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  127. package/src/commands/extra-usage/extra-usage.tsx +17 -0
  128. package/src/commands/extra-usage/index.ts +31 -0
  129. package/src/commands/fast/fast.tsx +269 -0
  130. package/src/commands/fast/index.ts +26 -0
  131. package/src/commands/feedback/feedback.tsx +25 -0
  132. package/src/commands/feedback/index.ts +28 -0
  133. package/src/commands/files/files.ts +19 -0
  134. package/src/commands/files/index.ts +12 -0
  135. package/src/commands/good-claude/index.js +1 -0
  136. package/src/commands/heapdump/heapdump.ts +17 -0
  137. package/src/commands/heapdump/index.ts +12 -0
  138. package/src/commands/help/help.tsx +11 -0
  139. package/src/commands/help/index.ts +10 -0
  140. package/src/commands/hooks/hooks.tsx +13 -0
  141. package/src/commands/hooks/index.ts +11 -0
  142. package/src/commands/ide/ide.tsx +646 -0
  143. package/src/commands/ide/index.ts +11 -0
  144. package/src/commands/init-verifiers.ts +262 -0
  145. package/src/commands/init.ts +256 -0
  146. package/src/commands/insights.ts +3201 -0
  147. package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
  148. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  149. package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  150. package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  151. package/src/commands/install-github-app/CreatingStep.tsx +65 -0
  152. package/src/commands/install-github-app/ErrorStep.tsx +85 -0
  153. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  154. package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
  155. package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  156. package/src/commands/install-github-app/SuccessStep.tsx +96 -0
  157. package/src/commands/install-github-app/WarningsStep.tsx +73 -0
  158. package/src/commands/install-github-app/index.ts +13 -0
  159. package/src/commands/install-github-app/install-github-app.tsx +587 -0
  160. package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
  161. package/src/commands/install-slack-app/index.ts +12 -0
  162. package/src/commands/install-slack-app/install-slack-app.ts +30 -0
  163. package/src/commands/install.tsx +300 -0
  164. package/src/commands/issue/index.js +1 -0
  165. package/src/commands/keybindings/index.ts +13 -0
  166. package/src/commands/keybindings/keybindings.ts +53 -0
  167. package/src/commands/login/index.ts +14 -0
  168. package/src/commands/login/login.tsx +147 -0
  169. package/src/commands/logout/index.ts +10 -0
  170. package/src/commands/logout/logout.tsx +82 -0
  171. package/src/commands/mcp/addCommand.ts +280 -0
  172. package/src/commands/mcp/index.ts +12 -0
  173. package/src/commands/mcp/mcp.tsx +85 -0
  174. package/src/commands/mcp/xaaIdpCommand.ts +266 -0
  175. package/src/commands/memory/index.ts +10 -0
  176. package/src/commands/memory/memory.tsx +90 -0
  177. package/src/commands/mobile/index.ts +11 -0
  178. package/src/commands/mobile/mobile.tsx +274 -0
  179. package/src/commands/mock-limits/index.js +1 -0
  180. package/src/commands/model/index.ts +16 -0
  181. package/src/commands/model/model.tsx +383 -0
  182. package/src/commands/oauth-refresh/index.js +1 -0
  183. package/src/commands/onboarding/index.js +1 -0
  184. package/src/commands/output-style/index.ts +11 -0
  185. package/src/commands/output-style/output-style.tsx +7 -0
  186. package/src/commands/passes/index.ts +22 -0
  187. package/src/commands/passes/passes.tsx +24 -0
  188. package/src/commands/perf-issue/index.js +1 -0
  189. package/src/commands/permissions/index.ts +11 -0
  190. package/src/commands/permissions/permissions.tsx +10 -0
  191. package/src/commands/plan/index.ts +11 -0
  192. package/src/commands/plan/plan.tsx +122 -0
  193. package/src/commands/plugin/AddMarketplace.tsx +162 -0
  194. package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
  195. package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
  196. package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
  197. package/src/commands/plugin/ManagePlugins.tsx +2215 -0
  198. package/src/commands/plugin/PluginErrors.tsx +124 -0
  199. package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
  200. package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
  201. package/src/commands/plugin/PluginSettings.tsx +1072 -0
  202. package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
  203. package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  204. package/src/commands/plugin/ValidatePlugin.tsx +98 -0
  205. package/src/commands/plugin/index.tsx +11 -0
  206. package/src/commands/plugin/parseArgs.ts +103 -0
  207. package/src/commands/plugin/plugin.tsx +7 -0
  208. package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  209. package/src/commands/plugin/usePagination.ts +171 -0
  210. package/src/commands/pr_comments/index.ts +50 -0
  211. package/src/commands/privacy-settings/index.ts +14 -0
  212. package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
  213. package/src/commands/provider/index.ts +27 -0
  214. package/src/commands/provider/provider.tsx +686 -0
  215. package/src/commands/rate-limit-options/index.ts +19 -0
  216. package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  217. package/src/commands/release-notes/index.ts +11 -0
  218. package/src/commands/release-notes/release-notes.ts +50 -0
  219. package/src/commands/reload-plugins/index.ts +18 -0
  220. package/src/commands/reload-plugins/reload-plugins.ts +61 -0
  221. package/src/commands/remote-env/index.ts +15 -0
  222. package/src/commands/remote-env/remote-env.tsx +7 -0
  223. package/src/commands/remote-setup/api.ts +182 -0
  224. package/src/commands/remote-setup/index.ts +20 -0
  225. package/src/commands/remote-setup/remote-setup.tsx +187 -0
  226. package/src/commands/rename/generateSessionName.ts +67 -0
  227. package/src/commands/rename/index.ts +12 -0
  228. package/src/commands/rename/rename.ts +87 -0
  229. package/src/commands/reset-limits/index.js +4 -0
  230. package/src/commands/resume/index.ts +12 -0
  231. package/src/commands/resume/resume.tsx +275 -0
  232. package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
  233. package/src/commands/review/reviewRemote.ts +316 -0
  234. package/src/commands/review/ultrareviewCommand.tsx +58 -0
  235. package/src/commands/review/ultrareviewEnabled.ts +14 -0
  236. package/src/commands/review.ts +57 -0
  237. package/src/commands/rewind/index.ts +13 -0
  238. package/src/commands/rewind/rewind.ts +13 -0
  239. package/src/commands/sandbox-toggle/index.ts +50 -0
  240. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  241. package/src/commands/security-review.ts +243 -0
  242. package/src/commands/session/index.ts +16 -0
  243. package/src/commands/session/session.tsx +140 -0
  244. package/src/commands/share/index.js +1 -0
  245. package/src/commands/skills/index.ts +10 -0
  246. package/src/commands/skills/skills.tsx +8 -0
  247. package/src/commands/stats/index.ts +10 -0
  248. package/src/commands/stats/stats.tsx +7 -0
  249. package/src/commands/status/index.ts +12 -0
  250. package/src/commands/status/status.tsx +8 -0
  251. package/src/commands/statusline.tsx +24 -0
  252. package/src/commands/stickers/index.ts +11 -0
  253. package/src/commands/stickers/stickers.ts +16 -0
  254. package/src/commands/summary/index.js +1 -0
  255. package/src/commands/tag/index.ts +12 -0
  256. package/src/commands/tag/tag.tsx +215 -0
  257. package/src/commands/tasks/index.ts +11 -0
  258. package/src/commands/tasks/tasks.tsx +8 -0
  259. package/src/commands/teleport/index.js +1 -0
  260. package/src/commands/terminalSetup/index.ts +23 -0
  261. package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
  262. package/src/commands/theme/index.ts +10 -0
  263. package/src/commands/theme/theme.tsx +57 -0
  264. package/src/commands/thinkback/index.ts +13 -0
  265. package/src/commands/thinkback/thinkback.tsx +554 -0
  266. package/src/commands/thinkback-play/index.ts +17 -0
  267. package/src/commands/thinkback-play/thinkback-play.ts +43 -0
  268. package/src/commands/ultraplan.tsx +471 -0
  269. package/src/commands/upgrade/index.ts +16 -0
  270. package/src/commands/upgrade/upgrade.tsx +38 -0
  271. package/src/commands/usage/index.ts +9 -0
  272. package/src/commands/usage/usage.tsx +7 -0
  273. package/src/commands/version.ts +24 -0
  274. package/src/commands/vim/index.ts +11 -0
  275. package/src/commands/vim/vim.ts +38 -0
  276. package/src/commands/voice/index.ts +20 -0
  277. package/src/commands/voice/voice.ts +150 -0
  278. package/src/commands.ts +756 -0
  279. package/src/components/AgentProgressLine.tsx +136 -0
  280. package/src/components/App.tsx +56 -0
  281. package/src/components/ApproveApiKey.tsx +123 -0
  282. package/src/components/AutoModeOptInDialog.tsx +142 -0
  283. package/src/components/AutoUpdater.tsx +199 -0
  284. package/src/components/AutoUpdaterWrapper.tsx +91 -0
  285. package/src/components/AwsAuthStatusBox.tsx +82 -0
  286. package/src/components/BaseTextInput.tsx +136 -0
  287. package/src/components/BashModeProgress.tsx +56 -0
  288. package/src/components/BridgeDialog.tsx +401 -0
  289. package/src/components/BypassPermissionsModeDialog.tsx +87 -0
  290. package/src/components/ChannelDowngradeDialog.tsx +102 -0
  291. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  292. package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
  293. package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  294. package/src/components/ClickableImageRef.tsx +73 -0
  295. package/src/components/CompactSummary.tsx +118 -0
  296. package/src/components/ConfigurableShortcutHint.tsx +57 -0
  297. package/src/components/ConsoleOAuthFlow.tsx +631 -0
  298. package/src/components/ContextSuggestions.tsx +47 -0
  299. package/src/components/ContextVisualization.tsx +489 -0
  300. package/src/components/CoordinatorAgentStatus.tsx +273 -0
  301. package/src/components/CostThresholdDialog.tsx +50 -0
  302. package/src/components/CtrlOToExpand.tsx +51 -0
  303. package/src/components/CustomSelect/SelectMulti.tsx +213 -0
  304. package/src/components/CustomSelect/index.ts +3 -0
  305. package/src/components/CustomSelect/option-map.ts +50 -0
  306. package/src/components/CustomSelect/select-input-option.tsx +488 -0
  307. package/src/components/CustomSelect/select-option.tsx +68 -0
  308. package/src/components/CustomSelect/select.tsx +690 -0
  309. package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
  310. package/src/components/CustomSelect/use-select-input.ts +287 -0
  311. package/src/components/CustomSelect/use-select-navigation.ts +653 -0
  312. package/src/components/CustomSelect/use-select-state.ts +157 -0
  313. package/src/components/DesktopHandoff.tsx +193 -0
  314. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  315. package/src/components/DevBar.tsx +49 -0
  316. package/src/components/DevChannelsDialog.tsx +105 -0
  317. package/src/components/DiagnosticsDisplay.tsx +95 -0
  318. package/src/components/EffortCallout.tsx +265 -0
  319. package/src/components/EffortIndicator.ts +42 -0
  320. package/src/components/ExitFlow.tsx +48 -0
  321. package/src/components/ExportDialog.tsx +128 -0
  322. package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
  323. package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
  324. package/src/components/FastIcon.tsx +46 -0
  325. package/src/components/Feedback.tsx +593 -0
  326. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  327. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  328. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  329. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +113 -0
  330. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  331. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  332. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  333. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  334. package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  335. package/src/components/FileEditToolDiff.tsx +181 -0
  336. package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
  337. package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
  338. package/src/components/FilePathLink.tsx +43 -0
  339. package/src/components/FullscreenLayout.tsx +637 -0
  340. package/src/components/GlobalSearchDialog.tsx +343 -0
  341. package/src/components/HelpV2/Commands.tsx +82 -0
  342. package/src/components/HelpV2/General.tsx +23 -0
  343. package/src/components/HelpV2/HelpV2.tsx +185 -0
  344. package/src/components/HighlightedCode/Fallback.tsx +193 -0
  345. package/src/components/HighlightedCode.tsx +190 -0
  346. package/src/components/HistorySearchDialog.tsx +118 -0
  347. package/src/components/IdeAutoConnectDialog.tsx +154 -0
  348. package/src/components/IdeOnboardingDialog.tsx +167 -0
  349. package/src/components/IdeStatusIndicator.tsx +58 -0
  350. package/src/components/IdleReturnDialog.tsx +118 -0
  351. package/src/components/InterruptedByUser.tsx +15 -0
  352. package/src/components/InvalidConfigDialog.tsx +156 -0
  353. package/src/components/InvalidSettingsDialog.tsx +89 -0
  354. package/src/components/KeybindingWarnings.tsx +55 -0
  355. package/src/components/LanguagePicker.tsx +86 -0
  356. package/src/components/LogSelector.tsx +1575 -0
  357. package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  358. package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
  359. package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
  360. package/src/components/LogoV2/Clawd.tsx +238 -0
  361. package/src/components/LogoV2/CondensedLogo.tsx +161 -0
  362. package/src/components/LogoV2/EmergencyTip.tsx +58 -0
  363. package/src/components/LogoV2/Feed.tsx +112 -0
  364. package/src/components/LogoV2/FeedColumn.tsx +59 -0
  365. package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  366. package/src/components/LogoV2/LogoV2.tsx +544 -0
  367. package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  368. package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  369. package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
  370. package/src/components/LogoV2/WelcomeV2.tsx +434 -0
  371. package/src/components/LogoV2/feedConfigs.tsx +92 -0
  372. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  373. package/src/components/MCPServerApprovalDialog.tsx +115 -0
  374. package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
  375. package/src/components/MCPServerDialogCopy.tsx +15 -0
  376. package/src/components/MCPServerMultiselectDialog.tsx +133 -0
  377. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  378. package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  379. package/src/components/Markdown.tsx +236 -0
  380. package/src/components/MarkdownTable.tsx +322 -0
  381. package/src/components/MemoryUsageIndicator.tsx +37 -0
  382. package/src/components/Message.tsx +627 -0
  383. package/src/components/MessageModel.tsx +43 -0
  384. package/src/components/MessageResponse.tsx +78 -0
  385. package/src/components/MessageRow.tsx +383 -0
  386. package/src/components/MessageSelector.tsx +831 -0
  387. package/src/components/MessageTimestamp.tsx +63 -0
  388. package/src/components/Messages.tsx +834 -0
  389. package/src/components/ModelPicker.tsx +458 -0
  390. package/src/components/NativeAutoUpdater.tsx +194 -0
  391. package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  392. package/src/components/OffscreenFreeze.tsx +44 -0
  393. package/src/components/Onboarding.tsx +635 -0
  394. package/src/components/OutputStylePicker.tsx +112 -0
  395. package/src/components/PackageManagerAutoUpdater.tsx +105 -0
  396. package/src/components/Passes/Passes.tsx +184 -0
  397. package/src/components/PrBadge.tsx +97 -0
  398. package/src/components/PressEnterToContinue.tsx +15 -0
  399. package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
  400. package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
  401. package/src/components/PromptInput/Notifications.tsx +332 -0
  402. package/src/components/PromptInput/PromptInput.tsx +2366 -0
  403. package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
  404. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  405. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  406. package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  407. package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  408. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  409. package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  410. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  411. package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
  412. package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
  413. package/src/components/PromptInput/inputModes.ts +33 -0
  414. package/src/components/PromptInput/inputPaste.ts +90 -0
  415. package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  416. package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  417. package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
  418. package/src/components/PromptInput/useSwarmBanner.ts +155 -0
  419. package/src/components/PromptInput/utils.ts +60 -0
  420. package/src/components/ProviderPicker.tsx +111 -0
  421. package/src/components/QuickOpenDialog.tsx +244 -0
  422. package/src/components/RemoteCallout.tsx +76 -0
  423. package/src/components/RemoteEnvironmentDialog.tsx +340 -0
  424. package/src/components/ResumeTask.tsx +268 -0
  425. package/src/components/SandboxViolationExpandedView.tsx +99 -0
  426. package/src/components/ScrollKeybindingHandler.tsx +1012 -0
  427. package/src/components/SearchBox.tsx +72 -0
  428. package/src/components/SentryErrorBoundary.ts +28 -0
  429. package/src/components/SessionBackgroundHint.tsx +108 -0
  430. package/src/components/SessionPreview.tsx +194 -0
  431. package/src/components/Settings/Config.tsx +1903 -0
  432. package/src/components/Settings/Settings.tsx +137 -0
  433. package/src/components/Settings/Status.tsx +242 -0
  434. package/src/components/Settings/Usage.tsx +377 -0
  435. package/src/components/ShowInIDEPrompt.tsx +170 -0
  436. package/src/components/SkillImprovementSurvey.tsx +152 -0
  437. package/src/components/Spinner/FlashingChar.tsx +61 -0
  438. package/src/components/Spinner/GlimmerMessage.tsx +328 -0
  439. package/src/components/Spinner/ShimmerChar.tsx +36 -0
  440. package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  441. package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
  442. package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  443. package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  444. package/src/components/Spinner/index.ts +10 -0
  445. package/src/components/Spinner/teammateSelectHint.ts +1 -0
  446. package/src/components/Spinner/useShimmerAnimation.ts +31 -0
  447. package/src/components/Spinner/useStalledAnimation.ts +75 -0
  448. package/src/components/Spinner/utils.ts +84 -0
  449. package/src/components/Spinner.tsx +562 -0
  450. package/src/components/Stats.tsx +1228 -0
  451. package/src/components/StatusLine.tsx +325 -0
  452. package/src/components/StatusNotices.tsx +55 -0
  453. package/src/components/StructuredDiff/Fallback.tsx +487 -0
  454. package/src/components/StructuredDiff/colorDiff.ts +37 -0
  455. package/src/components/StructuredDiff.tsx +190 -0
  456. package/src/components/StructuredDiffList.tsx +30 -0
  457. package/src/components/TagTabs.tsx +139 -0
  458. package/src/components/TaskListV2.tsx +378 -0
  459. package/src/components/TeammateViewHeader.tsx +82 -0
  460. package/src/components/TeleportError.tsx +189 -0
  461. package/src/components/TeleportProgress.tsx +140 -0
  462. package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
  463. package/src/components/TeleportResumeWrapper.tsx +167 -0
  464. package/src/components/TeleportStash.tsx +116 -0
  465. package/src/components/TextInput.tsx +124 -0
  466. package/src/components/ThemePicker.tsx +333 -0
  467. package/src/components/ThinkingToggle.tsx +153 -0
  468. package/src/components/TokenWarning.tsx +179 -0
  469. package/src/components/ToolUseLoader.tsx +42 -0
  470. package/src/components/TrustDialog/TrustDialog.tsx +290 -0
  471. package/src/components/TrustDialog/utils.ts +245 -0
  472. package/src/components/ValidationErrorsList.tsx +148 -0
  473. package/src/components/VimTextInput.tsx +140 -0
  474. package/src/components/VirtualMessageList.tsx +1082 -0
  475. package/src/components/WorkflowMultiselectDialog.tsx +128 -0
  476. package/src/components/WorktreeExitDialog.tsx +231 -0
  477. package/src/components/agents/AgentDetail.tsx +220 -0
  478. package/src/components/agents/AgentEditor.tsx +178 -0
  479. package/src/components/agents/AgentNavigationFooter.tsx +26 -0
  480. package/src/components/agents/AgentsList.tsx +440 -0
  481. package/src/components/agents/AgentsMenu.tsx +800 -0
  482. package/src/components/agents/ColorPicker.tsx +112 -0
  483. package/src/components/agents/ModelSelector.tsx +68 -0
  484. package/src/components/agents/ToolSelector.tsx +568 -0
  485. package/src/components/agents/agentFileUtils.ts +272 -0
  486. package/src/components/agents/generateAgent.ts +197 -0
  487. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  488. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  489. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  490. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  491. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  492. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  493. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  494. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  495. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  496. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  497. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  498. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  499. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  500. package/src/components/agents/types.ts +27 -0
  501. package/src/components/agents/utils.ts +18 -0
  502. package/src/components/agents/validateAgent.ts +109 -0
  503. package/src/components/design-system/Byline.tsx +77 -0
  504. package/src/components/design-system/Dialog.tsx +138 -0
  505. package/src/components/design-system/Divider.tsx +149 -0
  506. package/src/components/design-system/FuzzyPicker.tsx +312 -0
  507. package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
  508. package/src/components/design-system/ListItem.tsx +244 -0
  509. package/src/components/design-system/LoadingState.tsx +94 -0
  510. package/src/components/design-system/Pane.tsx +77 -0
  511. package/src/components/design-system/ProgressBar.tsx +86 -0
  512. package/src/components/design-system/Ratchet.tsx +80 -0
  513. package/src/components/design-system/StatusIcon.tsx +95 -0
  514. package/src/components/design-system/Tabs.tsx +340 -0
  515. package/src/components/design-system/ThemeProvider.tsx +170 -0
  516. package/src/components/design-system/ThemedBox.tsx +156 -0
  517. package/src/components/design-system/ThemedText.tsx +124 -0
  518. package/src/components/design-system/color.ts +30 -0
  519. package/src/components/diff/DiffDetailView.tsx +281 -0
  520. package/src/components/diff/DiffDialog.tsx +383 -0
  521. package/src/components/diff/DiffFileList.tsx +292 -0
  522. package/src/components/grove/Grove.tsx +463 -0
  523. package/src/components/hooks/HooksConfigMenu.tsx +578 -0
  524. package/src/components/hooks/PromptDialog.tsx +90 -0
  525. package/src/components/hooks/SelectEventMode.tsx +127 -0
  526. package/src/components/hooks/SelectHookMode.tsx +112 -0
  527. package/src/components/hooks/SelectMatcherMode.tsx +144 -0
  528. package/src/components/hooks/ViewHookMode.tsx +199 -0
  529. package/src/components/mcp/CapabilitiesSection.tsx +61 -0
  530. package/src/components/mcp/ElicitationDialog.tsx +1169 -0
  531. package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
  532. package/src/components/mcp/MCPListPanel.tsx +504 -0
  533. package/src/components/mcp/MCPReconnect.tsx +167 -0
  534. package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  535. package/src/components/mcp/MCPSettings.tsx +398 -0
  536. package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  537. package/src/components/mcp/MCPToolDetailView.tsx +212 -0
  538. package/src/components/mcp/MCPToolListView.tsx +141 -0
  539. package/src/components/mcp/McpParsingWarnings.tsx +213 -0
  540. package/src/components/mcp/index.ts +9 -0
  541. package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
  542. package/src/components/memory/MemoryFileSelector.tsx +438 -0
  543. package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
  544. package/src/components/messageActions.tsx +450 -0
  545. package/src/components/messages/AdvisorMessage.tsx +158 -0
  546. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  547. package/src/components/messages/AssistantTextMessage.tsx +270 -0
  548. package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
  549. package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
  550. package/src/components/messages/AttachmentMessage.tsx +536 -0
  551. package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  552. package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
  553. package/src/components/messages/GroupedToolUseContent.tsx +58 -0
  554. package/src/components/messages/HighlightedThinkingText.tsx +162 -0
  555. package/src/components/messages/HookProgressMessage.tsx +116 -0
  556. package/src/components/messages/PlanApprovalMessage.tsx +222 -0
  557. package/src/components/messages/RateLimitMessage.tsx +161 -0
  558. package/src/components/messages/ShutdownMessage.tsx +132 -0
  559. package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
  560. package/src/components/messages/SystemTextMessage.tsx +827 -0
  561. package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
  562. package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
  563. package/src/components/messages/UserBashInputMessage.tsx +58 -0
  564. package/src/components/messages/UserBashOutputMessage.tsx +54 -0
  565. package/src/components/messages/UserChannelMessage.tsx +137 -0
  566. package/src/components/messages/UserCommandMessage.tsx +108 -0
  567. package/src/components/messages/UserImageMessage.tsx +59 -0
  568. package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  569. package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
  570. package/src/components/messages/UserPlanMessage.tsx +42 -0
  571. package/src/components/messages/UserPromptMessage.tsx +80 -0
  572. package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  573. package/src/components/messages/UserTeammateMessage.tsx +206 -0
  574. package/src/components/messages/UserTextMessage.tsx +275 -0
  575. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  576. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  577. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  578. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  579. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  580. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  581. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  582. package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
  583. package/src/components/messages/nullRenderingAttachments.ts +70 -0
  584. package/src/components/messages/teamMemCollapsed.tsx +140 -0
  585. package/src/components/messages/teamMemSaved.ts +19 -0
  586. package/src/components/modelPickerHelpers.test.ts +74 -0
  587. package/src/components/modelPickerHelpers.ts +67 -0
  588. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  589. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  590. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  591. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  592. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  593. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  594. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  595. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  596. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  597. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  598. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  599. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  600. package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
  601. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  602. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  603. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  604. package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  605. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  606. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  607. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  608. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  609. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  610. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  611. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  612. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  613. package/src/components/permissions/PermissionDialog.tsx +72 -0
  614. package/src/components/permissions/PermissionExplanation.tsx +272 -0
  615. package/src/components/permissions/PermissionPrompt.tsx +336 -0
  616. package/src/components/permissions/PermissionRequest.tsx +217 -0
  617. package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
  618. package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
  619. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  620. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  621. package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
  622. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  623. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  624. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  625. package/src/components/permissions/WorkerBadge.tsx +49 -0
  626. package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
  627. package/src/components/permissions/hooks.ts +209 -0
  628. package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
  629. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  630. package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  631. package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  632. package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  633. package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  634. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  635. package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
  636. package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
  637. package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
  638. package/src/components/permissions/utils.ts +25 -0
  639. package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
  640. package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  641. package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
  642. package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
  643. package/src/components/sandbox/SandboxSettings.tsx +296 -0
  644. package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
  645. package/src/components/shell/OutputLine.tsx +118 -0
  646. package/src/components/shell/ShellProgressMessage.tsx +150 -0
  647. package/src/components/shell/ShellTimeDisplay.tsx +74 -0
  648. package/src/components/skills/SkillsMenu.tsx +237 -0
  649. package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  650. package/src/components/tasks/BackgroundTask.tsx +345 -0
  651. package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
  652. package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
  653. package/src/components/tasks/DreamDetailDialog.tsx +251 -0
  654. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  655. package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  656. package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
  657. package/src/components/tasks/ShellDetailDialog.tsx +404 -0
  658. package/src/components/tasks/ShellProgress.tsx +87 -0
  659. package/src/components/tasks/renderToolActivity.tsx +33 -0
  660. package/src/components/tasks/taskStatusUtils.tsx +107 -0
  661. package/src/components/teams/TeamStatus.tsx +80 -0
  662. package/src/components/teams/TeamsDialog.tsx +715 -0
  663. package/src/components/ui/OrderedList.tsx +71 -0
  664. package/src/components/ui/OrderedListItem.tsx +45 -0
  665. package/src/components/ui/TreeSelect.tsx +397 -0
  666. package/src/components/wizard/WizardDialogLayout.tsx +65 -0
  667. package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
  668. package/src/components/wizard/WizardProvider.tsx +213 -0
  669. package/src/components/wizard/index.ts +9 -0
  670. package/src/components/wizard/useWizard.ts +13 -0
  671. package/src/constants/apiLimits.ts +94 -0
  672. package/src/constants/betas.ts +52 -0
  673. package/src/constants/common.ts +33 -0
  674. package/src/constants/cyberRiskInstruction.ts +24 -0
  675. package/src/constants/errorIds.ts +15 -0
  676. package/src/constants/figures.ts +45 -0
  677. package/src/constants/files.ts +156 -0
  678. package/src/constants/github-app.ts +144 -0
  679. package/src/constants/keys.ts +11 -0
  680. package/src/constants/messages.ts +1 -0
  681. package/src/constants/oauth.ts +234 -0
  682. package/src/constants/outputStyles.ts +216 -0
  683. package/src/constants/product.ts +76 -0
  684. package/src/constants/prompts.ts +915 -0
  685. package/src/constants/spinnerVerbs.ts +204 -0
  686. package/src/constants/system.ts +96 -0
  687. package/src/constants/systemPromptSections.ts +68 -0
  688. package/src/constants/toolLimits.ts +56 -0
  689. package/src/constants/tools.ts +112 -0
  690. package/src/constants/turnCompletionVerbs.ts +12 -0
  691. package/src/constants/xml.ts +86 -0
  692. package/src/context/QueuedMessageContext.tsx +63 -0
  693. package/src/context/fpsMetrics.tsx +30 -0
  694. package/src/context/mailbox.tsx +38 -0
  695. package/src/context/modalContext.tsx +58 -0
  696. package/src/context/notifications.tsx +240 -0
  697. package/src/context/overlayContext.tsx +151 -0
  698. package/src/context/promptOverlayContext.tsx +125 -0
  699. package/src/context/stats.tsx +220 -0
  700. package/src/context/voice.tsx +88 -0
  701. package/src/context.ts +189 -0
  702. package/src/coordinator/coordinatorMode.ts +369 -0
  703. package/src/cost-tracker.ts +323 -0
  704. package/src/costHook.ts +22 -0
  705. package/src/dialogLaunchers.tsx +133 -0
  706. package/src/entrypoints/agentSdkTypes.ts +443 -0
  707. package/src/entrypoints/cli.tsx +327 -0
  708. package/src/entrypoints/init.ts +340 -0
  709. package/src/entrypoints/mcp.ts +197 -0
  710. package/src/entrypoints/sandboxTypes.ts +156 -0
  711. package/src/entrypoints/sdk/controlSchemas.ts +663 -0
  712. package/src/entrypoints/sdk/controlTypes.ts +87 -0
  713. package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
  714. package/src/entrypoints/sdk/coreTypes.generated.ts +255 -0
  715. package/src/entrypoints/sdk/coreTypes.ts +62 -0
  716. package/src/entrypoints/sdk/runtimeTypes.ts +29 -0
  717. package/src/entrypoints/sdk/settingsTypes.generated.ts +5 -0
  718. package/src/entrypoints/sdk/toolTypes.ts +5 -0
  719. package/src/history.ts +464 -0
  720. package/src/hooks/fileSuggestions.ts +811 -0
  721. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  722. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  723. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  724. package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
  725. package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  726. package/src/hooks/notifs/useInstallMessages.tsx +26 -0
  727. package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  728. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  729. package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  730. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  731. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  732. package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  733. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  734. package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
  735. package/src/hooks/notifs/useStartupNotification.ts +41 -0
  736. package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  737. package/src/hooks/renderPlaceholder.ts +51 -0
  738. package/src/hooks/toolPermission/PermissionContext.ts +388 -0
  739. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  740. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  741. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  742. package/src/hooks/toolPermission/permissionLogging.ts +238 -0
  743. package/src/hooks/unifiedSuggestions.ts +202 -0
  744. package/src/hooks/useAfterFirstRender.ts +17 -0
  745. package/src/hooks/useApiKeyVerification.ts +84 -0
  746. package/src/hooks/useArrowKeyHistory.tsx +229 -0
  747. package/src/hooks/useAssistantHistory.ts +250 -0
  748. package/src/hooks/useAwaySummary.ts +125 -0
  749. package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
  750. package/src/hooks/useBlink.ts +34 -0
  751. package/src/hooks/useCanUseTool.tsx +204 -0
  752. package/src/hooks/useCancelRequest.ts +276 -0
  753. package/src/hooks/useChromeExtensionNotification.tsx +50 -0
  754. package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  755. package/src/hooks/useClipboardImageHint.ts +77 -0
  756. package/src/hooks/useCommandKeybindings.tsx +108 -0
  757. package/src/hooks/useCommandQueue.ts +15 -0
  758. package/src/hooks/useCopyOnSelect.ts +98 -0
  759. package/src/hooks/useDeferredHookMessages.ts +46 -0
  760. package/src/hooks/useDiffData.ts +110 -0
  761. package/src/hooks/useDiffInIDE.ts +379 -0
  762. package/src/hooks/useDirectConnect.ts +229 -0
  763. package/src/hooks/useDoublePress.ts +62 -0
  764. package/src/hooks/useDynamicConfig.ts +22 -0
  765. package/src/hooks/useElapsedTime.ts +37 -0
  766. package/src/hooks/useExitOnCtrlCD.ts +95 -0
  767. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  768. package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
  769. package/src/hooks/useGlobalKeybindings.tsx +249 -0
  770. package/src/hooks/useHistorySearch.ts +303 -0
  771. package/src/hooks/useIDEIntegration.tsx +70 -0
  772. package/src/hooks/useIdeAtMentioned.ts +76 -0
  773. package/src/hooks/useIdeConnectionStatus.ts +33 -0
  774. package/src/hooks/useIdeLogging.ts +41 -0
  775. package/src/hooks/useIdeSelection.ts +150 -0
  776. package/src/hooks/useInboxPoller.ts +969 -0
  777. package/src/hooks/useInputBuffer.ts +132 -0
  778. package/src/hooks/useIssueFlagBanner.ts +133 -0
  779. package/src/hooks/useLogMessages.ts +119 -0
  780. package/src/hooks/useLspPluginRecommendation.tsx +194 -0
  781. package/src/hooks/useMailboxBridge.ts +21 -0
  782. package/src/hooks/useMainLoopModel.ts +34 -0
  783. package/src/hooks/useManagePlugins.ts +304 -0
  784. package/src/hooks/useMemoryUsage.ts +39 -0
  785. package/src/hooks/useMergedClients.ts +23 -0
  786. package/src/hooks/useMergedCommands.ts +15 -0
  787. package/src/hooks/useMergedTools.ts +44 -0
  788. package/src/hooks/useMinDisplayTime.ts +35 -0
  789. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  790. package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  791. package/src/hooks/usePasteHandler.ts +285 -0
  792. package/src/hooks/usePluginRecommendationBase.tsx +105 -0
  793. package/src/hooks/usePrStatus.ts +106 -0
  794. package/src/hooks/usePromptSuggestion.ts +177 -0
  795. package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  796. package/src/hooks/useQueueProcessor.ts +68 -0
  797. package/src/hooks/useRemoteSession.ts +605 -0
  798. package/src/hooks/useReplBridge.tsx +723 -0
  799. package/src/hooks/useSSHSession.ts +241 -0
  800. package/src/hooks/useScheduledTasks.ts +139 -0
  801. package/src/hooks/useSearchInput.ts +364 -0
  802. package/src/hooks/useSessionBackgrounding.ts +158 -0
  803. package/src/hooks/useSettings.ts +17 -0
  804. package/src/hooks/useSettingsChange.ts +25 -0
  805. package/src/hooks/useSkillImprovementSurvey.ts +105 -0
  806. package/src/hooks/useSkillsChange.ts +62 -0
  807. package/src/hooks/useSwarmInitialization.ts +81 -0
  808. package/src/hooks/useSwarmPermissionPoller.ts +330 -0
  809. package/src/hooks/useTaskListWatcher.ts +221 -0
  810. package/src/hooks/useTasksV2.ts +250 -0
  811. package/src/hooks/useTeammateViewAutoExit.ts +63 -0
  812. package/src/hooks/useTeleportResume.tsx +85 -0
  813. package/src/hooks/useTerminalSize.ts +15 -0
  814. package/src/hooks/useTextInput.ts +529 -0
  815. package/src/hooks/useTimeout.ts +14 -0
  816. package/src/hooks/useTurnDiffs.ts +213 -0
  817. package/src/hooks/useTypeahead.tsx +1385 -0
  818. package/src/hooks/useUpdateNotification.ts +35 -0
  819. package/src/hooks/useVimInput.ts +316 -0
  820. package/src/hooks/useVirtualScroll.ts +721 -0
  821. package/src/hooks/useVoice.ts +1144 -0
  822. package/src/hooks/useVoiceEnabled.ts +25 -0
  823. package/src/hooks/useVoiceIntegration.tsx +677 -0
  824. package/src/ink/Ansi.tsx +292 -0
  825. package/src/ink/bidi.ts +139 -0
  826. package/src/ink/clearTerminal.ts +74 -0
  827. package/src/ink/colorize.ts +231 -0
  828. package/src/ink/components/AlternateScreen.tsx +80 -0
  829. package/src/ink/components/App.tsx +658 -0
  830. package/src/ink/components/AppContext.ts +21 -0
  831. package/src/ink/components/Box.tsx +214 -0
  832. package/src/ink/components/Button.tsx +192 -0
  833. package/src/ink/components/ClockContext.tsx +112 -0
  834. package/src/ink/components/CursorDeclarationContext.ts +32 -0
  835. package/src/ink/components/ErrorOverview.tsx +109 -0
  836. package/src/ink/components/Link.tsx +42 -0
  837. package/src/ink/components/Newline.tsx +39 -0
  838. package/src/ink/components/NoSelect.tsx +68 -0
  839. package/src/ink/components/RawAnsi.tsx +57 -0
  840. package/src/ink/components/ScrollBox.tsx +237 -0
  841. package/src/ink/components/Spacer.tsx +20 -0
  842. package/src/ink/components/StdinContext.ts +49 -0
  843. package/src/ink/components/TerminalFocusContext.tsx +52 -0
  844. package/src/ink/components/TerminalSizeContext.tsx +7 -0
  845. package/src/ink/components/Text.tsx +254 -0
  846. package/src/ink/constants.ts +2 -0
  847. package/src/ink/dom.ts +484 -0
  848. package/src/ink/events/click-event.ts +38 -0
  849. package/src/ink/events/dispatcher.ts +233 -0
  850. package/src/ink/events/emitter.ts +39 -0
  851. package/src/ink/events/event-handlers.ts +73 -0
  852. package/src/ink/events/event.ts +11 -0
  853. package/src/ink/events/focus-event.ts +21 -0
  854. package/src/ink/events/input-event.ts +205 -0
  855. package/src/ink/events/keyboard-event.ts +51 -0
  856. package/src/ink/events/terminal-event.ts +107 -0
  857. package/src/ink/events/terminal-focus-event.ts +19 -0
  858. package/src/ink/focus.ts +181 -0
  859. package/src/ink/frame.ts +124 -0
  860. package/src/ink/get-max-width.ts +27 -0
  861. package/src/ink/global.ts +2 -0
  862. package/src/ink/hit-test.ts +130 -0
  863. package/src/ink/hooks/use-animation-frame.ts +57 -0
  864. package/src/ink/hooks/use-app.ts +8 -0
  865. package/src/ink/hooks/use-declared-cursor.ts +73 -0
  866. package/src/ink/hooks/use-input.ts +92 -0
  867. package/src/ink/hooks/use-interval.ts +67 -0
  868. package/src/ink/hooks/use-search-highlight.ts +53 -0
  869. package/src/ink/hooks/use-selection.ts +104 -0
  870. package/src/ink/hooks/use-stdin.ts +8 -0
  871. package/src/ink/hooks/use-tab-status.ts +72 -0
  872. package/src/ink/hooks/use-terminal-focus.ts +16 -0
  873. package/src/ink/hooks/use-terminal-title.ts +31 -0
  874. package/src/ink/hooks/use-terminal-viewport.ts +96 -0
  875. package/src/ink/ink.tsx +1723 -0
  876. package/src/ink/instances.ts +10 -0
  877. package/src/ink/layout/engine.ts +6 -0
  878. package/src/ink/layout/geometry.ts +97 -0
  879. package/src/ink/layout/node.ts +152 -0
  880. package/src/ink/layout/yoga.ts +308 -0
  881. package/src/ink/line-width-cache.ts +24 -0
  882. package/src/ink/log-update.ts +773 -0
  883. package/src/ink/measure-element.ts +23 -0
  884. package/src/ink/measure-text.ts +47 -0
  885. package/src/ink/node-cache.ts +54 -0
  886. package/src/ink/optimizer.ts +93 -0
  887. package/src/ink/output.ts +797 -0
  888. package/src/ink/parse-keypress.ts +801 -0
  889. package/src/ink/reconciler.ts +512 -0
  890. package/src/ink/render-border.ts +231 -0
  891. package/src/ink/render-node-to-output.ts +1462 -0
  892. package/src/ink/render-to-screen.ts +231 -0
  893. package/src/ink/renderer.ts +178 -0
  894. package/src/ink/root.ts +184 -0
  895. package/src/ink/screen.ts +1486 -0
  896. package/src/ink/searchHighlight.ts +93 -0
  897. package/src/ink/selection.ts +917 -0
  898. package/src/ink/squash-text-nodes.ts +92 -0
  899. package/src/ink/stringWidth.ts +222 -0
  900. package/src/ink/styles.ts +771 -0
  901. package/src/ink/supports-hyperlinks.ts +57 -0
  902. package/src/ink/tabstops.ts +46 -0
  903. package/src/ink/terminal-focus-state.ts +47 -0
  904. package/src/ink/terminal-querier.ts +212 -0
  905. package/src/ink/terminal.ts +248 -0
  906. package/src/ink/termio/ansi.ts +75 -0
  907. package/src/ink/termio/csi.ts +319 -0
  908. package/src/ink/termio/dec.ts +60 -0
  909. package/src/ink/termio/esc.ts +67 -0
  910. package/src/ink/termio/osc.ts +493 -0
  911. package/src/ink/termio/parser.ts +394 -0
  912. package/src/ink/termio/sgr.ts +308 -0
  913. package/src/ink/termio/tokenize.ts +319 -0
  914. package/src/ink/termio/types.ts +236 -0
  915. package/src/ink/termio.ts +42 -0
  916. package/src/ink/useTerminalNotification.ts +126 -0
  917. package/src/ink/warn.ts +9 -0
  918. package/src/ink/widest-line.ts +19 -0
  919. package/src/ink/wrap-text.ts +74 -0
  920. package/src/ink/wrapAnsi.ts +20 -0
  921. package/src/ink.ts +85 -0
  922. package/src/interactiveHelpers.tsx +367 -0
  923. package/src/keybindings/KeybindingContext.tsx +243 -0
  924. package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
  925. package/src/keybindings/defaultBindings.ts +340 -0
  926. package/src/keybindings/loadUserBindings.ts +472 -0
  927. package/src/keybindings/match.ts +120 -0
  928. package/src/keybindings/parser.ts +203 -0
  929. package/src/keybindings/reservedShortcuts.ts +127 -0
  930. package/src/keybindings/resolver.ts +244 -0
  931. package/src/keybindings/schema.ts +236 -0
  932. package/src/keybindings/shortcutFormat.ts +63 -0
  933. package/src/keybindings/template.ts +52 -0
  934. package/src/keybindings/useKeybinding.ts +196 -0
  935. package/src/keybindings/useShortcutDisplay.ts +59 -0
  936. package/src/keybindings/validate.ts +498 -0
  937. package/src/main.tsx +4756 -0
  938. package/src/memdir/findRelevantMemories.ts +141 -0
  939. package/src/memdir/memdir.ts +507 -0
  940. package/src/memdir/memoryAge.ts +53 -0
  941. package/src/memdir/memoryScan.ts +94 -0
  942. package/src/memdir/memoryTypes.ts +271 -0
  943. package/src/memdir/paths.ts +278 -0
  944. package/src/memdir/teamMemPaths.ts +292 -0
  945. package/src/memdir/teamMemPrompts.ts +100 -0
  946. package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  947. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  948. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  949. package/src/migrations/migrateFennecToOpus.ts +45 -0
  950. package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  951. package/src/migrations/migrateOpusToOpus1m.ts +43 -0
  952. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  953. package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  954. package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  955. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  956. package/src/migrations/resetProToOpusDefault.ts +51 -0
  957. package/src/moreright/useMoreRight.tsx +26 -0
  958. package/src/native-ts/color-diff/index.ts +999 -0
  959. package/src/native-ts/file-index/index.ts +370 -0
  960. package/src/native-ts/yoga-layout/enums.ts +134 -0
  961. package/src/native-ts/yoga-layout/index.ts +2578 -0
  962. package/src/outputStyles/loadOutputStylesDir.ts +98 -0
  963. package/src/plugins/builtinPlugins.ts +159 -0
  964. package/src/plugins/bundled/index.ts +23 -0
  965. package/src/projectOnboardingState.ts +83 -0
  966. package/src/query/config.ts +48 -0
  967. package/src/query/deps.ts +40 -0
  968. package/src/query/stopHooks.ts +473 -0
  969. package/src/query/tokenBudget.ts +93 -0
  970. package/src/query.ts +1729 -0
  971. package/src/remote/RemoteSessionManager.ts +343 -0
  972. package/src/remote/SessionsWebSocket.ts +404 -0
  973. package/src/remote/remotePermissionBridge.ts +78 -0
  974. package/src/remote/sdkMessageAdapter.ts +302 -0
  975. package/src/replLauncher.tsx +22 -0
  976. package/src/schemas/hooks.ts +222 -0
  977. package/src/screens/Doctor.tsx +575 -0
  978. package/src/screens/REPL.tsx +5052 -0
  979. package/src/screens/ResumeConversation.tsx +399 -0
  980. package/src/server/createDirectConnectSession.ts +88 -0
  981. package/src/server/directConnectManager.ts +213 -0
  982. package/src/server/types.ts +57 -0
  983. package/src/services/AgentSummary/agentSummary.ts +179 -0
  984. package/src/services/MagicDocs/magicDocs.ts +254 -0
  985. package/src/services/MagicDocs/prompts.ts +127 -0
  986. package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
  987. package/src/services/PromptSuggestion/speculation.ts +991 -0
  988. package/src/services/SessionMemory/prompts.ts +324 -0
  989. package/src/services/SessionMemory/sessionMemory.ts +495 -0
  990. package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  991. package/src/services/analytics/config.ts +40 -0
  992. package/src/services/analytics/datadog.ts +307 -0
  993. package/src/services/analytics/firstPartyEventLogger.ts +450 -0
  994. package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  995. package/src/services/analytics/growthbook.ts +1155 -0
  996. package/src/services/analytics/index.ts +173 -0
  997. package/src/services/analytics/metadata.ts +974 -0
  998. package/src/services/analytics/sink.ts +114 -0
  999. package/src/services/analytics/sinkKillswitch.ts +25 -0
  1000. package/src/services/api/adminRequests.ts +119 -0
  1001. package/src/services/api/bootstrap.ts +190 -0
  1002. package/src/services/api/claude.ts +3419 -0
  1003. package/src/services/api/client.ts +425 -0
  1004. package/src/services/api/dumpPrompts.ts +226 -0
  1005. package/src/services/api/emptyUsage.ts +22 -0
  1006. package/src/services/api/errorUtils.ts +260 -0
  1007. package/src/services/api/errors.ts +1207 -0
  1008. package/src/services/api/filesApi.ts +748 -0
  1009. package/src/services/api/firstTokenDate.ts +60 -0
  1010. package/src/services/api/grove.ts +357 -0
  1011. package/src/services/api/logging.ts +788 -0
  1012. package/src/services/api/metricsOptOut.ts +159 -0
  1013. package/src/services/api/overageCreditGrant.ts +137 -0
  1014. package/src/services/api/promptCacheBreakDetection.ts +727 -0
  1015. package/src/services/api/referral.ts +281 -0
  1016. package/src/services/api/sessionIngress.ts +514 -0
  1017. package/src/services/api/ultrareviewQuota.ts +38 -0
  1018. package/src/services/api/usage.ts +63 -0
  1019. package/src/services/api/withRetry.ts +822 -0
  1020. package/src/services/autoDream/autoDream.ts +324 -0
  1021. package/src/services/autoDream/config.ts +21 -0
  1022. package/src/services/autoDream/consolidationLock.ts +140 -0
  1023. package/src/services/autoDream/consolidationPrompt.ts +65 -0
  1024. package/src/services/awaySummary.ts +74 -0
  1025. package/src/services/claudeAiLimits.ts +515 -0
  1026. package/src/services/claudeAiLimitsHook.ts +23 -0
  1027. package/src/services/compact/apiMicrocompact.ts +153 -0
  1028. package/src/services/compact/autoCompact.ts +351 -0
  1029. package/src/services/compact/compact.ts +1705 -0
  1030. package/src/services/compact/compactWarningHook.ts +16 -0
  1031. package/src/services/compact/compactWarningState.ts +18 -0
  1032. package/src/services/compact/grouping.ts +63 -0
  1033. package/src/services/compact/microCompact.ts +530 -0
  1034. package/src/services/compact/postCompactCleanup.ts +77 -0
  1035. package/src/services/compact/prompt.ts +374 -0
  1036. package/src/services/compact/sessionMemoryCompact.ts +630 -0
  1037. package/src/services/compact/timeBasedMCConfig.ts +43 -0
  1038. package/src/services/copilot/provider.ts +1603 -0
  1039. package/src/services/diagnosticTracking.ts +397 -0
  1040. package/src/services/extractMemories/extractMemories.ts +615 -0
  1041. package/src/services/extractMemories/prompts.ts +154 -0
  1042. package/src/services/internalLogging.ts +90 -0
  1043. package/src/services/lsp/LSPClient.ts +447 -0
  1044. package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  1045. package/src/services/lsp/LSPServerInstance.ts +511 -0
  1046. package/src/services/lsp/LSPServerManager.ts +420 -0
  1047. package/src/services/lsp/config.ts +79 -0
  1048. package/src/services/lsp/manager.ts +289 -0
  1049. package/src/services/lsp/passiveFeedback.ts +328 -0
  1050. package/src/services/mcp/InProcessTransport.ts +63 -0
  1051. package/src/services/mcp/MCPConnectionManager.tsx +73 -0
  1052. package/src/services/mcp/SdkControlTransport.ts +136 -0
  1053. package/src/services/mcp/auth.ts +2465 -0
  1054. package/src/services/mcp/channelAllowlist.ts +76 -0
  1055. package/src/services/mcp/channelNotification.ts +316 -0
  1056. package/src/services/mcp/channelPermissions.ts +240 -0
  1057. package/src/services/mcp/claudeai.ts +164 -0
  1058. package/src/services/mcp/client.ts +3349 -0
  1059. package/src/services/mcp/config.ts +1578 -0
  1060. package/src/services/mcp/elicitationHandler.ts +313 -0
  1061. package/src/services/mcp/envExpansion.ts +38 -0
  1062. package/src/services/mcp/headersHelper.ts +138 -0
  1063. package/src/services/mcp/mcpStringUtils.ts +106 -0
  1064. package/src/services/mcp/normalization.ts +23 -0
  1065. package/src/services/mcp/oauthPort.ts +78 -0
  1066. package/src/services/mcp/officialRegistry.ts +72 -0
  1067. package/src/services/mcp/types.ts +258 -0
  1068. package/src/services/mcp/useManageMCPConnections.ts +1141 -0
  1069. package/src/services/mcp/utils.ts +575 -0
  1070. package/src/services/mcp/vscodeSdkMcp.ts +112 -0
  1071. package/src/services/mcp/xaa.ts +511 -0
  1072. package/src/services/mcp/xaaIdpLogin.ts +487 -0
  1073. package/src/services/mcpServerApproval.tsx +41 -0
  1074. package/src/services/mockRateLimits.ts +882 -0
  1075. package/src/services/notifier.ts +156 -0
  1076. package/src/services/oauth/auth-code-listener.ts +211 -0
  1077. package/src/services/oauth/client.ts +566 -0
  1078. package/src/services/oauth/crypto.ts +23 -0
  1079. package/src/services/oauth/getOauthProfile.ts +53 -0
  1080. package/src/services/oauth/index.ts +198 -0
  1081. package/src/services/openrouter/provider.ts +129 -0
  1082. package/src/services/plugins/PluginInstallationManager.ts +184 -0
  1083. package/src/services/plugins/pluginCliCommands.ts +344 -0
  1084. package/src/services/plugins/pluginOperations.ts +1088 -0
  1085. package/src/services/policyLimits/index.ts +663 -0
  1086. package/src/services/policyLimits/types.ts +27 -0
  1087. package/src/services/preventSleep.ts +165 -0
  1088. package/src/services/providerCatalog.test.ts +124 -0
  1089. package/src/services/rateLimitMessages.ts +344 -0
  1090. package/src/services/rateLimitMocking.ts +144 -0
  1091. package/src/services/remoteManagedSettings/index.ts +638 -0
  1092. package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
  1093. package/src/services/remoteManagedSettings/syncCache.ts +112 -0
  1094. package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
  1095. package/src/services/remoteManagedSettings/types.ts +31 -0
  1096. package/src/services/settingsSync/index.ts +581 -0
  1097. package/src/services/settingsSync/types.ts +67 -0
  1098. package/src/services/teamMemorySync/index.ts +1256 -0
  1099. package/src/services/teamMemorySync/secretScanner.ts +324 -0
  1100. package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  1101. package/src/services/teamMemorySync/types.ts +156 -0
  1102. package/src/services/teamMemorySync/watcher.ts +387 -0
  1103. package/src/services/tips/tipHistory.ts +17 -0
  1104. package/src/services/tips/tipRegistry.ts +686 -0
  1105. package/src/services/tips/tipScheduler.ts +58 -0
  1106. package/src/services/tokenEstimation.ts +503 -0
  1107. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1108. package/src/services/tools/StreamingToolExecutor.ts +530 -0
  1109. package/src/services/tools/toolExecution.ts +1745 -0
  1110. package/src/services/tools/toolHooks.ts +650 -0
  1111. package/src/services/tools/toolOrchestration.ts +188 -0
  1112. package/src/services/vcr.ts +406 -0
  1113. package/src/services/voice.ts +525 -0
  1114. package/src/services/voiceKeyterms.ts +106 -0
  1115. package/src/services/voiceStreamSTT.ts +544 -0
  1116. package/src/setup.ts +477 -0
  1117. package/src/skills/bundled/batch.ts +124 -0
  1118. package/src/skills/bundled/claudeApi.ts +196 -0
  1119. package/src/skills/bundled/claudeApiContent.ts +75 -0
  1120. package/src/skills/bundled/claudeInChrome.ts +34 -0
  1121. package/src/skills/bundled/debug.ts +103 -0
  1122. package/src/skills/bundled/index.ts +79 -0
  1123. package/src/skills/bundled/keybindings.ts +339 -0
  1124. package/src/skills/bundled/loop.ts +92 -0
  1125. package/src/skills/bundled/loremIpsum.ts +282 -0
  1126. package/src/skills/bundled/remember.ts +82 -0
  1127. package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
  1128. package/src/skills/bundled/simplify.ts +69 -0
  1129. package/src/skills/bundled/skillify.ts +197 -0
  1130. package/src/skills/bundled/stuck.ts +79 -0
  1131. package/src/skills/bundled/updateConfig.ts +475 -0
  1132. package/src/skills/bundled/verify/SKILL.md +3 -0
  1133. package/src/skills/bundled/verify/examples/cli.md +3 -0
  1134. package/src/skills/bundled/verify/examples/server.md +3 -0
  1135. package/src/skills/bundled/verify.ts +30 -0
  1136. package/src/skills/bundled/verifyContent.ts +13 -0
  1137. package/src/skills/bundledSkills.ts +220 -0
  1138. package/src/skills/loadSkillsDir.ts +1086 -0
  1139. package/src/skills/mcpSkillBuilders.ts +44 -0
  1140. package/src/state/AppState.tsx +200 -0
  1141. package/src/state/AppStateStore.ts +572 -0
  1142. package/src/state/onChangeAppState.ts +181 -0
  1143. package/src/state/selectors.ts +76 -0
  1144. package/src/state/store.ts +34 -0
  1145. package/src/state/teammateViewHelpers.ts +141 -0
  1146. package/src/tasks/DreamTask/DreamTask.ts +157 -0
  1147. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  1148. package/src/tasks/InProcessTeammateTask/types.ts +121 -0
  1149. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  1150. package/src/tasks/LocalMainSessionTask.ts +479 -0
  1151. package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  1152. package/src/tasks/LocalShellTask/guards.ts +41 -0
  1153. package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
  1154. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  1155. package/src/tasks/pillLabel.ts +82 -0
  1156. package/src/tasks/stopTask.ts +100 -0
  1157. package/src/tasks/types.ts +46 -0
  1158. package/src/tasks.ts +39 -0
  1159. package/src/tools/AgentTool/AgentTool.tsx +1398 -0
  1160. package/src/tools/AgentTool/UI.tsx +872 -0
  1161. package/src/tools/AgentTool/agentColorManager.ts +66 -0
  1162. package/src/tools/AgentTool/agentDisplay.ts +104 -0
  1163. package/src/tools/AgentTool/agentMemory.ts +177 -0
  1164. package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1165. package/src/tools/AgentTool/agentToolUtils.ts +686 -0
  1166. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1167. package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1168. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1169. package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
  1170. package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1171. package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1172. package/src/tools/AgentTool/builtInAgents.ts +72 -0
  1173. package/src/tools/AgentTool/constants.ts +12 -0
  1174. package/src/tools/AgentTool/forkSubagent.ts +210 -0
  1175. package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
  1176. package/src/tools/AgentTool/prompt.ts +287 -0
  1177. package/src/tools/AgentTool/resumeAgent.ts +265 -0
  1178. package/src/tools/AgentTool/runAgent.ts +973 -0
  1179. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1180. package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
  1181. package/src/tools/BashTool/BashTool.tsx +1144 -0
  1182. package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1183. package/src/tools/BashTool/UI.tsx +185 -0
  1184. package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
  1185. package/src/tools/BashTool/bashPermissions.ts +2621 -0
  1186. package/src/tools/BashTool/bashSecurity.ts +2592 -0
  1187. package/src/tools/BashTool/commandSemantics.ts +140 -0
  1188. package/src/tools/BashTool/commentLabel.ts +13 -0
  1189. package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1190. package/src/tools/BashTool/modeValidation.ts +115 -0
  1191. package/src/tools/BashTool/pathValidation.ts +1303 -0
  1192. package/src/tools/BashTool/prompt.ts +369 -0
  1193. package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
  1194. package/src/tools/BashTool/sedEditParser.ts +322 -0
  1195. package/src/tools/BashTool/sedValidation.ts +684 -0
  1196. package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
  1197. package/src/tools/BashTool/toolName.ts +2 -0
  1198. package/src/tools/BashTool/utils.ts +223 -0
  1199. package/src/tools/BriefTool/BriefTool.ts +204 -0
  1200. package/src/tools/BriefTool/UI.tsx +101 -0
  1201. package/src/tools/BriefTool/attachments.ts +110 -0
  1202. package/src/tools/BriefTool/prompt.ts +22 -0
  1203. package/src/tools/BriefTool/upload.ts +174 -0
  1204. package/src/tools/ConfigTool/ConfigTool.ts +467 -0
  1205. package/src/tools/ConfigTool/UI.tsx +38 -0
  1206. package/src/tools/ConfigTool/constants.ts +1 -0
  1207. package/src/tools/ConfigTool/prompt.ts +93 -0
  1208. package/src/tools/ConfigTool/supportedSettings.ts +211 -0
  1209. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1210. package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
  1211. package/src/tools/EnterPlanModeTool/constants.ts +1 -0
  1212. package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
  1213. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1214. package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
  1215. package/src/tools/EnterWorktreeTool/constants.ts +1 -0
  1216. package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
  1217. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1218. package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
  1219. package/src/tools/ExitPlanModeTool/constants.ts +2 -0
  1220. package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
  1221. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1222. package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
  1223. package/src/tools/ExitWorktreeTool/constants.ts +1 -0
  1224. package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
  1225. package/src/tools/FileEditTool/FileEditTool.ts +628 -0
  1226. package/src/tools/FileEditTool/UI.tsx +289 -0
  1227. package/src/tools/FileEditTool/constants.ts +11 -0
  1228. package/src/tools/FileEditTool/prompt.ts +28 -0
  1229. package/src/tools/FileEditTool/types.ts +85 -0
  1230. package/src/tools/FileEditTool/utils.ts +775 -0
  1231. package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
  1232. package/src/tools/FileReadTool/UI.tsx +185 -0
  1233. package/src/tools/FileReadTool/imageProcessor.ts +94 -0
  1234. package/src/tools/FileReadTool/limits.ts +92 -0
  1235. package/src/tools/FileReadTool/prompt.ts +49 -0
  1236. package/src/tools/FileWriteTool/FileWriteTool.ts +437 -0
  1237. package/src/tools/FileWriteTool/UI.tsx +405 -0
  1238. package/src/tools/FileWriteTool/prompt.ts +18 -0
  1239. package/src/tools/GlobTool/GlobTool.ts +198 -0
  1240. package/src/tools/GlobTool/UI.tsx +63 -0
  1241. package/src/tools/GlobTool/prompt.ts +7 -0
  1242. package/src/tools/GrepTool/GrepTool.ts +577 -0
  1243. package/src/tools/GrepTool/UI.tsx +201 -0
  1244. package/src/tools/GrepTool/prompt.ts +18 -0
  1245. package/src/tools/LSPTool/LSPTool.ts +860 -0
  1246. package/src/tools/LSPTool/UI.tsx +228 -0
  1247. package/src/tools/LSPTool/formatters.ts +592 -0
  1248. package/src/tools/LSPTool/prompt.ts +21 -0
  1249. package/src/tools/LSPTool/schemas.ts +215 -0
  1250. package/src/tools/LSPTool/symbolContext.ts +90 -0
  1251. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1252. package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1253. package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1254. package/src/tools/MCPTool/MCPTool.ts +77 -0
  1255. package/src/tools/MCPTool/UI.tsx +403 -0
  1256. package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
  1257. package/src/tools/MCPTool/prompt.ts +3 -0
  1258. package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1259. package/src/tools/NotebookEditTool/NotebookEditTool.ts +493 -0
  1260. package/src/tools/NotebookEditTool/UI.tsx +93 -0
  1261. package/src/tools/NotebookEditTool/constants.ts +2 -0
  1262. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  1263. package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1264. package/src/tools/PowerShellTool/UI.tsx +131 -0
  1265. package/src/tools/PowerShellTool/clmTypes.ts +211 -0
  1266. package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
  1267. package/src/tools/PowerShellTool/commonParameters.ts +30 -0
  1268. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1269. package/src/tools/PowerShellTool/gitSafety.ts +176 -0
  1270. package/src/tools/PowerShellTool/modeValidation.ts +404 -0
  1271. package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
  1272. package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1273. package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1274. package/src/tools/PowerShellTool/prompt.ts +145 -0
  1275. package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1276. package/src/tools/PowerShellTool/toolName.ts +2 -0
  1277. package/src/tools/REPLTool/constants.ts +46 -0
  1278. package/src/tools/REPLTool/primitiveTools.ts +39 -0
  1279. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1280. package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1281. package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1282. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1283. package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
  1284. package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
  1285. package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1286. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1287. package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1288. package/src/tools/ScheduleCronTool/UI.tsx +60 -0
  1289. package/src/tools/ScheduleCronTool/prompt.ts +135 -0
  1290. package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1291. package/src/tools/SendMessageTool/UI.tsx +31 -0
  1292. package/src/tools/SendMessageTool/constants.ts +1 -0
  1293. package/src/tools/SendMessageTool/prompt.ts +49 -0
  1294. package/src/tools/SkillTool/SkillTool.ts +1108 -0
  1295. package/src/tools/SkillTool/UI.tsx +128 -0
  1296. package/src/tools/SkillTool/constants.ts +1 -0
  1297. package/src/tools/SkillTool/prompt.ts +241 -0
  1298. package/src/tools/SleepTool/prompt.ts +17 -0
  1299. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1300. package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1301. package/src/tools/TaskCreateTool/constants.ts +1 -0
  1302. package/src/tools/TaskCreateTool/prompt.ts +56 -0
  1303. package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1304. package/src/tools/TaskGetTool/constants.ts +1 -0
  1305. package/src/tools/TaskGetTool/prompt.ts +24 -0
  1306. package/src/tools/TaskListTool/TaskListTool.ts +116 -0
  1307. package/src/tools/TaskListTool/constants.ts +1 -0
  1308. package/src/tools/TaskListTool/prompt.ts +49 -0
  1309. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1310. package/src/tools/TaskOutputTool/constants.ts +1 -0
  1311. package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1312. package/src/tools/TaskStopTool/UI.tsx +41 -0
  1313. package/src/tools/TaskStopTool/prompt.ts +8 -0
  1314. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1315. package/src/tools/TaskUpdateTool/constants.ts +1 -0
  1316. package/src/tools/TaskUpdateTool/prompt.ts +77 -0
  1317. package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1318. package/src/tools/TeamCreateTool/UI.tsx +6 -0
  1319. package/src/tools/TeamCreateTool/constants.ts +1 -0
  1320. package/src/tools/TeamCreateTool/prompt.ts +113 -0
  1321. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1322. package/src/tools/TeamDeleteTool/UI.tsx +20 -0
  1323. package/src/tools/TeamDeleteTool/constants.ts +1 -0
  1324. package/src/tools/TeamDeleteTool/prompt.ts +16 -0
  1325. package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1326. package/src/tools/TodoWriteTool/constants.ts +1 -0
  1327. package/src/tools/TodoWriteTool/prompt.ts +184 -0
  1328. package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1329. package/src/tools/ToolSearchTool/constants.ts +1 -0
  1330. package/src/tools/ToolSearchTool/prompt.ts +121 -0
  1331. package/src/tools/WebFetchTool/UI.tsx +72 -0
  1332. package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1333. package/src/tools/WebFetchTool/preapproved.ts +166 -0
  1334. package/src/tools/WebFetchTool/prompt.ts +46 -0
  1335. package/src/tools/WebFetchTool/utils.ts +530 -0
  1336. package/src/tools/WebSearchTool/UI.tsx +101 -0
  1337. package/src/tools/WebSearchTool/WebSearchTool.ts +444 -0
  1338. package/src/tools/WebSearchTool/prompt.ts +34 -0
  1339. package/src/tools/WorkflowTool/constants.ts +2 -0
  1340. package/src/tools/shared/gitOperationTracking.ts +277 -0
  1341. package/src/tools/shared/spawnMultiAgent.ts +1026 -0
  1342. package/src/tools/testing/TestingPermissionTool.tsx +74 -0
  1343. package/src/tools/utils.ts +40 -0
  1344. package/src/tools.ts +392 -0
  1345. package/src/types/command.ts +216 -0
  1346. package/src/types/connectorText.ts +24 -0
  1347. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1348. package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
  1349. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1350. package/src/types/generated/google/protobuf/timestamp.ts +187 -0
  1351. package/src/types/hooks.ts +290 -0
  1352. package/src/types/ids.ts +44 -0
  1353. package/src/types/logs.ts +330 -0
  1354. package/src/types/permissions.ts +441 -0
  1355. package/src/types/plugin.ts +363 -0
  1356. package/src/types/textInputTypes.ts +387 -0
  1357. package/src/upstreamproxy/relay.ts +455 -0
  1358. package/src/upstreamproxy/upstreamproxy.ts +285 -0
  1359. package/src/utils/CircularBuffer.ts +84 -0
  1360. package/src/utils/Cursor.ts +1530 -0
  1361. package/src/utils/QueryGuard.ts +121 -0
  1362. package/src/utils/Shell.ts +474 -0
  1363. package/src/utils/ShellCommand.ts +465 -0
  1364. package/src/utils/abortController.ts +99 -0
  1365. package/src/utils/activityManager.ts +164 -0
  1366. package/src/utils/advisor.ts +145 -0
  1367. package/src/utils/agentContext.ts +178 -0
  1368. package/src/utils/agentId.ts +99 -0
  1369. package/src/utils/agentSwarmsEnabled.ts +44 -0
  1370. package/src/utils/agenticSessionSearch.ts +307 -0
  1371. package/src/utils/analyzeContext.ts +1382 -0
  1372. package/src/utils/ansiToPng.ts +334 -0
  1373. package/src/utils/ansiToSvg.ts +272 -0
  1374. package/src/utils/api.ts +718 -0
  1375. package/src/utils/apiPreconnect.ts +75 -0
  1376. package/src/utils/appVersion.ts +6 -0
  1377. package/src/utils/appleTerminalBackup.ts +124 -0
  1378. package/src/utils/argumentSubstitution.ts +145 -0
  1379. package/src/utils/array.ts +13 -0
  1380. package/src/utils/asciicast.ts +239 -0
  1381. package/src/utils/attachments.ts +3997 -0
  1382. package/src/utils/attribution.ts +393 -0
  1383. package/src/utils/auth.ts +2056 -0
  1384. package/src/utils/authFileDescriptor.ts +196 -0
  1385. package/src/utils/authPortable.ts +19 -0
  1386. package/src/utils/autoModeDenials.ts +26 -0
  1387. package/src/utils/autoRunIssue.tsx +122 -0
  1388. package/src/utils/autoUpdater.ts +567 -0
  1389. package/src/utils/aws.ts +74 -0
  1390. package/src/utils/awsAuthStatusManager.ts +81 -0
  1391. package/src/utils/background/remote/preconditions.ts +235 -0
  1392. package/src/utils/background/remote/remoteSession.ts +98 -0
  1393. package/src/utils/backgroundHousekeeping.ts +94 -0
  1394. package/src/utils/bash/ParsedCommand.ts +318 -0
  1395. package/src/utils/bash/ShellSnapshot.ts +582 -0
  1396. package/src/utils/bash/ast.ts +2679 -0
  1397. package/src/utils/bash/bashParser.ts +4436 -0
  1398. package/src/utils/bash/bashPipeCommand.ts +294 -0
  1399. package/src/utils/bash/commands.ts +1339 -0
  1400. package/src/utils/bash/heredoc.ts +733 -0
  1401. package/src/utils/bash/parser.ts +230 -0
  1402. package/src/utils/bash/prefix.ts +204 -0
  1403. package/src/utils/bash/registry.ts +53 -0
  1404. package/src/utils/bash/shellCompletion.ts +259 -0
  1405. package/src/utils/bash/shellPrefix.ts +28 -0
  1406. package/src/utils/bash/shellQuote.ts +304 -0
  1407. package/src/utils/bash/shellQuoting.ts +128 -0
  1408. package/src/utils/bash/specs/alias.ts +14 -0
  1409. package/src/utils/bash/specs/index.ts +18 -0
  1410. package/src/utils/bash/specs/nohup.ts +13 -0
  1411. package/src/utils/bash/specs/pyright.ts +91 -0
  1412. package/src/utils/bash/specs/sleep.ts +13 -0
  1413. package/src/utils/bash/specs/srun.ts +31 -0
  1414. package/src/utils/bash/specs/time.ts +13 -0
  1415. package/src/utils/bash/specs/timeout.ts +20 -0
  1416. package/src/utils/bash/treeSitterAnalysis.ts +506 -0
  1417. package/src/utils/betas.ts +440 -0
  1418. package/src/utils/billing.ts +78 -0
  1419. package/src/utils/binaryCheck.ts +53 -0
  1420. package/src/utils/browser.ts +68 -0
  1421. package/src/utils/bufferedWriter.ts +100 -0
  1422. package/src/utils/bundledMode.ts +22 -0
  1423. package/src/utils/caCerts.ts +115 -0
  1424. package/src/utils/caCertsConfig.ts +88 -0
  1425. package/src/utils/cachePaths.ts +38 -0
  1426. package/src/utils/classifierApprovals.ts +88 -0
  1427. package/src/utils/classifierApprovalsHook.ts +17 -0
  1428. package/src/utils/claudeCodeHints.ts +193 -0
  1429. package/src/utils/claudeDesktop.ts +152 -0
  1430. package/src/utils/claudeInChrome/browserTools.ts +19 -0
  1431. package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1432. package/src/utils/claudeInChrome/common.ts +540 -0
  1433. package/src/utils/claudeInChrome/mcpServer.ts +293 -0
  1434. package/src/utils/claudeInChrome/prompt.ts +83 -0
  1435. package/src/utils/claudeInChrome/setup.ts +400 -0
  1436. package/src/utils/claudeInChrome/setupPortable.ts +233 -0
  1437. package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
  1438. package/src/utils/claudemd.ts +1479 -0
  1439. package/src/utils/cleanup.ts +602 -0
  1440. package/src/utils/cleanupRegistry.ts +25 -0
  1441. package/src/utils/cliArgs.ts +60 -0
  1442. package/src/utils/cliHighlight.ts +54 -0
  1443. package/src/utils/cliSessionEnv.ts +42 -0
  1444. package/src/utils/codeIndexing.ts +206 -0
  1445. package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
  1446. package/src/utils/collapseHookSummaries.ts +59 -0
  1447. package/src/utils/collapseReadSearch.ts +1109 -0
  1448. package/src/utils/collapseTeammateShutdowns.ts +55 -0
  1449. package/src/utils/combinedAbortSignal.ts +47 -0
  1450. package/src/utils/commandLifecycle.ts +21 -0
  1451. package/src/utils/commitAttribution.ts +961 -0
  1452. package/src/utils/completionCache.ts +166 -0
  1453. package/src/utils/computerUse/appNames.ts +196 -0
  1454. package/src/utils/computerUse/cleanup.ts +86 -0
  1455. package/src/utils/computerUse/common.ts +61 -0
  1456. package/src/utils/computerUse/computerUseLock.ts +215 -0
  1457. package/src/utils/computerUse/drainRunLoop.ts +79 -0
  1458. package/src/utils/computerUse/escHotkey.ts +54 -0
  1459. package/src/utils/computerUse/executor.ts +658 -0
  1460. package/src/utils/computerUse/gates.ts +72 -0
  1461. package/src/utils/computerUse/hostAdapter.ts +69 -0
  1462. package/src/utils/computerUse/inputLoader.ts +30 -0
  1463. package/src/utils/computerUse/mcpServer.ts +106 -0
  1464. package/src/utils/computerUse/setup.ts +53 -0
  1465. package/src/utils/computerUse/swiftLoader.ts +23 -0
  1466. package/src/utils/computerUse/toolRendering.tsx +125 -0
  1467. package/src/utils/computerUse/wrapper.tsx +336 -0
  1468. package/src/utils/concurrentSessions.ts +204 -0
  1469. package/src/utils/config.ts +1817 -0
  1470. package/src/utils/configConstants.ts +21 -0
  1471. package/src/utils/contentArray.ts +51 -0
  1472. package/src/utils/context.ts +221 -0
  1473. package/src/utils/contextAnalysis.ts +272 -0
  1474. package/src/utils/contextSuggestions.ts +235 -0
  1475. package/src/utils/controlMessageCompat.ts +32 -0
  1476. package/src/utils/conversationRecovery.ts +597 -0
  1477. package/src/utils/cron.ts +308 -0
  1478. package/src/utils/cronJitterConfig.ts +75 -0
  1479. package/src/utils/cronScheduler.ts +565 -0
  1480. package/src/utils/cronTasks.ts +458 -0
  1481. package/src/utils/cronTasksLock.ts +195 -0
  1482. package/src/utils/crossProjectResume.ts +75 -0
  1483. package/src/utils/crypto.ts +13 -0
  1484. package/src/utils/cwd.ts +32 -0
  1485. package/src/utils/debug.ts +268 -0
  1486. package/src/utils/debugFilter.ts +157 -0
  1487. package/src/utils/deepLink/banner.ts +123 -0
  1488. package/src/utils/deepLink/parseDeepLink.ts +170 -0
  1489. package/src/utils/deepLink/protocolHandler.ts +136 -0
  1490. package/src/utils/deepLink/registerProtocol.ts +348 -0
  1491. package/src/utils/deepLink/terminalLauncher.ts +557 -0
  1492. package/src/utils/deepLink/terminalPreference.ts +54 -0
  1493. package/src/utils/desktopDeepLink.ts +236 -0
  1494. package/src/utils/detectRepository.ts +178 -0
  1495. package/src/utils/diagLogs.ts +94 -0
  1496. package/src/utils/diff.ts +177 -0
  1497. package/src/utils/directMemberMessage.ts +69 -0
  1498. package/src/utils/displayTags.ts +51 -0
  1499. package/src/utils/doctorContextWarnings.ts +265 -0
  1500. package/src/utils/doctorDiagnostic.ts +626 -0
  1501. package/src/utils/dxt/helpers.ts +88 -0
  1502. package/src/utils/dxt/zip.ts +226 -0
  1503. package/src/utils/earlyInput.ts +221 -0
  1504. package/src/utils/editor.ts +183 -0
  1505. package/src/utils/effort.ts +329 -0
  1506. package/src/utils/embeddedTools.ts +29 -0
  1507. package/src/utils/env.ts +347 -0
  1508. package/src/utils/envDynamic.ts +151 -0
  1509. package/src/utils/envUtils.ts +183 -0
  1510. package/src/utils/envValidation.ts +38 -0
  1511. package/src/utils/errorLogSink.ts +236 -0
  1512. package/src/utils/errors.ts +238 -0
  1513. package/src/utils/exampleCommands.ts +184 -0
  1514. package/src/utils/execFileNoThrow.ts +150 -0
  1515. package/src/utils/execFileNoThrowPortable.ts +89 -0
  1516. package/src/utils/execSyncWrapper.ts +38 -0
  1517. package/src/utils/exportRenderer.tsx +98 -0
  1518. package/src/utils/extraUsage.ts +23 -0
  1519. package/src/utils/fastMode.ts +532 -0
  1520. package/src/utils/file.ts +584 -0
  1521. package/src/utils/fileHistory.ts +1115 -0
  1522. package/src/utils/fileOperationAnalytics.ts +71 -0
  1523. package/src/utils/filePersistence/filePersistence.ts +287 -0
  1524. package/src/utils/filePersistence/outputsScanner.ts +126 -0
  1525. package/src/utils/fileRead.ts +102 -0
  1526. package/src/utils/fileReadCache.ts +96 -0
  1527. package/src/utils/fileStateCache.ts +142 -0
  1528. package/src/utils/findExecutable.ts +17 -0
  1529. package/src/utils/fingerprint.ts +77 -0
  1530. package/src/utils/forkedAgent.ts +689 -0
  1531. package/src/utils/format.ts +308 -0
  1532. package/src/utils/formatBriefTimestamp.ts +81 -0
  1533. package/src/utils/fpsTracker.ts +47 -0
  1534. package/src/utils/frontmatterParser.ts +370 -0
  1535. package/src/utils/fsOperations.ts +770 -0
  1536. package/src/utils/fullscreen.ts +202 -0
  1537. package/src/utils/generatedFiles.ts +136 -0
  1538. package/src/utils/generators.ts +88 -0
  1539. package/src/utils/genericProcessUtils.ts +184 -0
  1540. package/src/utils/getWorktreePaths.ts +70 -0
  1541. package/src/utils/getWorktreePathsPortable.ts +27 -0
  1542. package/src/utils/ghPrStatus.ts +106 -0
  1543. package/src/utils/git/gitConfigParser.ts +277 -0
  1544. package/src/utils/git/gitFilesystem.ts +699 -0
  1545. package/src/utils/git/gitignore.ts +99 -0
  1546. package/src/utils/git.ts +926 -0
  1547. package/src/utils/gitDiff.ts +532 -0
  1548. package/src/utils/gitSettings.ts +18 -0
  1549. package/src/utils/github/ghAuthStatus.ts +29 -0
  1550. package/src/utils/githubRepoPathMapping.ts +162 -0
  1551. package/src/utils/glob.ts +130 -0
  1552. package/src/utils/gracefulShutdown.ts +529 -0
  1553. package/src/utils/groupToolUses.ts +182 -0
  1554. package/src/utils/handlePromptSubmit.ts +610 -0
  1555. package/src/utils/hash.ts +46 -0
  1556. package/src/utils/headlessProfiler.ts +178 -0
  1557. package/src/utils/heapDumpService.ts +304 -0
  1558. package/src/utils/heatmap.ts +198 -0
  1559. package/src/utils/highlightMatch.tsx +28 -0
  1560. package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
  1561. package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
  1562. package/src/utils/hooks/execAgentHook.ts +339 -0
  1563. package/src/utils/hooks/execHttpHook.ts +242 -0
  1564. package/src/utils/hooks/execPromptHook.ts +211 -0
  1565. package/src/utils/hooks/fileChangedWatcher.ts +191 -0
  1566. package/src/utils/hooks/hookEvents.ts +192 -0
  1567. package/src/utils/hooks/hookHelpers.ts +83 -0
  1568. package/src/utils/hooks/hooksConfigManager.ts +400 -0
  1569. package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1570. package/src/utils/hooks/hooksSettings.ts +271 -0
  1571. package/src/utils/hooks/postSamplingHooks.ts +70 -0
  1572. package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1573. package/src/utils/hooks/registerSkillHooks.ts +64 -0
  1574. package/src/utils/hooks/sessionHooks.ts +447 -0
  1575. package/src/utils/hooks/skillImprovement.ts +267 -0
  1576. package/src/utils/hooks/ssrfGuard.ts +294 -0
  1577. package/src/utils/hooks.ts +5022 -0
  1578. package/src/utils/horizontalScroll.ts +137 -0
  1579. package/src/utils/http.ts +137 -0
  1580. package/src/utils/hyperlink.ts +39 -0
  1581. package/src/utils/iTermBackup.ts +73 -0
  1582. package/src/utils/ide.ts +1495 -0
  1583. package/src/utils/idePathConversion.ts +90 -0
  1584. package/src/utils/idleTimeout.ts +53 -0
  1585. package/src/utils/imagePaste.ts +416 -0
  1586. package/src/utils/imageResizer.ts +880 -0
  1587. package/src/utils/imageStore.ts +167 -0
  1588. package/src/utils/imageValidation.ts +104 -0
  1589. package/src/utils/immediateCommand.ts +15 -0
  1590. package/src/utils/inProcessTeammateHelpers.ts +102 -0
  1591. package/src/utils/ink.ts +26 -0
  1592. package/src/utils/intl.ts +94 -0
  1593. package/src/utils/jetbrains.ts +191 -0
  1594. package/src/utils/json.ts +277 -0
  1595. package/src/utils/jsonRead.ts +16 -0
  1596. package/src/utils/keyboardShortcuts.ts +14 -0
  1597. package/src/utils/lazySchema.ts +8 -0
  1598. package/src/utils/listSessionsImpl.ts +454 -0
  1599. package/src/utils/localInstaller.ts +162 -0
  1600. package/src/utils/lockfile.ts +43 -0
  1601. package/src/utils/log.ts +364 -0
  1602. package/src/utils/logoV2Utils.ts +351 -0
  1603. package/src/utils/mailbox.ts +73 -0
  1604. package/src/utils/managedEnv.ts +199 -0
  1605. package/src/utils/managedEnvConstants.ts +205 -0
  1606. package/src/utils/markdown.ts +381 -0
  1607. package/src/utils/markdownConfigLoader.ts +600 -0
  1608. package/src/utils/mcp/dateTimeParser.ts +121 -0
  1609. package/src/utils/mcp/elicitationValidation.ts +336 -0
  1610. package/src/utils/mcpInstructionsDelta.ts +130 -0
  1611. package/src/utils/mcpOutputStorage.ts +189 -0
  1612. package/src/utils/mcpValidation.ts +208 -0
  1613. package/src/utils/mcpWebSocketTransport.ts +200 -0
  1614. package/src/utils/memoize.ts +269 -0
  1615. package/src/utils/memory/types.ts +12 -0
  1616. package/src/utils/memory/versions.ts +8 -0
  1617. package/src/utils/memoryFileDetection.ts +289 -0
  1618. package/src/utils/messagePredicates.ts +8 -0
  1619. package/src/utils/messageQueueManager.ts +547 -0
  1620. package/src/utils/messages/mappers.ts +290 -0
  1621. package/src/utils/messages/systemInit.ts +97 -0
  1622. package/src/utils/messages.ts +5512 -0
  1623. package/src/utils/model/agent.ts +157 -0
  1624. package/src/utils/model/aliases.ts +25 -0
  1625. package/src/utils/model/antModels.ts +64 -0
  1626. package/src/utils/model/bedrock.ts +265 -0
  1627. package/src/utils/model/check1mAccess.ts +72 -0
  1628. package/src/utils/model/configs.ts +140 -0
  1629. package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1630. package/src/utils/model/deprecation.ts +104 -0
  1631. package/src/utils/model/model.ts +630 -0
  1632. package/src/utils/model/modelAllowlist.ts +170 -0
  1633. package/src/utils/model/modelCapabilities.ts +118 -0
  1634. package/src/utils/model/modelOptions.ts +651 -0
  1635. package/src/utils/model/modelStrings.ts +181 -0
  1636. package/src/utils/model/modelSupportOverrides.ts +50 -0
  1637. package/src/utils/model/providers.ts +50 -0
  1638. package/src/utils/model/validateModel.ts +173 -0
  1639. package/src/utils/modelCost.ts +231 -0
  1640. package/src/utils/modelSelection.ts +43 -0
  1641. package/src/utils/modifiers.ts +36 -0
  1642. package/src/utils/mtls.ts +179 -0
  1643. package/src/utils/nativeInstaller/download.ts +523 -0
  1644. package/src/utils/nativeInstaller/index.ts +18 -0
  1645. package/src/utils/nativeInstaller/installer.ts +1709 -0
  1646. package/src/utils/nativeInstaller/packageManagers.ts +336 -0
  1647. package/src/utils/nativeInstaller/pidLock.ts +433 -0
  1648. package/src/utils/notebook.ts +224 -0
  1649. package/src/utils/objectGroupBy.ts +18 -0
  1650. package/src/utils/pasteStore.ts +104 -0
  1651. package/src/utils/path.ts +155 -0
  1652. package/src/utils/pdf.ts +300 -0
  1653. package/src/utils/pdfUtils.ts +70 -0
  1654. package/src/utils/peerAddress.ts +21 -0
  1655. package/src/utils/permissions/PermissionMode.ts +166 -0
  1656. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1657. package/src/utils/permissions/PermissionResult.ts +35 -0
  1658. package/src/utils/permissions/PermissionRule.ts +40 -0
  1659. package/src/utils/permissions/PermissionUpdate.ts +389 -0
  1660. package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1661. package/src/utils/permissions/autoModeState.ts +39 -0
  1662. package/src/utils/permissions/bashClassifier.ts +61 -0
  1663. package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1664. package/src/utils/permissions/classifierDecision.ts +98 -0
  1665. package/src/utils/permissions/classifierShared.ts +39 -0
  1666. package/src/utils/permissions/dangerousPatterns.ts +80 -0
  1667. package/src/utils/permissions/denialTracking.ts +45 -0
  1668. package/src/utils/permissions/filesystem.ts +1778 -0
  1669. package/src/utils/permissions/getNextPermissionMode.ts +101 -0
  1670. package/src/utils/permissions/pathValidation.ts +485 -0
  1671. package/src/utils/permissions/permissionExplainer.ts +250 -0
  1672. package/src/utils/permissions/permissionRuleParser.ts +198 -0
  1673. package/src/utils/permissions/permissionSetup.ts +1544 -0
  1674. package/src/utils/permissions/permissions.ts +1486 -0
  1675. package/src/utils/permissions/permissionsLoader.ts +296 -0
  1676. package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
  1677. package/src/utils/permissions/shellRuleMatching.ts +228 -0
  1678. package/src/utils/permissions/yoloClassifier.ts +1495 -0
  1679. package/src/utils/planModeV2.ts +95 -0
  1680. package/src/utils/plans.ts +397 -0
  1681. package/src/utils/platform.ts +150 -0
  1682. package/src/utils/plugins/addDirPluginSettings.ts +71 -0
  1683. package/src/utils/plugins/cacheUtils.ts +196 -0
  1684. package/src/utils/plugins/dependencyResolver.ts +305 -0
  1685. package/src/utils/plugins/fetchTelemetry.ts +135 -0
  1686. package/src/utils/plugins/gitAvailability.ts +69 -0
  1687. package/src/utils/plugins/headlessPluginInstall.ts +174 -0
  1688. package/src/utils/plugins/hintRecommendation.ts +164 -0
  1689. package/src/utils/plugins/installCounts.ts +292 -0
  1690. package/src/utils/plugins/installedPluginsManager.ts +1268 -0
  1691. package/src/utils/plugins/loadPluginAgents.ts +348 -0
  1692. package/src/utils/plugins/loadPluginCommands.ts +946 -0
  1693. package/src/utils/plugins/loadPluginHooks.ts +287 -0
  1694. package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1695. package/src/utils/plugins/lspPluginIntegration.ts +387 -0
  1696. package/src/utils/plugins/lspRecommendation.ts +374 -0
  1697. package/src/utils/plugins/managedPlugins.ts +27 -0
  1698. package/src/utils/plugins/marketplaceHelpers.ts +592 -0
  1699. package/src/utils/plugins/marketplaceManager.ts +2643 -0
  1700. package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
  1701. package/src/utils/plugins/mcpbHandler.ts +968 -0
  1702. package/src/utils/plugins/officialMarketplace.ts +25 -0
  1703. package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1704. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1705. package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
  1706. package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
  1707. package/src/utils/plugins/performStartupChecks.tsx +70 -0
  1708. package/src/utils/plugins/pluginAutoupdate.ts +284 -0
  1709. package/src/utils/plugins/pluginBlocklist.ts +127 -0
  1710. package/src/utils/plugins/pluginDirectories.ts +178 -0
  1711. package/src/utils/plugins/pluginFlagging.ts +208 -0
  1712. package/src/utils/plugins/pluginIdentifier.ts +123 -0
  1713. package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1714. package/src/utils/plugins/pluginLoader.ts +3302 -0
  1715. package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
  1716. package/src/utils/plugins/pluginPolicy.ts +20 -0
  1717. package/src/utils/plugins/pluginStartupCheck.ts +341 -0
  1718. package/src/utils/plugins/pluginVersioning.ts +157 -0
  1719. package/src/utils/plugins/reconciler.ts +265 -0
  1720. package/src/utils/plugins/refresh.ts +215 -0
  1721. package/src/utils/plugins/schemas.ts +1681 -0
  1722. package/src/utils/plugins/validatePlugin.ts +903 -0
  1723. package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
  1724. package/src/utils/plugins/zipCache.ts +406 -0
  1725. package/src/utils/plugins/zipCacheAdapters.ts +164 -0
  1726. package/src/utils/powershell/dangerousCmdlets.ts +185 -0
  1727. package/src/utils/powershell/parser.ts +1804 -0
  1728. package/src/utils/powershell/staticPrefix.ts +316 -0
  1729. package/src/utils/preflightChecks.tsx +151 -0
  1730. package/src/utils/privacyLevel.ts +55 -0
  1731. package/src/utils/process.ts +68 -0
  1732. package/src/utils/processUserInput/processBashCommand.tsx +140 -0
  1733. package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
  1734. package/src/utils/processUserInput/processTextPrompt.ts +100 -0
  1735. package/src/utils/processUserInput/processUserInput.ts +605 -0
  1736. package/src/utils/profilerBase.ts +46 -0
  1737. package/src/utils/promptCategory.ts +49 -0
  1738. package/src/utils/promptEditor.ts +188 -0
  1739. package/src/utils/promptShellExecution.ts +183 -0
  1740. package/src/utils/providerModelCache.ts +30 -0
  1741. package/src/utils/providerSelection.ts +364 -0
  1742. package/src/utils/proxy.ts +426 -0
  1743. package/src/utils/queryContext.ts +179 -0
  1744. package/src/utils/queryHelpers.ts +552 -0
  1745. package/src/utils/queryProfiler.ts +301 -0
  1746. package/src/utils/queueProcessor.ts +95 -0
  1747. package/src/utils/readEditContext.ts +227 -0
  1748. package/src/utils/readFileInRange.ts +383 -0
  1749. package/src/utils/releaseNotes.ts +361 -0
  1750. package/src/utils/renderOptions.ts +77 -0
  1751. package/src/utils/ripgrep.ts +679 -0
  1752. package/src/utils/sandbox/sandbox-adapter.ts +985 -0
  1753. package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1754. package/src/utils/sanitization.ts +91 -0
  1755. package/src/utils/screenshotClipboard.ts +121 -0
  1756. package/src/utils/sdkEventQueue.ts +134 -0
  1757. package/src/utils/secureStorage/fallbackStorage.ts +70 -0
  1758. package/src/utils/secureStorage/index.ts +17 -0
  1759. package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
  1760. package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1761. package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1762. package/src/utils/secureStorage/plainTextStorage.ts +84 -0
  1763. package/src/utils/semanticBoolean.ts +29 -0
  1764. package/src/utils/semanticNumber.ts +36 -0
  1765. package/src/utils/semver.ts +59 -0
  1766. package/src/utils/sequential.ts +56 -0
  1767. package/src/utils/sessionActivity.ts +133 -0
  1768. package/src/utils/sessionEnvVars.ts +22 -0
  1769. package/src/utils/sessionEnvironment.ts +166 -0
  1770. package/src/utils/sessionFileAccessHooks.ts +250 -0
  1771. package/src/utils/sessionIngressAuth.ts +140 -0
  1772. package/src/utils/sessionRestore.ts +551 -0
  1773. package/src/utils/sessionStart.ts +232 -0
  1774. package/src/utils/sessionState.ts +150 -0
  1775. package/src/utils/sessionStorage.ts +5106 -0
  1776. package/src/utils/sessionStoragePortable.ts +793 -0
  1777. package/src/utils/sessionTitle.ts +129 -0
  1778. package/src/utils/sessionUrl.ts +64 -0
  1779. package/src/utils/set.ts +53 -0
  1780. package/src/utils/settings/allErrors.ts +32 -0
  1781. package/src/utils/settings/applySettingsChange.ts +92 -0
  1782. package/src/utils/settings/changeDetector.ts +488 -0
  1783. package/src/utils/settings/constants.ts +202 -0
  1784. package/src/utils/settings/internalWrites.ts +37 -0
  1785. package/src/utils/settings/managedPath.ts +34 -0
  1786. package/src/utils/settings/mdm/constants.ts +81 -0
  1787. package/src/utils/settings/mdm/rawRead.ts +130 -0
  1788. package/src/utils/settings/mdm/settings.ts +316 -0
  1789. package/src/utils/settings/permissionValidation.ts +262 -0
  1790. package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
  1791. package/src/utils/settings/schemaOutput.ts +8 -0
  1792. package/src/utils/settings/settings.ts +1015 -0
  1793. package/src/utils/settings/settingsCache.ts +80 -0
  1794. package/src/utils/settings/toolValidationConfig.ts +103 -0
  1795. package/src/utils/settings/types.ts +1171 -0
  1796. package/src/utils/settings/validateEditTool.ts +45 -0
  1797. package/src/utils/settings/validation.ts +265 -0
  1798. package/src/utils/settings/validationTips.ts +164 -0
  1799. package/src/utils/shell/bashProvider.ts +255 -0
  1800. package/src/utils/shell/outputLimits.ts +14 -0
  1801. package/src/utils/shell/powershellDetection.ts +107 -0
  1802. package/src/utils/shell/powershellProvider.ts +123 -0
  1803. package/src/utils/shell/prefix.ts +367 -0
  1804. package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1805. package/src/utils/shell/resolveDefaultShell.ts +14 -0
  1806. package/src/utils/shell/shellProvider.ts +33 -0
  1807. package/src/utils/shell/shellToolUtils.ts +22 -0
  1808. package/src/utils/shell/specPrefix.ts +241 -0
  1809. package/src/utils/shellConfig.ts +167 -0
  1810. package/src/utils/sideQuery.ts +223 -0
  1811. package/src/utils/sideQuestion.ts +155 -0
  1812. package/src/utils/signal.ts +43 -0
  1813. package/src/utils/sinks.ts +16 -0
  1814. package/src/utils/skills/skillChangeDetector.ts +311 -0
  1815. package/src/utils/slashCommandParsing.ts +60 -0
  1816. package/src/utils/sleep.ts +84 -0
  1817. package/src/utils/sliceAnsi.ts +91 -0
  1818. package/src/utils/slowOperations.ts +286 -0
  1819. package/src/utils/standaloneAgent.ts +23 -0
  1820. package/src/utils/startupProfiler.ts +194 -0
  1821. package/src/utils/staticRender.tsx +116 -0
  1822. package/src/utils/stats.ts +1061 -0
  1823. package/src/utils/statsCache.ts +434 -0
  1824. package/src/utils/status.tsx +372 -0
  1825. package/src/utils/statusNoticeDefinitions.tsx +198 -0
  1826. package/src/utils/statusNoticeHelpers.ts +20 -0
  1827. package/src/utils/stream.ts +76 -0
  1828. package/src/utils/streamJsonStdoutGuard.ts +123 -0
  1829. package/src/utils/streamlinedTransform.ts +201 -0
  1830. package/src/utils/stringUtils.ts +235 -0
  1831. package/src/utils/subprocessEnv.ts +99 -0
  1832. package/src/utils/suggestions/commandSuggestions.ts +567 -0
  1833. package/src/utils/suggestions/directoryCompletion.ts +263 -0
  1834. package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1835. package/src/utils/suggestions/skillUsageTracking.ts +55 -0
  1836. package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1837. package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
  1838. package/src/utils/swarm/backends/ITermBackend.ts +370 -0
  1839. package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
  1840. package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1841. package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
  1842. package/src/utils/swarm/backends/detection.ts +128 -0
  1843. package/src/utils/swarm/backends/it2Setup.ts +245 -0
  1844. package/src/utils/swarm/backends/registry.ts +464 -0
  1845. package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1846. package/src/utils/swarm/backends/types.ts +311 -0
  1847. package/src/utils/swarm/constants.ts +33 -0
  1848. package/src/utils/swarm/inProcessRunner.ts +1552 -0
  1849. package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
  1850. package/src/utils/swarm/permissionSync.ts +928 -0
  1851. package/src/utils/swarm/reconnection.ts +119 -0
  1852. package/src/utils/swarm/spawnInProcess.ts +328 -0
  1853. package/src/utils/swarm/spawnUtils.ts +168 -0
  1854. package/src/utils/swarm/teamHelpers.ts +683 -0
  1855. package/src/utils/swarm/teammateInit.ts +129 -0
  1856. package/src/utils/swarm/teammateLayoutManager.ts +107 -0
  1857. package/src/utils/swarm/teammateModel.ts +10 -0
  1858. package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
  1859. package/src/utils/systemDirectories.ts +74 -0
  1860. package/src/utils/systemPrompt.ts +123 -0
  1861. package/src/utils/systemPromptType.ts +14 -0
  1862. package/src/utils/systemTheme.ts +119 -0
  1863. package/src/utils/taggedId.ts +54 -0
  1864. package/src/utils/task/TaskOutput.ts +390 -0
  1865. package/src/utils/task/diskOutput.ts +451 -0
  1866. package/src/utils/task/framework.ts +308 -0
  1867. package/src/utils/task/outputFormatting.ts +38 -0
  1868. package/src/utils/task/sdkProgress.ts +36 -0
  1869. package/src/utils/tasks.ts +862 -0
  1870. package/src/utils/teamDiscovery.ts +81 -0
  1871. package/src/utils/teamMemoryOps.ts +88 -0
  1872. package/src/utils/teammate.ts +292 -0
  1873. package/src/utils/teammateContext.ts +96 -0
  1874. package/src/utils/teammateMailbox.ts +1183 -0
  1875. package/src/utils/telemetry/betaSessionTracing.ts +491 -0
  1876. package/src/utils/telemetry/bigqueryExporter.ts +252 -0
  1877. package/src/utils/telemetry/events.ts +75 -0
  1878. package/src/utils/telemetry/instrumentation.ts +826 -0
  1879. package/src/utils/telemetry/logger.ts +26 -0
  1880. package/src/utils/telemetry/perfettoTracing.ts +1120 -0
  1881. package/src/utils/telemetry/pluginTelemetry.ts +289 -0
  1882. package/src/utils/telemetry/sessionTracing.ts +927 -0
  1883. package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
  1884. package/src/utils/telemetryAttributes.ts +72 -0
  1885. package/src/utils/teleport/api.ts +466 -0
  1886. package/src/utils/teleport/environmentSelection.ts +77 -0
  1887. package/src/utils/teleport/environments.ts +120 -0
  1888. package/src/utils/teleport/gitBundle.ts +292 -0
  1889. package/src/utils/teleport.tsx +1226 -0
  1890. package/src/utils/tempfile.ts +31 -0
  1891. package/src/utils/terminal.ts +131 -0
  1892. package/src/utils/terminalPanel.ts +191 -0
  1893. package/src/utils/textHighlighting.ts +166 -0
  1894. package/src/utils/theme.ts +639 -0
  1895. package/src/utils/thinking.ts +170 -0
  1896. package/src/utils/timeouts.ts +39 -0
  1897. package/src/utils/tmuxSocket.ts +427 -0
  1898. package/src/utils/todo/types.ts +18 -0
  1899. package/src/utils/tokenBudget.ts +73 -0
  1900. package/src/utils/tokens.ts +261 -0
  1901. package/src/utils/toolErrors.ts +132 -0
  1902. package/src/utils/toolPool.ts +79 -0
  1903. package/src/utils/toolResultStorage.ts +1040 -0
  1904. package/src/utils/toolSchemaCache.ts +26 -0
  1905. package/src/utils/toolSearch.ts +756 -0
  1906. package/src/utils/transcriptSearch.ts +202 -0
  1907. package/src/utils/treeify.ts +170 -0
  1908. package/src/utils/truncate.ts +179 -0
  1909. package/src/utils/ultraplan/ccrSession.ts +349 -0
  1910. package/src/utils/ultraplan/keyword.ts +127 -0
  1911. package/src/utils/ultraplan/prompt.txt +12 -0
  1912. package/src/utils/unaryLogging.ts +39 -0
  1913. package/src/utils/undercover.ts +89 -0
  1914. package/src/utils/user.ts +195 -0
  1915. package/src/utils/userAgent.ts +11 -0
  1916. package/src/utils/userPromptKeywords.ts +27 -0
  1917. package/src/utils/uuid.ts +27 -0
  1918. package/src/utils/warningHandler.ts +121 -0
  1919. package/src/utils/webSearchEnabled.ts +16 -0
  1920. package/src/utils/which.ts +82 -0
  1921. package/src/utils/windowsPaths.ts +173 -0
  1922. package/src/utils/withResolvers.ts +13 -0
  1923. package/src/utils/words.ts +800 -0
  1924. package/src/utils/workloadContext.ts +57 -0
  1925. package/src/utils/worktree.ts +1519 -0
  1926. package/src/utils/worktreeModeEnabled.ts +11 -0
  1927. package/src/utils/xdg.ts +65 -0
  1928. package/src/utils/xml.ts +16 -0
  1929. package/src/utils/yaml.ts +15 -0
  1930. package/src/utils/zodToJsonSchema.ts +23 -0
  1931. package/src/vim/motions.ts +82 -0
  1932. package/src/vim/operators.ts +556 -0
  1933. package/src/vim/textObjects.ts +186 -0
  1934. package/src/vim/transitions.ts +490 -0
  1935. package/src/vim/types.ts +199 -0
  1936. package/src/voice/voiceModeEnabled.ts +54 -0
@@ -0,0 +1,1778 @@
1
+ import { getAppVersion } from '../appVersion.js'
2
+ import { feature } from 'bun:bundle'
3
+ import { randomBytes } from 'crypto'
4
+ import ignore from 'ignore'
5
+ import memoize from 'lodash-es/memoize.js'
6
+ import { homedir, tmpdir } from 'os'
7
+ import { join, normalize, posix, sep } from 'path'
8
+ import { hasAutoMemPathOverride, isAutoMemPath } from 'src/memdir/paths.js'
9
+ import { isAgentMemoryPath } from 'src/tools/AgentTool/agentMemory.js'
10
+ import {
11
+ CLAUDE_FOLDER_PERMISSION_PATTERN,
12
+ FILE_EDIT_TOOL_NAME,
13
+ GLOBAL_CLAUDE_FOLDER_PERMISSION_PATTERN,
14
+ } from 'src/tools/FileEditTool/constants.js'
15
+ import type { z } from 'zod/v4'
16
+ import { getOriginalCwd, getSessionId } from '../../bootstrap/state.js'
17
+ import { checkStatsigFeatureGate_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
18
+ import type { AnyObject, Tool, ToolPermissionContext } from '../../Tool.js'
19
+ import { FILE_READ_TOOL_NAME } from '../../tools/FileReadTool/prompt.js'
20
+ import { getCwd } from '../cwd.js'
21
+ import { getClaudeConfigHomeDir } from '../envUtils.js'
22
+ import {
23
+ getFsImplementation,
24
+ getPathsForPermissionCheck,
25
+ } from '../fsOperations.js'
26
+ import {
27
+ containsPathTraversal,
28
+ expandPath,
29
+ getDirectoryForPath,
30
+ sanitizePath,
31
+ } from '../path.js'
32
+ import { getPlanSlug, getPlansDirectory } from '../plans.js'
33
+ import { getPlatform } from '../platform.js'
34
+ import { getProjectDir } from '../sessionStorage.js'
35
+ import { SETTING_SOURCES } from '../settings/constants.js'
36
+ import {
37
+ getSettingsFilePathForSource,
38
+ getSettingsRootPathForSource,
39
+ } from '../settings/settings.js'
40
+ import { containsVulnerableUncPath } from '../shell/readOnlyCommandValidation.js'
41
+ import { getToolResultsDir } from '../toolResultStorage.js'
42
+ import { windowsPathToPosixPath } from '../windowsPaths.js'
43
+ import type {
44
+ PermissionDecision,
45
+ PermissionResult,
46
+ } from './PermissionResult.js'
47
+ import type { PermissionRule, PermissionRuleSource } from './PermissionRule.js'
48
+ import { createReadRuleSuggestion } from './PermissionUpdate.js'
49
+ import type { PermissionUpdate } from './PermissionUpdateSchema.js'
50
+ import { getRuleByContentsForToolName } from './permissions.js'
51
+
52
+ declare const MACRO: { VERSION: string }
53
+
54
+ /**
55
+ * Dangerous files that should be protected from auto-editing.
56
+ * These files can be used for code execution or data exfiltration.
57
+ */
58
+ export const DANGEROUS_FILES = [
59
+ '.gitconfig',
60
+ '.gitmodules',
61
+ '.bashrc',
62
+ '.bash_profile',
63
+ '.zshrc',
64
+ '.zprofile',
65
+ '.profile',
66
+ '.ripgreprc',
67
+ '.mcp.json',
68
+ '.claude.json',
69
+ ] as const
70
+
71
+ /**
72
+ * Dangerous directories that should be protected from auto-editing.
73
+ * These directories contain sensitive configuration or executable files.
74
+ */
75
+ export const DANGEROUS_DIRECTORIES = [
76
+ '.git',
77
+ '.vscode',
78
+ '.idea',
79
+ '.claude',
80
+ ] as const
81
+
82
+ /**
83
+ * Normalizes a path for case-insensitive comparison.
84
+ * This prevents bypassing security checks using mixed-case paths on case-insensitive
85
+ * filesystems (macOS/Windows) like `.cLauDe/Settings.locaL.json`.
86
+ *
87
+ * We always normalize to lowercase regardless of platform for consistent security.
88
+ * @param path The path to normalize
89
+ * @returns The lowercase path for safe comparison
90
+ */
91
+ export function normalizeCaseForComparison(path: string): string {
92
+ return path.toLowerCase()
93
+ }
94
+
95
+ /**
96
+ * If filePath is inside a .claude/skills/{name}/ directory (project or global),
97
+ * return the skill name and a session-allow pattern scoped to just that skill.
98
+ * Used to offer a narrower "allow edits to this skill only" option in the
99
+ * permission dialog and SDK suggestions, so iterating on one skill doesn't
100
+ * require granting session access to all of .claude/ (settings.json, hooks/, etc.).
101
+ */
102
+ export function getClaudeSkillScope(
103
+ filePath: string,
104
+ ): { skillName: string; pattern: string } | null {
105
+ const absolutePath = expandPath(filePath)
106
+ const absolutePathLower = normalizeCaseForComparison(absolutePath)
107
+
108
+ const bases = [
109
+ {
110
+ dir: expandPath(join(getOriginalCwd(), '.claude', 'skills')),
111
+ prefix: '/.claude/skills/',
112
+ },
113
+ {
114
+ dir: expandPath(join(homedir(), '.claude', 'skills')),
115
+ prefix: '~/.claude/skills/',
116
+ },
117
+ ]
118
+
119
+ for (const { dir, prefix } of bases) {
120
+ const dirLower = normalizeCaseForComparison(dir)
121
+ // Try both path separators (Windows paths may not be normalized to /)
122
+ for (const s of [sep, '/']) {
123
+ if (absolutePathLower.startsWith(dirLower + s.toLowerCase())) {
124
+ // Match on lowercase, but slice the ORIGINAL path so the skill name
125
+ // preserves case (pattern matching downstream is case-sensitive)
126
+ const rest = absolutePath.slice(dir.length + s.length)
127
+ const slash = rest.indexOf('/')
128
+ const bslash = sep === '\\' ? rest.indexOf('\\') : -1
129
+ const cut =
130
+ slash === -1
131
+ ? bslash
132
+ : bslash === -1
133
+ ? slash
134
+ : Math.min(slash, bslash)
135
+ // Require a separator: file must be INSIDE the skill dir, not a
136
+ // file directly under skills/ (no skill scope for that)
137
+ if (cut <= 0) return null
138
+ const skillName = rest.slice(0, cut)
139
+ // Reject traversal and empty. Use includes('..') not === '..' to
140
+ // match step 1.6's ruleContent.includes('..') guard: a skillName like
141
+ // 'v2..beta' would otherwise produce a suggestion step 1.7 emits but
142
+ // step 1.6 always rejects (dead suggestion, infinite re-prompt).
143
+ if (!skillName || skillName === '.' || skillName.includes('..')) {
144
+ return null
145
+ }
146
+ // Reject glob metacharacters. skillName is interpolated into a
147
+ // gitignore pattern consumed by ignore().add() in matchingRuleForInput
148
+ // at step 1.6. A directory literally named '*' (valid on POSIX) would
149
+ // produce '/.claude/skills/*/**' which matches ALL skills. Return null
150
+ // to fall through to generateSuggestions() instead.
151
+ if (/[*?[\]]/.test(skillName)) return null
152
+ return { skillName, pattern: prefix + skillName + '/**' }
153
+ }
154
+ }
155
+ }
156
+
157
+ return null
158
+ }
159
+
160
+ // Always use / as the path separator per gitignore spec
161
+ // https://git-scm.com/docs/gitignore
162
+ const DIR_SEP = posix.sep
163
+
164
+ /**
165
+ * Cross-platform relative path calculation that returns POSIX-style paths.
166
+ * Handles Windows path conversion internally.
167
+ * @param from The base path
168
+ * @param to The target path
169
+ * @returns A POSIX-style relative path
170
+ */
171
+ export function relativePath(from: string, to: string): string {
172
+ if (getPlatform() === 'windows') {
173
+ // Convert Windows paths to POSIX for consistent comparison
174
+ const posixFrom = windowsPathToPosixPath(from)
175
+ const posixTo = windowsPathToPosixPath(to)
176
+ return posix.relative(posixFrom, posixTo)
177
+ }
178
+ // Use POSIX paths directly
179
+ return posix.relative(from, to)
180
+ }
181
+
182
+ /**
183
+ * Converts a path to POSIX format for pattern matching.
184
+ * Handles Windows path conversion internally.
185
+ * @param path The path to convert
186
+ * @returns A POSIX-style path
187
+ */
188
+ export function toPosixPath(path: string): string {
189
+ if (getPlatform() === 'windows') {
190
+ return windowsPathToPosixPath(path)
191
+ }
192
+ return path
193
+ }
194
+
195
+ function getSettingsPaths(): string[] {
196
+ return SETTING_SOURCES.map(source =>
197
+ getSettingsFilePathForSource(source),
198
+ ).filter(path => path !== undefined)
199
+ }
200
+
201
+ export function isClaudeSettingsPath(filePath: string): boolean {
202
+ // SECURITY: Normalize path structure first to prevent bypass via redundant ./
203
+ // sequences like `./.claude/./settings.json` which would evade the endsWith() check
204
+ const expandedPath = expandPath(filePath)
205
+
206
+ // Normalize for case-insensitive comparison to prevent bypassing security
207
+ // with paths like .cLauDe/Settings.locaL.json
208
+ const normalizedPath = normalizeCaseForComparison(expandedPath)
209
+
210
+ // Use platform separator so endsWith checks work on both Unix (/) and Windows (\)
211
+ if (
212
+ normalizedPath.endsWith(`${sep}.claude${sep}settings.json`) ||
213
+ normalizedPath.endsWith(`${sep}.claude${sep}settings.local.json`)
214
+ ) {
215
+ // Include .claude/settings.json even for other projects
216
+ return true
217
+ }
218
+ // Check for current project's settings files (including managed settings and CLI args)
219
+ // Both paths are now absolute and normalized for consistent comparison
220
+ return getSettingsPaths().some(
221
+ settingsPath => normalizeCaseForComparison(settingsPath) === normalizedPath,
222
+ )
223
+ }
224
+
225
+ // Always ask when Claude Code tries to edit its own config files
226
+ function isClaudeConfigFilePath(filePath: string): boolean {
227
+ if (isClaudeSettingsPath(filePath)) {
228
+ return true
229
+ }
230
+
231
+ // Check if file is within .claude/commands or .claude/agents directories
232
+ // using proper path segment validation (not string matching with includes())
233
+ // pathInWorkingPath now handles case-insensitive comparison to prevent bypasses
234
+ const commandsDir = join(getOriginalCwd(), '.claude', 'commands')
235
+ const agentsDir = join(getOriginalCwd(), '.claude', 'agents')
236
+ const skillsDir = join(getOriginalCwd(), '.claude', 'skills')
237
+
238
+ return (
239
+ pathInWorkingPath(filePath, commandsDir) ||
240
+ pathInWorkingPath(filePath, agentsDir) ||
241
+ pathInWorkingPath(filePath, skillsDir)
242
+ )
243
+ }
244
+
245
+ // Check if file is the plan file for the current session
246
+ function isSessionPlanFile(absolutePath: string): boolean {
247
+ // Check if path is a plan file for this session (main or agent-specific)
248
+ // Main plan file: {plansDir}/{planSlug}.md
249
+ // Agent plan file: {plansDir}/{planSlug}-agent-{agentId}.md
250
+ const expectedPrefix = join(getPlansDirectory(), getPlanSlug())
251
+ // SECURITY: Normalize to prevent path traversal bypasses via .. segments
252
+ const normalizedPath = normalize(absolutePath)
253
+ return (
254
+ normalizedPath.startsWith(expectedPrefix) && normalizedPath.endsWith('.md')
255
+ )
256
+ }
257
+
258
+ /**
259
+ * Returns the session memory directory path for the current session with trailing separator.
260
+ * Path format: {projectDir}/{sessionId}/session-memory/
261
+ */
262
+ export function getSessionMemoryDir(): string {
263
+ return join(getProjectDir(getCwd()), getSessionId(), 'session-memory') + sep
264
+ }
265
+
266
+ /**
267
+ * Returns the session memory file path for the current session.
268
+ * Path format: {projectDir}/{sessionId}/session-memory/summary.md
269
+ */
270
+ export function getSessionMemoryPath(): string {
271
+ return join(getSessionMemoryDir(), 'summary.md')
272
+ }
273
+
274
+ // Check if file is within the session memory directory
275
+ function isSessionMemoryPath(absolutePath: string): boolean {
276
+ // SECURITY: Normalize to prevent path traversal bypasses via .. segments
277
+ const normalizedPath = normalize(absolutePath)
278
+ return normalizedPath.startsWith(getSessionMemoryDir())
279
+ }
280
+
281
+ /**
282
+ * Check if file is within the current project's directory.
283
+ * Path format: ~/.claude/projects/{sanitized-cwd}/...
284
+ */
285
+ function isProjectDirPath(absolutePath: string): boolean {
286
+ const projectDir = getProjectDir(getCwd())
287
+ // SECURITY: Normalize to prevent path traversal bypasses via .. segments
288
+ const normalizedPath = normalize(absolutePath)
289
+ return (
290
+ normalizedPath === projectDir || normalizedPath.startsWith(projectDir + sep)
291
+ )
292
+ }
293
+
294
+ /**
295
+ * Checks if the scratchpad directory feature is enabled.
296
+ * The scratchpad is a per-session directory for Claude to write temporary files.
297
+ * Controlled by the tengu_scratch Statsig gate.
298
+ */
299
+ export function isScratchpadEnabled(): boolean {
300
+ return checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_scratch')
301
+ }
302
+
303
+ /**
304
+ * Returns the user-specific Claude temp directory name.
305
+ * On Unix: 'claude-{uid}' to prevent multi-user permission conflicts
306
+ * On Windows: 'claude' (tmpdir() is already per-user)
307
+ */
308
+ export function getClaudeTempDirName(): string {
309
+ if (getPlatform() === 'windows') {
310
+ return 'claude'
311
+ }
312
+ // Use UID to create per-user directories, preventing permission conflicts
313
+ // when multiple users share the same /tmp directory
314
+ const uid = process.getuid?.() ?? 0
315
+ return `claude-${uid}`
316
+ }
317
+
318
+ /**
319
+ * Returns the Claude temp directory path with symlinks resolved.
320
+ * Uses TMPDIR env var if set, otherwise:
321
+ * - On Unix: /tmp/claude-{uid}/ (resolved to /private/tmp/claude-{uid}/ on macOS)
322
+ * - On Windows: {tmpdir}/claude/ (e.g., C:\Users\{user}\AppData\Local\Temp\claude\)
323
+ * This is a per-user temporary directory used by Claude Code for all temp files.
324
+ *
325
+ * NOTE: We resolve symlinks to ensure this path matches the resolved paths used
326
+ * in permission checks. On macOS, /tmp is a symlink to /private/tmp, so without
327
+ * resolution, paths like /tmp/claude-{uid}/... wouldn't match /private/tmp/claude-{uid}/...
328
+ */
329
+ // Memoized: called per-tool from permission checks (yoloClassifier, sandbox-adapter)
330
+ // and per-turn from BashTool prompt. Inputs (CLAUDE_CODE_TMPDIR env + platform) are
331
+ // fixed at startup, and the realpath of the system tmp dir does not change mid-session.
332
+ export const getClaudeTempDir = memoize(function getClaudeTempDir(): string {
333
+ const baseTmpDir =
334
+ process.env.CLAUDE_CODE_TMPDIR ||
335
+ (getPlatform() === 'windows' ? tmpdir() : '/tmp')
336
+
337
+ // Resolve symlinks in the base temp directory (e.g., /tmp -> /private/tmp on macOS)
338
+ // This ensures the path matches resolved paths in permission checks
339
+ const fs = getFsImplementation()
340
+ let resolvedBaseTmpDir = baseTmpDir
341
+ try {
342
+ resolvedBaseTmpDir = fs.realpathSync(baseTmpDir)
343
+ } catch {
344
+ // If resolution fails, use the original path
345
+ }
346
+
347
+ return join(resolvedBaseTmpDir, getClaudeTempDirName()) + sep
348
+ })
349
+
350
+ /**
351
+ * Root for bundled-skill file extraction (see bundledSkills.ts).
352
+ *
353
+ * SECURITY: The per-process random nonce is the load-bearing defense here.
354
+ * Every other path component (uid, VERSION, skill name, file keys) is public
355
+ * knowledge, so without it a local attacker can pre-create the tree on a
356
+ * shared /tmp — sticky bit prevents deletion, not creation — and either
357
+ * symlink an intermediate directory (O_NOFOLLOW only checks the final
358
+ * component) or own a parent dir and swap file contents post-write for prompt
359
+ * injection via the read allowlist. diskOutput.ts gets the same property from
360
+ * the session-ID UUID in its path.
361
+ *
362
+ * Memoized so the extraction writes and the permission check agree on the
363
+ * path for the life of the process. Version-scoped so stale extractions from
364
+ * other binaries don't fall under the allowlist.
365
+ */
366
+ export const getBundledSkillsRoot = memoize(
367
+ function getBundledSkillsRoot(): string {
368
+ const nonce = randomBytes(16).toString('hex')
369
+ return join(getClaudeTempDir(), 'bundled-skills', getAppVersion(), nonce)
370
+ },
371
+ )
372
+
373
+ /**
374
+ * Returns the project temp directory path with trailing separator.
375
+ * Path format: /tmp/claude-{uid}/{sanitized-cwd}/
376
+ */
377
+ export function getProjectTempDir(): string {
378
+ return join(getClaudeTempDir(), sanitizePath(getOriginalCwd())) + sep
379
+ }
380
+
381
+ /**
382
+ * Returns the scratchpad directory path for the current session.
383
+ * Path format: /tmp/claude-{uid}/{sanitized-cwd}/{sessionId}/scratchpad/
384
+ */
385
+ export function getScratchpadDir(): string {
386
+ return join(getProjectTempDir(), getSessionId(), 'scratchpad')
387
+ }
388
+
389
+ /**
390
+ * Ensures the scratchpad directory exists for the current session.
391
+ * Creates the directory with secure permissions (0o700) if it doesn't exist.
392
+ * Returns the path to the scratchpad directory.
393
+ * @throws If scratchpad feature is not enabled
394
+ */
395
+ export async function ensureScratchpadDir(): Promise<string> {
396
+ if (!isScratchpadEnabled()) {
397
+ throw new Error('Scratchpad directory feature is not enabled')
398
+ }
399
+
400
+ const fs = getFsImplementation()
401
+ const scratchpadDir = getScratchpadDir()
402
+
403
+ // Create directory recursively with secure permissions (owner-only access)
404
+ // FsOperations.mkdir handles recursive: true internally and is a no-op if dir exists
405
+ await fs.mkdir(scratchpadDir, { mode: 0o700 })
406
+
407
+ return scratchpadDir
408
+ }
409
+
410
+ // Check if file is within the scratchpad directory
411
+ function isScratchpadPath(absolutePath: string): boolean {
412
+ if (!isScratchpadEnabled()) {
413
+ return false
414
+ }
415
+ const scratchpadDir = getScratchpadDir()
416
+ // SECURITY: Normalize the path to resolve .. segments before checking
417
+ // This prevents path traversal bypasses like:
418
+ // echo "malicious" > /tmp/claude-0/proj/session/scratchpad/../../../etc/passwd
419
+ // Without normalization, the path would pass the startsWith check but write to /etc/passwd
420
+ const normalizedPath = normalize(absolutePath)
421
+ return (
422
+ normalizedPath === scratchpadDir ||
423
+ normalizedPath.startsWith(scratchpadDir + sep)
424
+ )
425
+ }
426
+
427
+ /**
428
+ * Check if a file path is dangerous to auto-edit without explicit permission.
429
+ * This includes:
430
+ * - Files in .git directories or .gitconfig files (to prevent git-based data exfiltration and code execution)
431
+ * - Files in .vscode directories (to prevent VS Code settings manipulation and potential code execution)
432
+ * - Files in .idea directories (to prevent JetBrains IDE settings manipulation)
433
+ * - Shell configuration files (to prevent shell startup script manipulation)
434
+ * - UNC paths (to prevent network file access and WebDAV attacks)
435
+ */
436
+ function isDangerousFilePathToAutoEdit(path: string): boolean {
437
+ const absolutePath = expandPath(path)
438
+ const pathSegments = absolutePath.split(sep)
439
+ const fileName = pathSegments.at(-1)
440
+
441
+ // Check for UNC paths (defense-in-depth to catch any patterns that might not be caught by containsVulnerableUncPath)
442
+ // Block anything starting with \\ or // as these are potentially UNC paths that could access network resources
443
+ if (path.startsWith('\\\\') || path.startsWith('//')) {
444
+ return true
445
+ }
446
+
447
+ // Check if path is within dangerous directories (case-insensitive to prevent bypasses)
448
+ for (let i = 0; i < pathSegments.length; i++) {
449
+ const segment = pathSegments[i]!
450
+ const normalizedSegment = normalizeCaseForComparison(segment)
451
+
452
+ for (const dir of DANGEROUS_DIRECTORIES) {
453
+ if (normalizedSegment !== normalizeCaseForComparison(dir)) {
454
+ continue
455
+ }
456
+
457
+ // Special case: .claude/worktrees/ is a structural path (where Claude stores
458
+ // git worktrees), not a user-created dangerous directory. Skip the .claude
459
+ // segment when it's followed by 'worktrees'. Any nested .claude directories
460
+ // within the worktree (not followed by 'worktrees') are still blocked.
461
+ if (dir === '.claude') {
462
+ const nextSegment = pathSegments[i + 1]
463
+ if (
464
+ nextSegment &&
465
+ normalizeCaseForComparison(nextSegment) === 'worktrees'
466
+ ) {
467
+ break // Skip this .claude, continue checking other segments
468
+ }
469
+ }
470
+
471
+ return true
472
+ }
473
+ }
474
+
475
+ // Check for dangerous configuration files (case-insensitive)
476
+ if (fileName) {
477
+ const normalizedFileName = normalizeCaseForComparison(fileName)
478
+ if (
479
+ (DANGEROUS_FILES as readonly string[]).some(
480
+ dangerousFile =>
481
+ normalizeCaseForComparison(dangerousFile) === normalizedFileName,
482
+ )
483
+ ) {
484
+ return true
485
+ }
486
+ }
487
+
488
+ return false
489
+ }
490
+
491
+ /**
492
+ * Detects suspicious Windows path patterns that could bypass security checks.
493
+ * These patterns include:
494
+ * - NTFS Alternate Data Streams (e.g., file.txt::$DATA or file.txt:stream)
495
+ * - 8.3 short names (e.g., GIT~1, CLAUDE~1, SETTIN~1.JSON)
496
+ * - Long path prefixes (e.g., \\?\C:\..., \\.\C:\..., //?/C:/..., //./C:/...)
497
+ * - Trailing dots and spaces (e.g., .git., .claude , .bashrc...)
498
+ * - DOS device names (e.g., .git.CON, settings.json.PRN, .bashrc.AUX)
499
+ * - Three or more consecutive dots (e.g., .../file.txt, path/.../file, file...txt)
500
+ *
501
+ * When detected, these paths should always require manual approval to prevent
502
+ * bypassing security checks through path canonicalization vulnerabilities.
503
+ *
504
+ * ## Why Check on All Platforms?
505
+ *
506
+ * While these patterns are primarily Windows-specific, NTFS filesystems can be
507
+ * mounted on Linux and macOS (e.g., using ntfs-3g). On these systems, the same
508
+ * bypass techniques would work - an attacker could use short names or long path
509
+ * prefixes to bypass security checks. Therefore, we check for these patterns on
510
+ * all platforms to ensure comprehensive protection. (Note: the ADS colon check
511
+ * is Windows/WSL-only, since colon syntax is only interpreted by the Windows
512
+ * kernel; on Linux/macOS, NTFS ADS is accessed via xattrs, not colon syntax.)
513
+ *
514
+ * ## Why Detection Instead of Normalization?
515
+ *
516
+ * An alternative approach would be to normalize these paths using Windows APIs
517
+ * (e.g., GetLongPathNameW). However, this approach has significant challenges:
518
+ *
519
+ * 1. **Filesystem dependency**: Short path normalization is relative to files that
520
+ * currently exist on the filesystem. This creates issues when writing to new
521
+ * files since they don't exist yet and cannot be normalized.
522
+ *
523
+ * 2. **Race conditions**: The filesystem state can change between normalization
524
+ * and actual file access, creating TOCTOU (Time-Of-Check-Time-Of-Use) vulnerabilities.
525
+ *
526
+ * 3. **Complexity**: Proper normalization requires Windows-specific APIs, handling
527
+ * multiple edge cases, and dealing with various path formats (UNC, device paths, etc.).
528
+ *
529
+ * 4. **Reliability**: Pattern detection is more predictable and doesn't depend on
530
+ * external system state.
531
+ *
532
+ * If you are considering adding normalization for these paths, please reach out to
533
+ * AppSec first to discuss the security implications and implementation approach.
534
+ *
535
+ * @param path The path to check for suspicious patterns
536
+ * @returns true if suspicious Windows path patterns are detected
537
+ */
538
+ function hasSuspiciousWindowsPathPattern(path: string): boolean {
539
+ // Check for NTFS Alternate Data Streams
540
+ // Look for ':' after position 2 to skip drive letters (e.g., C:\)
541
+ // Examples: file.txt::$DATA, .bashrc:hidden, settings.json:stream
542
+ // Note: ADS colon syntax is only interpreted by the Windows kernel. On WSL,
543
+ // DrvFs mounts route file operations through the Windows kernel, so colon
544
+ // syntax is still interpreted as ADS separators. On Linux/macOS (non-WSL),
545
+ // even when NTFS is mounted, ADS is accessed via xattrs (ntfs-3g) not colon
546
+ // syntax, and colons are valid filename characters.
547
+ if (getPlatform() === 'windows' || getPlatform() === 'wsl') {
548
+ const colonIndex = path.indexOf(':', 2)
549
+ if (colonIndex !== -1) {
550
+ return true
551
+ }
552
+ }
553
+
554
+ // Check for 8.3 short names
555
+ // Look for '~' followed by a digit
556
+ // Examples: GIT~1, CLAUDE~1, SETTIN~1.JSON, BASHRC~1
557
+ if (/~\d/.test(path)) {
558
+ return true
559
+ }
560
+
561
+ // Check for long path prefixes (both backslash and forward slash variants)
562
+ // Examples: \\?\C:\Users\..., \\.\C:\..., //?/C:/..., //./C:/...
563
+ if (
564
+ path.startsWith('\\\\?\\') ||
565
+ path.startsWith('\\\\.\\') ||
566
+ path.startsWith('//?/') ||
567
+ path.startsWith('//./')
568
+ ) {
569
+ return true
570
+ }
571
+
572
+ // Check for trailing dots and spaces that Windows strips during path resolution
573
+ // Examples: .git., .claude , .bashrc..., settings.json.
574
+ // This can bypass string matching if ".git" is blocked but ".git." is used
575
+ if (/[.\s]+$/.test(path)) {
576
+ return true
577
+ }
578
+
579
+ // Check for DOS device names that Windows treats as special devices
580
+ // Examples: .git.CON, settings.json.PRN, .bashrc.AUX
581
+ // Device names: CON, PRN, AUX, NUL, COM1-9, LPT1-9
582
+ if (/\.(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])$/i.test(path)) {
583
+ return true
584
+ }
585
+
586
+ // Check for three or more consecutive dots (...) when used as a path component
587
+ // This pattern can be used to bypass security checks or create confusion
588
+ // Examples: .../file.txt, path/.../file
589
+ // Only block when dots are preceded AND followed by path separators (/ or \)
590
+ // This allows legitimate uses like Next.js catch-all routes [...]name]
591
+ if (/(^|\/|\\)\.{3,}(\/|\\|$)/.test(path)) {
592
+ return true
593
+ }
594
+
595
+ // Check for UNC paths (on all platforms for defense-in-depth)
596
+ // Examples: \\server\share, \\foo.com\file, //server/share, \\192.168.1.1\share
597
+ // UNC paths can access remote resources, leak credentials, and bypass working directory restrictions
598
+ if (containsVulnerableUncPath(path)) {
599
+ return true
600
+ }
601
+
602
+ return false
603
+ }
604
+
605
+ /**
606
+ * Checks if a path is safe for auto-editing (acceptEdits mode).
607
+ * Returns information about why the path is unsafe, or null if all checks pass.
608
+ *
609
+ * This function performs comprehensive safety checks including:
610
+ * - Suspicious Windows path patterns (NTFS streams, 8.3 names, long path prefixes, etc.)
611
+ * - Claude config files (.claude/settings.json, .claude/commands/, .claude/agents/)
612
+ * - MCP CLI state files (managed internally by Claude Code)
613
+ * - Dangerous files (.bashrc, .gitconfig, .git/, .vscode/, .idea/, etc.)
614
+ *
615
+ * IMPORTANT: This function checks BOTH the original path AND resolved symlink paths
616
+ * to prevent bypasses via symlinks pointing to protected files.
617
+ *
618
+ * @param path The path to check for safety
619
+ * @returns Object with safe=false and message if unsafe, or { safe: true } if all checks pass
620
+ */
621
+ export function checkPathSafetyForAutoEdit(
622
+ path: string,
623
+ precomputedPathsToCheck?: readonly string[],
624
+ ):
625
+ | { safe: true }
626
+ | { safe: false; message: string; classifierApprovable: boolean } {
627
+ // Get all paths to check (original + symlink resolved paths)
628
+ const pathsToCheck =
629
+ precomputedPathsToCheck ?? getPathsForPermissionCheck(path)
630
+
631
+ // Check for suspicious Windows path patterns on all paths
632
+ for (const pathToCheck of pathsToCheck) {
633
+ if (hasSuspiciousWindowsPathPattern(pathToCheck)) {
634
+ return {
635
+ safe: false,
636
+ message: `Claude requested permissions to write to ${path}, which contains a suspicious Windows path pattern that requires manual approval.`,
637
+ classifierApprovable: false,
638
+ }
639
+ }
640
+ }
641
+
642
+ // Check for Claude config files on all paths
643
+ for (const pathToCheck of pathsToCheck) {
644
+ if (isClaudeConfigFilePath(pathToCheck)) {
645
+ return {
646
+ safe: false,
647
+ message: `Claude requested permissions to write to ${path}, but you haven't granted it yet.`,
648
+ classifierApprovable: true,
649
+ }
650
+ }
651
+ }
652
+
653
+ // Check for dangerous files on all paths
654
+ for (const pathToCheck of pathsToCheck) {
655
+ if (isDangerousFilePathToAutoEdit(pathToCheck)) {
656
+ return {
657
+ safe: false,
658
+ message: `Claude requested permissions to edit ${path} which is a sensitive file.`,
659
+ classifierApprovable: true,
660
+ }
661
+ }
662
+ }
663
+
664
+ // All safety checks passed
665
+ return { safe: true }
666
+ }
667
+
668
+ export function allWorkingDirectories(
669
+ context: ToolPermissionContext,
670
+ ): Set<string> {
671
+ return new Set([
672
+ getOriginalCwd(),
673
+ ...context.additionalWorkingDirectories.keys(),
674
+ ])
675
+ }
676
+
677
+ // Working directories are session-stable; memoize their resolved forms to
678
+ // avoid repeated existsSync/lstatSync/realpathSync syscalls on every
679
+ // permission check. Keyed by path string — getPathsForPermissionCheck is
680
+ // deterministic for existing directories within a session.
681
+ // Exported for test/preload.ts cache clearing (shard-isolation).
682
+ export const getResolvedWorkingDirPaths = memoize(getPathsForPermissionCheck)
683
+
684
+ export function pathInAllowedWorkingPath(
685
+ path: string,
686
+ toolPermissionContext: ToolPermissionContext,
687
+ precomputedPathsToCheck?: readonly string[],
688
+ ): boolean {
689
+ // Check both the original path and the resolved symlink path
690
+ const pathsToCheck =
691
+ precomputedPathsToCheck ?? getPathsForPermissionCheck(path)
692
+
693
+ // Resolve working directories the same way we resolve input paths so
694
+ // comparisons are symmetric. Without this, a resolved input path
695
+ // (e.g. /System/Volumes/Data/home/... on macOS) would not match an
696
+ // unresolved working directory (/home/...), causing false denials.
697
+ const workingPaths = Array.from(
698
+ allWorkingDirectories(toolPermissionContext),
699
+ ).flatMap(wp => getResolvedWorkingDirPaths(wp))
700
+
701
+ // All paths must be within allowed working paths
702
+ // If any resolved path is outside, deny access
703
+ return pathsToCheck.every(pathToCheck =>
704
+ workingPaths.some(workingPath =>
705
+ pathInWorkingPath(pathToCheck, workingPath),
706
+ ),
707
+ )
708
+ }
709
+
710
+ export function pathInWorkingPath(path: string, workingPath: string): boolean {
711
+ const absolutePath = expandPath(path)
712
+ const absoluteWorkingPath = expandPath(workingPath)
713
+
714
+ // On macOS, handle common symlink issues:
715
+ // - /var -> /private/var
716
+ // - /tmp -> /private/tmp
717
+ const normalizedPath = absolutePath
718
+ .replace(/^\/private\/var\//, '/var/')
719
+ .replace(/^\/private\/tmp(\/|$)/, '/tmp$1')
720
+ const normalizedWorkingPath = absoluteWorkingPath
721
+ .replace(/^\/private\/var\//, '/var/')
722
+ .replace(/^\/private\/tmp(\/|$)/, '/tmp$1')
723
+
724
+ // Normalize case for case-insensitive comparison to prevent bypassing security
725
+ // checks on case-insensitive filesystems (macOS/Windows) like .cLauDe/CoMmAnDs
726
+ const caseNormalizedPath = normalizeCaseForComparison(normalizedPath)
727
+ const caseNormalizedWorkingPath = normalizeCaseForComparison(
728
+ normalizedWorkingPath,
729
+ )
730
+
731
+ // Use cross-platform relative path helper
732
+ const relative = relativePath(caseNormalizedWorkingPath, caseNormalizedPath)
733
+
734
+ // Same path
735
+ if (relative === '') {
736
+ return true
737
+ }
738
+
739
+ if (containsPathTraversal(relative)) {
740
+ return false
741
+ }
742
+
743
+ // Path is inside (relative path that doesn't go up)
744
+ return !posix.isAbsolute(relative)
745
+ }
746
+
747
+ function rootPathForSource(source: PermissionRuleSource): string {
748
+ switch (source) {
749
+ case 'cliArg':
750
+ case 'command':
751
+ case 'session':
752
+ return expandPath(getOriginalCwd())
753
+ case 'userSettings':
754
+ case 'policySettings':
755
+ case 'projectSettings':
756
+ case 'localSettings':
757
+ case 'flagSettings':
758
+ return getSettingsRootPathForSource(source)
759
+ }
760
+ }
761
+
762
+ function prependDirSep(path: string): string {
763
+ return posix.join(DIR_SEP, path)
764
+ }
765
+
766
+ function normalizePatternToPath({
767
+ patternRoot,
768
+ pattern,
769
+ rootPath,
770
+ }: {
771
+ patternRoot: string
772
+ pattern: string
773
+ rootPath: string
774
+ }): string | null {
775
+ // If the pattern root + pattern combination starts with our reference root
776
+ const fullPattern = posix.join(patternRoot, pattern)
777
+ if (patternRoot === rootPath) {
778
+ // If the pattern root exactly matches our reference root no need to change
779
+ return prependDirSep(pattern)
780
+ } else if (fullPattern.startsWith(`${rootPath}${DIR_SEP}`)) {
781
+ // Extract the relative part
782
+ const relativePart = fullPattern.slice(rootPath.length)
783
+ return prependDirSep(relativePart)
784
+ } else {
785
+ // Handle patterns that are inside the reference root but not starting with it
786
+ const relativePath = posix.relative(rootPath, patternRoot)
787
+ if (
788
+ !relativePath ||
789
+ relativePath.startsWith(`..${DIR_SEP}`) ||
790
+ relativePath === '..'
791
+ ) {
792
+ // Pattern is outside the reference root, so it can be skipped
793
+ return null
794
+ } else {
795
+ const relativePattern = posix.join(relativePath, pattern)
796
+ return prependDirSep(relativePattern)
797
+ }
798
+ }
799
+ }
800
+
801
+ export function normalizePatternsToPath(
802
+ patternsByRoot: Map<string | null, string[]>,
803
+ root: string,
804
+ ): string[] {
805
+ // null root means the pattern can match anywhere
806
+ const result = new Set(patternsByRoot.get(null) ?? [])
807
+
808
+ for (const [patternRoot, patterns] of patternsByRoot.entries()) {
809
+ if (patternRoot === null) {
810
+ // already added
811
+ continue
812
+ }
813
+
814
+ // Check each pattern to see if the full path starts with our reference root
815
+ for (const pattern of patterns) {
816
+ const normalizedPattern = normalizePatternToPath({
817
+ patternRoot,
818
+ pattern,
819
+ rootPath: root,
820
+ })
821
+ if (normalizedPattern) {
822
+ result.add(normalizedPattern)
823
+ }
824
+ }
825
+ }
826
+ return Array.from(result)
827
+ }
828
+
829
+ /**
830
+ * Collects all deny rules for file read permissions and returns their ignore patterns
831
+ * Each pattern must be resolved relative to its root (map key)
832
+ * Null keys are used for patterns that don't have a root
833
+ *
834
+ * This is used to hide files that are blocked by Read deny rules.
835
+ *
836
+ * @param toolPermissionContext
837
+ */
838
+ export function getFileReadIgnorePatterns(
839
+ toolPermissionContext: ToolPermissionContext,
840
+ ): Map<string | null, string[]> {
841
+ const patternsByRoot = getPatternsByRoot(
842
+ toolPermissionContext,
843
+ 'read',
844
+ 'deny',
845
+ )
846
+ const result = new Map<string | null, string[]>()
847
+ for (const [patternRoot, patternMap] of patternsByRoot.entries()) {
848
+ result.set(patternRoot, Array.from(patternMap.keys()))
849
+ }
850
+
851
+ return result
852
+ }
853
+
854
+ function patternWithRoot(
855
+ pattern: string,
856
+ source: PermissionRuleSource,
857
+ ): {
858
+ relativePattern: string
859
+ root: string | null
860
+ } {
861
+ if (pattern.startsWith(`${DIR_SEP}${DIR_SEP}`)) {
862
+ // Patterns starting with // resolve relative to /
863
+ const patternWithoutDoubleSlash = pattern.slice(1)
864
+
865
+ // On Windows, check if this is a POSIX-style drive path like //c/Users/...
866
+ // Note: UNC paths (//server/share) will not match this regex and will be treated
867
+ // as root-relative patterns, which may need separate handling in the future
868
+ if (
869
+ getPlatform() === 'windows' &&
870
+ patternWithoutDoubleSlash.match(/^\/[a-z]\//i)
871
+ ) {
872
+ // Convert POSIX path to Windows format
873
+ // The pattern is like /c/Users/... so we convert it to C:\Users\...
874
+ const driveLetter = patternWithoutDoubleSlash[1]?.toUpperCase() ?? 'C'
875
+ // Keep the pattern in POSIX format since relativePath returns POSIX paths
876
+ const pathAfterDrive = patternWithoutDoubleSlash.slice(2)
877
+
878
+ // Extract the drive root (C:\) and the rest of the pattern
879
+ const driveRoot = `${driveLetter}:\\`
880
+ const relativeFromDrive = pathAfterDrive.startsWith('/')
881
+ ? pathAfterDrive.slice(1)
882
+ : pathAfterDrive
883
+
884
+ return {
885
+ relativePattern: relativeFromDrive,
886
+ root: driveRoot,
887
+ }
888
+ }
889
+
890
+ return {
891
+ relativePattern: patternWithoutDoubleSlash,
892
+ root: DIR_SEP,
893
+ }
894
+ } else if (pattern.startsWith(`~${DIR_SEP}`)) {
895
+ // Patterns starting with ~/ resolve relative to homedir
896
+ return {
897
+ relativePattern: pattern.slice(1),
898
+ root: homedir().normalize('NFC'),
899
+ }
900
+ } else if (pattern.startsWith(DIR_SEP)) {
901
+ // Patterns starting with / resolve relative to the directory where settings are stored (without .claude/)
902
+ return {
903
+ relativePattern: pattern,
904
+ root: rootPathForSource(source),
905
+ }
906
+ }
907
+ // No root specified, put it with all the other patterns
908
+ // Normalize patterns that start with "./" to remove the prefix
909
+ // This ensures that patterns like "./.env" match files like ".env"
910
+ let normalizedPattern = pattern
911
+ if (pattern.startsWith(`.${DIR_SEP}`)) {
912
+ normalizedPattern = pattern.slice(2)
913
+ }
914
+ return {
915
+ relativePattern: normalizedPattern,
916
+ root: null,
917
+ }
918
+ }
919
+
920
+ function getPatternsByRoot(
921
+ toolPermissionContext: ToolPermissionContext,
922
+ toolType: 'edit' | 'read',
923
+ behavior: 'allow' | 'deny' | 'ask',
924
+ ): Map<string | null, Map<string, PermissionRule>> {
925
+ const toolName = (() => {
926
+ switch (toolType) {
927
+ case 'edit':
928
+ // Apply Edit tool rules to any tool editing files
929
+ return FILE_EDIT_TOOL_NAME
930
+ case 'read':
931
+ // Apply Read tool rules to any tool reading files
932
+ return FILE_READ_TOOL_NAME
933
+ }
934
+ })()
935
+
936
+ const rules = getRuleByContentsForToolName(
937
+ toolPermissionContext,
938
+ toolName,
939
+ behavior,
940
+ )
941
+ // Resolve rules relative to path based on source
942
+ const patternsByRoot = new Map<string | null, Map<string, PermissionRule>>()
943
+ for (const [pattern, rule] of rules.entries()) {
944
+ const { relativePattern, root } = patternWithRoot(pattern, rule.source)
945
+ let patternsForRoot = patternsByRoot.get(root)
946
+ if (patternsForRoot === undefined) {
947
+ patternsForRoot = new Map<string, PermissionRule>()
948
+ patternsByRoot.set(root, patternsForRoot)
949
+ }
950
+ // Store the rule keyed by the root
951
+ patternsForRoot.set(relativePattern, rule)
952
+ }
953
+ return patternsByRoot
954
+ }
955
+
956
+ export function matchingRuleForInput(
957
+ path: string,
958
+ toolPermissionContext: ToolPermissionContext,
959
+ toolType: 'edit' | 'read',
960
+ behavior: 'allow' | 'deny' | 'ask',
961
+ ): PermissionRule | null {
962
+ let fileAbsolutePath = expandPath(path)
963
+
964
+ // On Windows, convert to POSIX format to match against permission patterns
965
+ if (getPlatform() === 'windows' && fileAbsolutePath.includes('\\')) {
966
+ fileAbsolutePath = windowsPathToPosixPath(fileAbsolutePath)
967
+ }
968
+
969
+ const patternsByRoot = getPatternsByRoot(
970
+ toolPermissionContext,
971
+ toolType,
972
+ behavior,
973
+ )
974
+
975
+ // Check each root for a matching pattern
976
+ for (const [root, patternMap] of patternsByRoot.entries()) {
977
+ // Transform patterns for the ignore library
978
+ const patterns = Array.from(patternMap.keys()).map(pattern => {
979
+ let adjustedPattern = pattern
980
+
981
+ // Remove /** suffix - ignore library treats 'path' as matching both
982
+ // the path itself and everything inside it
983
+ if (adjustedPattern.endsWith('/**')) {
984
+ adjustedPattern = adjustedPattern.slice(0, -3)
985
+ }
986
+
987
+ return adjustedPattern
988
+ })
989
+
990
+ const ig = ignore().add(patterns)
991
+
992
+ // Use cross-platform relative path helper for POSIX-style patterns
993
+ const relativePathStr = relativePath(
994
+ root ?? getCwd(),
995
+ fileAbsolutePath ?? getCwd(),
996
+ )
997
+
998
+ if (relativePathStr.startsWith(`..${DIR_SEP}`)) {
999
+ // The path is outside the root, so ignore it
1000
+ continue
1001
+ }
1002
+
1003
+ // Important: ig.test throws if you give it an empty string
1004
+ if (!relativePathStr) {
1005
+ continue
1006
+ }
1007
+
1008
+ const igResult = ig.test(relativePathStr)
1009
+
1010
+ if (igResult.ignored && igResult.rule) {
1011
+ // Map the matched pattern back to the original rule
1012
+ const originalPattern = igResult.rule.pattern
1013
+
1014
+ // Check if this was a /** pattern we simplified
1015
+ const withWildcard = originalPattern + '/**'
1016
+ if (patternMap.has(withWildcard)) {
1017
+ return patternMap.get(withWildcard) ?? null
1018
+ }
1019
+
1020
+ return patternMap.get(originalPattern) ?? null
1021
+ }
1022
+ }
1023
+
1024
+ // No matching rule found
1025
+ return null
1026
+ }
1027
+
1028
+ /**
1029
+ * Permission result for read permission for the specified tool & tool input
1030
+ */
1031
+ export function checkReadPermissionForTool(
1032
+ tool: Tool,
1033
+ input: { [key: string]: unknown },
1034
+ toolPermissionContext: ToolPermissionContext,
1035
+ ): PermissionDecision {
1036
+ if (typeof tool.getPath !== 'function') {
1037
+ return {
1038
+ behavior: 'ask',
1039
+ message: `Claude requested permissions to use ${tool.name}, but you haven't granted it yet.`,
1040
+ }
1041
+ }
1042
+ const path = tool.getPath(input)
1043
+
1044
+ // Get paths to check (includes both original and resolved symlinks).
1045
+ // Computed once here and threaded through checkWritePermissionForTool →
1046
+ // checkPathSafetyForAutoEdit → pathInAllowedWorkingPath to avoid redundant
1047
+ // existsSync/lstatSync/realpathSync syscalls on the same path (previously
1048
+ // 6× = 30 syscalls per Read permission check).
1049
+ const pathsToCheck = getPathsForPermissionCheck(path)
1050
+
1051
+ // 1. Defense-in-depth: Block UNC paths early (before other checks)
1052
+ // This catches paths starting with \\ or // that could access network resources
1053
+ // This may catch some UNC patterns not detected by containsVulnerableUncPath
1054
+ for (const pathToCheck of pathsToCheck) {
1055
+ if (pathToCheck.startsWith('\\\\') || pathToCheck.startsWith('//')) {
1056
+ return {
1057
+ behavior: 'ask',
1058
+ message: `Claude requested permissions to read from ${path}, which appears to be a UNC path that could access network resources.`,
1059
+ decisionReason: {
1060
+ type: 'other',
1061
+ reason: 'UNC path detected (defense-in-depth check)',
1062
+ },
1063
+ }
1064
+ }
1065
+ }
1066
+
1067
+ // 2. Check for suspicious Windows path patterns (defense in depth)
1068
+ for (const pathToCheck of pathsToCheck) {
1069
+ if (hasSuspiciousWindowsPathPattern(pathToCheck)) {
1070
+ return {
1071
+ behavior: 'ask',
1072
+ message: `Claude requested permissions to read from ${path}, which contains a suspicious Windows path pattern that requires manual approval.`,
1073
+ decisionReason: {
1074
+ type: 'other',
1075
+ reason:
1076
+ 'Path contains suspicious Windows-specific patterns (alternate data streams, short names, long path prefixes, or three or more consecutive dots) that require manual verification',
1077
+ },
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ // 3. Check for READ-SPECIFIC deny rules first - check both the original path and resolved symlink path
1083
+ // SECURITY: This must come before any allow checks (including "edit access implies read access")
1084
+ // to prevent bypassing explicit read deny rules
1085
+ for (const pathToCheck of pathsToCheck) {
1086
+ const denyRule = matchingRuleForInput(
1087
+ pathToCheck,
1088
+ toolPermissionContext,
1089
+ 'read',
1090
+ 'deny',
1091
+ )
1092
+ if (denyRule) {
1093
+ return {
1094
+ behavior: 'deny',
1095
+ message: `Permission to read ${path} has been denied.`,
1096
+ decisionReason: {
1097
+ type: 'rule',
1098
+ rule: denyRule,
1099
+ },
1100
+ }
1101
+ }
1102
+ }
1103
+
1104
+ // 4. Check for READ-SPECIFIC ask rules - check both the original path and resolved symlink path
1105
+ // SECURITY: This must come before implicit allow checks to ensure explicit ask rules are honored
1106
+ for (const pathToCheck of pathsToCheck) {
1107
+ const askRule = matchingRuleForInput(
1108
+ pathToCheck,
1109
+ toolPermissionContext,
1110
+ 'read',
1111
+ 'ask',
1112
+ )
1113
+ if (askRule) {
1114
+ return {
1115
+ behavior: 'ask',
1116
+ message: `Claude requested permissions to read from ${path}, but you haven't granted it yet.`,
1117
+ decisionReason: {
1118
+ type: 'rule',
1119
+ rule: askRule,
1120
+ },
1121
+ }
1122
+ }
1123
+ }
1124
+
1125
+ // 5. Edit access implies read access (but only if no read-specific deny/ask rules exist)
1126
+ // We check this after read-specific rules so that explicit read restrictions take precedence
1127
+ const editResult = checkWritePermissionForTool(
1128
+ tool,
1129
+ input,
1130
+ toolPermissionContext,
1131
+ pathsToCheck,
1132
+ )
1133
+ if (editResult.behavior === 'allow') {
1134
+ return editResult
1135
+ }
1136
+
1137
+ // 6. Allow reads in working directories
1138
+ const isInWorkingDir = pathInAllowedWorkingPath(
1139
+ path,
1140
+ toolPermissionContext,
1141
+ pathsToCheck,
1142
+ )
1143
+ if (isInWorkingDir) {
1144
+ return {
1145
+ behavior: 'allow',
1146
+ updatedInput: input,
1147
+ decisionReason: {
1148
+ type: 'mode',
1149
+ mode: 'default',
1150
+ },
1151
+ }
1152
+ }
1153
+
1154
+ // 7. Allow reads from internal harness paths (session-memory, plans, tool-results)
1155
+ const absolutePath = expandPath(path)
1156
+ const internalReadResult = checkReadableInternalPath(absolutePath, input)
1157
+ if (internalReadResult.behavior !== 'passthrough') {
1158
+ return internalReadResult
1159
+ }
1160
+
1161
+ // 8. Check for allow rules
1162
+ const allowRule = matchingRuleForInput(
1163
+ path,
1164
+ toolPermissionContext,
1165
+ 'read',
1166
+ 'allow',
1167
+ )
1168
+ if (allowRule) {
1169
+ return {
1170
+ behavior: 'allow',
1171
+ updatedInput: input,
1172
+ decisionReason: {
1173
+ type: 'rule',
1174
+ rule: allowRule,
1175
+ },
1176
+ }
1177
+ }
1178
+
1179
+ // 12. Default to asking for permission
1180
+ // At this point, isInWorkingDir is false (from step #6), so path is outside working directories
1181
+ return {
1182
+ behavior: 'ask',
1183
+ message: `Claude requested permissions to read from ${path}, but you haven't granted it yet.`,
1184
+ suggestions: generateSuggestions(
1185
+ path,
1186
+ 'read',
1187
+ toolPermissionContext,
1188
+ pathsToCheck,
1189
+ ),
1190
+ decisionReason: {
1191
+ type: 'workingDir',
1192
+ reason: 'Path is outside allowed working directories',
1193
+ },
1194
+ }
1195
+ }
1196
+
1197
+ /**
1198
+ * Permission result for write permission for the specified tool & tool input.
1199
+ *
1200
+ * @param precomputedPathsToCheck - Optional cached result of
1201
+ * `getPathsForPermissionCheck(tool.getPath(input))`. Callers MUST derive this
1202
+ * from the same `tool` and `input` in the same synchronous frame — `path` is
1203
+ * re-derived internally for error messages and internal-path checks, so a
1204
+ * stale value would silently check deny rules for the wrong path.
1205
+ */
1206
+ export function checkWritePermissionForTool<Input extends AnyObject>(
1207
+ tool: Tool<Input>,
1208
+ input: z.infer<Input>,
1209
+ toolPermissionContext: ToolPermissionContext,
1210
+ precomputedPathsToCheck?: readonly string[],
1211
+ ): PermissionDecision {
1212
+ if (typeof tool.getPath !== 'function') {
1213
+ return {
1214
+ behavior: 'ask',
1215
+ message: `Claude requested permissions to use ${tool.name}, but you haven't granted it yet.`,
1216
+ }
1217
+ }
1218
+ const path = tool.getPath(input)
1219
+
1220
+ // 1. Check for deny rules - check both the original path and resolved symlink path
1221
+ const pathsToCheck =
1222
+ precomputedPathsToCheck ?? getPathsForPermissionCheck(path)
1223
+ for (const pathToCheck of pathsToCheck) {
1224
+ const denyRule = matchingRuleForInput(
1225
+ pathToCheck,
1226
+ toolPermissionContext,
1227
+ 'edit',
1228
+ 'deny',
1229
+ )
1230
+ if (denyRule) {
1231
+ return {
1232
+ behavior: 'deny',
1233
+ message: `Permission to edit ${path} has been denied.`,
1234
+ decisionReason: {
1235
+ type: 'rule',
1236
+ rule: denyRule,
1237
+ },
1238
+ }
1239
+ }
1240
+ }
1241
+
1242
+ // 1.5. Allow writes to internal editable paths (plan files, scratchpad)
1243
+ // This MUST come before isDangerousFilePathToAutoEdit check since .claude is a dangerous directory
1244
+ const absolutePathForEdit = expandPath(path)
1245
+ const internalEditResult = checkEditableInternalPath(
1246
+ absolutePathForEdit,
1247
+ input,
1248
+ )
1249
+ if (internalEditResult.behavior !== 'passthrough') {
1250
+ return internalEditResult
1251
+ }
1252
+
1253
+ // 1.6. Check for .claude/** allow rules BEFORE safety checks
1254
+ // This allows session-level permissions to bypass the safety blocks for .claude/
1255
+ // We only allow this for session-level rules to prevent users from accidentally
1256
+ // permanently granting broad access to their .claude/ folder.
1257
+ //
1258
+ // matchingRuleForInput returns the first match across all sources. If the user
1259
+ // also has a broader Edit(.claude) rule in userSettings (e.g. from sandbox
1260
+ // write-allow conversion), that rule would be found first and its source check
1261
+ // below would fail. Scope the search to session-only rules so the dialog's
1262
+ // "allow Claude to edit its own settings for this session" option actually works.
1263
+ const claudeFolderAllowRule = matchingRuleForInput(
1264
+ path,
1265
+ {
1266
+ ...toolPermissionContext,
1267
+ alwaysAllowRules: {
1268
+ session: toolPermissionContext.alwaysAllowRules.session ?? [],
1269
+ },
1270
+ },
1271
+ 'edit',
1272
+ 'allow',
1273
+ )
1274
+ if (claudeFolderAllowRule) {
1275
+ // Check if this rule is scoped under .claude/ (project or global).
1276
+ // Accepts both the broad patterns ('/.claude/**', '~/.claude/**') and
1277
+ // narrowed ones like '/.claude/skills/my-skill/**' so users can grant
1278
+ // session access to a single skill without also exposing settings.json
1279
+ // or hooks/. The rule already matched the path via matchingRuleForInput;
1280
+ // this is an additional scope check. Reject '..' to prevent a rule like
1281
+ // '/.claude/../**' from leaking this bypass outside .claude/.
1282
+ const ruleContent = claudeFolderAllowRule.ruleValue.ruleContent
1283
+ if (
1284
+ ruleContent &&
1285
+ (ruleContent.startsWith(CLAUDE_FOLDER_PERMISSION_PATTERN.slice(0, -2)) ||
1286
+ ruleContent.startsWith(
1287
+ GLOBAL_CLAUDE_FOLDER_PERMISSION_PATTERN.slice(0, -2),
1288
+ )) &&
1289
+ !ruleContent.includes('..') &&
1290
+ ruleContent.endsWith('/**')
1291
+ ) {
1292
+ return {
1293
+ behavior: 'allow',
1294
+ updatedInput: input,
1295
+ decisionReason: {
1296
+ type: 'rule',
1297
+ rule: claudeFolderAllowRule,
1298
+ },
1299
+ }
1300
+ }
1301
+ }
1302
+
1303
+ // 1.7. Check comprehensive safety validations (Windows patterns, Claude config, dangerous files)
1304
+ // This MUST come before checking allow rules to prevent users from accidentally granting
1305
+ // permission to edit protected files
1306
+ const safetyCheck = checkPathSafetyForAutoEdit(path, pathsToCheck)
1307
+ if (!safetyCheck.safe) {
1308
+ // SDK suggestion: if under .claude/skills/{name}/, emit the narrowed
1309
+ // session-scoped addRules that step 1.6 will honor on the next call.
1310
+ // Everything else (.claude/settings.json, .git/, .vscode/, .idea/) falls
1311
+ // back to generateSuggestions — its setMode suggestion doesn't bypass
1312
+ // this check, but preserving it avoids a surprising empty array.
1313
+ const skillScope = getClaudeSkillScope(path)
1314
+ const safetySuggestions: PermissionUpdate[] = skillScope
1315
+ ? [
1316
+ {
1317
+ type: 'addRules',
1318
+ rules: [
1319
+ {
1320
+ toolName: FILE_EDIT_TOOL_NAME,
1321
+ ruleContent: skillScope.pattern,
1322
+ },
1323
+ ],
1324
+ behavior: 'allow',
1325
+ destination: 'session',
1326
+ },
1327
+ ]
1328
+ : generateSuggestions(path, 'write', toolPermissionContext, pathsToCheck)
1329
+ return {
1330
+ behavior: 'ask',
1331
+ message: safetyCheck.message,
1332
+ suggestions: safetySuggestions,
1333
+ decisionReason: {
1334
+ type: 'safetyCheck',
1335
+ reason: safetyCheck.message,
1336
+ classifierApprovable: safetyCheck.classifierApprovable,
1337
+ },
1338
+ }
1339
+ }
1340
+
1341
+ // 2. Check for ask rules - check both the original path and resolved symlink path
1342
+ for (const pathToCheck of pathsToCheck) {
1343
+ const askRule = matchingRuleForInput(
1344
+ pathToCheck,
1345
+ toolPermissionContext,
1346
+ 'edit',
1347
+ 'ask',
1348
+ )
1349
+ if (askRule) {
1350
+ return {
1351
+ behavior: 'ask',
1352
+ message: `Claude requested permissions to write to ${path}, but you haven't granted it yet.`,
1353
+ decisionReason: {
1354
+ type: 'rule',
1355
+ rule: askRule,
1356
+ },
1357
+ }
1358
+ }
1359
+ }
1360
+
1361
+ // 3. If in acceptEdits or sandboxBashMode mode, allow all writes in original cwd
1362
+ const isInWorkingDir = pathInAllowedWorkingPath(
1363
+ path,
1364
+ toolPermissionContext,
1365
+ pathsToCheck,
1366
+ )
1367
+ if (toolPermissionContext.mode === 'acceptEdits' && isInWorkingDir) {
1368
+ return {
1369
+ behavior: 'allow',
1370
+ updatedInput: input,
1371
+ decisionReason: {
1372
+ type: 'mode',
1373
+ mode: toolPermissionContext.mode,
1374
+ },
1375
+ }
1376
+ }
1377
+
1378
+ // 4. Check for allow rules
1379
+ const allowRule = matchingRuleForInput(
1380
+ path,
1381
+ toolPermissionContext,
1382
+ 'edit',
1383
+ 'allow',
1384
+ )
1385
+ if (allowRule) {
1386
+ return {
1387
+ behavior: 'allow',
1388
+ updatedInput: input,
1389
+ decisionReason: {
1390
+ type: 'rule',
1391
+ rule: allowRule,
1392
+ },
1393
+ }
1394
+ }
1395
+
1396
+ // 5. Default to asking for permission
1397
+ return {
1398
+ behavior: 'ask',
1399
+ message: `Claude requested permissions to write to ${path}, but you haven't granted it yet.`,
1400
+ suggestions: generateSuggestions(
1401
+ path,
1402
+ 'write',
1403
+ toolPermissionContext,
1404
+ pathsToCheck,
1405
+ ),
1406
+ decisionReason: !isInWorkingDir
1407
+ ? {
1408
+ type: 'workingDir',
1409
+ reason: 'Path is outside allowed working directories',
1410
+ }
1411
+ : undefined,
1412
+ }
1413
+ }
1414
+
1415
+ export function generateSuggestions(
1416
+ filePath: string,
1417
+ operationType: 'read' | 'write' | 'create',
1418
+ toolPermissionContext: ToolPermissionContext,
1419
+ precomputedPathsToCheck?: readonly string[],
1420
+ ): PermissionUpdate[] {
1421
+ const isOutsideWorkingDir = !pathInAllowedWorkingPath(
1422
+ filePath,
1423
+ toolPermissionContext,
1424
+ precomputedPathsToCheck,
1425
+ )
1426
+
1427
+ if (operationType === 'read' && isOutsideWorkingDir) {
1428
+ // For read operations outside working directories, add Read rules
1429
+ // IMPORTANT: Include both the symlink path and resolved path so subsequent checks pass
1430
+ const dirPath = getDirectoryForPath(filePath)
1431
+ const dirsToAdd = getPathsForPermissionCheck(dirPath)
1432
+
1433
+ const suggestions = dirsToAdd
1434
+ .map(dir => createReadRuleSuggestion(dir, 'session'))
1435
+ .filter((s): s is PermissionUpdate => s !== undefined)
1436
+
1437
+ return suggestions
1438
+ }
1439
+
1440
+ // Only suggest setMode:acceptEdits when it would be an upgrade. In auto
1441
+ // mode the classifier already auto-approves edits; in bypassPermissions
1442
+ // everything is allowed; in acceptEdits it's a no-op. Suggesting it
1443
+ // anyway and having the SDK host apply it on "Always allow" silently
1444
+ // downgrades auto → acceptEdits, which then prompts for MCP/Bash.
1445
+ const shouldSuggestAcceptEdits =
1446
+ toolPermissionContext.mode === 'default' ||
1447
+ toolPermissionContext.mode === 'plan'
1448
+
1449
+ if (operationType === 'write' || operationType === 'create') {
1450
+ const updates: PermissionUpdate[] = shouldSuggestAcceptEdits
1451
+ ? [{ type: 'setMode', mode: 'acceptEdits', destination: 'session' }]
1452
+ : []
1453
+
1454
+ if (isOutsideWorkingDir) {
1455
+ // For write operations outside working directories, also add the directory
1456
+ // IMPORTANT: Include both the symlink path and resolved path so subsequent checks pass
1457
+ const dirPath = getDirectoryForPath(filePath)
1458
+ const dirsToAdd = getPathsForPermissionCheck(dirPath)
1459
+
1460
+ updates.push({
1461
+ type: 'addDirectories',
1462
+ directories: dirsToAdd,
1463
+ destination: 'session',
1464
+ })
1465
+ }
1466
+
1467
+ return updates
1468
+ }
1469
+
1470
+ // For read operations inside working directories, just change mode
1471
+ return shouldSuggestAcceptEdits
1472
+ ? [{ type: 'setMode', mode: 'acceptEdits', destination: 'session' }]
1473
+ : []
1474
+ }
1475
+
1476
+ /**
1477
+ * Check if a path is an internal path that can be edited without permission.
1478
+ * Returns a PermissionResult - either 'allow' if matched, or 'passthrough' to continue checking.
1479
+ */
1480
+ export function checkEditableInternalPath(
1481
+ absolutePath: string,
1482
+ input: { [key: string]: unknown },
1483
+ ): PermissionResult {
1484
+ // SECURITY: Normalize path to prevent traversal bypasses via .. segments
1485
+ // This is defense-in-depth; individual helper functions also normalize
1486
+ const normalizedPath = normalize(absolutePath)
1487
+
1488
+ // Plan files for current session
1489
+ if (isSessionPlanFile(normalizedPath)) {
1490
+ return {
1491
+ behavior: 'allow',
1492
+ updatedInput: input,
1493
+ decisionReason: {
1494
+ type: 'other',
1495
+ reason: 'Plan files for current session are allowed for writing',
1496
+ },
1497
+ }
1498
+ }
1499
+
1500
+ // Scratchpad directory for current session
1501
+ if (isScratchpadPath(normalizedPath)) {
1502
+ return {
1503
+ behavior: 'allow',
1504
+ updatedInput: input,
1505
+ decisionReason: {
1506
+ type: 'other',
1507
+ reason: 'Scratchpad files for current session are allowed for writing',
1508
+ },
1509
+ }
1510
+ }
1511
+
1512
+ // Template job's own directory. Env key hardcoded (vs importing JOB_ENV_KEY
1513
+ // from jobs/state) so tree-shaking eliminates the string from external
1514
+ // builds — spawn.test.ts asserts the string matches. Hijack guard: the env
1515
+ // var value must itself resolve under ~/.claude/jobs/. Symlink guard: every
1516
+ // resolved form of the target (lexical + symlink chain) must fall under some
1517
+ // resolved form of the job dir, so a symlink inside the job dir pointing at
1518
+ // e.g. ~/.ssh/authorized_keys does not get a free write. Resolving both
1519
+ // sides handles the macOS /tmp → /private/tmp case where the config dir
1520
+ // lives under a symlinked root.
1521
+ if (feature('TEMPLATES')) {
1522
+ const jobDir = process.env.CLAUDE_JOB_DIR
1523
+ if (jobDir) {
1524
+ const jobsRoot = join(getClaudeConfigHomeDir(), 'jobs')
1525
+ const jobDirForms = getPathsForPermissionCheck(jobDir).map(normalize)
1526
+ const jobsRootForms = getPathsForPermissionCheck(jobsRoot).map(normalize)
1527
+ // Hijack guard: every resolved form of the job dir must sit under
1528
+ // some resolved form of the jobs root. Resolving both sides handles
1529
+ // the case where ~/.claude is a symlink (e.g. to /data/claude-config).
1530
+ const isUnderJobsRoot = jobDirForms.every(jd =>
1531
+ jobsRootForms.some(jr => jd.startsWith(jr + sep)),
1532
+ )
1533
+ if (isUnderJobsRoot) {
1534
+ const targetForms = getPathsForPermissionCheck(absolutePath)
1535
+ const allInsideJobDir = targetForms.every(p => {
1536
+ const np = normalize(p)
1537
+ return jobDirForms.some(jd => np === jd || np.startsWith(jd + sep))
1538
+ })
1539
+ if (allInsideJobDir) {
1540
+ return {
1541
+ behavior: 'allow',
1542
+ updatedInput: input,
1543
+ decisionReason: {
1544
+ type: 'other',
1545
+ reason:
1546
+ 'Job directory files for current job are allowed for writing',
1547
+ },
1548
+ }
1549
+ }
1550
+ }
1551
+ }
1552
+ }
1553
+
1554
+ // Agent memory directory (for self-improving agents)
1555
+ if (isAgentMemoryPath(normalizedPath)) {
1556
+ return {
1557
+ behavior: 'allow',
1558
+ updatedInput: input,
1559
+ decisionReason: {
1560
+ type: 'other',
1561
+ reason: 'Agent memory files are allowed for writing',
1562
+ },
1563
+ }
1564
+ }
1565
+
1566
+ // Memdir directory (persistent memory for cross-session learning)
1567
+ // This pre-safety-check carve-out exists because the default path is under
1568
+ // ~/.claude/, which is in DANGEROUS_DIRECTORIES. The CLAUDE_COWORK_MEMORY_PATH_OVERRIDE
1569
+ // override is an arbitrary caller-designated directory with no such conflict,
1570
+ // so it gets NO special permission treatment here — writes go through normal
1571
+ // permission flow (step 5 → ask). SDK callers who want silent memory should
1572
+ // pass an allow rule for the override path.
1573
+ if (!hasAutoMemPathOverride() && isAutoMemPath(normalizedPath)) {
1574
+ return {
1575
+ behavior: 'allow',
1576
+ updatedInput: input,
1577
+ decisionReason: {
1578
+ type: 'other',
1579
+ reason: 'auto memory files are allowed for writing',
1580
+ },
1581
+ }
1582
+ }
1583
+
1584
+ // .claude/launch.json — desktop preview config (dev server command + port).
1585
+ // The desktop's preview_start MCP tool instructs Claude to create/update
1586
+ // this file as part of the preview workflow. Without this carve-out the
1587
+ // .claude/ DANGEROUS_DIRECTORIES check prompts for it, which in SDK mode
1588
+ // cascades: user clicks "Always allow" → setMode:acceptEdits suggestion
1589
+ // applied → silent downgrade from auto mode. Matches the project-level
1590
+ // .claude/ only (not ~/.claude/) since launch.json is per-project.
1591
+ if (
1592
+ normalizeCaseForComparison(normalizedPath) ===
1593
+ normalizeCaseForComparison(join(getOriginalCwd(), '.claude', 'launch.json'))
1594
+ ) {
1595
+ return {
1596
+ behavior: 'allow',
1597
+ updatedInput: input,
1598
+ decisionReason: {
1599
+ type: 'other',
1600
+ reason: 'Preview launch config is allowed for writing',
1601
+ },
1602
+ }
1603
+ }
1604
+
1605
+ return { behavior: 'passthrough', message: '' }
1606
+ }
1607
+
1608
+ /**
1609
+ * Check if a path is an internal path that can be read without permission.
1610
+ * Returns a PermissionResult - either 'allow' if matched, or 'passthrough' to continue checking.
1611
+ */
1612
+ export function checkReadableInternalPath(
1613
+ absolutePath: string,
1614
+ input: { [key: string]: unknown },
1615
+ ): PermissionResult {
1616
+ // SECURITY: Normalize path to prevent traversal bypasses via .. segments
1617
+ // This is defense-in-depth; individual helper functions also normalize
1618
+ const normalizedPath = normalize(absolutePath)
1619
+
1620
+ // Session memory directory
1621
+ if (isSessionMemoryPath(normalizedPath)) {
1622
+ return {
1623
+ behavior: 'allow',
1624
+ updatedInput: input,
1625
+ decisionReason: {
1626
+ type: 'other',
1627
+ reason: 'Session memory files are allowed for reading',
1628
+ },
1629
+ }
1630
+ }
1631
+
1632
+ // Project directory (for reading past session memories)
1633
+ // Path format: ~/.claude/projects/{sanitized-cwd}/...
1634
+ if (isProjectDirPath(normalizedPath)) {
1635
+ return {
1636
+ behavior: 'allow',
1637
+ updatedInput: input,
1638
+ decisionReason: {
1639
+ type: 'other',
1640
+ reason: 'Project directory files are allowed for reading',
1641
+ },
1642
+ }
1643
+ }
1644
+
1645
+ // Plan files for current session
1646
+ if (isSessionPlanFile(normalizedPath)) {
1647
+ return {
1648
+ behavior: 'allow',
1649
+ updatedInput: input,
1650
+ decisionReason: {
1651
+ type: 'other',
1652
+ reason: 'Plan files for current session are allowed for reading',
1653
+ },
1654
+ }
1655
+ }
1656
+
1657
+ // Tool results directory (persisted large outputs)
1658
+ // Use path separator suffix to prevent path traversal (e.g., tool-results-evil/)
1659
+ const toolResultsDir = getToolResultsDir()
1660
+ const toolResultsDirWithSep = toolResultsDir.endsWith(sep)
1661
+ ? toolResultsDir
1662
+ : toolResultsDir + sep
1663
+ if (
1664
+ normalizedPath === toolResultsDir ||
1665
+ normalizedPath.startsWith(toolResultsDirWithSep)
1666
+ ) {
1667
+ return {
1668
+ behavior: 'allow',
1669
+ updatedInput: input,
1670
+ decisionReason: {
1671
+ type: 'other',
1672
+ reason: 'Tool result files are allowed for reading',
1673
+ },
1674
+ }
1675
+ }
1676
+
1677
+ // Scratchpad directory for current session
1678
+ if (isScratchpadPath(normalizedPath)) {
1679
+ return {
1680
+ behavior: 'allow',
1681
+ updatedInput: input,
1682
+ decisionReason: {
1683
+ type: 'other',
1684
+ reason: 'Scratchpad files for current session are allowed for reading',
1685
+ },
1686
+ }
1687
+ }
1688
+
1689
+ // Project temp directory (/tmp/claude/{sanitized-cwd}/)
1690
+ // Intentionally allows reading files from all sessions in this project, not just the current session.
1691
+ // This enables cross-session file access within the same project's temp space.
1692
+ const projectTempDir = getProjectTempDir()
1693
+ if (normalizedPath.startsWith(projectTempDir)) {
1694
+ return {
1695
+ behavior: 'allow',
1696
+ updatedInput: input,
1697
+ decisionReason: {
1698
+ type: 'other',
1699
+ reason: 'Project temp directory files are allowed for reading',
1700
+ },
1701
+ }
1702
+ }
1703
+
1704
+ // Agent memory directory (for self-improving agents)
1705
+ if (isAgentMemoryPath(normalizedPath)) {
1706
+ return {
1707
+ behavior: 'allow',
1708
+ updatedInput: input,
1709
+ decisionReason: {
1710
+ type: 'other',
1711
+ reason: 'Agent memory files are allowed for reading',
1712
+ },
1713
+ }
1714
+ }
1715
+
1716
+ // Memdir directory (persistent memory for cross-session learning)
1717
+ if (isAutoMemPath(normalizedPath)) {
1718
+ return {
1719
+ behavior: 'allow',
1720
+ updatedInput: input,
1721
+ decisionReason: {
1722
+ type: 'other',
1723
+ reason: 'auto memory files are allowed for reading',
1724
+ },
1725
+ }
1726
+ }
1727
+
1728
+ // Tasks directory (~/.claude/tasks/) for swarm task coordination
1729
+ const tasksDir = join(getClaudeConfigHomeDir(), 'tasks') + sep
1730
+ if (
1731
+ normalizedPath === tasksDir.slice(0, -1) ||
1732
+ normalizedPath.startsWith(tasksDir)
1733
+ ) {
1734
+ return {
1735
+ behavior: 'allow',
1736
+ updatedInput: input,
1737
+ decisionReason: {
1738
+ type: 'other',
1739
+ reason: 'Task files are allowed for reading',
1740
+ },
1741
+ }
1742
+ }
1743
+
1744
+ // Teams directory (~/.claude/teams/) for swarm coordination
1745
+ const teamsReadDir = join(getClaudeConfigHomeDir(), 'teams') + sep
1746
+ if (
1747
+ normalizedPath === teamsReadDir.slice(0, -1) ||
1748
+ normalizedPath.startsWith(teamsReadDir)
1749
+ ) {
1750
+ return {
1751
+ behavior: 'allow',
1752
+ updatedInput: input,
1753
+ decisionReason: {
1754
+ type: 'other',
1755
+ reason: 'Team files are allowed for reading',
1756
+ },
1757
+ }
1758
+ }
1759
+
1760
+ // Bundled skill reference files extracted on first invocation.
1761
+ // SECURITY: See getBundledSkillsRoot() — the per-process nonce in the path
1762
+ // is the load-bearing defense; uid/VERSION alone are public knowledge and
1763
+ // squattable. We always write-before-read on invocation, so content under
1764
+ // this subtree is harness-controlled.
1765
+ const bundledSkillsRoot = getBundledSkillsRoot() + sep
1766
+ if (normalizedPath.startsWith(bundledSkillsRoot)) {
1767
+ return {
1768
+ behavior: 'allow',
1769
+ updatedInput: input,
1770
+ decisionReason: {
1771
+ type: 'other',
1772
+ reason: 'Bundled skill reference files are allowed for reading',
1773
+ },
1774
+ }
1775
+ }
1776
+
1777
+ return { behavior: 'passthrough', message: '' }
1778
+ }