@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,968 @@
1
+ import type {
2
+ McpbManifest,
3
+ McpbUserConfigurationOption,
4
+ } from '@anthropic-ai/mcpb'
5
+ import axios from 'src/utils/axios.js'
6
+ import { createHash } from 'crypto'
7
+ import { chmod, writeFile } from 'fs/promises'
8
+ import { dirname, join } from 'path'
9
+ import type { McpServerConfig } from '../../services/mcp/types.js'
10
+ import { logForDebugging } from '../debug.js'
11
+ import { parseAndValidateManifestFromBytes } from '../dxt/helpers.js'
12
+ import { parseZipModes, unzipFile } from '../dxt/zip.js'
13
+ import { errorMessage, getErrnoCode, isENOENT, toError } from '../errors.js'
14
+ import { getFsImplementation } from '../fsOperations.js'
15
+ import { logError } from '../log.js'
16
+ import { getSecureStorage } from '../secureStorage/index.js'
17
+ import {
18
+ getSettings_DEPRECATED,
19
+ updateSettingsForSource,
20
+ } from '../settings/settings.js'
21
+ import { jsonParse, jsonStringify } from '../slowOperations.js'
22
+ import { getSystemDirectories } from '../systemDirectories.js'
23
+ import { classifyFetchError, logPluginFetch } from './fetchTelemetry.js'
24
+ /**
25
+ * User configuration values for MCPB
26
+ */
27
+ export type UserConfigValues = Record<
28
+ string,
29
+ string | number | boolean | string[]
30
+ >
31
+
32
+ /**
33
+ * User configuration schema from DXT manifest
34
+ */
35
+ export type UserConfigSchema = Record<string, McpbUserConfigurationOption>
36
+
37
+ /**
38
+ * Result of loading an MCPB file (success case)
39
+ */
40
+ export type McpbLoadResult = {
41
+ manifest: McpbManifest
42
+ mcpConfig: McpServerConfig
43
+ extractedPath: string
44
+ contentHash: string
45
+ }
46
+
47
+ /**
48
+ * Result when MCPB needs user configuration
49
+ */
50
+ export type McpbNeedsConfigResult = {
51
+ status: 'needs-config'
52
+ manifest: McpbManifest
53
+ extractedPath: string
54
+ contentHash: string
55
+ configSchema: UserConfigSchema
56
+ existingConfig: UserConfigValues
57
+ validationErrors: string[]
58
+ }
59
+
60
+ /**
61
+ * Metadata stored for each cached MCPB
62
+ */
63
+ export type McpbCacheMetadata = {
64
+ source: string
65
+ contentHash: string
66
+ extractedPath: string
67
+ cachedAt: string
68
+ lastChecked: string
69
+ }
70
+
71
+ /**
72
+ * Progress callback for download and extraction operations
73
+ */
74
+ export type ProgressCallback = (status: string) => void
75
+
76
+ /**
77
+ * Check if a source string is an MCPB file reference
78
+ */
79
+ export function isMcpbSource(source: string): boolean {
80
+ return source.endsWith('.mcpb') || source.endsWith('.dxt')
81
+ }
82
+
83
+ /**
84
+ * Check if a source is a URL
85
+ */
86
+ function isUrl(source: string): boolean {
87
+ return source.startsWith('http://') || source.startsWith('https://')
88
+ }
89
+
90
+ /**
91
+ * Generate content hash for an MCPB file
92
+ */
93
+ function generateContentHash(data: Uint8Array): string {
94
+ return createHash('sha256').update(data).digest('hex').substring(0, 16)
95
+ }
96
+
97
+ /**
98
+ * Get cache directory for MCPB files
99
+ */
100
+ function getMcpbCacheDir(pluginPath: string): string {
101
+ return join(pluginPath, '.mcpb-cache')
102
+ }
103
+
104
+ /**
105
+ * Get metadata file path for cached MCPB
106
+ */
107
+ function getMetadataPath(cacheDir: string, source: string): string {
108
+ const sourceHash = createHash('md5')
109
+ .update(source)
110
+ .digest('hex')
111
+ .substring(0, 8)
112
+ return join(cacheDir, `${sourceHash}.metadata.json`)
113
+ }
114
+
115
+ /**
116
+ * Compose the secureStorage key for a per-server secret bucket.
117
+ * `pluginSecrets` is a flat map — per-server secrets share it with top-level
118
+ * plugin options (pluginOptionsStorage.ts) using a `${pluginId}/${server}`
119
+ * composite key. `/` can't appear in plugin IDs (`name@marketplace`) or
120
+ * server names (MCP identifier constraints), so it's unambiguous. Keeps the
121
+ * SecureStorageData schema unchanged and the single-keychain-entry size
122
+ * budget (~2KB stdin-safe, see INC-3028) shared across all plugin secrets.
123
+ */
124
+ function serverSecretsKey(pluginId: string, serverName: string): string {
125
+ return `${pluginId}/${serverName}`
126
+ }
127
+
128
+ /**
129
+ * Load user configuration for an MCP server, merging non-sensitive values
130
+ * (from settings.json) with sensitive values (from secureStorage keychain).
131
+ * secureStorage wins on collision — schema determines destination so
132
+ * collision shouldn't happen, but if a user hand-edits settings.json we
133
+ * trust the more secure source.
134
+ *
135
+ * Returns null only if NEITHER source has anything — callers skip
136
+ * ${user_config.X} substitution in that case.
137
+ *
138
+ * @param pluginId - Plugin identifier in "plugin@marketplace" format
139
+ * @param serverName - MCP server name from DXT manifest
140
+ */
141
+ export function loadMcpServerUserConfig(
142
+ pluginId: string,
143
+ serverName: string,
144
+ ): UserConfigValues | null {
145
+ try {
146
+ const settings = getSettings_DEPRECATED()
147
+ const nonSensitive =
148
+ settings.pluginConfigs?.[pluginId]?.mcpServers?.[serverName]
149
+
150
+ const sensitive =
151
+ getSecureStorage().read()?.pluginSecrets?.[
152
+ serverSecretsKey(pluginId, serverName)
153
+ ]
154
+
155
+ if (!nonSensitive && !sensitive) {
156
+ return null
157
+ }
158
+
159
+ logForDebugging(
160
+ `Loaded user config for ${pluginId}/${serverName} (settings + secureStorage)`,
161
+ )
162
+ return { ...nonSensitive, ...sensitive }
163
+ } catch (error) {
164
+ const errorObj = toError(error)
165
+ logError(errorObj)
166
+ logForDebugging(
167
+ `Failed to load user config for ${pluginId}/${serverName}: ${error}`,
168
+ { level: 'error' },
169
+ )
170
+ return null
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Save user configuration for an MCP server, splitting by `schema[key].sensitive`.
176
+ * Mirrors savePluginOptions (pluginOptionsStorage.ts:90) for top-level options:
177
+ * - `sensitive: true` → secureStorage (keychain on macOS, .credentials.json 0600 elsewhere)
178
+ * - everything else → settings.json pluginConfigs[pluginId].mcpServers[serverName]
179
+ *
180
+ * Without this split, per-channel `sensitive: true` was a false sense of
181
+ * security — the dialog masked the input but the save went to plaintext
182
+ * settings.json anyway. H1 #3617646 (Telegram/Discord bot tokens in
183
+ * world-readable .env) surfaced this as the gap to close.
184
+ *
185
+ * Writes are skipped if nothing in that category is present.
186
+ *
187
+ * @param pluginId - Plugin identifier in "plugin@marketplace" format
188
+ * @param serverName - MCP server name from DXT manifest
189
+ * @param config - User configuration values
190
+ * @param schema - The userConfig schema for this server (manifest.user_config
191
+ * or channels[].userConfig) — drives the sensitive/non-sensitive split
192
+ */
193
+ export function saveMcpServerUserConfig(
194
+ pluginId: string,
195
+ serverName: string,
196
+ config: UserConfigValues,
197
+ schema: UserConfigSchema,
198
+ ): void {
199
+ try {
200
+ const nonSensitive: UserConfigValues = {}
201
+ const sensitive: Record<string, string> = {}
202
+
203
+ for (const [key, value] of Object.entries(config)) {
204
+ if (schema[key]?.sensitive === true) {
205
+ sensitive[key] = String(value)
206
+ } else {
207
+ nonSensitive[key] = value
208
+ }
209
+ }
210
+
211
+ // Scrub ONLY keys we're writing in this call. Covers both directions
212
+ // across schema-version flips:
213
+ // - sensitive→secureStorage ⇒ remove stale plaintext from settings.json
214
+ // - nonSensitive→settings.json ⇒ remove stale entry from secureStorage
215
+ // (otherwise loadMcpServerUserConfig's {...nonSensitive, ...sensitive}
216
+ // would let the stale secureStorage value win on next read)
217
+ // Partial `config` (user only re-enters one field) leaves other fields
218
+ // untouched in BOTH stores — defense-in-depth against future callers.
219
+ const sensitiveKeysInThisSave = new Set(Object.keys(sensitive))
220
+ const nonSensitiveKeysInThisSave = new Set(Object.keys(nonSensitive))
221
+
222
+ // Sensitive → secureStorage FIRST. If this fails (keychain locked,
223
+ // .credentials.json perms), throw before touching settings.json — the
224
+ // old plaintext stays as a fallback instead of losing BOTH copies.
225
+ //
226
+ // Also scrub non-sensitive keys from secureStorage — schema flipped
227
+ // sensitive→false and they're being written to settings.json now. Without
228
+ // this, loadMcpServerUserConfig's merge would let the stale secureStorage
229
+ // value win on next read.
230
+ const storage = getSecureStorage()
231
+ const k = serverSecretsKey(pluginId, serverName)
232
+ const existingInSecureStorage =
233
+ storage.read()?.pluginSecrets?.[k] ?? undefined
234
+ const secureScrubbed = existingInSecureStorage
235
+ ? Object.fromEntries(
236
+ Object.entries(existingInSecureStorage).filter(
237
+ ([key]) => !nonSensitiveKeysInThisSave.has(key),
238
+ ),
239
+ )
240
+ : undefined
241
+ const needSecureScrub =
242
+ secureScrubbed &&
243
+ existingInSecureStorage &&
244
+ Object.keys(secureScrubbed).length !==
245
+ Object.keys(existingInSecureStorage).length
246
+ if (Object.keys(sensitive).length > 0 || needSecureScrub) {
247
+ const existing = storage.read() ?? {}
248
+ if (!existing.pluginSecrets) {
249
+ existing.pluginSecrets = {}
250
+ }
251
+ // secureStorage keyvault is a flat object — direct replace, no merge
252
+ // semantics to worry about (unlike settings.json's mergeWith).
253
+ existing.pluginSecrets[k] = {
254
+ ...secureScrubbed,
255
+ ...sensitive,
256
+ }
257
+ const result = storage.update(existing)
258
+ if (!result.success) {
259
+ throw new Error(
260
+ `Failed to save sensitive config to secure storage for ${k}`,
261
+ )
262
+ }
263
+ if (result.warning) {
264
+ logForDebugging(`Server secrets save warning: ${result.warning}`, {
265
+ level: 'warn',
266
+ })
267
+ }
268
+ if (needSecureScrub) {
269
+ logForDebugging(
270
+ `saveMcpServerUserConfig: scrubbed ${
271
+ Object.keys(existingInSecureStorage!).length -
272
+ Object.keys(secureScrubbed!).length
273
+ } stale non-sensitive key(s) from secureStorage for ${k}`,
274
+ )
275
+ }
276
+ }
277
+
278
+ // Non-sensitive → settings.json. Write whenever there are new non-sensitive
279
+ // values OR existing plaintext sensitive values to scrub — so reconfiguring
280
+ // a sensitive-only schema still cleans up the old settings.json. Runs
281
+ // AFTER the secureStorage write succeeded, so the scrub can't leave you
282
+ // with zero copies of the secret.
283
+ //
284
+ // updateSettingsForSource does mergeWith(diskSettings, ourSettings, ...)
285
+ // which PRESERVES destination keys absent from source — so simply omitting
286
+ // sensitive keys doesn't scrub them, the disk copy merges back in. Instead:
287
+ // set each sensitive key to explicit `undefined` — mergeWith (with the
288
+ // customizer at settings.ts:349) treats explicit undefined as a delete.
289
+ const settings = getSettings_DEPRECATED()
290
+ const existingInSettings =
291
+ settings.pluginConfigs?.[pluginId]?.mcpServers?.[serverName] ?? {}
292
+ const keysToScrubFromSettings = Object.keys(existingInSettings).filter(k =>
293
+ sensitiveKeysInThisSave.has(k),
294
+ )
295
+ if (
296
+ Object.keys(nonSensitive).length > 0 ||
297
+ keysToScrubFromSettings.length > 0
298
+ ) {
299
+ if (!settings.pluginConfigs) {
300
+ settings.pluginConfigs = {}
301
+ }
302
+ if (!settings.pluginConfigs[pluginId]) {
303
+ settings.pluginConfigs[pluginId] = {}
304
+ }
305
+ if (!settings.pluginConfigs[pluginId].mcpServers) {
306
+ settings.pluginConfigs[pluginId].mcpServers = {}
307
+ }
308
+ // Build the scrub-via-undefined map. The UserConfigValues type doesn't
309
+ // include undefined, but updateSettingsForSource's mergeWith customizer
310
+ // needs explicit undefined to delete — cast is deliberate internal
311
+ // plumbing (same rationale as deletePluginOptions in
312
+ // pluginOptionsStorage.ts:184, see CLAUDE.md's 10% case).
313
+ const scrubbed = Object.fromEntries(
314
+ keysToScrubFromSettings.map(k => [k, undefined]),
315
+ ) as Record<string, undefined>
316
+ settings.pluginConfigs[pluginId].mcpServers![serverName] = {
317
+ ...nonSensitive,
318
+ ...scrubbed,
319
+ } as UserConfigValues
320
+ const result = updateSettingsForSource('userSettings', settings)
321
+ if (result.error) {
322
+ throw result.error
323
+ }
324
+ if (keysToScrubFromSettings.length > 0) {
325
+ logForDebugging(
326
+ `saveMcpServerUserConfig: scrubbed ${keysToScrubFromSettings.length} plaintext sensitive key(s) from settings.json for ${pluginId}/${serverName}`,
327
+ )
328
+ }
329
+ }
330
+
331
+ logForDebugging(
332
+ `Saved user config for ${pluginId}/${serverName} (${Object.keys(nonSensitive).length} non-sensitive, ${Object.keys(sensitive).length} sensitive)`,
333
+ )
334
+ } catch (error) {
335
+ const errorObj = toError(error)
336
+ logError(errorObj)
337
+ throw new Error(
338
+ `Failed to save user configuration for ${pluginId}/${serverName}: ${errorObj.message}`,
339
+ )
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Validate user configuration values against DXT user_config schema
345
+ */
346
+ export function validateUserConfig(
347
+ values: UserConfigValues,
348
+ schema: UserConfigSchema,
349
+ ): { valid: boolean; errors: string[] } {
350
+ const errors: string[] = []
351
+
352
+ // Check each field in the schema
353
+ for (const [key, fieldSchema] of Object.entries(schema)) {
354
+ const value = values[key]
355
+
356
+ // Check required fields
357
+ if (fieldSchema.required && (value === undefined || value === '')) {
358
+ errors.push(`${fieldSchema.title || key} is required but not provided`)
359
+ continue
360
+ }
361
+
362
+ // Skip validation for optional fields that aren't provided
363
+ if (value === undefined || value === '') {
364
+ continue
365
+ }
366
+
367
+ // Type validation
368
+ if (fieldSchema.type === 'string') {
369
+ if (Array.isArray(value)) {
370
+ // String arrays are allowed if multiple: true
371
+ if (!fieldSchema.multiple) {
372
+ errors.push(
373
+ `${fieldSchema.title || key} must be a string, not an array`,
374
+ )
375
+ } else if (!value.every(v => typeof v === 'string')) {
376
+ errors.push(`${fieldSchema.title || key} must be an array of strings`)
377
+ }
378
+ } else if (typeof value !== 'string') {
379
+ errors.push(`${fieldSchema.title || key} must be a string`)
380
+ }
381
+ } else if (fieldSchema.type === 'number' && typeof value !== 'number') {
382
+ errors.push(`${fieldSchema.title || key} must be a number`)
383
+ } else if (fieldSchema.type === 'boolean' && typeof value !== 'boolean') {
384
+ errors.push(`${fieldSchema.title || key} must be a boolean`)
385
+ } else if (
386
+ (fieldSchema.type === 'file' || fieldSchema.type === 'directory') &&
387
+ typeof value !== 'string'
388
+ ) {
389
+ errors.push(`${fieldSchema.title || key} must be a path string`)
390
+ }
391
+
392
+ // Number range validation
393
+ if (fieldSchema.type === 'number' && typeof value === 'number') {
394
+ if (fieldSchema.min !== undefined && value < fieldSchema.min) {
395
+ errors.push(
396
+ `${fieldSchema.title || key} must be at least ${fieldSchema.min}`,
397
+ )
398
+ }
399
+ if (fieldSchema.max !== undefined && value > fieldSchema.max) {
400
+ errors.push(
401
+ `${fieldSchema.title || key} must be at most ${fieldSchema.max}`,
402
+ )
403
+ }
404
+ }
405
+ }
406
+
407
+ return { valid: errors.length === 0, errors }
408
+ }
409
+
410
+ /**
411
+ * Generate MCP server configuration from DXT manifest
412
+ */
413
+ async function generateMcpConfig(
414
+ manifest: McpbManifest,
415
+ extractedPath: string,
416
+ userConfig: UserConfigValues = {},
417
+ ): Promise<McpServerConfig> {
418
+ // Lazy import: @anthropic-ai/mcpb barrel pulls in zod v3 schemas (~700KB of
419
+ // bound closures). See dxt/helpers.ts for details.
420
+ const { getMcpConfigForManifest } = await import('@anthropic-ai/mcpb')
421
+ const mcpConfig = await getMcpConfigForManifest({
422
+ manifest,
423
+ extensionPath: extractedPath,
424
+ systemDirs: getSystemDirectories(),
425
+ userConfig,
426
+ pathSeparator: '/',
427
+ })
428
+
429
+ if (!mcpConfig) {
430
+ const error = new Error(
431
+ `Failed to generate MCP server configuration from manifest "${manifest.name}"`,
432
+ )
433
+ logError(error)
434
+ throw error
435
+ }
436
+
437
+ return mcpConfig as McpServerConfig
438
+ }
439
+
440
+ /**
441
+ * Load cache metadata for an MCPB source
442
+ */
443
+ async function loadCacheMetadata(
444
+ cacheDir: string,
445
+ source: string,
446
+ ): Promise<McpbCacheMetadata | null> {
447
+ const fs = getFsImplementation()
448
+ const metadataPath = getMetadataPath(cacheDir, source)
449
+
450
+ try {
451
+ const content = await fs.readFile(metadataPath, { encoding: 'utf-8' })
452
+ return jsonParse(content) as McpbCacheMetadata
453
+ } catch (error) {
454
+ const code = getErrnoCode(error)
455
+ if (code === 'ENOENT') return null
456
+ const errorObj = toError(error)
457
+ logError(errorObj)
458
+ logForDebugging(`Failed to load MCPB cache metadata: ${error}`, {
459
+ level: 'error',
460
+ })
461
+ return null
462
+ }
463
+ }
464
+
465
+ /**
466
+ * Save cache metadata for an MCPB source
467
+ */
468
+ async function saveCacheMetadata(
469
+ cacheDir: string,
470
+ source: string,
471
+ metadata: McpbCacheMetadata,
472
+ ): Promise<void> {
473
+ const metadataPath = getMetadataPath(cacheDir, source)
474
+
475
+ await getFsImplementation().mkdir(cacheDir)
476
+ await writeFile(metadataPath, jsonStringify(metadata, null, 2), 'utf-8')
477
+ }
478
+
479
+ /**
480
+ * Download MCPB file from URL
481
+ */
482
+ async function downloadMcpb(
483
+ url: string,
484
+ destPath: string,
485
+ onProgress?: ProgressCallback,
486
+ ): Promise<Uint8Array> {
487
+ logForDebugging(`Downloading MCPB from ${url}`)
488
+ if (onProgress) {
489
+ onProgress(`Downloading ${url}...`)
490
+ }
491
+
492
+ const started = performance.now()
493
+ let fetchTelemetryFired = false
494
+ try {
495
+ const response = await axios.get(url, {
496
+ timeout: 120000, // 2 minute timeout
497
+ responseType: 'arraybuffer',
498
+ maxRedirects: 5, // Follow redirects (like curl -L)
499
+ onDownloadProgress: progressEvent => {
500
+ if (progressEvent.total && onProgress) {
501
+ const percent = Math.round(
502
+ (progressEvent.loaded / progressEvent.total) * 100,
503
+ )
504
+ onProgress(`Downloading... ${percent}%`)
505
+ }
506
+ },
507
+ })
508
+
509
+ const data = new Uint8Array(response.data)
510
+ // Fire telemetry before writeFile — the event measures the network
511
+ // fetch, not disk I/O. A writeFile EACCES would otherwise match
512
+ // classifyFetchError's /permission denied/ → misreport as auth.
513
+ logPluginFetch('mcpb', url, 'success', performance.now() - started)
514
+ fetchTelemetryFired = true
515
+
516
+ // Save to disk (binary data)
517
+ await writeFile(destPath, Buffer.from(data))
518
+
519
+ logForDebugging(`Downloaded ${data.length} bytes to ${destPath}`)
520
+ if (onProgress) {
521
+ onProgress('Download complete')
522
+ }
523
+
524
+ return data
525
+ } catch (error) {
526
+ if (!fetchTelemetryFired) {
527
+ logPluginFetch(
528
+ 'mcpb',
529
+ url,
530
+ 'failure',
531
+ performance.now() - started,
532
+ classifyFetchError(error),
533
+ )
534
+ }
535
+ const errorMsg = errorMessage(error)
536
+ const fullError = new Error(
537
+ `Failed to download MCPB file from ${url}: ${errorMsg}`,
538
+ )
539
+ logError(fullError)
540
+ throw fullError
541
+ }
542
+ }
543
+
544
+ /**
545
+ * Extract MCPB file and write contents to extraction directory.
546
+ *
547
+ * @param modes - name→mode map from `parseZipModes`. MCPB bundles can ship
548
+ * native MCP server binaries, so preserving the exec bit matters here.
549
+ */
550
+ async function extractMcpbContents(
551
+ unzipped: Record<string, Uint8Array>,
552
+ extractPath: string,
553
+ modes: Record<string, number>,
554
+ onProgress?: ProgressCallback,
555
+ ): Promise<void> {
556
+ if (onProgress) {
557
+ onProgress('Extracting files...')
558
+ }
559
+
560
+ // Create extraction directory
561
+ await getFsImplementation().mkdir(extractPath)
562
+
563
+ // Write all files. Filter directory entries from the count so progress
564
+ // messages use the same denominator as filesWritten (which skips them).
565
+ let filesWritten = 0
566
+ const entries = Object.entries(unzipped).filter(([k]) => !k.endsWith('/'))
567
+ const totalFiles = entries.length
568
+
569
+ for (const [filePath, fileData] of entries) {
570
+ // Directory entries (common in zip -r, Python zipfile, Java ZipOutputStream)
571
+ // are filtered above — writeFile would create `bin/` as an empty regular
572
+ // file, then mkdir for `bin/server` would fail with ENOTDIR. The
573
+ // mkdir(dirname(fullPath)) below creates parent dirs implicitly.
574
+
575
+ const fullPath = join(extractPath, filePath)
576
+ const dir = dirname(fullPath)
577
+
578
+ // Ensure directory exists (recursive handles already-existing)
579
+ if (dir !== extractPath) {
580
+ await getFsImplementation().mkdir(dir)
581
+ }
582
+
583
+ // Determine if text or binary
584
+ const isTextFile =
585
+ filePath.endsWith('.json') ||
586
+ filePath.endsWith('.js') ||
587
+ filePath.endsWith('.ts') ||
588
+ filePath.endsWith('.txt') ||
589
+ filePath.endsWith('.md') ||
590
+ filePath.endsWith('.yml') ||
591
+ filePath.endsWith('.yaml')
592
+
593
+ if (isTextFile) {
594
+ const content = new TextDecoder().decode(fileData)
595
+ await writeFile(fullPath, content, 'utf-8')
596
+ } else {
597
+ await writeFile(fullPath, Buffer.from(fileData))
598
+ }
599
+
600
+ const mode = modes[filePath]
601
+ if (mode && mode & 0o111) {
602
+ // Swallow EPERM/ENOTSUP (NFS root_squash, some FUSE mounts) — losing +x
603
+ // is the pre-PR behavior and better than aborting mid-extraction.
604
+ await chmod(fullPath, mode & 0o777).catch(() => {})
605
+ }
606
+
607
+ filesWritten++
608
+ if (onProgress && filesWritten % 10 === 0) {
609
+ onProgress(`Extracted ${filesWritten}/${totalFiles} files`)
610
+ }
611
+ }
612
+
613
+ logForDebugging(`Extracted ${filesWritten} files to ${extractPath}`)
614
+ if (onProgress) {
615
+ onProgress(`Extraction complete (${filesWritten} files)`)
616
+ }
617
+ }
618
+
619
+ /**
620
+ * Check if an MCPB source has changed and needs re-extraction
621
+ */
622
+ export async function checkMcpbChanged(
623
+ source: string,
624
+ pluginPath: string,
625
+ ): Promise<boolean> {
626
+ const fs = getFsImplementation()
627
+ const cacheDir = getMcpbCacheDir(pluginPath)
628
+ const metadata = await loadCacheMetadata(cacheDir, source)
629
+
630
+ if (!metadata) {
631
+ // No cache metadata, needs loading
632
+ return true
633
+ }
634
+
635
+ // Check if extraction directory still exists
636
+ try {
637
+ await fs.stat(metadata.extractedPath)
638
+ } catch (error) {
639
+ const code = getErrnoCode(error)
640
+ if (code === 'ENOENT') {
641
+ logForDebugging(`MCPB extraction path missing: ${metadata.extractedPath}`)
642
+ } else {
643
+ logForDebugging(
644
+ `MCPB extraction path inaccessible: ${metadata.extractedPath}: ${error}`,
645
+ { level: 'error' },
646
+ )
647
+ }
648
+ return true
649
+ }
650
+
651
+ // For local files, check mtime
652
+ if (!isUrl(source)) {
653
+ const localPath = join(pluginPath, source)
654
+ let stats
655
+ try {
656
+ stats = await fs.stat(localPath)
657
+ } catch (error) {
658
+ const code = getErrnoCode(error)
659
+ if (code === 'ENOENT') {
660
+ logForDebugging(`MCPB source file missing: ${localPath}`)
661
+ } else {
662
+ logForDebugging(
663
+ `MCPB source file inaccessible: ${localPath}: ${error}`,
664
+ { level: 'error' },
665
+ )
666
+ }
667
+ return true
668
+ }
669
+
670
+ const cachedTime = new Date(metadata.cachedAt).getTime()
671
+ // Floor to match the ms precision of cachedAt (ISO string). Sub-ms
672
+ // precision on mtimeMs would make a freshly-cached file appear "newer"
673
+ // than its own cache timestamp when both happen in the same millisecond.
674
+ const fileTime = Math.floor(stats.mtimeMs)
675
+
676
+ if (fileTime > cachedTime) {
677
+ logForDebugging(
678
+ `MCPB file modified: ${new Date(fileTime)} > ${new Date(cachedTime)}`,
679
+ )
680
+ return true
681
+ }
682
+ }
683
+
684
+ // For URLs, we'll re-check on explicit update (handled elsewhere)
685
+ return false
686
+ }
687
+
688
+ /**
689
+ * Load and extract an MCPB file, with caching and user configuration support
690
+ *
691
+ * @param source - MCPB file path or URL
692
+ * @param pluginPath - Plugin directory path
693
+ * @param pluginId - Plugin identifier in "plugin@marketplace" format (for config storage)
694
+ * @param onProgress - Progress callback
695
+ * @param providedUserConfig - User configuration values (for initial setup or reconfiguration)
696
+ * @returns Success with MCP config, or needs-config status with schema
697
+ */
698
+ export async function loadMcpbFile(
699
+ source: string,
700
+ pluginPath: string,
701
+ pluginId: string,
702
+ onProgress?: ProgressCallback,
703
+ providedUserConfig?: UserConfigValues,
704
+ forceConfigDialog?: boolean,
705
+ ): Promise<McpbLoadResult | McpbNeedsConfigResult> {
706
+ const fs = getFsImplementation()
707
+ const cacheDir = getMcpbCacheDir(pluginPath)
708
+ await fs.mkdir(cacheDir)
709
+
710
+ logForDebugging(`Loading MCPB from source: ${source}`)
711
+
712
+ // Check cache first
713
+ const metadata = await loadCacheMetadata(cacheDir, source)
714
+ if (metadata && !(await checkMcpbChanged(source, pluginPath))) {
715
+ logForDebugging(
716
+ `Using cached MCPB from ${metadata.extractedPath} (hash: ${metadata.contentHash})`,
717
+ )
718
+
719
+ // Load manifest from cache
720
+ const manifestPath = join(metadata.extractedPath, 'manifest.json')
721
+ let manifestContent: string
722
+ try {
723
+ manifestContent = await fs.readFile(manifestPath, { encoding: 'utf-8' })
724
+ } catch (error) {
725
+ if (isENOENT(error)) {
726
+ const err = new Error(`Cached manifest not found: ${manifestPath}`)
727
+ logError(err)
728
+ throw err
729
+ }
730
+ throw error
731
+ }
732
+
733
+ const manifestData = new TextEncoder().encode(manifestContent)
734
+ const manifest = await parseAndValidateManifestFromBytes(manifestData)
735
+
736
+ // Check for user_config requirement
737
+ if (manifest.user_config && Object.keys(manifest.user_config).length > 0) {
738
+ // Server name from DXT manifest
739
+ const serverName = manifest.name
740
+
741
+ // Try to load existing config from settings.json or use provided config
742
+ const savedConfig = loadMcpServerUserConfig(pluginId, serverName)
743
+ const userConfig = providedUserConfig || savedConfig || {}
744
+
745
+ // Validate we have all required fields
746
+ const validation = validateUserConfig(userConfig, manifest.user_config)
747
+
748
+ // Return needs-config if: forced (reconfiguration) OR validation failed
749
+ if (forceConfigDialog || !validation.valid) {
750
+ return {
751
+ status: 'needs-config',
752
+ manifest,
753
+ extractedPath: metadata.extractedPath,
754
+ contentHash: metadata.contentHash,
755
+ configSchema: manifest.user_config,
756
+ existingConfig: savedConfig || {},
757
+ validationErrors: validation.valid ? [] : validation.errors,
758
+ }
759
+ }
760
+
761
+ // Save config if it was provided (first time or reconfiguration)
762
+ if (providedUserConfig) {
763
+ saveMcpServerUserConfig(
764
+ pluginId,
765
+ serverName,
766
+ providedUserConfig,
767
+ manifest.user_config ?? {},
768
+ )
769
+ }
770
+
771
+ // Generate MCP config WITH user config
772
+ const mcpConfig = await generateMcpConfig(
773
+ manifest,
774
+ metadata.extractedPath,
775
+ userConfig,
776
+ )
777
+
778
+ return {
779
+ manifest,
780
+ mcpConfig,
781
+ extractedPath: metadata.extractedPath,
782
+ contentHash: metadata.contentHash,
783
+ }
784
+ }
785
+
786
+ // No user_config required - generate config without it
787
+ const mcpConfig = await generateMcpConfig(manifest, metadata.extractedPath)
788
+
789
+ return {
790
+ manifest,
791
+ mcpConfig,
792
+ extractedPath: metadata.extractedPath,
793
+ contentHash: metadata.contentHash,
794
+ }
795
+ }
796
+
797
+ // Not cached or changed - need to download/load and extract
798
+ let mcpbData: Uint8Array
799
+ let mcpbFilePath: string
800
+
801
+ if (isUrl(source)) {
802
+ // Download from URL
803
+ const sourceHash = createHash('md5')
804
+ .update(source)
805
+ .digest('hex')
806
+ .substring(0, 8)
807
+ mcpbFilePath = join(cacheDir, `${sourceHash}.mcpb`)
808
+ mcpbData = await downloadMcpb(source, mcpbFilePath, onProgress)
809
+ } else {
810
+ // Load from local path
811
+ const localPath = join(pluginPath, source)
812
+
813
+ if (onProgress) {
814
+ onProgress(`Loading ${source}...`)
815
+ }
816
+
817
+ try {
818
+ mcpbData = await fs.readFileBytes(localPath)
819
+ mcpbFilePath = localPath
820
+ } catch (error) {
821
+ if (isENOENT(error)) {
822
+ const err = new Error(`MCPB file not found: ${localPath}`)
823
+ logError(err)
824
+ throw err
825
+ }
826
+ throw error
827
+ }
828
+ }
829
+
830
+ // Generate content hash
831
+ const contentHash = generateContentHash(mcpbData)
832
+ logForDebugging(`MCPB content hash: ${contentHash}`)
833
+
834
+ // Extract ZIP
835
+ if (onProgress) {
836
+ onProgress('Extracting MCPB archive...')
837
+ }
838
+
839
+ const unzipped = await unzipFile(Buffer.from(mcpbData))
840
+ // fflate doesn't surface external_attr — parse the central directory so
841
+ // native MCP server binaries keep their exec bit after extraction.
842
+ const modes = parseZipModes(mcpbData)
843
+
844
+ // Check for manifest.json
845
+ const manifestData = unzipped['manifest.json']
846
+ if (!manifestData) {
847
+ const error = new Error('No manifest.json found in MCPB file')
848
+ logError(error)
849
+ throw error
850
+ }
851
+
852
+ // Parse and validate manifest
853
+ const manifest = await parseAndValidateManifestFromBytes(manifestData)
854
+ logForDebugging(
855
+ `MCPB manifest: ${manifest.name} v${manifest.version} by ${manifest.author.name}`,
856
+ )
857
+
858
+ // Check if manifest has server config
859
+ if (!manifest.server) {
860
+ const error = new Error(
861
+ `MCPB manifest for "${manifest.name}" does not define a server configuration`,
862
+ )
863
+ logError(error)
864
+ throw error
865
+ }
866
+
867
+ // Extract to cache directory
868
+ const extractPath = join(cacheDir, contentHash)
869
+ await extractMcpbContents(unzipped, extractPath, modes, onProgress)
870
+
871
+ // Check for user_config requirement
872
+ if (manifest.user_config && Object.keys(manifest.user_config).length > 0) {
873
+ // Server name from DXT manifest
874
+ const serverName = manifest.name
875
+
876
+ // Try to load existing config from settings.json or use provided config
877
+ const savedConfig = loadMcpServerUserConfig(pluginId, serverName)
878
+ const userConfig = providedUserConfig || savedConfig || {}
879
+
880
+ // Validate we have all required fields
881
+ const validation = validateUserConfig(userConfig, manifest.user_config)
882
+
883
+ if (!validation.valid) {
884
+ // Save cache metadata even though config is incomplete
885
+ const newMetadata: McpbCacheMetadata = {
886
+ source,
887
+ contentHash,
888
+ extractedPath: extractPath,
889
+ cachedAt: new Date().toISOString(),
890
+ lastChecked: new Date().toISOString(),
891
+ }
892
+ await saveCacheMetadata(cacheDir, source, newMetadata)
893
+
894
+ // Return "needs configuration" status
895
+ return {
896
+ status: 'needs-config',
897
+ manifest,
898
+ extractedPath: extractPath,
899
+ contentHash,
900
+ configSchema: manifest.user_config,
901
+ existingConfig: savedConfig || {},
902
+ validationErrors: validation.errors,
903
+ }
904
+ }
905
+
906
+ // Save config if it was provided (first time or reconfiguration)
907
+ if (providedUserConfig) {
908
+ saveMcpServerUserConfig(
909
+ pluginId,
910
+ serverName,
911
+ providedUserConfig,
912
+ manifest.user_config ?? {},
913
+ )
914
+ }
915
+
916
+ // Generate MCP config WITH user config
917
+ if (onProgress) {
918
+ onProgress('Generating MCP server configuration...')
919
+ }
920
+
921
+ const mcpConfig = await generateMcpConfig(manifest, extractPath, userConfig)
922
+
923
+ // Save cache metadata
924
+ const newMetadata: McpbCacheMetadata = {
925
+ source,
926
+ contentHash,
927
+ extractedPath: extractPath,
928
+ cachedAt: new Date().toISOString(),
929
+ lastChecked: new Date().toISOString(),
930
+ }
931
+ await saveCacheMetadata(cacheDir, source, newMetadata)
932
+
933
+ return {
934
+ manifest,
935
+ mcpConfig,
936
+ extractedPath: extractPath,
937
+ contentHash,
938
+ }
939
+ }
940
+
941
+ // No user_config required - generate config without it
942
+ if (onProgress) {
943
+ onProgress('Generating MCP server configuration...')
944
+ }
945
+
946
+ const mcpConfig = await generateMcpConfig(manifest, extractPath)
947
+
948
+ // Save cache metadata
949
+ const newMetadata: McpbCacheMetadata = {
950
+ source,
951
+ contentHash,
952
+ extractedPath: extractPath,
953
+ cachedAt: new Date().toISOString(),
954
+ lastChecked: new Date().toISOString(),
955
+ }
956
+ await saveCacheMetadata(cacheDir, source, newMetadata)
957
+
958
+ logForDebugging(
959
+ `Successfully loaded MCPB: ${manifest.name} (extracted to ${extractPath})`,
960
+ )
961
+
962
+ return {
963
+ manifest,
964
+ mcpConfig: mcpConfig as McpServerConfig,
965
+ extractedPath: extractPath,
966
+ contentHash,
967
+ }
968
+ }