@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,69 @@
|
|
|
1
|
+
import { join } from 'path'
|
|
2
|
+
import { logForDebugging } from '../debug.js'
|
|
3
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
4
|
+
|
|
5
|
+
const SKILL_MD_RE = /^skill\.md$/i
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Recursively walk a plugin directory, invoking onFile for each .md file.
|
|
9
|
+
*
|
|
10
|
+
* The namespace array tracks the subdirectory path relative to the root
|
|
11
|
+
* (e.g., ['foo', 'bar'] for root/foo/bar/file.md). Callers that don't need
|
|
12
|
+
* namespacing can ignore the second argument.
|
|
13
|
+
*
|
|
14
|
+
* When stopAtSkillDir is true and a directory contains SKILL.md, onFile is
|
|
15
|
+
* called for all .md files in that directory but subdirectories are not
|
|
16
|
+
* scanned — skill directories are leaf containers.
|
|
17
|
+
*
|
|
18
|
+
* Readdir errors are swallowed with a debug log so one bad directory doesn't
|
|
19
|
+
* abort a plugin load.
|
|
20
|
+
*/
|
|
21
|
+
export async function walkPluginMarkdown(
|
|
22
|
+
rootDir: string,
|
|
23
|
+
onFile: (fullPath: string, namespace: string[]) => Promise<void>,
|
|
24
|
+
opts: { stopAtSkillDir?: boolean; logLabel?: string } = {},
|
|
25
|
+
): Promise<void> {
|
|
26
|
+
const fs = getFsImplementation()
|
|
27
|
+
const label = opts.logLabel ?? 'plugin'
|
|
28
|
+
|
|
29
|
+
async function scan(dirPath: string, namespace: string[]): Promise<void> {
|
|
30
|
+
try {
|
|
31
|
+
const entries = await fs.readdir(dirPath)
|
|
32
|
+
|
|
33
|
+
if (
|
|
34
|
+
opts.stopAtSkillDir &&
|
|
35
|
+
entries.some(e => e.isFile() && SKILL_MD_RE.test(e.name))
|
|
36
|
+
) {
|
|
37
|
+
// Skill directory: collect .md files here, don't recurse.
|
|
38
|
+
await Promise.all(
|
|
39
|
+
entries.map(entry =>
|
|
40
|
+
entry.isFile() && entry.name.toLowerCase().endsWith('.md')
|
|
41
|
+
? onFile(join(dirPath, entry.name), namespace)
|
|
42
|
+
: undefined,
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
await Promise.all(
|
|
49
|
+
entries.map(entry => {
|
|
50
|
+
const fullPath = join(dirPath, entry.name)
|
|
51
|
+
if (entry.isDirectory()) {
|
|
52
|
+
return scan(fullPath, [...namespace, entry.name])
|
|
53
|
+
}
|
|
54
|
+
if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
|
|
55
|
+
return onFile(fullPath, namespace)
|
|
56
|
+
}
|
|
57
|
+
return undefined
|
|
58
|
+
}),
|
|
59
|
+
)
|
|
60
|
+
} catch (error) {
|
|
61
|
+
logForDebugging(
|
|
62
|
+
`Failed to scan ${label} directory ${dirPath}: ${error}`,
|
|
63
|
+
{ level: 'error' },
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
await scan(rootDir, [])
|
|
69
|
+
}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Zip Cache Module
|
|
3
|
+
*
|
|
4
|
+
* Manages plugins as ZIP archives in a mounted directory (e.g., Filestore).
|
|
5
|
+
* When CLAUDE_CODE_PLUGIN_USE_ZIP_CACHE is enabled and CLAUDE_CODE_PLUGIN_CACHE_DIR
|
|
6
|
+
* is set, plugins are stored as ZIPs in that directory and extracted to a
|
|
7
|
+
* session-local temp directory at startup.
|
|
8
|
+
*
|
|
9
|
+
* Limitations:
|
|
10
|
+
* - Only headless mode is supported
|
|
11
|
+
* - All settings sources are used (same as normal plugin flow)
|
|
12
|
+
* - Only github, git, and url marketplace sources are supported
|
|
13
|
+
* - Only strict:true marketplace entries are supported
|
|
14
|
+
* - Auto-update is non-blocking (background, does not affect current session)
|
|
15
|
+
*
|
|
16
|
+
* Directory structure of the zip cache:
|
|
17
|
+
* /mnt/plugins-cache/
|
|
18
|
+
* ├── known_marketplaces.json
|
|
19
|
+
* ├── installed_plugins.json
|
|
20
|
+
* ├── marketplaces/
|
|
21
|
+
* │ ├── official-marketplace.json
|
|
22
|
+
* │ └── company-marketplace.json
|
|
23
|
+
* └── plugins/
|
|
24
|
+
* ├── official-marketplace/
|
|
25
|
+
* │ └── plugin-a/
|
|
26
|
+
* │ └── 1.0.0.zip
|
|
27
|
+
* └── company-marketplace/
|
|
28
|
+
* └── plugin-b/
|
|
29
|
+
* └── 2.1.3.zip
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { randomBytes } from 'crypto'
|
|
33
|
+
import {
|
|
34
|
+
chmod,
|
|
35
|
+
lstat,
|
|
36
|
+
readdir,
|
|
37
|
+
readFile,
|
|
38
|
+
rename,
|
|
39
|
+
rm,
|
|
40
|
+
stat,
|
|
41
|
+
writeFile,
|
|
42
|
+
} from 'fs/promises'
|
|
43
|
+
import { tmpdir } from 'os'
|
|
44
|
+
import { basename, dirname, join } from 'path'
|
|
45
|
+
import { logForDebugging } from '../debug.js'
|
|
46
|
+
import { parseZipModes, unzipFile } from '../dxt/zip.js'
|
|
47
|
+
import { isEnvTruthy } from '../envUtils.js'
|
|
48
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
49
|
+
import { expandTilde } from '../permissions/pathValidation.js'
|
|
50
|
+
import type { MarketplaceSource } from './schemas.js'
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Check if the plugin zip cache mode is enabled.
|
|
54
|
+
*/
|
|
55
|
+
export function isPluginZipCacheEnabled(): boolean {
|
|
56
|
+
return isEnvTruthy(process.env.CLAUDE_CODE_PLUGIN_USE_ZIP_CACHE)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get the path to the zip cache directory.
|
|
61
|
+
* Requires CLAUDE_CODE_PLUGIN_CACHE_DIR to be set.
|
|
62
|
+
* Returns undefined if zip cache is not enabled.
|
|
63
|
+
*/
|
|
64
|
+
export function getPluginZipCachePath(): string | undefined {
|
|
65
|
+
if (!isPluginZipCacheEnabled()) {
|
|
66
|
+
return undefined
|
|
67
|
+
}
|
|
68
|
+
const dir = process.env.CLAUDE_CODE_PLUGIN_CACHE_DIR
|
|
69
|
+
return dir ? expandTilde(dir) : undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get the path to known_marketplaces.json in the zip cache.
|
|
74
|
+
*/
|
|
75
|
+
export function getZipCacheKnownMarketplacesPath(): string {
|
|
76
|
+
const cachePath = getPluginZipCachePath()
|
|
77
|
+
if (!cachePath) {
|
|
78
|
+
throw new Error('Plugin zip cache is not enabled')
|
|
79
|
+
}
|
|
80
|
+
return join(cachePath, 'known_marketplaces.json')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get the path to installed_plugins.json in the zip cache.
|
|
85
|
+
*/
|
|
86
|
+
export function getZipCacheInstalledPluginsPath(): string {
|
|
87
|
+
const cachePath = getPluginZipCachePath()
|
|
88
|
+
if (!cachePath) {
|
|
89
|
+
throw new Error('Plugin zip cache is not enabled')
|
|
90
|
+
}
|
|
91
|
+
return join(cachePath, 'installed_plugins.json')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get the marketplaces directory within the zip cache.
|
|
96
|
+
*/
|
|
97
|
+
export function getZipCacheMarketplacesDir(): string {
|
|
98
|
+
const cachePath = getPluginZipCachePath()
|
|
99
|
+
if (!cachePath) {
|
|
100
|
+
throw new Error('Plugin zip cache is not enabled')
|
|
101
|
+
}
|
|
102
|
+
return join(cachePath, 'marketplaces')
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get the plugins directory within the zip cache.
|
|
107
|
+
*/
|
|
108
|
+
export function getZipCachePluginsDir(): string {
|
|
109
|
+
const cachePath = getPluginZipCachePath()
|
|
110
|
+
if (!cachePath) {
|
|
111
|
+
throw new Error('Plugin zip cache is not enabled')
|
|
112
|
+
}
|
|
113
|
+
return join(cachePath, 'plugins')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Session plugin cache: a temp directory on local disk (NOT in the mounted zip cache)
|
|
117
|
+
// that holds extracted plugins for the duration of the session.
|
|
118
|
+
let sessionPluginCachePath: string | null = null
|
|
119
|
+
let sessionPluginCachePromise: Promise<string> | null = null
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get or create the session plugin cache directory.
|
|
123
|
+
* This is a temp directory on local disk where plugins are extracted for the session.
|
|
124
|
+
*/
|
|
125
|
+
export async function getSessionPluginCachePath(): Promise<string> {
|
|
126
|
+
if (sessionPluginCachePath) {
|
|
127
|
+
return sessionPluginCachePath
|
|
128
|
+
}
|
|
129
|
+
if (!sessionPluginCachePromise) {
|
|
130
|
+
sessionPluginCachePromise = (async () => {
|
|
131
|
+
const suffix = randomBytes(8).toString('hex')
|
|
132
|
+
const dir = join(tmpdir(), `claude-plugin-session-${suffix}`)
|
|
133
|
+
await getFsImplementation().mkdir(dir)
|
|
134
|
+
sessionPluginCachePath = dir
|
|
135
|
+
logForDebugging(`Created session plugin cache at ${dir}`)
|
|
136
|
+
return dir
|
|
137
|
+
})()
|
|
138
|
+
}
|
|
139
|
+
return sessionPluginCachePromise
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Clean up the session plugin cache directory.
|
|
144
|
+
* Should be called when the session ends.
|
|
145
|
+
*/
|
|
146
|
+
export async function cleanupSessionPluginCache(): Promise<void> {
|
|
147
|
+
if (!sessionPluginCachePath) {
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
await rm(sessionPluginCachePath, { recursive: true, force: true })
|
|
152
|
+
logForDebugging(
|
|
153
|
+
`Cleaned up session plugin cache at ${sessionPluginCachePath}`,
|
|
154
|
+
)
|
|
155
|
+
} catch (error) {
|
|
156
|
+
logForDebugging(`Failed to clean up session plugin cache: ${error}`)
|
|
157
|
+
} finally {
|
|
158
|
+
sessionPluginCachePath = null
|
|
159
|
+
sessionPluginCachePromise = null
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Reset the session plugin cache path (for testing).
|
|
165
|
+
*/
|
|
166
|
+
export function resetSessionPluginCache(): void {
|
|
167
|
+
sessionPluginCachePath = null
|
|
168
|
+
sessionPluginCachePromise = null
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Write data to a file in the zip cache atomically.
|
|
173
|
+
* Writes to a temp file in the same directory, then renames.
|
|
174
|
+
*/
|
|
175
|
+
export async function atomicWriteToZipCache(
|
|
176
|
+
targetPath: string,
|
|
177
|
+
data: string | Uint8Array,
|
|
178
|
+
): Promise<void> {
|
|
179
|
+
const dir = dirname(targetPath)
|
|
180
|
+
await getFsImplementation().mkdir(dir)
|
|
181
|
+
|
|
182
|
+
const tmpName = `.${basename(targetPath)}.tmp.${randomBytes(4).toString('hex')}`
|
|
183
|
+
const tmpPath = join(dir, tmpName)
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
if (typeof data === 'string') {
|
|
187
|
+
await writeFile(tmpPath, data, { encoding: 'utf-8' })
|
|
188
|
+
} else {
|
|
189
|
+
await writeFile(tmpPath, data)
|
|
190
|
+
}
|
|
191
|
+
await rename(tmpPath, targetPath)
|
|
192
|
+
} catch (error) {
|
|
193
|
+
// Clean up tmp file on failure
|
|
194
|
+
try {
|
|
195
|
+
await rm(tmpPath, { force: true })
|
|
196
|
+
} catch {
|
|
197
|
+
// ignore cleanup errors
|
|
198
|
+
}
|
|
199
|
+
throw error
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// fflate's ZippableFile tuple form: [data, opts]. Using the tuple lets us
|
|
204
|
+
// store {os, attrs} so parseZipModes can recover exec bits on extraction.
|
|
205
|
+
type ZipEntry = [Uint8Array, { os: number; attrs: number }]
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Create a ZIP archive from a directory.
|
|
209
|
+
* Resolves symlinks to actual file contents (replaces symlinks with real data).
|
|
210
|
+
* Stores Unix mode bits in external_attr so extractZipToDirectory can restore
|
|
211
|
+
* +x — otherwise the round-trip (git clone → zip → extract) loses exec bits.
|
|
212
|
+
*
|
|
213
|
+
* @param sourceDir - Directory to zip
|
|
214
|
+
* @returns ZIP file as Uint8Array
|
|
215
|
+
*/
|
|
216
|
+
export async function createZipFromDirectory(
|
|
217
|
+
sourceDir: string,
|
|
218
|
+
): Promise<Uint8Array> {
|
|
219
|
+
const files: Record<string, ZipEntry> = {}
|
|
220
|
+
const visited = new Set<string>()
|
|
221
|
+
await collectFilesForZip(sourceDir, '', files, visited)
|
|
222
|
+
|
|
223
|
+
const { zipSync } = await import('fflate')
|
|
224
|
+
const zipData = zipSync(files, { level: 6 })
|
|
225
|
+
logForDebugging(
|
|
226
|
+
`Created ZIP from ${sourceDir}: ${Object.keys(files).length} files, ${zipData.length} bytes`,
|
|
227
|
+
)
|
|
228
|
+
return zipData
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Recursively collect files from a directory for zipping.
|
|
233
|
+
* Uses lstat to detect symlinks and tracks visited inodes for cycle detection.
|
|
234
|
+
*/
|
|
235
|
+
async function collectFilesForZip(
|
|
236
|
+
baseDir: string,
|
|
237
|
+
relativePath: string,
|
|
238
|
+
files: Record<string, ZipEntry>,
|
|
239
|
+
visited: Set<string>,
|
|
240
|
+
): Promise<void> {
|
|
241
|
+
const currentDir = relativePath ? join(baseDir, relativePath) : baseDir
|
|
242
|
+
let entries: string[]
|
|
243
|
+
try {
|
|
244
|
+
entries = await readdir(currentDir)
|
|
245
|
+
} catch {
|
|
246
|
+
return
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Track visited directories by dev+ino to detect symlink cycles.
|
|
250
|
+
// bigint: true is required — on Windows NTFS, the file index packs a 16-bit
|
|
251
|
+
// sequence number into the high bits. Once that sequence exceeds ~32 (very
|
|
252
|
+
// common on a busy CI runner that churns through temp files), the value
|
|
253
|
+
// exceeds Number.MAX_SAFE_INTEGER and two adjacent directories round to the
|
|
254
|
+
// same JS number, causing subdirs to be silently skipped as "cycles". This
|
|
255
|
+
// broke the round-trip test on Windows CI when sharding shuffled which tests
|
|
256
|
+
// ran first and pushed MFT sequence numbers over the precision cliff.
|
|
257
|
+
// See also: markdownConfigLoader.ts getFileIdentity, anthropics/claude-code#13893
|
|
258
|
+
try {
|
|
259
|
+
const dirStat = await stat(currentDir, { bigint: true })
|
|
260
|
+
// ReFS (Dev Drive), NFS, some FUSE mounts report dev=0 and ino=0 for
|
|
261
|
+
// everything. Fail open: skip cycle detection rather than skip the
|
|
262
|
+
// directory. We already skip symlinked directories unconditionally below,
|
|
263
|
+
// so the only cycle left here is a bind mount, which we accept.
|
|
264
|
+
if (dirStat.dev !== 0n || dirStat.ino !== 0n) {
|
|
265
|
+
const key = `${dirStat.dev}:${dirStat.ino}`
|
|
266
|
+
if (visited.has(key)) {
|
|
267
|
+
logForDebugging(`Skipping symlink cycle at ${currentDir}`)
|
|
268
|
+
return
|
|
269
|
+
}
|
|
270
|
+
visited.add(key)
|
|
271
|
+
}
|
|
272
|
+
} catch {
|
|
273
|
+
return
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
for (const entry of entries) {
|
|
277
|
+
// Skip hidden files that are git-related
|
|
278
|
+
if (entry === '.git') {
|
|
279
|
+
continue
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const fullPath = join(currentDir, entry)
|
|
283
|
+
const relPath = relativePath ? `${relativePath}/${entry}` : entry
|
|
284
|
+
|
|
285
|
+
let fileStat
|
|
286
|
+
try {
|
|
287
|
+
fileStat = await lstat(fullPath)
|
|
288
|
+
} catch {
|
|
289
|
+
continue
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Skip symlinked directories (follow symlinked files)
|
|
293
|
+
if (fileStat.isSymbolicLink()) {
|
|
294
|
+
try {
|
|
295
|
+
const targetStat = await stat(fullPath)
|
|
296
|
+
if (targetStat.isDirectory()) {
|
|
297
|
+
continue
|
|
298
|
+
}
|
|
299
|
+
// Symlinked file — read its contents below
|
|
300
|
+
fileStat = targetStat
|
|
301
|
+
} catch {
|
|
302
|
+
continue // broken symlink
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (fileStat.isDirectory()) {
|
|
307
|
+
await collectFilesForZip(baseDir, relPath, files, visited)
|
|
308
|
+
} else if (fileStat.isFile()) {
|
|
309
|
+
try {
|
|
310
|
+
const content = await readFile(fullPath)
|
|
311
|
+
// os=3 (Unix) + st_mode in high 16 bits of external_attr — this is
|
|
312
|
+
// what parseZipModes reads back on extraction. fileStat is already
|
|
313
|
+
// in hand from the lstat/stat above, so no extra syscall.
|
|
314
|
+
files[relPath] = [
|
|
315
|
+
new Uint8Array(content),
|
|
316
|
+
{ os: 3, attrs: (fileStat.mode & 0xffff) << 16 },
|
|
317
|
+
]
|
|
318
|
+
} catch (error) {
|
|
319
|
+
logForDebugging(`Failed to read file for zip: ${relPath}: ${error}`)
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Extract a ZIP file to a target directory.
|
|
327
|
+
*
|
|
328
|
+
* @param zipPath - Path to the ZIP file
|
|
329
|
+
* @param targetDir - Directory to extract into
|
|
330
|
+
*/
|
|
331
|
+
export async function extractZipToDirectory(
|
|
332
|
+
zipPath: string,
|
|
333
|
+
targetDir: string,
|
|
334
|
+
): Promise<void> {
|
|
335
|
+
const zipBuf = await getFsImplementation().readFileBytes(zipPath)
|
|
336
|
+
const files = await unzipFile(zipBuf)
|
|
337
|
+
// fflate doesn't surface external_attr — parse the central directory so
|
|
338
|
+
// exec bits survive extraction (hooks/scripts need +x to run via `sh -c`).
|
|
339
|
+
const modes = parseZipModes(zipBuf)
|
|
340
|
+
|
|
341
|
+
await getFsImplementation().mkdir(targetDir)
|
|
342
|
+
|
|
343
|
+
for (const [relPath, data] of Object.entries(files)) {
|
|
344
|
+
// Skip directory entries (trailing slash)
|
|
345
|
+
if (relPath.endsWith('/')) {
|
|
346
|
+
await getFsImplementation().mkdir(join(targetDir, relPath))
|
|
347
|
+
continue
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const fullPath = join(targetDir, relPath)
|
|
351
|
+
await getFsImplementation().mkdir(dirname(fullPath))
|
|
352
|
+
await writeFile(fullPath, data)
|
|
353
|
+
const mode = modes[relPath]
|
|
354
|
+
if (mode && mode & 0o111) {
|
|
355
|
+
// Swallow EPERM/ENOTSUP (NFS root_squash, some FUSE mounts) — losing +x
|
|
356
|
+
// is the pre-PR behavior and better than aborting mid-extraction.
|
|
357
|
+
await chmod(fullPath, mode & 0o777).catch(() => {})
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
logForDebugging(
|
|
362
|
+
`Extracted ZIP to ${targetDir}: ${Object.keys(files).length} entries`,
|
|
363
|
+
)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Convert a plugin directory to a ZIP in-place: zip → atomic write → delete dir.
|
|
368
|
+
* Both call sites (cacheAndRegisterPlugin, copyPluginToVersionedCache) need the
|
|
369
|
+
* same sequence; getting it wrong (non-atomic write, forgetting rm) corrupts cache.
|
|
370
|
+
*/
|
|
371
|
+
export async function convertDirectoryToZipInPlace(
|
|
372
|
+
dirPath: string,
|
|
373
|
+
zipPath: string,
|
|
374
|
+
): Promise<void> {
|
|
375
|
+
const zipData = await createZipFromDirectory(dirPath)
|
|
376
|
+
await atomicWriteToZipCache(zipPath, zipData)
|
|
377
|
+
await rm(dirPath, { recursive: true, force: true })
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Get the relative path for a marketplace JSON file within the zip cache.
|
|
382
|
+
* Format: marketplaces/{marketplace-name}.json
|
|
383
|
+
*/
|
|
384
|
+
export function getMarketplaceJsonRelativePath(
|
|
385
|
+
marketplaceName: string,
|
|
386
|
+
): string {
|
|
387
|
+
const sanitized = marketplaceName.replace(/[^a-zA-Z0-9\-_]/g, '-')
|
|
388
|
+
return join('marketplaces', `${sanitized}.json`)
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Check if a marketplace source type is supported by zip cache mode.
|
|
393
|
+
*
|
|
394
|
+
* Supported sources write to `join(cacheDir, name)` — syncMarketplacesToZipCache
|
|
395
|
+
* reads marketplace.json from that installLocation, source-type-agnostic.
|
|
396
|
+
* - github/git/url: clone to temp, rename into cacheDir
|
|
397
|
+
* - settings: write synthetic marketplace.json directly to cacheDir (no fetch)
|
|
398
|
+
*
|
|
399
|
+
* Excluded: file/directory (installLocation is the user's path OUTSIDE cacheDir —
|
|
400
|
+
* nonsensical in ephemeral containers), npm (node_modules bloat on Filestore mount).
|
|
401
|
+
*/
|
|
402
|
+
export function isMarketplaceSourceSupportedByZipCache(
|
|
403
|
+
source: MarketplaceSource,
|
|
404
|
+
): boolean {
|
|
405
|
+
return ['github', 'git', 'url', 'settings'].includes(source.source)
|
|
406
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zip Cache Adapters
|
|
3
|
+
*
|
|
4
|
+
* I/O helpers for the plugin zip cache. These functions handle reading/writing
|
|
5
|
+
* zip-cache-local metadata files, extracting ZIPs to session directories,
|
|
6
|
+
* and creating ZIPs for newly installed plugins.
|
|
7
|
+
*
|
|
8
|
+
* The zip cache stores data on a mounted volume (e.g., Filestore) that persists
|
|
9
|
+
* across ephemeral container lifetimes. The session cache is a local temp dir
|
|
10
|
+
* for extracted plugins used during a single session.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { readFile } from 'fs/promises'
|
|
14
|
+
import { join } from 'path'
|
|
15
|
+
import { logForDebugging } from '../debug.js'
|
|
16
|
+
import { jsonParse, jsonStringify } from '../slowOperations.js'
|
|
17
|
+
import { loadKnownMarketplacesConfigSafe } from './marketplaceManager.js'
|
|
18
|
+
import {
|
|
19
|
+
type KnownMarketplacesFile,
|
|
20
|
+
KnownMarketplacesFileSchema,
|
|
21
|
+
type PluginMarketplace,
|
|
22
|
+
PluginMarketplaceSchema,
|
|
23
|
+
} from './schemas.js'
|
|
24
|
+
import {
|
|
25
|
+
atomicWriteToZipCache,
|
|
26
|
+
getMarketplaceJsonRelativePath,
|
|
27
|
+
getPluginZipCachePath,
|
|
28
|
+
getZipCacheKnownMarketplacesPath,
|
|
29
|
+
} from './zipCache.js'
|
|
30
|
+
|
|
31
|
+
// ── Metadata I/O ──
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Read known_marketplaces.json from the zip cache.
|
|
35
|
+
* Returns empty object if file doesn't exist, can't be parsed, or fails schema
|
|
36
|
+
* validation (data comes from a shared mounted volume — other containers may write).
|
|
37
|
+
*/
|
|
38
|
+
export async function readZipCacheKnownMarketplaces(): Promise<KnownMarketplacesFile> {
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(getZipCacheKnownMarketplacesPath(), 'utf-8')
|
|
41
|
+
const parsed = KnownMarketplacesFileSchema().safeParse(jsonParse(content))
|
|
42
|
+
if (!parsed.success) {
|
|
43
|
+
logForDebugging(
|
|
44
|
+
`Invalid known_marketplaces.json in zip cache: ${parsed.error.message}`,
|
|
45
|
+
{ level: 'error' },
|
|
46
|
+
)
|
|
47
|
+
return {}
|
|
48
|
+
}
|
|
49
|
+
return parsed.data
|
|
50
|
+
} catch {
|
|
51
|
+
return {}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Write known_marketplaces.json to the zip cache atomically.
|
|
57
|
+
*/
|
|
58
|
+
export async function writeZipCacheKnownMarketplaces(
|
|
59
|
+
data: KnownMarketplacesFile,
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
await atomicWriteToZipCache(
|
|
62
|
+
getZipCacheKnownMarketplacesPath(),
|
|
63
|
+
jsonStringify(data, null, 2),
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ── Marketplace JSON ──
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Read a marketplace JSON file from the zip cache.
|
|
71
|
+
*/
|
|
72
|
+
export async function readMarketplaceJson(
|
|
73
|
+
marketplaceName: string,
|
|
74
|
+
): Promise<PluginMarketplace | null> {
|
|
75
|
+
const zipCachePath = getPluginZipCachePath()
|
|
76
|
+
if (!zipCachePath) {
|
|
77
|
+
return null
|
|
78
|
+
}
|
|
79
|
+
const relPath = getMarketplaceJsonRelativePath(marketplaceName)
|
|
80
|
+
const fullPath = join(zipCachePath, relPath)
|
|
81
|
+
try {
|
|
82
|
+
const content = await readFile(fullPath, 'utf-8')
|
|
83
|
+
const parsed = jsonParse(content)
|
|
84
|
+
const result = PluginMarketplaceSchema().safeParse(parsed)
|
|
85
|
+
if (result.success) {
|
|
86
|
+
return result.data
|
|
87
|
+
}
|
|
88
|
+
logForDebugging(
|
|
89
|
+
`Invalid marketplace JSON for ${marketplaceName}: ${result.error}`,
|
|
90
|
+
)
|
|
91
|
+
return null
|
|
92
|
+
} catch {
|
|
93
|
+
return null
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Save a marketplace JSON to the zip cache from its install location.
|
|
99
|
+
*/
|
|
100
|
+
export async function saveMarketplaceJsonToZipCache(
|
|
101
|
+
marketplaceName: string,
|
|
102
|
+
installLocation: string,
|
|
103
|
+
): Promise<void> {
|
|
104
|
+
const zipCachePath = getPluginZipCachePath()
|
|
105
|
+
if (!zipCachePath) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
const content = await readMarketplaceJsonContent(installLocation)
|
|
109
|
+
if (content !== null) {
|
|
110
|
+
const relPath = getMarketplaceJsonRelativePath(marketplaceName)
|
|
111
|
+
await atomicWriteToZipCache(join(zipCachePath, relPath), content)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Read marketplace.json content from a cloned marketplace directory or file.
|
|
117
|
+
* For directory sources: checks .claude-plugin/marketplace.json, marketplace.json
|
|
118
|
+
* For URL sources: the installLocation IS the marketplace JSON file itself.
|
|
119
|
+
*/
|
|
120
|
+
async function readMarketplaceJsonContent(dir: string): Promise<string | null> {
|
|
121
|
+
const candidates = [
|
|
122
|
+
join(dir, '.claude-plugin', 'marketplace.json'),
|
|
123
|
+
join(dir, 'marketplace.json'),
|
|
124
|
+
dir, // For URL sources, installLocation IS the marketplace JSON file
|
|
125
|
+
]
|
|
126
|
+
for (const candidate of candidates) {
|
|
127
|
+
try {
|
|
128
|
+
return await readFile(candidate, 'utf-8')
|
|
129
|
+
} catch {
|
|
130
|
+
// ENOENT (doesn't exist) or EISDIR (directory) — try next
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Sync marketplace data to zip cache for offline access.
|
|
138
|
+
* Saves marketplace JSONs and merges with previously cached data
|
|
139
|
+
* so ephemeral containers can access marketplaces without re-cloning.
|
|
140
|
+
*/
|
|
141
|
+
export async function syncMarketplacesToZipCache(): Promise<void> {
|
|
142
|
+
// Read-only iteration — Safe variant so a corrupted config doesn't throw.
|
|
143
|
+
// This runs during startup paths; a throw here cascades to the same
|
|
144
|
+
// try-block that catches loadAllPlugins failures.
|
|
145
|
+
const knownMarketplaces = await loadKnownMarketplacesConfigSafe()
|
|
146
|
+
|
|
147
|
+
// Save marketplace JSONs to zip cache
|
|
148
|
+
for (const [name, entry] of Object.entries(knownMarketplaces)) {
|
|
149
|
+
if (!entry.installLocation) continue
|
|
150
|
+
try {
|
|
151
|
+
await saveMarketplaceJsonToZipCache(name, entry.installLocation)
|
|
152
|
+
} catch (error) {
|
|
153
|
+
logForDebugging(`Failed to save marketplace JSON for ${name}: ${error}`)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Merge with previously cached data (ephemeral containers lose global config)
|
|
158
|
+
const zipCacheKnownMarketplaces = await readZipCacheKnownMarketplaces()
|
|
159
|
+
const mergedKnownMarketplaces: KnownMarketplacesFile = {
|
|
160
|
+
...zipCacheKnownMarketplaces,
|
|
161
|
+
...knownMarketplaces,
|
|
162
|
+
}
|
|
163
|
+
await writeZipCacheKnownMarketplaces(mergedKnownMarketplaces)
|
|
164
|
+
}
|