@xelauvas/xela-cli 0.1.0

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