@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,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin delisting detection.
|
|
3
|
+
*
|
|
4
|
+
* Compares installed plugins against marketplace manifests to find plugins
|
|
5
|
+
* that have been removed, and auto-uninstalls them.
|
|
6
|
+
*
|
|
7
|
+
* The security.json fetch was removed (see #25447) — ~29.5M/week GitHub hits
|
|
8
|
+
* for UI reason/text only. If re-introduced, serve from downloads.claude.ai.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { uninstallPluginOp } from '../../services/plugins/pluginOperations.js'
|
|
12
|
+
import { logForDebugging } from '../debug.js'
|
|
13
|
+
import { errorMessage } from '../errors.js'
|
|
14
|
+
import { loadInstalledPluginsV2 } from './installedPluginsManager.js'
|
|
15
|
+
import {
|
|
16
|
+
getMarketplace,
|
|
17
|
+
loadKnownMarketplacesConfigSafe,
|
|
18
|
+
} from './marketplaceManager.js'
|
|
19
|
+
import {
|
|
20
|
+
addFlaggedPlugin,
|
|
21
|
+
getFlaggedPlugins,
|
|
22
|
+
loadFlaggedPlugins,
|
|
23
|
+
} from './pluginFlagging.js'
|
|
24
|
+
import type { InstalledPluginsFileV2, PluginMarketplace } from './schemas.js'
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Detect plugins installed from a marketplace that are no longer listed there.
|
|
28
|
+
*
|
|
29
|
+
* @param installedPlugins All installed plugins
|
|
30
|
+
* @param marketplace The marketplace to check against
|
|
31
|
+
* @param marketplaceName The marketplace name suffix (e.g. "claude-plugins-official")
|
|
32
|
+
* @returns List of delisted plugin IDs in "name@marketplace" format
|
|
33
|
+
*/
|
|
34
|
+
export function detectDelistedPlugins(
|
|
35
|
+
installedPlugins: InstalledPluginsFileV2,
|
|
36
|
+
marketplace: PluginMarketplace,
|
|
37
|
+
marketplaceName: string,
|
|
38
|
+
): string[] {
|
|
39
|
+
const marketplacePluginNames = new Set(marketplace.plugins.map(p => p.name))
|
|
40
|
+
const suffix = `@${marketplaceName}`
|
|
41
|
+
|
|
42
|
+
const delisted: string[] = []
|
|
43
|
+
for (const pluginId of Object.keys(installedPlugins.plugins)) {
|
|
44
|
+
if (!pluginId.endsWith(suffix)) continue
|
|
45
|
+
|
|
46
|
+
const pluginName = pluginId.slice(0, -suffix.length)
|
|
47
|
+
if (!marketplacePluginNames.has(pluginName)) {
|
|
48
|
+
delisted.push(pluginId)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return delisted
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Detect delisted plugins across all marketplaces, auto-uninstall them,
|
|
57
|
+
* and record them as flagged.
|
|
58
|
+
*
|
|
59
|
+
* This is the core delisting enforcement logic, shared between interactive
|
|
60
|
+
* mode (useManagePlugins) and headless mode (main.tsx print path).
|
|
61
|
+
*
|
|
62
|
+
* @returns List of newly flagged plugin IDs
|
|
63
|
+
*/
|
|
64
|
+
export async function detectAndUninstallDelistedPlugins(): Promise<string[]> {
|
|
65
|
+
await loadFlaggedPlugins()
|
|
66
|
+
|
|
67
|
+
const installedPlugins = loadInstalledPluginsV2()
|
|
68
|
+
const alreadyFlagged = getFlaggedPlugins()
|
|
69
|
+
// Read-only iteration — Safe variant so a corrupted config doesn't throw
|
|
70
|
+
// out of this function (it's called in the same try-block as loadAllPlugins
|
|
71
|
+
// in useManagePlugins, so a throw here would void loadAllPlugins' resilience).
|
|
72
|
+
const knownMarketplaces = await loadKnownMarketplacesConfigSafe()
|
|
73
|
+
const newlyFlagged: string[] = []
|
|
74
|
+
|
|
75
|
+
for (const marketplaceName of Object.keys(knownMarketplaces)) {
|
|
76
|
+
try {
|
|
77
|
+
const marketplace = await getMarketplace(marketplaceName)
|
|
78
|
+
|
|
79
|
+
if (!marketplace.forceRemoveDeletedPlugins) continue
|
|
80
|
+
|
|
81
|
+
const delisted = detectDelistedPlugins(
|
|
82
|
+
installedPlugins,
|
|
83
|
+
marketplace,
|
|
84
|
+
marketplaceName,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
for (const pluginId of delisted) {
|
|
88
|
+
if (pluginId in alreadyFlagged) continue
|
|
89
|
+
|
|
90
|
+
// Skip managed-only plugins — enterprise admin should handle those
|
|
91
|
+
const installations = installedPlugins.plugins[pluginId] ?? []
|
|
92
|
+
const hasUserInstall = installations.some(
|
|
93
|
+
i =>
|
|
94
|
+
i.scope === 'user' || i.scope === 'project' || i.scope === 'local',
|
|
95
|
+
)
|
|
96
|
+
if (!hasUserInstall) continue
|
|
97
|
+
|
|
98
|
+
// Auto-uninstall the delisted plugin from all user-controllable scopes
|
|
99
|
+
for (const installation of installations) {
|
|
100
|
+
const { scope } = installation
|
|
101
|
+
if (scope !== 'user' && scope !== 'project' && scope !== 'local') {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
await uninstallPluginOp(pluginId, scope)
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logForDebugging(
|
|
108
|
+
`Failed to auto-uninstall delisted plugin ${pluginId} from ${scope}: ${errorMessage(error)}`,
|
|
109
|
+
{ level: 'error' },
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
await addFlaggedPlugin(pluginId)
|
|
115
|
+
newlyFlagged.push(pluginId)
|
|
116
|
+
}
|
|
117
|
+
} catch (error) {
|
|
118
|
+
// Marketplace may not be available yet — log and continue
|
|
119
|
+
logForDebugging(
|
|
120
|
+
`Failed to check for delisted plugins in "${marketplaceName}": ${errorMessage(error)}`,
|
|
121
|
+
{ level: 'warn' },
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return newlyFlagged
|
|
127
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized plugin directory configuration.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the single source of truth for the plugins directory path.
|
|
5
|
+
* It supports switching between 'plugins' and 'cowork_plugins' directories via:
|
|
6
|
+
* - CLI flag: --cowork
|
|
7
|
+
* - Environment variable: CLAUDE_CODE_USE_COWORK_PLUGINS
|
|
8
|
+
*
|
|
9
|
+
* The base directory can be overridden via CLAUDE_CODE_PLUGIN_CACHE_DIR.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { mkdirSync } from 'fs'
|
|
13
|
+
import { readdir, rm, stat } from 'fs/promises'
|
|
14
|
+
import { delimiter, join } from 'path'
|
|
15
|
+
import { getUseCoworkPlugins } from '../../bootstrap/state.js'
|
|
16
|
+
import { logForDebugging } from '../debug.js'
|
|
17
|
+
import { getClaudeConfigHomeDir, isEnvTruthy } from '../envUtils.js'
|
|
18
|
+
import { errorMessage, isFsInaccessible } from '../errors.js'
|
|
19
|
+
import { formatFileSize } from '../format.js'
|
|
20
|
+
import { expandTilde } from '../permissions/pathValidation.js'
|
|
21
|
+
|
|
22
|
+
const PLUGINS_DIR = 'plugins'
|
|
23
|
+
const COWORK_PLUGINS_DIR = 'cowork_plugins'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the plugins directory name based on current mode.
|
|
27
|
+
* Uses session state (from --cowork flag) or env var.
|
|
28
|
+
*
|
|
29
|
+
* Priority:
|
|
30
|
+
* 1. Session state (set by CLI flag --cowork)
|
|
31
|
+
* 2. Environment variable CLAUDE_CODE_USE_COWORK_PLUGINS
|
|
32
|
+
* 3. Default: 'plugins'
|
|
33
|
+
*/
|
|
34
|
+
function getPluginsDirectoryName(): string {
|
|
35
|
+
// Session state takes precedence (set by CLI flag)
|
|
36
|
+
if (getUseCoworkPlugins()) {
|
|
37
|
+
return COWORK_PLUGINS_DIR
|
|
38
|
+
}
|
|
39
|
+
// Fall back to env var
|
|
40
|
+
if (isEnvTruthy(process.env.CLAUDE_CODE_USE_COWORK_PLUGINS)) {
|
|
41
|
+
return COWORK_PLUGINS_DIR
|
|
42
|
+
}
|
|
43
|
+
return PLUGINS_DIR
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get the full path to the plugins directory.
|
|
48
|
+
*
|
|
49
|
+
* Priority:
|
|
50
|
+
* 1. CLAUDE_CODE_PLUGIN_CACHE_DIR env var (explicit override)
|
|
51
|
+
* 2. Default: ~/.claude/plugins or ~/.claude/cowork_plugins
|
|
52
|
+
*/
|
|
53
|
+
export function getPluginsDirectory(): string {
|
|
54
|
+
// expandTilde: when CLAUDE_CODE_PLUGIN_CACHE_DIR is set via settings.json
|
|
55
|
+
// `env` (not shell), ~ is not expanded by the shell. Without this, a value
|
|
56
|
+
// like "~/.claude/plugins" becomes a literal `~` directory created in the
|
|
57
|
+
// cwd of every project (gh-30794 / CC-212).
|
|
58
|
+
const envOverride = process.env.CLAUDE_CODE_PLUGIN_CACHE_DIR
|
|
59
|
+
if (envOverride) {
|
|
60
|
+
return expandTilde(envOverride)
|
|
61
|
+
}
|
|
62
|
+
return join(getClaudeConfigHomeDir(), getPluginsDirectoryName())
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get the read-only plugin seed directories, if configured.
|
|
67
|
+
*
|
|
68
|
+
* Customers can pre-bake a populated plugins directory into their container
|
|
69
|
+
* image and point CLAUDE_CODE_PLUGIN_SEED_DIR at it. CC will use it as a
|
|
70
|
+
* read-only fallback layer under the primary plugins directory — marketplaces
|
|
71
|
+
* and plugin caches found in the seed are used in place without re-cloning.
|
|
72
|
+
*
|
|
73
|
+
* Multiple seed directories can be layered using the platform path delimiter
|
|
74
|
+
* (':' on Unix, ';' on Windows), in PATH-like precedence order — the first
|
|
75
|
+
* seed that contains a given marketplace or plugin cache wins.
|
|
76
|
+
*
|
|
77
|
+
* Seed structure mirrors the primary plugins directory:
|
|
78
|
+
* $CLAUDE_CODE_PLUGIN_SEED_DIR/
|
|
79
|
+
* known_marketplaces.json
|
|
80
|
+
* marketplaces/<name>/...
|
|
81
|
+
* cache/<marketplace>/<plugin>/<version>/...
|
|
82
|
+
*
|
|
83
|
+
* @returns Absolute paths to seed dirs in precedence order (empty if unset)
|
|
84
|
+
*/
|
|
85
|
+
export function getPluginSeedDirs(): string[] {
|
|
86
|
+
// Same tilde-expansion rationale as getPluginsDirectory (gh-30794).
|
|
87
|
+
const raw = process.env.CLAUDE_CODE_PLUGIN_SEED_DIR
|
|
88
|
+
if (!raw) return []
|
|
89
|
+
return raw.split(delimiter).filter(Boolean).map(expandTilde)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function sanitizePluginId(pluginId: string): string {
|
|
93
|
+
// Same character class as the install-cache sanitizer (pluginLoader.ts)
|
|
94
|
+
return pluginId.replace(/[^a-zA-Z0-9\-_]/g, '-')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Pure path — no mkdir. For display (e.g. uninstall dialog). */
|
|
98
|
+
export function pluginDataDirPath(pluginId: string): string {
|
|
99
|
+
return join(getPluginsDirectory(), 'data', sanitizePluginId(pluginId))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Persistent per-plugin data directory, exposed to plugins as
|
|
104
|
+
* ${CLAUDE_PLUGIN_DATA}. Unlike the version-scoped install cache
|
|
105
|
+
* (${CLAUDE_PLUGIN_ROOT}, which is orphaned and GC'd on every update),
|
|
106
|
+
* this survives plugin updates — only removed on last-scope uninstall.
|
|
107
|
+
*
|
|
108
|
+
* Creates the directory on call (mkdir). The *lazy* behavior is at the
|
|
109
|
+
* substitutePluginVariables call site — the DATA pattern uses function-form
|
|
110
|
+
* .replace() so this isn't invoked unless ${CLAUDE_PLUGIN_DATA} is present
|
|
111
|
+
* (ROOT also uses function-form, but for $-pattern safety, not laziness).
|
|
112
|
+
* Env-var export sites (MCP/LSP server env, hook env) call this eagerly
|
|
113
|
+
* since subprocesses may expect the dir to exist before writing to it.
|
|
114
|
+
*
|
|
115
|
+
* Sync because it's called from substitutePluginVariables (sync, inside
|
|
116
|
+
* String.replace) — making this async would cascade through 6 call sites
|
|
117
|
+
* and their sync iteration loops. One mkdir in plugin-load path is cheap.
|
|
118
|
+
*/
|
|
119
|
+
export function getPluginDataDir(pluginId: string): string {
|
|
120
|
+
const dir = pluginDataDirPath(pluginId)
|
|
121
|
+
mkdirSync(dir, { recursive: true })
|
|
122
|
+
return dir
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Size of the data dir for the uninstall confirmation prompt. Returns null
|
|
127
|
+
* when the dir is absent or empty so callers can skip the prompt entirely.
|
|
128
|
+
* Recursive walk — not hot-path (only on uninstall).
|
|
129
|
+
*/
|
|
130
|
+
export async function getPluginDataDirSize(
|
|
131
|
+
pluginId: string,
|
|
132
|
+
): Promise<{ bytes: number; human: string } | null> {
|
|
133
|
+
const dir = pluginDataDirPath(pluginId)
|
|
134
|
+
let bytes = 0
|
|
135
|
+
const walk = async (p: string) => {
|
|
136
|
+
for (const entry of await readdir(p, { withFileTypes: true })) {
|
|
137
|
+
const full = join(p, entry.name)
|
|
138
|
+
if (entry.isDirectory()) {
|
|
139
|
+
await walk(full)
|
|
140
|
+
} else {
|
|
141
|
+
// Per-entry catch: a broken symlink makes stat() throw ENOENT.
|
|
142
|
+
// Without this, one broken link bubbles to the outer catch →
|
|
143
|
+
// returns null → dialog skipped → data silently deleted.
|
|
144
|
+
try {
|
|
145
|
+
bytes += (await stat(full)).size
|
|
146
|
+
} catch {
|
|
147
|
+
// Broken symlink / raced delete — skip this entry, keep walking
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
await walk(dir)
|
|
154
|
+
} catch (e) {
|
|
155
|
+
if (isFsInaccessible(e)) return null
|
|
156
|
+
throw e
|
|
157
|
+
}
|
|
158
|
+
if (bytes === 0) return null
|
|
159
|
+
return { bytes, human: formatFileSize(bytes) }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Best-effort cleanup on last-scope uninstall. Failure is logged but does
|
|
164
|
+
* not throw — the uninstall itself already succeeded; we don't want a
|
|
165
|
+
* cleanup side-effect surfacing as "uninstall failed". Same rationale as
|
|
166
|
+
* deletePluginOptions (pluginOptionsStorage.ts).
|
|
167
|
+
*/
|
|
168
|
+
export async function deletePluginDataDir(pluginId: string): Promise<void> {
|
|
169
|
+
const dir = pluginDataDirPath(pluginId)
|
|
170
|
+
try {
|
|
171
|
+
await rm(dir, { recursive: true, force: true })
|
|
172
|
+
} catch (e) {
|
|
173
|
+
logForDebugging(
|
|
174
|
+
`Failed to delete plugin data dir ${dir}: ${errorMessage(e)}`,
|
|
175
|
+
{ level: 'warn' },
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flagged plugin tracking utilities
|
|
3
|
+
*
|
|
4
|
+
* Tracks plugins that were auto-removed because they were delisted from
|
|
5
|
+
* their marketplace. Data is stored in ~/.claude/plugins/flagged-plugins.json.
|
|
6
|
+
* Flagged plugins appear in a "Flagged" section in /plugins until the user
|
|
7
|
+
* dismisses them.
|
|
8
|
+
*
|
|
9
|
+
* Uses a module-level cache so that getFlaggedPlugins() can be called
|
|
10
|
+
* synchronously during React render. The cache is populated on the first
|
|
11
|
+
* async call (loadFlaggedPlugins or addFlaggedPlugin) and kept in sync
|
|
12
|
+
* with writes.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { randomBytes } from 'crypto'
|
|
16
|
+
import { readFile, rename, unlink, writeFile } from 'fs/promises'
|
|
17
|
+
import { join } from 'path'
|
|
18
|
+
import { logForDebugging } from '../debug.js'
|
|
19
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
20
|
+
import { logError } from '../log.js'
|
|
21
|
+
import { jsonParse, jsonStringify } from '../slowOperations.js'
|
|
22
|
+
import { getPluginsDirectory } from './pluginDirectories.js'
|
|
23
|
+
|
|
24
|
+
const FLAGGED_PLUGINS_FILENAME = 'flagged-plugins.json'
|
|
25
|
+
|
|
26
|
+
export type FlaggedPlugin = {
|
|
27
|
+
flaggedAt: string
|
|
28
|
+
seenAt?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const SEEN_EXPIRY_MS = 48 * 60 * 60 * 1000 // 48 hours
|
|
32
|
+
|
|
33
|
+
// Module-level cache — populated by loadFlaggedPlugins(), updated by writes.
|
|
34
|
+
let cache: Record<string, FlaggedPlugin> | null = null
|
|
35
|
+
|
|
36
|
+
function getFlaggedPluginsPath(): string {
|
|
37
|
+
return join(getPluginsDirectory(), FLAGGED_PLUGINS_FILENAME)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parsePluginsData(content: string): Record<string, FlaggedPlugin> {
|
|
41
|
+
const parsed = jsonParse(content) as unknown
|
|
42
|
+
if (
|
|
43
|
+
typeof parsed !== 'object' ||
|
|
44
|
+
parsed === null ||
|
|
45
|
+
!('plugins' in parsed) ||
|
|
46
|
+
typeof (parsed as { plugins: unknown }).plugins !== 'object' ||
|
|
47
|
+
(parsed as { plugins: unknown }).plugins === null
|
|
48
|
+
) {
|
|
49
|
+
return {}
|
|
50
|
+
}
|
|
51
|
+
const plugins = (parsed as { plugins: Record<string, unknown> }).plugins
|
|
52
|
+
const result: Record<string, FlaggedPlugin> = {}
|
|
53
|
+
for (const [id, entry] of Object.entries(plugins)) {
|
|
54
|
+
if (
|
|
55
|
+
entry &&
|
|
56
|
+
typeof entry === 'object' &&
|
|
57
|
+
'flaggedAt' in entry &&
|
|
58
|
+
typeof (entry as { flaggedAt: unknown }).flaggedAt === 'string'
|
|
59
|
+
) {
|
|
60
|
+
const parsed: FlaggedPlugin = {
|
|
61
|
+
flaggedAt: (entry as { flaggedAt: string }).flaggedAt,
|
|
62
|
+
}
|
|
63
|
+
if (
|
|
64
|
+
'seenAt' in entry &&
|
|
65
|
+
typeof (entry as { seenAt: unknown }).seenAt === 'string'
|
|
66
|
+
) {
|
|
67
|
+
parsed.seenAt = (entry as { seenAt: string }).seenAt
|
|
68
|
+
}
|
|
69
|
+
result[id] = parsed
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function readFromDisk(): Promise<Record<string, FlaggedPlugin>> {
|
|
76
|
+
try {
|
|
77
|
+
const content = await readFile(getFlaggedPluginsPath(), {
|
|
78
|
+
encoding: 'utf-8',
|
|
79
|
+
})
|
|
80
|
+
return parsePluginsData(content)
|
|
81
|
+
} catch {
|
|
82
|
+
return {}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function writeToDisk(
|
|
87
|
+
plugins: Record<string, FlaggedPlugin>,
|
|
88
|
+
): Promise<void> {
|
|
89
|
+
const filePath = getFlaggedPluginsPath()
|
|
90
|
+
const tempPath = `${filePath}.${randomBytes(8).toString('hex')}.tmp`
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await getFsImplementation().mkdir(getPluginsDirectory())
|
|
94
|
+
|
|
95
|
+
const content = jsonStringify({ plugins }, null, 2)
|
|
96
|
+
await writeFile(tempPath, content, {
|
|
97
|
+
encoding: 'utf-8',
|
|
98
|
+
mode: 0o600,
|
|
99
|
+
})
|
|
100
|
+
await rename(tempPath, filePath)
|
|
101
|
+
cache = plugins
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logError(error)
|
|
104
|
+
try {
|
|
105
|
+
await unlink(tempPath)
|
|
106
|
+
} catch {
|
|
107
|
+
// Ignore cleanup errors
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Load flagged plugins from disk into the module cache.
|
|
114
|
+
* Must be called (and awaited) before getFlaggedPlugins() returns
|
|
115
|
+
* meaningful data. Called by useManagePlugins during plugin refresh.
|
|
116
|
+
*/
|
|
117
|
+
export async function loadFlaggedPlugins(): Promise<void> {
|
|
118
|
+
const all = await readFromDisk()
|
|
119
|
+
const now = Date.now()
|
|
120
|
+
let changed = false
|
|
121
|
+
|
|
122
|
+
for (const [id, entry] of Object.entries(all)) {
|
|
123
|
+
if (
|
|
124
|
+
entry.seenAt &&
|
|
125
|
+
now - new Date(entry.seenAt).getTime() >= SEEN_EXPIRY_MS
|
|
126
|
+
) {
|
|
127
|
+
delete all[id]
|
|
128
|
+
changed = true
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
cache = all
|
|
133
|
+
if (changed) {
|
|
134
|
+
await writeToDisk(all)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get all flagged plugins from the in-memory cache.
|
|
140
|
+
* Returns an empty object if loadFlaggedPlugins() has not been called yet.
|
|
141
|
+
*/
|
|
142
|
+
export function getFlaggedPlugins(): Record<string, FlaggedPlugin> {
|
|
143
|
+
return cache ?? {}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Add a plugin to the flagged list.
|
|
148
|
+
*
|
|
149
|
+
* @param pluginId "name@marketplace" format
|
|
150
|
+
*/
|
|
151
|
+
export async function addFlaggedPlugin(pluginId: string): Promise<void> {
|
|
152
|
+
if (cache === null) {
|
|
153
|
+
cache = await readFromDisk()
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const updated = {
|
|
157
|
+
...cache,
|
|
158
|
+
[pluginId]: {
|
|
159
|
+
flaggedAt: new Date().toISOString(),
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
await writeToDisk(updated)
|
|
164
|
+
logForDebugging(`Flagged plugin: ${pluginId}`)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Mark flagged plugins as seen. Called when the Installed view renders
|
|
169
|
+
* flagged plugins. Sets seenAt on entries that don't already have it.
|
|
170
|
+
* After 48 hours from seenAt, entries are auto-cleared on next load.
|
|
171
|
+
*/
|
|
172
|
+
export async function markFlaggedPluginsSeen(
|
|
173
|
+
pluginIds: string[],
|
|
174
|
+
): Promise<void> {
|
|
175
|
+
if (cache === null) {
|
|
176
|
+
cache = await readFromDisk()
|
|
177
|
+
}
|
|
178
|
+
const now = new Date().toISOString()
|
|
179
|
+
let changed = false
|
|
180
|
+
|
|
181
|
+
const updated = { ...cache }
|
|
182
|
+
for (const id of pluginIds) {
|
|
183
|
+
const entry = updated[id]
|
|
184
|
+
if (entry && !entry.seenAt) {
|
|
185
|
+
updated[id] = { ...entry, seenAt: now }
|
|
186
|
+
changed = true
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (changed) {
|
|
191
|
+
await writeToDisk(updated)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Remove a plugin from the flagged list. Called when the user dismisses
|
|
197
|
+
* a flagged plugin notification in /plugins.
|
|
198
|
+
*/
|
|
199
|
+
export async function removeFlaggedPlugin(pluginId: string): Promise<void> {
|
|
200
|
+
if (cache === null) {
|
|
201
|
+
cache = await readFromDisk()
|
|
202
|
+
}
|
|
203
|
+
if (!(pluginId in cache)) return
|
|
204
|
+
|
|
205
|
+
const { [pluginId]: _, ...rest } = cache
|
|
206
|
+
cache = rest
|
|
207
|
+
await writeToDisk(rest)
|
|
208
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EditableSettingSource,
|
|
3
|
+
SettingSource,
|
|
4
|
+
} from '../settings/constants.js'
|
|
5
|
+
import {
|
|
6
|
+
ALLOWED_OFFICIAL_MARKETPLACE_NAMES,
|
|
7
|
+
type PluginScope,
|
|
8
|
+
} from './schemas.js'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Extended scope type that includes 'flag' for session-only plugins.
|
|
12
|
+
* 'flag' scope is NOT persisted to installed_plugins.json.
|
|
13
|
+
*/
|
|
14
|
+
export type ExtendedPluginScope = PluginScope | 'flag'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Scopes that are persisted to installed_plugins.json.
|
|
18
|
+
* Excludes 'flag' which is session-only.
|
|
19
|
+
*/
|
|
20
|
+
export type PersistablePluginScope = Exclude<ExtendedPluginScope, 'flag'>
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Map from SettingSource to plugin scope.
|
|
24
|
+
* Note: flagSettings maps to 'flag' which is session-only and not persisted.
|
|
25
|
+
*/
|
|
26
|
+
export const SETTING_SOURCE_TO_SCOPE = {
|
|
27
|
+
policySettings: 'managed',
|
|
28
|
+
userSettings: 'user',
|
|
29
|
+
projectSettings: 'project',
|
|
30
|
+
localSettings: 'local',
|
|
31
|
+
flagSettings: 'flag',
|
|
32
|
+
} as const satisfies Record<SettingSource, ExtendedPluginScope>
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parsed plugin identifier with name and optional marketplace
|
|
36
|
+
*/
|
|
37
|
+
export type ParsedPluginIdentifier = {
|
|
38
|
+
name: string
|
|
39
|
+
marketplace?: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Parse a plugin identifier string into name and marketplace components
|
|
44
|
+
* @param plugin The plugin identifier (name or name@marketplace)
|
|
45
|
+
* @returns Parsed plugin name and optional marketplace
|
|
46
|
+
*
|
|
47
|
+
* Note: Only the first '@' is used as separator. If the input contains multiple '@' symbols
|
|
48
|
+
* (e.g., "plugin@market@place"), everything after the second '@' is ignored.
|
|
49
|
+
* This is intentional as marketplace names should not contain '@'.
|
|
50
|
+
*/
|
|
51
|
+
export function parsePluginIdentifier(plugin: string): ParsedPluginIdentifier {
|
|
52
|
+
if (plugin.includes('@')) {
|
|
53
|
+
const parts = plugin.split('@')
|
|
54
|
+
return { name: parts[0] || '', marketplace: parts[1] }
|
|
55
|
+
}
|
|
56
|
+
return { name: plugin }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Build a plugin ID from name and marketplace
|
|
61
|
+
* @param name The plugin name
|
|
62
|
+
* @param marketplace Optional marketplace name
|
|
63
|
+
* @returns Plugin ID in format "name" or "name@marketplace"
|
|
64
|
+
*/
|
|
65
|
+
export function buildPluginId(name: string, marketplace?: string): string {
|
|
66
|
+
return marketplace ? `${name}@${marketplace}` : name
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check if a marketplace name is an official (Anthropic-controlled) marketplace.
|
|
71
|
+
* Used for telemetry redaction — official plugin identifiers are safe to log to
|
|
72
|
+
* general-access additional_metadata; third-party identifiers go only to the
|
|
73
|
+
* PII-tagged _PROTO_* BQ columns.
|
|
74
|
+
*/
|
|
75
|
+
export function isOfficialMarketplaceName(
|
|
76
|
+
marketplace: string | undefined,
|
|
77
|
+
): boolean {
|
|
78
|
+
return (
|
|
79
|
+
marketplace !== undefined &&
|
|
80
|
+
ALLOWED_OFFICIAL_MARKETPLACE_NAMES.has(marketplace.toLowerCase())
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Map from installable plugin scope to editable setting source.
|
|
86
|
+
* This is the inverse of SETTING_SOURCE_TO_SCOPE for editable scopes only.
|
|
87
|
+
* Note: 'managed' scope cannot be installed to, so it's not included here.
|
|
88
|
+
*/
|
|
89
|
+
const SCOPE_TO_EDITABLE_SOURCE: Record<
|
|
90
|
+
Exclude<PluginScope, 'managed'>,
|
|
91
|
+
EditableSettingSource
|
|
92
|
+
> = {
|
|
93
|
+
user: 'userSettings',
|
|
94
|
+
project: 'projectSettings',
|
|
95
|
+
local: 'localSettings',
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Convert a plugin scope to its corresponding editable setting source
|
|
100
|
+
* @param scope The plugin installation scope
|
|
101
|
+
* @returns The corresponding setting source for reading/writing settings
|
|
102
|
+
* @throws Error if scope is 'managed' (cannot install plugins to managed scope)
|
|
103
|
+
*/
|
|
104
|
+
export function scopeToSettingSource(
|
|
105
|
+
scope: PluginScope,
|
|
106
|
+
): EditableSettingSource {
|
|
107
|
+
if (scope === 'managed') {
|
|
108
|
+
throw new Error('Cannot install plugins to managed scope')
|
|
109
|
+
}
|
|
110
|
+
return SCOPE_TO_EDITABLE_SOURCE[scope]
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Convert an editable setting source to its corresponding plugin scope.
|
|
115
|
+
* Derived from SETTING_SOURCE_TO_SCOPE to maintain a single source of truth.
|
|
116
|
+
* @param source The setting source
|
|
117
|
+
* @returns The corresponding plugin scope
|
|
118
|
+
*/
|
|
119
|
+
export function settingSourceToScope(
|
|
120
|
+
source: EditableSettingSource,
|
|
121
|
+
): Exclude<PluginScope, 'managed'> {
|
|
122
|
+
return SETTING_SOURCE_TO_SCOPE[source] as Exclude<PluginScope, 'managed'>
|
|
123
|
+
}
|