@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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Side Question ("/btw") feature - allows asking quick questions without
|
|
3
|
+
* interrupting the main agent context.
|
|
4
|
+
*
|
|
5
|
+
* Uses runForkedAgent to leverage prompt caching from the parent context
|
|
6
|
+
* while keeping the side question response separate from main conversation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { formatAPIError } from '../services/api/errorUtils.js'
|
|
10
|
+
import type { NonNullableUsage } from '../services/api/logging.js'
|
|
11
|
+
import type { Message, SystemAPIErrorMessage } from '../types/message.js'
|
|
12
|
+
import { type CacheSafeParams, runForkedAgent } from './forkedAgent.js'
|
|
13
|
+
import { createUserMessage, extractTextContent } from './messages.js'
|
|
14
|
+
|
|
15
|
+
// Pattern to detect "/btw" at start of input (case-insensitive, word boundary)
|
|
16
|
+
const BTW_PATTERN = /^\/btw\b/gi
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Find positions of "/btw" keyword at the start of text for highlighting.
|
|
20
|
+
* Similar to findThinkingTriggerPositions in thinking.ts.
|
|
21
|
+
*/
|
|
22
|
+
export function findBtwTriggerPositions(text: string): Array<{
|
|
23
|
+
word: string
|
|
24
|
+
start: number
|
|
25
|
+
end: number
|
|
26
|
+
}> {
|
|
27
|
+
const positions: Array<{ word: string; start: number; end: number }> = []
|
|
28
|
+
const matches = text.matchAll(BTW_PATTERN)
|
|
29
|
+
|
|
30
|
+
for (const match of matches) {
|
|
31
|
+
if (match.index !== undefined) {
|
|
32
|
+
positions.push({
|
|
33
|
+
word: match[0],
|
|
34
|
+
start: match.index,
|
|
35
|
+
end: match.index + match[0].length,
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return positions
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type SideQuestionResult = {
|
|
44
|
+
response: string | null
|
|
45
|
+
usage: NonNullableUsage
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Run a side question using a forked agent.
|
|
50
|
+
* Shares the parent's prompt cache — no thinking override, no cache write.
|
|
51
|
+
* All tools are blocked and we cap at 1 turn.
|
|
52
|
+
*/
|
|
53
|
+
export async function runSideQuestion({
|
|
54
|
+
question,
|
|
55
|
+
cacheSafeParams,
|
|
56
|
+
}: {
|
|
57
|
+
question: string
|
|
58
|
+
cacheSafeParams: CacheSafeParams
|
|
59
|
+
}): Promise<SideQuestionResult> {
|
|
60
|
+
// Wrap the question with instructions to answer without tools
|
|
61
|
+
const wrappedQuestion = `<system-reminder>This is a side question from the user. You must answer this question directly in a single response.
|
|
62
|
+
|
|
63
|
+
IMPORTANT CONTEXT:
|
|
64
|
+
- You are a separate, lightweight agent spawned to answer this one question
|
|
65
|
+
- The main agent is NOT interrupted - it continues working independently in the background
|
|
66
|
+
- You share the conversation context but are a completely separate instance
|
|
67
|
+
- Do NOT reference being interrupted or what you were "previously doing" - that framing is incorrect
|
|
68
|
+
|
|
69
|
+
CRITICAL CONSTRAINTS:
|
|
70
|
+
- You have NO tools available - you cannot read files, run commands, search, or take any actions
|
|
71
|
+
- This is a one-off response - there will be no follow-up turns
|
|
72
|
+
- You can ONLY provide information based on what you already know from the conversation context
|
|
73
|
+
- NEVER say things like "Let me try...", "I'll now...", "Let me check...", or promise to take any action
|
|
74
|
+
- If you don't know the answer, say so - do not offer to look it up or investigate
|
|
75
|
+
|
|
76
|
+
Simply answer the question with the information you have.</system-reminder>
|
|
77
|
+
|
|
78
|
+
${question}`
|
|
79
|
+
|
|
80
|
+
const agentResult = await runForkedAgent({
|
|
81
|
+
promptMessages: [createUserMessage({ content: wrappedQuestion })],
|
|
82
|
+
// Do NOT override thinkingConfig — thinking is part of the API cache key,
|
|
83
|
+
// and diverging from the main thread's config busts the prompt cache.
|
|
84
|
+
// Adaptive thinking on a quick Q&A has negligible overhead.
|
|
85
|
+
cacheSafeParams,
|
|
86
|
+
canUseTool: async () => ({
|
|
87
|
+
behavior: 'deny' as const,
|
|
88
|
+
message: 'Side questions cannot use tools',
|
|
89
|
+
decisionReason: { type: 'other' as const, reason: 'side_question' },
|
|
90
|
+
}),
|
|
91
|
+
querySource: 'side_question',
|
|
92
|
+
forkLabel: 'side_question',
|
|
93
|
+
maxTurns: 1, // Single turn only - no tool use loops
|
|
94
|
+
// No future request shares this suffix; skip writing cache entries.
|
|
95
|
+
skipCacheWrite: true,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
response: extractSideQuestionResponse(agentResult.messages),
|
|
100
|
+
usage: agentResult.totalUsage,
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Extract a display string from forked agent messages.
|
|
106
|
+
*
|
|
107
|
+
* IMPORTANT: claude.ts yields one AssistantMessage PER CONTENT BLOCK, not one
|
|
108
|
+
* per API response. With adaptive thinking enabled (inherited from the main
|
|
109
|
+
* thread to preserve the cache key), a thinking response arrives as:
|
|
110
|
+
* messages[0] = assistant { content: [thinking_block] }
|
|
111
|
+
* messages[1] = assistant { content: [text_block] }
|
|
112
|
+
*
|
|
113
|
+
* The old code used `.find(m => m.type === 'assistant')` which grabbed the
|
|
114
|
+
* first (thinking-only) message, found no text block, and returned null →
|
|
115
|
+
* "No response received". Repos with large context (many skills, big CLAUDE.md)
|
|
116
|
+
* trigger thinking more often, which is why this reproduced in the monorepo
|
|
117
|
+
* but not here.
|
|
118
|
+
*
|
|
119
|
+
* Secondary failure modes also surfaced as "No response received":
|
|
120
|
+
* - Model attempts tool_use → content = [thinking, tool_use], no text.
|
|
121
|
+
* Rare — the system-reminder usually prevents this, but handled here.
|
|
122
|
+
* - API error exhausts retries → query yields system api_error + user
|
|
123
|
+
* interruption, no assistant message at all.
|
|
124
|
+
*/
|
|
125
|
+
function extractSideQuestionResponse(messages: Message[]): string | null {
|
|
126
|
+
// Flatten all assistant content blocks across the per-block messages.
|
|
127
|
+
const assistantBlocks = messages.flatMap(m =>
|
|
128
|
+
m.type === 'assistant' ? m.message.content : [],
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if (assistantBlocks.length > 0) {
|
|
132
|
+
// Concatenate all text blocks (there's normally at most one, but be safe).
|
|
133
|
+
const text = extractTextContent(assistantBlocks, '\n\n').trim()
|
|
134
|
+
if (text) return text
|
|
135
|
+
|
|
136
|
+
// No text — check if the model tried to call a tool despite instructions.
|
|
137
|
+
const toolUse = assistantBlocks.find(b => b.type === 'tool_use')
|
|
138
|
+
if (toolUse) {
|
|
139
|
+
const toolName = 'name' in toolUse ? toolUse.name : 'a tool'
|
|
140
|
+
return `(The model tried to call ${toolName} instead of answering directly. Try rephrasing or ask in the main conversation.)`
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// No assistant content — likely API error exhausted retries. Surface the
|
|
145
|
+
// first system api_error message so the user sees what happened.
|
|
146
|
+
const apiErr = messages.find(
|
|
147
|
+
(m): m is SystemAPIErrorMessage =>
|
|
148
|
+
m.type === 'system' && 'subtype' in m && m.subtype === 'api_error',
|
|
149
|
+
)
|
|
150
|
+
if (apiErr) {
|
|
151
|
+
return `(API error: ${formatAPIError(apiErr.error)})`
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return null
|
|
155
|
+
}
|
package/utils/signal.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny listener-set primitive for pure event signals (no stored state).
|
|
3
|
+
*
|
|
4
|
+
* Collapses the ~8-line `const listeners = new Set(); function subscribe(){…};
|
|
5
|
+
* function notify(){for(const l of listeners) l()}` boilerplate that was
|
|
6
|
+
* duplicated ~15× across the codebase into a one-liner.
|
|
7
|
+
*
|
|
8
|
+
* Distinct from a store (AppState, createStore) — there is no snapshot, no
|
|
9
|
+
* getState. Use this when subscribers only need to know "something happened",
|
|
10
|
+
* optionally with event args, not "what is the current value".
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const changed = createSignal<[SettingSource]>()
|
|
14
|
+
* export const subscribe = changed.subscribe
|
|
15
|
+
* // later: changed.emit('userSettings')
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export type Signal<Args extends unknown[] = []> = {
|
|
19
|
+
/** Subscribe a listener. Returns an unsubscribe function. */
|
|
20
|
+
subscribe: (listener: (...args: Args) => void) => () => void
|
|
21
|
+
/** Call all subscribed listeners with the given arguments. */
|
|
22
|
+
emit: (...args: Args) => void
|
|
23
|
+
/** Remove all listeners. Useful in dispose/reset paths. */
|
|
24
|
+
clear: () => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createSignal<Args extends unknown[] = []>(): Signal<Args> {
|
|
28
|
+
const listeners = new Set<(...args: Args) => void>()
|
|
29
|
+
return {
|
|
30
|
+
subscribe(listener) {
|
|
31
|
+
listeners.add(listener)
|
|
32
|
+
return () => {
|
|
33
|
+
listeners.delete(listener)
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
emit(...args) {
|
|
37
|
+
for (const listener of listeners) listener(...args)
|
|
38
|
+
},
|
|
39
|
+
clear() {
|
|
40
|
+
listeners.clear()
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
}
|
package/utils/sinks.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { initializeAnalyticsSink } from '../services/analytics/sink.js'
|
|
2
|
+
import { initializeErrorLogSink } from './errorLogSink.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Attach error log and analytics sinks, draining any events queued before
|
|
6
|
+
* attachment. Both inits are idempotent. Called from setup() for the default
|
|
7
|
+
* command; other entrypoints (subcommands, daemon, bridge) call this directly
|
|
8
|
+
* since they bypass setup().
|
|
9
|
+
*
|
|
10
|
+
* Leaf module — kept out of setup.ts to avoid the setup → commands → bridge
|
|
11
|
+
* → setup import cycle.
|
|
12
|
+
*/
|
|
13
|
+
export function initSinks(): void {
|
|
14
|
+
initializeErrorLogSink()
|
|
15
|
+
initializeAnalyticsSink()
|
|
16
|
+
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import chokidar, { type FSWatcher } from 'chokidar'
|
|
2
|
+
import * as platformPath from 'path'
|
|
3
|
+
import { getAdditionalDirectoriesForClaudeMd } from '../../bootstrap/state.js'
|
|
4
|
+
import {
|
|
5
|
+
clearCommandMemoizationCaches,
|
|
6
|
+
clearCommandsCache,
|
|
7
|
+
} from '../../commands.js'
|
|
8
|
+
import {
|
|
9
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
10
|
+
logEvent,
|
|
11
|
+
} from '../../services/analytics/index.js'
|
|
12
|
+
import {
|
|
13
|
+
clearSkillCaches,
|
|
14
|
+
getSkillsPath,
|
|
15
|
+
onDynamicSkillsLoaded,
|
|
16
|
+
} from '../../skills/loadSkillsDir.js'
|
|
17
|
+
import { resetSentSkillNames } from '../attachments.js'
|
|
18
|
+
import { registerCleanup } from '../cleanupRegistry.js'
|
|
19
|
+
import { logForDebugging } from '../debug.js'
|
|
20
|
+
import { getFsImplementation } from '../fsOperations.js'
|
|
21
|
+
import { executeConfigChangeHooks, hasBlockingResult } from '../hooks.js'
|
|
22
|
+
import { createSignal } from '../signal.js'
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Time in milliseconds to wait for file writes to stabilize before processing.
|
|
26
|
+
*/
|
|
27
|
+
const FILE_STABILITY_THRESHOLD_MS = 1000
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Polling interval in milliseconds for checking file stability.
|
|
31
|
+
*/
|
|
32
|
+
const FILE_STABILITY_POLL_INTERVAL_MS = 500
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Time in milliseconds to debounce rapid skill change events into a single
|
|
36
|
+
* reload. Prevents cascading reloads when many skill files change at once
|
|
37
|
+
* (e.g. during auto-update or when another session modifies skill directories).
|
|
38
|
+
* Without this, each file change triggers a full clearSkillCaches() +
|
|
39
|
+
* clearCommandsCache() + listener notification cycle, which can deadlock the
|
|
40
|
+
* event loop when dozens of events fire in rapid succession.
|
|
41
|
+
*/
|
|
42
|
+
const RELOAD_DEBOUNCE_MS = 300
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Polling interval for chokidar when usePolling is enabled.
|
|
46
|
+
* Skill files change rarely (manual edits, git operations), so a 2s interval
|
|
47
|
+
* trades negligible latency for far fewer stat() calls than the default 100ms.
|
|
48
|
+
*/
|
|
49
|
+
const POLLING_INTERVAL_MS = 2000
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Bun's native fs.watch() has a PathWatcherManager deadlock (oven-sh/bun#27469,
|
|
53
|
+
* #26385): closing a watcher on the main thread while the File Watcher thread
|
|
54
|
+
* is delivering events can hang both threads in __ulock_wait2 forever. Chokidar
|
|
55
|
+
* with depth: 2 on large skill trees (hundreds of subdirs) triggers this
|
|
56
|
+
* reliably when a git operation touches many directories at once — chokidar
|
|
57
|
+
* internally closes/reopens per-directory FSWatchers as dirs are added/removed.
|
|
58
|
+
*
|
|
59
|
+
* Workaround: use stat() polling under Bun. No FSWatcher = no deadlock.
|
|
60
|
+
* The fix is pending upstream; remove this once the Bun PR lands.
|
|
61
|
+
*/
|
|
62
|
+
const USE_POLLING = typeof Bun !== 'undefined'
|
|
63
|
+
|
|
64
|
+
let watcher: FSWatcher | null = null
|
|
65
|
+
let reloadTimer: ReturnType<typeof setTimeout> | null = null
|
|
66
|
+
const pendingChangedPaths = new Set<string>()
|
|
67
|
+
let initialized = false
|
|
68
|
+
let disposed = false
|
|
69
|
+
let dynamicSkillsCallbackRegistered = false
|
|
70
|
+
let unregisterCleanup: (() => void) | null = null
|
|
71
|
+
const skillsChanged = createSignal()
|
|
72
|
+
|
|
73
|
+
// Test overrides for timing constants
|
|
74
|
+
let testOverrides: {
|
|
75
|
+
stabilityThreshold?: number
|
|
76
|
+
pollInterval?: number
|
|
77
|
+
reloadDebounce?: number
|
|
78
|
+
/** Chokidar fs.stat polling interval when USE_POLLING is active. */
|
|
79
|
+
chokidarInterval?: number
|
|
80
|
+
} | null = null
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Initialize file watching for skill directories
|
|
84
|
+
*/
|
|
85
|
+
export async function initialize(): Promise<void> {
|
|
86
|
+
if (initialized || disposed) return
|
|
87
|
+
initialized = true
|
|
88
|
+
|
|
89
|
+
// Register callback for when dynamic skills are loaded (only once)
|
|
90
|
+
if (!dynamicSkillsCallbackRegistered) {
|
|
91
|
+
dynamicSkillsCallbackRegistered = true
|
|
92
|
+
onDynamicSkillsLoaded(() => {
|
|
93
|
+
// Clear memoization caches so new skills are picked up
|
|
94
|
+
// Note: we use clearCommandMemoizationCaches (not clearCommandsCache)
|
|
95
|
+
// because clearCommandsCache would call clearSkillCaches which
|
|
96
|
+
// wipes out the dynamic skills we just loaded
|
|
97
|
+
clearCommandMemoizationCaches()
|
|
98
|
+
// Notify listeners that skills changed
|
|
99
|
+
skillsChanged.emit()
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const paths = await getWatchablePaths()
|
|
104
|
+
if (paths.length === 0) return
|
|
105
|
+
|
|
106
|
+
logForDebugging(
|
|
107
|
+
`Watching for changes in skill/command directories: ${paths.join(', ')}...`,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
watcher = chokidar.watch(paths, {
|
|
111
|
+
persistent: true,
|
|
112
|
+
ignoreInitial: true,
|
|
113
|
+
depth: 2, // Skills use skill-name/SKILL.md format
|
|
114
|
+
awaitWriteFinish: {
|
|
115
|
+
stabilityThreshold:
|
|
116
|
+
testOverrides?.stabilityThreshold ?? FILE_STABILITY_THRESHOLD_MS,
|
|
117
|
+
pollInterval:
|
|
118
|
+
testOverrides?.pollInterval ?? FILE_STABILITY_POLL_INTERVAL_MS,
|
|
119
|
+
},
|
|
120
|
+
// Ignore special file types (sockets, FIFOs, devices) - they cannot be watched
|
|
121
|
+
// and will error with EOPNOTSUPP on macOS. Only allow regular files and directories.
|
|
122
|
+
ignored: (path, stats) => {
|
|
123
|
+
if (stats && !stats.isFile() && !stats.isDirectory()) return true
|
|
124
|
+
// Ignore .git directories
|
|
125
|
+
return path.split(platformPath.sep).some(dir => dir === '.git')
|
|
126
|
+
},
|
|
127
|
+
ignorePermissionErrors: true,
|
|
128
|
+
usePolling: USE_POLLING,
|
|
129
|
+
interval: testOverrides?.chokidarInterval ?? POLLING_INTERVAL_MS,
|
|
130
|
+
atomic: true,
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
watcher.on('add', handleChange)
|
|
134
|
+
watcher.on('change', handleChange)
|
|
135
|
+
watcher.on('unlink', handleChange)
|
|
136
|
+
|
|
137
|
+
// Register cleanup to properly dispose of the file watcher during graceful shutdown
|
|
138
|
+
unregisterCleanup = registerCleanup(async () => {
|
|
139
|
+
await dispose()
|
|
140
|
+
})
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Clean up file watcher
|
|
145
|
+
*/
|
|
146
|
+
export function dispose(): Promise<void> {
|
|
147
|
+
disposed = true
|
|
148
|
+
if (unregisterCleanup) {
|
|
149
|
+
unregisterCleanup()
|
|
150
|
+
unregisterCleanup = null
|
|
151
|
+
}
|
|
152
|
+
let closePromise: Promise<void> = Promise.resolve()
|
|
153
|
+
if (watcher) {
|
|
154
|
+
closePromise = watcher.close()
|
|
155
|
+
watcher = null
|
|
156
|
+
}
|
|
157
|
+
if (reloadTimer) {
|
|
158
|
+
clearTimeout(reloadTimer)
|
|
159
|
+
reloadTimer = null
|
|
160
|
+
}
|
|
161
|
+
pendingChangedPaths.clear()
|
|
162
|
+
skillsChanged.clear()
|
|
163
|
+
return closePromise
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Subscribe to skill changes
|
|
168
|
+
*/
|
|
169
|
+
export const subscribe = skillsChanged.subscribe
|
|
170
|
+
|
|
171
|
+
async function getWatchablePaths(): Promise<string[]> {
|
|
172
|
+
const fs = getFsImplementation()
|
|
173
|
+
const paths: string[] = []
|
|
174
|
+
|
|
175
|
+
// User skills directory (~/.claude/skills)
|
|
176
|
+
const userSkillsPath = getSkillsPath('userSettings', 'skills')
|
|
177
|
+
if (userSkillsPath) {
|
|
178
|
+
try {
|
|
179
|
+
await fs.stat(userSkillsPath)
|
|
180
|
+
paths.push(userSkillsPath)
|
|
181
|
+
} catch {
|
|
182
|
+
// Path doesn't exist, skip it
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// User commands directory (~/.claude/commands)
|
|
187
|
+
const userCommandsPath = getSkillsPath('userSettings', 'commands')
|
|
188
|
+
if (userCommandsPath) {
|
|
189
|
+
try {
|
|
190
|
+
await fs.stat(userCommandsPath)
|
|
191
|
+
paths.push(userCommandsPath)
|
|
192
|
+
} catch {
|
|
193
|
+
// Path doesn't exist, skip it
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Project skills directory (.claude/skills)
|
|
198
|
+
const projectSkillsPath = getSkillsPath('projectSettings', 'skills')
|
|
199
|
+
if (projectSkillsPath) {
|
|
200
|
+
try {
|
|
201
|
+
// For project settings, resolve to absolute path
|
|
202
|
+
const absolutePath = platformPath.resolve(projectSkillsPath)
|
|
203
|
+
await fs.stat(absolutePath)
|
|
204
|
+
paths.push(absolutePath)
|
|
205
|
+
} catch {
|
|
206
|
+
// Path doesn't exist, skip it
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Project commands directory (.claude/commands)
|
|
211
|
+
const projectCommandsPath = getSkillsPath('projectSettings', 'commands')
|
|
212
|
+
if (projectCommandsPath) {
|
|
213
|
+
try {
|
|
214
|
+
// For project settings, resolve to absolute path
|
|
215
|
+
const absolutePath = platformPath.resolve(projectCommandsPath)
|
|
216
|
+
await fs.stat(absolutePath)
|
|
217
|
+
paths.push(absolutePath)
|
|
218
|
+
} catch {
|
|
219
|
+
// Path doesn't exist, skip it
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Additional directories (--add-dir) skills
|
|
224
|
+
for (const dir of getAdditionalDirectoriesForClaudeMd()) {
|
|
225
|
+
const additionalSkillsPath = platformPath.join(dir, '.claude', 'skills')
|
|
226
|
+
try {
|
|
227
|
+
await fs.stat(additionalSkillsPath)
|
|
228
|
+
paths.push(additionalSkillsPath)
|
|
229
|
+
} catch {
|
|
230
|
+
// Path doesn't exist, skip it
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return paths
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function handleChange(path: string): void {
|
|
238
|
+
logForDebugging(`Detected skill change: ${path}`)
|
|
239
|
+
logEvent('tengu_skill_file_changed', {
|
|
240
|
+
source:
|
|
241
|
+
'chokidar' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
scheduleReload(path)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Debounce rapid skill changes into a single reload. When many skill files
|
|
249
|
+
* change at once (e.g. auto-update installs a new binary and a new session
|
|
250
|
+
* touches skill directories), each file fires its own chokidar event. Without
|
|
251
|
+
* debouncing, each event triggers clearSkillCaches() + clearCommandsCache() +
|
|
252
|
+
* listener notification — 30 events means 30 full reload cycles, which can
|
|
253
|
+
* deadlock the Bun event loop via rapid FSWatcher watch/unwatch churn.
|
|
254
|
+
*/
|
|
255
|
+
function scheduleReload(changedPath: string): void {
|
|
256
|
+
pendingChangedPaths.add(changedPath)
|
|
257
|
+
if (reloadTimer) clearTimeout(reloadTimer)
|
|
258
|
+
reloadTimer = setTimeout(async () => {
|
|
259
|
+
reloadTimer = null
|
|
260
|
+
const paths = [...pendingChangedPaths]
|
|
261
|
+
pendingChangedPaths.clear()
|
|
262
|
+
// Fire ConfigChange hook once for the batch — the hook query is always
|
|
263
|
+
// 'skills' so firing per-path (which can be hundreds during a git
|
|
264
|
+
// operation) just spams the hook matcher with identical queries. Pass the
|
|
265
|
+
// first path as a representative; hooks can inspect all paths via the
|
|
266
|
+
// skills directory if they need the full set.
|
|
267
|
+
const results = await executeConfigChangeHooks('skills', paths[0]!)
|
|
268
|
+
if (hasBlockingResult(results)) {
|
|
269
|
+
logForDebugging(
|
|
270
|
+
`ConfigChange hook blocked skill reload (${paths.length} paths)`,
|
|
271
|
+
)
|
|
272
|
+
return
|
|
273
|
+
}
|
|
274
|
+
clearSkillCaches()
|
|
275
|
+
clearCommandsCache()
|
|
276
|
+
resetSentSkillNames()
|
|
277
|
+
skillsChanged.emit()
|
|
278
|
+
}, testOverrides?.reloadDebounce ?? RELOAD_DEBOUNCE_MS)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Reset internal state for testing purposes only.
|
|
283
|
+
*/
|
|
284
|
+
export async function resetForTesting(overrides?: {
|
|
285
|
+
stabilityThreshold?: number
|
|
286
|
+
pollInterval?: number
|
|
287
|
+
reloadDebounce?: number
|
|
288
|
+
chokidarInterval?: number
|
|
289
|
+
}): Promise<void> {
|
|
290
|
+
// Clean up existing watcher if present to avoid resource leaks
|
|
291
|
+
if (watcher) {
|
|
292
|
+
await watcher.close()
|
|
293
|
+
watcher = null
|
|
294
|
+
}
|
|
295
|
+
if (reloadTimer) {
|
|
296
|
+
clearTimeout(reloadTimer)
|
|
297
|
+
reloadTimer = null
|
|
298
|
+
}
|
|
299
|
+
pendingChangedPaths.clear()
|
|
300
|
+
skillsChanged.clear()
|
|
301
|
+
initialized = false
|
|
302
|
+
disposed = false
|
|
303
|
+
testOverrides = overrides ?? null
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export const skillChangeDetector = {
|
|
307
|
+
initialize,
|
|
308
|
+
dispose,
|
|
309
|
+
subscribe,
|
|
310
|
+
resetForTesting,
|
|
311
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized utilities for parsing slash commands
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type ParsedSlashCommand = {
|
|
6
|
+
commandName: string
|
|
7
|
+
args: string
|
|
8
|
+
isMcp: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Parses a slash command input string into its component parts
|
|
13
|
+
*
|
|
14
|
+
* @param input - The raw input string (should start with '/')
|
|
15
|
+
* @returns Parsed command name, args, and MCP flag, or null if invalid
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* parseSlashCommand('/search foo bar')
|
|
19
|
+
* // => { commandName: 'search', args: 'foo bar', isMcp: false }
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* parseSlashCommand('/mcp:tool (MCP) arg1 arg2')
|
|
23
|
+
* // => { commandName: 'mcp:tool (MCP)', args: 'arg1 arg2', isMcp: true }
|
|
24
|
+
*/
|
|
25
|
+
export function parseSlashCommand(input: string): ParsedSlashCommand | null {
|
|
26
|
+
const trimmedInput = input.trim()
|
|
27
|
+
|
|
28
|
+
// Check if input starts with '/'
|
|
29
|
+
if (!trimmedInput.startsWith('/')) {
|
|
30
|
+
return null
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Remove the leading '/' and split by spaces
|
|
34
|
+
const withoutSlash = trimmedInput.slice(1)
|
|
35
|
+
const words = withoutSlash.split(' ')
|
|
36
|
+
|
|
37
|
+
if (!words[0]) {
|
|
38
|
+
return null
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let commandName = words[0]
|
|
42
|
+
let isMcp = false
|
|
43
|
+
let argsStartIndex = 1
|
|
44
|
+
|
|
45
|
+
// Check for MCP commands (second word is '(MCP)')
|
|
46
|
+
if (words.length > 1 && words[1] === '(MCP)') {
|
|
47
|
+
commandName = commandName + ' (MCP)'
|
|
48
|
+
isMcp = true
|
|
49
|
+
argsStartIndex = 2
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Extract arguments (everything after command name)
|
|
53
|
+
const args = words.slice(argsStartIndex).join(' ')
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
commandName,
|
|
57
|
+
args,
|
|
58
|
+
isMcp,
|
|
59
|
+
}
|
|
60
|
+
}
|
package/utils/sleep.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abort-responsive sleep. Resolves after `ms` milliseconds, or immediately
|
|
3
|
+
* when `signal` aborts (so backoff loops don't block shutdown).
|
|
4
|
+
*
|
|
5
|
+
* By default, abort resolves silently; the caller should check
|
|
6
|
+
* `signal.aborted` after the await. Pass `throwOnAbort: true` to have
|
|
7
|
+
* abort reject — useful when the sleep is deep inside a retry loop
|
|
8
|
+
* and you want the rejection to bubble up and cancel the whole operation.
|
|
9
|
+
*
|
|
10
|
+
* Pass `abortError` to customize the rejection error (implies
|
|
11
|
+
* `throwOnAbort: true`). Useful for retry loops that catch a specific
|
|
12
|
+
* error class (e.g. `APIUserAbortError`).
|
|
13
|
+
*/
|
|
14
|
+
export function sleep(
|
|
15
|
+
ms: number,
|
|
16
|
+
signal?: AbortSignal,
|
|
17
|
+
opts?: { throwOnAbort?: boolean; abortError?: () => Error; unref?: boolean },
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
// Check aborted state BEFORE setting up the timer. If we defined
|
|
21
|
+
// onAbort first and called it synchronously here, it would reference
|
|
22
|
+
// `timer` while still in the Temporal Dead Zone.
|
|
23
|
+
if (signal?.aborted) {
|
|
24
|
+
if (opts?.throwOnAbort || opts?.abortError) {
|
|
25
|
+
void reject(opts.abortError?.() ?? new Error('aborted'))
|
|
26
|
+
} else {
|
|
27
|
+
void resolve()
|
|
28
|
+
}
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
const timer = setTimeout(
|
|
32
|
+
(signal, onAbort, resolve) => {
|
|
33
|
+
signal?.removeEventListener('abort', onAbort)
|
|
34
|
+
void resolve()
|
|
35
|
+
},
|
|
36
|
+
ms,
|
|
37
|
+
signal,
|
|
38
|
+
onAbort,
|
|
39
|
+
resolve,
|
|
40
|
+
)
|
|
41
|
+
function onAbort(): void {
|
|
42
|
+
clearTimeout(timer)
|
|
43
|
+
if (opts?.throwOnAbort || opts?.abortError) {
|
|
44
|
+
void reject(opts.abortError?.() ?? new Error('aborted'))
|
|
45
|
+
} else {
|
|
46
|
+
void resolve()
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
signal?.addEventListener('abort', onAbort, { once: true })
|
|
50
|
+
if (opts?.unref) {
|
|
51
|
+
timer.unref()
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function rejectWithTimeout(reject: (e: Error) => void, message: string): void {
|
|
57
|
+
reject(new Error(message))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Race a promise against a timeout. Rejects with `Error(message)` if the
|
|
62
|
+
* promise doesn't settle within `ms`. The timeout timer is cleared when
|
|
63
|
+
* the promise settles (no dangling timer) and unref'd so it doesn't
|
|
64
|
+
* block process exit.
|
|
65
|
+
*
|
|
66
|
+
* Note: this doesn't cancel the underlying work — if the promise is
|
|
67
|
+
* backed by a runaway async operation, that keeps running. This just
|
|
68
|
+
* returns control to the caller.
|
|
69
|
+
*/
|
|
70
|
+
export function withTimeout<T>(
|
|
71
|
+
promise: Promise<T>,
|
|
72
|
+
ms: number,
|
|
73
|
+
message: string,
|
|
74
|
+
): Promise<T> {
|
|
75
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
76
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
77
|
+
// eslint-disable-next-line no-restricted-syntax -- not a sleep: REJECTS after ms (timeout guard)
|
|
78
|
+
timer = setTimeout(rejectWithTimeout, ms, reject, message)
|
|
79
|
+
if (typeof timer === 'object') timer.unref?.()
|
|
80
|
+
})
|
|
81
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
82
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
83
|
+
})
|
|
84
|
+
}
|