@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
package/utils/api.ts ADDED
@@ -0,0 +1,718 @@
1
+ import type Anthropic from '@anthropic-ai/sdk'
2
+ import type {
3
+ BetaTool,
4
+ BetaToolUnion,
5
+ } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'
6
+ import { createHash } from 'crypto'
7
+ import { SYSTEM_PROMPT_DYNAMIC_BOUNDARY } from 'src/constants/prompts.js'
8
+ import { getSystemContext, getUserContext } from 'src/context.js'
9
+ import { isAnalyticsDisabled } from 'src/services/analytics/config.js'
10
+ import {
11
+ checkStatsigFeatureGate_CACHED_MAY_BE_STALE,
12
+ getFeatureValue_CACHED_MAY_BE_STALE,
13
+ } from 'src/services/analytics/growthbook.js'
14
+ import {
15
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
16
+ logEvent,
17
+ } from 'src/services/analytics/index.js'
18
+ import { prefetchAllMcpResources } from 'src/services/mcp/client.js'
19
+ import type { ScopedMcpServerConfig } from 'src/services/mcp/types.js'
20
+ import { BashTool } from 'src/tools/BashTool/BashTool.js'
21
+ import { FileEditTool } from 'src/tools/FileEditTool/FileEditTool.js'
22
+ import {
23
+ normalizeFileEditInput,
24
+ stripTrailingWhitespace,
25
+ } from 'src/tools/FileEditTool/utils.js'
26
+ import { FileWriteTool } from 'src/tools/FileWriteTool/FileWriteTool.js'
27
+ import { getTools } from 'src/tools.js'
28
+ import type { AgentId } from 'src/types/ids.js'
29
+ import type { z } from 'zod/v4'
30
+ import { CLI_SYSPROMPT_PREFIXES } from '../constants/system.js'
31
+ import { roughTokenCountEstimation } from '../services/tokenEstimation.js'
32
+ import type { Tool, ToolPermissionContext, Tools } from '../Tool.js'
33
+ import { AGENT_TOOL_NAME } from '../tools/AgentTool/constants.js'
34
+ import type { AgentDefinition } from '../tools/AgentTool/loadAgentsDir.js'
35
+ import { EXIT_PLAN_MODE_V2_TOOL_NAME } from '../tools/ExitPlanModeTool/constants.js'
36
+ import { TASK_OUTPUT_TOOL_NAME } from '../tools/TaskOutputTool/constants.js'
37
+ import type { Message } from '../types/message.js'
38
+ import { isAgentSwarmsEnabled } from './agentSwarmsEnabled.js'
39
+ import {
40
+ modelSupportsStructuredOutputs,
41
+ shouldUseGlobalCacheScope,
42
+ } from './betas.js'
43
+ import { getCwd } from './cwd.js'
44
+ import { logForDebugging } from './debug.js'
45
+ import { isEnvTruthy } from './envUtils.js'
46
+ import { createUserMessage } from './messages.js'
47
+ import {
48
+ getAPIProvider,
49
+ isFirstPartyAnthropicBaseUrl,
50
+ } from './model/providers.js'
51
+ import {
52
+ getFileReadIgnorePatterns,
53
+ normalizePatternsToPath,
54
+ } from './permissions/filesystem.js'
55
+ import {
56
+ getPlan,
57
+ getPlanFilePath,
58
+ persistFileSnapshotIfRemote,
59
+ } from './plans.js'
60
+ import { getPlatform } from './platform.js'
61
+ import { countFilesRoundedRg } from './ripgrep.js'
62
+ import { jsonStringify } from './slowOperations.js'
63
+ import type { SystemPrompt } from './systemPromptType.js'
64
+ import { getToolSchemaCache } from './toolSchemaCache.js'
65
+ import { windowsPathToPosixPath } from './windowsPaths.js'
66
+ import { zodToJsonSchema } from './zodToJsonSchema.js'
67
+
68
+ // Extended BetaTool type with strict mode and defer_loading support
69
+ type BetaToolWithExtras = BetaTool & {
70
+ strict?: boolean
71
+ defer_loading?: boolean
72
+ cache_control?: {
73
+ type: 'ephemeral'
74
+ scope?: 'global' | 'org'
75
+ ttl?: '5m' | '1h'
76
+ }
77
+ eager_input_streaming?: boolean
78
+ }
79
+
80
+ export type CacheScope = 'global' | 'org'
81
+ export type SystemPromptBlock = {
82
+ text: string
83
+ cacheScope: CacheScope | null
84
+ }
85
+
86
+ // Fields to filter from tool schemas when swarms are not enabled
87
+ const SWARM_FIELDS_BY_TOOL: Record<string, string[]> = {
88
+ [EXIT_PLAN_MODE_V2_TOOL_NAME]: ['launchSwarm', 'teammateCount'],
89
+ [AGENT_TOOL_NAME]: ['name', 'team_name', 'mode'],
90
+ }
91
+
92
+ /**
93
+ * Filter swarm-related fields from a tool's input schema.
94
+ * Called at runtime when isAgentSwarmsEnabled() returns false.
95
+ */
96
+ function filterSwarmFieldsFromSchema(
97
+ toolName: string,
98
+ schema: Anthropic.Tool.InputSchema,
99
+ ): Anthropic.Tool.InputSchema {
100
+ const fieldsToRemove = SWARM_FIELDS_BY_TOOL[toolName]
101
+ if (!fieldsToRemove || fieldsToRemove.length === 0) {
102
+ return schema
103
+ }
104
+
105
+ // Clone the schema to avoid mutating the original
106
+ const filtered = { ...schema }
107
+ const props = filtered.properties
108
+ if (props && typeof props === 'object') {
109
+ const filteredProps = { ...(props as Record<string, unknown>) }
110
+ for (const field of fieldsToRemove) {
111
+ delete filteredProps[field]
112
+ }
113
+ filtered.properties = filteredProps
114
+ }
115
+
116
+ return filtered
117
+ }
118
+
119
+ export async function toolToAPISchema(
120
+ tool: Tool,
121
+ options: {
122
+ getToolPermissionContext: () => Promise<ToolPermissionContext>
123
+ tools: Tools
124
+ agents: AgentDefinition[]
125
+ allowedAgentTypes?: string[]
126
+ model?: string
127
+ /** When true, mark this tool with defer_loading for tool search */
128
+ deferLoading?: boolean
129
+ cacheControl?: {
130
+ type: 'ephemeral'
131
+ scope?: 'global' | 'org'
132
+ ttl?: '5m' | '1h'
133
+ }
134
+ },
135
+ ): Promise<BetaToolUnion> {
136
+ // Session-stable base schema: name, description, input_schema, strict,
137
+ // eager_input_streaming. These are computed once per session and cached to
138
+ // prevent mid-session GrowthBook flips (tengu_tool_pear, tengu_fgts) or
139
+ // tool.prompt() drift from churning the serialized tool array bytes.
140
+ // See toolSchemaCache.ts for rationale.
141
+ //
142
+ // Cache key includes inputJSONSchema when present. StructuredOutput instances
143
+ // share the name 'StructuredOutput' but carry different schemas per workflow
144
+ // call — name-only keying returned a stale schema (5.4% → 51% err rate, see
145
+ // PR#25424). MCP tools also set inputJSONSchema but each has a stable schema,
146
+ // so including it preserves their GB-flip cache stability.
147
+ const cacheKey =
148
+ 'inputJSONSchema' in tool && tool.inputJSONSchema
149
+ ? `${tool.name}:${jsonStringify(tool.inputJSONSchema)}`
150
+ : tool.name
151
+ const cache = getToolSchemaCache()
152
+ let base = cache.get(cacheKey)
153
+ if (!base) {
154
+ const strictToolsEnabled =
155
+ checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_tool_pear')
156
+ // Use tool's JSON schema directly if provided, otherwise convert Zod schema
157
+ let input_schema = (
158
+ 'inputJSONSchema' in tool && tool.inputJSONSchema
159
+ ? tool.inputJSONSchema
160
+ : zodToJsonSchema(tool.inputSchema)
161
+ ) as Anthropic.Tool.InputSchema
162
+
163
+ // Filter out swarm-related fields when swarms are not enabled
164
+ // This ensures external non-EAP users don't see swarm features in the schema
165
+ if (!isAgentSwarmsEnabled()) {
166
+ input_schema = filterSwarmFieldsFromSchema(tool.name, input_schema)
167
+ }
168
+
169
+ base = {
170
+ name: tool.name,
171
+ description: await tool.prompt({
172
+ getToolPermissionContext: options.getToolPermissionContext,
173
+ tools: options.tools,
174
+ agents: options.agents,
175
+ allowedAgentTypes: options.allowedAgentTypes,
176
+ }),
177
+ input_schema,
178
+ }
179
+
180
+ // Only add strict if:
181
+ // 1. Feature flag is enabled
182
+ // 2. Tool has strict: true
183
+ // 3. Model is provided and supports it (not all models support it right now)
184
+ // (if model is not provided, assume we can't use strict tools)
185
+ if (
186
+ strictToolsEnabled &&
187
+ tool.strict === true &&
188
+ options.model &&
189
+ modelSupportsStructuredOutputs(options.model)
190
+ ) {
191
+ base.strict = true
192
+ }
193
+
194
+ // Enable fine-grained tool streaming via per-tool API field.
195
+ // Without FGTS, the API buffers entire tool input parameters before sending
196
+ // input_json_delta events, causing multi-minute hangs on large tool inputs.
197
+ // Gated to direct api.anthropic.com: proxies (LiteLLM etc.) and Bedrock/Vertex
198
+ // with Claude 4.5 reject this field with 400. See GH#32742, PR #21729.
199
+ if (
200
+ getAPIProvider() === 'firstParty' &&
201
+ isFirstPartyAnthropicBaseUrl() &&
202
+ (getFeatureValue_CACHED_MAY_BE_STALE('tengu_fgts', false) ||
203
+ isEnvTruthy(process.env.CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING))
204
+ ) {
205
+ base.eager_input_streaming = true
206
+ }
207
+
208
+ cache.set(cacheKey, base)
209
+ }
210
+
211
+ // Per-request overlay: defer_loading and cache_control vary by call
212
+ // (tool search defers different tools per turn; cache markers move).
213
+ // Explicit field copy avoids mutating the cached base and sidesteps
214
+ // BetaTool.cache_control's `| null` clashing with our narrower type.
215
+ const schema: BetaToolWithExtras = {
216
+ name: base.name,
217
+ description: base.description,
218
+ input_schema: base.input_schema,
219
+ ...(base.strict && { strict: true }),
220
+ ...(base.eager_input_streaming && { eager_input_streaming: true }),
221
+ }
222
+
223
+ // Add defer_loading if requested (for tool search feature)
224
+ if (options.deferLoading) {
225
+ schema.defer_loading = true
226
+ }
227
+
228
+ if (options.cacheControl) {
229
+ schema.cache_control = options.cacheControl
230
+ }
231
+
232
+ // CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS is the kill switch for beta API
233
+ // shapes. Proxy gateways (ANTHROPIC_BASE_URL → LiteLLM → Bedrock) reject
234
+ // fields like defer_loading with "Extra inputs are not permitted". The gates
235
+ // above each field are scattered and not all provider-aware, so this strips
236
+ // everything not in the base-tool allowlist at the one choke point all tool
237
+ // schemas pass through — including fields added in the future.
238
+ // cache_control is allowlisted: the base {type: 'ephemeral'} shape is
239
+ // standard prompt caching (Bedrock/Vertex supported); the beta sub-fields
240
+ // (scope, ttl) are already gated upstream by shouldIncludeFirstPartyOnlyBetas
241
+ // which independently respects this kill switch.
242
+ // github.com/anthropics/claude-code/issues/20031
243
+ if (isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS)) {
244
+ const allowed = new Set([
245
+ 'name',
246
+ 'description',
247
+ 'input_schema',
248
+ 'cache_control',
249
+ ])
250
+ const stripped = Object.keys(schema).filter(k => !allowed.has(k))
251
+ if (stripped.length > 0) {
252
+ logStripOnce(stripped)
253
+ return {
254
+ name: schema.name,
255
+ description: schema.description,
256
+ input_schema: schema.input_schema,
257
+ ...(schema.cache_control && { cache_control: schema.cache_control }),
258
+ }
259
+ }
260
+ }
261
+
262
+ // Note: We cast to BetaTool but the extra fields are still present at runtime
263
+ // and will be serialized in the API request, even though they're not in the SDK's
264
+ // BetaTool type definition. This is intentional for beta features.
265
+ return schema as BetaTool
266
+ }
267
+
268
+ let loggedStrip = false
269
+ function logStripOnce(stripped: string[]): void {
270
+ if (loggedStrip) return
271
+ loggedStrip = true
272
+ logForDebugging(
273
+ `[betas] Stripped from tool schemas: [${stripped.join(', ')}] (CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1)`,
274
+ )
275
+ }
276
+
277
+ /**
278
+ * Log stats about first block for analyzing prefix matching config
279
+ * (see https://console.statsig.com/4aF3Ewatb6xPVpCwxb5nA3/dynamic_configs/claude_cli_system_prompt_prefixes)
280
+ */
281
+ export function logAPIPrefix(systemPrompt: SystemPrompt): void {
282
+ const [firstSyspromptBlock] = splitSysPromptPrefix(systemPrompt)
283
+ const firstSystemPrompt = firstSyspromptBlock?.text
284
+ logEvent('tengu_sysprompt_block', {
285
+ snippet: firstSystemPrompt?.slice(
286
+ 0,
287
+ 20,
288
+ ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
289
+ length: firstSystemPrompt?.length ?? 0,
290
+ hash: (firstSystemPrompt
291
+ ? createHash('sha256').update(firstSystemPrompt).digest('hex')
292
+ : '') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
293
+ })
294
+ }
295
+
296
+ /**
297
+ * Split system prompt blocks by content type for API matching and cache control.
298
+ * See https://console.statsig.com/4aF3Ewatb6xPVpCwxb5nA3/dynamic_configs/claude_cli_system_prompt_prefixes
299
+ *
300
+ * Behavior depends on feature flags and options:
301
+ *
302
+ * 1. MCP tools present (skipGlobalCacheForSystemPrompt=true):
303
+ * Returns up to 3 blocks with org-level caching (no global cache on system prompt):
304
+ * - Attribution header (cacheScope=null)
305
+ * - System prompt prefix (cacheScope='org')
306
+ * - Everything else concatenated (cacheScope='org')
307
+ *
308
+ * 2. Global cache mode with boundary marker (1P only, boundary found):
309
+ * Returns up to 4 blocks:
310
+ * - Attribution header (cacheScope=null)
311
+ * - System prompt prefix (cacheScope=null)
312
+ * - Static content before boundary (cacheScope='global')
313
+ * - Dynamic content after boundary (cacheScope=null)
314
+ *
315
+ * 3. Default mode (3P providers, or boundary missing):
316
+ * Returns up to 3 blocks with org-level caching:
317
+ * - Attribution header (cacheScope=null)
318
+ * - System prompt prefix (cacheScope='org')
319
+ * - Everything else concatenated (cacheScope='org')
320
+ */
321
+ export function splitSysPromptPrefix(
322
+ systemPrompt: SystemPrompt,
323
+ options?: { skipGlobalCacheForSystemPrompt?: boolean },
324
+ ): SystemPromptBlock[] {
325
+ const useGlobalCacheFeature = shouldUseGlobalCacheScope()
326
+ if (useGlobalCacheFeature && options?.skipGlobalCacheForSystemPrompt) {
327
+ logEvent('tengu_sysprompt_using_tool_based_cache', {
328
+ promptBlockCount: systemPrompt.length,
329
+ })
330
+
331
+ // Filter out boundary marker, return blocks without global scope
332
+ let attributionHeader: string | undefined
333
+ let systemPromptPrefix: string | undefined
334
+ const rest: string[] = []
335
+
336
+ for (const prompt of systemPrompt) {
337
+ if (!prompt) continue
338
+ if (prompt === SYSTEM_PROMPT_DYNAMIC_BOUNDARY) continue // Skip boundary
339
+ if (prompt.startsWith('x-anthropic-billing-header')) {
340
+ attributionHeader = prompt
341
+ } else if (CLI_SYSPROMPT_PREFIXES.has(prompt)) {
342
+ systemPromptPrefix = prompt
343
+ } else {
344
+ rest.push(prompt)
345
+ }
346
+ }
347
+
348
+ const result: SystemPromptBlock[] = []
349
+ if (attributionHeader) {
350
+ result.push({ text: attributionHeader, cacheScope: null })
351
+ }
352
+ if (systemPromptPrefix) {
353
+ result.push({ text: systemPromptPrefix, cacheScope: 'org' })
354
+ }
355
+ const restJoined = rest.join('\n\n')
356
+ if (restJoined) {
357
+ result.push({ text: restJoined, cacheScope: 'org' })
358
+ }
359
+ return result
360
+ }
361
+
362
+ if (useGlobalCacheFeature) {
363
+ const boundaryIndex = systemPrompt.findIndex(
364
+ s => s === SYSTEM_PROMPT_DYNAMIC_BOUNDARY,
365
+ )
366
+ if (boundaryIndex !== -1) {
367
+ let attributionHeader: string | undefined
368
+ let systemPromptPrefix: string | undefined
369
+ const staticBlocks: string[] = []
370
+ const dynamicBlocks: string[] = []
371
+
372
+ for (let i = 0; i < systemPrompt.length; i++) {
373
+ const block = systemPrompt[i]
374
+ if (!block || block === SYSTEM_PROMPT_DYNAMIC_BOUNDARY) continue
375
+
376
+ if (block.startsWith('x-anthropic-billing-header')) {
377
+ attributionHeader = block
378
+ } else if (CLI_SYSPROMPT_PREFIXES.has(block)) {
379
+ systemPromptPrefix = block
380
+ } else if (i < boundaryIndex) {
381
+ staticBlocks.push(block)
382
+ } else {
383
+ dynamicBlocks.push(block)
384
+ }
385
+ }
386
+
387
+ const result: SystemPromptBlock[] = []
388
+ if (attributionHeader)
389
+ result.push({ text: attributionHeader, cacheScope: null })
390
+ if (systemPromptPrefix)
391
+ result.push({ text: systemPromptPrefix, cacheScope: null })
392
+ const staticJoined = staticBlocks.join('\n\n')
393
+ if (staticJoined)
394
+ result.push({ text: staticJoined, cacheScope: 'global' })
395
+ const dynamicJoined = dynamicBlocks.join('\n\n')
396
+ if (dynamicJoined) result.push({ text: dynamicJoined, cacheScope: null })
397
+
398
+ logEvent('tengu_sysprompt_boundary_found', {
399
+ blockCount: result.length,
400
+ staticBlockLength: staticJoined.length,
401
+ dynamicBlockLength: dynamicJoined.length,
402
+ })
403
+
404
+ return result
405
+ } else {
406
+ logEvent('tengu_sysprompt_missing_boundary_marker', {
407
+ promptBlockCount: systemPrompt.length,
408
+ })
409
+ }
410
+ }
411
+ let attributionHeader: string | undefined
412
+ let systemPromptPrefix: string | undefined
413
+ const rest: string[] = []
414
+
415
+ for (const block of systemPrompt) {
416
+ if (!block) continue
417
+
418
+ if (block.startsWith('x-anthropic-billing-header')) {
419
+ attributionHeader = block
420
+ } else if (CLI_SYSPROMPT_PREFIXES.has(block)) {
421
+ systemPromptPrefix = block
422
+ } else {
423
+ rest.push(block)
424
+ }
425
+ }
426
+
427
+ const result: SystemPromptBlock[] = []
428
+ if (attributionHeader)
429
+ result.push({ text: attributionHeader, cacheScope: null })
430
+ if (systemPromptPrefix)
431
+ result.push({ text: systemPromptPrefix, cacheScope: 'org' })
432
+ const restJoined = rest.join('\n\n')
433
+ if (restJoined) result.push({ text: restJoined, cacheScope: 'org' })
434
+ return result
435
+ }
436
+
437
+ export function appendSystemContext(
438
+ systemPrompt: SystemPrompt,
439
+ context: { [k: string]: string },
440
+ ): string[] {
441
+ return [
442
+ ...systemPrompt,
443
+ Object.entries(context)
444
+ .map(([key, value]) => `${key}: ${value}`)
445
+ .join('\n'),
446
+ ].filter(Boolean)
447
+ }
448
+
449
+ export function prependUserContext(
450
+ messages: Message[],
451
+ context: { [k: string]: string },
452
+ ): Message[] {
453
+ if (process.env.NODE_ENV === 'test') {
454
+ return messages
455
+ }
456
+
457
+ if (Object.entries(context).length === 0) {
458
+ return messages
459
+ }
460
+
461
+ return [
462
+ createUserMessage({
463
+ content: `<system-reminder>\nAs you answer the user's questions, you can use the following context:\n${Object.entries(
464
+ context,
465
+ )
466
+ .map(([key, value]) => `# ${key}\n${value}`)
467
+ .join('\n')}
468
+
469
+ IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant to your task.\n</system-reminder>\n`,
470
+ isMeta: true,
471
+ }),
472
+ ...messages,
473
+ ]
474
+ }
475
+
476
+ /**
477
+ * Log metrics about context and system prompt size
478
+ */
479
+ export async function logContextMetrics(
480
+ mcpConfigs: Record<string, ScopedMcpServerConfig>,
481
+ toolPermissionContext: ToolPermissionContext,
482
+ ): Promise<void> {
483
+ // Early return if logging is disabled
484
+ if (isAnalyticsDisabled()) {
485
+ return
486
+ }
487
+ const [{ tools: mcpTools }, tools, userContext, systemContext] =
488
+ await Promise.all([
489
+ prefetchAllMcpResources(mcpConfigs),
490
+ getTools(toolPermissionContext),
491
+ getUserContext(),
492
+ getSystemContext(),
493
+ ])
494
+ // Extract individual context sizes and calculate total
495
+ const gitStatusSize = systemContext.gitStatus?.length ?? 0
496
+ const claudeMdSize = userContext.claudeMd?.length ?? 0
497
+
498
+ // Calculate total context size
499
+ const totalContextSize = gitStatusSize + claudeMdSize
500
+
501
+ // Get file count using ripgrep (rounded to nearest power of 10 for privacy)
502
+ const currentDir = getCwd()
503
+ const ignorePatternsByRoot = getFileReadIgnorePatterns(toolPermissionContext)
504
+ const normalizedIgnorePatterns = normalizePatternsToPath(
505
+ ignorePatternsByRoot,
506
+ currentDir,
507
+ )
508
+ const fileCount = await countFilesRoundedRg(
509
+ currentDir,
510
+ AbortSignal.timeout(1000),
511
+ normalizedIgnorePatterns,
512
+ )
513
+
514
+ // Calculate tool metrics
515
+ let mcpToolsCount = 0
516
+ let mcpServersCount = 0
517
+ let mcpToolsTokens = 0
518
+ let nonMcpToolsCount = 0
519
+ let nonMcpToolsTokens = 0
520
+
521
+ const nonMcpTools = tools.filter(tool => !tool.isMcp)
522
+ mcpToolsCount = mcpTools.length
523
+ nonMcpToolsCount = nonMcpTools.length
524
+
525
+ // Extract unique server names from MCP tool names (format: mcp__servername__toolname)
526
+ const serverNames = new Set<string>()
527
+ for (const tool of mcpTools) {
528
+ const parts = tool.name.split('__')
529
+ if (parts.length >= 3 && parts[1]) {
530
+ serverNames.add(parts[1])
531
+ }
532
+ }
533
+ mcpServersCount = serverNames.size
534
+
535
+ // Estimate tool tokens locally for analytics (avoids N API calls per session)
536
+ // Use inputJSONSchema (plain JSON Schema) when available, otherwise convert Zod schema
537
+ for (const tool of mcpTools) {
538
+ const schema =
539
+ 'inputJSONSchema' in tool && tool.inputJSONSchema
540
+ ? tool.inputJSONSchema
541
+ : zodToJsonSchema(tool.inputSchema)
542
+ mcpToolsTokens += roughTokenCountEstimation(jsonStringify(schema))
543
+ }
544
+ for (const tool of nonMcpTools) {
545
+ const schema =
546
+ 'inputJSONSchema' in tool && tool.inputJSONSchema
547
+ ? tool.inputJSONSchema
548
+ : zodToJsonSchema(tool.inputSchema)
549
+ nonMcpToolsTokens += roughTokenCountEstimation(jsonStringify(schema))
550
+ }
551
+
552
+ logEvent('tengu_context_size', {
553
+ git_status_size: gitStatusSize,
554
+ claude_md_size: claudeMdSize,
555
+ total_context_size: totalContextSize,
556
+ project_file_count_rounded: fileCount,
557
+ mcp_tools_count: mcpToolsCount,
558
+ mcp_servers_count: mcpServersCount,
559
+ mcp_tools_tokens: mcpToolsTokens,
560
+ non_mcp_tools_count: nonMcpToolsCount,
561
+ non_mcp_tools_tokens: nonMcpToolsTokens,
562
+ })
563
+ }
564
+
565
+ // TODO: Generalize this to all tools
566
+ export function normalizeToolInput<T extends Tool>(
567
+ tool: T,
568
+ input: z.infer<T['inputSchema']>,
569
+ agentId?: AgentId,
570
+ ): z.infer<T['inputSchema']> {
571
+ switch (tool.name) {
572
+ case EXIT_PLAN_MODE_V2_TOOL_NAME: {
573
+ // Always inject plan content and file path for ExitPlanModeV2 so hooks/SDK get the plan.
574
+ // The V2 tool reads plan from file instead of input, but hooks/SDK
575
+ const plan = getPlan(agentId)
576
+ const planFilePath = getPlanFilePath(agentId)
577
+ // Persist file snapshot for CCR sessions so the plan survives pod recycling
578
+ void persistFileSnapshotIfRemote()
579
+ return plan !== null ? { ...input, plan, planFilePath } : input
580
+ }
581
+ case BashTool.name: {
582
+ // Validated upstream, won't throw
583
+ const parsed = BashTool.inputSchema.parse(input)
584
+ const { command, timeout, description } = parsed
585
+ const cwd = getCwd()
586
+ let normalizedCommand = command.replace(`cd ${cwd} && `, '')
587
+ if (getPlatform() === 'windows') {
588
+ normalizedCommand = normalizedCommand.replace(
589
+ `cd ${windowsPathToPosixPath(cwd)} && `,
590
+ '',
591
+ )
592
+ }
593
+
594
+ // Replace \\; with \; (commonly needed for find -exec commands)
595
+ normalizedCommand = normalizedCommand.replace(/\\\\;/g, '\\;')
596
+
597
+ // Logging for commands that are only echoing a string. This is to help us understand how often Claude talks via bash
598
+ if (/^echo\s+["']?[^|&;><]*["']?$/i.test(normalizedCommand.trim())) {
599
+ logEvent('tengu_bash_tool_simple_echo', {})
600
+ }
601
+
602
+ // Check for run_in_background (may not exist in schema if CLAUDE_CODE_DISABLE_BACKGROUND_TASKS is set)
603
+ const run_in_background =
604
+ 'run_in_background' in parsed ? parsed.run_in_background : undefined
605
+
606
+ // SAFETY: Cast is safe because input was validated by .parse() above.
607
+ // TypeScript can't narrow the generic T based on switch(tool.name), so it
608
+ // doesn't know the return type matches T['inputSchema']. This is a fundamental
609
+ // TS limitation with generics, not bypassable without major refactoring.
610
+ return {
611
+ command: normalizedCommand,
612
+ description,
613
+ ...(timeout !== undefined && { timeout }),
614
+ ...(description !== undefined && { description }),
615
+ ...(run_in_background !== undefined && { run_in_background }),
616
+ ...('dangerouslyDisableSandbox' in parsed &&
617
+ parsed.dangerouslyDisableSandbox !== undefined && {
618
+ dangerouslyDisableSandbox: parsed.dangerouslyDisableSandbox,
619
+ }),
620
+ } as z.infer<T['inputSchema']>
621
+ }
622
+ case FileEditTool.name: {
623
+ // Validated upstream, won't throw
624
+ const parsedInput = FileEditTool.inputSchema.parse(input)
625
+
626
+ // This is a workaround for tokens claude can't see
627
+ const { file_path, edits } = normalizeFileEditInput({
628
+ file_path: parsedInput.file_path,
629
+ edits: [
630
+ {
631
+ old_string: parsedInput.old_string,
632
+ new_string: parsedInput.new_string,
633
+ replace_all: parsedInput.replace_all,
634
+ },
635
+ ],
636
+ })
637
+
638
+ // SAFETY: See comment in BashTool case above
639
+ return {
640
+ replace_all: edits[0]!.replace_all,
641
+ file_path,
642
+ old_string: edits[0]!.old_string,
643
+ new_string: edits[0]!.new_string,
644
+ } as z.infer<T['inputSchema']>
645
+ }
646
+ case FileWriteTool.name: {
647
+ // Validated upstream, won't throw
648
+ const parsedInput = FileWriteTool.inputSchema.parse(input)
649
+
650
+ // Markdown uses two trailing spaces as a hard line break — don't strip.
651
+ const isMarkdown = /\.(md|mdx)$/i.test(parsedInput.file_path)
652
+
653
+ // SAFETY: See comment in BashTool case above
654
+ return {
655
+ file_path: parsedInput.file_path,
656
+ content: isMarkdown
657
+ ? parsedInput.content
658
+ : stripTrailingWhitespace(parsedInput.content),
659
+ } as z.infer<T['inputSchema']>
660
+ }
661
+ case TASK_OUTPUT_TOOL_NAME: {
662
+ // Normalize legacy parameter names from AgentOutputTool/BashOutputTool
663
+ const legacyInput = input as Record<string, unknown>
664
+ const taskId =
665
+ legacyInput.task_id ?? legacyInput.agentId ?? legacyInput.bash_id
666
+ const timeout =
667
+ legacyInput.timeout ??
668
+ (typeof legacyInput.wait_up_to === 'number'
669
+ ? legacyInput.wait_up_to * 1000
670
+ : undefined)
671
+ // SAFETY: See comment in BashTool case above
672
+ return {
673
+ task_id: taskId ?? '',
674
+ block: legacyInput.block ?? true,
675
+ timeout: timeout ?? 30000,
676
+ } as z.infer<T['inputSchema']>
677
+ }
678
+ default:
679
+ return input
680
+ }
681
+ }
682
+
683
+ // Strips fields that were added by normalizeToolInput before sending to API
684
+ // (e.g., plan field from ExitPlanModeV2 which has an empty input schema)
685
+ export function normalizeToolInputForAPI<T extends Tool>(
686
+ tool: T,
687
+ input: z.infer<T['inputSchema']>,
688
+ ): z.infer<T['inputSchema']> {
689
+ switch (tool.name) {
690
+ case EXIT_PLAN_MODE_V2_TOOL_NAME: {
691
+ // Strip injected fields before sending to API (schema expects empty object)
692
+ if (
693
+ input &&
694
+ typeof input === 'object' &&
695
+ ('plan' in input || 'planFilePath' in input)
696
+ ) {
697
+ const { plan, planFilePath, ...rest } = input as Record<string, unknown>
698
+ return rest as z.infer<T['inputSchema']>
699
+ }
700
+ return input
701
+ }
702
+ case FileEditTool.name: {
703
+ // Strip synthetic old_string/new_string/replace_all from OLD sessions
704
+ // that were resumed from transcripts written before PR #20357, where
705
+ // normalizeToolInput used to synthesize these. Needed so old --resume'd
706
+ // transcripts don't send whole-file copies to the API. New sessions
707
+ // don't need this (synthesis moved to emission time).
708
+ if (input && typeof input === 'object' && 'edits' in input) {
709
+ const { old_string, new_string, replace_all, ...rest } =
710
+ input as Record<string, unknown>
711
+ return rest as z.infer<T['inputSchema']>
712
+ }
713
+ return input
714
+ }
715
+ default:
716
+ return input
717
+ }
718
+ }