@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,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronous state machine for the query lifecycle, compatible with
|
|
3
|
+
* React's `useSyncExternalStore`.
|
|
4
|
+
*
|
|
5
|
+
* Three states:
|
|
6
|
+
* idle → no query, safe to dequeue and process
|
|
7
|
+
* dispatching → an item was dequeued, async chain hasn't reached onQuery yet
|
|
8
|
+
* running → onQuery called tryStart(), query is executing
|
|
9
|
+
*
|
|
10
|
+
* Transitions:
|
|
11
|
+
* idle → dispatching (reserve)
|
|
12
|
+
* dispatching → running (tryStart)
|
|
13
|
+
* idle → running (tryStart, for direct user submissions)
|
|
14
|
+
* running → idle (end / forceEnd)
|
|
15
|
+
* dispatching → idle (cancelReservation, when processQueueIfReady fails)
|
|
16
|
+
*
|
|
17
|
+
* `isActive` returns true for both dispatching and running, preventing
|
|
18
|
+
* re-entry from the queue processor during the async gap.
|
|
19
|
+
*
|
|
20
|
+
* Usage with React:
|
|
21
|
+
* const queryGuard = useRef(new QueryGuard()).current
|
|
22
|
+
* const isQueryActive = useSyncExternalStore(
|
|
23
|
+
* queryGuard.subscribe,
|
|
24
|
+
* queryGuard.getSnapshot,
|
|
25
|
+
* )
|
|
26
|
+
*/
|
|
27
|
+
import { createSignal } from './signal.js'
|
|
28
|
+
|
|
29
|
+
export class QueryGuard {
|
|
30
|
+
private _status: 'idle' | 'dispatching' | 'running' = 'idle'
|
|
31
|
+
private _generation = 0
|
|
32
|
+
private _changed = createSignal()
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Reserve the guard for queue processing. Transitions idle → dispatching.
|
|
36
|
+
* Returns false if not idle (another query or dispatch in progress).
|
|
37
|
+
*/
|
|
38
|
+
reserve(): boolean {
|
|
39
|
+
if (this._status !== 'idle') return false
|
|
40
|
+
this._status = 'dispatching'
|
|
41
|
+
this._notify()
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Cancel a reservation when processQueueIfReady had nothing to process.
|
|
47
|
+
* Transitions dispatching → idle.
|
|
48
|
+
*/
|
|
49
|
+
cancelReservation(): void {
|
|
50
|
+
if (this._status !== 'dispatching') return
|
|
51
|
+
this._status = 'idle'
|
|
52
|
+
this._notify()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Start a query. Returns the generation number on success,
|
|
57
|
+
* or null if a query is already running (concurrent guard).
|
|
58
|
+
* Accepts transitions from both idle (direct user submit)
|
|
59
|
+
* and dispatching (queue processor path).
|
|
60
|
+
*/
|
|
61
|
+
tryStart(): number | null {
|
|
62
|
+
if (this._status === 'running') return null
|
|
63
|
+
this._status = 'running'
|
|
64
|
+
++this._generation
|
|
65
|
+
this._notify()
|
|
66
|
+
return this._generation
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* End a query. Returns true if this generation is still current
|
|
71
|
+
* (meaning the caller should perform cleanup). Returns false if a
|
|
72
|
+
* newer query has started (stale finally block from a cancelled query).
|
|
73
|
+
*/
|
|
74
|
+
end(generation: number): boolean {
|
|
75
|
+
if (this._generation !== generation) return false
|
|
76
|
+
if (this._status !== 'running') return false
|
|
77
|
+
this._status = 'idle'
|
|
78
|
+
this._notify()
|
|
79
|
+
return true
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Force-end the current query regardless of generation.
|
|
84
|
+
* Used by onCancel where any running query should be terminated.
|
|
85
|
+
* Increments generation so stale finally blocks from the cancelled
|
|
86
|
+
* query's promise rejection will see a mismatch and skip cleanup.
|
|
87
|
+
*/
|
|
88
|
+
forceEnd(): void {
|
|
89
|
+
if (this._status === 'idle') return
|
|
90
|
+
this._status = 'idle'
|
|
91
|
+
++this._generation
|
|
92
|
+
this._notify()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Is the guard active (dispatching or running)?
|
|
97
|
+
* Always synchronous — not subject to React state batching delays.
|
|
98
|
+
*/
|
|
99
|
+
get isActive(): boolean {
|
|
100
|
+
return this._status !== 'idle'
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get generation(): number {
|
|
104
|
+
return this._generation
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// --
|
|
108
|
+
// useSyncExternalStore interface
|
|
109
|
+
|
|
110
|
+
/** Subscribe to state changes. Stable reference — safe as useEffect dep. */
|
|
111
|
+
subscribe = this._changed.subscribe
|
|
112
|
+
|
|
113
|
+
/** Snapshot for useSyncExternalStore. Returns `isActive`. */
|
|
114
|
+
getSnapshot = (): boolean => {
|
|
115
|
+
return this._status !== 'idle'
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private _notify(): void {
|
|
119
|
+
this._changed.emit()
|
|
120
|
+
}
|
|
121
|
+
}
|
package/utils/Shell.ts
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { execFileSync, spawn } from 'child_process'
|
|
2
|
+
import { constants as fsConstants, readFileSync, unlinkSync } from 'fs'
|
|
3
|
+
import { type FileHandle, mkdir, open, realpath } from 'fs/promises'
|
|
4
|
+
import memoize from 'lodash-es/memoize.js'
|
|
5
|
+
import { isAbsolute, resolve } from 'path'
|
|
6
|
+
import { join as posixJoin } from 'path/posix'
|
|
7
|
+
import { logEvent } from 'src/services/analytics/index.js'
|
|
8
|
+
import {
|
|
9
|
+
getOriginalCwd,
|
|
10
|
+
getSessionId,
|
|
11
|
+
setCwdState,
|
|
12
|
+
} from '../bootstrap/state.js'
|
|
13
|
+
import { generateTaskId } from '../Task.js'
|
|
14
|
+
import { pwd } from './cwd.js'
|
|
15
|
+
import { logForDebugging } from './debug.js'
|
|
16
|
+
import { errorMessage, isENOENT } from './errors.js'
|
|
17
|
+
import { getFsImplementation } from './fsOperations.js'
|
|
18
|
+
import { logError } from './log.js'
|
|
19
|
+
import {
|
|
20
|
+
createAbortedCommand,
|
|
21
|
+
createFailedCommand,
|
|
22
|
+
type ShellCommand,
|
|
23
|
+
wrapSpawn,
|
|
24
|
+
} from './ShellCommand.js'
|
|
25
|
+
import { getTaskOutputDir } from './task/diskOutput.js'
|
|
26
|
+
import { TaskOutput } from './task/TaskOutput.js'
|
|
27
|
+
import { which } from './which.js'
|
|
28
|
+
|
|
29
|
+
export type { ExecResult } from './ShellCommand.js'
|
|
30
|
+
|
|
31
|
+
import { accessSync } from 'fs'
|
|
32
|
+
import { onCwdChangedForHooks } from './hooks/fileChangedWatcher.js'
|
|
33
|
+
import { getClaudeTempDirName } from './permissions/filesystem.js'
|
|
34
|
+
import { getPlatform } from './platform.js'
|
|
35
|
+
import { SandboxManager } from './sandbox/sandbox-adapter.js'
|
|
36
|
+
import { invalidateSessionEnvCache } from './sessionEnvironment.js'
|
|
37
|
+
import { createBashShellProvider } from './shell/bashProvider.js'
|
|
38
|
+
import { getCachedPowerShellPath } from './shell/powershellDetection.js'
|
|
39
|
+
import { createPowerShellProvider } from './shell/powershellProvider.js'
|
|
40
|
+
import type { ShellProvider, ShellType } from './shell/shellProvider.js'
|
|
41
|
+
import { subprocessEnv } from './subprocessEnv.js'
|
|
42
|
+
import { posixPathToWindowsPath } from './windowsPaths.js'
|
|
43
|
+
|
|
44
|
+
const DEFAULT_TIMEOUT = 30 * 60 * 1000 // 30 minutes
|
|
45
|
+
|
|
46
|
+
export type ShellConfig = {
|
|
47
|
+
provider: ShellProvider
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function isExecutable(shellPath: string): boolean {
|
|
51
|
+
try {
|
|
52
|
+
accessSync(shellPath, fsConstants.X_OK)
|
|
53
|
+
return true
|
|
54
|
+
} catch (_err) {
|
|
55
|
+
// Fallback for Nix and other environments where X_OK check might fail
|
|
56
|
+
try {
|
|
57
|
+
// Try to execute the shell with --version, which should exit quickly
|
|
58
|
+
// Use execFileSync to avoid shell injection vulnerabilities
|
|
59
|
+
execFileSync(shellPath, ['--version'], {
|
|
60
|
+
timeout: 1000,
|
|
61
|
+
stdio: 'ignore',
|
|
62
|
+
})
|
|
63
|
+
return true
|
|
64
|
+
} catch {
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Determines the best available shell to use.
|
|
72
|
+
*/
|
|
73
|
+
export async function findSuitableShell(): Promise<string> {
|
|
74
|
+
// Check for explicit shell override first
|
|
75
|
+
const shellOverride = process.env.CLAUDE_CODE_SHELL
|
|
76
|
+
if (shellOverride) {
|
|
77
|
+
// Validate it's a supported shell type
|
|
78
|
+
const isSupported =
|
|
79
|
+
shellOverride.includes('bash') || shellOverride.includes('zsh')
|
|
80
|
+
if (isSupported && isExecutable(shellOverride)) {
|
|
81
|
+
logForDebugging(`Using shell override: ${shellOverride}`)
|
|
82
|
+
return shellOverride
|
|
83
|
+
} else {
|
|
84
|
+
// Note, if we ever want to add support for new shells here we'll need to update or Bash tool parsing to account for this
|
|
85
|
+
logForDebugging(
|
|
86
|
+
`CLAUDE_CODE_SHELL="${shellOverride}" is not a valid bash/zsh path, falling back to detection`,
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Check user's preferred shell from environment
|
|
92
|
+
const env_shell = process.env.SHELL
|
|
93
|
+
// Only consider SHELL if it's bash or zsh
|
|
94
|
+
const isEnvShellSupported =
|
|
95
|
+
env_shell && (env_shell.includes('bash') || env_shell.includes('zsh'))
|
|
96
|
+
const preferBash = env_shell?.includes('bash')
|
|
97
|
+
|
|
98
|
+
// Try to locate shells using which (uses Bun.which when available)
|
|
99
|
+
const [zshPath, bashPath] = await Promise.all([which('zsh'), which('bash')])
|
|
100
|
+
|
|
101
|
+
// Populate shell paths from which results and fallback locations
|
|
102
|
+
const shellPaths = ['/bin', '/usr/bin', '/usr/local/bin', '/opt/homebrew/bin']
|
|
103
|
+
|
|
104
|
+
// Order shells based on user preference
|
|
105
|
+
const shellOrder = preferBash ? ['bash', 'zsh'] : ['zsh', 'bash']
|
|
106
|
+
const supportedShells = shellOrder.flatMap(shell =>
|
|
107
|
+
shellPaths.map(path => `${path}/${shell}`),
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
// Add discovered paths to the beginning of our search list
|
|
111
|
+
// Put the user's preferred shell type first
|
|
112
|
+
if (preferBash) {
|
|
113
|
+
if (bashPath) supportedShells.unshift(bashPath)
|
|
114
|
+
if (zshPath) supportedShells.push(zshPath)
|
|
115
|
+
} else {
|
|
116
|
+
if (zshPath) supportedShells.unshift(zshPath)
|
|
117
|
+
if (bashPath) supportedShells.push(bashPath)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Always prioritize SHELL env variable if it's a supported shell type
|
|
121
|
+
if (isEnvShellSupported && isExecutable(env_shell)) {
|
|
122
|
+
supportedShells.unshift(env_shell)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const shellPath = supportedShells.find(shell => shell && isExecutable(shell))
|
|
126
|
+
|
|
127
|
+
// If no valid shell found, throw a helpful error
|
|
128
|
+
if (!shellPath) {
|
|
129
|
+
const errorMsg =
|
|
130
|
+
'No suitable shell found. Claude CLI requires a Posix shell environment. ' +
|
|
131
|
+
'Please ensure you have a valid shell installed and the SHELL environment variable set.'
|
|
132
|
+
logError(new Error(errorMsg))
|
|
133
|
+
throw new Error(errorMsg)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return shellPath
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function getShellConfigImpl(): Promise<ShellConfig> {
|
|
140
|
+
const binShell = await findSuitableShell()
|
|
141
|
+
const provider = await createBashShellProvider(binShell)
|
|
142
|
+
return { provider }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Memoize the entire shell config so it only happens once per session
|
|
146
|
+
export const getShellConfig = memoize(getShellConfigImpl)
|
|
147
|
+
|
|
148
|
+
export const getPsProvider = memoize(async (): Promise<ShellProvider> => {
|
|
149
|
+
const psPath = await getCachedPowerShellPath()
|
|
150
|
+
if (!psPath) {
|
|
151
|
+
throw new Error('PowerShell is not available')
|
|
152
|
+
}
|
|
153
|
+
return createPowerShellProvider(psPath)
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
const resolveProvider: Record<ShellType, () => Promise<ShellProvider>> = {
|
|
157
|
+
bash: async () => (await getShellConfig()).provider,
|
|
158
|
+
powershell: getPsProvider,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export type ExecOptions = {
|
|
162
|
+
timeout?: number
|
|
163
|
+
onProgress?: (
|
|
164
|
+
lastLines: string,
|
|
165
|
+
allLines: string,
|
|
166
|
+
totalLines: number,
|
|
167
|
+
totalBytes: number,
|
|
168
|
+
isIncomplete: boolean,
|
|
169
|
+
) => void
|
|
170
|
+
preventCwdChanges?: boolean
|
|
171
|
+
shouldUseSandbox?: boolean
|
|
172
|
+
shouldAutoBackground?: boolean
|
|
173
|
+
/** When provided, stdout is piped (not sent to file) and this callback fires on each data chunk. */
|
|
174
|
+
onStdout?: (data: string) => void
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Execute a shell command using the environment snapshot
|
|
179
|
+
* Creates a new shell process for each command execution
|
|
180
|
+
*/
|
|
181
|
+
export async function exec(
|
|
182
|
+
command: string,
|
|
183
|
+
abortSignal: AbortSignal,
|
|
184
|
+
shellType: ShellType,
|
|
185
|
+
options?: ExecOptions,
|
|
186
|
+
): Promise<ShellCommand> {
|
|
187
|
+
const {
|
|
188
|
+
timeout,
|
|
189
|
+
onProgress,
|
|
190
|
+
preventCwdChanges,
|
|
191
|
+
shouldUseSandbox,
|
|
192
|
+
shouldAutoBackground,
|
|
193
|
+
onStdout,
|
|
194
|
+
} = options ?? {}
|
|
195
|
+
const commandTimeout = timeout || DEFAULT_TIMEOUT
|
|
196
|
+
|
|
197
|
+
const provider = await resolveProvider[shellType]()
|
|
198
|
+
|
|
199
|
+
const id = Math.floor(Math.random() * 0x10000)
|
|
200
|
+
.toString(16)
|
|
201
|
+
.padStart(4, '0')
|
|
202
|
+
|
|
203
|
+
// Sandbox temp directory - use per-user directory name to prevent multi-user permission conflicts
|
|
204
|
+
const sandboxTmpDir = posixJoin(
|
|
205
|
+
process.env.CLAUDE_CODE_TMPDIR || '/tmp',
|
|
206
|
+
getClaudeTempDirName(),
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
const { commandString: builtCommand, cwdFilePath } =
|
|
210
|
+
await provider.buildExecCommand(command, {
|
|
211
|
+
id,
|
|
212
|
+
sandboxTmpDir: shouldUseSandbox ? sandboxTmpDir : undefined,
|
|
213
|
+
useSandbox: shouldUseSandbox ?? false,
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
let commandString = builtCommand
|
|
217
|
+
|
|
218
|
+
let cwd = pwd()
|
|
219
|
+
|
|
220
|
+
// Recover if the current working directory no longer exists on disk.
|
|
221
|
+
// This can happen when a command deletes its own CWD (e.g., temp dir cleanup).
|
|
222
|
+
try {
|
|
223
|
+
await realpath(cwd)
|
|
224
|
+
} catch {
|
|
225
|
+
const fallback = getOriginalCwd()
|
|
226
|
+
logForDebugging(
|
|
227
|
+
`Shell CWD "${cwd}" no longer exists, recovering to "${fallback}"`,
|
|
228
|
+
)
|
|
229
|
+
try {
|
|
230
|
+
await realpath(fallback)
|
|
231
|
+
setCwdState(fallback)
|
|
232
|
+
cwd = fallback
|
|
233
|
+
} catch {
|
|
234
|
+
return createFailedCommand(
|
|
235
|
+
`Working directory "${cwd}" no longer exists. Please restart Claude from an existing directory.`,
|
|
236
|
+
)
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// If already aborted, don't spawn the process at all
|
|
241
|
+
if (abortSignal.aborted) {
|
|
242
|
+
return createAbortedCommand()
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const binShell = provider.shellPath
|
|
246
|
+
|
|
247
|
+
// Sandboxed PowerShell: wrapWithSandbox hardcodes `<binShell> -c '<cmd>'` —
|
|
248
|
+
// using pwsh there would lose -NoProfile -NonInteractive (profile load
|
|
249
|
+
// inside sandbox → delays, stray output, may hang on prompts). Instead:
|
|
250
|
+
// • powershellProvider.buildExecCommand (useSandbox) pre-wraps as
|
|
251
|
+
// `pwsh -NoProfile -NonInteractive -EncodedCommand <base64>` — base64
|
|
252
|
+
// survives the runtime's shellquote.quote() layer
|
|
253
|
+
// • pass /bin/sh as the sandbox's inner shell to exec that invocation
|
|
254
|
+
// • outer spawn is also /bin/sh -c to parse the runtime's POSIX output
|
|
255
|
+
// /bin/sh exists on every platform where sandbox is supported.
|
|
256
|
+
const isSandboxedPowerShell = shouldUseSandbox && shellType === 'powershell'
|
|
257
|
+
const sandboxBinShell = isSandboxedPowerShell ? '/bin/sh' : binShell
|
|
258
|
+
|
|
259
|
+
if (shouldUseSandbox) {
|
|
260
|
+
commandString = await SandboxManager.wrapWithSandbox(
|
|
261
|
+
commandString,
|
|
262
|
+
sandboxBinShell,
|
|
263
|
+
undefined,
|
|
264
|
+
abortSignal,
|
|
265
|
+
)
|
|
266
|
+
// Create sandbox temp directory for sandboxed processes with secure permissions
|
|
267
|
+
try {
|
|
268
|
+
const fs = getFsImplementation()
|
|
269
|
+
await fs.mkdir(sandboxTmpDir, { mode: 0o700 })
|
|
270
|
+
} catch (error) {
|
|
271
|
+
logForDebugging(`Failed to create ${sandboxTmpDir} directory: ${error}`)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const spawnBinary = isSandboxedPowerShell ? '/bin/sh' : binShell
|
|
276
|
+
const shellArgs = isSandboxedPowerShell
|
|
277
|
+
? ['-c', commandString]
|
|
278
|
+
: provider.getSpawnArgs(commandString)
|
|
279
|
+
const envOverrides = await provider.getEnvironmentOverrides(command)
|
|
280
|
+
|
|
281
|
+
// When onStdout is provided, use pipe mode: stdout flows through
|
|
282
|
+
// StreamWrapper → TaskOutput in-memory buffer instead of a file fd.
|
|
283
|
+
// This lets callers receive real-time stdout callbacks.
|
|
284
|
+
const usePipeMode = !!onStdout
|
|
285
|
+
const taskId = generateTaskId('local_bash')
|
|
286
|
+
const taskOutput = new TaskOutput(taskId, onProgress ?? null, !usePipeMode)
|
|
287
|
+
await mkdir(getTaskOutputDir(), { recursive: true })
|
|
288
|
+
|
|
289
|
+
// In file mode, both stdout and stderr go to the same file fd.
|
|
290
|
+
// On POSIX, O_APPEND makes each write atomic (seek-to-end + write), so
|
|
291
|
+
// stdout and stderr are interleaved chronologically without tearing.
|
|
292
|
+
// On Windows, 'a' mode strips FILE_WRITE_DATA (only grants FILE_APPEND_DATA)
|
|
293
|
+
// via libuv's fs__open. MSYS2/Cygwin probes inherited handles with
|
|
294
|
+
// NtQueryInformationFile(FileAccessInformation) and treats handles without
|
|
295
|
+
// FILE_WRITE_DATA as read-only, silently discarding all output. Using 'w'
|
|
296
|
+
// grants FILE_GENERIC_WRITE. Atomicity is preserved because duplicated
|
|
297
|
+
// handles share the same FILE_OBJECT with FILE_SYNCHRONOUS_IO_NONALERT,
|
|
298
|
+
// which serializes all I/O through a single kernel lock.
|
|
299
|
+
// SECURITY: O_NOFOLLOW prevents symlink-following attacks from the sandbox.
|
|
300
|
+
// On Windows, use string flags — numeric flags can produce EINVAL through libuv.
|
|
301
|
+
let outputHandle: FileHandle | undefined
|
|
302
|
+
if (!usePipeMode) {
|
|
303
|
+
const O_NOFOLLOW = fsConstants.O_NOFOLLOW ?? 0
|
|
304
|
+
outputHandle = await open(
|
|
305
|
+
taskOutput.path,
|
|
306
|
+
process.platform === 'win32'
|
|
307
|
+
? 'w'
|
|
308
|
+
: fsConstants.O_WRONLY |
|
|
309
|
+
fsConstants.O_CREAT |
|
|
310
|
+
fsConstants.O_APPEND |
|
|
311
|
+
O_NOFOLLOW,
|
|
312
|
+
)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
try {
|
|
316
|
+
const childProcess = spawn(spawnBinary, shellArgs, {
|
|
317
|
+
env: {
|
|
318
|
+
...subprocessEnv(),
|
|
319
|
+
SHELL: shellType === 'bash' ? binShell : undefined,
|
|
320
|
+
GIT_EDITOR: 'true',
|
|
321
|
+
CLAUDECODE: '1',
|
|
322
|
+
...envOverrides,
|
|
323
|
+
...(process.env.USER_TYPE === 'ant'
|
|
324
|
+
? {
|
|
325
|
+
CLAUDE_CODE_SESSION_ID: getSessionId(),
|
|
326
|
+
}
|
|
327
|
+
: {}),
|
|
328
|
+
},
|
|
329
|
+
cwd,
|
|
330
|
+
stdio: usePipeMode
|
|
331
|
+
? ['pipe', 'pipe', 'pipe']
|
|
332
|
+
: ['pipe', outputHandle?.fd, outputHandle?.fd],
|
|
333
|
+
// Don't pass the signal - we'll handle termination ourselves with tree-kill
|
|
334
|
+
detached: provider.detached,
|
|
335
|
+
// Prevent visible console window on Windows (no-op on other platforms)
|
|
336
|
+
windowsHide: true,
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
const shellCommand = wrapSpawn(
|
|
340
|
+
childProcess,
|
|
341
|
+
abortSignal,
|
|
342
|
+
commandTimeout,
|
|
343
|
+
taskOutput,
|
|
344
|
+
shouldAutoBackground,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
// Close our copy of the fd — the child has its own dup.
|
|
348
|
+
// Must happen after wrapSpawn attaches 'error' listener, since the await
|
|
349
|
+
// yields and the child's ENOENT 'error' event can fire in that window.
|
|
350
|
+
// Wrapped in its own try/catch so a close failure (e.g. EIO) doesn't fall
|
|
351
|
+
// through to the spawn-failure catch block, which would orphan the child.
|
|
352
|
+
if (outputHandle !== undefined) {
|
|
353
|
+
try {
|
|
354
|
+
await outputHandle.close()
|
|
355
|
+
} catch {
|
|
356
|
+
// fd may already be closed by the child; safe to ignore
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// In pipe mode, attach the caller's callbacks alongside StreamWrapper.
|
|
361
|
+
// Both listeners receive the same data chunks (Node.js ReadableStream supports
|
|
362
|
+
// multiple 'data' listeners). StreamWrapper feeds TaskOutput for persistence;
|
|
363
|
+
// these callbacks give the caller real-time access.
|
|
364
|
+
if (childProcess.stdout && onStdout) {
|
|
365
|
+
childProcess.stdout.on('data', (chunk: string | Buffer) => {
|
|
366
|
+
onStdout(typeof chunk === 'string' ? chunk : chunk.toString())
|
|
367
|
+
})
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Attach cleanup to the command result
|
|
371
|
+
// NOTE: readFileSync/unlinkSync are intentional here — these must complete
|
|
372
|
+
// synchronously within the .then() microtask so that callers who
|
|
373
|
+
// `await shellCommand.result` see the updated cwd immediately after.
|
|
374
|
+
// Using async readFile would introduce a microtask boundary, causing
|
|
375
|
+
// a race where cwd hasn't been updated yet when the caller continues.
|
|
376
|
+
|
|
377
|
+
// On Windows, cwdFilePath is a POSIX path (for bash's `pwd -P >| $path`),
|
|
378
|
+
// but Node.js needs a native Windows path for readFileSync/unlinkSync.
|
|
379
|
+
// Similarly, `pwd -P` outputs a POSIX path that must be converted before setCwd.
|
|
380
|
+
const nativeCwdFilePath =
|
|
381
|
+
getPlatform() === 'windows'
|
|
382
|
+
? posixPathToWindowsPath(cwdFilePath)
|
|
383
|
+
: cwdFilePath
|
|
384
|
+
|
|
385
|
+
void shellCommand.result.then(async result => {
|
|
386
|
+
// On Linux, bwrap creates 0-byte mount-point files on the host to deny
|
|
387
|
+
// writes to non-existent paths (.bashrc, HEAD, etc.). These persist after
|
|
388
|
+
// bwrap exits as ghost dotfiles in cwd. Cleanup is synchronous and a no-op
|
|
389
|
+
// on macOS. Keep before any await so callers awaiting .result see a clean
|
|
390
|
+
// working tree in the same microtask.
|
|
391
|
+
if (shouldUseSandbox) {
|
|
392
|
+
SandboxManager.cleanupAfterCommand()
|
|
393
|
+
}
|
|
394
|
+
// Only foreground tasks update the cwd
|
|
395
|
+
if (result && !preventCwdChanges && !result.backgroundTaskId) {
|
|
396
|
+
try {
|
|
397
|
+
let newCwd = readFileSync(nativeCwdFilePath, {
|
|
398
|
+
encoding: 'utf8',
|
|
399
|
+
}).trim()
|
|
400
|
+
if (getPlatform() === 'windows') {
|
|
401
|
+
newCwd = posixPathToWindowsPath(newCwd)
|
|
402
|
+
}
|
|
403
|
+
// cwd is NFC-normalized (setCwdState); newCwd from `pwd -P` may be
|
|
404
|
+
// NFD on macOS APFS. Normalize before comparing so Unicode paths
|
|
405
|
+
// don't false-positive as "changed" on every command.
|
|
406
|
+
if (newCwd.normalize('NFC') !== cwd) {
|
|
407
|
+
setCwd(newCwd, cwd)
|
|
408
|
+
invalidateSessionEnvCache()
|
|
409
|
+
void onCwdChangedForHooks(cwd, newCwd)
|
|
410
|
+
}
|
|
411
|
+
} catch {
|
|
412
|
+
logEvent('tengu_shell_set_cwd', { success: false })
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Clean up the temp file used for cwd tracking
|
|
416
|
+
try {
|
|
417
|
+
unlinkSync(nativeCwdFilePath)
|
|
418
|
+
} catch {
|
|
419
|
+
// File may not exist if command failed before pwd -P ran
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
|
|
423
|
+
return shellCommand
|
|
424
|
+
} catch (error) {
|
|
425
|
+
// Close the fd if spawn failed (child never got its dup)
|
|
426
|
+
if (outputHandle !== undefined) {
|
|
427
|
+
try {
|
|
428
|
+
await outputHandle.close()
|
|
429
|
+
} catch {
|
|
430
|
+
// May already be closed
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
taskOutput.clear()
|
|
434
|
+
|
|
435
|
+
logForDebugging(`Shell exec error: ${errorMessage(error)}`)
|
|
436
|
+
|
|
437
|
+
return createAbortedCommand(undefined, {
|
|
438
|
+
code: 126, // Standard Unix code for execution errors
|
|
439
|
+
stderr: errorMessage(error),
|
|
440
|
+
})
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Set the current working directory
|
|
446
|
+
*/
|
|
447
|
+
export function setCwd(path: string, relativeTo?: string): void {
|
|
448
|
+
const resolved = isAbsolute(path)
|
|
449
|
+
? path
|
|
450
|
+
: resolve(relativeTo || getFsImplementation().cwd(), path)
|
|
451
|
+
// Resolve symlinks to match the behavior of pwd -P.
|
|
452
|
+
// realpathSync throws ENOENT if the path doesn't exist - convert to a
|
|
453
|
+
// friendlier error message instead of a separate existsSync pre-check (TOCTOU).
|
|
454
|
+
let physicalPath: string
|
|
455
|
+
try {
|
|
456
|
+
physicalPath = getFsImplementation().realpathSync(resolved)
|
|
457
|
+
} catch (e) {
|
|
458
|
+
if (isENOENT(e)) {
|
|
459
|
+
throw new Error(`Path "${resolved}" does not exist`)
|
|
460
|
+
}
|
|
461
|
+
throw e
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
setCwdState(physicalPath)
|
|
465
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
466
|
+
try {
|
|
467
|
+
logEvent('tengu_shell_set_cwd', {
|
|
468
|
+
success: true,
|
|
469
|
+
})
|
|
470
|
+
} catch (_error) {
|
|
471
|
+
// Ignore logging errors to prevent test failures
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|