@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,775 @@
1
+ import { type StructuredPatchHunk, structuredPatch } from 'diff'
2
+ import { logError } from 'src/utils/log.js'
3
+ import { expandPath } from 'src/utils/path.js'
4
+ import { countCharInString } from 'src/utils/stringUtils.js'
5
+ import {
6
+ DIFF_TIMEOUT_MS,
7
+ getPatchForDisplay,
8
+ getPatchFromContents,
9
+ } from '../../utils/diff.js'
10
+ import { errorMessage, isENOENT } from '../../utils/errors.js'
11
+ import {
12
+ addLineNumbers,
13
+ convertLeadingTabsToSpaces,
14
+ readFileSyncCached,
15
+ } from '../../utils/file.js'
16
+ import type { EditInput, FileEdit } from './types.js'
17
+
18
+ // Claude can't output curly quotes, so we define them as constants here for Claude to use
19
+ // in the code. We do this because we normalize curly quotes to straight quotes
20
+ // when applying edits.
21
+ export const LEFT_SINGLE_CURLY_QUOTE = '‘'
22
+ export const RIGHT_SINGLE_CURLY_QUOTE = '’'
23
+ export const LEFT_DOUBLE_CURLY_QUOTE = '“'
24
+ export const RIGHT_DOUBLE_CURLY_QUOTE = '”'
25
+
26
+ /**
27
+ * Normalizes quotes in a string by converting curly quotes to straight quotes
28
+ * @param str The string to normalize
29
+ * @returns The string with all curly quotes replaced by straight quotes
30
+ */
31
+ export function normalizeQuotes(str: string): string {
32
+ return str
33
+ .replaceAll(LEFT_SINGLE_CURLY_QUOTE, "'")
34
+ .replaceAll(RIGHT_SINGLE_CURLY_QUOTE, "'")
35
+ .replaceAll(LEFT_DOUBLE_CURLY_QUOTE, '"')
36
+ .replaceAll(RIGHT_DOUBLE_CURLY_QUOTE, '"')
37
+ }
38
+
39
+ /**
40
+ * Strips trailing whitespace from each line in a string while preserving line endings
41
+ * @param str The string to process
42
+ * @returns The string with trailing whitespace removed from each line
43
+ */
44
+ export function stripTrailingWhitespace(str: string): string {
45
+ // Handle different line endings: CRLF, LF, CR
46
+ // Use a regex that matches line endings and captures them
47
+ const lines = str.split(/(\r\n|\n|\r)/)
48
+
49
+ let result = ''
50
+ for (let i = 0; i < lines.length; i++) {
51
+ const part = lines[i]
52
+ if (part !== undefined) {
53
+ if (i % 2 === 0) {
54
+ // Even indices are line content
55
+ result += part.replace(/\s+$/, '')
56
+ } else {
57
+ // Odd indices are line endings
58
+ result += part
59
+ }
60
+ }
61
+ }
62
+
63
+ return result
64
+ }
65
+
66
+ /**
67
+ * Finds the actual string in the file content that matches the search string,
68
+ * accounting for quote normalization
69
+ * @param fileContent The file content to search in
70
+ * @param searchString The string to search for
71
+ * @returns The actual string found in the file, or null if not found
72
+ */
73
+ export function findActualString(
74
+ fileContent: string,
75
+ searchString: string,
76
+ ): string | null {
77
+ // First try exact match
78
+ if (fileContent.includes(searchString)) {
79
+ return searchString
80
+ }
81
+
82
+ // Try with normalized quotes
83
+ const normalizedSearch = normalizeQuotes(searchString)
84
+ const normalizedFile = normalizeQuotes(fileContent)
85
+
86
+ const searchIndex = normalizedFile.indexOf(normalizedSearch)
87
+ if (searchIndex !== -1) {
88
+ // Find the actual string in the file that matches
89
+ return fileContent.substring(searchIndex, searchIndex + searchString.length)
90
+ }
91
+
92
+ return null
93
+ }
94
+
95
+ /**
96
+ * When old_string matched via quote normalization (curly quotes in file,
97
+ * straight quotes from model), apply the same curly quote style to new_string
98
+ * so the edit preserves the file's typography.
99
+ *
100
+ * Uses a simple open/close heuristic: a quote character preceded by whitespace,
101
+ * start of string, or opening punctuation is treated as an opening quote;
102
+ * otherwise it's a closing quote.
103
+ */
104
+ export function preserveQuoteStyle(
105
+ oldString: string,
106
+ actualOldString: string,
107
+ newString: string,
108
+ ): string {
109
+ // If they're the same, no normalization happened
110
+ if (oldString === actualOldString) {
111
+ return newString
112
+ }
113
+
114
+ // Detect which curly quote types were in the file
115
+ const hasDoubleQuotes =
116
+ actualOldString.includes(LEFT_DOUBLE_CURLY_QUOTE) ||
117
+ actualOldString.includes(RIGHT_DOUBLE_CURLY_QUOTE)
118
+ const hasSingleQuotes =
119
+ actualOldString.includes(LEFT_SINGLE_CURLY_QUOTE) ||
120
+ actualOldString.includes(RIGHT_SINGLE_CURLY_QUOTE)
121
+
122
+ if (!hasDoubleQuotes && !hasSingleQuotes) {
123
+ return newString
124
+ }
125
+
126
+ let result = newString
127
+
128
+ if (hasDoubleQuotes) {
129
+ result = applyCurlyDoubleQuotes(result)
130
+ }
131
+ if (hasSingleQuotes) {
132
+ result = applyCurlySingleQuotes(result)
133
+ }
134
+
135
+ return result
136
+ }
137
+
138
+ function isOpeningContext(chars: string[], index: number): boolean {
139
+ if (index === 0) {
140
+ return true
141
+ }
142
+ const prev = chars[index - 1]
143
+ return (
144
+ prev === ' ' ||
145
+ prev === '\t' ||
146
+ prev === '\n' ||
147
+ prev === '\r' ||
148
+ prev === '(' ||
149
+ prev === '[' ||
150
+ prev === '{' ||
151
+ prev === '\u2014' || // em dash
152
+ prev === '\u2013' // en dash
153
+ )
154
+ }
155
+
156
+ function applyCurlyDoubleQuotes(str: string): string {
157
+ const chars = [...str]
158
+ const result: string[] = []
159
+ for (let i = 0; i < chars.length; i++) {
160
+ if (chars[i] === '"') {
161
+ result.push(
162
+ isOpeningContext(chars, i)
163
+ ? LEFT_DOUBLE_CURLY_QUOTE
164
+ : RIGHT_DOUBLE_CURLY_QUOTE,
165
+ )
166
+ } else {
167
+ result.push(chars[i]!)
168
+ }
169
+ }
170
+ return result.join('')
171
+ }
172
+
173
+ function applyCurlySingleQuotes(str: string): string {
174
+ const chars = [...str]
175
+ const result: string[] = []
176
+ for (let i = 0; i < chars.length; i++) {
177
+ if (chars[i] === "'") {
178
+ // Don't convert apostrophes in contractions (e.g., "don't", "it's")
179
+ // An apostrophe between two letters is a contraction, not a quote
180
+ const prev = i > 0 ? chars[i - 1] : undefined
181
+ const next = i < chars.length - 1 ? chars[i + 1] : undefined
182
+ const prevIsLetter = prev !== undefined && /\p{L}/u.test(prev)
183
+ const nextIsLetter = next !== undefined && /\p{L}/u.test(next)
184
+ if (prevIsLetter && nextIsLetter) {
185
+ // Apostrophe in a contraction — use right single curly quote
186
+ result.push(RIGHT_SINGLE_CURLY_QUOTE)
187
+ } else {
188
+ result.push(
189
+ isOpeningContext(chars, i)
190
+ ? LEFT_SINGLE_CURLY_QUOTE
191
+ : RIGHT_SINGLE_CURLY_QUOTE,
192
+ )
193
+ }
194
+ } else {
195
+ result.push(chars[i]!)
196
+ }
197
+ }
198
+ return result.join('')
199
+ }
200
+
201
+ /**
202
+ * Transform edits to ensure replace_all always has a boolean value
203
+ * @param edits Array of edits with optional replace_all
204
+ * @returns Array of edits with replace_all guaranteed to be boolean
205
+ */
206
+ export function applyEditToFile(
207
+ originalContent: string,
208
+ oldString: string,
209
+ newString: string,
210
+ replaceAll: boolean = false,
211
+ ): string {
212
+ const f = replaceAll
213
+ ? (content: string, search: string, replace: string) =>
214
+ content.replaceAll(search, () => replace)
215
+ : (content: string, search: string, replace: string) =>
216
+ content.replace(search, () => replace)
217
+
218
+ if (newString !== '') {
219
+ return f(originalContent, oldString, newString)
220
+ }
221
+
222
+ const stripTrailingNewline =
223
+ !oldString.endsWith('\n') && originalContent.includes(oldString + '\n')
224
+
225
+ return stripTrailingNewline
226
+ ? f(originalContent, oldString + '\n', newString)
227
+ : f(originalContent, oldString, newString)
228
+ }
229
+
230
+ /**
231
+ * Applies an edit to a file and returns the patch and updated file.
232
+ * Does not write the file to disk.
233
+ */
234
+ export function getPatchForEdit({
235
+ filePath,
236
+ fileContents,
237
+ oldString,
238
+ newString,
239
+ replaceAll = false,
240
+ }: {
241
+ filePath: string
242
+ fileContents: string
243
+ oldString: string
244
+ newString: string
245
+ replaceAll?: boolean
246
+ }): { patch: StructuredPatchHunk[]; updatedFile: string } {
247
+ return getPatchForEdits({
248
+ filePath,
249
+ fileContents,
250
+ edits: [
251
+ { old_string: oldString, new_string: newString, replace_all: replaceAll },
252
+ ],
253
+ })
254
+ }
255
+
256
+ /**
257
+ * Applies a list of edits to a file and returns the patch and updated file.
258
+ * Does not write the file to disk.
259
+ *
260
+ * NOTE: The returned patch is to be used for display purposes only - it has spaces instead of tabs
261
+ */
262
+ export function getPatchForEdits({
263
+ filePath,
264
+ fileContents,
265
+ edits,
266
+ }: {
267
+ filePath: string
268
+ fileContents: string
269
+ edits: FileEdit[]
270
+ }): { patch: StructuredPatchHunk[]; updatedFile: string } {
271
+ let updatedFile = fileContents
272
+ const appliedNewStrings: string[] = []
273
+
274
+ // Special case for empty files.
275
+ if (
276
+ !fileContents &&
277
+ edits.length === 1 &&
278
+ edits[0] &&
279
+ edits[0].old_string === '' &&
280
+ edits[0].new_string === ''
281
+ ) {
282
+ const patch = getPatchForDisplay({
283
+ filePath,
284
+ fileContents,
285
+ edits: [
286
+ {
287
+ old_string: fileContents,
288
+ new_string: updatedFile,
289
+ replace_all: false,
290
+ },
291
+ ],
292
+ })
293
+ return { patch, updatedFile: '' }
294
+ }
295
+
296
+ // Apply each edit and check if it actually changes the file
297
+ for (const edit of edits) {
298
+ // Strip trailing newlines from old_string before checking
299
+ const oldStringToCheck = edit.old_string.replace(/\n+$/, '')
300
+
301
+ // Check if old_string is a substring of any previously applied new_string
302
+ for (const previousNewString of appliedNewStrings) {
303
+ if (
304
+ oldStringToCheck !== '' &&
305
+ previousNewString.includes(oldStringToCheck)
306
+ ) {
307
+ throw new Error(
308
+ 'Cannot edit file: old_string is a substring of a new_string from a previous edit.',
309
+ )
310
+ }
311
+ }
312
+
313
+ const previousContent = updatedFile
314
+ updatedFile =
315
+ edit.old_string === ''
316
+ ? edit.new_string
317
+ : applyEditToFile(
318
+ updatedFile,
319
+ edit.old_string,
320
+ edit.new_string,
321
+ edit.replace_all,
322
+ )
323
+
324
+ // If this edit didn't change anything, throw an error
325
+ if (updatedFile === previousContent) {
326
+ throw new Error('String not found in file. Failed to apply edit.')
327
+ }
328
+
329
+ // Track the new string that was applied
330
+ appliedNewStrings.push(edit.new_string)
331
+ }
332
+
333
+ if (updatedFile === fileContents) {
334
+ throw new Error(
335
+ 'Original and edited file match exactly. Failed to apply edit.',
336
+ )
337
+ }
338
+
339
+ // We already have before/after content, so call getPatchFromContents directly.
340
+ // Previously this went through getPatchForDisplay with edits=[{old:fileContents,new:updatedFile}],
341
+ // which transforms fileContents twice (once as preparedFileContents, again as escapedOldString
342
+ // inside the reduce) and runs a no-op full-content .replace(). This saves ~20% on large files.
343
+ const patch = getPatchFromContents({
344
+ filePath,
345
+ oldContent: convertLeadingTabsToSpaces(fileContents),
346
+ newContent: convertLeadingTabsToSpaces(updatedFile),
347
+ })
348
+
349
+ return { patch, updatedFile }
350
+ }
351
+
352
+ // Cap on edited_text_file attachment snippets. Format-on-save of a large file
353
+ // previously injected the entire file per turn (observed max 16.1KB, ~14K
354
+ // tokens/session). 8KB preserves meaningful context while bounding worst case.
355
+ const DIFF_SNIPPET_MAX_BYTES = 8192
356
+
357
+ /**
358
+ * Used for attachments, to show snippets when files change.
359
+ *
360
+ * TODO: Unify this with the other snippet logic.
361
+ */
362
+ export function getSnippetForTwoFileDiff(
363
+ fileAContents: string,
364
+ fileBContents: string,
365
+ ): string {
366
+ const patch = structuredPatch(
367
+ 'file.txt',
368
+ 'file.txt',
369
+ fileAContents,
370
+ fileBContents,
371
+ undefined,
372
+ undefined,
373
+ {
374
+ context: 8,
375
+ timeout: DIFF_TIMEOUT_MS,
376
+ },
377
+ )
378
+
379
+ if (!patch) {
380
+ return ''
381
+ }
382
+
383
+ const full = patch.hunks
384
+ .map(_ => ({
385
+ startLine: _.oldStart,
386
+ content: _.lines
387
+ // Filter out deleted lines AND diff metadata lines
388
+ .filter(_ => !_.startsWith('-') && !_.startsWith('\\'))
389
+ .map(_ => _.slice(1))
390
+ .join('\n'),
391
+ }))
392
+ .map(addLineNumbers)
393
+ .join('\n...\n')
394
+
395
+ if (full.length <= DIFF_SNIPPET_MAX_BYTES) {
396
+ return full
397
+ }
398
+
399
+ // Truncate at the last line boundary that fits within the cap.
400
+ // Marker format matches BashTool/utils.ts.
401
+ const cutoff = full.lastIndexOf('\n', DIFF_SNIPPET_MAX_BYTES)
402
+ const kept =
403
+ cutoff > 0 ? full.slice(0, cutoff) : full.slice(0, DIFF_SNIPPET_MAX_BYTES)
404
+ const remaining = countCharInString(full, '\n', kept.length) + 1
405
+ return `${kept}\n\n... [${remaining} lines truncated] ...`
406
+ }
407
+
408
+ const CONTEXT_LINES = 4
409
+
410
+ /**
411
+ * Gets a snippet from a file showing the context around a patch with line numbers.
412
+ * @param originalFile The original file content before applying the patch
413
+ * @param patch The diff hunks to use for determining snippet location
414
+ * @param newFile The file content after applying the patch
415
+ * @returns The snippet text with line numbers and the starting line number
416
+ */
417
+ export function getSnippetForPatch(
418
+ patch: StructuredPatchHunk[],
419
+ newFile: string,
420
+ ): { formattedSnippet: string; startLine: number } {
421
+ if (patch.length === 0) {
422
+ // No changes, return empty snippet
423
+ return { formattedSnippet: '', startLine: 1 }
424
+ }
425
+
426
+ // Find the first and last changed lines across all hunks
427
+ let minLine = Infinity
428
+ let maxLine = -Infinity
429
+
430
+ for (const hunk of patch) {
431
+ if (hunk.oldStart < minLine) {
432
+ minLine = hunk.oldStart
433
+ }
434
+ // For the end line, we need to consider the new lines count since we're showing the new file
435
+ const hunkEnd = hunk.oldStart + (hunk.newLines || 0) - 1
436
+ if (hunkEnd > maxLine) {
437
+ maxLine = hunkEnd
438
+ }
439
+ }
440
+
441
+ // Calculate the range with context
442
+ const startLine = Math.max(1, minLine - CONTEXT_LINES)
443
+ const endLine = maxLine + CONTEXT_LINES
444
+
445
+ // Split the new file into lines and get the snippet
446
+ const fileLines = newFile.split(/\r?\n/)
447
+ const snippetLines = fileLines.slice(startLine - 1, endLine)
448
+ const snippet = snippetLines.join('\n')
449
+
450
+ // Add line numbers
451
+ const formattedSnippet = addLineNumbers({
452
+ content: snippet,
453
+ startLine,
454
+ })
455
+
456
+ return { formattedSnippet, startLine }
457
+ }
458
+
459
+ /**
460
+ * Gets a snippet from a file showing the context around a single edit.
461
+ * This is a convenience function that uses the original algorithm.
462
+ * @param originalFile The original file content
463
+ * @param oldString The text to replace
464
+ * @param newString The text to replace it with
465
+ * @param contextLines The number of lines to show before and after the change
466
+ * @returns The snippet and the starting line number
467
+ */
468
+ export function getSnippet(
469
+ originalFile: string,
470
+ oldString: string,
471
+ newString: string,
472
+ contextLines: number = 4,
473
+ ): { snippet: string; startLine: number } {
474
+ // Use the original algorithm from FileEditTool.tsx
475
+ const before = originalFile.split(oldString)[0] ?? ''
476
+ const replacementLine = before.split(/\r?\n/).length - 1
477
+ const newFileLines = applyEditToFile(
478
+ originalFile,
479
+ oldString,
480
+ newString,
481
+ ).split(/\r?\n/)
482
+
483
+ // Calculate the start and end line numbers for the snippet
484
+ const startLine = Math.max(0, replacementLine - contextLines)
485
+ const endLine =
486
+ replacementLine + contextLines + newString.split(/\r?\n/).length
487
+
488
+ // Get snippet
489
+ const snippetLines = newFileLines.slice(startLine, endLine)
490
+ const snippet = snippetLines.join('\n')
491
+
492
+ return { snippet, startLine: startLine + 1 }
493
+ }
494
+
495
+ export function getEditsForPatch(patch: StructuredPatchHunk[]): FileEdit[] {
496
+ return patch.map(hunk => {
497
+ // Extract the changes from this hunk
498
+ const contextLines: string[] = []
499
+ const oldLines: string[] = []
500
+ const newLines: string[] = []
501
+
502
+ // Parse each line and categorize it
503
+ for (const line of hunk.lines) {
504
+ if (line.startsWith(' ')) {
505
+ // Context line - appears in both versions
506
+ contextLines.push(line.slice(1))
507
+ oldLines.push(line.slice(1))
508
+ newLines.push(line.slice(1))
509
+ } else if (line.startsWith('-')) {
510
+ // Deleted line - only in old version
511
+ oldLines.push(line.slice(1))
512
+ } else if (line.startsWith('+')) {
513
+ // Added line - only in new version
514
+ newLines.push(line.slice(1))
515
+ }
516
+ }
517
+
518
+ return {
519
+ old_string: oldLines.join('\n'),
520
+ new_string: newLines.join('\n'),
521
+ replace_all: false,
522
+ }
523
+ })
524
+ }
525
+
526
+ /**
527
+ * Contains replacements to de-sanitize strings from Claude
528
+ * Since Claude can't see any of these strings (sanitized in the API)
529
+ * It'll output the sanitized versions in the edit response
530
+ */
531
+ const DESANITIZATIONS: Record<string, string> = {
532
+ '<fnr>': '<function_results>',
533
+ '<n>': '<name>',
534
+ '</n>': '</name>',
535
+ '<o>': '<output>',
536
+ '</o>': '</output>',
537
+ '<e>': '<error>',
538
+ '</e>': '</error>',
539
+ '<s>': '<system>',
540
+ '</s>': '</system>',
541
+ '<r>': '<result>',
542
+ '</r>': '</result>',
543
+ '< META_START >': '<META_START>',
544
+ '< META_END >': '<META_END>',
545
+ '< EOT >': '<EOT>',
546
+ '< META >': '<META>',
547
+ '< SOS >': '<SOS>',
548
+ '\n\nH:': '\n\nHuman:',
549
+ '\n\nA:': '\n\nAssistant:',
550
+ }
551
+
552
+ /**
553
+ * Normalizes a match string by applying specific replacements
554
+ * This helps handle when exact matches fail due to formatting differences
555
+ * @returns The normalized string and which replacements were applied
556
+ */
557
+ function desanitizeMatchString(matchString: string): {
558
+ result: string
559
+ appliedReplacements: Array<{ from: string; to: string }>
560
+ } {
561
+ let result = matchString
562
+ const appliedReplacements: Array<{ from: string; to: string }> = []
563
+
564
+ for (const [from, to] of Object.entries(DESANITIZATIONS)) {
565
+ const beforeReplace = result
566
+ result = result.replaceAll(from, to)
567
+
568
+ if (beforeReplace !== result) {
569
+ appliedReplacements.push({ from, to })
570
+ }
571
+ }
572
+
573
+ return { result, appliedReplacements }
574
+ }
575
+
576
+ /**
577
+ * Normalize the input for the FileEditTool
578
+ * If the string to replace is not found in the file, try with a normalized version
579
+ * Returns the normalized input if successful, or the original input if not
580
+ */
581
+ export function normalizeFileEditInput({
582
+ file_path,
583
+ edits,
584
+ }: {
585
+ file_path: string
586
+ edits: EditInput[]
587
+ }): {
588
+ file_path: string
589
+ edits: EditInput[]
590
+ } {
591
+ if (edits.length === 0) {
592
+ return { file_path, edits }
593
+ }
594
+
595
+ // Markdown uses two trailing spaces as a hard line break — stripping would
596
+ // silently change semantics. Skip stripTrailingWhitespace for .md/.mdx.
597
+ const isMarkdown = /\.(md|mdx)$/i.test(file_path)
598
+
599
+ try {
600
+ const fullPath = expandPath(file_path)
601
+
602
+ // Use cached file read to avoid redundant I/O operations.
603
+ // If the file doesn't exist, readFileSyncCached throws ENOENT which the
604
+ // catch below handles by returning the original input (no TOCTOU pre-check).
605
+ const fileContent = readFileSyncCached(fullPath)
606
+
607
+ return {
608
+ file_path,
609
+ edits: edits.map(({ old_string, new_string, replace_all }) => {
610
+ const normalizedNewString = isMarkdown
611
+ ? new_string
612
+ : stripTrailingWhitespace(new_string)
613
+
614
+ // If exact string match works, keep it as is
615
+ if (fileContent.includes(old_string)) {
616
+ return {
617
+ old_string,
618
+ new_string: normalizedNewString,
619
+ replace_all,
620
+ }
621
+ }
622
+
623
+ // Try de-sanitize string if exact match fails
624
+ const { result: desanitizedOldString, appliedReplacements } =
625
+ desanitizeMatchString(old_string)
626
+
627
+ if (fileContent.includes(desanitizedOldString)) {
628
+ // Apply the same exact replacements to new_string
629
+ let desanitizedNewString = normalizedNewString
630
+ for (const { from, to } of appliedReplacements) {
631
+ desanitizedNewString = desanitizedNewString.replaceAll(from, to)
632
+ }
633
+
634
+ return {
635
+ old_string: desanitizedOldString,
636
+ new_string: desanitizedNewString,
637
+ replace_all,
638
+ }
639
+ }
640
+
641
+ return {
642
+ old_string,
643
+ new_string: normalizedNewString,
644
+ replace_all,
645
+ }
646
+ }),
647
+ }
648
+ } catch (error) {
649
+ // If there's any error reading the file, just return original input.
650
+ // ENOENT is expected when the file doesn't exist yet (e.g., new file).
651
+ if (!isENOENT(error)) {
652
+ logError(error)
653
+ }
654
+ }
655
+
656
+ return { file_path, edits }
657
+ }
658
+
659
+ /**
660
+ * Compare two sets of edits to determine if they are equivalent
661
+ * by applying both sets to the original content and comparing results.
662
+ * This handles cases where edits might be different but produce the same outcome.
663
+ */
664
+ export function areFileEditsEquivalent(
665
+ edits1: FileEdit[],
666
+ edits2: FileEdit[],
667
+ originalContent: string,
668
+ ): boolean {
669
+ // Fast path: check if edits are literally identical
670
+ if (
671
+ edits1.length === edits2.length &&
672
+ edits1.every((edit1, index) => {
673
+ const edit2 = edits2[index]
674
+ return (
675
+ edit2 !== undefined &&
676
+ edit1.old_string === edit2.old_string &&
677
+ edit1.new_string === edit2.new_string &&
678
+ edit1.replace_all === edit2.replace_all
679
+ )
680
+ })
681
+ ) {
682
+ return true
683
+ }
684
+
685
+ // Try applying both sets of edits
686
+ let result1: { patch: StructuredPatchHunk[]; updatedFile: string } | null =
687
+ null
688
+ let error1: string | null = null
689
+ let result2: { patch: StructuredPatchHunk[]; updatedFile: string } | null =
690
+ null
691
+ let error2: string | null = null
692
+
693
+ try {
694
+ result1 = getPatchForEdits({
695
+ filePath: 'temp',
696
+ fileContents: originalContent,
697
+ edits: edits1,
698
+ })
699
+ } catch (e) {
700
+ error1 = errorMessage(e)
701
+ }
702
+
703
+ try {
704
+ result2 = getPatchForEdits({
705
+ filePath: 'temp',
706
+ fileContents: originalContent,
707
+ edits: edits2,
708
+ })
709
+ } catch (e) {
710
+ error2 = errorMessage(e)
711
+ }
712
+
713
+ // If both threw errors, they're equal only if the errors are the same
714
+ if (error1 !== null && error2 !== null) {
715
+ // Normalize error messages for comparison
716
+ return error1 === error2
717
+ }
718
+
719
+ // If one threw an error and the other didn't, they're not equal
720
+ if (error1 !== null || error2 !== null) {
721
+ return false
722
+ }
723
+
724
+ // Both succeeded - compare the results
725
+ return result1!.updatedFile === result2!.updatedFile
726
+ }
727
+
728
+ /**
729
+ * Unified function to check if two file edit inputs are equivalent.
730
+ * Handles file edits (FileEditTool).
731
+ */
732
+ export function areFileEditsInputsEquivalent(
733
+ input1: {
734
+ file_path: string
735
+ edits: FileEdit[]
736
+ },
737
+ input2: {
738
+ file_path: string
739
+ edits: FileEdit[]
740
+ },
741
+ ): boolean {
742
+ // Fast path: different files
743
+ if (input1.file_path !== input2.file_path) {
744
+ return false
745
+ }
746
+
747
+ // Fast path: literal equality
748
+ if (
749
+ input1.edits.length === input2.edits.length &&
750
+ input1.edits.every((edit1, index) => {
751
+ const edit2 = input2.edits[index]
752
+ return (
753
+ edit2 !== undefined &&
754
+ edit1.old_string === edit2.old_string &&
755
+ edit1.new_string === edit2.new_string &&
756
+ edit1.replace_all === edit2.replace_all
757
+ )
758
+ })
759
+ ) {
760
+ return true
761
+ }
762
+
763
+ // Semantic comparison (requires file read). If the file doesn't exist,
764
+ // compare against empty content (no TOCTOU pre-check).
765
+ let fileContent = ''
766
+ try {
767
+ fileContent = readFileSyncCached(input1.file_path)
768
+ } catch (error) {
769
+ if (!isENOENT(error)) {
770
+ throw error
771
+ }
772
+ }
773
+
774
+ return areFileEditsEquivalent(input1.edits, input2.edits, fileContent)
775
+ }