@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,98 @@
|
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
|
+
import stripAnsi from 'strip-ansi';
|
|
3
|
+
import { Messages } from '../components/Messages.js';
|
|
4
|
+
import { KeybindingProvider } from '../keybindings/KeybindingContext.js';
|
|
5
|
+
import { loadKeybindingsSyncWithWarnings } from '../keybindings/loadUserBindings.js';
|
|
6
|
+
import type { KeybindingContextName } from '../keybindings/types.js';
|
|
7
|
+
import { AppStateProvider } from '../state/AppState.js';
|
|
8
|
+
import type { Tools } from '../Tool.js';
|
|
9
|
+
import type { Message } from '../types/message.js';
|
|
10
|
+
import { renderToAnsiString } from './staticRender.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Minimal keybinding provider for static/headless renders.
|
|
14
|
+
* Provides keybinding context without the ChordInterceptor (which uses useInput
|
|
15
|
+
* and would hang in headless renders with no stdin).
|
|
16
|
+
*/
|
|
17
|
+
function StaticKeybindingProvider({
|
|
18
|
+
children
|
|
19
|
+
}: {
|
|
20
|
+
children: React.ReactNode;
|
|
21
|
+
}): React.ReactNode {
|
|
22
|
+
const {
|
|
23
|
+
bindings
|
|
24
|
+
} = loadKeybindingsSyncWithWarnings();
|
|
25
|
+
const pendingChordRef = useRef(null);
|
|
26
|
+
const handlerRegistryRef = useRef(new Map());
|
|
27
|
+
const activeContexts = useRef(new Set<KeybindingContextName>()).current;
|
|
28
|
+
return <KeybindingProvider bindings={bindings} pendingChordRef={pendingChordRef} pendingChord={null} setPendingChord={() => {}} activeContexts={activeContexts} registerActiveContext={() => {}} unregisterActiveContext={() => {}} handlerRegistryRef={handlerRegistryRef}>
|
|
29
|
+
{children}
|
|
30
|
+
</KeybindingProvider>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Upper-bound how many NormalizedMessages a Message can produce.
|
|
34
|
+
// normalizeMessages splits one Message with N content blocks into N
|
|
35
|
+
// NormalizedMessages — 1:1 with block count. String content = 1 block.
|
|
36
|
+
// AttachmentMessage etc. have no .message and normalize to ≤1.
|
|
37
|
+
function normalizedUpperBound(m: Message): number {
|
|
38
|
+
if (!('message' in m)) return 1;
|
|
39
|
+
const c = m.message.content;
|
|
40
|
+
return Array.isArray(c) ? c.length : 1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Streams rendered messages in chunks, ANSI codes preserved. Each chunk is a
|
|
45
|
+
* fresh renderToAnsiString — yoga layout tree + Ink's screen buffer are sized
|
|
46
|
+
* to the tallest CHUNK instead of the full session. Measured (Mar 2026,
|
|
47
|
+
* 538-msg session): −55% plateau RSS vs a single full render. The sink owns
|
|
48
|
+
* the output — write to stdout for `[` dump-to-scrollback, appendFile for `v`.
|
|
49
|
+
*
|
|
50
|
+
* Messages.renderRange slices AFTER normalize→group→collapse, so tool-call
|
|
51
|
+
* grouping stays correct across chunk seams; buildMessageLookups runs on
|
|
52
|
+
* the full normalized array so tool_use↔tool_result resolves regardless of
|
|
53
|
+
* which chunk each landed in.
|
|
54
|
+
*/
|
|
55
|
+
export async function streamRenderedMessages(messages: Message[], tools: Tools, sink: (ansiChunk: string) => void | Promise<void>, {
|
|
56
|
+
columns,
|
|
57
|
+
verbose = false,
|
|
58
|
+
chunkSize = 40,
|
|
59
|
+
onProgress
|
|
60
|
+
}: {
|
|
61
|
+
columns?: number;
|
|
62
|
+
verbose?: boolean;
|
|
63
|
+
chunkSize?: number;
|
|
64
|
+
onProgress?: (rendered: number) => void;
|
|
65
|
+
} = {}): Promise<void> {
|
|
66
|
+
const renderChunk = (range: readonly [number, number]) => renderToAnsiString(<AppStateProvider>
|
|
67
|
+
<StaticKeybindingProvider>
|
|
68
|
+
<Messages messages={messages} tools={tools} commands={[]} verbose={verbose} toolJSX={null} toolUseConfirmQueue={[]} inProgressToolUseIDs={new Set()} isMessageSelectorVisible={false} conversationId="export" screen="prompt" streamingToolUses={[]} showAllInTranscript={true} isLoading={false} renderRange={range} />
|
|
69
|
+
</StaticKeybindingProvider>
|
|
70
|
+
</AppStateProvider>, columns);
|
|
71
|
+
|
|
72
|
+
// renderRange indexes into the post-collapse array whose length we can't
|
|
73
|
+
// see from here — normalize splits each Message into one NormalizedMessage
|
|
74
|
+
// per content block (unbounded per message), collapse merges some back.
|
|
75
|
+
// Ceiling is the exact normalize output count + chunkSize so the loop
|
|
76
|
+
// always reaches the empty slice where break fires (collapse only shrinks).
|
|
77
|
+
let ceiling = chunkSize;
|
|
78
|
+
for (const m of messages) ceiling += normalizedUpperBound(m);
|
|
79
|
+
for (let offset = 0; offset < ceiling; offset += chunkSize) {
|
|
80
|
+
const ansi = await renderChunk([offset, offset + chunkSize]);
|
|
81
|
+
if (stripAnsi(ansi).trim() === '') break;
|
|
82
|
+
await sink(ansi);
|
|
83
|
+
onProgress?.(offset + chunkSize);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Renders messages to a plain text string suitable for export.
|
|
89
|
+
* Uses the same React rendering logic as the interactive UI.
|
|
90
|
+
*/
|
|
91
|
+
export async function renderMessagesToPlainText(messages: Message[], tools: Tools = [], columns?: number): Promise<string> {
|
|
92
|
+
const parts: string[] = [];
|
|
93
|
+
await streamRenderedMessages(messages, tools, chunk => void parts.push(stripAnsi(chunk)), {
|
|
94
|
+
columns
|
|
95
|
+
});
|
|
96
|
+
return parts.join('');
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVJlZiIsInN0cmlwQW5zaSIsIk1lc3NhZ2VzIiwiS2V5YmluZGluZ1Byb3ZpZGVyIiwibG9hZEtleWJpbmRpbmdzU3luY1dpdGhXYXJuaW5ncyIsIktleWJpbmRpbmdDb250ZXh0TmFtZSIsIkFwcFN0YXRlUHJvdmlkZXIiLCJUb29scyIsIk1lc3NhZ2UiLCJyZW5kZXJUb0Fuc2lTdHJpbmciLCJTdGF0aWNLZXliaW5kaW5nUHJvdmlkZXIiLCJjaGlsZHJlbiIsIlJlYWN0Tm9kZSIsImJpbmRpbmdzIiwicGVuZGluZ0Nob3JkUmVmIiwiaGFuZGxlclJlZ2lzdHJ5UmVmIiwiTWFwIiwiYWN0aXZlQ29udGV4dHMiLCJTZXQiLCJjdXJyZW50Iiwibm9ybWFsaXplZFVwcGVyQm91bmQiLCJtIiwiYyIsIm1lc3NhZ2UiLCJjb250ZW50IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic3RyZWFtUmVuZGVyZWRNZXNzYWdlcyIsIm1lc3NhZ2VzIiwidG9vbHMiLCJzaW5rIiwiYW5zaUNodW5rIiwiUHJvbWlzZSIsImNvbHVtbnMiLCJ2ZXJib3NlIiwiY2h1bmtTaXplIiwib25Qcm9ncmVzcyIsInJlbmRlcmVkIiwicmVuZGVyQ2h1bmsiLCJyYW5nZSIsImNlaWxpbmciLCJvZmZzZXQiLCJhbnNpIiwidHJpbSIsInJlbmRlck1lc3NhZ2VzVG9QbGFpblRleHQiLCJwYXJ0cyIsImNodW5rIiwicHVzaCIsImpvaW4iXSwic291cmNlcyI6WyJleHBvcnRSZW5kZXJlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHN0cmlwQW5zaSBmcm9tICdzdHJpcC1hbnNpJ1xuaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc3NhZ2VzLmpzJ1xuaW1wb3J0IHsgS2V5YmluZGluZ1Byb3ZpZGVyIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvS2V5YmluZGluZ0NvbnRleHQuanMnXG5pbXBvcnQgeyBsb2FkS2V5YmluZGluZ3NTeW5jV2l0aFdhcm5pbmdzIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvbG9hZFVzZXJCaW5kaW5ncy5qcydcbmltcG9ydCB0eXBlIHsgS2V5YmluZGluZ0NvbnRleHROYW1lIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvdHlwZXMuanMnXG5pbXBvcnQgeyBBcHBTdGF0ZVByb3ZpZGVyIH0gZnJvbSAnLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgdHlwZSB7IFRvb2xzIH0gZnJvbSAnLi4vVG9vbC5qcydcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyByZW5kZXJUb0Fuc2lTdHJpbmcgfSBmcm9tICcuL3N0YXRpY1JlbmRlci5qcydcblxuLyoqXG4gKiBNaW5pbWFsIGtleWJpbmRpbmcgcHJvdmlkZXIgZm9yIHN0YXRpYy9oZWFkbGVzcyByZW5kZXJzLlxuICogUHJvdmlkZXMga2V5YmluZGluZyBjb250ZXh0IHdpdGhvdXQgdGhlIENob3JkSW50ZXJjZXB0b3IgKHdoaWNoIHVzZXMgdXNlSW5wdXRcbiAqIGFuZCB3b3VsZCBoYW5nIGluIGhlYWRsZXNzIHJlbmRlcnMgd2l0aCBubyBzdGRpbikuXG4gKi9cbmZ1bmN0aW9uIFN0YXRpY0tleWJpbmRpbmdQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBiaW5kaW5ncyB9ID0gbG9hZEtleWJpbmRpbmdzU3luY1dpdGhXYXJuaW5ncygpXG4gIGNvbnN0IHBlbmRpbmdDaG9yZFJlZiA9IHVzZVJlZihudWxsKVxuICBjb25zdCBoYW5kbGVyUmVnaXN0cnlSZWYgPSB1c2VSZWYobmV3IE1hcCgpKVxuICBjb25zdCBhY3RpdmVDb250ZXh0cyA9IHVzZVJlZihuZXcgU2V0PEtleWJpbmRpbmdDb250ZXh0TmFtZT4oKSkuY3VycmVudFxuXG4gIHJldHVybiAoXG4gICAgPEtleWJpbmRpbmdQcm92aWRlclxuICAgICAgYmluZGluZ3M9e2JpbmRpbmdzfVxuICAgICAgcGVuZGluZ0Nob3JkUmVmPXtwZW5kaW5nQ2hvcmRSZWZ9XG4gICAgICBwZW5kaW5nQ2hvcmQ9e251bGx9XG4gICAgICBzZXRQZW5kaW5nQ2hvcmQ9eygpID0+IHt9fVxuICAgICAgYWN0aXZlQ29udGV4dHM9e2FjdGl2ZUNvbnRleHRzfVxuICAgICAgcmVnaXN0ZXJBY3RpdmVDb250ZXh0PXsoKSA9PiB7fX1cbiAgICAgIHVucmVnaXN0ZXJBY3RpdmVDb250ZXh0PXsoKSA9PiB7fX1cbiAgICAgIGhhbmRsZXJSZWdpc3RyeVJlZj17aGFuZGxlclJlZ2lzdHJ5UmVmfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0tleWJpbmRpbmdQcm92aWRlcj5cbiAgKVxufVxuXG4vLyBVcHBlci1ib3VuZCBob3cgbWFueSBOb3JtYWxpemVkTWVzc2FnZXMgYSBNZXNzYWdlIGNhbiBwcm9kdWNlLlxuLy8gbm9ybWFsaXplTWVzc2FnZXMgc3BsaXRzIG9uZSBNZXNzYWdlIHdpdGggTiBjb250ZW50IGJsb2NrcyBpbnRvIE5cbi8vIE5vcm1hbGl6ZWRNZXNzYWdlcyDigJQgMToxIHdpdGggYmxvY2sgY291bnQuIFN0cmluZyBjb250ZW50ID0gMSBibG9jay5cbi8vIEF0dGFjaG1lbnRNZXNzYWdlIGV0Yy4gaGF2ZSBubyAubWVzc2FnZSBhbmQgbm9ybWFsaXplIHRvIOKJpDEuXG5mdW5jdGlvbiBub3JtYWxpemVkVXBwZXJCb3VuZChtOiBNZXNzYWdlKTogbnVtYmVyIHtcbiAgaWYgKCEoJ21lc3NhZ2UnIGluIG0pKSByZXR1cm4gMVxuICBjb25zdCBjID0gbS5tZXNzYWdlLmNvbnRlbnRcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYykgPyBjLmxlbmd0aCA6IDFcbn1cblxuLyoqXG4gKiBTdHJlYW1zIHJlbmRlcmVkIG1lc3NhZ2VzIGluIGNodW5rcywgQU5TSSBjb2RlcyBwcmVzZXJ2ZWQuIEVhY2ggY2h1bmsgaXMgYVxuICogZnJlc2ggcmVuZGVyVG9BbnNpU3RyaW5nIOKAlCB5b2dhIGxheW91dCB0cmVlICsgSW5rJ3Mgc2NyZWVuIGJ1ZmZlciBhcmUgc2l6ZWRcbiAqIHRvIHRoZSB0YWxsZXN0IENIVU5LIGluc3RlYWQgb2YgdGhlIGZ1bGwgc2Vzc2lvbi4gTWVhc3VyZWQgKE1hciAyMDI2LFxuICogNTM4LW1zZyBzZXNzaW9uKTog4oiSNTUlIHBsYXRlYXUgUlNTIHZzIGEgc2luZ2xlIGZ1bGwgcmVuZGVyLiBUaGUgc2luayBvd25zXG4gKiB0aGUgb3V0cHV0IOKAlCB3cml0ZSB0byBzdGRvdXQgZm9yIGBbYCBkdW1wLXRvLXNjcm9sbGJhY2ssIGFwcGVuZEZpbGUgZm9yIGB2YC5cbiAqXG4gKiBNZXNzYWdlcy5yZW5kZXJSYW5nZSBzbGljZXMgQUZURVIgbm9ybWFsaXpl4oaSZ3JvdXDihpJjb2xsYXBzZSwgc28gdG9vbC1jYWxsXG4gKiBncm91cGluZyBzdGF5cyBjb3JyZWN0IGFjcm9zcyBjaHVuayBzZWFtczsgYnVpbGRNZXNzYWdlTG9va3VwcyBydW5zIG9uXG4gKiB0aGUgZnVsbCBub3JtYWxpemVkIGFycmF5IHNvIHRvb2xfdXNl4oaUdG9vbF9yZXN1bHQgcmVzb2x2ZXMgcmVnYXJkbGVzcyBvZlxuICogd2hpY2ggY2h1bmsgZWFjaCBsYW5kZWQgaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1SZW5kZXJlZE1lc3NhZ2VzKFxuICBtZXNzYWdlczogTWVzc2FnZVtdLFxuICB0b29sczogVG9vbHMsXG4gIHNpbms6IChhbnNpQ2h1bms6IHN0cmluZykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4gIHtcbiAgICBjb2x1bW5zLFxuICAgIHZlcmJvc2UgPSBmYWxzZSxcbiAgICBjaHVua1NpemUgPSA0MCxcbiAgICBvblByb2dyZXNzLFxuICB9OiB7XG4gICAgY29sdW1ucz86IG51bWJlclxuICAgIHZlcmJvc2U/OiBib29sZWFuXG4gICAgY2h1bmtTaXplPzogbnVtYmVyXG4gICAgb25Qcm9ncmVzcz86IChyZW5kZXJlZDogbnVtYmVyKSA9PiB2b2lkXG4gIH0gPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW5kZXJDaHVuayA9IChyYW5nZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSkgPT5cbiAgICByZW5kZXJUb0Fuc2lTdHJpbmcoXG4gICAgICA8QXBwU3RhdGVQcm92aWRlcj5cbiAgICAgICAgPFN0YXRpY0tleWJpbmRpbmdQcm92aWRlcj5cbiAgICAgICAgICA8TWVzc2FnZXNcbiAgICAgICAgICAgIG1lc3NhZ2VzPXttZXNzYWdlc31cbiAgICAgICAgICAgIHRvb2xzPXt0b29sc31cbiAgICAgICAgICAgIGNvbW1hbmRzPXtbXX1cbiAgICAgICAgICAgIHZlcmJvc2U9e3ZlcmJvc2V9XG4gICAgICAgICAgICB0b29sSlNYPXtudWxsfVxuICAgICAgICAgICAgdG9vbFVzZUNvbmZpcm1RdWV1ZT17W119XG4gICAgICAgICAgICBpblByb2dyZXNzVG9vbFVzZUlEcz17bmV3IFNldCgpfVxuICAgICAgICAgICAgaXNNZXNzYWdlU2VsZWN0b3JWaXNpYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkPVwiZXhwb3J0XCJcbiAgICAgICAgICAgIHNjcmVlbj1cInByb21wdFwiXG4gICAgICAgICAgICBzdHJlYW1pbmdUb29sVXNlcz17W119XG4gICAgICAgICAgICBzaG93QWxsSW5UcmFuc2NyaXB0PXt0cnVlfVxuICAgICAgICAgICAgaXNMb2FkaW5nPXtmYWxzZX1cbiAgICAgICAgICAgIHJlbmRlclJhbmdlPXtyYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0YXRpY0tleWJpbmRpbmdQcm92aWRlcj5cbiAgICAgIDwvQXBwU3RhdGVQcm92aWRlcj4sXG4gICAgICBjb2x1bW5zLFxuICAgIClcblxuICAvLyByZW5kZXJSYW5nZSBpbmRleGVzIGludG8gdGhlIHBvc3QtY29sbGFwc2UgYXJyYXkgd2hvc2UgbGVuZ3RoIHdlIGNhbid0XG4gIC8vIHNlZSBmcm9tIGhlcmUg4oCUIG5vcm1hbGl6ZSBzcGxpdHMgZWFjaCBNZXNzYWdlIGludG8gb25lIE5vcm1hbGl6ZWRNZXNzYWdlXG4gIC8vIHBlciBjb250ZW50IGJsb2NrICh1bmJvdW5kZWQgcGVyIG1lc3NhZ2UpLCBjb2xsYXBzZSBtZXJnZXMgc29tZSBiYWNrLlxuICAvLyBDZWlsaW5nIGlzIHRoZSBleGFjdCBub3JtYWxpemUgb3V0cHV0IGNvdW50ICsgY2h1bmtTaXplIHNvIHRoZSBsb29wXG4gIC8vIGFsd2F5cyByZWFjaGVzIHRoZSBlbXB0eSBzbGljZSB3aGVyZSBicmVhayBmaXJlcyAoY29sbGFwc2Ugb25seSBzaHJpbmtzKS5cbiAgbGV0IGNlaWxpbmcgPSBjaHVua1NpemVcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSBjZWlsaW5nICs9IG5vcm1hbGl6ZWRVcHBlckJvdW5kKG0pXG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGNlaWxpbmc7IG9mZnNldCArPSBjaHVua1NpemUpIHtcbiAgICBjb25zdCBhbnNpID0gYXdhaXQgcmVuZGVyQ2h1bmsoW29mZnNldCwgb2Zmc2V0ICsgY2h1bmtTaXplXSlcbiAgICBpZiAoc3RyaXBBbnNpKGFuc2kpLnRyaW0oKSA9PT0gJycpIGJyZWFrXG4gICAgYXdhaXQgc2luayhhbnNpKVxuICAgIG9uUHJvZ3Jlc3M/LihvZmZzZXQgKyBjaHVua1NpemUpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG1lc3NhZ2VzIHRvIGEgcGxhaW4gdGV4dCBzdHJpbmcgc3VpdGFibGUgZm9yIGV4cG9ydC5cbiAqIFVzZXMgdGhlIHNhbWUgUmVhY3QgcmVuZGVyaW5nIGxvZ2ljIGFzIHRoZSBpbnRlcmFjdGl2ZSBVSS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlck1lc3NhZ2VzVG9QbGFpblRleHQoXG4gIG1lc3NhZ2VzOiBNZXNzYWdlW10sXG4gIHRvb2xzOiBUb29scyA9IFtdLFxuICBjb2x1bW5zPzogbnVtYmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW11cbiAgYXdhaXQgc3RyZWFtUmVuZGVyZWRNZXNzYWdlcyhcbiAgICBtZXNzYWdlcyxcbiAgICB0b29scyxcbiAgICBjaHVuayA9PiB2b2lkIHBhcnRzLnB1c2goc3RyaXBBbnNpKGNodW5rKSksXG4gICAgeyBjb2x1bW5zIH0sXG4gIClcbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLEtBQUssSUFBSUMsTUFBTSxRQUFRLE9BQU87QUFDckMsT0FBT0MsU0FBUyxNQUFNLFlBQVk7QUFDbEMsU0FBU0MsUUFBUSxRQUFRLDJCQUEyQjtBQUNwRCxTQUFTQyxrQkFBa0IsUUFBUSxxQ0FBcUM7QUFDeEUsU0FBU0MsK0JBQStCLFFBQVEsb0NBQW9DO0FBQ3BGLGNBQWNDLHFCQUFxQixRQUFRLHlCQUF5QjtBQUNwRSxTQUFTQyxnQkFBZ0IsUUFBUSxzQkFBc0I7QUFDdkQsY0FBY0MsS0FBSyxRQUFRLFlBQVk7QUFDdkMsY0FBY0MsT0FBTyxRQUFRLHFCQUFxQjtBQUNsRCxTQUFTQyxrQkFBa0IsUUFBUSxtQkFBbUI7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyx3QkFBd0JBLENBQUM7RUFDaENDO0FBR0YsQ0FGQyxFQUFFO0VBQ0RBLFFBQVEsRUFBRVosS0FBSyxDQUFDYSxTQUFTO0FBQzNCLENBQUMsQ0FBQyxFQUFFYixLQUFLLENBQUNhLFNBQVMsQ0FBQztFQUNsQixNQUFNO0lBQUVDO0VBQVMsQ0FBQyxHQUFHVCwrQkFBK0IsQ0FBQyxDQUFDO0VBQ3RELE1BQU1VLGVBQWUsR0FBR2QsTUFBTSxDQUFDLElBQUksQ0FBQztFQUNwQyxNQUFNZSxrQkFBa0IsR0FBR2YsTUFBTSxDQUFDLElBQUlnQixHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzVDLE1BQU1DLGNB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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isClaudeAISubscriber } from './auth.js'
|
|
2
|
+
import { has1mContext } from './context.js'
|
|
3
|
+
|
|
4
|
+
export function isBilledAsExtraUsage(
|
|
5
|
+
model: string | null,
|
|
6
|
+
isFastMode: boolean,
|
|
7
|
+
isOpus1mMerged: boolean,
|
|
8
|
+
): boolean {
|
|
9
|
+
if (!isClaudeAISubscriber()) return false
|
|
10
|
+
if (isFastMode) return true
|
|
11
|
+
if (model === null || !has1mContext(model)) return false
|
|
12
|
+
|
|
13
|
+
const m = model
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/\[1m\]$/, '')
|
|
16
|
+
.trim()
|
|
17
|
+
const isOpus46 = m === 'opus' || m.includes('opus-4-6')
|
|
18
|
+
const isSonnet46 = m === 'sonnet' || m.includes('sonnet-4-6')
|
|
19
|
+
|
|
20
|
+
if (isOpus46 && isOpus1mMerged) return false
|
|
21
|
+
|
|
22
|
+
return isOpus46 || isSonnet46
|
|
23
|
+
}
|
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
import axios from 'src/utils/axios.js'
|
|
2
|
+
import { getOauthConfig, OAUTH_BETA_HEADER } from 'src/constants/oauth.js'
|
|
3
|
+
import { getFeatureValue_CACHED_MAY_BE_STALE } from 'src/services/analytics/growthbook.js'
|
|
4
|
+
import {
|
|
5
|
+
getIsNonInteractiveSession,
|
|
6
|
+
getKairosActive,
|
|
7
|
+
preferThirdPartyAuthentication,
|
|
8
|
+
} from '../bootstrap/state.js'
|
|
9
|
+
import {
|
|
10
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
11
|
+
logEvent,
|
|
12
|
+
} from '../services/analytics/index.js'
|
|
13
|
+
import {
|
|
14
|
+
getAnthropicApiKey,
|
|
15
|
+
getClaudeAIOAuthTokens,
|
|
16
|
+
handleOAuth401Error,
|
|
17
|
+
hasProfileScope,
|
|
18
|
+
} from './auth.js'
|
|
19
|
+
import { isInBundledMode } from './bundledMode.js'
|
|
20
|
+
import { getGlobalConfig, saveGlobalConfig } from './config.js'
|
|
21
|
+
import { logForDebugging } from './debug.js'
|
|
22
|
+
import { isEnvTruthy } from './envUtils.js'
|
|
23
|
+
import {
|
|
24
|
+
getDefaultMainLoopModelSetting,
|
|
25
|
+
isOpus1mMergeEnabled,
|
|
26
|
+
type ModelSetting,
|
|
27
|
+
parseUserSpecifiedModel,
|
|
28
|
+
} from './model/model.js'
|
|
29
|
+
import { getAPIProvider } from './model/providers.js'
|
|
30
|
+
import { isEssentialTrafficOnly } from './privacyLevel.js'
|
|
31
|
+
import {
|
|
32
|
+
getInitialSettings,
|
|
33
|
+
getSettingsForSource,
|
|
34
|
+
updateSettingsForSource,
|
|
35
|
+
} from './settings/settings.js'
|
|
36
|
+
import { createSignal } from './signal.js'
|
|
37
|
+
|
|
38
|
+
export function isFastModeEnabled(): boolean {
|
|
39
|
+
return !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FAST_MODE)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function isFastModeAvailable(): boolean {
|
|
43
|
+
if (!isFastModeEnabled()) {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
return getFastModeUnavailableReason() === null
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type AuthType = 'oauth' | 'api-key'
|
|
50
|
+
|
|
51
|
+
function getDisabledReasonMessage(
|
|
52
|
+
disabledReason: FastModeDisabledReason,
|
|
53
|
+
authType: AuthType,
|
|
54
|
+
): string {
|
|
55
|
+
switch (disabledReason) {
|
|
56
|
+
case 'free':
|
|
57
|
+
return authType === 'oauth'
|
|
58
|
+
? 'Fast mode requires a paid subscription'
|
|
59
|
+
: 'Fast mode unavailable during evaluation. Please purchase credits.'
|
|
60
|
+
case 'preference':
|
|
61
|
+
return 'Fast mode has been disabled by your organization'
|
|
62
|
+
case 'extra_usage_disabled':
|
|
63
|
+
// Only OAuth users can have extra_usage_disabled; console users don't have this concept
|
|
64
|
+
return 'Fast mode requires extra usage billing · /extra-usage to enable'
|
|
65
|
+
case 'network_error':
|
|
66
|
+
return 'Fast mode unavailable due to network connectivity issues'
|
|
67
|
+
case 'unknown':
|
|
68
|
+
return 'Fast mode is currently unavailable'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function getFastModeUnavailableReason(): string | null {
|
|
73
|
+
if (!isFastModeEnabled()) {
|
|
74
|
+
return 'Fast mode is not available'
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const statigReason = getFeatureValue_CACHED_MAY_BE_STALE(
|
|
78
|
+
'tengu_penguins_off',
|
|
79
|
+
null,
|
|
80
|
+
)
|
|
81
|
+
// Statsig reason has priority over other reasons.
|
|
82
|
+
if (statigReason !== null) {
|
|
83
|
+
logForDebugging(`Fast mode unavailable: ${statigReason}`)
|
|
84
|
+
return statigReason
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Previously, fast mode required the native binary (bun build). This is no
|
|
88
|
+
// longer necessary, but we keep this option behind a flag just in case.
|
|
89
|
+
if (
|
|
90
|
+
!isInBundledMode() &&
|
|
91
|
+
getFeatureValue_CACHED_MAY_BE_STALE('tengu_marble_sandcastle', false)
|
|
92
|
+
) {
|
|
93
|
+
return 'Fast mode requires the native binary · Install from: https://claude.com/product/claude-code'
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Not available in the SDK unless explicitly opted in via --settings.
|
|
97
|
+
// Assistant daemon mode is exempt — it's first-party orchestration, and
|
|
98
|
+
// kairosActive is set before this check runs (main.tsx:~1626 vs ~3249).
|
|
99
|
+
if (
|
|
100
|
+
getIsNonInteractiveSession() &&
|
|
101
|
+
preferThirdPartyAuthentication() &&
|
|
102
|
+
!getKairosActive()
|
|
103
|
+
) {
|
|
104
|
+
const flagFastMode = getSettingsForSource('flagSettings')?.fastMode
|
|
105
|
+
if (!flagFastMode) {
|
|
106
|
+
const reason = 'Fast mode is not available in the Agent SDK'
|
|
107
|
+
logForDebugging(`Fast mode unavailable: ${reason}`)
|
|
108
|
+
return reason
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Only available for 1P (not Bedrock/Vertex/Foundry)
|
|
113
|
+
if (getAPIProvider() !== 'firstParty') {
|
|
114
|
+
const reason = 'Fast mode is not available on Bedrock, Vertex, or Foundry'
|
|
115
|
+
logForDebugging(`Fast mode unavailable: ${reason}`)
|
|
116
|
+
return reason
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (orgStatus.status === 'disabled') {
|
|
120
|
+
if (
|
|
121
|
+
orgStatus.reason === 'network_error' ||
|
|
122
|
+
orgStatus.reason === 'unknown'
|
|
123
|
+
) {
|
|
124
|
+
// The org check can fail behind corporate proxies that block the
|
|
125
|
+
// endpoint. We add CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1 to
|
|
126
|
+
// bypass this check in the CC binary. This is OK since we have
|
|
127
|
+
// another check in the API to error out when disabled by org.
|
|
128
|
+
if (isEnvTruthy(process.env.CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS)) {
|
|
129
|
+
return null
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const authType: AuthType =
|
|
133
|
+
getClaudeAIOAuthTokens() !== null ? 'oauth' : 'api-key'
|
|
134
|
+
const reason = getDisabledReasonMessage(orgStatus.reason, authType)
|
|
135
|
+
logForDebugging(`Fast mode unavailable: ${reason}`)
|
|
136
|
+
return reason
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return null
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// @[MODEL LAUNCH]: Update supported Fast Mode models.
|
|
143
|
+
export const FAST_MODE_MODEL_DISPLAY = 'Opus 4.6'
|
|
144
|
+
|
|
145
|
+
export function getFastModeModel(): string {
|
|
146
|
+
return 'opus' + (isOpus1mMergeEnabled() ? '[1m]' : '')
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function getInitialFastModeSetting(model: ModelSetting): boolean {
|
|
150
|
+
if (!isFastModeEnabled()) {
|
|
151
|
+
return false
|
|
152
|
+
}
|
|
153
|
+
if (!isFastModeAvailable()) {
|
|
154
|
+
return false
|
|
155
|
+
}
|
|
156
|
+
if (!isFastModeSupportedByModel(model)) {
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
const settings = getInitialSettings()
|
|
160
|
+
// If per-session opt-in is required, fast mode starts off each session
|
|
161
|
+
if (settings.fastModePerSessionOptIn) {
|
|
162
|
+
return false
|
|
163
|
+
}
|
|
164
|
+
return settings.fastMode === true
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function isFastModeSupportedByModel(
|
|
168
|
+
modelSetting: ModelSetting,
|
|
169
|
+
): boolean {
|
|
170
|
+
if (!isFastModeEnabled()) {
|
|
171
|
+
return false
|
|
172
|
+
}
|
|
173
|
+
const model = modelSetting ?? getDefaultMainLoopModelSetting()
|
|
174
|
+
const parsedModel = parseUserSpecifiedModel(model)
|
|
175
|
+
return parsedModel.toLowerCase().includes('opus-4-6')
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// --- Fast mode runtime state ---
|
|
179
|
+
// Separate from user preference (settings.fastMode). This tracks the actual
|
|
180
|
+
// operational state: whether we're actively sending fast speed or in cooldown
|
|
181
|
+
// after a rate limit.
|
|
182
|
+
|
|
183
|
+
export type FastModeRuntimeState =
|
|
184
|
+
| { status: 'active' }
|
|
185
|
+
| { status: 'cooldown'; resetAt: number; reason: CooldownReason }
|
|
186
|
+
|
|
187
|
+
let runtimeState: FastModeRuntimeState = { status: 'active' }
|
|
188
|
+
let hasLoggedCooldownExpiry = false
|
|
189
|
+
|
|
190
|
+
// --- Cooldown event listeners ---
|
|
191
|
+
export type CooldownReason = 'rate_limit' | 'overloaded'
|
|
192
|
+
|
|
193
|
+
const cooldownTriggered =
|
|
194
|
+
createSignal<[resetAt: number, reason: CooldownReason]>()
|
|
195
|
+
const cooldownExpired = createSignal()
|
|
196
|
+
export const onCooldownTriggered = cooldownTriggered.subscribe
|
|
197
|
+
export const onCooldownExpired = cooldownExpired.subscribe
|
|
198
|
+
|
|
199
|
+
export function getFastModeRuntimeState(): FastModeRuntimeState {
|
|
200
|
+
if (
|
|
201
|
+
runtimeState.status === 'cooldown' &&
|
|
202
|
+
Date.now() >= runtimeState.resetAt
|
|
203
|
+
) {
|
|
204
|
+
if (isFastModeEnabled() && !hasLoggedCooldownExpiry) {
|
|
205
|
+
logForDebugging('Fast mode cooldown expired, re-enabling fast mode')
|
|
206
|
+
hasLoggedCooldownExpiry = true
|
|
207
|
+
cooldownExpired.emit()
|
|
208
|
+
}
|
|
209
|
+
runtimeState = { status: 'active' }
|
|
210
|
+
}
|
|
211
|
+
return runtimeState
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function triggerFastModeCooldown(
|
|
215
|
+
resetTimestamp: number,
|
|
216
|
+
reason: CooldownReason,
|
|
217
|
+
): void {
|
|
218
|
+
if (!isFastModeEnabled()) {
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
runtimeState = { status: 'cooldown', resetAt: resetTimestamp, reason }
|
|
222
|
+
hasLoggedCooldownExpiry = false
|
|
223
|
+
const cooldownDurationMs = resetTimestamp - Date.now()
|
|
224
|
+
logForDebugging(
|
|
225
|
+
`Fast mode cooldown triggered (${reason}), duration ${Math.round(cooldownDurationMs / 1000)}s`,
|
|
226
|
+
)
|
|
227
|
+
logEvent('tengu_fast_mode_fallback_triggered', {
|
|
228
|
+
cooldown_duration_ms: cooldownDurationMs,
|
|
229
|
+
cooldown_reason:
|
|
230
|
+
reason as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
231
|
+
})
|
|
232
|
+
cooldownTriggered.emit(resetTimestamp, reason)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function clearFastModeCooldown(): void {
|
|
236
|
+
runtimeState = { status: 'active' }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Called when the API rejects a fast mode request (e.g., 400 "Fast mode is
|
|
241
|
+
* not enabled for your organization"). Permanently disables fast mode using
|
|
242
|
+
* the same flow as when the prefetch discovers the org has it disabled.
|
|
243
|
+
*/
|
|
244
|
+
export function handleFastModeRejectedByAPI(): void {
|
|
245
|
+
if (orgStatus.status === 'disabled') {
|
|
246
|
+
return
|
|
247
|
+
}
|
|
248
|
+
orgStatus = { status: 'disabled', reason: 'preference' }
|
|
249
|
+
updateSettingsForSource('userSettings', { fastMode: undefined })
|
|
250
|
+
saveGlobalConfig(current => ({
|
|
251
|
+
...current,
|
|
252
|
+
penguinModeOrgEnabled: false,
|
|
253
|
+
}))
|
|
254
|
+
orgFastModeChange.emit(false)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// --- Overage rejection listeners ---
|
|
258
|
+
// Fired when a 429 indicates fast mode was rejected because extra usage
|
|
259
|
+
// (overage billing) is not available. Distinct from org-level disabling.
|
|
260
|
+
const overageRejection = createSignal<[message: string]>()
|
|
261
|
+
export const onFastModeOverageRejection = overageRejection.subscribe
|
|
262
|
+
|
|
263
|
+
function getOverageDisabledMessage(reason: string | null): string {
|
|
264
|
+
switch (reason) {
|
|
265
|
+
case 'out_of_credits':
|
|
266
|
+
return 'Fast mode disabled · extra usage credits exhausted'
|
|
267
|
+
case 'org_level_disabled':
|
|
268
|
+
case 'org_service_level_disabled':
|
|
269
|
+
return 'Fast mode disabled · extra usage disabled by your organization'
|
|
270
|
+
case 'org_level_disabled_until':
|
|
271
|
+
return 'Fast mode disabled · extra usage spending cap reached'
|
|
272
|
+
case 'member_level_disabled':
|
|
273
|
+
return 'Fast mode disabled · extra usage disabled for your account'
|
|
274
|
+
case 'seat_tier_level_disabled':
|
|
275
|
+
case 'seat_tier_zero_credit_limit':
|
|
276
|
+
case 'member_zero_credit_limit':
|
|
277
|
+
return 'Fast mode disabled · extra usage not available for your plan'
|
|
278
|
+
case 'overage_not_provisioned':
|
|
279
|
+
case 'no_limits_configured':
|
|
280
|
+
return 'Fast mode requires extra usage billing · /extra-usage to enable'
|
|
281
|
+
default:
|
|
282
|
+
return 'Fast mode disabled · extra usage not available'
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function isOutOfCreditsReason(reason: string | null): boolean {
|
|
287
|
+
return reason === 'org_level_disabled_until' || reason === 'out_of_credits'
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Called when a 429 indicates fast mode was rejected because extra usage
|
|
292
|
+
* is not available. Permanently disables fast mode (unless the user has
|
|
293
|
+
* ran out of credits) and notifies with a reason-specific message.
|
|
294
|
+
*/
|
|
295
|
+
export function handleFastModeOverageRejection(reason: string | null): void {
|
|
296
|
+
const message = getOverageDisabledMessage(reason)
|
|
297
|
+
logForDebugging(
|
|
298
|
+
`Fast mode overage rejection: ${reason ?? 'unknown'} — ${message}`,
|
|
299
|
+
)
|
|
300
|
+
logEvent('tengu_fast_mode_overage_rejected', {
|
|
301
|
+
overage_disabled_reason: (reason ??
|
|
302
|
+
'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
303
|
+
})
|
|
304
|
+
// Disable fast mode permanently unless the user has ran out of credits
|
|
305
|
+
if (!isOutOfCreditsReason(reason)) {
|
|
306
|
+
updateSettingsForSource('userSettings', { fastMode: undefined })
|
|
307
|
+
saveGlobalConfig(current => ({
|
|
308
|
+
...current,
|
|
309
|
+
penguinModeOrgEnabled: false,
|
|
310
|
+
}))
|
|
311
|
+
}
|
|
312
|
+
overageRejection.emit(message)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export function isFastModeCooldown(): boolean {
|
|
316
|
+
return getFastModeRuntimeState().status === 'cooldown'
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function getFastModeState(
|
|
320
|
+
model: ModelSetting,
|
|
321
|
+
fastModeUserEnabled: boolean | undefined,
|
|
322
|
+
): 'off' | 'cooldown' | 'on' {
|
|
323
|
+
const enabled =
|
|
324
|
+
isFastModeEnabled() &&
|
|
325
|
+
isFastModeAvailable() &&
|
|
326
|
+
!!fastModeUserEnabled &&
|
|
327
|
+
isFastModeSupportedByModel(model)
|
|
328
|
+
if (enabled && isFastModeCooldown()) {
|
|
329
|
+
return 'cooldown'
|
|
330
|
+
}
|
|
331
|
+
if (enabled) {
|
|
332
|
+
return 'on'
|
|
333
|
+
}
|
|
334
|
+
return 'off'
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Disabled reason returned by the API. The API is the canonical source for why
|
|
338
|
+
// fast mode is disabled (free account, admin preference, extra usage not enabled).
|
|
339
|
+
export type FastModeDisabledReason =
|
|
340
|
+
| 'free'
|
|
341
|
+
| 'preference'
|
|
342
|
+
| 'extra_usage_disabled'
|
|
343
|
+
| 'network_error'
|
|
344
|
+
| 'unknown'
|
|
345
|
+
|
|
346
|
+
// In-memory cache of the fast mode status from the API.
|
|
347
|
+
// Distinct from the user's fastMode app state — this represents
|
|
348
|
+
// whether the org *allows* fast mode and why it may be disabled.
|
|
349
|
+
// Modeled as a discriminated union so the invalid state
|
|
350
|
+
// (disabled without a reason) is unrepresentable.
|
|
351
|
+
type FastModeOrgStatus =
|
|
352
|
+
| { status: 'pending' }
|
|
353
|
+
| { status: 'enabled' }
|
|
354
|
+
| { status: 'disabled'; reason: FastModeDisabledReason }
|
|
355
|
+
|
|
356
|
+
let orgStatus: FastModeOrgStatus = { status: 'pending' }
|
|
357
|
+
|
|
358
|
+
// Listeners notified when org-level fast mode status changes
|
|
359
|
+
const orgFastModeChange = createSignal<[orgEnabled: boolean]>()
|
|
360
|
+
export const onOrgFastModeChanged = orgFastModeChange.subscribe
|
|
361
|
+
|
|
362
|
+
type FastModeResponse = {
|
|
363
|
+
enabled: boolean
|
|
364
|
+
disabled_reason: FastModeDisabledReason | null
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
async function fetchFastModeStatus(
|
|
368
|
+
auth: { accessToken: string } | { apiKey: string },
|
|
369
|
+
): Promise<FastModeResponse> {
|
|
370
|
+
const endpoint = `${getOauthConfig().BASE_API_URL}/api/claude_code_penguin_mode`
|
|
371
|
+
const headers: Record<string, string> =
|
|
372
|
+
'accessToken' in auth
|
|
373
|
+
? {
|
|
374
|
+
Authorization: `Bearer ${auth.accessToken}`,
|
|
375
|
+
'anthropic-beta': OAUTH_BETA_HEADER,
|
|
376
|
+
}
|
|
377
|
+
: { 'x-api-key': auth.apiKey }
|
|
378
|
+
|
|
379
|
+
const response = await axios.get<FastModeResponse>(endpoint, { headers })
|
|
380
|
+
return response.data
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const PREFETCH_MIN_INTERVAL_MS = 30_000
|
|
384
|
+
let lastPrefetchAt = 0
|
|
385
|
+
let inflightPrefetch: Promise<void> | null = null
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Resolve orgStatus from the persisted cache without making any API calls.
|
|
389
|
+
* Used when startup prefetches are throttled to avoid hitting the network
|
|
390
|
+
* while still making fast mode availability checks work.
|
|
391
|
+
*/
|
|
392
|
+
export function resolveFastModeStatusFromCache(): void {
|
|
393
|
+
if (!isFastModeEnabled()) {
|
|
394
|
+
return
|
|
395
|
+
}
|
|
396
|
+
if (orgStatus.status !== 'pending') {
|
|
397
|
+
return
|
|
398
|
+
}
|
|
399
|
+
const isAnt = process.env.USER_TYPE === 'ant'
|
|
400
|
+
const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true
|
|
401
|
+
orgStatus =
|
|
402
|
+
isAnt || cachedEnabled
|
|
403
|
+
? { status: 'enabled' }
|
|
404
|
+
: { status: 'disabled', reason: 'unknown' }
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export async function prefetchFastModeStatus(): Promise<void> {
|
|
408
|
+
// Skip network requests if nonessential traffic is disabled
|
|
409
|
+
if (isEssentialTrafficOnly()) {
|
|
410
|
+
return
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
if (!isFastModeEnabled()) {
|
|
414
|
+
return
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (inflightPrefetch) {
|
|
418
|
+
logForDebugging(
|
|
419
|
+
'Fast mode prefetch in progress, returning in-flight promise',
|
|
420
|
+
)
|
|
421
|
+
return inflightPrefetch
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Service key OAuth sessions lack user:profile scope → endpoint 403s.
|
|
425
|
+
// Resolve orgStatus from cache and bail before burning the throttle window.
|
|
426
|
+
// API key auth is unaffected.
|
|
427
|
+
const apiKey = getAnthropicApiKey()
|
|
428
|
+
const hasUsableOAuth =
|
|
429
|
+
getClaudeAIOAuthTokens()?.accessToken && hasProfileScope()
|
|
430
|
+
if (!hasUsableOAuth && !apiKey) {
|
|
431
|
+
const isAnt = process.env.USER_TYPE === 'ant'
|
|
432
|
+
const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true
|
|
433
|
+
orgStatus =
|
|
434
|
+
isAnt || cachedEnabled
|
|
435
|
+
? { status: 'enabled' }
|
|
436
|
+
: { status: 'disabled', reason: 'preference' }
|
|
437
|
+
return
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const now = Date.now()
|
|
441
|
+
if (now - lastPrefetchAt < PREFETCH_MIN_INTERVAL_MS) {
|
|
442
|
+
logForDebugging('Skipping fast mode prefetch, fetched recently')
|
|
443
|
+
return
|
|
444
|
+
}
|
|
445
|
+
lastPrefetchAt = now
|
|
446
|
+
|
|
447
|
+
const fetchWithCurrentAuth = async (): Promise<FastModeResponse> => {
|
|
448
|
+
const currentTokens = getClaudeAIOAuthTokens()
|
|
449
|
+
const auth =
|
|
450
|
+
currentTokens?.accessToken && hasProfileScope()
|
|
451
|
+
? { accessToken: currentTokens.accessToken }
|
|
452
|
+
: apiKey
|
|
453
|
+
? { apiKey }
|
|
454
|
+
: null
|
|
455
|
+
if (!auth) {
|
|
456
|
+
throw new Error('No auth available')
|
|
457
|
+
}
|
|
458
|
+
return fetchFastModeStatus(auth)
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
async function doFetch(): Promise<void> {
|
|
462
|
+
try {
|
|
463
|
+
let status: FastModeResponse
|
|
464
|
+
try {
|
|
465
|
+
status = await fetchWithCurrentAuth()
|
|
466
|
+
} catch (err) {
|
|
467
|
+
const isAuthError =
|
|
468
|
+
axios.isAxiosError(err) &&
|
|
469
|
+
(err.response?.status === 401 ||
|
|
470
|
+
(err.response?.status === 403 &&
|
|
471
|
+
typeof err.response?.data === 'string' &&
|
|
472
|
+
err.response.data.includes('OAuth token has been revoked')))
|
|
473
|
+
if (isAuthError) {
|
|
474
|
+
const failedAccessToken = getClaudeAIOAuthTokens()?.accessToken
|
|
475
|
+
if (failedAccessToken) {
|
|
476
|
+
await handleOAuth401Error(failedAccessToken)
|
|
477
|
+
status = await fetchWithCurrentAuth()
|
|
478
|
+
} else {
|
|
479
|
+
throw err
|
|
480
|
+
}
|
|
481
|
+
} else {
|
|
482
|
+
throw err
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const previousEnabled =
|
|
487
|
+
orgStatus.status !== 'pending'
|
|
488
|
+
? orgStatus.status === 'enabled'
|
|
489
|
+
: getGlobalConfig().penguinModeOrgEnabled
|
|
490
|
+
orgStatus = status.enabled
|
|
491
|
+
? { status: 'enabled' }
|
|
492
|
+
: {
|
|
493
|
+
status: 'disabled',
|
|
494
|
+
reason: status.disabled_reason ?? 'preference',
|
|
495
|
+
}
|
|
496
|
+
if (previousEnabled !== status.enabled) {
|
|
497
|
+
// When org disables fast mode, permanently turn off the user's fast mode setting
|
|
498
|
+
if (!status.enabled) {
|
|
499
|
+
updateSettingsForSource('userSettings', { fastMode: undefined })
|
|
500
|
+
}
|
|
501
|
+
saveGlobalConfig(current => ({
|
|
502
|
+
...current,
|
|
503
|
+
penguinModeOrgEnabled: status.enabled,
|
|
504
|
+
}))
|
|
505
|
+
orgFastModeChange.emit(status.enabled)
|
|
506
|
+
}
|
|
507
|
+
logForDebugging(
|
|
508
|
+
`Org fast mode: ${status.enabled ? 'enabled' : `disabled (${status.disabled_reason ?? 'preference'})`}`,
|
|
509
|
+
)
|
|
510
|
+
} catch (err) {
|
|
511
|
+
// On failure: ants default to enabled (don't block internal users).
|
|
512
|
+
// External users: fall back to the cached penguinModeOrgEnabled value;
|
|
513
|
+
// if no positive cache, disable with network_error reason.
|
|
514
|
+
const isAnt = process.env.USER_TYPE === 'ant'
|
|
515
|
+
const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true
|
|
516
|
+
orgStatus =
|
|
517
|
+
isAnt || cachedEnabled
|
|
518
|
+
? { status: 'enabled' }
|
|
519
|
+
: { status: 'disabled', reason: 'network_error' }
|
|
520
|
+
logForDebugging(
|
|
521
|
+
`Failed to fetch org fast mode status, defaulting to ${orgStatus.status === 'enabled' ? 'enabled (cached)' : 'disabled (network_error)'}: ${err}`,
|
|
522
|
+
{ level: 'error' },
|
|
523
|
+
)
|
|
524
|
+
logEvent('tengu_org_penguin_mode_fetch_failed', {})
|
|
525
|
+
} finally {
|
|
526
|
+
inflightPrefetch = null
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
inflightPrefetch = doFetch()
|
|
531
|
+
return inflightPrefetch
|
|
532
|
+
}
|