@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,104 @@
|
|
|
1
|
+
import { createHash } from 'crypto'
|
|
2
|
+
import { mkdir, readdir, readFile, stat, unlink, writeFile } from 'fs/promises'
|
|
3
|
+
import { join } from 'path'
|
|
4
|
+
import { logForDebugging } from './debug.js'
|
|
5
|
+
import { getClaudeConfigHomeDir } from './envUtils.js'
|
|
6
|
+
import { isENOENT } from './errors.js'
|
|
7
|
+
|
|
8
|
+
const PASTE_STORE_DIR = 'paste-cache'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get the paste store directory (persistent across sessions).
|
|
12
|
+
*/
|
|
13
|
+
function getPasteStoreDir(): string {
|
|
14
|
+
return join(getClaudeConfigHomeDir(), PASTE_STORE_DIR)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Generate a hash for paste content to use as filename.
|
|
19
|
+
* Exported so callers can get the hash synchronously before async storage.
|
|
20
|
+
*/
|
|
21
|
+
export function hashPastedText(content: string): string {
|
|
22
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the file path for a paste by its content hash.
|
|
27
|
+
*/
|
|
28
|
+
function getPastePath(hash: string): string {
|
|
29
|
+
return join(getPasteStoreDir(), `${hash}.txt`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Store pasted text content to disk.
|
|
34
|
+
* The hash should be pre-computed with hashPastedText() so the caller
|
|
35
|
+
* can use it immediately without waiting for the async disk write.
|
|
36
|
+
*/
|
|
37
|
+
export async function storePastedText(
|
|
38
|
+
hash: string,
|
|
39
|
+
content: string,
|
|
40
|
+
): Promise<void> {
|
|
41
|
+
try {
|
|
42
|
+
const dir = getPasteStoreDir()
|
|
43
|
+
await mkdir(dir, { recursive: true })
|
|
44
|
+
|
|
45
|
+
const pastePath = getPastePath(hash)
|
|
46
|
+
|
|
47
|
+
// Content-addressable: same hash = same content, so overwriting is safe
|
|
48
|
+
await writeFile(pastePath, content, { encoding: 'utf8', mode: 0o600 })
|
|
49
|
+
logForDebugging(`Stored paste ${hash} to ${pastePath}`)
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logForDebugging(`Failed to store paste: ${error}`)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Retrieve pasted text content by its hash.
|
|
57
|
+
* Returns null if not found or on error.
|
|
58
|
+
*/
|
|
59
|
+
export async function retrievePastedText(hash: string): Promise<string | null> {
|
|
60
|
+
try {
|
|
61
|
+
const pastePath = getPastePath(hash)
|
|
62
|
+
return await readFile(pastePath, { encoding: 'utf8' })
|
|
63
|
+
} catch (error) {
|
|
64
|
+
// ENOENT is expected when paste doesn't exist
|
|
65
|
+
if (!isENOENT(error)) {
|
|
66
|
+
logForDebugging(`Failed to retrieve paste ${hash}: ${error}`)
|
|
67
|
+
}
|
|
68
|
+
return null
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Clean up old paste files that are no longer referenced.
|
|
74
|
+
* This is a simple time-based cleanup - removes files older than cutoffDate.
|
|
75
|
+
*/
|
|
76
|
+
export async function cleanupOldPastes(cutoffDate: Date): Promise<void> {
|
|
77
|
+
const pasteDir = getPasteStoreDir()
|
|
78
|
+
|
|
79
|
+
let files
|
|
80
|
+
try {
|
|
81
|
+
files = await readdir(pasteDir)
|
|
82
|
+
} catch {
|
|
83
|
+
// Directory doesn't exist or can't be read - nothing to clean up
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const cutoffTime = cutoffDate.getTime()
|
|
88
|
+
for (const file of files) {
|
|
89
|
+
if (!file.endsWith('.txt')) {
|
|
90
|
+
continue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const filePath = join(pasteDir, file)
|
|
94
|
+
try {
|
|
95
|
+
const stats = await stat(filePath)
|
|
96
|
+
if (stats.mtimeMs < cutoffTime) {
|
|
97
|
+
await unlink(filePath)
|
|
98
|
+
logForDebugging(`Cleaned up old paste: ${filePath}`)
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
// Ignore errors for individual files
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
package/utils/path.ts
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { homedir } from 'os'
|
|
2
|
+
import { dirname, isAbsolute, join, normalize, relative, resolve } from 'path'
|
|
3
|
+
import { getCwd } from './cwd.js'
|
|
4
|
+
import { getFsImplementation } from './fsOperations.js'
|
|
5
|
+
import { getPlatform } from './platform.js'
|
|
6
|
+
import { posixPathToWindowsPath } from './windowsPaths.js'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Expands a path that may contain tilde notation (~) to an absolute path.
|
|
10
|
+
*
|
|
11
|
+
* On Windows, POSIX-style paths (e.g., `/c/Users/...`) are automatically converted
|
|
12
|
+
* to Windows format (e.g., `C:\Users\...`). The function always returns paths in
|
|
13
|
+
* the native format for the current platform.
|
|
14
|
+
*
|
|
15
|
+
* @param path - The path to expand, may contain:
|
|
16
|
+
* - `~` - expands to user's home directory
|
|
17
|
+
* - `~/path` - expands to path within user's home directory
|
|
18
|
+
* - absolute paths - returned normalized
|
|
19
|
+
* - relative paths - resolved relative to baseDir
|
|
20
|
+
* - POSIX paths on Windows - converted to Windows format
|
|
21
|
+
* @param baseDir - The base directory for resolving relative paths (defaults to current working directory)
|
|
22
|
+
* @returns The expanded absolute path in the native format for the current platform
|
|
23
|
+
*
|
|
24
|
+
* @throws {Error} If path is invalid
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* expandPath('~') // '/home/user'
|
|
28
|
+
* expandPath('~/Documents') // '/home/user/Documents'
|
|
29
|
+
* expandPath('./src', '/project') // '/project/src'
|
|
30
|
+
* expandPath('/absolute/path') // '/absolute/path'
|
|
31
|
+
*/
|
|
32
|
+
export function expandPath(path: string, baseDir?: string): string {
|
|
33
|
+
// Set default baseDir to getCwd() if not provided
|
|
34
|
+
const actualBaseDir = baseDir ?? getCwd() ?? getFsImplementation().cwd()
|
|
35
|
+
|
|
36
|
+
// Input validation
|
|
37
|
+
if (typeof path !== 'string') {
|
|
38
|
+
throw new TypeError(`Path must be a string, received ${typeof path}`)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (typeof actualBaseDir !== 'string') {
|
|
42
|
+
throw new TypeError(
|
|
43
|
+
`Base directory must be a string, received ${typeof actualBaseDir}`,
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Security: Check for null bytes
|
|
48
|
+
if (path.includes('\0') || actualBaseDir.includes('\0')) {
|
|
49
|
+
throw new Error('Path contains null bytes')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Handle empty or whitespace-only paths
|
|
53
|
+
const trimmedPath = path.trim()
|
|
54
|
+
if (!trimmedPath) {
|
|
55
|
+
return normalize(actualBaseDir).normalize('NFC')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Handle home directory notation
|
|
59
|
+
if (trimmedPath === '~') {
|
|
60
|
+
return homedir().normalize('NFC')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (trimmedPath.startsWith('~/')) {
|
|
64
|
+
return join(homedir(), trimmedPath.slice(2)).normalize('NFC')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// On Windows, convert POSIX-style paths (e.g., /c/Users/...) to Windows format
|
|
68
|
+
let processedPath = trimmedPath
|
|
69
|
+
if (getPlatform() === 'windows' && trimmedPath.match(/^\/[a-z]\//i)) {
|
|
70
|
+
try {
|
|
71
|
+
processedPath = posixPathToWindowsPath(trimmedPath)
|
|
72
|
+
} catch {
|
|
73
|
+
// If conversion fails, use original path
|
|
74
|
+
processedPath = trimmedPath
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Handle absolute paths
|
|
79
|
+
if (isAbsolute(processedPath)) {
|
|
80
|
+
return normalize(processedPath).normalize('NFC')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Handle relative paths
|
|
84
|
+
return resolve(actualBaseDir, processedPath).normalize('NFC')
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Converts an absolute path to a relative path from cwd, to save tokens in
|
|
89
|
+
* tool output. If the path is outside cwd (relative path would start with ..),
|
|
90
|
+
* returns the absolute path unchanged so it stays unambiguous.
|
|
91
|
+
*
|
|
92
|
+
* @param absolutePath - The absolute path to relativize
|
|
93
|
+
* @returns Relative path if under cwd, otherwise the original absolute path
|
|
94
|
+
*/
|
|
95
|
+
export function toRelativePath(absolutePath: string): string {
|
|
96
|
+
const relativePath = relative(getCwd(), absolutePath)
|
|
97
|
+
// If the relative path would go outside cwd (starts with ..), keep absolute
|
|
98
|
+
return relativePath.startsWith('..') ? absolutePath : relativePath
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Gets the directory path for a given file or directory path.
|
|
103
|
+
* If the path is a directory, returns the path itself.
|
|
104
|
+
* If the path is a file or doesn't exist, returns the parent directory.
|
|
105
|
+
*
|
|
106
|
+
* @param path - The file or directory path
|
|
107
|
+
* @returns The directory path
|
|
108
|
+
*/
|
|
109
|
+
export function getDirectoryForPath(path: string): string {
|
|
110
|
+
const absolutePath = expandPath(path)
|
|
111
|
+
// SECURITY: Skip filesystem operations for UNC paths to prevent NTLM credential leaks.
|
|
112
|
+
if (absolutePath.startsWith('\\\\') || absolutePath.startsWith('//')) {
|
|
113
|
+
return dirname(absolutePath)
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const stats = getFsImplementation().statSync(absolutePath)
|
|
117
|
+
if (stats.isDirectory()) {
|
|
118
|
+
return absolutePath
|
|
119
|
+
}
|
|
120
|
+
} catch {
|
|
121
|
+
// Path doesn't exist or can't be accessed
|
|
122
|
+
}
|
|
123
|
+
// If it's not a directory or doesn't exist, return the parent directory
|
|
124
|
+
return dirname(absolutePath)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Checks if a path contains directory traversal patterns that navigate to parent directories.
|
|
129
|
+
*
|
|
130
|
+
* @param path - The path to check for traversal patterns
|
|
131
|
+
* @returns true if the path contains traversal (e.g., '../', '..\', or ends with '..')
|
|
132
|
+
*/
|
|
133
|
+
export function containsPathTraversal(path: string): boolean {
|
|
134
|
+
return /(?:^|[\\/])\.\.(?:[\\/]|$)/.test(path)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Re-export from the shared zero-dep source.
|
|
138
|
+
export { sanitizePath } from './sessionStoragePortable.js'
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Normalizes a path for use as a JSON config key.
|
|
142
|
+
* On Windows, paths can have inconsistent separators (C:\path vs C:/path)
|
|
143
|
+
* depending on whether they come from git, Node.js APIs, or user input.
|
|
144
|
+
* This normalizes to forward slashes for consistent JSON serialization.
|
|
145
|
+
*
|
|
146
|
+
* @param path - The path to normalize
|
|
147
|
+
* @returns The normalized path with consistent forward slashes
|
|
148
|
+
*/
|
|
149
|
+
export function normalizePathForConfigKey(path: string): string {
|
|
150
|
+
// First use Node's normalize to resolve . and .. segments
|
|
151
|
+
const normalized = normalize(path)
|
|
152
|
+
// Then convert all backslashes to forward slashes for consistent JSON keys
|
|
153
|
+
// This is safe because forward slashes work in Windows paths for most operations
|
|
154
|
+
return normalized.replace(/\\/g, '/')
|
|
155
|
+
}
|
package/utils/pdf.ts
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto'
|
|
2
|
+
import { mkdir, readdir, readFile } from 'fs/promises'
|
|
3
|
+
import { join } from 'path'
|
|
4
|
+
import {
|
|
5
|
+
PDF_MAX_EXTRACT_SIZE,
|
|
6
|
+
PDF_TARGET_RAW_SIZE,
|
|
7
|
+
} from '../constants/apiLimits.js'
|
|
8
|
+
import { errorMessage } from './errors.js'
|
|
9
|
+
import { execFileNoThrow } from './execFileNoThrow.js'
|
|
10
|
+
import { formatFileSize } from './format.js'
|
|
11
|
+
import { getFsImplementation } from './fsOperations.js'
|
|
12
|
+
import { getToolResultsDir } from './toolResultStorage.js'
|
|
13
|
+
|
|
14
|
+
export type PDFError = {
|
|
15
|
+
reason:
|
|
16
|
+
| 'empty'
|
|
17
|
+
| 'too_large'
|
|
18
|
+
| 'password_protected'
|
|
19
|
+
| 'corrupted'
|
|
20
|
+
| 'unknown'
|
|
21
|
+
| 'unavailable'
|
|
22
|
+
message: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type PDFResult<T> =
|
|
26
|
+
| { success: true; data: T }
|
|
27
|
+
| { success: false; error: PDFError }
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Read a PDF file and return it as base64-encoded data.
|
|
31
|
+
* @param filePath Path to the PDF file
|
|
32
|
+
* @returns Result containing PDF data or a structured error
|
|
33
|
+
*/
|
|
34
|
+
export async function readPDF(filePath: string): Promise<
|
|
35
|
+
PDFResult<{
|
|
36
|
+
type: 'pdf'
|
|
37
|
+
file: {
|
|
38
|
+
filePath: string
|
|
39
|
+
base64: string
|
|
40
|
+
originalSize: number
|
|
41
|
+
}
|
|
42
|
+
}>
|
|
43
|
+
> {
|
|
44
|
+
try {
|
|
45
|
+
const fs = getFsImplementation()
|
|
46
|
+
const stats = await fs.stat(filePath)
|
|
47
|
+
const originalSize = stats.size
|
|
48
|
+
|
|
49
|
+
// Check if file is empty
|
|
50
|
+
if (originalSize === 0) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: { reason: 'empty', message: `PDF file is empty: ${filePath}` },
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Check if PDF exceeds maximum size
|
|
58
|
+
// The API has a 32MB total request limit. After base64 encoding (~33% larger),
|
|
59
|
+
// a PDF must be under ~20MB raw to leave room for conversation context.
|
|
60
|
+
if (originalSize > PDF_TARGET_RAW_SIZE) {
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
error: {
|
|
64
|
+
reason: 'too_large',
|
|
65
|
+
message: `PDF file exceeds maximum allowed size of ${formatFileSize(PDF_TARGET_RAW_SIZE)}.`,
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const fileBuffer = await readFile(filePath)
|
|
71
|
+
|
|
72
|
+
// Validate PDF magic bytes — reject files that aren't actually PDFs
|
|
73
|
+
// (e.g., HTML files renamed to .pdf) before they enter conversation context.
|
|
74
|
+
// Once an invalid PDF document block is in the message history, every subsequent
|
|
75
|
+
// API call fails with 400 "The PDF specified was not valid" and the session
|
|
76
|
+
// becomes unrecoverable without /clear.
|
|
77
|
+
const header = fileBuffer.subarray(0, 5).toString('ascii')
|
|
78
|
+
if (!header.startsWith('%PDF-')) {
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
error: {
|
|
82
|
+
reason: 'corrupted',
|
|
83
|
+
message: `File is not a valid PDF (missing %PDF- header): ${filePath}`,
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const base64 = fileBuffer.toString('base64')
|
|
89
|
+
|
|
90
|
+
// Note: We cannot check page count here without parsing the PDF
|
|
91
|
+
// The API will enforce the 100-page limit and return an error if exceeded
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
success: true,
|
|
95
|
+
data: {
|
|
96
|
+
type: 'pdf',
|
|
97
|
+
file: {
|
|
98
|
+
filePath,
|
|
99
|
+
base64,
|
|
100
|
+
originalSize,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
} catch (e: unknown) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: {
|
|
108
|
+
reason: 'unknown',
|
|
109
|
+
message: errorMessage(e),
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get the number of pages in a PDF file using `pdfinfo` (from poppler-utils).
|
|
117
|
+
* Returns `null` if pdfinfo is not available or if the page count cannot be determined.
|
|
118
|
+
*/
|
|
119
|
+
export async function getPDFPageCount(
|
|
120
|
+
filePath: string,
|
|
121
|
+
): Promise<number | null> {
|
|
122
|
+
const { code, stdout } = await execFileNoThrow('pdfinfo', [filePath], {
|
|
123
|
+
timeout: 10_000,
|
|
124
|
+
useCwd: false,
|
|
125
|
+
})
|
|
126
|
+
if (code !== 0) {
|
|
127
|
+
return null
|
|
128
|
+
}
|
|
129
|
+
const match = /^Pages:\s+(\d+)/m.exec(stdout)
|
|
130
|
+
if (!match) {
|
|
131
|
+
return null
|
|
132
|
+
}
|
|
133
|
+
const count = parseInt(match[1]!, 10)
|
|
134
|
+
return isNaN(count) ? null : count
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export type PDFExtractPagesResult = {
|
|
138
|
+
type: 'parts'
|
|
139
|
+
file: {
|
|
140
|
+
filePath: string
|
|
141
|
+
originalSize: number
|
|
142
|
+
count: number
|
|
143
|
+
outputDir: string
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let pdftoppmAvailable: boolean | undefined
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Reset the pdftoppm availability cache. Used by tests only.
|
|
151
|
+
*/
|
|
152
|
+
export function resetPdftoppmCache(): void {
|
|
153
|
+
pdftoppmAvailable = undefined
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Check whether the `pdftoppm` binary (from poppler-utils) is available.
|
|
158
|
+
* The result is cached for the lifetime of the process.
|
|
159
|
+
*/
|
|
160
|
+
export async function isPdftoppmAvailable(): Promise<boolean> {
|
|
161
|
+
if (pdftoppmAvailable !== undefined) return pdftoppmAvailable
|
|
162
|
+
const { code, stderr } = await execFileNoThrow('pdftoppm', ['-v'], {
|
|
163
|
+
timeout: 5000,
|
|
164
|
+
useCwd: false,
|
|
165
|
+
})
|
|
166
|
+
// pdftoppm prints version info to stderr and exits 0 (or sometimes 99 on older versions)
|
|
167
|
+
pdftoppmAvailable = code === 0 || stderr.length > 0
|
|
168
|
+
return pdftoppmAvailable
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Extract PDF pages as JPEG images using pdftoppm.
|
|
173
|
+
* Produces page-01.jpg, page-02.jpg, etc. in an output directory.
|
|
174
|
+
* This enables reading large PDFs and works with all API providers.
|
|
175
|
+
*
|
|
176
|
+
* @param filePath Path to the PDF file
|
|
177
|
+
* @param options Optional page range (1-indexed, inclusive)
|
|
178
|
+
*/
|
|
179
|
+
export async function extractPDFPages(
|
|
180
|
+
filePath: string,
|
|
181
|
+
options?: { firstPage?: number; lastPage?: number },
|
|
182
|
+
): Promise<PDFResult<PDFExtractPagesResult>> {
|
|
183
|
+
try {
|
|
184
|
+
const fs = getFsImplementation()
|
|
185
|
+
const stats = await fs.stat(filePath)
|
|
186
|
+
const originalSize = stats.size
|
|
187
|
+
|
|
188
|
+
if (originalSize === 0) {
|
|
189
|
+
return {
|
|
190
|
+
success: false,
|
|
191
|
+
error: { reason: 'empty', message: `PDF file is empty: ${filePath}` },
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (originalSize > PDF_MAX_EXTRACT_SIZE) {
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
error: {
|
|
199
|
+
reason: 'too_large',
|
|
200
|
+
message: `PDF file exceeds maximum allowed size for text extraction (${formatFileSize(PDF_MAX_EXTRACT_SIZE)}).`,
|
|
201
|
+
},
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const available = await isPdftoppmAvailable()
|
|
206
|
+
if (!available) {
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
error: {
|
|
210
|
+
reason: 'unavailable',
|
|
211
|
+
message:
|
|
212
|
+
'pdftoppm is not installed. Install poppler-utils (e.g. `brew install poppler` or `apt-get install poppler-utils`) to enable PDF page rendering.',
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const uuid = randomUUID()
|
|
218
|
+
const outputDir = join(getToolResultsDir(), `pdf-${uuid}`)
|
|
219
|
+
await mkdir(outputDir, { recursive: true })
|
|
220
|
+
|
|
221
|
+
// pdftoppm produces files like <prefix>-01.jpg, <prefix>-02.jpg, etc.
|
|
222
|
+
const prefix = join(outputDir, 'page')
|
|
223
|
+
const args = ['-jpeg', '-r', '100']
|
|
224
|
+
if (options?.firstPage) {
|
|
225
|
+
args.push('-f', String(options.firstPage))
|
|
226
|
+
}
|
|
227
|
+
if (options?.lastPage && options.lastPage !== Infinity) {
|
|
228
|
+
args.push('-l', String(options.lastPage))
|
|
229
|
+
}
|
|
230
|
+
args.push(filePath, prefix)
|
|
231
|
+
const { code, stderr } = await execFileNoThrow('pdftoppm', args, {
|
|
232
|
+
timeout: 120_000,
|
|
233
|
+
useCwd: false,
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
if (code !== 0) {
|
|
237
|
+
if (/password/i.test(stderr)) {
|
|
238
|
+
return {
|
|
239
|
+
success: false,
|
|
240
|
+
error: {
|
|
241
|
+
reason: 'password_protected',
|
|
242
|
+
message:
|
|
243
|
+
'PDF is password-protected. Please provide an unprotected version.',
|
|
244
|
+
},
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (/damaged|corrupt|invalid/i.test(stderr)) {
|
|
248
|
+
return {
|
|
249
|
+
success: false,
|
|
250
|
+
error: {
|
|
251
|
+
reason: 'corrupted',
|
|
252
|
+
message: 'PDF file is corrupted or invalid.',
|
|
253
|
+
},
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
error: { reason: 'unknown', message: `pdftoppm failed: ${stderr}` },
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Read generated image files and sort naturally
|
|
263
|
+
const entries = await readdir(outputDir)
|
|
264
|
+
const imageFiles = entries.filter(f => f.endsWith('.jpg')).sort()
|
|
265
|
+
const pageCount = imageFiles.length
|
|
266
|
+
|
|
267
|
+
if (pageCount === 0) {
|
|
268
|
+
return {
|
|
269
|
+
success: false,
|
|
270
|
+
error: {
|
|
271
|
+
reason: 'corrupted',
|
|
272
|
+
message: 'pdftoppm produced no output pages. The PDF may be invalid.',
|
|
273
|
+
},
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const count = imageFiles.length
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
success: true,
|
|
281
|
+
data: {
|
|
282
|
+
type: 'parts',
|
|
283
|
+
file: {
|
|
284
|
+
filePath,
|
|
285
|
+
originalSize,
|
|
286
|
+
outputDir,
|
|
287
|
+
count,
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
}
|
|
291
|
+
} catch (e: unknown) {
|
|
292
|
+
return {
|
|
293
|
+
success: false,
|
|
294
|
+
error: {
|
|
295
|
+
reason: 'unknown',
|
|
296
|
+
message: errorMessage(e),
|
|
297
|
+
},
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getMainLoopModel } from './model/model.js'
|
|
2
|
+
|
|
3
|
+
// Document extensions that are handled specially
|
|
4
|
+
export const DOCUMENT_EXTENSIONS = new Set(['pdf'])
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Parse a page range string into firstPage/lastPage numbers.
|
|
8
|
+
* Supported formats:
|
|
9
|
+
* - "5" → { firstPage: 5, lastPage: 5 }
|
|
10
|
+
* - "1-10" → { firstPage: 1, lastPage: 10 }
|
|
11
|
+
* - "3-" → { firstPage: 3, lastPage: Infinity }
|
|
12
|
+
*
|
|
13
|
+
* Returns null on invalid input (non-numeric, zero, inverted range).
|
|
14
|
+
* Pages are 1-indexed.
|
|
15
|
+
*/
|
|
16
|
+
export function parsePDFPageRange(
|
|
17
|
+
pages: string,
|
|
18
|
+
): { firstPage: number; lastPage: number } | null {
|
|
19
|
+
const trimmed = pages.trim()
|
|
20
|
+
if (!trimmed) {
|
|
21
|
+
return null
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// "N-" open-ended range
|
|
25
|
+
if (trimmed.endsWith('-')) {
|
|
26
|
+
const first = parseInt(trimmed.slice(0, -1), 10)
|
|
27
|
+
if (isNaN(first) || first < 1) {
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
return { firstPage: first, lastPage: Infinity }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const dashIndex = trimmed.indexOf('-')
|
|
34
|
+
if (dashIndex === -1) {
|
|
35
|
+
// Single page: "5"
|
|
36
|
+
const page = parseInt(trimmed, 10)
|
|
37
|
+
if (isNaN(page) || page < 1) {
|
|
38
|
+
return null
|
|
39
|
+
}
|
|
40
|
+
return { firstPage: page, lastPage: page }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Range: "1-10"
|
|
44
|
+
const first = parseInt(trimmed.slice(0, dashIndex), 10)
|
|
45
|
+
const last = parseInt(trimmed.slice(dashIndex + 1), 10)
|
|
46
|
+
if (isNaN(first) || isNaN(last) || first < 1 || last < 1 || last < first) {
|
|
47
|
+
return null
|
|
48
|
+
}
|
|
49
|
+
return { firstPage: first, lastPage: last }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Check if PDF reading is supported with the current model.
|
|
54
|
+
* PDF document blocks work on all providers (1P, Vertex, Bedrock, Foundry).
|
|
55
|
+
* Haiku 3 is the only remaining model that predates PDF support; users on
|
|
56
|
+
* it fall back to the page-extraction path (poppler-utils). Substring match
|
|
57
|
+
* covers all provider ID formats (Bedrock prefixes, Vertex @-dates).
|
|
58
|
+
*/
|
|
59
|
+
export function isPDFSupported(): boolean {
|
|
60
|
+
return !getMainLoopModel().toLowerCase().includes('claude-3-haiku')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if a file extension is a PDF document.
|
|
65
|
+
* @param ext File extension (with or without leading dot)
|
|
66
|
+
*/
|
|
67
|
+
export function isPDFExtension(ext: string): boolean {
|
|
68
|
+
const normalized = ext.startsWith('.') ? ext.slice(1) : ext
|
|
69
|
+
return DOCUMENT_EXTENSIONS.has(normalized.toLowerCase())
|
|
70
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer address parsing — kept separate from peerRegistry.ts so that
|
|
3
|
+
* SendMessageTool can import parseAddress without transitively loading
|
|
4
|
+
* the bridge (axios) and UDS (fs, net) modules at tool-enumeration time.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Parse a URI-style address into scheme + target. */
|
|
8
|
+
export function parseAddress(to: string): {
|
|
9
|
+
scheme: 'uds' | 'bridge' | 'other'
|
|
10
|
+
target: string
|
|
11
|
+
} {
|
|
12
|
+
if (to.startsWith('uds:')) return { scheme: 'uds', target: to.slice(4) }
|
|
13
|
+
if (to.startsWith('bridge:')) return { scheme: 'bridge', target: to.slice(7) }
|
|
14
|
+
// Legacy: old-code UDS senders emit bare socket paths in from=; route them
|
|
15
|
+
// through the UDS branch so replies aren't silently dropped into teammate
|
|
16
|
+
// routing. (No bare-session-ID fallback — bridge messaging is new enough
|
|
17
|
+
// that no old senders exist, and the prefix would hijack teammate names
|
|
18
|
+
// like session_manager.)
|
|
19
|
+
if (to.startsWith('/')) return { scheme: 'uds', target: to }
|
|
20
|
+
return { scheme: 'other', target: to }
|
|
21
|
+
}
|