@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,822 @@
1
+ import { feature } from 'bun:bundle'
2
+ import type Anthropic from '@anthropic-ai/sdk'
3
+ import {
4
+ APIConnectionError,
5
+ APIError,
6
+ APIUserAbortError,
7
+ } from '@anthropic-ai/sdk'
8
+ import type { QuerySource } from 'src/constants/querySource.js'
9
+ import type { SystemAPIErrorMessage } from 'src/types/message.js'
10
+ import { isAwsCredentialsProviderError } from 'src/utils/aws.js'
11
+ import { logForDebugging } from 'src/utils/debug.js'
12
+ import { logError } from 'src/utils/log.js'
13
+ import { createSystemAPIErrorMessage } from 'src/utils/messages.js'
14
+ import { getAPIProviderForStatsig } from 'src/utils/model/providers.js'
15
+ import {
16
+ clearApiKeyHelperCache,
17
+ clearAwsCredentialsCache,
18
+ clearGcpCredentialsCache,
19
+ getClaudeAIOAuthTokens,
20
+ handleOAuth401Error,
21
+ isClaudeAISubscriber,
22
+ isEnterpriseSubscriber,
23
+ } from '../../utils/auth.js'
24
+ import { isEnvTruthy } from '../../utils/envUtils.js'
25
+ import { errorMessage } from '../../utils/errors.js'
26
+ import {
27
+ type CooldownReason,
28
+ handleFastModeOverageRejection,
29
+ handleFastModeRejectedByAPI,
30
+ isFastModeCooldown,
31
+ isFastModeEnabled,
32
+ triggerFastModeCooldown,
33
+ } from '../../utils/fastMode.js'
34
+ import { isNonCustomOpusModel } from '../../utils/model/model.js'
35
+ import { disableKeepAlive } from '../../utils/proxy.js'
36
+ import { sleep } from '../../utils/sleep.js'
37
+ import type { ThinkingConfig } from '../../utils/thinking.js'
38
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../analytics/growthbook.js'
39
+ import {
40
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
41
+ logEvent,
42
+ } from '../analytics/index.js'
43
+ import {
44
+ checkMockRateLimitError,
45
+ isMockRateLimitError,
46
+ } from '../rateLimitMocking.js'
47
+ import { REPEATED_529_ERROR_MESSAGE } from './errors.js'
48
+ import { extractConnectionErrorDetails } from './errorUtils.js'
49
+
50
+ const abortError = () => new APIUserAbortError()
51
+
52
+ const DEFAULT_MAX_RETRIES = 10
53
+ const FLOOR_OUTPUT_TOKENS = 3000
54
+ const MAX_529_RETRIES = 3
55
+ export const BASE_DELAY_MS = 500
56
+
57
+ // Foreground query sources where the user IS blocking on the result — these
58
+ // retry on 529. Everything else (summaries, titles, suggestions, classifiers)
59
+ // bails immediately: during a capacity cascade each retry is 3-10× gateway
60
+ // amplification, and the user never sees those fail anyway. New sources
61
+ // default to no-retry — add here only if the user is waiting on the result.
62
+ const FOREGROUND_529_RETRY_SOURCES = new Set<QuerySource>([
63
+ 'repl_main_thread',
64
+ 'repl_main_thread:outputStyle:custom',
65
+ 'repl_main_thread:outputStyle:Explanatory',
66
+ 'repl_main_thread:outputStyle:Learning',
67
+ 'sdk',
68
+ 'agent:custom',
69
+ 'agent:default',
70
+ 'agent:builtin',
71
+ 'compact',
72
+ 'hook_agent',
73
+ 'hook_prompt',
74
+ 'verification_agent',
75
+ 'side_question',
76
+ // Security classifiers — must complete for auto-mode correctness.
77
+ // yoloClassifier.ts uses 'auto_mode' (not 'yolo_classifier' — that's
78
+ // type-only). bash_classifier is ant-only; feature-gate so the string
79
+ // tree-shakes out of external builds (excluded-strings.txt).
80
+ 'auto_mode',
81
+ ...(feature('BASH_CLASSIFIER') ? (['bash_classifier'] as const) : []),
82
+ ])
83
+
84
+ function shouldRetry529(querySource: QuerySource | undefined): boolean {
85
+ // undefined → retry (conservative for untagged call paths)
86
+ return (
87
+ querySource === undefined || FOREGROUND_529_RETRY_SOURCES.has(querySource)
88
+ )
89
+ }
90
+
91
+ // CLAUDE_CODE_UNATTENDED_RETRY: for unattended sessions (ant-only). Retries 429/529
92
+ // indefinitely with higher backoff and periodic keep-alive yields so the host
93
+ // environment does not mark the session idle mid-wait.
94
+ // TODO(ANT-344): the keep-alive via SystemAPIErrorMessage yields is a stopgap
95
+ // until there's a dedicated keep-alive channel.
96
+ const PERSISTENT_MAX_BACKOFF_MS = 5 * 60 * 1000
97
+ const PERSISTENT_RESET_CAP_MS = 6 * 60 * 60 * 1000
98
+ const HEARTBEAT_INTERVAL_MS = 30_000
99
+
100
+ function isPersistentRetryEnabled(): boolean {
101
+ return feature('UNATTENDED_RETRY')
102
+ ? isEnvTruthy(process.env.CLAUDE_CODE_UNATTENDED_RETRY)
103
+ : false
104
+ }
105
+
106
+ function isTransientCapacityError(error: unknown): boolean {
107
+ return (
108
+ is529Error(error) || (error instanceof APIError && error.status === 429)
109
+ )
110
+ }
111
+
112
+ function isStaleConnectionError(error: unknown): boolean {
113
+ if (!(error instanceof APIConnectionError)) {
114
+ return false
115
+ }
116
+ const details = extractConnectionErrorDetails(error)
117
+ return details?.code === 'ECONNRESET' || details?.code === 'EPIPE'
118
+ }
119
+
120
+ export interface RetryContext {
121
+ maxTokensOverride?: number
122
+ model: string
123
+ thinkingConfig: ThinkingConfig
124
+ fastMode?: boolean
125
+ }
126
+
127
+ interface RetryOptions {
128
+ maxRetries?: number
129
+ model: string
130
+ fallbackModel?: string
131
+ thinkingConfig: ThinkingConfig
132
+ fastMode?: boolean
133
+ signal?: AbortSignal
134
+ querySource?: QuerySource
135
+ /**
136
+ * Pre-seed the consecutive 529 counter. Used when this retry loop is a
137
+ * non-streaming fallback after a streaming 529 — the streaming 529 should
138
+ * count toward MAX_529_RETRIES so total 529s-before-fallback is consistent
139
+ * regardless of which request mode hit the overload.
140
+ */
141
+ initialConsecutive529Errors?: number
142
+ }
143
+
144
+ export class CannotRetryError extends Error {
145
+ constructor(
146
+ public readonly originalError: unknown,
147
+ public readonly retryContext: RetryContext,
148
+ ) {
149
+ const message = errorMessage(originalError)
150
+ super(message)
151
+ this.name = 'RetryError'
152
+
153
+ // Preserve the original stack trace if available
154
+ if (originalError instanceof Error && originalError.stack) {
155
+ this.stack = originalError.stack
156
+ }
157
+ }
158
+ }
159
+
160
+ export class FallbackTriggeredError extends Error {
161
+ constructor(
162
+ public readonly originalModel: string,
163
+ public readonly fallbackModel: string,
164
+ ) {
165
+ super(`Model fallback triggered: ${originalModel} -> ${fallbackModel}`)
166
+ this.name = 'FallbackTriggeredError'
167
+ }
168
+ }
169
+
170
+ export async function* withRetry<T>(
171
+ getClient: () => Promise<Anthropic>,
172
+ operation: (
173
+ client: Anthropic,
174
+ attempt: number,
175
+ context: RetryContext,
176
+ ) => Promise<T>,
177
+ options: RetryOptions,
178
+ ): AsyncGenerator<SystemAPIErrorMessage, T> {
179
+ const maxRetries = getMaxRetries(options)
180
+ const retryContext: RetryContext = {
181
+ model: options.model,
182
+ thinkingConfig: options.thinkingConfig,
183
+ ...(isFastModeEnabled() && { fastMode: options.fastMode }),
184
+ }
185
+ let client: Anthropic | null = null
186
+ let consecutive529Errors = options.initialConsecutive529Errors ?? 0
187
+ let lastError: unknown
188
+ let persistentAttempt = 0
189
+ for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
190
+ if (options.signal?.aborted) {
191
+ throw new APIUserAbortError()
192
+ }
193
+
194
+ // Capture whether fast mode is active before this attempt
195
+ // (fallback may change the state mid-loop)
196
+ const wasFastModeActive = isFastModeEnabled()
197
+ ? retryContext.fastMode && !isFastModeCooldown()
198
+ : false
199
+
200
+ try {
201
+ // Check for mock rate limits (used by /mock-limits command for Ant employees)
202
+ if (process.env.USER_TYPE === 'ant') {
203
+ const mockError = checkMockRateLimitError(
204
+ retryContext.model,
205
+ wasFastModeActive,
206
+ )
207
+ if (mockError) {
208
+ throw mockError
209
+ }
210
+ }
211
+
212
+ // Get a fresh client instance on first attempt or after authentication errors
213
+ // - 401 for first-party API authentication failures
214
+ // - 403 "OAuth token has been revoked" (another process refreshed the token)
215
+ // - Bedrock-specific auth errors (403 or CredentialsProviderError)
216
+ // - Vertex-specific auth errors (credential refresh failures, 401)
217
+ // - ECONNRESET/EPIPE: stale keep-alive socket; disable pooling and reconnect
218
+ const isStaleConnection = isStaleConnectionError(lastError)
219
+ if (
220
+ isStaleConnection &&
221
+ getFeatureValue_CACHED_MAY_BE_STALE(
222
+ 'tengu_disable_keepalive_on_econnreset',
223
+ false,
224
+ )
225
+ ) {
226
+ logForDebugging(
227
+ 'Stale connection (ECONNRESET/EPIPE) — disabling keep-alive for retry',
228
+ )
229
+ disableKeepAlive()
230
+ }
231
+
232
+ if (
233
+ client === null ||
234
+ (lastError instanceof APIError && lastError.status === 401) ||
235
+ isOAuthTokenRevokedError(lastError) ||
236
+ isBedrockAuthError(lastError) ||
237
+ isVertexAuthError(lastError) ||
238
+ isStaleConnection
239
+ ) {
240
+ // On 401 "token expired" or 403 "token revoked", force a token refresh
241
+ if (
242
+ (lastError instanceof APIError && lastError.status === 401) ||
243
+ isOAuthTokenRevokedError(lastError)
244
+ ) {
245
+ const failedAccessToken = getClaudeAIOAuthTokens()?.accessToken
246
+ if (failedAccessToken) {
247
+ await handleOAuth401Error(failedAccessToken)
248
+ }
249
+ }
250
+ client = await getClient()
251
+ }
252
+
253
+ return await operation(client, attempt, retryContext)
254
+ } catch (error) {
255
+ lastError = error
256
+ logForDebugging(
257
+ `API error (attempt ${attempt}/${maxRetries + 1}): ${error instanceof APIError ? `${error.status} ${error.message}` : errorMessage(error)}`,
258
+ { level: 'error' },
259
+ )
260
+
261
+ // Fast mode fallback: on 429/529, either wait and retry (short delays)
262
+ // or fall back to standard speed (long delays) to avoid cache thrashing.
263
+ // Skip in persistent mode: the short-retry path below loops with fast
264
+ // mode still active, so its `continue` never reaches the attempt clamp
265
+ // and the for-loop terminates. Persistent sessions want the chunked
266
+ // keep-alive path instead of fast-mode cache-preservation anyway.
267
+ if (
268
+ wasFastModeActive &&
269
+ !isPersistentRetryEnabled() &&
270
+ error instanceof APIError &&
271
+ (error.status === 429 || is529Error(error))
272
+ ) {
273
+ // If the 429 is specifically because extra usage (overage) is not
274
+ // available, permanently disable fast mode with a specific message.
275
+ const overageReason = error.headers?.get(
276
+ 'anthropic-ratelimit-unified-overage-disabled-reason',
277
+ )
278
+ if (overageReason !== null && overageReason !== undefined) {
279
+ handleFastModeOverageRejection(overageReason)
280
+ retryContext.fastMode = false
281
+ continue
282
+ }
283
+
284
+ const retryAfterMs = getRetryAfterMs(error)
285
+ if (retryAfterMs !== null && retryAfterMs < SHORT_RETRY_THRESHOLD_MS) {
286
+ // Short retry-after: wait and retry with fast mode still active
287
+ // to preserve prompt cache (same model name on retry).
288
+ await sleep(retryAfterMs, options.signal, { abortError })
289
+ continue
290
+ }
291
+ // Long or unknown retry-after: enter cooldown (switches to standard
292
+ // speed model), with a minimum floor to avoid flip-flopping.
293
+ const cooldownMs = Math.max(
294
+ retryAfterMs ?? DEFAULT_FAST_MODE_FALLBACK_HOLD_MS,
295
+ MIN_COOLDOWN_MS,
296
+ )
297
+ const cooldownReason: CooldownReason = is529Error(error)
298
+ ? 'overloaded'
299
+ : 'rate_limit'
300
+ triggerFastModeCooldown(Date.now() + cooldownMs, cooldownReason)
301
+ if (isFastModeEnabled()) {
302
+ retryContext.fastMode = false
303
+ }
304
+ continue
305
+ }
306
+
307
+ // Fast mode fallback: if the API rejects the fast mode parameter
308
+ // (e.g., org doesn't have fast mode enabled), permanently disable fast
309
+ // mode and retry at standard speed.
310
+ if (wasFastModeActive && isFastModeNotEnabledError(error)) {
311
+ handleFastModeRejectedByAPI()
312
+ retryContext.fastMode = false
313
+ continue
314
+ }
315
+
316
+ // Non-foreground sources bail immediately on 529 — no retry amplification
317
+ // during capacity cascades. User never sees these fail.
318
+ if (is529Error(error) && !shouldRetry529(options.querySource)) {
319
+ logEvent('tengu_api_529_background_dropped', {
320
+ query_source:
321
+ options.querySource as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
322
+ })
323
+ throw new CannotRetryError(error, retryContext)
324
+ }
325
+
326
+ // Track consecutive 529 errors
327
+ if (
328
+ is529Error(error) &&
329
+ // If FALLBACK_FOR_ALL_PRIMARY_MODELS is not set, fall through only if the primary model is a non-custom Opus model.
330
+ // TODO: Revisit if the isNonCustomOpusModel check should still exist, or if isNonCustomOpusModel is a stale artifact of when Claude Code was hardcoded on Opus.
331
+ (process.env.FALLBACK_FOR_ALL_PRIMARY_MODELS ||
332
+ (!isClaudeAISubscriber() && isNonCustomOpusModel(options.model)))
333
+ ) {
334
+ consecutive529Errors++
335
+ if (consecutive529Errors >= MAX_529_RETRIES) {
336
+ // Check if fallback model is specified
337
+ if (options.fallbackModel) {
338
+ logEvent('tengu_api_opus_fallback_triggered', {
339
+ original_model:
340
+ options.model as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
341
+ fallback_model:
342
+ options.fallbackModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
343
+ provider: getAPIProviderForStatsig(),
344
+ })
345
+
346
+ // Throw special error to indicate fallback was triggered
347
+ throw new FallbackTriggeredError(
348
+ options.model,
349
+ options.fallbackModel,
350
+ )
351
+ }
352
+
353
+ if (
354
+ process.env.USER_TYPE === 'external' &&
355
+ !process.env.IS_SANDBOX &&
356
+ !isPersistentRetryEnabled()
357
+ ) {
358
+ logEvent('tengu_api_custom_529_overloaded_error', {})
359
+ throw new CannotRetryError(
360
+ new Error(REPEATED_529_ERROR_MESSAGE),
361
+ retryContext,
362
+ )
363
+ }
364
+ }
365
+ }
366
+
367
+ // Only retry if the error indicates we should
368
+ const persistent =
369
+ isPersistentRetryEnabled() && isTransientCapacityError(error)
370
+ if (attempt > maxRetries && !persistent) {
371
+ throw new CannotRetryError(error, retryContext)
372
+ }
373
+
374
+ // AWS/GCP errors aren't always APIError, but can be retried
375
+ const handledCloudAuthError =
376
+ handleAwsCredentialError(error) || handleGcpCredentialError(error)
377
+ if (
378
+ !handledCloudAuthError &&
379
+ (!(error instanceof APIError) || !shouldRetry(error))
380
+ ) {
381
+ throw new CannotRetryError(error, retryContext)
382
+ }
383
+
384
+ // Handle max tokens context overflow errors by adjusting max_tokens for the next attempt
385
+ // NOTE: With extended-context-window beta, this 400 error should not occur.
386
+ // The API now returns 'model_context_window_exceeded' stop_reason instead.
387
+ // Keeping for backward compatibility.
388
+ if (error instanceof APIError) {
389
+ const overflowData = parseMaxTokensContextOverflowError(error)
390
+ if (overflowData) {
391
+ const { inputTokens, contextLimit } = overflowData
392
+
393
+ const safetyBuffer = 1000
394
+ const availableContext = Math.max(
395
+ 0,
396
+ contextLimit - inputTokens - safetyBuffer,
397
+ )
398
+ if (availableContext < FLOOR_OUTPUT_TOKENS) {
399
+ logError(
400
+ new Error(
401
+ `availableContext ${availableContext} is less than FLOOR_OUTPUT_TOKENS ${FLOOR_OUTPUT_TOKENS}`,
402
+ ),
403
+ )
404
+ throw error
405
+ }
406
+ // Ensure we have enough tokens for thinking + at least 1 output token
407
+ const minRequired =
408
+ (retryContext.thinkingConfig.type === 'enabled'
409
+ ? retryContext.thinkingConfig.budgetTokens
410
+ : 0) + 1
411
+ const adjustedMaxTokens = Math.max(
412
+ FLOOR_OUTPUT_TOKENS,
413
+ availableContext,
414
+ minRequired,
415
+ )
416
+ retryContext.maxTokensOverride = adjustedMaxTokens
417
+
418
+ logEvent('tengu_max_tokens_context_overflow_adjustment', {
419
+ inputTokens,
420
+ contextLimit,
421
+ adjustedMaxTokens,
422
+ attempt,
423
+ })
424
+
425
+ continue
426
+ }
427
+ }
428
+
429
+ // For other errors, proceed with normal retry logic
430
+ // Get retry-after header if available
431
+ const retryAfter = getRetryAfter(error)
432
+ let delayMs: number
433
+ if (persistent && error instanceof APIError && error.status === 429) {
434
+ persistentAttempt++
435
+ // Window-based limits (e.g. 5hr Max/Pro) include a reset timestamp.
436
+ // Wait until reset rather than polling every 5 min uselessly.
437
+ const resetDelay = getRateLimitResetDelayMs(error)
438
+ delayMs =
439
+ resetDelay ??
440
+ Math.min(
441
+ getRetryDelay(
442
+ persistentAttempt,
443
+ retryAfter,
444
+ PERSISTENT_MAX_BACKOFF_MS,
445
+ ),
446
+ PERSISTENT_RESET_CAP_MS,
447
+ )
448
+ } else if (persistent) {
449
+ persistentAttempt++
450
+ // Retry-After is a server directive and bypasses maxDelayMs inside
451
+ // getRetryDelay (intentional — honoring it is correct). Cap at the
452
+ // 6hr reset-cap here so a pathological header can't wait unbounded.
453
+ delayMs = Math.min(
454
+ getRetryDelay(
455
+ persistentAttempt,
456
+ retryAfter,
457
+ PERSISTENT_MAX_BACKOFF_MS,
458
+ ),
459
+ PERSISTENT_RESET_CAP_MS,
460
+ )
461
+ } else {
462
+ delayMs = getRetryDelay(attempt, retryAfter)
463
+ }
464
+
465
+ // In persistent mode the for-loop `attempt` is clamped at maxRetries+1;
466
+ // use persistentAttempt for telemetry/yields so they show the true count.
467
+ const reportedAttempt = persistent ? persistentAttempt : attempt
468
+ logEvent('tengu_api_retry', {
469
+ attempt: reportedAttempt,
470
+ delayMs: delayMs,
471
+ error: (error as APIError)
472
+ .message as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
473
+ status: (error as APIError).status,
474
+ provider: getAPIProviderForStatsig(),
475
+ })
476
+
477
+ if (persistent) {
478
+ if (delayMs > 60_000) {
479
+ logEvent('tengu_api_persistent_retry_wait', {
480
+ status: (error as APIError).status,
481
+ delayMs,
482
+ attempt: reportedAttempt,
483
+ provider: getAPIProviderForStatsig(),
484
+ })
485
+ }
486
+ // Chunk long sleeps so the host sees periodic stdout activity and
487
+ // does not mark the session idle. Each yield surfaces as
488
+ // {type:'system', subtype:'api_retry'} on stdout via QueryEngine.
489
+ let remaining = delayMs
490
+ while (remaining > 0) {
491
+ if (options.signal?.aborted) throw new APIUserAbortError()
492
+ if (error instanceof APIError) {
493
+ yield createSystemAPIErrorMessage(
494
+ error,
495
+ remaining,
496
+ reportedAttempt,
497
+ maxRetries,
498
+ )
499
+ }
500
+ const chunk = Math.min(remaining, HEARTBEAT_INTERVAL_MS)
501
+ await sleep(chunk, options.signal, { abortError })
502
+ remaining -= chunk
503
+ }
504
+ // Clamp so the for-loop never terminates. Backoff uses the separate
505
+ // persistentAttempt counter which keeps growing to the 5-min cap.
506
+ if (attempt >= maxRetries) attempt = maxRetries
507
+ } else {
508
+ if (error instanceof APIError) {
509
+ yield createSystemAPIErrorMessage(error, delayMs, attempt, maxRetries)
510
+ }
511
+ await sleep(delayMs, options.signal, { abortError })
512
+ }
513
+ }
514
+ }
515
+
516
+ throw new CannotRetryError(lastError, retryContext)
517
+ }
518
+
519
+ function getRetryAfter(error: unknown): string | null {
520
+ return (
521
+ ((error as { headers?: { 'retry-after'?: string } }).headers?.[
522
+ 'retry-after'
523
+ ] ||
524
+ // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
525
+ ((error as APIError).headers as Headers)?.get?.('retry-after')) ??
526
+ null
527
+ )
528
+ }
529
+
530
+ export function getRetryDelay(
531
+ attempt: number,
532
+ retryAfterHeader?: string | null,
533
+ maxDelayMs = 32000,
534
+ ): number {
535
+ if (retryAfterHeader) {
536
+ const seconds = parseInt(retryAfterHeader, 10)
537
+ if (!isNaN(seconds)) {
538
+ return seconds * 1000
539
+ }
540
+ }
541
+
542
+ const baseDelay = Math.min(
543
+ BASE_DELAY_MS * Math.pow(2, attempt - 1),
544
+ maxDelayMs,
545
+ )
546
+ const jitter = Math.random() * 0.25 * baseDelay
547
+ return baseDelay + jitter
548
+ }
549
+
550
+ export function parseMaxTokensContextOverflowError(error: APIError):
551
+ | {
552
+ inputTokens: number
553
+ maxTokens: number
554
+ contextLimit: number
555
+ }
556
+ | undefined {
557
+ if (error.status !== 400 || !error.message) {
558
+ return undefined
559
+ }
560
+
561
+ if (
562
+ !error.message.includes(
563
+ 'input length and `max_tokens` exceed context limit',
564
+ )
565
+ ) {
566
+ return undefined
567
+ }
568
+
569
+ // Example format: "input length and `max_tokens` exceed context limit: 188059 + 20000 > 200000"
570
+ const regex =
571
+ /input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/
572
+ const match = error.message.match(regex)
573
+
574
+ if (!match || match.length !== 4) {
575
+ return undefined
576
+ }
577
+
578
+ if (!match[1] || !match[2] || !match[3]) {
579
+ logError(
580
+ new Error(
581
+ 'Unable to parse max_tokens from max_tokens exceed context limit error message',
582
+ ),
583
+ )
584
+ return undefined
585
+ }
586
+ const inputTokens = parseInt(match[1], 10)
587
+ const maxTokens = parseInt(match[2], 10)
588
+ const contextLimit = parseInt(match[3], 10)
589
+
590
+ if (isNaN(inputTokens) || isNaN(maxTokens) || isNaN(contextLimit)) {
591
+ return undefined
592
+ }
593
+
594
+ return { inputTokens, maxTokens, contextLimit }
595
+ }
596
+
597
+ // TODO: Replace with a response header check once the API adds a dedicated
598
+ // header for fast-mode rejection (e.g., x-fast-mode-rejected). String-matching
599
+ // the error message is fragile and will break if the API wording changes.
600
+ function isFastModeNotEnabledError(error: unknown): boolean {
601
+ if (!(error instanceof APIError)) {
602
+ return false
603
+ }
604
+ return (
605
+ error.status === 400 &&
606
+ (error.message?.includes('Fast mode is not enabled') ?? false)
607
+ )
608
+ }
609
+
610
+ export function is529Error(error: unknown): boolean {
611
+ if (!(error instanceof APIError)) {
612
+ return false
613
+ }
614
+
615
+ // Check for 529 status code or overloaded error in message
616
+ return (
617
+ error.status === 529 ||
618
+ // See below: the SDK sometimes fails to properly pass the 529 status code during streaming
619
+ (error.message?.includes('"type":"overloaded_error"') ?? false)
620
+ )
621
+ }
622
+
623
+ function isOAuthTokenRevokedError(error: unknown): boolean {
624
+ return (
625
+ error instanceof APIError &&
626
+ error.status === 403 &&
627
+ (error.message?.includes('OAuth token has been revoked') ?? false)
628
+ )
629
+ }
630
+
631
+ function isBedrockAuthError(error: unknown): boolean {
632
+ if (isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK)) {
633
+ // AWS libs reject without an API call if .aws holds a past Expiration value
634
+ // otherwise, API calls that receive expired tokens give generic 403
635
+ // "The security token included in the request is invalid"
636
+ if (
637
+ isAwsCredentialsProviderError(error) ||
638
+ (error instanceof APIError && error.status === 403)
639
+ ) {
640
+ return true
641
+ }
642
+ }
643
+ return false
644
+ }
645
+
646
+ /**
647
+ * Clear AWS auth caches if appropriate.
648
+ * @returns true if action was taken.
649
+ */
650
+ function handleAwsCredentialError(error: unknown): boolean {
651
+ if (isBedrockAuthError(error)) {
652
+ clearAwsCredentialsCache()
653
+ return true
654
+ }
655
+ return false
656
+ }
657
+
658
+ // google-auth-library throws plain Error (no typed name like AWS's
659
+ // CredentialsProviderError). Match common SDK-level credential-failure messages.
660
+ function isGoogleAuthLibraryCredentialError(error: unknown): boolean {
661
+ if (!(error instanceof Error)) return false
662
+ const msg = error.message
663
+ return (
664
+ msg.includes('Could not load the default credentials') ||
665
+ msg.includes('Could not refresh access token') ||
666
+ msg.includes('invalid_grant')
667
+ )
668
+ }
669
+
670
+ function isVertexAuthError(error: unknown): boolean {
671
+ if (isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX)) {
672
+ // SDK-level: google-auth-library fails in prepareOptions() before the HTTP call
673
+ if (isGoogleAuthLibraryCredentialError(error)) {
674
+ return true
675
+ }
676
+ // Server-side: Vertex returns 401 for expired/invalid tokens
677
+ if (error instanceof APIError && error.status === 401) {
678
+ return true
679
+ }
680
+ }
681
+ return false
682
+ }
683
+
684
+ /**
685
+ * Clear GCP auth caches if appropriate.
686
+ * @returns true if action was taken.
687
+ */
688
+ function handleGcpCredentialError(error: unknown): boolean {
689
+ if (isVertexAuthError(error)) {
690
+ clearGcpCredentialsCache()
691
+ return true
692
+ }
693
+ return false
694
+ }
695
+
696
+ function shouldRetry(error: APIError): boolean {
697
+ // Never retry mock errors - they're from /mock-limits command for testing
698
+ if (isMockRateLimitError(error)) {
699
+ return false
700
+ }
701
+
702
+ // Persistent mode: 429/529 always retryable, bypass subscriber gates and
703
+ // x-should-retry header.
704
+ if (isPersistentRetryEnabled() && isTransientCapacityError(error)) {
705
+ return true
706
+ }
707
+
708
+ // CCR mode: auth is via infrastructure-provided JWTs, so a 401/403 is a
709
+ // transient blip (auth service flap, network hiccup) rather than bad
710
+ // credentials. Bypass x-should-retry:false — the server assumes we'd retry
711
+ // the same bad key, but our key is fine.
712
+ if (
713
+ isEnvTruthy(process.env.CLAUDE_CODE_REMOTE) &&
714
+ (error.status === 401 || error.status === 403)
715
+ ) {
716
+ return true
717
+ }
718
+
719
+ // Check for overloaded errors first by examining the message content
720
+ // The SDK sometimes fails to properly pass the 529 status code during streaming,
721
+ // so we need to check the error message directly
722
+ if (error.message?.includes('"type":"overloaded_error"')) {
723
+ return true
724
+ }
725
+
726
+ // Check for max tokens context overflow errors that we can handle
727
+ if (parseMaxTokensContextOverflowError(error)) {
728
+ return true
729
+ }
730
+
731
+ // Note this is not a standard header.
732
+ const shouldRetryHeader = error.headers?.get('x-should-retry')
733
+
734
+ // If the server explicitly says whether or not to retry, obey.
735
+ // For Max and Pro users, should-retry is true, but in several hours, so we shouldn't.
736
+ // Enterprise users can retry because they typically use PAYG instead of rate limits.
737
+ if (
738
+ shouldRetryHeader === 'true' &&
739
+ (!isClaudeAISubscriber() || isEnterpriseSubscriber())
740
+ ) {
741
+ return true
742
+ }
743
+
744
+ // Ants can ignore x-should-retry: false for 5xx server errors only.
745
+ // For other status codes (401, 403, 400, 429, etc.), respect the header.
746
+ if (shouldRetryHeader === 'false') {
747
+ const is5xxError = error.status !== undefined && error.status >= 500
748
+ if (!(process.env.USER_TYPE === 'ant' && is5xxError)) {
749
+ return false
750
+ }
751
+ }
752
+
753
+ if (error instanceof APIConnectionError) {
754
+ return true
755
+ }
756
+
757
+ if (!error.status) return false
758
+
759
+ // Retry on request timeouts.
760
+ if (error.status === 408) return true
761
+
762
+ // Retry on lock timeouts.
763
+ if (error.status === 409) return true
764
+
765
+ // Retry on rate limits, but not for ClaudeAI Subscription users
766
+ // Enterprise users can retry because they typically use PAYG instead of rate limits
767
+ if (error.status === 429) {
768
+ return !isClaudeAISubscriber() || isEnterpriseSubscriber()
769
+ }
770
+
771
+ // Clear API key cache on 401 and allow retry.
772
+ // OAuth token handling is done in the main retry loop via handleOAuth401Error.
773
+ if (error.status === 401) {
774
+ clearApiKeyHelperCache()
775
+ return true
776
+ }
777
+
778
+ // Retry on 403 "token revoked" (same refresh logic as 401, see above)
779
+ if (isOAuthTokenRevokedError(error)) {
780
+ return true
781
+ }
782
+
783
+ // Retry internal errors.
784
+ if (error.status && error.status >= 500) return true
785
+
786
+ return false
787
+ }
788
+
789
+ export function getDefaultMaxRetries(): number {
790
+ if (process.env.CLAUDE_CODE_MAX_RETRIES) {
791
+ return parseInt(process.env.CLAUDE_CODE_MAX_RETRIES, 10)
792
+ }
793
+ return DEFAULT_MAX_RETRIES
794
+ }
795
+ function getMaxRetries(options: RetryOptions): number {
796
+ return options.maxRetries ?? getDefaultMaxRetries()
797
+ }
798
+
799
+ const DEFAULT_FAST_MODE_FALLBACK_HOLD_MS = 30 * 60 * 1000 // 30 minutes
800
+ const SHORT_RETRY_THRESHOLD_MS = 20 * 1000 // 20 seconds
801
+ const MIN_COOLDOWN_MS = 10 * 60 * 1000 // 10 minutes
802
+
803
+ function getRetryAfterMs(error: APIError): number | null {
804
+ const retryAfter = getRetryAfter(error)
805
+ if (retryAfter) {
806
+ const seconds = parseInt(retryAfter, 10)
807
+ if (!isNaN(seconds)) {
808
+ return seconds * 1000
809
+ }
810
+ }
811
+ return null
812
+ }
813
+
814
+ function getRateLimitResetDelayMs(error: APIError): number | null {
815
+ const resetHeader = error.headers?.get?.('anthropic-ratelimit-unified-reset')
816
+ if (!resetHeader) return null
817
+ const resetUnixSec = Number(resetHeader)
818
+ if (!Number.isFinite(resetUnixSec)) return null
819
+ const delayMs = resetUnixSec * 1000 - Date.now()
820
+ if (delayMs <= 0) return null
821
+ return Math.min(delayMs, PERSISTENT_RESET_CAP_MS)
822
+ }