@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.
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/bin/xcode +127 -0
- package/bin/xcode-test +84 -0
- package/bin/xcode.cmd +31 -0
- package/constants/apiLimits.ts +94 -0
- package/constants/betas.ts +52 -0
- package/constants/common.ts +33 -0
- package/constants/cyberRiskInstruction.ts +24 -0
- package/constants/errorIds.ts +15 -0
- package/constants/figures.ts +45 -0
- package/constants/files.ts +156 -0
- package/constants/github-app.ts +144 -0
- package/constants/keys.ts +11 -0
- package/constants/messages.ts +1 -0
- package/constants/oauth.ts +234 -0
- package/constants/outputStyles.ts +216 -0
- package/constants/product.ts +76 -0
- package/constants/prompts.ts +939 -0
- package/constants/spinnerVerbs.ts +204 -0
- package/constants/system.ts +95 -0
- package/constants/systemPromptSections.ts +68 -0
- package/constants/toolLimits.ts +56 -0
- package/constants/tools.ts +112 -0
- package/constants/turnCompletionVerbs.ts +12 -0
- package/constants/xml.ts +86 -0
- package/entrypoints/agentSdkTypes.ts +443 -0
- package/entrypoints/cli.tsx +307 -0
- package/entrypoints/init.ts +340 -0
- package/entrypoints/mcp.ts +196 -0
- package/entrypoints/sandboxTypes.ts +156 -0
- package/entrypoints/sdk/controlSchemas.ts +663 -0
- package/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/entrypoints/sdk/coreTypes.generated.ts +2 -0
- package/entrypoints/sdk/coreTypes.ts +62 -0
- package/entrypoints/sdk/runtimeTypes.ts +140 -0
- package/entrypoints/sdk/sdkUtilityTypes.ts +3 -0
- package/entrypoints/sdk/toolTypes.ts +90 -0
- package/main.tsx +4686 -0
- package/package.json +120 -0
- package/services/AgentSummary/agentSummary.ts +179 -0
- package/services/MagicDocs/magicDocs.ts +254 -0
- package/services/MagicDocs/prompts.ts +127 -0
- package/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/services/PromptSuggestion/speculation.ts +991 -0
- package/services/SessionMemory/prompts.ts +324 -0
- package/services/SessionMemory/sessionMemory.ts +495 -0
- package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/services/analytics/config.ts +38 -0
- package/services/analytics/datadog.ts +307 -0
- package/services/analytics/firstPartyEventLogger.ts +449 -0
- package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/services/analytics/growthbook.ts +1155 -0
- package/services/analytics/index.ts +173 -0
- package/services/analytics/metadata.ts +973 -0
- package/services/analytics/sink.ts +114 -0
- package/services/analytics/sinkKillswitch.ts +25 -0
- package/services/api/adminRequests.ts +119 -0
- package/services/api/bootstrap.ts +141 -0
- package/services/api/claude.ts +3422 -0
- package/services/api/client.ts +406 -0
- package/services/api/dumpPrompts.ts +226 -0
- package/services/api/emptyUsage.ts +22 -0
- package/services/api/errorUtils.ts +260 -0
- package/services/api/errors.ts +1207 -0
- package/services/api/filesApi.ts +748 -0
- package/services/api/firstTokenDate.ts +60 -0
- package/services/api/gemini.ts +359 -0
- package/services/api/geminiAdapter.ts +123 -0
- package/services/api/geminiClient.ts +291 -0
- package/services/api/grove.ts +357 -0
- package/services/api/logging.ts +788 -0
- package/services/api/metricsOptOut.ts +159 -0
- package/services/api/openRouterClient.ts +453 -0
- package/services/api/overageCreditGrant.ts +137 -0
- package/services/api/promptCacheBreakDetection.ts +727 -0
- package/services/api/referral.ts +281 -0
- package/services/api/sessionIngress.ts +514 -0
- package/services/api/ultrareviewQuota.ts +38 -0
- package/services/api/usage.ts +63 -0
- package/services/api/withRetry.ts +822 -0
- package/services/autoDream/autoDream.ts +324 -0
- package/services/autoDream/config.ts +21 -0
- package/services/autoDream/consolidationLock.ts +140 -0
- package/services/autoDream/consolidationPrompt.ts +65 -0
- package/services/awaySummary.ts +74 -0
- package/services/claudeAiLimits.ts +515 -0
- package/services/claudeAiLimitsHook.ts +23 -0
- package/services/compact/apiMicrocompact.ts +153 -0
- package/services/compact/autoCompact.ts +351 -0
- package/services/compact/compact.ts +1705 -0
- package/services/compact/compactWarningHook.ts +16 -0
- package/services/compact/compactWarningState.ts +18 -0
- package/services/compact/grouping.ts +63 -0
- package/services/compact/microCompact.ts +530 -0
- package/services/compact/postCompactCleanup.ts +77 -0
- package/services/compact/prompt.ts +374 -0
- package/services/compact/sessionMemoryCompact.ts +630 -0
- package/services/compact/timeBasedMCConfig.ts +43 -0
- package/services/diagnosticTracking.ts +397 -0
- package/services/extractMemories/extractMemories.ts +517 -0
- package/services/extractMemories/prompts.ts +154 -0
- package/services/internalLogging.ts +90 -0
- package/services/lsp/LSPClient.ts +447 -0
- package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/services/lsp/LSPServerInstance.ts +511 -0
- package/services/lsp/LSPServerManager.ts +420 -0
- package/services/lsp/config.ts +79 -0
- package/services/lsp/manager.ts +289 -0
- package/services/lsp/passiveFeedback.ts +328 -0
- package/services/mcp/InProcessTransport.ts +63 -0
- package/services/mcp/MCPConnectionManager.tsx +73 -0
- package/services/mcp/SdkControlTransport.ts +136 -0
- package/services/mcp/auth.ts +2465 -0
- package/services/mcp/channelAllowlist.ts +76 -0
- package/services/mcp/channelNotification.ts +316 -0
- package/services/mcp/channelPermissions.ts +240 -0
- package/services/mcp/claudeai.ts +164 -0
- package/services/mcp/client.ts +3348 -0
- package/services/mcp/config.ts +1578 -0
- package/services/mcp/elicitationHandler.ts +313 -0
- package/services/mcp/envExpansion.ts +38 -0
- package/services/mcp/headersHelper.ts +138 -0
- package/services/mcp/mcpStringUtils.ts +106 -0
- package/services/mcp/normalization.ts +23 -0
- package/services/mcp/oauthPort.ts +78 -0
- package/services/mcp/officialRegistry.ts +72 -0
- package/services/mcp/types.ts +258 -0
- package/services/mcp/useManageMCPConnections.ts +1141 -0
- package/services/mcp/utils.ts +575 -0
- package/services/mcp/vscodeSdkMcp.ts +112 -0
- package/services/mcp/xaa.ts +511 -0
- package/services/mcp/xaaIdpLogin.ts +487 -0
- package/services/mcpServerApproval.tsx +41 -0
- package/services/mockRateLimits.ts +882 -0
- package/services/notifier.ts +156 -0
- package/services/oauth/auth-code-listener.ts +211 -0
- package/services/oauth/client.ts +566 -0
- package/services/oauth/crypto.ts +23 -0
- package/services/oauth/getOauthProfile.ts +53 -0
- package/services/oauth/index.ts +198 -0
- package/services/plugins/PluginInstallationManager.ts +184 -0
- package/services/plugins/pluginCliCommands.ts +344 -0
- package/services/plugins/pluginOperations.ts +1088 -0
- package/services/policyLimits/index.ts +663 -0
- package/services/policyLimits/types.ts +27 -0
- package/services/preventSleep.ts +165 -0
- package/services/rateLimitMessages.ts +344 -0
- package/services/rateLimitMocking.ts +144 -0
- package/services/remoteManagedSettings/index.ts +638 -0
- package/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/services/remoteManagedSettings/syncCache.ts +112 -0
- package/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/services/remoteManagedSettings/types.ts +31 -0
- package/services/settingsSync/index.ts +581 -0
- package/services/settingsSync/types.ts +67 -0
- package/services/teamMemorySync/index.ts +1256 -0
- package/services/teamMemorySync/secretScanner.ts +324 -0
- package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/services/teamMemorySync/types.ts +156 -0
- package/services/teamMemorySync/watcher.ts +387 -0
- package/services/tips/tipHistory.ts +17 -0
- package/services/tips/tipRegistry.ts +686 -0
- package/services/tips/tipScheduler.ts +58 -0
- package/services/tokenEstimation.ts +495 -0
- package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/services/tools/StreamingToolExecutor.ts +530 -0
- package/services/tools/toolExecution.ts +1745 -0
- package/services/tools/toolHooks.ts +650 -0
- package/services/tools/toolOrchestration.ts +188 -0
- package/services/vcr.ts +406 -0
- package/services/voice.ts +525 -0
- package/services/voiceKeyterms.ts +106 -0
- package/services/voiceStreamSTT.ts +544 -0
- package/tools/AgentTool/AgentTool.tsx +1398 -0
- package/tools/AgentTool/UI.tsx +872 -0
- package/tools/AgentTool/agentColorManager.ts +66 -0
- package/tools/AgentTool/agentDisplay.ts +104 -0
- package/tools/AgentTool/agentMemory.ts +177 -0
- package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/tools/AgentTool/agentToolUtils.ts +686 -0
- package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/tools/AgentTool/builtInAgents.ts +72 -0
- package/tools/AgentTool/constants.ts +12 -0
- package/tools/AgentTool/forkSubagent.ts +210 -0
- package/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/tools/AgentTool/prompt.ts +287 -0
- package/tools/AgentTool/resumeAgent.ts +265 -0
- package/tools/AgentTool/runAgent.ts +973 -0
- package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/tools/BashTool/BashTool.tsx +1144 -0
- package/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/tools/BashTool/UI.tsx +185 -0
- package/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/tools/BashTool/bashPermissions.ts +2621 -0
- package/tools/BashTool/bashSecurity.ts +2592 -0
- package/tools/BashTool/commandSemantics.ts +140 -0
- package/tools/BashTool/commentLabel.ts +13 -0
- package/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/tools/BashTool/modeValidation.ts +115 -0
- package/tools/BashTool/pathValidation.ts +1303 -0
- package/tools/BashTool/prompt.ts +369 -0
- package/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/tools/BashTool/sedEditParser.ts +322 -0
- package/tools/BashTool/sedValidation.ts +684 -0
- package/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/tools/BashTool/toolName.ts +2 -0
- package/tools/BashTool/utils.ts +223 -0
- package/tools/BriefTool/BriefTool.ts +204 -0
- package/tools/BriefTool/UI.tsx +101 -0
- package/tools/BriefTool/attachments.ts +110 -0
- package/tools/BriefTool/prompt.ts +22 -0
- package/tools/BriefTool/upload.ts +174 -0
- package/tools/ConfigTool/ConfigTool.ts +467 -0
- package/tools/ConfigTool/UI.tsx +38 -0
- package/tools/ConfigTool/constants.ts +1 -0
- package/tools/ConfigTool/prompt.ts +93 -0
- package/tools/ConfigTool/supportedSettings.ts +211 -0
- package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/tools/EnterPlanModeTool/constants.ts +1 -0
- package/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/tools/EnterWorktreeTool/constants.ts +1 -0
- package/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/tools/ExitPlanModeTool/constants.ts +2 -0
- package/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/tools/ExitWorktreeTool/constants.ts +1 -0
- package/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/tools/FileEditTool/FileEditTool.ts +625 -0
- package/tools/FileEditTool/UI.tsx +289 -0
- package/tools/FileEditTool/constants.ts +11 -0
- package/tools/FileEditTool/prompt.ts +28 -0
- package/tools/FileEditTool/types.ts +85 -0
- package/tools/FileEditTool/utils.ts +775 -0
- package/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/tools/FileReadTool/UI.tsx +185 -0
- package/tools/FileReadTool/imageProcessor.ts +94 -0
- package/tools/FileReadTool/limits.ts +92 -0
- package/tools/FileReadTool/prompt.ts +49 -0
- package/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/tools/FileWriteTool/UI.tsx +405 -0
- package/tools/FileWriteTool/prompt.ts +18 -0
- package/tools/GlobTool/GlobTool.ts +198 -0
- package/tools/GlobTool/UI.tsx +63 -0
- package/tools/GlobTool/prompt.ts +7 -0
- package/tools/GrepTool/GrepTool.ts +577 -0
- package/tools/GrepTool/UI.tsx +201 -0
- package/tools/GrepTool/prompt.ts +18 -0
- package/tools/LSPTool/LSPTool.ts +860 -0
- package/tools/LSPTool/UI.tsx +228 -0
- package/tools/LSPTool/formatters.ts +592 -0
- package/tools/LSPTool/prompt.ts +21 -0
- package/tools/LSPTool/schemas.ts +215 -0
- package/tools/LSPTool/symbolContext.ts +90 -0
- package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/tools/MCPTool/MCPTool.ts +77 -0
- package/tools/MCPTool/UI.tsx +403 -0
- package/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/tools/MCPTool/prompt.ts +3 -0
- package/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/tools/NotebookEditTool/UI.tsx +93 -0
- package/tools/NotebookEditTool/constants.ts +2 -0
- package/tools/NotebookEditTool/prompt.ts +3 -0
- package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/tools/PowerShellTool/UI.tsx +131 -0
- package/tools/PowerShellTool/clmTypes.ts +211 -0
- package/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/tools/PowerShellTool/commonParameters.ts +30 -0
- package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/tools/PowerShellTool/gitSafety.ts +176 -0
- package/tools/PowerShellTool/modeValidation.ts +404 -0
- package/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/tools/PowerShellTool/prompt.ts +145 -0
- package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/tools/PowerShellTool/toolName.ts +2 -0
- package/tools/REPLTool/constants.ts +46 -0
- package/tools/REPLTool/primitiveTools.ts +39 -0
- package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/tools/ScheduleCronTool/UI.tsx +60 -0
- package/tools/ScheduleCronTool/prompt.ts +135 -0
- package/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/tools/SendMessageTool/UI.tsx +31 -0
- package/tools/SendMessageTool/constants.ts +1 -0
- package/tools/SendMessageTool/prompt.ts +49 -0
- package/tools/SkillTool/SkillTool.ts +1108 -0
- package/tools/SkillTool/UI.tsx +128 -0
- package/tools/SkillTool/constants.ts +1 -0
- package/tools/SkillTool/prompt.ts +241 -0
- package/tools/SleepTool/prompt.ts +17 -0
- package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/tools/TaskCreateTool/constants.ts +1 -0
- package/tools/TaskCreateTool/prompt.ts +56 -0
- package/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/tools/TaskGetTool/constants.ts +1 -0
- package/tools/TaskGetTool/prompt.ts +24 -0
- package/tools/TaskListTool/TaskListTool.ts +116 -0
- package/tools/TaskListTool/constants.ts +1 -0
- package/tools/TaskListTool/prompt.ts +49 -0
- package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/tools/TaskOutputTool/constants.ts +1 -0
- package/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/tools/TaskStopTool/UI.tsx +41 -0
- package/tools/TaskStopTool/prompt.ts +8 -0
- package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/tools/TaskUpdateTool/constants.ts +1 -0
- package/tools/TaskUpdateTool/prompt.ts +77 -0
- package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/tools/TeamCreateTool/UI.tsx +6 -0
- package/tools/TeamCreateTool/constants.ts +1 -0
- package/tools/TeamCreateTool/prompt.ts +113 -0
- package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/tools/TeamDeleteTool/UI.tsx +20 -0
- package/tools/TeamDeleteTool/constants.ts +1 -0
- package/tools/TeamDeleteTool/prompt.ts +16 -0
- package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/tools/TodoWriteTool/constants.ts +1 -0
- package/tools/TodoWriteTool/prompt.ts +184 -0
- package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/tools/ToolSearchTool/constants.ts +1 -0
- package/tools/ToolSearchTool/prompt.ts +121 -0
- package/tools/TungstenTool/TungstenTool.ts +4 -0
- package/tools/WebFetchTool/UI.tsx +72 -0
- package/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/tools/WebFetchTool/preapproved.ts +166 -0
- package/tools/WebFetchTool/prompt.ts +46 -0
- package/tools/WebFetchTool/utils.ts +530 -0
- package/tools/WebSearchTool/UI.tsx +101 -0
- package/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/tools/WebSearchTool/prompt.ts +34 -0
- package/tools/WorkflowTool/constants.ts +2 -0
- package/tools/XMemIngestTool/XMemIngestTool.ts +140 -0
- package/tools/XMemIngestTool/prompt.ts +13 -0
- package/tools/XMemRetrieveTool/XMemRetrieveTool.ts +177 -0
- package/tools/XMemRetrieveTool/prompt.ts +16 -0
- package/tools/XMemSearchTool/XMemSearchTool.ts +172 -0
- package/tools/XMemSearchTool/prompt.ts +11 -0
- package/tools/shared/gitOperationTracking.ts +277 -0
- package/tools/shared/spawnMultiAgent.ts +1093 -0
- package/tools/testing/TestingPermissionTool.tsx +74 -0
- package/tools/utils.ts +40 -0
- package/utils/CircularBuffer.ts +84 -0
- package/utils/Cursor.ts +1530 -0
- package/utils/QueryGuard.ts +121 -0
- package/utils/Shell.ts +474 -0
- package/utils/ShellCommand.ts +465 -0
- package/utils/abortController.ts +99 -0
- package/utils/activityManager.ts +164 -0
- package/utils/advisor.ts +145 -0
- package/utils/agentContext.ts +178 -0
- package/utils/agentId.ts +99 -0
- package/utils/agentSwarmsEnabled.ts +44 -0
- package/utils/agenticSessionSearch.ts +307 -0
- package/utils/analyzeContext.ts +1382 -0
- package/utils/ansiToPng.ts +334 -0
- package/utils/ansiToSvg.ts +272 -0
- package/utils/api.ts +718 -0
- package/utils/apiPreconnect.ts +71 -0
- package/utils/appleTerminalBackup.ts +124 -0
- package/utils/argumentSubstitution.ts +145 -0
- package/utils/array.ts +13 -0
- package/utils/asciicast.ts +239 -0
- package/utils/attachments.ts +4091 -0
- package/utils/attribution.ts +393 -0
- package/utils/auth.ts +2002 -0
- package/utils/authFileDescriptor.ts +196 -0
- package/utils/authPortable.ts +19 -0
- package/utils/autoModeDenials.ts +26 -0
- package/utils/autoRunIssue.tsx +122 -0
- package/utils/autoUpdater.ts +561 -0
- package/utils/aws.ts +74 -0
- package/utils/awsAuthStatusManager.ts +81 -0
- package/utils/axios.ts +8 -0
- package/utils/background/remote/preconditions.ts +235 -0
- package/utils/background/remote/remoteSession.ts +98 -0
- package/utils/backgroundHousekeeping.ts +94 -0
- package/utils/bash/ParsedCommand.ts +318 -0
- package/utils/bash/ShellSnapshot.ts +582 -0
- package/utils/bash/ast.ts +2679 -0
- package/utils/bash/bashParser.ts +4436 -0
- package/utils/bash/bashPipeCommand.ts +294 -0
- package/utils/bash/commands.ts +1339 -0
- package/utils/bash/heredoc.ts +733 -0
- package/utils/bash/parser.ts +230 -0
- package/utils/bash/prefix.ts +204 -0
- package/utils/bash/registry.ts +53 -0
- package/utils/bash/shellCompletion.ts +259 -0
- package/utils/bash/shellPrefix.ts +28 -0
- package/utils/bash/shellQuote.ts +304 -0
- package/utils/bash/shellQuoting.ts +128 -0
- package/utils/bash/specs/alias.ts +14 -0
- package/utils/bash/specs/index.ts +18 -0
- package/utils/bash/specs/nohup.ts +13 -0
- package/utils/bash/specs/pyright.ts +91 -0
- package/utils/bash/specs/sleep.ts +13 -0
- package/utils/bash/specs/srun.ts +31 -0
- package/utils/bash/specs/time.ts +13 -0
- package/utils/bash/specs/timeout.ts +20 -0
- package/utils/bash/treeSitterAnalysis.ts +506 -0
- package/utils/betas.ts +434 -0
- package/utils/billing.ts +78 -0
- package/utils/binaryCheck.ts +53 -0
- package/utils/browser.ts +68 -0
- package/utils/bufferedWriter.ts +100 -0
- package/utils/bundledMode.ts +22 -0
- package/utils/caCerts.ts +115 -0
- package/utils/caCertsConfig.ts +88 -0
- package/utils/cachePaths.ts +38 -0
- package/utils/classifierApprovals.ts +88 -0
- package/utils/classifierApprovalsHook.ts +17 -0
- package/utils/claudeCodeHints.ts +193 -0
- package/utils/claudeDesktop.ts +152 -0
- package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/utils/claudeInChrome/common.ts +540 -0
- package/utils/claudeInChrome/mcpServer.ts +292 -0
- package/utils/claudeInChrome/prompt.ts +83 -0
- package/utils/claudeInChrome/setup.ts +400 -0
- package/utils/claudeInChrome/setupPortable.ts +233 -0
- package/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/utils/claudemd.ts +1479 -0
- package/utils/cleanup.ts +602 -0
- package/utils/cleanupRegistry.ts +25 -0
- package/utils/cliArgs.ts +60 -0
- package/utils/cliHighlight.ts +54 -0
- package/utils/codeIndexing.ts +206 -0
- package/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/utils/collapseHookSummaries.ts +59 -0
- package/utils/collapseReadSearch.ts +1109 -0
- package/utils/collapseTeammateShutdowns.ts +55 -0
- package/utils/color-diff-mock.ts +27 -0
- package/utils/combinedAbortSignal.ts +47 -0
- package/utils/commandLifecycle.ts +21 -0
- package/utils/commitAttribution.ts +961 -0
- package/utils/completionCache.ts +166 -0
- package/utils/computerUse/appNames.ts +196 -0
- package/utils/computerUse/cleanup.ts +86 -0
- package/utils/computerUse/common.ts +61 -0
- package/utils/computerUse/computerUseLock.ts +215 -0
- package/utils/computerUse/drainRunLoop.ts +79 -0
- package/utils/computerUse/escHotkey.ts +54 -0
- package/utils/computerUse/executor.ts +658 -0
- package/utils/computerUse/gates.ts +72 -0
- package/utils/computerUse/hostAdapter.ts +69 -0
- package/utils/computerUse/inputLoader.ts +30 -0
- package/utils/computerUse/mcpServer.ts +106 -0
- package/utils/computerUse/setup.ts +53 -0
- package/utils/computerUse/swiftLoader.ts +23 -0
- package/utils/computerUse/toolRendering.tsx +125 -0
- package/utils/computerUse/wrapper.tsx +336 -0
- package/utils/concurrentSessions.ts +204 -0
- package/utils/config.ts +1817 -0
- package/utils/configConstants.ts +21 -0
- package/utils/contentArray.ts +51 -0
- package/utils/context.ts +221 -0
- package/utils/contextAnalysis.ts +272 -0
- package/utils/contextSuggestions.ts +235 -0
- package/utils/controlMessageCompat.ts +32 -0
- package/utils/conversationRecovery.ts +597 -0
- package/utils/cron.ts +308 -0
- package/utils/cronJitterConfig.ts +75 -0
- package/utils/cronScheduler.ts +565 -0
- package/utils/cronTasks.ts +458 -0
- package/utils/cronTasksLock.ts +195 -0
- package/utils/crossProjectResume.ts +75 -0
- package/utils/crypto.ts +13 -0
- package/utils/cwd.ts +32 -0
- package/utils/debug.ts +268 -0
- package/utils/debugFilter.ts +157 -0
- package/utils/deepLink/banner.ts +123 -0
- package/utils/deepLink/parseDeepLink.ts +170 -0
- package/utils/deepLink/protocolHandler.ts +136 -0
- package/utils/deepLink/registerProtocol.ts +348 -0
- package/utils/deepLink/terminalLauncher.ts +557 -0
- package/utils/deepLink/terminalPreference.ts +54 -0
- package/utils/desktopDeepLink.ts +236 -0
- package/utils/detectRepository.ts +178 -0
- package/utils/diagLogs.ts +94 -0
- package/utils/diff.ts +177 -0
- package/utils/directMemberMessage.ts +69 -0
- package/utils/displayTags.ts +51 -0
- package/utils/doctorContextWarnings.ts +265 -0
- package/utils/doctorDiagnostic.ts +625 -0
- package/utils/dxt/helpers.ts +88 -0
- package/utils/dxt/zip.ts +226 -0
- package/utils/earlyInput.ts +191 -0
- package/utils/editor.ts +183 -0
- package/utils/effort.ts +329 -0
- package/utils/embeddedTools.ts +29 -0
- package/utils/env.ts +347 -0
- package/utils/envDynamic.ts +151 -0
- package/utils/envUtils.ts +183 -0
- package/utils/envValidation.ts +38 -0
- package/utils/errorLogSink.ts +235 -0
- package/utils/errors.ts +238 -0
- package/utils/exampleCommands.ts +184 -0
- package/utils/execFileNoThrow.ts +150 -0
- package/utils/execFileNoThrowPortable.ts +89 -0
- package/utils/execSyncWrapper.ts +38 -0
- package/utils/exportRenderer.tsx +98 -0
- package/utils/extraUsage.ts +23 -0
- package/utils/fastMode.ts +532 -0
- package/utils/file.ts +584 -0
- package/utils/fileHistory.ts +1115 -0
- package/utils/fileOperationAnalytics.ts +71 -0
- package/utils/filePersistence/filePersistence.ts +287 -0
- package/utils/filePersistence/outputsScanner.ts +126 -0
- package/utils/fileRead.ts +102 -0
- package/utils/fileReadCache.ts +96 -0
- package/utils/fileStateCache.ts +142 -0
- package/utils/findExecutable.ts +17 -0
- package/utils/fingerprint.ts +76 -0
- package/utils/forkedAgent.ts +689 -0
- package/utils/format.ts +308 -0
- package/utils/formatBriefTimestamp.ts +81 -0
- package/utils/fpsTracker.ts +47 -0
- package/utils/frontmatterParser.ts +370 -0
- package/utils/fsOperations.ts +770 -0
- package/utils/fullscreen.ts +202 -0
- package/utils/generatedFiles.ts +136 -0
- package/utils/generators.ts +88 -0
- package/utils/genericProcessUtils.ts +184 -0
- package/utils/getWorktreePaths.ts +70 -0
- package/utils/getWorktreePathsPortable.ts +27 -0
- package/utils/ghPrStatus.ts +106 -0
- package/utils/git/gitConfigParser.ts +277 -0
- package/utils/git/gitFilesystem.ts +699 -0
- package/utils/git/gitignore.ts +99 -0
- package/utils/git.ts +926 -0
- package/utils/gitDiff.ts +532 -0
- package/utils/gitSettings.ts +18 -0
- package/utils/github/ghAuthStatus.ts +29 -0
- package/utils/githubRepoPathMapping.ts +162 -0
- package/utils/glob.ts +130 -0
- package/utils/gracefulShutdown.ts +529 -0
- package/utils/groupToolUses.ts +182 -0
- package/utils/handlePromptSubmit.ts +610 -0
- package/utils/hash.ts +46 -0
- package/utils/headlessProfiler.ts +178 -0
- package/utils/heapDumpService.ts +303 -0
- package/utils/heatmap.ts +198 -0
- package/utils/highlightMatch.tsx +28 -0
- package/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/utils/hooks/execAgentHook.ts +339 -0
- package/utils/hooks/execHttpHook.ts +242 -0
- package/utils/hooks/execPromptHook.ts +211 -0
- package/utils/hooks/fileChangedWatcher.ts +191 -0
- package/utils/hooks/hookEvents.ts +192 -0
- package/utils/hooks/hookHelpers.ts +83 -0
- package/utils/hooks/hooksConfigManager.ts +400 -0
- package/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/utils/hooks/hooksSettings.ts +271 -0
- package/utils/hooks/postSamplingHooks.ts +70 -0
- package/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/utils/hooks/registerSkillHooks.ts +64 -0
- package/utils/hooks/sessionHooks.ts +447 -0
- package/utils/hooks/skillImprovement.ts +267 -0
- package/utils/hooks/ssrfGuard.ts +294 -0
- package/utils/hooks.ts +5022 -0
- package/utils/horizontalScroll.ts +137 -0
- package/utils/http.ts +136 -0
- package/utils/hyperlink.ts +39 -0
- package/utils/iTermBackup.ts +73 -0
- package/utils/ide.ts +1494 -0
- package/utils/idePathConversion.ts +90 -0
- package/utils/idleTimeout.ts +53 -0
- package/utils/imagePaste.ts +416 -0
- package/utils/imageResizer.ts +880 -0
- package/utils/imageStore.ts +167 -0
- package/utils/imageValidation.ts +104 -0
- package/utils/immediateCommand.ts +15 -0
- package/utils/inProcessTeammateHelpers.ts +102 -0
- package/utils/ink.ts +26 -0
- package/utils/intl.ts +94 -0
- package/utils/jetbrains.ts +191 -0
- package/utils/json.ts +277 -0
- package/utils/jsonRead.ts +16 -0
- package/utils/keyboardShortcuts.ts +14 -0
- package/utils/lazySchema.ts +8 -0
- package/utils/listSessionsImpl.ts +454 -0
- package/utils/localInstaller.ts +162 -0
- package/utils/lockfile.ts +43 -0
- package/utils/log.ts +362 -0
- package/utils/logoV2Utils.ts +347 -0
- package/utils/mailbox.ts +73 -0
- package/utils/managedEnv.ts +199 -0
- package/utils/managedEnvConstants.ts +191 -0
- package/utils/markdown.ts +381 -0
- package/utils/markdownConfigLoader.ts +600 -0
- package/utils/mcp/dateTimeParser.ts +121 -0
- package/utils/mcp/elicitationValidation.ts +336 -0
- package/utils/mcpInstructionsDelta.ts +130 -0
- package/utils/mcpOutputStorage.ts +189 -0
- package/utils/mcpValidation.ts +208 -0
- package/utils/mcpWebSocketTransport.ts +200 -0
- package/utils/memoize.ts +269 -0
- package/utils/memory/types.ts +12 -0
- package/utils/memory/versions.ts +8 -0
- package/utils/memoryFileDetection.ts +289 -0
- package/utils/messagePredicates.ts +8 -0
- package/utils/messageQueueManager.ts +547 -0
- package/utils/messages/mappers.ts +290 -0
- package/utils/messages/systemInit.ts +96 -0
- package/utils/messages.ts +5520 -0
- package/utils/model/agent.ts +157 -0
- package/utils/model/aliases.ts +35 -0
- package/utils/model/antModels.ts +64 -0
- package/utils/model/bedrock.ts +265 -0
- package/utils/model/check1mAccess.ts +72 -0
- package/utils/model/configs.ts +158 -0
- package/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/utils/model/deprecation.ts +101 -0
- package/utils/model/model.ts +654 -0
- package/utils/model/modelAllowlist.ts +170 -0
- package/utils/model/modelCapabilities.ts +118 -0
- package/utils/model/modelOptions.ts +589 -0
- package/utils/model/modelStrings.ts +170 -0
- package/utils/model/modelSupportOverrides.ts +50 -0
- package/utils/model/providers.ts +42 -0
- package/utils/model/validateModel.ts +159 -0
- package/utils/modelCost.ts +231 -0
- package/utils/modifiers.ts +36 -0
- package/utils/mtls.ts +179 -0
- package/utils/nativeInstaller/download.ts +523 -0
- package/utils/nativeInstaller/index.ts +18 -0
- package/utils/nativeInstaller/installer.ts +1708 -0
- package/utils/nativeInstaller/packageManagers.ts +336 -0
- package/utils/nativeInstaller/pidLock.ts +433 -0
- package/utils/notebook.ts +224 -0
- package/utils/objectGroupBy.ts +18 -0
- package/utils/pasteStore.ts +104 -0
- package/utils/path.ts +155 -0
- package/utils/pdf.ts +300 -0
- package/utils/pdfUtils.ts +70 -0
- package/utils/peerAddress.ts +21 -0
- package/utils/permissions/PermissionMode.ts +141 -0
- package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/utils/permissions/PermissionResult.ts +35 -0
- package/utils/permissions/PermissionRule.ts +40 -0
- package/utils/permissions/PermissionUpdate.ts +389 -0
- package/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/utils/permissions/autoModeState.ts +39 -0
- package/utils/permissions/bashClassifier.ts +61 -0
- package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/utils/permissions/classifierDecision.ts +98 -0
- package/utils/permissions/classifierShared.ts +39 -0
- package/utils/permissions/dangerousPatterns.ts +80 -0
- package/utils/permissions/denialTracking.ts +45 -0
- package/utils/permissions/filesystem.ts +1777 -0
- package/utils/permissions/getNextPermissionMode.ts +101 -0
- package/utils/permissions/pathValidation.ts +485 -0
- package/utils/permissions/permissionExplainer.ts +250 -0
- package/utils/permissions/permissionRuleParser.ts +198 -0
- package/utils/permissions/permissionSetup.ts +1532 -0
- package/utils/permissions/permissions.ts +1486 -0
- package/utils/permissions/permissionsLoader.ts +296 -0
- package/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/utils/permissions/shellRuleMatching.ts +228 -0
- package/utils/permissions/yoloClassifier.ts +1495 -0
- package/utils/planModeV2.ts +95 -0
- package/utils/plans.ts +397 -0
- package/utils/platform.ts +150 -0
- package/utils/plugins/addDirPluginSettings.ts +71 -0
- package/utils/plugins/cacheUtils.ts +196 -0
- package/utils/plugins/dependencyResolver.ts +305 -0
- package/utils/plugins/fetchTelemetry.ts +135 -0
- package/utils/plugins/gitAvailability.ts +69 -0
- package/utils/plugins/headlessPluginInstall.ts +174 -0
- package/utils/plugins/hintRecommendation.ts +164 -0
- package/utils/plugins/installCounts.ts +292 -0
- package/utils/plugins/installedPluginsManager.ts +1268 -0
- package/utils/plugins/loadPluginAgents.ts +348 -0
- package/utils/plugins/loadPluginCommands.ts +946 -0
- package/utils/plugins/loadPluginHooks.ts +287 -0
- package/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/utils/plugins/lspPluginIntegration.ts +387 -0
- package/utils/plugins/lspRecommendation.ts +374 -0
- package/utils/plugins/managedPlugins.ts +27 -0
- package/utils/plugins/marketplaceHelpers.ts +592 -0
- package/utils/plugins/marketplaceManager.ts +2643 -0
- package/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/utils/plugins/mcpbHandler.ts +968 -0
- package/utils/plugins/officialMarketplace.ts +25 -0
- package/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/utils/plugins/performStartupChecks.tsx +70 -0
- package/utils/plugins/pluginAutoupdate.ts +284 -0
- package/utils/plugins/pluginBlocklist.ts +127 -0
- package/utils/plugins/pluginDirectories.ts +178 -0
- package/utils/plugins/pluginFlagging.ts +208 -0
- package/utils/plugins/pluginIdentifier.ts +123 -0
- package/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/utils/plugins/pluginLoader.ts +3302 -0
- package/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/utils/plugins/pluginPolicy.ts +20 -0
- package/utils/plugins/pluginStartupCheck.ts +341 -0
- package/utils/plugins/pluginVersioning.ts +157 -0
- package/utils/plugins/reconciler.ts +265 -0
- package/utils/plugins/refresh.ts +215 -0
- package/utils/plugins/schemas.ts +1681 -0
- package/utils/plugins/validatePlugin.ts +903 -0
- package/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/utils/plugins/zipCache.ts +406 -0
- package/utils/plugins/zipCacheAdapters.ts +164 -0
- package/utils/powershell/dangerousCmdlets.ts +185 -0
- package/utils/powershell/parser.ts +1804 -0
- package/utils/powershell/staticPrefix.ts +316 -0
- package/utils/preflightChecks.tsx +151 -0
- package/utils/privacyLevel.ts +55 -0
- package/utils/process.ts +68 -0
- package/utils/processUserInput/processBashCommand.tsx +140 -0
- package/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/utils/processUserInput/processTextPrompt.ts +100 -0
- package/utils/processUserInput/processUserInput.ts +605 -0
- package/utils/profilerBase.ts +46 -0
- package/utils/promptCategory.ts +49 -0
- package/utils/promptEditor.ts +188 -0
- package/utils/promptShellExecution.ts +183 -0
- package/utils/proxy.ts +426 -0
- package/utils/queryContext.ts +179 -0
- package/utils/queryHelpers.ts +552 -0
- package/utils/queryProfiler.ts +301 -0
- package/utils/queueProcessor.ts +95 -0
- package/utils/readEditContext.ts +227 -0
- package/utils/readFileInRange.ts +383 -0
- package/utils/releaseNotes.ts +360 -0
- package/utils/renderOptions.ts +113 -0
- package/utils/ripgrep.ts +679 -0
- package/utils/sandbox/sandbox-adapter.ts +985 -0
- package/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/utils/sanitization.ts +91 -0
- package/utils/screenshotClipboard.ts +121 -0
- package/utils/sdkEventQueue.ts +134 -0
- package/utils/secureStorage/fallbackStorage.ts +70 -0
- package/utils/secureStorage/index.ts +17 -0
- package/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/utils/secureStorage/plainTextStorage.ts +84 -0
- package/utils/semanticBoolean.ts +29 -0
- package/utils/semanticNumber.ts +36 -0
- package/utils/semver.ts +59 -0
- package/utils/sequential.ts +56 -0
- package/utils/sessionActivity.ts +133 -0
- package/utils/sessionEnvVars.ts +22 -0
- package/utils/sessionEnvironment.ts +166 -0
- package/utils/sessionFileAccessHooks.ts +250 -0
- package/utils/sessionIngressAuth.ts +140 -0
- package/utils/sessionRestore.ts +551 -0
- package/utils/sessionStart.ts +232 -0
- package/utils/sessionState.ts +150 -0
- package/utils/sessionStorage.ts +5105 -0
- package/utils/sessionStoragePortable.ts +793 -0
- package/utils/sessionTitle.ts +129 -0
- package/utils/sessionUrl.ts +64 -0
- package/utils/set.ts +53 -0
- package/utils/settings/allErrors.ts +32 -0
- package/utils/settings/applySettingsChange.ts +92 -0
- package/utils/settings/changeDetector.ts +488 -0
- package/utils/settings/constants.ts +202 -0
- package/utils/settings/internalWrites.ts +37 -0
- package/utils/settings/managedPath.ts +34 -0
- package/utils/settings/mdm/constants.ts +81 -0
- package/utils/settings/mdm/rawRead.ts +130 -0
- package/utils/settings/mdm/settings.ts +316 -0
- package/utils/settings/permissionValidation.ts +262 -0
- package/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/utils/settings/schemaOutput.ts +8 -0
- package/utils/settings/settings.ts +1015 -0
- package/utils/settings/settingsCache.ts +80 -0
- package/utils/settings/toolValidationConfig.ts +103 -0
- package/utils/settings/types.ts +1149 -0
- package/utils/settings/validateEditTool.ts +45 -0
- package/utils/settings/validation.ts +265 -0
- package/utils/settings/validationTips.ts +164 -0
- package/utils/shell/bashProvider.ts +255 -0
- package/utils/shell/outputLimits.ts +14 -0
- package/utils/shell/powershellDetection.ts +107 -0
- package/utils/shell/powershellProvider.ts +123 -0
- package/utils/shell/prefix.ts +367 -0
- package/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/utils/shell/resolveDefaultShell.ts +14 -0
- package/utils/shell/shellProvider.ts +33 -0
- package/utils/shell/shellToolUtils.ts +22 -0
- package/utils/shell/specPrefix.ts +241 -0
- package/utils/shellConfig.ts +167 -0
- package/utils/sideQuery.ts +222 -0
- package/utils/sideQuestion.ts +155 -0
- package/utils/signal.ts +43 -0
- package/utils/sinks.ts +16 -0
- package/utils/skills/skillChangeDetector.ts +311 -0
- package/utils/slashCommandParsing.ts +60 -0
- package/utils/sleep.ts +84 -0
- package/utils/sliceAnsi.ts +91 -0
- package/utils/slowOperations.ts +286 -0
- package/utils/standaloneAgent.ts +23 -0
- package/utils/startupProfiler.ts +194 -0
- package/utils/staticRender.tsx +116 -0
- package/utils/stats.ts +1061 -0
- package/utils/statsCache.ts +434 -0
- package/utils/status.tsx +362 -0
- package/utils/statusNoticeDefinitions.tsx +198 -0
- package/utils/statusNoticeHelpers.ts +20 -0
- package/utils/stream.ts +76 -0
- package/utils/streamJsonStdoutGuard.ts +123 -0
- package/utils/streamlinedTransform.ts +201 -0
- package/utils/stringUtils.ts +235 -0
- package/utils/subprocessEnv.ts +99 -0
- package/utils/suggestions/commandSuggestions.ts +567 -0
- package/utils/suggestions/directoryCompletion.ts +263 -0
- package/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/utils/suggestions/skillUsageTracking.ts +55 -0
- package/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/utils/swarm/backends/ITermBackend.ts +370 -0
- package/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/utils/swarm/backends/detection.ts +128 -0
- package/utils/swarm/backends/it2Setup.ts +245 -0
- package/utils/swarm/backends/registry.ts +464 -0
- package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/utils/swarm/backends/types.ts +311 -0
- package/utils/swarm/constants.ts +33 -0
- package/utils/swarm/inProcessRunner.ts +1552 -0
- package/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/utils/swarm/permissionSync.ts +928 -0
- package/utils/swarm/reconnection.ts +119 -0
- package/utils/swarm/spawnInProcess.ts +328 -0
- package/utils/swarm/spawnUtils.ts +146 -0
- package/utils/swarm/teamHelpers.ts +683 -0
- package/utils/swarm/teammateInit.ts +129 -0
- package/utils/swarm/teammateLayoutManager.ts +107 -0
- package/utils/swarm/teammateModel.ts +10 -0
- package/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/utils/systemDirectories.ts +74 -0
- package/utils/systemPrompt.ts +123 -0
- package/utils/systemPromptType.ts +14 -0
- package/utils/systemTheme.ts +119 -0
- package/utils/taggedId.ts +54 -0
- package/utils/task/TaskOutput.ts +390 -0
- package/utils/task/diskOutput.ts +451 -0
- package/utils/task/framework.ts +308 -0
- package/utils/task/outputFormatting.ts +38 -0
- package/utils/task/sdkProgress.ts +36 -0
- package/utils/tasks.ts +862 -0
- package/utils/teamDiscovery.ts +81 -0
- package/utils/teamMemoryOps.ts +88 -0
- package/utils/teammate.ts +292 -0
- package/utils/teammateContext.ts +96 -0
- package/utils/teammateMailbox.ts +1183 -0
- package/utils/telemetry/betaSessionTracing.ts +491 -0
- package/utils/telemetry/bigqueryExporter.ts +252 -0
- package/utils/telemetry/events.ts +75 -0
- package/utils/telemetry/instrumentation.ts +825 -0
- package/utils/telemetry/logger.ts +26 -0
- package/utils/telemetry/perfettoTracing.ts +1120 -0
- package/utils/telemetry/pluginTelemetry.ts +289 -0
- package/utils/telemetry/sessionTracing.ts +927 -0
- package/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/utils/telemetryAttributes.ts +71 -0
- package/utils/teleport/api.ts +466 -0
- package/utils/teleport/environmentSelection.ts +77 -0
- package/utils/teleport/environments.ts +120 -0
- package/utils/teleport/gitBundle.ts +292 -0
- package/utils/teleport.tsx +1226 -0
- package/utils/tempfile.ts +31 -0
- package/utils/terminal.ts +131 -0
- package/utils/terminalPanel.ts +191 -0
- package/utils/textHighlighting.ts +166 -0
- package/utils/theme.ts +639 -0
- package/utils/thinking.ts +162 -0
- package/utils/timeouts.ts +39 -0
- package/utils/tmuxSocket.ts +427 -0
- package/utils/todo/types.ts +18 -0
- package/utils/tokenBudget.ts +73 -0
- package/utils/tokens.ts +261 -0
- package/utils/toolErrors.ts +132 -0
- package/utils/toolPool.ts +79 -0
- package/utils/toolResultStorage.ts +1040 -0
- package/utils/toolSchemaCache.ts +26 -0
- package/utils/toolSearch.ts +756 -0
- package/utils/transcriptSearch.ts +202 -0
- package/utils/treeify.ts +170 -0
- package/utils/truncate.ts +179 -0
- package/utils/ultraplan/ccrSession.ts +349 -0
- package/utils/ultraplan/keyword.ts +127 -0
- package/utils/ultraplan/prompt.txt +1 -0
- package/utils/unaryLogging.ts +39 -0
- package/utils/undercover.ts +89 -0
- package/utils/user.ts +194 -0
- package/utils/userAgent.ts +10 -0
- package/utils/userPromptKeywords.ts +27 -0
- package/utils/uuid.ts +27 -0
- package/utils/warningHandler.ts +121 -0
- package/utils/which.ts +82 -0
- package/utils/windowsPaths.ts +173 -0
- package/utils/withResolvers.ts +13 -0
- package/utils/words.ts +800 -0
- package/utils/workloadContext.ts +57 -0
- package/utils/worktree.ts +1519 -0
- package/utils/worktreeModeEnabled.ts +11 -0
- package/utils/xdg.ts +65 -0
- package/utils/xmem.ts +6 -0
- package/utils/xml.ts +16 -0
- package/utils/yaml.ts +15 -0
- package/utils/zodToJsonSchema.ts +23 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provides ripgrep glob exclusion patterns for orphaned plugin versions.
|
|
3
|
+
*
|
|
4
|
+
* When plugin versions are updated, old versions are marked with a
|
|
5
|
+
* `.orphaned_at` file but kept on disk for 7 days (since concurrent
|
|
6
|
+
* sessions might still reference them). During this window, Grep/Glob
|
|
7
|
+
* could return files from orphaned versions, causing Claude to use
|
|
8
|
+
* outdated plugin code.
|
|
9
|
+
*
|
|
10
|
+
* We find `.orphaned_at` markers via a single ripgrep call and generate
|
|
11
|
+
* `--glob '!<dir>/**'` patterns for their parent directories. The cache
|
|
12
|
+
* is warmed in main.tsx AFTER cleanupOrphanedPluginVersionsInBackground
|
|
13
|
+
* settles disk state. Once populated, the exclusion list is frozen for
|
|
14
|
+
* the session unless /reload-plugins is called; subsequent disk mutations
|
|
15
|
+
* (autoupdate, concurrent sessions) don't affect it.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { dirname, isAbsolute, join, normalize, relative, sep } from 'path'
|
|
19
|
+
import { ripGrep } from '../ripgrep.js'
|
|
20
|
+
import { getPluginsDirectory } from './pluginDirectories.js'
|
|
21
|
+
|
|
22
|
+
// Inlined from cacheUtils.ts to avoid a circular dep through commands.js.
|
|
23
|
+
const ORPHANED_AT_FILENAME = '.orphaned_at'
|
|
24
|
+
|
|
25
|
+
/** Session-scoped cache. Frozen once computed — only cleared by explicit /reload-plugins. */
|
|
26
|
+
let cachedExclusions: string[] | null = null
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get ripgrep glob exclusion patterns for orphaned plugin versions.
|
|
30
|
+
*
|
|
31
|
+
* @param searchPath - When provided, exclusions are only returned if the
|
|
32
|
+
* search overlaps the plugin cache directory (avoids unnecessary --glob
|
|
33
|
+
* args for searches outside the cache).
|
|
34
|
+
*
|
|
35
|
+
* Warmed eagerly in main.tsx after orphan GC; the lazy-compute path here
|
|
36
|
+
* is a fallback. Best-effort: returns empty array if anything goes wrong.
|
|
37
|
+
*/
|
|
38
|
+
export async function getGlobExclusionsForPluginCache(
|
|
39
|
+
searchPath?: string,
|
|
40
|
+
): Promise<string[]> {
|
|
41
|
+
const cachePath = normalize(join(getPluginsDirectory(), 'cache'))
|
|
42
|
+
|
|
43
|
+
if (searchPath && !pathsOverlap(searchPath, cachePath)) {
|
|
44
|
+
return []
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (cachedExclusions !== null) {
|
|
48
|
+
return cachedExclusions
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
// Find all .orphaned_at files within the plugin cache directory.
|
|
53
|
+
// --hidden: marker is a dotfile. --no-ignore: don't let a stray
|
|
54
|
+
// .gitignore hide it. --max-depth 4: marker is always at
|
|
55
|
+
// cache/<marketplace>/<plugin>/<version>/.orphaned_at — don't recurse
|
|
56
|
+
// into plugin contents (node_modules, etc.). Never-aborts signal: no
|
|
57
|
+
// caller signal to thread.
|
|
58
|
+
const markers = await ripGrep(
|
|
59
|
+
[
|
|
60
|
+
'--files',
|
|
61
|
+
'--hidden',
|
|
62
|
+
'--no-ignore',
|
|
63
|
+
'--max-depth',
|
|
64
|
+
'4',
|
|
65
|
+
'--glob',
|
|
66
|
+
ORPHANED_AT_FILENAME,
|
|
67
|
+
],
|
|
68
|
+
cachePath,
|
|
69
|
+
new AbortController().signal,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
cachedExclusions = markers.map(markerPath => {
|
|
73
|
+
// ripgrep may return absolute or relative — normalize to relative.
|
|
74
|
+
const versionDir = dirname(markerPath)
|
|
75
|
+
const rel = isAbsolute(versionDir)
|
|
76
|
+
? relative(cachePath, versionDir)
|
|
77
|
+
: versionDir
|
|
78
|
+
// ripgrep glob patterns always use forward slashes, even on Windows
|
|
79
|
+
const posixRelative = rel.replace(/\\/g, '/')
|
|
80
|
+
return `!**/${posixRelative}/**`
|
|
81
|
+
})
|
|
82
|
+
return cachedExclusions
|
|
83
|
+
} catch {
|
|
84
|
+
// Best-effort — don't break core search tools if ripgrep fails here
|
|
85
|
+
cachedExclusions = []
|
|
86
|
+
return cachedExclusions
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function clearPluginCacheExclusions(): void {
|
|
91
|
+
cachedExclusions = null
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* One path is a prefix of the other. Special-cases root (normalize('/') + sep
|
|
96
|
+
* = '//'). Case-insensitive on win32 since normalize() doesn't lowercase
|
|
97
|
+
* drive letters and CLAUDE_CODE_PLUGIN_CACHE_DIR may disagree with resolved.
|
|
98
|
+
*/
|
|
99
|
+
function pathsOverlap(a: string, b: string): boolean {
|
|
100
|
+
const na = normalizeForCompare(a)
|
|
101
|
+
const nb = normalizeForCompare(b)
|
|
102
|
+
return (
|
|
103
|
+
na === nb ||
|
|
104
|
+
na === sep ||
|
|
105
|
+
nb === sep ||
|
|
106
|
+
na.startsWith(nb + sep) ||
|
|
107
|
+
nb.startsWith(na + sep)
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function normalizeForCompare(p: string): string {
|
|
112
|
+
const n = normalize(p)
|
|
113
|
+
return process.platform === 'win32' ? n.toLowerCase() : n
|
|
114
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { homedir } from 'os'
|
|
2
|
+
import { resolve } from 'path'
|
|
3
|
+
import { getErrnoCode } from '../errors.js'
|
|
4
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
5
|
+
import type { MarketplaceSource } from './schemas.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Parses a marketplace input string and returns the appropriate marketplace source type.
|
|
9
|
+
* Handles various input formats:
|
|
10
|
+
* - Git SSH URLs (user@host:path or user@host:path.git)
|
|
11
|
+
* - Standard: git@github.com:owner/repo.git
|
|
12
|
+
* - GitHub Enterprise SSH certificates: org-123456@github.com:owner/repo.git
|
|
13
|
+
* - Custom usernames: deploy@gitlab.com:group/project.git
|
|
14
|
+
* - Self-hosted: user@192.168.10.123:path/to/repo
|
|
15
|
+
* - HTTP/HTTPS URLs
|
|
16
|
+
* - GitHub shorthand (owner/repo)
|
|
17
|
+
* - Local file paths (.json files)
|
|
18
|
+
* - Local directory paths
|
|
19
|
+
*
|
|
20
|
+
* @param input The marketplace source input string
|
|
21
|
+
* @returns MarketplaceSource object, error object, or null if format is unrecognized
|
|
22
|
+
*/
|
|
23
|
+
export async function parseMarketplaceInput(
|
|
24
|
+
input: string,
|
|
25
|
+
): Promise<MarketplaceSource | { error: string } | null> {
|
|
26
|
+
const trimmed = input.trim()
|
|
27
|
+
const fs = getFsImplementation()
|
|
28
|
+
|
|
29
|
+
// Handle git SSH URLs with any valid username (not just 'git')
|
|
30
|
+
// Supports: user@host:path, user@host:path.git, and with #ref suffix
|
|
31
|
+
// Username can contain: alphanumeric, dots, underscores, hyphens
|
|
32
|
+
const sshMatch = trimmed.match(
|
|
33
|
+
/^([a-zA-Z0-9._-]+@[^:]+:.+?(?:\.git)?)(#(.+))?$/,
|
|
34
|
+
)
|
|
35
|
+
if (sshMatch?.[1]) {
|
|
36
|
+
const url = sshMatch[1]
|
|
37
|
+
const ref = sshMatch[3]
|
|
38
|
+
return ref ? { source: 'git', url, ref } : { source: 'git', url }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Handle URLs
|
|
42
|
+
if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {
|
|
43
|
+
// Extract fragment (ref) from URL if present
|
|
44
|
+
const fragmentMatch = trimmed.match(/^([^#]+)(#(.+))?$/)
|
|
45
|
+
const urlWithoutFragment = fragmentMatch?.[1] || trimmed
|
|
46
|
+
const ref = fragmentMatch?.[3]
|
|
47
|
+
|
|
48
|
+
// When user explicitly provides an HTTPS/HTTP URL that looks like a git
|
|
49
|
+
// repo, use the git source type so we clone rather than fetch-as-JSON.
|
|
50
|
+
// The .git suffix is a GitHub/GitLab/Bitbucket convention. Azure DevOps
|
|
51
|
+
// uses /_git/ in the path with NO suffix (appending .git breaks ADO:
|
|
52
|
+
// TF401019 "repo does not exist"). Without this check, an ADO URL falls
|
|
53
|
+
// through to source:'url' below, which tries to fetch it as a raw
|
|
54
|
+
// marketplace.json — the HTML response parses as "expected object,
|
|
55
|
+
// received string". (gh-31256 / CC-299)
|
|
56
|
+
if (
|
|
57
|
+
urlWithoutFragment.endsWith('.git') ||
|
|
58
|
+
urlWithoutFragment.includes('/_git/')
|
|
59
|
+
) {
|
|
60
|
+
return ref
|
|
61
|
+
? { source: 'git', url: urlWithoutFragment, ref }
|
|
62
|
+
: { source: 'git', url: urlWithoutFragment }
|
|
63
|
+
}
|
|
64
|
+
// Parse URL to check hostname
|
|
65
|
+
let url: URL
|
|
66
|
+
try {
|
|
67
|
+
url = new URL(urlWithoutFragment)
|
|
68
|
+
} catch (_err) {
|
|
69
|
+
// Not a valid URL for parsing, treat as generic URL
|
|
70
|
+
// new URL() throws TypeError for invalid URLs
|
|
71
|
+
return { source: 'url', url: urlWithoutFragment }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (url.hostname === 'github.com' || url.hostname === 'www.github.com') {
|
|
75
|
+
const match = url.pathname.match(/^\/([^/]+\/[^/]+?)(\/|\.git|$)/)
|
|
76
|
+
if (match?.[1]) {
|
|
77
|
+
// User explicitly provided HTTPS URL - keep it as HTTPS via 'git' type
|
|
78
|
+
// Add .git suffix if not present for proper git clone
|
|
79
|
+
const gitUrl = urlWithoutFragment.endsWith('.git')
|
|
80
|
+
? urlWithoutFragment
|
|
81
|
+
: `${urlWithoutFragment}.git`
|
|
82
|
+
return ref
|
|
83
|
+
? { source: 'git', url: gitUrl, ref }
|
|
84
|
+
: { source: 'git', url: gitUrl }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { source: 'url', url: urlWithoutFragment }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Handle local paths
|
|
91
|
+
// On Windows, also recognize backslash-relative (.\, ..\) and drive letter paths (C:\)
|
|
92
|
+
// These are Windows-only because backslashes are valid filename chars on Unix
|
|
93
|
+
const isWindows = process.platform === 'win32'
|
|
94
|
+
const isWindowsPath =
|
|
95
|
+
isWindows &&
|
|
96
|
+
(trimmed.startsWith('.\\') ||
|
|
97
|
+
trimmed.startsWith('..\\') ||
|
|
98
|
+
/^[a-zA-Z]:[/\\]/.test(trimmed))
|
|
99
|
+
if (
|
|
100
|
+
trimmed.startsWith('./') ||
|
|
101
|
+
trimmed.startsWith('../') ||
|
|
102
|
+
trimmed.startsWith('/') ||
|
|
103
|
+
trimmed.startsWith('~') ||
|
|
104
|
+
isWindowsPath
|
|
105
|
+
) {
|
|
106
|
+
const resolvedPath = resolve(
|
|
107
|
+
trimmed.startsWith('~') ? trimmed.replace(/^~/, homedir()) : trimmed,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
// Stat the path to determine if it's a file or directory. Swallow all stat
|
|
111
|
+
// errors (ENOENT, EACCES, EPERM, etc.) and return an error result instead
|
|
112
|
+
// of throwing — matches the old existsSync behavior which never threw.
|
|
113
|
+
let stats
|
|
114
|
+
try {
|
|
115
|
+
stats = await fs.stat(resolvedPath)
|
|
116
|
+
} catch (e: unknown) {
|
|
117
|
+
const code = getErrnoCode(e)
|
|
118
|
+
return {
|
|
119
|
+
error:
|
|
120
|
+
code === 'ENOENT'
|
|
121
|
+
? `Path does not exist: ${resolvedPath}`
|
|
122
|
+
: `Cannot access path: ${resolvedPath} (${code ?? e})`,
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (stats.isFile()) {
|
|
127
|
+
if (resolvedPath.endsWith('.json')) {
|
|
128
|
+
return { source: 'file', path: resolvedPath }
|
|
129
|
+
} else {
|
|
130
|
+
return {
|
|
131
|
+
error: `File path must point to a .json file (marketplace.json), but got: ${resolvedPath}`,
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} else if (stats.isDirectory()) {
|
|
135
|
+
return { source: 'directory', path: resolvedPath }
|
|
136
|
+
} else {
|
|
137
|
+
return {
|
|
138
|
+
error: `Path is neither a file nor a directory: ${resolvedPath}`,
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Handle GitHub shorthand (owner/repo, owner/repo#ref, or owner/repo@ref)
|
|
144
|
+
// Accept both # and @ as ref separators — the display formatter uses @, so users
|
|
145
|
+
// naturally type @ when copying from error messages or managed settings.
|
|
146
|
+
if (trimmed.includes('/') && !trimmed.startsWith('@')) {
|
|
147
|
+
if (trimmed.includes(':')) {
|
|
148
|
+
return null
|
|
149
|
+
}
|
|
150
|
+
// Extract ref if present (either #ref or @ref)
|
|
151
|
+
const fragmentMatch = trimmed.match(/^([^#@]+)(?:[#@](.+))?$/)
|
|
152
|
+
const repo = fragmentMatch?.[1] || trimmed
|
|
153
|
+
const ref = fragmentMatch?.[2]
|
|
154
|
+
// Assume it's a GitHub repo
|
|
155
|
+
return ref ? { source: 'github', repo, ref } : { source: 'github', repo }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// NPM packages not yet implemented
|
|
159
|
+
// Returning null for unrecognized input
|
|
160
|
+
|
|
161
|
+
return null
|
|
162
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { performBackgroundPluginInstallations } from '../../services/plugins/PluginInstallationManager.js';
|
|
2
|
+
import type { AppState } from '../../state/AppState.js';
|
|
3
|
+
import { checkHasTrustDialogAccepted } from '../config.js';
|
|
4
|
+
import { logForDebugging } from '../debug.js';
|
|
5
|
+
import { clearMarketplacesCache, registerSeedMarketplaces } from './marketplaceManager.js';
|
|
6
|
+
import { clearPluginCache } from './pluginLoader.js';
|
|
7
|
+
type SetAppState = (f: (prevState: AppState) => AppState) => void;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Perform plugin startup checks and initiate background installations
|
|
11
|
+
*
|
|
12
|
+
* This function starts background installation of marketplaces and plugins
|
|
13
|
+
* from trusted sources (repository and user settings) without blocking startup.
|
|
14
|
+
* Installation progress and errors are tracked in AppState and shown via notifications.
|
|
15
|
+
*
|
|
16
|
+
* SECURITY: This function is only called from REPL.tsx after the "trust this folder"
|
|
17
|
+
* dialog has been confirmed. The trust dialog in cli.tsx blocks all execution until
|
|
18
|
+
* the user explicitly trusts the current working directory, ensuring that plugin
|
|
19
|
+
* installations only happen with user consent. This prevents malicious repositories
|
|
20
|
+
* from automatically installing plugins without user approval.
|
|
21
|
+
*
|
|
22
|
+
* @param setAppState Function to update app state with installation progress
|
|
23
|
+
*/
|
|
24
|
+
export async function performStartupChecks(setAppState: SetAppState): Promise<void> {
|
|
25
|
+
logForDebugging('performStartupChecks called');
|
|
26
|
+
|
|
27
|
+
// Check if the current directory has been trusted
|
|
28
|
+
if (!checkHasTrustDialogAccepted()) {
|
|
29
|
+
logForDebugging('Trust not accepted for current directory - skipping plugin installations');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
logForDebugging('Starting background plugin installations');
|
|
34
|
+
|
|
35
|
+
// Register seed marketplaces (CLAUDE_CODE_PLUGIN_SEED_DIR) before diffing.
|
|
36
|
+
// Idempotent; no-op if seed not configured. Without this, background install
|
|
37
|
+
// would see seed marketplaces as missing → clone → defeats seed's purpose.
|
|
38
|
+
//
|
|
39
|
+
// If registration changed state, clear caches so earlier plugin-load passes
|
|
40
|
+
// (e.g. getAllMcpConfigs during REPL init) don't keep stale "marketplace
|
|
41
|
+
// not found" results.
|
|
42
|
+
const seedChanged = await registerSeedMarketplaces();
|
|
43
|
+
if (seedChanged) {
|
|
44
|
+
clearMarketplacesCache();
|
|
45
|
+
clearPluginCache('performStartupChecks: seed marketplaces changed');
|
|
46
|
+
// Set needsRefresh so useManagePlugins notifies the user to run
|
|
47
|
+
// /reload-plugins. Without this signal, the initial plugin-load
|
|
48
|
+
// (which raced and cached "marketplace not found") would persist
|
|
49
|
+
// until the user manually reloads.
|
|
50
|
+
setAppState(prev => {
|
|
51
|
+
if (prev.plugins.needsRefresh) return prev;
|
|
52
|
+
return {
|
|
53
|
+
...prev,
|
|
54
|
+
plugins: {
|
|
55
|
+
...prev.plugins,
|
|
56
|
+
needsRefresh: true
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Start background installations without waiting
|
|
63
|
+
// This will update AppState as installations progress
|
|
64
|
+
await performBackgroundPluginInstallations(setAppState);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
// Even if something fails here, don't block startup
|
|
67
|
+
logForDebugging(`Error initiating background plugin installations: ${error}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwZXJmb3JtQmFja2dyb3VuZFBsdWdpbkluc3RhbGxhdGlvbnMiLCJBcHBTdGF0ZSIsImNoZWNrSGFzVHJ1c3REaWFsb2dBY2NlcHRlZCIsImxvZ0ZvckRlYnVnZ2luZyIsImNsZWFyTWFya2V0cGxhY2VzQ2FjaGUiLCJyZWdpc3RlclNlZWRNYXJrZXRwbGFjZXMiLCJjbGVhclBsdWdpbkNhY2hlIiwiU2V0QXBwU3RhdGUiLCJmIiwicHJldlN0YXRlIiwicGVyZm9ybVN0YXJ0dXBDaGVja3MiLCJzZXRBcHBTdGF0ZSIsIlByb21pc2UiLCJzZWVkQ2hhbmdlZCIsInByZXYiLCJwbHVnaW5zIiwibmVlZHNSZWZyZXNoIiwiZXJyb3IiXSwic291cmNlcyI6WyJwZXJmb3JtU3RhcnR1cENoZWNrcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGVyZm9ybUJhY2tncm91bmRQbHVnaW5JbnN0YWxsYXRpb25zIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGx1Z2lucy9QbHVnaW5JbnN0YWxsYXRpb25NYW5hZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgeyBBcHBTdGF0ZSB9IGZyb20gJy4uLy4uL3N0YXRlL0FwcFN0YXRlLmpzJ1xuaW1wb3J0IHsgY2hlY2tIYXNUcnVzdERpYWxvZ0FjY2VwdGVkIH0gZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgbG9nRm9yRGVidWdnaW5nIH0gZnJvbSAnLi4vZGVidWcuanMnXG5pbXBvcnQge1xuICBjbGVhck1hcmtldHBsYWNlc0NhY2hlLFxuICByZWdpc3RlclNlZWRNYXJrZXRwbGFjZXMsXG59IGZyb20gJy4vbWFya2V0cGxhY2VNYW5hZ2VyLmpzJ1xuaW1wb3J0IHsgY2xlYXJQbHVnaW5DYWNoZSB9IGZyb20gJy4vcGx1Z2luTG9hZGVyLmpzJ1xuXG50eXBlIFNldEFwcFN0YXRlID0gKGY6IChwcmV2U3RhdGU6IEFwcFN0YXRlKSA9PiBBcHBTdGF0ZSkgPT4gdm9pZFxuXG4vKipcbiAqIFBlcmZvcm0gcGx1Z2luIHN0YXJ0dXAgY2hlY2tzIGFuZCBpbml0aWF0ZSBiYWNrZ3JvdW5kIGluc3RhbGxhdGlvbnNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBiYWNrZ3JvdW5kIGluc3RhbGxhdGlvbiBvZiBtYXJrZXRwbGFjZXMgYW5kIHBsdWdpbnNcbiAqIGZyb20gdHJ1c3RlZCBzb3VyY2VzIChyZXBvc2l0b3J5IGFuZCB1c2VyIHNldHRpbmdzKSB3aXRob3V0IGJsb2NraW5nIHN0YXJ0dXAuXG4gKiBJbnN0YWxsYXRpb24gcHJvZ3Jlc3MgYW5kIGVycm9ycyBhcmUgdHJhY2tlZCBpbiBBcHBTdGF0ZSBhbmQgc2hvd24gdmlhIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogU0VDVVJJVFk6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBSRVBMLnRzeCBhZnRlciB0aGUgXCJ0cnVzdCB0aGlzIGZvbGRlclwiXG4gKiBkaWFsb2cgaGFzIGJlZW4gY29uZmlybWVkLiBUaGUgdHJ1c3QgZGlhbG9nIGluIGNsaS50c3ggYmxvY2tzIGFsbCBleGVjdXRpb24gdW50aWxcbiAqIHRoZSB1c2VyIGV4cGxpY2l0bHkgdHJ1c3RzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBlbnN1cmluZyB0aGF0IHBsdWdpblxuICogaW5zdGFsbGF0aW9ucyBvbmx5IGhhcHBlbiB3aXRoIHVzZXIgY29uc2VudC4gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgcmVwb3NpdG9yaWVzXG4gKiBmcm9tIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGluZyBwbHVnaW5zIHdpdGhvdXQgdXNlciBhcHByb3ZhbC5cbiAqXG4gKiBAcGFyYW0gc2V0QXBwU3RhdGUgRnVuY3Rpb24gdG8gdXBkYXRlIGFwcCBzdGF0ZSB3aXRoIGluc3RhbGxhdGlvbiBwcm9ncmVzc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyZm9ybVN0YXJ0dXBDaGVja3MoXG4gIHNldEFwcFN0YXRlOiBTZXRBcHBTdGF0ZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBsb2dGb3JEZWJ1Z2dpbmcoJ3BlcmZvcm1TdGFydHVwQ2hlY2tzIGNhbGxlZCcpXG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBiZWVuIHRydXN0ZWRcbiAgaWYgKCFjaGVja0hhc1RydXN0RGlhbG9nQWNjZXB0ZWQoKSkge1xuICAgIGxvZ0ZvckRlYnVnZ2luZyhcbiAgICAgICdUcnVzdCBub3QgYWNjZXB0ZWQgZm9yIGN1cnJlbnQgZGlyZWN0b3J5IC0gc2tpcHBpbmcgcGx1Z2luIGluc3RhbGxhdGlvbnMnLFxuICAgIClcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nRm9yRGVidWdnaW5nKCdTdGFydGluZyBiYWNrZ3JvdW5kIHBsdWdpbiBpbnN0YWxsYXRpb25zJylcblxuICAgIC8vIFJlZ2lzdGVyIHNlZWQgbWFya2V0cGxhY2VzIChDTEFVREVfQ09ERV9QTFVHSU5fU0VFRF9ESVIpIGJlZm9yZSBkaWZmaW5nLlxuICAgIC8vIElkZW1wb3RlbnQ7IG5vLW9wIGlmIHNlZWQgbm90IGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhpcywgYmFja2dyb3VuZCBpbnN0YWxsXG4gICAgLy8gd291bGQgc2VlIHNlZWQgbWFya2V0cGxhY2VzIGFzIG1pc3Npbmcg4oaSIGNsb25lIOKGkiBkZWZlYXRzIHNlZWQncyBwdXJwb3NlLlxuICAgIC8vXG4gICAgLy8gSWYgcmVnaXN0cmF0aW9uIGNoYW5nZWQgc3RhdGUsIGNsZWFyIGNhY2hlcyBzbyBlYXJsaWVyIHBsdWdpbi1sb2FkIHBhc3Nlc1xuICAgIC8vIChlLmcuIGdldEFsbE1jcENvbmZpZ3MgZHVyaW5nIFJFUEwgaW5pdCkgZG9uJ3Qga2VlcCBzdGFsZSBcIm1hcmtldHBsYWNlXG4gICAgLy8gbm90IGZvdW5kXCIgcmVzdWx0cy5cbiAgICBjb25zdCBzZWVkQ2hhbmdlZCA9IGF3YWl0IHJlZ2lzdGVyU2VlZE1hcmtldHBsYWNlcygpXG4gICAgaWYgKHNlZWRDaGFuZ2VkKSB7XG4gICAgICBjbGVhck1hcmtldHBsYWNlc0NhY2hlKClcbiAgICAgIGNsZWFyUGx1Z2luQ2FjaGUoJ3BlcmZvcm1TdGFydHVwQ2hlY2tzOiBzZWVkIG1hcmtldHBsYWNlcyBjaGFuZ2VkJylcbiAgICAgIC8vIFNldCBuZWVkc1JlZnJlc2ggc28gdXNlTWFuYWdlUGx1Z2lucyBub3RpZmllcyB0aGUgdXNlciB0byBydW5cbiAgICAgIC8vIC9yZWxvYWQtcGx1Z2lucy4gV2l0aG91dCB0aGlzIHNpZ25hbCwgdGhlIGluaXRpYWwgcGx1Z2luLWxvYWRcbiAgICAgIC8vICh3aGljaCByYWNlZCBhbmQgY2FjaGVkIFwibWFya2V0cGxhY2Ugbm90IGZvdW5kXCIpIHdvdWxkIHBlcnNpc3RcbiAgICAgIC8vIHVudGlsIHRoZSB1c2VyIG1hbnVhbGx5IHJlbG9hZHMuXG4gICAgICBzZXRBcHBTdGF0ZShwcmV2ID0+IHtcbiAgICAgICAgaWYgKHByZXYucGx1Z2lucy5uZWVkc1JlZnJlc2gpIHJldHVybiBwcmV2XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBwbHVnaW5zOiB7IC4uLnByZXYucGx1Z2lucywgbmVlZHNSZWZyZXNoOiB0cnVlIH0sXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gU3RhcnQgYmFja2dyb3VuZCBpbnN0YWxsYXRpb25zIHdpdGhvdXQgd2FpdGluZ1xuICAgIC8vIFRoaXMgd2lsbCB1cGRhdGUgQXBwU3RhdGUgYXMgaW5zdGFsbGF0aW9ucyBwcm9ncmVzc1xuICAgIGF3YWl0IHBlcmZvcm1CYWNrZ3JvdW5kUGx1Z2luSW5zdGFsbGF0aW9ucyhzZXRBcHBTdGF0ZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBFdmVuIGlmIHNvbWV0aGluZyBmYWlscyBoZXJlLCBkb24ndCBibG9jayBzdGFydHVwXG4gICAgbG9nRm9yRGVidWdnaW5nKFxuICAgICAgYEVycm9yIGluaXRpYXRpbmcgYmFja2dyb3VuZCBwbHVnaW4gaW5zdGFsbGF0aW9uczogJHtlcnJvcn1gLFxuICAgIClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxvQ0FBb0MsUUFBUSxxREFBcUQ7QUFDMUcsY0FBY0MsUUFBUSxRQUFRLHlCQUF5QjtBQUN2RCxTQUFTQywyQkFBMkIsUUFBUSxjQUFjO0FBQzFELFNBQVNDLGVBQWUsUUFBUSxhQUFhO0FBQzdDLFNBQ0VDLHNCQUFzQixFQUN0QkMsd0JBQXdCLFFBQ25CLHlCQUF5QjtBQUNoQyxTQUFTQyxnQkFBZ0IsUUFBUSxtQkFBbUI7QUFFcEQsS0FBS0MsV0FBVyxHQUFHLENBQUNDLENBQUMsRUFBRSxDQUFDQyxTQUFTLEVBQUVSLFFBQVEsRUFBRSxHQUFHQSxRQUFRLEVBQUUsR0FBRyxJQUFJOztBQUVqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGVBQWVTLG9CQUFvQkEsQ0FDeENDLFdBQVcsRUFBRUosV0FBVyxDQUN6QixFQUFFSyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDZlQsZUFBZSxDQUFDLDZCQUE2QixDQUFDOztFQUU5QztFQUNBLElBQUksQ0FBQ0QsMkJBQTJCLENBQUMsQ0FBQyxFQUFFO0lBQ2xDQyxlQUFlLENBQ2IsMEVBQ0YsQ0FBQztJQUNEO0VBQ0Y7RUFFQSxJQUFJO0lBQ0ZBLGVBQWUsQ0FBQywwQ0FBMEMsQ0FBQzs7SUFFM0Q7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxNQUFNVSxXQUFXLEdBQUcsTUFBTVIsd0JBQXdCLENBQUMsQ0FBQztJQUNwRCxJQUFJUSxXQUFXLEVBQUU7TUFDZlQsc0JBQXNCLENBQUMsQ0FBQztNQUN4QkUsZ0JBQWdCLENBQUMsaURBQWlELENBQUM7TUFDbkU7TUFDQTtNQUNBO01BQ0E7TUFDQUssV0FBVyxDQUFDRyxJQUFJLElBQUk7UUFDbEIsSUFBSUEsSUFBSSxDQUFDQyxPQUFPLENBQUNDLFlBQVksRUFBRSxPQUFPRixJQUFJO1FBQzFDLE9BQU87VUFDTCxHQUFHQSxJQUFJO1VBQ1BDLE9BQU8sRUFBRTtZQUFFLEdBQUdELElBQUksQ0FBQ0MsT0FBTztZQUFFQyxZQUFZLEVBQUU7VUFBSztRQUNqRCxDQUFDO01BQ0gsQ0FBQyxDQUFDO0lBQ0o7O0lBRUE7SUFDQTtJQUNBLE1BQU1oQixvQ0FBb0MsQ0FBQ1csV0FBVyxDQUFDO0VBQ3pELENBQUMsQ0FBQyxPQUFPTSxLQUFLLEVBQUU7SUFDZDtJQUNBZCxlQUFlLENBQ2IscURBQXFEYyxLQUFLLEVBQzVELENBQUM7RUFDSDtBQUNGIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background plugin autoupdate functionality
|
|
3
|
+
*
|
|
4
|
+
* At startup, this module:
|
|
5
|
+
* 1. First updates marketplaces that have autoUpdate enabled
|
|
6
|
+
* 2. Then checks all installed plugins from those marketplaces and updates them
|
|
7
|
+
*
|
|
8
|
+
* Updates are non-inplace (disk-only), requiring a restart to take effect.
|
|
9
|
+
* Official Anthropic marketplaces have autoUpdate enabled by default,
|
|
10
|
+
* but users can disable it per-marketplace.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { updatePluginOp } from '../../services/plugins/pluginOperations.js'
|
|
14
|
+
import { shouldSkipPluginAutoupdate } from '../config.js'
|
|
15
|
+
import { logForDebugging } from '../debug.js'
|
|
16
|
+
import { errorMessage } from '../errors.js'
|
|
17
|
+
import { logError } from '../log.js'
|
|
18
|
+
import {
|
|
19
|
+
getPendingUpdatesDetails,
|
|
20
|
+
hasPendingUpdates,
|
|
21
|
+
isInstallationRelevantToCurrentProject,
|
|
22
|
+
loadInstalledPluginsFromDisk,
|
|
23
|
+
} from './installedPluginsManager.js'
|
|
24
|
+
import {
|
|
25
|
+
getDeclaredMarketplaces,
|
|
26
|
+
loadKnownMarketplacesConfig,
|
|
27
|
+
refreshMarketplace,
|
|
28
|
+
} from './marketplaceManager.js'
|
|
29
|
+
import { parsePluginIdentifier } from './pluginIdentifier.js'
|
|
30
|
+
import { isMarketplaceAutoUpdate, type PluginScope } from './schemas.js'
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Callback type for notifying when plugins have been updated
|
|
34
|
+
*/
|
|
35
|
+
export type PluginAutoUpdateCallback = (updatedPlugins: string[]) => void
|
|
36
|
+
|
|
37
|
+
// Store callback for plugin update notifications
|
|
38
|
+
let pluginUpdateCallback: PluginAutoUpdateCallback | null = null
|
|
39
|
+
|
|
40
|
+
// Store pending updates that occurred before callback was registered
|
|
41
|
+
// This handles the race condition where updates complete before REPL mounts
|
|
42
|
+
let pendingNotification: string[] | null = null
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Register a callback to be notified when plugins are auto-updated.
|
|
46
|
+
* This is used by the REPL to show restart notifications.
|
|
47
|
+
*
|
|
48
|
+
* If plugins were already updated before the callback was registered,
|
|
49
|
+
* the callback will be invoked immediately with the pending updates.
|
|
50
|
+
*/
|
|
51
|
+
export function onPluginsAutoUpdated(
|
|
52
|
+
callback: PluginAutoUpdateCallback,
|
|
53
|
+
): () => void {
|
|
54
|
+
pluginUpdateCallback = callback
|
|
55
|
+
|
|
56
|
+
// If there are pending updates that happened before registration, deliver them now
|
|
57
|
+
if (pendingNotification !== null && pendingNotification.length > 0) {
|
|
58
|
+
callback(pendingNotification)
|
|
59
|
+
pendingNotification = null
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return () => {
|
|
63
|
+
pluginUpdateCallback = null
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Check if pending updates came from autoupdate (for notification purposes).
|
|
69
|
+
* Returns the list of plugin names that have pending updates.
|
|
70
|
+
*/
|
|
71
|
+
export function getAutoUpdatedPluginNames(): string[] {
|
|
72
|
+
if (!hasPendingUpdates()) {
|
|
73
|
+
return []
|
|
74
|
+
}
|
|
75
|
+
return getPendingUpdatesDetails().map(
|
|
76
|
+
d => parsePluginIdentifier(d.pluginId).name,
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the set of marketplaces that have autoUpdate enabled.
|
|
82
|
+
* Returns the marketplace names that should be auto-updated.
|
|
83
|
+
*/
|
|
84
|
+
async function getAutoUpdateEnabledMarketplaces(): Promise<Set<string>> {
|
|
85
|
+
const config = await loadKnownMarketplacesConfig()
|
|
86
|
+
const declared = getDeclaredMarketplaces()
|
|
87
|
+
const enabled = new Set<string>()
|
|
88
|
+
|
|
89
|
+
for (const [name, entry] of Object.entries(config)) {
|
|
90
|
+
// Settings-declared autoUpdate takes precedence over JSON state
|
|
91
|
+
const declaredAutoUpdate = declared[name]?.autoUpdate
|
|
92
|
+
const autoUpdate =
|
|
93
|
+
declaredAutoUpdate !== undefined
|
|
94
|
+
? declaredAutoUpdate
|
|
95
|
+
: isMarketplaceAutoUpdate(name, entry)
|
|
96
|
+
if (autoUpdate) {
|
|
97
|
+
enabled.add(name.toLowerCase())
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return enabled
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Update a single plugin's installations.
|
|
106
|
+
* Returns the plugin ID if any installation was updated, null otherwise.
|
|
107
|
+
*/
|
|
108
|
+
async function updatePlugin(
|
|
109
|
+
pluginId: string,
|
|
110
|
+
installations: Array<{ scope: PluginScope; projectPath?: string }>,
|
|
111
|
+
): Promise<string | null> {
|
|
112
|
+
let wasUpdated = false
|
|
113
|
+
|
|
114
|
+
for (const { scope } of installations) {
|
|
115
|
+
try {
|
|
116
|
+
const result = await updatePluginOp(pluginId, scope)
|
|
117
|
+
|
|
118
|
+
if (result.success && !result.alreadyUpToDate) {
|
|
119
|
+
wasUpdated = true
|
|
120
|
+
logForDebugging(
|
|
121
|
+
`Plugin autoupdate: updated ${pluginId} from ${result.oldVersion} to ${result.newVersion}`,
|
|
122
|
+
)
|
|
123
|
+
} else if (!result.alreadyUpToDate) {
|
|
124
|
+
logForDebugging(
|
|
125
|
+
`Plugin autoupdate: failed to update ${pluginId}: ${result.message}`,
|
|
126
|
+
{ level: 'warn' },
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
} catch (error) {
|
|
130
|
+
logForDebugging(
|
|
131
|
+
`Plugin autoupdate: error updating ${pluginId}: ${errorMessage(error)}`,
|
|
132
|
+
{ level: 'warn' },
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return wasUpdated ? pluginId : null
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Update all project-relevant installed plugins from the given marketplaces.
|
|
142
|
+
*
|
|
143
|
+
* Iterates installed_plugins.json, filters to plugins whose marketplace is in
|
|
144
|
+
* the set, further filters each plugin's installations to those relevant to
|
|
145
|
+
* the current project (user/managed scope, or project/local scope matching
|
|
146
|
+
* cwd — see isInstallationRelevantToCurrentProject), then calls updatePluginOp
|
|
147
|
+
* per installation. Already-up-to-date plugins are silently skipped.
|
|
148
|
+
*
|
|
149
|
+
* Called by:
|
|
150
|
+
* - updatePlugins() below — background autoupdate path (autoUpdate-enabled
|
|
151
|
+
* marketplaces only; third-party marketplaces default autoUpdate: false)
|
|
152
|
+
* - ManageMarketplaces.tsx applyChanges() — user-initiated /plugin marketplace
|
|
153
|
+
* update. Before #29512 this path only called refreshMarketplace() (git
|
|
154
|
+
* pull on the marketplace clone), so the loader would create the new
|
|
155
|
+
* version cache dir but installed_plugins.json stayed on the old version,
|
|
156
|
+
* and the orphan GC stamped the NEW dir with .orphaned_at on next startup.
|
|
157
|
+
*
|
|
158
|
+
* @param marketplaceNames - lowercase marketplace names to update plugins from
|
|
159
|
+
* @returns plugin IDs that were actually updated (not already up-to-date)
|
|
160
|
+
*/
|
|
161
|
+
export async function updatePluginsForMarketplaces(
|
|
162
|
+
marketplaceNames: Set<string>,
|
|
163
|
+
): Promise<string[]> {
|
|
164
|
+
const installedPlugins = loadInstalledPluginsFromDisk()
|
|
165
|
+
const pluginIds = Object.keys(installedPlugins.plugins)
|
|
166
|
+
|
|
167
|
+
if (pluginIds.length === 0) {
|
|
168
|
+
return []
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const results = await Promise.allSettled(
|
|
172
|
+
pluginIds.map(async pluginId => {
|
|
173
|
+
const { marketplace } = parsePluginIdentifier(pluginId)
|
|
174
|
+
if (!marketplace || !marketplaceNames.has(marketplace.toLowerCase())) {
|
|
175
|
+
return null
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const allInstallations = installedPlugins.plugins[pluginId]
|
|
179
|
+
if (!allInstallations || allInstallations.length === 0) {
|
|
180
|
+
return null
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const relevantInstallations = allInstallations.filter(
|
|
184
|
+
isInstallationRelevantToCurrentProject,
|
|
185
|
+
)
|
|
186
|
+
if (relevantInstallations.length === 0) {
|
|
187
|
+
return null
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return updatePlugin(pluginId, relevantInstallations)
|
|
191
|
+
}),
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
return results
|
|
195
|
+
.filter(
|
|
196
|
+
(r): r is PromiseFulfilledResult<string> =>
|
|
197
|
+
r.status === 'fulfilled' && r.value !== null,
|
|
198
|
+
)
|
|
199
|
+
.map(r => r.value)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Update plugins from marketplaces that have autoUpdate enabled.
|
|
204
|
+
* Returns the list of plugin IDs that were updated.
|
|
205
|
+
*/
|
|
206
|
+
async function updatePlugins(
|
|
207
|
+
autoUpdateEnabledMarketplaces: Set<string>,
|
|
208
|
+
): Promise<string[]> {
|
|
209
|
+
return updatePluginsForMarketplaces(autoUpdateEnabledMarketplaces)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Auto-update marketplaces and plugins in the background.
|
|
214
|
+
*
|
|
215
|
+
* This function:
|
|
216
|
+
* 1. Checks which marketplaces have autoUpdate enabled
|
|
217
|
+
* 2. Refreshes only those marketplaces (git pull/re-download)
|
|
218
|
+
* 3. Updates installed plugins from those marketplaces
|
|
219
|
+
* 4. If any plugins were updated, notifies via the registered callback
|
|
220
|
+
*
|
|
221
|
+
* Official Anthropic marketplaces have autoUpdate enabled by default,
|
|
222
|
+
* but users can disable it per-marketplace in the UI.
|
|
223
|
+
*
|
|
224
|
+
* This function runs silently without blocking user interaction.
|
|
225
|
+
* Called from main.tsx during startup as a background job.
|
|
226
|
+
*/
|
|
227
|
+
export function autoUpdateMarketplacesAndPluginsInBackground(): void {
|
|
228
|
+
void (async () => {
|
|
229
|
+
if (shouldSkipPluginAutoupdate()) {
|
|
230
|
+
logForDebugging('Plugin autoupdate: skipped (auto-updater disabled)')
|
|
231
|
+
return
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
try {
|
|
235
|
+
// Get marketplaces with autoUpdate enabled
|
|
236
|
+
const autoUpdateEnabledMarketplaces =
|
|
237
|
+
await getAutoUpdateEnabledMarketplaces()
|
|
238
|
+
|
|
239
|
+
if (autoUpdateEnabledMarketplaces.size === 0) {
|
|
240
|
+
return
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Refresh only marketplaces with autoUpdate enabled
|
|
244
|
+
const refreshResults = await Promise.allSettled(
|
|
245
|
+
Array.from(autoUpdateEnabledMarketplaces).map(async name => {
|
|
246
|
+
try {
|
|
247
|
+
await refreshMarketplace(name, undefined, {
|
|
248
|
+
disableCredentialHelper: true,
|
|
249
|
+
})
|
|
250
|
+
} catch (error) {
|
|
251
|
+
logForDebugging(
|
|
252
|
+
`Plugin autoupdate: failed to refresh marketplace ${name}: ${errorMessage(error)}`,
|
|
253
|
+
{ level: 'warn' },
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
}),
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
// Log any refresh failures
|
|
260
|
+
const failures = refreshResults.filter(r => r.status === 'rejected')
|
|
261
|
+
if (failures.length > 0) {
|
|
262
|
+
logForDebugging(
|
|
263
|
+
`Plugin autoupdate: ${failures.length} marketplace refresh(es) failed`,
|
|
264
|
+
{ level: 'warn' },
|
|
265
|
+
)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
logForDebugging('Plugin autoupdate: checking installed plugins')
|
|
269
|
+
const updatedPlugins = await updatePlugins(autoUpdateEnabledMarketplaces)
|
|
270
|
+
|
|
271
|
+
if (updatedPlugins.length > 0) {
|
|
272
|
+
if (pluginUpdateCallback) {
|
|
273
|
+
// Callback is already registered, invoke it immediately
|
|
274
|
+
pluginUpdateCallback(updatedPlugins)
|
|
275
|
+
} else {
|
|
276
|
+
// Callback not yet registered (REPL not mounted), store for later delivery
|
|
277
|
+
pendingNotification = updatedPlugins
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
} catch (error) {
|
|
281
|
+
logError(error)
|
|
282
|
+
}
|
|
283
|
+
})()
|
|
284
|
+
}
|