@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,259 @@
|
|
|
1
|
+
import type { SuggestionItem } from 'src/components/PromptInput/PromptInputFooterSuggestions.js'
|
|
2
|
+
import {
|
|
3
|
+
type ParseEntry,
|
|
4
|
+
quote,
|
|
5
|
+
tryParseShellCommand,
|
|
6
|
+
} from '../bash/shellQuote.js'
|
|
7
|
+
import { logForDebugging } from '../debug.js'
|
|
8
|
+
import { getShellType } from '../localInstaller.js'
|
|
9
|
+
import * as Shell from '../Shell.js'
|
|
10
|
+
|
|
11
|
+
// Constants
|
|
12
|
+
const MAX_SHELL_COMPLETIONS = 15
|
|
13
|
+
const SHELL_COMPLETION_TIMEOUT_MS = 1000
|
|
14
|
+
const COMMAND_OPERATORS = ['|', '||', '&&', ';'] as const
|
|
15
|
+
|
|
16
|
+
export type ShellCompletionType = 'command' | 'variable' | 'file'
|
|
17
|
+
|
|
18
|
+
type InputContext = {
|
|
19
|
+
prefix: string
|
|
20
|
+
completionType: ShellCompletionType
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Check if a parsed token is a command operator (|, ||, &&, ;)
|
|
25
|
+
*/
|
|
26
|
+
function isCommandOperator(token: ParseEntry): boolean {
|
|
27
|
+
return (
|
|
28
|
+
typeof token === 'object' &&
|
|
29
|
+
token !== null &&
|
|
30
|
+
'op' in token &&
|
|
31
|
+
(COMMAND_OPERATORS as readonly string[]).includes(token.op as string)
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Determine completion type based solely on prefix characteristics
|
|
37
|
+
*/
|
|
38
|
+
function getCompletionTypeFromPrefix(prefix: string): ShellCompletionType {
|
|
39
|
+
if (prefix.startsWith('$')) {
|
|
40
|
+
return 'variable'
|
|
41
|
+
}
|
|
42
|
+
if (
|
|
43
|
+
prefix.includes('/') ||
|
|
44
|
+
prefix.startsWith('~') ||
|
|
45
|
+
prefix.startsWith('.')
|
|
46
|
+
) {
|
|
47
|
+
return 'file'
|
|
48
|
+
}
|
|
49
|
+
return 'command'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Find the last string token and its index in parsed tokens
|
|
54
|
+
*/
|
|
55
|
+
function findLastStringToken(
|
|
56
|
+
tokens: ParseEntry[],
|
|
57
|
+
): { token: string; index: number } | null {
|
|
58
|
+
const i = tokens.findLastIndex(t => typeof t === 'string')
|
|
59
|
+
return i !== -1 ? { token: tokens[i] as string, index: i } : null
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if we're in a context that expects a new command
|
|
64
|
+
* (at start of input or after a command operator)
|
|
65
|
+
*/
|
|
66
|
+
function isNewCommandContext(
|
|
67
|
+
tokens: ParseEntry[],
|
|
68
|
+
currentTokenIndex: number,
|
|
69
|
+
): boolean {
|
|
70
|
+
if (currentTokenIndex === 0) {
|
|
71
|
+
return true
|
|
72
|
+
}
|
|
73
|
+
const prevToken = tokens[currentTokenIndex - 1]
|
|
74
|
+
return prevToken !== undefined && isCommandOperator(prevToken)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Parse input to extract completion context
|
|
79
|
+
*/
|
|
80
|
+
function parseInputContext(input: string, cursorOffset: number): InputContext {
|
|
81
|
+
const beforeCursor = input.slice(0, cursorOffset)
|
|
82
|
+
|
|
83
|
+
// Check if it's a variable prefix, before expanding with shell-quote
|
|
84
|
+
const varMatch = beforeCursor.match(/\$[a-zA-Z_][a-zA-Z0-9_]*$/)
|
|
85
|
+
if (varMatch) {
|
|
86
|
+
return { prefix: varMatch[0], completionType: 'variable' }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Parse with shell-quote
|
|
90
|
+
const parseResult = tryParseShellCommand(beforeCursor)
|
|
91
|
+
if (!parseResult.success) {
|
|
92
|
+
// Fallback to simple parsing
|
|
93
|
+
const tokens = beforeCursor.split(/\s+/)
|
|
94
|
+
const prefix = tokens[tokens.length - 1] || ''
|
|
95
|
+
const isFirstToken = tokens.length === 1 && !beforeCursor.includes(' ')
|
|
96
|
+
const completionType = isFirstToken
|
|
97
|
+
? 'command'
|
|
98
|
+
: getCompletionTypeFromPrefix(prefix)
|
|
99
|
+
return { prefix, completionType }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Extract current token
|
|
103
|
+
const lastToken = findLastStringToken(parseResult.tokens)
|
|
104
|
+
if (!lastToken) {
|
|
105
|
+
// No string token found - check if after operator
|
|
106
|
+
const lastParsedToken = parseResult.tokens[parseResult.tokens.length - 1]
|
|
107
|
+
const completionType =
|
|
108
|
+
lastParsedToken && isCommandOperator(lastParsedToken)
|
|
109
|
+
? 'command'
|
|
110
|
+
: 'command' // Default to command at start
|
|
111
|
+
return { prefix: '', completionType }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// If there's a trailing space, the user is starting a new argument
|
|
115
|
+
if (beforeCursor.endsWith(' ')) {
|
|
116
|
+
// After first token (command) with space = file argument expected
|
|
117
|
+
return { prefix: '', completionType: 'file' }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Determine completion type from context
|
|
121
|
+
const baseType = getCompletionTypeFromPrefix(lastToken.token)
|
|
122
|
+
|
|
123
|
+
// If it's clearly a file or variable based on prefix, use that type
|
|
124
|
+
if (baseType === 'variable' || baseType === 'file') {
|
|
125
|
+
return { prefix: lastToken.token, completionType: baseType }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// For command-like tokens, check context: are we starting a new command?
|
|
129
|
+
const completionType = isNewCommandContext(
|
|
130
|
+
parseResult.tokens,
|
|
131
|
+
lastToken.index,
|
|
132
|
+
)
|
|
133
|
+
? 'command'
|
|
134
|
+
: 'file' // Not after operator = file argument
|
|
135
|
+
|
|
136
|
+
return { prefix: lastToken.token, completionType }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Generate bash completion command using compgen
|
|
141
|
+
*/
|
|
142
|
+
function getBashCompletionCommand(
|
|
143
|
+
prefix: string,
|
|
144
|
+
completionType: ShellCompletionType,
|
|
145
|
+
): string {
|
|
146
|
+
if (completionType === 'variable') {
|
|
147
|
+
// Variable completion - remove $ prefix
|
|
148
|
+
const varName = prefix.slice(1)
|
|
149
|
+
return `compgen -v ${quote([varName])} 2>/dev/null`
|
|
150
|
+
} else if (completionType === 'file') {
|
|
151
|
+
// File completion with trailing slash for directories and trailing space for files
|
|
152
|
+
// Use 'while read' to prevent command injection from filenames containing newlines
|
|
153
|
+
return `compgen -f ${quote([prefix])} 2>/dev/null | head -${MAX_SHELL_COMPLETIONS} | while IFS= read -r f; do [ -d "$f" ] && echo "$f/" || echo "$f "; done`
|
|
154
|
+
} else {
|
|
155
|
+
// Command completion
|
|
156
|
+
return `compgen -c ${quote([prefix])} 2>/dev/null`
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Generate zsh completion command using native zsh commands
|
|
162
|
+
*/
|
|
163
|
+
function getZshCompletionCommand(
|
|
164
|
+
prefix: string,
|
|
165
|
+
completionType: ShellCompletionType,
|
|
166
|
+
): string {
|
|
167
|
+
if (completionType === 'variable') {
|
|
168
|
+
// Variable completion - use zsh pattern matching for safe filtering
|
|
169
|
+
const varName = prefix.slice(1)
|
|
170
|
+
return `print -rl -- \${(k)parameters[(I)${quote([varName])}*]} 2>/dev/null`
|
|
171
|
+
} else if (completionType === 'file') {
|
|
172
|
+
// File completion with trailing slash for directories and trailing space for files
|
|
173
|
+
// Note: zsh glob expansion is safe from command injection (unlike bash for-in loops)
|
|
174
|
+
return `for f in ${quote([prefix])}*(N[1,${MAX_SHELL_COMPLETIONS}]); do [[ -d "$f" ]] && echo "$f/" || echo "$f "; done`
|
|
175
|
+
} else {
|
|
176
|
+
// Command completion - use zsh pattern matching for safe filtering
|
|
177
|
+
return `print -rl -- \${(k)commands[(I)${quote([prefix])}*]} 2>/dev/null`
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get completions for the given shell type
|
|
183
|
+
*/
|
|
184
|
+
async function getCompletionsForShell(
|
|
185
|
+
shellType: 'bash' | 'zsh',
|
|
186
|
+
prefix: string,
|
|
187
|
+
completionType: ShellCompletionType,
|
|
188
|
+
abortSignal: AbortSignal,
|
|
189
|
+
): Promise<SuggestionItem[]> {
|
|
190
|
+
let command: string
|
|
191
|
+
|
|
192
|
+
if (shellType === 'bash') {
|
|
193
|
+
command = getBashCompletionCommand(prefix, completionType)
|
|
194
|
+
} else if (shellType === 'zsh') {
|
|
195
|
+
command = getZshCompletionCommand(prefix, completionType)
|
|
196
|
+
} else {
|
|
197
|
+
// Unsupported shell type
|
|
198
|
+
return []
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const shellCommand = await Shell.exec(command, abortSignal, 'bash', {
|
|
202
|
+
timeout: SHELL_COMPLETION_TIMEOUT_MS,
|
|
203
|
+
})
|
|
204
|
+
const result = await shellCommand.result
|
|
205
|
+
return result.stdout
|
|
206
|
+
.split('\n')
|
|
207
|
+
.filter((line: string) => line.trim())
|
|
208
|
+
.slice(0, MAX_SHELL_COMPLETIONS)
|
|
209
|
+
.map((text: string) => ({
|
|
210
|
+
id: text,
|
|
211
|
+
displayText: text,
|
|
212
|
+
description: undefined,
|
|
213
|
+
metadata: { completionType },
|
|
214
|
+
}))
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Get shell completions for the given input
|
|
219
|
+
* Supports bash and zsh shells (matches Shell.ts execution support)
|
|
220
|
+
*/
|
|
221
|
+
export async function getShellCompletions(
|
|
222
|
+
input: string,
|
|
223
|
+
cursorOffset: number,
|
|
224
|
+
abortSignal: AbortSignal,
|
|
225
|
+
): Promise<SuggestionItem[]> {
|
|
226
|
+
const shellType = getShellType()
|
|
227
|
+
|
|
228
|
+
// Only support bash/zsh (matches Shell.ts execution support)
|
|
229
|
+
if (shellType !== 'bash' && shellType !== 'zsh') {
|
|
230
|
+
return []
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
try {
|
|
234
|
+
const { prefix, completionType } = parseInputContext(input, cursorOffset)
|
|
235
|
+
|
|
236
|
+
if (!prefix) {
|
|
237
|
+
return []
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const completions = await getCompletionsForShell(
|
|
241
|
+
shellType,
|
|
242
|
+
prefix,
|
|
243
|
+
completionType,
|
|
244
|
+
abortSignal,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
// Add inputSnapshot to all suggestions so we can detect when input changes
|
|
248
|
+
return completions.map(suggestion => ({
|
|
249
|
+
...suggestion,
|
|
250
|
+
metadata: {
|
|
251
|
+
...(suggestion.metadata as { completionType: ShellCompletionType }),
|
|
252
|
+
inputSnapshot: input,
|
|
253
|
+
},
|
|
254
|
+
}))
|
|
255
|
+
} catch (error) {
|
|
256
|
+
logForDebugging(`Shell completion failed: ${error}`)
|
|
257
|
+
return [] // Silent fail
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { quote } from './shellQuote.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parses a shell prefix that may contain an executable path and arguments.
|
|
5
|
+
*
|
|
6
|
+
* Examples:
|
|
7
|
+
* - "bash" -> quotes as 'bash'
|
|
8
|
+
* - "/usr/bin/bash -c" -> quotes as '/usr/bin/bash' -c
|
|
9
|
+
* - "C:\Program Files\Git\bin\bash.exe -c" -> quotes as 'C:\Program Files\Git\bin\bash.exe' -c
|
|
10
|
+
*
|
|
11
|
+
* @param prefix The shell prefix string containing executable and optional arguments
|
|
12
|
+
* @param command The command to be executed
|
|
13
|
+
* @returns The properly formatted command string with quoted components
|
|
14
|
+
*/
|
|
15
|
+
export function formatShellPrefixCommand(
|
|
16
|
+
prefix: string,
|
|
17
|
+
command: string,
|
|
18
|
+
): string {
|
|
19
|
+
// Split on the last space before a dash to separate executable from arguments
|
|
20
|
+
const spaceBeforeDash = prefix.lastIndexOf(' -')
|
|
21
|
+
if (spaceBeforeDash > 0) {
|
|
22
|
+
const execPath = prefix.substring(0, spaceBeforeDash)
|
|
23
|
+
const args = prefix.substring(spaceBeforeDash + 1)
|
|
24
|
+
return `${quote([execPath])} ${args} ${quote([command])}`
|
|
25
|
+
} else {
|
|
26
|
+
return `${quote([prefix])} ${quote([command])}`
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe wrappers for shell-quote library functions that handle errors gracefully
|
|
3
|
+
* These are drop-in replacements for the original functions
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
type ParseEntry,
|
|
8
|
+
parse as shellQuoteParse,
|
|
9
|
+
quote as shellQuoteQuote,
|
|
10
|
+
} from 'shell-quote'
|
|
11
|
+
import { logError } from '../log.js'
|
|
12
|
+
import { jsonStringify } from '../slowOperations.js'
|
|
13
|
+
|
|
14
|
+
export type { ParseEntry } from 'shell-quote'
|
|
15
|
+
|
|
16
|
+
export type ShellParseResult =
|
|
17
|
+
| { success: true; tokens: ParseEntry[] }
|
|
18
|
+
| { success: false; error: string }
|
|
19
|
+
|
|
20
|
+
export type ShellQuoteResult =
|
|
21
|
+
| { success: true; quoted: string }
|
|
22
|
+
| { success: false; error: string }
|
|
23
|
+
|
|
24
|
+
export function tryParseShellCommand(
|
|
25
|
+
cmd: string,
|
|
26
|
+
env?:
|
|
27
|
+
| Record<string, string | undefined>
|
|
28
|
+
| ((key: string) => string | undefined),
|
|
29
|
+
): ShellParseResult {
|
|
30
|
+
try {
|
|
31
|
+
const tokens =
|
|
32
|
+
typeof env === 'function'
|
|
33
|
+
? shellQuoteParse(cmd, env)
|
|
34
|
+
: shellQuoteParse(cmd, env)
|
|
35
|
+
return { success: true, tokens }
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (error instanceof Error) {
|
|
38
|
+
logError(error)
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: error instanceof Error ? error.message : 'Unknown parse error',
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function tryQuoteShellArgs(args: unknown[]): ShellQuoteResult {
|
|
48
|
+
try {
|
|
49
|
+
const validated: string[] = args.map((arg, index) => {
|
|
50
|
+
if (arg === null || arg === undefined) {
|
|
51
|
+
return String(arg)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const type = typeof arg
|
|
55
|
+
|
|
56
|
+
if (type === 'string') {
|
|
57
|
+
return arg as string
|
|
58
|
+
}
|
|
59
|
+
if (type === 'number' || type === 'boolean') {
|
|
60
|
+
return String(arg)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (type === 'object') {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Cannot quote argument at index ${index}: object values are not supported`,
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
if (type === 'symbol') {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Cannot quote argument at index ${index}: symbol values are not supported`,
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
if (type === 'function') {
|
|
74
|
+
throw new Error(
|
|
75
|
+
`Cannot quote argument at index ${index}: function values are not supported`,
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Cannot quote argument at index ${index}: unsupported type ${type}`,
|
|
81
|
+
)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const quoted = shellQuoteQuote(validated)
|
|
85
|
+
return { success: true, quoted }
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (error instanceof Error) {
|
|
88
|
+
logError(error)
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
error: error instanceof Error ? error.message : 'Unknown quote error',
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Checks if parsed tokens contain malformed entries that suggest shell-quote
|
|
99
|
+
* misinterpreted the command. This happens when input contains ambiguous
|
|
100
|
+
* patterns (like JSON-like strings with semicolons) that shell-quote parses
|
|
101
|
+
* according to shell rules, producing token fragments.
|
|
102
|
+
*
|
|
103
|
+
* For example, `echo {"hi":"hi;evil"}` gets parsed with `;` as an operator,
|
|
104
|
+
* producing tokens like `{hi:"hi` (unbalanced brace). Legitimate commands
|
|
105
|
+
* produce complete, balanced tokens.
|
|
106
|
+
*
|
|
107
|
+
* Also detects unterminated quotes in the original command: shell-quote
|
|
108
|
+
* silently drops an unmatched `"` or `'` and parses the rest as unquoted,
|
|
109
|
+
* leaving no trace in the tokens. `echo "hi;evil | cat` (one unmatched `"`)
|
|
110
|
+
* is a bash syntax error, but shell-quote yields clean tokens with `;` as
|
|
111
|
+
* an operator. The token-level checks below can't catch this, so we walk
|
|
112
|
+
* the original command with bash quote semantics and flag odd parity.
|
|
113
|
+
*
|
|
114
|
+
* Security: This prevents command injection via HackerOne #3482049 where
|
|
115
|
+
* shell-quote's correct parsing of ambiguous input can be exploited.
|
|
116
|
+
*/
|
|
117
|
+
export function hasMalformedTokens(
|
|
118
|
+
command: string,
|
|
119
|
+
parsed: ParseEntry[],
|
|
120
|
+
): boolean {
|
|
121
|
+
// Check for unterminated quotes in the original command. shell-quote drops
|
|
122
|
+
// an unmatched quote without leaving any trace in the tokens, so this must
|
|
123
|
+
// inspect the raw string. Walk with bash semantics: backslash escapes the
|
|
124
|
+
// next char outside single-quotes; no escapes inside single-quotes.
|
|
125
|
+
let inSingle = false
|
|
126
|
+
let inDouble = false
|
|
127
|
+
let doubleCount = 0
|
|
128
|
+
let singleCount = 0
|
|
129
|
+
for (let i = 0; i < command.length; i++) {
|
|
130
|
+
const c = command[i]
|
|
131
|
+
if (c === '\\' && !inSingle) {
|
|
132
|
+
i++
|
|
133
|
+
continue
|
|
134
|
+
}
|
|
135
|
+
if (c === '"' && !inSingle) {
|
|
136
|
+
doubleCount++
|
|
137
|
+
inDouble = !inDouble
|
|
138
|
+
} else if (c === "'" && !inDouble) {
|
|
139
|
+
singleCount++
|
|
140
|
+
inSingle = !inSingle
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (doubleCount % 2 !== 0 || singleCount % 2 !== 0) return true
|
|
144
|
+
|
|
145
|
+
for (const entry of parsed) {
|
|
146
|
+
if (typeof entry !== 'string') continue
|
|
147
|
+
|
|
148
|
+
// Check for unbalanced curly braces
|
|
149
|
+
const openBraces = (entry.match(/{/g) || []).length
|
|
150
|
+
const closeBraces = (entry.match(/}/g) || []).length
|
|
151
|
+
if (openBraces !== closeBraces) return true
|
|
152
|
+
|
|
153
|
+
// Check for unbalanced parentheses
|
|
154
|
+
const openParens = (entry.match(/\(/g) || []).length
|
|
155
|
+
const closeParens = (entry.match(/\)/g) || []).length
|
|
156
|
+
if (openParens !== closeParens) return true
|
|
157
|
+
|
|
158
|
+
// Check for unbalanced square brackets
|
|
159
|
+
const openBrackets = (entry.match(/\[/g) || []).length
|
|
160
|
+
const closeBrackets = (entry.match(/\]/g) || []).length
|
|
161
|
+
if (openBrackets !== closeBrackets) return true
|
|
162
|
+
|
|
163
|
+
// Check for unbalanced double quotes
|
|
164
|
+
// Count quotes that aren't escaped (preceded by backslash)
|
|
165
|
+
// A token with an odd number of unescaped quotes is malformed
|
|
166
|
+
// eslint-disable-next-line custom-rules/no-lookbehind-regex -- gated by hasCommandSeparator check at caller, runs on short per-token strings
|
|
167
|
+
const doubleQuotes = entry.match(/(?<!\\)"/g) || []
|
|
168
|
+
if (doubleQuotes.length % 2 !== 0) return true
|
|
169
|
+
|
|
170
|
+
// Check for unbalanced single quotes
|
|
171
|
+
// eslint-disable-next-line custom-rules/no-lookbehind-regex -- same as above
|
|
172
|
+
const singleQuotes = entry.match(/(?<!\\)'/g) || []
|
|
173
|
+
if (singleQuotes.length % 2 !== 0) return true
|
|
174
|
+
}
|
|
175
|
+
return false
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Detects commands containing '\' patterns that exploit the shell-quote library's
|
|
180
|
+
* incorrect handling of backslashes inside single quotes.
|
|
181
|
+
*
|
|
182
|
+
* In bash, single quotes preserve ALL characters literally - backslash has no
|
|
183
|
+
* special meaning. So '\' is just the string \ (the quote opens, contains \,
|
|
184
|
+
* and the next ' closes it). But shell-quote incorrectly treats \ as an escape
|
|
185
|
+
* character inside single quotes, causing '\' to NOT close the quoted string.
|
|
186
|
+
*
|
|
187
|
+
* This means the pattern '\' <payload> '\' hides <payload> from security checks
|
|
188
|
+
* because shell-quote thinks it's all one single-quoted string.
|
|
189
|
+
*/
|
|
190
|
+
export function hasShellQuoteSingleQuoteBug(command: string): boolean {
|
|
191
|
+
// Walk the command with correct bash single-quote semantics
|
|
192
|
+
let inSingleQuote = false
|
|
193
|
+
let inDoubleQuote = false
|
|
194
|
+
|
|
195
|
+
for (let i = 0; i < command.length; i++) {
|
|
196
|
+
const char = command[i]
|
|
197
|
+
|
|
198
|
+
// Handle backslash escaping outside of single quotes
|
|
199
|
+
if (char === '\\' && !inSingleQuote) {
|
|
200
|
+
// Skip the next character (it's escaped)
|
|
201
|
+
i++
|
|
202
|
+
continue
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (char === '"' && !inSingleQuote) {
|
|
206
|
+
inDoubleQuote = !inDoubleQuote
|
|
207
|
+
continue
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (char === "'" && !inDoubleQuote) {
|
|
211
|
+
inSingleQuote = !inSingleQuote
|
|
212
|
+
|
|
213
|
+
// Check if we just closed a single quote and the content ends with
|
|
214
|
+
// trailing backslashes. shell-quote's chunker regex '((\\'|[^'])*?)'
|
|
215
|
+
// incorrectly treats \' as an escape sequence inside single quotes,
|
|
216
|
+
// while bash treats backslash as literal. This creates a differential
|
|
217
|
+
// where shell-quote merges tokens that bash treats as separate.
|
|
218
|
+
//
|
|
219
|
+
// Odd trailing \'s = always a bug:
|
|
220
|
+
// '\' -> shell-quote: \' = literal ', still open. bash: \, closed.
|
|
221
|
+
// 'abc\' -> shell-quote: abc then \' = literal ', still open. bash: abc\, closed.
|
|
222
|
+
// '\\\' -> shell-quote: \\ + \', still open. bash: \\\, closed.
|
|
223
|
+
//
|
|
224
|
+
// Even trailing \'s = bug ONLY when a later ' exists in the command:
|
|
225
|
+
// '\\' alone -> shell-quote backtracks, both parsers agree string closes. OK.
|
|
226
|
+
// '\\' 'next' -> shell-quote: \' consumes the closing ', finds next ' as
|
|
227
|
+
// false close, merges tokens. bash: two separate tokens.
|
|
228
|
+
//
|
|
229
|
+
// Detail: the regex alternation tries \' before [^']. For '\\', it matches
|
|
230
|
+
// the first \ via [^'] (next char is \, not '), then the second \ via \'
|
|
231
|
+
// (next char IS '). This consumes the closing '. The regex continues reading
|
|
232
|
+
// until it finds another ' to close the match. If none exists, it backtracks
|
|
233
|
+
// to [^'] for the second \ and closes correctly. If a later ' exists (e.g.,
|
|
234
|
+
// the opener of the next single-quoted arg), no backtracking occurs and
|
|
235
|
+
// tokens merge. See H1 report: git ls-remote 'safe\\' '--upload-pack=evil' 'repo'
|
|
236
|
+
// shell-quote: ["git","ls-remote","safe\\\\ --upload-pack=evil repo"]
|
|
237
|
+
// bash: ["git","ls-remote","safe\\\\","--upload-pack=evil","repo"]
|
|
238
|
+
if (!inSingleQuote) {
|
|
239
|
+
let backslashCount = 0
|
|
240
|
+
let j = i - 1
|
|
241
|
+
while (j >= 0 && command[j] === '\\') {
|
|
242
|
+
backslashCount++
|
|
243
|
+
j--
|
|
244
|
+
}
|
|
245
|
+
if (backslashCount > 0 && backslashCount % 2 === 1) {
|
|
246
|
+
return true
|
|
247
|
+
}
|
|
248
|
+
// Even trailing backslashes: only a bug when a later ' exists that
|
|
249
|
+
// the chunker regex can use as a false closing quote. We check for
|
|
250
|
+
// ANY later ' because the regex doesn't respect bash quote state
|
|
251
|
+
// (e.g., a ' inside double quotes is also consumable).
|
|
252
|
+
if (
|
|
253
|
+
backslashCount > 0 &&
|
|
254
|
+
backslashCount % 2 === 0 &&
|
|
255
|
+
command.indexOf("'", i + 1) !== -1
|
|
256
|
+
) {
|
|
257
|
+
return true
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
continue
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return false
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function quote(args: ReadonlyArray<unknown>): string {
|
|
268
|
+
// First try the strict validation
|
|
269
|
+
const result = tryQuoteShellArgs([...args])
|
|
270
|
+
|
|
271
|
+
if (result.success) {
|
|
272
|
+
return result.quoted
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// If strict validation failed, use lenient fallback
|
|
276
|
+
// This handles objects, symbols, functions, etc. by converting them to strings
|
|
277
|
+
try {
|
|
278
|
+
const stringArgs = args.map(arg => {
|
|
279
|
+
if (arg === null || arg === undefined) {
|
|
280
|
+
return String(arg)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const type = typeof arg
|
|
284
|
+
|
|
285
|
+
if (type === 'string' || type === 'number' || type === 'boolean') {
|
|
286
|
+
return String(arg)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// For unsupported types, use JSON.stringify as a safe fallback
|
|
290
|
+
// This ensures we don't crash but still get a meaningful representation
|
|
291
|
+
return jsonStringify(arg)
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
return shellQuoteQuote(stringArgs)
|
|
295
|
+
} catch (error) {
|
|
296
|
+
// SECURITY: Never use JSON.stringify as a fallback for shell quoting.
|
|
297
|
+
// JSON.stringify uses double quotes which don't prevent shell command execution.
|
|
298
|
+
// For example, jsonStringify(['echo', '$(whoami)']) produces "echo" "$(whoami)"
|
|
299
|
+
if (error instanceof Error) {
|
|
300
|
+
logError(error)
|
|
301
|
+
}
|
|
302
|
+
throw new Error('Failed to quote shell arguments safely')
|
|
303
|
+
}
|
|
304
|
+
}
|