@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,663 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Limits Service
|
|
3
|
+
*
|
|
4
|
+
* Fetches organization-level policy restrictions from the API and uses them
|
|
5
|
+
* to disable CLI features. Follows the same patterns as remote managed settings
|
|
6
|
+
* (fail open, ETag caching, background polling, retry logic).
|
|
7
|
+
*
|
|
8
|
+
* Eligibility:
|
|
9
|
+
* - Console users (API key): All eligible
|
|
10
|
+
* - OAuth users (Claude.ai): Only Team and Enterprise/C4E subscribers are eligible
|
|
11
|
+
* - API fails open (non-blocking) - if fetch fails, continues without restrictions
|
|
12
|
+
* - API returns empty restrictions for users without policy limits
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import axios from 'src/utils/axios.js'
|
|
16
|
+
import { createHash } from 'crypto'
|
|
17
|
+
import { readFileSync as fsReadFileSync } from 'fs'
|
|
18
|
+
import { unlink, writeFile } from 'fs/promises'
|
|
19
|
+
import { join } from 'path'
|
|
20
|
+
import {
|
|
21
|
+
CLAUDE_AI_INFERENCE_SCOPE,
|
|
22
|
+
getOauthConfig,
|
|
23
|
+
OAUTH_BETA_HEADER,
|
|
24
|
+
} from '../../constants/oauth.js'
|
|
25
|
+
import {
|
|
26
|
+
checkAndRefreshOAuthTokenIfNeeded,
|
|
27
|
+
getAnthropicApiKeyWithSource,
|
|
28
|
+
getClaudeAIOAuthTokens,
|
|
29
|
+
} from '../../utils/auth.js'
|
|
30
|
+
import { registerCleanup } from '../../utils/cleanupRegistry.js'
|
|
31
|
+
import { logForDebugging } from '../../utils/debug.js'
|
|
32
|
+
import { getClaudeConfigHomeDir } from '../../utils/envUtils.js'
|
|
33
|
+
import { classifyAxiosError } from '../../utils/errors.js'
|
|
34
|
+
import { safeParseJSON } from '../../utils/json.js'
|
|
35
|
+
import {
|
|
36
|
+
getAPIProvider,
|
|
37
|
+
isFirstPartyAnthropicBaseUrl,
|
|
38
|
+
} from '../../utils/model/providers.js'
|
|
39
|
+
import { isEssentialTrafficOnly } from '../../utils/privacyLevel.js'
|
|
40
|
+
import { sleep } from '../../utils/sleep.js'
|
|
41
|
+
import { jsonStringify } from '../../utils/slowOperations.js'
|
|
42
|
+
import { getClaudeCodeUserAgent } from '../../utils/userAgent.js'
|
|
43
|
+
import { getRetryDelay } from '../api/withRetry.js'
|
|
44
|
+
import {
|
|
45
|
+
type PolicyLimitsFetchResult,
|
|
46
|
+
type PolicyLimitsResponse,
|
|
47
|
+
PolicyLimitsResponseSchema,
|
|
48
|
+
} from './types.js'
|
|
49
|
+
|
|
50
|
+
function isNodeError(e: unknown): e is NodeJS.ErrnoException {
|
|
51
|
+
return e instanceof Error
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Constants
|
|
55
|
+
const CACHE_FILENAME = 'policy-limits.json'
|
|
56
|
+
const FETCH_TIMEOUT_MS = 10000 // 10 seconds
|
|
57
|
+
const DEFAULT_MAX_RETRIES = 5
|
|
58
|
+
const POLLING_INTERVAL_MS = 60 * 60 * 1000 // 1 hour
|
|
59
|
+
|
|
60
|
+
// Background polling state
|
|
61
|
+
let pollingIntervalId: ReturnType<typeof setInterval> | null = null
|
|
62
|
+
let cleanupRegistered = false
|
|
63
|
+
|
|
64
|
+
// Promise that resolves when initial policy limits loading completes
|
|
65
|
+
let loadingCompletePromise: Promise<void> | null = null
|
|
66
|
+
let loadingCompleteResolve: (() => void) | null = null
|
|
67
|
+
|
|
68
|
+
// Timeout for the loading promise to prevent deadlocks
|
|
69
|
+
const LOADING_PROMISE_TIMEOUT_MS = 30000 // 30 seconds
|
|
70
|
+
|
|
71
|
+
// Session-level cache for policy restrictions
|
|
72
|
+
let sessionCache: PolicyLimitsResponse['restrictions'] | null = null
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Test-only sync reset. clearPolicyLimitsCache() does file I/O and is too
|
|
76
|
+
* expensive for preload beforeEach; this only clears the module-level
|
|
77
|
+
* singleton so downstream tests in the same shard see a clean slate.
|
|
78
|
+
*/
|
|
79
|
+
export function _resetPolicyLimitsForTesting(): void {
|
|
80
|
+
stopBackgroundPolling()
|
|
81
|
+
sessionCache = null
|
|
82
|
+
loadingCompletePromise = null
|
|
83
|
+
loadingCompleteResolve = null
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Initialize the loading promise for policy limits
|
|
88
|
+
* This should be called early (e.g., in init.ts) to allow other systems
|
|
89
|
+
* to await policy limits loading even if loadPolicyLimits() hasn't been called yet.
|
|
90
|
+
*
|
|
91
|
+
* Only creates the promise if the user is eligible for policy limits.
|
|
92
|
+
* Includes a timeout to prevent deadlocks if loadPolicyLimits() is never called.
|
|
93
|
+
*/
|
|
94
|
+
export function initializePolicyLimitsLoadingPromise(): void {
|
|
95
|
+
if (loadingCompletePromise) {
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (isPolicyLimitsEligible()) {
|
|
100
|
+
loadingCompletePromise = new Promise(resolve => {
|
|
101
|
+
loadingCompleteResolve = resolve
|
|
102
|
+
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
if (loadingCompleteResolve) {
|
|
105
|
+
logForDebugging(
|
|
106
|
+
'Policy limits: Loading promise timed out, resolving anyway',
|
|
107
|
+
)
|
|
108
|
+
loadingCompleteResolve()
|
|
109
|
+
loadingCompleteResolve = null
|
|
110
|
+
}
|
|
111
|
+
}, LOADING_PROMISE_TIMEOUT_MS)
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Get the path to the policy limits cache file
|
|
118
|
+
*/
|
|
119
|
+
function getCachePath(): string {
|
|
120
|
+
return join(getClaudeConfigHomeDir(), CACHE_FILENAME)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Get the policy limits API endpoint
|
|
125
|
+
*/
|
|
126
|
+
function getPolicyLimitsEndpoint(): string {
|
|
127
|
+
return `${getOauthConfig().BASE_API_URL}/api/claude_code/policy_limits`
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Recursively sort all keys in an object for consistent hashing
|
|
132
|
+
*/
|
|
133
|
+
function sortKeysDeep(obj: unknown): unknown {
|
|
134
|
+
if (Array.isArray(obj)) {
|
|
135
|
+
return obj.map(sortKeysDeep)
|
|
136
|
+
}
|
|
137
|
+
if (obj !== null && typeof obj === 'object') {
|
|
138
|
+
const sorted: Record<string, unknown> = {}
|
|
139
|
+
for (const [key, value] of Object.entries(obj).sort(([a], [b]) =>
|
|
140
|
+
a.localeCompare(b),
|
|
141
|
+
)) {
|
|
142
|
+
sorted[key] = sortKeysDeep(value)
|
|
143
|
+
}
|
|
144
|
+
return sorted
|
|
145
|
+
}
|
|
146
|
+
return obj
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Compute a checksum from restrictions content for HTTP caching
|
|
151
|
+
*/
|
|
152
|
+
function computeChecksum(
|
|
153
|
+
restrictions: PolicyLimitsResponse['restrictions'],
|
|
154
|
+
): string {
|
|
155
|
+
const sorted = sortKeysDeep(restrictions)
|
|
156
|
+
const normalized = jsonStringify(sorted)
|
|
157
|
+
const hash = createHash('sha256').update(normalized).digest('hex')
|
|
158
|
+
return `sha256:${hash}`
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Check if the current user is eligible for policy limits.
|
|
163
|
+
*
|
|
164
|
+
* IMPORTANT: This function must NOT call getSettings() or any function that calls
|
|
165
|
+
* getSettings() to avoid circular dependencies during settings loading.
|
|
166
|
+
*/
|
|
167
|
+
export function isPolicyLimitsEligible(): boolean {
|
|
168
|
+
// 3p provider users should not hit the policy limits endpoint
|
|
169
|
+
if (getAPIProvider() !== 'firstParty') {
|
|
170
|
+
return false
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Custom base URL users should not hit the policy limits endpoint
|
|
174
|
+
if (!isFirstPartyAnthropicBaseUrl()) {
|
|
175
|
+
return false
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Console users (API key) are eligible if we can get the actual key
|
|
179
|
+
try {
|
|
180
|
+
const { key: apiKey } = getAnthropicApiKeyWithSource({
|
|
181
|
+
skipRetrievingKeyFromApiKeyHelper: true,
|
|
182
|
+
})
|
|
183
|
+
if (apiKey) {
|
|
184
|
+
return true
|
|
185
|
+
}
|
|
186
|
+
} catch {
|
|
187
|
+
// No API key available - continue to check OAuth
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// For OAuth users, check if they have Claude.ai tokens
|
|
191
|
+
const tokens = getClaudeAIOAuthTokens()
|
|
192
|
+
if (!tokens?.accessToken) {
|
|
193
|
+
return false
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Must have Claude.ai inference scope
|
|
197
|
+
if (!tokens.scopes?.includes(CLAUDE_AI_INFERENCE_SCOPE)) {
|
|
198
|
+
return false
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Only Team and Enterprise OAuth users are eligible — these orgs have
|
|
202
|
+
// admin-configurable policy restrictions (e.g. allow_remote_sessions)
|
|
203
|
+
if (
|
|
204
|
+
tokens.subscriptionType !== 'enterprise' &&
|
|
205
|
+
tokens.subscriptionType !== 'team'
|
|
206
|
+
) {
|
|
207
|
+
return false
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return true
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Wait for the initial policy limits loading to complete
|
|
215
|
+
* Returns immediately if user is not eligible or loading has already completed
|
|
216
|
+
*/
|
|
217
|
+
export async function waitForPolicyLimitsToLoad(): Promise<void> {
|
|
218
|
+
if (loadingCompletePromise) {
|
|
219
|
+
await loadingCompletePromise
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get auth headers for policy limits without calling getSettings()
|
|
225
|
+
* Supports both API key and OAuth authentication
|
|
226
|
+
*/
|
|
227
|
+
function getAuthHeaders(): {
|
|
228
|
+
headers: Record<string, string>
|
|
229
|
+
error?: string
|
|
230
|
+
} {
|
|
231
|
+
// Try API key first (for Console users)
|
|
232
|
+
try {
|
|
233
|
+
const { key: apiKey } = getAnthropicApiKeyWithSource({
|
|
234
|
+
skipRetrievingKeyFromApiKeyHelper: true,
|
|
235
|
+
})
|
|
236
|
+
if (apiKey) {
|
|
237
|
+
return {
|
|
238
|
+
headers: {
|
|
239
|
+
'x-api-key': apiKey,
|
|
240
|
+
},
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
} catch {
|
|
244
|
+
// No API key available - continue to check OAuth
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Fall back to OAuth tokens (for Claude.ai users)
|
|
248
|
+
const oauthTokens = getClaudeAIOAuthTokens()
|
|
249
|
+
if (oauthTokens?.accessToken) {
|
|
250
|
+
return {
|
|
251
|
+
headers: {
|
|
252
|
+
Authorization: `Bearer ${oauthTokens.accessToken}`,
|
|
253
|
+
'anthropic-beta': OAUTH_BETA_HEADER,
|
|
254
|
+
},
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
headers: {},
|
|
260
|
+
error: 'No authentication available',
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Fetch policy limits with retry logic and exponential backoff
|
|
266
|
+
*/
|
|
267
|
+
async function fetchWithRetry(
|
|
268
|
+
cachedChecksum?: string,
|
|
269
|
+
): Promise<PolicyLimitsFetchResult> {
|
|
270
|
+
let lastResult: PolicyLimitsFetchResult | null = null
|
|
271
|
+
|
|
272
|
+
for (let attempt = 1; attempt <= DEFAULT_MAX_RETRIES + 1; attempt++) {
|
|
273
|
+
lastResult = await fetchPolicyLimits(cachedChecksum)
|
|
274
|
+
|
|
275
|
+
if (lastResult.success) {
|
|
276
|
+
return lastResult
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (lastResult.skipRetry) {
|
|
280
|
+
return lastResult
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (attempt > DEFAULT_MAX_RETRIES) {
|
|
284
|
+
return lastResult
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const delayMs = getRetryDelay(attempt)
|
|
288
|
+
logForDebugging(
|
|
289
|
+
`Policy limits: Retry ${attempt}/${DEFAULT_MAX_RETRIES} after ${delayMs}ms`,
|
|
290
|
+
)
|
|
291
|
+
await sleep(delayMs)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return lastResult!
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Fetch policy limits (single attempt, no retries)
|
|
299
|
+
*/
|
|
300
|
+
async function fetchPolicyLimits(
|
|
301
|
+
cachedChecksum?: string,
|
|
302
|
+
): Promise<PolicyLimitsFetchResult> {
|
|
303
|
+
try {
|
|
304
|
+
await checkAndRefreshOAuthTokenIfNeeded()
|
|
305
|
+
|
|
306
|
+
const authHeaders = getAuthHeaders()
|
|
307
|
+
if (authHeaders.error) {
|
|
308
|
+
return {
|
|
309
|
+
success: false,
|
|
310
|
+
error: 'Authentication required for policy limits',
|
|
311
|
+
skipRetry: true,
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const endpoint = getPolicyLimitsEndpoint()
|
|
316
|
+
const headers: Record<string, string> = {
|
|
317
|
+
...authHeaders.headers,
|
|
318
|
+
'User-Agent': getClaudeCodeUserAgent(),
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (cachedChecksum) {
|
|
322
|
+
headers['If-None-Match'] = `"${cachedChecksum}"`
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const response = await axios.get(endpoint, {
|
|
326
|
+
headers,
|
|
327
|
+
timeout: FETCH_TIMEOUT_MS,
|
|
328
|
+
validateStatus: status =>
|
|
329
|
+
status === 200 || status === 304 || status === 404,
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
// Handle 304 Not Modified - cached version is still valid
|
|
333
|
+
if (response.status === 304) {
|
|
334
|
+
logForDebugging('Policy limits: Using cached restrictions (304)')
|
|
335
|
+
return {
|
|
336
|
+
success: true,
|
|
337
|
+
restrictions: null, // Signal that cache is valid
|
|
338
|
+
etag: cachedChecksum,
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Handle 404 Not Found - no policy limits exist or feature not enabled
|
|
343
|
+
if (response.status === 404) {
|
|
344
|
+
logForDebugging('Policy limits: No restrictions found (404)')
|
|
345
|
+
return {
|
|
346
|
+
success: true,
|
|
347
|
+
restrictions: {},
|
|
348
|
+
etag: undefined,
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const parsed = PolicyLimitsResponseSchema().safeParse(response.data)
|
|
353
|
+
if (!parsed.success) {
|
|
354
|
+
logForDebugging(
|
|
355
|
+
`Policy limits: Invalid response format - ${parsed.error.message}`,
|
|
356
|
+
)
|
|
357
|
+
return {
|
|
358
|
+
success: false,
|
|
359
|
+
error: 'Invalid policy limits format',
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
logForDebugging('Policy limits: Fetched successfully')
|
|
364
|
+
return {
|
|
365
|
+
success: true,
|
|
366
|
+
restrictions: parsed.data.restrictions,
|
|
367
|
+
}
|
|
368
|
+
} catch (error) {
|
|
369
|
+
// 404 is handled above via validateStatus, so it won't reach here
|
|
370
|
+
const { kind, message } = classifyAxiosError(error)
|
|
371
|
+
switch (kind) {
|
|
372
|
+
case 'auth':
|
|
373
|
+
return {
|
|
374
|
+
success: false,
|
|
375
|
+
error: 'Not authorized for policy limits',
|
|
376
|
+
skipRetry: true,
|
|
377
|
+
}
|
|
378
|
+
case 'timeout':
|
|
379
|
+
return { success: false, error: 'Policy limits request timeout' }
|
|
380
|
+
case 'network':
|
|
381
|
+
return { success: false, error: 'Cannot connect to server' }
|
|
382
|
+
default:
|
|
383
|
+
return { success: false, error: message }
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Load restrictions from cache file
|
|
390
|
+
*/
|
|
391
|
+
// sync IO: called from sync context (getRestrictionsFromCache -> isPolicyAllowed)
|
|
392
|
+
function loadCachedRestrictions(): PolicyLimitsResponse['restrictions'] | null {
|
|
393
|
+
try {
|
|
394
|
+
const content = fsReadFileSync(getCachePath(), 'utf-8')
|
|
395
|
+
const data = safeParseJSON(content, false)
|
|
396
|
+
const parsed = PolicyLimitsResponseSchema().safeParse(data)
|
|
397
|
+
if (!parsed.success) {
|
|
398
|
+
return null
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return parsed.data.restrictions
|
|
402
|
+
} catch {
|
|
403
|
+
return null
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Save restrictions to cache file
|
|
409
|
+
*/
|
|
410
|
+
async function saveCachedRestrictions(
|
|
411
|
+
restrictions: PolicyLimitsResponse['restrictions'],
|
|
412
|
+
): Promise<void> {
|
|
413
|
+
try {
|
|
414
|
+
const path = getCachePath()
|
|
415
|
+
const data: PolicyLimitsResponse = { restrictions }
|
|
416
|
+
await writeFile(path, jsonStringify(data, null, 2), {
|
|
417
|
+
encoding: 'utf-8',
|
|
418
|
+
mode: 0o600,
|
|
419
|
+
})
|
|
420
|
+
logForDebugging(`Policy limits: Saved to ${path}`)
|
|
421
|
+
} catch (error) {
|
|
422
|
+
logForDebugging(
|
|
423
|
+
`Policy limits: Failed to save - ${error instanceof Error ? error.message : 'unknown error'}`,
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Fetch and load policy limits with file caching
|
|
430
|
+
* Fails open - returns null if fetch fails and no cache exists
|
|
431
|
+
*/
|
|
432
|
+
async function fetchAndLoadPolicyLimits(): Promise<
|
|
433
|
+
PolicyLimitsResponse['restrictions'] | null
|
|
434
|
+
> {
|
|
435
|
+
if (!isPolicyLimitsEligible()) {
|
|
436
|
+
return null
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const cachedRestrictions = loadCachedRestrictions()
|
|
440
|
+
|
|
441
|
+
const cachedChecksum = cachedRestrictions
|
|
442
|
+
? computeChecksum(cachedRestrictions)
|
|
443
|
+
: undefined
|
|
444
|
+
|
|
445
|
+
try {
|
|
446
|
+
const result = await fetchWithRetry(cachedChecksum)
|
|
447
|
+
|
|
448
|
+
if (!result.success) {
|
|
449
|
+
if (cachedRestrictions) {
|
|
450
|
+
logForDebugging('Policy limits: Using stale cache after fetch failure')
|
|
451
|
+
sessionCache = cachedRestrictions
|
|
452
|
+
return cachedRestrictions
|
|
453
|
+
}
|
|
454
|
+
return null
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Handle 304 Not Modified
|
|
458
|
+
if (result.restrictions === null && cachedRestrictions) {
|
|
459
|
+
logForDebugging('Policy limits: Cache still valid (304 Not Modified)')
|
|
460
|
+
sessionCache = cachedRestrictions
|
|
461
|
+
return cachedRestrictions
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const newRestrictions = result.restrictions || {}
|
|
465
|
+
const hasContent = Object.keys(newRestrictions).length > 0
|
|
466
|
+
|
|
467
|
+
if (hasContent) {
|
|
468
|
+
sessionCache = newRestrictions
|
|
469
|
+
await saveCachedRestrictions(newRestrictions)
|
|
470
|
+
logForDebugging('Policy limits: Applied new restrictions successfully')
|
|
471
|
+
return newRestrictions
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Empty restrictions (404 response) - delete cached file if it exists
|
|
475
|
+
sessionCache = newRestrictions
|
|
476
|
+
try {
|
|
477
|
+
await unlink(getCachePath())
|
|
478
|
+
logForDebugging('Policy limits: Deleted cached file (404 response)')
|
|
479
|
+
} catch (e) {
|
|
480
|
+
if (isNodeError(e) && e.code !== 'ENOENT') {
|
|
481
|
+
logForDebugging(
|
|
482
|
+
`Policy limits: Failed to delete cached file - ${e.message}`,
|
|
483
|
+
)
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return newRestrictions
|
|
487
|
+
} catch {
|
|
488
|
+
if (cachedRestrictions) {
|
|
489
|
+
logForDebugging('Policy limits: Using stale cache after error')
|
|
490
|
+
sessionCache = cachedRestrictions
|
|
491
|
+
return cachedRestrictions
|
|
492
|
+
}
|
|
493
|
+
return null
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Policies that default to denied when essential-traffic-only mode is active
|
|
499
|
+
* and the policy cache is unavailable. Without this, a cache miss or network
|
|
500
|
+
* timeout would silently re-enable these features for HIPAA orgs.
|
|
501
|
+
*/
|
|
502
|
+
const ESSENTIAL_TRAFFIC_DENY_ON_MISS = new Set(['allow_product_feedback'])
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Check if a specific policy is allowed
|
|
506
|
+
* Returns true if the policy is unknown, unavailable, or explicitly allowed (fail open).
|
|
507
|
+
* Exception: policies in ESSENTIAL_TRAFFIC_DENY_ON_MISS fail closed when
|
|
508
|
+
* essential-traffic-only mode is active and the cache is unavailable.
|
|
509
|
+
*/
|
|
510
|
+
export function isPolicyAllowed(policy: string): boolean {
|
|
511
|
+
const restrictions = getRestrictionsFromCache()
|
|
512
|
+
if (!restrictions) {
|
|
513
|
+
if (
|
|
514
|
+
isEssentialTrafficOnly() &&
|
|
515
|
+
ESSENTIAL_TRAFFIC_DENY_ON_MISS.has(policy)
|
|
516
|
+
) {
|
|
517
|
+
return false
|
|
518
|
+
}
|
|
519
|
+
return true // fail open
|
|
520
|
+
}
|
|
521
|
+
const restriction = restrictions[policy]
|
|
522
|
+
if (!restriction) {
|
|
523
|
+
return true // unknown policy = allowed
|
|
524
|
+
}
|
|
525
|
+
return restriction.allowed
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Get restrictions synchronously from session cache or file
|
|
530
|
+
*/
|
|
531
|
+
function getRestrictionsFromCache():
|
|
532
|
+
| PolicyLimitsResponse['restrictions']
|
|
533
|
+
| null {
|
|
534
|
+
if (!isPolicyLimitsEligible()) {
|
|
535
|
+
return null
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
if (sessionCache) {
|
|
539
|
+
return sessionCache
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const cachedRestrictions = loadCachedRestrictions()
|
|
543
|
+
if (cachedRestrictions) {
|
|
544
|
+
sessionCache = cachedRestrictions
|
|
545
|
+
return cachedRestrictions
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return null
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Load policy limits during CLI initialization
|
|
553
|
+
* Fails open - if fetch fails, continues without restrictions
|
|
554
|
+
* Also starts background polling to pick up changes mid-session
|
|
555
|
+
*/
|
|
556
|
+
export async function loadPolicyLimits(): Promise<void> {
|
|
557
|
+
if (isPolicyLimitsEligible() && !loadingCompletePromise) {
|
|
558
|
+
loadingCompletePromise = new Promise(resolve => {
|
|
559
|
+
loadingCompleteResolve = resolve
|
|
560
|
+
})
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
try {
|
|
564
|
+
await fetchAndLoadPolicyLimits()
|
|
565
|
+
|
|
566
|
+
if (isPolicyLimitsEligible()) {
|
|
567
|
+
startBackgroundPolling()
|
|
568
|
+
}
|
|
569
|
+
} finally {
|
|
570
|
+
if (loadingCompleteResolve) {
|
|
571
|
+
loadingCompleteResolve()
|
|
572
|
+
loadingCompleteResolve = null
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Refresh policy limits asynchronously (for auth state changes)
|
|
579
|
+
* Used when login occurs
|
|
580
|
+
*/
|
|
581
|
+
export async function refreshPolicyLimits(): Promise<void> {
|
|
582
|
+
await clearPolicyLimitsCache()
|
|
583
|
+
|
|
584
|
+
if (!isPolicyLimitsEligible()) {
|
|
585
|
+
return
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
await fetchAndLoadPolicyLimits()
|
|
589
|
+
logForDebugging('Policy limits: Refreshed after auth change')
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Clear all policy limits (session, persistent, and stop polling)
|
|
594
|
+
*/
|
|
595
|
+
export async function clearPolicyLimitsCache(): Promise<void> {
|
|
596
|
+
stopBackgroundPolling()
|
|
597
|
+
|
|
598
|
+
sessionCache = null
|
|
599
|
+
|
|
600
|
+
loadingCompletePromise = null
|
|
601
|
+
loadingCompleteResolve = null
|
|
602
|
+
|
|
603
|
+
try {
|
|
604
|
+
await unlink(getCachePath())
|
|
605
|
+
} catch {
|
|
606
|
+
// Ignore errors (including ENOENT when file doesn't exist)
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Background polling callback
|
|
612
|
+
*/
|
|
613
|
+
async function pollPolicyLimits(): Promise<void> {
|
|
614
|
+
if (!isPolicyLimitsEligible()) {
|
|
615
|
+
return
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const previousCache = sessionCache ? jsonStringify(sessionCache) : null
|
|
619
|
+
|
|
620
|
+
try {
|
|
621
|
+
await fetchAndLoadPolicyLimits()
|
|
622
|
+
|
|
623
|
+
const newCache = sessionCache ? jsonStringify(sessionCache) : null
|
|
624
|
+
if (newCache !== previousCache) {
|
|
625
|
+
logForDebugging('Policy limits: Changed during background poll')
|
|
626
|
+
}
|
|
627
|
+
} catch {
|
|
628
|
+
// Don't fail closed for background polling
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Start background polling for policy limits
|
|
634
|
+
*/
|
|
635
|
+
export function startBackgroundPolling(): void {
|
|
636
|
+
if (pollingIntervalId !== null) {
|
|
637
|
+
return
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
if (!isPolicyLimitsEligible()) {
|
|
641
|
+
return
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
pollingIntervalId = setInterval(() => {
|
|
645
|
+
void pollPolicyLimits()
|
|
646
|
+
}, POLLING_INTERVAL_MS)
|
|
647
|
+
pollingIntervalId.unref()
|
|
648
|
+
|
|
649
|
+
if (!cleanupRegistered) {
|
|
650
|
+
cleanupRegistered = true
|
|
651
|
+
registerCleanup(async () => stopBackgroundPolling())
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* Stop background polling for policy limits
|
|
657
|
+
*/
|
|
658
|
+
export function stopBackgroundPolling(): void {
|
|
659
|
+
if (pollingIntervalId !== null) {
|
|
660
|
+
clearInterval(pollingIntervalId)
|
|
661
|
+
pollingIntervalId = null
|
|
662
|
+
}
|
|
663
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod/v4'
|
|
2
|
+
import { lazySchema } from '../../utils/lazySchema.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Schema for the policy limits API response
|
|
6
|
+
* Only blocked policies are included. If a policy key is absent, it's allowed.
|
|
7
|
+
*/
|
|
8
|
+
export const PolicyLimitsResponseSchema = lazySchema(() =>
|
|
9
|
+
z.object({
|
|
10
|
+
restrictions: z.record(z.string(), z.object({ allowed: z.boolean() })),
|
|
11
|
+
}),
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
export type PolicyLimitsResponse = z.infer<
|
|
15
|
+
ReturnType<typeof PolicyLimitsResponseSchema>
|
|
16
|
+
>
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Result of fetching policy limits
|
|
20
|
+
*/
|
|
21
|
+
export type PolicyLimitsFetchResult = {
|
|
22
|
+
success: boolean
|
|
23
|
+
restrictions?: PolicyLimitsResponse['restrictions'] | null // null means 304 Not Modified (cache is valid)
|
|
24
|
+
etag?: string
|
|
25
|
+
error?: string
|
|
26
|
+
skipRetry?: boolean // If true, don't retry on failure (e.g., auth errors)
|
|
27
|
+
}
|