@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,927 @@
1
+ /**
2
+ * Session Tracing for Claude Code using OpenTelemetry (BETA)
3
+ *
4
+ * This module provides a high-level API for creating and managing spans
5
+ * to trace Claude Code workflows. Each user interaction creates a root
6
+ * interaction span, which contains operation spans (LLM requests, tool calls, etc.).
7
+ *
8
+ * Requirements:
9
+ * - Enhanced telemetry is enabled via feature('ENHANCED_TELEMETRY_BETA')
10
+ * - Configure OTEL_TRACES_EXPORTER (console, otlp, etc.)
11
+ */
12
+
13
+ import { feature } from 'bun:bundle'
14
+ import { context as otelContext, type Span, trace } from '@opentelemetry/api'
15
+ import { AsyncLocalStorage } from 'async_hooks'
16
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
17
+ import type { AssistantMessage, UserMessage } from '../../types/message.js'
18
+ import { isEnvDefinedFalsy, isEnvTruthy } from '../envUtils.js'
19
+ import { getTelemetryAttributes } from '../telemetryAttributes.js'
20
+ import {
21
+ addBetaInteractionAttributes,
22
+ addBetaLLMRequestAttributes,
23
+ addBetaLLMResponseAttributes,
24
+ addBetaToolInputAttributes,
25
+ addBetaToolResultAttributes,
26
+ isBetaTracingEnabled,
27
+ type LLMRequestNewContext,
28
+ truncateContent,
29
+ } from './betaSessionTracing.js'
30
+ import {
31
+ endInteractionPerfettoSpan,
32
+ endLLMRequestPerfettoSpan,
33
+ endToolPerfettoSpan,
34
+ endUserInputPerfettoSpan,
35
+ isPerfettoTracingEnabled,
36
+ startInteractionPerfettoSpan,
37
+ startLLMRequestPerfettoSpan,
38
+ startToolPerfettoSpan,
39
+ startUserInputPerfettoSpan,
40
+ } from './perfettoTracing.js'
41
+
42
+ // Re-export for callers
43
+ export type { Span }
44
+ export { isBetaTracingEnabled, type LLMRequestNewContext }
45
+
46
+ // Message type for API calls (UserMessage or AssistantMessage)
47
+ type APIMessage = UserMessage | AssistantMessage
48
+
49
+ type SpanType =
50
+ | 'interaction'
51
+ | 'llm_request'
52
+ | 'tool'
53
+ | 'tool.blocked_on_user'
54
+ | 'tool.execution'
55
+ | 'hook'
56
+
57
+ interface SpanContext {
58
+ span: Span
59
+ startTime: number
60
+ attributes: Record<string, string | number | boolean>
61
+ ended?: boolean
62
+ perfettoSpanId?: string
63
+ }
64
+
65
+ // ALS stores SpanContext directly so it holds a strong reference while a span
66
+ // is active. With that, activeSpans can use WeakRef — when ALS is cleared
67
+ // (enterWith(undefined)) and no other code holds the SpanContext, GC can collect
68
+ // it and the WeakRef goes stale.
69
+ const interactionContext = new AsyncLocalStorage<SpanContext | undefined>()
70
+ const toolContext = new AsyncLocalStorage<SpanContext | undefined>()
71
+ const activeSpans = new Map<string, WeakRef<SpanContext>>()
72
+ // Spans not stored in ALS (LLM request, blocked-on-user, tool execution, hook)
73
+ // need a strong reference to prevent GC from collecting the SpanContext before
74
+ // the corresponding end* function retrieves it.
75
+ const strongSpans = new Map<string, SpanContext>()
76
+ let interactionSequence = 0
77
+ let _cleanupIntervalStarted = false
78
+
79
+ const SPAN_TTL_MS = 30 * 60 * 1000 // 30 minutes
80
+
81
+ function getSpanId(span: Span): string {
82
+ return span.spanContext().spanId || ''
83
+ }
84
+
85
+ /**
86
+ * Lazily start a background interval that evicts orphaned spans from activeSpans.
87
+ *
88
+ * Normal teardown calls endInteractionSpan / endToolSpan, which delete spans
89
+ * immediately. This interval is a safety net for spans that were never ended
90
+ * (e.g. aborted streams, uncaught exceptions mid-query) — without it they
91
+ * accumulate in activeSpans indefinitely, holding references to Span objects
92
+ * and the OpenTelemetry context chain.
93
+ *
94
+ * Initialized on the first startInteractionSpan call (not at module load) to
95
+ * avoid triggering the no-top-level-side-effects lint rule and to keep the
96
+ * interval from running in processes that never start a span.
97
+ * unref() prevents the timer from keeping the process alive after all other
98
+ * work is done.
99
+ */
100
+ function ensureCleanupInterval(): void {
101
+ if (_cleanupIntervalStarted) return
102
+ _cleanupIntervalStarted = true
103
+ const interval = setInterval(() => {
104
+ const cutoff = Date.now() - SPAN_TTL_MS
105
+ for (const [spanId, weakRef] of activeSpans) {
106
+ const ctx = weakRef.deref()
107
+ if (ctx === undefined) {
108
+ activeSpans.delete(spanId)
109
+ strongSpans.delete(spanId)
110
+ } else if (ctx.startTime < cutoff) {
111
+ if (!ctx.ended) ctx.span.end() // flush any recorded attributes to the exporter
112
+ activeSpans.delete(spanId)
113
+ strongSpans.delete(spanId)
114
+ }
115
+ }
116
+ }, 60_000)
117
+ if (typeof interval.unref === 'function') {
118
+ interval.unref() // Node.js / Bun: don't block process exit
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Check if enhanced telemetry is enabled.
124
+ * Priority: env var override > ant build > GrowthBook gate
125
+ */
126
+ export function isEnhancedTelemetryEnabled(): boolean {
127
+ if (feature('ENHANCED_TELEMETRY_BETA')) {
128
+ const env =
129
+ process.env.CLAUDE_CODE_ENHANCED_TELEMETRY_BETA ??
130
+ process.env.ENABLE_ENHANCED_TELEMETRY_BETA
131
+ if (isEnvTruthy(env)) {
132
+ return true
133
+ }
134
+ if (isEnvDefinedFalsy(env)) {
135
+ return false
136
+ }
137
+ return (
138
+ process.env.USER_TYPE === 'ant' ||
139
+ getFeatureValue_CACHED_MAY_BE_STALE('enhanced_telemetry_beta', false)
140
+ )
141
+ }
142
+ return false
143
+ }
144
+
145
+ /**
146
+ * Check if any tracing is enabled (either standard enhanced telemetry OR beta tracing)
147
+ */
148
+ function isAnyTracingEnabled(): boolean {
149
+ return isEnhancedTelemetryEnabled() || isBetaTracingEnabled()
150
+ }
151
+
152
+ function getTracer() {
153
+ return trace.getTracer('com.anthropic.claude_code.tracing', '1.0.0')
154
+ }
155
+
156
+ function createSpanAttributes(
157
+ spanType: SpanType,
158
+ customAttributes: Record<string, string | number | boolean> = {},
159
+ ): Record<string, string | number | boolean> {
160
+ const baseAttributes = getTelemetryAttributes()
161
+
162
+ const attributes: Record<string, string | number | boolean> = {
163
+ ...baseAttributes,
164
+ 'span.type': spanType,
165
+ ...customAttributes,
166
+ }
167
+
168
+ return attributes
169
+ }
170
+
171
+ /**
172
+ * Start an interaction span. This wraps a user request -> Claude response cycle.
173
+ * This is now a root span that includes all session-level attributes.
174
+ * Sets the interaction context for all subsequent operations.
175
+ */
176
+ export function startInteractionSpan(userPrompt: string): Span {
177
+ ensureCleanupInterval()
178
+
179
+ // Start Perfetto span regardless of OTel tracing state
180
+ const perfettoSpanId = isPerfettoTracingEnabled()
181
+ ? startInteractionPerfettoSpan(userPrompt)
182
+ : undefined
183
+
184
+ if (!isAnyTracingEnabled()) {
185
+ // Still track Perfetto span even if OTel is disabled
186
+ if (perfettoSpanId) {
187
+ const dummySpan = trace.getActiveSpan() || getTracer().startSpan('dummy')
188
+ const spanId = getSpanId(dummySpan)
189
+ const spanContextObj: SpanContext = {
190
+ span: dummySpan,
191
+ startTime: Date.now(),
192
+ attributes: {},
193
+ perfettoSpanId,
194
+ }
195
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
196
+ interactionContext.enterWith(spanContextObj)
197
+ return dummySpan
198
+ }
199
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
200
+ }
201
+
202
+ const tracer = getTracer()
203
+ const isUserPromptLoggingEnabled = isEnvTruthy(
204
+ process.env.OTEL_LOG_USER_PROMPTS,
205
+ )
206
+ const promptToLog = isUserPromptLoggingEnabled ? userPrompt : '<REDACTED>'
207
+
208
+ interactionSequence++
209
+
210
+ const attributes = createSpanAttributes('interaction', {
211
+ user_prompt: promptToLog,
212
+ user_prompt_length: userPrompt.length,
213
+ 'interaction.sequence': interactionSequence,
214
+ })
215
+
216
+ const span = tracer.startSpan('claude_code.interaction', {
217
+ attributes,
218
+ })
219
+
220
+ // Add experimental attributes (new_context)
221
+ addBetaInteractionAttributes(span, userPrompt)
222
+
223
+ const spanId = getSpanId(span)
224
+ const spanContextObj: SpanContext = {
225
+ span,
226
+ startTime: Date.now(),
227
+ attributes,
228
+ perfettoSpanId,
229
+ }
230
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
231
+
232
+ interactionContext.enterWith(spanContextObj)
233
+
234
+ return span
235
+ }
236
+
237
+ export function endInteractionSpan(): void {
238
+ const spanContext = interactionContext.getStore()
239
+ if (!spanContext) {
240
+ return
241
+ }
242
+
243
+ if (spanContext.ended) {
244
+ return
245
+ }
246
+
247
+ // End Perfetto span
248
+ if (spanContext.perfettoSpanId) {
249
+ endInteractionPerfettoSpan(spanContext.perfettoSpanId)
250
+ }
251
+
252
+ if (!isAnyTracingEnabled()) {
253
+ spanContext.ended = true
254
+ activeSpans.delete(getSpanId(spanContext.span))
255
+ // Clear the store so async continuations created after this point (timers,
256
+ // promise callbacks, I/O) do not inherit a reference to the ended span.
257
+ // enterWith(undefined) is intentional: exit(() => {}) is a no-op because it
258
+ // only suppresses the store inside the callback and returns immediately.
259
+ interactionContext.enterWith(undefined)
260
+ return
261
+ }
262
+
263
+ const duration = Date.now() - spanContext.startTime
264
+ spanContext.span.setAttributes({
265
+ 'interaction.duration_ms': duration,
266
+ })
267
+
268
+ spanContext.span.end()
269
+ spanContext.ended = true
270
+ activeSpans.delete(getSpanId(spanContext.span))
271
+ interactionContext.enterWith(undefined)
272
+ }
273
+
274
+ export function startLLMRequestSpan(
275
+ model: string,
276
+ newContext?: LLMRequestNewContext,
277
+ messagesForAPI?: APIMessage[],
278
+ fastMode?: boolean,
279
+ ): Span {
280
+ // Start Perfetto span regardless of OTel tracing state
281
+ const perfettoSpanId = isPerfettoTracingEnabled()
282
+ ? startLLMRequestPerfettoSpan({
283
+ model,
284
+ querySource: newContext?.querySource,
285
+ messageId: undefined, // Will be set in endLLMRequestSpan
286
+ })
287
+ : undefined
288
+
289
+ if (!isAnyTracingEnabled()) {
290
+ // Still track Perfetto span even if OTel is disabled
291
+ if (perfettoSpanId) {
292
+ const dummySpan = trace.getActiveSpan() || getTracer().startSpan('dummy')
293
+ const spanId = getSpanId(dummySpan)
294
+ const spanContextObj: SpanContext = {
295
+ span: dummySpan,
296
+ startTime: Date.now(),
297
+ attributes: { model },
298
+ perfettoSpanId,
299
+ }
300
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
301
+ strongSpans.set(spanId, spanContextObj)
302
+ return dummySpan
303
+ }
304
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
305
+ }
306
+
307
+ const tracer = getTracer()
308
+ const parentSpanCtx = interactionContext.getStore()
309
+
310
+ const attributes = createSpanAttributes('llm_request', {
311
+ model: model,
312
+ 'llm_request.context': parentSpanCtx ? 'interaction' : 'standalone',
313
+ speed: fastMode ? 'fast' : 'normal',
314
+ })
315
+
316
+ const ctx = parentSpanCtx
317
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
318
+ : otelContext.active()
319
+ const span = tracer.startSpan('claude_code.llm_request', { attributes }, ctx)
320
+
321
+ // Add query_source (agent name) if provided
322
+ if (newContext?.querySource) {
323
+ span.setAttribute('query_source', newContext.querySource)
324
+ }
325
+
326
+ // Add experimental attributes (system prompt, new_context)
327
+ addBetaLLMRequestAttributes(span, newContext, messagesForAPI)
328
+
329
+ const spanId = getSpanId(span)
330
+ const spanContextObj: SpanContext = {
331
+ span,
332
+ startTime: Date.now(),
333
+ attributes,
334
+ perfettoSpanId,
335
+ }
336
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
337
+ strongSpans.set(spanId, spanContextObj)
338
+
339
+ return span
340
+ }
341
+
342
+ /**
343
+ * End an LLM request span and attach response metadata.
344
+ *
345
+ * @param span - Optional. The exact span returned by startLLMRequestSpan().
346
+ * IMPORTANT: When multiple LLM requests run in parallel (e.g., warmup requests,
347
+ * topic classifier, file path extractor, main thread), you MUST pass the specific span
348
+ * to ensure responses are attached to the correct request. Without it, responses may be
349
+ * incorrectly attached to whichever span happens to be "last" in the activeSpans map.
350
+ *
351
+ * If not provided, falls back to finding the most recent llm_request span (legacy behavior).
352
+ */
353
+ export function endLLMRequestSpan(
354
+ span?: Span,
355
+ metadata?: {
356
+ inputTokens?: number
357
+ outputTokens?: number
358
+ cacheReadTokens?: number
359
+ cacheCreationTokens?: number
360
+ success?: boolean
361
+ statusCode?: number
362
+ error?: string
363
+ attempt?: number
364
+ modelResponse?: string
365
+ /** Text output from the model (non-thinking content) */
366
+ modelOutput?: string
367
+ /** Thinking/reasoning output from the model */
368
+ thinkingOutput?: string
369
+ /** Whether the output included tool calls (look at tool spans for details) */
370
+ hasToolCall?: boolean
371
+ /** Time to first token in milliseconds */
372
+ ttftMs?: number
373
+ /** Time spent in pre-request setup before the successful attempt */
374
+ requestSetupMs?: number
375
+ /** Timestamps (Date.now()) of each attempt start — used to emit retry sub-spans */
376
+ attemptStartTimes?: number[]
377
+ },
378
+ ): void {
379
+ let llmSpanContext: SpanContext | undefined
380
+
381
+ if (span) {
382
+ // Use the provided span directly - this is the correct approach for parallel requests
383
+ const spanId = getSpanId(span)
384
+ llmSpanContext = activeSpans.get(spanId)?.deref()
385
+ } else {
386
+ // Legacy fallback: find the most recent llm_request span
387
+ // WARNING: This can cause mismatched responses when multiple requests are in flight
388
+ llmSpanContext = Array.from(activeSpans.values())
389
+ .findLast(r => {
390
+ const ctx = r.deref()
391
+ return (
392
+ ctx?.attributes['span.type'] === 'llm_request' ||
393
+ ctx?.attributes['model']
394
+ )
395
+ })
396
+ ?.deref()
397
+ }
398
+
399
+ if (!llmSpanContext) {
400
+ // Span was already ended or never tracked
401
+ return
402
+ }
403
+
404
+ const duration = Date.now() - llmSpanContext.startTime
405
+
406
+ // End Perfetto span with full metadata
407
+ if (llmSpanContext.perfettoSpanId) {
408
+ endLLMRequestPerfettoSpan(llmSpanContext.perfettoSpanId, {
409
+ ttftMs: metadata?.ttftMs,
410
+ ttltMs: duration, // Time to last token is the total duration
411
+ promptTokens: metadata?.inputTokens,
412
+ outputTokens: metadata?.outputTokens,
413
+ cacheReadTokens: metadata?.cacheReadTokens,
414
+ cacheCreationTokens: metadata?.cacheCreationTokens,
415
+ success: metadata?.success,
416
+ error: metadata?.error,
417
+ requestSetupMs: metadata?.requestSetupMs,
418
+ attemptStartTimes: metadata?.attemptStartTimes,
419
+ })
420
+ }
421
+
422
+ if (!isAnyTracingEnabled()) {
423
+ const spanId = getSpanId(llmSpanContext.span)
424
+ activeSpans.delete(spanId)
425
+ strongSpans.delete(spanId)
426
+ return
427
+ }
428
+
429
+ const endAttributes: Record<string, string | number | boolean> = {
430
+ duration_ms: duration,
431
+ }
432
+
433
+ if (metadata) {
434
+ if (metadata.inputTokens !== undefined)
435
+ endAttributes['input_tokens'] = metadata.inputTokens
436
+ if (metadata.outputTokens !== undefined)
437
+ endAttributes['output_tokens'] = metadata.outputTokens
438
+ if (metadata.cacheReadTokens !== undefined)
439
+ endAttributes['cache_read_tokens'] = metadata.cacheReadTokens
440
+ if (metadata.cacheCreationTokens !== undefined)
441
+ endAttributes['cache_creation_tokens'] = metadata.cacheCreationTokens
442
+ if (metadata.success !== undefined)
443
+ endAttributes['success'] = metadata.success
444
+ if (metadata.statusCode !== undefined)
445
+ endAttributes['status_code'] = metadata.statusCode
446
+ if (metadata.error !== undefined) endAttributes['error'] = metadata.error
447
+ if (metadata.attempt !== undefined)
448
+ endAttributes['attempt'] = metadata.attempt
449
+ if (metadata.hasToolCall !== undefined)
450
+ endAttributes['response.has_tool_call'] = metadata.hasToolCall
451
+ if (metadata.ttftMs !== undefined)
452
+ endAttributes['ttft_ms'] = metadata.ttftMs
453
+
454
+ // Add experimental response attributes (model_output, thinking_output)
455
+ addBetaLLMResponseAttributes(endAttributes, metadata)
456
+ }
457
+
458
+ llmSpanContext.span.setAttributes(endAttributes)
459
+ llmSpanContext.span.end()
460
+
461
+ const spanId = getSpanId(llmSpanContext.span)
462
+ activeSpans.delete(spanId)
463
+ strongSpans.delete(spanId)
464
+ }
465
+
466
+ export function startToolSpan(
467
+ toolName: string,
468
+ toolAttributes?: Record<string, string | number | boolean>,
469
+ toolInput?: string,
470
+ ): Span {
471
+ // Start Perfetto span regardless of OTel tracing state
472
+ const perfettoSpanId = isPerfettoTracingEnabled()
473
+ ? startToolPerfettoSpan(toolName, toolAttributes)
474
+ : undefined
475
+
476
+ if (!isAnyTracingEnabled()) {
477
+ // Still track Perfetto span even if OTel is disabled
478
+ if (perfettoSpanId) {
479
+ const dummySpan = trace.getActiveSpan() || getTracer().startSpan('dummy')
480
+ const spanId = getSpanId(dummySpan)
481
+ const spanContextObj: SpanContext = {
482
+ span: dummySpan,
483
+ startTime: Date.now(),
484
+ attributes: { 'span.type': 'tool', tool_name: toolName },
485
+ perfettoSpanId,
486
+ }
487
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
488
+ toolContext.enterWith(spanContextObj)
489
+ return dummySpan
490
+ }
491
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
492
+ }
493
+
494
+ const tracer = getTracer()
495
+ const parentSpanCtx = interactionContext.getStore()
496
+
497
+ const attributes = createSpanAttributes('tool', {
498
+ tool_name: toolName,
499
+ ...toolAttributes,
500
+ })
501
+
502
+ const ctx = parentSpanCtx
503
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
504
+ : otelContext.active()
505
+ const span = tracer.startSpan('claude_code.tool', { attributes }, ctx)
506
+
507
+ // Add experimental tool input attributes
508
+ if (toolInput) {
509
+ addBetaToolInputAttributes(span, toolName, toolInput)
510
+ }
511
+
512
+ const spanId = getSpanId(span)
513
+ const spanContextObj: SpanContext = {
514
+ span,
515
+ startTime: Date.now(),
516
+ attributes,
517
+ perfettoSpanId,
518
+ }
519
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
520
+
521
+ toolContext.enterWith(spanContextObj)
522
+
523
+ return span
524
+ }
525
+
526
+ export function startToolBlockedOnUserSpan(): Span {
527
+ // Start Perfetto span regardless of OTel tracing state
528
+ const perfettoSpanId = isPerfettoTracingEnabled()
529
+ ? startUserInputPerfettoSpan('tool_permission')
530
+ : undefined
531
+
532
+ if (!isAnyTracingEnabled()) {
533
+ // Still track Perfetto span even if OTel is disabled
534
+ if (perfettoSpanId) {
535
+ const dummySpan = trace.getActiveSpan() || getTracer().startSpan('dummy')
536
+ const spanId = getSpanId(dummySpan)
537
+ const spanContextObj: SpanContext = {
538
+ span: dummySpan,
539
+ startTime: Date.now(),
540
+ attributes: { 'span.type': 'tool.blocked_on_user' },
541
+ perfettoSpanId,
542
+ }
543
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
544
+ strongSpans.set(spanId, spanContextObj)
545
+ return dummySpan
546
+ }
547
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
548
+ }
549
+
550
+ const tracer = getTracer()
551
+ const parentSpanCtx = toolContext.getStore()
552
+
553
+ const attributes = createSpanAttributes('tool.blocked_on_user')
554
+
555
+ const ctx = parentSpanCtx
556
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
557
+ : otelContext.active()
558
+ const span = tracer.startSpan(
559
+ 'claude_code.tool.blocked_on_user',
560
+ { attributes },
561
+ ctx,
562
+ )
563
+
564
+ const spanId = getSpanId(span)
565
+ const spanContextObj: SpanContext = {
566
+ span,
567
+ startTime: Date.now(),
568
+ attributes,
569
+ perfettoSpanId,
570
+ }
571
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
572
+ strongSpans.set(spanId, spanContextObj)
573
+
574
+ return span
575
+ }
576
+
577
+ export function endToolBlockedOnUserSpan(
578
+ decision?: string,
579
+ source?: string,
580
+ ): void {
581
+ const blockedSpanContext = Array.from(activeSpans.values())
582
+ .findLast(
583
+ r => r.deref()?.attributes['span.type'] === 'tool.blocked_on_user',
584
+ )
585
+ ?.deref()
586
+
587
+ if (!blockedSpanContext) {
588
+ return
589
+ }
590
+
591
+ // End Perfetto span
592
+ if (blockedSpanContext.perfettoSpanId) {
593
+ endUserInputPerfettoSpan(blockedSpanContext.perfettoSpanId, {
594
+ decision,
595
+ source,
596
+ })
597
+ }
598
+
599
+ if (!isAnyTracingEnabled()) {
600
+ const spanId = getSpanId(blockedSpanContext.span)
601
+ activeSpans.delete(spanId)
602
+ strongSpans.delete(spanId)
603
+ return
604
+ }
605
+
606
+ const duration = Date.now() - blockedSpanContext.startTime
607
+ const attributes: Record<string, string | number | boolean> = {
608
+ duration_ms: duration,
609
+ }
610
+
611
+ if (decision) {
612
+ attributes['decision'] = decision
613
+ }
614
+ if (source) {
615
+ attributes['source'] = source
616
+ }
617
+
618
+ blockedSpanContext.span.setAttributes(attributes)
619
+ blockedSpanContext.span.end()
620
+
621
+ const spanId = getSpanId(blockedSpanContext.span)
622
+ activeSpans.delete(spanId)
623
+ strongSpans.delete(spanId)
624
+ }
625
+
626
+ export function startToolExecutionSpan(): Span {
627
+ if (!isAnyTracingEnabled()) {
628
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
629
+ }
630
+
631
+ const tracer = getTracer()
632
+ const parentSpanCtx = toolContext.getStore()
633
+
634
+ const attributes = createSpanAttributes('tool.execution')
635
+
636
+ const ctx = parentSpanCtx
637
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
638
+ : otelContext.active()
639
+ const span = tracer.startSpan(
640
+ 'claude_code.tool.execution',
641
+ { attributes },
642
+ ctx,
643
+ )
644
+
645
+ const spanId = getSpanId(span)
646
+ const spanContextObj: SpanContext = {
647
+ span,
648
+ startTime: Date.now(),
649
+ attributes,
650
+ }
651
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
652
+ strongSpans.set(spanId, spanContextObj)
653
+
654
+ return span
655
+ }
656
+
657
+ export function endToolExecutionSpan(metadata?: {
658
+ success?: boolean
659
+ error?: string
660
+ }): void {
661
+ if (!isAnyTracingEnabled()) {
662
+ return
663
+ }
664
+
665
+ const executionSpanContext = Array.from(activeSpans.values())
666
+ .findLast(r => r.deref()?.attributes['span.type'] === 'tool.execution')
667
+ ?.deref()
668
+
669
+ if (!executionSpanContext) {
670
+ return
671
+ }
672
+
673
+ const duration = Date.now() - executionSpanContext.startTime
674
+ const attributes: Record<string, string | number | boolean> = {
675
+ duration_ms: duration,
676
+ }
677
+
678
+ if (metadata) {
679
+ if (metadata.success !== undefined) attributes['success'] = metadata.success
680
+ if (metadata.error !== undefined) attributes['error'] = metadata.error
681
+ }
682
+
683
+ executionSpanContext.span.setAttributes(attributes)
684
+ executionSpanContext.span.end()
685
+
686
+ const spanId = getSpanId(executionSpanContext.span)
687
+ activeSpans.delete(spanId)
688
+ strongSpans.delete(spanId)
689
+ }
690
+
691
+ export function endToolSpan(toolResult?: string, resultTokens?: number): void {
692
+ const toolSpanContext = toolContext.getStore()
693
+
694
+ if (!toolSpanContext) {
695
+ return
696
+ }
697
+
698
+ // End Perfetto span
699
+ if (toolSpanContext.perfettoSpanId) {
700
+ endToolPerfettoSpan(toolSpanContext.perfettoSpanId, {
701
+ success: true,
702
+ resultTokens,
703
+ })
704
+ }
705
+
706
+ if (!isAnyTracingEnabled()) {
707
+ const spanId = getSpanId(toolSpanContext.span)
708
+ activeSpans.delete(spanId)
709
+ // Same reasoning as interactionContext above: clear so subsequent async
710
+ // work doesn't hold a stale reference to the ended tool span.
711
+ toolContext.enterWith(undefined)
712
+ return
713
+ }
714
+
715
+ const duration = Date.now() - toolSpanContext.startTime
716
+ const endAttributes: Record<string, string | number | boolean> = {
717
+ duration_ms: duration,
718
+ }
719
+
720
+ // Add experimental tool result attributes (new_context)
721
+ if (toolResult) {
722
+ const toolName = toolSpanContext.attributes['tool_name'] || 'unknown'
723
+ addBetaToolResultAttributes(endAttributes, toolName, toolResult)
724
+ }
725
+
726
+ if (resultTokens !== undefined) {
727
+ endAttributes['result_tokens'] = resultTokens
728
+ }
729
+
730
+ toolSpanContext.span.setAttributes(endAttributes)
731
+ toolSpanContext.span.end()
732
+
733
+ const spanId = getSpanId(toolSpanContext.span)
734
+ activeSpans.delete(spanId)
735
+ toolContext.enterWith(undefined)
736
+ }
737
+
738
+ function isToolContentLoggingEnabled(): boolean {
739
+ return isEnvTruthy(process.env.OTEL_LOG_TOOL_CONTENT)
740
+ }
741
+
742
+ /**
743
+ * Add a span event with tool content/output data.
744
+ * Only logs if OTEL_LOG_TOOL_CONTENT=1 is set.
745
+ * Truncates content if it exceeds MAX_CONTENT_SIZE.
746
+ */
747
+ export function addToolContentEvent(
748
+ eventName: string,
749
+ attributes: Record<string, string | number | boolean>,
750
+ ): void {
751
+ if (!isAnyTracingEnabled() || !isToolContentLoggingEnabled()) {
752
+ return
753
+ }
754
+
755
+ const currentSpanCtx = toolContext.getStore()
756
+ if (!currentSpanCtx) {
757
+ return
758
+ }
759
+
760
+ // Truncate string attributes that might be large
761
+ const processedAttributes: Record<string, string | number | boolean> = {}
762
+ for (const [key, value] of Object.entries(attributes)) {
763
+ if (typeof value === 'string') {
764
+ const { content, truncated } = truncateContent(value)
765
+ processedAttributes[key] = content
766
+ if (truncated) {
767
+ processedAttributes[`${key}_truncated`] = true
768
+ processedAttributes[`${key}_original_length`] = value.length
769
+ }
770
+ } else {
771
+ processedAttributes[key] = value
772
+ }
773
+ }
774
+
775
+ currentSpanCtx.span.addEvent(eventName, processedAttributes)
776
+ }
777
+
778
+ export function getCurrentSpan(): Span | null {
779
+ if (!isAnyTracingEnabled()) {
780
+ return null
781
+ }
782
+
783
+ return (
784
+ toolContext.getStore()?.span ?? interactionContext.getStore()?.span ?? null
785
+ )
786
+ }
787
+
788
+ export async function executeInSpan<T>(
789
+ spanName: string,
790
+ fn: (span: Span) => Promise<T>,
791
+ attributes?: Record<string, string | number | boolean>,
792
+ ): Promise<T> {
793
+ if (!isAnyTracingEnabled()) {
794
+ return fn(trace.getActiveSpan() || getTracer().startSpan('dummy'))
795
+ }
796
+
797
+ const tracer = getTracer()
798
+ const parentSpanCtx = toolContext.getStore() ?? interactionContext.getStore()
799
+
800
+ const finalAttributes = createSpanAttributes('tool', {
801
+ ...attributes,
802
+ })
803
+
804
+ const ctx = parentSpanCtx
805
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
806
+ : otelContext.active()
807
+ const span = tracer.startSpan(spanName, { attributes: finalAttributes }, ctx)
808
+
809
+ const spanId = getSpanId(span)
810
+ const spanContextObj: SpanContext = {
811
+ span,
812
+ startTime: Date.now(),
813
+ attributes: finalAttributes,
814
+ }
815
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
816
+ strongSpans.set(spanId, spanContextObj)
817
+
818
+ try {
819
+ const result = await fn(span)
820
+ span.end()
821
+ activeSpans.delete(spanId)
822
+ strongSpans.delete(spanId)
823
+ return result
824
+ } catch (error) {
825
+ if (error instanceof Error) {
826
+ span.recordException(error)
827
+ }
828
+ span.end()
829
+ activeSpans.delete(spanId)
830
+ strongSpans.delete(spanId)
831
+ throw error
832
+ }
833
+ }
834
+
835
+ /**
836
+ * Start a hook execution span.
837
+ * Only creates a span when beta tracing is enabled.
838
+ * @param hookEvent The hook event type (e.g., 'PreToolUse', 'PostToolUse')
839
+ * @param hookName The full hook name (e.g., 'PreToolUse:Write')
840
+ * @param numHooks The number of hooks being executed
841
+ * @param hookDefinitions JSON string of hook definitions for tracing
842
+ * @returns The span (or a dummy span if tracing is disabled)
843
+ */
844
+ export function startHookSpan(
845
+ hookEvent: string,
846
+ hookName: string,
847
+ numHooks: number,
848
+ hookDefinitions: string,
849
+ ): Span {
850
+ if (!isBetaTracingEnabled()) {
851
+ return trace.getActiveSpan() || getTracer().startSpan('dummy')
852
+ }
853
+
854
+ const tracer = getTracer()
855
+ const parentSpanCtx = toolContext.getStore() ?? interactionContext.getStore()
856
+
857
+ const attributes = createSpanAttributes('hook', {
858
+ hook_event: hookEvent,
859
+ hook_name: hookName,
860
+ num_hooks: numHooks,
861
+ hook_definitions: hookDefinitions,
862
+ })
863
+
864
+ const ctx = parentSpanCtx
865
+ ? trace.setSpan(otelContext.active(), parentSpanCtx.span)
866
+ : otelContext.active()
867
+ const span = tracer.startSpan('claude_code.hook', { attributes }, ctx)
868
+
869
+ const spanId = getSpanId(span)
870
+ const spanContextObj: SpanContext = {
871
+ span,
872
+ startTime: Date.now(),
873
+ attributes,
874
+ }
875
+ activeSpans.set(spanId, new WeakRef(spanContextObj))
876
+ strongSpans.set(spanId, spanContextObj)
877
+
878
+ return span
879
+ }
880
+
881
+ /**
882
+ * End a hook execution span with outcome metadata.
883
+ * Only does work when beta tracing is enabled.
884
+ * @param span The span to end (returned from startHookSpan)
885
+ * @param metadata The outcome metadata for the hook execution
886
+ */
887
+ export function endHookSpan(
888
+ span: Span,
889
+ metadata?: {
890
+ numSuccess?: number
891
+ numBlocking?: number
892
+ numNonBlockingError?: number
893
+ numCancelled?: number
894
+ },
895
+ ): void {
896
+ if (!isBetaTracingEnabled()) {
897
+ return
898
+ }
899
+
900
+ const spanId = getSpanId(span)
901
+ const spanContext = activeSpans.get(spanId)?.deref()
902
+
903
+ if (!spanContext) {
904
+ return
905
+ }
906
+
907
+ const duration = Date.now() - spanContext.startTime
908
+ const endAttributes: Record<string, string | number | boolean> = {
909
+ duration_ms: duration,
910
+ }
911
+
912
+ if (metadata) {
913
+ if (metadata.numSuccess !== undefined)
914
+ endAttributes['num_success'] = metadata.numSuccess
915
+ if (metadata.numBlocking !== undefined)
916
+ endAttributes['num_blocking'] = metadata.numBlocking
917
+ if (metadata.numNonBlockingError !== undefined)
918
+ endAttributes['num_non_blocking_error'] = metadata.numNonBlockingError
919
+ if (metadata.numCancelled !== undefined)
920
+ endAttributes['num_cancelled'] = metadata.numCancelled
921
+ }
922
+
923
+ spanContext.span.setAttributes(endAttributes)
924
+ spanContext.span.end()
925
+ activeSpans.delete(spanId)
926
+ strongSpans.delete(spanId)
927
+ }