@xelauvas/xela-cli 0.1.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/README.md +200 -0
- package/bin/xela +100 -0
- package/package.json +88 -0
- package/src/QueryEngine.ts +1295 -0
- package/src/Task.ts +125 -0
- package/src/Tool.ts +792 -0
- package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
- package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
- package/src/_shims/bun_bundle.js +9 -0
- package/src/_shims/cjs_stub.cjs +23 -0
- package/src/_shims/empty_stub.js +33 -0
- package/src/_shims/loader.js +352 -0
- package/src/_shims/openai_adapter.ts +486 -0
- package/src/_shims/react_compiler_runtime.js +17 -0
- package/src/_shims/register.js +148 -0
- package/src/assistant/sessionHistory.ts +87 -0
- package/src/bootstrap/state.ts +1759 -0
- package/src/bridge/bridgeApi.ts +539 -0
- package/src/bridge/bridgeConfig.ts +48 -0
- package/src/bridge/bridgeDebug.ts +135 -0
- package/src/bridge/bridgeEnabled.ts +202 -0
- package/src/bridge/bridgeMain.ts +2999 -0
- package/src/bridge/bridgeMessaging.ts +461 -0
- package/src/bridge/bridgePermissionCallbacks.ts +43 -0
- package/src/bridge/bridgePointer.ts +210 -0
- package/src/bridge/bridgeStatusUtil.ts +163 -0
- package/src/bridge/bridgeUI.ts +530 -0
- package/src/bridge/capacityWake.ts +56 -0
- package/src/bridge/codeSessionApi.ts +168 -0
- package/src/bridge/createSession.ts +384 -0
- package/src/bridge/debugUtils.ts +141 -0
- package/src/bridge/envLessBridgeConfig.ts +165 -0
- package/src/bridge/flushGate.ts +71 -0
- package/src/bridge/inboundAttachments.ts +175 -0
- package/src/bridge/inboundMessages.ts +80 -0
- package/src/bridge/initReplBridge.ts +569 -0
- package/src/bridge/jwtUtils.ts +256 -0
- package/src/bridge/pollConfig.ts +110 -0
- package/src/bridge/pollConfigDefaults.ts +82 -0
- package/src/bridge/remoteBridgeCore.ts +1008 -0
- package/src/bridge/replBridge.ts +2406 -0
- package/src/bridge/replBridgeHandle.ts +36 -0
- package/src/bridge/replBridgeTransport.ts +370 -0
- package/src/bridge/sessionIdCompat.ts +57 -0
- package/src/bridge/sessionRunner.ts +550 -0
- package/src/bridge/trustedDevice.ts +210 -0
- package/src/bridge/types.ts +262 -0
- package/src/bridge/workSecret.ts +127 -0
- package/src/buddy/CompanionSprite.tsx +371 -0
- package/src/buddy/companion.ts +133 -0
- package/src/buddy/prompt.ts +36 -0
- package/src/buddy/sprites.ts +514 -0
- package/src/buddy/types.ts +148 -0
- package/src/buddy/useBuddyNotification.tsx +98 -0
- package/src/cli/exit.ts +31 -0
- package/src/cli/handlers/agents.ts +70 -0
- package/src/cli/handlers/auth.ts +330 -0
- package/src/cli/handlers/autoMode.ts +170 -0
- package/src/cli/handlers/mcp.tsx +362 -0
- package/src/cli/handlers/plugins.ts +878 -0
- package/src/cli/handlers/util.tsx +110 -0
- package/src/cli/ndjsonSafeStringify.ts +32 -0
- package/src/cli/print.ts +5594 -0
- package/src/cli/remoteIO.ts +255 -0
- package/src/cli/structuredIO.ts +859 -0
- package/src/cli/transports/HybridTransport.ts +282 -0
- package/src/cli/transports/SSETransport.ts +711 -0
- package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/src/cli/transports/WebSocketTransport.ts +800 -0
- package/src/cli/transports/WorkerStateUploader.ts +131 -0
- package/src/cli/transports/ccrClient.ts +998 -0
- package/src/cli/transports/transportUtils.ts +45 -0
- package/src/cli/update.ts +422 -0
- package/src/commands/add-dir/add-dir.tsx +126 -0
- package/src/commands/add-dir/index.ts +11 -0
- package/src/commands/add-dir/validation.ts +110 -0
- package/src/commands/advisor.ts +109 -0
- package/src/commands/agents/agents.tsx +12 -0
- package/src/commands/agents/index.ts +10 -0
- package/src/commands/ant-trace/index.js +1 -0
- package/src/commands/autofix-pr/index.js +1 -0
- package/src/commands/backfill-sessions/index.js +1 -0
- package/src/commands/branch/branch.ts +296 -0
- package/src/commands/branch/index.ts +14 -0
- package/src/commands/break-cache/index.js +1 -0
- package/src/commands/bridge/bridge.tsx +509 -0
- package/src/commands/bridge/index.ts +26 -0
- package/src/commands/bridge-kick.ts +200 -0
- package/src/commands/brief.ts +130 -0
- package/src/commands/btw/btw.tsx +243 -0
- package/src/commands/btw/index.ts +13 -0
- package/src/commands/bughunter/index.js +1 -0
- package/src/commands/chrome/chrome.tsx +285 -0
- package/src/commands/chrome/index.ts +13 -0
- package/src/commands/clear/caches.ts +144 -0
- package/src/commands/clear/clear.ts +7 -0
- package/src/commands/clear/conversation.ts +251 -0
- package/src/commands/clear/index.ts +19 -0
- package/src/commands/color/color.ts +93 -0
- package/src/commands/color/index.ts +16 -0
- package/src/commands/commit-push-pr.ts +158 -0
- package/src/commands/commit.ts +92 -0
- package/src/commands/compact/compact.ts +287 -0
- package/src/commands/compact/index.ts +15 -0
- package/src/commands/config/config.tsx +7 -0
- package/src/commands/config/index.ts +11 -0
- package/src/commands/context/context-noninteractive.ts +325 -0
- package/src/commands/context/context.tsx +64 -0
- package/src/commands/context/index.ts +24 -0
- package/src/commands/copy/copy.tsx +371 -0
- package/src/commands/copy/index.ts +15 -0
- package/src/commands/cost/cost.ts +24 -0
- package/src/commands/cost/index.ts +23 -0
- package/src/commands/createMovedToPluginCommand.ts +65 -0
- package/src/commands/ctx_viz/index.js +1 -0
- package/src/commands/debug-tool-call/index.js +1 -0
- package/src/commands/desktop/desktop.tsx +9 -0
- package/src/commands/desktop/index.ts +26 -0
- package/src/commands/diff/diff.tsx +9 -0
- package/src/commands/diff/index.ts +8 -0
- package/src/commands/doctor/doctor.tsx +7 -0
- package/src/commands/doctor/index.ts +12 -0
- package/src/commands/effort/effort.tsx +183 -0
- package/src/commands/effort/index.ts +13 -0
- package/src/commands/env/index.js +1 -0
- package/src/commands/exit/exit.tsx +33 -0
- package/src/commands/exit/index.ts +12 -0
- package/src/commands/export/export.tsx +91 -0
- package/src/commands/export/index.ts +11 -0
- package/src/commands/extra-usage/extra-usage-core.ts +118 -0
- package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/src/commands/extra-usage/extra-usage.tsx +17 -0
- package/src/commands/extra-usage/index.ts +31 -0
- package/src/commands/fast/fast.tsx +269 -0
- package/src/commands/fast/index.ts +26 -0
- package/src/commands/feedback/feedback.tsx +25 -0
- package/src/commands/feedback/index.ts +26 -0
- package/src/commands/files/files.ts +19 -0
- package/src/commands/files/index.ts +12 -0
- package/src/commands/good-claude/index.js +1 -0
- package/src/commands/heapdump/heapdump.ts +17 -0
- package/src/commands/heapdump/index.ts +12 -0
- package/src/commands/help/help.tsx +11 -0
- package/src/commands/help/index.ts +10 -0
- package/src/commands/hooks/hooks.tsx +13 -0
- package/src/commands/hooks/index.ts +11 -0
- package/src/commands/ide/ide.tsx +646 -0
- package/src/commands/ide/index.ts +11 -0
- package/src/commands/init-verifiers.ts +262 -0
- package/src/commands/init.ts +256 -0
- package/src/commands/insights.ts +3200 -0
- package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/src/commands/install-github-app/CreatingStep.tsx +65 -0
- package/src/commands/install-github-app/ErrorStep.tsx +85 -0
- package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/src/commands/install-github-app/SuccessStep.tsx +96 -0
- package/src/commands/install-github-app/WarningsStep.tsx +73 -0
- package/src/commands/install-github-app/index.ts +13 -0
- package/src/commands/install-github-app/install-github-app.tsx +587 -0
- package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/src/commands/install-slack-app/index.ts +12 -0
- package/src/commands/install-slack-app/install-slack-app.ts +30 -0
- package/src/commands/install.tsx +300 -0
- package/src/commands/issue/index.js +1 -0
- package/src/commands/keybindings/index.ts +13 -0
- package/src/commands/keybindings/keybindings.ts +53 -0
- package/src/commands/login/index.ts +14 -0
- package/src/commands/login/login.tsx +104 -0
- package/src/commands/logout/index.ts +10 -0
- package/src/commands/logout/logout.tsx +82 -0
- package/src/commands/mcp/addCommand.ts +280 -0
- package/src/commands/mcp/index.ts +12 -0
- package/src/commands/mcp/mcp.tsx +85 -0
- package/src/commands/mcp/xaaIdpCommand.ts +266 -0
- package/src/commands/memory/index.ts +10 -0
- package/src/commands/memory/memory.tsx +90 -0
- package/src/commands/mobile/index.ts +11 -0
- package/src/commands/mobile/mobile.tsx +274 -0
- package/src/commands/mock-limits/index.js +1 -0
- package/src/commands/model/index.ts +16 -0
- package/src/commands/model/model.tsx +297 -0
- package/src/commands/oauth-refresh/index.js +1 -0
- package/src/commands/onboarding/index.js +1 -0
- package/src/commands/output-style/index.ts +11 -0
- package/src/commands/output-style/output-style.tsx +7 -0
- package/src/commands/passes/index.ts +22 -0
- package/src/commands/passes/passes.tsx +24 -0
- package/src/commands/perf-issue/index.js +1 -0
- package/src/commands/permissions/index.ts +11 -0
- package/src/commands/permissions/permissions.tsx +10 -0
- package/src/commands/plan/index.ts +11 -0
- package/src/commands/plan/plan.tsx +122 -0
- package/src/commands/plugin/AddMarketplace.tsx +162 -0
- package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/src/commands/plugin/ManagePlugins.tsx +2215 -0
- package/src/commands/plugin/PluginErrors.tsx +124 -0
- package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/src/commands/plugin/PluginSettings.tsx +1072 -0
- package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/src/commands/plugin/ValidatePlugin.tsx +98 -0
- package/src/commands/plugin/index.tsx +11 -0
- package/src/commands/plugin/parseArgs.ts +103 -0
- package/src/commands/plugin/plugin.tsx +7 -0
- package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/src/commands/plugin/usePagination.ts +171 -0
- package/src/commands/pr_comments/index.ts +50 -0
- package/src/commands/privacy-settings/index.ts +14 -0
- package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/src/commands/rate-limit-options/index.ts +19 -0
- package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/src/commands/release-notes/index.ts +11 -0
- package/src/commands/release-notes/release-notes.ts +50 -0
- package/src/commands/reload-plugins/index.ts +18 -0
- package/src/commands/reload-plugins/reload-plugins.ts +61 -0
- package/src/commands/remote-env/index.ts +15 -0
- package/src/commands/remote-env/remote-env.tsx +7 -0
- package/src/commands/remote-setup/api.ts +182 -0
- package/src/commands/remote-setup/index.ts +20 -0
- package/src/commands/remote-setup/remote-setup.tsx +187 -0
- package/src/commands/rename/generateSessionName.ts +67 -0
- package/src/commands/rename/index.ts +12 -0
- package/src/commands/rename/rename.ts +87 -0
- package/src/commands/reset-limits/index.js +4 -0
- package/src/commands/resume/index.ts +12 -0
- package/src/commands/resume/resume.tsx +275 -0
- package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/src/commands/review/reviewRemote.ts +316 -0
- package/src/commands/review/ultrareviewCommand.tsx +58 -0
- package/src/commands/review/ultrareviewEnabled.ts +14 -0
- package/src/commands/review.ts +57 -0
- package/src/commands/rewind/index.ts +13 -0
- package/src/commands/rewind/rewind.ts +13 -0
- package/src/commands/sandbox-toggle/index.ts +50 -0
- package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/src/commands/security-review.ts +243 -0
- package/src/commands/session/index.ts +16 -0
- package/src/commands/session/session.tsx +140 -0
- package/src/commands/share/index.js +1 -0
- package/src/commands/skills/index.ts +10 -0
- package/src/commands/skills/skills.tsx +8 -0
- package/src/commands/stats/index.ts +10 -0
- package/src/commands/stats/stats.tsx +7 -0
- package/src/commands/status/index.ts +12 -0
- package/src/commands/status/status.tsx +8 -0
- package/src/commands/statusline.tsx +24 -0
- package/src/commands/stickers/index.ts +11 -0
- package/src/commands/stickers/stickers.ts +16 -0
- package/src/commands/summary/index.js +1 -0
- package/src/commands/tag/index.ts +12 -0
- package/src/commands/tag/tag.tsx +215 -0
- package/src/commands/tasks/index.ts +11 -0
- package/src/commands/tasks/tasks.tsx +8 -0
- package/src/commands/teleport/index.js +1 -0
- package/src/commands/terminalSetup/index.ts +23 -0
- package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/src/commands/theme/index.ts +10 -0
- package/src/commands/theme/theme.tsx +57 -0
- package/src/commands/thinkback/index.ts +13 -0
- package/src/commands/thinkback/thinkback.tsx +554 -0
- package/src/commands/thinkback-play/index.ts +17 -0
- package/src/commands/thinkback-play/thinkback-play.ts +43 -0
- package/src/commands/ultraplan.tsx +471 -0
- package/src/commands/upgrade/index.ts +16 -0
- package/src/commands/upgrade/upgrade.tsx +38 -0
- package/src/commands/usage/index.ts +9 -0
- package/src/commands/usage/usage.tsx +7 -0
- package/src/commands/version.ts +22 -0
- package/src/commands/vim/index.ts +11 -0
- package/src/commands/vim/vim.ts +38 -0
- package/src/commands/voice/index.ts +20 -0
- package/src/commands/voice/voice.ts +150 -0
- package/src/commands.ts +754 -0
- package/src/components/AgentProgressLine.tsx +136 -0
- package/src/components/App.tsx +56 -0
- package/src/components/ApproveApiKey.tsx +123 -0
- package/src/components/AutoModeOptInDialog.tsx +142 -0
- package/src/components/AutoUpdater.tsx +198 -0
- package/src/components/AutoUpdaterWrapper.tsx +91 -0
- package/src/components/AwsAuthStatusBox.tsx +82 -0
- package/src/components/BaseTextInput.tsx +136 -0
- package/src/components/BashModeProgress.tsx +56 -0
- package/src/components/BridgeDialog.tsx +401 -0
- package/src/components/BypassPermissionsModeDialog.tsx +87 -0
- package/src/components/ChannelDowngradeDialog.tsx +102 -0
- package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/src/components/ClickableImageRef.tsx +73 -0
- package/src/components/CompactSummary.tsx +118 -0
- package/src/components/ConfigurableShortcutHint.tsx +57 -0
- package/src/components/ConsoleOAuthFlow.tsx +631 -0
- package/src/components/ContextSuggestions.tsx +47 -0
- package/src/components/ContextVisualization.tsx +489 -0
- package/src/components/CoordinatorAgentStatus.tsx +273 -0
- package/src/components/CostThresholdDialog.tsx +50 -0
- package/src/components/CtrlOToExpand.tsx +51 -0
- package/src/components/CustomSelect/SelectMulti.tsx +213 -0
- package/src/components/CustomSelect/index.ts +3 -0
- package/src/components/CustomSelect/option-map.ts +50 -0
- package/src/components/CustomSelect/select-input-option.tsx +488 -0
- package/src/components/CustomSelect/select-option.tsx +68 -0
- package/src/components/CustomSelect/select.tsx +690 -0
- package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/src/components/CustomSelect/use-select-input.ts +287 -0
- package/src/components/CustomSelect/use-select-navigation.ts +653 -0
- package/src/components/CustomSelect/use-select-state.ts +157 -0
- package/src/components/DesktopHandoff.tsx +193 -0
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/src/components/DevBar.tsx +49 -0
- package/src/components/DevChannelsDialog.tsx +105 -0
- package/src/components/DiagnosticsDisplay.tsx +95 -0
- package/src/components/EffortCallout.tsx +265 -0
- package/src/components/EffortIndicator.ts +42 -0
- package/src/components/ExitFlow.tsx +48 -0
- package/src/components/ExportDialog.tsx +128 -0
- package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/src/components/FastIcon.tsx +46 -0
- package/src/components/Feedback.tsx +592 -0
- package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/src/components/FileEditToolDiff.tsx +181 -0
- package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/src/components/FilePathLink.tsx +43 -0
- package/src/components/FullscreenLayout.tsx +637 -0
- package/src/components/GlobalSearchDialog.tsx +343 -0
- package/src/components/HelpV2/Commands.tsx +82 -0
- package/src/components/HelpV2/General.tsx +23 -0
- package/src/components/HelpV2/HelpV2.tsx +184 -0
- package/src/components/HighlightedCode/Fallback.tsx +193 -0
- package/src/components/HighlightedCode.tsx +190 -0
- package/src/components/HistorySearchDialog.tsx +118 -0
- package/src/components/IdeAutoConnectDialog.tsx +154 -0
- package/src/components/IdeOnboardingDialog.tsx +167 -0
- package/src/components/IdeStatusIndicator.tsx +58 -0
- package/src/components/IdleReturnDialog.tsx +118 -0
- package/src/components/InterruptedByUser.tsx +15 -0
- package/src/components/InvalidConfigDialog.tsx +156 -0
- package/src/components/InvalidSettingsDialog.tsx +89 -0
- package/src/components/KeybindingWarnings.tsx +55 -0
- package/src/components/LanguagePicker.tsx +86 -0
- package/src/components/LogSelector.tsx +1575 -0
- package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/src/components/LogoV2/Clawd.tsx +240 -0
- package/src/components/LogoV2/CondensedLogo.tsx +161 -0
- package/src/components/LogoV2/EmergencyTip.tsx +58 -0
- package/src/components/LogoV2/Feed.tsx +112 -0
- package/src/components/LogoV2/FeedColumn.tsx +59 -0
- package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/src/components/LogoV2/LogoV2.tsx +543 -0
- package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/src/components/LogoV2/WelcomeV2.tsx +433 -0
- package/src/components/LogoV2/feedConfigs.tsx +92 -0
- package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/src/components/MCPServerApprovalDialog.tsx +115 -0
- package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/src/components/MCPServerDialogCopy.tsx +15 -0
- package/src/components/MCPServerMultiselectDialog.tsx +133 -0
- package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/src/components/Markdown.tsx +236 -0
- package/src/components/MarkdownTable.tsx +322 -0
- package/src/components/MemoryUsageIndicator.tsx +37 -0
- package/src/components/Message.tsx +627 -0
- package/src/components/MessageModel.tsx +43 -0
- package/src/components/MessageResponse.tsx +78 -0
- package/src/components/MessageRow.tsx +383 -0
- package/src/components/MessageSelector.tsx +831 -0
- package/src/components/MessageTimestamp.tsx +63 -0
- package/src/components/Messages.tsx +834 -0
- package/src/components/ModelPicker.tsx +448 -0
- package/src/components/NativeAutoUpdater.tsx +193 -0
- package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/src/components/OffscreenFreeze.tsx +44 -0
- package/src/components/Onboarding.tsx +244 -0
- package/src/components/OutputStylePicker.tsx +112 -0
- package/src/components/PackageManagerAutoUpdater.tsx +104 -0
- package/src/components/Passes/Passes.tsx +184 -0
- package/src/components/PrBadge.tsx +97 -0
- package/src/components/PressEnterToContinue.tsx +15 -0
- package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/src/components/PromptInput/Notifications.tsx +332 -0
- package/src/components/PromptInput/PromptInput.tsx +2339 -0
- package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
- package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/src/components/PromptInput/inputModes.ts +33 -0
- package/src/components/PromptInput/inputPaste.ts +90 -0
- package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
- package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/src/components/PromptInput/useSwarmBanner.ts +155 -0
- package/src/components/PromptInput/utils.ts +60 -0
- package/src/components/QuickOpenDialog.tsx +244 -0
- package/src/components/RemoteCallout.tsx +76 -0
- package/src/components/RemoteEnvironmentDialog.tsx +340 -0
- package/src/components/ResumeTask.tsx +268 -0
- package/src/components/SandboxViolationExpandedView.tsx +99 -0
- package/src/components/ScrollKeybindingHandler.tsx +1012 -0
- package/src/components/SearchBox.tsx +72 -0
- package/src/components/SentryErrorBoundary.ts +28 -0
- package/src/components/SessionBackgroundHint.tsx +108 -0
- package/src/components/SessionPreview.tsx +194 -0
- package/src/components/Settings/Config.tsx +1822 -0
- package/src/components/Settings/Settings.tsx +137 -0
- package/src/components/Settings/Status.tsx +241 -0
- package/src/components/Settings/Usage.tsx +377 -0
- package/src/components/ShowInIDEPrompt.tsx +170 -0
- package/src/components/SkillImprovementSurvey.tsx +152 -0
- package/src/components/Spinner/FlashingChar.tsx +61 -0
- package/src/components/Spinner/GlimmerMessage.tsx +328 -0
- package/src/components/Spinner/ShimmerChar.tsx +36 -0
- package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/src/components/Spinner/index.ts +10 -0
- package/src/components/Spinner/teammateSelectHint.ts +1 -0
- package/src/components/Spinner/useShimmerAnimation.ts +31 -0
- package/src/components/Spinner/useStalledAnimation.ts +75 -0
- package/src/components/Spinner/utils.ts +84 -0
- package/src/components/Spinner.tsx +562 -0
- package/src/components/Stats.tsx +1228 -0
- package/src/components/StatusLine.tsx +324 -0
- package/src/components/StatusNotices.tsx +55 -0
- package/src/components/StructuredDiff/Fallback.tsx +487 -0
- package/src/components/StructuredDiff/colorDiff.ts +37 -0
- package/src/components/StructuredDiff.tsx +190 -0
- package/src/components/StructuredDiffList.tsx +30 -0
- package/src/components/TagTabs.tsx +139 -0
- package/src/components/TaskListV2.tsx +378 -0
- package/src/components/TeammateViewHeader.tsx +82 -0
- package/src/components/TeleportError.tsx +189 -0
- package/src/components/TeleportProgress.tsx +140 -0
- package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/src/components/TeleportResumeWrapper.tsx +167 -0
- package/src/components/TeleportStash.tsx +116 -0
- package/src/components/TextInput.tsx +124 -0
- package/src/components/ThemePicker.tsx +333 -0
- package/src/components/ThinkingToggle.tsx +153 -0
- package/src/components/TokenWarning.tsx +179 -0
- package/src/components/ToolUseLoader.tsx +42 -0
- package/src/components/TrustDialog/TrustDialog.tsx +290 -0
- package/src/components/TrustDialog/utils.ts +245 -0
- package/src/components/ValidationErrorsList.tsx +148 -0
- package/src/components/VimTextInput.tsx +140 -0
- package/src/components/VirtualMessageList.tsx +1082 -0
- package/src/components/WorkflowMultiselectDialog.tsx +128 -0
- package/src/components/WorktreeExitDialog.tsx +231 -0
- package/src/components/agents/AgentDetail.tsx +220 -0
- package/src/components/agents/AgentEditor.tsx +178 -0
- package/src/components/agents/AgentNavigationFooter.tsx +26 -0
- package/src/components/agents/AgentsList.tsx +440 -0
- package/src/components/agents/AgentsMenu.tsx +800 -0
- package/src/components/agents/ColorPicker.tsx +112 -0
- package/src/components/agents/ModelSelector.tsx +68 -0
- package/src/components/agents/ToolSelector.tsx +562 -0
- package/src/components/agents/agentFileUtils.ts +272 -0
- package/src/components/agents/generateAgent.ts +197 -0
- package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/src/components/agents/types.ts +27 -0
- package/src/components/agents/utils.ts +18 -0
- package/src/components/agents/validateAgent.ts +109 -0
- package/src/components/design-system/Byline.tsx +77 -0
- package/src/components/design-system/Dialog.tsx +138 -0
- package/src/components/design-system/Divider.tsx +149 -0
- package/src/components/design-system/FuzzyPicker.tsx +312 -0
- package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/src/components/design-system/ListItem.tsx +244 -0
- package/src/components/design-system/LoadingState.tsx +94 -0
- package/src/components/design-system/Pane.tsx +77 -0
- package/src/components/design-system/ProgressBar.tsx +86 -0
- package/src/components/design-system/Ratchet.tsx +80 -0
- package/src/components/design-system/StatusIcon.tsx +95 -0
- package/src/components/design-system/Tabs.tsx +340 -0
- package/src/components/design-system/ThemeProvider.tsx +174 -0
- package/src/components/design-system/ThemedBox.tsx +156 -0
- package/src/components/design-system/ThemedText.tsx +124 -0
- package/src/components/design-system/color.ts +30 -0
- package/src/components/diff/DiffDetailView.tsx +281 -0
- package/src/components/diff/DiffDialog.tsx +383 -0
- package/src/components/diff/DiffFileList.tsx +292 -0
- package/src/components/grove/Grove.tsx +463 -0
- package/src/components/hooks/HooksConfigMenu.tsx +578 -0
- package/src/components/hooks/PromptDialog.tsx +90 -0
- package/src/components/hooks/SelectEventMode.tsx +127 -0
- package/src/components/hooks/SelectHookMode.tsx +112 -0
- package/src/components/hooks/SelectMatcherMode.tsx +144 -0
- package/src/components/hooks/ViewHookMode.tsx +199 -0
- package/src/components/mcp/CapabilitiesSection.tsx +61 -0
- package/src/components/mcp/ElicitationDialog.tsx +1169 -0
- package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/src/components/mcp/MCPListPanel.tsx +504 -0
- package/src/components/mcp/MCPReconnect.tsx +167 -0
- package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/src/components/mcp/MCPSettings.tsx +398 -0
- package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/src/components/mcp/MCPToolDetailView.tsx +212 -0
- package/src/components/mcp/MCPToolListView.tsx +141 -0
- package/src/components/mcp/McpParsingWarnings.tsx +213 -0
- package/src/components/mcp/index.ts +9 -0
- package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/src/components/memory/MemoryFileSelector.tsx +438 -0
- package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/src/components/messageActions.tsx +450 -0
- package/src/components/messages/AdvisorMessage.tsx +158 -0
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/src/components/messages/AssistantTextMessage.tsx +270 -0
- package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/src/components/messages/AttachmentMessage.tsx +536 -0
- package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/src/components/messages/GroupedToolUseContent.tsx +58 -0
- package/src/components/messages/HighlightedThinkingText.tsx +162 -0
- package/src/components/messages/HookProgressMessage.tsx +116 -0
- package/src/components/messages/PlanApprovalMessage.tsx +222 -0
- package/src/components/messages/RateLimitMessage.tsx +161 -0
- package/src/components/messages/ShutdownMessage.tsx +132 -0
- package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/src/components/messages/SystemTextMessage.tsx +827 -0
- package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/src/components/messages/UserBashInputMessage.tsx +58 -0
- package/src/components/messages/UserBashOutputMessage.tsx +54 -0
- package/src/components/messages/UserChannelMessage.tsx +137 -0
- package/src/components/messages/UserCommandMessage.tsx +108 -0
- package/src/components/messages/UserImageMessage.tsx +59 -0
- package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/src/components/messages/UserPlanMessage.tsx +42 -0
- package/src/components/messages/UserPromptMessage.tsx +80 -0
- package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/src/components/messages/UserTeammateMessage.tsx +206 -0
- package/src/components/messages/UserTextMessage.tsx +275 -0
- package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/src/components/messages/nullRenderingAttachments.ts +70 -0
- package/src/components/messages/teamMemCollapsed.tsx +140 -0
- package/src/components/messages/teamMemSaved.ts +19 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/src/components/permissions/PermissionDialog.tsx +72 -0
- package/src/components/permissions/PermissionExplanation.tsx +272 -0
- package/src/components/permissions/PermissionPrompt.tsx +336 -0
- package/src/components/permissions/PermissionRequest.tsx +217 -0
- package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/src/components/permissions/WorkerBadge.tsx +49 -0
- package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/src/components/permissions/hooks.ts +209 -0
- package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/src/components/permissions/utils.ts +25 -0
- package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/src/components/sandbox/SandboxSettings.tsx +296 -0
- package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/src/components/shell/OutputLine.tsx +118 -0
- package/src/components/shell/ShellProgressMessage.tsx +150 -0
- package/src/components/shell/ShellTimeDisplay.tsx +74 -0
- package/src/components/skills/SkillsMenu.tsx +237 -0
- package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/src/components/tasks/BackgroundTask.tsx +345 -0
- package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/src/components/tasks/DreamDetailDialog.tsx +251 -0
- package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/src/components/tasks/ShellDetailDialog.tsx +404 -0
- package/src/components/tasks/ShellProgress.tsx +87 -0
- package/src/components/tasks/renderToolActivity.tsx +33 -0
- package/src/components/tasks/taskStatusUtils.tsx +107 -0
- package/src/components/teams/TeamStatus.tsx +80 -0
- package/src/components/teams/TeamsDialog.tsx +715 -0
- package/src/components/ui/OrderedList.tsx +71 -0
- package/src/components/ui/OrderedListItem.tsx +45 -0
- package/src/components/ui/TreeSelect.tsx +397 -0
- package/src/components/wizard/WizardDialogLayout.tsx +65 -0
- package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/src/components/wizard/WizardProvider.tsx +213 -0
- package/src/components/wizard/index.ts +9 -0
- package/src/components/wizard/useWizard.ts +13 -0
- package/src/constants/apiLimits.ts +94 -0
- package/src/constants/betas.ts +52 -0
- package/src/constants/common.ts +33 -0
- package/src/constants/cyberRiskInstruction.ts +24 -0
- package/src/constants/errorIds.ts +15 -0
- package/src/constants/figures.ts +45 -0
- package/src/constants/files.ts +156 -0
- package/src/constants/github-app.ts +144 -0
- package/src/constants/keys.ts +11 -0
- package/src/constants/messages.ts +1 -0
- package/src/constants/oauth.ts +234 -0
- package/src/constants/outputStyles.ts +216 -0
- package/src/constants/product.ts +76 -0
- package/src/constants/prompts.ts +914 -0
- package/src/constants/spinnerVerbs.ts +204 -0
- package/src/constants/system.ts +95 -0
- package/src/constants/systemPromptSections.ts +68 -0
- package/src/constants/toolLimits.ts +56 -0
- package/src/constants/tools.ts +112 -0
- package/src/constants/turnCompletionVerbs.ts +12 -0
- package/src/constants/xml.ts +86 -0
- package/src/context/QueuedMessageContext.tsx +63 -0
- package/src/context/fpsMetrics.tsx +30 -0
- package/src/context/mailbox.tsx +38 -0
- package/src/context/modalContext.tsx +58 -0
- package/src/context/notifications.tsx +240 -0
- package/src/context/overlayContext.tsx +151 -0
- package/src/context/promptOverlayContext.tsx +125 -0
- package/src/context/stats.tsx +220 -0
- package/src/context/voice.tsx +88 -0
- package/src/context.ts +189 -0
- package/src/coordinator/coordinatorMode.ts +369 -0
- package/src/cost-tracker.ts +323 -0
- package/src/costHook.ts +22 -0
- package/src/dialogLaunchers.tsx +133 -0
- package/src/entrypoints/agentSdkTypes.ts +443 -0
- package/src/entrypoints/cli.tsx +303 -0
- package/src/entrypoints/init.ts +340 -0
- package/src/entrypoints/mcp.ts +196 -0
- package/src/entrypoints/sandboxTypes.ts +156 -0
- package/src/entrypoints/sdk/controlSchemas.ts +663 -0
- package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/src/entrypoints/sdk/coreTypes.ts +62 -0
- package/src/history.ts +464 -0
- package/src/hooks/fileSuggestions.ts +811 -0
- package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/src/hooks/notifs/useInstallMessages.tsx +26 -0
- package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/src/hooks/notifs/useStartupNotification.ts +41 -0
- package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/src/hooks/renderPlaceholder.ts +51 -0
- package/src/hooks/toolPermission/PermissionContext.ts +388 -0
- package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/src/hooks/toolPermission/permissionLogging.ts +238 -0
- package/src/hooks/unifiedSuggestions.ts +202 -0
- package/src/hooks/useAfterFirstRender.ts +17 -0
- package/src/hooks/useApiKeyVerification.ts +84 -0
- package/src/hooks/useArrowKeyHistory.tsx +229 -0
- package/src/hooks/useAssistantHistory.ts +250 -0
- package/src/hooks/useAwaySummary.ts +125 -0
- package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/src/hooks/useBlink.ts +34 -0
- package/src/hooks/useCanUseTool.tsx +204 -0
- package/src/hooks/useCancelRequest.ts +276 -0
- package/src/hooks/useChromeExtensionNotification.tsx +50 -0
- package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/src/hooks/useClipboardImageHint.ts +77 -0
- package/src/hooks/useCommandKeybindings.tsx +108 -0
- package/src/hooks/useCommandQueue.ts +15 -0
- package/src/hooks/useCopyOnSelect.ts +98 -0
- package/src/hooks/useDeferredHookMessages.ts +46 -0
- package/src/hooks/useDiffData.ts +110 -0
- package/src/hooks/useDiffInIDE.ts +379 -0
- package/src/hooks/useDirectConnect.ts +229 -0
- package/src/hooks/useDoublePress.ts +62 -0
- package/src/hooks/useDynamicConfig.ts +22 -0
- package/src/hooks/useElapsedTime.ts +37 -0
- package/src/hooks/useExitOnCtrlCD.ts +95 -0
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/src/hooks/useGlobalKeybindings.tsx +249 -0
- package/src/hooks/useHistorySearch.ts +303 -0
- package/src/hooks/useIDEIntegration.tsx +70 -0
- package/src/hooks/useIdeAtMentioned.ts +76 -0
- package/src/hooks/useIdeConnectionStatus.ts +33 -0
- package/src/hooks/useIdeLogging.ts +41 -0
- package/src/hooks/useIdeSelection.ts +150 -0
- package/src/hooks/useInboxPoller.ts +969 -0
- package/src/hooks/useInputBuffer.ts +132 -0
- package/src/hooks/useIssueFlagBanner.ts +133 -0
- package/src/hooks/useLogMessages.ts +119 -0
- package/src/hooks/useLspPluginRecommendation.tsx +194 -0
- package/src/hooks/useMailboxBridge.ts +21 -0
- package/src/hooks/useMainLoopModel.ts +34 -0
- package/src/hooks/useManagePlugins.ts +304 -0
- package/src/hooks/useMemoryUsage.ts +39 -0
- package/src/hooks/useMergedClients.ts +23 -0
- package/src/hooks/useMergedCommands.ts +15 -0
- package/src/hooks/useMergedTools.ts +44 -0
- package/src/hooks/useMinDisplayTime.ts +35 -0
- package/src/hooks/useNotifyAfterTimeout.ts +65 -0
- package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/src/hooks/usePasteHandler.ts +285 -0
- package/src/hooks/usePluginRecommendationBase.tsx +105 -0
- package/src/hooks/usePrStatus.ts +106 -0
- package/src/hooks/usePromptSuggestion.ts +177 -0
- package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/src/hooks/useQueueProcessor.ts +68 -0
- package/src/hooks/useRemoteSession.ts +605 -0
- package/src/hooks/useReplBridge.tsx +723 -0
- package/src/hooks/useSSHSession.ts +241 -0
- package/src/hooks/useScheduledTasks.ts +139 -0
- package/src/hooks/useSearchInput.ts +364 -0
- package/src/hooks/useSessionBackgrounding.ts +158 -0
- package/src/hooks/useSettings.ts +17 -0
- package/src/hooks/useSettingsChange.ts +25 -0
- package/src/hooks/useSkillImprovementSurvey.ts +105 -0
- package/src/hooks/useSkillsChange.ts +62 -0
- package/src/hooks/useSwarmInitialization.ts +81 -0
- package/src/hooks/useSwarmPermissionPoller.ts +330 -0
- package/src/hooks/useTaskListWatcher.ts +221 -0
- package/src/hooks/useTasksV2.ts +250 -0
- package/src/hooks/useTeammateViewAutoExit.ts +63 -0
- package/src/hooks/useTeleportResume.tsx +85 -0
- package/src/hooks/useTerminalSize.ts +15 -0
- package/src/hooks/useTextInput.ts +529 -0
- package/src/hooks/useTimeout.ts +14 -0
- package/src/hooks/useTurnDiffs.ts +213 -0
- package/src/hooks/useTypeahead.tsx +1385 -0
- package/src/hooks/useUpdateNotification.ts +34 -0
- package/src/hooks/useVimInput.ts +316 -0
- package/src/hooks/useVirtualScroll.ts +721 -0
- package/src/hooks/useVoice.ts +1144 -0
- package/src/hooks/useVoiceEnabled.ts +25 -0
- package/src/hooks/useVoiceIntegration.tsx +677 -0
- package/src/ink/Ansi.tsx +292 -0
- package/src/ink/bidi.ts +139 -0
- package/src/ink/clearTerminal.ts +74 -0
- package/src/ink/colorize.ts +231 -0
- package/src/ink/components/AlternateScreen.tsx +80 -0
- package/src/ink/components/App.tsx +659 -0
- package/src/ink/components/AppContext.ts +21 -0
- package/src/ink/components/Box.tsx +214 -0
- package/src/ink/components/Button.tsx +192 -0
- package/src/ink/components/ClockContext.tsx +112 -0
- package/src/ink/components/CursorDeclarationContext.ts +32 -0
- package/src/ink/components/ErrorOverview.tsx +109 -0
- package/src/ink/components/Link.tsx +42 -0
- package/src/ink/components/Newline.tsx +39 -0
- package/src/ink/components/NoSelect.tsx +68 -0
- package/src/ink/components/RawAnsi.tsx +57 -0
- package/src/ink/components/ScrollBox.tsx +237 -0
- package/src/ink/components/Spacer.tsx +20 -0
- package/src/ink/components/StdinContext.ts +49 -0
- package/src/ink/components/TerminalFocusContext.tsx +52 -0
- package/src/ink/components/TerminalSizeContext.tsx +7 -0
- package/src/ink/components/Text.tsx +254 -0
- package/src/ink/constants.ts +2 -0
- package/src/ink/dom.ts +484 -0
- package/src/ink/events/click-event.ts +38 -0
- package/src/ink/events/dispatcher.ts +233 -0
- package/src/ink/events/emitter.ts +39 -0
- package/src/ink/events/event-handlers.ts +73 -0
- package/src/ink/events/event.ts +11 -0
- package/src/ink/events/focus-event.ts +21 -0
- package/src/ink/events/input-event.ts +205 -0
- package/src/ink/events/keyboard-event.ts +51 -0
- package/src/ink/events/terminal-event.ts +107 -0
- package/src/ink/events/terminal-focus-event.ts +19 -0
- package/src/ink/focus.ts +181 -0
- package/src/ink/frame.ts +124 -0
- package/src/ink/get-max-width.ts +27 -0
- package/src/ink/hit-test.ts +130 -0
- package/src/ink/hooks/use-animation-frame.ts +57 -0
- package/src/ink/hooks/use-app.ts +8 -0
- package/src/ink/hooks/use-declared-cursor.ts +73 -0
- package/src/ink/hooks/use-input.ts +92 -0
- package/src/ink/hooks/use-interval.ts +67 -0
- package/src/ink/hooks/use-search-highlight.ts +53 -0
- package/src/ink/hooks/use-selection.ts +104 -0
- package/src/ink/hooks/use-stdin.ts +8 -0
- package/src/ink/hooks/use-tab-status.ts +72 -0
- package/src/ink/hooks/use-terminal-focus.ts +16 -0
- package/src/ink/hooks/use-terminal-title.ts +31 -0
- package/src/ink/hooks/use-terminal-viewport.ts +96 -0
- package/src/ink/ink.tsx +1728 -0
- package/src/ink/instances.ts +10 -0
- package/src/ink/layout/engine.ts +6 -0
- package/src/ink/layout/geometry.ts +97 -0
- package/src/ink/layout/node.ts +152 -0
- package/src/ink/layout/yoga.ts +308 -0
- package/src/ink/line-width-cache.ts +24 -0
- package/src/ink/log-update.ts +773 -0
- package/src/ink/measure-element.ts +23 -0
- package/src/ink/measure-text.ts +47 -0
- package/src/ink/node-cache.ts +54 -0
- package/src/ink/optimizer.ts +93 -0
- package/src/ink/output.ts +797 -0
- package/src/ink/parse-keypress.ts +801 -0
- package/src/ink/reconciler.ts +512 -0
- package/src/ink/render-border.ts +231 -0
- package/src/ink/render-node-to-output.ts +1462 -0
- package/src/ink/render-to-screen.ts +231 -0
- package/src/ink/renderer.ts +178 -0
- package/src/ink/root.ts +184 -0
- package/src/ink/screen.ts +1486 -0
- package/src/ink/searchHighlight.ts +93 -0
- package/src/ink/selection.ts +917 -0
- package/src/ink/squash-text-nodes.ts +92 -0
- package/src/ink/stringWidth.ts +222 -0
- package/src/ink/styles.ts +771 -0
- package/src/ink/supports-hyperlinks.ts +57 -0
- package/src/ink/tabstops.ts +46 -0
- package/src/ink/terminal-focus-state.ts +47 -0
- package/src/ink/terminal-querier.ts +212 -0
- package/src/ink/terminal.ts +248 -0
- package/src/ink/termio/ansi.ts +75 -0
- package/src/ink/termio/csi.ts +319 -0
- package/src/ink/termio/dec.ts +60 -0
- package/src/ink/termio/esc.ts +67 -0
- package/src/ink/termio/osc.ts +493 -0
- package/src/ink/termio/parser.ts +394 -0
- package/src/ink/termio/sgr.ts +308 -0
- package/src/ink/termio/tokenize.ts +319 -0
- package/src/ink/termio/types.ts +236 -0
- package/src/ink/termio.ts +42 -0
- package/src/ink/useTerminalNotification.ts +126 -0
- package/src/ink/warn.ts +9 -0
- package/src/ink/widest-line.ts +19 -0
- package/src/ink/wrap-text.ts +74 -0
- package/src/ink/wrapAnsi.ts +20 -0
- package/src/ink.ts +85 -0
- package/src/interactiveHelpers.tsx +367 -0
- package/src/keybindings/KeybindingContext.tsx +243 -0
- package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
- package/src/keybindings/defaultBindings.ts +340 -0
- package/src/keybindings/loadUserBindings.ts +472 -0
- package/src/keybindings/match.ts +120 -0
- package/src/keybindings/parser.ts +203 -0
- package/src/keybindings/reservedShortcuts.ts +127 -0
- package/src/keybindings/resolver.ts +244 -0
- package/src/keybindings/schema.ts +236 -0
- package/src/keybindings/shortcutFormat.ts +63 -0
- package/src/keybindings/template.ts +52 -0
- package/src/keybindings/useKeybinding.ts +196 -0
- package/src/keybindings/useShortcutDisplay.ts +59 -0
- package/src/keybindings/validate.ts +498 -0
- package/src/main.tsx +4684 -0
- package/src/memdir/findRelevantMemories.ts +141 -0
- package/src/memdir/memdir.ts +507 -0
- package/src/memdir/memoryAge.ts +53 -0
- package/src/memdir/memoryScan.ts +94 -0
- package/src/memdir/memoryTypes.ts +271 -0
- package/src/memdir/paths.ts +278 -0
- package/src/memdir/teamMemPaths.ts +292 -0
- package/src/memdir/teamMemPrompts.ts +100 -0
- package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
- package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
- package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
- package/src/migrations/migrateFennecToOpus.ts +45 -0
- package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
- package/src/migrations/migrateOpusToOpus1m.ts +43 -0
- package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
- package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
- package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
- package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
- package/src/migrations/resetProToOpusDefault.ts +51 -0
- package/src/moreright/useMoreRight.tsx +26 -0
- package/src/native-ts/color-diff/index.ts +999 -0
- package/src/native-ts/file-index/index.ts +370 -0
- package/src/native-ts/yoga-layout/enums.ts +134 -0
- package/src/native-ts/yoga-layout/index.ts +2578 -0
- package/src/outputStyles/loadOutputStylesDir.ts +98 -0
- package/src/plugins/builtinPlugins.ts +159 -0
- package/src/plugins/bundled/index.ts +23 -0
- package/src/projectOnboardingState.ts +83 -0
- package/src/query/config.ts +46 -0
- package/src/query/deps.ts +40 -0
- package/src/query/stopHooks.ts +473 -0
- package/src/query/tokenBudget.ts +93 -0
- package/src/query.ts +1729 -0
- package/src/remote/RemoteSessionManager.ts +343 -0
- package/src/remote/SessionsWebSocket.ts +404 -0
- package/src/remote/remotePermissionBridge.ts +78 -0
- package/src/remote/sdkMessageAdapter.ts +302 -0
- package/src/replLauncher.tsx +23 -0
- package/src/schemas/hooks.ts +222 -0
- package/src/screens/Doctor.tsx +575 -0
- package/src/screens/REPL.tsx +5006 -0
- package/src/screens/ResumeConversation.tsx +399 -0
- package/src/server/createDirectConnectSession.ts +88 -0
- package/src/server/directConnectManager.ts +213 -0
- package/src/server/types.ts +57 -0
- package/src/services/AgentSummary/agentSummary.ts +179 -0
- package/src/services/MagicDocs/magicDocs.ts +254 -0
- package/src/services/MagicDocs/prompts.ts +127 -0
- package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/src/services/PromptSuggestion/speculation.ts +991 -0
- package/src/services/SessionMemory/prompts.ts +324 -0
- package/src/services/SessionMemory/sessionMemory.ts +495 -0
- package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/src/services/analytics/config.ts +38 -0
- package/src/services/analytics/datadog.ts +307 -0
- package/src/services/analytics/firstPartyEventLogger.ts +449 -0
- package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/src/services/analytics/growthbook.ts +1157 -0
- package/src/services/analytics/index.ts +173 -0
- package/src/services/analytics/metadata.ts +973 -0
- package/src/services/analytics/sink.ts +114 -0
- package/src/services/analytics/sinkKillswitch.ts +25 -0
- package/src/services/api/adminRequests.ts +119 -0
- package/src/services/api/bootstrap.ts +142 -0
- package/src/services/api/claude.ts +3433 -0
- package/src/services/api/client.ts +395 -0
- package/src/services/api/dumpPrompts.ts +226 -0
- package/src/services/api/emptyUsage.ts +22 -0
- package/src/services/api/errorUtils.ts +260 -0
- package/src/services/api/errors.ts +1207 -0
- package/src/services/api/filesApi.ts +748 -0
- package/src/services/api/firstTokenDate.ts +60 -0
- package/src/services/api/grove.ts +357 -0
- package/src/services/api/logging.ts +788 -0
- package/src/services/api/metricsOptOut.ts +159 -0
- package/src/services/api/overageCreditGrant.ts +137 -0
- package/src/services/api/promptCacheBreakDetection.ts +727 -0
- package/src/services/api/referral.ts +281 -0
- package/src/services/api/sessionIngress.ts +514 -0
- package/src/services/api/ultrareviewQuota.ts +38 -0
- package/src/services/api/usage.ts +63 -0
- package/src/services/api/withRetry.ts +826 -0
- package/src/services/autoDream/autoDream.ts +324 -0
- package/src/services/autoDream/config.ts +21 -0
- package/src/services/autoDream/consolidationLock.ts +140 -0
- package/src/services/autoDream/consolidationPrompt.ts +65 -0
- package/src/services/awaySummary.ts +74 -0
- package/src/services/claudeAiLimits.ts +515 -0
- package/src/services/claudeAiLimitsHook.ts +23 -0
- package/src/services/compact/apiMicrocompact.ts +153 -0
- package/src/services/compact/autoCompact.ts +351 -0
- package/src/services/compact/compact.ts +1705 -0
- package/src/services/compact/compactWarningHook.ts +16 -0
- package/src/services/compact/compactWarningState.ts +18 -0
- package/src/services/compact/grouping.ts +63 -0
- package/src/services/compact/microCompact.ts +530 -0
- package/src/services/compact/postCompactCleanup.ts +77 -0
- package/src/services/compact/prompt.ts +374 -0
- package/src/services/compact/sessionMemoryCompact.ts +630 -0
- package/src/services/compact/timeBasedMCConfig.ts +43 -0
- package/src/services/diagnosticTracking.ts +397 -0
- package/src/services/extractMemories/extractMemories.ts +615 -0
- package/src/services/extractMemories/prompts.ts +154 -0
- package/src/services/internalLogging.ts +90 -0
- package/src/services/lsp/LSPClient.ts +447 -0
- package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/src/services/lsp/LSPServerInstance.ts +511 -0
- package/src/services/lsp/LSPServerManager.ts +420 -0
- package/src/services/lsp/config.ts +79 -0
- package/src/services/lsp/manager.ts +289 -0
- package/src/services/lsp/passiveFeedback.ts +328 -0
- package/src/services/mcp/InProcessTransport.ts +63 -0
- package/src/services/mcp/MCPConnectionManager.tsx +73 -0
- package/src/services/mcp/SdkControlTransport.ts +136 -0
- package/src/services/mcp/auth.ts +2465 -0
- package/src/services/mcp/channelAllowlist.ts +76 -0
- package/src/services/mcp/channelNotification.ts +316 -0
- package/src/services/mcp/channelPermissions.ts +240 -0
- package/src/services/mcp/claudeai.ts +164 -0
- package/src/services/mcp/client.ts +3348 -0
- package/src/services/mcp/config.ts +1578 -0
- package/src/services/mcp/elicitationHandler.ts +313 -0
- package/src/services/mcp/envExpansion.ts +38 -0
- package/src/services/mcp/headersHelper.ts +138 -0
- package/src/services/mcp/mcpStringUtils.ts +106 -0
- package/src/services/mcp/normalization.ts +23 -0
- package/src/services/mcp/oauthPort.ts +78 -0
- package/src/services/mcp/officialRegistry.ts +72 -0
- package/src/services/mcp/types.ts +258 -0
- package/src/services/mcp/useManageMCPConnections.ts +1141 -0
- package/src/services/mcp/utils.ts +575 -0
- package/src/services/mcp/vscodeSdkMcp.ts +112 -0
- package/src/services/mcp/xaa.ts +511 -0
- package/src/services/mcp/xaaIdpLogin.ts +487 -0
- package/src/services/mcpServerApproval.tsx +41 -0
- package/src/services/mockRateLimits.ts +882 -0
- package/src/services/notifier.ts +156 -0
- package/src/services/oauth/auth-code-listener.ts +211 -0
- package/src/services/oauth/client.ts +566 -0
- package/src/services/oauth/crypto.ts +23 -0
- package/src/services/oauth/getOauthProfile.ts +53 -0
- package/src/services/oauth/index.ts +198 -0
- package/src/services/plugins/PluginInstallationManager.ts +184 -0
- package/src/services/plugins/pluginCliCommands.ts +344 -0
- package/src/services/plugins/pluginOperations.ts +1088 -0
- package/src/services/policyLimits/index.ts +664 -0
- package/src/services/policyLimits/types.ts +27 -0
- package/src/services/preventSleep.ts +165 -0
- package/src/services/rateLimitMessages.ts +344 -0
- package/src/services/rateLimitMocking.ts +144 -0
- package/src/services/remoteManagedSettings/index.ts +639 -0
- package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/src/services/remoteManagedSettings/syncCache.ts +112 -0
- package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/src/services/remoteManagedSettings/types.ts +31 -0
- package/src/services/settingsSync/index.ts +581 -0
- package/src/services/settingsSync/types.ts +67 -0
- package/src/services/teamMemorySync/index.ts +1256 -0
- package/src/services/teamMemorySync/secretScanner.ts +324 -0
- package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/src/services/teamMemorySync/types.ts +156 -0
- package/src/services/teamMemorySync/watcher.ts +387 -0
- package/src/services/tips/tipHistory.ts +17 -0
- package/src/services/tips/tipRegistry.ts +686 -0
- package/src/services/tips/tipScheduler.ts +58 -0
- package/src/services/tokenEstimation.ts +495 -0
- package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/src/services/tools/StreamingToolExecutor.ts +530 -0
- package/src/services/tools/toolExecution.ts +1745 -0
- package/src/services/tools/toolHooks.ts +650 -0
- package/src/services/tools/toolOrchestration.ts +188 -0
- package/src/services/vcr.ts +406 -0
- package/src/services/voice.ts +525 -0
- package/src/services/voiceKeyterms.ts +106 -0
- package/src/services/voiceStreamSTT.ts +544 -0
- package/src/setup.ts +477 -0
- package/src/skills/bundled/batch.ts +124 -0
- package/src/skills/bundled/claudeApi.ts +196 -0
- package/src/skills/bundled/claudeApiContent.ts +75 -0
- package/src/skills/bundled/claudeInChrome.ts +34 -0
- package/src/skills/bundled/debug.ts +103 -0
- package/src/skills/bundled/index.ts +79 -0
- package/src/skills/bundled/keybindings.ts +339 -0
- package/src/skills/bundled/loop.ts +92 -0
- package/src/skills/bundled/loremIpsum.ts +282 -0
- package/src/skills/bundled/remember.ts +82 -0
- package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
- package/src/skills/bundled/simplify.ts +69 -0
- package/src/skills/bundled/skillify.ts +197 -0
- package/src/skills/bundled/stuck.ts +79 -0
- package/src/skills/bundled/updateConfig.ts +475 -0
- package/src/skills/bundled/verify.ts +30 -0
- package/src/skills/bundled/verifyContent.ts +13 -0
- package/src/skills/bundledSkills.ts +220 -0
- package/src/skills/loadSkillsDir.ts +1086 -0
- package/src/skills/mcpSkillBuilders.ts +44 -0
- package/src/state/AppState.tsx +200 -0
- package/src/state/AppStateStore.ts +569 -0
- package/src/state/onChangeAppState.ts +171 -0
- package/src/state/selectors.ts +76 -0
- package/src/state/store.ts +34 -0
- package/src/state/teammateViewHelpers.ts +141 -0
- package/src/tasks/DreamTask/DreamTask.ts +157 -0
- package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
- package/src/tasks/InProcessTeammateTask/types.ts +121 -0
- package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
- package/src/tasks/LocalMainSessionTask.ts +479 -0
- package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
- package/src/tasks/LocalShellTask/guards.ts +41 -0
- package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
- package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
- package/src/tasks/pillLabel.ts +82 -0
- package/src/tasks/stopTask.ts +100 -0
- package/src/tasks/types.ts +46 -0
- package/src/tasks.ts +39 -0
- package/src/tools/AgentTool/AgentTool.tsx +1398 -0
- package/src/tools/AgentTool/UI.tsx +872 -0
- package/src/tools/AgentTool/agentColorManager.ts +66 -0
- package/src/tools/AgentTool/agentDisplay.ts +104 -0
- package/src/tools/AgentTool/agentMemory.ts +177 -0
- package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/src/tools/AgentTool/agentToolUtils.ts +686 -0
- package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/src/tools/AgentTool/builtInAgents.ts +72 -0
- package/src/tools/AgentTool/constants.ts +12 -0
- package/src/tools/AgentTool/forkSubagent.ts +210 -0
- package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/src/tools/AgentTool/prompt.ts +287 -0
- package/src/tools/AgentTool/resumeAgent.ts +265 -0
- package/src/tools/AgentTool/runAgent.ts +973 -0
- package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/src/tools/BashTool/BashTool.tsx +1144 -0
- package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/src/tools/BashTool/UI.tsx +185 -0
- package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/src/tools/BashTool/bashPermissions.ts +2621 -0
- package/src/tools/BashTool/bashSecurity.ts +2592 -0
- package/src/tools/BashTool/commandSemantics.ts +140 -0
- package/src/tools/BashTool/commentLabel.ts +13 -0
- package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/src/tools/BashTool/modeValidation.ts +115 -0
- package/src/tools/BashTool/pathValidation.ts +1303 -0
- package/src/tools/BashTool/prompt.ts +369 -0
- package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/src/tools/BashTool/sedEditParser.ts +322 -0
- package/src/tools/BashTool/sedValidation.ts +684 -0
- package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/src/tools/BashTool/toolName.ts +2 -0
- package/src/tools/BashTool/utils.ts +223 -0
- package/src/tools/BriefTool/BriefTool.ts +204 -0
- package/src/tools/BriefTool/UI.tsx +101 -0
- package/src/tools/BriefTool/attachments.ts +110 -0
- package/src/tools/BriefTool/prompt.ts +22 -0
- package/src/tools/BriefTool/upload.ts +174 -0
- package/src/tools/ConfigTool/ConfigTool.ts +467 -0
- package/src/tools/ConfigTool/UI.tsx +38 -0
- package/src/tools/ConfigTool/constants.ts +1 -0
- package/src/tools/ConfigTool/prompt.ts +93 -0
- package/src/tools/ConfigTool/supportedSettings.ts +211 -0
- package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/src/tools/EnterPlanModeTool/constants.ts +1 -0
- package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/src/tools/EnterWorktreeTool/constants.ts +1 -0
- package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/src/tools/ExitPlanModeTool/constants.ts +2 -0
- package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/src/tools/ExitWorktreeTool/constants.ts +1 -0
- package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/src/tools/FileEditTool/FileEditTool.ts +625 -0
- package/src/tools/FileEditTool/UI.tsx +289 -0
- package/src/tools/FileEditTool/constants.ts +11 -0
- package/src/tools/FileEditTool/prompt.ts +28 -0
- package/src/tools/FileEditTool/types.ts +85 -0
- package/src/tools/FileEditTool/utils.ts +775 -0
- package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/src/tools/FileReadTool/UI.tsx +185 -0
- package/src/tools/FileReadTool/imageProcessor.ts +94 -0
- package/src/tools/FileReadTool/limits.ts +92 -0
- package/src/tools/FileReadTool/prompt.ts +49 -0
- package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/src/tools/FileWriteTool/UI.tsx +405 -0
- package/src/tools/FileWriteTool/prompt.ts +18 -0
- package/src/tools/GlobTool/GlobTool.ts +198 -0
- package/src/tools/GlobTool/UI.tsx +63 -0
- package/src/tools/GlobTool/prompt.ts +7 -0
- package/src/tools/GrepTool/GrepTool.ts +577 -0
- package/src/tools/GrepTool/UI.tsx +201 -0
- package/src/tools/GrepTool/prompt.ts +18 -0
- package/src/tools/LSPTool/LSPTool.ts +860 -0
- package/src/tools/LSPTool/UI.tsx +228 -0
- package/src/tools/LSPTool/formatters.ts +592 -0
- package/src/tools/LSPTool/prompt.ts +21 -0
- package/src/tools/LSPTool/schemas.ts +215 -0
- package/src/tools/LSPTool/symbolContext.ts +90 -0
- package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/src/tools/MCPTool/MCPTool.ts +77 -0
- package/src/tools/MCPTool/UI.tsx +403 -0
- package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/src/tools/MCPTool/prompt.ts +3 -0
- package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/src/tools/NotebookEditTool/UI.tsx +93 -0
- package/src/tools/NotebookEditTool/constants.ts +2 -0
- package/src/tools/NotebookEditTool/prompt.ts +3 -0
- package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/src/tools/PowerShellTool/UI.tsx +131 -0
- package/src/tools/PowerShellTool/clmTypes.ts +211 -0
- package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/src/tools/PowerShellTool/commonParameters.ts +30 -0
- package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/src/tools/PowerShellTool/gitSafety.ts +176 -0
- package/src/tools/PowerShellTool/modeValidation.ts +404 -0
- package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/src/tools/PowerShellTool/prompt.ts +145 -0
- package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/src/tools/PowerShellTool/toolName.ts +2 -0
- package/src/tools/REPLTool/constants.ts +46 -0
- package/src/tools/REPLTool/primitiveTools.ts +39 -0
- package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/src/tools/ScheduleCronTool/UI.tsx +60 -0
- package/src/tools/ScheduleCronTool/prompt.ts +135 -0
- package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/src/tools/SendMessageTool/UI.tsx +31 -0
- package/src/tools/SendMessageTool/constants.ts +1 -0
- package/src/tools/SendMessageTool/prompt.ts +49 -0
- package/src/tools/SkillTool/SkillTool.ts +1108 -0
- package/src/tools/SkillTool/UI.tsx +128 -0
- package/src/tools/SkillTool/constants.ts +1 -0
- package/src/tools/SkillTool/prompt.ts +241 -0
- package/src/tools/SleepTool/prompt.ts +17 -0
- package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/src/tools/TaskCreateTool/constants.ts +1 -0
- package/src/tools/TaskCreateTool/prompt.ts +56 -0
- package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/src/tools/TaskGetTool/constants.ts +1 -0
- package/src/tools/TaskGetTool/prompt.ts +24 -0
- package/src/tools/TaskListTool/TaskListTool.ts +116 -0
- package/src/tools/TaskListTool/constants.ts +1 -0
- package/src/tools/TaskListTool/prompt.ts +49 -0
- package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/src/tools/TaskOutputTool/constants.ts +1 -0
- package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/src/tools/TaskStopTool/UI.tsx +41 -0
- package/src/tools/TaskStopTool/prompt.ts +8 -0
- package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/src/tools/TaskUpdateTool/constants.ts +1 -0
- package/src/tools/TaskUpdateTool/prompt.ts +77 -0
- package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/src/tools/TeamCreateTool/UI.tsx +6 -0
- package/src/tools/TeamCreateTool/constants.ts +1 -0
- package/src/tools/TeamCreateTool/prompt.ts +113 -0
- package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/src/tools/TeamDeleteTool/UI.tsx +20 -0
- package/src/tools/TeamDeleteTool/constants.ts +1 -0
- package/src/tools/TeamDeleteTool/prompt.ts +16 -0
- package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/src/tools/TodoWriteTool/constants.ts +1 -0
- package/src/tools/TodoWriteTool/prompt.ts +184 -0
- package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/src/tools/ToolSearchTool/constants.ts +1 -0
- package/src/tools/ToolSearchTool/prompt.ts +121 -0
- package/src/tools/TungstenTool/TungstenTool.js +2 -0
- package/src/tools/TungstenTool/TungstenTool.ts +1 -0
- package/src/tools/WebFetchTool/UI.tsx +72 -0
- package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/src/tools/WebFetchTool/preapproved.ts +166 -0
- package/src/tools/WebFetchTool/prompt.ts +46 -0
- package/src/tools/WebFetchTool/utils.ts +530 -0
- package/src/tools/WebSearchTool/UI.tsx +101 -0
- package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/src/tools/WebSearchTool/prompt.ts +34 -0
- package/src/tools/shared/gitOperationTracking.ts +277 -0
- package/src/tools/shared/spawnMultiAgent.ts +1093 -0
- package/src/tools/testing/TestingPermissionTool.tsx +74 -0
- package/src/tools/utils.ts +40 -0
- package/src/tools.ts +389 -0
- package/src/types/command.ts +216 -0
- package/src/types/connectorText.js +5 -0
- package/src/types/connectorText.ts +1 -0
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/src/types/generated/google/protobuf/timestamp.ts +187 -0
- package/src/types/hooks.ts +290 -0
- package/src/types/ids.ts +44 -0
- package/src/types/logs.ts +330 -0
- package/src/types/permissions.ts +441 -0
- package/src/types/plugin.ts +363 -0
- package/src/types/textInputTypes.ts +387 -0
- package/src/upstreamproxy/relay.ts +455 -0
- package/src/upstreamproxy/upstreamproxy.ts +285 -0
- package/src/utils/CircularBuffer.ts +84 -0
- package/src/utils/Cursor.ts +1530 -0
- package/src/utils/QueryGuard.ts +121 -0
- package/src/utils/Shell.ts +474 -0
- package/src/utils/ShellCommand.ts +465 -0
- package/src/utils/abortController.ts +99 -0
- package/src/utils/activityManager.ts +164 -0
- package/src/utils/advisor.ts +145 -0
- package/src/utils/agentContext.ts +178 -0
- package/src/utils/agentId.ts +99 -0
- package/src/utils/agentSwarmsEnabled.ts +44 -0
- package/src/utils/agenticSessionSearch.ts +307 -0
- package/src/utils/analyzeContext.ts +1382 -0
- package/src/utils/ansiToPng.ts +334 -0
- package/src/utils/ansiToSvg.ts +272 -0
- package/src/utils/api.ts +718 -0
- package/src/utils/apiPreconnect.ts +72 -0
- package/src/utils/appleTerminalBackup.ts +124 -0
- package/src/utils/argumentSubstitution.ts +145 -0
- package/src/utils/array.ts +13 -0
- package/src/utils/asciicast.ts +239 -0
- package/src/utils/attachments.ts +3997 -0
- package/src/utils/attribution.ts +393 -0
- package/src/utils/auth.ts +2007 -0
- package/src/utils/authFileDescriptor.ts +196 -0
- package/src/utils/authPortable.ts +19 -0
- package/src/utils/autoModeDenials.ts +26 -0
- package/src/utils/autoRunIssue.tsx +122 -0
- package/src/utils/autoUpdater.ts +562 -0
- package/src/utils/aws.ts +74 -0
- package/src/utils/awsAuthStatusManager.ts +81 -0
- package/src/utils/background/remote/preconditions.ts +235 -0
- package/src/utils/background/remote/remoteSession.ts +98 -0
- package/src/utils/backgroundHousekeeping.ts +94 -0
- package/src/utils/bash/ParsedCommand.ts +318 -0
- package/src/utils/bash/ShellSnapshot.ts +582 -0
- package/src/utils/bash/ast.ts +2679 -0
- package/src/utils/bash/bashParser.ts +4436 -0
- package/src/utils/bash/bashPipeCommand.ts +294 -0
- package/src/utils/bash/commands.ts +1339 -0
- package/src/utils/bash/heredoc.ts +733 -0
- package/src/utils/bash/parser.ts +230 -0
- package/src/utils/bash/prefix.ts +204 -0
- package/src/utils/bash/registry.ts +53 -0
- package/src/utils/bash/shellCompletion.ts +259 -0
- package/src/utils/bash/shellPrefix.ts +28 -0
- package/src/utils/bash/shellQuote.ts +304 -0
- package/src/utils/bash/shellQuoting.ts +128 -0
- package/src/utils/bash/specs/alias.ts +14 -0
- package/src/utils/bash/specs/index.ts +18 -0
- package/src/utils/bash/specs/nohup.ts +13 -0
- package/src/utils/bash/specs/pyright.ts +91 -0
- package/src/utils/bash/specs/sleep.ts +13 -0
- package/src/utils/bash/specs/srun.ts +31 -0
- package/src/utils/bash/specs/time.ts +13 -0
- package/src/utils/bash/specs/timeout.ts +20 -0
- package/src/utils/bash/treeSitterAnalysis.ts +506 -0
- package/src/utils/betas.ts +438 -0
- package/src/utils/billing.ts +78 -0
- package/src/utils/binaryCheck.ts +53 -0
- package/src/utils/browser.ts +68 -0
- package/src/utils/bufferedWriter.ts +100 -0
- package/src/utils/bundledMode.ts +22 -0
- package/src/utils/caCerts.ts +115 -0
- package/src/utils/caCertsConfig.ts +88 -0
- package/src/utils/cachePaths.ts +38 -0
- package/src/utils/classifierApprovals.ts +88 -0
- package/src/utils/classifierApprovalsHook.ts +17 -0
- package/src/utils/claudeCodeHints.ts +193 -0
- package/src/utils/claudeDesktop.ts +152 -0
- package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/src/utils/claudeInChrome/common.ts +540 -0
- package/src/utils/claudeInChrome/mcpServer.ts +293 -0
- package/src/utils/claudeInChrome/prompt.ts +83 -0
- package/src/utils/claudeInChrome/setup.ts +400 -0
- package/src/utils/claudeInChrome/setupPortable.ts +233 -0
- package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/src/utils/claudemd.ts +1479 -0
- package/src/utils/cleanup.ts +602 -0
- package/src/utils/cleanupRegistry.ts +25 -0
- package/src/utils/cliArgs.ts +60 -0
- package/src/utils/cliHighlight.ts +54 -0
- package/src/utils/codeIndexing.ts +206 -0
- package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/src/utils/collapseHookSummaries.ts +59 -0
- package/src/utils/collapseReadSearch.ts +1109 -0
- package/src/utils/collapseTeammateShutdowns.ts +55 -0
- package/src/utils/combinedAbortSignal.ts +47 -0
- package/src/utils/commandLifecycle.ts +21 -0
- package/src/utils/commitAttribution.ts +961 -0
- package/src/utils/completionCache.ts +166 -0
- package/src/utils/computerUse/appNames.ts +196 -0
- package/src/utils/computerUse/cleanup.ts +86 -0
- package/src/utils/computerUse/common.ts +61 -0
- package/src/utils/computerUse/computerUseLock.ts +215 -0
- package/src/utils/computerUse/drainRunLoop.ts +79 -0
- package/src/utils/computerUse/escHotkey.ts +54 -0
- package/src/utils/computerUse/executor.ts +658 -0
- package/src/utils/computerUse/gates.ts +72 -0
- package/src/utils/computerUse/hostAdapter.ts +69 -0
- package/src/utils/computerUse/inputLoader.ts +30 -0
- package/src/utils/computerUse/mcpServer.ts +106 -0
- package/src/utils/computerUse/setup.ts +53 -0
- package/src/utils/computerUse/swiftLoader.ts +23 -0
- package/src/utils/computerUse/toolRendering.tsx +125 -0
- package/src/utils/computerUse/wrapper.tsx +336 -0
- package/src/utils/concurrentSessions.ts +204 -0
- package/src/utils/config.ts +1817 -0
- package/src/utils/configConstants.ts +21 -0
- package/src/utils/contentArray.ts +51 -0
- package/src/utils/context.ts +221 -0
- package/src/utils/contextAnalysis.ts +272 -0
- package/src/utils/contextSuggestions.ts +235 -0
- package/src/utils/controlMessageCompat.ts +32 -0
- package/src/utils/conversationRecovery.ts +597 -0
- package/src/utils/cron.ts +308 -0
- package/src/utils/cronJitterConfig.ts +75 -0
- package/src/utils/cronScheduler.ts +565 -0
- package/src/utils/cronTasks.ts +458 -0
- package/src/utils/cronTasksLock.ts +195 -0
- package/src/utils/crossProjectResume.ts +75 -0
- package/src/utils/crypto.ts +13 -0
- package/src/utils/cwd.ts +32 -0
- package/src/utils/debug.ts +268 -0
- package/src/utils/debugFilter.ts +157 -0
- package/src/utils/deepLink/banner.ts +123 -0
- package/src/utils/deepLink/parseDeepLink.ts +170 -0
- package/src/utils/deepLink/protocolHandler.ts +136 -0
- package/src/utils/deepLink/registerProtocol.ts +348 -0
- package/src/utils/deepLink/terminalLauncher.ts +557 -0
- package/src/utils/deepLink/terminalPreference.ts +54 -0
- package/src/utils/desktopDeepLink.ts +236 -0
- package/src/utils/detectRepository.ts +178 -0
- package/src/utils/diagLogs.ts +94 -0
- package/src/utils/diff.ts +177 -0
- package/src/utils/directMemberMessage.ts +69 -0
- package/src/utils/displayTags.ts +51 -0
- package/src/utils/doctorContextWarnings.ts +265 -0
- package/src/utils/doctorDiagnostic.ts +625 -0
- package/src/utils/dxt/helpers.ts +88 -0
- package/src/utils/dxt/zip.ts +226 -0
- package/src/utils/earlyInput.ts +191 -0
- package/src/utils/editor.ts +183 -0
- package/src/utils/effort.ts +329 -0
- package/src/utils/embeddedTools.ts +29 -0
- package/src/utils/env.ts +347 -0
- package/src/utils/envDynamic.ts +151 -0
- package/src/utils/envUtils.ts +183 -0
- package/src/utils/envValidation.ts +38 -0
- package/src/utils/errorLogSink.ts +235 -0
- package/src/utils/errors.ts +238 -0
- package/src/utils/exampleCommands.ts +184 -0
- package/src/utils/execFileNoThrow.ts +150 -0
- package/src/utils/execFileNoThrowPortable.ts +89 -0
- package/src/utils/execSyncWrapper.ts +38 -0
- package/src/utils/exportRenderer.tsx +98 -0
- package/src/utils/extraUsage.ts +23 -0
- package/src/utils/fastMode.ts +532 -0
- package/src/utils/file.ts +584 -0
- package/src/utils/fileHistory.ts +1115 -0
- package/src/utils/fileOperationAnalytics.ts +71 -0
- package/src/utils/filePersistence/filePersistence.ts +287 -0
- package/src/utils/filePersistence/outputsScanner.ts +126 -0
- package/src/utils/fileRead.ts +102 -0
- package/src/utils/fileReadCache.ts +96 -0
- package/src/utils/fileStateCache.ts +142 -0
- package/src/utils/findExecutable.ts +17 -0
- package/src/utils/fingerprint.ts +76 -0
- package/src/utils/forkedAgent.ts +689 -0
- package/src/utils/format.ts +308 -0
- package/src/utils/formatBriefTimestamp.ts +81 -0
- package/src/utils/fpsTracker.ts +47 -0
- package/src/utils/frontmatterParser.ts +370 -0
- package/src/utils/fsOperations.ts +770 -0
- package/src/utils/fullscreen.ts +202 -0
- package/src/utils/generatedFiles.ts +136 -0
- package/src/utils/generators.ts +88 -0
- package/src/utils/genericProcessUtils.ts +184 -0
- package/src/utils/getWorktreePaths.ts +70 -0
- package/src/utils/getWorktreePathsPortable.ts +27 -0
- package/src/utils/ghPrStatus.ts +106 -0
- package/src/utils/git/gitConfigParser.ts +277 -0
- package/src/utils/git/gitFilesystem.ts +699 -0
- package/src/utils/git/gitignore.ts +99 -0
- package/src/utils/git.ts +926 -0
- package/src/utils/gitDiff.ts +532 -0
- package/src/utils/gitSettings.ts +18 -0
- package/src/utils/github/ghAuthStatus.ts +29 -0
- package/src/utils/githubRepoPathMapping.ts +162 -0
- package/src/utils/glob.ts +130 -0
- package/src/utils/gracefulShutdown.ts +529 -0
- package/src/utils/groupToolUses.ts +182 -0
- package/src/utils/handlePromptSubmit.ts +610 -0
- package/src/utils/hash.ts +46 -0
- package/src/utils/headlessProfiler.ts +178 -0
- package/src/utils/heapDumpService.ts +303 -0
- package/src/utils/heatmap.ts +198 -0
- package/src/utils/highlightMatch.tsx +28 -0
- package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/src/utils/hooks/execAgentHook.ts +339 -0
- package/src/utils/hooks/execHttpHook.ts +242 -0
- package/src/utils/hooks/execPromptHook.ts +211 -0
- package/src/utils/hooks/fileChangedWatcher.ts +191 -0
- package/src/utils/hooks/hookEvents.ts +192 -0
- package/src/utils/hooks/hookHelpers.ts +83 -0
- package/src/utils/hooks/hooksConfigManager.ts +400 -0
- package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/src/utils/hooks/hooksSettings.ts +271 -0
- package/src/utils/hooks/postSamplingHooks.ts +70 -0
- package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/src/utils/hooks/registerSkillHooks.ts +64 -0
- package/src/utils/hooks/sessionHooks.ts +447 -0
- package/src/utils/hooks/skillImprovement.ts +267 -0
- package/src/utils/hooks/ssrfGuard.ts +294 -0
- package/src/utils/hooks.ts +5022 -0
- package/src/utils/horizontalScroll.ts +137 -0
- package/src/utils/http.ts +136 -0
- package/src/utils/hyperlink.ts +39 -0
- package/src/utils/iTermBackup.ts +73 -0
- package/src/utils/ide.ts +1494 -0
- package/src/utils/idePathConversion.ts +90 -0
- package/src/utils/idleTimeout.ts +53 -0
- package/src/utils/imagePaste.ts +416 -0
- package/src/utils/imageResizer.ts +880 -0
- package/src/utils/imageStore.ts +167 -0
- package/src/utils/imageValidation.ts +104 -0
- package/src/utils/immediateCommand.ts +15 -0
- package/src/utils/inProcessTeammateHelpers.ts +102 -0
- package/src/utils/ink.ts +26 -0
- package/src/utils/intl.ts +94 -0
- package/src/utils/jetbrains.ts +191 -0
- package/src/utils/json.ts +277 -0
- package/src/utils/jsonRead.ts +16 -0
- package/src/utils/keyboardShortcuts.ts +14 -0
- package/src/utils/lazySchema.ts +8 -0
- package/src/utils/listSessionsImpl.ts +454 -0
- package/src/utils/localInstaller.ts +162 -0
- package/src/utils/lockfile.ts +43 -0
- package/src/utils/log.ts +362 -0
- package/src/utils/logoV2Utils.ts +350 -0
- package/src/utils/mailbox.ts +73 -0
- package/src/utils/managedEnv.ts +199 -0
- package/src/utils/managedEnvConstants.ts +191 -0
- package/src/utils/markdown.ts +381 -0
- package/src/utils/markdownConfigLoader.ts +600 -0
- package/src/utils/mcp/dateTimeParser.ts +121 -0
- package/src/utils/mcp/elicitationValidation.ts +336 -0
- package/src/utils/mcpInstructionsDelta.ts +130 -0
- package/src/utils/mcpOutputStorage.ts +189 -0
- package/src/utils/mcpValidation.ts +208 -0
- package/src/utils/mcpWebSocketTransport.ts +200 -0
- package/src/utils/memoize.ts +269 -0
- package/src/utils/memory/types.ts +12 -0
- package/src/utils/memory/versions.ts +8 -0
- package/src/utils/memoryFileDetection.ts +289 -0
- package/src/utils/messagePredicates.ts +8 -0
- package/src/utils/messageQueueManager.ts +547 -0
- package/src/utils/messages/mappers.ts +290 -0
- package/src/utils/messages/systemInit.ts +96 -0
- package/src/utils/messages.ts +5512 -0
- package/src/utils/model/agent.ts +157 -0
- package/src/utils/model/aliases.ts +25 -0
- package/src/utils/model/antModels.ts +64 -0
- package/src/utils/model/bedrock.ts +265 -0
- package/src/utils/model/check1mAccess.ts +72 -0
- package/src/utils/model/configs.ts +118 -0
- package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/src/utils/model/deprecation.ts +101 -0
- package/src/utils/model/model.ts +634 -0
- package/src/utils/model/modelAllowlist.ts +170 -0
- package/src/utils/model/modelCapabilities.ts +118 -0
- package/src/utils/model/modelOptions.ts +540 -0
- package/src/utils/model/modelStrings.ts +166 -0
- package/src/utils/model/modelSupportOverrides.ts +50 -0
- package/src/utils/model/providers.ts +46 -0
- package/src/utils/model/validateModel.ts +159 -0
- package/src/utils/modelCost.ts +235 -0
- package/src/utils/modifiers.ts +36 -0
- package/src/utils/mtls.ts +179 -0
- package/src/utils/nativeInstaller/download.ts +523 -0
- package/src/utils/nativeInstaller/index.ts +18 -0
- package/src/utils/nativeInstaller/installer.ts +1708 -0
- package/src/utils/nativeInstaller/packageManagers.ts +336 -0
- package/src/utils/nativeInstaller/pidLock.ts +433 -0
- package/src/utils/notebook.ts +224 -0
- package/src/utils/objectGroupBy.ts +18 -0
- package/src/utils/pasteStore.ts +104 -0
- package/src/utils/path.ts +155 -0
- package/src/utils/pdf.ts +300 -0
- package/src/utils/pdfUtils.ts +70 -0
- package/src/utils/peerAddress.ts +21 -0
- package/src/utils/permissions/PermissionMode.ts +141 -0
- package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/src/utils/permissions/PermissionResult.ts +35 -0
- package/src/utils/permissions/PermissionRule.ts +40 -0
- package/src/utils/permissions/PermissionUpdate.ts +389 -0
- package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/src/utils/permissions/autoModeState.ts +39 -0
- package/src/utils/permissions/bashClassifier.ts +61 -0
- package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/src/utils/permissions/classifierDecision.ts +98 -0
- package/src/utils/permissions/classifierShared.ts +39 -0
- package/src/utils/permissions/dangerousPatterns.ts +80 -0
- package/src/utils/permissions/denialTracking.ts +45 -0
- package/src/utils/permissions/filesystem.ts +1777 -0
- package/src/utils/permissions/getNextPermissionMode.ts +101 -0
- package/src/utils/permissions/pathValidation.ts +485 -0
- package/src/utils/permissions/permissionExplainer.ts +250 -0
- package/src/utils/permissions/permissionRuleParser.ts +198 -0
- package/src/utils/permissions/permissionSetup.ts +1532 -0
- package/src/utils/permissions/permissions.ts +1486 -0
- package/src/utils/permissions/permissionsLoader.ts +296 -0
- package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/src/utils/permissions/shellRuleMatching.ts +228 -0
- package/src/utils/permissions/yoloClassifier.ts +1495 -0
- package/src/utils/planModeV2.ts +95 -0
- package/src/utils/plans.ts +397 -0
- package/src/utils/platform.ts +150 -0
- package/src/utils/plugins/addDirPluginSettings.ts +71 -0
- package/src/utils/plugins/cacheUtils.ts +196 -0
- package/src/utils/plugins/dependencyResolver.ts +305 -0
- package/src/utils/plugins/fetchTelemetry.ts +135 -0
- package/src/utils/plugins/gitAvailability.ts +69 -0
- package/src/utils/plugins/headlessPluginInstall.ts +174 -0
- package/src/utils/plugins/hintRecommendation.ts +164 -0
- package/src/utils/plugins/installCounts.ts +292 -0
- package/src/utils/plugins/installedPluginsManager.ts +1268 -0
- package/src/utils/plugins/loadPluginAgents.ts +348 -0
- package/src/utils/plugins/loadPluginCommands.ts +946 -0
- package/src/utils/plugins/loadPluginHooks.ts +287 -0
- package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/src/utils/plugins/lspPluginIntegration.ts +387 -0
- package/src/utils/plugins/lspRecommendation.ts +374 -0
- package/src/utils/plugins/managedPlugins.ts +27 -0
- package/src/utils/plugins/marketplaceHelpers.ts +592 -0
- package/src/utils/plugins/marketplaceManager.ts +2643 -0
- package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/src/utils/plugins/mcpbHandler.ts +968 -0
- package/src/utils/plugins/officialMarketplace.ts +25 -0
- package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/src/utils/plugins/performStartupChecks.tsx +70 -0
- package/src/utils/plugins/pluginAutoupdate.ts +284 -0
- package/src/utils/plugins/pluginBlocklist.ts +127 -0
- package/src/utils/plugins/pluginDirectories.ts +178 -0
- package/src/utils/plugins/pluginFlagging.ts +208 -0
- package/src/utils/plugins/pluginIdentifier.ts +123 -0
- package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/src/utils/plugins/pluginLoader.ts +3302 -0
- package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/src/utils/plugins/pluginPolicy.ts +20 -0
- package/src/utils/plugins/pluginStartupCheck.ts +341 -0
- package/src/utils/plugins/pluginVersioning.ts +157 -0
- package/src/utils/plugins/reconciler.ts +265 -0
- package/src/utils/plugins/refresh.ts +215 -0
- package/src/utils/plugins/schemas.ts +1681 -0
- package/src/utils/plugins/validatePlugin.ts +903 -0
- package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/src/utils/plugins/zipCache.ts +406 -0
- package/src/utils/plugins/zipCacheAdapters.ts +164 -0
- package/src/utils/powershell/dangerousCmdlets.ts +185 -0
- package/src/utils/powershell/parser.ts +1804 -0
- package/src/utils/powershell/staticPrefix.ts +316 -0
- package/src/utils/preflightChecks.tsx +151 -0
- package/src/utils/privacyLevel.ts +55 -0
- package/src/utils/process.ts +68 -0
- package/src/utils/processUserInput/processBashCommand.tsx +140 -0
- package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/src/utils/processUserInput/processTextPrompt.ts +100 -0
- package/src/utils/processUserInput/processUserInput.ts +605 -0
- package/src/utils/profilerBase.ts +46 -0
- package/src/utils/promptCategory.ts +49 -0
- package/src/utils/promptEditor.ts +188 -0
- package/src/utils/promptShellExecution.ts +183 -0
- package/src/utils/proxy.ts +426 -0
- package/src/utils/queryContext.ts +179 -0
- package/src/utils/queryHelpers.ts +552 -0
- package/src/utils/queryProfiler.ts +301 -0
- package/src/utils/queueProcessor.ts +95 -0
- package/src/utils/readEditContext.ts +227 -0
- package/src/utils/readFileInRange.ts +383 -0
- package/src/utils/releaseNotes.ts +360 -0
- package/src/utils/renderOptions.ts +77 -0
- package/src/utils/ripgrep.ts +679 -0
- package/src/utils/sandbox/sandbox-adapter.ts +985 -0
- package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/src/utils/sanitization.ts +91 -0
- package/src/utils/screenshotClipboard.ts +121 -0
- package/src/utils/sdkEventQueue.ts +134 -0
- package/src/utils/secureStorage/fallbackStorage.ts +70 -0
- package/src/utils/secureStorage/index.ts +17 -0
- package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/src/utils/secureStorage/plainTextStorage.ts +84 -0
- package/src/utils/semanticBoolean.ts +29 -0
- package/src/utils/semanticNumber.ts +36 -0
- package/src/utils/semver.ts +59 -0
- package/src/utils/sequential.ts +56 -0
- package/src/utils/sessionActivity.ts +133 -0
- package/src/utils/sessionEnvVars.ts +22 -0
- package/src/utils/sessionEnvironment.ts +166 -0
- package/src/utils/sessionFileAccessHooks.ts +250 -0
- package/src/utils/sessionIngressAuth.ts +140 -0
- package/src/utils/sessionRestore.ts +551 -0
- package/src/utils/sessionStart.ts +232 -0
- package/src/utils/sessionState.ts +150 -0
- package/src/utils/sessionStorage.ts +5105 -0
- package/src/utils/sessionStoragePortable.ts +793 -0
- package/src/utils/sessionTitle.ts +129 -0
- package/src/utils/sessionUrl.ts +64 -0
- package/src/utils/set.ts +53 -0
- package/src/utils/settings/allErrors.ts +32 -0
- package/src/utils/settings/applySettingsChange.ts +92 -0
- package/src/utils/settings/changeDetector.ts +488 -0
- package/src/utils/settings/constants.ts +202 -0
- package/src/utils/settings/internalWrites.ts +37 -0
- package/src/utils/settings/managedPath.ts +34 -0
- package/src/utils/settings/mdm/constants.ts +81 -0
- package/src/utils/settings/mdm/rawRead.ts +130 -0
- package/src/utils/settings/mdm/settings.ts +316 -0
- package/src/utils/settings/permissionValidation.ts +262 -0
- package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/src/utils/settings/schemaOutput.ts +8 -0
- package/src/utils/settings/settings.ts +1015 -0
- package/src/utils/settings/settingsCache.ts +80 -0
- package/src/utils/settings/toolValidationConfig.ts +103 -0
- package/src/utils/settings/types.ts +1148 -0
- package/src/utils/settings/validateEditTool.ts +45 -0
- package/src/utils/settings/validation.ts +265 -0
- package/src/utils/settings/validationTips.ts +164 -0
- package/src/utils/shell/bashProvider.ts +255 -0
- package/src/utils/shell/outputLimits.ts +14 -0
- package/src/utils/shell/powershellDetection.ts +107 -0
- package/src/utils/shell/powershellProvider.ts +123 -0
- package/src/utils/shell/prefix.ts +367 -0
- package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/src/utils/shell/resolveDefaultShell.ts +14 -0
- package/src/utils/shell/shellProvider.ts +33 -0
- package/src/utils/shell/shellToolUtils.ts +22 -0
- package/src/utils/shell/specPrefix.ts +241 -0
- package/src/utils/shellConfig.ts +167 -0
- package/src/utils/sideQuery.ts +222 -0
- package/src/utils/sideQuestion.ts +155 -0
- package/src/utils/signal.ts +43 -0
- package/src/utils/sinks.ts +16 -0
- package/src/utils/skills/skillChangeDetector.ts +311 -0
- package/src/utils/slashCommandParsing.ts +60 -0
- package/src/utils/sleep.ts +84 -0
- package/src/utils/sliceAnsi.ts +91 -0
- package/src/utils/slowOperations.ts +286 -0
- package/src/utils/standaloneAgent.ts +23 -0
- package/src/utils/startupProfiler.ts +194 -0
- package/src/utils/staticRender.tsx +116 -0
- package/src/utils/stats.ts +1061 -0
- package/src/utils/statsCache.ts +434 -0
- package/src/utils/status.tsx +362 -0
- package/src/utils/statusNoticeDefinitions.tsx +198 -0
- package/src/utils/statusNoticeHelpers.ts +20 -0
- package/src/utils/stream.ts +76 -0
- package/src/utils/streamJsonStdoutGuard.ts +123 -0
- package/src/utils/streamlinedTransform.ts +201 -0
- package/src/utils/stringUtils.ts +235 -0
- package/src/utils/subprocessEnv.ts +99 -0
- package/src/utils/suggestions/commandSuggestions.ts +567 -0
- package/src/utils/suggestions/directoryCompletion.ts +263 -0
- package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/src/utils/suggestions/skillUsageTracking.ts +55 -0
- package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/src/utils/swarm/backends/ITermBackend.ts +370 -0
- package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/src/utils/swarm/backends/detection.ts +128 -0
- package/src/utils/swarm/backends/it2Setup.ts +245 -0
- package/src/utils/swarm/backends/registry.ts +464 -0
- package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/src/utils/swarm/backends/types.ts +311 -0
- package/src/utils/swarm/constants.ts +33 -0
- package/src/utils/swarm/inProcessRunner.ts +1552 -0
- package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/src/utils/swarm/permissionSync.ts +928 -0
- package/src/utils/swarm/reconnection.ts +119 -0
- package/src/utils/swarm/spawnInProcess.ts +328 -0
- package/src/utils/swarm/spawnUtils.ts +146 -0
- package/src/utils/swarm/teamHelpers.ts +683 -0
- package/src/utils/swarm/teammateInit.ts +129 -0
- package/src/utils/swarm/teammateLayoutManager.ts +107 -0
- package/src/utils/swarm/teammateModel.ts +10 -0
- package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/src/utils/systemDirectories.ts +74 -0
- package/src/utils/systemPrompt.ts +123 -0
- package/src/utils/systemPromptType.ts +14 -0
- package/src/utils/systemTheme.ts +119 -0
- package/src/utils/taggedId.ts +54 -0
- package/src/utils/task/TaskOutput.ts +390 -0
- package/src/utils/task/diskOutput.ts +451 -0
- package/src/utils/task/framework.ts +308 -0
- package/src/utils/task/outputFormatting.ts +38 -0
- package/src/utils/task/sdkProgress.ts +36 -0
- package/src/utils/tasks.ts +862 -0
- package/src/utils/teamDiscovery.ts +81 -0
- package/src/utils/teamMemoryOps.ts +88 -0
- package/src/utils/teammate.ts +292 -0
- package/src/utils/teammateContext.ts +96 -0
- package/src/utils/teammateMailbox.ts +1183 -0
- package/src/utils/telemetry/betaSessionTracing.ts +491 -0
- package/src/utils/telemetry/bigqueryExporter.ts +252 -0
- package/src/utils/telemetry/events.ts +75 -0
- package/src/utils/telemetry/instrumentation.ts +825 -0
- package/src/utils/telemetry/logger.ts +26 -0
- package/src/utils/telemetry/perfettoTracing.ts +1120 -0
- package/src/utils/telemetry/pluginTelemetry.ts +289 -0
- package/src/utils/telemetry/sessionTracing.ts +927 -0
- package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/src/utils/telemetryAttributes.ts +71 -0
- package/src/utils/teleport/api.ts +466 -0
- package/src/utils/teleport/environmentSelection.ts +77 -0
- package/src/utils/teleport/environments.ts +120 -0
- package/src/utils/teleport/gitBundle.ts +292 -0
- package/src/utils/teleport.tsx +1226 -0
- package/src/utils/tempfile.ts +31 -0
- package/src/utils/terminal.ts +131 -0
- package/src/utils/terminalPanel.ts +191 -0
- package/src/utils/textHighlighting.ts +166 -0
- package/src/utils/theme.ts +639 -0
- package/src/utils/thinking.ts +162 -0
- package/src/utils/timeouts.ts +39 -0
- package/src/utils/tmuxSocket.ts +427 -0
- package/src/utils/todo/types.ts +18 -0
- package/src/utils/tokenBudget.ts +73 -0
- package/src/utils/tokens.ts +261 -0
- package/src/utils/toolErrors.ts +132 -0
- package/src/utils/toolPool.ts +79 -0
- package/src/utils/toolResultStorage.ts +1040 -0
- package/src/utils/toolSchemaCache.ts +26 -0
- package/src/utils/toolSearch.ts +756 -0
- package/src/utils/transcriptSearch.ts +202 -0
- package/src/utils/treeify.ts +170 -0
- package/src/utils/truncate.ts +179 -0
- package/src/utils/ultraplan/ccrSession.ts +349 -0
- package/src/utils/ultraplan/keyword.ts +127 -0
- package/src/utils/ultraplan/prompt.txt +1 -0
- package/src/utils/unaryLogging.ts +39 -0
- package/src/utils/undercover.ts +89 -0
- package/src/utils/user.ts +194 -0
- package/src/utils/userAgent.ts +10 -0
- package/src/utils/userPromptKeywords.ts +27 -0
- package/src/utils/uuid.ts +27 -0
- package/src/utils/warningHandler.ts +121 -0
- package/src/utils/which.ts +82 -0
- package/src/utils/windowsPaths.ts +173 -0
- package/src/utils/withResolvers.ts +13 -0
- package/src/utils/words.ts +800 -0
- package/src/utils/workloadContext.ts +57 -0
- package/src/utils/worktree.ts +1519 -0
- package/src/utils/worktreeModeEnabled.ts +11 -0
- package/src/utils/xdg.ts +65 -0
- package/src/utils/xml.ts +16 -0
- package/src/utils/yaml.ts +15 -0
- package/src/utils/zodToJsonSchema.ts +23 -0
- package/src/vim/motions.ts +82 -0
- package/src/vim/operators.ts +556 -0
- package/src/vim/textObjects.ts +186 -0
- package/src/vim/transitions.ts +490 -0
- package/src/vim/types.ts +199 -0
- package/src/voice/voiceModeEnabled.ts +54 -0
- package/start.js +1 -0
|
@@ -0,0 +1,1817 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import { randomBytes } from 'crypto'
|
|
3
|
+
import { unwatchFile, watchFile } from 'fs'
|
|
4
|
+
import memoize from 'lodash-es/memoize.js'
|
|
5
|
+
import pickBy from 'lodash-es/pickBy.js'
|
|
6
|
+
import { basename, dirname, join, resolve } from 'path'
|
|
7
|
+
import { getOriginalCwd, getSessionTrustAccepted } from '../bootstrap/state.js'
|
|
8
|
+
import { getAutoMemEntrypoint } from '../memdir/paths.js'
|
|
9
|
+
import { logEvent } from '../services/analytics/index.js'
|
|
10
|
+
import type { McpServerConfig } from '../services/mcp/types.js'
|
|
11
|
+
import type {
|
|
12
|
+
BillingType,
|
|
13
|
+
ReferralEligibilityResponse,
|
|
14
|
+
} from '../services/oauth/types.js'
|
|
15
|
+
import { getCwd } from '../utils/cwd.js'
|
|
16
|
+
import { registerCleanup } from './cleanupRegistry.js'
|
|
17
|
+
import { logForDebugging } from './debug.js'
|
|
18
|
+
import { logForDiagnosticsNoPII } from './diagLogs.js'
|
|
19
|
+
import { getGlobalClaudeFile } from './env.js'
|
|
20
|
+
import { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'
|
|
21
|
+
import { ConfigParseError, getErrnoCode } from './errors.js'
|
|
22
|
+
import { writeFileSyncAndFlush_DEPRECATED } from './file.js'
|
|
23
|
+
import { getFsImplementation } from './fsOperations.js'
|
|
24
|
+
import { findCanonicalGitRoot } from './git.js'
|
|
25
|
+
import { safeParseJSON } from './json.js'
|
|
26
|
+
import { stripBOM } from './jsonRead.js'
|
|
27
|
+
import * as lockfile from './lockfile.js'
|
|
28
|
+
import { logError } from './log.js'
|
|
29
|
+
import type { MemoryType } from './memory/types.js'
|
|
30
|
+
import { normalizePathForConfigKey } from './path.js'
|
|
31
|
+
import { getEssentialTrafficOnlyReason } from './privacyLevel.js'
|
|
32
|
+
import { getManagedFilePath } from './settings/managedPath.js'
|
|
33
|
+
import type { ThemeSetting } from './theme.js'
|
|
34
|
+
|
|
35
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
36
|
+
const teamMemPaths = feature('TEAMMEM')
|
|
37
|
+
? (require('../memdir/teamMemPaths.js') as typeof import('../memdir/teamMemPaths.js'))
|
|
38
|
+
: null
|
|
39
|
+
const ccrAutoConnect = feature('CCR_AUTO_CONNECT')
|
|
40
|
+
? (require('../bridge/bridgeEnabled.js') as typeof import('../bridge/bridgeEnabled.js'))
|
|
41
|
+
: null
|
|
42
|
+
|
|
43
|
+
/* eslint-enable @typescript-eslint/no-require-imports */
|
|
44
|
+
import type { ImageDimensions } from './imageResizer.js'
|
|
45
|
+
import type { ModelOption } from './model/modelOptions.js'
|
|
46
|
+
import { jsonParse, jsonStringify } from './slowOperations.js'
|
|
47
|
+
|
|
48
|
+
// Re-entrancy guard: prevents getConfig → logEvent → getGlobalConfig → getConfig
|
|
49
|
+
// infinite recursion when the config file is corrupted. logEvent's sampling check
|
|
50
|
+
// reads GrowthBook features from the global config, which calls getConfig again.
|
|
51
|
+
let insideGetConfig = false
|
|
52
|
+
|
|
53
|
+
// Image dimension info for coordinate mapping (only set when image was resized)
|
|
54
|
+
export type PastedContent = {
|
|
55
|
+
id: number // Sequential numeric ID
|
|
56
|
+
type: 'text' | 'image'
|
|
57
|
+
content: string
|
|
58
|
+
mediaType?: string // e.g., 'image/png', 'image/jpeg'
|
|
59
|
+
filename?: string // Display name for images in attachment slot
|
|
60
|
+
dimensions?: ImageDimensions
|
|
61
|
+
sourcePath?: string // Original file path for images dragged onto the terminal
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SerializedStructuredHistoryEntry {
|
|
65
|
+
display: string
|
|
66
|
+
pastedContents?: Record<number, PastedContent>
|
|
67
|
+
pastedText?: string
|
|
68
|
+
}
|
|
69
|
+
export interface HistoryEntry {
|
|
70
|
+
display: string
|
|
71
|
+
pastedContents: Record<number, PastedContent>
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type ReleaseChannel = 'stable' | 'latest'
|
|
75
|
+
|
|
76
|
+
export type ProjectConfig = {
|
|
77
|
+
allowedTools: string[]
|
|
78
|
+
mcpContextUris: string[]
|
|
79
|
+
mcpServers?: Record<string, McpServerConfig>
|
|
80
|
+
lastAPIDuration?: number
|
|
81
|
+
lastAPIDurationWithoutRetries?: number
|
|
82
|
+
lastToolDuration?: number
|
|
83
|
+
lastCost?: number
|
|
84
|
+
lastDuration?: number
|
|
85
|
+
lastLinesAdded?: number
|
|
86
|
+
lastLinesRemoved?: number
|
|
87
|
+
lastTotalInputTokens?: number
|
|
88
|
+
lastTotalOutputTokens?: number
|
|
89
|
+
lastTotalCacheCreationInputTokens?: number
|
|
90
|
+
lastTotalCacheReadInputTokens?: number
|
|
91
|
+
lastTotalWebSearchRequests?: number
|
|
92
|
+
lastFpsAverage?: number
|
|
93
|
+
lastFpsLow1Pct?: number
|
|
94
|
+
lastSessionId?: string
|
|
95
|
+
lastModelUsage?: Record<
|
|
96
|
+
string,
|
|
97
|
+
{
|
|
98
|
+
inputTokens: number
|
|
99
|
+
outputTokens: number
|
|
100
|
+
cacheReadInputTokens: number
|
|
101
|
+
cacheCreationInputTokens: number
|
|
102
|
+
webSearchRequests: number
|
|
103
|
+
costUSD: number
|
|
104
|
+
}
|
|
105
|
+
>
|
|
106
|
+
lastSessionMetrics?: Record<string, number>
|
|
107
|
+
exampleFiles?: string[]
|
|
108
|
+
exampleFilesGeneratedAt?: number
|
|
109
|
+
|
|
110
|
+
// Trust dialog settings
|
|
111
|
+
hasTrustDialogAccepted?: boolean
|
|
112
|
+
|
|
113
|
+
hasCompletedProjectOnboarding?: boolean
|
|
114
|
+
projectOnboardingSeenCount: number
|
|
115
|
+
hasClaudeMdExternalIncludesApproved?: boolean
|
|
116
|
+
hasClaudeMdExternalIncludesWarningShown?: boolean
|
|
117
|
+
// MCP server approval fields - migrated to settings but kept for backward compatibility
|
|
118
|
+
enabledMcpjsonServers?: string[]
|
|
119
|
+
disabledMcpjsonServers?: string[]
|
|
120
|
+
enableAllProjectMcpServers?: boolean
|
|
121
|
+
// List of disabled MCP servers (all scopes) - used for enable/disable toggle
|
|
122
|
+
disabledMcpServers?: string[]
|
|
123
|
+
// Opt-in list for built-in MCP servers that default to disabled
|
|
124
|
+
enabledMcpServers?: string[]
|
|
125
|
+
// Worktree session management
|
|
126
|
+
activeWorktreeSession?: {
|
|
127
|
+
originalCwd: string
|
|
128
|
+
worktreePath: string
|
|
129
|
+
worktreeName: string
|
|
130
|
+
originalBranch?: string
|
|
131
|
+
sessionId: string
|
|
132
|
+
hookBased?: boolean
|
|
133
|
+
}
|
|
134
|
+
/** Spawn mode for `claude remote-control` multi-session. Set by first-run dialog or `w` toggle. */
|
|
135
|
+
remoteControlSpawnMode?: 'same-dir' | 'worktree'
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const DEFAULT_PROJECT_CONFIG: ProjectConfig = {
|
|
139
|
+
allowedTools: [],
|
|
140
|
+
mcpContextUris: [],
|
|
141
|
+
mcpServers: {},
|
|
142
|
+
enabledMcpjsonServers: [],
|
|
143
|
+
disabledMcpjsonServers: [],
|
|
144
|
+
hasTrustDialogAccepted: false,
|
|
145
|
+
projectOnboardingSeenCount: 0,
|
|
146
|
+
hasClaudeMdExternalIncludesApproved: false,
|
|
147
|
+
hasClaudeMdExternalIncludesWarningShown: false,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type InstallMethod = 'local' | 'native' | 'global' | 'unknown'
|
|
151
|
+
|
|
152
|
+
export {
|
|
153
|
+
EDITOR_MODES,
|
|
154
|
+
NOTIFICATION_CHANNELS,
|
|
155
|
+
} from './configConstants.js'
|
|
156
|
+
|
|
157
|
+
import type { EDITOR_MODES, NOTIFICATION_CHANNELS } from './configConstants.js'
|
|
158
|
+
|
|
159
|
+
export type NotificationChannel = (typeof NOTIFICATION_CHANNELS)[number]
|
|
160
|
+
|
|
161
|
+
export type AccountInfo = {
|
|
162
|
+
accountUuid: string
|
|
163
|
+
emailAddress: string
|
|
164
|
+
organizationUuid?: string
|
|
165
|
+
organizationName?: string | null // added 4/23/2025, not populated for existing users
|
|
166
|
+
organizationRole?: string | null
|
|
167
|
+
workspaceRole?: string | null
|
|
168
|
+
// Populated by /api/oauth/profile
|
|
169
|
+
displayName?: string
|
|
170
|
+
hasExtraUsageEnabled?: boolean
|
|
171
|
+
billingType?: BillingType | null
|
|
172
|
+
accountCreatedAt?: string
|
|
173
|
+
subscriptionCreatedAt?: string
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// TODO: 'emacs' is kept for backward compatibility - remove after a few releases
|
|
177
|
+
export type EditorMode = 'emacs' | (typeof EDITOR_MODES)[number]
|
|
178
|
+
|
|
179
|
+
export type DiffTool = 'terminal' | 'auto'
|
|
180
|
+
|
|
181
|
+
export type OutputStyle = string
|
|
182
|
+
|
|
183
|
+
export type GlobalConfig = {
|
|
184
|
+
/**
|
|
185
|
+
* @deprecated Use settings.apiKeyHelper instead.
|
|
186
|
+
*/
|
|
187
|
+
apiKeyHelper?: string
|
|
188
|
+
projects?: Record<string, ProjectConfig>
|
|
189
|
+
numStartups: number
|
|
190
|
+
installMethod?: InstallMethod
|
|
191
|
+
autoUpdates?: boolean
|
|
192
|
+
// Flag to distinguish protection-based disabling from user preference
|
|
193
|
+
autoUpdatesProtectedForNative?: boolean
|
|
194
|
+
// Session count when Doctor was last shown
|
|
195
|
+
doctorShownAtSession?: number
|
|
196
|
+
userID?: string
|
|
197
|
+
theme: ThemeSetting
|
|
198
|
+
hasCompletedOnboarding?: boolean
|
|
199
|
+
// Tracks the last version that reset onboarding, used with MIN_VERSION_REQUIRING_ONBOARDING_RESET
|
|
200
|
+
lastOnboardingVersion?: string
|
|
201
|
+
// Tracks the last version for which release notes were seen, used for managing release notes
|
|
202
|
+
lastReleaseNotesSeen?: string
|
|
203
|
+
// Timestamp when changelog was last fetched (content stored in ~/.claude/cache/changelog.md)
|
|
204
|
+
changelogLastFetched?: number
|
|
205
|
+
// @deprecated - Migrated to ~/.claude/cache/changelog.md. Keep for migration support.
|
|
206
|
+
cachedChangelog?: string
|
|
207
|
+
mcpServers?: Record<string, McpServerConfig>
|
|
208
|
+
// claude.ai MCP connectors that have successfully connected at least once.
|
|
209
|
+
// Used to gate "connector unavailable" / "needs auth" startup notifications:
|
|
210
|
+
// a connector the user has actually used is worth flagging when it breaks,
|
|
211
|
+
// but an org-configured connector that's been needs-auth since day one is
|
|
212
|
+
// something the user has demonstrably ignored and shouldn't nag about.
|
|
213
|
+
claudeAiMcpEverConnected?: string[]
|
|
214
|
+
preferredNotifChannel: NotificationChannel
|
|
215
|
+
/**
|
|
216
|
+
* @deprecated. Use the Notification hook instead (docs/hooks.md).
|
|
217
|
+
*/
|
|
218
|
+
customNotifyCommand?: string
|
|
219
|
+
verbose: boolean
|
|
220
|
+
customApiKeyResponses?: {
|
|
221
|
+
approved?: string[]
|
|
222
|
+
rejected?: string[]
|
|
223
|
+
}
|
|
224
|
+
primaryApiKey?: string // Primary API key for the user when no environment variable is set, set via oauth (TODO: rename)
|
|
225
|
+
hasAcknowledgedCostThreshold?: boolean
|
|
226
|
+
hasSeenUndercoverAutoNotice?: boolean // ant-only: whether the one-time auto-undercover explainer has been shown
|
|
227
|
+
hasSeenUltraplanTerms?: boolean // ant-only: whether the one-time CCR terms notice has been shown in the ultraplan launch dialog
|
|
228
|
+
hasResetAutoModeOptInForDefaultOffer?: boolean // ant-only: one-shot migration guard, re-prompts churned auto-mode users
|
|
229
|
+
oauthAccount?: AccountInfo
|
|
230
|
+
iterm2KeyBindingInstalled?: boolean // Legacy - keeping for backward compatibility
|
|
231
|
+
editorMode?: EditorMode
|
|
232
|
+
bypassPermissionsModeAccepted?: boolean
|
|
233
|
+
hasUsedBackslashReturn?: boolean
|
|
234
|
+
autoCompactEnabled: boolean // Controls whether auto-compact is enabled
|
|
235
|
+
showTurnDuration: boolean // Controls whether to show turn duration message (e.g., "Cooked for 1m 6s")
|
|
236
|
+
/**
|
|
237
|
+
* @deprecated Use settings.env instead.
|
|
238
|
+
*/
|
|
239
|
+
env: { [key: string]: string } // Environment variables to set for the CLI
|
|
240
|
+
hasSeenTasksHint?: boolean // Whether the user has seen the tasks hint
|
|
241
|
+
hasUsedStash?: boolean // Whether the user has used the stash feature (Ctrl+S)
|
|
242
|
+
hasUsedBackgroundTask?: boolean // Whether the user has backgrounded a task (Ctrl+B)
|
|
243
|
+
queuedCommandUpHintCount?: number // Counter for how many times the user has seen the queued command up hint
|
|
244
|
+
diffTool?: DiffTool // Which tool to use for displaying diffs (terminal or vscode)
|
|
245
|
+
|
|
246
|
+
// Terminal setup state tracking
|
|
247
|
+
iterm2SetupInProgress?: boolean
|
|
248
|
+
iterm2BackupPath?: string // Path to the backup file for iTerm2 preferences
|
|
249
|
+
appleTerminalBackupPath?: string // Path to the backup file for Terminal.app preferences
|
|
250
|
+
appleTerminalSetupInProgress?: boolean // Whether Terminal.app setup is currently in progress
|
|
251
|
+
|
|
252
|
+
// Key binding setup tracking
|
|
253
|
+
shiftEnterKeyBindingInstalled?: boolean // Whether Shift+Enter key binding is installed (for iTerm2 or VSCode)
|
|
254
|
+
optionAsMetaKeyInstalled?: boolean // Whether Option as Meta key is installed (for Terminal.app)
|
|
255
|
+
|
|
256
|
+
// IDE configurations
|
|
257
|
+
autoConnectIde?: boolean // Whether to automatically connect to IDE on startup if exactly one valid IDE is available
|
|
258
|
+
autoInstallIdeExtension?: boolean // Whether to automatically install IDE extensions when running from within an IDE
|
|
259
|
+
|
|
260
|
+
// IDE dialogs
|
|
261
|
+
hasIdeOnboardingBeenShown?: Record<string, boolean> // Map of terminal name to whether IDE onboarding has been shown
|
|
262
|
+
ideHintShownCount?: number // Number of times the /ide command hint has been shown
|
|
263
|
+
hasIdeAutoConnectDialogBeenShown?: boolean // Whether the auto-connect IDE dialog has been shown
|
|
264
|
+
|
|
265
|
+
tipsHistory: {
|
|
266
|
+
[tipId: string]: number // Key is tipId, value is the numStartups when tip was last shown
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// /buddy companion soul — bones regenerated from userId on read. See src/buddy/.
|
|
270
|
+
companion?: import('../buddy/types.js').StoredCompanion
|
|
271
|
+
companionMuted?: boolean
|
|
272
|
+
|
|
273
|
+
// Feedback survey tracking
|
|
274
|
+
feedbackSurveyState?: {
|
|
275
|
+
lastShownTime?: number
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Transcript share prompt tracking ("Don't ask again")
|
|
279
|
+
transcriptShareDismissed?: boolean
|
|
280
|
+
|
|
281
|
+
// Memory usage tracking
|
|
282
|
+
memoryUsageCount: number // Number of times user has added to memory
|
|
283
|
+
|
|
284
|
+
// Sonnet-1M configs
|
|
285
|
+
hasShownS1MWelcomeV2?: Record<string, boolean> // Whether the Sonnet-1M v2 welcome message has been shown per org
|
|
286
|
+
// Cache of Sonnet-1M subscriber access per org - key is org ID
|
|
287
|
+
// hasAccess means "hasAccessAsDefault" but the old name is kept for backward
|
|
288
|
+
// compatibility.
|
|
289
|
+
s1mAccessCache?: Record<
|
|
290
|
+
string,
|
|
291
|
+
{ hasAccess: boolean; hasAccessNotAsDefault?: boolean; timestamp: number }
|
|
292
|
+
>
|
|
293
|
+
// Cache of Sonnet-1M PayG access per org - key is org ID
|
|
294
|
+
// hasAccess means "hasAccessAsDefault" but the old name is kept for backward
|
|
295
|
+
// compatibility.
|
|
296
|
+
s1mNonSubscriberAccessCache?: Record<
|
|
297
|
+
string,
|
|
298
|
+
{ hasAccess: boolean; hasAccessNotAsDefault?: boolean; timestamp: number }
|
|
299
|
+
>
|
|
300
|
+
|
|
301
|
+
// Guest passes eligibility cache per org - key is org ID
|
|
302
|
+
passesEligibilityCache?: Record<
|
|
303
|
+
string,
|
|
304
|
+
ReferralEligibilityResponse & { timestamp: number }
|
|
305
|
+
>
|
|
306
|
+
|
|
307
|
+
// Grove config cache per account - key is account UUID
|
|
308
|
+
groveConfigCache?: Record<
|
|
309
|
+
string,
|
|
310
|
+
{ grove_enabled: boolean; timestamp: number }
|
|
311
|
+
>
|
|
312
|
+
|
|
313
|
+
// Guest passes upsell tracking
|
|
314
|
+
passesUpsellSeenCount?: number // Number of times the guest passes upsell has been shown
|
|
315
|
+
hasVisitedPasses?: boolean // Whether the user has visited /passes command
|
|
316
|
+
passesLastSeenRemaining?: number // Last seen remaining_passes count — reset upsell when it increases
|
|
317
|
+
|
|
318
|
+
// Overage credit grant upsell tracking (keyed by org UUID — multi-org users).
|
|
319
|
+
// Inlined shape (not import()) because config.ts is in the SDK build surface
|
|
320
|
+
// and the SDK bundler can't resolve CLI service modules.
|
|
321
|
+
overageCreditGrantCache?: Record<
|
|
322
|
+
string,
|
|
323
|
+
{
|
|
324
|
+
info: {
|
|
325
|
+
available: boolean
|
|
326
|
+
eligible: boolean
|
|
327
|
+
granted: boolean
|
|
328
|
+
amount_minor_units: number | null
|
|
329
|
+
currency: string | null
|
|
330
|
+
}
|
|
331
|
+
timestamp: number
|
|
332
|
+
}
|
|
333
|
+
>
|
|
334
|
+
overageCreditUpsellSeenCount?: number // Number of times the overage credit upsell has been shown
|
|
335
|
+
hasVisitedExtraUsage?: boolean // Whether the user has visited /extra-usage — hides credit upsells
|
|
336
|
+
|
|
337
|
+
// Voice mode notice tracking
|
|
338
|
+
voiceNoticeSeenCount?: number // Number of times the voice-mode-available notice has been shown
|
|
339
|
+
voiceLangHintShownCount?: number // Number of times the /voice dictation-language hint has been shown
|
|
340
|
+
voiceLangHintLastLanguage?: string // Resolved STT language code when the hint was last shown — reset count when it changes
|
|
341
|
+
voiceFooterHintSeenCount?: number // Number of sessions the "hold X to speak" footer hint has been shown
|
|
342
|
+
|
|
343
|
+
// Opus 1M merge notice tracking
|
|
344
|
+
opus1mMergeNoticeSeenCount?: number // Number of times the opus-1m-merge notice has been shown
|
|
345
|
+
|
|
346
|
+
// Experiment enrollment notice tracking (keyed by experiment id)
|
|
347
|
+
experimentNoticesSeenCount?: Record<string, number>
|
|
348
|
+
|
|
349
|
+
// OpusPlan experiment config
|
|
350
|
+
hasShownOpusPlanWelcome?: Record<string, boolean> // Whether the OpusPlan welcome message has been shown per org
|
|
351
|
+
|
|
352
|
+
// Queue usage tracking
|
|
353
|
+
promptQueueUseCount: number // Number of times use has used the prompt queue
|
|
354
|
+
|
|
355
|
+
// Btw usage tracking
|
|
356
|
+
btwUseCount: number // Number of times user has used /btw
|
|
357
|
+
|
|
358
|
+
// Plan mode usage tracking
|
|
359
|
+
lastPlanModeUse?: number // Timestamp of last plan mode usage
|
|
360
|
+
|
|
361
|
+
// Subscription notice tracking
|
|
362
|
+
subscriptionNoticeCount?: number // Number of times the subscription notice has been shown
|
|
363
|
+
hasAvailableSubscription?: boolean // Cached result of whether user has a subscription available
|
|
364
|
+
subscriptionUpsellShownCount?: number // Number of times the subscription upsell has been shown (deprecated)
|
|
365
|
+
recommendedSubscription?: string // Cached config value from Statsig (deprecated)
|
|
366
|
+
|
|
367
|
+
// Todo feature configuration
|
|
368
|
+
todoFeatureEnabled: boolean // Whether the todo feature is enabled
|
|
369
|
+
showExpandedTodos?: boolean // Whether to show todos expanded, even when empty
|
|
370
|
+
showSpinnerTree?: boolean // Whether to show the teammate spinner tree instead of pills
|
|
371
|
+
|
|
372
|
+
// First start time tracking
|
|
373
|
+
firstStartTime?: string // ISO timestamp when Claude Code was first started on this machine
|
|
374
|
+
|
|
375
|
+
messageIdleNotifThresholdMs: number // How long the user has to have been idle to get a notification that Claude is done generating
|
|
376
|
+
|
|
377
|
+
githubActionSetupCount?: number // Number of times the user has set up the GitHub Action
|
|
378
|
+
slackAppInstallCount?: number // Number of times the user has clicked to install the Slack app
|
|
379
|
+
|
|
380
|
+
// File checkpointing configuration
|
|
381
|
+
fileCheckpointingEnabled: boolean
|
|
382
|
+
|
|
383
|
+
// Terminal progress bar configuration (OSC 9;4)
|
|
384
|
+
terminalProgressBarEnabled: boolean
|
|
385
|
+
|
|
386
|
+
// Terminal tab status indicator (OSC 21337). When on, emits a colored
|
|
387
|
+
// dot + status text to the tab sidebar and drops the spinner prefix
|
|
388
|
+
// from the title (the dot makes it redundant).
|
|
389
|
+
showStatusInTerminalTab?: boolean
|
|
390
|
+
|
|
391
|
+
// Push-notification toggles (set via /config). Default off — explicit opt-in required.
|
|
392
|
+
taskCompleteNotifEnabled?: boolean
|
|
393
|
+
inputNeededNotifEnabled?: boolean
|
|
394
|
+
agentPushNotifEnabled?: boolean
|
|
395
|
+
|
|
396
|
+
// Claude Code usage tracking
|
|
397
|
+
claudeCodeFirstTokenDate?: string // ISO timestamp of the user's first Claude Code OAuth token
|
|
398
|
+
|
|
399
|
+
// Model switch callout tracking (ant-only)
|
|
400
|
+
modelSwitchCalloutDismissed?: boolean // Whether user chose "Don't show again"
|
|
401
|
+
modelSwitchCalloutLastShown?: number // Timestamp of last shown (don't show for 24h)
|
|
402
|
+
modelSwitchCalloutVersion?: string
|
|
403
|
+
|
|
404
|
+
// Effort callout tracking - shown once for Opus 4.6 users
|
|
405
|
+
effortCalloutDismissed?: boolean // v1 - legacy, read to suppress v2 for Pro users who already saw it
|
|
406
|
+
effortCalloutV2Dismissed?: boolean
|
|
407
|
+
|
|
408
|
+
// Remote callout tracking - shown once before first bridge enable
|
|
409
|
+
remoteDialogSeen?: boolean
|
|
410
|
+
|
|
411
|
+
// Cross-process backoff for initReplBridge's oauth_expired_unrefreshable skip.
|
|
412
|
+
// `expiresAt` is the dedup key — content-addressed, self-clears when /login
|
|
413
|
+
// replaces the token. `failCount` caps false positives: transient refresh
|
|
414
|
+
// failures (auth server 5xx, lock errors) get 3 retries before backoff kicks
|
|
415
|
+
// in, mirroring useReplBridge's MAX_CONSECUTIVE_INIT_FAILURES. Dead-token
|
|
416
|
+
// accounts cap at 3 config writes; healthy+transient-blip self-heals in ~210s.
|
|
417
|
+
bridgeOauthDeadExpiresAt?: number
|
|
418
|
+
bridgeOauthDeadFailCount?: number
|
|
419
|
+
|
|
420
|
+
// Desktop upsell startup dialog tracking
|
|
421
|
+
desktopUpsellSeenCount?: number // Total showings (max 3)
|
|
422
|
+
desktopUpsellDismissed?: boolean // "Don't ask again" picked
|
|
423
|
+
|
|
424
|
+
// Idle-return dialog tracking
|
|
425
|
+
idleReturnDismissed?: boolean // "Don't ask again" picked
|
|
426
|
+
|
|
427
|
+
// Opus 4.5 Pro migration tracking
|
|
428
|
+
opusProMigrationComplete?: boolean
|
|
429
|
+
opusProMigrationTimestamp?: number
|
|
430
|
+
|
|
431
|
+
// Sonnet 4.5 1m migration tracking
|
|
432
|
+
sonnet1m45MigrationComplete?: boolean
|
|
433
|
+
|
|
434
|
+
// Opus 4.0/4.1 → current Opus migration (shows one-time notif)
|
|
435
|
+
legacyOpusMigrationTimestamp?: number
|
|
436
|
+
|
|
437
|
+
// Sonnet 4.5 → 4.6 migration (pro/max/team premium)
|
|
438
|
+
sonnet45To46MigrationTimestamp?: number
|
|
439
|
+
|
|
440
|
+
// Cached statsig gate values
|
|
441
|
+
cachedStatsigGates: {
|
|
442
|
+
[gateName: string]: boolean
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Cached statsig dynamic configs
|
|
446
|
+
cachedDynamicConfigs?: { [configName: string]: unknown }
|
|
447
|
+
|
|
448
|
+
// Cached GrowthBook feature values
|
|
449
|
+
cachedGrowthBookFeatures?: { [featureName: string]: unknown }
|
|
450
|
+
|
|
451
|
+
// Local GrowthBook overrides (ant-only, set via /config Gates tab).
|
|
452
|
+
// Checked after env-var overrides but before the real resolved value.
|
|
453
|
+
growthBookOverrides?: { [featureName: string]: unknown }
|
|
454
|
+
|
|
455
|
+
// Emergency tip tracking - stores the last shown tip to prevent re-showing
|
|
456
|
+
lastShownEmergencyTip?: string
|
|
457
|
+
|
|
458
|
+
// File picker gitignore behavior
|
|
459
|
+
respectGitignore: boolean // Whether file picker should respect .gitignore files (default: true). Note: .ignore files are always respected
|
|
460
|
+
|
|
461
|
+
// Copy command behavior
|
|
462
|
+
copyFullResponse: boolean // Whether /copy always copies the full response instead of showing the picker
|
|
463
|
+
|
|
464
|
+
// Fullscreen in-app text selection behavior
|
|
465
|
+
copyOnSelect?: boolean // Auto-copy to clipboard on mouse-up (undefined → true; lets cmd+c "work" via no-op)
|
|
466
|
+
|
|
467
|
+
// GitHub repo path mapping for teleport directory switching
|
|
468
|
+
// Key: "owner/repo" (lowercase), Value: array of absolute paths where repo is cloned
|
|
469
|
+
githubRepoPaths?: Record<string, string[]>
|
|
470
|
+
|
|
471
|
+
// Terminal emulator to launch for claude-cli:// deep links. Captured from
|
|
472
|
+
// TERM_PROGRAM during interactive sessions since the deep link handler runs
|
|
473
|
+
// headless (LaunchServices/xdg) with no TERM_PROGRAM set.
|
|
474
|
+
deepLinkTerminal?: string
|
|
475
|
+
|
|
476
|
+
// iTerm2 it2 CLI setup
|
|
477
|
+
iterm2It2SetupComplete?: boolean // Whether it2 setup has been verified
|
|
478
|
+
preferTmuxOverIterm2?: boolean // User preference to always use tmux over iTerm2 split panes
|
|
479
|
+
|
|
480
|
+
// Skill usage tracking for autocomplete ranking
|
|
481
|
+
skillUsage?: Record<string, { usageCount: number; lastUsedAt: number }>
|
|
482
|
+
// Official marketplace auto-install tracking
|
|
483
|
+
officialMarketplaceAutoInstallAttempted?: boolean // Whether auto-install was attempted
|
|
484
|
+
officialMarketplaceAutoInstalled?: boolean // Whether auto-install succeeded
|
|
485
|
+
officialMarketplaceAutoInstallFailReason?:
|
|
486
|
+
| 'policy_blocked'
|
|
487
|
+
| 'git_unavailable'
|
|
488
|
+
| 'gcs_unavailable'
|
|
489
|
+
| 'unknown' // Reason for failure if applicable
|
|
490
|
+
officialMarketplaceAutoInstallRetryCount?: number // Number of retry attempts
|
|
491
|
+
officialMarketplaceAutoInstallLastAttemptTime?: number // Timestamp of last attempt
|
|
492
|
+
officialMarketplaceAutoInstallNextRetryTime?: number // Earliest time to retry again
|
|
493
|
+
|
|
494
|
+
// Claude in Chrome settings
|
|
495
|
+
hasCompletedClaudeInChromeOnboarding?: boolean // Whether Claude in Chrome onboarding has been shown
|
|
496
|
+
claudeInChromeDefaultEnabled?: boolean // Whether Claude in Chrome is enabled by default (undefined means platform default)
|
|
497
|
+
cachedChromeExtensionInstalled?: boolean // Cached result of whether Chrome extension is installed
|
|
498
|
+
|
|
499
|
+
// Chrome extension pairing state (persisted across sessions)
|
|
500
|
+
chromeExtension?: {
|
|
501
|
+
pairedDeviceId?: string
|
|
502
|
+
pairedDeviceName?: string
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// LSP plugin recommendation preferences
|
|
506
|
+
lspRecommendationDisabled?: boolean // Disable all LSP plugin recommendations
|
|
507
|
+
lspRecommendationNeverPlugins?: string[] // Plugin IDs to never suggest
|
|
508
|
+
lspRecommendationIgnoredCount?: number // Track ignored recommendations (stops after 5)
|
|
509
|
+
|
|
510
|
+
// Claude Code hint protocol state (<claude-code-hint /> tags from CLIs/SDKs).
|
|
511
|
+
// Nested by hint type so future types (docs, mcp, ...) slot in without new
|
|
512
|
+
// top-level keys.
|
|
513
|
+
claudeCodeHints?: {
|
|
514
|
+
// Plugin IDs the user has already been prompted for. Show-once semantics:
|
|
515
|
+
// recorded regardless of yes/no response, never re-prompted. Capped at
|
|
516
|
+
// 100 entries to bound config growth — past that, hints stop entirely.
|
|
517
|
+
plugin?: string[]
|
|
518
|
+
// User chose "don't show plugin installation hints again" from the dialog.
|
|
519
|
+
disabled?: boolean
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Permission explainer configuration
|
|
523
|
+
permissionExplainerEnabled?: boolean // Enable Haiku-generated explanations for permission requests (default: true)
|
|
524
|
+
|
|
525
|
+
// Teammate spawn mode: 'auto' | 'tmux' | 'in-process'
|
|
526
|
+
teammateMode?: 'auto' | 'tmux' | 'in-process' // How to spawn teammates (default: 'auto')
|
|
527
|
+
// Model for new teammates when the tool call doesn't pass one.
|
|
528
|
+
// undefined = hardcoded Opus (backward-compat); null = leader's model; string = model alias/ID.
|
|
529
|
+
teammateDefaultModel?: string | null
|
|
530
|
+
|
|
531
|
+
// PR status footer configuration (feature-flagged via GrowthBook)
|
|
532
|
+
prStatusFooterEnabled?: boolean // Show PR review status in footer (default: true)
|
|
533
|
+
|
|
534
|
+
// Tmux live panel visibility (ant-only, toggled via Enter on tmux pill)
|
|
535
|
+
tungstenPanelVisible?: boolean
|
|
536
|
+
|
|
537
|
+
// Cached org-level fast mode status from the API.
|
|
538
|
+
// Used to detect cross-session changes and notify users.
|
|
539
|
+
penguinModeOrgEnabled?: boolean
|
|
540
|
+
|
|
541
|
+
// Epoch ms when background refreshes last ran (fast mode, quota, passes, client data).
|
|
542
|
+
// Used with tengu_cicada_nap_ms to throttle API calls
|
|
543
|
+
startupPrefetchedAt?: number
|
|
544
|
+
|
|
545
|
+
// Run Remote Control at startup (requires BRIDGE_MODE)
|
|
546
|
+
// undefined = use default (see getRemoteControlAtStartup() for precedence)
|
|
547
|
+
remoteControlAtStartup?: boolean
|
|
548
|
+
|
|
549
|
+
// Cached extra usage disabled reason from the last API response
|
|
550
|
+
// undefined = no cache, null = extra usage enabled, string = disabled reason.
|
|
551
|
+
cachedExtraUsageDisabledReason?: string | null
|
|
552
|
+
|
|
553
|
+
// Auto permissions notification tracking (ant-only)
|
|
554
|
+
autoPermissionsNotificationCount?: number // Number of times the auto permissions notification has been shown
|
|
555
|
+
|
|
556
|
+
// Speculation configuration (ant-only)
|
|
557
|
+
speculationEnabled?: boolean // Whether speculation is enabled (default: true)
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
// Client data for server-side experiments (fetched during bootstrap).
|
|
561
|
+
clientDataCache?: Record<string, unknown> | null
|
|
562
|
+
|
|
563
|
+
// Additional model options for the model picker (fetched during bootstrap).
|
|
564
|
+
additionalModelOptionsCache?: ModelOption[]
|
|
565
|
+
|
|
566
|
+
// Disk cache for /api/claude_code/organizations/metrics_enabled.
|
|
567
|
+
// Org-level settings change rarely; persisting across processes avoids a
|
|
568
|
+
// cold API call on every `claude -p` invocation.
|
|
569
|
+
metricsStatusCache?: {
|
|
570
|
+
enabled: boolean
|
|
571
|
+
timestamp: number
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Version of the last-applied migration set. When equal to
|
|
575
|
+
// CURRENT_MIGRATION_VERSION, runMigrations() skips all sync migrations
|
|
576
|
+
// (avoiding 11× saveGlobalConfig lock+re-read on every startup).
|
|
577
|
+
migrationVersion?: number
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Factory for a fresh default GlobalConfig. Used instead of deep-cloning a
|
|
582
|
+
* shared constant — the nested containers (arrays, records) are all empty, so
|
|
583
|
+
* a factory gives fresh refs at zero clone cost.
|
|
584
|
+
*/
|
|
585
|
+
function createDefaultGlobalConfig(): GlobalConfig {
|
|
586
|
+
return {
|
|
587
|
+
numStartups: 0,
|
|
588
|
+
installMethod: undefined,
|
|
589
|
+
autoUpdates: undefined,
|
|
590
|
+
theme: 'dark',
|
|
591
|
+
preferredNotifChannel: 'auto',
|
|
592
|
+
verbose: false,
|
|
593
|
+
editorMode: 'normal',
|
|
594
|
+
autoCompactEnabled: true,
|
|
595
|
+
showTurnDuration: true,
|
|
596
|
+
hasSeenTasksHint: false,
|
|
597
|
+
hasUsedStash: false,
|
|
598
|
+
hasUsedBackgroundTask: false,
|
|
599
|
+
queuedCommandUpHintCount: 0,
|
|
600
|
+
diffTool: 'auto',
|
|
601
|
+
customApiKeyResponses: {
|
|
602
|
+
approved: [],
|
|
603
|
+
rejected: [],
|
|
604
|
+
},
|
|
605
|
+
env: {},
|
|
606
|
+
tipsHistory: {},
|
|
607
|
+
memoryUsageCount: 0,
|
|
608
|
+
promptQueueUseCount: 0,
|
|
609
|
+
btwUseCount: 0,
|
|
610
|
+
todoFeatureEnabled: true,
|
|
611
|
+
showExpandedTodos: false,
|
|
612
|
+
messageIdleNotifThresholdMs: 60000,
|
|
613
|
+
autoConnectIde: false,
|
|
614
|
+
autoInstallIdeExtension: true,
|
|
615
|
+
fileCheckpointingEnabled: true,
|
|
616
|
+
terminalProgressBarEnabled: true,
|
|
617
|
+
cachedStatsigGates: {},
|
|
618
|
+
cachedDynamicConfigs: {},
|
|
619
|
+
cachedGrowthBookFeatures: {},
|
|
620
|
+
respectGitignore: true,
|
|
621
|
+
copyFullResponse: false,
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
export const DEFAULT_GLOBAL_CONFIG: GlobalConfig = createDefaultGlobalConfig()
|
|
626
|
+
|
|
627
|
+
export const GLOBAL_CONFIG_KEYS = [
|
|
628
|
+
'apiKeyHelper',
|
|
629
|
+
'installMethod',
|
|
630
|
+
'autoUpdates',
|
|
631
|
+
'autoUpdatesProtectedForNative',
|
|
632
|
+
'theme',
|
|
633
|
+
'verbose',
|
|
634
|
+
'preferredNotifChannel',
|
|
635
|
+
'shiftEnterKeyBindingInstalled',
|
|
636
|
+
'editorMode',
|
|
637
|
+
'hasUsedBackslashReturn',
|
|
638
|
+
'autoCompactEnabled',
|
|
639
|
+
'showTurnDuration',
|
|
640
|
+
'diffTool',
|
|
641
|
+
'env',
|
|
642
|
+
'tipsHistory',
|
|
643
|
+
'todoFeatureEnabled',
|
|
644
|
+
'showExpandedTodos',
|
|
645
|
+
'messageIdleNotifThresholdMs',
|
|
646
|
+
'autoConnectIde',
|
|
647
|
+
'autoInstallIdeExtension',
|
|
648
|
+
'fileCheckpointingEnabled',
|
|
649
|
+
'terminalProgressBarEnabled',
|
|
650
|
+
'showStatusInTerminalTab',
|
|
651
|
+
'taskCompleteNotifEnabled',
|
|
652
|
+
'inputNeededNotifEnabled',
|
|
653
|
+
'agentPushNotifEnabled',
|
|
654
|
+
'respectGitignore',
|
|
655
|
+
'claudeInChromeDefaultEnabled',
|
|
656
|
+
'hasCompletedClaudeInChromeOnboarding',
|
|
657
|
+
'lspRecommendationDisabled',
|
|
658
|
+
'lspRecommendationNeverPlugins',
|
|
659
|
+
'lspRecommendationIgnoredCount',
|
|
660
|
+
'copyFullResponse',
|
|
661
|
+
'copyOnSelect',
|
|
662
|
+
'permissionExplainerEnabled',
|
|
663
|
+
'prStatusFooterEnabled',
|
|
664
|
+
'remoteControlAtStartup',
|
|
665
|
+
'remoteDialogSeen',
|
|
666
|
+
] as const
|
|
667
|
+
|
|
668
|
+
export type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]
|
|
669
|
+
|
|
670
|
+
export function isGlobalConfigKey(key: string): key is GlobalConfigKey {
|
|
671
|
+
return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
export const PROJECT_CONFIG_KEYS = [
|
|
675
|
+
'allowedTools',
|
|
676
|
+
'hasTrustDialogAccepted',
|
|
677
|
+
'hasCompletedProjectOnboarding',
|
|
678
|
+
] as const
|
|
679
|
+
|
|
680
|
+
export type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Check if the user has already accepted the trust dialog for the cwd.
|
|
684
|
+
*
|
|
685
|
+
* This function traverses parent directories to check if a parent directory
|
|
686
|
+
* had approval. Accepting trust for a directory implies trust for child
|
|
687
|
+
* directories.
|
|
688
|
+
*
|
|
689
|
+
* @returns Whether the trust dialog has been accepted (i.e. "should not be shown")
|
|
690
|
+
*/
|
|
691
|
+
let _trustAccepted = false
|
|
692
|
+
|
|
693
|
+
export function resetTrustDialogAcceptedCacheForTesting(): void {
|
|
694
|
+
_trustAccepted = false
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
export function checkHasTrustDialogAccepted(): boolean {
|
|
698
|
+
// Trust only transitions false→true during a session (never the reverse),
|
|
699
|
+
// so once true we can latch it. false is not cached — it gets re-checked
|
|
700
|
+
// on every call so that trust dialog acceptance is picked up mid-session.
|
|
701
|
+
// (lodash memoize doesn't fit here because it would also cache false.)
|
|
702
|
+
return (_trustAccepted ||= computeTrustDialogAccepted())
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
function computeTrustDialogAccepted(): boolean {
|
|
706
|
+
// Check session-level trust (for home directory case where trust is not persisted)
|
|
707
|
+
// When running from home dir, trust dialog is shown but acceptance is stored
|
|
708
|
+
// in memory only. This allows hooks and other features to work during the session.
|
|
709
|
+
if (getSessionTrustAccepted()) {
|
|
710
|
+
return true
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
const config = getGlobalConfig()
|
|
714
|
+
|
|
715
|
+
// Always check where trust would be saved (git root or original cwd)
|
|
716
|
+
// This is the primary location where trust is persisted by saveCurrentProjectConfig
|
|
717
|
+
const projectPath = getProjectPathForConfig()
|
|
718
|
+
const projectConfig = config.projects?.[projectPath]
|
|
719
|
+
if (projectConfig?.hasTrustDialogAccepted) {
|
|
720
|
+
return true
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
// Now check from current working directory and its parents
|
|
724
|
+
// Normalize paths for consistent JSON key lookup
|
|
725
|
+
let currentPath = normalizePathForConfigKey(getCwd())
|
|
726
|
+
|
|
727
|
+
// Traverse all parent directories
|
|
728
|
+
while (true) {
|
|
729
|
+
const pathConfig = config.projects?.[currentPath]
|
|
730
|
+
if (pathConfig?.hasTrustDialogAccepted) {
|
|
731
|
+
return true
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
const parentPath = normalizePathForConfigKey(resolve(currentPath, '..'))
|
|
735
|
+
// Stop if we've reached the root (when parent is same as current)
|
|
736
|
+
if (parentPath === currentPath) {
|
|
737
|
+
break
|
|
738
|
+
}
|
|
739
|
+
currentPath = parentPath
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
return false
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Check trust for an arbitrary directory (not the session cwd).
|
|
747
|
+
* Walks up from `dir`, returning true if any ancestor has trust persisted.
|
|
748
|
+
* Unlike checkHasTrustDialogAccepted, this does NOT consult session trust or
|
|
749
|
+
* the memoized project path — use when the target dir differs from cwd (e.g.
|
|
750
|
+
* /assistant installing into a user-typed path).
|
|
751
|
+
*/
|
|
752
|
+
export function isPathTrusted(dir: string): boolean {
|
|
753
|
+
const config = getGlobalConfig()
|
|
754
|
+
let currentPath = normalizePathForConfigKey(resolve(dir))
|
|
755
|
+
while (true) {
|
|
756
|
+
if (config.projects?.[currentPath]?.hasTrustDialogAccepted) return true
|
|
757
|
+
const parentPath = normalizePathForConfigKey(resolve(currentPath, '..'))
|
|
758
|
+
if (parentPath === currentPath) return false
|
|
759
|
+
currentPath = parentPath
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// We have to put this test code here because Jest doesn't support mocking ES modules :O
|
|
764
|
+
const TEST_GLOBAL_CONFIG_FOR_TESTING: GlobalConfig = {
|
|
765
|
+
...DEFAULT_GLOBAL_CONFIG,
|
|
766
|
+
autoUpdates: false,
|
|
767
|
+
}
|
|
768
|
+
const TEST_PROJECT_CONFIG_FOR_TESTING: ProjectConfig = {
|
|
769
|
+
...DEFAULT_PROJECT_CONFIG,
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
export function isProjectConfigKey(key: string): key is ProjectConfigKey {
|
|
773
|
+
return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* Detect whether writing `fresh` would lose auth/onboarding state that the
|
|
778
|
+
* in-memory cache still has. This happens when `getConfig` hits a corrupted
|
|
779
|
+
* or truncated file mid-write (from another process or a non-atomic fallback)
|
|
780
|
+
* and returns DEFAULT_GLOBAL_CONFIG. Writing that back would permanently
|
|
781
|
+
* wipe auth. See GH #3117.
|
|
782
|
+
*/
|
|
783
|
+
function wouldLoseAuthState(fresh: {
|
|
784
|
+
oauthAccount?: unknown
|
|
785
|
+
hasCompletedOnboarding?: boolean
|
|
786
|
+
}): boolean {
|
|
787
|
+
const cached = globalConfigCache.config
|
|
788
|
+
if (!cached) return false
|
|
789
|
+
const lostOauth =
|
|
790
|
+
cached.oauthAccount !== undefined && fresh.oauthAccount === undefined
|
|
791
|
+
const lostOnboarding =
|
|
792
|
+
cached.hasCompletedOnboarding === true &&
|
|
793
|
+
fresh.hasCompletedOnboarding !== true
|
|
794
|
+
return lostOauth || lostOnboarding
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
export function saveGlobalConfig(
|
|
798
|
+
updater: (currentConfig: GlobalConfig) => GlobalConfig,
|
|
799
|
+
): void {
|
|
800
|
+
if (process.env.NODE_ENV === 'test') {
|
|
801
|
+
const config = updater(TEST_GLOBAL_CONFIG_FOR_TESTING)
|
|
802
|
+
// Skip if no changes (same reference returned)
|
|
803
|
+
if (config === TEST_GLOBAL_CONFIG_FOR_TESTING) {
|
|
804
|
+
return
|
|
805
|
+
}
|
|
806
|
+
Object.assign(TEST_GLOBAL_CONFIG_FOR_TESTING, config)
|
|
807
|
+
return
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
let written: GlobalConfig | null = null
|
|
811
|
+
try {
|
|
812
|
+
const didWrite = saveConfigWithLock(
|
|
813
|
+
getGlobalClaudeFile(),
|
|
814
|
+
createDefaultGlobalConfig,
|
|
815
|
+
current => {
|
|
816
|
+
const config = updater(current)
|
|
817
|
+
// Skip if no changes (same reference returned)
|
|
818
|
+
if (config === current) {
|
|
819
|
+
return current
|
|
820
|
+
}
|
|
821
|
+
written = {
|
|
822
|
+
...config,
|
|
823
|
+
projects: removeProjectHistory(current.projects),
|
|
824
|
+
}
|
|
825
|
+
return written
|
|
826
|
+
},
|
|
827
|
+
)
|
|
828
|
+
// Only write-through if we actually wrote. If the auth-loss guard
|
|
829
|
+
// tripped (or the updater made no changes), the file is untouched and
|
|
830
|
+
// the cache is still valid -- touching it would corrupt the guard.
|
|
831
|
+
if (didWrite && written) {
|
|
832
|
+
writeThroughGlobalConfigCache(written)
|
|
833
|
+
}
|
|
834
|
+
} catch (error) {
|
|
835
|
+
logForDebugging(`Failed to save config with lock: ${error}`, {
|
|
836
|
+
level: 'error',
|
|
837
|
+
})
|
|
838
|
+
// Fall back to non-locked version on error. This fallback is a race
|
|
839
|
+
// window: if another process is mid-write (or the file got truncated),
|
|
840
|
+
// getConfig returns defaults. Refuse to write those over a good cached
|
|
841
|
+
// config to avoid wiping auth. See GH #3117.
|
|
842
|
+
const currentConfig = getConfig(
|
|
843
|
+
getGlobalClaudeFile(),
|
|
844
|
+
createDefaultGlobalConfig,
|
|
845
|
+
)
|
|
846
|
+
if (wouldLoseAuthState(currentConfig)) {
|
|
847
|
+
logForDebugging(
|
|
848
|
+
'saveGlobalConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.',
|
|
849
|
+
{ level: 'error' },
|
|
850
|
+
)
|
|
851
|
+
logEvent('tengu_config_auth_loss_prevented', {})
|
|
852
|
+
return
|
|
853
|
+
}
|
|
854
|
+
const config = updater(currentConfig)
|
|
855
|
+
// Skip if no changes (same reference returned)
|
|
856
|
+
if (config === currentConfig) {
|
|
857
|
+
return
|
|
858
|
+
}
|
|
859
|
+
written = {
|
|
860
|
+
...config,
|
|
861
|
+
projects: removeProjectHistory(currentConfig.projects),
|
|
862
|
+
}
|
|
863
|
+
saveConfig(getGlobalClaudeFile(), written, DEFAULT_GLOBAL_CONFIG)
|
|
864
|
+
writeThroughGlobalConfigCache(written)
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
// Cache for global config
|
|
869
|
+
let globalConfigCache: { config: GlobalConfig | null; mtime: number } = {
|
|
870
|
+
config: null,
|
|
871
|
+
mtime: 0,
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// Tracking for config file operations (telemetry)
|
|
875
|
+
let lastReadFileStats: { mtime: number; size: number } | null = null
|
|
876
|
+
let configCacheHits = 0
|
|
877
|
+
let configCacheMisses = 0
|
|
878
|
+
// Session-total count of actual disk writes to the global config file.
|
|
879
|
+
// Exposed for ant-only dev diagnostics (see inc-4552) so anomalous write
|
|
880
|
+
// rates surface in the UI before they corrupt ~/.claude.json.
|
|
881
|
+
let globalConfigWriteCount = 0
|
|
882
|
+
|
|
883
|
+
export function getGlobalConfigWriteCount(): number {
|
|
884
|
+
return globalConfigWriteCount
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
export const CONFIG_WRITE_DISPLAY_THRESHOLD = 20
|
|
888
|
+
|
|
889
|
+
function reportConfigCacheStats(): void {
|
|
890
|
+
const total = configCacheHits + configCacheMisses
|
|
891
|
+
if (total > 0) {
|
|
892
|
+
logEvent('tengu_config_cache_stats', {
|
|
893
|
+
cache_hits: configCacheHits,
|
|
894
|
+
cache_misses: configCacheMisses,
|
|
895
|
+
hit_rate: configCacheHits / total,
|
|
896
|
+
})
|
|
897
|
+
}
|
|
898
|
+
configCacheHits = 0
|
|
899
|
+
configCacheMisses = 0
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
// Register cleanup to report cache stats at session end
|
|
903
|
+
// eslint-disable-next-line custom-rules/no-top-level-side-effects
|
|
904
|
+
registerCleanup(async () => {
|
|
905
|
+
reportConfigCacheStats()
|
|
906
|
+
})
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* Migrates old autoUpdaterStatus to new installMethod and autoUpdates fields
|
|
910
|
+
* @internal
|
|
911
|
+
*/
|
|
912
|
+
function migrateConfigFields(config: GlobalConfig): GlobalConfig {
|
|
913
|
+
// Already migrated
|
|
914
|
+
if (config.installMethod !== undefined) {
|
|
915
|
+
return config
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// autoUpdaterStatus is removed from the type but may exist in old configs
|
|
919
|
+
const legacy = config as GlobalConfig & {
|
|
920
|
+
autoUpdaterStatus?:
|
|
921
|
+
| 'migrated'
|
|
922
|
+
| 'installed'
|
|
923
|
+
| 'disabled'
|
|
924
|
+
| 'enabled'
|
|
925
|
+
| 'no_permissions'
|
|
926
|
+
| 'not_configured'
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// Determine install method and auto-update preference from old field
|
|
930
|
+
let installMethod: InstallMethod = 'unknown'
|
|
931
|
+
let autoUpdates = config.autoUpdates ?? true // Default to enabled unless explicitly disabled
|
|
932
|
+
|
|
933
|
+
switch (legacy.autoUpdaterStatus) {
|
|
934
|
+
case 'migrated':
|
|
935
|
+
installMethod = 'local'
|
|
936
|
+
break
|
|
937
|
+
case 'installed':
|
|
938
|
+
installMethod = 'native'
|
|
939
|
+
break
|
|
940
|
+
case 'disabled':
|
|
941
|
+
// When disabled, we don't know the install method
|
|
942
|
+
autoUpdates = false
|
|
943
|
+
break
|
|
944
|
+
case 'enabled':
|
|
945
|
+
case 'no_permissions':
|
|
946
|
+
case 'not_configured':
|
|
947
|
+
// These imply global installation
|
|
948
|
+
installMethod = 'global'
|
|
949
|
+
break
|
|
950
|
+
case undefined:
|
|
951
|
+
// No old status, keep defaults
|
|
952
|
+
break
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
return {
|
|
956
|
+
...config,
|
|
957
|
+
installMethod,
|
|
958
|
+
autoUpdates,
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* Removes history field from projects (migrated to history.jsonl)
|
|
964
|
+
* @internal
|
|
965
|
+
*/
|
|
966
|
+
function removeProjectHistory(
|
|
967
|
+
projects: Record<string, ProjectConfig> | undefined,
|
|
968
|
+
): Record<string, ProjectConfig> | undefined {
|
|
969
|
+
if (!projects) {
|
|
970
|
+
return projects
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
const cleanedProjects: Record<string, ProjectConfig> = {}
|
|
974
|
+
let needsCleaning = false
|
|
975
|
+
|
|
976
|
+
for (const [path, projectConfig] of Object.entries(projects)) {
|
|
977
|
+
// history is removed from the type but may exist in old configs
|
|
978
|
+
const legacy = projectConfig as ProjectConfig & { history?: unknown }
|
|
979
|
+
if (legacy.history !== undefined) {
|
|
980
|
+
needsCleaning = true
|
|
981
|
+
const { history, ...cleanedConfig } = legacy
|
|
982
|
+
cleanedProjects[path] = cleanedConfig
|
|
983
|
+
} else {
|
|
984
|
+
cleanedProjects[path] = projectConfig
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
return needsCleaning ? cleanedProjects : projects
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
// fs.watchFile poll interval for detecting writes from other instances (ms)
|
|
992
|
+
const CONFIG_FRESHNESS_POLL_MS = 1000
|
|
993
|
+
let freshnessWatcherStarted = false
|
|
994
|
+
|
|
995
|
+
// fs.watchFile polls stat on the libuv threadpool and only calls us when mtime
|
|
996
|
+
// changed — a stalled stat never blocks the main thread.
|
|
997
|
+
function startGlobalConfigFreshnessWatcher(): void {
|
|
998
|
+
if (freshnessWatcherStarted || process.env.NODE_ENV === 'test') return
|
|
999
|
+
freshnessWatcherStarted = true
|
|
1000
|
+
const file = getGlobalClaudeFile()
|
|
1001
|
+
watchFile(
|
|
1002
|
+
file,
|
|
1003
|
+
{ interval: CONFIG_FRESHNESS_POLL_MS, persistent: false },
|
|
1004
|
+
curr => {
|
|
1005
|
+
// Our own writes fire this too — the write-through's Date.now()
|
|
1006
|
+
// overshoot makes cache.mtime > file mtime, so we skip the re-read.
|
|
1007
|
+
// Bun/Node also fire with curr.mtimeMs=0 when the file doesn't exist
|
|
1008
|
+
// (initial callback or deletion) — the <= handles that too.
|
|
1009
|
+
if (curr.mtimeMs <= globalConfigCache.mtime) return
|
|
1010
|
+
void getFsImplementation()
|
|
1011
|
+
.readFile(file, { encoding: 'utf-8' })
|
|
1012
|
+
.then(content => {
|
|
1013
|
+
// A write-through may have advanced the cache while we were reading;
|
|
1014
|
+
// don't regress to the stale snapshot watchFile stat'd.
|
|
1015
|
+
if (curr.mtimeMs <= globalConfigCache.mtime) return
|
|
1016
|
+
const parsed = safeParseJSON(stripBOM(content))
|
|
1017
|
+
if (parsed === null || typeof parsed !== 'object') return
|
|
1018
|
+
globalConfigCache = {
|
|
1019
|
+
config: migrateConfigFields({
|
|
1020
|
+
...createDefaultGlobalConfig(),
|
|
1021
|
+
...(parsed as Partial<GlobalConfig>),
|
|
1022
|
+
}),
|
|
1023
|
+
mtime: curr.mtimeMs,
|
|
1024
|
+
}
|
|
1025
|
+
lastReadFileStats = { mtime: curr.mtimeMs, size: curr.size }
|
|
1026
|
+
})
|
|
1027
|
+
.catch(() => {})
|
|
1028
|
+
},
|
|
1029
|
+
)
|
|
1030
|
+
registerCleanup(async () => {
|
|
1031
|
+
unwatchFile(file)
|
|
1032
|
+
freshnessWatcherStarted = false
|
|
1033
|
+
})
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
// Write-through: what we just wrote IS the new config. cache.mtime overshoots
|
|
1037
|
+
// the file's real mtime (Date.now() is recorded after the write) so the
|
|
1038
|
+
// freshness watcher skips re-reading our own write on its next tick.
|
|
1039
|
+
function writeThroughGlobalConfigCache(config: GlobalConfig): void {
|
|
1040
|
+
globalConfigCache = { config, mtime: Date.now() }
|
|
1041
|
+
lastReadFileStats = null
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
export function getGlobalConfig(): GlobalConfig {
|
|
1045
|
+
if (process.env.NODE_ENV === 'test') {
|
|
1046
|
+
return TEST_GLOBAL_CONFIG_FOR_TESTING
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
// Fast path: pure memory read. After startup, this always hits — our own
|
|
1050
|
+
// writes go write-through and other instances' writes are picked up by the
|
|
1051
|
+
// background freshness watcher (never blocks this path).
|
|
1052
|
+
if (globalConfigCache.config) {
|
|
1053
|
+
configCacheHits++
|
|
1054
|
+
return globalConfigCache.config
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
// Slow path: startup load. Sync I/O here is acceptable because it runs
|
|
1058
|
+
// exactly once, before any UI is rendered. Stat before read so any race
|
|
1059
|
+
// self-corrects (old mtime + new content → watcher re-reads next tick).
|
|
1060
|
+
configCacheMisses++
|
|
1061
|
+
try {
|
|
1062
|
+
let stats: { mtimeMs: number; size: number } | null = null
|
|
1063
|
+
try {
|
|
1064
|
+
stats = getFsImplementation().statSync(getGlobalClaudeFile())
|
|
1065
|
+
} catch {
|
|
1066
|
+
// File doesn't exist
|
|
1067
|
+
}
|
|
1068
|
+
const config = migrateConfigFields(
|
|
1069
|
+
getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig),
|
|
1070
|
+
)
|
|
1071
|
+
globalConfigCache = {
|
|
1072
|
+
config,
|
|
1073
|
+
mtime: stats?.mtimeMs ?? Date.now(),
|
|
1074
|
+
}
|
|
1075
|
+
lastReadFileStats = stats
|
|
1076
|
+
? { mtime: stats.mtimeMs, size: stats.size }
|
|
1077
|
+
: null
|
|
1078
|
+
startGlobalConfigFreshnessWatcher()
|
|
1079
|
+
return config
|
|
1080
|
+
} catch {
|
|
1081
|
+
// If anything goes wrong, fall back to uncached behavior
|
|
1082
|
+
return migrateConfigFields(
|
|
1083
|
+
getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig),
|
|
1084
|
+
)
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
/**
|
|
1089
|
+
* Returns the effective value of remoteControlAtStartup. Precedence:
|
|
1090
|
+
* 1. User's explicit config value (always wins — honors opt-out)
|
|
1091
|
+
* 2. CCR auto-connect default (ant-only build, GrowthBook-gated)
|
|
1092
|
+
* 3. false (Remote Control must be explicitly opted into)
|
|
1093
|
+
*/
|
|
1094
|
+
export function getRemoteControlAtStartup(): boolean {
|
|
1095
|
+
const explicit = getGlobalConfig().remoteControlAtStartup
|
|
1096
|
+
if (explicit !== undefined) return explicit
|
|
1097
|
+
if (feature('CCR_AUTO_CONNECT')) {
|
|
1098
|
+
if (ccrAutoConnect?.getCcrAutoConnectDefault()) return true
|
|
1099
|
+
}
|
|
1100
|
+
return false
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
export function getCustomApiKeyStatus(
|
|
1104
|
+
truncatedApiKey: string,
|
|
1105
|
+
): 'approved' | 'rejected' | 'new' {
|
|
1106
|
+
const config = getGlobalConfig()
|
|
1107
|
+
if (config.customApiKeyResponses?.approved?.includes(truncatedApiKey)) {
|
|
1108
|
+
return 'approved'
|
|
1109
|
+
}
|
|
1110
|
+
if (config.customApiKeyResponses?.rejected?.includes(truncatedApiKey)) {
|
|
1111
|
+
return 'rejected'
|
|
1112
|
+
}
|
|
1113
|
+
return 'new'
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
function saveConfig<A extends object>(
|
|
1117
|
+
file: string,
|
|
1118
|
+
config: A,
|
|
1119
|
+
defaultConfig: A,
|
|
1120
|
+
): void {
|
|
1121
|
+
// Ensure the directory exists before writing the config file
|
|
1122
|
+
const dir = dirname(file)
|
|
1123
|
+
const fs = getFsImplementation()
|
|
1124
|
+
// mkdirSync is already recursive in FsOperations implementation
|
|
1125
|
+
fs.mkdirSync(dir)
|
|
1126
|
+
|
|
1127
|
+
// Filter out any values that match the defaults
|
|
1128
|
+
const filteredConfig = pickBy(
|
|
1129
|
+
config,
|
|
1130
|
+
(value, key) =>
|
|
1131
|
+
jsonStringify(value) !== jsonStringify(defaultConfig[key as keyof A]),
|
|
1132
|
+
)
|
|
1133
|
+
// Write config file with secure permissions - mode only applies to new files
|
|
1134
|
+
writeFileSyncAndFlush_DEPRECATED(
|
|
1135
|
+
file,
|
|
1136
|
+
jsonStringify(filteredConfig, null, 2),
|
|
1137
|
+
{
|
|
1138
|
+
encoding: 'utf-8',
|
|
1139
|
+
mode: 0o600,
|
|
1140
|
+
},
|
|
1141
|
+
)
|
|
1142
|
+
if (file === getGlobalClaudeFile()) {
|
|
1143
|
+
globalConfigWriteCount++
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
/**
|
|
1148
|
+
* Returns true if a write was performed; false if the write was skipped
|
|
1149
|
+
* (no changes, or auth-loss guard tripped). Callers use this to decide
|
|
1150
|
+
* whether to invalidate the cache -- invalidating after a skipped write
|
|
1151
|
+
* destroys the good cached state the auth-loss guard depends on.
|
|
1152
|
+
*/
|
|
1153
|
+
function saveConfigWithLock<A extends object>(
|
|
1154
|
+
file: string,
|
|
1155
|
+
createDefault: () => A,
|
|
1156
|
+
mergeFn: (current: A) => A,
|
|
1157
|
+
): boolean {
|
|
1158
|
+
const defaultConfig = createDefault()
|
|
1159
|
+
const dir = dirname(file)
|
|
1160
|
+
const fs = getFsImplementation()
|
|
1161
|
+
|
|
1162
|
+
// Ensure directory exists (mkdirSync is already recursive in FsOperations)
|
|
1163
|
+
fs.mkdirSync(dir)
|
|
1164
|
+
|
|
1165
|
+
let release
|
|
1166
|
+
try {
|
|
1167
|
+
const lockFilePath = `${file}.lock`
|
|
1168
|
+
const startTime = Date.now()
|
|
1169
|
+
release = lockfile.lockSync(file, {
|
|
1170
|
+
lockfilePath: lockFilePath,
|
|
1171
|
+
onCompromised: err => {
|
|
1172
|
+
// Default onCompromised throws from a setTimeout callback, which
|
|
1173
|
+
// becomes an unhandled exception. Log instead -- the lock being
|
|
1174
|
+
// stolen (e.g. after a 10s event-loop stall) is recoverable.
|
|
1175
|
+
logForDebugging(`Config lock compromised: ${err}`, { level: 'error' })
|
|
1176
|
+
},
|
|
1177
|
+
})
|
|
1178
|
+
const lockTime = Date.now() - startTime
|
|
1179
|
+
if (lockTime > 100) {
|
|
1180
|
+
logForDebugging(
|
|
1181
|
+
'Lock acquisition took longer than expected - another Claude instance may be running',
|
|
1182
|
+
)
|
|
1183
|
+
logEvent('tengu_config_lock_contention', {
|
|
1184
|
+
lock_time_ms: lockTime,
|
|
1185
|
+
})
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// Check for stale write - file changed since we last read it
|
|
1189
|
+
// Only check for global config file since lastReadFileStats tracks that specific file
|
|
1190
|
+
if (lastReadFileStats && file === getGlobalClaudeFile()) {
|
|
1191
|
+
try {
|
|
1192
|
+
const currentStats = fs.statSync(file)
|
|
1193
|
+
if (
|
|
1194
|
+
currentStats.mtimeMs !== lastReadFileStats.mtime ||
|
|
1195
|
+
currentStats.size !== lastReadFileStats.size
|
|
1196
|
+
) {
|
|
1197
|
+
logEvent('tengu_config_stale_write', {
|
|
1198
|
+
read_mtime: lastReadFileStats.mtime,
|
|
1199
|
+
write_mtime: currentStats.mtimeMs,
|
|
1200
|
+
read_size: lastReadFileStats.size,
|
|
1201
|
+
write_size: currentStats.size,
|
|
1202
|
+
})
|
|
1203
|
+
}
|
|
1204
|
+
} catch (e) {
|
|
1205
|
+
const code = getErrnoCode(e)
|
|
1206
|
+
if (code !== 'ENOENT') {
|
|
1207
|
+
throw e
|
|
1208
|
+
}
|
|
1209
|
+
// File doesn't exist yet, no stale check needed
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
// Re-read the current config to get latest state. If the file is
|
|
1214
|
+
// momentarily corrupted (concurrent writes, kill-during-write), this
|
|
1215
|
+
// returns defaults -- we must not write those back over good config.
|
|
1216
|
+
const currentConfig = getConfig(file, createDefault)
|
|
1217
|
+
if (file === getGlobalClaudeFile() && wouldLoseAuthState(currentConfig)) {
|
|
1218
|
+
logForDebugging(
|
|
1219
|
+
'saveConfigWithLock: re-read config is missing auth that cache has; refusing to write to avoid wiping ~/.claude.json. See GH #3117.',
|
|
1220
|
+
{ level: 'error' },
|
|
1221
|
+
)
|
|
1222
|
+
logEvent('tengu_config_auth_loss_prevented', {})
|
|
1223
|
+
return false
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
// Apply the merge function to get the updated config
|
|
1227
|
+
const mergedConfig = mergeFn(currentConfig)
|
|
1228
|
+
|
|
1229
|
+
// Skip write if no changes (same reference returned)
|
|
1230
|
+
if (mergedConfig === currentConfig) {
|
|
1231
|
+
return false
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
// Filter out any values that match the defaults
|
|
1235
|
+
const filteredConfig = pickBy(
|
|
1236
|
+
mergedConfig,
|
|
1237
|
+
(value, key) =>
|
|
1238
|
+
jsonStringify(value) !== jsonStringify(defaultConfig[key as keyof A]),
|
|
1239
|
+
)
|
|
1240
|
+
|
|
1241
|
+
// Create timestamped backup of existing config before writing
|
|
1242
|
+
// We keep multiple backups to prevent data loss if a reset/corrupted config
|
|
1243
|
+
// overwrites a good backup. Backups are stored in ~/.claude/backups/ to
|
|
1244
|
+
// keep the home directory clean.
|
|
1245
|
+
try {
|
|
1246
|
+
const fileBase = basename(file)
|
|
1247
|
+
const backupDir = getConfigBackupDir()
|
|
1248
|
+
|
|
1249
|
+
// Ensure backup directory exists
|
|
1250
|
+
try {
|
|
1251
|
+
fs.mkdirSync(backupDir)
|
|
1252
|
+
} catch (mkdirErr) {
|
|
1253
|
+
const mkdirCode = getErrnoCode(mkdirErr)
|
|
1254
|
+
if (mkdirCode !== 'EEXIST') {
|
|
1255
|
+
throw mkdirErr
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
// Check existing backups first -- skip creating a new one if a recent
|
|
1260
|
+
// backup already exists. During startup, many saveGlobalConfig calls fire
|
|
1261
|
+
// within milliseconds of each other; without this check, each call
|
|
1262
|
+
// creates a new backup file that accumulates on disk.
|
|
1263
|
+
const MIN_BACKUP_INTERVAL_MS = 60_000
|
|
1264
|
+
const existingBackups = fs
|
|
1265
|
+
.readdirStringSync(backupDir)
|
|
1266
|
+
.filter(f => f.startsWith(`${fileBase}.backup.`))
|
|
1267
|
+
.sort()
|
|
1268
|
+
.reverse() // Most recent first (timestamps sort lexicographically)
|
|
1269
|
+
|
|
1270
|
+
const mostRecentBackup = existingBackups[0]
|
|
1271
|
+
const mostRecentTimestamp = mostRecentBackup
|
|
1272
|
+
? Number(mostRecentBackup.split('.backup.').pop())
|
|
1273
|
+
: 0
|
|
1274
|
+
const shouldCreateBackup =
|
|
1275
|
+
Number.isNaN(mostRecentTimestamp) ||
|
|
1276
|
+
Date.now() - mostRecentTimestamp >= MIN_BACKUP_INTERVAL_MS
|
|
1277
|
+
|
|
1278
|
+
if (shouldCreateBackup) {
|
|
1279
|
+
const backupPath = join(backupDir, `${fileBase}.backup.${Date.now()}`)
|
|
1280
|
+
fs.copyFileSync(file, backupPath)
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
// Clean up old backups, keeping only the 5 most recent
|
|
1284
|
+
const MAX_BACKUPS = 5
|
|
1285
|
+
// Re-read if we just created one; otherwise reuse the list
|
|
1286
|
+
const backupsForCleanup = shouldCreateBackup
|
|
1287
|
+
? fs
|
|
1288
|
+
.readdirStringSync(backupDir)
|
|
1289
|
+
.filter(f => f.startsWith(`${fileBase}.backup.`))
|
|
1290
|
+
.sort()
|
|
1291
|
+
.reverse()
|
|
1292
|
+
: existingBackups
|
|
1293
|
+
|
|
1294
|
+
for (const oldBackup of backupsForCleanup.slice(MAX_BACKUPS)) {
|
|
1295
|
+
try {
|
|
1296
|
+
fs.unlinkSync(join(backupDir, oldBackup))
|
|
1297
|
+
} catch {
|
|
1298
|
+
// Ignore cleanup errors
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
} catch (e) {
|
|
1302
|
+
const code = getErrnoCode(e)
|
|
1303
|
+
if (code !== 'ENOENT') {
|
|
1304
|
+
logForDebugging(`Failed to backup config: ${e}`, {
|
|
1305
|
+
level: 'error',
|
|
1306
|
+
})
|
|
1307
|
+
}
|
|
1308
|
+
// No file to backup or backup failed, continue with write
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
// Write config file with secure permissions - mode only applies to new files
|
|
1312
|
+
writeFileSyncAndFlush_DEPRECATED(
|
|
1313
|
+
file,
|
|
1314
|
+
jsonStringify(filteredConfig, null, 2),
|
|
1315
|
+
{
|
|
1316
|
+
encoding: 'utf-8',
|
|
1317
|
+
mode: 0o600,
|
|
1318
|
+
},
|
|
1319
|
+
)
|
|
1320
|
+
if (file === getGlobalClaudeFile()) {
|
|
1321
|
+
globalConfigWriteCount++
|
|
1322
|
+
}
|
|
1323
|
+
return true
|
|
1324
|
+
} finally {
|
|
1325
|
+
if (release) {
|
|
1326
|
+
release()
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
// Flag to track if config reading is allowed
|
|
1332
|
+
let configReadingAllowed = false
|
|
1333
|
+
|
|
1334
|
+
export function enableConfigs(): void {
|
|
1335
|
+
if (configReadingAllowed) {
|
|
1336
|
+
// Ensure this is idempotent
|
|
1337
|
+
return
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
const startTime = Date.now()
|
|
1341
|
+
logForDiagnosticsNoPII('info', 'enable_configs_started')
|
|
1342
|
+
|
|
1343
|
+
// Any reads to configuration before this flag is set show an console warning
|
|
1344
|
+
// to prevent us from adding config reading during module initialization
|
|
1345
|
+
configReadingAllowed = true
|
|
1346
|
+
// We only check the global config because currently all the configs share a file
|
|
1347
|
+
getConfig(
|
|
1348
|
+
getGlobalClaudeFile(),
|
|
1349
|
+
createDefaultGlobalConfig,
|
|
1350
|
+
true /* throw on invalid */,
|
|
1351
|
+
)
|
|
1352
|
+
|
|
1353
|
+
logForDiagnosticsNoPII('info', 'enable_configs_completed', {
|
|
1354
|
+
duration_ms: Date.now() - startTime,
|
|
1355
|
+
})
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
/**
|
|
1359
|
+
* Returns the directory where config backup files are stored.
|
|
1360
|
+
* Uses ~/.claude/backups/ to keep the home directory clean.
|
|
1361
|
+
*/
|
|
1362
|
+
function getConfigBackupDir(): string {
|
|
1363
|
+
return join(getClaudeConfigHomeDir(), 'backups')
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
/**
|
|
1367
|
+
* Find the most recent backup file for a given config file.
|
|
1368
|
+
* Checks ~/.claude/backups/ first, then falls back to the legacy location
|
|
1369
|
+
* (next to the config file) for backwards compatibility.
|
|
1370
|
+
* Returns the full path to the most recent backup, or null if none exist.
|
|
1371
|
+
*/
|
|
1372
|
+
function findMostRecentBackup(file: string): string | null {
|
|
1373
|
+
const fs = getFsImplementation()
|
|
1374
|
+
const fileBase = basename(file)
|
|
1375
|
+
const backupDir = getConfigBackupDir()
|
|
1376
|
+
|
|
1377
|
+
// Check the new backup directory first
|
|
1378
|
+
try {
|
|
1379
|
+
const backups = fs
|
|
1380
|
+
.readdirStringSync(backupDir)
|
|
1381
|
+
.filter(f => f.startsWith(`${fileBase}.backup.`))
|
|
1382
|
+
.sort()
|
|
1383
|
+
|
|
1384
|
+
const mostRecent = backups.at(-1) // Timestamps sort lexicographically
|
|
1385
|
+
if (mostRecent) {
|
|
1386
|
+
return join(backupDir, mostRecent)
|
|
1387
|
+
}
|
|
1388
|
+
} catch {
|
|
1389
|
+
// Backup dir doesn't exist yet
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
// Fall back to legacy location (next to the config file)
|
|
1393
|
+
const fileDir = dirname(file)
|
|
1394
|
+
|
|
1395
|
+
try {
|
|
1396
|
+
const backups = fs
|
|
1397
|
+
.readdirStringSync(fileDir)
|
|
1398
|
+
.filter(f => f.startsWith(`${fileBase}.backup.`))
|
|
1399
|
+
.sort()
|
|
1400
|
+
|
|
1401
|
+
const mostRecent = backups.at(-1) // Timestamps sort lexicographically
|
|
1402
|
+
if (mostRecent) {
|
|
1403
|
+
return join(fileDir, mostRecent)
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
// Check for legacy backup file (no timestamp)
|
|
1407
|
+
const legacyBackup = `${file}.backup`
|
|
1408
|
+
try {
|
|
1409
|
+
fs.statSync(legacyBackup)
|
|
1410
|
+
return legacyBackup
|
|
1411
|
+
} catch {
|
|
1412
|
+
// Legacy backup doesn't exist
|
|
1413
|
+
}
|
|
1414
|
+
} catch {
|
|
1415
|
+
// Ignore errors reading directory
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
return null
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
function getConfig<A>(
|
|
1422
|
+
file: string,
|
|
1423
|
+
createDefault: () => A,
|
|
1424
|
+
throwOnInvalid?: boolean,
|
|
1425
|
+
): A {
|
|
1426
|
+
// Log a warning if config is accessed before it's allowed
|
|
1427
|
+
if (!configReadingAllowed && process.env.NODE_ENV !== 'test') {
|
|
1428
|
+
throw new Error('Config accessed before allowed.')
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
const fs = getFsImplementation()
|
|
1432
|
+
|
|
1433
|
+
try {
|
|
1434
|
+
const fileContent = fs.readFileSync(file, {
|
|
1435
|
+
encoding: 'utf-8',
|
|
1436
|
+
})
|
|
1437
|
+
try {
|
|
1438
|
+
// Strip BOM before parsing - PowerShell 5.x adds BOM to UTF-8 files
|
|
1439
|
+
const parsedConfig = jsonParse(stripBOM(fileContent))
|
|
1440
|
+
return {
|
|
1441
|
+
...createDefault(),
|
|
1442
|
+
...parsedConfig,
|
|
1443
|
+
}
|
|
1444
|
+
} catch (error) {
|
|
1445
|
+
// Throw a ConfigParseError with the file path and default config
|
|
1446
|
+
const errorMessage =
|
|
1447
|
+
error instanceof Error ? error.message : String(error)
|
|
1448
|
+
throw new ConfigParseError(errorMessage, file, createDefault())
|
|
1449
|
+
}
|
|
1450
|
+
} catch (error) {
|
|
1451
|
+
// Handle file not found - check for backup and return default
|
|
1452
|
+
const errCode = getErrnoCode(error)
|
|
1453
|
+
if (errCode === 'ENOENT') {
|
|
1454
|
+
const backupPath = findMostRecentBackup(file)
|
|
1455
|
+
if (backupPath) {
|
|
1456
|
+
process.stderr.write(
|
|
1457
|
+
`\nClaude configuration file not found at: ${file}\n` +
|
|
1458
|
+
`A backup file exists at: ${backupPath}\n` +
|
|
1459
|
+
`You can manually restore it by running: cp "${backupPath}" "${file}"\n\n`,
|
|
1460
|
+
)
|
|
1461
|
+
}
|
|
1462
|
+
return createDefault()
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
// Re-throw ConfigParseError if throwOnInvalid is true
|
|
1466
|
+
if (error instanceof ConfigParseError && throwOnInvalid) {
|
|
1467
|
+
throw error
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
// Log config parse errors so users know what happened
|
|
1471
|
+
if (error instanceof ConfigParseError) {
|
|
1472
|
+
logForDebugging(
|
|
1473
|
+
`Config file corrupted, resetting to defaults: ${error.message}`,
|
|
1474
|
+
{ level: 'error' },
|
|
1475
|
+
)
|
|
1476
|
+
|
|
1477
|
+
// Guard: logEvent → shouldSampleEvent → getGlobalConfig → getConfig
|
|
1478
|
+
// causes infinite recursion when the config file is corrupted, because
|
|
1479
|
+
// the sampling check reads a GrowthBook feature from global config.
|
|
1480
|
+
// Only log analytics on the outermost call.
|
|
1481
|
+
if (!insideGetConfig) {
|
|
1482
|
+
insideGetConfig = true
|
|
1483
|
+
try {
|
|
1484
|
+
// Log the error for monitoring
|
|
1485
|
+
logError(error)
|
|
1486
|
+
|
|
1487
|
+
// Log analytics event for config corruption
|
|
1488
|
+
let hasBackup = false
|
|
1489
|
+
try {
|
|
1490
|
+
fs.statSync(`${file}.backup`)
|
|
1491
|
+
hasBackup = true
|
|
1492
|
+
} catch {
|
|
1493
|
+
// No backup
|
|
1494
|
+
}
|
|
1495
|
+
logEvent('tengu_config_parse_error', {
|
|
1496
|
+
has_backup: hasBackup,
|
|
1497
|
+
})
|
|
1498
|
+
} finally {
|
|
1499
|
+
insideGetConfig = false
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
process.stderr.write(
|
|
1504
|
+
`\nClaude configuration file at ${file} is corrupted: ${error.message}\n`,
|
|
1505
|
+
)
|
|
1506
|
+
|
|
1507
|
+
// Try to backup the corrupted config file (only if not already backed up)
|
|
1508
|
+
const fileBase = basename(file)
|
|
1509
|
+
const corruptedBackupDir = getConfigBackupDir()
|
|
1510
|
+
|
|
1511
|
+
// Ensure backup directory exists
|
|
1512
|
+
try {
|
|
1513
|
+
fs.mkdirSync(corruptedBackupDir)
|
|
1514
|
+
} catch (mkdirErr) {
|
|
1515
|
+
const mkdirCode = getErrnoCode(mkdirErr)
|
|
1516
|
+
if (mkdirCode !== 'EEXIST') {
|
|
1517
|
+
throw mkdirErr
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
const existingCorruptedBackups = fs
|
|
1522
|
+
.readdirStringSync(corruptedBackupDir)
|
|
1523
|
+
.filter(f => f.startsWith(`${fileBase}.corrupted.`))
|
|
1524
|
+
|
|
1525
|
+
let corruptedBackupPath: string | undefined
|
|
1526
|
+
let alreadyBackedUp = false
|
|
1527
|
+
|
|
1528
|
+
// Check if current corrupted content matches any existing backup
|
|
1529
|
+
const currentContent = fs.readFileSync(file, { encoding: 'utf-8' })
|
|
1530
|
+
for (const backup of existingCorruptedBackups) {
|
|
1531
|
+
try {
|
|
1532
|
+
const backupContent = fs.readFileSync(
|
|
1533
|
+
join(corruptedBackupDir, backup),
|
|
1534
|
+
{ encoding: 'utf-8' },
|
|
1535
|
+
)
|
|
1536
|
+
if (currentContent === backupContent) {
|
|
1537
|
+
alreadyBackedUp = true
|
|
1538
|
+
break
|
|
1539
|
+
}
|
|
1540
|
+
} catch {
|
|
1541
|
+
// Ignore read errors on backups
|
|
1542
|
+
}
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
if (!alreadyBackedUp) {
|
|
1546
|
+
corruptedBackupPath = join(
|
|
1547
|
+
corruptedBackupDir,
|
|
1548
|
+
`${fileBase}.corrupted.${Date.now()}`,
|
|
1549
|
+
)
|
|
1550
|
+
try {
|
|
1551
|
+
fs.copyFileSync(file, corruptedBackupPath)
|
|
1552
|
+
logForDebugging(
|
|
1553
|
+
`Corrupted config backed up to: ${corruptedBackupPath}`,
|
|
1554
|
+
{
|
|
1555
|
+
level: 'error',
|
|
1556
|
+
},
|
|
1557
|
+
)
|
|
1558
|
+
} catch {
|
|
1559
|
+
// Ignore backup errors
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
// Notify user about corrupted config and available backup
|
|
1564
|
+
const backupPath = findMostRecentBackup(file)
|
|
1565
|
+
if (corruptedBackupPath) {
|
|
1566
|
+
process.stderr.write(
|
|
1567
|
+
`The corrupted file has been backed up to: ${corruptedBackupPath}\n`,
|
|
1568
|
+
)
|
|
1569
|
+
} else if (alreadyBackedUp) {
|
|
1570
|
+
process.stderr.write(`The corrupted file has already been backed up.\n`)
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
if (backupPath) {
|
|
1574
|
+
process.stderr.write(
|
|
1575
|
+
`A backup file exists at: ${backupPath}\n` +
|
|
1576
|
+
`You can manually restore it by running: cp "${backupPath}" "${file}"\n\n`,
|
|
1577
|
+
)
|
|
1578
|
+
} else {
|
|
1579
|
+
process.stderr.write(`\n`)
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
return createDefault()
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
// Memoized function to get the project path for config lookup
|
|
1588
|
+
export const getProjectPathForConfig = memoize((): string => {
|
|
1589
|
+
const originalCwd = getOriginalCwd()
|
|
1590
|
+
const gitRoot = findCanonicalGitRoot(originalCwd)
|
|
1591
|
+
|
|
1592
|
+
if (gitRoot) {
|
|
1593
|
+
// Normalize for consistent JSON keys (forward slashes on all platforms)
|
|
1594
|
+
// This ensures paths like C:\Users\... and C:/Users/... map to the same key
|
|
1595
|
+
return normalizePathForConfigKey(gitRoot)
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
// Not in a git repo
|
|
1599
|
+
return normalizePathForConfigKey(resolve(originalCwd))
|
|
1600
|
+
})
|
|
1601
|
+
|
|
1602
|
+
export function getCurrentProjectConfig(): ProjectConfig {
|
|
1603
|
+
if (process.env.NODE_ENV === 'test') {
|
|
1604
|
+
return TEST_PROJECT_CONFIG_FOR_TESTING
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
const absolutePath = getProjectPathForConfig()
|
|
1608
|
+
const config = getGlobalConfig()
|
|
1609
|
+
|
|
1610
|
+
if (!config.projects) {
|
|
1611
|
+
return DEFAULT_PROJECT_CONFIG
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
const projectConfig = config.projects[absolutePath] ?? DEFAULT_PROJECT_CONFIG
|
|
1615
|
+
// Not sure how this became a string
|
|
1616
|
+
// TODO: Fix upstream
|
|
1617
|
+
if (typeof projectConfig.allowedTools === 'string') {
|
|
1618
|
+
projectConfig.allowedTools =
|
|
1619
|
+
(safeParseJSON(projectConfig.allowedTools) as string[]) ?? []
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
return projectConfig
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
export function saveCurrentProjectConfig(
|
|
1626
|
+
updater: (currentConfig: ProjectConfig) => ProjectConfig,
|
|
1627
|
+
): void {
|
|
1628
|
+
if (process.env.NODE_ENV === 'test') {
|
|
1629
|
+
const config = updater(TEST_PROJECT_CONFIG_FOR_TESTING)
|
|
1630
|
+
// Skip if no changes (same reference returned)
|
|
1631
|
+
if (config === TEST_PROJECT_CONFIG_FOR_TESTING) {
|
|
1632
|
+
return
|
|
1633
|
+
}
|
|
1634
|
+
Object.assign(TEST_PROJECT_CONFIG_FOR_TESTING, config)
|
|
1635
|
+
return
|
|
1636
|
+
}
|
|
1637
|
+
const absolutePath = getProjectPathForConfig()
|
|
1638
|
+
|
|
1639
|
+
let written: GlobalConfig | null = null
|
|
1640
|
+
try {
|
|
1641
|
+
const didWrite = saveConfigWithLock(
|
|
1642
|
+
getGlobalClaudeFile(),
|
|
1643
|
+
createDefaultGlobalConfig,
|
|
1644
|
+
current => {
|
|
1645
|
+
const currentProjectConfig =
|
|
1646
|
+
current.projects?.[absolutePath] ?? DEFAULT_PROJECT_CONFIG
|
|
1647
|
+
const newProjectConfig = updater(currentProjectConfig)
|
|
1648
|
+
// Skip if no changes (same reference returned)
|
|
1649
|
+
if (newProjectConfig === currentProjectConfig) {
|
|
1650
|
+
return current
|
|
1651
|
+
}
|
|
1652
|
+
written = {
|
|
1653
|
+
...current,
|
|
1654
|
+
projects: {
|
|
1655
|
+
...current.projects,
|
|
1656
|
+
[absolutePath]: newProjectConfig,
|
|
1657
|
+
},
|
|
1658
|
+
}
|
|
1659
|
+
return written
|
|
1660
|
+
},
|
|
1661
|
+
)
|
|
1662
|
+
if (didWrite && written) {
|
|
1663
|
+
writeThroughGlobalConfigCache(written)
|
|
1664
|
+
}
|
|
1665
|
+
} catch (error) {
|
|
1666
|
+
logForDebugging(`Failed to save config with lock: ${error}`, {
|
|
1667
|
+
level: 'error',
|
|
1668
|
+
})
|
|
1669
|
+
|
|
1670
|
+
// Same race window as saveGlobalConfig's fallback -- refuse to write
|
|
1671
|
+
// defaults over good cached config. See GH #3117.
|
|
1672
|
+
const config = getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig)
|
|
1673
|
+
if (wouldLoseAuthState(config)) {
|
|
1674
|
+
logForDebugging(
|
|
1675
|
+
'saveCurrentProjectConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.',
|
|
1676
|
+
{ level: 'error' },
|
|
1677
|
+
)
|
|
1678
|
+
logEvent('tengu_config_auth_loss_prevented', {})
|
|
1679
|
+
return
|
|
1680
|
+
}
|
|
1681
|
+
const currentProjectConfig =
|
|
1682
|
+
config.projects?.[absolutePath] ?? DEFAULT_PROJECT_CONFIG
|
|
1683
|
+
const newProjectConfig = updater(currentProjectConfig)
|
|
1684
|
+
// Skip if no changes (same reference returned)
|
|
1685
|
+
if (newProjectConfig === currentProjectConfig) {
|
|
1686
|
+
return
|
|
1687
|
+
}
|
|
1688
|
+
written = {
|
|
1689
|
+
...config,
|
|
1690
|
+
projects: {
|
|
1691
|
+
...config.projects,
|
|
1692
|
+
[absolutePath]: newProjectConfig,
|
|
1693
|
+
},
|
|
1694
|
+
}
|
|
1695
|
+
saveConfig(getGlobalClaudeFile(), written, DEFAULT_GLOBAL_CONFIG)
|
|
1696
|
+
writeThroughGlobalConfigCache(written)
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
export function isAutoUpdaterDisabled(): boolean {
|
|
1701
|
+
return getAutoUpdaterDisabledReason() !== null
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
/**
|
|
1705
|
+
* Returns true if plugin autoupdate should be skipped.
|
|
1706
|
+
* This checks if the auto-updater is disabled AND the FORCE_AUTOUPDATE_PLUGINS
|
|
1707
|
+
* env var is not set to 'true'. The env var allows forcing plugin autoupdate
|
|
1708
|
+
* even when the auto-updater is otherwise disabled.
|
|
1709
|
+
*/
|
|
1710
|
+
export function shouldSkipPluginAutoupdate(): boolean {
|
|
1711
|
+
return (
|
|
1712
|
+
isAutoUpdaterDisabled() &&
|
|
1713
|
+
!isEnvTruthy(process.env.FORCE_AUTOUPDATE_PLUGINS)
|
|
1714
|
+
)
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
export type AutoUpdaterDisabledReason =
|
|
1718
|
+
| { type: 'development' }
|
|
1719
|
+
| { type: 'env'; envVar: string }
|
|
1720
|
+
| { type: 'config' }
|
|
1721
|
+
|
|
1722
|
+
export function formatAutoUpdaterDisabledReason(
|
|
1723
|
+
reason: AutoUpdaterDisabledReason,
|
|
1724
|
+
): string {
|
|
1725
|
+
switch (reason.type) {
|
|
1726
|
+
case 'development':
|
|
1727
|
+
return 'development build'
|
|
1728
|
+
case 'env':
|
|
1729
|
+
return `${reason.envVar} set`
|
|
1730
|
+
case 'config':
|
|
1731
|
+
return 'config'
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
export function getAutoUpdaterDisabledReason(): AutoUpdaterDisabledReason | null {
|
|
1736
|
+
if (process.env.NODE_ENV === 'development') {
|
|
1737
|
+
return { type: 'development' }
|
|
1738
|
+
}
|
|
1739
|
+
if (isEnvTruthy(process.env.DISABLE_AUTOUPDATER)) {
|
|
1740
|
+
return { type: 'env', envVar: 'DISABLE_AUTOUPDATER' }
|
|
1741
|
+
}
|
|
1742
|
+
const essentialTrafficEnvVar = getEssentialTrafficOnlyReason()
|
|
1743
|
+
if (essentialTrafficEnvVar) {
|
|
1744
|
+
return { type: 'env', envVar: essentialTrafficEnvVar }
|
|
1745
|
+
}
|
|
1746
|
+
const config = getGlobalConfig()
|
|
1747
|
+
if (
|
|
1748
|
+
config.autoUpdates === false &&
|
|
1749
|
+
(config.installMethod !== 'native' ||
|
|
1750
|
+
config.autoUpdatesProtectedForNative !== true)
|
|
1751
|
+
) {
|
|
1752
|
+
return { type: 'config' }
|
|
1753
|
+
}
|
|
1754
|
+
return null
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
export function getOrCreateUserID(): string {
|
|
1758
|
+
const config = getGlobalConfig()
|
|
1759
|
+
if (config.userID) {
|
|
1760
|
+
return config.userID
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
const userID = randomBytes(32).toString('hex')
|
|
1764
|
+
saveGlobalConfig(current => ({ ...current, userID }))
|
|
1765
|
+
return userID
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
export function recordFirstStartTime(): void {
|
|
1769
|
+
const config = getGlobalConfig()
|
|
1770
|
+
if (!config.firstStartTime) {
|
|
1771
|
+
const firstStartTime = new Date().toISOString()
|
|
1772
|
+
saveGlobalConfig(current => ({
|
|
1773
|
+
...current,
|
|
1774
|
+
firstStartTime: current.firstStartTime ?? firstStartTime,
|
|
1775
|
+
}))
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
export function getMemoryPath(memoryType: MemoryType): string {
|
|
1780
|
+
const cwd = getOriginalCwd()
|
|
1781
|
+
|
|
1782
|
+
switch (memoryType) {
|
|
1783
|
+
case 'User':
|
|
1784
|
+
return join(getClaudeConfigHomeDir(), 'CLAUDE.md')
|
|
1785
|
+
case 'Local':
|
|
1786
|
+
return join(cwd, 'CLAUDE.local.md')
|
|
1787
|
+
case 'Project':
|
|
1788
|
+
return join(cwd, 'CLAUDE.md')
|
|
1789
|
+
case 'Managed':
|
|
1790
|
+
return join(getManagedFilePath(), 'CLAUDE.md')
|
|
1791
|
+
case 'AutoMem':
|
|
1792
|
+
return getAutoMemEntrypoint()
|
|
1793
|
+
}
|
|
1794
|
+
// TeamMem is only a valid MemoryType when feature('TEAMMEM') is true
|
|
1795
|
+
if (feature('TEAMMEM')) {
|
|
1796
|
+
return teamMemPaths!.getTeamMemEntrypoint()
|
|
1797
|
+
}
|
|
1798
|
+
return '' // unreachable in external builds where TeamMem is not in MemoryType
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
export function getManagedClaudeRulesDir(): string {
|
|
1802
|
+
return join(getManagedFilePath(), '.claude', 'rules')
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
export function getUserClaudeRulesDir(): string {
|
|
1806
|
+
return join(getClaudeConfigHomeDir(), 'rules')
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
// Exported for testing only
|
|
1810
|
+
export const _getConfigForTesting = getConfig
|
|
1811
|
+
export const _wouldLoseAuthStateForTesting = wouldLoseAuthState
|
|
1812
|
+
export function _setGlobalConfigCacheForTesting(
|
|
1813
|
+
config: GlobalConfig | null,
|
|
1814
|
+
): void {
|
|
1815
|
+
globalConfigCache.config = config
|
|
1816
|
+
globalConfigCache.mtime = config ? Date.now() : 0
|
|
1817
|
+
}
|