@xortex/xcode 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/xcode +127 -0
  4. package/bin/xcode-test +84 -0
  5. package/bin/xcode.cmd +31 -0
  6. package/constants/apiLimits.ts +94 -0
  7. package/constants/betas.ts +52 -0
  8. package/constants/common.ts +33 -0
  9. package/constants/cyberRiskInstruction.ts +24 -0
  10. package/constants/errorIds.ts +15 -0
  11. package/constants/figures.ts +45 -0
  12. package/constants/files.ts +156 -0
  13. package/constants/github-app.ts +144 -0
  14. package/constants/keys.ts +11 -0
  15. package/constants/messages.ts +1 -0
  16. package/constants/oauth.ts +234 -0
  17. package/constants/outputStyles.ts +216 -0
  18. package/constants/product.ts +76 -0
  19. package/constants/prompts.ts +939 -0
  20. package/constants/spinnerVerbs.ts +204 -0
  21. package/constants/system.ts +95 -0
  22. package/constants/systemPromptSections.ts +68 -0
  23. package/constants/toolLimits.ts +56 -0
  24. package/constants/tools.ts +112 -0
  25. package/constants/turnCompletionVerbs.ts +12 -0
  26. package/constants/xml.ts +86 -0
  27. package/entrypoints/agentSdkTypes.ts +443 -0
  28. package/entrypoints/cli.tsx +307 -0
  29. package/entrypoints/init.ts +340 -0
  30. package/entrypoints/mcp.ts +196 -0
  31. package/entrypoints/sandboxTypes.ts +156 -0
  32. package/entrypoints/sdk/controlSchemas.ts +663 -0
  33. package/entrypoints/sdk/coreSchemas.ts +1889 -0
  34. package/entrypoints/sdk/coreTypes.generated.ts +2 -0
  35. package/entrypoints/sdk/coreTypes.ts +62 -0
  36. package/entrypoints/sdk/runtimeTypes.ts +140 -0
  37. package/entrypoints/sdk/sdkUtilityTypes.ts +3 -0
  38. package/entrypoints/sdk/toolTypes.ts +90 -0
  39. package/main.tsx +4686 -0
  40. package/package.json +120 -0
  41. package/services/AgentSummary/agentSummary.ts +179 -0
  42. package/services/MagicDocs/magicDocs.ts +254 -0
  43. package/services/MagicDocs/prompts.ts +127 -0
  44. package/services/PromptSuggestion/promptSuggestion.ts +523 -0
  45. package/services/PromptSuggestion/speculation.ts +991 -0
  46. package/services/SessionMemory/prompts.ts +324 -0
  47. package/services/SessionMemory/sessionMemory.ts +495 -0
  48. package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  49. package/services/analytics/config.ts +38 -0
  50. package/services/analytics/datadog.ts +307 -0
  51. package/services/analytics/firstPartyEventLogger.ts +449 -0
  52. package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  53. package/services/analytics/growthbook.ts +1155 -0
  54. package/services/analytics/index.ts +173 -0
  55. package/services/analytics/metadata.ts +973 -0
  56. package/services/analytics/sink.ts +114 -0
  57. package/services/analytics/sinkKillswitch.ts +25 -0
  58. package/services/api/adminRequests.ts +119 -0
  59. package/services/api/bootstrap.ts +141 -0
  60. package/services/api/claude.ts +3422 -0
  61. package/services/api/client.ts +406 -0
  62. package/services/api/dumpPrompts.ts +226 -0
  63. package/services/api/emptyUsage.ts +22 -0
  64. package/services/api/errorUtils.ts +260 -0
  65. package/services/api/errors.ts +1207 -0
  66. package/services/api/filesApi.ts +748 -0
  67. package/services/api/firstTokenDate.ts +60 -0
  68. package/services/api/gemini.ts +359 -0
  69. package/services/api/geminiAdapter.ts +123 -0
  70. package/services/api/geminiClient.ts +291 -0
  71. package/services/api/grove.ts +357 -0
  72. package/services/api/logging.ts +788 -0
  73. package/services/api/metricsOptOut.ts +159 -0
  74. package/services/api/openRouterClient.ts +453 -0
  75. package/services/api/overageCreditGrant.ts +137 -0
  76. package/services/api/promptCacheBreakDetection.ts +727 -0
  77. package/services/api/referral.ts +281 -0
  78. package/services/api/sessionIngress.ts +514 -0
  79. package/services/api/ultrareviewQuota.ts +38 -0
  80. package/services/api/usage.ts +63 -0
  81. package/services/api/withRetry.ts +822 -0
  82. package/services/autoDream/autoDream.ts +324 -0
  83. package/services/autoDream/config.ts +21 -0
  84. package/services/autoDream/consolidationLock.ts +140 -0
  85. package/services/autoDream/consolidationPrompt.ts +65 -0
  86. package/services/awaySummary.ts +74 -0
  87. package/services/claudeAiLimits.ts +515 -0
  88. package/services/claudeAiLimitsHook.ts +23 -0
  89. package/services/compact/apiMicrocompact.ts +153 -0
  90. package/services/compact/autoCompact.ts +351 -0
  91. package/services/compact/compact.ts +1705 -0
  92. package/services/compact/compactWarningHook.ts +16 -0
  93. package/services/compact/compactWarningState.ts +18 -0
  94. package/services/compact/grouping.ts +63 -0
  95. package/services/compact/microCompact.ts +530 -0
  96. package/services/compact/postCompactCleanup.ts +77 -0
  97. package/services/compact/prompt.ts +374 -0
  98. package/services/compact/sessionMemoryCompact.ts +630 -0
  99. package/services/compact/timeBasedMCConfig.ts +43 -0
  100. package/services/diagnosticTracking.ts +397 -0
  101. package/services/extractMemories/extractMemories.ts +517 -0
  102. package/services/extractMemories/prompts.ts +154 -0
  103. package/services/internalLogging.ts +90 -0
  104. package/services/lsp/LSPClient.ts +447 -0
  105. package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  106. package/services/lsp/LSPServerInstance.ts +511 -0
  107. package/services/lsp/LSPServerManager.ts +420 -0
  108. package/services/lsp/config.ts +79 -0
  109. package/services/lsp/manager.ts +289 -0
  110. package/services/lsp/passiveFeedback.ts +328 -0
  111. package/services/mcp/InProcessTransport.ts +63 -0
  112. package/services/mcp/MCPConnectionManager.tsx +73 -0
  113. package/services/mcp/SdkControlTransport.ts +136 -0
  114. package/services/mcp/auth.ts +2465 -0
  115. package/services/mcp/channelAllowlist.ts +76 -0
  116. package/services/mcp/channelNotification.ts +316 -0
  117. package/services/mcp/channelPermissions.ts +240 -0
  118. package/services/mcp/claudeai.ts +164 -0
  119. package/services/mcp/client.ts +3348 -0
  120. package/services/mcp/config.ts +1578 -0
  121. package/services/mcp/elicitationHandler.ts +313 -0
  122. package/services/mcp/envExpansion.ts +38 -0
  123. package/services/mcp/headersHelper.ts +138 -0
  124. package/services/mcp/mcpStringUtils.ts +106 -0
  125. package/services/mcp/normalization.ts +23 -0
  126. package/services/mcp/oauthPort.ts +78 -0
  127. package/services/mcp/officialRegistry.ts +72 -0
  128. package/services/mcp/types.ts +258 -0
  129. package/services/mcp/useManageMCPConnections.ts +1141 -0
  130. package/services/mcp/utils.ts +575 -0
  131. package/services/mcp/vscodeSdkMcp.ts +112 -0
  132. package/services/mcp/xaa.ts +511 -0
  133. package/services/mcp/xaaIdpLogin.ts +487 -0
  134. package/services/mcpServerApproval.tsx +41 -0
  135. package/services/mockRateLimits.ts +882 -0
  136. package/services/notifier.ts +156 -0
  137. package/services/oauth/auth-code-listener.ts +211 -0
  138. package/services/oauth/client.ts +566 -0
  139. package/services/oauth/crypto.ts +23 -0
  140. package/services/oauth/getOauthProfile.ts +53 -0
  141. package/services/oauth/index.ts +198 -0
  142. package/services/plugins/PluginInstallationManager.ts +184 -0
  143. package/services/plugins/pluginCliCommands.ts +344 -0
  144. package/services/plugins/pluginOperations.ts +1088 -0
  145. package/services/policyLimits/index.ts +663 -0
  146. package/services/policyLimits/types.ts +27 -0
  147. package/services/preventSleep.ts +165 -0
  148. package/services/rateLimitMessages.ts +344 -0
  149. package/services/rateLimitMocking.ts +144 -0
  150. package/services/remoteManagedSettings/index.ts +638 -0
  151. package/services/remoteManagedSettings/securityCheck.tsx +74 -0
  152. package/services/remoteManagedSettings/syncCache.ts +112 -0
  153. package/services/remoteManagedSettings/syncCacheState.ts +96 -0
  154. package/services/remoteManagedSettings/types.ts +31 -0
  155. package/services/settingsSync/index.ts +581 -0
  156. package/services/settingsSync/types.ts +67 -0
  157. package/services/teamMemorySync/index.ts +1256 -0
  158. package/services/teamMemorySync/secretScanner.ts +324 -0
  159. package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  160. package/services/teamMemorySync/types.ts +156 -0
  161. package/services/teamMemorySync/watcher.ts +387 -0
  162. package/services/tips/tipHistory.ts +17 -0
  163. package/services/tips/tipRegistry.ts +686 -0
  164. package/services/tips/tipScheduler.ts +58 -0
  165. package/services/tokenEstimation.ts +495 -0
  166. package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  167. package/services/tools/StreamingToolExecutor.ts +530 -0
  168. package/services/tools/toolExecution.ts +1745 -0
  169. package/services/tools/toolHooks.ts +650 -0
  170. package/services/tools/toolOrchestration.ts +188 -0
  171. package/services/vcr.ts +406 -0
  172. package/services/voice.ts +525 -0
  173. package/services/voiceKeyterms.ts +106 -0
  174. package/services/voiceStreamSTT.ts +544 -0
  175. package/tools/AgentTool/AgentTool.tsx +1398 -0
  176. package/tools/AgentTool/UI.tsx +872 -0
  177. package/tools/AgentTool/agentColorManager.ts +66 -0
  178. package/tools/AgentTool/agentDisplay.ts +104 -0
  179. package/tools/AgentTool/agentMemory.ts +177 -0
  180. package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  181. package/tools/AgentTool/agentToolUtils.ts +686 -0
  182. package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  183. package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  184. package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  185. package/tools/AgentTool/built-in/planAgent.ts +92 -0
  186. package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  187. package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  188. package/tools/AgentTool/builtInAgents.ts +72 -0
  189. package/tools/AgentTool/constants.ts +12 -0
  190. package/tools/AgentTool/forkSubagent.ts +210 -0
  191. package/tools/AgentTool/loadAgentsDir.ts +755 -0
  192. package/tools/AgentTool/prompt.ts +287 -0
  193. package/tools/AgentTool/resumeAgent.ts +265 -0
  194. package/tools/AgentTool/runAgent.ts +973 -0
  195. package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  196. package/tools/AskUserQuestionTool/prompt.ts +44 -0
  197. package/tools/BashTool/BashTool.tsx +1144 -0
  198. package/tools/BashTool/BashToolResultMessage.tsx +191 -0
  199. package/tools/BashTool/UI.tsx +185 -0
  200. package/tools/BashTool/bashCommandHelpers.ts +265 -0
  201. package/tools/BashTool/bashPermissions.ts +2621 -0
  202. package/tools/BashTool/bashSecurity.ts +2592 -0
  203. package/tools/BashTool/commandSemantics.ts +140 -0
  204. package/tools/BashTool/commentLabel.ts +13 -0
  205. package/tools/BashTool/destructiveCommandWarning.ts +102 -0
  206. package/tools/BashTool/modeValidation.ts +115 -0
  207. package/tools/BashTool/pathValidation.ts +1303 -0
  208. package/tools/BashTool/prompt.ts +369 -0
  209. package/tools/BashTool/readOnlyValidation.ts +1990 -0
  210. package/tools/BashTool/sedEditParser.ts +322 -0
  211. package/tools/BashTool/sedValidation.ts +684 -0
  212. package/tools/BashTool/shouldUseSandbox.ts +153 -0
  213. package/tools/BashTool/toolName.ts +2 -0
  214. package/tools/BashTool/utils.ts +223 -0
  215. package/tools/BriefTool/BriefTool.ts +204 -0
  216. package/tools/BriefTool/UI.tsx +101 -0
  217. package/tools/BriefTool/attachments.ts +110 -0
  218. package/tools/BriefTool/prompt.ts +22 -0
  219. package/tools/BriefTool/upload.ts +174 -0
  220. package/tools/ConfigTool/ConfigTool.ts +467 -0
  221. package/tools/ConfigTool/UI.tsx +38 -0
  222. package/tools/ConfigTool/constants.ts +1 -0
  223. package/tools/ConfigTool/prompt.ts +93 -0
  224. package/tools/ConfigTool/supportedSettings.ts +211 -0
  225. package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  226. package/tools/EnterPlanModeTool/UI.tsx +33 -0
  227. package/tools/EnterPlanModeTool/constants.ts +1 -0
  228. package/tools/EnterPlanModeTool/prompt.ts +170 -0
  229. package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  230. package/tools/EnterWorktreeTool/UI.tsx +20 -0
  231. package/tools/EnterWorktreeTool/constants.ts +1 -0
  232. package/tools/EnterWorktreeTool/prompt.ts +30 -0
  233. package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  234. package/tools/ExitPlanModeTool/UI.tsx +82 -0
  235. package/tools/ExitPlanModeTool/constants.ts +2 -0
  236. package/tools/ExitPlanModeTool/prompt.ts +29 -0
  237. package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  238. package/tools/ExitWorktreeTool/UI.tsx +25 -0
  239. package/tools/ExitWorktreeTool/constants.ts +1 -0
  240. package/tools/ExitWorktreeTool/prompt.ts +32 -0
  241. package/tools/FileEditTool/FileEditTool.ts +625 -0
  242. package/tools/FileEditTool/UI.tsx +289 -0
  243. package/tools/FileEditTool/constants.ts +11 -0
  244. package/tools/FileEditTool/prompt.ts +28 -0
  245. package/tools/FileEditTool/types.ts +85 -0
  246. package/tools/FileEditTool/utils.ts +775 -0
  247. package/tools/FileReadTool/FileReadTool.ts +1183 -0
  248. package/tools/FileReadTool/UI.tsx +185 -0
  249. package/tools/FileReadTool/imageProcessor.ts +94 -0
  250. package/tools/FileReadTool/limits.ts +92 -0
  251. package/tools/FileReadTool/prompt.ts +49 -0
  252. package/tools/FileWriteTool/FileWriteTool.ts +434 -0
  253. package/tools/FileWriteTool/UI.tsx +405 -0
  254. package/tools/FileWriteTool/prompt.ts +18 -0
  255. package/tools/GlobTool/GlobTool.ts +198 -0
  256. package/tools/GlobTool/UI.tsx +63 -0
  257. package/tools/GlobTool/prompt.ts +7 -0
  258. package/tools/GrepTool/GrepTool.ts +577 -0
  259. package/tools/GrepTool/UI.tsx +201 -0
  260. package/tools/GrepTool/prompt.ts +18 -0
  261. package/tools/LSPTool/LSPTool.ts +860 -0
  262. package/tools/LSPTool/UI.tsx +228 -0
  263. package/tools/LSPTool/formatters.ts +592 -0
  264. package/tools/LSPTool/prompt.ts +21 -0
  265. package/tools/LSPTool/schemas.ts +215 -0
  266. package/tools/LSPTool/symbolContext.ts +90 -0
  267. package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  268. package/tools/ListMcpResourcesTool/UI.tsx +29 -0
  269. package/tools/ListMcpResourcesTool/prompt.ts +20 -0
  270. package/tools/MCPTool/MCPTool.ts +77 -0
  271. package/tools/MCPTool/UI.tsx +403 -0
  272. package/tools/MCPTool/classifyForCollapse.ts +604 -0
  273. package/tools/MCPTool/prompt.ts +3 -0
  274. package/tools/McpAuthTool/McpAuthTool.ts +215 -0
  275. package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  276. package/tools/NotebookEditTool/UI.tsx +93 -0
  277. package/tools/NotebookEditTool/constants.ts +2 -0
  278. package/tools/NotebookEditTool/prompt.ts +3 -0
  279. package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  280. package/tools/PowerShellTool/UI.tsx +131 -0
  281. package/tools/PowerShellTool/clmTypes.ts +211 -0
  282. package/tools/PowerShellTool/commandSemantics.ts +142 -0
  283. package/tools/PowerShellTool/commonParameters.ts +30 -0
  284. package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  285. package/tools/PowerShellTool/gitSafety.ts +176 -0
  286. package/tools/PowerShellTool/modeValidation.ts +404 -0
  287. package/tools/PowerShellTool/pathValidation.ts +2049 -0
  288. package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  289. package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  290. package/tools/PowerShellTool/prompt.ts +145 -0
  291. package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  292. package/tools/PowerShellTool/toolName.ts +2 -0
  293. package/tools/REPLTool/constants.ts +46 -0
  294. package/tools/REPLTool/primitiveTools.ts +39 -0
  295. package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  296. package/tools/ReadMcpResourceTool/UI.tsx +37 -0
  297. package/tools/ReadMcpResourceTool/prompt.ts +16 -0
  298. package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  299. package/tools/RemoteTriggerTool/UI.tsx +17 -0
  300. package/tools/RemoteTriggerTool/prompt.ts +15 -0
  301. package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  302. package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  303. package/tools/ScheduleCronTool/CronListTool.ts +97 -0
  304. package/tools/ScheduleCronTool/UI.tsx +60 -0
  305. package/tools/ScheduleCronTool/prompt.ts +135 -0
  306. package/tools/SendMessageTool/SendMessageTool.ts +917 -0
  307. package/tools/SendMessageTool/UI.tsx +31 -0
  308. package/tools/SendMessageTool/constants.ts +1 -0
  309. package/tools/SendMessageTool/prompt.ts +49 -0
  310. package/tools/SkillTool/SkillTool.ts +1108 -0
  311. package/tools/SkillTool/UI.tsx +128 -0
  312. package/tools/SkillTool/constants.ts +1 -0
  313. package/tools/SkillTool/prompt.ts +241 -0
  314. package/tools/SleepTool/prompt.ts +17 -0
  315. package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  316. package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  317. package/tools/TaskCreateTool/constants.ts +1 -0
  318. package/tools/TaskCreateTool/prompt.ts +56 -0
  319. package/tools/TaskGetTool/TaskGetTool.ts +128 -0
  320. package/tools/TaskGetTool/constants.ts +1 -0
  321. package/tools/TaskGetTool/prompt.ts +24 -0
  322. package/tools/TaskListTool/TaskListTool.ts +116 -0
  323. package/tools/TaskListTool/constants.ts +1 -0
  324. package/tools/TaskListTool/prompt.ts +49 -0
  325. package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  326. package/tools/TaskOutputTool/constants.ts +1 -0
  327. package/tools/TaskStopTool/TaskStopTool.ts +131 -0
  328. package/tools/TaskStopTool/UI.tsx +41 -0
  329. package/tools/TaskStopTool/prompt.ts +8 -0
  330. package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  331. package/tools/TaskUpdateTool/constants.ts +1 -0
  332. package/tools/TaskUpdateTool/prompt.ts +77 -0
  333. package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  334. package/tools/TeamCreateTool/UI.tsx +6 -0
  335. package/tools/TeamCreateTool/constants.ts +1 -0
  336. package/tools/TeamCreateTool/prompt.ts +113 -0
  337. package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  338. package/tools/TeamDeleteTool/UI.tsx +20 -0
  339. package/tools/TeamDeleteTool/constants.ts +1 -0
  340. package/tools/TeamDeleteTool/prompt.ts +16 -0
  341. package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  342. package/tools/TodoWriteTool/constants.ts +1 -0
  343. package/tools/TodoWriteTool/prompt.ts +184 -0
  344. package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  345. package/tools/ToolSearchTool/constants.ts +1 -0
  346. package/tools/ToolSearchTool/prompt.ts +121 -0
  347. package/tools/TungstenTool/TungstenTool.ts +4 -0
  348. package/tools/WebFetchTool/UI.tsx +72 -0
  349. package/tools/WebFetchTool/WebFetchTool.ts +318 -0
  350. package/tools/WebFetchTool/preapproved.ts +166 -0
  351. package/tools/WebFetchTool/prompt.ts +46 -0
  352. package/tools/WebFetchTool/utils.ts +530 -0
  353. package/tools/WebSearchTool/UI.tsx +101 -0
  354. package/tools/WebSearchTool/WebSearchTool.ts +435 -0
  355. package/tools/WebSearchTool/prompt.ts +34 -0
  356. package/tools/WorkflowTool/constants.ts +2 -0
  357. package/tools/XMemIngestTool/XMemIngestTool.ts +140 -0
  358. package/tools/XMemIngestTool/prompt.ts +13 -0
  359. package/tools/XMemRetrieveTool/XMemRetrieveTool.ts +177 -0
  360. package/tools/XMemRetrieveTool/prompt.ts +16 -0
  361. package/tools/XMemSearchTool/XMemSearchTool.ts +172 -0
  362. package/tools/XMemSearchTool/prompt.ts +11 -0
  363. package/tools/shared/gitOperationTracking.ts +277 -0
  364. package/tools/shared/spawnMultiAgent.ts +1093 -0
  365. package/tools/testing/TestingPermissionTool.tsx +74 -0
  366. package/tools/utils.ts +40 -0
  367. package/utils/CircularBuffer.ts +84 -0
  368. package/utils/Cursor.ts +1530 -0
  369. package/utils/QueryGuard.ts +121 -0
  370. package/utils/Shell.ts +474 -0
  371. package/utils/ShellCommand.ts +465 -0
  372. package/utils/abortController.ts +99 -0
  373. package/utils/activityManager.ts +164 -0
  374. package/utils/advisor.ts +145 -0
  375. package/utils/agentContext.ts +178 -0
  376. package/utils/agentId.ts +99 -0
  377. package/utils/agentSwarmsEnabled.ts +44 -0
  378. package/utils/agenticSessionSearch.ts +307 -0
  379. package/utils/analyzeContext.ts +1382 -0
  380. package/utils/ansiToPng.ts +334 -0
  381. package/utils/ansiToSvg.ts +272 -0
  382. package/utils/api.ts +718 -0
  383. package/utils/apiPreconnect.ts +71 -0
  384. package/utils/appleTerminalBackup.ts +124 -0
  385. package/utils/argumentSubstitution.ts +145 -0
  386. package/utils/array.ts +13 -0
  387. package/utils/asciicast.ts +239 -0
  388. package/utils/attachments.ts +4091 -0
  389. package/utils/attribution.ts +393 -0
  390. package/utils/auth.ts +2002 -0
  391. package/utils/authFileDescriptor.ts +196 -0
  392. package/utils/authPortable.ts +19 -0
  393. package/utils/autoModeDenials.ts +26 -0
  394. package/utils/autoRunIssue.tsx +122 -0
  395. package/utils/autoUpdater.ts +561 -0
  396. package/utils/aws.ts +74 -0
  397. package/utils/awsAuthStatusManager.ts +81 -0
  398. package/utils/axios.ts +8 -0
  399. package/utils/background/remote/preconditions.ts +235 -0
  400. package/utils/background/remote/remoteSession.ts +98 -0
  401. package/utils/backgroundHousekeeping.ts +94 -0
  402. package/utils/bash/ParsedCommand.ts +318 -0
  403. package/utils/bash/ShellSnapshot.ts +582 -0
  404. package/utils/bash/ast.ts +2679 -0
  405. package/utils/bash/bashParser.ts +4436 -0
  406. package/utils/bash/bashPipeCommand.ts +294 -0
  407. package/utils/bash/commands.ts +1339 -0
  408. package/utils/bash/heredoc.ts +733 -0
  409. package/utils/bash/parser.ts +230 -0
  410. package/utils/bash/prefix.ts +204 -0
  411. package/utils/bash/registry.ts +53 -0
  412. package/utils/bash/shellCompletion.ts +259 -0
  413. package/utils/bash/shellPrefix.ts +28 -0
  414. package/utils/bash/shellQuote.ts +304 -0
  415. package/utils/bash/shellQuoting.ts +128 -0
  416. package/utils/bash/specs/alias.ts +14 -0
  417. package/utils/bash/specs/index.ts +18 -0
  418. package/utils/bash/specs/nohup.ts +13 -0
  419. package/utils/bash/specs/pyright.ts +91 -0
  420. package/utils/bash/specs/sleep.ts +13 -0
  421. package/utils/bash/specs/srun.ts +31 -0
  422. package/utils/bash/specs/time.ts +13 -0
  423. package/utils/bash/specs/timeout.ts +20 -0
  424. package/utils/bash/treeSitterAnalysis.ts +506 -0
  425. package/utils/betas.ts +434 -0
  426. package/utils/billing.ts +78 -0
  427. package/utils/binaryCheck.ts +53 -0
  428. package/utils/browser.ts +68 -0
  429. package/utils/bufferedWriter.ts +100 -0
  430. package/utils/bundledMode.ts +22 -0
  431. package/utils/caCerts.ts +115 -0
  432. package/utils/caCertsConfig.ts +88 -0
  433. package/utils/cachePaths.ts +38 -0
  434. package/utils/classifierApprovals.ts +88 -0
  435. package/utils/classifierApprovalsHook.ts +17 -0
  436. package/utils/claudeCodeHints.ts +193 -0
  437. package/utils/claudeDesktop.ts +152 -0
  438. package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  439. package/utils/claudeInChrome/common.ts +540 -0
  440. package/utils/claudeInChrome/mcpServer.ts +292 -0
  441. package/utils/claudeInChrome/prompt.ts +83 -0
  442. package/utils/claudeInChrome/setup.ts +400 -0
  443. package/utils/claudeInChrome/setupPortable.ts +233 -0
  444. package/utils/claudeInChrome/toolRendering.tsx +262 -0
  445. package/utils/claudemd.ts +1479 -0
  446. package/utils/cleanup.ts +602 -0
  447. package/utils/cleanupRegistry.ts +25 -0
  448. package/utils/cliArgs.ts +60 -0
  449. package/utils/cliHighlight.ts +54 -0
  450. package/utils/codeIndexing.ts +206 -0
  451. package/utils/collapseBackgroundBashNotifications.ts +84 -0
  452. package/utils/collapseHookSummaries.ts +59 -0
  453. package/utils/collapseReadSearch.ts +1109 -0
  454. package/utils/collapseTeammateShutdowns.ts +55 -0
  455. package/utils/color-diff-mock.ts +27 -0
  456. package/utils/combinedAbortSignal.ts +47 -0
  457. package/utils/commandLifecycle.ts +21 -0
  458. package/utils/commitAttribution.ts +961 -0
  459. package/utils/completionCache.ts +166 -0
  460. package/utils/computerUse/appNames.ts +196 -0
  461. package/utils/computerUse/cleanup.ts +86 -0
  462. package/utils/computerUse/common.ts +61 -0
  463. package/utils/computerUse/computerUseLock.ts +215 -0
  464. package/utils/computerUse/drainRunLoop.ts +79 -0
  465. package/utils/computerUse/escHotkey.ts +54 -0
  466. package/utils/computerUse/executor.ts +658 -0
  467. package/utils/computerUse/gates.ts +72 -0
  468. package/utils/computerUse/hostAdapter.ts +69 -0
  469. package/utils/computerUse/inputLoader.ts +30 -0
  470. package/utils/computerUse/mcpServer.ts +106 -0
  471. package/utils/computerUse/setup.ts +53 -0
  472. package/utils/computerUse/swiftLoader.ts +23 -0
  473. package/utils/computerUse/toolRendering.tsx +125 -0
  474. package/utils/computerUse/wrapper.tsx +336 -0
  475. package/utils/concurrentSessions.ts +204 -0
  476. package/utils/config.ts +1817 -0
  477. package/utils/configConstants.ts +21 -0
  478. package/utils/contentArray.ts +51 -0
  479. package/utils/context.ts +221 -0
  480. package/utils/contextAnalysis.ts +272 -0
  481. package/utils/contextSuggestions.ts +235 -0
  482. package/utils/controlMessageCompat.ts +32 -0
  483. package/utils/conversationRecovery.ts +597 -0
  484. package/utils/cron.ts +308 -0
  485. package/utils/cronJitterConfig.ts +75 -0
  486. package/utils/cronScheduler.ts +565 -0
  487. package/utils/cronTasks.ts +458 -0
  488. package/utils/cronTasksLock.ts +195 -0
  489. package/utils/crossProjectResume.ts +75 -0
  490. package/utils/crypto.ts +13 -0
  491. package/utils/cwd.ts +32 -0
  492. package/utils/debug.ts +268 -0
  493. package/utils/debugFilter.ts +157 -0
  494. package/utils/deepLink/banner.ts +123 -0
  495. package/utils/deepLink/parseDeepLink.ts +170 -0
  496. package/utils/deepLink/protocolHandler.ts +136 -0
  497. package/utils/deepLink/registerProtocol.ts +348 -0
  498. package/utils/deepLink/terminalLauncher.ts +557 -0
  499. package/utils/deepLink/terminalPreference.ts +54 -0
  500. package/utils/desktopDeepLink.ts +236 -0
  501. package/utils/detectRepository.ts +178 -0
  502. package/utils/diagLogs.ts +94 -0
  503. package/utils/diff.ts +177 -0
  504. package/utils/directMemberMessage.ts +69 -0
  505. package/utils/displayTags.ts +51 -0
  506. package/utils/doctorContextWarnings.ts +265 -0
  507. package/utils/doctorDiagnostic.ts +625 -0
  508. package/utils/dxt/helpers.ts +88 -0
  509. package/utils/dxt/zip.ts +226 -0
  510. package/utils/earlyInput.ts +191 -0
  511. package/utils/editor.ts +183 -0
  512. package/utils/effort.ts +329 -0
  513. package/utils/embeddedTools.ts +29 -0
  514. package/utils/env.ts +347 -0
  515. package/utils/envDynamic.ts +151 -0
  516. package/utils/envUtils.ts +183 -0
  517. package/utils/envValidation.ts +38 -0
  518. package/utils/errorLogSink.ts +235 -0
  519. package/utils/errors.ts +238 -0
  520. package/utils/exampleCommands.ts +184 -0
  521. package/utils/execFileNoThrow.ts +150 -0
  522. package/utils/execFileNoThrowPortable.ts +89 -0
  523. package/utils/execSyncWrapper.ts +38 -0
  524. package/utils/exportRenderer.tsx +98 -0
  525. package/utils/extraUsage.ts +23 -0
  526. package/utils/fastMode.ts +532 -0
  527. package/utils/file.ts +584 -0
  528. package/utils/fileHistory.ts +1115 -0
  529. package/utils/fileOperationAnalytics.ts +71 -0
  530. package/utils/filePersistence/filePersistence.ts +287 -0
  531. package/utils/filePersistence/outputsScanner.ts +126 -0
  532. package/utils/fileRead.ts +102 -0
  533. package/utils/fileReadCache.ts +96 -0
  534. package/utils/fileStateCache.ts +142 -0
  535. package/utils/findExecutable.ts +17 -0
  536. package/utils/fingerprint.ts +76 -0
  537. package/utils/forkedAgent.ts +689 -0
  538. package/utils/format.ts +308 -0
  539. package/utils/formatBriefTimestamp.ts +81 -0
  540. package/utils/fpsTracker.ts +47 -0
  541. package/utils/frontmatterParser.ts +370 -0
  542. package/utils/fsOperations.ts +770 -0
  543. package/utils/fullscreen.ts +202 -0
  544. package/utils/generatedFiles.ts +136 -0
  545. package/utils/generators.ts +88 -0
  546. package/utils/genericProcessUtils.ts +184 -0
  547. package/utils/getWorktreePaths.ts +70 -0
  548. package/utils/getWorktreePathsPortable.ts +27 -0
  549. package/utils/ghPrStatus.ts +106 -0
  550. package/utils/git/gitConfigParser.ts +277 -0
  551. package/utils/git/gitFilesystem.ts +699 -0
  552. package/utils/git/gitignore.ts +99 -0
  553. package/utils/git.ts +926 -0
  554. package/utils/gitDiff.ts +532 -0
  555. package/utils/gitSettings.ts +18 -0
  556. package/utils/github/ghAuthStatus.ts +29 -0
  557. package/utils/githubRepoPathMapping.ts +162 -0
  558. package/utils/glob.ts +130 -0
  559. package/utils/gracefulShutdown.ts +529 -0
  560. package/utils/groupToolUses.ts +182 -0
  561. package/utils/handlePromptSubmit.ts +610 -0
  562. package/utils/hash.ts +46 -0
  563. package/utils/headlessProfiler.ts +178 -0
  564. package/utils/heapDumpService.ts +303 -0
  565. package/utils/heatmap.ts +198 -0
  566. package/utils/highlightMatch.tsx +28 -0
  567. package/utils/hooks/AsyncHookRegistry.ts +309 -0
  568. package/utils/hooks/apiQueryHookHelper.ts +141 -0
  569. package/utils/hooks/execAgentHook.ts +339 -0
  570. package/utils/hooks/execHttpHook.ts +242 -0
  571. package/utils/hooks/execPromptHook.ts +211 -0
  572. package/utils/hooks/fileChangedWatcher.ts +191 -0
  573. package/utils/hooks/hookEvents.ts +192 -0
  574. package/utils/hooks/hookHelpers.ts +83 -0
  575. package/utils/hooks/hooksConfigManager.ts +400 -0
  576. package/utils/hooks/hooksConfigSnapshot.ts +133 -0
  577. package/utils/hooks/hooksSettings.ts +271 -0
  578. package/utils/hooks/postSamplingHooks.ts +70 -0
  579. package/utils/hooks/registerFrontmatterHooks.ts +67 -0
  580. package/utils/hooks/registerSkillHooks.ts +64 -0
  581. package/utils/hooks/sessionHooks.ts +447 -0
  582. package/utils/hooks/skillImprovement.ts +267 -0
  583. package/utils/hooks/ssrfGuard.ts +294 -0
  584. package/utils/hooks.ts +5022 -0
  585. package/utils/horizontalScroll.ts +137 -0
  586. package/utils/http.ts +136 -0
  587. package/utils/hyperlink.ts +39 -0
  588. package/utils/iTermBackup.ts +73 -0
  589. package/utils/ide.ts +1494 -0
  590. package/utils/idePathConversion.ts +90 -0
  591. package/utils/idleTimeout.ts +53 -0
  592. package/utils/imagePaste.ts +416 -0
  593. package/utils/imageResizer.ts +880 -0
  594. package/utils/imageStore.ts +167 -0
  595. package/utils/imageValidation.ts +104 -0
  596. package/utils/immediateCommand.ts +15 -0
  597. package/utils/inProcessTeammateHelpers.ts +102 -0
  598. package/utils/ink.ts +26 -0
  599. package/utils/intl.ts +94 -0
  600. package/utils/jetbrains.ts +191 -0
  601. package/utils/json.ts +277 -0
  602. package/utils/jsonRead.ts +16 -0
  603. package/utils/keyboardShortcuts.ts +14 -0
  604. package/utils/lazySchema.ts +8 -0
  605. package/utils/listSessionsImpl.ts +454 -0
  606. package/utils/localInstaller.ts +162 -0
  607. package/utils/lockfile.ts +43 -0
  608. package/utils/log.ts +362 -0
  609. package/utils/logoV2Utils.ts +347 -0
  610. package/utils/mailbox.ts +73 -0
  611. package/utils/managedEnv.ts +199 -0
  612. package/utils/managedEnvConstants.ts +191 -0
  613. package/utils/markdown.ts +381 -0
  614. package/utils/markdownConfigLoader.ts +600 -0
  615. package/utils/mcp/dateTimeParser.ts +121 -0
  616. package/utils/mcp/elicitationValidation.ts +336 -0
  617. package/utils/mcpInstructionsDelta.ts +130 -0
  618. package/utils/mcpOutputStorage.ts +189 -0
  619. package/utils/mcpValidation.ts +208 -0
  620. package/utils/mcpWebSocketTransport.ts +200 -0
  621. package/utils/memoize.ts +269 -0
  622. package/utils/memory/types.ts +12 -0
  623. package/utils/memory/versions.ts +8 -0
  624. package/utils/memoryFileDetection.ts +289 -0
  625. package/utils/messagePredicates.ts +8 -0
  626. package/utils/messageQueueManager.ts +547 -0
  627. package/utils/messages/mappers.ts +290 -0
  628. package/utils/messages/systemInit.ts +96 -0
  629. package/utils/messages.ts +5520 -0
  630. package/utils/model/agent.ts +157 -0
  631. package/utils/model/aliases.ts +35 -0
  632. package/utils/model/antModels.ts +64 -0
  633. package/utils/model/bedrock.ts +265 -0
  634. package/utils/model/check1mAccess.ts +72 -0
  635. package/utils/model/configs.ts +158 -0
  636. package/utils/model/contextWindowUpgradeCheck.ts +47 -0
  637. package/utils/model/deprecation.ts +101 -0
  638. package/utils/model/model.ts +654 -0
  639. package/utils/model/modelAllowlist.ts +170 -0
  640. package/utils/model/modelCapabilities.ts +118 -0
  641. package/utils/model/modelOptions.ts +589 -0
  642. package/utils/model/modelStrings.ts +170 -0
  643. package/utils/model/modelSupportOverrides.ts +50 -0
  644. package/utils/model/providers.ts +42 -0
  645. package/utils/model/validateModel.ts +159 -0
  646. package/utils/modelCost.ts +231 -0
  647. package/utils/modifiers.ts +36 -0
  648. package/utils/mtls.ts +179 -0
  649. package/utils/nativeInstaller/download.ts +523 -0
  650. package/utils/nativeInstaller/index.ts +18 -0
  651. package/utils/nativeInstaller/installer.ts +1708 -0
  652. package/utils/nativeInstaller/packageManagers.ts +336 -0
  653. package/utils/nativeInstaller/pidLock.ts +433 -0
  654. package/utils/notebook.ts +224 -0
  655. package/utils/objectGroupBy.ts +18 -0
  656. package/utils/pasteStore.ts +104 -0
  657. package/utils/path.ts +155 -0
  658. package/utils/pdf.ts +300 -0
  659. package/utils/pdfUtils.ts +70 -0
  660. package/utils/peerAddress.ts +21 -0
  661. package/utils/permissions/PermissionMode.ts +141 -0
  662. package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  663. package/utils/permissions/PermissionResult.ts +35 -0
  664. package/utils/permissions/PermissionRule.ts +40 -0
  665. package/utils/permissions/PermissionUpdate.ts +389 -0
  666. package/utils/permissions/PermissionUpdateSchema.ts +78 -0
  667. package/utils/permissions/autoModeState.ts +39 -0
  668. package/utils/permissions/bashClassifier.ts +61 -0
  669. package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  670. package/utils/permissions/classifierDecision.ts +98 -0
  671. package/utils/permissions/classifierShared.ts +39 -0
  672. package/utils/permissions/dangerousPatterns.ts +80 -0
  673. package/utils/permissions/denialTracking.ts +45 -0
  674. package/utils/permissions/filesystem.ts +1777 -0
  675. package/utils/permissions/getNextPermissionMode.ts +101 -0
  676. package/utils/permissions/pathValidation.ts +485 -0
  677. package/utils/permissions/permissionExplainer.ts +250 -0
  678. package/utils/permissions/permissionRuleParser.ts +198 -0
  679. package/utils/permissions/permissionSetup.ts +1532 -0
  680. package/utils/permissions/permissions.ts +1486 -0
  681. package/utils/permissions/permissionsLoader.ts +296 -0
  682. package/utils/permissions/shadowedRuleDetection.ts +234 -0
  683. package/utils/permissions/shellRuleMatching.ts +228 -0
  684. package/utils/permissions/yoloClassifier.ts +1495 -0
  685. package/utils/planModeV2.ts +95 -0
  686. package/utils/plans.ts +397 -0
  687. package/utils/platform.ts +150 -0
  688. package/utils/plugins/addDirPluginSettings.ts +71 -0
  689. package/utils/plugins/cacheUtils.ts +196 -0
  690. package/utils/plugins/dependencyResolver.ts +305 -0
  691. package/utils/plugins/fetchTelemetry.ts +135 -0
  692. package/utils/plugins/gitAvailability.ts +69 -0
  693. package/utils/plugins/headlessPluginInstall.ts +174 -0
  694. package/utils/plugins/hintRecommendation.ts +164 -0
  695. package/utils/plugins/installCounts.ts +292 -0
  696. package/utils/plugins/installedPluginsManager.ts +1268 -0
  697. package/utils/plugins/loadPluginAgents.ts +348 -0
  698. package/utils/plugins/loadPluginCommands.ts +946 -0
  699. package/utils/plugins/loadPluginHooks.ts +287 -0
  700. package/utils/plugins/loadPluginOutputStyles.ts +178 -0
  701. package/utils/plugins/lspPluginIntegration.ts +387 -0
  702. package/utils/plugins/lspRecommendation.ts +374 -0
  703. package/utils/plugins/managedPlugins.ts +27 -0
  704. package/utils/plugins/marketplaceHelpers.ts +592 -0
  705. package/utils/plugins/marketplaceManager.ts +2643 -0
  706. package/utils/plugins/mcpPluginIntegration.ts +634 -0
  707. package/utils/plugins/mcpbHandler.ts +968 -0
  708. package/utils/plugins/officialMarketplace.ts +25 -0
  709. package/utils/plugins/officialMarketplaceGcs.ts +216 -0
  710. package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  711. package/utils/plugins/orphanedPluginFilter.ts +114 -0
  712. package/utils/plugins/parseMarketplaceInput.ts +162 -0
  713. package/utils/plugins/performStartupChecks.tsx +70 -0
  714. package/utils/plugins/pluginAutoupdate.ts +284 -0
  715. package/utils/plugins/pluginBlocklist.ts +127 -0
  716. package/utils/plugins/pluginDirectories.ts +178 -0
  717. package/utils/plugins/pluginFlagging.ts +208 -0
  718. package/utils/plugins/pluginIdentifier.ts +123 -0
  719. package/utils/plugins/pluginInstallationHelpers.ts +595 -0
  720. package/utils/plugins/pluginLoader.ts +3302 -0
  721. package/utils/plugins/pluginOptionsStorage.ts +400 -0
  722. package/utils/plugins/pluginPolicy.ts +20 -0
  723. package/utils/plugins/pluginStartupCheck.ts +341 -0
  724. package/utils/plugins/pluginVersioning.ts +157 -0
  725. package/utils/plugins/reconciler.ts +265 -0
  726. package/utils/plugins/refresh.ts +215 -0
  727. package/utils/plugins/schemas.ts +1681 -0
  728. package/utils/plugins/validatePlugin.ts +903 -0
  729. package/utils/plugins/walkPluginMarkdown.ts +69 -0
  730. package/utils/plugins/zipCache.ts +406 -0
  731. package/utils/plugins/zipCacheAdapters.ts +164 -0
  732. package/utils/powershell/dangerousCmdlets.ts +185 -0
  733. package/utils/powershell/parser.ts +1804 -0
  734. package/utils/powershell/staticPrefix.ts +316 -0
  735. package/utils/preflightChecks.tsx +151 -0
  736. package/utils/privacyLevel.ts +55 -0
  737. package/utils/process.ts +68 -0
  738. package/utils/processUserInput/processBashCommand.tsx +140 -0
  739. package/utils/processUserInput/processSlashCommand.tsx +922 -0
  740. package/utils/processUserInput/processTextPrompt.ts +100 -0
  741. package/utils/processUserInput/processUserInput.ts +605 -0
  742. package/utils/profilerBase.ts +46 -0
  743. package/utils/promptCategory.ts +49 -0
  744. package/utils/promptEditor.ts +188 -0
  745. package/utils/promptShellExecution.ts +183 -0
  746. package/utils/proxy.ts +426 -0
  747. package/utils/queryContext.ts +179 -0
  748. package/utils/queryHelpers.ts +552 -0
  749. package/utils/queryProfiler.ts +301 -0
  750. package/utils/queueProcessor.ts +95 -0
  751. package/utils/readEditContext.ts +227 -0
  752. package/utils/readFileInRange.ts +383 -0
  753. package/utils/releaseNotes.ts +360 -0
  754. package/utils/renderOptions.ts +113 -0
  755. package/utils/ripgrep.ts +679 -0
  756. package/utils/sandbox/sandbox-adapter.ts +985 -0
  757. package/utils/sandbox/sandbox-ui-utils.ts +12 -0
  758. package/utils/sanitization.ts +91 -0
  759. package/utils/screenshotClipboard.ts +121 -0
  760. package/utils/sdkEventQueue.ts +134 -0
  761. package/utils/secureStorage/fallbackStorage.ts +70 -0
  762. package/utils/secureStorage/index.ts +17 -0
  763. package/utils/secureStorage/keychainPrefetch.ts +116 -0
  764. package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  765. package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  766. package/utils/secureStorage/plainTextStorage.ts +84 -0
  767. package/utils/semanticBoolean.ts +29 -0
  768. package/utils/semanticNumber.ts +36 -0
  769. package/utils/semver.ts +59 -0
  770. package/utils/sequential.ts +56 -0
  771. package/utils/sessionActivity.ts +133 -0
  772. package/utils/sessionEnvVars.ts +22 -0
  773. package/utils/sessionEnvironment.ts +166 -0
  774. package/utils/sessionFileAccessHooks.ts +250 -0
  775. package/utils/sessionIngressAuth.ts +140 -0
  776. package/utils/sessionRestore.ts +551 -0
  777. package/utils/sessionStart.ts +232 -0
  778. package/utils/sessionState.ts +150 -0
  779. package/utils/sessionStorage.ts +5105 -0
  780. package/utils/sessionStoragePortable.ts +793 -0
  781. package/utils/sessionTitle.ts +129 -0
  782. package/utils/sessionUrl.ts +64 -0
  783. package/utils/set.ts +53 -0
  784. package/utils/settings/allErrors.ts +32 -0
  785. package/utils/settings/applySettingsChange.ts +92 -0
  786. package/utils/settings/changeDetector.ts +488 -0
  787. package/utils/settings/constants.ts +202 -0
  788. package/utils/settings/internalWrites.ts +37 -0
  789. package/utils/settings/managedPath.ts +34 -0
  790. package/utils/settings/mdm/constants.ts +81 -0
  791. package/utils/settings/mdm/rawRead.ts +130 -0
  792. package/utils/settings/mdm/settings.ts +316 -0
  793. package/utils/settings/permissionValidation.ts +262 -0
  794. package/utils/settings/pluginOnlyPolicy.ts +60 -0
  795. package/utils/settings/schemaOutput.ts +8 -0
  796. package/utils/settings/settings.ts +1015 -0
  797. package/utils/settings/settingsCache.ts +80 -0
  798. package/utils/settings/toolValidationConfig.ts +103 -0
  799. package/utils/settings/types.ts +1149 -0
  800. package/utils/settings/validateEditTool.ts +45 -0
  801. package/utils/settings/validation.ts +265 -0
  802. package/utils/settings/validationTips.ts +164 -0
  803. package/utils/shell/bashProvider.ts +255 -0
  804. package/utils/shell/outputLimits.ts +14 -0
  805. package/utils/shell/powershellDetection.ts +107 -0
  806. package/utils/shell/powershellProvider.ts +123 -0
  807. package/utils/shell/prefix.ts +367 -0
  808. package/utils/shell/readOnlyCommandValidation.ts +1893 -0
  809. package/utils/shell/resolveDefaultShell.ts +14 -0
  810. package/utils/shell/shellProvider.ts +33 -0
  811. package/utils/shell/shellToolUtils.ts +22 -0
  812. package/utils/shell/specPrefix.ts +241 -0
  813. package/utils/shellConfig.ts +167 -0
  814. package/utils/sideQuery.ts +222 -0
  815. package/utils/sideQuestion.ts +155 -0
  816. package/utils/signal.ts +43 -0
  817. package/utils/sinks.ts +16 -0
  818. package/utils/skills/skillChangeDetector.ts +311 -0
  819. package/utils/slashCommandParsing.ts +60 -0
  820. package/utils/sleep.ts +84 -0
  821. package/utils/sliceAnsi.ts +91 -0
  822. package/utils/slowOperations.ts +286 -0
  823. package/utils/standaloneAgent.ts +23 -0
  824. package/utils/startupProfiler.ts +194 -0
  825. package/utils/staticRender.tsx +116 -0
  826. package/utils/stats.ts +1061 -0
  827. package/utils/statsCache.ts +434 -0
  828. package/utils/status.tsx +362 -0
  829. package/utils/statusNoticeDefinitions.tsx +198 -0
  830. package/utils/statusNoticeHelpers.ts +20 -0
  831. package/utils/stream.ts +76 -0
  832. package/utils/streamJsonStdoutGuard.ts +123 -0
  833. package/utils/streamlinedTransform.ts +201 -0
  834. package/utils/stringUtils.ts +235 -0
  835. package/utils/subprocessEnv.ts +99 -0
  836. package/utils/suggestions/commandSuggestions.ts +567 -0
  837. package/utils/suggestions/directoryCompletion.ts +263 -0
  838. package/utils/suggestions/shellHistoryCompletion.ts +119 -0
  839. package/utils/suggestions/skillUsageTracking.ts +55 -0
  840. package/utils/suggestions/slackChannelSuggestions.ts +209 -0
  841. package/utils/swarm/It2SetupPrompt.tsx +380 -0
  842. package/utils/swarm/backends/ITermBackend.ts +370 -0
  843. package/utils/swarm/backends/InProcessBackend.ts +339 -0
  844. package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  845. package/utils/swarm/backends/TmuxBackend.ts +764 -0
  846. package/utils/swarm/backends/detection.ts +128 -0
  847. package/utils/swarm/backends/it2Setup.ts +245 -0
  848. package/utils/swarm/backends/registry.ts +464 -0
  849. package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  850. package/utils/swarm/backends/types.ts +311 -0
  851. package/utils/swarm/constants.ts +33 -0
  852. package/utils/swarm/inProcessRunner.ts +1552 -0
  853. package/utils/swarm/leaderPermissionBridge.ts +54 -0
  854. package/utils/swarm/permissionSync.ts +928 -0
  855. package/utils/swarm/reconnection.ts +119 -0
  856. package/utils/swarm/spawnInProcess.ts +328 -0
  857. package/utils/swarm/spawnUtils.ts +146 -0
  858. package/utils/swarm/teamHelpers.ts +683 -0
  859. package/utils/swarm/teammateInit.ts +129 -0
  860. package/utils/swarm/teammateLayoutManager.ts +107 -0
  861. package/utils/swarm/teammateModel.ts +10 -0
  862. package/utils/swarm/teammatePromptAddendum.ts +18 -0
  863. package/utils/systemDirectories.ts +74 -0
  864. package/utils/systemPrompt.ts +123 -0
  865. package/utils/systemPromptType.ts +14 -0
  866. package/utils/systemTheme.ts +119 -0
  867. package/utils/taggedId.ts +54 -0
  868. package/utils/task/TaskOutput.ts +390 -0
  869. package/utils/task/diskOutput.ts +451 -0
  870. package/utils/task/framework.ts +308 -0
  871. package/utils/task/outputFormatting.ts +38 -0
  872. package/utils/task/sdkProgress.ts +36 -0
  873. package/utils/tasks.ts +862 -0
  874. package/utils/teamDiscovery.ts +81 -0
  875. package/utils/teamMemoryOps.ts +88 -0
  876. package/utils/teammate.ts +292 -0
  877. package/utils/teammateContext.ts +96 -0
  878. package/utils/teammateMailbox.ts +1183 -0
  879. package/utils/telemetry/betaSessionTracing.ts +491 -0
  880. package/utils/telemetry/bigqueryExporter.ts +252 -0
  881. package/utils/telemetry/events.ts +75 -0
  882. package/utils/telemetry/instrumentation.ts +825 -0
  883. package/utils/telemetry/logger.ts +26 -0
  884. package/utils/telemetry/perfettoTracing.ts +1120 -0
  885. package/utils/telemetry/pluginTelemetry.ts +289 -0
  886. package/utils/telemetry/sessionTracing.ts +927 -0
  887. package/utils/telemetry/skillLoadedEvent.ts +39 -0
  888. package/utils/telemetryAttributes.ts +71 -0
  889. package/utils/teleport/api.ts +466 -0
  890. package/utils/teleport/environmentSelection.ts +77 -0
  891. package/utils/teleport/environments.ts +120 -0
  892. package/utils/teleport/gitBundle.ts +292 -0
  893. package/utils/teleport.tsx +1226 -0
  894. package/utils/tempfile.ts +31 -0
  895. package/utils/terminal.ts +131 -0
  896. package/utils/terminalPanel.ts +191 -0
  897. package/utils/textHighlighting.ts +166 -0
  898. package/utils/theme.ts +639 -0
  899. package/utils/thinking.ts +162 -0
  900. package/utils/timeouts.ts +39 -0
  901. package/utils/tmuxSocket.ts +427 -0
  902. package/utils/todo/types.ts +18 -0
  903. package/utils/tokenBudget.ts +73 -0
  904. package/utils/tokens.ts +261 -0
  905. package/utils/toolErrors.ts +132 -0
  906. package/utils/toolPool.ts +79 -0
  907. package/utils/toolResultStorage.ts +1040 -0
  908. package/utils/toolSchemaCache.ts +26 -0
  909. package/utils/toolSearch.ts +756 -0
  910. package/utils/transcriptSearch.ts +202 -0
  911. package/utils/treeify.ts +170 -0
  912. package/utils/truncate.ts +179 -0
  913. package/utils/ultraplan/ccrSession.ts +349 -0
  914. package/utils/ultraplan/keyword.ts +127 -0
  915. package/utils/ultraplan/prompt.txt +1 -0
  916. package/utils/unaryLogging.ts +39 -0
  917. package/utils/undercover.ts +89 -0
  918. package/utils/user.ts +194 -0
  919. package/utils/userAgent.ts +10 -0
  920. package/utils/userPromptKeywords.ts +27 -0
  921. package/utils/uuid.ts +27 -0
  922. package/utils/warningHandler.ts +121 -0
  923. package/utils/which.ts +82 -0
  924. package/utils/windowsPaths.ts +173 -0
  925. package/utils/withResolvers.ts +13 -0
  926. package/utils/words.ts +800 -0
  927. package/utils/workloadContext.ts +57 -0
  928. package/utils/worktree.ts +1519 -0
  929. package/utils/worktreeModeEnabled.ts +11 -0
  930. package/utils/xdg.ts +65 -0
  931. package/utils/xmem.ts +6 -0
  932. package/utils/xml.ts +16 -0
  933. package/utils/yaml.ts +15 -0
  934. package/utils/zodToJsonSchema.ts +23 -0
