@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,961 @@
1
+ import { createHash, randomUUID, type UUID } from 'crypto'
2
+ import { stat } from 'fs/promises'
3
+ import { isAbsolute, join, relative, sep } from 'path'
4
+ import { getOriginalCwd, getSessionId } from '../bootstrap/state.js'
5
+ import type {
6
+ AttributionSnapshotMessage,
7
+ FileAttributionState,
8
+ } from '../types/logs.js'
9
+ import { getCwd } from './cwd.js'
10
+ import { logForDebugging } from './debug.js'
11
+ import { execFileNoThrowWithCwd } from './execFileNoThrow.js'
12
+ import { getFsImplementation } from './fsOperations.js'
13
+ import { isGeneratedFile } from './generatedFiles.js'
14
+ import { getRemoteUrlForDir, resolveGitDir } from './git/gitFilesystem.js'
15
+ import { findGitRoot, gitExe } from './git.js'
16
+ import { logError } from './log.js'
17
+ import { getCanonicalName, type ModelName } from './model/model.js'
18
+ import { sequential } from './sequential.js'
19
+
20
+ /**
21
+ * List of repos where internal model names are allowed in trailers.
22
+ * Includes both SSH and HTTPS URL formats.
23
+ *
24
+ * NOTE: This is intentionally a repo allowlist, not an org-wide check.
25
+ * The anthropics and anthropic-experimental orgs contain PUBLIC repos
26
+ * (e.g. anthropics/claude-code, anthropic-experimental/sandbox-runtime).
27
+ * Undercover mode must stay ON in those to prevent codename leaks.
28
+ * Only add repos here that are confirmed PRIVATE.
29
+ */
30
+ const INTERNAL_MODEL_REPOS = [
31
+ 'github.com:anthropics/claude-cli-internal',
32
+ 'github.com/anthropics/claude-cli-internal',
33
+ 'github.com:anthropics/anthropic',
34
+ 'github.com/anthropics/anthropic',
35
+ 'github.com:anthropics/apps',
36
+ 'github.com/anthropics/apps',
37
+ 'github.com:anthropics/casino',
38
+ 'github.com/anthropics/casino',
39
+ 'github.com:anthropics/dbt',
40
+ 'github.com/anthropics/dbt',
41
+ 'github.com:anthropics/dotfiles',
42
+ 'github.com/anthropics/dotfiles',
43
+ 'github.com:anthropics/terraform-config',
44
+ 'github.com/anthropics/terraform-config',
45
+ 'github.com:anthropics/hex-export',
46
+ 'github.com/anthropics/hex-export',
47
+ 'github.com:anthropics/feedback-v2',
48
+ 'github.com/anthropics/feedback-v2',
49
+ 'github.com:anthropics/labs',
50
+ 'github.com/anthropics/labs',
51
+ 'github.com:anthropics/argo-rollouts',
52
+ 'github.com/anthropics/argo-rollouts',
53
+ 'github.com:anthropics/starling-configs',
54
+ 'github.com/anthropics/starling-configs',
55
+ 'github.com:anthropics/ts-tools',
56
+ 'github.com/anthropics/ts-tools',
57
+ 'github.com:anthropics/ts-capsules',
58
+ 'github.com/anthropics/ts-capsules',
59
+ 'github.com:anthropics/feldspar-testing',
60
+ 'github.com/anthropics/feldspar-testing',
61
+ 'github.com:anthropics/trellis',
62
+ 'github.com/anthropics/trellis',
63
+ 'github.com:anthropics/claude-for-hiring',
64
+ 'github.com/anthropics/claude-for-hiring',
65
+ 'github.com:anthropics/forge-web',
66
+ 'github.com/anthropics/forge-web',
67
+ 'github.com:anthropics/infra-manifests',
68
+ 'github.com/anthropics/infra-manifests',
69
+ 'github.com:anthropics/mycro_manifests',
70
+ 'github.com/anthropics/mycro_manifests',
71
+ 'github.com:anthropics/mycro_configs',
72
+ 'github.com/anthropics/mycro_configs',
73
+ 'github.com:anthropics/mobile-apps',
74
+ 'github.com/anthropics/mobile-apps',
75
+ ]
76
+
77
+ /**
78
+ * Get the repo root for attribution operations.
79
+ * Uses getCwd() which respects agent worktree overrides (AsyncLocalStorage),
80
+ * then resolves to git root to handle `cd subdir` case.
81
+ * Falls back to getOriginalCwd() if git root can't be determined.
82
+ */
83
+ export function getAttributionRepoRoot(): string {
84
+ const cwd = getCwd()
85
+ return findGitRoot(cwd) ?? getOriginalCwd()
86
+ }
87
+
88
+ // Cache for repo classification result. Primed once per process.
89
+ // 'internal' = remote matches INTERNAL_MODEL_REPOS allowlist
90
+ // 'external' = has a remote, not on allowlist (public/open-source repo)
91
+ // 'none' = no remote URL (not a git repo, or no remote configured)
92
+ let repoClassCache: 'internal' | 'external' | 'none' | null = null
93
+
94
+ /**
95
+ * Synchronously return the cached repo classification.
96
+ * Returns null if the async check hasn't run yet.
97
+ */
98
+ export function getRepoClassCached(): 'internal' | 'external' | 'none' | null {
99
+ return repoClassCache
100
+ }
101
+
102
+ /**
103
+ * Synchronously return the cached result of isInternalModelRepo().
104
+ * Returns false if the check hasn't run yet (safe default: don't leak).
105
+ */
106
+ export function isInternalModelRepoCached(): boolean {
107
+ return repoClassCache === 'internal'
108
+ }
109
+
110
+ /**
111
+ * Check if the current repo is in the allowlist for internal model names.
112
+ * Memoized - only checks once per process.
113
+ */
114
+ export const isInternalModelRepo = sequential(async (): Promise<boolean> => {
115
+ if (repoClassCache !== null) {
116
+ return repoClassCache === 'internal'
117
+ }
118
+
119
+ const cwd = getAttributionRepoRoot()
120
+ const remoteUrl = await getRemoteUrlForDir(cwd)
121
+
122
+ if (!remoteUrl) {
123
+ repoClassCache = 'none'
124
+ return false
125
+ }
126
+ const isInternal = INTERNAL_MODEL_REPOS.some(repo => remoteUrl.includes(repo))
127
+ repoClassCache = isInternal ? 'internal' : 'external'
128
+ return isInternal
129
+ })
130
+
131
+ /**
132
+ * Sanitize a surface key to use public model names.
133
+ * Converts internal model variants to their public equivalents.
134
+ */
135
+ export function sanitizeSurfaceKey(surfaceKey: string): string {
136
+ // Split surface key into surface and model parts (e.g., "cli/opus-4-5-fast" -> ["cli", "opus-4-5-fast"])
137
+ const slashIndex = surfaceKey.lastIndexOf('/')
138
+ if (slashIndex === -1) {
139
+ return surfaceKey
140
+ }
141
+
142
+ const surface = surfaceKey.slice(0, slashIndex)
143
+ const model = surfaceKey.slice(slashIndex + 1)
144
+ const sanitizedModel = sanitizeModelName(model)
145
+
146
+ return `${surface}/${sanitizedModel}`
147
+ }
148
+
149
+ // @[MODEL LAUNCH]: Add a mapping for the new model ID so git commit trailers show the public name.
150
+ /**
151
+ * Sanitize a model name to its public equivalent.
152
+ * Maps internal variants to their public names based on model family.
153
+ */
154
+ export function sanitizeModelName(shortName: string): string {
155
+ // Map internal variants to public equivalents based on model family
156
+ if (shortName.includes('opus-4-6')) return 'claude-opus-4-6'
157
+ if (shortName.includes('opus-4-5')) return 'claude-opus-4-5'
158
+ if (shortName.includes('opus-4-1')) return 'claude-opus-4-1'
159
+ if (shortName.includes('opus-4')) return 'claude-opus-4'
160
+ if (shortName.includes('sonnet-4-6')) return 'claude-sonnet-4-6'
161
+ if (shortName.includes('sonnet-4-5')) return 'claude-sonnet-4-5'
162
+ if (shortName.includes('sonnet-4')) return 'claude-sonnet-4'
163
+ if (shortName.includes('sonnet-3-7')) return 'claude-sonnet-3-7'
164
+ if (shortName.includes('haiku-4-5')) return 'claude-haiku-4-5'
165
+ if (shortName.includes('haiku-3-5')) return 'claude-haiku-3-5'
166
+ // Unknown models get a generic name
167
+ return 'claude'
168
+ }
169
+
170
+ /**
171
+ * Attribution state for tracking Claude's contributions to files.
172
+ */
173
+ export type AttributionState = {
174
+ // File states keyed by relative path (from cwd)
175
+ fileStates: Map<string, FileAttributionState>
176
+ // Session baseline states for net change calculation
177
+ sessionBaselines: Map<string, { contentHash: string; mtime: number }>
178
+ // Surface from which edits were made
179
+ surface: string
180
+ // HEAD SHA at session start (for detecting external commits)
181
+ startingHeadSha: string | null
182
+ // Total prompts in session (for steer count calculation)
183
+ promptCount: number
184
+ // Prompts at last commit (to calculate steers for current commit)
185
+ promptCountAtLastCommit: number
186
+ // Permission prompt tracking
187
+ permissionPromptCount: number
188
+ permissionPromptCountAtLastCommit: number
189
+ // ESC press tracking (user cancelled permission prompt)
190
+ escapeCount: number
191
+ escapeCountAtLastCommit: number
192
+ }
193
+
194
+ /**
195
+ * Summary of Claude's contribution for a commit.
196
+ */
197
+ export type AttributionSummary = {
198
+ claudePercent: number
199
+ claudeChars: number
200
+ humanChars: number
201
+ surfaces: string[]
202
+ }
203
+
204
+ /**
205
+ * Per-file attribution details for git notes.
206
+ */
207
+ export type FileAttribution = {
208
+ claudeChars: number
209
+ humanChars: number
210
+ percent: number
211
+ surface: string
212
+ }
213
+
214
+ /**
215
+ * Full attribution data for git notes JSON.
216
+ */
217
+ export type AttributionData = {
218
+ version: 1
219
+ summary: AttributionSummary
220
+ files: Record<string, FileAttribution>
221
+ surfaceBreakdown: Record<string, { claudeChars: number; percent: number }>
222
+ excludedGenerated: string[]
223
+ sessions: string[]
224
+ }
225
+
226
+ /**
227
+ * Get the current client surface from environment.
228
+ */
229
+ export function getClientSurface(): string {
230
+ return process.env.CLAUDE_CODE_ENTRYPOINT ?? 'cli'
231
+ }
232
+
233
+ /**
234
+ * Build a surface key that includes the model name.
235
+ * Format: "surface/model" (e.g., "cli/claude-sonnet")
236
+ */
237
+ export function buildSurfaceKey(surface: string, model: ModelName): string {
238
+ return `${surface}/${getCanonicalName(model)}`
239
+ }
240
+
241
+ /**
242
+ * Compute SHA-256 hash of content.
243
+ */
244
+ export function computeContentHash(content: string): string {
245
+ return createHash('sha256').update(content).digest('hex')
246
+ }
247
+
248
+ /**
249
+ * Normalize file path to relative path from cwd for consistent tracking.
250
+ * Resolves symlinks to handle /tmp vs /private/tmp on macOS.
251
+ */
252
+ export function normalizeFilePath(filePath: string): string {
253
+ const fs = getFsImplementation()
254
+ const cwd = getAttributionRepoRoot()
255
+
256
+ if (!isAbsolute(filePath)) {
257
+ return filePath
258
+ }
259
+
260
+ // Resolve symlinks in both paths for consistent comparison
261
+ // (e.g., /tmp -> /private/tmp on macOS)
262
+ let resolvedPath = filePath
263
+ let resolvedCwd = cwd
264
+
265
+ try {
266
+ resolvedPath = fs.realpathSync(filePath)
267
+ } catch {
268
+ // File may not exist yet, use original path
269
+ }
270
+
271
+ try {
272
+ resolvedCwd = fs.realpathSync(cwd)
273
+ } catch {
274
+ // Keep original cwd
275
+ }
276
+
277
+ if (
278
+ resolvedPath.startsWith(resolvedCwd + sep) ||
279
+ resolvedPath === resolvedCwd
280
+ ) {
281
+ // Normalize to forward slashes so keys match git diff output on Windows
282
+ return relative(resolvedCwd, resolvedPath).replaceAll(sep, '/')
283
+ }
284
+
285
+ // Fallback: try original comparison
286
+ if (filePath.startsWith(cwd + sep) || filePath === cwd) {
287
+ return relative(cwd, filePath).replaceAll(sep, '/')
288
+ }
289
+
290
+ return filePath
291
+ }
292
+
293
+ /**
294
+ * Expand a relative path to absolute path.
295
+ */
296
+ export function expandFilePath(filePath: string): string {
297
+ if (isAbsolute(filePath)) {
298
+ return filePath
299
+ }
300
+ return join(getAttributionRepoRoot(), filePath)
301
+ }
302
+
303
+ /**
304
+ * Create an empty attribution state for a new session.
305
+ */
306
+ export function createEmptyAttributionState(): AttributionState {
307
+ return {
308
+ fileStates: new Map(),
309
+ sessionBaselines: new Map(),
310
+ surface: getClientSurface(),
311
+ startingHeadSha: null,
312
+ promptCount: 0,
313
+ promptCountAtLastCommit: 0,
314
+ permissionPromptCount: 0,
315
+ permissionPromptCountAtLastCommit: 0,
316
+ escapeCount: 0,
317
+ escapeCountAtLastCommit: 0,
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Compute the character contribution for a file modification.
323
+ * Returns the FileAttributionState to store, or null if tracking failed.
324
+ */
325
+ function computeFileModificationState(
326
+ existingFileStates: Map<string, FileAttributionState>,
327
+ filePath: string,
328
+ oldContent: string,
329
+ newContent: string,
330
+ mtime: number,
331
+ ): FileAttributionState | null {
332
+ const normalizedPath = normalizeFilePath(filePath)
333
+
334
+ try {
335
+ // Calculate Claude's character contribution
336
+ let claudeContribution: number
337
+
338
+ if (oldContent === '' || newContent === '') {
339
+ // New file or full deletion - contribution is the content length
340
+ claudeContribution =
341
+ oldContent === '' ? newContent.length : oldContent.length
342
+ } else {
343
+ // Find actual changed region via common prefix/suffix matching.
344
+ // This correctly handles same-length replacements (e.g., "Esc" → "esc")
345
+ // where Math.abs(newLen - oldLen) would be 0.
346
+ const minLen = Math.min(oldContent.length, newContent.length)
347
+ let prefixEnd = 0
348
+ while (
349
+ prefixEnd < minLen &&
350
+ oldContent[prefixEnd] === newContent[prefixEnd]
351
+ ) {
352
+ prefixEnd++
353
+ }
354
+ let suffixLen = 0
355
+ while (
356
+ suffixLen < minLen - prefixEnd &&
357
+ oldContent[oldContent.length - 1 - suffixLen] ===
358
+ newContent[newContent.length - 1 - suffixLen]
359
+ ) {
360
+ suffixLen++
361
+ }
362
+ const oldChangedLen = oldContent.length - prefixEnd - suffixLen
363
+ const newChangedLen = newContent.length - prefixEnd - suffixLen
364
+ claudeContribution = Math.max(oldChangedLen, newChangedLen)
365
+ }
366
+
367
+ // Get current file state if it exists
368
+ const existingState = existingFileStates.get(normalizedPath)
369
+ const existingContribution = existingState?.claudeContribution ?? 0
370
+
371
+ return {
372
+ contentHash: computeContentHash(newContent),
373
+ claudeContribution: existingContribution + claudeContribution,
374
+ mtime,
375
+ }
376
+ } catch (error) {
377
+ logError(error as Error)
378
+ return null
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Get a file's modification time (mtimeMs), falling back to Date.now() if
384
+ * the file doesn't exist. This is async so it can be precomputed before
385
+ * entering a sync setAppState callback.
386
+ */
387
+ export async function getFileMtime(filePath: string): Promise<number> {
388
+ const normalizedPath = normalizeFilePath(filePath)
389
+ const absPath = expandFilePath(normalizedPath)
390
+ try {
391
+ const stats = await stat(absPath)
392
+ return stats.mtimeMs
393
+ } catch {
394
+ return Date.now()
395
+ }
396
+ }
397
+
398
+ /**
399
+ * Track a file modification by Claude.
400
+ * Called after Edit/Write tool completes.
401
+ */
402
+ export function trackFileModification(
403
+ state: AttributionState,
404
+ filePath: string,
405
+ oldContent: string,
406
+ newContent: string,
407
+ _userModified: boolean,
408
+ mtime: number = Date.now(),
409
+ ): AttributionState {
410
+ const normalizedPath = normalizeFilePath(filePath)
411
+ const newFileState = computeFileModificationState(
412
+ state.fileStates,
413
+ filePath,
414
+ oldContent,
415
+ newContent,
416
+ mtime,
417
+ )
418
+ if (!newFileState) {
419
+ return state
420
+ }
421
+
422
+ const newFileStates = new Map(state.fileStates)
423
+ newFileStates.set(normalizedPath, newFileState)
424
+
425
+ logForDebugging(
426
+ `Attribution: Tracked ${newFileState.claudeContribution} chars for ${normalizedPath}`,
427
+ )
428
+
429
+ return {
430
+ ...state,
431
+ fileStates: newFileStates,
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Track a file creation by Claude (e.g., via bash command).
437
+ * Used when Claude creates a new file through a non-tracked mechanism.
438
+ */
439
+ export function trackFileCreation(
440
+ state: AttributionState,
441
+ filePath: string,
442
+ content: string,
443
+ mtime: number = Date.now(),
444
+ ): AttributionState {
445
+ // A creation is simply a modification from empty to the new content
446
+ return trackFileModification(state, filePath, '', content, false, mtime)
447
+ }
448
+
449
+ /**
450
+ * Track a file deletion by Claude (e.g., via bash rm command).
451
+ * Used when Claude deletes a file through a non-tracked mechanism.
452
+ */
453
+ export function trackFileDeletion(
454
+ state: AttributionState,
455
+ filePath: string,
456
+ oldContent: string,
457
+ ): AttributionState {
458
+ const normalizedPath = normalizeFilePath(filePath)
459
+ const existingState = state.fileStates.get(normalizedPath)
460
+ const existingContribution = existingState?.claudeContribution ?? 0
461
+ const deletedChars = oldContent.length
462
+
463
+ const newFileState: FileAttributionState = {
464
+ contentHash: '', // Empty hash for deleted files
465
+ claudeContribution: existingContribution + deletedChars,
466
+ mtime: Date.now(),
467
+ }
468
+
469
+ const newFileStates = new Map(state.fileStates)
470
+ newFileStates.set(normalizedPath, newFileState)
471
+
472
+ logForDebugging(
473
+ `Attribution: Tracked deletion of ${normalizedPath} (${deletedChars} chars removed, total contribution: ${newFileState.claudeContribution})`,
474
+ )
475
+
476
+ return {
477
+ ...state,
478
+ fileStates: newFileStates,
479
+ }
480
+ }
481
+
482
+ // --
483
+
484
+ /**
485
+ * Track multiple file changes in bulk, mutating a single Map copy.
486
+ * This avoids the O(n²) cost of copying the Map per file when processing
487
+ * large git diffs (e.g., jj operations that touch hundreds of thousands of files).
488
+ */
489
+ export function trackBulkFileChanges(
490
+ state: AttributionState,
491
+ changes: ReadonlyArray<{
492
+ path: string
493
+ type: 'modified' | 'created' | 'deleted'
494
+ oldContent: string
495
+ newContent: string
496
+ mtime?: number
497
+ }>,
498
+ ): AttributionState {
499
+ // Create ONE copy of the Map, then mutate it for each file
500
+ const newFileStates = new Map(state.fileStates)
501
+
502
+ for (const change of changes) {
503
+ const mtime = change.mtime ?? Date.now()
504
+ if (change.type === 'deleted') {
505
+ const normalizedPath = normalizeFilePath(change.path)
506
+ const existingState = newFileStates.get(normalizedPath)
507
+ const existingContribution = existingState?.claudeContribution ?? 0
508
+ const deletedChars = change.oldContent.length
509
+
510
+ newFileStates.set(normalizedPath, {
511
+ contentHash: '',
512
+ claudeContribution: existingContribution + deletedChars,
513
+ mtime,
514
+ })
515
+
516
+ logForDebugging(
517
+ `Attribution: Tracked deletion of ${normalizedPath} (${deletedChars} chars removed, total contribution: ${existingContribution + deletedChars})`,
518
+ )
519
+ } else {
520
+ const newFileState = computeFileModificationState(
521
+ newFileStates,
522
+ change.path,
523
+ change.oldContent,
524
+ change.newContent,
525
+ mtime,
526
+ )
527
+ if (newFileState) {
528
+ const normalizedPath = normalizeFilePath(change.path)
529
+ newFileStates.set(normalizedPath, newFileState)
530
+
531
+ logForDebugging(
532
+ `Attribution: Tracked ${newFileState.claudeContribution} chars for ${normalizedPath}`,
533
+ )
534
+ }
535
+ }
536
+ }
537
+
538
+ return {
539
+ ...state,
540
+ fileStates: newFileStates,
541
+ }
542
+ }
543
+
544
+ /**
545
+ * Calculate final attribution for staged files.
546
+ * Compares session baseline to committed state.
547
+ */
548
+ export async function calculateCommitAttribution(
549
+ states: AttributionState[],
550
+ stagedFiles: string[],
551
+ ): Promise<AttributionData> {
552
+ const cwd = getAttributionRepoRoot()
553
+ const sessionId = getSessionId()
554
+
555
+ const files: Record<string, FileAttribution> = {}
556
+ const excludedGenerated: string[] = []
557
+ const surfaces = new Set<string>()
558
+ const surfaceCounts: Record<string, number> = {}
559
+
560
+ let totalClaudeChars = 0
561
+ let totalHumanChars = 0
562
+
563
+ // Merge file states from all sessions
564
+ const mergedFileStates = new Map<string, FileAttributionState>()
565
+ const mergedBaselines = new Map<
566
+ string,
567
+ { contentHash: string; mtime: number }
568
+ >()
569
+
570
+ for (const state of states) {
571
+ surfaces.add(state.surface)
572
+
573
+ // Merge baselines (earliest baseline wins)
574
+ // Handle both Map and plain object (in case of serialization)
575
+ const baselines =
576
+ state.sessionBaselines instanceof Map
577
+ ? state.sessionBaselines
578
+ : new Map(
579
+ Object.entries(
580
+ (state.sessionBaselines ?? {}) as Record<
581
+ string,
582
+ { contentHash: string; mtime: number }
583
+ >,
584
+ ),
585
+ )
586
+ for (const [path, baseline] of baselines) {
587
+ if (!mergedBaselines.has(path)) {
588
+ mergedBaselines.set(path, baseline)
589
+ }
590
+ }
591
+
592
+ // Merge file states (accumulate contributions)
593
+ // Handle both Map and plain object (in case of serialization)
594
+ const fileStates =
595
+ state.fileStates instanceof Map
596
+ ? state.fileStates
597
+ : new Map(
598
+ Object.entries(
599
+ (state.fileStates ?? {}) as Record<string, FileAttributionState>,
600
+ ),
601
+ )
602
+ for (const [path, fileState] of fileStates) {
603
+ const existing = mergedFileStates.get(path)
604
+ if (existing) {
605
+ mergedFileStates.set(path, {
606
+ ...fileState,
607
+ claudeContribution:
608
+ existing.claudeContribution + fileState.claudeContribution,
609
+ })
610
+ } else {
611
+ mergedFileStates.set(path, fileState)
612
+ }
613
+ }
614
+ }
615
+
616
+ // Process files in parallel
617
+ const fileResults = await Promise.all(
618
+ stagedFiles.map(async file => {
619
+ // Skip generated files
620
+ if (isGeneratedFile(file)) {
621
+ return { type: 'generated' as const, file }
622
+ }
623
+
624
+ const absPath = join(cwd, file)
625
+ const fileState = mergedFileStates.get(file)
626
+ const baseline = mergedBaselines.get(file)
627
+
628
+ // Get the surface for this file
629
+ const fileSurface = states[0]!.surface
630
+
631
+ let claudeChars = 0
632
+ let humanChars = 0
633
+
634
+ // Check if file was deleted
635
+ const deleted = await isFileDeleted(file)
636
+
637
+ if (deleted) {
638
+ // File was deleted
639
+ if (fileState) {
640
+ // Claude deleted this file (tracked deletion)
641
+ claudeChars = fileState.claudeContribution
642
+ humanChars = 0
643
+ } else {
644
+ // Human deleted this file (untracked deletion)
645
+ // Use diff size to get the actual change size
646
+ const diffSize = await getGitDiffSize(file)
647
+ humanChars = diffSize > 0 ? diffSize : 100 // Minimum attribution for a deletion
648
+ }
649
+ } else {
650
+ try {
651
+ // Only need file size, not content - stat() avoids loading GB-scale
652
+ // build artifacts into memory when they appear in the working tree.
653
+ // stats.size (bytes) is an adequate proxy for char count here.
654
+ const stats = await stat(absPath)
655
+
656
+ if (fileState) {
657
+ // We have tracked modifications for this file
658
+ claudeChars = fileState.claudeContribution
659
+ humanChars = 0
660
+ } else if (baseline) {
661
+ // File was modified but not tracked - human modification
662
+ const diffSize = await getGitDiffSize(file)
663
+ humanChars = diffSize > 0 ? diffSize : stats.size
664
+ } else {
665
+ // New file not created by Claude
666
+ humanChars = stats.size
667
+ }
668
+ } catch {
669
+ // File doesn't exist or stat failed - skip it
670
+ return null
671
+ }
672
+ }
673
+
674
+ // Ensure non-negative values
675
+ claudeChars = Math.max(0, claudeChars)
676
+ humanChars = Math.max(0, humanChars)
677
+
678
+ const total = claudeChars + humanChars
679
+ const percent = total > 0 ? Math.round((claudeChars / total) * 100) : 0
680
+
681
+ return {
682
+ type: 'file' as const,
683
+ file,
684
+ claudeChars,
685
+ humanChars,
686
+ percent,
687
+ surface: fileSurface,
688
+ }
689
+ }),
690
+ )
691
+
692
+ // Aggregate results
693
+ for (const result of fileResults) {
694
+ if (!result) continue
695
+
696
+ if (result.type === 'generated') {
697
+ excludedGenerated.push(result.file)
698
+ continue
699
+ }
700
+
701
+ files[result.file] = {
702
+ claudeChars: result.claudeChars,
703
+ humanChars: result.humanChars,
704
+ percent: result.percent,
705
+ surface: result.surface,
706
+ }
707
+
708
+ totalClaudeChars += result.claudeChars
709
+ totalHumanChars += result.humanChars
710
+
711
+ surfaceCounts[result.surface] =
712
+ (surfaceCounts[result.surface] ?? 0) + result.claudeChars
713
+ }
714
+
715
+ const totalChars = totalClaudeChars + totalHumanChars
716
+ const claudePercent =
717
+ totalChars > 0 ? Math.round((totalClaudeChars / totalChars) * 100) : 0
718
+
719
+ // Calculate surface breakdown (percentage of total content per surface)
720
+ const surfaceBreakdown: Record<
721
+ string,
722
+ { claudeChars: number; percent: number }
723
+ > = {}
724
+ for (const [surface, chars] of Object.entries(surfaceCounts)) {
725
+ // Calculate what percentage of TOTAL content this surface contributed
726
+ const percent = totalChars > 0 ? Math.round((chars / totalChars) * 100) : 0
727
+ surfaceBreakdown[surface] = { claudeChars: chars, percent }
728
+ }
729
+
730
+ return {
731
+ version: 1,
732
+ summary: {
733
+ claudePercent,
734
+ claudeChars: totalClaudeChars,
735
+ humanChars: totalHumanChars,
736
+ surfaces: Array.from(surfaces),
737
+ },
738
+ files,
739
+ surfaceBreakdown,
740
+ excludedGenerated,
741
+ sessions: [sessionId],
742
+ }
743
+ }
744
+
745
+ /**
746
+ * Get the size of changes for a file from git diff.
747
+ * Returns the number of characters added/removed (absolute difference).
748
+ * For new files, returns the total file size.
749
+ * For deleted files, returns the size of the deleted content.
750
+ */
751
+ export async function getGitDiffSize(filePath: string): Promise<number> {
752
+ const cwd = getAttributionRepoRoot()
753
+
754
+ try {
755
+ // Use git diff --stat to get a summary of changes
756
+ const result = await execFileNoThrowWithCwd(
757
+ gitExe(),
758
+ ['diff', '--cached', '--stat', '--', filePath],
759
+ { cwd, timeout: 5000 },
760
+ )
761
+
762
+ if (result.code !== 0 || !result.stdout) {
763
+ return 0
764
+ }
765
+
766
+ // Parse the stat output to extract additions and deletions
767
+ // Format: " file | 5 ++---" or " file | 10 +"
768
+ const lines = result.stdout.split('\n').filter(Boolean)
769
+ let totalChanges = 0
770
+
771
+ for (const line of lines) {
772
+ // Skip the summary line (e.g., "1 file changed, 3 insertions(+), 2 deletions(-)")
773
+ if (line.includes('file changed') || line.includes('files changed')) {
774
+ const insertMatch = line.match(/(\d+) insertions?/)
775
+ const deleteMatch = line.match(/(\d+) deletions?/)
776
+
777
+ // Use line-based changes and approximate chars per line (~40 chars average)
778
+ const insertions = insertMatch ? parseInt(insertMatch[1]!, 10) : 0
779
+ const deletions = deleteMatch ? parseInt(deleteMatch[1]!, 10) : 0
780
+ totalChanges += (insertions + deletions) * 40
781
+ }
782
+ }
783
+
784
+ return totalChanges
785
+ } catch {
786
+ return 0
787
+ }
788
+ }
789
+
790
+ /**
791
+ * Check if a file was deleted in the staged changes.
792
+ */
793
+ export async function isFileDeleted(filePath: string): Promise<boolean> {
794
+ const cwd = getAttributionRepoRoot()
795
+
796
+ try {
797
+ const result = await execFileNoThrowWithCwd(
798
+ gitExe(),
799
+ ['diff', '--cached', '--name-status', '--', filePath],
800
+ { cwd, timeout: 5000 },
801
+ )
802
+
803
+ if (result.code === 0 && result.stdout) {
804
+ // Format: "D\tfilename" for deleted files
805
+ return result.stdout.trim().startsWith('D\t')
806
+ }
807
+ } catch {
808
+ // Ignore errors
809
+ }
810
+
811
+ return false
812
+ }
813
+
814
+ /**
815
+ * Get staged files from git.
816
+ */
817
+ export async function getStagedFiles(): Promise<string[]> {
818
+ const cwd = getAttributionRepoRoot()
819
+
820
+ try {
821
+ const result = await execFileNoThrowWithCwd(
822
+ gitExe(),
823
+ ['diff', '--cached', '--name-only'],
824
+ { cwd, timeout: 5000 },
825
+ )
826
+
827
+ if (result.code === 0 && result.stdout) {
828
+ return result.stdout.split('\n').filter(Boolean)
829
+ }
830
+ } catch (error) {
831
+ logError(error as Error)
832
+ }
833
+
834
+ return []
835
+ }
836
+
837
+ // formatAttributionTrailer moved to attributionTrailer.ts for tree-shaking
838
+ // (contains excluded strings that should not be in external builds)
839
+
840
+ /**
841
+ * Check if we're in a transient git state (rebase, merge, cherry-pick).
842
+ */
843
+ export async function isGitTransientState(): Promise<boolean> {
844
+ const gitDir = await resolveGitDir(getAttributionRepoRoot())
845
+ if (!gitDir) return false
846
+
847
+ const indicators = [
848
+ 'rebase-merge',
849
+ 'rebase-apply',
850
+ 'MERGE_HEAD',
851
+ 'CHERRY_PICK_HEAD',
852
+ 'BISECT_LOG',
853
+ ]
854
+
855
+ const results = await Promise.all(
856
+ indicators.map(async indicator => {
857
+ try {
858
+ await stat(join(gitDir, indicator))
859
+ return true
860
+ } catch {
861
+ return false
862
+ }
863
+ }),
864
+ )
865
+
866
+ return results.some(exists => exists)
867
+ }
868
+
869
+ /**
870
+ * Convert attribution state to snapshot message for persistence.
871
+ */
872
+ export function stateToSnapshotMessage(
873
+ state: AttributionState,
874
+ messageId: UUID,
875
+ ): AttributionSnapshotMessage {
876
+ const fileStates: Record<string, FileAttributionState> = {}
877
+
878
+ for (const [path, fileState] of state.fileStates) {
879
+ fileStates[path] = fileState
880
+ }
881
+
882
+ return {
883
+ type: 'attribution-snapshot',
884
+ messageId,
885
+ surface: state.surface,
886
+ fileStates,
887
+ promptCount: state.promptCount,
888
+ promptCountAtLastCommit: state.promptCountAtLastCommit,
889
+ permissionPromptCount: state.permissionPromptCount,
890
+ permissionPromptCountAtLastCommit: state.permissionPromptCountAtLastCommit,
891
+ escapeCount: state.escapeCount,
892
+ escapeCountAtLastCommit: state.escapeCountAtLastCommit,
893
+ }
894
+ }
895
+
896
+ /**
897
+ * Restore attribution state from snapshot messages.
898
+ */
899
+ export function restoreAttributionStateFromSnapshots(
900
+ snapshots: AttributionSnapshotMessage[],
901
+ ): AttributionState {
902
+ const state = createEmptyAttributionState()
903
+
904
+ // Snapshots are full-state dumps (see stateToSnapshotMessage), not deltas.
905
+ // The last snapshot has the most recent count for every path — fileStates
906
+ // never shrinks. Iterating and SUMMING counts across snapshots causes
907
+ // quadratic growth on restore (837 snapshots × 280 files → 1.15 quadrillion
908
+ // "chars" tracked for a 5KB file over a 5-day session).
909
+ const lastSnapshot = snapshots[snapshots.length - 1]
910
+ if (!lastSnapshot) {
911
+ return state
912
+ }
913
+
914
+ state.surface = lastSnapshot.surface
915
+ for (const [path, fileState] of Object.entries(lastSnapshot.fileStates)) {
916
+ state.fileStates.set(path, fileState)
917
+ }
918
+
919
+ // Restore prompt counts from the last snapshot (most recent state)
920
+ state.promptCount = lastSnapshot.promptCount ?? 0
921
+ state.promptCountAtLastCommit = lastSnapshot.promptCountAtLastCommit ?? 0
922
+ state.permissionPromptCount = lastSnapshot.permissionPromptCount ?? 0
923
+ state.permissionPromptCountAtLastCommit =
924
+ lastSnapshot.permissionPromptCountAtLastCommit ?? 0
925
+ state.escapeCount = lastSnapshot.escapeCount ?? 0
926
+ state.escapeCountAtLastCommit = lastSnapshot.escapeCountAtLastCommit ?? 0
927
+
928
+ return state
929
+ }
930
+
931
+ /**
932
+ * Restore attribution state from log snapshots on session resume.
933
+ */
934
+ export function attributionRestoreStateFromLog(
935
+ attributionSnapshots: AttributionSnapshotMessage[],
936
+ onUpdateState: (newState: AttributionState) => void,
937
+ ): void {
938
+ const state = restoreAttributionStateFromSnapshots(attributionSnapshots)
939
+ onUpdateState(state)
940
+ }
941
+
942
+ /**
943
+ * Increment promptCount and save an attribution snapshot.
944
+ * Used to persist the prompt count across compaction.
945
+ *
946
+ * @param attribution - Current attribution state
947
+ * @param saveSnapshot - Function to save the snapshot (allows async handling by caller)
948
+ * @returns New attribution state with incremented promptCount
949
+ */
950
+ export function incrementPromptCount(
951
+ attribution: AttributionState,
952
+ saveSnapshot: (snapshot: AttributionSnapshotMessage) => void,
953
+ ): AttributionState {
954
+ const newAttribution = {
955
+ ...attribution,
956
+ promptCount: attribution.promptCount + 1,
957
+ }
958
+ const snapshot = stateToSnapshotMessage(newAttribution, randomUUID())
959
+ saveSnapshot(snapshot)
960
+ return newAttribution
961
+ }