@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,339 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto'
|
|
2
|
+
import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js'
|
|
3
|
+
import { query } from '../../query.js'
|
|
4
|
+
import { logEvent } from '../../services/analytics/index.js'
|
|
5
|
+
import type { AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS } from '../../services/analytics/metadata.js'
|
|
6
|
+
import type { ToolUseContext } from '../../Tool.js'
|
|
7
|
+
import { type Tool, toolMatchesName } from '../../Tool.js'
|
|
8
|
+
import { SYNTHETIC_OUTPUT_TOOL_NAME } from '../../tools/SyntheticOutputTool/SyntheticOutputTool.js'
|
|
9
|
+
import { ALL_AGENT_DISALLOWED_TOOLS } from '../../tools.js'
|
|
10
|
+
import { asAgentId } from '../../types/ids.js'
|
|
11
|
+
import type { Message } from '../../types/message.js'
|
|
12
|
+
import { createAbortController } from '../abortController.js'
|
|
13
|
+
import { createAttachmentMessage } from '../attachments.js'
|
|
14
|
+
import { createCombinedAbortSignal } from '../combinedAbortSignal.js'
|
|
15
|
+
import { logForDebugging } from '../debug.js'
|
|
16
|
+
import { errorMessage } from '../errors.js'
|
|
17
|
+
import type { HookResult } from '../hooks.js'
|
|
18
|
+
import { createUserMessage, handleMessageFromStream } from '../messages.js'
|
|
19
|
+
import { getSmallFastModel } from '../model/model.js'
|
|
20
|
+
import { hasPermissionsToUseTool } from '../permissions/permissions.js'
|
|
21
|
+
import { getAgentTranscriptPath, getTranscriptPath } from '../sessionStorage.js'
|
|
22
|
+
import type { AgentHook } from '../settings/types.js'
|
|
23
|
+
import { jsonStringify } from '../slowOperations.js'
|
|
24
|
+
import { asSystemPrompt } from '../systemPromptType.js'
|
|
25
|
+
import {
|
|
26
|
+
addArgumentsToPrompt,
|
|
27
|
+
createStructuredOutputTool,
|
|
28
|
+
hookResponseSchema,
|
|
29
|
+
registerStructuredOutputEnforcement,
|
|
30
|
+
} from './hookHelpers.js'
|
|
31
|
+
import { clearSessionHooks } from './sessionHooks.js'
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Execute an agent-based hook using a multi-turn LLM query
|
|
35
|
+
*/
|
|
36
|
+
export async function execAgentHook(
|
|
37
|
+
hook: AgentHook,
|
|
38
|
+
hookName: string,
|
|
39
|
+
hookEvent: HookEvent,
|
|
40
|
+
jsonInput: string,
|
|
41
|
+
signal: AbortSignal,
|
|
42
|
+
toolUseContext: ToolUseContext,
|
|
43
|
+
toolUseID: string | undefined,
|
|
44
|
+
// Kept for signature stability with the other exec*Hook functions.
|
|
45
|
+
// Was used by hook.prompt(messages) before the .transform() was removed
|
|
46
|
+
// (CC-79) — the only consumer of that was ExitPlanModeV2Tool's
|
|
47
|
+
// programmatic construction, since refactored into VerifyPlanExecutionTool.
|
|
48
|
+
_messages: Message[],
|
|
49
|
+
agentName?: string,
|
|
50
|
+
): Promise<HookResult> {
|
|
51
|
+
const effectiveToolUseID = toolUseID || `hook-${randomUUID()}`
|
|
52
|
+
|
|
53
|
+
// Get transcript path from context
|
|
54
|
+
const transcriptPath = toolUseContext.agentId
|
|
55
|
+
? getAgentTranscriptPath(toolUseContext.agentId)
|
|
56
|
+
: getTranscriptPath()
|
|
57
|
+
const hookStartTime = Date.now()
|
|
58
|
+
try {
|
|
59
|
+
// Replace $ARGUMENTS with the JSON input
|
|
60
|
+
const processedPrompt = addArgumentsToPrompt(hook.prompt, jsonInput)
|
|
61
|
+
logForDebugging(
|
|
62
|
+
`Hooks: Processing agent hook with prompt: ${processedPrompt}`,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
// Create user message directly - no need for processUserInput which would
|
|
66
|
+
// trigger UserPromptSubmit hooks and cause infinite recursion
|
|
67
|
+
const userMessage = createUserMessage({ content: processedPrompt })
|
|
68
|
+
const agentMessages = [userMessage]
|
|
69
|
+
|
|
70
|
+
logForDebugging(
|
|
71
|
+
`Hooks: Starting agent query with ${agentMessages.length} messages`,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
// Setup timeout and combine with parent signal
|
|
75
|
+
const hookTimeoutMs = hook.timeout ? hook.timeout * 1000 : 60000
|
|
76
|
+
const hookAbortController = createAbortController()
|
|
77
|
+
|
|
78
|
+
// Combine parent signal with timeout, and have it abort our controller
|
|
79
|
+
const { signal: parentTimeoutSignal, cleanup: cleanupCombinedSignal } =
|
|
80
|
+
createCombinedAbortSignal(signal, { timeoutMs: hookTimeoutMs })
|
|
81
|
+
const onParentTimeout = () => hookAbortController.abort()
|
|
82
|
+
parentTimeoutSignal.addEventListener('abort', onParentTimeout)
|
|
83
|
+
|
|
84
|
+
// Combined signal is just our controller's signal now
|
|
85
|
+
const combinedSignal = hookAbortController.signal
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
// Create StructuredOutput tool with our schema
|
|
89
|
+
const structuredOutputTool = createStructuredOutputTool()
|
|
90
|
+
|
|
91
|
+
// Filter out any existing StructuredOutput tool to avoid duplicates with different schemas
|
|
92
|
+
// (e.g., when parent context has a StructuredOutput tool from --json-schema flag)
|
|
93
|
+
const filteredTools = toolUseContext.options.tools.filter(
|
|
94
|
+
tool => !toolMatchesName(tool, SYNTHETIC_OUTPUT_TOOL_NAME),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
// Use all available tools plus our structured output tool
|
|
98
|
+
// Filter out disallowed agent tools to prevent stop hook agents from spawning subagents
|
|
99
|
+
// or entering plan mode, and filter out duplicate StructuredOutput tools
|
|
100
|
+
const tools: Tool[] = [
|
|
101
|
+
...filteredTools.filter(
|
|
102
|
+
tool => !ALL_AGENT_DISALLOWED_TOOLS.has(tool.name),
|
|
103
|
+
),
|
|
104
|
+
structuredOutputTool,
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
const systemPrompt = asSystemPrompt([
|
|
108
|
+
`You are verifying a stop condition in Claude Code. Your task is to verify that the agent completed the given plan. The conversation transcript is available at: ${transcriptPath}\nYou can read this file to analyze the conversation history if needed.
|
|
109
|
+
|
|
110
|
+
Use the available tools to inspect the codebase and verify the condition.
|
|
111
|
+
Use as few steps as possible - be efficient and direct.
|
|
112
|
+
|
|
113
|
+
When done, return your result using the ${SYNTHETIC_OUTPUT_TOOL_NAME} tool with:
|
|
114
|
+
- ok: true if the condition is met
|
|
115
|
+
- ok: false with reason if the condition is not met`,
|
|
116
|
+
])
|
|
117
|
+
|
|
118
|
+
const model = hook.model ?? getSmallFastModel()
|
|
119
|
+
const MAX_AGENT_TURNS = 50
|
|
120
|
+
|
|
121
|
+
// Create unique agentId for this hook agent
|
|
122
|
+
const hookAgentId = asAgentId(`hook-agent-${randomUUID()}`)
|
|
123
|
+
|
|
124
|
+
// Create a modified toolUseContext for the agent
|
|
125
|
+
const agentToolUseContext: ToolUseContext = {
|
|
126
|
+
...toolUseContext,
|
|
127
|
+
agentId: hookAgentId,
|
|
128
|
+
abortController: hookAbortController,
|
|
129
|
+
options: {
|
|
130
|
+
...toolUseContext.options,
|
|
131
|
+
tools,
|
|
132
|
+
mainLoopModel: model,
|
|
133
|
+
isNonInteractiveSession: true,
|
|
134
|
+
thinkingConfig: { type: 'disabled' as const },
|
|
135
|
+
},
|
|
136
|
+
setInProgressToolUseIDs: () => {},
|
|
137
|
+
getAppState() {
|
|
138
|
+
const appState = toolUseContext.getAppState()
|
|
139
|
+
// Add session rule to allow reading transcript file
|
|
140
|
+
const existingSessionRules =
|
|
141
|
+
appState.toolPermissionContext.alwaysAllowRules.session ?? []
|
|
142
|
+
return {
|
|
143
|
+
...appState,
|
|
144
|
+
toolPermissionContext: {
|
|
145
|
+
...appState.toolPermissionContext,
|
|
146
|
+
mode: 'dontAsk' as const,
|
|
147
|
+
alwaysAllowRules: {
|
|
148
|
+
...appState.toolPermissionContext.alwaysAllowRules,
|
|
149
|
+
session: [...existingSessionRules, `Read(/${transcriptPath})`],
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Register a session-level stop hook to enforce structured output
|
|
157
|
+
registerStructuredOutputEnforcement(
|
|
158
|
+
toolUseContext.setAppState,
|
|
159
|
+
hookAgentId,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
let structuredOutputResult: { ok: boolean; reason?: string } | null = null
|
|
163
|
+
let turnCount = 0
|
|
164
|
+
let hitMaxTurns = false
|
|
165
|
+
|
|
166
|
+
// Use query() for multi-turn execution
|
|
167
|
+
for await (const message of query({
|
|
168
|
+
messages: agentMessages,
|
|
169
|
+
systemPrompt,
|
|
170
|
+
userContext: {},
|
|
171
|
+
systemContext: {},
|
|
172
|
+
canUseTool: hasPermissionsToUseTool,
|
|
173
|
+
toolUseContext: agentToolUseContext,
|
|
174
|
+
querySource: 'hook_agent',
|
|
175
|
+
})) {
|
|
176
|
+
// Process stream events to update response length in the spinner
|
|
177
|
+
handleMessageFromStream(
|
|
178
|
+
message,
|
|
179
|
+
() => {}, // onMessage - we handle messages below
|
|
180
|
+
newContent =>
|
|
181
|
+
toolUseContext.setResponseLength(
|
|
182
|
+
length => length + newContent.length,
|
|
183
|
+
),
|
|
184
|
+
toolUseContext.setStreamMode ?? (() => {}),
|
|
185
|
+
() => {}, // onStreamingToolUses - not needed for hooks
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
// Skip streaming events for further processing
|
|
189
|
+
if (
|
|
190
|
+
message.type === 'stream_event' ||
|
|
191
|
+
message.type === 'stream_request_start'
|
|
192
|
+
) {
|
|
193
|
+
continue
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Count assistant turns
|
|
197
|
+
if (message.type === 'assistant') {
|
|
198
|
+
turnCount++
|
|
199
|
+
|
|
200
|
+
// Check if we've hit the turn limit
|
|
201
|
+
if (turnCount >= MAX_AGENT_TURNS) {
|
|
202
|
+
hitMaxTurns = true
|
|
203
|
+
logForDebugging(
|
|
204
|
+
`Hooks: Agent turn ${turnCount} hit max turns, aborting`,
|
|
205
|
+
)
|
|
206
|
+
hookAbortController.abort()
|
|
207
|
+
break
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Check for structured output in attachments
|
|
212
|
+
if (
|
|
213
|
+
message.type === 'attachment' &&
|
|
214
|
+
message.attachment.type === 'structured_output'
|
|
215
|
+
) {
|
|
216
|
+
const parsed = hookResponseSchema().safeParse(message.attachment.data)
|
|
217
|
+
if (parsed.success) {
|
|
218
|
+
structuredOutputResult = parsed.data
|
|
219
|
+
logForDebugging(
|
|
220
|
+
`Hooks: Got structured output: ${jsonStringify(structuredOutputResult)}`,
|
|
221
|
+
)
|
|
222
|
+
// Got structured output, abort and exit
|
|
223
|
+
hookAbortController.abort()
|
|
224
|
+
break
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
parentTimeoutSignal.removeEventListener('abort', onParentTimeout)
|
|
230
|
+
cleanupCombinedSignal()
|
|
231
|
+
|
|
232
|
+
// Clean up the session hook we registered for this agent
|
|
233
|
+
clearSessionHooks(toolUseContext.setAppState, hookAgentId)
|
|
234
|
+
|
|
235
|
+
// Check if we got a result
|
|
236
|
+
if (!structuredOutputResult) {
|
|
237
|
+
// If we hit max turns, just log and return cancelled (no UI message)
|
|
238
|
+
if (hitMaxTurns) {
|
|
239
|
+
logForDebugging(
|
|
240
|
+
`Hooks: Agent hook did not complete within ${MAX_AGENT_TURNS} turns`,
|
|
241
|
+
)
|
|
242
|
+
logEvent('tengu_agent_stop_hook_max_turns', {
|
|
243
|
+
durationMs: Date.now() - hookStartTime,
|
|
244
|
+
turnCount,
|
|
245
|
+
agentName:
|
|
246
|
+
agentName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
247
|
+
})
|
|
248
|
+
return {
|
|
249
|
+
hook,
|
|
250
|
+
outcome: 'cancelled',
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// For other cases (e.g., agent finished without calling structured output tool),
|
|
255
|
+
// just log and return cancelled (don't show error to user)
|
|
256
|
+
logForDebugging(`Hooks: Agent hook did not return structured output`)
|
|
257
|
+
logEvent('tengu_agent_stop_hook_error', {
|
|
258
|
+
durationMs: Date.now() - hookStartTime,
|
|
259
|
+
turnCount,
|
|
260
|
+
errorType: 1, // 1 = no structured output
|
|
261
|
+
agentName:
|
|
262
|
+
agentName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
263
|
+
})
|
|
264
|
+
return {
|
|
265
|
+
hook,
|
|
266
|
+
outcome: 'cancelled',
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Return result based on structured output
|
|
271
|
+
if (!structuredOutputResult.ok) {
|
|
272
|
+
logForDebugging(
|
|
273
|
+
`Hooks: Agent hook condition was not met: ${structuredOutputResult.reason}`,
|
|
274
|
+
)
|
|
275
|
+
return {
|
|
276
|
+
hook,
|
|
277
|
+
outcome: 'blocking',
|
|
278
|
+
blockingError: {
|
|
279
|
+
blockingError: `Agent hook condition was not met: ${structuredOutputResult.reason}`,
|
|
280
|
+
command: hook.prompt,
|
|
281
|
+
},
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Condition was met
|
|
286
|
+
logForDebugging(`Hooks: Agent hook condition was met`)
|
|
287
|
+
logEvent('tengu_agent_stop_hook_success', {
|
|
288
|
+
durationMs: Date.now() - hookStartTime,
|
|
289
|
+
turnCount,
|
|
290
|
+
agentName:
|
|
291
|
+
agentName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
292
|
+
})
|
|
293
|
+
return {
|
|
294
|
+
hook,
|
|
295
|
+
outcome: 'success',
|
|
296
|
+
message: createAttachmentMessage({
|
|
297
|
+
type: 'hook_success',
|
|
298
|
+
hookName,
|
|
299
|
+
toolUseID: effectiveToolUseID,
|
|
300
|
+
hookEvent,
|
|
301
|
+
content: '',
|
|
302
|
+
}),
|
|
303
|
+
}
|
|
304
|
+
} catch (error) {
|
|
305
|
+
parentTimeoutSignal.removeEventListener('abort', onParentTimeout)
|
|
306
|
+
cleanupCombinedSignal()
|
|
307
|
+
|
|
308
|
+
if (combinedSignal.aborted) {
|
|
309
|
+
return {
|
|
310
|
+
hook,
|
|
311
|
+
outcome: 'cancelled',
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
throw error
|
|
315
|
+
}
|
|
316
|
+
} catch (error) {
|
|
317
|
+
const errorMsg = errorMessage(error)
|
|
318
|
+
logForDebugging(`Hooks: Agent hook error: ${errorMsg}`)
|
|
319
|
+
logEvent('tengu_agent_stop_hook_error', {
|
|
320
|
+
durationMs: Date.now() - hookStartTime,
|
|
321
|
+
errorType: 2, // 2 = general error
|
|
322
|
+
agentName:
|
|
323
|
+
agentName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
324
|
+
})
|
|
325
|
+
return {
|
|
326
|
+
hook,
|
|
327
|
+
outcome: 'non_blocking_error',
|
|
328
|
+
message: createAttachmentMessage({
|
|
329
|
+
type: 'hook_non_blocking_error',
|
|
330
|
+
hookName,
|
|
331
|
+
toolUseID: effectiveToolUseID,
|
|
332
|
+
hookEvent,
|
|
333
|
+
stderr: `Error executing agent hook: ${errorMsg}`,
|
|
334
|
+
stdout: '',
|
|
335
|
+
exitCode: 1,
|
|
336
|
+
}),
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import axios from 'src/utils/axios.js'
|
|
2
|
+
import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js'
|
|
3
|
+
import { createCombinedAbortSignal } from '../combinedAbortSignal.js'
|
|
4
|
+
import { logForDebugging } from '../debug.js'
|
|
5
|
+
import { errorMessage } from '../errors.js'
|
|
6
|
+
import { getProxyUrl, shouldBypassProxy } from '../proxy.js'
|
|
7
|
+
// Import as namespace so spyOn works in tests (direct imports bypass spies)
|
|
8
|
+
import * as settingsModule from '../settings/settings.js'
|
|
9
|
+
import type { HttpHook } from '../settings/types.js'
|
|
10
|
+
import { ssrfGuardedLookup } from './ssrfGuard.js'
|
|
11
|
+
|
|
12
|
+
const DEFAULT_HTTP_HOOK_TIMEOUT_MS = 10 * 60 * 1000 // 10 minutes (matches TOOL_HOOK_EXECUTION_TIMEOUT_MS)
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get the sandbox proxy config for routing HTTP hook requests through the
|
|
16
|
+
* sandbox network proxy when sandboxing is enabled.
|
|
17
|
+
*
|
|
18
|
+
* Uses dynamic import to avoid a static import cycle
|
|
19
|
+
* (sandbox-adapter -> settings -> ... -> hooks -> execHttpHook).
|
|
20
|
+
*/
|
|
21
|
+
async function getSandboxProxyConfig(): Promise<
|
|
22
|
+
{ host: string; port: number; protocol: string } | undefined
|
|
23
|
+
> {
|
|
24
|
+
const { SandboxManager } = await import('../sandbox/sandbox-adapter.js')
|
|
25
|
+
|
|
26
|
+
if (!SandboxManager.isSandboxingEnabled()) {
|
|
27
|
+
return undefined
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Wait for the sandbox network proxy to finish initializing. In REPL mode,
|
|
31
|
+
// SandboxManager.initialize() is fire-and-forget so the proxy may not be
|
|
32
|
+
// ready yet when the first hook fires.
|
|
33
|
+
await SandboxManager.waitForNetworkInitialization()
|
|
34
|
+
|
|
35
|
+
const proxyPort = SandboxManager.getProxyPort()
|
|
36
|
+
if (!proxyPort) {
|
|
37
|
+
return undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { host: '127.0.0.1', port: proxyPort, protocol: 'http' }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Read HTTP hook allowlist restrictions from merged settings (all sources).
|
|
45
|
+
* Follows the allowedMcpServers precedent: arrays concatenate across sources.
|
|
46
|
+
* When allowManagedHooksOnly is set in managed settings, only admin-defined
|
|
47
|
+
* hooks run anyway, so no separate lock-down boolean is needed here.
|
|
48
|
+
*/
|
|
49
|
+
function getHttpHookPolicy(): {
|
|
50
|
+
allowedUrls: string[] | undefined
|
|
51
|
+
allowedEnvVars: string[] | undefined
|
|
52
|
+
} {
|
|
53
|
+
const settings = settingsModule.getInitialSettings()
|
|
54
|
+
return {
|
|
55
|
+
allowedUrls: settings.allowedHttpHookUrls,
|
|
56
|
+
allowedEnvVars: settings.httpHookAllowedEnvVars,
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Match a URL against a pattern with * as a wildcard (any characters).
|
|
62
|
+
* Same semantics as the MCP server allowlist patterns.
|
|
63
|
+
*/
|
|
64
|
+
function urlMatchesPattern(url: string, pattern: string): boolean {
|
|
65
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
66
|
+
const regexStr = escaped.replace(/\*/g, '.*')
|
|
67
|
+
return new RegExp(`^${regexStr}$`).test(url)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Strip CR, LF, and NUL bytes from a header value to prevent HTTP header
|
|
72
|
+
* injection (CRLF injection) via env var values or hook-configured header
|
|
73
|
+
* templates. A malicious env var like "token\r\nX-Evil: 1" would otherwise
|
|
74
|
+
* inject a second header into the request.
|
|
75
|
+
*/
|
|
76
|
+
function sanitizeHeaderValue(value: string): string {
|
|
77
|
+
// eslint-disable-next-line no-control-regex
|
|
78
|
+
return value.replace(/[\r\n\x00]/g, '')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Interpolate $VAR_NAME and ${VAR_NAME} patterns in a string using process.env,
|
|
83
|
+
* but only for variable names present in the allowlist. References to variables
|
|
84
|
+
* not in the allowlist are replaced with empty strings to prevent exfiltration
|
|
85
|
+
* of secrets via project-configured HTTP hooks.
|
|
86
|
+
*
|
|
87
|
+
* The result is sanitized to strip CR/LF/NUL bytes to prevent header injection.
|
|
88
|
+
*/
|
|
89
|
+
function interpolateEnvVars(
|
|
90
|
+
value: string,
|
|
91
|
+
allowedEnvVars: ReadonlySet<string>,
|
|
92
|
+
): string {
|
|
93
|
+
const interpolated = value.replace(
|
|
94
|
+
/\$\{([A-Z_][A-Z0-9_]*)\}|\$([A-Z_][A-Z0-9_]*)/g,
|
|
95
|
+
(_, braced, unbraced) => {
|
|
96
|
+
const varName = braced ?? unbraced
|
|
97
|
+
if (!allowedEnvVars.has(varName)) {
|
|
98
|
+
logForDebugging(
|
|
99
|
+
`Hooks: env var $${varName} not in allowedEnvVars, skipping interpolation`,
|
|
100
|
+
{ level: 'warn' },
|
|
101
|
+
)
|
|
102
|
+
return ''
|
|
103
|
+
}
|
|
104
|
+
return process.env[varName] ?? ''
|
|
105
|
+
},
|
|
106
|
+
)
|
|
107
|
+
return sanitizeHeaderValue(interpolated)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Execute an HTTP hook by POSTing the hook input JSON to the configured URL.
|
|
112
|
+
* Returns the raw response for the caller to interpret.
|
|
113
|
+
*
|
|
114
|
+
* When sandboxing is enabled, requests are routed through the sandbox network
|
|
115
|
+
* proxy which enforces the domain allowlist. The proxy returns HTTP 403 for
|
|
116
|
+
* blocked domains.
|
|
117
|
+
*
|
|
118
|
+
* Header values support $VAR_NAME and ${VAR_NAME} env var interpolation so that
|
|
119
|
+
* secrets (e.g. "Authorization: Bearer $MY_TOKEN") are not stored in settings.json.
|
|
120
|
+
* Only env vars explicitly listed in the hook's `allowedEnvVars` array are resolved;
|
|
121
|
+
* all other references are replaced with empty strings.
|
|
122
|
+
*/
|
|
123
|
+
export async function execHttpHook(
|
|
124
|
+
hook: HttpHook,
|
|
125
|
+
_hookEvent: HookEvent,
|
|
126
|
+
jsonInput: string,
|
|
127
|
+
signal?: AbortSignal,
|
|
128
|
+
): Promise<{
|
|
129
|
+
ok: boolean
|
|
130
|
+
statusCode?: number
|
|
131
|
+
body: string
|
|
132
|
+
error?: string
|
|
133
|
+
aborted?: boolean
|
|
134
|
+
}> {
|
|
135
|
+
// Enforce URL allowlist before any I/O. Follows allowedMcpServers semantics:
|
|
136
|
+
// undefined → no restriction; [] → block all; non-empty → must match a pattern.
|
|
137
|
+
const policy = getHttpHookPolicy()
|
|
138
|
+
if (policy.allowedUrls !== undefined) {
|
|
139
|
+
const matched = policy.allowedUrls.some(p => urlMatchesPattern(hook.url, p))
|
|
140
|
+
if (!matched) {
|
|
141
|
+
const msg = `HTTP hook blocked: ${hook.url} does not match any pattern in allowedHttpHookUrls`
|
|
142
|
+
logForDebugging(msg, { level: 'warn' })
|
|
143
|
+
return { ok: false, body: '', error: msg }
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const timeoutMs = hook.timeout
|
|
148
|
+
? hook.timeout * 1000
|
|
149
|
+
: DEFAULT_HTTP_HOOK_TIMEOUT_MS
|
|
150
|
+
|
|
151
|
+
const { signal: combinedSignal, cleanup } = createCombinedAbortSignal(
|
|
152
|
+
signal,
|
|
153
|
+
{ timeoutMs },
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
// Build headers with env var interpolation in values
|
|
158
|
+
const headers: Record<string, string> = {
|
|
159
|
+
'Content-Type': 'application/json',
|
|
160
|
+
}
|
|
161
|
+
if (hook.headers) {
|
|
162
|
+
// Intersect hook's allowedEnvVars with policy allowlist when policy is set
|
|
163
|
+
const hookVars = hook.allowedEnvVars ?? []
|
|
164
|
+
const effectiveVars =
|
|
165
|
+
policy.allowedEnvVars !== undefined
|
|
166
|
+
? hookVars.filter(v => policy.allowedEnvVars!.includes(v))
|
|
167
|
+
: hookVars
|
|
168
|
+
const allowedEnvVars = new Set(effectiveVars)
|
|
169
|
+
for (const [name, value] of Object.entries(hook.headers)) {
|
|
170
|
+
headers[name] = interpolateEnvVars(value, allowedEnvVars)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Route through sandbox network proxy when available. The proxy enforces
|
|
175
|
+
// the domain allowlist and returns 403 for blocked domains.
|
|
176
|
+
const sandboxProxy = await getSandboxProxyConfig()
|
|
177
|
+
|
|
178
|
+
// Detect env var proxy (HTTP_PROXY / HTTPS_PROXY, respecting NO_PROXY).
|
|
179
|
+
// When set, configureGlobalAgents() has already installed a request
|
|
180
|
+
// interceptor that sets httpsAgent to an HttpsProxyAgent — the proxy
|
|
181
|
+
// handles DNS for the target. Skip the SSRF guard in that case, same
|
|
182
|
+
// as we do for the sandbox proxy, so that we don't accidentally block
|
|
183
|
+
// a corporate proxy sitting on a private IP (e.g. 10.0.0.1:3128).
|
|
184
|
+
const envProxyActive =
|
|
185
|
+
!sandboxProxy &&
|
|
186
|
+
getProxyUrl() !== undefined &&
|
|
187
|
+
!shouldBypassProxy(hook.url)
|
|
188
|
+
|
|
189
|
+
if (sandboxProxy) {
|
|
190
|
+
logForDebugging(
|
|
191
|
+
`Hooks: HTTP hook POST to ${hook.url} (via sandbox proxy :${sandboxProxy.port})`,
|
|
192
|
+
)
|
|
193
|
+
} else if (envProxyActive) {
|
|
194
|
+
logForDebugging(
|
|
195
|
+
`Hooks: HTTP hook POST to ${hook.url} (via env-var proxy)`,
|
|
196
|
+
)
|
|
197
|
+
} else {
|
|
198
|
+
logForDebugging(`Hooks: HTTP hook POST to ${hook.url}`)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const response = await axios.post<string>(hook.url, jsonInput, {
|
|
202
|
+
headers,
|
|
203
|
+
signal: combinedSignal,
|
|
204
|
+
responseType: 'text',
|
|
205
|
+
validateStatus: () => true,
|
|
206
|
+
maxRedirects: 0,
|
|
207
|
+
// Explicit false prevents axios's own env-var proxy detection; when an
|
|
208
|
+
// env-var proxy is configured, the global axios interceptor installed
|
|
209
|
+
// by configureGlobalAgents() handles it via httpsAgent instead.
|
|
210
|
+
proxy: sandboxProxy ?? false,
|
|
211
|
+
// SSRF guard: validate resolved IPs, block private/link-local ranges
|
|
212
|
+
// (but allow loopback for local dev). Skipped when any proxy is in
|
|
213
|
+
// use — the proxy performs DNS for the target, and applying the
|
|
214
|
+
// guard would instead validate the proxy's own IP, breaking
|
|
215
|
+
// connections to corporate proxies on private networks.
|
|
216
|
+
lookup: sandboxProxy || envProxyActive ? undefined : ssrfGuardedLookup,
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
cleanup()
|
|
220
|
+
|
|
221
|
+
const body = response.data ?? ''
|
|
222
|
+
logForDebugging(
|
|
223
|
+
`Hooks: HTTP hook response status ${response.status}, body length ${body.length}`,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
return {
|
|
227
|
+
ok: response.status >= 200 && response.status < 300,
|
|
228
|
+
statusCode: response.status,
|
|
229
|
+
body,
|
|
230
|
+
}
|
|
231
|
+
} catch (error) {
|
|
232
|
+
cleanup()
|
|
233
|
+
|
|
234
|
+
if (combinedSignal.aborted) {
|
|
235
|
+
return { ok: false, body: '', aborted: true }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const errorMsg = errorMessage(error)
|
|
239
|
+
logForDebugging(`Hooks: HTTP hook error: ${errorMsg}`, { level: 'error' })
|
|
240
|
+
return { ok: false, body: '', error: errorMsg }
|
|
241
|
+
}
|
|
242
|
+
}
|