@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,806 @@
1
+ import type { HrTime } from '@opentelemetry/api'
2
+ import { type ExportResult, ExportResultCode } from '@opentelemetry/core'
3
+ import type {
4
+ LogRecordExporter,
5
+ ReadableLogRecord,
6
+ } from '@opentelemetry/sdk-logs'
7
+ import axios from 'src/utils/axios.js'
8
+ import { randomUUID } from 'crypto'
9
+ import { appendFile, mkdir, readdir, unlink, writeFile } from 'fs/promises'
10
+ import * as path from 'path'
11
+ import type { CoreUserData } from 'src/utils/user.js'
12
+ import {
13
+ getIsNonInteractiveSession,
14
+ getSessionId,
15
+ } from '../../bootstrap/state.js'
16
+ import { ClaudeCodeInternalEvent } from '../../types/generated/events_mono/claude_code/v1/claude_code_internal_event.js'
17
+ import { GrowthbookExperimentEvent } from '../../types/generated/events_mono/growthbook/v1/growthbook_experiment_event.js'
18
+ import {
19
+ getClaudeAIOAuthTokens,
20
+ hasProfileScope,
21
+ isClaudeAISubscriber,
22
+ } from '../../utils/auth.js'
23
+ import { checkHasTrustDialogAccepted } from '../../utils/config.js'
24
+ import { logForDebugging } from '../../utils/debug.js'
25
+ import { getClaudeConfigHomeDir } from '../../utils/envUtils.js'
26
+ import { errorMessage, isFsInaccessible, toError } from '../../utils/errors.js'
27
+ import { getAuthHeaders } from '../../utils/http.js'
28
+ import { readJSONLFile } from '../../utils/json.js'
29
+ import { logError } from '../../utils/log.js'
30
+ import { sleep } from '../../utils/sleep.js'
31
+ import { jsonStringify } from '../../utils/slowOperations.js'
32
+ import { getClaudeCodeUserAgent } from '../../utils/userAgent.js'
33
+ import { isOAuthTokenExpired } from '../oauth/client.js'
34
+ import { stripProtoFields } from './index.js'
35
+ import { type EventMetadata, to1PEventFormat } from './metadata.js'
36
+
37
+ // Unique ID for this process run - used to isolate failed event files between runs
38
+ const BATCH_UUID = randomUUID()
39
+
40
+ // File prefix for failed event storage
41
+ const FILE_PREFIX = '1p_failed_events.'
42
+
43
+ // Storage directory for failed events - evaluated at runtime to respect CLAUDE_CONFIG_DIR in tests
44
+ function getStorageDir(): string {
45
+ return path.join(getClaudeConfigHomeDir(), 'telemetry')
46
+ }
47
+
48
+ // API envelope - event_data is the JSON output from proto toJSON()
49
+ type FirstPartyEventLoggingEvent = {
50
+ event_type: 'ClaudeCodeInternalEvent' | 'GrowthbookExperimentEvent'
51
+ event_data: unknown
52
+ }
53
+
54
+ type FirstPartyEventLoggingPayload = {
55
+ events: FirstPartyEventLoggingEvent[]
56
+ }
57
+
58
+ /**
59
+ * Exporter for 1st-party event logging to /api/event_logging/batch.
60
+ *
61
+ * Export cycles are controlled by OpenTelemetry's BatchLogRecordProcessor, which
62
+ * triggers export() when either:
63
+ * - Time interval elapses (default: 5 seconds via scheduledDelayMillis)
64
+ * - Batch size is reached (default: 200 events via maxExportBatchSize)
65
+ *
66
+ * This exporter adds resilience on top:
67
+ * - Append-only log for failed events (concurrency-safe)
68
+ * - Quadratic backoff retry for failed events, dropped after maxAttempts
69
+ * - Immediate retry of queued events when any export succeeds (endpoint is healthy)
70
+ * - Chunking large event sets into smaller batches
71
+ * - Auth fallback: retries without auth on 401 errors
72
+ */
73
+ export class FirstPartyEventLoggingExporter implements LogRecordExporter {
74
+ private readonly endpoint: string
75
+ private readonly timeout: number
76
+ private readonly maxBatchSize: number
77
+ private readonly skipAuth: boolean
78
+ private readonly batchDelayMs: number
79
+ private readonly baseBackoffDelayMs: number
80
+ private readonly maxBackoffDelayMs: number
81
+ private readonly maxAttempts: number
82
+ private readonly isKilled: () => boolean
83
+ private pendingExports: Promise<void>[] = []
84
+ private isShutdown = false
85
+ private readonly schedule: (
86
+ fn: () => Promise<void>,
87
+ delayMs: number,
88
+ ) => () => void
89
+ private cancelBackoff: (() => void) | null = null
90
+ private attempts = 0
91
+ private isRetrying = false
92
+ private lastExportErrorContext: string | undefined
93
+
94
+ constructor(
95
+ options: {
96
+ timeout?: number
97
+ maxBatchSize?: number
98
+ skipAuth?: boolean
99
+ batchDelayMs?: number
100
+ baseBackoffDelayMs?: number
101
+ maxBackoffDelayMs?: number
102
+ maxAttempts?: number
103
+ path?: string
104
+ baseUrl?: string
105
+ // Injected killswitch probe. Checked per-POST so that disabling the
106
+ // firstParty sink also stops backoff retries (not just new emits).
107
+ // Passed in rather than imported to avoid a cycle with firstPartyEventLogger.ts.
108
+ isKilled?: () => boolean
109
+ schedule?: (fn: () => Promise<void>, delayMs: number) => () => void
110
+ } = {},
111
+ ) {
112
+ // Default: prod, except when ANTHROPIC_BASE_URL is explicitly staging.
113
+ // Overridable via tengu_1p_event_batch_config.baseUrl.
114
+ const baseUrl =
115
+ options.baseUrl ||
116
+ (process.env.ANTHROPIC_BASE_URL === 'https://api-staging.anthropic.com'
117
+ ? 'https://api-staging.anthropic.com'
118
+ : 'https://api.anthropic.com')
119
+
120
+ this.endpoint = `${baseUrl}${options.path || '/api/event_logging/batch'}`
121
+
122
+ this.timeout = options.timeout || 10000
123
+ this.maxBatchSize = options.maxBatchSize || 200
124
+ this.skipAuth = options.skipAuth ?? false
125
+ this.batchDelayMs = options.batchDelayMs || 100
126
+ this.baseBackoffDelayMs = options.baseBackoffDelayMs || 500
127
+ this.maxBackoffDelayMs = options.maxBackoffDelayMs || 30000
128
+ this.maxAttempts = options.maxAttempts ?? 8
129
+ this.isKilled = options.isKilled ?? (() => false)
130
+ this.schedule =
131
+ options.schedule ??
132
+ ((fn, ms) => {
133
+ const t = setTimeout(fn, ms)
134
+ return () => clearTimeout(t)
135
+ })
136
+
137
+ // Retry any failed events from previous runs of this session (in background)
138
+ void this.retryPreviousBatches()
139
+ }
140
+
141
+ // Expose for testing
142
+ async getQueuedEventCount(): Promise<number> {
143
+ return (await this.loadEventsFromCurrentBatch()).length
144
+ }
145
+
146
+ // --- Storage helpers ---
147
+
148
+ private getCurrentBatchFilePath(): string {
149
+ return path.join(
150
+ getStorageDir(),
151
+ `${FILE_PREFIX}${getSessionId()}.${BATCH_UUID}.json`,
152
+ )
153
+ }
154
+
155
+ private async loadEventsFromFile(
156
+ filePath: string,
157
+ ): Promise<FirstPartyEventLoggingEvent[]> {
158
+ try {
159
+ return await readJSONLFile<FirstPartyEventLoggingEvent>(filePath)
160
+ } catch {
161
+ return []
162
+ }
163
+ }
164
+
165
+ private async loadEventsFromCurrentBatch(): Promise<
166
+ FirstPartyEventLoggingEvent[]
167
+ > {
168
+ return this.loadEventsFromFile(this.getCurrentBatchFilePath())
169
+ }
170
+
171
+ private async saveEventsToFile(
172
+ filePath: string,
173
+ events: FirstPartyEventLoggingEvent[],
174
+ ): Promise<void> {
175
+ try {
176
+ if (events.length === 0) {
177
+ try {
178
+ await unlink(filePath)
179
+ } catch {
180
+ // File doesn't exist, nothing to delete
181
+ }
182
+ } else {
183
+ // Ensure storage directory exists
184
+ await mkdir(getStorageDir(), { recursive: true })
185
+ // Write as JSON lines (one event per line)
186
+ const content = events.map(e => jsonStringify(e)).join('\n') + '\n'
187
+ await writeFile(filePath, content, 'utf8')
188
+ }
189
+ } catch (error) {
190
+ logError(error)
191
+ }
192
+ }
193
+
194
+ private async appendEventsToFile(
195
+ filePath: string,
196
+ events: FirstPartyEventLoggingEvent[],
197
+ ): Promise<void> {
198
+ if (events.length === 0) return
199
+ try {
200
+ // Ensure storage directory exists
201
+ await mkdir(getStorageDir(), { recursive: true })
202
+ // Append as JSON lines (one event per line) - atomic on most filesystems
203
+ const content = events.map(e => jsonStringify(e)).join('\n') + '\n'
204
+ await appendFile(filePath, content, 'utf8')
205
+ } catch (error) {
206
+ logError(error)
207
+ }
208
+ }
209
+
210
+ private async deleteFile(filePath: string): Promise<void> {
211
+ try {
212
+ await unlink(filePath)
213
+ } catch {
214
+ // File doesn't exist or can't be deleted, ignore
215
+ }
216
+ }
217
+
218
+ // --- Previous batch retry (startup) ---
219
+
220
+ private async retryPreviousBatches(): Promise<void> {
221
+ try {
222
+ const prefix = `${FILE_PREFIX}${getSessionId()}.`
223
+ let files: string[]
224
+ try {
225
+ files = (await readdir(getStorageDir()))
226
+ .filter((f: string) => f.startsWith(prefix) && f.endsWith('.json'))
227
+ .filter((f: string) => !f.includes(BATCH_UUID)) // Exclude current batch
228
+ } catch (e) {
229
+ if (isFsInaccessible(e)) return
230
+ throw e
231
+ }
232
+
233
+ for (const file of files) {
234
+ const filePath = path.join(getStorageDir(), file)
235
+ void this.retryFileInBackground(filePath)
236
+ }
237
+ } catch (error) {
238
+ logError(error)
239
+ }
240
+ }
241
+
242
+ private async retryFileInBackground(filePath: string): Promise<void> {
243
+ if (this.attempts >= this.maxAttempts) {
244
+ await this.deleteFile(filePath)
245
+ return
246
+ }
247
+
248
+ const events = await this.loadEventsFromFile(filePath)
249
+ if (events.length === 0) {
250
+ await this.deleteFile(filePath)
251
+ return
252
+ }
253
+
254
+ if (process.env.USER_TYPE === 'ant') {
255
+ logForDebugging(
256
+ `1P event logging: retrying ${events.length} events from previous batch`,
257
+ )
258
+ }
259
+
260
+ const failedEvents = await this.sendEventsInBatches(events)
261
+ if (failedEvents.length === 0) {
262
+ await this.deleteFile(filePath)
263
+ if (process.env.USER_TYPE === 'ant') {
264
+ logForDebugging('1P event logging: previous batch retry succeeded')
265
+ }
266
+ } else {
267
+ // Save only the failed events back (not all original events)
268
+ await this.saveEventsToFile(filePath, failedEvents)
269
+ if (process.env.USER_TYPE === 'ant') {
270
+ logForDebugging(
271
+ `1P event logging: previous batch retry failed, ${failedEvents.length} events remain`,
272
+ )
273
+ }
274
+ }
275
+ }
276
+
277
+ async export(
278
+ logs: ReadableLogRecord[],
279
+ resultCallback: (result: ExportResult) => void,
280
+ ): Promise<void> {
281
+ if (this.isShutdown) {
282
+ if (process.env.USER_TYPE === 'ant') {
283
+ logForDebugging(
284
+ '1P event logging export failed: Exporter has been shutdown',
285
+ )
286
+ }
287
+ resultCallback({
288
+ code: ExportResultCode.FAILED,
289
+ error: new Error('Exporter has been shutdown'),
290
+ })
291
+ return
292
+ }
293
+
294
+ const exportPromise = this.doExport(logs, resultCallback)
295
+ this.pendingExports.push(exportPromise)
296
+
297
+ // Clean up completed exports
298
+ void exportPromise.finally(() => {
299
+ const index = this.pendingExports.indexOf(exportPromise)
300
+ if (index > -1) {
301
+ void this.pendingExports.splice(index, 1)
302
+ }
303
+ })
304
+ }
305
+
306
+ private async doExport(
307
+ logs: ReadableLogRecord[],
308
+ resultCallback: (result: ExportResult) => void,
309
+ ): Promise<void> {
310
+ try {
311
+ // Filter for event logs only (by scope name)
312
+ const eventLogs = logs.filter(
313
+ log =>
314
+ log.instrumentationScope?.name === 'com.anthropic.claude_code.events',
315
+ )
316
+
317
+ if (eventLogs.length === 0) {
318
+ resultCallback({ code: ExportResultCode.SUCCESS })
319
+ return
320
+ }
321
+
322
+ // Transform new logs (failed events are retried independently via backoff)
323
+ const events = this.transformLogsToEvents(eventLogs).events
324
+
325
+ if (events.length === 0) {
326
+ resultCallback({ code: ExportResultCode.SUCCESS })
327
+ return
328
+ }
329
+
330
+ if (this.attempts >= this.maxAttempts) {
331
+ resultCallback({
332
+ code: ExportResultCode.FAILED,
333
+ error: new Error(
334
+ `Dropped ${events.length} events: max attempts (${this.maxAttempts}) reached`,
335
+ ),
336
+ })
337
+ return
338
+ }
339
+
340
+ // Send events
341
+ const failedEvents = await this.sendEventsInBatches(events)
342
+ this.attempts++
343
+
344
+ if (failedEvents.length > 0) {
345
+ await this.queueFailedEvents(failedEvents)
346
+ this.scheduleBackoffRetry()
347
+ const context = this.lastExportErrorContext
348
+ ? ` (${this.lastExportErrorContext})`
349
+ : ''
350
+ resultCallback({
351
+ code: ExportResultCode.FAILED,
352
+ error: new Error(
353
+ `Failed to export ${failedEvents.length} events${context}`,
354
+ ),
355
+ })
356
+ return
357
+ }
358
+
359
+ // Success - reset backoff and immediately retry any queued events
360
+ this.resetBackoff()
361
+ if ((await this.getQueuedEventCount()) > 0 && !this.isRetrying) {
362
+ void this.retryFailedEvents()
363
+ }
364
+ resultCallback({ code: ExportResultCode.SUCCESS })
365
+ } catch (error) {
366
+ if (process.env.USER_TYPE === 'ant') {
367
+ logForDebugging(
368
+ `1P event logging export failed: ${errorMessage(error)}`,
369
+ )
370
+ }
371
+ logError(error)
372
+ resultCallback({
373
+ code: ExportResultCode.FAILED,
374
+ error: toError(error),
375
+ })
376
+ }
377
+ }
378
+
379
+ private async sendEventsInBatches(
380
+ events: FirstPartyEventLoggingEvent[],
381
+ ): Promise<FirstPartyEventLoggingEvent[]> {
382
+ // Chunk events into batches
383
+ const batches: FirstPartyEventLoggingEvent[][] = []
384
+ for (let i = 0; i < events.length; i += this.maxBatchSize) {
385
+ batches.push(events.slice(i, i + this.maxBatchSize))
386
+ }
387
+
388
+ if (process.env.USER_TYPE === 'ant') {
389
+ logForDebugging(
390
+ `1P event logging: exporting ${events.length} events in ${batches.length} batch(es)`,
391
+ )
392
+ }
393
+
394
+ // Send each batch with delay between them. On first failure, assume the
395
+ // endpoint is down and short-circuit: queue the failed batch plus all
396
+ // remaining unsent batches without POSTing them. The backoff retry will
397
+ // probe again with a single batch next tick.
398
+ const failedBatchEvents: FirstPartyEventLoggingEvent[] = []
399
+ let lastErrorContext: string | undefined
400
+ for (let i = 0; i < batches.length; i++) {
401
+ const batch = batches[i]!
402
+ try {
403
+ await this.sendBatchWithRetry({ events: batch })
404
+ } catch (error) {
405
+ lastErrorContext = getAxiosErrorContext(error)
406
+ for (let j = i; j < batches.length; j++) {
407
+ failedBatchEvents.push(...batches[j]!)
408
+ }
409
+ if (process.env.USER_TYPE === 'ant') {
410
+ const skipped = batches.length - 1 - i
411
+ logForDebugging(
412
+ `1P event logging: batch ${i + 1}/${batches.length} failed (${lastErrorContext}); short-circuiting ${skipped} remaining batch(es)`,
413
+ )
414
+ }
415
+ break
416
+ }
417
+
418
+ if (i < batches.length - 1 && this.batchDelayMs > 0) {
419
+ await sleep(this.batchDelayMs)
420
+ }
421
+ }
422
+
423
+ if (failedBatchEvents.length > 0 && lastErrorContext) {
424
+ this.lastExportErrorContext = lastErrorContext
425
+ }
426
+
427
+ return failedBatchEvents
428
+ }
429
+
430
+ private async queueFailedEvents(
431
+ events: FirstPartyEventLoggingEvent[],
432
+ ): Promise<void> {
433
+ const filePath = this.getCurrentBatchFilePath()
434
+
435
+ // Append-only: just add new events to file (atomic on most filesystems)
436
+ await this.appendEventsToFile(filePath, events)
437
+
438
+ const context = this.lastExportErrorContext
439
+ ? ` (${this.lastExportErrorContext})`
440
+ : ''
441
+ const message = `1P event logging: ${events.length} events failed to export${context}`
442
+ logError(new Error(message))
443
+ }
444
+
445
+ private scheduleBackoffRetry(): void {
446
+ // Don't schedule if already retrying or shutdown
447
+ if (this.cancelBackoff || this.isRetrying || this.isShutdown) {
448
+ return
449
+ }
450
+
451
+ // Quadratic backoff (matching Statsig SDK): base * attempts²
452
+ const delay = Math.min(
453
+ this.baseBackoffDelayMs * this.attempts * this.attempts,
454
+ this.maxBackoffDelayMs,
455
+ )
456
+
457
+ if (process.env.USER_TYPE === 'ant') {
458
+ logForDebugging(
459
+ `1P event logging: scheduling backoff retry in ${delay}ms (attempt ${this.attempts})`,
460
+ )
461
+ }
462
+
463
+ this.cancelBackoff = this.schedule(async () => {
464
+ this.cancelBackoff = null
465
+ await this.retryFailedEvents()
466
+ }, delay)
467
+ }
468
+
469
+ private async retryFailedEvents(): Promise<void> {
470
+ const filePath = this.getCurrentBatchFilePath()
471
+
472
+ // Keep retrying while there are events and endpoint is healthy
473
+ while (!this.isShutdown) {
474
+ const events = await this.loadEventsFromFile(filePath)
475
+ if (events.length === 0) break
476
+
477
+ if (this.attempts >= this.maxAttempts) {
478
+ if (process.env.USER_TYPE === 'ant') {
479
+ logForDebugging(
480
+ `1P event logging: max attempts (${this.maxAttempts}) reached, dropping ${events.length} events`,
481
+ )
482
+ }
483
+ await this.deleteFile(filePath)
484
+ this.resetBackoff()
485
+ return
486
+ }
487
+
488
+ this.isRetrying = true
489
+
490
+ // Clear file before retry (we have events in memory now)
491
+ await this.deleteFile(filePath)
492
+
493
+ if (process.env.USER_TYPE === 'ant') {
494
+ logForDebugging(
495
+ `1P event logging: retrying ${events.length} failed events (attempt ${this.attempts + 1})`,
496
+ )
497
+ }
498
+
499
+ const failedEvents = await this.sendEventsInBatches(events)
500
+ this.attempts++
501
+
502
+ this.isRetrying = false
503
+
504
+ if (failedEvents.length > 0) {
505
+ // Write failures back to disk
506
+ await this.saveEventsToFile(filePath, failedEvents)
507
+ this.scheduleBackoffRetry()
508
+ return // Failed - wait for backoff
509
+ }
510
+
511
+ // Success - reset backoff and continue loop to drain any newly queued events
512
+ this.resetBackoff()
513
+ if (process.env.USER_TYPE === 'ant') {
514
+ logForDebugging('1P event logging: backoff retry succeeded')
515
+ }
516
+ }
517
+ }
518
+
519
+ private resetBackoff(): void {
520
+ this.attempts = 0
521
+ if (this.cancelBackoff) {
522
+ this.cancelBackoff()
523
+ this.cancelBackoff = null
524
+ }
525
+ }
526
+
527
+ private async sendBatchWithRetry(
528
+ payload: FirstPartyEventLoggingPayload,
529
+ ): Promise<void> {
530
+ if (this.isKilled()) {
531
+ // Throw so the caller short-circuits remaining batches and queues
532
+ // everything to disk. Zero network traffic while killed; the backoff
533
+ // timer keeps ticking and will resume POSTs as soon as the GrowthBook
534
+ // cache picks up the cleared flag.
535
+ throw new Error('firstParty sink killswitch active')
536
+ }
537
+
538
+ const baseHeaders: Record<string, string> = {
539
+ 'Content-Type': 'application/json',
540
+ 'User-Agent': getClaudeCodeUserAgent(),
541
+ 'x-service-name': 'claude-code',
542
+ }
543
+
544
+ // Skip auth if trust hasn't been established yet
545
+ // This prevents executing apiKeyHelper commands before the trust dialog
546
+ // Non-interactive sessions implicitly have workspace trust
547
+ const hasTrust =
548
+ checkHasTrustDialogAccepted() || getIsNonInteractiveSession()
549
+ if (process.env.USER_TYPE === 'ant' && !hasTrust) {
550
+ logForDebugging('1P event logging: Trust not accepted')
551
+ }
552
+
553
+ // Skip auth when the OAuth token is expired or lacks user:profile
554
+ // scope (service key sessions). Falls through to unauthenticated send.
555
+ let shouldSkipAuth = this.skipAuth || !hasTrust
556
+ if (!shouldSkipAuth && isClaudeAISubscriber()) {
557
+ const tokens = getClaudeAIOAuthTokens()
558
+ if (!hasProfileScope()) {
559
+ shouldSkipAuth = true
560
+ } else if (tokens && isOAuthTokenExpired(tokens.expiresAt)) {
561
+ shouldSkipAuth = true
562
+ if (process.env.USER_TYPE === 'ant') {
563
+ logForDebugging(
564
+ '1P event logging: OAuth token expired, skipping auth to avoid 401',
565
+ )
566
+ }
567
+ }
568
+ }
569
+
570
+ // Try with auth headers first (unless trust not established or token is known to be expired)
571
+ const authResult = shouldSkipAuth
572
+ ? { headers: {}, error: 'trust not established or Oauth token expired' }
573
+ : getAuthHeaders()
574
+ const useAuth = !authResult.error
575
+
576
+ if (!useAuth && process.env.USER_TYPE === 'ant') {
577
+ logForDebugging(
578
+ `1P event logging: auth not available, sending without auth`,
579
+ )
580
+ }
581
+
582
+ const headers = useAuth
583
+ ? { ...baseHeaders, ...authResult.headers }
584
+ : baseHeaders
585
+
586
+ try {
587
+ const response = await axios.post(this.endpoint, payload, {
588
+ timeout: this.timeout,
589
+ headers,
590
+ })
591
+ this.logSuccess(payload.events.length, useAuth, response.data)
592
+ return
593
+ } catch (error) {
594
+ // Handle 401 by retrying without auth
595
+ if (
596
+ useAuth &&
597
+ axios.isAxiosError(error) &&
598
+ error.response?.status === 401
599
+ ) {
600
+ if (process.env.USER_TYPE === 'ant') {
601
+ logForDebugging(
602
+ '1P event logging: 401 auth error, retrying without auth',
603
+ )
604
+ }
605
+ const response = await axios.post(this.endpoint, payload, {
606
+ timeout: this.timeout,
607
+ headers: baseHeaders,
608
+ })
609
+ this.logSuccess(payload.events.length, false, response.data)
610
+ return
611
+ }
612
+
613
+ throw error
614
+ }
615
+ }
616
+
617
+ private logSuccess(
618
+ eventCount: number,
619
+ withAuth: boolean,
620
+ responseData: unknown,
621
+ ): void {
622
+ if (process.env.USER_TYPE === 'ant') {
623
+ logForDebugging(
624
+ `1P event logging: ${eventCount} events exported successfully${withAuth ? ' (with auth)' : ' (without auth)'}`,
625
+ )
626
+ logForDebugging(`API Response: ${jsonStringify(responseData, null, 2)}`)
627
+ }
628
+ }
629
+
630
+ private hrTimeToDate(hrTime: HrTime): Date {
631
+ const [seconds, nanoseconds] = hrTime
632
+ return new Date(seconds * 1000 + nanoseconds / 1000000)
633
+ }
634
+
635
+ private transformLogsToEvents(
636
+ logs: ReadableLogRecord[],
637
+ ): FirstPartyEventLoggingPayload {
638
+ const events: FirstPartyEventLoggingEvent[] = []
639
+
640
+ for (const log of logs) {
641
+ const attributes = log.attributes || {}
642
+
643
+ // Check if this is a GrowthBook experiment event
644
+ if (attributes.event_type === 'GrowthbookExperimentEvent') {
645
+ const timestamp = this.hrTimeToDate(log.hrTime)
646
+ const account_uuid = attributes.account_uuid as string | undefined
647
+ const organization_uuid = attributes.organization_uuid as
648
+ | string
649
+ | undefined
650
+ events.push({
651
+ event_type: 'GrowthbookExperimentEvent',
652
+ event_data: GrowthbookExperimentEvent.toJSON({
653
+ event_id: attributes.event_id as string,
654
+ timestamp,
655
+ experiment_id: attributes.experiment_id as string,
656
+ variation_id: attributes.variation_id as number,
657
+ environment: attributes.environment as string,
658
+ user_attributes: attributes.user_attributes as string,
659
+ experiment_metadata: attributes.experiment_metadata as string,
660
+ device_id: attributes.device_id as string,
661
+ session_id: attributes.session_id as string,
662
+ auth:
663
+ account_uuid || organization_uuid
664
+ ? { account_uuid, organization_uuid }
665
+ : undefined,
666
+ }),
667
+ })
668
+ continue
669
+ }
670
+
671
+ // Extract event name
672
+ const eventName =
673
+ (attributes.event_name as string) || (log.body as string) || 'unknown'
674
+
675
+ // Extract metadata objects directly (no JSON parsing needed)
676
+ const coreMetadata = attributes.core_metadata as EventMetadata | undefined
677
+ const userMetadata = attributes.user_metadata as CoreUserData
678
+ const eventMetadata = (attributes.event_metadata || {}) as Record<
679
+ string,
680
+ unknown
681
+ >
682
+
683
+ if (!coreMetadata) {
684
+ // Emit partial event if core metadata is missing
685
+ if (process.env.USER_TYPE === 'ant') {
686
+ logForDebugging(
687
+ `1P event logging: core_metadata missing for event ${eventName}`,
688
+ )
689
+ }
690
+ events.push({
691
+ event_type: 'ClaudeCodeInternalEvent',
692
+ event_data: ClaudeCodeInternalEvent.toJSON({
693
+ event_id: attributes.event_id as string | undefined,
694
+ event_name: eventName,
695
+ client_timestamp: this.hrTimeToDate(log.hrTime),
696
+ session_id: getSessionId(),
697
+ additional_metadata: Buffer.from(
698
+ jsonStringify({
699
+ transform_error: 'core_metadata attribute is missing',
700
+ }),
701
+ ).toString('base64'),
702
+ }),
703
+ })
704
+ continue
705
+ }
706
+
707
+ // Transform to 1P format
708
+ const formatted = to1PEventFormat(
709
+ coreMetadata,
710
+ userMetadata,
711
+ eventMetadata,
712
+ )
713
+
714
+ // _PROTO_* keys are PII-tagged values meant only for privileged BQ
715
+ // columns. Hoist known keys to proto fields, then defensively strip any
716
+ // remaining _PROTO_* so an unrecognized future key can't silently land
717
+ // in the general-access additional_metadata blob. sink.ts applies the
718
+ // same strip before Datadog; this closes the 1P side.
719
+ const {
720
+ _PROTO_skill_name,
721
+ _PROTO_plugin_name,
722
+ _PROTO_marketplace_name,
723
+ ...rest
724
+ } = formatted.additional
725
+ const additionalMetadata = stripProtoFields(rest)
726
+
727
+ events.push({
728
+ event_type: 'ClaudeCodeInternalEvent',
729
+ event_data: ClaudeCodeInternalEvent.toJSON({
730
+ event_id: attributes.event_id as string | undefined,
731
+ event_name: eventName,
732
+ client_timestamp: this.hrTimeToDate(log.hrTime),
733
+ device_id: attributes.user_id as string | undefined,
734
+ email: userMetadata?.email,
735
+ auth: formatted.auth,
736
+ ...formatted.core,
737
+ env: formatted.env,
738
+ process: formatted.process,
739
+ skill_name:
740
+ typeof _PROTO_skill_name === 'string'
741
+ ? _PROTO_skill_name
742
+ : undefined,
743
+ plugin_name:
744
+ typeof _PROTO_plugin_name === 'string'
745
+ ? _PROTO_plugin_name
746
+ : undefined,
747
+ marketplace_name:
748
+ typeof _PROTO_marketplace_name === 'string'
749
+ ? _PROTO_marketplace_name
750
+ : undefined,
751
+ additional_metadata:
752
+ Object.keys(additionalMetadata).length > 0
753
+ ? Buffer.from(jsonStringify(additionalMetadata)).toString(
754
+ 'base64',
755
+ )
756
+ : undefined,
757
+ }),
758
+ })
759
+ }
760
+
761
+ return { events }
762
+ }
763
+
764
+ async shutdown(): Promise<void> {
765
+ this.isShutdown = true
766
+ this.resetBackoff()
767
+ await this.forceFlush()
768
+ if (process.env.USER_TYPE === 'ant') {
769
+ logForDebugging('1P event logging exporter shutdown complete')
770
+ }
771
+ }
772
+
773
+ async forceFlush(): Promise<void> {
774
+ await Promise.all(this.pendingExports)
775
+ if (process.env.USER_TYPE === 'ant') {
776
+ logForDebugging('1P event logging exporter flush complete')
777
+ }
778
+ }
779
+ }
780
+
781
+ function getAxiosErrorContext(error: unknown): string {
782
+ if (!axios.isAxiosError(error)) {
783
+ return errorMessage(error)
784
+ }
785
+
786
+ const parts: string[] = []
787
+
788
+ const requestId = error.response?.headers?.['request-id']
789
+ if (requestId) {
790
+ parts.push(`request-id=${requestId}`)
791
+ }
792
+
793
+ if (error.response?.status) {
794
+ parts.push(`status=${error.response.status}`)
795
+ }
796
+
797
+ if (error.code) {
798
+ parts.push(`code=${error.code}`)
799
+ }
800
+
801
+ if (error.message) {
802
+ parts.push(error.message)
803
+ }
804
+
805
+ return parts.join(', ')
806
+ }