@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,806 @@
|
|
|
1
|
+
import type { HrTime } from '@opentelemetry/api'
|
|
2
|
+
import { type ExportResult, ExportResultCode } from '@opentelemetry/core'
|
|
3
|
+
import type {
|
|
4
|
+
LogRecordExporter,
|
|
5
|
+
ReadableLogRecord,
|
|
6
|
+
} from '@opentelemetry/sdk-logs'
|
|
7
|
+
import axios from 'src/utils/axios.js'
|
|
8
|
+
import { randomUUID } from 'crypto'
|
|
9
|
+
import { appendFile, mkdir, readdir, unlink, writeFile } from 'fs/promises'
|
|
10
|
+
import * as path from 'path'
|
|
11
|
+
import type { CoreUserData } from 'src/utils/user.js'
|
|
12
|
+
import {
|
|
13
|
+
getIsNonInteractiveSession,
|
|
14
|
+
getSessionId,
|
|
15
|
+
} from '../../bootstrap/state.js'
|
|
16
|
+
import { ClaudeCodeInternalEvent } from '../../types/generated/events_mono/claude_code/v1/claude_code_internal_event.js'
|
|
17
|
+
import { GrowthbookExperimentEvent } from '../../types/generated/events_mono/growthbook/v1/growthbook_experiment_event.js'
|
|
18
|
+
import {
|
|
19
|
+
getClaudeAIOAuthTokens,
|
|
20
|
+
hasProfileScope,
|
|
21
|
+
isClaudeAISubscriber,
|
|
22
|
+
} from '../../utils/auth.js'
|
|
23
|
+
import { checkHasTrustDialogAccepted } from '../../utils/config.js'
|
|
24
|
+
import { logForDebugging } from '../../utils/debug.js'
|
|
25
|
+
import { getClaudeConfigHomeDir } from '../../utils/envUtils.js'
|
|
26
|
+
import { errorMessage, isFsInaccessible, toError } from '../../utils/errors.js'
|
|
27
|
+
import { getAuthHeaders } from '../../utils/http.js'
|
|
28
|
+
import { readJSONLFile } from '../../utils/json.js'
|
|
29
|
+
import { logError } from '../../utils/log.js'
|
|
30
|
+
import { sleep } from '../../utils/sleep.js'
|
|
31
|
+
import { jsonStringify } from '../../utils/slowOperations.js'
|
|
32
|
+
import { getClaudeCodeUserAgent } from '../../utils/userAgent.js'
|
|
33
|
+
import { isOAuthTokenExpired } from '../oauth/client.js'
|
|
34
|
+
import { stripProtoFields } from './index.js'
|
|
35
|
+
import { type EventMetadata, to1PEventFormat } from './metadata.js'
|
|
36
|
+
|
|
37
|
+
// Unique ID for this process run - used to isolate failed event files between runs
|
|
38
|
+
const BATCH_UUID = randomUUID()
|
|
39
|
+
|
|
40
|
+
// File prefix for failed event storage
|
|
41
|
+
const FILE_PREFIX = '1p_failed_events.'
|
|
42
|
+
|
|
43
|
+
// Storage directory for failed events - evaluated at runtime to respect CLAUDE_CONFIG_DIR in tests
|
|
44
|
+
function getStorageDir(): string {
|
|
45
|
+
return path.join(getClaudeConfigHomeDir(), 'telemetry')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// API envelope - event_data is the JSON output from proto toJSON()
|
|
49
|
+
type FirstPartyEventLoggingEvent = {
|
|
50
|
+
event_type: 'ClaudeCodeInternalEvent' | 'GrowthbookExperimentEvent'
|
|
51
|
+
event_data: unknown
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
type FirstPartyEventLoggingPayload = {
|
|
55
|
+
events: FirstPartyEventLoggingEvent[]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Exporter for 1st-party event logging to /api/event_logging/batch.
|
|
60
|
+
*
|
|
61
|
+
* Export cycles are controlled by OpenTelemetry's BatchLogRecordProcessor, which
|
|
62
|
+
* triggers export() when either:
|
|
63
|
+
* - Time interval elapses (default: 5 seconds via scheduledDelayMillis)
|
|
64
|
+
* - Batch size is reached (default: 200 events via maxExportBatchSize)
|
|
65
|
+
*
|
|
66
|
+
* This exporter adds resilience on top:
|
|
67
|
+
* - Append-only log for failed events (concurrency-safe)
|
|
68
|
+
* - Quadratic backoff retry for failed events, dropped after maxAttempts
|
|
69
|
+
* - Immediate retry of queued events when any export succeeds (endpoint is healthy)
|
|
70
|
+
* - Chunking large event sets into smaller batches
|
|
71
|
+
* - Auth fallback: retries without auth on 401 errors
|
|
72
|
+
*/
|
|
73
|
+
export class FirstPartyEventLoggingExporter implements LogRecordExporter {
|
|
74
|
+
private readonly endpoint: string
|
|
75
|
+
private readonly timeout: number
|
|
76
|
+
private readonly maxBatchSize: number
|
|
77
|
+
private readonly skipAuth: boolean
|
|
78
|
+
private readonly batchDelayMs: number
|
|
79
|
+
private readonly baseBackoffDelayMs: number
|
|
80
|
+
private readonly maxBackoffDelayMs: number
|
|
81
|
+
private readonly maxAttempts: number
|
|
82
|
+
private readonly isKilled: () => boolean
|
|
83
|
+
private pendingExports: Promise<void>[] = []
|
|
84
|
+
private isShutdown = false
|
|
85
|
+
private readonly schedule: (
|
|
86
|
+
fn: () => Promise<void>,
|
|
87
|
+
delayMs: number,
|
|
88
|
+
) => () => void
|
|
89
|
+
private cancelBackoff: (() => void) | null = null
|
|
90
|
+
private attempts = 0
|
|
91
|
+
private isRetrying = false
|
|
92
|
+
private lastExportErrorContext: string | undefined
|
|
93
|
+
|
|
94
|
+
constructor(
|
|
95
|
+
options: {
|
|
96
|
+
timeout?: number
|
|
97
|
+
maxBatchSize?: number
|
|
98
|
+
skipAuth?: boolean
|
|
99
|
+
batchDelayMs?: number
|
|
100
|
+
baseBackoffDelayMs?: number
|
|
101
|
+
maxBackoffDelayMs?: number
|
|
102
|
+
maxAttempts?: number
|
|
103
|
+
path?: string
|
|
104
|
+
baseUrl?: string
|
|
105
|
+
// Injected killswitch probe. Checked per-POST so that disabling the
|
|
106
|
+
// firstParty sink also stops backoff retries (not just new emits).
|
|
107
|
+
// Passed in rather than imported to avoid a cycle with firstPartyEventLogger.ts.
|
|
108
|
+
isKilled?: () => boolean
|
|
109
|
+
schedule?: (fn: () => Promise<void>, delayMs: number) => () => void
|
|
110
|
+
} = {},
|
|
111
|
+
) {
|
|
112
|
+
// Default: prod, except when ANTHROPIC_BASE_URL is explicitly staging.
|
|
113
|
+
// Overridable via tengu_1p_event_batch_config.baseUrl.
|
|
114
|
+
const baseUrl =
|
|
115
|
+
options.baseUrl ||
|
|
116
|
+
(process.env.ANTHROPIC_BASE_URL === 'https://api-staging.anthropic.com'
|
|
117
|
+
? 'https://api-staging.anthropic.com'
|
|
118
|
+
: 'https://api.anthropic.com')
|
|
119
|
+
|
|
120
|
+
this.endpoint = `${baseUrl}${options.path || '/api/event_logging/batch'}`
|
|
121
|
+
|
|
122
|
+
this.timeout = options.timeout || 10000
|
|
123
|
+
this.maxBatchSize = options.maxBatchSize || 200
|
|
124
|
+
this.skipAuth = options.skipAuth ?? false
|
|
125
|
+
this.batchDelayMs = options.batchDelayMs || 100
|
|
126
|
+
this.baseBackoffDelayMs = options.baseBackoffDelayMs || 500
|
|
127
|
+
this.maxBackoffDelayMs = options.maxBackoffDelayMs || 30000
|
|
128
|
+
this.maxAttempts = options.maxAttempts ?? 8
|
|
129
|
+
this.isKilled = options.isKilled ?? (() => false)
|
|
130
|
+
this.schedule =
|
|
131
|
+
options.schedule ??
|
|
132
|
+
((fn, ms) => {
|
|
133
|
+
const t = setTimeout(fn, ms)
|
|
134
|
+
return () => clearTimeout(t)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Retry any failed events from previous runs of this session (in background)
|
|
138
|
+
void this.retryPreviousBatches()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Expose for testing
|
|
142
|
+
async getQueuedEventCount(): Promise<number> {
|
|
143
|
+
return (await this.loadEventsFromCurrentBatch()).length
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// --- Storage helpers ---
|
|
147
|
+
|
|
148
|
+
private getCurrentBatchFilePath(): string {
|
|
149
|
+
return path.join(
|
|
150
|
+
getStorageDir(),
|
|
151
|
+
`${FILE_PREFIX}${getSessionId()}.${BATCH_UUID}.json`,
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private async loadEventsFromFile(
|
|
156
|
+
filePath: string,
|
|
157
|
+
): Promise<FirstPartyEventLoggingEvent[]> {
|
|
158
|
+
try {
|
|
159
|
+
return await readJSONLFile<FirstPartyEventLoggingEvent>(filePath)
|
|
160
|
+
} catch {
|
|
161
|
+
return []
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private async loadEventsFromCurrentBatch(): Promise<
|
|
166
|
+
FirstPartyEventLoggingEvent[]
|
|
167
|
+
> {
|
|
168
|
+
return this.loadEventsFromFile(this.getCurrentBatchFilePath())
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private async saveEventsToFile(
|
|
172
|
+
filePath: string,
|
|
173
|
+
events: FirstPartyEventLoggingEvent[],
|
|
174
|
+
): Promise<void> {
|
|
175
|
+
try {
|
|
176
|
+
if (events.length === 0) {
|
|
177
|
+
try {
|
|
178
|
+
await unlink(filePath)
|
|
179
|
+
} catch {
|
|
180
|
+
// File doesn't exist, nothing to delete
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
// Ensure storage directory exists
|
|
184
|
+
await mkdir(getStorageDir(), { recursive: true })
|
|
185
|
+
// Write as JSON lines (one event per line)
|
|
186
|
+
const content = events.map(e => jsonStringify(e)).join('\n') + '\n'
|
|
187
|
+
await writeFile(filePath, content, 'utf8')
|
|
188
|
+
}
|
|
189
|
+
} catch (error) {
|
|
190
|
+
logError(error)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private async appendEventsToFile(
|
|
195
|
+
filePath: string,
|
|
196
|
+
events: FirstPartyEventLoggingEvent[],
|
|
197
|
+
): Promise<void> {
|
|
198
|
+
if (events.length === 0) return
|
|
199
|
+
try {
|
|
200
|
+
// Ensure storage directory exists
|
|
201
|
+
await mkdir(getStorageDir(), { recursive: true })
|
|
202
|
+
// Append as JSON lines (one event per line) - atomic on most filesystems
|
|
203
|
+
const content = events.map(e => jsonStringify(e)).join('\n') + '\n'
|
|
204
|
+
await appendFile(filePath, content, 'utf8')
|
|
205
|
+
} catch (error) {
|
|
206
|
+
logError(error)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private async deleteFile(filePath: string): Promise<void> {
|
|
211
|
+
try {
|
|
212
|
+
await unlink(filePath)
|
|
213
|
+
} catch {
|
|
214
|
+
// File doesn't exist or can't be deleted, ignore
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// --- Previous batch retry (startup) ---
|
|
219
|
+
|
|
220
|
+
private async retryPreviousBatches(): Promise<void> {
|
|
221
|
+
try {
|
|
222
|
+
const prefix = `${FILE_PREFIX}${getSessionId()}.`
|
|
223
|
+
let files: string[]
|
|
224
|
+
try {
|
|
225
|
+
files = (await readdir(getStorageDir()))
|
|
226
|
+
.filter((f: string) => f.startsWith(prefix) && f.endsWith('.json'))
|
|
227
|
+
.filter((f: string) => !f.includes(BATCH_UUID)) // Exclude current batch
|
|
228
|
+
} catch (e) {
|
|
229
|
+
if (isFsInaccessible(e)) return
|
|
230
|
+
throw e
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
for (const file of files) {
|
|
234
|
+
const filePath = path.join(getStorageDir(), file)
|
|
235
|
+
void this.retryFileInBackground(filePath)
|
|
236
|
+
}
|
|
237
|
+
} catch (error) {
|
|
238
|
+
logError(error)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private async retryFileInBackground(filePath: string): Promise<void> {
|
|
243
|
+
if (this.attempts >= this.maxAttempts) {
|
|
244
|
+
await this.deleteFile(filePath)
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const events = await this.loadEventsFromFile(filePath)
|
|
249
|
+
if (events.length === 0) {
|
|
250
|
+
await this.deleteFile(filePath)
|
|
251
|
+
return
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
255
|
+
logForDebugging(
|
|
256
|
+
`1P event logging: retrying ${events.length} events from previous batch`,
|
|
257
|
+
)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const failedEvents = await this.sendEventsInBatches(events)
|
|
261
|
+
if (failedEvents.length === 0) {
|
|
262
|
+
await this.deleteFile(filePath)
|
|
263
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
264
|
+
logForDebugging('1P event logging: previous batch retry succeeded')
|
|
265
|
+
}
|
|
266
|
+
} else {
|
|
267
|
+
// Save only the failed events back (not all original events)
|
|
268
|
+
await this.saveEventsToFile(filePath, failedEvents)
|
|
269
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
270
|
+
logForDebugging(
|
|
271
|
+
`1P event logging: previous batch retry failed, ${failedEvents.length} events remain`,
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
async export(
|
|
278
|
+
logs: ReadableLogRecord[],
|
|
279
|
+
resultCallback: (result: ExportResult) => void,
|
|
280
|
+
): Promise<void> {
|
|
281
|
+
if (this.isShutdown) {
|
|
282
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
283
|
+
logForDebugging(
|
|
284
|
+
'1P event logging export failed: Exporter has been shutdown',
|
|
285
|
+
)
|
|
286
|
+
}
|
|
287
|
+
resultCallback({
|
|
288
|
+
code: ExportResultCode.FAILED,
|
|
289
|
+
error: new Error('Exporter has been shutdown'),
|
|
290
|
+
})
|
|
291
|
+
return
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const exportPromise = this.doExport(logs, resultCallback)
|
|
295
|
+
this.pendingExports.push(exportPromise)
|
|
296
|
+
|
|
297
|
+
// Clean up completed exports
|
|
298
|
+
void exportPromise.finally(() => {
|
|
299
|
+
const index = this.pendingExports.indexOf(exportPromise)
|
|
300
|
+
if (index > -1) {
|
|
301
|
+
void this.pendingExports.splice(index, 1)
|
|
302
|
+
}
|
|
303
|
+
})
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
private async doExport(
|
|
307
|
+
logs: ReadableLogRecord[],
|
|
308
|
+
resultCallback: (result: ExportResult) => void,
|
|
309
|
+
): Promise<void> {
|
|
310
|
+
try {
|
|
311
|
+
// Filter for event logs only (by scope name)
|
|
312
|
+
const eventLogs = logs.filter(
|
|
313
|
+
log =>
|
|
314
|
+
log.instrumentationScope?.name === 'com.anthropic.claude_code.events',
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
if (eventLogs.length === 0) {
|
|
318
|
+
resultCallback({ code: ExportResultCode.SUCCESS })
|
|
319
|
+
return
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Transform new logs (failed events are retried independently via backoff)
|
|
323
|
+
const events = this.transformLogsToEvents(eventLogs).events
|
|
324
|
+
|
|
325
|
+
if (events.length === 0) {
|
|
326
|
+
resultCallback({ code: ExportResultCode.SUCCESS })
|
|
327
|
+
return
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (this.attempts >= this.maxAttempts) {
|
|
331
|
+
resultCallback({
|
|
332
|
+
code: ExportResultCode.FAILED,
|
|
333
|
+
error: new Error(
|
|
334
|
+
`Dropped ${events.length} events: max attempts (${this.maxAttempts}) reached`,
|
|
335
|
+
),
|
|
336
|
+
})
|
|
337
|
+
return
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Send events
|
|
341
|
+
const failedEvents = await this.sendEventsInBatches(events)
|
|
342
|
+
this.attempts++
|
|
343
|
+
|
|
344
|
+
if (failedEvents.length > 0) {
|
|
345
|
+
await this.queueFailedEvents(failedEvents)
|
|
346
|
+
this.scheduleBackoffRetry()
|
|
347
|
+
const context = this.lastExportErrorContext
|
|
348
|
+
? ` (${this.lastExportErrorContext})`
|
|
349
|
+
: ''
|
|
350
|
+
resultCallback({
|
|
351
|
+
code: ExportResultCode.FAILED,
|
|
352
|
+
error: new Error(
|
|
353
|
+
`Failed to export ${failedEvents.length} events${context}`,
|
|
354
|
+
),
|
|
355
|
+
})
|
|
356
|
+
return
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Success - reset backoff and immediately retry any queued events
|
|
360
|
+
this.resetBackoff()
|
|
361
|
+
if ((await this.getQueuedEventCount()) > 0 && !this.isRetrying) {
|
|
362
|
+
void this.retryFailedEvents()
|
|
363
|
+
}
|
|
364
|
+
resultCallback({ code: ExportResultCode.SUCCESS })
|
|
365
|
+
} catch (error) {
|
|
366
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
367
|
+
logForDebugging(
|
|
368
|
+
`1P event logging export failed: ${errorMessage(error)}`,
|
|
369
|
+
)
|
|
370
|
+
}
|
|
371
|
+
logError(error)
|
|
372
|
+
resultCallback({
|
|
373
|
+
code: ExportResultCode.FAILED,
|
|
374
|
+
error: toError(error),
|
|
375
|
+
})
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
private async sendEventsInBatches(
|
|
380
|
+
events: FirstPartyEventLoggingEvent[],
|
|
381
|
+
): Promise<FirstPartyEventLoggingEvent[]> {
|
|
382
|
+
// Chunk events into batches
|
|
383
|
+
const batches: FirstPartyEventLoggingEvent[][] = []
|
|
384
|
+
for (let i = 0; i < events.length; i += this.maxBatchSize) {
|
|
385
|
+
batches.push(events.slice(i, i + this.maxBatchSize))
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
389
|
+
logForDebugging(
|
|
390
|
+
`1P event logging: exporting ${events.length} events in ${batches.length} batch(es)`,
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Send each batch with delay between them. On first failure, assume the
|
|
395
|
+
// endpoint is down and short-circuit: queue the failed batch plus all
|
|
396
|
+
// remaining unsent batches without POSTing them. The backoff retry will
|
|
397
|
+
// probe again with a single batch next tick.
|
|
398
|
+
const failedBatchEvents: FirstPartyEventLoggingEvent[] = []
|
|
399
|
+
let lastErrorContext: string | undefined
|
|
400
|
+
for (let i = 0; i < batches.length; i++) {
|
|
401
|
+
const batch = batches[i]!
|
|
402
|
+
try {
|
|
403
|
+
await this.sendBatchWithRetry({ events: batch })
|
|
404
|
+
} catch (error) {
|
|
405
|
+
lastErrorContext = getAxiosErrorContext(error)
|
|
406
|
+
for (let j = i; j < batches.length; j++) {
|
|
407
|
+
failedBatchEvents.push(...batches[j]!)
|
|
408
|
+
}
|
|
409
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
410
|
+
const skipped = batches.length - 1 - i
|
|
411
|
+
logForDebugging(
|
|
412
|
+
`1P event logging: batch ${i + 1}/${batches.length} failed (${lastErrorContext}); short-circuiting ${skipped} remaining batch(es)`,
|
|
413
|
+
)
|
|
414
|
+
}
|
|
415
|
+
break
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (i < batches.length - 1 && this.batchDelayMs > 0) {
|
|
419
|
+
await sleep(this.batchDelayMs)
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (failedBatchEvents.length > 0 && lastErrorContext) {
|
|
424
|
+
this.lastExportErrorContext = lastErrorContext
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return failedBatchEvents
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
private async queueFailedEvents(
|
|
431
|
+
events: FirstPartyEventLoggingEvent[],
|
|
432
|
+
): Promise<void> {
|
|
433
|
+
const filePath = this.getCurrentBatchFilePath()
|
|
434
|
+
|
|
435
|
+
// Append-only: just add new events to file (atomic on most filesystems)
|
|
436
|
+
await this.appendEventsToFile(filePath, events)
|
|
437
|
+
|
|
438
|
+
const context = this.lastExportErrorContext
|
|
439
|
+
? ` (${this.lastExportErrorContext})`
|
|
440
|
+
: ''
|
|
441
|
+
const message = `1P event logging: ${events.length} events failed to export${context}`
|
|
442
|
+
logError(new Error(message))
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
private scheduleBackoffRetry(): void {
|
|
446
|
+
// Don't schedule if already retrying or shutdown
|
|
447
|
+
if (this.cancelBackoff || this.isRetrying || this.isShutdown) {
|
|
448
|
+
return
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Quadratic backoff (matching Statsig SDK): base * attempts²
|
|
452
|
+
const delay = Math.min(
|
|
453
|
+
this.baseBackoffDelayMs * this.attempts * this.attempts,
|
|
454
|
+
this.maxBackoffDelayMs,
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
458
|
+
logForDebugging(
|
|
459
|
+
`1P event logging: scheduling backoff retry in ${delay}ms (attempt ${this.attempts})`,
|
|
460
|
+
)
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
this.cancelBackoff = this.schedule(async () => {
|
|
464
|
+
this.cancelBackoff = null
|
|
465
|
+
await this.retryFailedEvents()
|
|
466
|
+
}, delay)
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
private async retryFailedEvents(): Promise<void> {
|
|
470
|
+
const filePath = this.getCurrentBatchFilePath()
|
|
471
|
+
|
|
472
|
+
// Keep retrying while there are events and endpoint is healthy
|
|
473
|
+
while (!this.isShutdown) {
|
|
474
|
+
const events = await this.loadEventsFromFile(filePath)
|
|
475
|
+
if (events.length === 0) break
|
|
476
|
+
|
|
477
|
+
if (this.attempts >= this.maxAttempts) {
|
|
478
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
479
|
+
logForDebugging(
|
|
480
|
+
`1P event logging: max attempts (${this.maxAttempts}) reached, dropping ${events.length} events`,
|
|
481
|
+
)
|
|
482
|
+
}
|
|
483
|
+
await this.deleteFile(filePath)
|
|
484
|
+
this.resetBackoff()
|
|
485
|
+
return
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
this.isRetrying = true
|
|
489
|
+
|
|
490
|
+
// Clear file before retry (we have events in memory now)
|
|
491
|
+
await this.deleteFile(filePath)
|
|
492
|
+
|
|
493
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
494
|
+
logForDebugging(
|
|
495
|
+
`1P event logging: retrying ${events.length} failed events (attempt ${this.attempts + 1})`,
|
|
496
|
+
)
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
const failedEvents = await this.sendEventsInBatches(events)
|
|
500
|
+
this.attempts++
|
|
501
|
+
|
|
502
|
+
this.isRetrying = false
|
|
503
|
+
|
|
504
|
+
if (failedEvents.length > 0) {
|
|
505
|
+
// Write failures back to disk
|
|
506
|
+
await this.saveEventsToFile(filePath, failedEvents)
|
|
507
|
+
this.scheduleBackoffRetry()
|
|
508
|
+
return // Failed - wait for backoff
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Success - reset backoff and continue loop to drain any newly queued events
|
|
512
|
+
this.resetBackoff()
|
|
513
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
514
|
+
logForDebugging('1P event logging: backoff retry succeeded')
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
private resetBackoff(): void {
|
|
520
|
+
this.attempts = 0
|
|
521
|
+
if (this.cancelBackoff) {
|
|
522
|
+
this.cancelBackoff()
|
|
523
|
+
this.cancelBackoff = null
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
private async sendBatchWithRetry(
|
|
528
|
+
payload: FirstPartyEventLoggingPayload,
|
|
529
|
+
): Promise<void> {
|
|
530
|
+
if (this.isKilled()) {
|
|
531
|
+
// Throw so the caller short-circuits remaining batches and queues
|
|
532
|
+
// everything to disk. Zero network traffic while killed; the backoff
|
|
533
|
+
// timer keeps ticking and will resume POSTs as soon as the GrowthBook
|
|
534
|
+
// cache picks up the cleared flag.
|
|
535
|
+
throw new Error('firstParty sink killswitch active')
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
const baseHeaders: Record<string, string> = {
|
|
539
|
+
'Content-Type': 'application/json',
|
|
540
|
+
'User-Agent': getClaudeCodeUserAgent(),
|
|
541
|
+
'x-service-name': 'claude-code',
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Skip auth if trust hasn't been established yet
|
|
545
|
+
// This prevents executing apiKeyHelper commands before the trust dialog
|
|
546
|
+
// Non-interactive sessions implicitly have workspace trust
|
|
547
|
+
const hasTrust =
|
|
548
|
+
checkHasTrustDialogAccepted() || getIsNonInteractiveSession()
|
|
549
|
+
if (process.env.USER_TYPE === 'ant' && !hasTrust) {
|
|
550
|
+
logForDebugging('1P event logging: Trust not accepted')
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Skip auth when the OAuth token is expired or lacks user:profile
|
|
554
|
+
// scope (service key sessions). Falls through to unauthenticated send.
|
|
555
|
+
let shouldSkipAuth = this.skipAuth || !hasTrust
|
|
556
|
+
if (!shouldSkipAuth && isClaudeAISubscriber()) {
|
|
557
|
+
const tokens = getClaudeAIOAuthTokens()
|
|
558
|
+
if (!hasProfileScope()) {
|
|
559
|
+
shouldSkipAuth = true
|
|
560
|
+
} else if (tokens && isOAuthTokenExpired(tokens.expiresAt)) {
|
|
561
|
+
shouldSkipAuth = true
|
|
562
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
563
|
+
logForDebugging(
|
|
564
|
+
'1P event logging: OAuth token expired, skipping auth to avoid 401',
|
|
565
|
+
)
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Try with auth headers first (unless trust not established or token is known to be expired)
|
|
571
|
+
const authResult = shouldSkipAuth
|
|
572
|
+
? { headers: {}, error: 'trust not established or Oauth token expired' }
|
|
573
|
+
: getAuthHeaders()
|
|
574
|
+
const useAuth = !authResult.error
|
|
575
|
+
|
|
576
|
+
if (!useAuth && process.env.USER_TYPE === 'ant') {
|
|
577
|
+
logForDebugging(
|
|
578
|
+
`1P event logging: auth not available, sending without auth`,
|
|
579
|
+
)
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
const headers = useAuth
|
|
583
|
+
? { ...baseHeaders, ...authResult.headers }
|
|
584
|
+
: baseHeaders
|
|
585
|
+
|
|
586
|
+
try {
|
|
587
|
+
const response = await axios.post(this.endpoint, payload, {
|
|
588
|
+
timeout: this.timeout,
|
|
589
|
+
headers,
|
|
590
|
+
})
|
|
591
|
+
this.logSuccess(payload.events.length, useAuth, response.data)
|
|
592
|
+
return
|
|
593
|
+
} catch (error) {
|
|
594
|
+
// Handle 401 by retrying without auth
|
|
595
|
+
if (
|
|
596
|
+
useAuth &&
|
|
597
|
+
axios.isAxiosError(error) &&
|
|
598
|
+
error.response?.status === 401
|
|
599
|
+
) {
|
|
600
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
601
|
+
logForDebugging(
|
|
602
|
+
'1P event logging: 401 auth error, retrying without auth',
|
|
603
|
+
)
|
|
604
|
+
}
|
|
605
|
+
const response = await axios.post(this.endpoint, payload, {
|
|
606
|
+
timeout: this.timeout,
|
|
607
|
+
headers: baseHeaders,
|
|
608
|
+
})
|
|
609
|
+
this.logSuccess(payload.events.length, false, response.data)
|
|
610
|
+
return
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
throw error
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
private logSuccess(
|
|
618
|
+
eventCount: number,
|
|
619
|
+
withAuth: boolean,
|
|
620
|
+
responseData: unknown,
|
|
621
|
+
): void {
|
|
622
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
623
|
+
logForDebugging(
|
|
624
|
+
`1P event logging: ${eventCount} events exported successfully${withAuth ? ' (with auth)' : ' (without auth)'}`,
|
|
625
|
+
)
|
|
626
|
+
logForDebugging(`API Response: ${jsonStringify(responseData, null, 2)}`)
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
private hrTimeToDate(hrTime: HrTime): Date {
|
|
631
|
+
const [seconds, nanoseconds] = hrTime
|
|
632
|
+
return new Date(seconds * 1000 + nanoseconds / 1000000)
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
private transformLogsToEvents(
|
|
636
|
+
logs: ReadableLogRecord[],
|
|
637
|
+
): FirstPartyEventLoggingPayload {
|
|
638
|
+
const events: FirstPartyEventLoggingEvent[] = []
|
|
639
|
+
|
|
640
|
+
for (const log of logs) {
|
|
641
|
+
const attributes = log.attributes || {}
|
|
642
|
+
|
|
643
|
+
// Check if this is a GrowthBook experiment event
|
|
644
|
+
if (attributes.event_type === 'GrowthbookExperimentEvent') {
|
|
645
|
+
const timestamp = this.hrTimeToDate(log.hrTime)
|
|
646
|
+
const account_uuid = attributes.account_uuid as string | undefined
|
|
647
|
+
const organization_uuid = attributes.organization_uuid as
|
|
648
|
+
| string
|
|
649
|
+
| undefined
|
|
650
|
+
events.push({
|
|
651
|
+
event_type: 'GrowthbookExperimentEvent',
|
|
652
|
+
event_data: GrowthbookExperimentEvent.toJSON({
|
|
653
|
+
event_id: attributes.event_id as string,
|
|
654
|
+
timestamp,
|
|
655
|
+
experiment_id: attributes.experiment_id as string,
|
|
656
|
+
variation_id: attributes.variation_id as number,
|
|
657
|
+
environment: attributes.environment as string,
|
|
658
|
+
user_attributes: attributes.user_attributes as string,
|
|
659
|
+
experiment_metadata: attributes.experiment_metadata as string,
|
|
660
|
+
device_id: attributes.device_id as string,
|
|
661
|
+
session_id: attributes.session_id as string,
|
|
662
|
+
auth:
|
|
663
|
+
account_uuid || organization_uuid
|
|
664
|
+
? { account_uuid, organization_uuid }
|
|
665
|
+
: undefined,
|
|
666
|
+
}),
|
|
667
|
+
})
|
|
668
|
+
continue
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Extract event name
|
|
672
|
+
const eventName =
|
|
673
|
+
(attributes.event_name as string) || (log.body as string) || 'unknown'
|
|
674
|
+
|
|
675
|
+
// Extract metadata objects directly (no JSON parsing needed)
|
|
676
|
+
const coreMetadata = attributes.core_metadata as EventMetadata | undefined
|
|
677
|
+
const userMetadata = attributes.user_metadata as CoreUserData
|
|
678
|
+
const eventMetadata = (attributes.event_metadata || {}) as Record<
|
|
679
|
+
string,
|
|
680
|
+
unknown
|
|
681
|
+
>
|
|
682
|
+
|
|
683
|
+
if (!coreMetadata) {
|
|
684
|
+
// Emit partial event if core metadata is missing
|
|
685
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
686
|
+
logForDebugging(
|
|
687
|
+
`1P event logging: core_metadata missing for event ${eventName}`,
|
|
688
|
+
)
|
|
689
|
+
}
|
|
690
|
+
events.push({
|
|
691
|
+
event_type: 'ClaudeCodeInternalEvent',
|
|
692
|
+
event_data: ClaudeCodeInternalEvent.toJSON({
|
|
693
|
+
event_id: attributes.event_id as string | undefined,
|
|
694
|
+
event_name: eventName,
|
|
695
|
+
client_timestamp: this.hrTimeToDate(log.hrTime),
|
|
696
|
+
session_id: getSessionId(),
|
|
697
|
+
additional_metadata: Buffer.from(
|
|
698
|
+
jsonStringify({
|
|
699
|
+
transform_error: 'core_metadata attribute is missing',
|
|
700
|
+
}),
|
|
701
|
+
).toString('base64'),
|
|
702
|
+
}),
|
|
703
|
+
})
|
|
704
|
+
continue
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// Transform to 1P format
|
|
708
|
+
const formatted = to1PEventFormat(
|
|
709
|
+
coreMetadata,
|
|
710
|
+
userMetadata,
|
|
711
|
+
eventMetadata,
|
|
712
|
+
)
|
|
713
|
+
|
|
714
|
+
// _PROTO_* keys are PII-tagged values meant only for privileged BQ
|
|
715
|
+
// columns. Hoist known keys to proto fields, then defensively strip any
|
|
716
|
+
// remaining _PROTO_* so an unrecognized future key can't silently land
|
|
717
|
+
// in the general-access additional_metadata blob. sink.ts applies the
|
|
718
|
+
// same strip before Datadog; this closes the 1P side.
|
|
719
|
+
const {
|
|
720
|
+
_PROTO_skill_name,
|
|
721
|
+
_PROTO_plugin_name,
|
|
722
|
+
_PROTO_marketplace_name,
|
|
723
|
+
...rest
|
|
724
|
+
} = formatted.additional
|
|
725
|
+
const additionalMetadata = stripProtoFields(rest)
|
|
726
|
+
|
|
727
|
+
events.push({
|
|
728
|
+
event_type: 'ClaudeCodeInternalEvent',
|
|
729
|
+
event_data: ClaudeCodeInternalEvent.toJSON({
|
|
730
|
+
event_id: attributes.event_id as string | undefined,
|
|
731
|
+
event_name: eventName,
|
|
732
|
+
client_timestamp: this.hrTimeToDate(log.hrTime),
|
|
733
|
+
device_id: attributes.user_id as string | undefined,
|
|
734
|
+
email: userMetadata?.email,
|
|
735
|
+
auth: formatted.auth,
|
|
736
|
+
...formatted.core,
|
|
737
|
+
env: formatted.env,
|
|
738
|
+
process: formatted.process,
|
|
739
|
+
skill_name:
|
|
740
|
+
typeof _PROTO_skill_name === 'string'
|
|
741
|
+
? _PROTO_skill_name
|
|
742
|
+
: undefined,
|
|
743
|
+
plugin_name:
|
|
744
|
+
typeof _PROTO_plugin_name === 'string'
|
|
745
|
+
? _PROTO_plugin_name
|
|
746
|
+
: undefined,
|
|
747
|
+
marketplace_name:
|
|
748
|
+
typeof _PROTO_marketplace_name === 'string'
|
|
749
|
+
? _PROTO_marketplace_name
|
|
750
|
+
: undefined,
|
|
751
|
+
additional_metadata:
|
|
752
|
+
Object.keys(additionalMetadata).length > 0
|
|
753
|
+
? Buffer.from(jsonStringify(additionalMetadata)).toString(
|
|
754
|
+
'base64',
|
|
755
|
+
)
|
|
756
|
+
: undefined,
|
|
757
|
+
}),
|
|
758
|
+
})
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
return { events }
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
async shutdown(): Promise<void> {
|
|
765
|
+
this.isShutdown = true
|
|
766
|
+
this.resetBackoff()
|
|
767
|
+
await this.forceFlush()
|
|
768
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
769
|
+
logForDebugging('1P event logging exporter shutdown complete')
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
async forceFlush(): Promise<void> {
|
|
774
|
+
await Promise.all(this.pendingExports)
|
|
775
|
+
if (process.env.USER_TYPE === 'ant') {
|
|
776
|
+
logForDebugging('1P event logging exporter flush complete')
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
function getAxiosErrorContext(error: unknown): string {
|
|
782
|
+
if (!axios.isAxiosError(error)) {
|
|
783
|
+
return errorMessage(error)
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
const parts: string[] = []
|
|
787
|
+
|
|
788
|
+
const requestId = error.response?.headers?.['request-id']
|
|
789
|
+
if (requestId) {
|
|
790
|
+
parts.push(`request-id=${requestId}`)
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
if (error.response?.status) {
|
|
794
|
+
parts.push(`status=${error.response.status}`)
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
if (error.code) {
|
|
798
|
+
parts.push(`code=${error.code}`)
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if (error.message) {
|
|
802
|
+
parts.push(error.message)
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
return parts.join(', ')
|
|
806
|
+
}
|