@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,69 @@
1
+ /**
2
+ * Utility for checking git availability.
3
+ *
4
+ * Git is required for installing GitHub-based marketplaces. This module
5
+ * provides a memoized check to determine if git is available on the system.
6
+ */
7
+
8
+ import memoize from 'lodash-es/memoize.js'
9
+ import { which } from '../which.js'
10
+
11
+ /**
12
+ * Check if a command is available in PATH.
13
+ *
14
+ * Uses which to find the actual executable without executing it.
15
+ * This is a security best practice to avoid executing arbitrary code
16
+ * in untrusted directories.
17
+ *
18
+ * @param command - The command to check for
19
+ * @returns True if the command exists and is executable
20
+ */
21
+ async function isCommandAvailable(command: string): Promise<boolean> {
22
+ try {
23
+ return !!(await which(command))
24
+ } catch {
25
+ return false
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Check if git is available on the system.
31
+ *
32
+ * This is memoized so repeated calls within a session return the cached result.
33
+ * Git availability is unlikely to change during a single CLI session.
34
+ *
35
+ * Only checks PATH — does not exec git. On macOS this means the /usr/bin/git
36
+ * xcrun shim passes even without Xcode CLT installed; callers that hit
37
+ * `xcrun: error:` at exec time should call markGitUnavailable() so the rest
38
+ * of the session behaves as though git is absent.
39
+ *
40
+ * @returns True if git is installed and executable
41
+ */
42
+ export const checkGitAvailable = memoize(async (): Promise<boolean> => {
43
+ return isCommandAvailable('git')
44
+ })
45
+
46
+ /**
47
+ * Force the memoized git-availability check to return false for the rest of
48
+ * the session.
49
+ *
50
+ * Call this when a git invocation fails in a way that indicates the binary
51
+ * exists on PATH but cannot actually run — the macOS xcrun shim being the
52
+ * main case (`xcrun: error: invalid active developer path`). Subsequent
53
+ * checkGitAvailable() calls then short-circuit to false, so downstream code
54
+ * that guards on git availability skips cleanly instead of failing repeatedly
55
+ * with the same exec error.
56
+ *
57
+ * lodash memoize uses a no-arg cache key of undefined.
58
+ */
59
+ export function markGitUnavailable(): void {
60
+ checkGitAvailable.cache?.set?.(undefined, Promise.resolve(false))
61
+ }
62
+
63
+ /**
64
+ * Clear the git availability cache.
65
+ * Used for testing purposes.
66
+ */
67
+ export function clearGitAvailabilityCache(): void {
68
+ checkGitAvailable.cache?.clear?.()
69
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Plugin installation for headless/CCR mode.
3
+ *
4
+ * This module provides plugin installation without AppState updates,
5
+ * suitable for non-interactive environments like CCR.
6
+ *
7
+ * When CLAUDE_CODE_PLUGIN_USE_ZIP_CACHE is enabled, plugins are stored as
8
+ * ZIPs on a mounted volume. The storage layer (pluginLoader.ts) handles
9
+ * ZIP creation on install and extraction on load transparently.
10
+ */
11
+
12
+ import { logEvent } from '../../services/analytics/index.js'
13
+ import { registerCleanup } from '../cleanupRegistry.js'
14
+ import { logForDebugging } from '../debug.js'
15
+ import { withDiagnosticsTiming } from '../diagLogs.js'
16
+ import { getFsImplementation } from '../fsOperations.js'
17
+ import { logError } from '../log.js'
18
+ import {
19
+ clearMarketplacesCache,
20
+ getDeclaredMarketplaces,
21
+ registerSeedMarketplaces,
22
+ } from './marketplaceManager.js'
23
+ import { detectAndUninstallDelistedPlugins } from './pluginBlocklist.js'
24
+ import { clearPluginCache } from './pluginLoader.js'
25
+ import { reconcileMarketplaces } from './reconciler.js'
26
+ import {
27
+ cleanupSessionPluginCache,
28
+ getZipCacheMarketplacesDir,
29
+ getZipCachePluginsDir,
30
+ isMarketplaceSourceSupportedByZipCache,
31
+ isPluginZipCacheEnabled,
32
+ } from './zipCache.js'
33
+ import { syncMarketplacesToZipCache } from './zipCacheAdapters.js'
34
+
35
+ /**
36
+ * Install plugins for headless/CCR mode.
37
+ *
38
+ * This is the headless equivalent of performBackgroundPluginInstallations(),
39
+ * but without AppState updates (no UI to update in headless mode).
40
+ *
41
+ * @returns true if any plugins were installed (caller should refresh MCP)
42
+ */
43
+ export async function installPluginsForHeadless(): Promise<boolean> {
44
+ const zipCacheMode = isPluginZipCacheEnabled()
45
+ logForDebugging(
46
+ `installPluginsForHeadless: starting${zipCacheMode ? ' (zip cache mode)' : ''}`,
47
+ )
48
+
49
+ // Register seed marketplaces (CLAUDE_CODE_PLUGIN_SEED_DIR) before diffing.
50
+ // Idempotent; no-op if seed not configured. Without this, findMissingMarketplaces
51
+ // would see seed entries as missing → clone → defeats seed's purpose.
52
+ //
53
+ // If registration changed state, clear caches so the early plugin-load pass
54
+ // (which runs during CLI startup before this function) doesn't keep stale
55
+ // "marketplace not found" results. Without this clear, a first-boot headless
56
+ // run with a seed-cached plugin would show 0 plugin commands/agents/skills
57
+ // in the init message even though the seed has everything.
58
+ const seedChanged = await registerSeedMarketplaces()
59
+ if (seedChanged) {
60
+ clearMarketplacesCache()
61
+ clearPluginCache('headlessPluginInstall: seed marketplaces registered')
62
+ }
63
+
64
+ // Ensure zip cache directory structure exists
65
+ if (zipCacheMode) {
66
+ await getFsImplementation().mkdir(getZipCacheMarketplacesDir())
67
+ await getFsImplementation().mkdir(getZipCachePluginsDir())
68
+ }
69
+
70
+ // Declared now includes an implicit claude-plugins-official entry when any
71
+ // enabled plugin references it (see getDeclaredMarketplaces). This routes
72
+ // the official marketplace through the same reconciler path as any other —
73
+ // which composes correctly with CLAUDE_CODE_PLUGIN_SEED_DIR: seed registers
74
+ // it in known_marketplaces.json, reconciler diff sees it as upToDate, no clone.
75
+ const declaredCount = Object.keys(getDeclaredMarketplaces()).length
76
+
77
+ const metrics = {
78
+ marketplaces_installed: 0,
79
+ delisted_count: 0,
80
+ }
81
+
82
+ // Initialize from seedChanged so the caller (print.ts) calls
83
+ // refreshPluginState() → clearCommandsCache/clearAgentDefinitionsCache
84
+ // when seed registration added marketplaces. Without this, the caller
85
+ // only refreshes when an actual plugin install happened.
86
+ let pluginsChanged = seedChanged
87
+
88
+ try {
89
+ if (declaredCount === 0) {
90
+ logForDebugging('installPluginsForHeadless: no marketplaces declared')
91
+ } else {
92
+ // Reconcile declared marketplaces (settings intent + implicit official)
93
+ // with materialized state. Zip cache: skip unsupported source types.
94
+ const reconcileResult = await withDiagnosticsTiming(
95
+ 'headless_marketplace_reconcile',
96
+ () =>
97
+ reconcileMarketplaces({
98
+ skip: zipCacheMode
99
+ ? (_name, source) =>
100
+ !isMarketplaceSourceSupportedByZipCache(source)
101
+ : undefined,
102
+ onProgress: event => {
103
+ if (event.type === 'installed') {
104
+ logForDebugging(
105
+ `installPluginsForHeadless: installed marketplace ${event.name}`,
106
+ )
107
+ } else if (event.type === 'failed') {
108
+ logForDebugging(
109
+ `installPluginsForHeadless: failed to install marketplace ${event.name}: ${event.error}`,
110
+ )
111
+ }
112
+ },
113
+ }),
114
+ r => ({
115
+ installed_count: r.installed.length,
116
+ updated_count: r.updated.length,
117
+ failed_count: r.failed.length,
118
+ skipped_count: r.skipped.length,
119
+ }),
120
+ )
121
+
122
+ if (reconcileResult.skipped.length > 0) {
123
+ logForDebugging(
124
+ `installPluginsForHeadless: skipped ${reconcileResult.skipped.length} marketplace(s) unsupported by zip cache: ${reconcileResult.skipped.join(', ')}`,
125
+ )
126
+ }
127
+
128
+ const marketplacesChanged =
129
+ reconcileResult.installed.length + reconcileResult.updated.length
130
+
131
+ // Clear caches so newly-installed marketplace plugins are discoverable.
132
+ // Plugin caching is the loader's job — after caches clear, the caller's
133
+ // refreshPluginState() → loadAllPlugins() will cache any missing plugins
134
+ // from the newly-materialized marketplaces.
135
+ if (marketplacesChanged > 0) {
136
+ clearMarketplacesCache()
137
+ clearPluginCache('headlessPluginInstall: marketplaces reconciled')
138
+ pluginsChanged = true
139
+ }
140
+
141
+ metrics.marketplaces_installed = marketplacesChanged
142
+ }
143
+
144
+ // Zip cache: save marketplace JSONs for offline access on ephemeral containers.
145
+ // Runs unconditionally so that steady-state containers (all plugins installed)
146
+ // still sync marketplace data that may have been cloned in a previous run.
147
+ if (zipCacheMode) {
148
+ await syncMarketplacesToZipCache()
149
+ }
150
+
151
+ // Delisting enforcement
152
+ const newlyDelisted = await detectAndUninstallDelistedPlugins()
153
+ metrics.delisted_count = newlyDelisted.length
154
+ if (newlyDelisted.length > 0) {
155
+ pluginsChanged = true
156
+ }
157
+
158
+ if (pluginsChanged) {
159
+ clearPluginCache('headlessPluginInstall: plugins changed')
160
+ }
161
+
162
+ // Zip cache: register session cleanup for extracted plugin temp dirs
163
+ if (zipCacheMode) {
164
+ registerCleanup(cleanupSessionPluginCache)
165
+ }
166
+
167
+ return pluginsChanged
168
+ } catch (error) {
169
+ logError(error)
170
+ return false
171
+ } finally {
172
+ logEvent('tengu_headless_plugin_install', metrics)
173
+ }
174
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Plugin-hint recommendations.
3
+ *
4
+ * Companion to lspRecommendation.ts: where LSP recommendations are triggered
5
+ * by file edits, plugin hints are triggered by CLIs/SDKs emitting a
6
+ * `<claude-code-hint />` tag to stderr (detected by the Bash/PowerShell tools).
7
+ *
8
+ * State persists in GlobalConfig.claudeCodeHints — a show-once record per
9
+ * plugin and a disabled flag (user picked "don't show again"). Official-
10
+ * marketplace filtering is hardcoded for v1.
11
+ */
12
+
13
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
14
+ import {
15
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
16
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
17
+ logEvent,
18
+ } from '../../services/analytics/index.js'
19
+ import {
20
+ type ClaudeCodeHint,
21
+ hasShownHintThisSession,
22
+ setPendingHint,
23
+ } from '../claudeCodeHints.js'
24
+ import { getGlobalConfig, saveGlobalConfig } from '../config.js'
25
+ import { logForDebugging } from '../debug.js'
26
+ import { isPluginInstalled } from './installedPluginsManager.js'
27
+ import { getPluginById } from './marketplaceManager.js'
28
+ import {
29
+ isOfficialMarketplaceName,
30
+ parsePluginIdentifier,
31
+ } from './pluginIdentifier.js'
32
+ import { isPluginBlockedByPolicy } from './pluginPolicy.js'
33
+
34
+ /**
35
+ * Hard cap on `claudeCodeHints.plugin[]` — bounds config growth. Each shown
36
+ * plugin appends one slug; past this point we stop prompting (and stop
37
+ * appending) rather than let the config grow without limit.
38
+ */
39
+ const MAX_SHOWN_PLUGINS = 100
40
+
41
+ export type PluginHintRecommendation = {
42
+ pluginId: string
43
+ pluginName: string
44
+ marketplaceName: string
45
+ pluginDescription?: string
46
+ sourceCommand: string
47
+ }
48
+
49
+ /**
50
+ * Pre-store gate called by shell tools when a `type="plugin"` hint is detected.
51
+ * Drops the hint if:
52
+ *
53
+ * - a dialog has already been shown this session
54
+ * - user has disabled hints
55
+ * - the shown-plugins list has hit the config-growth cap
56
+ * - plugin slug doesn't parse as `name@marketplace`
57
+ * - marketplace isn't official (hardcoded for v1)
58
+ * - plugin is already installed
59
+ * - plugin was already shown in a prior session
60
+ *
61
+ * Synchronous on purpose — shell tools shouldn't await a marketplace lookup
62
+ * just to strip a stderr line. The async marketplace-cache check happens
63
+ * later in resolvePluginHint (hook side).
64
+ */
65
+ export function maybeRecordPluginHint(hint: ClaudeCodeHint): void {
66
+ if (!getFeatureValue_CACHED_MAY_BE_STALE('tengu_lapis_finch', false)) return
67
+ if (hasShownHintThisSession()) return
68
+
69
+ const state = getGlobalConfig().claudeCodeHints
70
+ if (state?.disabled) return
71
+
72
+ const shown = state?.plugin ?? []
73
+ if (shown.length >= MAX_SHOWN_PLUGINS) return
74
+
75
+ const pluginId = hint.value
76
+ const { name, marketplace } = parsePluginIdentifier(pluginId)
77
+ if (!name || !marketplace) return
78
+ if (!isOfficialMarketplaceName(marketplace)) return
79
+ if (shown.includes(pluginId)) return
80
+ if (isPluginInstalled(pluginId)) return
81
+ if (isPluginBlockedByPolicy(pluginId)) return
82
+
83
+ // Bound repeat lookups on the same slug — a CLI that emits on every
84
+ // invocation shouldn't trigger N resolve cycles for the same plugin.
85
+ if (triedThisSession.has(pluginId)) return
86
+ triedThisSession.add(pluginId)
87
+
88
+ setPendingHint(hint)
89
+ }
90
+
91
+ const triedThisSession = new Set<string>()
92
+
93
+ /** Test-only reset. */
94
+ export function _resetHintRecommendationForTesting(): void {
95
+ triedThisSession.clear()
96
+ }
97
+
98
+ /**
99
+ * Resolve the pending hint to a renderable recommendation. Runs the async
100
+ * marketplace lookup that the sync pre-store gate skipped. Returns null if
101
+ * the plugin isn't in the marketplace cache — the hint is discarded.
102
+ */
103
+ export async function resolvePluginHint(
104
+ hint: ClaudeCodeHint,
105
+ ): Promise<PluginHintRecommendation | null> {
106
+ const pluginId = hint.value
107
+ const { name, marketplace } = parsePluginIdentifier(pluginId)
108
+
109
+ const pluginData = await getPluginById(pluginId)
110
+
111
+ logEvent('tengu_plugin_hint_detected', {
112
+ _PROTO_plugin_name: (name ??
113
+ '') as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
114
+ _PROTO_marketplace_name: (marketplace ??
115
+ '') as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
116
+ result: (pluginData
117
+ ? 'passed'
118
+ : 'not_in_cache') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
119
+ })
120
+
121
+ if (!pluginData) {
122
+ logForDebugging(
123
+ `[hintRecommendation] ${pluginId} not found in marketplace cache`,
124
+ )
125
+ return null
126
+ }
127
+
128
+ return {
129
+ pluginId,
130
+ pluginName: pluginData.entry.name,
131
+ marketplaceName: marketplace ?? '',
132
+ pluginDescription: pluginData.entry.description,
133
+ sourceCommand: hint.sourceCommand,
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Record that a prompt for this plugin was surfaced. Called regardless of
139
+ * the user's yes/no response — show-once semantics.
140
+ */
141
+ export function markHintPluginShown(pluginId: string): void {
142
+ saveGlobalConfig(current => {
143
+ const existing = current.claudeCodeHints?.plugin ?? []
144
+ if (existing.includes(pluginId)) return current
145
+ return {
146
+ ...current,
147
+ claudeCodeHints: {
148
+ ...current.claudeCodeHints,
149
+ plugin: [...existing, pluginId],
150
+ },
151
+ }
152
+ })
153
+ }
154
+
155
+ /** Called when the user picks "don't show plugin installation hints again". */
156
+ export function disableHintRecommendations(): void {
157
+ saveGlobalConfig(current => {
158
+ if (current.claudeCodeHints?.disabled) return current
159
+ return {
160
+ ...current,
161
+ claudeCodeHints: { ...current.claudeCodeHints, disabled: true },
162
+ }
163
+ })
164
+ }
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Plugin install counts data layer
3
+ *
4
+ * This module fetches and caches plugin install counts from the official
5
+ * Claude plugins statistics repository. The cache is refreshed if older
6
+ * than 24 hours.
7
+ *
8
+ * Cache location: ~/.claude/plugins/install-counts-cache.json
9
+ */
10
+
11
+ import axios from 'src/utils/axios.js'
12
+ import { randomBytes } from 'crypto'
13
+ import { readFile, rename, unlink, writeFile } from 'fs/promises'
14
+ import { join } from 'path'
15
+ import { logForDebugging } from '../debug.js'
16
+ import { errorMessage, getErrnoCode } from '../errors.js'
17
+ import { getFsImplementation } from '../fsOperations.js'
18
+ import { logError } from '../log.js'
19
+ import { jsonParse, jsonStringify } from '../slowOperations.js'
20
+ import { classifyFetchError, logPluginFetch } from './fetchTelemetry.js'
21
+ import { getPluginsDirectory } from './pluginDirectories.js'
22
+
23
+ const INSTALL_COUNTS_CACHE_VERSION = 1
24
+ const INSTALL_COUNTS_CACHE_FILENAME = 'install-counts-cache.json'
25
+ const INSTALL_COUNTS_URL =
26
+ 'https://raw.githubusercontent.com/anthropics/claude-plugins-official/refs/heads/stats/stats/plugin-installs.json'
27
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours in milliseconds
28
+
29
+ /**
30
+ * Structure of the install counts cache file
31
+ */
32
+ type InstallCountsCache = {
33
+ version: number
34
+ fetchedAt: string // ISO timestamp
35
+ counts: Array<{
36
+ plugin: string // "pluginName@marketplace"
37
+ unique_installs: number
38
+ }>
39
+ }
40
+
41
+ /**
42
+ * Expected structure of the GitHub stats response
43
+ */
44
+ type GitHubStatsResponse = {
45
+ plugins: Array<{
46
+ plugin: string
47
+ unique_installs: number
48
+ }>
49
+ }
50
+
51
+ /**
52
+ * Get the path to the install counts cache file
53
+ */
54
+ function getInstallCountsCachePath(): string {
55
+ return join(getPluginsDirectory(), INSTALL_COUNTS_CACHE_FILENAME)
56
+ }
57
+
58
+ /**
59
+ * Load the install counts cache from disk.
60
+ * Returns null if the file doesn't exist, is invalid, or is stale (>24h old).
61
+ */
62
+ async function loadInstallCountsCache(): Promise<InstallCountsCache | null> {
63
+ const cachePath = getInstallCountsCachePath()
64
+
65
+ try {
66
+ const content = await readFile(cachePath, { encoding: 'utf-8' })
67
+ const parsed = jsonParse(content) as unknown
68
+
69
+ // Validate basic structure
70
+ if (
71
+ typeof parsed !== 'object' ||
72
+ parsed === null ||
73
+ !('version' in parsed) ||
74
+ !('fetchedAt' in parsed) ||
75
+ !('counts' in parsed)
76
+ ) {
77
+ logForDebugging('Install counts cache has invalid structure')
78
+ return null
79
+ }
80
+
81
+ const cache = parsed as {
82
+ version: unknown
83
+ fetchedAt: unknown
84
+ counts: unknown
85
+ }
86
+
87
+ // Validate version
88
+ if (cache.version !== INSTALL_COUNTS_CACHE_VERSION) {
89
+ logForDebugging(
90
+ `Install counts cache version mismatch (got ${cache.version}, expected ${INSTALL_COUNTS_CACHE_VERSION})`,
91
+ )
92
+ return null
93
+ }
94
+
95
+ // Validate fetchedAt and counts
96
+ if (typeof cache.fetchedAt !== 'string' || !Array.isArray(cache.counts)) {
97
+ logForDebugging('Install counts cache has invalid structure')
98
+ return null
99
+ }
100
+
101
+ // Validate fetchedAt is a valid date
102
+ const fetchedAt = new Date(cache.fetchedAt).getTime()
103
+ if (Number.isNaN(fetchedAt)) {
104
+ logForDebugging('Install counts cache has invalid fetchedAt timestamp')
105
+ return null
106
+ }
107
+
108
+ // Validate count entries have required fields
109
+ const validCounts = cache.counts.every(
110
+ (entry): entry is { plugin: string; unique_installs: number } =>
111
+ typeof entry === 'object' &&
112
+ entry !== null &&
113
+ typeof entry.plugin === 'string' &&
114
+ typeof entry.unique_installs === 'number',
115
+ )
116
+ if (!validCounts) {
117
+ logForDebugging('Install counts cache has malformed entries')
118
+ return null
119
+ }
120
+
121
+ // Check if cache is stale (>24 hours old)
122
+ const now = Date.now()
123
+ if (now - fetchedAt > CACHE_TTL_MS) {
124
+ logForDebugging('Install counts cache is stale (>24h old)')
125
+ return null
126
+ }
127
+
128
+ // Return validated cache
129
+ return {
130
+ version: cache.version as number,
131
+ fetchedAt: cache.fetchedAt,
132
+ counts: cache.counts,
133
+ }
134
+ } catch (error) {
135
+ const code = getErrnoCode(error)
136
+ if (code !== 'ENOENT') {
137
+ logForDebugging(
138
+ `Failed to load install counts cache: ${errorMessage(error)}`,
139
+ )
140
+ }
141
+ return null
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Save the install counts cache to disk atomically.
147
+ * Uses a temp file + rename pattern to prevent corruption.
148
+ */
149
+ async function saveInstallCountsCache(
150
+ cache: InstallCountsCache,
151
+ ): Promise<void> {
152
+ const cachePath = getInstallCountsCachePath()
153
+ const tempPath = `${cachePath}.${randomBytes(8).toString('hex')}.tmp`
154
+
155
+ try {
156
+ // Ensure the plugins directory exists
157
+ const pluginsDir = getPluginsDirectory()
158
+ await getFsImplementation().mkdir(pluginsDir)
159
+
160
+ // Write to temp file
161
+ const content = jsonStringify(cache, null, 2)
162
+ await writeFile(tempPath, content, {
163
+ encoding: 'utf-8',
164
+ mode: 0o600,
165
+ })
166
+
167
+ // Atomic rename
168
+ await rename(tempPath, cachePath)
169
+ logForDebugging('Install counts cache saved successfully')
170
+ } catch (error) {
171
+ logError(error)
172
+ // Clean up temp file if it exists
173
+ try {
174
+ await unlink(tempPath)
175
+ } catch {
176
+ // Ignore cleanup errors
177
+ }
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Fetch install counts from GitHub stats repository
183
+ */
184
+ async function fetchInstallCountsFromGitHub(): Promise<
185
+ Array<{ plugin: string; unique_installs: number }>
186
+ > {
187
+ logForDebugging(`Fetching install counts from ${INSTALL_COUNTS_URL}`)
188
+
189
+ const started = performance.now()
190
+ try {
191
+ const response = await axios.get<GitHubStatsResponse>(INSTALL_COUNTS_URL, {
192
+ timeout: 10000,
193
+ })
194
+
195
+ if (!response.data?.plugins || !Array.isArray(response.data.plugins)) {
196
+ throw new Error('Invalid response format from install counts API')
197
+ }
198
+
199
+ logPluginFetch(
200
+ 'install_counts',
201
+ INSTALL_COUNTS_URL,
202
+ 'success',
203
+ performance.now() - started,
204
+ )
205
+ return response.data.plugins
206
+ } catch (error) {
207
+ logPluginFetch(
208
+ 'install_counts',
209
+ INSTALL_COUNTS_URL,
210
+ 'failure',
211
+ performance.now() - started,
212
+ classifyFetchError(error),
213
+ )
214
+ throw error
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Get plugin install counts as a Map.
220
+ * Uses cached data if available and less than 24 hours old.
221
+ * Returns null on errors so UI can hide counts rather than show misleading zeros.
222
+ *
223
+ * @returns Map of plugin ID (name@marketplace) to install count, or null if unavailable
224
+ */
225
+ export async function getInstallCounts(): Promise<Map<string, number> | null> {
226
+ // Try to load from cache first
227
+ const cache = await loadInstallCountsCache()
228
+ if (cache) {
229
+ logForDebugging('Using cached install counts')
230
+ logPluginFetch('install_counts', INSTALL_COUNTS_URL, 'cache_hit', 0)
231
+ const map = new Map<string, number>()
232
+ for (const entry of cache.counts) {
233
+ map.set(entry.plugin, entry.unique_installs)
234
+ }
235
+ return map
236
+ }
237
+
238
+ // Cache miss or stale - fetch from GitHub
239
+ try {
240
+ const counts = await fetchInstallCountsFromGitHub()
241
+
242
+ // Save to cache
243
+ const newCache: InstallCountsCache = {
244
+ version: INSTALL_COUNTS_CACHE_VERSION,
245
+ fetchedAt: new Date().toISOString(),
246
+ counts,
247
+ }
248
+ await saveInstallCountsCache(newCache)
249
+
250
+ // Convert to Map
251
+ const map = new Map<string, number>()
252
+ for (const entry of counts) {
253
+ map.set(entry.plugin, entry.unique_installs)
254
+ }
255
+ return map
256
+ } catch (error) {
257
+ // Log error and return null so UI can hide counts
258
+ logError(error)
259
+ logForDebugging(`Failed to fetch install counts: ${errorMessage(error)}`)
260
+ return null
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Format an install count for display.
266
+ *
267
+ * @param count - The raw install count
268
+ * @returns Formatted string:
269
+ * - <1000: raw number (e.g., "42")
270
+ * - >=1000: K suffix with 1 decimal (e.g., "1.2K", "36.2K")
271
+ * - >=1000000: M suffix with 1 decimal (e.g., "1.2M")
272
+ */
273
+ export function formatInstallCount(count: number): string {
274
+ if (count < 1000) {
275
+ return String(count)
276
+ }
277
+
278
+ if (count < 1000000) {
279
+ const k = count / 1000
280
+ // Use toFixed(1) but remove trailing .0
281
+ const formatted = k.toFixed(1)
282
+ return formatted.endsWith('.0')
283
+ ? `${formatted.slice(0, -2)}K`
284
+ : `${formatted}K`
285
+ }
286
+
287
+ const m = count / 1000000
288
+ const formatted = m.toFixed(1)
289
+ return formatted.endsWith('.0')
290
+ ? `${formatted.slice(0, -2)}M`
291
+ : `${formatted}M`
292
+ }