@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,46 @@
|
|
|
1
|
+
export const WEB_FETCH_TOOL_NAME = 'WebFetch'
|
|
2
|
+
|
|
3
|
+
export const DESCRIPTION = `
|
|
4
|
+
- Fetches content from a specified URL and processes it using an AI model
|
|
5
|
+
- Takes a URL and a prompt as input
|
|
6
|
+
- Fetches the URL content, converts HTML to markdown
|
|
7
|
+
- Processes the content with the prompt using a small, fast model
|
|
8
|
+
- Returns the model's response about the content
|
|
9
|
+
- Use this tool when you need to retrieve and analyze web content
|
|
10
|
+
|
|
11
|
+
Usage notes:
|
|
12
|
+
- IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions.
|
|
13
|
+
- The URL must be a fully-formed valid URL
|
|
14
|
+
- HTTP URLs will be automatically upgraded to HTTPS
|
|
15
|
+
- The prompt should describe what information you want to extract from the page
|
|
16
|
+
- This tool is read-only and does not modify any files
|
|
17
|
+
- Results may be summarized if the content is very large
|
|
18
|
+
- Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL
|
|
19
|
+
- When a URL redirects to a different host, the tool will inform you and provide the redirect URL in a special format. You should then make a new WebFetch request with the redirect URL to fetch the content.
|
|
20
|
+
- For GitHub URLs, prefer using the gh CLI via Bash instead (e.g., gh pr view, gh issue view, gh api).
|
|
21
|
+
`
|
|
22
|
+
|
|
23
|
+
export function makeSecondaryModelPrompt(
|
|
24
|
+
markdownContent: string,
|
|
25
|
+
prompt: string,
|
|
26
|
+
isPreapprovedDomain: boolean,
|
|
27
|
+
): string {
|
|
28
|
+
const guidelines = isPreapprovedDomain
|
|
29
|
+
? `Provide a concise response based on the content above. Include relevant details, code examples, and documentation excerpts as needed.`
|
|
30
|
+
: `Provide a concise response based only on the content above. In your response:
|
|
31
|
+
- Enforce a strict 125-character maximum for quotes from any source document. Open Source Software is ok as long as we respect the license.
|
|
32
|
+
- Use quotation marks for exact language from articles; any language outside of the quotation should never be word-for-word the same.
|
|
33
|
+
- You are not a lawyer and never comment on the legality of your own prompts and responses.
|
|
34
|
+
- Never produce or reproduce exact song lyrics.`
|
|
35
|
+
|
|
36
|
+
return `
|
|
37
|
+
Web page content:
|
|
38
|
+
---
|
|
39
|
+
${markdownContent}
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
${prompt}
|
|
43
|
+
|
|
44
|
+
${guidelines}
|
|
45
|
+
`
|
|
46
|
+
}
|
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import axios, { type AxiosResponse } from 'src/utils/axios.js'
|
|
2
|
+
import { LRUCache } from 'lru-cache'
|
|
3
|
+
import {
|
|
4
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
5
|
+
logEvent,
|
|
6
|
+
} from '../../services/analytics/index.js'
|
|
7
|
+
import { queryHaiku } from '../../services/api/gemini.js'
|
|
8
|
+
import { AbortError } from '../../utils/errors.js'
|
|
9
|
+
import { getWebFetchUserAgent } from '../../utils/http.js'
|
|
10
|
+
import { logError } from '../../utils/log.js'
|
|
11
|
+
import {
|
|
12
|
+
isBinaryContentType,
|
|
13
|
+
persistBinaryContent,
|
|
14
|
+
} from '../../utils/mcpOutputStorage.js'
|
|
15
|
+
import { getSettings_DEPRECATED } from '../../utils/settings/settings.js'
|
|
16
|
+
import { asSystemPrompt } from '../../utils/systemPromptType.js'
|
|
17
|
+
import { isPreapprovedHost } from './preapproved.js'
|
|
18
|
+
import { makeSecondaryModelPrompt } from './prompt.js'
|
|
19
|
+
|
|
20
|
+
// Custom error classes for domain blocking
|
|
21
|
+
class DomainBlockedError extends Error {
|
|
22
|
+
constructor(domain: string) {
|
|
23
|
+
super(`Claude Code is unable to fetch from ${domain}`)
|
|
24
|
+
this.name = 'DomainBlockedError'
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class DomainCheckFailedError extends Error {
|
|
29
|
+
constructor(domain: string) {
|
|
30
|
+
super(
|
|
31
|
+
`Unable to verify if domain ${domain} is safe to fetch. This may be due to network restrictions or enterprise security policies blocking claude.ai.`,
|
|
32
|
+
)
|
|
33
|
+
this.name = 'DomainCheckFailedError'
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class EgressBlockedError extends Error {
|
|
38
|
+
constructor(public readonly domain: string) {
|
|
39
|
+
super(
|
|
40
|
+
JSON.stringify({
|
|
41
|
+
error_type: 'EGRESS_BLOCKED',
|
|
42
|
+
domain,
|
|
43
|
+
message: `Access to ${domain} is blocked by the network egress proxy.`,
|
|
44
|
+
}),
|
|
45
|
+
)
|
|
46
|
+
this.name = 'EgressBlockedError'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Cache for storing fetched URL content
|
|
51
|
+
type CacheEntry = {
|
|
52
|
+
bytes: number
|
|
53
|
+
code: number
|
|
54
|
+
codeText: string
|
|
55
|
+
content: string
|
|
56
|
+
contentType: string
|
|
57
|
+
persistedPath?: string
|
|
58
|
+
persistedSize?: number
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Cache with 15-minute TTL and 50MB size limit
|
|
62
|
+
// LRUCache handles automatic expiration and eviction
|
|
63
|
+
const CACHE_TTL_MS = 15 * 60 * 1000 // 15 minutes
|
|
64
|
+
const MAX_CACHE_SIZE_BYTES = 50 * 1024 * 1024 // 50MB
|
|
65
|
+
|
|
66
|
+
const URL_CACHE = new LRUCache<string, CacheEntry>({
|
|
67
|
+
maxSize: MAX_CACHE_SIZE_BYTES,
|
|
68
|
+
ttl: CACHE_TTL_MS,
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// Separate cache for preflight domain checks. URL_CACHE is URL-keyed, so
|
|
72
|
+
// fetching two paths on the same domain triggers two identical preflight
|
|
73
|
+
// HTTP round-trips to api.anthropic.com. This hostname-keyed cache avoids
|
|
74
|
+
// that. Only 'allowed' is cached — blocked/failed re-check on next attempt.
|
|
75
|
+
const DOMAIN_CHECK_CACHE = new LRUCache<string, true>({
|
|
76
|
+
max: 128,
|
|
77
|
+
ttl: 5 * 60 * 1000, // 5 minutes — shorter than URL_CACHE TTL
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
export function clearWebFetchCache(): void {
|
|
81
|
+
URL_CACHE.clear()
|
|
82
|
+
DOMAIN_CHECK_CACHE.clear()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Lazy singleton — defers the turndown → @mixmark-io/domino import (~1.4MB
|
|
86
|
+
// retained heap) until the first HTML fetch, and reuses one instance across
|
|
87
|
+
// calls (construction builds 15 rule objects; .turndown() is stateless).
|
|
88
|
+
// @types/turndown ships only `export =` (no .d.mts), so TS types the import
|
|
89
|
+
// as the class itself while Bun wraps CJS in { default } — hence the cast.
|
|
90
|
+
type TurndownCtor = typeof import('turndown')
|
|
91
|
+
let turndownServicePromise: Promise<InstanceType<TurndownCtor>> | undefined
|
|
92
|
+
function getTurndownService(): Promise<InstanceType<TurndownCtor>> {
|
|
93
|
+
return (turndownServicePromise ??= import('turndown').then(m => {
|
|
94
|
+
const Turndown = (m as unknown as { default: TurndownCtor }).default
|
|
95
|
+
return new Turndown()
|
|
96
|
+
}))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// PSR requested limiting the length of URLs to 250 to lower the potential
|
|
100
|
+
// for a data exfiltration. However, this is too restrictive for some customers'
|
|
101
|
+
// legitimate use cases, such as JWT-signed URLs (e.g., cloud service signed URLs)
|
|
102
|
+
// that can be much longer. We already require user approval for each domain,
|
|
103
|
+
// which provides a primary security boundary. In addition, Claude Code has
|
|
104
|
+
// other data exfil channels, and this one does not seem relatively high risk,
|
|
105
|
+
// so I'm removing that length restriction. -ab
|
|
106
|
+
const MAX_URL_LENGTH = 2000
|
|
107
|
+
|
|
108
|
+
// Per PSR:
|
|
109
|
+
// "Implement resource consumption controls because setting limits on CPU,
|
|
110
|
+
// memory, and network usage for the Web Fetch tool can prevent a single
|
|
111
|
+
// request or user from overwhelming the system."
|
|
112
|
+
const MAX_HTTP_CONTENT_LENGTH = 10 * 1024 * 1024
|
|
113
|
+
|
|
114
|
+
// Timeout for the main HTTP fetch request (60 seconds).
|
|
115
|
+
// Prevents hanging indefinitely on slow/unresponsive servers.
|
|
116
|
+
const FETCH_TIMEOUT_MS = 60_000
|
|
117
|
+
|
|
118
|
+
// Timeout for the domain blocklist preflight check (10 seconds).
|
|
119
|
+
const DOMAIN_CHECK_TIMEOUT_MS = 10_000
|
|
120
|
+
|
|
121
|
+
// Cap same-host redirect hops. Without this a malicious server can return
|
|
122
|
+
// a redirect loop (/a → /b → /a …) and the per-request FETCH_TIMEOUT_MS
|
|
123
|
+
// resets on every hop, hanging the tool until user interrupt. 10 matches
|
|
124
|
+
// common client defaults (axios=5, follow-redirects=21, Chrome=20).
|
|
125
|
+
const MAX_REDIRECTS = 10
|
|
126
|
+
|
|
127
|
+
// Truncate to not spend too many tokens
|
|
128
|
+
export const MAX_MARKDOWN_LENGTH = 100_000
|
|
129
|
+
|
|
130
|
+
export function isPreapprovedUrl(url: string): boolean {
|
|
131
|
+
try {
|
|
132
|
+
const parsedUrl = new URL(url)
|
|
133
|
+
return isPreapprovedHost(parsedUrl.hostname, parsedUrl.pathname)
|
|
134
|
+
} catch {
|
|
135
|
+
return false
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function validateURL(url: string): boolean {
|
|
140
|
+
if (url.length > MAX_URL_LENGTH) {
|
|
141
|
+
return false
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let parsed
|
|
145
|
+
try {
|
|
146
|
+
parsed = new URL(url)
|
|
147
|
+
} catch {
|
|
148
|
+
return false
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// We don't need to check protocol here, as we'll upgrade http to https when making the request
|
|
152
|
+
|
|
153
|
+
// As long as we aren't supporting aiming to cookies or internal domains,
|
|
154
|
+
// we should block URLs with usernames/passwords too, even though these
|
|
155
|
+
// seem exceedingly unlikely.
|
|
156
|
+
if (parsed.username || parsed.password) {
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Initial filter that this isn't a privileged, company-internal URL
|
|
161
|
+
// by checking that the hostname is publicly resolvable
|
|
162
|
+
const hostname = parsed.hostname
|
|
163
|
+
const parts = hostname.split('.')
|
|
164
|
+
if (parts.length < 2) {
|
|
165
|
+
return false
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return true
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
type DomainCheckResult =
|
|
172
|
+
| { status: 'allowed' }
|
|
173
|
+
| { status: 'blocked' }
|
|
174
|
+
| { status: 'check_failed'; error: Error }
|
|
175
|
+
|
|
176
|
+
export async function checkDomainBlocklist(
|
|
177
|
+
domain: string,
|
|
178
|
+
): Promise<DomainCheckResult> {
|
|
179
|
+
if (DOMAIN_CHECK_CACHE.has(domain)) {
|
|
180
|
+
return { status: 'allowed' }
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const response = await axios.get(
|
|
184
|
+
`https://api.anthropic.com/api/web/domain_info?domain=${encodeURIComponent(domain)}`,
|
|
185
|
+
{ timeout: DOMAIN_CHECK_TIMEOUT_MS },
|
|
186
|
+
)
|
|
187
|
+
if (response.status === 200) {
|
|
188
|
+
if (response.data.can_fetch === true) {
|
|
189
|
+
DOMAIN_CHECK_CACHE.set(domain, true)
|
|
190
|
+
return { status: 'allowed' }
|
|
191
|
+
}
|
|
192
|
+
return { status: 'blocked' }
|
|
193
|
+
}
|
|
194
|
+
// Non-200 status but didn't throw
|
|
195
|
+
return {
|
|
196
|
+
status: 'check_failed',
|
|
197
|
+
error: new Error(`Domain check returned status ${response.status}`),
|
|
198
|
+
}
|
|
199
|
+
} catch (e) {
|
|
200
|
+
logError(e)
|
|
201
|
+
return { status: 'check_failed', error: e as Error }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Check if a redirect is safe to follow
|
|
207
|
+
* Allows redirects that:
|
|
208
|
+
* - Add or remove "www." in the hostname
|
|
209
|
+
* - Keep the origin the same but change path/query params
|
|
210
|
+
* - Or both of the above
|
|
211
|
+
*/
|
|
212
|
+
export function isPermittedRedirect(
|
|
213
|
+
originalUrl: string,
|
|
214
|
+
redirectUrl: string,
|
|
215
|
+
): boolean {
|
|
216
|
+
try {
|
|
217
|
+
const parsedOriginal = new URL(originalUrl)
|
|
218
|
+
const parsedRedirect = new URL(redirectUrl)
|
|
219
|
+
|
|
220
|
+
if (parsedRedirect.protocol !== parsedOriginal.protocol) {
|
|
221
|
+
return false
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (parsedRedirect.port !== parsedOriginal.port) {
|
|
225
|
+
return false
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (parsedRedirect.username || parsedRedirect.password) {
|
|
229
|
+
return false
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Now check hostname conditions
|
|
233
|
+
// 1. Adding www. is allowed: example.com -> www.example.com
|
|
234
|
+
// 2. Removing www. is allowed: www.example.com -> example.com
|
|
235
|
+
// 3. Same host (with or without www.) is allowed: paths can change
|
|
236
|
+
const stripWww = (hostname: string) => hostname.replace(/^www\./, '')
|
|
237
|
+
const originalHostWithoutWww = stripWww(parsedOriginal.hostname)
|
|
238
|
+
const redirectHostWithoutWww = stripWww(parsedRedirect.hostname)
|
|
239
|
+
return originalHostWithoutWww === redirectHostWithoutWww
|
|
240
|
+
} catch (_error) {
|
|
241
|
+
return false
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Helper function to handle fetching URLs with custom redirect handling
|
|
247
|
+
* Recursively follows redirects if they pass the redirectChecker function
|
|
248
|
+
*
|
|
249
|
+
* Per PSR:
|
|
250
|
+
* "Do not automatically follow redirects because following redirects could
|
|
251
|
+
* allow for an attacker to exploit an open redirect vulnerability in a
|
|
252
|
+
* trusted domain to force a user to make a request to a malicious domain
|
|
253
|
+
* unknowingly"
|
|
254
|
+
*/
|
|
255
|
+
type RedirectInfo = {
|
|
256
|
+
type: 'redirect'
|
|
257
|
+
originalUrl: string
|
|
258
|
+
redirectUrl: string
|
|
259
|
+
statusCode: number
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export async function getWithPermittedRedirects(
|
|
263
|
+
url: string,
|
|
264
|
+
signal: AbortSignal,
|
|
265
|
+
redirectChecker: (originalUrl: string, redirectUrl: string) => boolean,
|
|
266
|
+
depth = 0,
|
|
267
|
+
): Promise<AxiosResponse<ArrayBuffer> | RedirectInfo> {
|
|
268
|
+
if (depth > MAX_REDIRECTS) {
|
|
269
|
+
throw new Error(`Too many redirects (exceeded ${MAX_REDIRECTS})`)
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
return await axios.get(url, {
|
|
273
|
+
signal,
|
|
274
|
+
timeout: FETCH_TIMEOUT_MS,
|
|
275
|
+
maxRedirects: 0,
|
|
276
|
+
responseType: 'arraybuffer',
|
|
277
|
+
maxContentLength: MAX_HTTP_CONTENT_LENGTH,
|
|
278
|
+
headers: {
|
|
279
|
+
Accept: 'text/markdown, text/html, */*',
|
|
280
|
+
'User-Agent': getWebFetchUserAgent(),
|
|
281
|
+
},
|
|
282
|
+
})
|
|
283
|
+
} catch (error) {
|
|
284
|
+
if (
|
|
285
|
+
axios.isAxiosError(error) &&
|
|
286
|
+
error.response &&
|
|
287
|
+
[301, 302, 307, 308].includes(error.response.status)
|
|
288
|
+
) {
|
|
289
|
+
const redirectLocation = error.response.headers.location
|
|
290
|
+
if (!redirectLocation) {
|
|
291
|
+
throw new Error('Redirect missing Location header')
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Resolve relative URLs against the original URL
|
|
295
|
+
const redirectUrl = new URL(redirectLocation, url).toString()
|
|
296
|
+
|
|
297
|
+
if (redirectChecker(url, redirectUrl)) {
|
|
298
|
+
// Recursively follow the permitted redirect
|
|
299
|
+
return getWithPermittedRedirects(
|
|
300
|
+
redirectUrl,
|
|
301
|
+
signal,
|
|
302
|
+
redirectChecker,
|
|
303
|
+
depth + 1,
|
|
304
|
+
)
|
|
305
|
+
} else {
|
|
306
|
+
// Return redirect information to the caller
|
|
307
|
+
return {
|
|
308
|
+
type: 'redirect',
|
|
309
|
+
originalUrl: url,
|
|
310
|
+
redirectUrl,
|
|
311
|
+
statusCode: error.response.status,
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Detect egress proxy blocks: the proxy returns 403 with
|
|
317
|
+
// X-Proxy-Error: blocked-by-allowlist when egress is restricted
|
|
318
|
+
if (
|
|
319
|
+
axios.isAxiosError(error) &&
|
|
320
|
+
error.response?.status === 403 &&
|
|
321
|
+
error.response.headers['x-proxy-error'] === 'blocked-by-allowlist'
|
|
322
|
+
) {
|
|
323
|
+
const hostname = new URL(url).hostname
|
|
324
|
+
throw new EgressBlockedError(hostname)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
throw error
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function isRedirectInfo(
|
|
332
|
+
response: AxiosResponse<ArrayBuffer> | RedirectInfo,
|
|
333
|
+
): response is RedirectInfo {
|
|
334
|
+
return 'type' in response && response.type === 'redirect'
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export type FetchedContent = {
|
|
338
|
+
content: string
|
|
339
|
+
bytes: number
|
|
340
|
+
code: number
|
|
341
|
+
codeText: string
|
|
342
|
+
contentType: string
|
|
343
|
+
persistedPath?: string
|
|
344
|
+
persistedSize?: number
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export async function getURLMarkdownContent(
|
|
348
|
+
url: string,
|
|
349
|
+
abortController: AbortController,
|
|
350
|
+
): Promise<FetchedContent | RedirectInfo> {
|
|
351
|
+
if (!validateURL(url)) {
|
|
352
|
+
throw new Error('Invalid URL')
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Check cache (LRUCache handles TTL automatically)
|
|
356
|
+
const cachedEntry = URL_CACHE.get(url)
|
|
357
|
+
if (cachedEntry) {
|
|
358
|
+
return {
|
|
359
|
+
bytes: cachedEntry.bytes,
|
|
360
|
+
code: cachedEntry.code,
|
|
361
|
+
codeText: cachedEntry.codeText,
|
|
362
|
+
content: cachedEntry.content,
|
|
363
|
+
contentType: cachedEntry.contentType,
|
|
364
|
+
persistedPath: cachedEntry.persistedPath,
|
|
365
|
+
persistedSize: cachedEntry.persistedSize,
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
let parsedUrl: URL
|
|
370
|
+
let upgradedUrl = url
|
|
371
|
+
|
|
372
|
+
try {
|
|
373
|
+
parsedUrl = new URL(url)
|
|
374
|
+
|
|
375
|
+
// Upgrade http to https if needed
|
|
376
|
+
if (parsedUrl.protocol === 'http:') {
|
|
377
|
+
parsedUrl.protocol = 'https:'
|
|
378
|
+
upgradedUrl = parsedUrl.toString()
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const hostname = parsedUrl.hostname
|
|
382
|
+
|
|
383
|
+
// Check if the user has opted to skip the blocklist check
|
|
384
|
+
// This is for enterprise customers with restrictive security policies
|
|
385
|
+
// that prevent outbound connections to claude.ai
|
|
386
|
+
const settings = getSettings_DEPRECATED()
|
|
387
|
+
if (!settings.skipWebFetchPreflight) {
|
|
388
|
+
const checkResult = await checkDomainBlocklist(hostname)
|
|
389
|
+
switch (checkResult.status) {
|
|
390
|
+
case 'allowed':
|
|
391
|
+
// Continue with the fetch
|
|
392
|
+
break
|
|
393
|
+
case 'blocked':
|
|
394
|
+
throw new DomainBlockedError(hostname)
|
|
395
|
+
case 'check_failed':
|
|
396
|
+
throw new DomainCheckFailedError(hostname)
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
401
|
+
logEvent('tengu_web_fetch_host', {
|
|
402
|
+
hostname:
|
|
403
|
+
hostname as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
404
|
+
})
|
|
405
|
+
}
|
|
406
|
+
} catch (e) {
|
|
407
|
+
if (
|
|
408
|
+
e instanceof DomainBlockedError ||
|
|
409
|
+
e instanceof DomainCheckFailedError
|
|
410
|
+
) {
|
|
411
|
+
// Expected user-facing failures - re-throw without logging as internal error
|
|
412
|
+
throw e
|
|
413
|
+
}
|
|
414
|
+
logError(e)
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
const response = await getWithPermittedRedirects(
|
|
418
|
+
upgradedUrl,
|
|
419
|
+
abortController.signal,
|
|
420
|
+
isPermittedRedirect,
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
// Check if we got a redirect response
|
|
424
|
+
if (isRedirectInfo(response)) {
|
|
425
|
+
return response
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const rawBuffer = Buffer.from(response.data)
|
|
429
|
+
// Release the axios-held ArrayBuffer copy; rawBuffer owns the bytes now.
|
|
430
|
+
// This lets GC reclaim up to MAX_HTTP_CONTENT_LENGTH (10MB) before Turndown
|
|
431
|
+
// builds its DOM tree (which can be 3-5x the HTML size).
|
|
432
|
+
;(response as { data: unknown }).data = null
|
|
433
|
+
const contentType = response.headers['content-type'] ?? ''
|
|
434
|
+
|
|
435
|
+
// Binary content: save raw bytes to disk with a proper extension so Claude
|
|
436
|
+
// can inspect the file later. We still fall through to the utf-8 decode +
|
|
437
|
+
// Haiku path below — for PDFs in particular the decoded string has enough
|
|
438
|
+
// ASCII structure (/Title, text streams) that Haiku can summarize it, and
|
|
439
|
+
// the saved file is a supplement rather than a replacement.
|
|
440
|
+
let persistedPath: string | undefined
|
|
441
|
+
let persistedSize: number | undefined
|
|
442
|
+
if (isBinaryContentType(contentType)) {
|
|
443
|
+
const persistId = `webfetch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
|
|
444
|
+
const result = await persistBinaryContent(rawBuffer, contentType, persistId)
|
|
445
|
+
if (!('error' in result)) {
|
|
446
|
+
persistedPath = result.filepath
|
|
447
|
+
persistedSize = result.size
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const bytes = rawBuffer.length
|
|
452
|
+
const htmlContent = rawBuffer.toString('utf-8')
|
|
453
|
+
|
|
454
|
+
let markdownContent: string
|
|
455
|
+
let contentBytes: number
|
|
456
|
+
if (contentType.includes('text/html')) {
|
|
457
|
+
markdownContent = (await getTurndownService()).turndown(htmlContent)
|
|
458
|
+
contentBytes = Buffer.byteLength(markdownContent)
|
|
459
|
+
} else {
|
|
460
|
+
// It's not HTML - just use it raw. The decoded string's UTF-8 byte
|
|
461
|
+
// length equals rawBuffer.length (modulo U+FFFD replacement on invalid
|
|
462
|
+
// bytes — negligible for cache eviction accounting), so skip the O(n)
|
|
463
|
+
// Buffer.byteLength scan.
|
|
464
|
+
markdownContent = htmlContent
|
|
465
|
+
contentBytes = bytes
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// Store the fetched content in cache. Note that it's stored under
|
|
469
|
+
// the original URL, not the upgraded or redirected URL.
|
|
470
|
+
const entry: CacheEntry = {
|
|
471
|
+
bytes,
|
|
472
|
+
code: response.status,
|
|
473
|
+
codeText: response.statusText,
|
|
474
|
+
content: markdownContent,
|
|
475
|
+
contentType,
|
|
476
|
+
persistedPath,
|
|
477
|
+
persistedSize,
|
|
478
|
+
}
|
|
479
|
+
// lru-cache requires positive integers; clamp to 1 for empty responses.
|
|
480
|
+
URL_CACHE.set(url, entry, { size: Math.max(1, contentBytes) })
|
|
481
|
+
return entry
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export async function applyPromptToMarkdown(
|
|
485
|
+
prompt: string,
|
|
486
|
+
markdownContent: string,
|
|
487
|
+
signal: AbortSignal,
|
|
488
|
+
isNonInteractiveSession: boolean,
|
|
489
|
+
isPreapprovedDomain: boolean,
|
|
490
|
+
): Promise<string> {
|
|
491
|
+
// Truncate content to avoid "Prompt is too long" errors from the secondary model
|
|
492
|
+
const truncatedContent =
|
|
493
|
+
markdownContent.length > MAX_MARKDOWN_LENGTH
|
|
494
|
+
? markdownContent.slice(0, MAX_MARKDOWN_LENGTH) +
|
|
495
|
+
'\n\n[Content truncated due to length...]'
|
|
496
|
+
: markdownContent
|
|
497
|
+
|
|
498
|
+
const modelPrompt = makeSecondaryModelPrompt(
|
|
499
|
+
truncatedContent,
|
|
500
|
+
prompt,
|
|
501
|
+
isPreapprovedDomain,
|
|
502
|
+
)
|
|
503
|
+
const assistantMessage = await queryHaiku({
|
|
504
|
+
systemPrompt: asSystemPrompt([]),
|
|
505
|
+
userPrompt: modelPrompt,
|
|
506
|
+
signal,
|
|
507
|
+
options: {
|
|
508
|
+
querySource: 'web_fetch_apply',
|
|
509
|
+
agents: [],
|
|
510
|
+
isNonInteractiveSession,
|
|
511
|
+
hasAppendSystemPrompt: false,
|
|
512
|
+
mcpTools: [],
|
|
513
|
+
},
|
|
514
|
+
})
|
|
515
|
+
|
|
516
|
+
// We need to bubble this up, so that the tool call throws, causing us to return
|
|
517
|
+
// an is_error tool_use block to the server, and render a red dot in the UI.
|
|
518
|
+
if (signal.aborted) {
|
|
519
|
+
throw new AbortError()
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const { content } = assistantMessage.message
|
|
523
|
+
if (content.length > 0) {
|
|
524
|
+
const contentBlock = content[0]
|
|
525
|
+
if ('text' in contentBlock!) {
|
|
526
|
+
return contentBlock.text
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return 'No response from model'
|
|
530
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MessageResponse } from '../../components/MessageResponse.js';
|
|
3
|
+
import { TOOL_SUMMARY_MAX_LENGTH } from '../../constants/toolLimits.js';
|
|
4
|
+
import { Box, Text } from '../../ink.js';
|
|
5
|
+
import type { ProgressMessage } from '../../types/message.js';
|
|
6
|
+
import { truncate } from '../../utils/format.js';
|
|
7
|
+
import type { Output, SearchResult, WebSearchProgress } from './WebSearchTool.js';
|
|
8
|
+
function getSearchSummary(results: (SearchResult | string | null | undefined)[]): {
|
|
9
|
+
searchCount: number;
|
|
10
|
+
totalResultCount: number;
|
|
11
|
+
} {
|
|
12
|
+
let searchCount = 0;
|
|
13
|
+
let totalResultCount = 0;
|
|
14
|
+
for (const result of results) {
|
|
15
|
+
if (result != null && typeof result !== 'string') {
|
|
16
|
+
searchCount++;
|
|
17
|
+
totalResultCount += result.content?.length ?? 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
searchCount,
|
|
22
|
+
totalResultCount
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function renderToolUseMessage({
|
|
26
|
+
query,
|
|
27
|
+
allowed_domains,
|
|
28
|
+
blocked_domains
|
|
29
|
+
}: Partial<{
|
|
30
|
+
query: string;
|
|
31
|
+
allowed_domains?: string[];
|
|
32
|
+
blocked_domains?: string[];
|
|
33
|
+
}>, {
|
|
34
|
+
verbose
|
|
35
|
+
}: {
|
|
36
|
+
verbose: boolean;
|
|
37
|
+
}): React.ReactNode {
|
|
38
|
+
if (!query) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
let message = '';
|
|
42
|
+
if (query) {
|
|
43
|
+
message += `"${query}"`;
|
|
44
|
+
}
|
|
45
|
+
if (verbose) {
|
|
46
|
+
if (allowed_domains && allowed_domains.length > 0) {
|
|
47
|
+
message += `, only allowing domains: ${allowed_domains.join(', ')}`;
|
|
48
|
+
}
|
|
49
|
+
if (blocked_domains && blocked_domains.length > 0) {
|
|
50
|
+
message += `, blocking domains: ${blocked_domains.join(', ')}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return message;
|
|
54
|
+
}
|
|
55
|
+
export function renderToolUseProgressMessage(progressMessages: ProgressMessage<WebSearchProgress>[]): React.ReactNode {
|
|
56
|
+
if (progressMessages.length === 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const lastProgress = progressMessages[progressMessages.length - 1];
|
|
60
|
+
if (!lastProgress?.data) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const data = lastProgress.data;
|
|
64
|
+
switch (data.type) {
|
|
65
|
+
case 'query_update':
|
|
66
|
+
return <MessageResponse>
|
|
67
|
+
<Text dimColor>Searching: {data.query}</Text>
|
|
68
|
+
</MessageResponse>;
|
|
69
|
+
case 'search_results_received':
|
|
70
|
+
return <MessageResponse>
|
|
71
|
+
<Text dimColor>
|
|
72
|
+
Found {data.resultCount} results for "{data.query}"
|
|
73
|
+
</Text>
|
|
74
|
+
</MessageResponse>;
|
|
75
|
+
default:
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function renderToolResultMessage(output: Output): React.ReactNode {
|
|
80
|
+
const {
|
|
81
|
+
searchCount
|
|
82
|
+
} = getSearchSummary(output.results ?? []);
|
|
83
|
+
const timeDisplay = output.durationSeconds >= 1 ? `${Math.round(output.durationSeconds)}s` : `${Math.round(output.durationSeconds * 1000)}ms`;
|
|
84
|
+
return <Box justifyContent="space-between" width="100%">
|
|
85
|
+
<MessageResponse height={1}>
|
|
86
|
+
<Text>
|
|
87
|
+
Did {searchCount} search
|
|
88
|
+
{searchCount !== 1 ? 'es' : ''} in {timeDisplay}
|
|
89
|
+
</Text>
|
|
90
|
+
</MessageResponse>
|
|
91
|
+
</Box>;
|
|
92
|
+
}
|
|
93
|
+
export function getToolUseSummary(input: Partial<{
|
|
94
|
+
query: string;
|
|
95
|
+
}> | undefined): string | null {
|
|
96
|
+
if (!input?.query) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return truncate(input.query, TOOL_SUMMARY_MAX_LENGTH);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIk1lc3NhZ2VSZXNwb25zZSIsIlRPT0xfU1VNTUFSWV9NQVhfTEVOR1RIIiwiQm94IiwiVGV4dCIsIlByb2dyZXNzTWVzc2FnZSIsInRydW5jYXRlIiwiT3V0cHV0IiwiU2VhcmNoUmVzdWx0IiwiV2ViU2VhcmNoUHJvZ3Jlc3MiLCJnZXRTZWFyY2hTdW1tYXJ5IiwicmVzdWx0cyIsInNlYXJjaENvdW50IiwidG90YWxSZXN1bHRDb3VudCIsInJlc3VsdCIsImNvbnRlbnQiLCJsZW5ndGgiLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsInF1ZXJ5IiwiYWxsb3dlZF9kb21haW5zIiwiYmxvY2tlZF9kb21haW5zIiwiUGFydGlhbCIsInZlcmJvc2UiLCJSZWFjdE5vZGUiLCJtZXNzYWdlIiwiam9pbiIsInJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UiLCJwcm9ncmVzc01lc3NhZ2VzIiwibGFzdFByb2dyZXNzIiwiZGF0YSIsInR5cGUiLCJyZXN1bHRDb3VudCIsInJlbmRlclRvb2xSZXN1bHRNZXNzYWdlIiwib3V0cHV0IiwidGltZURpc3BsYXkiLCJkdXJhdGlvblNlY29uZHMiLCJNYXRoIiwicm91bmQiLCJnZXRUb29sVXNlU3VtbWFyeSIsImlucHV0Il0sInNvdXJjZXMiOlsiVUkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1lc3NhZ2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvTWVzc2FnZVJlc3BvbnNlLmpzJ1xuaW1wb3J0IHsgVE9PTF9TVU1NQVJZX01BWF9MRU5HVEggfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdG9vbExpbWl0cy5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3NNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7IHRydW5jYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LmpzJ1xuaW1wb3J0IHR5cGUge1xuICBPdXRwdXQsXG4gIFNlYXJjaFJlc3VsdCxcbiAgV2ViU2VhcmNoUHJvZ3Jlc3MsXG59IGZyb20gJy4vV2ViU2VhcmNoVG9vbC5qcydcblxuZnVuY3Rpb24gZ2V0U2VhcmNoU3VtbWFyeShcbiAgcmVzdWx0czogKFNlYXJjaFJlc3VsdCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpW10sXG4pOiB7XG4gIHNlYXJjaENvdW50OiBudW1iZXJcbiAgdG90YWxSZXN1bHRDb3VudDogbnVtYmVyXG59IHtcbiAgbGV0IHNlYXJjaENvdW50ID0gMFxuICBsZXQgdG90YWxSZXN1bHRDb3VudCA9IDBcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHR5cGVvZiByZXN1bHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBzZWFyY2hDb3VudCsrXG4gICAgICB0b3RhbFJlc3VsdENvdW50ICs9IHJlc3VsdC5jb250ZW50Py5sZW5ndGggPz8gMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNlYXJjaENvdW50LCB0b3RhbFJlc3VsdENvdW50IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VNZXNzYWdlKFxuICB7XG4gICAgcXVlcnksXG4gICAgYWxsb3dlZF9kb21haW5zLFxuICAgIGJsb2NrZWRfZG9tYWlucyxcbiAgfTogUGFydGlhbDx7XG4gICAgcXVlcnk6IHN0cmluZ1xuICAgIGFsbG93ZWRfZG9tYWlucz86IHN0cmluZ1tdXG4gICAgYmxvY2tlZF9kb21haW5zPzogc3RyaW5nW11cbiAgfT4sXG4gIHsgdmVyYm9zZSB9OiB7IHZlcmJvc2U6IGJvb2xlYW4gfSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG1lc3NhZ2UgPSAnJ1xuXG4gIGlmIChxdWVyeSkge1xuICAgIG1lc3NhZ2UgKz0gYFwiJHtxdWVyeX1cImBcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgaWYgKGFsbG93ZWRfZG9tYWlucyAmJiBhbGxvd2VkX2RvbWFpbnMubGVuZ3RoID4gMCkge1xuICAgICAgbWVzc2FnZSArPSBgLCBvbmx5IGFsbG93aW5nIGRvbWFpbnM6ICR7YWxsb3dlZF9kb21haW5zLmpvaW4oJywgJyl9YFxuICAgIH1cblxuICAgIGlmIChibG9ja2VkX2RvbWFpbnMgJiYgYmxvY2tlZF9kb21haW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCwgYmxvY2tpbmcgZG9tYWluczogJHtibG9ja2VkX2RvbWFpbnMuam9pbignLCAnKX1gXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UoXG4gIHByb2dyZXNzTWVzc2FnZXM6IFByb2dyZXNzTWVzc2FnZTxXZWJTZWFyY2hQcm9ncmVzcz5bXSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmIChwcm9ncmVzc01lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBsYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzc01lc3NhZ2VzW3Byb2dyZXNzTWVzc2FnZXMubGVuZ3RoIC0gMV1cbiAgaWYgKCFsYXN0UHJvZ3Jlc3M/LmRhdGEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZGF0YSA9IGxhc3RQcm9ncmVzcy5kYXRhXG5cbiAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICBjYXNlICdxdWVyeV91cGRhdGUnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1lc3NhZ2VSZXNwb25zZT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5TZWFyY2hpbmc6IHtkYXRhLnF1ZXJ5fTwvVGV4dD5cbiAgICAgICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gICAgICApXG4gICAgY2FzZSAnc2VhcmNoX3Jlc3VsdHNfcmVjZWl2ZWQnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1lc3NhZ2VSZXNwb25zZT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIEZvdW5kIHtkYXRhLnJlc3VsdENvdW50fSByZXN1bHRzIGZvciAmcXVvdDt7ZGF0YS5xdWVyeX0mcXVvdDtcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgICAgKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUb29sUmVzdWx0TWVzc2FnZShvdXRwdXQ6IE91dHB1dCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgc2VhcmNoQ291bnQgfSA9IGdldFNlYXJjaFN1bW1hcnkob3V0cHV0LnJlc3VsdHMgPz8gW10pXG4gIGNvbnN0IHRpbWVEaXNwbGF5ID1cbiAgICBvdXRwdXQuZHVyYXRpb25TZWNvbmRzID49IDFcbiAgICAgID8gYCR7TWF0aC5yb3VuZChvdXRwdXQuZHVyYXRpb25TZWNvbmRzKX1zYFxuICAgICAgOiBgJHtNYXRoLnJvdW5kKG91dHB1dC5kdXJhdGlvblNlY29uZHMgKiAxMDAwKX1tc2BcblxuICByZXR1cm4gKFxuICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJzcGFjZS1iZXR3ZWVuXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIERpZCB7c2VhcmNoQ291bnR9IHNlYXJjaFxuICAgICAgICAgIHtzZWFyY2hDb3VudCAhPT0gMSA/ICdlcycgOiAnJ30gaW4ge3RpbWVEaXNwbGF5fVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L01lc3NhZ2VSZXNwb25zZT5cbiAgICA8L0JveD5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbFVzZVN1bW1hcnkoXG4gIGlucHV0OiBQYXJ0aWFsPHsgcXVlcnk6IHN0cmluZyB9PiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWlucHV0Py5xdWVyeSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIHRydW5jYXRlKGlucHV0LnF1ZXJ5LCBUT09MX1NVTU1BUllfTUFYX0xFTkdUSClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsZUFBZSxRQUFRLHFDQUFxQztBQUNyRSxTQUFTQyx1QkFBdUIsUUFBUSwrQkFBK0I7QUFDdkUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxjQUFjQyxlQUFlLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLFFBQVEsUUFBUSx1QkFBdUI7QUFDaEQsY0FDRUMsTUFBTSxFQUNOQyxZQUFZLEVBQ1pDLGlCQUFpQixRQUNaLG9CQUFvQjtBQUUzQixTQUFTQyxnQkFBZ0JBLENBQ3ZCQyxPQUFPLEVBQUUsQ0FBQ0gsWUFBWSxHQUFHLE1BQU0sR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FDdEQsRUFBRTtFQUNESSxXQUFXLEVBQUUsTUFBTTtFQUNuQkMsZ0JBQWdCLEVBQUUsTUFBTTtBQUMxQixDQUFDLENBQUM7RUFDQSxJQUFJRCxXQUFXLEdBQUcsQ0FBQztFQUNuQixJQUFJQyxnQkFBZ0IsR0FBRyxDQUFDO0VBRXhCLEtBQUssTUFBTUMsTUFBTSxJQUFJSCxPQUFPLEVBQUU7SUFDNUIsSUFBSUcsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxFQUFFO01BQ2hERixXQUFXLEVBQUU7TUFDYkMsZ0JBQWdCLElBQUlDLE1BQU0sQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLElBQUksQ0FBQztJQUNqRDtFQUNGO0VBRUEsT0FBTztJQUFFSixXQUFXO0lBQUVDO0VBQWlCLENBQUM7QUFDMUM7QUFFQSxPQUFPLFNBQVNJLG9CQUFvQkEsQ0FDbEM7RUFDRUMsS0FBSztFQUNMQyxlQUFlO0VBQ2ZDO0FBS0QsQ0FKQSxFQUFFQyxPQUFPLENBQUM7RUFDVEgsS0FBSyxFQUFFLE1BQU07RUFDYkMsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFFO0VBQzFCQyxlQUFlLENBQUMsRUFBRSxNQUFNLEVBQUU7QUFDNUIsQ0FBQyxDQUFDLEVBQ0Y7RUFBRUU7QUFBOEIsQ0FBckIsRUFBRTtFQUFFQSxPQUFPLEVBQUUsT0FBTztBQUFDLENBQUMsQ0FDbEMsRUFBRXRCLEtBQUssQ0FBQ3VCLFNBQVMsQ0FBQztFQUNqQixJQUFJLENBQUNMLEtBQUssRUFBRTtJQUNWLE9BQU8sSUFBSTtFQUNiO0VBRUEsSUFBSU0sT0FBTyxHQUFHLEVBQUU7RUFFaEIsSUFBSU4sS0FBSyxFQUFFO0lBQ1RNLE9BQU8sSUFBSSxJQUFJTixLQUFLLEdBQUc7RUFDekI7RUFFQSxJQUFJSSxPQUFPLEVBQUU7SUFDWCxJQUFJSCxlQUFlLElBQUlBLGVBQWUsQ0FBQ0gsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNqRFEsT0FBTyxJQUFJLDRCQUE0QkwsZUFBZSxDQUFDTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDckU7SUFFQSxJQUFJTCxlQUFlLElBQUlBLGVBQWUsQ0FBQ0osTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNqRFEsT0FBTyxJQUFJLHVCQUF1QkosZUFBZSxDQUFDSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDaEU7RUFDRjtFQUVBLE9BQU9ELE9BQU87QUFDaEI7QUFFQSxPQUFPLFNBQVNFLDRCQUE0QkEsQ0FDMUNDLGdCQUFnQixFQUFFdEIsZUFBZSxDQUFDSSxpQkFBaUIsQ0FBQyxFQUFFLENBQ3ZELEVBQUVULEtBQUssQ0FBQ3VCLFNBQVMsQ0FBQztFQUNqQixJQUFJSSxnQkFBZ0IsQ0FBQ1gsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUNqQyxPQUFPLElBQUk7RUFDYjtFQUVBLE1BQU1ZLFlBQVksR0FBR0QsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDWCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2xFLElBQUksQ0FBQ1ksWUFBWSxFQUFFQyxJQUFJLEVBQUU7SUFDdkIsT0FBTyxJQUFJO0VBQ2I7RUFFQSxNQUFNQSxJQUFJLEdBQUdELFlBQVksQ0FBQ0MsSUFBSTtFQUU5QixRQUFRQSxJQUFJLENBQUNDLElBQUk7SUFDZixLQUFLLGNBQWM7TUFDakIsT0FDRSxDQUFDLGVBQWU7QUFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDRCxJQUFJLENBQUNYLEtBQUssQ0FBQyxFQUFFLElBQUk7QUFDdEQsUUFBUSxFQUFFLGVBQWUsQ0FBQztJQUV0QixLQUFLLHlCQUF5QjtNQUM1QixPQUNFLENBQUMsZUFBZTtBQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVE7QUFDeEIsa0JBQWtCLENBQUNXLElBQUksQ0FBQ0UsV0FBVyxDQUFDLG1CQUFtQixDQUFDRixJQUFJLENBQUNYLEtBQUssQ0FBQztBQUNuRSxVQUFVLEVBQUUsSUFBSTtBQUNoQixRQUFRLEVBQUUsZUFBZSxDQUFDO0lBRXRCO01BQ0UsT0FBTyxJQUFJO0VBQ2Y7QUFDRjtBQUVBLE9BQU8sU0FBU2MsdUJBQXVCQSxDQUFDQyxNQUFNLEVBQUUxQixNQUFNLENBQUMsRUFBRVAsS0FBSyxDQUFDdUIsU0FBUyxDQUFDO0VBQ3ZFLE1BQU07SUFBRVg7RUFBWSxDQUFDLEdBQUdGLGdCQUFnQixDQUFDdUIsTUFBTSxDQUFDdEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztFQUM5RCxNQUFNdUIsV0FBVyxHQUNmRCxNQUFNLENBQUNFLGVBQWUsSUFBSSxDQUFDLEdBQ3ZCLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDSixNQUFNLENBQUNFLGVBQWUsQ0FBQyxHQUFHLEdBQ3hDLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDSixNQUFNLENBQUNFLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSTtFQUV0RCxPQUNFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU07QUFDcEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxDQUFDLElBQUk7QUFDYixjQUFjLENBQUN2QixXQUFXLENBQUM7QUFDM0IsVUFBVSxDQUFDQSxXQUFXLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDc0IsV0FBVztBQUN6RCxRQUFRLEVBQUUsSUFBSTtBQUNkLE1BQU0sRUFBRSxlQUFlO0FBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUM7QUFFVjtBQUVBLE9BQU8sU0FBU0ksaUJBQWlCQSxDQUMvQkMsS0FBSyxFQUFFbEIsT0FBTyxDQUFDO0VBQUVILEtBQUssRUFBRSxNQUFNO0FBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUM5QyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDZixJQUFJLENBQUNxQixLQUFLLEVBQUVyQixLQUFLLEVBQUU7SUFDakIsT0FBTyxJQUFJO0VBQ2I7RUFDQSxPQUFPWixRQUFRLENBQUNpQyxLQUFLLENBQUNyQixLQUFLLEVBQUVoQix1QkFBdUIsQ0FBQztBQUN2RCIsImlnbm9yZUxpc3QiOltdfQ==
|