@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,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preconnect to the Anthropic API to overlap TCP+TLS handshake with startup.
|
|
3
|
+
*
|
|
4
|
+
* The TCP+TLS handshake is ~100-200ms that normally blocks inside the first
|
|
5
|
+
* API call. Kicking a fire-and-forget fetch during init lets the handshake
|
|
6
|
+
* happen in parallel with action-handler work (~100ms of setup/commands/mcp
|
|
7
|
+
* before the API request in -p mode; unbounded "user is typing" window in
|
|
8
|
+
* interactive mode).
|
|
9
|
+
*
|
|
10
|
+
* Bun's fetch shares a keep-alive connection pool globally, so the real API
|
|
11
|
+
* request reuses the warmed connection.
|
|
12
|
+
*
|
|
13
|
+
* Called from init.ts AFTER applyExtraCACertsFromConfig() + configureGlobalAgents()
|
|
14
|
+
* so settings.json env vars are applied and the TLS cert store is finalized.
|
|
15
|
+
* The early cli.tsx call site was removed — it ran before settings.json loaded,
|
|
16
|
+
* so ANTHROPIC_BASE_URL/proxy/mTLS in settings would be invisible and preconnect
|
|
17
|
+
* would warm the wrong pool (or worse, lock BoringSSL's cert store before
|
|
18
|
+
* NODE_EXTRA_CA_CERTS was applied).
|
|
19
|
+
*
|
|
20
|
+
* Skipped when:
|
|
21
|
+
* - proxy/mTLS/unix socket configured (preconnect would use wrong transport —
|
|
22
|
+
* the SDK passes a custom dispatcher/agent that doesn't share the global pool)
|
|
23
|
+
* - Bedrock/Vertex/Foundry (different endpoints, different auth)
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { getOauthConfig } from '../constants/oauth.js'
|
|
27
|
+
import { isEnvTruthy } from './envUtils.js'
|
|
28
|
+
|
|
29
|
+
let fired = false
|
|
30
|
+
|
|
31
|
+
export function preconnectAnthropicApi(): void {
|
|
32
|
+
if (fired) return
|
|
33
|
+
fired = true
|
|
34
|
+
|
|
35
|
+
// Skip if using a cloud provider — different endpoint + auth
|
|
36
|
+
if (
|
|
37
|
+
isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||
|
|
38
|
+
isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||
|
|
39
|
+
isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)
|
|
40
|
+
) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
// Skip if proxy/mTLS/unix — SDK's custom dispatcher won't reuse this pool
|
|
44
|
+
if (
|
|
45
|
+
process.env.HTTPS_PROXY ||
|
|
46
|
+
process.env.https_proxy ||
|
|
47
|
+
process.env.HTTP_PROXY ||
|
|
48
|
+
process.env.http_proxy ||
|
|
49
|
+
process.env.ANTHROPIC_UNIX_SOCKET ||
|
|
50
|
+
process.env.CLAUDE_CODE_CLIENT_CERT ||
|
|
51
|
+
process.env.CLAUDE_CODE_CLIENT_KEY
|
|
52
|
+
) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Use configured base URL (staging, local, or custom gateway). Covers
|
|
57
|
+
// ANTHROPIC_BASE_URL env + USE_STAGING_OAUTH + USE_LOCAL_OAUTH in one lookup.
|
|
58
|
+
// NODE_EXTRA_CA_CERTS no longer a skip — init.ts applied it before this fires.
|
|
59
|
+
const baseUrl =
|
|
60
|
+
process.env.ANTHROPIC_BASE_URL || getOauthConfig().BASE_API_URL
|
|
61
|
+
|
|
62
|
+
// Fire and forget. HEAD means no response body — the connection is eligible
|
|
63
|
+
// for keep-alive pool reuse immediately after headers arrive. 10s timeout
|
|
64
|
+
// so a slow network doesn't hang the process; abort is fine since the real
|
|
65
|
+
// request will handshake fresh if needed.
|
|
66
|
+
// eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
|
|
67
|
+
void fetch(baseUrl, {
|
|
68
|
+
method: 'HEAD',
|
|
69
|
+
signal: AbortSignal.timeout(10_000),
|
|
70
|
+
}).catch(() => {})
|
|
71
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { stat } from 'fs/promises'
|
|
2
|
+
import { homedir } from 'os'
|
|
3
|
+
import { join } from 'path'
|
|
4
|
+
import { getGlobalConfig, saveGlobalConfig } from './config.js'
|
|
5
|
+
import { execFileNoThrow } from './execFileNoThrow.js'
|
|
6
|
+
import { logError } from './log.js'
|
|
7
|
+
export function markTerminalSetupInProgress(backupPath: string): void {
|
|
8
|
+
saveGlobalConfig(current => ({
|
|
9
|
+
...current,
|
|
10
|
+
appleTerminalSetupInProgress: true,
|
|
11
|
+
appleTerminalBackupPath: backupPath,
|
|
12
|
+
}))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function markTerminalSetupComplete(): void {
|
|
16
|
+
saveGlobalConfig(current => ({
|
|
17
|
+
...current,
|
|
18
|
+
appleTerminalSetupInProgress: false,
|
|
19
|
+
}))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function getTerminalRecoveryInfo(): {
|
|
23
|
+
inProgress: boolean
|
|
24
|
+
backupPath: string | null
|
|
25
|
+
} {
|
|
26
|
+
const config = getGlobalConfig()
|
|
27
|
+
return {
|
|
28
|
+
inProgress: config.appleTerminalSetupInProgress ?? false,
|
|
29
|
+
backupPath: config.appleTerminalBackupPath || null,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getTerminalPlistPath(): string {
|
|
34
|
+
return join(homedir(), 'Library', 'Preferences', 'com.apple.Terminal.plist')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function backupTerminalPreferences(): Promise<string | null> {
|
|
38
|
+
const terminalPlistPath = getTerminalPlistPath()
|
|
39
|
+
const backupPath = `${terminalPlistPath}.bak`
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const { code } = await execFileNoThrow('defaults', [
|
|
43
|
+
'export',
|
|
44
|
+
'com.apple.Terminal',
|
|
45
|
+
terminalPlistPath,
|
|
46
|
+
])
|
|
47
|
+
|
|
48
|
+
if (code !== 0) {
|
|
49
|
+
return null
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
await stat(terminalPlistPath)
|
|
54
|
+
} catch {
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await execFileNoThrow('defaults', [
|
|
59
|
+
'export',
|
|
60
|
+
'com.apple.Terminal',
|
|
61
|
+
backupPath,
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
markTerminalSetupInProgress(backupPath)
|
|
65
|
+
|
|
66
|
+
return backupPath
|
|
67
|
+
} catch (error) {
|
|
68
|
+
logError(error)
|
|
69
|
+
return null
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
type RestoreResult =
|
|
74
|
+
| {
|
|
75
|
+
status: 'restored' | 'no_backup'
|
|
76
|
+
}
|
|
77
|
+
| {
|
|
78
|
+
status: 'failed'
|
|
79
|
+
backupPath: string
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function checkAndRestoreTerminalBackup(): Promise<RestoreResult> {
|
|
83
|
+
const { inProgress, backupPath } = getTerminalRecoveryInfo()
|
|
84
|
+
if (!inProgress) {
|
|
85
|
+
return { status: 'no_backup' }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!backupPath) {
|
|
89
|
+
markTerminalSetupComplete()
|
|
90
|
+
return { status: 'no_backup' }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
await stat(backupPath)
|
|
95
|
+
} catch {
|
|
96
|
+
markTerminalSetupComplete()
|
|
97
|
+
return { status: 'no_backup' }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const { code } = await execFileNoThrow('defaults', [
|
|
102
|
+
'import',
|
|
103
|
+
'com.apple.Terminal',
|
|
104
|
+
backupPath,
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
if (code !== 0) {
|
|
108
|
+
return { status: 'failed', backupPath }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
await execFileNoThrow('killall', ['cfprefsd'])
|
|
112
|
+
|
|
113
|
+
markTerminalSetupComplete()
|
|
114
|
+
return { status: 'restored' }
|
|
115
|
+
} catch (restoreError) {
|
|
116
|
+
logError(
|
|
117
|
+
new Error(
|
|
118
|
+
`Failed to restore Terminal.app settings with: ${restoreError}`,
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
markTerminalSetupComplete()
|
|
122
|
+
return { status: 'failed', backupPath }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for substituting $ARGUMENTS placeholders in skill/command prompts.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - $ARGUMENTS - replaced with the full arguments string
|
|
6
|
+
* - $ARGUMENTS[0], $ARGUMENTS[1], etc. - replaced with individual indexed arguments
|
|
7
|
+
* - $0, $1, etc. - shorthand for $ARGUMENTS[0], $ARGUMENTS[1]
|
|
8
|
+
* - Named arguments (e.g., $foo, $bar) - when argument names are defined in frontmatter
|
|
9
|
+
*
|
|
10
|
+
* Arguments are parsed using shell-quote for proper shell argument handling.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { tryParseShellCommand } from './bash/shellQuote.js'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parse an arguments string into an array of individual arguments.
|
|
17
|
+
* Uses shell-quote for proper shell argument parsing including quoted strings.
|
|
18
|
+
*
|
|
19
|
+
* Examples:
|
|
20
|
+
* - "foo bar baz" => ["foo", "bar", "baz"]
|
|
21
|
+
* - 'foo "hello world" baz' => ["foo", "hello world", "baz"]
|
|
22
|
+
* - "foo 'hello world' baz" => ["foo", "hello world", "baz"]
|
|
23
|
+
*/
|
|
24
|
+
export function parseArguments(args: string): string[] {
|
|
25
|
+
if (!args || !args.trim()) {
|
|
26
|
+
return []
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Return $KEY to preserve variable syntax literally (don't expand variables)
|
|
30
|
+
const result = tryParseShellCommand(args, key => `$${key}`)
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
// Fall back to simple whitespace split if parsing fails
|
|
33
|
+
return args.split(/\s+/).filter(Boolean)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Filter to only string tokens (ignore shell operators, etc.)
|
|
37
|
+
return result.tokens.filter(
|
|
38
|
+
(token): token is string => typeof token === 'string',
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Parse argument names from the frontmatter 'arguments' field.
|
|
44
|
+
* Accepts either a space-separated string or an array of strings.
|
|
45
|
+
*
|
|
46
|
+
* Examples:
|
|
47
|
+
* - "foo bar baz" => ["foo", "bar", "baz"]
|
|
48
|
+
* - ["foo", "bar", "baz"] => ["foo", "bar", "baz"]
|
|
49
|
+
*/
|
|
50
|
+
export function parseArgumentNames(
|
|
51
|
+
argumentNames: string | string[] | undefined,
|
|
52
|
+
): string[] {
|
|
53
|
+
if (!argumentNames) {
|
|
54
|
+
return []
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Filter out empty strings and numeric-only names (which conflict with $0, $1 shorthand)
|
|
58
|
+
const isValidName = (name: string): boolean =>
|
|
59
|
+
typeof name === 'string' && name.trim() !== '' && !/^\d+$/.test(name)
|
|
60
|
+
|
|
61
|
+
if (Array.isArray(argumentNames)) {
|
|
62
|
+
return argumentNames.filter(isValidName)
|
|
63
|
+
}
|
|
64
|
+
if (typeof argumentNames === 'string') {
|
|
65
|
+
return argumentNames.split(/\s+/).filter(isValidName)
|
|
66
|
+
}
|
|
67
|
+
return []
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Generate argument hint showing remaining unfilled args.
|
|
72
|
+
* @param argNames - Array of argument names from frontmatter
|
|
73
|
+
* @param typedArgs - Arguments the user has typed so far
|
|
74
|
+
* @returns Hint string like "[arg2] [arg3]" or undefined if all filled
|
|
75
|
+
*/
|
|
76
|
+
export function generateProgressiveArgumentHint(
|
|
77
|
+
argNames: string[],
|
|
78
|
+
typedArgs: string[],
|
|
79
|
+
): string | undefined {
|
|
80
|
+
const remaining = argNames.slice(typedArgs.length)
|
|
81
|
+
if (remaining.length === 0) return undefined
|
|
82
|
+
return remaining.map(name => `[${name}]`).join(' ')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Substitute $ARGUMENTS placeholders in content with actual argument values.
|
|
87
|
+
*
|
|
88
|
+
* @param content - The content containing placeholders
|
|
89
|
+
* @param args - The raw arguments string (may be undefined/null)
|
|
90
|
+
* @param appendIfNoPlaceholder - If true and no placeholders are found, appends "ARGUMENTS: {args}" to content
|
|
91
|
+
* @param argumentNames - Optional array of named arguments (e.g., ["foo", "bar"]) that map to indexed positions
|
|
92
|
+
* @returns The content with placeholders substituted
|
|
93
|
+
*/
|
|
94
|
+
export function substituteArguments(
|
|
95
|
+
content: string,
|
|
96
|
+
args: string | undefined,
|
|
97
|
+
appendIfNoPlaceholder = true,
|
|
98
|
+
argumentNames: string[] = [],
|
|
99
|
+
): string {
|
|
100
|
+
// undefined/null means no args provided - return content unchanged
|
|
101
|
+
// empty string is a valid input that should replace placeholders with empty
|
|
102
|
+
if (args === undefined || args === null) {
|
|
103
|
+
return content
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const parsedArgs = parseArguments(args)
|
|
107
|
+
const originalContent = content
|
|
108
|
+
|
|
109
|
+
// Replace named arguments (e.g., $foo, $bar) with their values
|
|
110
|
+
// Named arguments map to positions: argumentNames[0] -> parsedArgs[0], etc.
|
|
111
|
+
for (let i = 0; i < argumentNames.length; i++) {
|
|
112
|
+
const name = argumentNames[i]
|
|
113
|
+
if (!name) continue
|
|
114
|
+
|
|
115
|
+
// Match $name but not $name[...] or $nameXxx (word chars)
|
|
116
|
+
// Also ensure we match word boundaries to avoid partial matches
|
|
117
|
+
content = content.replace(
|
|
118
|
+
new RegExp(`\\$${name}(?![\\[\\w])`, 'g'),
|
|
119
|
+
parsedArgs[i] ?? '',
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Replace indexed arguments ($ARGUMENTS[0], $ARGUMENTS[1], etc.)
|
|
124
|
+
content = content.replace(/\$ARGUMENTS\[(\d+)\]/g, (_, indexStr: string) => {
|
|
125
|
+
const index = parseInt(indexStr, 10)
|
|
126
|
+
return parsedArgs[index] ?? ''
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
// Replace shorthand indexed arguments ($0, $1, etc.)
|
|
130
|
+
content = content.replace(/\$(\d+)(?!\w)/g, (_, indexStr: string) => {
|
|
131
|
+
const index = parseInt(indexStr, 10)
|
|
132
|
+
return parsedArgs[index] ?? ''
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
// Replace $ARGUMENTS with the full arguments string
|
|
136
|
+
content = content.replaceAll('$ARGUMENTS', args)
|
|
137
|
+
|
|
138
|
+
// If no placeholders were found and appendIfNoPlaceholder is true, append
|
|
139
|
+
// But only if args is non-empty (empty string means command invoked with no args)
|
|
140
|
+
if (content === originalContent && appendIfNoPlaceholder && args) {
|
|
141
|
+
content = content + `\n\nARGUMENTS: ${args}`
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return content
|
|
145
|
+
}
|
package/utils/array.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function intersperse<A>(as: A[], separator: (index: number) => A): A[] {
|
|
2
|
+
return as.flatMap((a, i) => (i ? [separator(i), a] : [a]))
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function count<T>(arr: readonly T[], pred: (x: T) => unknown): number {
|
|
6
|
+
let n = 0
|
|
7
|
+
for (const x of arr) n += +!!pred(x)
|
|
8
|
+
return n
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function uniq<T>(xs: Iterable<T>): T[] {
|
|
12
|
+
return [...new Set(xs)]
|
|
13
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { appendFile, rename } from 'fs/promises'
|
|
2
|
+
import { basename, dirname, join } from 'path'
|
|
3
|
+
import { getOriginalCwd, getSessionId } from '../bootstrap/state.js'
|
|
4
|
+
import { createBufferedWriter } from './bufferedWriter.js'
|
|
5
|
+
import { registerCleanup } from './cleanupRegistry.js'
|
|
6
|
+
import { logForDebugging } from './debug.js'
|
|
7
|
+
import { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'
|
|
8
|
+
import { getFsImplementation } from './fsOperations.js'
|
|
9
|
+
import { sanitizePath } from './path.js'
|
|
10
|
+
import { jsonStringify } from './slowOperations.js'
|
|
11
|
+
|
|
12
|
+
// Mutable recording state — filePath is updated when session ID changes (e.g., --resume)
|
|
13
|
+
const recordingState: { filePath: string | null; timestamp: number } = {
|
|
14
|
+
filePath: null,
|
|
15
|
+
timestamp: 0,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get the asciicast recording file path.
|
|
20
|
+
* For ants with CLAUDE_CODE_TERMINAL_RECORDING=1: returns a path.
|
|
21
|
+
* Otherwise: returns null.
|
|
22
|
+
* The path is computed once and cached in recordingState.
|
|
23
|
+
*/
|
|
24
|
+
export function getRecordFilePath(): string | null {
|
|
25
|
+
if (recordingState.filePath !== null) {
|
|
26
|
+
return recordingState.filePath
|
|
27
|
+
}
|
|
28
|
+
if (process.env.USER_TYPE !== 'ant') {
|
|
29
|
+
return null
|
|
30
|
+
}
|
|
31
|
+
if (!isEnvTruthy(process.env.CLAUDE_CODE_TERMINAL_RECORDING)) {
|
|
32
|
+
return null
|
|
33
|
+
}
|
|
34
|
+
// Record alongside the transcript.
|
|
35
|
+
// Each launch gets its own file so --continue produces multiple recordings.
|
|
36
|
+
const projectsDir = join(getClaudeConfigHomeDir(), 'projects')
|
|
37
|
+
const projectDir = join(projectsDir, sanitizePath(getOriginalCwd()))
|
|
38
|
+
recordingState.timestamp = Date.now()
|
|
39
|
+
recordingState.filePath = join(
|
|
40
|
+
projectDir,
|
|
41
|
+
`${getSessionId()}-${recordingState.timestamp}.cast`,
|
|
42
|
+
)
|
|
43
|
+
return recordingState.filePath
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function _resetRecordingStateForTesting(): void {
|
|
47
|
+
recordingState.filePath = null
|
|
48
|
+
recordingState.timestamp = 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Find all .cast files for the current session.
|
|
53
|
+
* Returns paths sorted by filename (chronological by timestamp suffix).
|
|
54
|
+
*/
|
|
55
|
+
export function getSessionRecordingPaths(): string[] {
|
|
56
|
+
const sessionId = getSessionId()
|
|
57
|
+
const projectsDir = join(getClaudeConfigHomeDir(), 'projects')
|
|
58
|
+
const projectDir = join(projectsDir, sanitizePath(getOriginalCwd()))
|
|
59
|
+
try {
|
|
60
|
+
// eslint-disable-next-line custom-rules/no-sync-fs -- called during /share before upload, not in hot path
|
|
61
|
+
const entries = getFsImplementation().readdirSync(projectDir)
|
|
62
|
+
const names = (
|
|
63
|
+
typeof entries[0] === 'string'
|
|
64
|
+
? entries
|
|
65
|
+
: (entries as { name: string }[]).map(e => e.name)
|
|
66
|
+
) as string[]
|
|
67
|
+
const files = names
|
|
68
|
+
.filter(f => f.startsWith(sessionId) && f.endsWith('.cast'))
|
|
69
|
+
.sort()
|
|
70
|
+
return files.map(f => join(projectDir, f))
|
|
71
|
+
} catch {
|
|
72
|
+
return []
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Rename the recording file to match the current session ID.
|
|
78
|
+
* Called after --resume/--continue changes the session ID via switchSession().
|
|
79
|
+
* The recorder was installed with the initial (random) session ID; this renames
|
|
80
|
+
* the file so getSessionRecordingPaths() can find it by the resumed session ID.
|
|
81
|
+
*/
|
|
82
|
+
export async function renameRecordingForSession(): Promise<void> {
|
|
83
|
+
const oldPath = recordingState.filePath
|
|
84
|
+
if (!oldPath || recordingState.timestamp === 0) {
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
const projectsDir = join(getClaudeConfigHomeDir(), 'projects')
|
|
88
|
+
const projectDir = join(projectsDir, sanitizePath(getOriginalCwd()))
|
|
89
|
+
const newPath = join(
|
|
90
|
+
projectDir,
|
|
91
|
+
`${getSessionId()}-${recordingState.timestamp}.cast`,
|
|
92
|
+
)
|
|
93
|
+
if (oldPath === newPath) {
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
// Flush pending writes before renaming
|
|
97
|
+
await recorder?.flush()
|
|
98
|
+
const oldName = basename(oldPath)
|
|
99
|
+
const newName = basename(newPath)
|
|
100
|
+
try {
|
|
101
|
+
await rename(oldPath, newPath)
|
|
102
|
+
recordingState.filePath = newPath
|
|
103
|
+
logForDebugging(`[asciicast] Renamed recording: ${oldName} → ${newName}`)
|
|
104
|
+
} catch {
|
|
105
|
+
logForDebugging(
|
|
106
|
+
`[asciicast] Failed to rename recording from ${oldName} to ${newName}`,
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
type AsciicastRecorder = {
|
|
112
|
+
flush(): Promise<void>
|
|
113
|
+
dispose(): Promise<void>
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let recorder: AsciicastRecorder | null = null
|
|
117
|
+
|
|
118
|
+
function getTerminalSize(): { cols: number; rows: number } {
|
|
119
|
+
// Direct access to stdout dimensions — not in a React component
|
|
120
|
+
// eslint-disable-next-line custom-rules/prefer-use-terminal-size
|
|
121
|
+
const cols = process.stdout.columns || 80
|
|
122
|
+
// eslint-disable-next-line custom-rules/prefer-use-terminal-size
|
|
123
|
+
const rows = process.stdout.rows || 24
|
|
124
|
+
return { cols, rows }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Flush pending recording data to disk.
|
|
129
|
+
* Call before reading the .cast file (e.g., during /share).
|
|
130
|
+
*/
|
|
131
|
+
export async function flushAsciicastRecorder(): Promise<void> {
|
|
132
|
+
await recorder?.flush()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Install the asciicast recorder.
|
|
137
|
+
* Wraps process.stdout.write to capture all terminal output with timestamps.
|
|
138
|
+
* Must be called before Ink mounts.
|
|
139
|
+
*/
|
|
140
|
+
export function installAsciicastRecorder(): void {
|
|
141
|
+
const filePath = getRecordFilePath()
|
|
142
|
+
if (!filePath) {
|
|
143
|
+
return
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const { cols, rows } = getTerminalSize()
|
|
147
|
+
const startTime = performance.now()
|
|
148
|
+
|
|
149
|
+
// Write the asciicast v2 header
|
|
150
|
+
const header = jsonStringify({
|
|
151
|
+
version: 2,
|
|
152
|
+
width: cols,
|
|
153
|
+
height: rows,
|
|
154
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
155
|
+
env: {
|
|
156
|
+
SHELL: process.env.SHELL || '',
|
|
157
|
+
TERM: process.env.TERM || '',
|
|
158
|
+
},
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
// eslint-disable-next-line custom-rules/no-sync-fs -- one-time init before Ink mounts
|
|
163
|
+
getFsImplementation().mkdirSync(dirname(filePath))
|
|
164
|
+
} catch {
|
|
165
|
+
// Directory may already exist
|
|
166
|
+
}
|
|
167
|
+
// eslint-disable-next-line custom-rules/no-sync-fs -- one-time init before Ink mounts
|
|
168
|
+
getFsImplementation().appendFileSync(filePath, header + '\n', { mode: 0o600 })
|
|
169
|
+
|
|
170
|
+
let pendingWrite: Promise<void> = Promise.resolve()
|
|
171
|
+
|
|
172
|
+
const writer = createBufferedWriter({
|
|
173
|
+
writeFn(content: string) {
|
|
174
|
+
// Use recordingState.filePath (mutable) so writes follow renames from --resume
|
|
175
|
+
const currentPath = recordingState.filePath
|
|
176
|
+
if (!currentPath) {
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
pendingWrite = pendingWrite
|
|
180
|
+
.then(() => appendFile(currentPath, content))
|
|
181
|
+
.catch(() => {
|
|
182
|
+
// Silently ignore write errors — don't break the session
|
|
183
|
+
})
|
|
184
|
+
},
|
|
185
|
+
flushIntervalMs: 500,
|
|
186
|
+
maxBufferSize: 50,
|
|
187
|
+
maxBufferBytes: 10 * 1024 * 1024, // 10MB
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
// Wrap process.stdout.write to capture output
|
|
191
|
+
const originalWrite = process.stdout.write.bind(
|
|
192
|
+
process.stdout,
|
|
193
|
+
) as typeof process.stdout.write
|
|
194
|
+
process.stdout.write = function (
|
|
195
|
+
chunk: string | Uint8Array,
|
|
196
|
+
encodingOrCb?: BufferEncoding | ((err?: Error) => void),
|
|
197
|
+
cb?: (err?: Error) => void,
|
|
198
|
+
): boolean {
|
|
199
|
+
// Record the output event
|
|
200
|
+
const elapsed = (performance.now() - startTime) / 1000
|
|
201
|
+
const text =
|
|
202
|
+
typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf-8')
|
|
203
|
+
writer.write(jsonStringify([elapsed, 'o', text]) + '\n')
|
|
204
|
+
|
|
205
|
+
// Pass through to the real stdout
|
|
206
|
+
if (typeof encodingOrCb === 'function') {
|
|
207
|
+
return originalWrite(chunk, encodingOrCb)
|
|
208
|
+
}
|
|
209
|
+
return originalWrite(chunk, encodingOrCb, cb)
|
|
210
|
+
} as typeof process.stdout.write
|
|
211
|
+
|
|
212
|
+
// Handle terminal resize events
|
|
213
|
+
function onResize(): void {
|
|
214
|
+
const elapsed = (performance.now() - startTime) / 1000
|
|
215
|
+
const { cols: newCols, rows: newRows } = getTerminalSize()
|
|
216
|
+
writer.write(jsonStringify([elapsed, 'r', `${newCols}x${newRows}`]) + '\n')
|
|
217
|
+
}
|
|
218
|
+
process.stdout.on('resize', onResize)
|
|
219
|
+
|
|
220
|
+
recorder = {
|
|
221
|
+
async flush(): Promise<void> {
|
|
222
|
+
writer.flush()
|
|
223
|
+
await pendingWrite
|
|
224
|
+
},
|
|
225
|
+
async dispose(): Promise<void> {
|
|
226
|
+
writer.dispose()
|
|
227
|
+
await pendingWrite
|
|
228
|
+
process.stdout.removeListener('resize', onResize)
|
|
229
|
+
process.stdout.write = originalWrite
|
|
230
|
+
},
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
registerCleanup(async () => {
|
|
234
|
+
await recorder?.dispose()
|
|
235
|
+
recorder = null
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
logForDebugging(`[asciicast] Recording to ${filePath}`)
|
|
239
|
+
}
|