@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,793 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable session storage utilities.
|
|
3
|
+
*
|
|
4
|
+
* Pure Node.js — no internal dependencies on logging, experiments, or feature
|
|
5
|
+
* flags. Shared between the CLI (src/utils/sessionStorage.ts) and the VS Code
|
|
6
|
+
* extension (packages/claude-vscode/src/common-host/sessionStorage.ts).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { UUID } from 'crypto'
|
|
10
|
+
import { open as fsOpen, readdir, realpath, stat } from 'fs/promises'
|
|
11
|
+
import { join } from 'path'
|
|
12
|
+
import { getClaudeConfigHomeDir } from './envUtils.js'
|
|
13
|
+
import { getWorktreePathsPortable } from './getWorktreePathsPortable.js'
|
|
14
|
+
import { djb2Hash } from './hash.js'
|
|
15
|
+
|
|
16
|
+
/** Size of the head/tail buffer for lite metadata reads. */
|
|
17
|
+
export const LITE_READ_BUF_SIZE = 65536
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// UUID validation
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
const uuidRegex =
|
|
24
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
|
25
|
+
|
|
26
|
+
export function validateUuid(maybeUuid: unknown): UUID | null {
|
|
27
|
+
if (typeof maybeUuid !== 'string') return null
|
|
28
|
+
return uuidRegex.test(maybeUuid) ? (maybeUuid as UUID) : null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// JSON string field extraction — no full parse, works on truncated lines
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Unescape a JSON string value extracted as raw text.
|
|
37
|
+
* Only allocates a new string when escape sequences are present.
|
|
38
|
+
*/
|
|
39
|
+
export function unescapeJsonString(raw: string): string {
|
|
40
|
+
if (!raw.includes('\\')) return raw
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(`"${raw}"`)
|
|
43
|
+
} catch {
|
|
44
|
+
return raw
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Extracts a simple JSON string field value from raw text without full parsing.
|
|
50
|
+
* Looks for `"key":"value"` or `"key": "value"` patterns.
|
|
51
|
+
* Returns the first match, or undefined if not found.
|
|
52
|
+
*/
|
|
53
|
+
export function extractJsonStringField(
|
|
54
|
+
text: string,
|
|
55
|
+
key: string,
|
|
56
|
+
): string | undefined {
|
|
57
|
+
const patterns = [`"${key}":"`, `"${key}": "`]
|
|
58
|
+
for (const pattern of patterns) {
|
|
59
|
+
const idx = text.indexOf(pattern)
|
|
60
|
+
if (idx < 0) continue
|
|
61
|
+
|
|
62
|
+
const valueStart = idx + pattern.length
|
|
63
|
+
let i = valueStart
|
|
64
|
+
while (i < text.length) {
|
|
65
|
+
if (text[i] === '\\') {
|
|
66
|
+
i += 2
|
|
67
|
+
continue
|
|
68
|
+
}
|
|
69
|
+
if (text[i] === '"') {
|
|
70
|
+
return unescapeJsonString(text.slice(valueStart, i))
|
|
71
|
+
}
|
|
72
|
+
i++
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Like extractJsonStringField but finds the LAST occurrence.
|
|
80
|
+
* Useful for fields that are appended (customTitle, tag, etc.).
|
|
81
|
+
*/
|
|
82
|
+
export function extractLastJsonStringField(
|
|
83
|
+
text: string,
|
|
84
|
+
key: string,
|
|
85
|
+
): string | undefined {
|
|
86
|
+
const patterns = [`"${key}":"`, `"${key}": "`]
|
|
87
|
+
let lastValue: string | undefined
|
|
88
|
+
for (const pattern of patterns) {
|
|
89
|
+
let searchFrom = 0
|
|
90
|
+
while (true) {
|
|
91
|
+
const idx = text.indexOf(pattern, searchFrom)
|
|
92
|
+
if (idx < 0) break
|
|
93
|
+
|
|
94
|
+
const valueStart = idx + pattern.length
|
|
95
|
+
let i = valueStart
|
|
96
|
+
while (i < text.length) {
|
|
97
|
+
if (text[i] === '\\') {
|
|
98
|
+
i += 2
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
if (text[i] === '"') {
|
|
102
|
+
lastValue = unescapeJsonString(text.slice(valueStart, i))
|
|
103
|
+
break
|
|
104
|
+
}
|
|
105
|
+
i++
|
|
106
|
+
}
|
|
107
|
+
searchFrom = i + 1
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return lastValue
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// First prompt extraction from head chunk
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Pattern matching auto-generated or system messages that should be skipped
|
|
119
|
+
* when looking for the first meaningful user prompt. Matches anything that
|
|
120
|
+
* starts with a lowercase XML-like tag (IDE context, hook output, task
|
|
121
|
+
* notifications, channel messages, etc.) or a synthetic interrupt marker.
|
|
122
|
+
*/
|
|
123
|
+
const SKIP_FIRST_PROMPT_PATTERN =
|
|
124
|
+
/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/
|
|
125
|
+
|
|
126
|
+
const COMMAND_NAME_RE = /<command-name>(.*?)<\/command-name>/
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Extracts the first meaningful user prompt from a JSONL head chunk.
|
|
130
|
+
*
|
|
131
|
+
* Skips tool_result messages, isMeta, isCompactSummary, command-name messages,
|
|
132
|
+
* and auto-generated patterns (session hooks, tick, IDE metadata, etc.).
|
|
133
|
+
* Truncates to 200 chars.
|
|
134
|
+
*/
|
|
135
|
+
export function extractFirstPromptFromHead(head: string): string {
|
|
136
|
+
let start = 0
|
|
137
|
+
let commandFallback = ''
|
|
138
|
+
while (start < head.length) {
|
|
139
|
+
const newlineIdx = head.indexOf('\n', start)
|
|
140
|
+
const line =
|
|
141
|
+
newlineIdx >= 0 ? head.slice(start, newlineIdx) : head.slice(start)
|
|
142
|
+
start = newlineIdx >= 0 ? newlineIdx + 1 : head.length
|
|
143
|
+
|
|
144
|
+
if (!line.includes('"type":"user"') && !line.includes('"type": "user"'))
|
|
145
|
+
continue
|
|
146
|
+
if (line.includes('"tool_result"')) continue
|
|
147
|
+
if (line.includes('"isMeta":true') || line.includes('"isMeta": true'))
|
|
148
|
+
continue
|
|
149
|
+
if (
|
|
150
|
+
line.includes('"isCompactSummary":true') ||
|
|
151
|
+
line.includes('"isCompactSummary": true')
|
|
152
|
+
)
|
|
153
|
+
continue
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
const entry = JSON.parse(line) as Record<string, unknown>
|
|
157
|
+
if (entry.type !== 'user') continue
|
|
158
|
+
|
|
159
|
+
const message = entry.message as Record<string, unknown> | undefined
|
|
160
|
+
if (!message) continue
|
|
161
|
+
|
|
162
|
+
const content = message.content
|
|
163
|
+
const texts: string[] = []
|
|
164
|
+
if (typeof content === 'string') {
|
|
165
|
+
texts.push(content)
|
|
166
|
+
} else if (Array.isArray(content)) {
|
|
167
|
+
for (const block of content as Record<string, unknown>[]) {
|
|
168
|
+
if (block.type === 'text' && typeof block.text === 'string') {
|
|
169
|
+
texts.push(block.text as string)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for (const raw of texts) {
|
|
175
|
+
let result = raw.replace(/\n/g, ' ').trim()
|
|
176
|
+
if (!result) continue
|
|
177
|
+
|
|
178
|
+
// Skip slash-command messages but remember first as fallback
|
|
179
|
+
const cmdMatch = COMMAND_NAME_RE.exec(result)
|
|
180
|
+
if (cmdMatch) {
|
|
181
|
+
if (!commandFallback) commandFallback = cmdMatch[1]!
|
|
182
|
+
continue
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Format bash input with ! prefix before the generic XML skip
|
|
186
|
+
const bashMatch = /<bash-input>([\s\S]*?)<\/bash-input>/.exec(result)
|
|
187
|
+
if (bashMatch) return `! ${bashMatch[1]!.trim()}`
|
|
188
|
+
|
|
189
|
+
if (SKIP_FIRST_PROMPT_PATTERN.test(result)) continue
|
|
190
|
+
|
|
191
|
+
if (result.length > 200) {
|
|
192
|
+
result = result.slice(0, 200).trim() + '\u2026'
|
|
193
|
+
}
|
|
194
|
+
return result
|
|
195
|
+
}
|
|
196
|
+
} catch {
|
|
197
|
+
continue
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (commandFallback) return commandFallback
|
|
201
|
+
return ''
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// File I/O — read head and tail of a file
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Reads the first and last LITE_READ_BUF_SIZE bytes of a file.
|
|
210
|
+
*
|
|
211
|
+
* For small files where head covers tail, `tail === head`.
|
|
212
|
+
* Accepts a shared Buffer to avoid per-file allocation overhead.
|
|
213
|
+
* Returns `{ head: '', tail: '' }` on any error.
|
|
214
|
+
*/
|
|
215
|
+
export async function readHeadAndTail(
|
|
216
|
+
filePath: string,
|
|
217
|
+
fileSize: number,
|
|
218
|
+
buf: Buffer,
|
|
219
|
+
): Promise<{ head: string; tail: string }> {
|
|
220
|
+
try {
|
|
221
|
+
const fh = await fsOpen(filePath, 'r')
|
|
222
|
+
try {
|
|
223
|
+
const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)
|
|
224
|
+
if (headResult.bytesRead === 0) return { head: '', tail: '' }
|
|
225
|
+
|
|
226
|
+
const head = buf.toString('utf8', 0, headResult.bytesRead)
|
|
227
|
+
|
|
228
|
+
const tailOffset = Math.max(0, fileSize - LITE_READ_BUF_SIZE)
|
|
229
|
+
let tail = head
|
|
230
|
+
if (tailOffset > 0) {
|
|
231
|
+
const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)
|
|
232
|
+
tail = buf.toString('utf8', 0, tailResult.bytesRead)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return { head, tail }
|
|
236
|
+
} finally {
|
|
237
|
+
await fh.close()
|
|
238
|
+
}
|
|
239
|
+
} catch {
|
|
240
|
+
return { head: '', tail: '' }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export type LiteSessionFile = {
|
|
245
|
+
mtime: number
|
|
246
|
+
size: number
|
|
247
|
+
head: string
|
|
248
|
+
tail: string
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Opens a single session file, stats it, and reads head + tail in one fd.
|
|
253
|
+
* Allocates its own buffer — safe for concurrent use with Promise.all.
|
|
254
|
+
* Returns null on any error.
|
|
255
|
+
*/
|
|
256
|
+
export async function readSessionLite(
|
|
257
|
+
filePath: string,
|
|
258
|
+
): Promise<LiteSessionFile | null> {
|
|
259
|
+
try {
|
|
260
|
+
const fh = await fsOpen(filePath, 'r')
|
|
261
|
+
try {
|
|
262
|
+
const stat = await fh.stat()
|
|
263
|
+
const buf = Buffer.allocUnsafe(LITE_READ_BUF_SIZE)
|
|
264
|
+
const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)
|
|
265
|
+
if (headResult.bytesRead === 0) return null
|
|
266
|
+
|
|
267
|
+
const head = buf.toString('utf8', 0, headResult.bytesRead)
|
|
268
|
+
const tailOffset = Math.max(0, stat.size - LITE_READ_BUF_SIZE)
|
|
269
|
+
let tail = head
|
|
270
|
+
if (tailOffset > 0) {
|
|
271
|
+
const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)
|
|
272
|
+
tail = buf.toString('utf8', 0, tailResult.bytesRead)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return { mtime: stat.mtime.getTime(), size: stat.size, head, tail }
|
|
276
|
+
} finally {
|
|
277
|
+
await fh.close()
|
|
278
|
+
}
|
|
279
|
+
} catch {
|
|
280
|
+
return null
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// ---------------------------------------------------------------------------
|
|
285
|
+
// Path sanitization
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Maximum length for a single filesystem path component (directory or file name).
|
|
290
|
+
* Most filesystems (ext4, APFS, NTFS) limit individual components to 255 bytes.
|
|
291
|
+
* We use 200 to leave room for the hash suffix and separator.
|
|
292
|
+
*/
|
|
293
|
+
export const MAX_SANITIZED_LENGTH = 200
|
|
294
|
+
|
|
295
|
+
function simpleHash(str: string): string {
|
|
296
|
+
return Math.abs(djb2Hash(str)).toString(36)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Makes a string safe for use as a directory or file name.
|
|
301
|
+
* Replaces all non-alphanumeric characters with hyphens.
|
|
302
|
+
* This ensures compatibility across all platforms, including Windows
|
|
303
|
+
* where characters like colons are reserved.
|
|
304
|
+
*
|
|
305
|
+
* For deeply nested paths that would exceed filesystem limits (255 bytes),
|
|
306
|
+
* truncates and appends a hash suffix for uniqueness.
|
|
307
|
+
*
|
|
308
|
+
* @param name - The string to make safe (e.g., '/Users/foo/my-project' or 'plugin:name:server')
|
|
309
|
+
* @returns A safe name (e.g., '-Users-foo-my-project' or 'plugin-name-server')
|
|
310
|
+
*/
|
|
311
|
+
export function sanitizePath(name: string): string {
|
|
312
|
+
const sanitized = name.replace(/[^a-zA-Z0-9]/g, '-')
|
|
313
|
+
if (sanitized.length <= MAX_SANITIZED_LENGTH) {
|
|
314
|
+
return sanitized
|
|
315
|
+
}
|
|
316
|
+
const hash =
|
|
317
|
+
typeof Bun !== 'undefined' ? Bun.hash(name).toString(36) : simpleHash(name)
|
|
318
|
+
return `${sanitized.slice(0, MAX_SANITIZED_LENGTH)}-${hash}`
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
// Project directory discovery (shared by listSessions & getSessionMessages)
|
|
323
|
+
// ---------------------------------------------------------------------------
|
|
324
|
+
|
|
325
|
+
export function getProjectsDir(): string {
|
|
326
|
+
return join(getClaudeConfigHomeDir(), 'projects')
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export function getProjectDir(projectDir: string): string {
|
|
330
|
+
return join(getProjectsDir(), sanitizePath(projectDir))
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Resolves a directory path to its canonical form using realpath + NFC
|
|
335
|
+
* normalization. Falls back to NFC-only if realpath fails (e.g., the
|
|
336
|
+
* directory doesn't exist yet). Ensures symlinked paths (e.g.,
|
|
337
|
+
* /tmp → /private/tmp on macOS) resolve to the same project directory.
|
|
338
|
+
*/
|
|
339
|
+
export async function canonicalizePath(dir: string): Promise<string> {
|
|
340
|
+
try {
|
|
341
|
+
return (await realpath(dir)).normalize('NFC')
|
|
342
|
+
} catch {
|
|
343
|
+
return dir.normalize('NFC')
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Finds the project directory for a given path, tolerating hash mismatches
|
|
349
|
+
* for long paths (>200 chars). The CLI uses Bun.hash while the SDK under
|
|
350
|
+
* Node.js uses simpleHash — for paths that exceed MAX_SANITIZED_LENGTH,
|
|
351
|
+
* these produce different directory suffixes. This function falls back to
|
|
352
|
+
* prefix-based scanning when the exact match doesn't exist.
|
|
353
|
+
*/
|
|
354
|
+
export async function findProjectDir(
|
|
355
|
+
projectPath: string,
|
|
356
|
+
): Promise<string | undefined> {
|
|
357
|
+
const exact = getProjectDir(projectPath)
|
|
358
|
+
try {
|
|
359
|
+
await readdir(exact)
|
|
360
|
+
return exact
|
|
361
|
+
} catch {
|
|
362
|
+
// Exact match failed — for short paths this means no sessions exist.
|
|
363
|
+
// For long paths, try prefix matching to handle hash mismatches.
|
|
364
|
+
const sanitized = sanitizePath(projectPath)
|
|
365
|
+
if (sanitized.length <= MAX_SANITIZED_LENGTH) {
|
|
366
|
+
return undefined
|
|
367
|
+
}
|
|
368
|
+
const prefix = sanitized.slice(0, MAX_SANITIZED_LENGTH)
|
|
369
|
+
const projectsDir = getProjectsDir()
|
|
370
|
+
try {
|
|
371
|
+
const dirents = await readdir(projectsDir, { withFileTypes: true })
|
|
372
|
+
const match = dirents.find(
|
|
373
|
+
d => d.isDirectory() && d.name.startsWith(prefix + '-'),
|
|
374
|
+
)
|
|
375
|
+
return match ? join(projectsDir, match.name) : undefined
|
|
376
|
+
} catch {
|
|
377
|
+
return undefined
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Resolve a sessionId to its on-disk JSONL file path.
|
|
384
|
+
*
|
|
385
|
+
* When `dir` is provided: canonicalize it, look in that project's directory
|
|
386
|
+
* (with findProjectDir fallback for Bun/Node hash mismatches), then fall back
|
|
387
|
+
* to sibling git worktrees. `projectPath` in the result is the canonical
|
|
388
|
+
* user-facing directory the file was found under.
|
|
389
|
+
*
|
|
390
|
+
* When `dir` is omitted: scan all project directories under ~/.claude/projects/.
|
|
391
|
+
* `projectPath` is undefined in this case (no meaningful project path to report).
|
|
392
|
+
*
|
|
393
|
+
* Existence is checked by stat (operate-then-catch-ENOENT, no existsSync).
|
|
394
|
+
* Zero-byte files are treated as not-found so callers continue searching past
|
|
395
|
+
* a truncated copy to find a valid one in a sibling directory.
|
|
396
|
+
*
|
|
397
|
+
* `fileSize` is returned so callers (loadSessionBuffer) don't need to re-stat.
|
|
398
|
+
*
|
|
399
|
+
* Shared by getSessionInfoImpl and getSessionMessagesImpl — the caller
|
|
400
|
+
* invokes its own reader (readSessionLite / loadSessionBuffer) on the
|
|
401
|
+
* resolved path.
|
|
402
|
+
*/
|
|
403
|
+
export async function resolveSessionFilePath(
|
|
404
|
+
sessionId: string,
|
|
405
|
+
dir?: string,
|
|
406
|
+
): Promise<
|
|
407
|
+
| { filePath: string; projectPath: string | undefined; fileSize: number }
|
|
408
|
+
| undefined
|
|
409
|
+
> {
|
|
410
|
+
const fileName = `${sessionId}.jsonl`
|
|
411
|
+
|
|
412
|
+
if (dir) {
|
|
413
|
+
const canonical = await canonicalizePath(dir)
|
|
414
|
+
const projectDir = await findProjectDir(canonical)
|
|
415
|
+
if (projectDir) {
|
|
416
|
+
const filePath = join(projectDir, fileName)
|
|
417
|
+
try {
|
|
418
|
+
const s = await stat(filePath)
|
|
419
|
+
if (s.size > 0)
|
|
420
|
+
return { filePath, projectPath: canonical, fileSize: s.size }
|
|
421
|
+
} catch {
|
|
422
|
+
// ENOENT/EACCES — keep searching
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Worktree fallback — sessions may live under a different worktree root
|
|
426
|
+
let worktreePaths: string[]
|
|
427
|
+
try {
|
|
428
|
+
worktreePaths = await getWorktreePathsPortable(canonical)
|
|
429
|
+
} catch {
|
|
430
|
+
worktreePaths = []
|
|
431
|
+
}
|
|
432
|
+
for (const wt of worktreePaths) {
|
|
433
|
+
if (wt === canonical) continue
|
|
434
|
+
const wtProjectDir = await findProjectDir(wt)
|
|
435
|
+
if (!wtProjectDir) continue
|
|
436
|
+
const filePath = join(wtProjectDir, fileName)
|
|
437
|
+
try {
|
|
438
|
+
const s = await stat(filePath)
|
|
439
|
+
if (s.size > 0) return { filePath, projectPath: wt, fileSize: s.size }
|
|
440
|
+
} catch {
|
|
441
|
+
// ENOENT/EACCES — keep searching
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return undefined
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// No dir — scan all project directories
|
|
448
|
+
const projectsDir = getProjectsDir()
|
|
449
|
+
let dirents: string[]
|
|
450
|
+
try {
|
|
451
|
+
dirents = await readdir(projectsDir)
|
|
452
|
+
} catch {
|
|
453
|
+
return undefined
|
|
454
|
+
}
|
|
455
|
+
for (const name of dirents) {
|
|
456
|
+
const filePath = join(projectsDir, name, fileName)
|
|
457
|
+
try {
|
|
458
|
+
const s = await stat(filePath)
|
|
459
|
+
if (s.size > 0)
|
|
460
|
+
return { filePath, projectPath: undefined, fileSize: s.size }
|
|
461
|
+
} catch {
|
|
462
|
+
// ENOENT/ENOTDIR — not in this project, keep scanning
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return undefined
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
469
|
+
// Compact-boundary chunked read (shared by loadTranscriptFile & SDK getSessionMessages)
|
|
470
|
+
// ---------------------------------------------------------------------------
|
|
471
|
+
|
|
472
|
+
/** Chunk size for the forward transcript reader. 1 MB balances I/O calls vs buffer growth. */
|
|
473
|
+
const TRANSCRIPT_READ_CHUNK_SIZE = 1024 * 1024
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* File size below which precompact filtering is skipped.
|
|
477
|
+
* Large sessions (>5 MB) almost always have compact boundaries — they got big
|
|
478
|
+
* because of many turns triggering auto-compact.
|
|
479
|
+
*/
|
|
480
|
+
export const SKIP_PRECOMPACT_THRESHOLD = 5 * 1024 * 1024
|
|
481
|
+
|
|
482
|
+
/** Marker bytes searched for when locating the boundary. Lazy: allocated on
|
|
483
|
+
* first use, not at module load. Most sessions never resume. */
|
|
484
|
+
let _compactBoundaryMarker: Buffer | undefined
|
|
485
|
+
function compactBoundaryMarker(): Buffer {
|
|
486
|
+
return (_compactBoundaryMarker ??= Buffer.from('"compact_boundary"'))
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Confirm a byte-matched line is a real compact_boundary (marker can appear
|
|
491
|
+
* inside user content) and check for preservedSegment.
|
|
492
|
+
*/
|
|
493
|
+
function parseBoundaryLine(
|
|
494
|
+
line: string,
|
|
495
|
+
): { hasPreservedSegment: boolean } | null {
|
|
496
|
+
try {
|
|
497
|
+
const parsed = JSON.parse(line) as {
|
|
498
|
+
type?: string
|
|
499
|
+
subtype?: string
|
|
500
|
+
compactMetadata?: { preservedSegment?: unknown }
|
|
501
|
+
}
|
|
502
|
+
if (parsed.type !== 'system' || parsed.subtype !== 'compact_boundary') {
|
|
503
|
+
return null
|
|
504
|
+
}
|
|
505
|
+
return {
|
|
506
|
+
hasPreservedSegment: Boolean(parsed.compactMetadata?.preservedSegment),
|
|
507
|
+
}
|
|
508
|
+
} catch {
|
|
509
|
+
return null
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Single forward chunked read for the --resume load path. Attr-snap lines
|
|
515
|
+
* are skipped at the fd level; compact boundaries truncate in-stream. Peak
|
|
516
|
+
* is the output size, not the file size.
|
|
517
|
+
*
|
|
518
|
+
* The surviving (last) attr-snap is appended at EOF instead of in-place;
|
|
519
|
+
* restoreAttributionStateFromSnapshots only reads [length-1] so position
|
|
520
|
+
* doesn't matter.
|
|
521
|
+
*/
|
|
522
|
+
|
|
523
|
+
type Sink = { buf: Buffer; len: number; cap: number }
|
|
524
|
+
|
|
525
|
+
function sinkWrite(s: Sink, src: Buffer, start: number, end: number): void {
|
|
526
|
+
const n = end - start
|
|
527
|
+
if (n <= 0) return
|
|
528
|
+
if (s.len + n > s.buf.length) {
|
|
529
|
+
const grown = Buffer.allocUnsafe(
|
|
530
|
+
Math.min(Math.max(s.buf.length * 2, s.len + n), s.cap),
|
|
531
|
+
)
|
|
532
|
+
s.buf.copy(grown, 0, 0, s.len)
|
|
533
|
+
s.buf = grown
|
|
534
|
+
}
|
|
535
|
+
src.copy(s.buf, s.len, start, end)
|
|
536
|
+
s.len += n
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
function hasPrefix(
|
|
540
|
+
src: Buffer,
|
|
541
|
+
prefix: Buffer,
|
|
542
|
+
at: number,
|
|
543
|
+
end: number,
|
|
544
|
+
): boolean {
|
|
545
|
+
return (
|
|
546
|
+
end - at >= prefix.length &&
|
|
547
|
+
src.compare(prefix, 0, prefix.length, at, at + prefix.length) === 0
|
|
548
|
+
)
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const ATTR_SNAP_PREFIX = Buffer.from('{"type":"attribution-snapshot"')
|
|
552
|
+
const SYSTEM_PREFIX = Buffer.from('{"type":"system"')
|
|
553
|
+
const LF = 0x0a
|
|
554
|
+
const LF_BYTE = Buffer.from([LF])
|
|
555
|
+
const BOUNDARY_SEARCH_BOUND = 256 // marker sits ~28 bytes in; 256 is slack
|
|
556
|
+
|
|
557
|
+
type LoadState = {
|
|
558
|
+
out: Sink
|
|
559
|
+
boundaryStartOffset: number
|
|
560
|
+
hasPreservedSegment: boolean
|
|
561
|
+
lastSnapSrc: Buffer | null // most-recent attr-snap, appended at EOF
|
|
562
|
+
lastSnapLen: number
|
|
563
|
+
lastSnapBuf: Buffer | undefined
|
|
564
|
+
bufFileOff: number // file offset of buf[0]
|
|
565
|
+
carryLen: number
|
|
566
|
+
carryBuf: Buffer | undefined
|
|
567
|
+
straddleSnapCarryLen: number // per-chunk; reset by processStraddle
|
|
568
|
+
straddleSnapTailEnd: number
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// Line spanning the chunk seam. 0 = fall through to concat.
|
|
572
|
+
function processStraddle(
|
|
573
|
+
s: LoadState,
|
|
574
|
+
chunk: Buffer,
|
|
575
|
+
bytesRead: number,
|
|
576
|
+
): number {
|
|
577
|
+
s.straddleSnapCarryLen = 0
|
|
578
|
+
s.straddleSnapTailEnd = 0
|
|
579
|
+
if (s.carryLen === 0) return 0
|
|
580
|
+
const cb = s.carryBuf!
|
|
581
|
+
const firstNl = chunk.indexOf(LF)
|
|
582
|
+
if (firstNl === -1 || firstNl >= bytesRead) return 0
|
|
583
|
+
const tailEnd = firstNl + 1
|
|
584
|
+
if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {
|
|
585
|
+
s.straddleSnapCarryLen = s.carryLen
|
|
586
|
+
s.straddleSnapTailEnd = tailEnd
|
|
587
|
+
s.lastSnapSrc = null
|
|
588
|
+
} else if (s.carryLen < ATTR_SNAP_PREFIX.length) {
|
|
589
|
+
return 0 // too short to rule out attr-snap
|
|
590
|
+
} else {
|
|
591
|
+
if (hasPrefix(cb, SYSTEM_PREFIX, 0, s.carryLen)) {
|
|
592
|
+
const hit = parseBoundaryLine(
|
|
593
|
+
cb.toString('utf-8', 0, s.carryLen) +
|
|
594
|
+
chunk.toString('utf-8', 0, firstNl),
|
|
595
|
+
)
|
|
596
|
+
if (hit?.hasPreservedSegment) {
|
|
597
|
+
s.hasPreservedSegment = true
|
|
598
|
+
} else if (hit) {
|
|
599
|
+
s.out.len = 0
|
|
600
|
+
s.boundaryStartOffset = s.bufFileOff
|
|
601
|
+
s.hasPreservedSegment = false
|
|
602
|
+
s.lastSnapSrc = null
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
sinkWrite(s.out, cb, 0, s.carryLen)
|
|
606
|
+
sinkWrite(s.out, chunk, 0, tailEnd)
|
|
607
|
+
}
|
|
608
|
+
s.bufFileOff += s.carryLen + tailEnd
|
|
609
|
+
s.carryLen = 0
|
|
610
|
+
return tailEnd
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// Strip attr-snaps, truncate on boundaries. Kept lines write as runs.
|
|
614
|
+
function scanChunkLines(
|
|
615
|
+
s: LoadState,
|
|
616
|
+
buf: Buffer,
|
|
617
|
+
boundaryMarker: Buffer,
|
|
618
|
+
): { lastSnapStart: number; lastSnapEnd: number; trailStart: number } {
|
|
619
|
+
let boundaryAt = buf.indexOf(boundaryMarker)
|
|
620
|
+
let runStart = 0
|
|
621
|
+
let lineStart = 0
|
|
622
|
+
let lastSnapStart = -1
|
|
623
|
+
let lastSnapEnd = -1
|
|
624
|
+
let nl = buf.indexOf(LF)
|
|
625
|
+
while (nl !== -1) {
|
|
626
|
+
const lineEnd = nl + 1
|
|
627
|
+
if (boundaryAt !== -1 && boundaryAt < lineStart) {
|
|
628
|
+
boundaryAt = buf.indexOf(boundaryMarker, lineStart)
|
|
629
|
+
}
|
|
630
|
+
if (hasPrefix(buf, ATTR_SNAP_PREFIX, lineStart, lineEnd)) {
|
|
631
|
+
sinkWrite(s.out, buf, runStart, lineStart)
|
|
632
|
+
lastSnapStart = lineStart
|
|
633
|
+
lastSnapEnd = lineEnd
|
|
634
|
+
runStart = lineEnd
|
|
635
|
+
} else if (
|
|
636
|
+
boundaryAt >= lineStart &&
|
|
637
|
+
boundaryAt < Math.min(lineStart + BOUNDARY_SEARCH_BOUND, lineEnd)
|
|
638
|
+
) {
|
|
639
|
+
const hit = parseBoundaryLine(buf.toString('utf-8', lineStart, nl))
|
|
640
|
+
if (hit?.hasPreservedSegment) {
|
|
641
|
+
s.hasPreservedSegment = true // don't truncate; preserved msgs already in output
|
|
642
|
+
} else if (hit) {
|
|
643
|
+
s.out.len = 0
|
|
644
|
+
s.boundaryStartOffset = s.bufFileOff + lineStart
|
|
645
|
+
s.hasPreservedSegment = false
|
|
646
|
+
s.lastSnapSrc = null
|
|
647
|
+
lastSnapStart = -1
|
|
648
|
+
s.straddleSnapCarryLen = 0
|
|
649
|
+
runStart = lineStart
|
|
650
|
+
}
|
|
651
|
+
boundaryAt = buf.indexOf(
|
|
652
|
+
boundaryMarker,
|
|
653
|
+
boundaryAt + boundaryMarker.length,
|
|
654
|
+
)
|
|
655
|
+
}
|
|
656
|
+
lineStart = lineEnd
|
|
657
|
+
nl = buf.indexOf(LF, lineStart)
|
|
658
|
+
}
|
|
659
|
+
sinkWrite(s.out, buf, runStart, lineStart)
|
|
660
|
+
return { lastSnapStart, lastSnapEnd, trailStart: lineStart }
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// In-buf snap wins over straddle (later in file). carryBuf still valid here.
|
|
664
|
+
function captureSnap(
|
|
665
|
+
s: LoadState,
|
|
666
|
+
buf: Buffer,
|
|
667
|
+
chunk: Buffer,
|
|
668
|
+
lastSnapStart: number,
|
|
669
|
+
lastSnapEnd: number,
|
|
670
|
+
): void {
|
|
671
|
+
if (lastSnapStart !== -1) {
|
|
672
|
+
s.lastSnapLen = lastSnapEnd - lastSnapStart
|
|
673
|
+
if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {
|
|
674
|
+
s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)
|
|
675
|
+
}
|
|
676
|
+
buf.copy(s.lastSnapBuf, 0, lastSnapStart, lastSnapEnd)
|
|
677
|
+
s.lastSnapSrc = s.lastSnapBuf
|
|
678
|
+
} else if (s.straddleSnapCarryLen > 0) {
|
|
679
|
+
s.lastSnapLen = s.straddleSnapCarryLen + s.straddleSnapTailEnd
|
|
680
|
+
if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {
|
|
681
|
+
s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)
|
|
682
|
+
}
|
|
683
|
+
s.carryBuf!.copy(s.lastSnapBuf, 0, 0, s.straddleSnapCarryLen)
|
|
684
|
+
chunk.copy(s.lastSnapBuf, s.straddleSnapCarryLen, 0, s.straddleSnapTailEnd)
|
|
685
|
+
s.lastSnapSrc = s.lastSnapBuf
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
function captureCarry(s: LoadState, buf: Buffer, trailStart: number): void {
|
|
690
|
+
s.carryLen = buf.length - trailStart
|
|
691
|
+
if (s.carryLen > 0) {
|
|
692
|
+
if (s.carryBuf === undefined || s.carryLen > s.carryBuf.length) {
|
|
693
|
+
s.carryBuf = Buffer.allocUnsafe(s.carryLen)
|
|
694
|
+
}
|
|
695
|
+
buf.copy(s.carryBuf, 0, trailStart, buf.length)
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
function finalizeOutput(s: LoadState): void {
|
|
700
|
+
if (s.carryLen > 0) {
|
|
701
|
+
const cb = s.carryBuf!
|
|
702
|
+
if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {
|
|
703
|
+
s.lastSnapSrc = cb
|
|
704
|
+
s.lastSnapLen = s.carryLen
|
|
705
|
+
} else {
|
|
706
|
+
sinkWrite(s.out, cb, 0, s.carryLen)
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
if (s.lastSnapSrc) {
|
|
710
|
+
if (s.out.len > 0 && s.out.buf[s.out.len - 1] !== LF) {
|
|
711
|
+
sinkWrite(s.out, LF_BYTE, 0, 1)
|
|
712
|
+
}
|
|
713
|
+
sinkWrite(s.out, s.lastSnapSrc, 0, s.lastSnapLen)
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
export async function readTranscriptForLoad(
|
|
718
|
+
filePath: string,
|
|
719
|
+
fileSize: number,
|
|
720
|
+
): Promise<{
|
|
721
|
+
boundaryStartOffset: number
|
|
722
|
+
postBoundaryBuf: Buffer
|
|
723
|
+
hasPreservedSegment: boolean
|
|
724
|
+
}> {
|
|
725
|
+
const boundaryMarker = compactBoundaryMarker()
|
|
726
|
+
const CHUNK_SIZE = TRANSCRIPT_READ_CHUNK_SIZE
|
|
727
|
+
|
|
728
|
+
const s: LoadState = {
|
|
729
|
+
out: {
|
|
730
|
+
// Gated callers enter with fileSize > 5MB, so min(fileSize, 8MB) lands
|
|
731
|
+
// in [5, 8]MB; large boundaryless sessions (24-31MB output) take 2
|
|
732
|
+
// grows. Ungated callers (attribution.ts) pass small files too — the
|
|
733
|
+
// min just right-sizes the initial buf, no grows.
|
|
734
|
+
buf: Buffer.allocUnsafe(Math.min(fileSize, 8 * 1024 * 1024)),
|
|
735
|
+
len: 0,
|
|
736
|
+
// +1: finalizeOutput may insert one LF between a non-LF-terminated
|
|
737
|
+
// carry and the reordered last attr-snap (crash-truncated file).
|
|
738
|
+
cap: fileSize + 1,
|
|
739
|
+
},
|
|
740
|
+
boundaryStartOffset: 0,
|
|
741
|
+
hasPreservedSegment: false,
|
|
742
|
+
lastSnapSrc: null,
|
|
743
|
+
lastSnapLen: 0,
|
|
744
|
+
lastSnapBuf: undefined,
|
|
745
|
+
bufFileOff: 0,
|
|
746
|
+
carryLen: 0,
|
|
747
|
+
carryBuf: undefined,
|
|
748
|
+
straddleSnapCarryLen: 0,
|
|
749
|
+
straddleSnapTailEnd: 0,
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
const chunk = Buffer.allocUnsafe(CHUNK_SIZE)
|
|
753
|
+
const fd = await fsOpen(filePath, 'r')
|
|
754
|
+
try {
|
|
755
|
+
let filePos = 0
|
|
756
|
+
while (filePos < fileSize) {
|
|
757
|
+
const { bytesRead } = await fd.read(
|
|
758
|
+
chunk,
|
|
759
|
+
0,
|
|
760
|
+
Math.min(CHUNK_SIZE, fileSize - filePos),
|
|
761
|
+
filePos,
|
|
762
|
+
)
|
|
763
|
+
if (bytesRead === 0) break
|
|
764
|
+
filePos += bytesRead
|
|
765
|
+
|
|
766
|
+
const chunkOff = processStraddle(s, chunk, bytesRead)
|
|
767
|
+
|
|
768
|
+
let buf: Buffer
|
|
769
|
+
if (s.carryLen > 0) {
|
|
770
|
+
const bufLen = s.carryLen + (bytesRead - chunkOff)
|
|
771
|
+
buf = Buffer.allocUnsafe(bufLen)
|
|
772
|
+
s.carryBuf!.copy(buf, 0, 0, s.carryLen)
|
|
773
|
+
chunk.copy(buf, s.carryLen, chunkOff, bytesRead)
|
|
774
|
+
} else {
|
|
775
|
+
buf = chunk.subarray(chunkOff, bytesRead)
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
const r = scanChunkLines(s, buf, boundaryMarker)
|
|
779
|
+
captureSnap(s, buf, chunk, r.lastSnapStart, r.lastSnapEnd)
|
|
780
|
+
captureCarry(s, buf, r.trailStart)
|
|
781
|
+
s.bufFileOff += r.trailStart
|
|
782
|
+
}
|
|
783
|
+
finalizeOutput(s)
|
|
784
|
+
} finally {
|
|
785
|
+
await fd.close()
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
return {
|
|
789
|
+
boundaryStartOffset: s.boundaryStartOffset,
|
|
790
|
+
postBoundaryBuf: s.out.buf.subarray(0, s.out.len),
|
|
791
|
+
hasPreservedSegment: s.hasPreservedSegment,
|
|
792
|
+
}
|
|
793
|
+
}
|