@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
package/utils/file.ts
ADDED
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
import { chmodSync, writeFileSync as fsWriteFileSync } from 'fs'
|
|
2
|
+
import { realpath, stat } from 'fs/promises'
|
|
3
|
+
import { homedir } from 'os'
|
|
4
|
+
import {
|
|
5
|
+
basename,
|
|
6
|
+
dirname,
|
|
7
|
+
extname,
|
|
8
|
+
isAbsolute,
|
|
9
|
+
join,
|
|
10
|
+
normalize,
|
|
11
|
+
relative,
|
|
12
|
+
resolve,
|
|
13
|
+
sep,
|
|
14
|
+
} from 'path'
|
|
15
|
+
import { logEvent } from 'src/services/analytics/index.js'
|
|
16
|
+
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'
|
|
17
|
+
import { getCwd } from '../utils/cwd.js'
|
|
18
|
+
import { logForDebugging } from './debug.js'
|
|
19
|
+
import { isENOENT, isFsInaccessible } from './errors.js'
|
|
20
|
+
import {
|
|
21
|
+
detectEncodingForResolvedPath,
|
|
22
|
+
detectLineEndingsForString,
|
|
23
|
+
type LineEndingType,
|
|
24
|
+
} from './fileRead.js'
|
|
25
|
+
import { fileReadCache } from './fileReadCache.js'
|
|
26
|
+
import { getFsImplementation, safeResolvePath } from './fsOperations.js'
|
|
27
|
+
import { logError } from './log.js'
|
|
28
|
+
import { expandPath } from './path.js'
|
|
29
|
+
import { getPlatform } from './platform.js'
|
|
30
|
+
|
|
31
|
+
export type File = {
|
|
32
|
+
filename: string
|
|
33
|
+
content: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Check if a path exists asynchronously.
|
|
38
|
+
*/
|
|
39
|
+
export async function pathExists(path: string): Promise<boolean> {
|
|
40
|
+
try {
|
|
41
|
+
await stat(path)
|
|
42
|
+
return true
|
|
43
|
+
} catch {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const MAX_OUTPUT_SIZE = 0.25 * 1024 * 1024 // 0.25MB in bytes
|
|
49
|
+
|
|
50
|
+
export function readFileSafe(filepath: string): string | null {
|
|
51
|
+
try {
|
|
52
|
+
const fs = getFsImplementation()
|
|
53
|
+
return fs.readFileSync(filepath, { encoding: 'utf8' })
|
|
54
|
+
} catch (error) {
|
|
55
|
+
logError(error)
|
|
56
|
+
return null
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get the normalized modification time of a file in milliseconds.
|
|
62
|
+
* Uses Math.floor to ensure consistent timestamp comparisons across file operations,
|
|
63
|
+
* reducing false positives from sub-millisecond precision changes (e.g., from IDE
|
|
64
|
+
* file watchers that touch files without changing content).
|
|
65
|
+
*/
|
|
66
|
+
export function getFileModificationTime(filePath: string): number {
|
|
67
|
+
const fs = getFsImplementation()
|
|
68
|
+
return Math.floor(fs.statSync(filePath).mtimeMs)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Async variant of getFileModificationTime. Same floor semantics.
|
|
73
|
+
* Use this in async paths (getChangedFiles runs every turn on every readFileState
|
|
74
|
+
* entry — sync statSync there triggers the slow-operation indicator on network/
|
|
75
|
+
* slow disks).
|
|
76
|
+
*/
|
|
77
|
+
export async function getFileModificationTimeAsync(
|
|
78
|
+
filePath: string,
|
|
79
|
+
): Promise<number> {
|
|
80
|
+
const s = await getFsImplementation().stat(filePath)
|
|
81
|
+
return Math.floor(s.mtimeMs)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function writeTextContent(
|
|
85
|
+
filePath: string,
|
|
86
|
+
content: string,
|
|
87
|
+
encoding: BufferEncoding,
|
|
88
|
+
endings: LineEndingType,
|
|
89
|
+
): void {
|
|
90
|
+
let toWrite = content
|
|
91
|
+
if (endings === 'CRLF') {
|
|
92
|
+
// Normalize any existing CRLF to LF first so a new_string that already
|
|
93
|
+
// contains \r\n (raw model output) doesn't become \r\r\n after the join.
|
|
94
|
+
toWrite = content.replaceAll('\r\n', '\n').split('\n').join('\r\n')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
writeFileSyncAndFlush_DEPRECATED(filePath, toWrite, { encoding })
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function detectFileEncoding(filePath: string): BufferEncoding {
|
|
101
|
+
try {
|
|
102
|
+
const fs = getFsImplementation()
|
|
103
|
+
const { resolvedPath } = safeResolvePath(fs, filePath)
|
|
104
|
+
return detectEncodingForResolvedPath(resolvedPath)
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (isFsInaccessible(error)) {
|
|
107
|
+
logForDebugging(
|
|
108
|
+
`detectFileEncoding failed for expected reason: ${error.code}`,
|
|
109
|
+
{
|
|
110
|
+
level: 'debug',
|
|
111
|
+
},
|
|
112
|
+
)
|
|
113
|
+
} else {
|
|
114
|
+
logError(error)
|
|
115
|
+
}
|
|
116
|
+
return 'utf8'
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function detectLineEndings(
|
|
121
|
+
filePath: string,
|
|
122
|
+
encoding: BufferEncoding = 'utf8',
|
|
123
|
+
): LineEndingType {
|
|
124
|
+
try {
|
|
125
|
+
const fs = getFsImplementation()
|
|
126
|
+
const { resolvedPath } = safeResolvePath(fs, filePath)
|
|
127
|
+
const { buffer, bytesRead } = fs.readSync(resolvedPath, { length: 4096 })
|
|
128
|
+
|
|
129
|
+
const content = buffer.toString(encoding, 0, bytesRead)
|
|
130
|
+
return detectLineEndingsForString(content)
|
|
131
|
+
} catch (error) {
|
|
132
|
+
logError(error)
|
|
133
|
+
return 'LF'
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function convertLeadingTabsToSpaces(content: string): string {
|
|
138
|
+
// The /gm regex scans every line even on no-match; skip it entirely
|
|
139
|
+
// for the common tab-free case.
|
|
140
|
+
if (!content.includes('\t')) return content
|
|
141
|
+
return content.replace(/^\t+/gm, _ => ' '.repeat(_.length))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function getAbsoluteAndRelativePaths(path: string | undefined): {
|
|
145
|
+
absolutePath: string | undefined
|
|
146
|
+
relativePath: string | undefined
|
|
147
|
+
} {
|
|
148
|
+
const absolutePath = path ? expandPath(path) : undefined
|
|
149
|
+
const relativePath = absolutePath
|
|
150
|
+
? relative(getCwd(), absolutePath)
|
|
151
|
+
: undefined
|
|
152
|
+
return { absolutePath, relativePath }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function getDisplayPath(filePath: string): string {
|
|
156
|
+
// Use relative path if file is in the current working directory
|
|
157
|
+
const { relativePath } = getAbsoluteAndRelativePaths(filePath)
|
|
158
|
+
if (relativePath && !relativePath.startsWith('..')) {
|
|
159
|
+
return relativePath
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Use tilde notation for files in home directory
|
|
163
|
+
const homeDir = homedir()
|
|
164
|
+
if (filePath.startsWith(homeDir + sep)) {
|
|
165
|
+
return '~' + filePath.slice(homeDir.length)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Otherwise return the absolute path
|
|
169
|
+
return filePath
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Find files with the same name but different extensions in the same directory
|
|
174
|
+
* @param filePath The path to the file that doesn't exist
|
|
175
|
+
* @returns The found file with a different extension, or undefined if none found
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
export function findSimilarFile(filePath: string): string | undefined {
|
|
179
|
+
const fs = getFsImplementation()
|
|
180
|
+
try {
|
|
181
|
+
const dir = dirname(filePath)
|
|
182
|
+
const fileBaseName = basename(filePath, extname(filePath))
|
|
183
|
+
|
|
184
|
+
// Get all files in the directory
|
|
185
|
+
const files = fs.readdirSync(dir)
|
|
186
|
+
|
|
187
|
+
// Find files with the same base name but different extension
|
|
188
|
+
const similarFiles = files.filter(
|
|
189
|
+
file =>
|
|
190
|
+
basename(file.name, extname(file.name)) === fileBaseName &&
|
|
191
|
+
join(dir, file.name) !== filePath,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
// Return just the filename of the first match if found
|
|
195
|
+
const firstMatch = similarFiles[0]
|
|
196
|
+
if (firstMatch) {
|
|
197
|
+
return firstMatch.name
|
|
198
|
+
}
|
|
199
|
+
return undefined
|
|
200
|
+
} catch (error) {
|
|
201
|
+
// Missing dir (ENOENT) is expected; for other errors log and return undefined
|
|
202
|
+
if (!isENOENT(error)) {
|
|
203
|
+
logError(error)
|
|
204
|
+
}
|
|
205
|
+
return undefined
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Marker included in file-not-found error messages that contain a cwd note.
|
|
211
|
+
* UI renderers check for this to show a short "File not found" message.
|
|
212
|
+
*/
|
|
213
|
+
export const FILE_NOT_FOUND_CWD_NOTE = 'Note: your current working directory is'
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Suggests a corrected path under the current working directory when a file/directory
|
|
217
|
+
* is not found. Detects the "dropped repo folder" pattern where the model constructs
|
|
218
|
+
* an absolute path missing the repo directory component.
|
|
219
|
+
*
|
|
220
|
+
* Example:
|
|
221
|
+
* cwd = /Users/zeeg/src/currentRepo
|
|
222
|
+
* requestedPath = /Users/zeeg/src/foobar (doesn't exist)
|
|
223
|
+
* returns /Users/zeeg/src/currentRepo/foobar (if it exists)
|
|
224
|
+
*
|
|
225
|
+
* @param requestedPath - The absolute path that was not found
|
|
226
|
+
* @returns The corrected path if found under cwd, undefined otherwise
|
|
227
|
+
*/
|
|
228
|
+
export async function suggestPathUnderCwd(
|
|
229
|
+
requestedPath: string,
|
|
230
|
+
): Promise<string | undefined> {
|
|
231
|
+
const cwd = getCwd()
|
|
232
|
+
const cwdParent = dirname(cwd)
|
|
233
|
+
|
|
234
|
+
// Resolve symlinks in the requested path's parent directory (e.g., /tmp -> /private/tmp on macOS)
|
|
235
|
+
// so the prefix comparison works correctly against the cwd (which is already realpath-resolved).
|
|
236
|
+
let resolvedPath = requestedPath
|
|
237
|
+
try {
|
|
238
|
+
const resolvedDir = await realpath(dirname(requestedPath))
|
|
239
|
+
resolvedPath = join(resolvedDir, basename(requestedPath))
|
|
240
|
+
} catch {
|
|
241
|
+
// Parent directory doesn't exist, use the original path
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Only check if the requested path is under cwd's parent but not under cwd itself.
|
|
245
|
+
// When cwdParent is the root directory (e.g., '/'), use it directly as the prefix
|
|
246
|
+
// to avoid a double-separator '//' that would never match.
|
|
247
|
+
const cwdParentPrefix = cwdParent === sep ? sep : cwdParent + sep
|
|
248
|
+
if (
|
|
249
|
+
!resolvedPath.startsWith(cwdParentPrefix) ||
|
|
250
|
+
resolvedPath.startsWith(cwd + sep) ||
|
|
251
|
+
resolvedPath === cwd
|
|
252
|
+
) {
|
|
253
|
+
return undefined
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Get the relative path from the parent directory
|
|
257
|
+
const relFromParent = relative(cwdParent, resolvedPath)
|
|
258
|
+
|
|
259
|
+
// Check if the same relative path exists under cwd
|
|
260
|
+
const correctedPath = join(cwd, relFromParent)
|
|
261
|
+
try {
|
|
262
|
+
await stat(correctedPath)
|
|
263
|
+
return correctedPath
|
|
264
|
+
} catch {
|
|
265
|
+
return undefined
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Whether to use the compact line-number prefix format (`N\t` instead of
|
|
271
|
+
* ` N→`). The padded-arrow format costs 9 bytes/line overhead; at
|
|
272
|
+
* 1.35B Read calls × 132 lines avg this is 2.18% of fleet uncached input
|
|
273
|
+
* (bq-queries/read_line_prefix_overhead_verify.sql).
|
|
274
|
+
*
|
|
275
|
+
* Ant soak validated no Edit error regression (6.29% vs 6.86% baseline).
|
|
276
|
+
* Killswitch pattern: GB can disable if issues surface externally.
|
|
277
|
+
*/
|
|
278
|
+
export function isCompactLinePrefixEnabled(): boolean {
|
|
279
|
+
// 3P default: killswitch off = compact format enabled. Client-side only —
|
|
280
|
+
// no server support needed, safe for Bedrock/Vertex/Foundry.
|
|
281
|
+
return !getFeatureValue_CACHED_MAY_BE_STALE(
|
|
282
|
+
'tengu_compact_line_prefix_killswitch',
|
|
283
|
+
false,
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Adds cat -n style line numbers to the content.
|
|
289
|
+
*/
|
|
290
|
+
export function addLineNumbers({
|
|
291
|
+
content,
|
|
292
|
+
// 1-indexed
|
|
293
|
+
startLine,
|
|
294
|
+
}: {
|
|
295
|
+
content: string
|
|
296
|
+
startLine: number
|
|
297
|
+
}): string {
|
|
298
|
+
if (!content) {
|
|
299
|
+
return ''
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const lines = content.split(/\r?\n/)
|
|
303
|
+
|
|
304
|
+
if (isCompactLinePrefixEnabled()) {
|
|
305
|
+
return lines
|
|
306
|
+
.map((line, index) => `${index + startLine}\t${line}`)
|
|
307
|
+
.join('\n')
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return lines
|
|
311
|
+
.map((line, index) => {
|
|
312
|
+
const numStr = String(index + startLine)
|
|
313
|
+
if (numStr.length >= 6) {
|
|
314
|
+
return `${numStr}→${line}`
|
|
315
|
+
}
|
|
316
|
+
return `${numStr.padStart(6, ' ')}→${line}`
|
|
317
|
+
})
|
|
318
|
+
.join('\n')
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Inverse of addLineNumbers — strips the `N→` or `N\t` prefix from a single
|
|
323
|
+
* line. Co-located so format changes here and in addLineNumbers stay in sync.
|
|
324
|
+
*/
|
|
325
|
+
export function stripLineNumberPrefix(line: string): string {
|
|
326
|
+
const match = line.match(/^\s*\d+[\u2192\t](.*)$/)
|
|
327
|
+
return match?.[1] ?? line
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Checks if a directory is empty.
|
|
332
|
+
* @param dirPath The path to the directory to check
|
|
333
|
+
* @returns true if the directory is empty or does not exist, false otherwise
|
|
334
|
+
*/
|
|
335
|
+
export function isDirEmpty(dirPath: string): boolean {
|
|
336
|
+
try {
|
|
337
|
+
return getFsImplementation().isDirEmptySync(dirPath)
|
|
338
|
+
} catch (e) {
|
|
339
|
+
// ENOENT: directory doesn't exist, consider it empty
|
|
340
|
+
// Other errors (EPERM on macOS protected folders, etc.): assume not empty
|
|
341
|
+
return isENOENT(e)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Reads a file with caching to avoid redundant I/O operations.
|
|
347
|
+
* This is the preferred method for FileEditTool operations.
|
|
348
|
+
*/
|
|
349
|
+
export function readFileSyncCached(filePath: string): string {
|
|
350
|
+
const { content } = fileReadCache.readFile(filePath)
|
|
351
|
+
return content
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Writes to a file and flushes the file to disk
|
|
356
|
+
* @param filePath The path to the file to write to
|
|
357
|
+
* @param content The content to write to the file
|
|
358
|
+
* @param options Options for writing the file, including encoding and mode
|
|
359
|
+
* @deprecated Use `fs.promises.writeFile` with flush option instead for non-blocking writes.
|
|
360
|
+
* Sync file writes block the event loop and cause performance issues.
|
|
361
|
+
*/
|
|
362
|
+
export function writeFileSyncAndFlush_DEPRECATED(
|
|
363
|
+
filePath: string,
|
|
364
|
+
content: string,
|
|
365
|
+
options: { encoding: BufferEncoding; mode?: number } = { encoding: 'utf-8' },
|
|
366
|
+
): void {
|
|
367
|
+
const fs = getFsImplementation()
|
|
368
|
+
|
|
369
|
+
// Check if the target file is a symlink to preserve it for all users
|
|
370
|
+
// Note: We don't use safeResolvePath here because we need to manually handle
|
|
371
|
+
// symlinks to ensure we write to the target while preserving the symlink itself
|
|
372
|
+
let targetPath = filePath
|
|
373
|
+
try {
|
|
374
|
+
// Try to read the symlink - if successful, it's a symlink
|
|
375
|
+
const linkTarget = fs.readlinkSync(filePath)
|
|
376
|
+
// Resolve to absolute path
|
|
377
|
+
targetPath = isAbsolute(linkTarget)
|
|
378
|
+
? linkTarget
|
|
379
|
+
: resolve(dirname(filePath), linkTarget)
|
|
380
|
+
logForDebugging(`Writing through symlink: ${filePath} -> ${targetPath}`)
|
|
381
|
+
} catch {
|
|
382
|
+
// ENOENT (doesn't exist) or EINVAL (not a symlink) — keep targetPath = filePath
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Try atomic write first
|
|
386
|
+
const tempPath = `${targetPath}.tmp.${process.pid}.${Date.now()}`
|
|
387
|
+
|
|
388
|
+
// Check if target file exists and get its permissions (single stat, reused in both atomic and fallback paths)
|
|
389
|
+
let targetMode: number | undefined
|
|
390
|
+
let targetExists = false
|
|
391
|
+
try {
|
|
392
|
+
targetMode = fs.statSync(targetPath).mode
|
|
393
|
+
targetExists = true
|
|
394
|
+
logForDebugging(`Preserving file permissions: ${targetMode.toString(8)}`)
|
|
395
|
+
} catch (e) {
|
|
396
|
+
if (!isENOENT(e)) throw e
|
|
397
|
+
if (options.mode !== undefined) {
|
|
398
|
+
// Use provided mode for new files
|
|
399
|
+
targetMode = options.mode
|
|
400
|
+
logForDebugging(
|
|
401
|
+
`Setting permissions for new file: ${targetMode.toString(8)}`,
|
|
402
|
+
)
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
try {
|
|
407
|
+
logForDebugging(`Writing to temp file: ${tempPath}`)
|
|
408
|
+
|
|
409
|
+
// Write to temp file with flush and mode (if specified for new file)
|
|
410
|
+
const writeOptions: {
|
|
411
|
+
encoding: BufferEncoding
|
|
412
|
+
flush: boolean
|
|
413
|
+
mode?: number
|
|
414
|
+
} = {
|
|
415
|
+
encoding: options.encoding,
|
|
416
|
+
flush: true,
|
|
417
|
+
}
|
|
418
|
+
// Only set mode in writeFileSync for new files to ensure atomic permission setting
|
|
419
|
+
if (!targetExists && options.mode !== undefined) {
|
|
420
|
+
writeOptions.mode = options.mode
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fsWriteFileSync(tempPath, content, writeOptions)
|
|
424
|
+
logForDebugging(
|
|
425
|
+
`Temp file written successfully, size: ${content.length} bytes`,
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
// For existing files or if mode was not set atomically, apply permissions
|
|
429
|
+
if (targetExists && targetMode !== undefined) {
|
|
430
|
+
chmodSync(tempPath, targetMode)
|
|
431
|
+
logForDebugging(`Applied original permissions to temp file`)
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Atomic rename (on POSIX systems, this is atomic)
|
|
435
|
+
// On Windows, this will overwrite the destination if it exists
|
|
436
|
+
logForDebugging(`Renaming ${tempPath} to ${targetPath}`)
|
|
437
|
+
fs.renameSync(tempPath, targetPath)
|
|
438
|
+
logForDebugging(`File ${targetPath} written atomically`)
|
|
439
|
+
} catch (atomicError) {
|
|
440
|
+
logForDebugging(`Failed to write file atomically: ${atomicError}`, {
|
|
441
|
+
level: 'error',
|
|
442
|
+
})
|
|
443
|
+
logEvent('tengu_atomic_write_error', {})
|
|
444
|
+
|
|
445
|
+
// Clean up temp file on error
|
|
446
|
+
try {
|
|
447
|
+
logForDebugging(`Cleaning up temp file: ${tempPath}`)
|
|
448
|
+
fs.unlinkSync(tempPath)
|
|
449
|
+
} catch (cleanupError) {
|
|
450
|
+
logForDebugging(`Failed to clean up temp file: ${cleanupError}`)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Fallback to non-atomic write
|
|
454
|
+
logForDebugging(`Falling back to non-atomic write for ${targetPath}`)
|
|
455
|
+
try {
|
|
456
|
+
const fallbackOptions: {
|
|
457
|
+
encoding: BufferEncoding
|
|
458
|
+
flush: boolean
|
|
459
|
+
mode?: number
|
|
460
|
+
} = {
|
|
461
|
+
encoding: options.encoding,
|
|
462
|
+
flush: true,
|
|
463
|
+
}
|
|
464
|
+
// Only set mode for new files
|
|
465
|
+
if (!targetExists && options.mode !== undefined) {
|
|
466
|
+
fallbackOptions.mode = options.mode
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
fsWriteFileSync(targetPath, content, fallbackOptions)
|
|
470
|
+
logForDebugging(
|
|
471
|
+
`File ${targetPath} written successfully with non-atomic fallback`,
|
|
472
|
+
)
|
|
473
|
+
} catch (fallbackError) {
|
|
474
|
+
logForDebugging(`Non-atomic write also failed: ${fallbackError}`)
|
|
475
|
+
throw fallbackError
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export function getDesktopPath(): string {
|
|
481
|
+
const platform = getPlatform()
|
|
482
|
+
const homeDir = homedir()
|
|
483
|
+
|
|
484
|
+
if (platform === 'macos') {
|
|
485
|
+
return join(homeDir, 'Desktop')
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (platform === 'windows') {
|
|
489
|
+
// For WSL, try to access Windows desktop
|
|
490
|
+
const windowsHome = process.env.USERPROFILE
|
|
491
|
+
? process.env.USERPROFILE.replace(/\\/g, '/')
|
|
492
|
+
: null
|
|
493
|
+
|
|
494
|
+
if (windowsHome) {
|
|
495
|
+
const wslPath = windowsHome.replace(/^[A-Z]:/, '')
|
|
496
|
+
const desktopPath = `/mnt/c${wslPath}/Desktop`
|
|
497
|
+
|
|
498
|
+
if (getFsImplementation().existsSync(desktopPath)) {
|
|
499
|
+
return desktopPath
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Fallback: try to find desktop in typical Windows user location
|
|
504
|
+
try {
|
|
505
|
+
const usersDir = '/mnt/c/Users'
|
|
506
|
+
const userDirs = getFsImplementation().readdirSync(usersDir)
|
|
507
|
+
|
|
508
|
+
for (const user of userDirs) {
|
|
509
|
+
if (
|
|
510
|
+
user.name === 'Public' ||
|
|
511
|
+
user.name === 'Default' ||
|
|
512
|
+
user.name === 'Default User' ||
|
|
513
|
+
user.name === 'All Users'
|
|
514
|
+
) {
|
|
515
|
+
continue
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
const potentialDesktopPath = join(usersDir, user.name, 'Desktop')
|
|
519
|
+
|
|
520
|
+
if (getFsImplementation().existsSync(potentialDesktopPath)) {
|
|
521
|
+
return potentialDesktopPath
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
} catch (error) {
|
|
525
|
+
logError(error)
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Linux/unknown platform fallback
|
|
530
|
+
const desktopPath = join(homeDir, 'Desktop')
|
|
531
|
+
if (getFsImplementation().existsSync(desktopPath)) {
|
|
532
|
+
return desktopPath
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// If Desktop folder doesn't exist, fallback to home directory
|
|
536
|
+
return homeDir
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Validates that a file size is within the specified limit.
|
|
541
|
+
* Returns true if the file is within the limit, false otherwise.
|
|
542
|
+
*
|
|
543
|
+
* @param filePath The path to the file to validate
|
|
544
|
+
* @param maxSizeBytes The maximum allowed file size in bytes
|
|
545
|
+
* @returns true if file size is within limit, false otherwise
|
|
546
|
+
*/
|
|
547
|
+
export function isFileWithinReadSizeLimit(
|
|
548
|
+
filePath: string,
|
|
549
|
+
maxSizeBytes: number = MAX_OUTPUT_SIZE,
|
|
550
|
+
): boolean {
|
|
551
|
+
try {
|
|
552
|
+
const stats = getFsImplementation().statSync(filePath)
|
|
553
|
+
return stats.size <= maxSizeBytes
|
|
554
|
+
} catch {
|
|
555
|
+
// If we can't stat the file, return false to indicate validation failure
|
|
556
|
+
return false
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Normalize a file path for comparison, handling platform differences.
|
|
562
|
+
* On Windows, normalizes path separators and converts to lowercase for
|
|
563
|
+
* case-insensitive comparison.
|
|
564
|
+
*/
|
|
565
|
+
export function normalizePathForComparison(filePath: string): string {
|
|
566
|
+
// Use path.normalize() to clean up redundant separators and resolve . and ..
|
|
567
|
+
let normalized = normalize(filePath)
|
|
568
|
+
|
|
569
|
+
// On Windows, normalize for case-insensitive comparison:
|
|
570
|
+
// - Convert forward slashes to backslashes (path.normalize only does this on actual Windows)
|
|
571
|
+
// - Convert to lowercase (Windows paths are case-insensitive)
|
|
572
|
+
if (getPlatform() === 'windows') {
|
|
573
|
+
normalized = normalized.replace(/\//g, '\\').toLowerCase()
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
return normalized
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Compare two file paths for equality, handling Windows case-insensitivity.
|
|
581
|
+
*/
|
|
582
|
+
export function pathsEqual(path1: string, path2: string): boolean {
|
|
583
|
+
return normalizePathForComparison(path1) === normalizePathForComparison(path2)
|
|
584
|
+
}
|