@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,263 @@
|
|
|
1
|
+
import { LRUCache } from 'lru-cache'
|
|
2
|
+
import { basename, dirname, join, sep } from 'path'
|
|
3
|
+
import type { SuggestionItem } from 'src/components/PromptInput/PromptInputFooterSuggestions.js'
|
|
4
|
+
import { getCwd } from 'src/utils/cwd.js'
|
|
5
|
+
import { getFsImplementation } from 'src/utils/fsOperations.js'
|
|
6
|
+
import { logError } from 'src/utils/log.js'
|
|
7
|
+
import { expandPath } from 'src/utils/path.js'
|
|
8
|
+
// Types
|
|
9
|
+
export type DirectoryEntry = {
|
|
10
|
+
name: string
|
|
11
|
+
path: string
|
|
12
|
+
type: 'directory'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type PathEntry = {
|
|
16
|
+
name: string
|
|
17
|
+
path: string
|
|
18
|
+
type: 'directory' | 'file'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type CompletionOptions = {
|
|
22
|
+
basePath?: string
|
|
23
|
+
maxResults?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type PathCompletionOptions = CompletionOptions & {
|
|
27
|
+
includeFiles?: boolean
|
|
28
|
+
includeHidden?: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ParsedPath = {
|
|
32
|
+
directory: string
|
|
33
|
+
prefix: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Cache configuration
|
|
37
|
+
const CACHE_SIZE = 500
|
|
38
|
+
const CACHE_TTL = 5 * 60 * 1000 // 5 minutes
|
|
39
|
+
|
|
40
|
+
// Initialize LRU cache for directory scans
|
|
41
|
+
const directoryCache = new LRUCache<string, DirectoryEntry[]>({
|
|
42
|
+
max: CACHE_SIZE,
|
|
43
|
+
ttl: CACHE_TTL,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Initialize LRU cache for path scans (files and directories)
|
|
47
|
+
const pathCache = new LRUCache<string, PathEntry[]>({
|
|
48
|
+
max: CACHE_SIZE,
|
|
49
|
+
ttl: CACHE_TTL,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parses a partial path into directory and prefix components
|
|
54
|
+
*/
|
|
55
|
+
export function parsePartialPath(
|
|
56
|
+
partialPath: string,
|
|
57
|
+
basePath?: string,
|
|
58
|
+
): ParsedPath {
|
|
59
|
+
// Handle empty input
|
|
60
|
+
if (!partialPath) {
|
|
61
|
+
const directory = basePath || getCwd()
|
|
62
|
+
return { directory, prefix: '' }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const resolved = expandPath(partialPath, basePath)
|
|
66
|
+
|
|
67
|
+
// If path ends with separator, treat as directory with no prefix
|
|
68
|
+
// Handle both forward slash and platform-specific separator
|
|
69
|
+
if (partialPath.endsWith('/') || partialPath.endsWith(sep)) {
|
|
70
|
+
return { directory: resolved, prefix: '' }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Split into directory and prefix
|
|
74
|
+
const directory = dirname(resolved)
|
|
75
|
+
const prefix = basename(partialPath)
|
|
76
|
+
|
|
77
|
+
return { directory, prefix }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Scans a directory and returns subdirectories
|
|
82
|
+
* Uses LRU cache to avoid repeated filesystem calls
|
|
83
|
+
*/
|
|
84
|
+
export async function scanDirectory(
|
|
85
|
+
dirPath: string,
|
|
86
|
+
): Promise<DirectoryEntry[]> {
|
|
87
|
+
// Check cache first
|
|
88
|
+
const cached = directoryCache.get(dirPath)
|
|
89
|
+
if (cached) {
|
|
90
|
+
return cached
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
// Read directory contents
|
|
95
|
+
const fs = getFsImplementation()
|
|
96
|
+
const entries = await fs.readdir(dirPath)
|
|
97
|
+
|
|
98
|
+
// Filter for directories only, exclude hidden directories
|
|
99
|
+
const directories = entries
|
|
100
|
+
.filter(entry => entry.isDirectory() && !entry.name.startsWith('.'))
|
|
101
|
+
.map(entry => ({
|
|
102
|
+
name: entry.name,
|
|
103
|
+
path: join(dirPath, entry.name),
|
|
104
|
+
type: 'directory' as const,
|
|
105
|
+
}))
|
|
106
|
+
.slice(0, 100) // Limit results for MVP
|
|
107
|
+
|
|
108
|
+
// Cache the results
|
|
109
|
+
directoryCache.set(dirPath, directories)
|
|
110
|
+
|
|
111
|
+
return directories
|
|
112
|
+
} catch (error) {
|
|
113
|
+
logError(error)
|
|
114
|
+
return []
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Main function to get directory completion suggestions
|
|
120
|
+
*/
|
|
121
|
+
export async function getDirectoryCompletions(
|
|
122
|
+
partialPath: string,
|
|
123
|
+
options: CompletionOptions = {},
|
|
124
|
+
): Promise<SuggestionItem[]> {
|
|
125
|
+
const { basePath = getCwd(), maxResults = 10 } = options
|
|
126
|
+
|
|
127
|
+
const { directory, prefix } = parsePartialPath(partialPath, basePath)
|
|
128
|
+
const entries = await scanDirectory(directory)
|
|
129
|
+
const prefixLower = prefix.toLowerCase()
|
|
130
|
+
const matches = entries
|
|
131
|
+
.filter(entry => entry.name.toLowerCase().startsWith(prefixLower))
|
|
132
|
+
.slice(0, maxResults)
|
|
133
|
+
|
|
134
|
+
return matches.map(entry => ({
|
|
135
|
+
id: entry.path,
|
|
136
|
+
displayText: entry.name + '/',
|
|
137
|
+
description: 'directory',
|
|
138
|
+
metadata: { type: 'directory' as const },
|
|
139
|
+
}))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Clears the directory cache
|
|
144
|
+
*/
|
|
145
|
+
export function clearDirectoryCache(): void {
|
|
146
|
+
directoryCache.clear()
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Checks if a string looks like a path (starts with path-like prefixes)
|
|
151
|
+
*/
|
|
152
|
+
export function isPathLikeToken(token: string): boolean {
|
|
153
|
+
return (
|
|
154
|
+
token.startsWith('~/') ||
|
|
155
|
+
token.startsWith('/') ||
|
|
156
|
+
token.startsWith('./') ||
|
|
157
|
+
token.startsWith('../') ||
|
|
158
|
+
token === '~' ||
|
|
159
|
+
token === '.' ||
|
|
160
|
+
token === '..'
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Scans a directory and returns both files and subdirectories
|
|
166
|
+
* Uses LRU cache to avoid repeated filesystem calls
|
|
167
|
+
*/
|
|
168
|
+
export async function scanDirectoryForPaths(
|
|
169
|
+
dirPath: string,
|
|
170
|
+
includeHidden = false,
|
|
171
|
+
): Promise<PathEntry[]> {
|
|
172
|
+
const cacheKey = `${dirPath}:${includeHidden}`
|
|
173
|
+
const cached = pathCache.get(cacheKey)
|
|
174
|
+
if (cached) {
|
|
175
|
+
return cached
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
const fs = getFsImplementation()
|
|
180
|
+
const entries = await fs.readdir(dirPath)
|
|
181
|
+
|
|
182
|
+
const paths = entries
|
|
183
|
+
.filter(entry => includeHidden || !entry.name.startsWith('.'))
|
|
184
|
+
.map(entry => ({
|
|
185
|
+
name: entry.name,
|
|
186
|
+
path: join(dirPath, entry.name),
|
|
187
|
+
type: entry.isDirectory() ? ('directory' as const) : ('file' as const),
|
|
188
|
+
}))
|
|
189
|
+
.sort((a, b) => {
|
|
190
|
+
// Sort directories first, then alphabetically
|
|
191
|
+
if (a.type === 'directory' && b.type !== 'directory') return -1
|
|
192
|
+
if (a.type !== 'directory' && b.type === 'directory') return 1
|
|
193
|
+
return a.name.localeCompare(b.name)
|
|
194
|
+
})
|
|
195
|
+
.slice(0, 100)
|
|
196
|
+
|
|
197
|
+
pathCache.set(cacheKey, paths)
|
|
198
|
+
return paths
|
|
199
|
+
} catch (error) {
|
|
200
|
+
logError(error)
|
|
201
|
+
return []
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Get path completion suggestions for files and directories
|
|
207
|
+
*/
|
|
208
|
+
export async function getPathCompletions(
|
|
209
|
+
partialPath: string,
|
|
210
|
+
options: PathCompletionOptions = {},
|
|
211
|
+
): Promise<SuggestionItem[]> {
|
|
212
|
+
const {
|
|
213
|
+
basePath = getCwd(),
|
|
214
|
+
maxResults = 10,
|
|
215
|
+
includeFiles = true,
|
|
216
|
+
includeHidden = false,
|
|
217
|
+
} = options
|
|
218
|
+
|
|
219
|
+
const { directory, prefix } = parsePartialPath(partialPath, basePath)
|
|
220
|
+
const entries = await scanDirectoryForPaths(directory, includeHidden)
|
|
221
|
+
const prefixLower = prefix.toLowerCase()
|
|
222
|
+
|
|
223
|
+
const matches = entries
|
|
224
|
+
.filter(entry => {
|
|
225
|
+
if (!includeFiles && entry.type === 'file') return false
|
|
226
|
+
return entry.name.toLowerCase().startsWith(prefixLower)
|
|
227
|
+
})
|
|
228
|
+
.slice(0, maxResults)
|
|
229
|
+
|
|
230
|
+
// Construct relative path based on original partialPath
|
|
231
|
+
// e.g., if partialPath is "src/c", directory portion is "src/"
|
|
232
|
+
// Strip leading "./" since it's just used for cwd search
|
|
233
|
+
// Handle both forward slash and platform separator for Windows compatibility
|
|
234
|
+
const hasSeparator = partialPath.includes('/') || partialPath.includes(sep)
|
|
235
|
+
let dirPortion = ''
|
|
236
|
+
if (hasSeparator) {
|
|
237
|
+
// Find the last separator (either / or platform-specific)
|
|
238
|
+
const lastSlash = partialPath.lastIndexOf('/')
|
|
239
|
+
const lastSep = partialPath.lastIndexOf(sep)
|
|
240
|
+
const lastSeparatorPos = Math.max(lastSlash, lastSep)
|
|
241
|
+
dirPortion = partialPath.substring(0, lastSeparatorPos + 1)
|
|
242
|
+
}
|
|
243
|
+
if (dirPortion.startsWith('./') || dirPortion.startsWith('.' + sep)) {
|
|
244
|
+
dirPortion = dirPortion.slice(2)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return matches.map(entry => {
|
|
248
|
+
const fullPath = dirPortion + entry.name
|
|
249
|
+
return {
|
|
250
|
+
id: fullPath,
|
|
251
|
+
displayText: entry.type === 'directory' ? fullPath + '/' : fullPath,
|
|
252
|
+
metadata: { type: entry.type },
|
|
253
|
+
}
|
|
254
|
+
})
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Clears both directory and path caches
|
|
259
|
+
*/
|
|
260
|
+
export function clearPathCache(): void {
|
|
261
|
+
directoryCache.clear()
|
|
262
|
+
pathCache.clear()
|
|
263
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { getHistory } from '../../history.js'
|
|
2
|
+
import { logForDebugging } from '../debug.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Result of shell history completion lookup
|
|
6
|
+
*/
|
|
7
|
+
export type ShellHistoryMatch = {
|
|
8
|
+
/** The full command from history */
|
|
9
|
+
fullCommand: string
|
|
10
|
+
/** The suffix to display as ghost text (the part after user's input) */
|
|
11
|
+
suffix: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Cache for shell history commands to avoid repeated async reads
|
|
15
|
+
// History only changes when user submits a command, so a long TTL is fine
|
|
16
|
+
let shellHistoryCache: string[] | null = null
|
|
17
|
+
let shellHistoryCacheTimestamp = 0
|
|
18
|
+
const CACHE_TTL_MS = 60000 // 60 seconds - history won't change while typing
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get shell commands from history, with caching
|
|
22
|
+
*/
|
|
23
|
+
async function getShellHistoryCommands(): Promise<string[]> {
|
|
24
|
+
const now = Date.now()
|
|
25
|
+
|
|
26
|
+
// Return cached result if still fresh
|
|
27
|
+
if (shellHistoryCache && now - shellHistoryCacheTimestamp < CACHE_TTL_MS) {
|
|
28
|
+
return shellHistoryCache
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const commands: string[] = []
|
|
32
|
+
const seen = new Set<string>()
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
// Read history entries and filter for bash commands
|
|
36
|
+
for await (const entry of getHistory()) {
|
|
37
|
+
if (entry.display && entry.display.startsWith('!')) {
|
|
38
|
+
// Remove the '!' prefix to get the actual command
|
|
39
|
+
const command = entry.display.slice(1).trim()
|
|
40
|
+
if (command && !seen.has(command)) {
|
|
41
|
+
seen.add(command)
|
|
42
|
+
commands.push(command)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Limit to 50 most recent unique commands
|
|
46
|
+
if (commands.length >= 50) {
|
|
47
|
+
break
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logForDebugging(`Failed to read shell history: ${error}`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
shellHistoryCache = commands
|
|
55
|
+
shellHistoryCacheTimestamp = now
|
|
56
|
+
return commands
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Clear the shell history cache (useful when history is updated)
|
|
61
|
+
*/
|
|
62
|
+
export function clearShellHistoryCache(): void {
|
|
63
|
+
shellHistoryCache = null
|
|
64
|
+
shellHistoryCacheTimestamp = 0
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Add a command to the front of the shell history cache without
|
|
69
|
+
* flushing the entire cache. If the command already exists in the
|
|
70
|
+
* cache it is moved to the front (deduped). When the cache hasn't
|
|
71
|
+
* been populated yet this is a no-op – the next lookup will read
|
|
72
|
+
* the full history which already includes the new command.
|
|
73
|
+
*/
|
|
74
|
+
export function prependToShellHistoryCache(command: string): void {
|
|
75
|
+
if (!shellHistoryCache) {
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
const idx = shellHistoryCache.indexOf(command)
|
|
79
|
+
if (idx !== -1) {
|
|
80
|
+
shellHistoryCache.splice(idx, 1)
|
|
81
|
+
}
|
|
82
|
+
shellHistoryCache.unshift(command)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Find the best matching shell command from history for the given input
|
|
87
|
+
*
|
|
88
|
+
* @param input The current user input (without '!' prefix)
|
|
89
|
+
* @returns The best match, or null if no match found
|
|
90
|
+
*/
|
|
91
|
+
export async function getShellHistoryCompletion(
|
|
92
|
+
input: string,
|
|
93
|
+
): Promise<ShellHistoryMatch | null> {
|
|
94
|
+
// Don't suggest for empty or very short input
|
|
95
|
+
if (!input || input.length < 2) {
|
|
96
|
+
return null
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Check the trimmed input to make sure there's actual content
|
|
100
|
+
const trimmedInput = input.trim()
|
|
101
|
+
if (!trimmedInput) {
|
|
102
|
+
return null
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const commands = await getShellHistoryCommands()
|
|
106
|
+
|
|
107
|
+
// Find the first command that starts with the EXACT input (including spaces)
|
|
108
|
+
// This ensures "ls " matches "ls -lah" but "ls " (2 spaces) does not
|
|
109
|
+
for (const command of commands) {
|
|
110
|
+
if (command.startsWith(input) && command !== input) {
|
|
111
|
+
return {
|
|
112
|
+
fullCommand: command,
|
|
113
|
+
suffix: command.slice(input.length),
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return null
|
|
119
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getGlobalConfig, saveGlobalConfig } from '../config.js'
|
|
2
|
+
|
|
3
|
+
const SKILL_USAGE_DEBOUNCE_MS = 60_000
|
|
4
|
+
|
|
5
|
+
// Process-lifetime debounce cache — avoids lock + read + parse on debounced
|
|
6
|
+
// calls. Same pattern as lastConfigStatTime / globalConfigWriteCount in config.ts.
|
|
7
|
+
const lastWriteBySkill = new Map<string, number>()
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Records a skill usage for ranking purposes.
|
|
11
|
+
* Updates both usage count and last used timestamp.
|
|
12
|
+
*/
|
|
13
|
+
export function recordSkillUsage(skillName: string): void {
|
|
14
|
+
const now = Date.now()
|
|
15
|
+
const lastWrite = lastWriteBySkill.get(skillName)
|
|
16
|
+
// The ranking algorithm uses a 7-day half-life, so sub-minute granularity
|
|
17
|
+
// is irrelevant. Bail out before saveGlobalConfig to avoid lock + file I/O.
|
|
18
|
+
if (lastWrite !== undefined && now - lastWrite < SKILL_USAGE_DEBOUNCE_MS) {
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
lastWriteBySkill.set(skillName, now)
|
|
22
|
+
saveGlobalConfig(current => {
|
|
23
|
+
const existing = current.skillUsage?.[skillName]
|
|
24
|
+
return {
|
|
25
|
+
...current,
|
|
26
|
+
skillUsage: {
|
|
27
|
+
...current.skillUsage,
|
|
28
|
+
[skillName]: {
|
|
29
|
+
usageCount: (existing?.usageCount ?? 0) + 1,
|
|
30
|
+
lastUsedAt: now,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Calculates a usage score for a skill based on frequency and recency.
|
|
39
|
+
* Higher scores indicate more frequently and recently used skills.
|
|
40
|
+
*
|
|
41
|
+
* The score uses exponential decay with a half-life of 7 days,
|
|
42
|
+
* meaning usage from 7 days ago is worth half as much as usage today.
|
|
43
|
+
*/
|
|
44
|
+
export function getSkillUsageScore(skillName: string): number {
|
|
45
|
+
const config = getGlobalConfig()
|
|
46
|
+
const usage = config.skillUsage?.[skillName]
|
|
47
|
+
if (!usage) return 0
|
|
48
|
+
|
|
49
|
+
// Recency decay: halve score every 7 days
|
|
50
|
+
const daysSinceUse = (Date.now() - usage.lastUsedAt) / (1000 * 60 * 60 * 24)
|
|
51
|
+
const recencyFactor = Math.pow(0.5, daysSinceUse / 7)
|
|
52
|
+
|
|
53
|
+
// Minimum recency factor of 0.1 to avoid completely dropping old but heavily used skills
|
|
54
|
+
return usage.usageCount * Math.max(recencyFactor, 0.1)
|
|
55
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { SuggestionItem } from '../../components/PromptInput/PromptInputFooterSuggestions.js'
|
|
3
|
+
import type { MCPServerConnection } from '../../services/mcp/types.js'
|
|
4
|
+
import { logForDebugging } from '../debug.js'
|
|
5
|
+
import { lazySchema } from '../lazySchema.js'
|
|
6
|
+
import { createSignal } from '../signal.js'
|
|
7
|
+
import { jsonParse } from '../slowOperations.js'
|
|
8
|
+
|
|
9
|
+
const SLACK_SEARCH_TOOL = 'slack_search_channels'
|
|
10
|
+
|
|
11
|
+
// Plain Map (not LRUCache) — findReusableCacheEntry needs to iterate all
|
|
12
|
+
// entries for prefix matching, which LRUCache doesn't expose cleanly.
|
|
13
|
+
const cache = new Map<string, string[]>()
|
|
14
|
+
// Flat set of every channel name ever returned by MCP — used to gate
|
|
15
|
+
// highlighting so only confirmed-real channels turn blue in the prompt.
|
|
16
|
+
const knownChannels = new Set<string>()
|
|
17
|
+
let knownChannelsVersion = 0
|
|
18
|
+
const knownChannelsChanged = createSignal()
|
|
19
|
+
export const subscribeKnownChannels = knownChannelsChanged.subscribe
|
|
20
|
+
let inflightQuery: string | null = null
|
|
21
|
+
let inflightPromise: Promise<string[]> | null = null
|
|
22
|
+
|
|
23
|
+
function findSlackClient(
|
|
24
|
+
clients: MCPServerConnection[],
|
|
25
|
+
): MCPServerConnection | undefined {
|
|
26
|
+
return clients.find(c => c.type === 'connected' && c.name.includes('slack'))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function fetchChannels(
|
|
30
|
+
clients: MCPServerConnection[],
|
|
31
|
+
query: string,
|
|
32
|
+
): Promise<string[]> {
|
|
33
|
+
const slackClient = findSlackClient(clients)
|
|
34
|
+
if (!slackClient || slackClient.type !== 'connected') {
|
|
35
|
+
return []
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const result = await slackClient.client.callTool(
|
|
40
|
+
{
|
|
41
|
+
name: SLACK_SEARCH_TOOL,
|
|
42
|
+
arguments: {
|
|
43
|
+
query,
|
|
44
|
+
limit: 20,
|
|
45
|
+
channel_types: 'public_channel,private_channel',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
undefined,
|
|
49
|
+
{ timeout: 5000 },
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
const content = result.content
|
|
53
|
+
if (!Array.isArray(content)) return []
|
|
54
|
+
|
|
55
|
+
const rawText = content
|
|
56
|
+
.filter((c): c is { type: 'text'; text: string } => c.type === 'text')
|
|
57
|
+
.map(c => c.text)
|
|
58
|
+
.join('\n')
|
|
59
|
+
|
|
60
|
+
return parseChannels(unwrapResults(rawText))
|
|
61
|
+
} catch (error) {
|
|
62
|
+
logForDebugging(`Failed to fetch Slack channels: ${error}`)
|
|
63
|
+
return []
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The Slack MCP server wraps its markdown in a JSON envelope:
|
|
68
|
+
// {"results":"# Search Results...\nName: #chan\n..."}
|
|
69
|
+
const resultsEnvelopeSchema = lazySchema(() =>
|
|
70
|
+
z.object({ results: z.string() }),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
function unwrapResults(text: string): string {
|
|
74
|
+
const trimmed = text.trim()
|
|
75
|
+
if (!trimmed.startsWith('{')) return text
|
|
76
|
+
try {
|
|
77
|
+
const parsed = resultsEnvelopeSchema().safeParse(jsonParse(trimmed))
|
|
78
|
+
if (parsed.success) return parsed.data.results
|
|
79
|
+
} catch {
|
|
80
|
+
// jsonParse threw — fall through
|
|
81
|
+
}
|
|
82
|
+
return text
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Parse channel names from slack_search_channels text output.
|
|
86
|
+
// The Slack MCP server returns markdown with "Name: #channel-name" lines.
|
|
87
|
+
function parseChannels(text: string): string[] {
|
|
88
|
+
const channels: string[] = []
|
|
89
|
+
const seen = new Set<string>()
|
|
90
|
+
|
|
91
|
+
for (const line of text.split('\n')) {
|
|
92
|
+
const m = line.match(/^Name:\s*#?([a-z0-9][a-z0-9_-]{0,79})\s*$/)
|
|
93
|
+
if (m && !seen.has(m[1]!)) {
|
|
94
|
+
seen.add(m[1]!)
|
|
95
|
+
channels.push(m[1]!)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return channels
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function hasSlackMcpServer(clients: MCPServerConnection[]): boolean {
|
|
103
|
+
return findSlackClient(clients) !== undefined
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function getKnownChannelsVersion(): number {
|
|
107
|
+
return knownChannelsVersion
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function findSlackChannelPositions(
|
|
111
|
+
text: string,
|
|
112
|
+
): Array<{ start: number; end: number }> {
|
|
113
|
+
const positions: Array<{ start: number; end: number }> = []
|
|
114
|
+
const re = /(^|\s)#([a-z0-9][a-z0-9_-]{0,79})(?=\s|$)/g
|
|
115
|
+
let m: RegExpExecArray | null
|
|
116
|
+
while ((m = re.exec(text)) !== null) {
|
|
117
|
+
if (!knownChannels.has(m[2]!)) continue
|
|
118
|
+
const start = m.index + m[1]!.length
|
|
119
|
+
positions.push({ start, end: start + 1 + m[2]!.length })
|
|
120
|
+
}
|
|
121
|
+
return positions
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Slack's search tokenizes on hyphens and requires whole-word matches, so
|
|
125
|
+
// "claude-code-team-en" returns 0 results. Strip the trailing partial segment
|
|
126
|
+
// so the MCP query is "claude-code-team" (complete words only), then filter
|
|
127
|
+
// locally. This keeps the query maximally specific (avoiding the 20-result
|
|
128
|
+
// cap) while never sending a partial word that kills the search.
|
|
129
|
+
function mcpQueryFor(searchToken: string): string {
|
|
130
|
+
const lastSep = Math.max(
|
|
131
|
+
searchToken.lastIndexOf('-'),
|
|
132
|
+
searchToken.lastIndexOf('_'),
|
|
133
|
+
)
|
|
134
|
+
return lastSep > 0 ? searchToken.slice(0, lastSep) : searchToken
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Find a cached entry whose key is a prefix of mcpQuery and still has
|
|
138
|
+
// matches for searchToken. Lets typing "c"→"cl"→"cla" reuse the "c" cache
|
|
139
|
+
// instead of issuing a new MCP call per keystroke.
|
|
140
|
+
function findReusableCacheEntry(
|
|
141
|
+
mcpQuery: string,
|
|
142
|
+
searchToken: string,
|
|
143
|
+
): string[] | undefined {
|
|
144
|
+
let best: string[] | undefined
|
|
145
|
+
let bestLen = 0
|
|
146
|
+
for (const [key, channels] of cache) {
|
|
147
|
+
if (
|
|
148
|
+
mcpQuery.startsWith(key) &&
|
|
149
|
+
key.length > bestLen &&
|
|
150
|
+
channels.some(c => c.startsWith(searchToken))
|
|
151
|
+
) {
|
|
152
|
+
best = channels
|
|
153
|
+
bestLen = key.length
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return best
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export async function getSlackChannelSuggestions(
|
|
160
|
+
clients: MCPServerConnection[],
|
|
161
|
+
searchToken: string,
|
|
162
|
+
): Promise<SuggestionItem[]> {
|
|
163
|
+
if (!searchToken) return []
|
|
164
|
+
|
|
165
|
+
const mcpQuery = mcpQueryFor(searchToken)
|
|
166
|
+
const lower = searchToken.toLowerCase()
|
|
167
|
+
|
|
168
|
+
let channels = cache.get(mcpQuery) ?? findReusableCacheEntry(mcpQuery, lower)
|
|
169
|
+
if (!channels) {
|
|
170
|
+
if (inflightQuery === mcpQuery && inflightPromise) {
|
|
171
|
+
channels = await inflightPromise
|
|
172
|
+
} else {
|
|
173
|
+
inflightQuery = mcpQuery
|
|
174
|
+
inflightPromise = fetchChannels(clients, mcpQuery)
|
|
175
|
+
channels = await inflightPromise
|
|
176
|
+
cache.set(mcpQuery, channels)
|
|
177
|
+
const before = knownChannels.size
|
|
178
|
+
for (const c of channels) knownChannels.add(c)
|
|
179
|
+
if (knownChannels.size !== before) {
|
|
180
|
+
knownChannelsVersion++
|
|
181
|
+
knownChannelsChanged.emit()
|
|
182
|
+
}
|
|
183
|
+
if (cache.size > 50) {
|
|
184
|
+
cache.delete(cache.keys().next().value!)
|
|
185
|
+
}
|
|
186
|
+
if (inflightQuery === mcpQuery) {
|
|
187
|
+
inflightQuery = null
|
|
188
|
+
inflightPromise = null
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return channels
|
|
194
|
+
.filter(c => c.startsWith(lower))
|
|
195
|
+
.sort()
|
|
196
|
+
.slice(0, 10)
|
|
197
|
+
.map(c => ({
|
|
198
|
+
id: `slack-channel-${c}`,
|
|
199
|
+
displayText: `#${c}`,
|
|
200
|
+
}))
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function clearSlackChannelCache(): void {
|
|
204
|
+
cache.clear()
|
|
205
|
+
knownChannels.clear()
|
|
206
|
+
knownChannelsVersion = 0
|
|
207
|
+
inflightQuery = null
|
|
208
|
+
inflightPromise = null
|
|
209
|
+
}
|