@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,699 @@
1
+ /**
2
+ * Filesystem-based git state reading — avoids spawning git subprocesses.
3
+ *
4
+ * Covers: resolving .git directories (including worktrees/submodules),
5
+ * parsing HEAD, resolving refs via loose files and packed-refs,
6
+ * and the GitHeadWatcher that caches branch/SHA with fs.watchFile.
7
+ *
8
+ * Correctness notes (verified against git source):
9
+ * - HEAD: `ref: refs/heads/<branch>\n` or raw SHA (refs/files-backend.c)
10
+ * - Packed-refs: `<sha> <refname>\n`, skip `#` and `^` lines (packed-backend.c)
11
+ * - .git file (worktree): `gitdir: <path>\n` with optional relative path (setup.c)
12
+ * - Shallow: mere existence of `<commonDir>/shallow` means shallow (shallow.c)
13
+ */
14
+
15
+ import { unwatchFile, watchFile } from 'fs'
16
+ import { readdir, readFile, stat } from 'fs/promises'
17
+ import { join, resolve } from 'path'
18
+ import { waitForScrollIdle } from '../../bootstrap/state.js'
19
+ import { registerCleanup } from '../cleanupRegistry.js'
20
+ import { getCwd } from '../cwd.js'
21
+ import { findGitRoot } from '../git.js'
22
+ import { parseGitConfigValue } from './gitConfigParser.js'
23
+
24
+ // ---------------------------------------------------------------------------
25
+ // resolveGitDir — find the actual .git directory
26
+ // ---------------------------------------------------------------------------
27
+
28
+ const resolveGitDirCache = new Map<string, string | null>()
29
+
30
+ /** Clear cached git dir resolutions. Exported for testing only. */
31
+ export function clearResolveGitDirCache(): void {
32
+ resolveGitDirCache.clear()
33
+ }
34
+
35
+ /**
36
+ * Resolve the actual .git directory for a repo.
37
+ * Handles worktrees/submodules where .git is a file containing `gitdir: <path>`.
38
+ * Memoized per startPath.
39
+ */
40
+ export async function resolveGitDir(
41
+ startPath?: string,
42
+ ): Promise<string | null> {
43
+ const cwd = resolve(startPath ?? getCwd())
44
+ const cached = resolveGitDirCache.get(cwd)
45
+ if (cached !== undefined) {
46
+ return cached
47
+ }
48
+
49
+ const root = findGitRoot(cwd)
50
+ if (!root) {
51
+ resolveGitDirCache.set(cwd, null)
52
+ return null
53
+ }
54
+
55
+ const gitPath = join(root, '.git')
56
+ try {
57
+ const st = await stat(gitPath)
58
+ if (st.isFile()) {
59
+ // Worktree or submodule: .git is a file with `gitdir: <path>`
60
+ // Git strips trailing \n and \r (setup.c read_gitfile_gently).
61
+ const content = (await readFile(gitPath, 'utf-8')).trim()
62
+ if (content.startsWith('gitdir:')) {
63
+ const rawDir = content.slice('gitdir:'.length).trim()
64
+ const resolved = resolve(root, rawDir)
65
+ resolveGitDirCache.set(cwd, resolved)
66
+ return resolved
67
+ }
68
+ }
69
+ // Regular repo: .git is a directory
70
+ resolveGitDirCache.set(cwd, gitPath)
71
+ return gitPath
72
+ } catch {
73
+ resolveGitDirCache.set(cwd, null)
74
+ return null
75
+ }
76
+ }
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // isSafeRefName — validate ref/branch names read from .git/
80
+ // ---------------------------------------------------------------------------
81
+
82
+ /**
83
+ * Validate that a ref/branch name read from .git/ is safe to use in path
84
+ * joins, as git positional arguments, and when interpolated into shell
85
+ * commands (commit-push-pr skill interpolates the branch into shell).
86
+ * An attacker who controls .git/HEAD or a loose ref file could otherwise
87
+ * embed path traversal (`..`), argument injection (leading `-`), or shell
88
+ * metacharacters — .git/HEAD is a plain text file that can be written
89
+ * without git's own check-ref-format validation.
90
+ *
91
+ * Allowlist: ASCII alphanumerics, `/`, `.`, `_`, `+`, `-`, `@` only. This
92
+ * covers all legitimate git branch names (e.g. `feature/foo`,
93
+ * `release-1.2.3+build`, `dependabot/npm_and_yarn/@types/node-18.0.0`)
94
+ * while rejecting everything that could be dangerous in shell context
95
+ * (newlines, backticks, `$`, `;`, `|`, `&`, `(`, `)`, `<`, `>`, spaces,
96
+ * tabs, quotes, backslash) and path traversal (`..`).
97
+ */
98
+ export function isSafeRefName(name: string): boolean {
99
+ if (!name || name.startsWith('-') || name.startsWith('/')) {
100
+ return false
101
+ }
102
+ if (name.includes('..')) {
103
+ return false
104
+ }
105
+ // Reject single-dot and empty path components (`.`, `foo/./bar`, `foo//bar`,
106
+ // `foo/`). Git-check-ref-format rejects these, and `.` normalizes away in
107
+ // path joins so a tampered HEAD of `refs/heads/.` would make us watch the
108
+ // refs/heads directory itself instead of a branch file.
109
+ if (name.split('/').some(c => c === '.' || c === '')) {
110
+ return false
111
+ }
112
+ // Allowlist-only: alphanumerics, /, ., _, +, -, @. Rejects all shell
113
+ // metacharacters, whitespace, NUL, and non-ASCII. Git's forbidden @{
114
+ // sequence is blocked because { is not in the allowlist.
115
+ if (!/^[a-zA-Z0-9/._+@-]+$/.test(name)) {
116
+ return false
117
+ }
118
+ return true
119
+ }
120
+
121
+ /**
122
+ * Validate that a string is a git SHA: 40 hex chars (SHA-1) or 64 hex chars
123
+ * (SHA-256). Git never writes abbreviated SHAs to HEAD or ref files, so we
124
+ * only accept full-length hashes.
125
+ *
126
+ * An attacker who controls .git/HEAD when detached, or a loose ref file,
127
+ * could otherwise return arbitrary content that flows into shell contexts.
128
+ */
129
+ export function isValidGitSha(s: string): boolean {
130
+ return /^[0-9a-f]{40}$/.test(s) || /^[0-9a-f]{64}$/.test(s)
131
+ }
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // readGitHead — parse .git/HEAD
135
+ // ---------------------------------------------------------------------------
136
+
137
+ /**
138
+ * Parse .git/HEAD to determine current branch or detached SHA.
139
+ *
140
+ * HEAD format (per git source, refs/files-backend.c):
141
+ * - `ref: refs/heads/<branch>\n` — on a branch
142
+ * - `ref: <other-ref>\n` — unusual symref (e.g. during bisect)
143
+ * - `<hex-sha>\n` — detached HEAD (e.g. during rebase)
144
+ *
145
+ * Git strips trailing whitespace via strbuf_rtrim; .trim() is equivalent.
146
+ * Git allows any whitespace between "ref:" and the path; we handle
147
+ * this by trimming after slicing past "ref:".
148
+ */
149
+ export async function readGitHead(
150
+ gitDir: string,
151
+ ): Promise<
152
+ { type: 'branch'; name: string } | { type: 'detached'; sha: string } | null
153
+ > {
154
+ try {
155
+ const content = (await readFile(join(gitDir, 'HEAD'), 'utf-8')).trim()
156
+ if (content.startsWith('ref:')) {
157
+ const ref = content.slice('ref:'.length).trim()
158
+ if (ref.startsWith('refs/heads/')) {
159
+ const name = ref.slice('refs/heads/'.length)
160
+ // Reject path traversal and argument injection from a tampered HEAD.
161
+ if (!isSafeRefName(name)) {
162
+ return null
163
+ }
164
+ return { type: 'branch', name }
165
+ }
166
+ // Unusual symref (not a local branch) — resolve to SHA
167
+ if (!isSafeRefName(ref)) {
168
+ return null
169
+ }
170
+ const sha = await resolveRef(gitDir, ref)
171
+ return sha ? { type: 'detached', sha } : { type: 'detached', sha: '' }
172
+ }
173
+ // Raw SHA (detached HEAD). Validate: an attacker-controlled HEAD file
174
+ // could contain shell metacharacters that flow into downstream shell
175
+ // contexts.
176
+ if (!isValidGitSha(content)) {
177
+ return null
178
+ }
179
+ return { type: 'detached', sha: content }
180
+ } catch {
181
+ return null
182
+ }
183
+ }
184
+
185
+ // ---------------------------------------------------------------------------
186
+ // resolveRef — resolve loose/packed refs to SHAs
187
+ // ---------------------------------------------------------------------------
188
+
189
+ /**
190
+ * Resolve a git ref (e.g. `refs/heads/main`) to a commit SHA.
191
+ * Checks loose ref files first, then falls back to packed-refs.
192
+ * Follows symrefs (e.g. `ref: refs/remotes/origin/main`).
193
+ *
194
+ * For worktrees, refs live in the common gitdir (pointed to by the
195
+ * `commondir` file), not the worktree-specific gitdir. We check the
196
+ * worktree gitdir first, then fall back to the common dir.
197
+ *
198
+ * Packed-refs format (per packed-backend.c):
199
+ * - Header: `# pack-refs with: <traits>\n`
200
+ * - Entries: `<40-hex-sha> <refname>\n`
201
+ * - Peeled: `^<40-hex-sha>\n` (after annotated tag entries)
202
+ */
203
+ export async function resolveRef(
204
+ gitDir: string,
205
+ ref: string,
206
+ ): Promise<string | null> {
207
+ const result = await resolveRefInDir(gitDir, ref)
208
+ if (result) {
209
+ return result
210
+ }
211
+
212
+ // For worktrees: try the common gitdir where shared refs live
213
+ const commonDir = await getCommonDir(gitDir)
214
+ if (commonDir && commonDir !== gitDir) {
215
+ return resolveRefInDir(commonDir, ref)
216
+ }
217
+
218
+ return null
219
+ }
220
+
221
+ async function resolveRefInDir(
222
+ dir: string,
223
+ ref: string,
224
+ ): Promise<string | null> {
225
+ // Try loose ref file
226
+ try {
227
+ const content = (await readFile(join(dir, ref), 'utf-8')).trim()
228
+ if (content.startsWith('ref:')) {
229
+ const target = content.slice('ref:'.length).trim()
230
+ // Reject path traversal in a tampered symref chain.
231
+ if (!isSafeRefName(target)) {
232
+ return null
233
+ }
234
+ return resolveRef(dir, target)
235
+ }
236
+ // Loose ref content should be a raw SHA. Validate: an attacker-controlled
237
+ // ref file could contain shell metacharacters.
238
+ if (!isValidGitSha(content)) {
239
+ return null
240
+ }
241
+ return content
242
+ } catch {
243
+ // Loose ref doesn't exist, try packed-refs
244
+ }
245
+
246
+ try {
247
+ const packed = await readFile(join(dir, 'packed-refs'), 'utf-8')
248
+ for (const line of packed.split('\n')) {
249
+ if (line.startsWith('#') || line.startsWith('^')) {
250
+ continue
251
+ }
252
+ const spaceIdx = line.indexOf(' ')
253
+ if (spaceIdx === -1) {
254
+ continue
255
+ }
256
+ if (line.slice(spaceIdx + 1) === ref) {
257
+ const sha = line.slice(0, spaceIdx)
258
+ return isValidGitSha(sha) ? sha : null
259
+ }
260
+ }
261
+ } catch {
262
+ // No packed-refs
263
+ }
264
+
265
+ return null
266
+ }
267
+
268
+ /**
269
+ * Read the `commondir` file to find the shared git directory.
270
+ * In a worktree, this points to the main repo's .git dir.
271
+ * Returns null if no commondir file exists (regular repo).
272
+ */
273
+ export async function getCommonDir(gitDir: string): Promise<string | null> {
274
+ try {
275
+ const content = (await readFile(join(gitDir, 'commondir'), 'utf-8')).trim()
276
+ return resolve(gitDir, content)
277
+ } catch {
278
+ return null
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Read a raw symref file and extract the branch name after a known prefix.
284
+ * Returns null if the ref doesn't exist, isn't a symref, or doesn't match the prefix.
285
+ * Checks loose file only — packed-refs doesn't store symrefs.
286
+ */
287
+ export async function readRawSymref(
288
+ gitDir: string,
289
+ refPath: string,
290
+ branchPrefix: string,
291
+ ): Promise<string | null> {
292
+ try {
293
+ const content = (await readFile(join(gitDir, refPath), 'utf-8')).trim()
294
+ if (content.startsWith('ref:')) {
295
+ const target = content.slice('ref:'.length).trim()
296
+ if (target.startsWith(branchPrefix)) {
297
+ const name = target.slice(branchPrefix.length)
298
+ // Reject path traversal and argument injection from a tampered symref.
299
+ if (!isSafeRefName(name)) {
300
+ return null
301
+ }
302
+ return name
303
+ }
304
+ }
305
+ } catch {
306
+ // Not a loose ref
307
+ }
308
+ return null
309
+ }
310
+
311
+ // ---------------------------------------------------------------------------
312
+ // GitFileWatcher — watches git files and caches derived values.
313
+ // Lazily initialized on first cache access. Invalidates all cached
314
+ // values when any watched file changes.
315
+ //
316
+ // Watches:
317
+ // .git/HEAD — branch switches, detached HEAD
318
+ // .git/config — remote URL changes
319
+ // .git/refs/heads/<branch> — new commits on the current branch
320
+ //
321
+ // When HEAD changes (branch switch), the branch ref watcher is updated
322
+ // to track the new branch's ref file.
323
+ // ---------------------------------------------------------------------------
324
+
325
+ type CacheEntry<T> = {
326
+ value: T
327
+ dirty: boolean
328
+ compute: () => Promise<T>
329
+ }
330
+
331
+ const WATCH_INTERVAL_MS = process.env.NODE_ENV === 'test' ? 10 : 1000
332
+
333
+ class GitFileWatcher {
334
+ private gitDir: string | null = null
335
+ private commonDir: string | null = null
336
+ private initialized = false
337
+ private initPromise: Promise<void> | null = null
338
+ private watchedPaths: string[] = []
339
+ private branchRefPath: string | null = null
340
+ private cache = new Map<string, CacheEntry<unknown>>()
341
+
342
+ async ensureStarted(): Promise<void> {
343
+ if (this.initialized) {
344
+ return
345
+ }
346
+ if (this.initPromise) {
347
+ return this.initPromise
348
+ }
349
+ this.initPromise = this.start()
350
+ return this.initPromise
351
+ }
352
+
353
+ private async start(): Promise<void> {
354
+ this.gitDir = await resolveGitDir()
355
+ this.initialized = true
356
+ if (!this.gitDir) {
357
+ return
358
+ }
359
+
360
+ // In a worktree, branch refs and the main config are shared and live in
361
+ // commonDir, not the per-worktree gitDir. Resolve once so we don't
362
+ // re-read the commondir file on every branch switch.
363
+ this.commonDir = await getCommonDir(this.gitDir)
364
+
365
+ // Watch .git/HEAD and .git/config
366
+ this.watchPath(join(this.gitDir, 'HEAD'), () => {
367
+ void this.onHeadChanged()
368
+ })
369
+ // Config (remote URLs) lives in commonDir for worktrees
370
+ this.watchPath(join(this.commonDir ?? this.gitDir, 'config'), () => {
371
+ this.invalidate()
372
+ })
373
+
374
+ // Watch the current branch's ref file for commit changes
375
+ await this.watchCurrentBranchRef()
376
+
377
+ registerCleanup(async () => {
378
+ this.stopWatching()
379
+ })
380
+ }
381
+
382
+ private watchPath(path: string, callback: () => void): void {
383
+ this.watchedPaths.push(path)
384
+ watchFile(path, { interval: WATCH_INTERVAL_MS }, callback)
385
+ }
386
+
387
+ /**
388
+ * Watch the loose ref file for the current branch.
389
+ * Called on startup and whenever HEAD changes (branch switch).
390
+ */
391
+ private async watchCurrentBranchRef(): Promise<void> {
392
+ if (!this.gitDir) {
393
+ return
394
+ }
395
+
396
+ const head = await readGitHead(this.gitDir)
397
+ // Branch refs live in commonDir for worktrees (gitDir for regular repos)
398
+ const refsDir = this.commonDir ?? this.gitDir
399
+ const refPath =
400
+ head?.type === 'branch' ? join(refsDir, 'refs', 'heads', head.name) : null
401
+
402
+ // Already watching this ref (or already not watching anything)
403
+ if (refPath === this.branchRefPath) {
404
+ return
405
+ }
406
+
407
+ // Stop watching old branch ref. Runs for branch→branch AND
408
+ // branch→detached (checkout --detach, rebase, bisect).
409
+ if (this.branchRefPath) {
410
+ unwatchFile(this.branchRefPath)
411
+ this.watchedPaths = this.watchedPaths.filter(
412
+ p => p !== this.branchRefPath,
413
+ )
414
+ }
415
+
416
+ this.branchRefPath = refPath
417
+
418
+ if (!refPath) {
419
+ return
420
+ }
421
+
422
+ // The ref file may not exist yet (new branch before first commit).
423
+ // watchFile works on nonexistent files — it fires when the file appears.
424
+ this.watchPath(refPath, () => {
425
+ this.invalidate()
426
+ })
427
+ }
428
+
429
+ private async onHeadChanged(): Promise<void> {
430
+ // HEAD changed — could be a branch switch or detach.
431
+ // Defer file I/O (readGitHead, watchFile setup) until scroll settles so
432
+ // watchFile callbacks that land mid-scroll don't compete for the event
433
+ // loop. invalidate() is cheap (just marks dirty) so do it first — the
434
+ // cache correctly serves stale-marked values until the watcher updates.
435
+ this.invalidate()
436
+ await waitForScrollIdle()
437
+ await this.watchCurrentBranchRef()
438
+ }
439
+
440
+ private invalidate(): void {
441
+ for (const entry of this.cache.values()) {
442
+ entry.dirty = true
443
+ }
444
+ }
445
+
446
+ private stopWatching(): void {
447
+ for (const path of this.watchedPaths) {
448
+ unwatchFile(path)
449
+ }
450
+ this.watchedPaths = []
451
+ this.branchRefPath = null
452
+ }
453
+
454
+ /**
455
+ * Get a cached value by key. On first call for a key, computes and caches it.
456
+ * Subsequent calls return the cached value until a watched file changes,
457
+ * which marks the entry dirty. The next get() re-computes from disk.
458
+ *
459
+ * Race condition handling: dirty is cleared BEFORE the async compute starts.
460
+ * If a file change arrives during compute, it re-sets dirty, so the next
461
+ * get() will re-read again rather than serving a stale value.
462
+ */
463
+ async get<T>(key: string, compute: () => Promise<T>): Promise<T> {
464
+ await this.ensureStarted()
465
+ const existing = this.cache.get(key)
466
+ if (existing && !existing.dirty) {
467
+ return existing.value as T
468
+ }
469
+ // Clear dirty before compute — if the file changes again during the
470
+ // async read, invalidate() will re-set dirty and we'll re-read on
471
+ // the next get() call.
472
+ if (existing) {
473
+ existing.dirty = false
474
+ }
475
+ const value = await compute()
476
+ // Only update the cached value if no new invalidation arrived during compute
477
+ const entry = this.cache.get(key)
478
+ if (entry && !entry.dirty) {
479
+ entry.value = value
480
+ }
481
+ if (!entry) {
482
+ this.cache.set(key, { value, dirty: false, compute })
483
+ }
484
+ return value
485
+ }
486
+
487
+ /** Reset all state. Stops file watchers. For testing only. */
488
+ reset(): void {
489
+ this.stopWatching()
490
+ this.cache.clear()
491
+ this.initialized = false
492
+ this.initPromise = null
493
+ this.gitDir = null
494
+ this.commonDir = null
495
+ }
496
+ }
497
+
498
+ const gitWatcher = new GitFileWatcher()
499
+
500
+ async function computeBranch(): Promise<string> {
501
+ const gitDir = await resolveGitDir()
502
+ if (!gitDir) {
503
+ return 'HEAD'
504
+ }
505
+ const head = await readGitHead(gitDir)
506
+ if (!head) {
507
+ return 'HEAD'
508
+ }
509
+ return head.type === 'branch' ? head.name : 'HEAD'
510
+ }
511
+
512
+ async function computeHead(): Promise<string> {
513
+ const gitDir = await resolveGitDir()
514
+ if (!gitDir) {
515
+ return ''
516
+ }
517
+ const head = await readGitHead(gitDir)
518
+ if (!head) {
519
+ return ''
520
+ }
521
+ if (head.type === 'branch') {
522
+ return (await resolveRef(gitDir, `refs/heads/${head.name}`)) ?? ''
523
+ }
524
+ return head.sha
525
+ }
526
+
527
+ async function computeRemoteUrl(): Promise<string | null> {
528
+ const gitDir = await resolveGitDir()
529
+ if (!gitDir) {
530
+ return null
531
+ }
532
+ const url = await parseGitConfigValue(gitDir, 'remote', 'origin', 'url')
533
+ if (url) {
534
+ return url
535
+ }
536
+ // In worktrees, the config with remote URLs is in the common dir
537
+ const commonDir = await getCommonDir(gitDir)
538
+ if (commonDir && commonDir !== gitDir) {
539
+ return parseGitConfigValue(commonDir, 'remote', 'origin', 'url')
540
+ }
541
+ return null
542
+ }
543
+
544
+ async function computeDefaultBranch(): Promise<string> {
545
+ const gitDir = await resolveGitDir()
546
+ if (!gitDir) {
547
+ return 'main'
548
+ }
549
+ // refs/remotes/ lives in commonDir, not the per-worktree gitDir
550
+ const commonDir = (await getCommonDir(gitDir)) ?? gitDir
551
+ const branchFromSymref = await readRawSymref(
552
+ commonDir,
553
+ 'refs/remotes/origin/HEAD',
554
+ 'refs/remotes/origin/',
555
+ )
556
+ if (branchFromSymref) {
557
+ return branchFromSymref
558
+ }
559
+ for (const candidate of ['main', 'master']) {
560
+ const sha = await resolveRef(commonDir, `refs/remotes/origin/${candidate}`)
561
+ if (sha) {
562
+ return candidate
563
+ }
564
+ }
565
+ return 'main'
566
+ }
567
+
568
+ export function getCachedBranch(): Promise<string> {
569
+ return gitWatcher.get('branch', computeBranch)
570
+ }
571
+
572
+ export function getCachedHead(): Promise<string> {
573
+ return gitWatcher.get('head', computeHead)
574
+ }
575
+
576
+ export function getCachedRemoteUrl(): Promise<string | null> {
577
+ return gitWatcher.get('remoteUrl', computeRemoteUrl)
578
+ }
579
+
580
+ export function getCachedDefaultBranch(): Promise<string> {
581
+ return gitWatcher.get('defaultBranch', computeDefaultBranch)
582
+ }
583
+
584
+ /** Reset the git file watcher state. For testing only. */
585
+ export function resetGitFileWatcher(): void {
586
+ gitWatcher.reset()
587
+ }
588
+
589
+ /**
590
+ * Read the HEAD SHA for an arbitrary directory (not using the watcher).
591
+ * Used by plugins that need the HEAD of a specific repo, not the CWD repo.
592
+ */
593
+ export async function getHeadForDir(cwd: string): Promise<string | null> {
594
+ const gitDir = await resolveGitDir(cwd)
595
+ if (!gitDir) {
596
+ return null
597
+ }
598
+ const head = await readGitHead(gitDir)
599
+ if (!head) {
600
+ return null
601
+ }
602
+ if (head.type === 'branch') {
603
+ return resolveRef(gitDir, `refs/heads/${head.name}`)
604
+ }
605
+ return head.sha
606
+ }
607
+
608
+ /**
609
+ * Read the HEAD SHA for a git worktree directory (not the main repo).
610
+ *
611
+ * Unlike `getHeadForDir`, this reads `<worktreePath>/.git` directly as a
612
+ * `gitdir:` pointer file, with no upward walk. `getHeadForDir` walks upward
613
+ * via `findGitRoot` and would find the parent repo's `.git` when the
614
+ * worktree path doesn't exist — misreporting the parent HEAD as the worktree's.
615
+ *
616
+ * Returns null if the worktree doesn't exist (`.git` pointer ENOENT) or is
617
+ * malformed. Caller can treat null as "not a valid worktree".
618
+ */
619
+ export async function readWorktreeHeadSha(
620
+ worktreePath: string,
621
+ ): Promise<string | null> {
622
+ let gitDir: string
623
+ try {
624
+ const ptr = (await readFile(join(worktreePath, '.git'), 'utf-8')).trim()
625
+ if (!ptr.startsWith('gitdir:')) {
626
+ return null
627
+ }
628
+ gitDir = resolve(worktreePath, ptr.slice('gitdir:'.length).trim())
629
+ } catch {
630
+ return null
631
+ }
632
+ const head = await readGitHead(gitDir)
633
+ if (!head) {
634
+ return null
635
+ }
636
+ if (head.type === 'branch') {
637
+ return resolveRef(gitDir, `refs/heads/${head.name}`)
638
+ }
639
+ return head.sha
640
+ }
641
+
642
+ /**
643
+ * Read the remote origin URL for an arbitrary directory via .git/config.
644
+ */
645
+ export async function getRemoteUrlForDir(cwd: string): Promise<string | null> {
646
+ const gitDir = await resolveGitDir(cwd)
647
+ if (!gitDir) {
648
+ return null
649
+ }
650
+ const url = await parseGitConfigValue(gitDir, 'remote', 'origin', 'url')
651
+ if (url) {
652
+ return url
653
+ }
654
+ // In worktrees, the config with remote URLs is in the common dir
655
+ const commonDir = await getCommonDir(gitDir)
656
+ if (commonDir && commonDir !== gitDir) {
657
+ return parseGitConfigValue(commonDir, 'remote', 'origin', 'url')
658
+ }
659
+ return null
660
+ }
661
+
662
+ /**
663
+ * Check if we're in a shallow clone by looking for <commonDir>/shallow.
664
+ * Per git's shallow.c, mere existence of the file means shallow.
665
+ * The shallow file lives in commonDir, not the per-worktree gitDir.
666
+ */
667
+ export async function isShallowClone(): Promise<boolean> {
668
+ const gitDir = await resolveGitDir()
669
+ if (!gitDir) {
670
+ return false
671
+ }
672
+ const commonDir = (await getCommonDir(gitDir)) ?? gitDir
673
+ try {
674
+ await stat(join(commonDir, 'shallow'))
675
+ return true
676
+ } catch {
677
+ return false
678
+ }
679
+ }
680
+
681
+ /**
682
+ * Count worktrees by reading <commonDir>/worktrees/ directory.
683
+ * The worktrees/ directory lives in commonDir, not the per-worktree gitDir.
684
+ * The main worktree is not listed there, so add 1.
685
+ */
686
+ export async function getWorktreeCountFromFs(): Promise<number> {
687
+ try {
688
+ const gitDir = await resolveGitDir()
689
+ if (!gitDir) {
690
+ return 0
691
+ }
692
+ const commonDir = (await getCommonDir(gitDir)) ?? gitDir
693
+ const entries = await readdir(join(commonDir, 'worktrees'))
694
+ return entries.length + 1
695
+ } catch {
696
+ // No worktrees directory means only the main worktree
697
+ return 1
698
+ }
699
+ }