@@ -0,0 +1,770 @@
1
+ import * as fs from 'fs'
2
+ import {
3
+ mkdir as mkdirPromise,
4
+ open,
5
+ readdir as readdirPromise,
6
+ readFile as readFilePromise,
7
+ rename as renamePromise,
8
+ rmdir as rmdirPromise,
9
+ rm as rmPromise,
10
+ stat as statPromise,
11
+ unlink as unlinkPromise,
12
+ } from 'fs/promises'
13
+ import { homedir } from 'os'
14
+ import * as nodePath from 'path'
15
+ import { getErrnoCode } from './errors.js'
16
+ import { slowLogging } from './slowOperations.js'
17
+
18
+ /**
19
+ * Simplified filesystem operations interface based on Node.js fs module.
20
+ * Provides a subset of commonly used sync operations with type safety.
21
+ * Allows abstraction for alternative implementations (e.g., mock, virtual).
22
+ */
23
+ export type FsOperations = {
24
+ // File access and information operations
25
+ /** Gets the current working directory */
26
+ cwd(): string
27
+ /** Checks if a file or directory exists */
28
+ existsSync(path: string): boolean
29
+ /** Gets file stats asynchronously */
30
+ stat(path: string): Promise<fs.Stats>
31
+ /** Lists directory contents with file type information asynchronously */
32
+ readdir(path: string): Promise<fs.Dirent[]>
33
+ /** Deletes file asynchronously */
34
+ unlink(path: string): Promise<void>
35
+ /** Removes an empty directory asynchronously */
36
+ rmdir(path: string): Promise<void>
37
+ /** Removes files and directories asynchronously (with recursive option) */
38
+ rm(
39
+ path: string,
40
+ options?: { recursive?: boolean; force?: boolean },
41
+ ): Promise<void>
42
+ /** Creates directory recursively asynchronously. */
43
+ mkdir(path: string, options?: { mode?: number }): Promise<void>
44
+ /** Reads file content as string asynchronously */
45
+ readFile(path: string, options: { encoding: BufferEncoding }): Promise<string>
46
+ /** Renames/moves file asynchronously */
47
+ rename(oldPath: string, newPath: string): Promise<void>
48
+ /** Gets file stats */
49
+ statSync(path: string): fs.Stats
50
+ /** Gets file stats without following symlinks */
51
+ lstatSync(path: string): fs.Stats
52
+
53
+ // File content operations
54
+ /** Reads file content as string with specified encoding */
55
+ readFileSync(
56
+ path: string,
57
+ options: {
58
+ encoding: BufferEncoding
59
+ },
60
+ ): string
61
+ /** Reads raw file bytes as Buffer */
62
+ readFileBytesSync(path: string): Buffer
63
+ /** Reads specified number of bytes from file start */
64
+ readSync(
65
+ path: string,
66
+ options: {
67
+ length: number
68
+ },
69
+ ): {
70
+ buffer: Buffer
71
+ bytesRead: number
72
+ }
73
+ /** Appends string to file */
74
+ appendFileSync(path: string, data: string, options?: { mode?: number }): void
75
+ /** Copies file from source to destination */
76
+ copyFileSync(src: string, dest: string): void
77
+ /** Deletes file */
78
+ unlinkSync(path: string): void
79
+ /** Renames/moves file */
80
+ renameSync(oldPath: string, newPath: string): void
81
+ /** Creates hard link */
82
+ linkSync(target: string, path: string): void
83
+ /** Creates symbolic link */
84
+ symlinkSync(
85
+ target: string,
86
+ path: string,
87
+ type?: 'dir' | 'file' | 'junction',
88
+ ): void
89
+ /** Reads symbolic link */
90
+ readlinkSync(path: string): string
91
+ /** Resolves symbolic links and returns the canonical pathname */
92
+ realpathSync(path: string): string
93
+
94
+ // Directory operations
95
+ /** Creates directory recursively. Mode defaults to 0o777 & ~umask if not specified. */
96
+ mkdirSync(
97
+ path: string,
98
+ options?: {
99
+ mode?: number
100
+ },
101
+ ): void
102
+ /** Lists directory contents with file type information */
103
+ readdirSync(path: string): fs.Dirent[]
104
+ /** Lists directory contents as strings */
105
+ readdirStringSync(path: string): string[]
106
+ /** Checks if the directory is empty */
107
+ isDirEmptySync(path: string): boolean
108
+ /** Removes an empty directory */
109
+ rmdirSync(path: string): void
110
+ /** Removes files and directories (with recursive option) */
111
+ rmSync(
112
+ path: string,
113
+ options?: {
114
+ recursive?: boolean
115
+ force?: boolean
116
+ },
117
+ ): void
118
+ /** Create a writable stream for writing data to a file. */
119
+ createWriteStream(path: string): fs.WriteStream
120
+ /** Reads raw file bytes as Buffer asynchronously.
121
+ * When maxBytes is set, only reads up to that many bytes. */
122
+ readFileBytes(path: string, maxBytes?: number): Promise<Buffer>
123
+ }
124
+
125
+ /**
126
+ * Safely resolves a file path, handling symlinks and errors gracefully.
127
+ *
128
+ * Error handling strategy:
129
+ * - If the file doesn't exist, returns the original path (allows for file creation)
130
+ * - If symlink resolution fails (broken symlink, permission denied, circular links),
131
+ * returns the original path and marks it as not a symlink
132
+ * - This ensures operations can continue with the original path rather than failing
133
+ *
134
+ * @param fs The filesystem implementation to use
135
+ * @param filePath The path to resolve
136
+ * @returns Object containing the resolved path and whether it was a symlink
137
+ */
138
+ export function safeResolvePath(
139
+ fs: FsOperations,
140
+ filePath: string,
141
+ ): { resolvedPath: string; isSymlink: boolean; isCanonical: boolean } {
142
+ // Block UNC paths before any filesystem access to prevent network
143
+ // requests (DNS/SMB) during validation on Windows
144
+ if (filePath.startsWith('//') || filePath.startsWith('\\\\')) {
145
+ return { resolvedPath: filePath, isSymlink: false, isCanonical: false }
146
+ }
147
+
148
+ try {
149
+ // Check for special file types (FIFOs, sockets, devices) before calling realpathSync.
150
+ // realpathSync can block on FIFOs waiting for a writer, causing hangs.
151
+ // If the file doesn't exist, lstatSync throws ENOENT which the catch
152
+ // below handles by returning the original path (allows file creation).
153
+ const stats = fs.lstatSync(filePath)
154
+ if (
155
+ stats.isFIFO() ||
156
+ stats.isSocket() ||
157
+ stats.isCharacterDevice() ||
158
+ stats.isBlockDevice()
159
+ ) {
160
+ return { resolvedPath: filePath, isSymlink: false, isCanonical: false }
161
+ }
162
+
163
+ const resolvedPath = fs.realpathSync(filePath)
164
+ return {
165
+ resolvedPath,
166
+ isSymlink: resolvedPath !== filePath,
167
+ // realpathSync returned: resolvedPath is canonical (all symlinks in
168
+ // all path components resolved). Callers can skip further symlink
169
+ // resolution on this path.
170
+ isCanonical: true,
171
+ }
172
+ } catch (_error) {
173
+ // If lstat/realpath fails for any reason (ENOENT, broken symlink,
174
+ // EACCES, ELOOP, etc.), return the original path to allow operations
175
+ // to proceed
176
+ return { resolvedPath: filePath, isSymlink: false, isCanonical: false }
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Check if a file path is a duplicate and should be skipped.
182
+ * Resolves symlinks to detect duplicates pointing to the same file.
183
+ * If not a duplicate, adds the resolved path to loadedPaths.
184
+ *
185
+ * @returns true if the file should be skipped (is duplicate)
186
+ */
187
+ export function isDuplicatePath(
188
+ fs: FsOperations,
189
+ filePath: string,
190
+ loadedPaths: Set<string>,
191
+ ): boolean {
192
+ const { resolvedPath } = safeResolvePath(fs, filePath)
193
+ if (loadedPaths.has(resolvedPath)) {
194
+ return true
195
+ }
196
+ loadedPaths.add(resolvedPath)
197
+ return false
198
+ }
199
+
200
+ /**
201
+ * Resolve the deepest existing ancestor of a path via realpathSync, walking
202
+ * up until it succeeds. Detects dangling symlinks (link entry exists, target
203
+ * doesn't) via lstat and resolves them via readlink.
204
+ *
205
+ * Use when the input path may not exist (new file writes) and you need to
206
+ * know where the write would ACTUALLY land after the OS follows symlinks.
207
+ *
208
+ * Returns the resolved absolute path with non-existent tail segments
209
+ * rejoined, or undefined if no symlink was found in any existing ancestor
210
+ * (the path's existing ancestors all resolve to themselves).
211
+ *
212
+ * Handles: live parent symlinks, dangling file symlinks, dangling parent
213
+ * symlinks. Same core algorithm as teamMemPaths.ts:realpathDeepestExisting.
214
+ */
215
+ export function resolveDeepestExistingAncestorSync(
216
+ fs: FsOperations,
217
+ absolutePath: string,
218
+ ): string | undefined {
219
+ let dir = absolutePath
220
+ const segments: string[] = []
221
+ // Walk up using lstat (cheap, O(1)) to find the first existing component.
222
+ // lstat does not follow symlinks, so dangling symlinks are detected here.
223
+ // Only call realpathSync (expensive, O(depth)) once at the end.
224
+ while (dir !== nodePath.dirname(dir)) {
225
+ let st: fs.Stats
226
+ try {
227
+ st = fs.lstatSync(dir)
228
+ } catch {
229
+ // lstat failed: truly non-existent. Walk up.
230
+ segments.unshift(nodePath.basename(dir))
231
+ dir = nodePath.dirname(dir)
232
+ continue
233
+ }
234
+ if (st.isSymbolicLink()) {
235
+ // Found a symlink (live or dangling). Try realpath first (resolves
236
+ // chained symlinks); fall back to readlink for dangling symlinks.
237
+ try {
238
+ const resolved = fs.realpathSync(dir)
239
+ return segments.length === 0
240
+ ? resolved
241
+ : nodePath.join(resolved, ...segments)
242
+ } catch {
243
+ // Dangling: realpath failed but lstat saw the link entry.
244
+ const target = fs.readlinkSync(dir)
245
+ const absTarget = nodePath.isAbsolute(target)
246
+ ? target
247
+ : nodePath.resolve(nodePath.dirname(dir), target)
248
+ return segments.length === 0
249
+ ? absTarget
250
+ : nodePath.join(absTarget, ...segments)
251
+ }
252
+ }
253
+ // Existing non-symlink component. One realpath call resolves any
254
+ // symlinks in its ancestors. If none, return undefined (no symlink).
255
+ try {
256
+ const resolved = fs.realpathSync(dir)
257
+ if (resolved !== dir) {
258
+ return segments.length === 0
259
+ ? resolved
260
+ : nodePath.join(resolved, ...segments)
261
+ }
262
+ } catch {
263
+ // realpath can still fail (e.g. EACCES in ancestors). Return
264
+ // undefined — we can't resolve, and the logical path is already
265
+ // in pathSet for the caller.
266
+ }
267
+ return undefined
268
+ }
269
+ return undefined
270
+ }
271
+
272
+ /**
273
+ * Gets all paths that should be checked for permissions.
274
+ * This includes the original path, all intermediate symlink targets in the chain,
275
+ * and the final resolved path.
276
+ *
277
+ * For example, if test.txt -> /etc/passwd -> /private/etc/passwd:
278
+ * - test.txt (original path)
279
+ * - /etc/passwd (intermediate symlink target)
280
+ * - /private/etc/passwd (final resolved path)
281
+ *
282
+ * This is important for security: a deny rule for /etc/passwd should block
283
+ * access even if the file is actually at /private/etc/passwd (as on macOS).
284
+ *
285
+ * @param path - The path to check (will be converted to absolute)
286
+ * @returns An array of absolute paths to check permissions for
287
+ */
288
+ export function getPathsForPermissionCheck(inputPath: string): string[] {
289
+ // Expand tilde notation defensively - tools should do this in getPath(),
290
+ // but we normalize here as defense in depth for permission checking
291
+ let path = inputPath
292
+ if (path === '~') {
293
+ path = homedir().normalize('NFC')
294
+ } else if (path.startsWith('~/')) {
295
+ path = nodePath.join(homedir().normalize('NFC'), path.slice(2))
296
+ }
297
+
298
+ const pathSet = new Set<string>()
299
+ const fsImpl = getFsImplementation()
300
+
301
+ // Always check the original path
302
+ pathSet.add(path)
303
+
304
+ // Block UNC paths before any filesystem access to prevent network
305
+ // requests (DNS/SMB) during validation on Windows
306
+ if (path.startsWith('//') || path.startsWith('\\\\')) {
307
+ return Array.from(pathSet)
308
+ }
309
+
310
+ // Follow the symlink chain, collecting ALL intermediate targets
311
+ // This handles cases like: test.txt -> /etc/passwd -> /private/etc/passwd
312
+ // We want to check all three paths, not just test.txt and /private/etc/passwd
313
+ try {
314
+ let currentPath = path
315
+ const visited = new Set<string>()
316
+ const maxDepth = 40 // Prevent runaway loops, matches typical SYMLOOP_MAX
317
+
318
+ for (let depth = 0; depth < maxDepth; depth++) {
319
+ // Prevent infinite loops from circular symlinks
320
+ if (visited.has(currentPath)) {
321
+ break
322
+ }
323
+ visited.add(currentPath)
324
+
325
+ if (!fsImpl.existsSync(currentPath)) {
326
+ // Path doesn't exist (new file case). existsSync follows symlinks,
327
+ // so this is also reached for DANGLING symlinks (link entry exists,
328
+ // target doesn't). Resolve symlinks in the path and its ancestors
329
+ // so permission checks see the real destination. Without this,
330
+ // `./data -> /etc/cron.d/` (live parent symlink) or
331
+ // `./evil.txt -> ~/.ssh/authorized_keys2` (dangling file symlink)
332
+ // would allow writes that escape the working directory.
333
+ if (currentPath === path) {
334
+ const resolved = resolveDeepestExistingAncestorSync(fsImpl, path)
335
+ if (resolved !== undefined) {
336
+ pathSet.add(resolved)
337
+ }
338
+ }
339
+ break
340
+ }
341
+
342
+ const stats = fsImpl.lstatSync(currentPath)
343
+
344
+ // Skip special file types that can cause issues
345
+ if (
346
+ stats.isFIFO() ||
347
+ stats.isSocket() ||
348
+ stats.isCharacterDevice() ||
349
+ stats.isBlockDevice()
350
+ ) {
351
+ break
352
+ }
353
+
354
+ if (!stats.isSymbolicLink()) {
355
+ break
356
+ }
357
+
358
+ // Get the immediate symlink target
359
+ const target = fsImpl.readlinkSync(currentPath)
360
+
361
+ // If target is relative, resolve it relative to the symlink's directory
362
+ const absoluteTarget = nodePath.isAbsolute(target)
363
+ ? target
364
+ : nodePath.resolve(nodePath.dirname(currentPath), target)
365
+
366
+ // Add this intermediate target to the set
367
+ pathSet.add(absoluteTarget)
368
+ currentPath = absoluteTarget
369
+ }
370
+ } catch {
371
+ // If anything fails during chain traversal, continue with what we have
372
+ }
373
+
374
+ // Also add the final resolved path using realpathSync for completeness
375
+ // This handles any remaining symlinks in directory components
376
+ const { resolvedPath, isSymlink } = safeResolvePath(fsImpl, path)
377
+ if (isSymlink && resolvedPath !== path) {
378
+ pathSet.add(resolvedPath)
379
+ }
380
+
381
+ return Array.from(pathSet)
382
+ }
383
+
384
+ export const NodeFsOperations: FsOperations = {
385
+ cwd() {
386
+ return process.cwd()
387
+ },
388
+
389
+ existsSync(fsPath) {
390
+ using _ = slowLogging`fs.existsSync(${fsPath})`
391
+ return fs.existsSync(fsPath)
392
+ },
393
+
394
+ async stat(fsPath) {
395
+ return statPromise(fsPath)
396
+ },
397
+
398
+ async readdir(fsPath) {
399
+ return readdirPromise(fsPath, { withFileTypes: true })
400
+ },
401
+
402
+ async unlink(fsPath) {
403
+ return unlinkPromise(fsPath)
404
+ },
405
+
406
+ async rmdir(fsPath) {
407
+ return rmdirPromise(fsPath)
408
+ },
409
+
410
+ async rm(fsPath, options) {
411
+ return rmPromise(fsPath, options)
412
+ },
413
+
414
+ async mkdir(dirPath, options) {
415
+ try {
416
+ await mkdirPromise(dirPath, { recursive: true, ...options })
417
+ } catch (e) {
418
+ // Bun/Windows: recursive:true throws EEXIST on directories with the
419
+ // FILE_ATTRIBUTE_READONLY bit set (Group Policy, OneDrive, desktop.ini).
420
+ // Bun's directoryExistsAt misclassifies DIRECTORY+READONLY as not-a-dir
421
+ // (bun-internal src/sys.zig existsAtType). The dir exists; ignore.
422
+ // https://github.com/anthropics/claude-code/issues/30924
423
+ if (getErrnoCode(e) !== 'EEXIST') throw e
424
+ }
425
+ },
426
+
427
+ async readFile(fsPath, options) {
428
+ return readFilePromise(fsPath, { encoding: options.encoding })
429
+ },
430
+
431
+ async rename(oldPath, newPath) {
432
+ return renamePromise(oldPath, newPath)
433
+ },
434
+
435
+ statSync(fsPath) {
436
+ using _ = slowLogging`fs.statSync(${fsPath})`
437
+ return fs.statSync(fsPath)
438
+ },
439
+
440
+ lstatSync(fsPath) {
441
+ using _ = slowLogging`fs.lstatSync(${fsPath})`
442
+ return fs.lstatSync(fsPath)
443
+ },
444
+
445
+ readFileSync(fsPath, options) {
446
+ using _ = slowLogging`fs.readFileSync(${fsPath})`
447
+ return fs.readFileSync(fsPath, { encoding: options.encoding })
448
+ },
449
+
450
+ readFileBytesSync(fsPath) {
451
+ using _ = slowLogging`fs.readFileBytesSync(${fsPath})`
452
+ return fs.readFileSync(fsPath)
453
+ },
454
+
455
+ readSync(fsPath, options) {
456
+ using _ = slowLogging`fs.readSync(${fsPath}, ${options.length} bytes)`
457
+ let fd: number | undefined = undefined
458
+ try {
459
+ fd = fs.openSync(fsPath, 'r')
460
+ const buffer = Buffer.alloc(options.length)
461
+ const bytesRead = fs.readSync(fd, buffer, 0, options.length, 0)
462
+ return { buffer, bytesRead }
463
+ } finally {
464
+ if (fd) fs.closeSync(fd)
465
+ }
466
+ },
467
+
468
+ appendFileSync(path, data, options) {
469
+ using _ = slowLogging`fs.appendFileSync(${path}, ${data.length} chars)`
470
+ // For new files with explicit mode, use 'ax' (atomic create-with-mode) to avoid
471
+ // TOCTOU race between existence check and open. Fall back to normal append if exists.
472
+ if (options?.mode !== undefined) {
473
+ try {
474
+ const fd = fs.openSync(path, 'ax', options.mode)
475
+ try {
476
+ fs.appendFileSync(fd, data)
477
+ } finally {
478
+ fs.closeSync(fd)
479
+ }
480
+ return
481
+ } catch (e) {
482
+ if (getErrnoCode(e) !== 'EEXIST') throw e
483
+ // File exists — fall through to normal append
484
+ }
485
+ }
486
+ fs.appendFileSync(path, data)
487
+ },
488
+
489
+ copyFileSync(src, dest) {
490
+ using _ = slowLogging`fs.copyFileSync(${src} → ${dest})`
491
+ fs.copyFileSync(src, dest)
492
+ },
493
+
494
+ unlinkSync(path: string) {
495
+ using _ = slowLogging`fs.unlinkSync(${path})`
496
+ fs.unlinkSync(path)
497
+ },
498
+
499
+ renameSync(oldPath: string, newPath: string) {
500
+ using _ = slowLogging`fs.renameSync(${oldPath} → ${newPath})`
501
+ fs.renameSync(oldPath, newPath)
502
+ },
503
+
504
+ linkSync(target: string, path: string) {
505
+ using _ = slowLogging`fs.linkSync(${target} → ${path})`
506
+ fs.linkSync(target, path)
507
+ },
508
+
509
+ symlinkSync(
510
+ target: string,
511
+ path: string,
512
+ type?: 'dir' | 'file' | 'junction',
513
+ ) {
514
+ using _ = slowLogging`fs.symlinkSync(${target} → ${path})`
515
+ fs.symlinkSync(target, path, type)
516
+ },
517
+
518
+ readlinkSync(path: string) {
519
+ using _ = slowLogging`fs.readlinkSync(${path})`
520
+ return fs.readlinkSync(path)
521
+ },
522
+
523
+ realpathSync(path: string) {
524
+ using _ = slowLogging`fs.realpathSync(${path})`
525
+ return fs.realpathSync(path).normalize('NFC')
526
+ },
527
+
528
+ mkdirSync(dirPath, options) {
529
+ using _ = slowLogging`fs.mkdirSync(${dirPath})`
530
+ const mkdirOptions: { recursive: boolean; mode?: number } = {
531
+ recursive: true,
532
+ }
533
+ if (options?.mode !== undefined) {
534
+ mkdirOptions.mode = options.mode
535
+ }
536
+ try {
537
+ fs.mkdirSync(dirPath, mkdirOptions)
538
+ } catch (e) {
539
+ // Bun/Windows: recursive:true throws EEXIST on directories with the
540
+ // FILE_ATTRIBUTE_READONLY bit set (Group Policy, OneDrive, desktop.ini).
541
+ // Bun's directoryExistsAt misclassifies DIRECTORY+READONLY as not-a-dir
542
+ // (bun-internal src/sys.zig existsAtType). The dir exists; ignore.
543
+ // https://github.com/anthropics/claude-code/issues/30924
544
+ if (getErrnoCode(e) !== 'EEXIST') throw e
545
+ }
546
+ },
547
+
548
+ readdirSync(dirPath) {
549
+ using _ = slowLogging`fs.readdirSync(${dirPath})`
550
+ return fs.readdirSync(dirPath, { withFileTypes: true })
551
+ },
552
+
553
+ readdirStringSync(dirPath) {
554
+ using _ = slowLogging`fs.readdirStringSync(${dirPath})`
555
+ return fs.readdirSync(dirPath)
556
+ },
557
+
558
+ isDirEmptySync(dirPath) {
559
+ using _ = slowLogging`fs.isDirEmptySync(${dirPath})`
560
+ const files = this.readdirSync(dirPath)
561
+ return files.length === 0
562
+ },
563
+
564
+ rmdirSync(dirPath) {
565
+ using _ = slowLogging`fs.rmdirSync(${dirPath})`
566
+ fs.rmdirSync(dirPath)
567
+ },
568
+
569
+ rmSync(path, options) {
570
+ using _ = slowLogging`fs.rmSync(${path})`
571
+ fs.rmSync(path, options)
572
+ },
573
+
574
+ createWriteStream(path: string) {
575
+ return fs.createWriteStream(path)
576
+ },
577
+
578
+ async readFileBytes(fsPath: string, maxBytes?: number) {
579
+ if (maxBytes === undefined) {
580
+ return readFilePromise(fsPath)
581
+ }
582
+ const handle = await open(fsPath, 'r')
583
+ try {
584
+ const { size } = await handle.stat()
585
+ const readSize = Math.min(size, maxBytes)
586
+ const buffer = Buffer.allocUnsafe(readSize)
587
+ let offset = 0
588
+ while (offset < readSize) {
589
+ const { bytesRead } = await handle.read(
590
+ buffer,
591
+ offset,
592
+ readSize - offset,
593
+ offset,
594
+ )
595
+ if (bytesRead === 0) break
596
+ offset += bytesRead
597
+ }
598
+ return offset < readSize ? buffer.subarray(0, offset) : buffer
599
+ } finally {
600
+ await handle.close()
601
+ }
602
+ },
603
+ }
604
+
605
+ // The currently active filesystem implementation
606
+ let activeFs: FsOperations = NodeFsOperations
607
+
608
+ /**
609
+ * Overrides the filesystem implementation. Note: This function does not
610
+ * automatically update cwd.
611
+ * @param implementation The filesystem implementation to use
612
+ */
613
+ export function setFsImplementation(implementation: FsOperations): void {
614
+ activeFs = implementation
615
+ }
616
+
617
+ /**
618
+ * Gets the currently active filesystem implementation
619
+ * @returns The currently active filesystem implementation
620
+ */
621
+ export function getFsImplementation(): FsOperations {
622
+ return activeFs
623
+ }
624
+
625
+ /**
626
+ * Resets the filesystem implementation to the default Node.js implementation.
627
+ * Note: This function does not automatically update cwd.
628
+ */
629
+ export function setOriginalFsImplementation(): void {
630
+ activeFs = NodeFsOperations
631
+ }
632
+
633
+ export type ReadFileRangeResult = {
634
+ content: string
635
+ bytesRead: number
636
+ bytesTotal: number
637
+ }
638
+
639
+ /**
640
+ * Read up to `maxBytes` from a file starting at `offset`.
641
+ * Returns a flat string from Buffer — no sliced string references to a
642
+ * larger parent. Returns null if the file is smaller than the offset.
643
+ */
644
+ export async function readFileRange(
645
+ path: string,
646
+ offset: number,
647
+ maxBytes: number,
648
+ ): Promise<ReadFileRangeResult | null> {
649
+ await using fh = await open(path, 'r')
650
+ const size = (await fh.stat()).size
651
+ if (size <= offset) {
652
+ return null
653
+ }
654
+ const bytesToRead = Math.min(size - offset, maxBytes)
655
+ const buffer = Buffer.allocUnsafe(bytesToRead)
656
+
657
+ let totalRead = 0
658
+ while (totalRead < bytesToRead) {
659
+ const { bytesRead } = await fh.read(
660
+ buffer,
661
+ totalRead,
662
+ bytesToRead - totalRead,
663
+ offset + totalRead,
664
+ )
665
+ if (bytesRead === 0) {
666
+ break
667
+ }
668
+ totalRead += bytesRead
669
+ }
670
+
671
+ return {
672
+ content: buffer.toString('utf8', 0, totalRead),
673
+ bytesRead: totalRead,
674
+ bytesTotal: size,
675
+ }
676
+ }
677
+
678
+ /**
679
+ * Read the last `maxBytes` of a file.
680
+ * Returns the whole file if it's smaller than maxBytes.
681
+ */
682
+ export async function tailFile(
683
+ path: string,
684
+ maxBytes: number,
685
+ ): Promise<ReadFileRangeResult> {
686
+ await using fh = await open(path, 'r')
687
+ const size = (await fh.stat()).size
688
+ if (size === 0) {
689
+ return { content: '', bytesRead: 0, bytesTotal: 0 }
690
+ }
691
+ const offset = Math.max(0, size - maxBytes)
692
+ const bytesToRead = size - offset
693
+ const buffer = Buffer.allocUnsafe(bytesToRead)
694
+
695
+ let totalRead = 0
696
+ while (totalRead < bytesToRead) {
697
+ const { bytesRead } = await fh.read(
698
+ buffer,
699
+ totalRead,
700
+ bytesToRead - totalRead,
701
+ offset + totalRead,
702
+ )
703
+ if (bytesRead === 0) {
704
+ break
705
+ }
706
+ totalRead += bytesRead
707
+ }
708
+
709
+ return {
710
+ content: buffer.toString('utf8', 0, totalRead),
711
+ bytesRead: totalRead,
712
+ bytesTotal: size,
713
+ }
714
+ }
715
+
716
+ /**
717
+ * Async generator that yields lines from a file in reverse order.
718
+ * Reads the file backwards in chunks to avoid loading the entire file into memory.
719
+ * @param path - The path to the file to read
720
+ * @returns An async generator that yields lines in reverse order
721
+ */
722
+ export async function* readLinesReverse(
723
+ path: string,
724
+ ): AsyncGenerator<string, void, undefined> {
725
+ const CHUNK_SIZE = 1024 * 4
726
+ const fileHandle = await open(path, 'r')
727
+ try {
728
+ const stats = await fileHandle.stat()
729
+ let position = stats.size
730
+ // Carry raw bytes (not a decoded string) across chunk boundaries so that
731
+ // multi-byte UTF-8 sequences split by the 4KB boundary are not corrupted.
732
+ // Decoding per-chunk would turn a split sequence into U+FFFD on both sides,
733
+ // which for history.jsonl means JSON.parse throws and the entry is dropped.
734
+ let remainder = Buffer.alloc(0)
735
+ const buffer = Buffer.alloc(CHUNK_SIZE)
736
+
737
+ while (position > 0) {
738
+ const currentChunkSize = Math.min(CHUNK_SIZE, position)
739
+ position -= currentChunkSize
740
+
741
+ await fileHandle.read(buffer, 0, currentChunkSize, position)
742
+ const combined = Buffer.concat([
743
+ buffer.subarray(0, currentChunkSize),
744
+ remainder,
745
+ ])
746
+
747
+ const firstNewline = combined.indexOf(0x0a)
748
+ if (firstNewline === -1) {
749
+ remainder = combined
750
+ continue
751
+ }
752
+
753
+ remainder = Buffer.from(combined.subarray(0, firstNewline))
754
+ const lines = combined.toString('utf8', firstNewline + 1).split('\n')
755
+
756
+ for (let i = lines.length - 1; i >= 0; i--) {
757
+ const line = lines[i]!
758
+ if (line) {
759
+ yield line
760
+ }
761
+ }
762
+ }
763
+
764
+ if (remainder.length > 0) {
765
+ yield remainder.toString('utf8')
766
+ }
767
+ } finally {
768
+ await fileHandle.close()
769
+ }
770
+ }