@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,196 @@
1
+ import { readdir, rm, stat, unlink, writeFile } from 'fs/promises'
2
+ import { join } from 'path'
3
+ import { clearCommandsCache } from '../../commands.js'
4
+ import { clearAllOutputStylesCache } from '../../constants/outputStyles.js'
5
+ import { clearAgentDefinitionsCache } from '../../tools/AgentTool/loadAgentsDir.js'
6
+ import { clearPromptCache } from '../../tools/SkillTool/prompt.js'
7
+ import { resetSentSkillNames } from '../attachments.js'
8
+ import { logForDebugging } from '../debug.js'
9
+ import { getErrnoCode } from '../errors.js'
10
+ import { logError } from '../log.js'
11
+ import { loadInstalledPluginsFromDisk } from './installedPluginsManager.js'
12
+ import { clearPluginAgentCache } from './loadPluginAgents.js'
13
+ import { clearPluginCommandCache } from './loadPluginCommands.js'
14
+ import {
15
+ clearPluginHookCache,
16
+ pruneRemovedPluginHooks,
17
+ } from './loadPluginHooks.js'
18
+ import { clearPluginOutputStyleCache } from './loadPluginOutputStyles.js'
19
+ import { clearPluginCache, getPluginCachePath } from './pluginLoader.js'
20
+ import { clearPluginOptionsCache } from './pluginOptionsStorage.js'
21
+ import { isPluginZipCacheEnabled } from './zipCache.js'
22
+
23
+ const ORPHANED_AT_FILENAME = '.orphaned_at'
24
+ const CLEANUP_AGE_MS = 7 * 24 * 60 * 60 * 1000 // 7 days
25
+
26
+ export function clearAllPluginCaches(): void {
27
+ clearPluginCache()
28
+ clearPluginCommandCache()
29
+ clearPluginAgentCache()
30
+ clearPluginHookCache()
31
+ // Prune hooks from plugins no longer in the enabled set so uninstalled/
32
+ // disabled plugins stop firing immediately (gh-36995). Prune-only: hooks
33
+ // from newly-enabled plugins are NOT added here — they wait for
34
+ // /reload-plugins like commands/agents/MCP do. Fire-and-forget: old hooks
35
+ // stay valid until the prune completes (preserves gh-29767). No-op when
36
+ // STATE.registeredHooks is empty (test/preload.ts beforeEach clears it via
37
+ // resetStateForTests before reaching here).
38
+ pruneRemovedPluginHooks().catch(e => logError(e))
39
+ clearPluginOptionsCache()
40
+ clearPluginOutputStyleCache()
41
+ clearAllOutputStylesCache()
42
+ }
43
+
44
+ export function clearAllCaches(): void {
45
+ clearAllPluginCaches()
46
+ clearCommandsCache()
47
+ clearAgentDefinitionsCache()
48
+ clearPromptCache()
49
+ resetSentSkillNames()
50
+ }
51
+
52
+ /**
53
+ * Mark a plugin version as orphaned.
54
+ * Called when a plugin is uninstalled or updated to a new version.
55
+ */
56
+ export async function markPluginVersionOrphaned(
57
+ versionPath: string,
58
+ ): Promise<void> {
59
+ try {
60
+ await writeFile(getOrphanedAtPath(versionPath), `${Date.now()}`, 'utf-8')
61
+ } catch (error) {
62
+ logForDebugging(`Failed to write .orphaned_at: ${versionPath}: ${error}`)
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Clean up orphaned plugin versions that have been orphaned for more than 7 days.
68
+ *
69
+ * Pass 1: Remove .orphaned_at from installed versions (clears stale markers)
70
+ * Pass 2: For each cached version not in installed_plugins.json:
71
+ * - If no .orphaned_at exists: create it (handles old CC versions, manual edits)
72
+ * - If .orphaned_at exists and > 7 days old: delete the version
73
+ */
74
+ export async function cleanupOrphanedPluginVersionsInBackground(): Promise<void> {
75
+ // Zip cache mode stores plugins as .zip files, not directories. readSubdirs
76
+ // filters to directories only, so removeIfEmpty would see plugin dirs as empty
77
+ // and delete them (including the ZIPs). Skip cleanup entirely in zip mode.
78
+ if (isPluginZipCacheEnabled()) {
79
+ return
80
+ }
81
+ try {
82
+ const installedVersions = getInstalledVersionPaths()
83
+ if (!installedVersions) return
84
+
85
+ const cachePath = getPluginCachePath()
86
+
87
+ const now = Date.now()
88
+
89
+ // Pass 1: Remove .orphaned_at from installed versions
90
+ // This handles cases where a plugin was reinstalled after being orphaned
91
+ await Promise.all(
92
+ [...installedVersions].map(p => removeOrphanedAtMarker(p)),
93
+ )
94
+
95
+ // Pass 2: Process orphaned versions
96
+ for (const marketplace of await readSubdirs(cachePath)) {
97
+ const marketplacePath = join(cachePath, marketplace)
98
+
99
+ for (const plugin of await readSubdirs(marketplacePath)) {
100
+ const pluginPath = join(marketplacePath, plugin)
101
+
102
+ for (const version of await readSubdirs(pluginPath)) {
103
+ const versionPath = join(pluginPath, version)
104
+ if (installedVersions.has(versionPath)) continue
105
+ await processOrphanedPluginVersion(versionPath, now)
106
+ }
107
+
108
+ await removeIfEmpty(pluginPath)
109
+ }
110
+
111
+ await removeIfEmpty(marketplacePath)
112
+ }
113
+ } catch (error) {
114
+ logForDebugging(`Plugin cache cleanup failed: ${error}`)
115
+ }
116
+ }
117
+
118
+ function getOrphanedAtPath(versionPath: string): string {
119
+ return join(versionPath, ORPHANED_AT_FILENAME)
120
+ }
121
+
122
+ async function removeOrphanedAtMarker(versionPath: string): Promise<void> {
123
+ const orphanedAtPath = getOrphanedAtPath(versionPath)
124
+ try {
125
+ await unlink(orphanedAtPath)
126
+ } catch (error) {
127
+ const code = getErrnoCode(error)
128
+ if (code === 'ENOENT') return
129
+ logForDebugging(`Failed to remove .orphaned_at: ${versionPath}: ${error}`)
130
+ }
131
+ }
132
+
133
+ function getInstalledVersionPaths(): Set<string> | null {
134
+ try {
135
+ const paths = new Set<string>()
136
+ const diskData = loadInstalledPluginsFromDisk()
137
+ for (const installations of Object.values(diskData.plugins)) {
138
+ for (const entry of installations) {
139
+ paths.add(entry.installPath)
140
+ }
141
+ }
142
+ return paths
143
+ } catch (error) {
144
+ logForDebugging(`Failed to load installed plugins: ${error}`)
145
+ return null
146
+ }
147
+ }
148
+
149
+ async function processOrphanedPluginVersion(
150
+ versionPath: string,
151
+ now: number,
152
+ ): Promise<void> {
153
+ const orphanedAtPath = getOrphanedAtPath(versionPath)
154
+
155
+ let orphanedAt: number
156
+ try {
157
+ orphanedAt = (await stat(orphanedAtPath)).mtimeMs
158
+ } catch (error) {
159
+ const code = getErrnoCode(error)
160
+ if (code === 'ENOENT') {
161
+ await markPluginVersionOrphaned(versionPath)
162
+ return
163
+ }
164
+ logForDebugging(`Failed to stat orphaned marker: ${versionPath}: ${error}`)
165
+ return
166
+ }
167
+
168
+ if (now - orphanedAt > CLEANUP_AGE_MS) {
169
+ try {
170
+ await rm(versionPath, { recursive: true, force: true })
171
+ } catch (error) {
172
+ logForDebugging(
173
+ `Failed to delete orphaned version: ${versionPath}: ${error}`,
174
+ )
175
+ }
176
+ }
177
+ }
178
+
179
+ async function removeIfEmpty(dirPath: string): Promise<void> {
180
+ if ((await readSubdirs(dirPath)).length === 0) {
181
+ try {
182
+ await rm(dirPath, { recursive: true, force: true })
183
+ } catch (error) {
184
+ logForDebugging(`Failed to remove empty dir: ${dirPath}: ${error}`)
185
+ }
186
+ }
187
+ }
188
+
189
+ async function readSubdirs(dirPath: string): Promise<string[]> {
190
+ try {
191
+ const entries = await readdir(dirPath, { withFileTypes: true })
192
+ return entries.filter(d => d.isDirectory()).map(d => d.name)
193
+ } catch {
194
+ return []
195
+ }
196
+ }
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Plugin dependency resolution — pure functions, no I/O.
3
+ *
4
+ * Semantics are `apt`-style: a dependency is a *presence guarantee*, not a
5
+ * module graph. Plugin A depending on Plugin B means "B's namespaced
6
+ * components (MCP servers, commands, agents) must be available when A runs."
7
+ *
8
+ * Two entry points:
9
+ * - `resolveDependencyClosure` — install-time DFS walk, cycle detection
10
+ * - `verifyAndDemote` — load-time fixed-point check, demotes plugins with
11
+ * unsatisfied deps (session-local, does NOT write settings)
12
+ */
13
+
14
+ import type { LoadedPlugin, PluginError } from '../../types/plugin.js'
15
+ import type { EditableSettingSource } from '../settings/constants.js'
16
+ import { getSettingsForSource } from '../settings/settings.js'
17
+ import { parsePluginIdentifier } from './pluginIdentifier.js'
18
+ import type { PluginId } from './schemas.js'
19
+
20
+ /**
21
+ * Synthetic marketplace sentinel for `--plugin-dir` plugins (pluginLoader.ts
22
+ * sets `source = "{name}@inline"`). Not a real marketplace — bare deps from
23
+ * these plugins cannot meaningfully inherit it.
24
+ */
25
+ const INLINE_MARKETPLACE = 'inline'
26
+
27
+ /**
28
+ * Normalize a dependency reference to fully-qualified "name@marketplace" form.
29
+ * Bare names (no @) inherit the marketplace of the plugin declaring them —
30
+ * cross-marketplace deps are blocked anyway, so the @-suffix is boilerplate
31
+ * in the common case.
32
+ *
33
+ * EXCEPTION: if the declaring plugin is @inline (loaded via --plugin-dir),
34
+ * bare deps are returned unchanged. `inline` is a synthetic sentinel, not a
35
+ * real marketplace — fabricating "dep@inline" would never match anything.
36
+ * verifyAndDemote handles bare deps via name-only matching.
37
+ */
38
+ export function qualifyDependency(
39
+ dep: string,
40
+ declaringPluginId: string,
41
+ ): string {
42
+ if (parsePluginIdentifier(dep).marketplace) return dep
43
+ const mkt = parsePluginIdentifier(declaringPluginId).marketplace
44
+ if (!mkt || mkt === INLINE_MARKETPLACE) return dep
45
+ return `${dep}@${mkt}`
46
+ }
47
+
48
+ /**
49
+ * Minimal shape the resolver needs from a marketplace lookup. Keeping this
50
+ * narrow means the resolver stays testable without constructing full
51
+ * PluginMarketplaceEntry objects.
52
+ */
53
+ export type DependencyLookupResult = {
54
+ // Entries may be bare names; qualifyDependency normalizes them.
55
+ dependencies?: string[]
56
+ }
57
+
58
+ export type ResolutionResult =
59
+ | { ok: true; closure: PluginId[] }
60
+ | { ok: false; reason: 'cycle'; chain: PluginId[] }
61
+ | { ok: false; reason: 'not-found'; missing: PluginId; requiredBy: PluginId }
62
+ | {
63
+ ok: false
64
+ reason: 'cross-marketplace'
65
+ dependency: PluginId
66
+ requiredBy: PluginId
67
+ }
68
+
69
+ /**
70
+ * Walk the transitive dependency closure of `rootId` via DFS.
71
+ *
72
+ * The returned `closure` ALWAYS contains `rootId`, plus every transitive
73
+ * dependency that is NOT in `alreadyEnabled`. Already-enabled deps are
74
+ * skipped (not recursed into) — this avoids surprise settings writes when a
75
+ * dep is already installed at a different scope. The root is never skipped,
76
+ * even if already enabled, so re-installing a plugin always re-caches it.
77
+ *
78
+ * Cross-marketplace dependencies are BLOCKED by default: a plugin in
79
+ * marketplace A cannot auto-install a plugin from marketplace B. This is
80
+ * a security boundary — installing from a trusted marketplace shouldn't
81
+ * silently pull from an untrusted one. Two escapes: (1) install the
82
+ * cross-mkt dep yourself first (already-enabled deps are skipped, so the
83
+ * closure won't touch it), or (2) the ROOT marketplace's
84
+ * `allowCrossMarketplaceDependenciesOn` allowlist — only the root's list
85
+ * applies for the whole walk (no transitive trust: if A allows B, B's
86
+ * plugin depending on C is still blocked unless A also allows C).
87
+ *
88
+ * @param rootId Root plugin to resolve from (format: "name@marketplace")
89
+ * @param lookup Async lookup returning `{dependencies}` or `null` if not found
90
+ * @param alreadyEnabled Plugin IDs to skip (deps only, root is never skipped)
91
+ * @param allowedCrossMarketplaces Marketplace names the root trusts for
92
+ * auto-install (from the root marketplace's manifest)
93
+ * @returns Closure to install, or a cycle/not-found/cross-marketplace error
94
+ */
95
+ export async function resolveDependencyClosure(
96
+ rootId: PluginId,
97
+ lookup: (id: PluginId) => Promise<DependencyLookupResult | null>,
98
+ alreadyEnabled: ReadonlySet<PluginId>,
99
+ allowedCrossMarketplaces: ReadonlySet<string> = new Set(),
100
+ ): Promise<ResolutionResult> {
101
+ const rootMarketplace = parsePluginIdentifier(rootId).marketplace
102
+ const closure: PluginId[] = []
103
+ const visited = new Set<PluginId>()
104
+ const stack: PluginId[] = []
105
+
106
+ async function walk(
107
+ id: PluginId,
108
+ requiredBy: PluginId,
109
+ ): Promise<ResolutionResult | null> {
110
+ // Skip already-enabled DEPENDENCIES (avoids surprise settings writes),
111
+ // but NEVER skip the root: installing an already-enabled plugin must
112
+ // still cache/register it. Without this guard, re-installing a plugin
113
+ // that's in settings but missing from disk (e.g., cache cleared,
114
+ // installed_plugins.json stale) would return an empty closure and
115
+ // `cacheAndRegisterPlugin` would never fire — user sees
116
+ // "✔ Successfully installed" but nothing materializes.
117
+ if (id !== rootId && alreadyEnabled.has(id)) return null
118
+ // Security: block auto-install across marketplace boundaries. Runs AFTER
119
+ // the alreadyEnabled check — if the user manually installed a cross-mkt
120
+ // dep, it's in alreadyEnabled and we never reach this.
121
+ const idMarketplace = parsePluginIdentifier(id).marketplace
122
+ if (
123
+ idMarketplace !== rootMarketplace &&
124
+ !(idMarketplace && allowedCrossMarketplaces.has(idMarketplace))
125
+ ) {
126
+ return {
127
+ ok: false,
128
+ reason: 'cross-marketplace',
129
+ dependency: id,
130
+ requiredBy,
131
+ }
132
+ }
133
+ if (stack.includes(id)) {
134
+ return { ok: false, reason: 'cycle', chain: [...stack, id] }
135
+ }
136
+ if (visited.has(id)) return null
137
+ visited.add(id)
138
+
139
+ const entry = await lookup(id)
140
+ if (!entry) {
141
+ return { ok: false, reason: 'not-found', missing: id, requiredBy }
142
+ }
143
+
144
+ stack.push(id)
145
+ for (const rawDep of entry.dependencies ?? []) {
146
+ const dep = qualifyDependency(rawDep, id)
147
+ const err = await walk(dep, id)
148
+ if (err) return err
149
+ }
150
+ stack.pop()
151
+
152
+ closure.push(id)
153
+ return null
154
+ }
155
+
156
+ const err = await walk(rootId, rootId)
157
+ if (err) return err
158
+ return { ok: true, closure }
159
+ }
160
+
161
+ /**
162
+ * Load-time safety net: for each enabled plugin, verify all manifest
163
+ * dependencies are also in the enabled set. Demote any that fail.
164
+ *
165
+ * Fixed-point loop: demoting plugin A may break plugin B that depends on A,
166
+ * so we iterate until nothing changes.
167
+ *
168
+ * The `reason` field distinguishes:
169
+ * - `'not-enabled'` — dep exists in the loaded set but is disabled
170
+ * - `'not-found'` — dep is entirely absent (not in any marketplace)
171
+ *
172
+ * Does NOT mutate input. Returns the set of plugin IDs (sources) to demote.
173
+ *
174
+ * @param plugins All loaded plugins (enabled + disabled)
175
+ * @returns Set of pluginIds to demote, plus errors for `/doctor`
176
+ */
177
+ export function verifyAndDemote(plugins: readonly LoadedPlugin[]): {
178
+ demoted: Set<string>
179
+ errors: PluginError[]
180
+ } {
181
+ const known = new Set(plugins.map(p => p.source))
182
+ const enabled = new Set(plugins.filter(p => p.enabled).map(p => p.source))
183
+ // Name-only indexes for bare deps from --plugin-dir (@inline) plugins:
184
+ // the real marketplace is unknown, so match "B" against any enabled "B@*".
185
+ // enabledByName is a multiset: if B@epic AND B@other are both enabled,
186
+ // demoting one mustn't make "B" disappear from the index.
187
+ const knownByName = new Set(
188
+ plugins.map(p => parsePluginIdentifier(p.source).name),
189
+ )
190
+ const enabledByName = new Map<string, number>()
191
+ for (const id of enabled) {
192
+ const n = parsePluginIdentifier(id).name
193
+ enabledByName.set(n, (enabledByName.get(n) ?? 0) + 1)
194
+ }
195
+ const errors: PluginError[] = []
196
+
197
+ let changed = true
198
+ while (changed) {
199
+ changed = false
200
+ for (const p of plugins) {
201
+ if (!enabled.has(p.source)) continue
202
+ for (const rawDep of p.manifest.dependencies ?? []) {
203
+ const dep = qualifyDependency(rawDep, p.source)
204
+ // Bare dep ← @inline plugin: match by name only (see enabledByName)
205
+ const isBare = !parsePluginIdentifier(dep).marketplace
206
+ const satisfied = isBare
207
+ ? (enabledByName.get(dep) ?? 0) > 0
208
+ : enabled.has(dep)
209
+ if (!satisfied) {
210
+ enabled.delete(p.source)
211
+ const count = enabledByName.get(p.name) ?? 0
212
+ if (count <= 1) enabledByName.delete(p.name)
213
+ else enabledByName.set(p.name, count - 1)
214
+ errors.push({
215
+ type: 'dependency-unsatisfied',
216
+ source: p.source,
217
+ plugin: p.name,
218
+ dependency: dep,
219
+ reason: (isBare ? knownByName.has(dep) : known.has(dep))
220
+ ? 'not-enabled'
221
+ : 'not-found',
222
+ })
223
+ changed = true
224
+ break
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ const demoted = new Set(
231
+ plugins.filter(p => p.enabled && !enabled.has(p.source)).map(p => p.source),
232
+ )
233
+ return { demoted, errors }
234
+ }
235
+
236
+ /**
237
+ * Find all enabled plugins that declare `pluginId` as a dependency.
238
+ * Used to warn on uninstall/disable ("required by: X, Y").
239
+ *
240
+ * @param pluginId The plugin being removed/disabled
241
+ * @param plugins All loaded plugins (only enabled ones are checked)
242
+ * @returns Names of plugins that will break if `pluginId` goes away
243
+ */
244
+ export function findReverseDependents(
245
+ pluginId: PluginId,
246
+ plugins: readonly LoadedPlugin[],
247
+ ): string[] {
248
+ const { name: targetName } = parsePluginIdentifier(pluginId)
249
+ return plugins
250
+ .filter(
251
+ p =>
252
+ p.enabled &&
253
+ p.source !== pluginId &&
254
+ (p.manifest.dependencies ?? []).some(d => {
255
+ const qualified = qualifyDependency(d, p.source)
256
+ // Bare dep (from @inline plugin): match by name only
257
+ return parsePluginIdentifier(qualified).marketplace
258
+ ? qualified === pluginId
259
+ : qualified === targetName
260
+ }),
261
+ )
262
+ .map(p => p.name)
263
+ }
264
+
265
+ /**
266
+ * Build the set of plugin IDs currently enabled at a given settings scope.
267
+ * Used by install-time resolution to skip already-enabled deps and avoid
268
+ * surprise settings writes.
269
+ *
270
+ * Matches `true` (plain enable) AND array values (version constraints per
271
+ * settings/types.ts:455-463 — a plugin at `"foo@bar": ["^1.0.0"]` IS enabled).
272
+ * Without the array check, a version-pinned dep would be re-added to the
273
+ * closure and the settings write would clobber the constraint with `true`.
274
+ */
275
+ export function getEnabledPluginIdsForScope(
276
+ settingSource: EditableSettingSource,
277
+ ): Set<PluginId> {
278
+ return new Set(
279
+ Object.entries(getSettingsForSource(settingSource)?.enabledPlugins ?? {})
280
+ .filter(([, v]) => v === true || Array.isArray(v))
281
+ .map(([k]) => k),
282
+ )
283
+ }
284
+
285
+ /**
286
+ * Format the "(+ N dependencies)" suffix for install success messages.
287
+ * Returns empty string when `installedDeps` is empty.
288
+ */
289
+ export function formatDependencyCountSuffix(installedDeps: string[]): string {
290
+ if (installedDeps.length === 0) return ''
291
+ const n = installedDeps.length
292
+ return ` (+ ${n} ${n === 1 ? 'dependency' : 'dependencies'})`
293
+ }
294
+
295
+ /**
296
+ * Format the "warning: required by X, Y" suffix for uninstall/disable
297
+ * results. Em-dash style for CLI result messages (not the middot style
298
+ * used in the notification UI). Returns empty string when no dependents.
299
+ */
300
+ export function formatReverseDependentsSuffix(
301
+ rdeps: string[] | undefined,
302
+ ): string {
303
+ if (!rdeps || rdeps.length === 0) return ''
304
+ return ` — warning: required by ${rdeps.join(', ')}`
305
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Telemetry for plugin/marketplace fetches that hit the network.
3
+ *
4
+ * Added for inc-5046 (GitHub complained about claude-plugins-official load).
5
+ * Before this, fetch operations only had logForDebugging — no way to measure
6
+ * actual network volume. This surfaces what's hitting GitHub vs GCS vs
7
+ * user-hosted so we can see the GCS migration take effect and catch future
8
+ * hot-path regressions before GitHub emails us again.
9
+ *
10
+ * Volume: these fire at startup (install-counts 24h-TTL)
11
+ * and on explicit user action (install/update). NOT per-interaction. Similar
12
+ * envelope to tengu_binary_download_*.
13
+ */
14
+
15
+ import {
16
+ logEvent,
17
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS as SafeString,
18
+ } from '../../services/analytics/index.js'
19
+ import { OFFICIAL_MARKETPLACE_NAME } from './officialMarketplace.js'
20
+
21
+ export type PluginFetchSource =
22
+ | 'install_counts'
23
+ | 'marketplace_clone'
24
+ | 'marketplace_pull'
25
+ | 'marketplace_url'
26
+ | 'plugin_clone'
27
+ | 'mcpb'
28
+
29
+ export type PluginFetchOutcome = 'success' | 'failure' | 'cache_hit'
30
+
31
+ // Allowlist of public hosts we report by name. Anything else (enterprise
32
+ // git, self-hosted, internal) is bucketed as 'other' — we don't want
33
+ // internal hostnames (git.mycorp.internal) landing in telemetry. Bounded
34
+ // cardinality also keeps the dashboard host-breakdown tractable.
35
+ const KNOWN_PUBLIC_HOSTS = new Set([
36
+ 'github.com',
37
+ 'raw.githubusercontent.com',
38
+ 'objects.githubusercontent.com',
39
+ 'gist.githubusercontent.com',
40
+ 'gitlab.com',
41
+ 'bitbucket.org',
42
+ 'codeberg.org',
43
+ 'dev.azure.com',
44
+ 'ssh.dev.azure.com',
45
+ 'storage.googleapis.com', // GCS — where Dickson's migration points
46
+ ])
47
+
48
+ /**
49
+ * Extract hostname from a URL or git spec and bucket to the allowlist.
50
+ * Handles `https://host/...`, `git@host:path`, `ssh://host/...`.
51
+ * Returns a known public host, 'other' (parseable but not allowlisted —
52
+ * don't leak private hostnames), or 'unknown' (unparseable / local path).
53
+ */
54
+ function extractHost(urlOrSpec: string): string {
55
+ let host: string
56
+ const scpMatch = /^[^@/]+@([^:/]+):/.exec(urlOrSpec)
57
+ if (scpMatch) {
58
+ host = scpMatch[1]!
59
+ } else {
60
+ try {
61
+ host = new URL(urlOrSpec).hostname
62
+ } catch {
63
+ return 'unknown'
64
+ }
65
+ }
66
+ const normalized = host.toLowerCase()
67
+ return KNOWN_PUBLIC_HOSTS.has(normalized) ? normalized : 'other'
68
+ }
69
+
70
+ /**
71
+ * True if the URL/spec points at anthropics/claude-plugins-official — the
72
+ * repo GitHub complained about. Lets the dashboard separate "our problem"
73
+ * traffic from user-configured marketplaces.
74
+ */
75
+ function isOfficialRepo(urlOrSpec: string): boolean {
76
+ return urlOrSpec.includes(`anthropics/${OFFICIAL_MARKETPLACE_NAME}`)
77
+ }
78
+
79
+ export function logPluginFetch(
80
+ source: PluginFetchSource,
81
+ urlOrSpec: string | undefined,
82
+ outcome: PluginFetchOutcome,
83
+ durationMs: number,
84
+ errorKind?: string,
85
+ ): void {
86
+ // String values are bounded enums / hostname-only — no code, no paths,
87
+ // no raw error messages. Same privacy envelope as tengu_web_fetch_host.
88
+ logEvent('tengu_plugin_remote_fetch', {
89
+ source: source as SafeString,
90
+ host: (urlOrSpec ? extractHost(urlOrSpec) : 'unknown') as SafeString,
91
+ is_official: urlOrSpec ? isOfficialRepo(urlOrSpec) : false,
92
+ outcome: outcome as SafeString,
93
+ duration_ms: Math.round(durationMs),
94
+ ...(errorKind && { error_kind: errorKind as SafeString }),
95
+ })
96
+ }
97
+
98
+ /**
99
+ * Classify an error into a stable bucket for the error_kind field. Keeps
100
+ * cardinality bounded — raw error messages would explode dashboard grouping.
101
+ *
102
+ * Handles both axios Error objects (Node.js error codes like ENOTFOUND) and
103
+ * git stderr strings (human phrases like "Could not resolve host"). DNS
104
+ * checked BEFORE timeout because gitClone's error enhancement at
105
+ * marketplaceManager.ts:~950 rewrites DNS failures to include the word
106
+ * "timeout" — ordering the other way would misclassify git DNS as timeout.
107
+ */
108
+ export function classifyFetchError(error: unknown): string {
109
+ const msg = String((error as { message?: unknown })?.message ?? error)
110
+ if (
111
+ /ENOTFOUND|ECONNREFUSED|EAI_AGAIN|Could not resolve host|Connection refused/i.test(
112
+ msg,
113
+ )
114
+ ) {
115
+ return 'dns_or_refused'
116
+ }
117
+ if (/ETIMEDOUT|timed out|timeout/i.test(msg)) return 'timeout'
118
+ if (
119
+ /ECONNRESET|socket hang up|Connection reset by peer|remote end hung up/i.test(
120
+ msg,
121
+ )
122
+ ) {
123
+ return 'conn_reset'
124
+ }
125
+ if (/403|401|authentication|permission denied/i.test(msg)) return 'auth'
126
+ if (/404|not found|repository not found/i.test(msg)) return 'not_found'
127
+ if (/certificate|SSL|TLS|unable to get local issuer/i.test(msg)) return 'tls'
128
+ // Schema validation throws "Invalid response format" (install_counts) —
129
+ // distinguish from true unknowns so the dashboard can
130
+ // see "server sent garbage" separately.
131
+ if (/Invalid response format|Invalid marketplace schema/i.test(msg)) {
132
+ return 'invalid_schema'
133
+ }
134
+ return 'other'
135
+ }