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