@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
package/utils/dxt/zip.ts
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { isAbsolute, normalize } from 'path'
|
|
2
|
+
import { logForDebugging } from '../debug.js'
|
|
3
|
+
import { isENOENT } from '../errors.js'
|
|
4
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
5
|
+
import { containsPathTraversal } from '../path.js'
|
|
6
|
+
|
|
7
|
+
const LIMITS = {
|
|
8
|
+
MAX_FILE_SIZE: 512 * 1024 * 1024, // 512MB per file
|
|
9
|
+
MAX_TOTAL_SIZE: 1024 * 1024 * 1024, // 1024MB total uncompressed
|
|
10
|
+
MAX_FILE_COUNT: 100000, // Maximum number of files
|
|
11
|
+
MAX_COMPRESSION_RATIO: 50, // Anything above 50:1 is suspicious
|
|
12
|
+
MIN_COMPRESSION_RATIO: 0.5, // Below 0.5:1 might indicate already compressed malicious content
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* State tracker for zip file validation during extraction
|
|
17
|
+
*/
|
|
18
|
+
type ZipValidationState = {
|
|
19
|
+
fileCount: number
|
|
20
|
+
totalUncompressedSize: number
|
|
21
|
+
compressedSize: number
|
|
22
|
+
errors: string[]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* File metadata from fflate filter
|
|
27
|
+
*/
|
|
28
|
+
type ZipFileMetadata = {
|
|
29
|
+
name: string
|
|
30
|
+
originalSize?: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Result of validating a single file in a zip archive
|
|
35
|
+
*/
|
|
36
|
+
type FileValidationResult = {
|
|
37
|
+
isValid: boolean
|
|
38
|
+
error?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validates a file path to prevent path traversal attacks
|
|
43
|
+
*/
|
|
44
|
+
export function isPathSafe(filePath: string): boolean {
|
|
45
|
+
if (containsPathTraversal(filePath)) {
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Normalize the path to resolve any '.' segments
|
|
50
|
+
const normalized = normalize(filePath)
|
|
51
|
+
|
|
52
|
+
// Check for absolute paths (we only want relative paths in archives)
|
|
53
|
+
if (isAbsolute(normalized)) {
|
|
54
|
+
return false
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return true
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Validates a single file during zip extraction
|
|
62
|
+
*/
|
|
63
|
+
export function validateZipFile(
|
|
64
|
+
file: ZipFileMetadata,
|
|
65
|
+
state: ZipValidationState,
|
|
66
|
+
): FileValidationResult {
|
|
67
|
+
state.fileCount++
|
|
68
|
+
|
|
69
|
+
let error: string | undefined
|
|
70
|
+
|
|
71
|
+
// Check file count
|
|
72
|
+
if (state.fileCount > LIMITS.MAX_FILE_COUNT) {
|
|
73
|
+
error = `Archive contains too many files: ${state.fileCount} (max: ${LIMITS.MAX_FILE_COUNT})`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Validate path safety
|
|
77
|
+
if (!isPathSafe(file.name)) {
|
|
78
|
+
error = `Unsafe file path detected: "${file.name}". Path traversal or absolute paths are not allowed.`
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Check individual file size
|
|
82
|
+
const fileSize = file.originalSize || 0
|
|
83
|
+
if (fileSize > LIMITS.MAX_FILE_SIZE) {
|
|
84
|
+
error = `File "${file.name}" is too large: ${Math.round(fileSize / 1024 / 1024)}MB (max: ${Math.round(LIMITS.MAX_FILE_SIZE / 1024 / 1024)}MB)`
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Track total uncompressed size
|
|
88
|
+
state.totalUncompressedSize += fileSize
|
|
89
|
+
|
|
90
|
+
// Check total size
|
|
91
|
+
if (state.totalUncompressedSize > LIMITS.MAX_TOTAL_SIZE) {
|
|
92
|
+
error = `Archive total size is too large: ${Math.round(state.totalUncompressedSize / 1024 / 1024)}MB (max: ${Math.round(LIMITS.MAX_TOTAL_SIZE / 1024 / 1024)}MB)`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check compression ratio for zip bomb detection
|
|
96
|
+
const currentRatio = state.totalUncompressedSize / state.compressedSize
|
|
97
|
+
if (currentRatio > LIMITS.MAX_COMPRESSION_RATIO) {
|
|
98
|
+
error = `Suspicious compression ratio detected: ${currentRatio.toFixed(1)}:1 (max: ${LIMITS.MAX_COMPRESSION_RATIO}:1). This may be a zip bomb.`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return error ? { isValid: false, error } : { isValid: true }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Unzips data from a Buffer and returns its contents as a record of file paths to Uint8Array data.
|
|
106
|
+
* Uses unzipSync to avoid fflate worker termination crashes in bun.
|
|
107
|
+
* Accepts raw zip bytes so that the caller can read the file asynchronously.
|
|
108
|
+
*
|
|
109
|
+
* fflate is lazy-imported to avoid its ~196KB of top-level lookup tables (revfd
|
|
110
|
+
* Int32Array(32769), rev Uint16Array(32768), etc.) being allocated at startup
|
|
111
|
+
* when this module is reached via the plugin loader chain.
|
|
112
|
+
*/
|
|
113
|
+
export async function unzipFile(
|
|
114
|
+
zipData: Buffer,
|
|
115
|
+
): Promise<Record<string, Uint8Array>> {
|
|
116
|
+
const { unzipSync } = await import('fflate')
|
|
117
|
+
const compressedSize = zipData.length
|
|
118
|
+
|
|
119
|
+
const state: ZipValidationState = {
|
|
120
|
+
fileCount: 0,
|
|
121
|
+
totalUncompressedSize: 0,
|
|
122
|
+
compressedSize: compressedSize,
|
|
123
|
+
errors: [],
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const result = unzipSync(new Uint8Array(zipData), {
|
|
127
|
+
filter: file => {
|
|
128
|
+
const validationResult = validateZipFile(file, state)
|
|
129
|
+
if (!validationResult.isValid) {
|
|
130
|
+
throw new Error(validationResult.error!)
|
|
131
|
+
}
|
|
132
|
+
return true
|
|
133
|
+
},
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
logForDebugging(
|
|
137
|
+
`Zip extraction completed: ${state.fileCount} files, ${Math.round(state.totalUncompressedSize / 1024)}KB uncompressed`,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return result
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Parse Unix file modes from a zip's central directory.
|
|
145
|
+
*
|
|
146
|
+
* fflate's `unzipSync` returns only `Record<string, Uint8Array>` — it does not
|
|
147
|
+
* surface the external file attributes stored in the central directory. This
|
|
148
|
+
* means executable bits are lost during extraction (everything becomes 0644).
|
|
149
|
+
* The git-clone path preserves +x natively, but the GCS/zip path needs this
|
|
150
|
+
* helper to keep parity.
|
|
151
|
+
*
|
|
152
|
+
* Returns `name → mode` for entries created on a Unix host (`versionMadeBy`
|
|
153
|
+
* high byte === 3). Entries from other hosts, or with no mode bits set, are
|
|
154
|
+
* omitted. Callers should treat a missing key as "use default mode".
|
|
155
|
+
*
|
|
156
|
+
* Format per PKZIP APPNOTE.TXT §4.3.12 (central directory) and §4.3.16 (EOCD).
|
|
157
|
+
* ZIP64 is not handled — returns `{}` on archives >4GB or >65535 entries,
|
|
158
|
+
* which is fine for marketplace zips (~3.5MB) and MCPB bundles.
|
|
159
|
+
*/
|
|
160
|
+
export function parseZipModes(data: Uint8Array): Record<string, number> {
|
|
161
|
+
// Buffer view for readUInt* methods — shares memory, no copy.
|
|
162
|
+
const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)
|
|
163
|
+
const modes: Record<string, number> = {}
|
|
164
|
+
|
|
165
|
+
// 1. Find the End of Central Directory record (sig 0x06054b50). It lives in
|
|
166
|
+
// the trailing 22 + 65535 bytes (fixed EOCD size + max comment length).
|
|
167
|
+
// Scan backwards — the EOCD is typically the last 22 bytes.
|
|
168
|
+
const minEocd = Math.max(0, buf.length - 22 - 0xffff)
|
|
169
|
+
let eocd = -1
|
|
170
|
+
for (let i = buf.length - 22; i >= minEocd; i--) {
|
|
171
|
+
if (buf.readUInt32LE(i) === 0x06054b50) {
|
|
172
|
+
eocd = i
|
|
173
|
+
break
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (eocd < 0) return modes // malformed — let fflate's error surface elsewhere
|
|
177
|
+
|
|
178
|
+
const entryCount = buf.readUInt16LE(eocd + 10)
|
|
179
|
+
let off = buf.readUInt32LE(eocd + 16) // central directory start offset
|
|
180
|
+
|
|
181
|
+
// 2. Walk central directory entries (sig 0x02014b50). Each entry has a
|
|
182
|
+
// 46-byte fixed header followed by variable-length name/extra/comment.
|
|
183
|
+
for (let i = 0; i < entryCount; i++) {
|
|
184
|
+
if (off + 46 > buf.length || buf.readUInt32LE(off) !== 0x02014b50) break
|
|
185
|
+
const versionMadeBy = buf.readUInt16LE(off + 4)
|
|
186
|
+
const nameLen = buf.readUInt16LE(off + 28)
|
|
187
|
+
const extraLen = buf.readUInt16LE(off + 30)
|
|
188
|
+
const commentLen = buf.readUInt16LE(off + 32)
|
|
189
|
+
const externalAttr = buf.readUInt32LE(off + 38)
|
|
190
|
+
const name = buf.toString('utf8', off + 46, off + 46 + nameLen)
|
|
191
|
+
|
|
192
|
+
// versionMadeBy high byte = host OS. 3 = Unix. For Unix zips, the high
|
|
193
|
+
// 16 bits of externalAttr hold st_mode (file type + permission bits).
|
|
194
|
+
if (versionMadeBy >> 8 === 3) {
|
|
195
|
+
const mode = (externalAttr >>> 16) & 0xffff
|
|
196
|
+
if (mode) modes[name] = mode
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
off += 46 + nameLen + extraLen + commentLen
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return modes
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Reads a zip file from disk asynchronously and unzips it.
|
|
207
|
+
* Returns its contents as a record of file paths to Uint8Array data.
|
|
208
|
+
*/
|
|
209
|
+
export async function readAndUnzipFile(
|
|
210
|
+
filePath: string,
|
|
211
|
+
): Promise<Record<string, Uint8Array>> {
|
|
212
|
+
const fs = getFsImplementation()
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
const zipData = await fs.readFileBytes(filePath)
|
|
216
|
+
// await is required here: without it, rejections from the now-async
|
|
217
|
+
// unzipFile() escape the try/catch and bypass the error wrapping below.
|
|
218
|
+
return await unzipFile(zipData)
|
|
219
|
+
} catch (error) {
|
|
220
|
+
if (isENOENT(error)) {
|
|
221
|
+
throw error
|
|
222
|
+
}
|
|
223
|
+
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
224
|
+
throw new Error(`Failed to read or unzip file: ${errorMessage}`)
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Early Input Capture
|
|
3
|
+
*
|
|
4
|
+
* This module captures terminal input that is typed before the REPL is fully
|
|
5
|
+
* initialized. Users often type `claude` and immediately start typing their
|
|
6
|
+
* prompt, but those early keystrokes would otherwise be lost during startup.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* 1. Call startCapturingEarlyInput() as early as possible in cli.tsx
|
|
10
|
+
* 2. When REPL is ready, call consumeEarlyInput() to get any buffered text
|
|
11
|
+
* 3. stopCapturingEarlyInput() is called automatically when input is consumed
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { lastGrapheme } from './intl.js'
|
|
15
|
+
|
|
16
|
+
// Buffer for early input characters
|
|
17
|
+
let earlyInputBuffer = ''
|
|
18
|
+
// Flag to track if we're currently capturing
|
|
19
|
+
let isCapturing = false
|
|
20
|
+
// Reference to the readable handler so we can remove it later
|
|
21
|
+
let readableHandler: (() => void) | null = null
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Start capturing stdin data early, before the REPL is initialized.
|
|
25
|
+
* Should be called as early as possible in the startup sequence.
|
|
26
|
+
*
|
|
27
|
+
* Only captures if stdin is a TTY (interactive terminal).
|
|
28
|
+
*/
|
|
29
|
+
export function startCapturingEarlyInput(): void {
|
|
30
|
+
// Only capture in interactive mode: stdin must be a TTY, and we must not
|
|
31
|
+
// be in print mode. Raw mode disables ISIG (terminal Ctrl+C → SIGINT),
|
|
32
|
+
// which would make -p uninterruptible.
|
|
33
|
+
if (
|
|
34
|
+
!process.stdin.isTTY ||
|
|
35
|
+
isCapturing ||
|
|
36
|
+
process.argv.includes('-p') ||
|
|
37
|
+
process.argv.includes('--print')
|
|
38
|
+
) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
isCapturing = true
|
|
43
|
+
earlyInputBuffer = ''
|
|
44
|
+
|
|
45
|
+
// Set stdin to raw mode and use 'readable' event like Ink does
|
|
46
|
+
// This ensures compatibility with how the REPL will handle stdin later
|
|
47
|
+
try {
|
|
48
|
+
process.stdin.setEncoding('utf8')
|
|
49
|
+
process.stdin.setRawMode(true)
|
|
50
|
+
process.stdin.ref()
|
|
51
|
+
|
|
52
|
+
readableHandler = () => {
|
|
53
|
+
let chunk = process.stdin.read()
|
|
54
|
+
while (chunk !== null) {
|
|
55
|
+
if (typeof chunk === 'string') {
|
|
56
|
+
processChunk(chunk)
|
|
57
|
+
}
|
|
58
|
+
chunk = process.stdin.read()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
process.stdin.on('readable', readableHandler)
|
|
63
|
+
} catch {
|
|
64
|
+
// If we can't set raw mode, just silently continue without early capture
|
|
65
|
+
isCapturing = false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Process a chunk of input data
|
|
71
|
+
*/
|
|
72
|
+
function processChunk(str: string): void {
|
|
73
|
+
let i = 0
|
|
74
|
+
while (i < str.length) {
|
|
75
|
+
const char = str[i]!
|
|
76
|
+
const code = char.charCodeAt(0)
|
|
77
|
+
|
|
78
|
+
// Ctrl+C (code 3) - stop capturing and exit immediately.
|
|
79
|
+
// We use process.exit here instead of gracefulShutdown because at this
|
|
80
|
+
// early stage of startup, the shutdown machinery isn't initialized yet.
|
|
81
|
+
if (code === 3) {
|
|
82
|
+
stopCapturingEarlyInput()
|
|
83
|
+
// eslint-disable-next-line custom-rules/no-process-exit
|
|
84
|
+
process.exit(130) // Standard exit code for Ctrl+C
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Ctrl+D (code 4) - EOF, stop capturing
|
|
89
|
+
if (code === 4) {
|
|
90
|
+
stopCapturingEarlyInput()
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Backspace (code 127 or 8) - remove last grapheme cluster
|
|
95
|
+
if (code === 127 || code === 8) {
|
|
96
|
+
if (earlyInputBuffer.length > 0) {
|
|
97
|
+
const last = lastGrapheme(earlyInputBuffer)
|
|
98
|
+
earlyInputBuffer = earlyInputBuffer.slice(0, -(last.length || 1))
|
|
99
|
+
}
|
|
100
|
+
i++
|
|
101
|
+
continue
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Skip escape sequences (arrow keys, function keys, focus events, etc.)
|
|
105
|
+
// All escape sequences start with ESC (0x1B) and end with a byte in 0x40-0x7E
|
|
106
|
+
if (code === 27) {
|
|
107
|
+
i++ // Skip the ESC character
|
|
108
|
+
// Skip until the terminating byte (@ to ~) or end of string
|
|
109
|
+
while (
|
|
110
|
+
i < str.length &&
|
|
111
|
+
!(str.charCodeAt(i) >= 64 && str.charCodeAt(i) <= 126)
|
|
112
|
+
) {
|
|
113
|
+
i++
|
|
114
|
+
}
|
|
115
|
+
if (i < str.length) i++ // Skip the terminating byte
|
|
116
|
+
continue
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Skip other control characters (except tab and newline)
|
|
120
|
+
if (code < 32 && code !== 9 && code !== 10 && code !== 13) {
|
|
121
|
+
i++
|
|
122
|
+
continue
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Convert carriage return to newline
|
|
126
|
+
if (code === 13) {
|
|
127
|
+
earlyInputBuffer += '\n'
|
|
128
|
+
i++
|
|
129
|
+
continue
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Add printable characters and allowed control chars to buffer
|
|
133
|
+
earlyInputBuffer += char
|
|
134
|
+
i++
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Stop capturing early input.
|
|
140
|
+
* Called automatically when input is consumed, or can be called manually.
|
|
141
|
+
*/
|
|
142
|
+
export function stopCapturingEarlyInput(): void {
|
|
143
|
+
if (!isCapturing) {
|
|
144
|
+
return
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
isCapturing = false
|
|
148
|
+
|
|
149
|
+
if (readableHandler) {
|
|
150
|
+
process.stdin.removeListener('readable', readableHandler)
|
|
151
|
+
readableHandler = null
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Don't reset stdin state - the REPL's Ink App will manage stdin state.
|
|
155
|
+
// If we call setRawMode(false) here, it can interfere with the REPL's
|
|
156
|
+
// own stdin setup which happens around the same time.
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Consume any early input that was captured.
|
|
161
|
+
* Returns the captured input and clears the buffer.
|
|
162
|
+
* Automatically stops capturing when called.
|
|
163
|
+
*/
|
|
164
|
+
export function consumeEarlyInput(): string {
|
|
165
|
+
stopCapturingEarlyInput()
|
|
166
|
+
const input = earlyInputBuffer.trim()
|
|
167
|
+
earlyInputBuffer = ''
|
|
168
|
+
return input
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Check if there is any early input available without consuming it.
|
|
173
|
+
*/
|
|
174
|
+
export function hasEarlyInput(): boolean {
|
|
175
|
+
return earlyInputBuffer.trim().length > 0
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Seed the early input buffer with text that will appear pre-filled
|
|
180
|
+
* in the prompt input when the REPL renders. Does not auto-submit.
|
|
181
|
+
*/
|
|
182
|
+
export function seedEarlyInput(text: string): void {
|
|
183
|
+
earlyInputBuffer = text
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Check if early input capture is currently active.
|
|
188
|
+
*/
|
|
189
|
+
export function isCapturingEarlyInput(): boolean {
|
|
190
|
+
return isCapturing
|
|
191
|
+
}
|
package/utils/editor.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type SpawnOptions,
|
|
3
|
+
type SpawnSyncOptions,
|
|
4
|
+
spawn,
|
|
5
|
+
spawnSync,
|
|
6
|
+
} from 'child_process'
|
|
7
|
+
import memoize from 'lodash-es/memoize.js'
|
|
8
|
+
import { basename } from 'path'
|
|
9
|
+
import instances from '../ink/instances.js'
|
|
10
|
+
import { logForDebugging } from './debug.js'
|
|
11
|
+
import { whichSync } from './which.js'
|
|
12
|
+
|
|
13
|
+
function isCommandAvailable(command: string): boolean {
|
|
14
|
+
return !!whichSync(command)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// GUI editors that open in a separate window and can be spawned detached
|
|
18
|
+
// without fighting the TUI for stdin. VS Code forks (cursor, windsurf, codium)
|
|
19
|
+
// are listed explicitly since none contain 'code' as a substring.
|
|
20
|
+
const GUI_EDITORS = [
|
|
21
|
+
'code',
|
|
22
|
+
'cursor',
|
|
23
|
+
'windsurf',
|
|
24
|
+
'codium',
|
|
25
|
+
'subl',
|
|
26
|
+
'atom',
|
|
27
|
+
'gedit',
|
|
28
|
+
'notepad++',
|
|
29
|
+
'notepad',
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
// Editors that accept +N as a goto-line argument. The Windows default
|
|
33
|
+
// ('start /wait notepad') does not — notepad treats +42 as a filename.
|
|
34
|
+
const PLUS_N_EDITORS = /\b(vi|vim|nvim|nano|emacs|pico|micro|helix|hx)\b/
|
|
35
|
+
|
|
36
|
+
// VS Code and forks use -g file:line. subl uses bare file:line (no -g).
|
|
37
|
+
const VSCODE_FAMILY = new Set(['code', 'cursor', 'windsurf', 'codium'])
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Classify the editor as GUI or not. Returns the matched GUI family name
|
|
41
|
+
* for goto-line argv selection, or undefined for terminal editors.
|
|
42
|
+
* Note: this is classification only — spawn the user's actual binary, not
|
|
43
|
+
* this return value, so `code-insiders` / absolute paths are preserved.
|
|
44
|
+
*
|
|
45
|
+
* Uses basename so /home/alice/code/bin/nvim doesn't match 'code' via the
|
|
46
|
+
* directory component. code-insiders → still matches 'code', /usr/bin/code →
|
|
47
|
+
* 'code' → matches.
|
|
48
|
+
*/
|
|
49
|
+
export function classifyGuiEditor(editor: string): string | undefined {
|
|
50
|
+
const base = basename(editor.split(' ')[0] ?? '')
|
|
51
|
+
return GUI_EDITORS.find(g => base.includes(g))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Build goto-line argv for a GUI editor. VS Code family uses -g file:line;
|
|
56
|
+
* subl uses bare file:line; others don't support goto-line.
|
|
57
|
+
*/
|
|
58
|
+
function guiGotoArgv(
|
|
59
|
+
guiFamily: string,
|
|
60
|
+
filePath: string,
|
|
61
|
+
line: number | undefined,
|
|
62
|
+
): string[] {
|
|
63
|
+
if (!line) return [filePath]
|
|
64
|
+
if (VSCODE_FAMILY.has(guiFamily)) return ['-g', `${filePath}:${line}`]
|
|
65
|
+
if (guiFamily === 'subl') return [`${filePath}:${line}`]
|
|
66
|
+
return [filePath]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Launch a file in the user's external editor.
|
|
71
|
+
*
|
|
72
|
+
* For GUI editors (code, subl, etc.): spawns detached — the editor opens
|
|
73
|
+
* in a separate window and Claude Code stays interactive.
|
|
74
|
+
*
|
|
75
|
+
* For terminal editors (vim, nvim, nano, etc.): blocks via Ink's alt-screen
|
|
76
|
+
* handoff until the editor exits. This is the same dance as editFileInEditor()
|
|
77
|
+
* in promptEditor.ts, minus the read-back.
|
|
78
|
+
*
|
|
79
|
+
* Returns true if the editor was launched, false if no editor is available.
|
|
80
|
+
*/
|
|
81
|
+
export function openFileInExternalEditor(
|
|
82
|
+
filePath: string,
|
|
83
|
+
line?: number,
|
|
84
|
+
): boolean {
|
|
85
|
+
const editor = getExternalEditor()
|
|
86
|
+
if (!editor) return false
|
|
87
|
+
|
|
88
|
+
// Spawn the user's actual binary (preserves code-insiders, abs paths, etc.).
|
|
89
|
+
// Split into binary + extra args so multi-word values like 'start /wait
|
|
90
|
+
// notepad' or 'code --wait' propagate all tokens to spawn.
|
|
91
|
+
const parts = editor.split(' ')
|
|
92
|
+
const base = parts[0] ?? editor
|
|
93
|
+
const editorArgs = parts.slice(1)
|
|
94
|
+
const guiFamily = classifyGuiEditor(editor)
|
|
95
|
+
|
|
96
|
+
if (guiFamily) {
|
|
97
|
+
const gotoArgv = guiGotoArgv(guiFamily, filePath, line)
|
|
98
|
+
const detachedOpts: SpawnOptions = { detached: true, stdio: 'ignore' }
|
|
99
|
+
let child
|
|
100
|
+
if (process.platform === 'win32') {
|
|
101
|
+
// shell: true on win32 so code.cmd / cursor.cmd / windsurf.cmd resolve —
|
|
102
|
+
// CreateProcess can't execute .cmd/.bat directly. Assemble quoted command
|
|
103
|
+
// string; cmd.exe doesn't expand $() or backticks inside double quotes.
|
|
104
|
+
// Quote each arg so paths with spaces survive the shell join.
|
|
105
|
+
const gotoStr = gotoArgv.map(a => `"${a}"`).join(' ')
|
|
106
|
+
child = spawn(`${editor} ${gotoStr}`, { ...detachedOpts, shell: true })
|
|
107
|
+
} else {
|
|
108
|
+
// POSIX: argv array with no shell — injection-safe. shell: true would
|
|
109
|
+
// expand $() / backticks inside double quotes, and filePath is
|
|
110
|
+
// filesystem-sourced (possible RCE from a malicious repo filename).
|
|
111
|
+
child = spawn(base, [...editorArgs, ...gotoArgv], detachedOpts)
|
|
112
|
+
}
|
|
113
|
+
// spawn() emits ENOENT asynchronously. ENOENT on $VISUAL/$EDITOR is a
|
|
114
|
+
// user-config error, not an internal bug — don't pollute error telemetry.
|
|
115
|
+
child.on('error', e =>
|
|
116
|
+
logForDebugging(`editor spawn failed: ${e}`, { level: 'error' }),
|
|
117
|
+
)
|
|
118
|
+
child.unref()
|
|
119
|
+
return true
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Terminal editor — needs alt-screen handoff since it takes over the
|
|
123
|
+
// terminal. Blocks until the editor exits.
|
|
124
|
+
const inkInstance = instances.get(process.stdout)
|
|
125
|
+
if (!inkInstance) return false
|
|
126
|
+
// Only prepend +N for editors known to support it — notepad treats +42 as a
|
|
127
|
+
// filename to open. Test basename so /home/vim/bin/kak doesn't match 'vim'
|
|
128
|
+
// via the directory segment.
|
|
129
|
+
const useGotoLine = line && PLUS_N_EDITORS.test(basename(base))
|
|
130
|
+
inkInstance.enterAlternateScreen()
|
|
131
|
+
try {
|
|
132
|
+
const syncOpts: SpawnSyncOptions = { stdio: 'inherit' }
|
|
133
|
+
let result
|
|
134
|
+
if (process.platform === 'win32') {
|
|
135
|
+
// On Windows use shell: true so cmd.exe builtins like `start` resolve.
|
|
136
|
+
// shell: true joins args unquoted, so assemble the command string with
|
|
137
|
+
// explicit quoting ourselves (matching promptEditor.ts:74). spawnSync
|
|
138
|
+
// returns errors in .error rather than throwing.
|
|
139
|
+
const lineArg = useGotoLine ? `+${line} ` : ''
|
|
140
|
+
result = spawnSync(`${editor} ${lineArg}"${filePath}"`, {
|
|
141
|
+
...syncOpts,
|
|
142
|
+
shell: true,
|
|
143
|
+
})
|
|
144
|
+
} else {
|
|
145
|
+
// POSIX: spawn directly (no shell), argv array is quote-safe.
|
|
146
|
+
const args = [
|
|
147
|
+
...editorArgs,
|
|
148
|
+
...(useGotoLine ? [`+${line}`, filePath] : [filePath]),
|
|
149
|
+
]
|
|
150
|
+
result = spawnSync(base, args, syncOpts)
|
|
151
|
+
}
|
|
152
|
+
if (result.error) {
|
|
153
|
+
logForDebugging(`editor spawn failed: ${result.error}`, {
|
|
154
|
+
level: 'error',
|
|
155
|
+
})
|
|
156
|
+
return false
|
|
157
|
+
}
|
|
158
|
+
return true
|
|
159
|
+
} finally {
|
|
160
|
+
inkInstance.exitAlternateScreen()
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export const getExternalEditor = memoize((): string | undefined => {
|
|
165
|
+
// Prioritize environment variables
|
|
166
|
+
if (process.env.VISUAL?.trim()) {
|
|
167
|
+
return process.env.VISUAL.trim()
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (process.env.EDITOR?.trim()) {
|
|
171
|
+
return process.env.EDITOR.trim()
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// `isCommandAvailable` breaks the claude process' stdin on Windows
|
|
175
|
+
// as a bandaid, we skip it
|
|
176
|
+
if (process.platform === 'win32') {
|
|
177
|
+
return 'start /wait notepad'
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Search for available editors in order of preference
|
|
181
|
+
const editors = ['code', 'vi', 'nano']
|
|
182
|
+
return editors.find(command => isCommandAvailable(command))
|
|
183
|
+
})
|