@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,1519 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import chalk from 'chalk'
|
|
3
|
+
import { spawnSync } from 'child_process'
|
|
4
|
+
import {
|
|
5
|
+
copyFile,
|
|
6
|
+
mkdir,
|
|
7
|
+
readdir,
|
|
8
|
+
readFile,
|
|
9
|
+
stat,
|
|
10
|
+
symlink,
|
|
11
|
+
utimes,
|
|
12
|
+
} from 'fs/promises'
|
|
13
|
+
import ignore from 'ignore'
|
|
14
|
+
import { basename, dirname, join } from 'path'
|
|
15
|
+
import { saveCurrentProjectConfig } from './config.js'
|
|
16
|
+
import { getCwd } from './cwd.js'
|
|
17
|
+
import { logForDebugging } from './debug.js'
|
|
18
|
+
import { errorMessage, getErrnoCode } from './errors.js'
|
|
19
|
+
import { execFileNoThrow, execFileNoThrowWithCwd } from './execFileNoThrow.js'
|
|
20
|
+
import { parseGitConfigValue } from './git/gitConfigParser.js'
|
|
21
|
+
import {
|
|
22
|
+
getCommonDir,
|
|
23
|
+
readWorktreeHeadSha,
|
|
24
|
+
resolveGitDir,
|
|
25
|
+
resolveRef,
|
|
26
|
+
} from './git/gitFilesystem.js'
|
|
27
|
+
import {
|
|
28
|
+
findCanonicalGitRoot,
|
|
29
|
+
findGitRoot,
|
|
30
|
+
getBranch,
|
|
31
|
+
getDefaultBranch,
|
|
32
|
+
gitExe,
|
|
33
|
+
} from './git.js'
|
|
34
|
+
import {
|
|
35
|
+
executeWorktreeCreateHook,
|
|
36
|
+
executeWorktreeRemoveHook,
|
|
37
|
+
hasWorktreeCreateHook,
|
|
38
|
+
} from './hooks.js'
|
|
39
|
+
import { containsPathTraversal } from './path.js'
|
|
40
|
+
import { getPlatform } from './platform.js'
|
|
41
|
+
import {
|
|
42
|
+
getInitialSettings,
|
|
43
|
+
getRelativeSettingsFilePathForSource,
|
|
44
|
+
} from './settings/settings.js'
|
|
45
|
+
import { sleep } from './sleep.js'
|
|
46
|
+
import { isInITerm2 } from './swarm/backends/detection.js'
|
|
47
|
+
|
|
48
|
+
const VALID_WORKTREE_SLUG_SEGMENT = /^[a-zA-Z0-9._-]+$/
|
|
49
|
+
const MAX_WORKTREE_SLUG_LENGTH = 64
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Validates a worktree slug to prevent path traversal and directory escape.
|
|
53
|
+
*
|
|
54
|
+
* The slug is joined into `.claude/worktrees/<slug>` via path.join, which
|
|
55
|
+
* normalizes `..` segments — so `../../../target` would escape the worktrees
|
|
56
|
+
* directory. Similarly, an absolute path (leading `/` or `C:\`) would discard
|
|
57
|
+
* the prefix entirely.
|
|
58
|
+
*
|
|
59
|
+
* Forward slashes are allowed for nesting (e.g. `asm/feature-foo`); each
|
|
60
|
+
* segment is validated independently against the allowlist, so `.` / `..`
|
|
61
|
+
* segments and drive-spec characters are still rejected.
|
|
62
|
+
*
|
|
63
|
+
* Throws synchronously — callers rely on this running before any side effects
|
|
64
|
+
* (git commands, hook execution, chdir).
|
|
65
|
+
*/
|
|
66
|
+
export function validateWorktreeSlug(slug: string): void {
|
|
67
|
+
if (slug.length > MAX_WORKTREE_SLUG_LENGTH) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`Invalid worktree name: must be ${MAX_WORKTREE_SLUG_LENGTH} characters or fewer (got ${slug.length})`,
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
// Leading or trailing `/` would make path.join produce an absolute path
|
|
73
|
+
// or a dangling segment. Splitting and validating each segment rejects
|
|
74
|
+
// both (empty segments fail the regex) while allowing `user/feature`.
|
|
75
|
+
for (const segment of slug.split('/')) {
|
|
76
|
+
if (segment === '.' || segment === '..') {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`Invalid worktree name "${slug}": must not contain "." or ".." path segments`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
if (!VALID_WORKTREE_SLUG_SEGMENT.test(segment)) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Invalid worktree name "${slug}": each "/"-separated segment must be non-empty and contain only letters, digits, dots, underscores, and dashes`,
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Helper function to create directories recursively
|
|
90
|
+
async function mkdirRecursive(dirPath: string): Promise<void> {
|
|
91
|
+
await mkdir(dirPath, { recursive: true })
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Symlinks directories from the main repository to avoid duplication.
|
|
96
|
+
* This prevents disk bloat from duplicating node_modules and other large directories.
|
|
97
|
+
*
|
|
98
|
+
* @param repoRootPath - Path to the main repository root
|
|
99
|
+
* @param worktreePath - Path to the worktree directory
|
|
100
|
+
* @param dirsToSymlink - Array of directory names to symlink (e.g., ['node_modules'])
|
|
101
|
+
*/
|
|
102
|
+
async function symlinkDirectories(
|
|
103
|
+
repoRootPath: string,
|
|
104
|
+
worktreePath: string,
|
|
105
|
+
dirsToSymlink: string[],
|
|
106
|
+
): Promise<void> {
|
|
107
|
+
for (const dir of dirsToSymlink) {
|
|
108
|
+
// Validate directory doesn't escape repository boundaries
|
|
109
|
+
if (containsPathTraversal(dir)) {
|
|
110
|
+
logForDebugging(
|
|
111
|
+
`Skipping symlink for "${dir}": path traversal detected`,
|
|
112
|
+
{ level: 'warn' },
|
|
113
|
+
)
|
|
114
|
+
continue
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const sourcePath = join(repoRootPath, dir)
|
|
118
|
+
const destPath = join(worktreePath, dir)
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
await symlink(sourcePath, destPath, 'dir')
|
|
122
|
+
logForDebugging(
|
|
123
|
+
`Symlinked ${dir} from main repository to worktree to avoid disk bloat`,
|
|
124
|
+
)
|
|
125
|
+
} catch (error) {
|
|
126
|
+
const code = getErrnoCode(error)
|
|
127
|
+
// ENOENT: source doesn't exist yet (expected - skip silently)
|
|
128
|
+
// EEXIST: destination already exists (expected - skip silently)
|
|
129
|
+
if (code !== 'ENOENT' && code !== 'EEXIST') {
|
|
130
|
+
// Unexpected error (e.g., permission denied, unsupported platform)
|
|
131
|
+
logForDebugging(
|
|
132
|
+
`Failed to symlink ${dir} (${code ?? 'unknown'}): ${errorMessage(error)}`,
|
|
133
|
+
{ level: 'warn' },
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export type WorktreeSession = {
|
|
141
|
+
originalCwd: string
|
|
142
|
+
worktreePath: string
|
|
143
|
+
worktreeName: string
|
|
144
|
+
worktreeBranch?: string
|
|
145
|
+
originalBranch?: string
|
|
146
|
+
originalHeadCommit?: string
|
|
147
|
+
sessionId: string
|
|
148
|
+
tmuxSessionName?: string
|
|
149
|
+
hookBased?: boolean
|
|
150
|
+
/** How long worktree creation took (unset when resuming an existing worktree). */
|
|
151
|
+
creationDurationMs?: number
|
|
152
|
+
/** True if git sparse-checkout was applied via settings.worktree.sparsePaths. */
|
|
153
|
+
usedSparsePaths?: boolean
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
let currentWorktreeSession: WorktreeSession | null = null
|
|
157
|
+
|
|
158
|
+
export function getCurrentWorktreeSession(): WorktreeSession | null {
|
|
159
|
+
return currentWorktreeSession
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Restore the worktree session on --resume. The caller must have already
|
|
164
|
+
* verified the directory exists (via process.chdir) and set the bootstrap
|
|
165
|
+
* state (cwd, originalCwd).
|
|
166
|
+
*/
|
|
167
|
+
export function restoreWorktreeSession(session: WorktreeSession | null): void {
|
|
168
|
+
currentWorktreeSession = session
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function generateTmuxSessionName(
|
|
172
|
+
repoPath: string,
|
|
173
|
+
branch: string,
|
|
174
|
+
): string {
|
|
175
|
+
const repoName = basename(repoPath)
|
|
176
|
+
const combined = `${repoName}_${branch}`
|
|
177
|
+
return combined.replace(/[/.]/g, '_')
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
type WorktreeCreateResult =
|
|
181
|
+
| {
|
|
182
|
+
worktreePath: string
|
|
183
|
+
worktreeBranch: string
|
|
184
|
+
headCommit: string
|
|
185
|
+
existed: true
|
|
186
|
+
}
|
|
187
|
+
| {
|
|
188
|
+
worktreePath: string
|
|
189
|
+
worktreeBranch: string
|
|
190
|
+
headCommit: string
|
|
191
|
+
baseBranch: string
|
|
192
|
+
existed: false
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Env vars to prevent git/SSH from prompting for credentials (which hangs the CLI).
|
|
196
|
+
// GIT_TERMINAL_PROMPT=0 prevents git from opening /dev/tty for credential prompts.
|
|
197
|
+
// GIT_ASKPASS='' disables askpass GUI programs.
|
|
198
|
+
// stdin: 'ignore' closes stdin so interactive prompts can't block.
|
|
199
|
+
const GIT_NO_PROMPT_ENV = {
|
|
200
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
201
|
+
GIT_ASKPASS: '',
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function worktreesDir(repoRoot: string): string {
|
|
205
|
+
return join(repoRoot, '.claude', 'worktrees')
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Flatten nested slugs (`user/feature` → `user+feature`) for both the branch
|
|
209
|
+
// name and the directory path. Nesting in either location is unsafe:
|
|
210
|
+
// - git refs: `worktree-user` (file) vs `worktree-user/feature` (needs dir)
|
|
211
|
+
// is a D/F conflict that git rejects.
|
|
212
|
+
// - directory: `.claude/worktrees/user/feature/` lives inside the `user`
|
|
213
|
+
// worktree; `git worktree remove` on the parent deletes children with
|
|
214
|
+
// uncommitted work.
|
|
215
|
+
// `+` is valid in git branch names and filesystem paths but NOT in the
|
|
216
|
+
// slug-segment allowlist ([a-zA-Z0-9._-]), so the mapping is injective.
|
|
217
|
+
function flattenSlug(slug: string): string {
|
|
218
|
+
return slug.replaceAll('/', '+')
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function worktreeBranchName(slug: string): string {
|
|
222
|
+
return `worktree-${flattenSlug(slug)}`
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function worktreePathFor(repoRoot: string, slug: string): string {
|
|
226
|
+
return join(worktreesDir(repoRoot), flattenSlug(slug))
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Creates a new git worktree for the given slug, or resumes it if it already exists.
|
|
231
|
+
* Named worktrees reuse the same path across invocations, so the existence check
|
|
232
|
+
* prevents unconditionally running `git fetch` (which can hang waiting for credentials)
|
|
233
|
+
* on every resume.
|
|
234
|
+
*/
|
|
235
|
+
async function getOrCreateWorktree(
|
|
236
|
+
repoRoot: string,
|
|
237
|
+
slug: string,
|
|
238
|
+
options?: { prNumber?: number },
|
|
239
|
+
): Promise<WorktreeCreateResult> {
|
|
240
|
+
const worktreePath = worktreePathFor(repoRoot, slug)
|
|
241
|
+
const worktreeBranch = worktreeBranchName(slug)
|
|
242
|
+
|
|
243
|
+
// Fast resume path: if the worktree already exists skip fetch and creation.
|
|
244
|
+
// Read the .git pointer file directly (no subprocess, no upward walk) — a
|
|
245
|
+
// subprocess `rev-parse HEAD` burns ~15ms on spawn overhead even for a 2ms
|
|
246
|
+
// task, and the await yield lets background spawnSyncs pile on (seen at 55ms).
|
|
247
|
+
const existingHead = await readWorktreeHeadSha(worktreePath)
|
|
248
|
+
if (existingHead) {
|
|
249
|
+
return {
|
|
250
|
+
worktreePath,
|
|
251
|
+
worktreeBranch,
|
|
252
|
+
headCommit: existingHead,
|
|
253
|
+
existed: true,
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// New worktree: fetch base branch then add
|
|
258
|
+
await mkdir(worktreesDir(repoRoot), { recursive: true })
|
|
259
|
+
|
|
260
|
+
const fetchEnv = { ...process.env, ...GIT_NO_PROMPT_ENV }
|
|
261
|
+
|
|
262
|
+
let baseBranch: string
|
|
263
|
+
let baseSha: string | null = null
|
|
264
|
+
if (options?.prNumber) {
|
|
265
|
+
const { code: prFetchCode, stderr: prFetchStderr } =
|
|
266
|
+
await execFileNoThrowWithCwd(
|
|
267
|
+
gitExe(),
|
|
268
|
+
['fetch', 'origin', `pull/${options.prNumber}/head`],
|
|
269
|
+
{ cwd: repoRoot, stdin: 'ignore', env: fetchEnv },
|
|
270
|
+
)
|
|
271
|
+
if (prFetchCode !== 0) {
|
|
272
|
+
throw new Error(
|
|
273
|
+
`Failed to fetch PR #${options.prNumber}: ${prFetchStderr.trim() || 'PR may not exist or the repository may not have a remote named "origin"'}`,
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
baseBranch = 'FETCH_HEAD'
|
|
277
|
+
} else {
|
|
278
|
+
// If origin/<branch> already exists locally, skip fetch. In large repos
|
|
279
|
+
// (210k files, 16M objects) fetch burns ~6-8s on a local commit-graph
|
|
280
|
+
// scan before even hitting the network. A slightly stale base is fine —
|
|
281
|
+
// the user can pull in the worktree if they want latest.
|
|
282
|
+
// resolveRef reads the loose/packed ref directly; when it succeeds we
|
|
283
|
+
// already have the SHA, so the later rev-parse is skipped entirely.
|
|
284
|
+
const [defaultBranch, gitDir] = await Promise.all([
|
|
285
|
+
getDefaultBranch(),
|
|
286
|
+
resolveGitDir(repoRoot),
|
|
287
|
+
])
|
|
288
|
+
const originRef = `origin/${defaultBranch}`
|
|
289
|
+
const originSha = gitDir
|
|
290
|
+
? await resolveRef(gitDir, `refs/remotes/origin/${defaultBranch}`)
|
|
291
|
+
: null
|
|
292
|
+
if (originSha) {
|
|
293
|
+
baseBranch = originRef
|
|
294
|
+
baseSha = originSha
|
|
295
|
+
} else {
|
|
296
|
+
const { code: fetchCode } = await execFileNoThrowWithCwd(
|
|
297
|
+
gitExe(),
|
|
298
|
+
['fetch', 'origin', defaultBranch],
|
|
299
|
+
{ cwd: repoRoot, stdin: 'ignore', env: fetchEnv },
|
|
300
|
+
)
|
|
301
|
+
baseBranch = fetchCode === 0 ? originRef : 'HEAD'
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// For the fetch/PR-fetch paths we still need the SHA — the fs-only resolveRef
|
|
306
|
+
// above only covers the "origin/<branch> already exists locally" case.
|
|
307
|
+
if (!baseSha) {
|
|
308
|
+
const { stdout, code: shaCode } = await execFileNoThrowWithCwd(
|
|
309
|
+
gitExe(),
|
|
310
|
+
['rev-parse', baseBranch],
|
|
311
|
+
{ cwd: repoRoot },
|
|
312
|
+
)
|
|
313
|
+
if (shaCode !== 0) {
|
|
314
|
+
throw new Error(
|
|
315
|
+
`Failed to resolve base branch "${baseBranch}": git rev-parse failed`,
|
|
316
|
+
)
|
|
317
|
+
}
|
|
318
|
+
baseSha = stdout.trim()
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const sparsePaths = getInitialSettings().worktree?.sparsePaths
|
|
322
|
+
const addArgs = ['worktree', 'add']
|
|
323
|
+
if (sparsePaths?.length) {
|
|
324
|
+
addArgs.push('--no-checkout')
|
|
325
|
+
}
|
|
326
|
+
// -B (not -b): reset any orphan branch left behind by a removed worktree dir.
|
|
327
|
+
// Saves a `git branch -D` subprocess (~15ms spawn overhead) on every create.
|
|
328
|
+
addArgs.push('-B', worktreeBranch, worktreePath, baseBranch)
|
|
329
|
+
|
|
330
|
+
const { code: createCode, stderr: createStderr } =
|
|
331
|
+
await execFileNoThrowWithCwd(gitExe(), addArgs, { cwd: repoRoot })
|
|
332
|
+
if (createCode !== 0) {
|
|
333
|
+
throw new Error(`Failed to create worktree: ${createStderr}`)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (sparsePaths?.length) {
|
|
337
|
+
// If sparse-checkout or checkout fail after --no-checkout, the worktree
|
|
338
|
+
// is registered and HEAD is set but the working tree is empty. Next run's
|
|
339
|
+
// fast-resume (rev-parse HEAD) would succeed and present a broken worktree
|
|
340
|
+
// as "resumed". Tear it down before propagating the error.
|
|
341
|
+
const tearDown = async (msg: string): Promise<never> => {
|
|
342
|
+
await execFileNoThrowWithCwd(
|
|
343
|
+
gitExe(),
|
|
344
|
+
['worktree', 'remove', '--force', worktreePath],
|
|
345
|
+
{ cwd: repoRoot },
|
|
346
|
+
)
|
|
347
|
+
throw new Error(msg)
|
|
348
|
+
}
|
|
349
|
+
const { code: sparseCode, stderr: sparseErr } =
|
|
350
|
+
await execFileNoThrowWithCwd(
|
|
351
|
+
gitExe(),
|
|
352
|
+
['sparse-checkout', 'set', '--cone', '--', ...sparsePaths],
|
|
353
|
+
{ cwd: worktreePath },
|
|
354
|
+
)
|
|
355
|
+
if (sparseCode !== 0) {
|
|
356
|
+
await tearDown(`Failed to configure sparse-checkout: ${sparseErr}`)
|
|
357
|
+
}
|
|
358
|
+
const { code: coCode, stderr: coErr } = await execFileNoThrowWithCwd(
|
|
359
|
+
gitExe(),
|
|
360
|
+
['checkout', 'HEAD'],
|
|
361
|
+
{ cwd: worktreePath },
|
|
362
|
+
)
|
|
363
|
+
if (coCode !== 0) {
|
|
364
|
+
await tearDown(`Failed to checkout sparse worktree: ${coErr}`)
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
worktreePath,
|
|
370
|
+
worktreeBranch,
|
|
371
|
+
headCommit: baseSha,
|
|
372
|
+
baseBranch,
|
|
373
|
+
existed: false,
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Copy gitignored files specified in .worktreeinclude from base repo to worktree.
|
|
379
|
+
*
|
|
380
|
+
* Only copies files that are BOTH:
|
|
381
|
+
* 1. Matched by patterns in .worktreeinclude (uses .gitignore syntax)
|
|
382
|
+
* 2. Gitignored (not tracked by git)
|
|
383
|
+
*
|
|
384
|
+
* Uses `git ls-files --others --ignored --exclude-standard --directory` to list
|
|
385
|
+
* gitignored entries with fully-ignored dirs collapsed to single entries (so large
|
|
386
|
+
* build outputs like node_modules/ don't force a full tree walk), then filters
|
|
387
|
+
* against .worktreeinclude patterns in-process using the `ignore` library. If a
|
|
388
|
+
* .worktreeinclude pattern explicitly targets a path inside a collapsed directory,
|
|
389
|
+
* that directory is expanded with a second scoped `ls-files` call.
|
|
390
|
+
*/
|
|
391
|
+
export async function copyWorktreeIncludeFiles(
|
|
392
|
+
repoRoot: string,
|
|
393
|
+
worktreePath: string,
|
|
394
|
+
): Promise<string[]> {
|
|
395
|
+
let includeContent: string
|
|
396
|
+
try {
|
|
397
|
+
includeContent = await readFile(join(repoRoot, '.worktreeinclude'), 'utf-8')
|
|
398
|
+
} catch {
|
|
399
|
+
return []
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const patterns = includeContent
|
|
403
|
+
.split(/\r?\n/)
|
|
404
|
+
.map(line => line.trim())
|
|
405
|
+
.filter(line => line.length > 0 && !line.startsWith('#'))
|
|
406
|
+
if (patterns.length === 0) {
|
|
407
|
+
return []
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Single pass with --directory: collapses fully-gitignored dirs (node_modules/,
|
|
411
|
+
// .turbo/, etc.) into single entries instead of listing every file inside.
|
|
412
|
+
// In a large repo this cuts ~500k entries/~7s down to ~hundreds of entries/~100ms.
|
|
413
|
+
const gitignored = await execFileNoThrowWithCwd(
|
|
414
|
+
gitExe(),
|
|
415
|
+
['ls-files', '--others', '--ignored', '--exclude-standard', '--directory'],
|
|
416
|
+
{ cwd: repoRoot },
|
|
417
|
+
)
|
|
418
|
+
if (gitignored.code !== 0 || !gitignored.stdout.trim()) {
|
|
419
|
+
return []
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const entries = gitignored.stdout.trim().split('\n').filter(Boolean)
|
|
423
|
+
const matcher = ignore().add(includeContent)
|
|
424
|
+
|
|
425
|
+
// --directory emits collapsed dirs with a trailing slash; everything else is
|
|
426
|
+
// an individual file.
|
|
427
|
+
const collapsedDirs = entries.filter(e => e.endsWith('/'))
|
|
428
|
+
const files = entries.filter(e => !e.endsWith('/') && matcher.ignores(e))
|
|
429
|
+
|
|
430
|
+
// Edge case: a .worktreeinclude pattern targets a path inside a collapsed dir
|
|
431
|
+
// (e.g. pattern `config/secrets/api.key` when all of `config/secrets/` is
|
|
432
|
+
// gitignored with no tracked siblings). Expand only dirs where a pattern has
|
|
433
|
+
// that dir as its explicit path prefix (stripping redundant leading `/`), the
|
|
434
|
+
// dir falls under an anchored glob's literal prefix (e.g. `config/**/*.key`
|
|
435
|
+
// expands `config/secrets/`), or the dir itself matches a pattern. We don't
|
|
436
|
+
// expand for `**/` or anchorless patterns -- those match files in tracked dirs
|
|
437
|
+
// (already listed individually) and expanding every collapsed dir for them
|
|
438
|
+
// would defeat the perf win.
|
|
439
|
+
const dirsToExpand = collapsedDirs.filter(dir => {
|
|
440
|
+
if (
|
|
441
|
+
patterns.some(p => {
|
|
442
|
+
const normalized = p.startsWith('/') ? p.slice(1) : p
|
|
443
|
+
// Literal prefix match: pattern starts with the collapsed dir path
|
|
444
|
+
if (normalized.startsWith(dir)) return true
|
|
445
|
+
// Anchored glob: dir falls under the pattern's literal (non-glob) prefix
|
|
446
|
+
// e.g. `config/**/*.key` has literal prefix `config/` → expand `config/secrets/`
|
|
447
|
+
const globIdx = normalized.search(/[*?[]/)
|
|
448
|
+
if (globIdx > 0) {
|
|
449
|
+
const literalPrefix = normalized.slice(0, globIdx)
|
|
450
|
+
if (dir.startsWith(literalPrefix)) return true
|
|
451
|
+
}
|
|
452
|
+
return false
|
|
453
|
+
})
|
|
454
|
+
)
|
|
455
|
+
return true
|
|
456
|
+
if (matcher.ignores(dir.slice(0, -1))) return true
|
|
457
|
+
return false
|
|
458
|
+
})
|
|
459
|
+
if (dirsToExpand.length > 0) {
|
|
460
|
+
const expanded = await execFileNoThrowWithCwd(
|
|
461
|
+
gitExe(),
|
|
462
|
+
[
|
|
463
|
+
'ls-files',
|
|
464
|
+
'--others',
|
|
465
|
+
'--ignored',
|
|
466
|
+
'--exclude-standard',
|
|
467
|
+
'--',
|
|
468
|
+
...dirsToExpand,
|
|
469
|
+
],
|
|
470
|
+
{ cwd: repoRoot },
|
|
471
|
+
)
|
|
472
|
+
if (expanded.code === 0 && expanded.stdout.trim()) {
|
|
473
|
+
for (const f of expanded.stdout.trim().split('\n').filter(Boolean)) {
|
|
474
|
+
if (matcher.ignores(f)) {
|
|
475
|
+
files.push(f)
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
const copied: string[] = []
|
|
481
|
+
|
|
482
|
+
for (const relativePath of files) {
|
|
483
|
+
const srcPath = join(repoRoot, relativePath)
|
|
484
|
+
const destPath = join(worktreePath, relativePath)
|
|
485
|
+
try {
|
|
486
|
+
await mkdir(dirname(destPath), { recursive: true })
|
|
487
|
+
await copyFile(srcPath, destPath)
|
|
488
|
+
copied.push(relativePath)
|
|
489
|
+
} catch (e: unknown) {
|
|
490
|
+
logForDebugging(
|
|
491
|
+
`Failed to copy ${relativePath} to worktree: ${(e as Error).message}`,
|
|
492
|
+
{ level: 'warn' },
|
|
493
|
+
)
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (copied.length > 0) {
|
|
498
|
+
logForDebugging(
|
|
499
|
+
`Copied ${copied.length} files from .worktreeinclude: ${copied.join(', ')}`,
|
|
500
|
+
)
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return copied
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Post-creation setup for a newly created worktree.
|
|
508
|
+
* Propagates settings.local.json, configures git hooks, and symlinks directories.
|
|
509
|
+
*/
|
|
510
|
+
async function performPostCreationSetup(
|
|
511
|
+
repoRoot: string,
|
|
512
|
+
worktreePath: string,
|
|
513
|
+
): Promise<void> {
|
|
514
|
+
// Copy settings.local.json to the worktree's .claude directory
|
|
515
|
+
// This propagates local settings (which may contain secrets) to the worktree
|
|
516
|
+
const localSettingsRelativePath =
|
|
517
|
+
getRelativeSettingsFilePathForSource('localSettings')
|
|
518
|
+
const sourceSettingsLocal = join(repoRoot, localSettingsRelativePath)
|
|
519
|
+
try {
|
|
520
|
+
const destSettingsLocal = join(worktreePath, localSettingsRelativePath)
|
|
521
|
+
await mkdirRecursive(dirname(destSettingsLocal))
|
|
522
|
+
await copyFile(sourceSettingsLocal, destSettingsLocal)
|
|
523
|
+
logForDebugging(
|
|
524
|
+
`Copied settings.local.json to worktree: ${destSettingsLocal}`,
|
|
525
|
+
)
|
|
526
|
+
} catch (e: unknown) {
|
|
527
|
+
const code = getErrnoCode(e)
|
|
528
|
+
if (code !== 'ENOENT') {
|
|
529
|
+
logForDebugging(
|
|
530
|
+
`Failed to copy settings.local.json: ${(e as Error).message}`,
|
|
531
|
+
{ level: 'warn' },
|
|
532
|
+
)
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Configure the worktree to use hooks from the main repository
|
|
537
|
+
// This solves issues with .husky and other git hooks that use relative paths
|
|
538
|
+
const huskyPath = join(repoRoot, '.husky')
|
|
539
|
+
const gitHooksPath = join(repoRoot, '.git', 'hooks')
|
|
540
|
+
let hooksPath: string | null = null
|
|
541
|
+
for (const candidatePath of [huskyPath, gitHooksPath]) {
|
|
542
|
+
try {
|
|
543
|
+
const s = await stat(candidatePath)
|
|
544
|
+
if (s.isDirectory()) {
|
|
545
|
+
hooksPath = candidatePath
|
|
546
|
+
break
|
|
547
|
+
}
|
|
548
|
+
} catch {
|
|
549
|
+
// Path doesn't exist or can't be accessed
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
if (hooksPath) {
|
|
553
|
+
// `git config` (no --worktree flag) writes to the main repo's .git/config,
|
|
554
|
+
// shared by all worktrees. Once set, every subsequent worktree create is a
|
|
555
|
+
// no-op — skip the subprocess (~14ms spawn) when the value already matches.
|
|
556
|
+
const gitDir = await resolveGitDir(repoRoot)
|
|
557
|
+
const configDir = gitDir ? ((await getCommonDir(gitDir)) ?? gitDir) : null
|
|
558
|
+
const existing = configDir
|
|
559
|
+
? await parseGitConfigValue(configDir, 'core', null, 'hooksPath')
|
|
560
|
+
: null
|
|
561
|
+
if (existing !== hooksPath) {
|
|
562
|
+
const { code: configCode, stderr: configError } =
|
|
563
|
+
await execFileNoThrowWithCwd(
|
|
564
|
+
gitExe(),
|
|
565
|
+
['config', 'core.hooksPath', hooksPath],
|
|
566
|
+
{ cwd: worktreePath },
|
|
567
|
+
)
|
|
568
|
+
if (configCode === 0) {
|
|
569
|
+
logForDebugging(
|
|
570
|
+
`Configured worktree to use hooks from main repository: ${hooksPath}`,
|
|
571
|
+
)
|
|
572
|
+
} else {
|
|
573
|
+
logForDebugging(`Failed to configure hooks path: ${configError}`, {
|
|
574
|
+
level: 'error',
|
|
575
|
+
})
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Symlink directories to avoid disk bloat (opt-in via settings)
|
|
581
|
+
const settings = getInitialSettings()
|
|
582
|
+
const dirsToSymlink = settings.worktree?.symlinkDirectories ?? []
|
|
583
|
+
if (dirsToSymlink.length > 0) {
|
|
584
|
+
await symlinkDirectories(repoRoot, worktreePath, dirsToSymlink)
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Copy gitignored files specified in .worktreeinclude (best-effort)
|
|
588
|
+
await copyWorktreeIncludeFiles(repoRoot, worktreePath)
|
|
589
|
+
|
|
590
|
+
// The core.hooksPath config-set above is fragile: husky's prepare script
|
|
591
|
+
// (`git config core.hooksPath .husky`) runs on every `bun install` and
|
|
592
|
+
// resets the SHARED .git/config value back to relative, causing each
|
|
593
|
+
// worktree to resolve to its OWN .husky/ again. The attribution hook
|
|
594
|
+
// file isn't tracked (it's in .git/info/exclude), so fresh worktrees
|
|
595
|
+
// don't have it. Install it directly into the worktree's .husky/ —
|
|
596
|
+
// husky won't delete it (husky install is additive-only), and for
|
|
597
|
+
// non-husky repos this resolves to the shared .git/hooks/ (idempotent).
|
|
598
|
+
//
|
|
599
|
+
// Pass the worktree-local .husky explicitly: getHooksDir would return
|
|
600
|
+
// the absolute core.hooksPath we just set above (main repo's .husky),
|
|
601
|
+
// not the worktree's — `git rev-parse --git-path hooks` echoes the config
|
|
602
|
+
// value verbatim when it's absolute.
|
|
603
|
+
if (feature('COMMIT_ATTRIBUTION')) {
|
|
604
|
+
const worktreeHooksDir =
|
|
605
|
+
hooksPath === huskyPath ? join(worktreePath, '.husky') : undefined
|
|
606
|
+
void import('./postCommitAttribution.js')
|
|
607
|
+
.then(m =>
|
|
608
|
+
m
|
|
609
|
+
.installPrepareCommitMsgHook(worktreePath, worktreeHooksDir)
|
|
610
|
+
.catch(error => {
|
|
611
|
+
logForDebugging(
|
|
612
|
+
`Failed to install attribution hook in worktree: ${error}`,
|
|
613
|
+
)
|
|
614
|
+
}),
|
|
615
|
+
)
|
|
616
|
+
.catch(error => {
|
|
617
|
+
// Dynamic import() itself rejected (module load failure). The inner
|
|
618
|
+
// .catch above only handles installPrepareCommitMsgHook rejection —
|
|
619
|
+
// without this outer handler an import failure would surface as an
|
|
620
|
+
// unhandled promise rejection.
|
|
621
|
+
logForDebugging(`Failed to load postCommitAttribution module: ${error}`)
|
|
622
|
+
})
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Parses a PR reference from a string.
|
|
628
|
+
* Accepts GitHub-style PR URLs (e.g., https://github.com/owner/repo/pull/123,
|
|
629
|
+
* or GHE equivalents like https://ghe.example.com/owner/repo/pull/123)
|
|
630
|
+
* or `#N` format (e.g., #123).
|
|
631
|
+
* Returns the PR number or null if the string is not a recognized PR reference.
|
|
632
|
+
*/
|
|
633
|
+
export function parsePRReference(input: string): number | null {
|
|
634
|
+
// GitHub-style PR URL: https://<host>/owner/repo/pull/123 (with optional trailing slash, query, hash)
|
|
635
|
+
// The /pull/N path shape is specific to GitHub — GitLab uses /-/merge_requests/N,
|
|
636
|
+
// Bitbucket uses /pull-requests/N — so matching any host here is safe.
|
|
637
|
+
const urlMatch = input.match(
|
|
638
|
+
/^https?:\/\/[^/]+\/[^/]+\/[^/]+\/pull\/(\d+)\/?(?:[?#].*)?$/i,
|
|
639
|
+
)
|
|
640
|
+
if (urlMatch?.[1]) {
|
|
641
|
+
return parseInt(urlMatch[1], 10)
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
// #N format
|
|
645
|
+
const hashMatch = input.match(/^#(\d+)$/)
|
|
646
|
+
if (hashMatch?.[1]) {
|
|
647
|
+
return parseInt(hashMatch[1], 10)
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
return null
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
export async function isTmuxAvailable(): Promise<boolean> {
|
|
654
|
+
const { code } = await execFileNoThrow('tmux', ['-V'])
|
|
655
|
+
return code === 0
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
export function getTmuxInstallInstructions(): string {
|
|
659
|
+
const platform = getPlatform()
|
|
660
|
+
switch (platform) {
|
|
661
|
+
case 'macos':
|
|
662
|
+
return 'Install tmux with: brew install tmux'
|
|
663
|
+
case 'linux':
|
|
664
|
+
case 'wsl':
|
|
665
|
+
return 'Install tmux with: sudo apt install tmux (Debian/Ubuntu) or sudo dnf install tmux (Fedora/RHEL)'
|
|
666
|
+
case 'windows':
|
|
667
|
+
return 'tmux is not natively available on Windows. Consider using WSL or Cygwin.'
|
|
668
|
+
default:
|
|
669
|
+
return 'Install tmux using your system package manager.'
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
export async function createTmuxSessionForWorktree(
|
|
674
|
+
sessionName: string,
|
|
675
|
+
worktreePath: string,
|
|
676
|
+
): Promise<{ created: boolean; error?: string }> {
|
|
677
|
+
const { code, stderr } = await execFileNoThrow('tmux', [
|
|
678
|
+
'new-session',
|
|
679
|
+
'-d',
|
|
680
|
+
'-s',
|
|
681
|
+
sessionName,
|
|
682
|
+
'-c',
|
|
683
|
+
worktreePath,
|
|
684
|
+
])
|
|
685
|
+
|
|
686
|
+
if (code !== 0) {
|
|
687
|
+
return { created: false, error: stderr }
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
return { created: true }
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
export async function killTmuxSession(sessionName: string): Promise<boolean> {
|
|
694
|
+
const { code } = await execFileNoThrow('tmux', [
|
|
695
|
+
'kill-session',
|
|
696
|
+
'-t',
|
|
697
|
+
sessionName,
|
|
698
|
+
])
|
|
699
|
+
return code === 0
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
export async function createWorktreeForSession(
|
|
703
|
+
sessionId: string,
|
|
704
|
+
slug: string,
|
|
705
|
+
tmuxSessionName?: string,
|
|
706
|
+
options?: { prNumber?: number },
|
|
707
|
+
): Promise<WorktreeSession> {
|
|
708
|
+
// Must run before the hook branch below — hooks receive the raw slug as an
|
|
709
|
+
// argument, and the git branch builds a path from it via path.join.
|
|
710
|
+
validateWorktreeSlug(slug)
|
|
711
|
+
|
|
712
|
+
const originalCwd = getCwd()
|
|
713
|
+
|
|
714
|
+
// Try hook-based worktree creation first (allows user-configured VCS)
|
|
715
|
+
if (hasWorktreeCreateHook()) {
|
|
716
|
+
const hookResult = await executeWorktreeCreateHook(slug)
|
|
717
|
+
logForDebugging(
|
|
718
|
+
`Created hook-based worktree at: ${hookResult.worktreePath}`,
|
|
719
|
+
)
|
|
720
|
+
|
|
721
|
+
currentWorktreeSession = {
|
|
722
|
+
originalCwd,
|
|
723
|
+
worktreePath: hookResult.worktreePath,
|
|
724
|
+
worktreeName: slug,
|
|
725
|
+
sessionId,
|
|
726
|
+
tmuxSessionName,
|
|
727
|
+
hookBased: true,
|
|
728
|
+
}
|
|
729
|
+
} else {
|
|
730
|
+
// Fall back to git worktree
|
|
731
|
+
const gitRoot = findGitRoot(getCwd())
|
|
732
|
+
if (!gitRoot) {
|
|
733
|
+
throw new Error(
|
|
734
|
+
'Cannot create a worktree: not in a git repository and no WorktreeCreate hooks are configured. ' +
|
|
735
|
+
'Configure WorktreeCreate/WorktreeRemove hooks in settings.json to use worktree isolation with other VCS systems.',
|
|
736
|
+
)
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
const originalBranch = await getBranch()
|
|
740
|
+
|
|
741
|
+
const createStart = Date.now()
|
|
742
|
+
const { worktreePath, worktreeBranch, headCommit, existed } =
|
|
743
|
+
await getOrCreateWorktree(gitRoot, slug, options)
|
|
744
|
+
|
|
745
|
+
let creationDurationMs: number | undefined
|
|
746
|
+
if (existed) {
|
|
747
|
+
logForDebugging(`Resuming existing worktree at: ${worktreePath}`)
|
|
748
|
+
} else {
|
|
749
|
+
logForDebugging(
|
|
750
|
+
`Created worktree at: ${worktreePath} on branch: ${worktreeBranch}`,
|
|
751
|
+
)
|
|
752
|
+
await performPostCreationSetup(gitRoot, worktreePath)
|
|
753
|
+
creationDurationMs = Date.now() - createStart
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
currentWorktreeSession = {
|
|
757
|
+
originalCwd,
|
|
758
|
+
worktreePath,
|
|
759
|
+
worktreeName: slug,
|
|
760
|
+
worktreeBranch,
|
|
761
|
+
originalBranch,
|
|
762
|
+
originalHeadCommit: headCommit,
|
|
763
|
+
sessionId,
|
|
764
|
+
tmuxSessionName,
|
|
765
|
+
creationDurationMs,
|
|
766
|
+
usedSparsePaths:
|
|
767
|
+
(getInitialSettings().worktree?.sparsePaths?.length ?? 0) > 0,
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Save to project config for persistence
|
|
772
|
+
saveCurrentProjectConfig(current => ({
|
|
773
|
+
...current,
|
|
774
|
+
activeWorktreeSession: currentWorktreeSession ?? undefined,
|
|
775
|
+
}))
|
|
776
|
+
|
|
777
|
+
return currentWorktreeSession
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
export async function keepWorktree(): Promise<void> {
|
|
781
|
+
if (!currentWorktreeSession) {
|
|
782
|
+
return
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
try {
|
|
786
|
+
const { worktreePath, originalCwd, worktreeBranch } = currentWorktreeSession
|
|
787
|
+
|
|
788
|
+
// Change back to original directory first
|
|
789
|
+
process.chdir(originalCwd)
|
|
790
|
+
|
|
791
|
+
// Clear the session but keep the worktree intact
|
|
792
|
+
currentWorktreeSession = null
|
|
793
|
+
|
|
794
|
+
// Update config
|
|
795
|
+
saveCurrentProjectConfig(current => ({
|
|
796
|
+
...current,
|
|
797
|
+
activeWorktreeSession: undefined,
|
|
798
|
+
}))
|
|
799
|
+
|
|
800
|
+
logForDebugging(
|
|
801
|
+
`Linked worktree preserved at: ${worktreePath}${worktreeBranch ? ` on branch: ${worktreeBranch}` : ''}`,
|
|
802
|
+
)
|
|
803
|
+
logForDebugging(
|
|
804
|
+
`You can continue working there by running: cd ${worktreePath}`,
|
|
805
|
+
)
|
|
806
|
+
} catch (error) {
|
|
807
|
+
logForDebugging(`Error keeping worktree: ${error}`, {
|
|
808
|
+
level: 'error',
|
|
809
|
+
})
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
export async function cleanupWorktree(): Promise<void> {
|
|
814
|
+
if (!currentWorktreeSession) {
|
|
815
|
+
return
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
try {
|
|
819
|
+
const { worktreePath, originalCwd, worktreeBranch, hookBased } =
|
|
820
|
+
currentWorktreeSession
|
|
821
|
+
|
|
822
|
+
// Change back to original directory first
|
|
823
|
+
process.chdir(originalCwd)
|
|
824
|
+
|
|
825
|
+
if (hookBased) {
|
|
826
|
+
// Hook-based worktree: delegate cleanup to WorktreeRemove hook
|
|
827
|
+
const hookRan = await executeWorktreeRemoveHook(worktreePath)
|
|
828
|
+
if (hookRan) {
|
|
829
|
+
logForDebugging(`Removed hook-based worktree at: ${worktreePath}`)
|
|
830
|
+
} else {
|
|
831
|
+
logForDebugging(
|
|
832
|
+
`No WorktreeRemove hook configured, hook-based worktree left at: ${worktreePath}`,
|
|
833
|
+
{ level: 'warn' },
|
|
834
|
+
)
|
|
835
|
+
}
|
|
836
|
+
} else {
|
|
837
|
+
// Git-based worktree: use git worktree remove.
|
|
838
|
+
// Explicit cwd: process.chdir above does NOT update getCwd() (the state
|
|
839
|
+
// CWD that execFileNoThrow defaults to). If the model cd'd to a non-repo
|
|
840
|
+
// dir, the bare execFileNoThrow variant would fail silently here.
|
|
841
|
+
const { code: removeCode, stderr: removeError } =
|
|
842
|
+
await execFileNoThrowWithCwd(
|
|
843
|
+
gitExe(),
|
|
844
|
+
['worktree', 'remove', '--force', worktreePath],
|
|
845
|
+
{ cwd: originalCwd },
|
|
846
|
+
)
|
|
847
|
+
|
|
848
|
+
if (removeCode !== 0) {
|
|
849
|
+
logForDebugging(`Failed to remove linked worktree: ${removeError}`, {
|
|
850
|
+
level: 'error',
|
|
851
|
+
})
|
|
852
|
+
} else {
|
|
853
|
+
logForDebugging(`Removed linked worktree at: ${worktreePath}`)
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
// Clear the session
|
|
858
|
+
currentWorktreeSession = null
|
|
859
|
+
|
|
860
|
+
// Update config
|
|
861
|
+
saveCurrentProjectConfig(current => ({
|
|
862
|
+
...current,
|
|
863
|
+
activeWorktreeSession: undefined,
|
|
864
|
+
}))
|
|
865
|
+
|
|
866
|
+
// Delete the temporary worktree branch (git-based only)
|
|
867
|
+
if (!hookBased && worktreeBranch) {
|
|
868
|
+
// Wait a bit to ensure git has released all locks
|
|
869
|
+
await sleep(100)
|
|
870
|
+
|
|
871
|
+
const { code: deleteBranchCode, stderr: deleteBranchError } =
|
|
872
|
+
await execFileNoThrowWithCwd(
|
|
873
|
+
gitExe(),
|
|
874
|
+
['branch', '-D', worktreeBranch],
|
|
875
|
+
{ cwd: originalCwd },
|
|
876
|
+
)
|
|
877
|
+
|
|
878
|
+
if (deleteBranchCode !== 0) {
|
|
879
|
+
logForDebugging(
|
|
880
|
+
`Could not delete worktree branch: ${deleteBranchError}`,
|
|
881
|
+
{ level: 'error' },
|
|
882
|
+
)
|
|
883
|
+
} else {
|
|
884
|
+
logForDebugging(`Deleted worktree branch: ${worktreeBranch}`)
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
logForDebugging('Linked worktree cleaned up completely')
|
|
889
|
+
} catch (error) {
|
|
890
|
+
logForDebugging(`Error cleaning up worktree: ${error}`, {
|
|
891
|
+
level: 'error',
|
|
892
|
+
})
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
/**
|
|
897
|
+
* Create a lightweight worktree for a subagent.
|
|
898
|
+
* Reuses getOrCreateWorktree/performPostCreationSetup but does NOT touch
|
|
899
|
+
* global session state (currentWorktreeSession, process.chdir, project config).
|
|
900
|
+
* Falls back to hook-based creation if not in a git repository.
|
|
901
|
+
*/
|
|
902
|
+
export async function createAgentWorktree(slug: string): Promise<{
|
|
903
|
+
worktreePath: string
|
|
904
|
+
worktreeBranch?: string
|
|
905
|
+
headCommit?: string
|
|
906
|
+
gitRoot?: string
|
|
907
|
+
hookBased?: boolean
|
|
908
|
+
}> {
|
|
909
|
+
validateWorktreeSlug(slug)
|
|
910
|
+
|
|
911
|
+
// Try hook-based worktree creation first (allows user-configured VCS)
|
|
912
|
+
if (hasWorktreeCreateHook()) {
|
|
913
|
+
const hookResult = await executeWorktreeCreateHook(slug)
|
|
914
|
+
logForDebugging(
|
|
915
|
+
`Created hook-based agent worktree at: ${hookResult.worktreePath}`,
|
|
916
|
+
)
|
|
917
|
+
|
|
918
|
+
return { worktreePath: hookResult.worktreePath, hookBased: true }
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
// Fall back to git worktree
|
|
922
|
+
// findCanonicalGitRoot (not findGitRoot) so agent worktrees always land in
|
|
923
|
+
// the main repo's .claude/worktrees/ even when spawned from inside a session
|
|
924
|
+
// worktree — otherwise they nest at <worktree>/.claude/worktrees/ and the
|
|
925
|
+
// periodic cleanup (which scans the canonical root) never finds them.
|
|
926
|
+
const gitRoot = findCanonicalGitRoot(getCwd())
|
|
927
|
+
if (!gitRoot) {
|
|
928
|
+
throw new Error(
|
|
929
|
+
'Cannot create agent worktree: not in a git repository and no WorktreeCreate hooks are configured. ' +
|
|
930
|
+
'Configure WorktreeCreate/WorktreeRemove hooks in settings.json to use worktree isolation with other VCS systems.',
|
|
931
|
+
)
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
const { worktreePath, worktreeBranch, headCommit, existed } =
|
|
935
|
+
await getOrCreateWorktree(gitRoot, slug)
|
|
936
|
+
|
|
937
|
+
if (!existed) {
|
|
938
|
+
logForDebugging(
|
|
939
|
+
`Created agent worktree at: ${worktreePath} on branch: ${worktreeBranch}`,
|
|
940
|
+
)
|
|
941
|
+
await performPostCreationSetup(gitRoot, worktreePath)
|
|
942
|
+
} else {
|
|
943
|
+
// Bump mtime so the periodic stale-worktree cleanup doesn't consider this
|
|
944
|
+
// worktree stale — the fast-resume path is read-only and leaves the original
|
|
945
|
+
// creation-time mtime intact, which can be past the 30-day cutoff.
|
|
946
|
+
const now = new Date()
|
|
947
|
+
await utimes(worktreePath, now, now)
|
|
948
|
+
logForDebugging(`Resuming existing agent worktree at: ${worktreePath}`)
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
return { worktreePath, worktreeBranch, headCommit, gitRoot }
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/**
|
|
955
|
+
* Remove a worktree created by createAgentWorktree.
|
|
956
|
+
* For git-based worktrees, removes the worktree directory and deletes the temporary branch.
|
|
957
|
+
* For hook-based worktrees, delegates to the WorktreeRemove hook.
|
|
958
|
+
* Must be called with the main repo's git root (for git worktrees), not the worktree path,
|
|
959
|
+
* since the worktree directory is deleted during this operation.
|
|
960
|
+
*/
|
|
961
|
+
export async function removeAgentWorktree(
|
|
962
|
+
worktreePath: string,
|
|
963
|
+
worktreeBranch?: string,
|
|
964
|
+
gitRoot?: string,
|
|
965
|
+
hookBased?: boolean,
|
|
966
|
+
): Promise<boolean> {
|
|
967
|
+
if (hookBased) {
|
|
968
|
+
const hookRan = await executeWorktreeRemoveHook(worktreePath)
|
|
969
|
+
if (hookRan) {
|
|
970
|
+
logForDebugging(`Removed hook-based agent worktree at: ${worktreePath}`)
|
|
971
|
+
} else {
|
|
972
|
+
logForDebugging(
|
|
973
|
+
`No WorktreeRemove hook configured, hook-based agent worktree left at: ${worktreePath}`,
|
|
974
|
+
{ level: 'warn' },
|
|
975
|
+
)
|
|
976
|
+
}
|
|
977
|
+
return hookRan
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
if (!gitRoot) {
|
|
981
|
+
logForDebugging('Cannot remove agent worktree: no git root provided', {
|
|
982
|
+
level: 'error',
|
|
983
|
+
})
|
|
984
|
+
return false
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
// Run from the main repo root, not the worktree (which we're about to delete)
|
|
988
|
+
const { code: removeCode, stderr: removeError } =
|
|
989
|
+
await execFileNoThrowWithCwd(
|
|
990
|
+
gitExe(),
|
|
991
|
+
['worktree', 'remove', '--force', worktreePath],
|
|
992
|
+
{ cwd: gitRoot },
|
|
993
|
+
)
|
|
994
|
+
|
|
995
|
+
if (removeCode !== 0) {
|
|
996
|
+
logForDebugging(`Failed to remove agent worktree: ${removeError}`, {
|
|
997
|
+
level: 'error',
|
|
998
|
+
})
|
|
999
|
+
return false
|
|
1000
|
+
}
|
|
1001
|
+
logForDebugging(`Removed agent worktree at: ${worktreePath}`)
|
|
1002
|
+
|
|
1003
|
+
if (!worktreeBranch) {
|
|
1004
|
+
return true
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
// Delete the temporary worktree branch from the main repo
|
|
1008
|
+
const { code: deleteBranchCode, stderr: deleteBranchError } =
|
|
1009
|
+
await execFileNoThrowWithCwd(gitExe(), ['branch', '-D', worktreeBranch], {
|
|
1010
|
+
cwd: gitRoot,
|
|
1011
|
+
})
|
|
1012
|
+
|
|
1013
|
+
if (deleteBranchCode !== 0) {
|
|
1014
|
+
logForDebugging(
|
|
1015
|
+
`Could not delete agent worktree branch: ${deleteBranchError}`,
|
|
1016
|
+
{ level: 'error' },
|
|
1017
|
+
)
|
|
1018
|
+
}
|
|
1019
|
+
return true
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Slug patterns for throwaway worktrees created by AgentTool (`agent-a<7hex>`,
|
|
1024
|
+
* from earlyAgentId.slice(0,8)), WorkflowTool (`wf_<runId>-<idx>` where runId
|
|
1025
|
+
* is randomUUID().slice(0,12) = 8 hex + `-` + 3 hex), and bridgeMain
|
|
1026
|
+
* (`bridge-<safeFilenameId>`). These leak when the parent process is killed
|
|
1027
|
+
* (Ctrl+C, ESC, crash) before their in-process cleanup runs. Exact-shape
|
|
1028
|
+
* patterns avoid sweeping user-named EnterWorktree slugs like `wf-myfeature`.
|
|
1029
|
+
*/
|
|
1030
|
+
const EPHEMERAL_WORKTREE_PATTERNS = [
|
|
1031
|
+
/^agent-a[0-9a-f]{7}$/,
|
|
1032
|
+
/^wf_[0-9a-f]{8}-[0-9a-f]{3}-\d+$/,
|
|
1033
|
+
// Legacy wf-<idx> slugs from before workflowRunId disambiguation — kept so
|
|
1034
|
+
// the 30-day sweep still cleans up worktrees leaked by older builds.
|
|
1035
|
+
/^wf-\d+$/,
|
|
1036
|
+
// Real bridge slugs are `bridge-${safeFilenameId(sessionId)}`.
|
|
1037
|
+
/^bridge-[A-Za-z0-9_]+(-[A-Za-z0-9_]+)*$/,
|
|
1038
|
+
// Template job worktrees: job-<templateName>-<8hex>. Prefix distinguishes
|
|
1039
|
+
// from user-named EnterWorktree slugs that happen to end in 8 hex.
|
|
1040
|
+
/^job-[a-zA-Z0-9._-]{1,55}-[0-9a-f]{8}$/,
|
|
1041
|
+
]
|
|
1042
|
+
|
|
1043
|
+
/**
|
|
1044
|
+
* Remove stale agent/workflow worktrees older than cutoffDate.
|
|
1045
|
+
*
|
|
1046
|
+
* Safety:
|
|
1047
|
+
* - Only touches slugs matching ephemeral patterns (never user-named worktrees)
|
|
1048
|
+
* - Skips the current session's worktree
|
|
1049
|
+
* - Fail-closed: skips if git status fails or shows tracked changes
|
|
1050
|
+
* (-uno: untracked files in a 30-day-old crashed agent worktree are build
|
|
1051
|
+
* artifacts; skipping the untracked scan is 5-10× faster on large repos)
|
|
1052
|
+
* - Fail-closed: skips if any commits aren't reachable from a remote
|
|
1053
|
+
*
|
|
1054
|
+
* `git worktree remove --force` handles both the directory and git's internal
|
|
1055
|
+
* worktree tracking. If git doesn't recognize the path as a worktree (orphaned
|
|
1056
|
+
* dir), it's left in place — a later readdir finding it stale again is harmless.
|
|
1057
|
+
*/
|
|
1058
|
+
export async function cleanupStaleAgentWorktrees(
|
|
1059
|
+
cutoffDate: Date,
|
|
1060
|
+
): Promise<number> {
|
|
1061
|
+
const gitRoot = findCanonicalGitRoot(getCwd())
|
|
1062
|
+
if (!gitRoot) {
|
|
1063
|
+
return 0
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
const dir = worktreesDir(gitRoot)
|
|
1067
|
+
let entries: string[]
|
|
1068
|
+
try {
|
|
1069
|
+
entries = await readdir(dir)
|
|
1070
|
+
} catch {
|
|
1071
|
+
return 0
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
const cutoffMs = cutoffDate.getTime()
|
|
1075
|
+
const currentPath = currentWorktreeSession?.worktreePath
|
|
1076
|
+
let removed = 0
|
|
1077
|
+
|
|
1078
|
+
for (const slug of entries) {
|
|
1079
|
+
if (!EPHEMERAL_WORKTREE_PATTERNS.some(p => p.test(slug))) {
|
|
1080
|
+
continue
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
const worktreePath = join(dir, slug)
|
|
1084
|
+
if (currentPath === worktreePath) {
|
|
1085
|
+
continue
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
let mtimeMs: number
|
|
1089
|
+
try {
|
|
1090
|
+
mtimeMs = (await stat(worktreePath)).mtimeMs
|
|
1091
|
+
} catch {
|
|
1092
|
+
continue
|
|
1093
|
+
}
|
|
1094
|
+
if (mtimeMs >= cutoffMs) {
|
|
1095
|
+
continue
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
// Both checks must succeed with empty output. Non-zero exit (corrupted
|
|
1099
|
+
// worktree, git not recognizing it, etc.) means skip — we don't know
|
|
1100
|
+
// what's in there.
|
|
1101
|
+
const [status, unpushed] = await Promise.all([
|
|
1102
|
+
execFileNoThrowWithCwd(
|
|
1103
|
+
gitExe(),
|
|
1104
|
+
['--no-optional-locks', 'status', '--porcelain', '-uno'],
|
|
1105
|
+
{ cwd: worktreePath },
|
|
1106
|
+
),
|
|
1107
|
+
execFileNoThrowWithCwd(
|
|
1108
|
+
gitExe(),
|
|
1109
|
+
['rev-list', '--max-count=1', 'HEAD', '--not', '--remotes'],
|
|
1110
|
+
{ cwd: worktreePath },
|
|
1111
|
+
),
|
|
1112
|
+
])
|
|
1113
|
+
if (status.code !== 0 || status.stdout.trim().length > 0) {
|
|
1114
|
+
continue
|
|
1115
|
+
}
|
|
1116
|
+
if (unpushed.code !== 0 || unpushed.stdout.trim().length > 0) {
|
|
1117
|
+
continue
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
if (
|
|
1121
|
+
await removeAgentWorktree(worktreePath, worktreeBranchName(slug), gitRoot)
|
|
1122
|
+
) {
|
|
1123
|
+
removed++
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
if (removed > 0) {
|
|
1128
|
+
await execFileNoThrowWithCwd(gitExe(), ['worktree', 'prune'], {
|
|
1129
|
+
cwd: gitRoot,
|
|
1130
|
+
})
|
|
1131
|
+
logForDebugging(
|
|
1132
|
+
`cleanupStaleAgentWorktrees: removed ${removed} stale worktree(s)`,
|
|
1133
|
+
)
|
|
1134
|
+
}
|
|
1135
|
+
return removed
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
/**
|
|
1139
|
+
* Check whether a worktree has uncommitted changes or new commits since creation.
|
|
1140
|
+
* Returns true if there are uncommitted changes (dirty working tree), if commits
|
|
1141
|
+
* were made on the worktree branch since `headCommit`, or if git commands fail
|
|
1142
|
+
* — callers use this to decide whether to remove a worktree, so fail-closed.
|
|
1143
|
+
*/
|
|
1144
|
+
export async function hasWorktreeChanges(
|
|
1145
|
+
worktreePath: string,
|
|
1146
|
+
headCommit: string,
|
|
1147
|
+
): Promise<boolean> {
|
|
1148
|
+
const { code: statusCode, stdout: statusOutput } =
|
|
1149
|
+
await execFileNoThrowWithCwd(gitExe(), ['status', '--porcelain'], {
|
|
1150
|
+
cwd: worktreePath,
|
|
1151
|
+
})
|
|
1152
|
+
if (statusCode !== 0) {
|
|
1153
|
+
return true
|
|
1154
|
+
}
|
|
1155
|
+
if (statusOutput.trim().length > 0) {
|
|
1156
|
+
return true
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
const { code: revListCode, stdout: revListOutput } =
|
|
1160
|
+
await execFileNoThrowWithCwd(
|
|
1161
|
+
gitExe(),
|
|
1162
|
+
['rev-list', '--count', `${headCommit}..HEAD`],
|
|
1163
|
+
{ cwd: worktreePath },
|
|
1164
|
+
)
|
|
1165
|
+
if (revListCode !== 0) {
|
|
1166
|
+
return true
|
|
1167
|
+
}
|
|
1168
|
+
if (parseInt(revListOutput.trim(), 10) > 0) {
|
|
1169
|
+
return true
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
return false
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
/**
|
|
1176
|
+
* Fast-path handler for --worktree --tmux.
|
|
1177
|
+
* Creates the worktree and execs into tmux running Claude inside.
|
|
1178
|
+
* This is called early in cli.tsx before loading the full CLI.
|
|
1179
|
+
*/
|
|
1180
|
+
export async function execIntoTmuxWorktree(args: string[]): Promise<{
|
|
1181
|
+
handled: boolean
|
|
1182
|
+
error?: string
|
|
1183
|
+
}> {
|
|
1184
|
+
// Check platform - tmux doesn't work on Windows
|
|
1185
|
+
if (process.platform === 'win32') {
|
|
1186
|
+
return {
|
|
1187
|
+
handled: false,
|
|
1188
|
+
error: 'Error: --tmux is not supported on Windows',
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
// Check if tmux is available
|
|
1193
|
+
const tmuxCheck = spawnSync('tmux', ['-V'], { encoding: 'utf-8' })
|
|
1194
|
+
if (tmuxCheck.status !== 0) {
|
|
1195
|
+
const installHint =
|
|
1196
|
+
process.platform === 'darwin'
|
|
1197
|
+
? 'Install tmux with: brew install tmux'
|
|
1198
|
+
: 'Install tmux with: sudo apt install tmux'
|
|
1199
|
+
return {
|
|
1200
|
+
handled: false,
|
|
1201
|
+
error: `Error: tmux is not installed. ${installHint}`,
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
// Parse worktree name and tmux mode from args
|
|
1206
|
+
let worktreeName: string | undefined
|
|
1207
|
+
let forceClassicTmux = false
|
|
1208
|
+
for (let i = 0; i < args.length; i++) {
|
|
1209
|
+
const arg = args[i]
|
|
1210
|
+
if (!arg) continue
|
|
1211
|
+
if (arg === '-w' || arg === '--worktree') {
|
|
1212
|
+
// Check if next arg exists and isn't another flag
|
|
1213
|
+
const next = args[i + 1]
|
|
1214
|
+
if (next && !next.startsWith('-')) {
|
|
1215
|
+
worktreeName = next
|
|
1216
|
+
}
|
|
1217
|
+
} else if (arg.startsWith('--worktree=')) {
|
|
1218
|
+
worktreeName = arg.slice('--worktree='.length)
|
|
1219
|
+
} else if (arg === '--tmux=classic') {
|
|
1220
|
+
forceClassicTmux = true
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
// Check if worktree name is a PR reference
|
|
1225
|
+
let prNumber: number | null = null
|
|
1226
|
+
if (worktreeName) {
|
|
1227
|
+
prNumber = parsePRReference(worktreeName)
|
|
1228
|
+
if (prNumber !== null) {
|
|
1229
|
+
worktreeName = `pr-${prNumber}`
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
// Generate a slug if no name provided
|
|
1234
|
+
if (!worktreeName) {
|
|
1235
|
+
const adjectives = ['swift', 'bright', 'calm', 'keen', 'bold']
|
|
1236
|
+
const nouns = ['fox', 'owl', 'elm', 'oak', 'ray']
|
|
1237
|
+
const adj = adjectives[Math.floor(Math.random() * adjectives.length)]
|
|
1238
|
+
const noun = nouns[Math.floor(Math.random() * nouns.length)]
|
|
1239
|
+
const suffix = Math.random().toString(36).slice(2, 6)
|
|
1240
|
+
worktreeName = `${adj}-${noun}-${suffix}`
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
// worktreeName is joined into worktreeDir via path.join below; apply the
|
|
1244
|
+
// same allowlist used by the in-session worktree tool so the constraint
|
|
1245
|
+
// holds uniformly regardless of entry point.
|
|
1246
|
+
try {
|
|
1247
|
+
validateWorktreeSlug(worktreeName)
|
|
1248
|
+
} catch (e) {
|
|
1249
|
+
return {
|
|
1250
|
+
handled: false,
|
|
1251
|
+
error: `Error: ${(e as Error).message}`,
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// Mirror createWorktreeForSession(): hook takes precedence over git so the
|
|
1256
|
+
// WorktreeCreate hook substitutes the VCS backend for this fast-path too
|
|
1257
|
+
// (anthropics/claude-code#39281). Git path below runs only when no hook.
|
|
1258
|
+
let worktreeDir: string
|
|
1259
|
+
let repoName: string
|
|
1260
|
+
if (hasWorktreeCreateHook()) {
|
|
1261
|
+
try {
|
|
1262
|
+
const hookResult = await executeWorktreeCreateHook(worktreeName)
|
|
1263
|
+
worktreeDir = hookResult.worktreePath
|
|
1264
|
+
} catch (error) {
|
|
1265
|
+
return {
|
|
1266
|
+
handled: false,
|
|
1267
|
+
error: `Error: ${errorMessage(error)}`,
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
repoName = basename(findCanonicalGitRoot(getCwd()) ?? getCwd())
|
|
1271
|
+
// biome-ignore lint/suspicious/noConsole: intentional console output
|
|
1272
|
+
console.log(`Using worktree via hook: ${worktreeDir}`)
|
|
1273
|
+
} else {
|
|
1274
|
+
// Get main git repo root (resolves through worktrees)
|
|
1275
|
+
const repoRoot = findCanonicalGitRoot(getCwd())
|
|
1276
|
+
if (!repoRoot) {
|
|
1277
|
+
return {
|
|
1278
|
+
handled: false,
|
|
1279
|
+
error: 'Error: --worktree requires a git repository',
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
repoName = basename(repoRoot)
|
|
1284
|
+
worktreeDir = worktreePathFor(repoRoot, worktreeName)
|
|
1285
|
+
|
|
1286
|
+
// Create or resume worktree
|
|
1287
|
+
try {
|
|
1288
|
+
const result = await getOrCreateWorktree(
|
|
1289
|
+
repoRoot,
|
|
1290
|
+
worktreeName,
|
|
1291
|
+
prNumber !== null ? { prNumber } : undefined,
|
|
1292
|
+
)
|
|
1293
|
+
if (!result.existed) {
|
|
1294
|
+
// biome-ignore lint/suspicious/noConsole: intentional console output
|
|
1295
|
+
console.log(
|
|
1296
|
+
`Created worktree: ${worktreeDir} (based on ${result.baseBranch})`,
|
|
1297
|
+
)
|
|
1298
|
+
await performPostCreationSetup(repoRoot, worktreeDir)
|
|
1299
|
+
}
|
|
1300
|
+
} catch (error) {
|
|
1301
|
+
return {
|
|
1302
|
+
handled: false,
|
|
1303
|
+
error: `Error: ${errorMessage(error)}`,
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
// Sanitize for tmux session name (replace / and . with _)
|
|
1309
|
+
const tmuxSessionName =
|
|
1310
|
+
`${repoName}_${worktreeBranchName(worktreeName)}`.replace(/[/.]/g, '_')
|
|
1311
|
+
|
|
1312
|
+
// Build new args without --tmux and --worktree (we're already in the worktree)
|
|
1313
|
+
const newArgs: string[] = []
|
|
1314
|
+
for (let i = 0; i < args.length; i++) {
|
|
1315
|
+
const arg = args[i]
|
|
1316
|
+
if (!arg) continue
|
|
1317
|
+
if (arg === '--tmux' || arg === '--tmux=classic') continue
|
|
1318
|
+
if (arg === '-w' || arg === '--worktree') {
|
|
1319
|
+
// Skip the flag and its value if present
|
|
1320
|
+
const next = args[i + 1]
|
|
1321
|
+
if (next && !next.startsWith('-')) {
|
|
1322
|
+
i++ // Skip the value too
|
|
1323
|
+
}
|
|
1324
|
+
continue
|
|
1325
|
+
}
|
|
1326
|
+
if (arg.startsWith('--worktree=')) continue
|
|
1327
|
+
newArgs.push(arg)
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
// Get tmux prefix for user guidance
|
|
1331
|
+
let tmuxPrefix = 'C-b' // default
|
|
1332
|
+
const prefixResult = spawnSync('tmux', ['show-options', '-g', 'prefix'], {
|
|
1333
|
+
encoding: 'utf-8',
|
|
1334
|
+
})
|
|
1335
|
+
if (prefixResult.status === 0 && prefixResult.stdout) {
|
|
1336
|
+
const match = prefixResult.stdout.match(/prefix\s+(\S+)/)
|
|
1337
|
+
if (match?.[1]) {
|
|
1338
|
+
tmuxPrefix = match[1]
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
// Check if tmux prefix conflicts with Claude keybindings
|
|
1343
|
+
// Claude binds: ctrl+b (task:background), ctrl+c, ctrl+d, ctrl+t, ctrl+o, ctrl+r, ctrl+s, ctrl+g, ctrl+e
|
|
1344
|
+
const claudeBindings = [
|
|
1345
|
+
'C-b',
|
|
1346
|
+
'C-c',
|
|
1347
|
+
'C-d',
|
|
1348
|
+
'C-t',
|
|
1349
|
+
'C-o',
|
|
1350
|
+
'C-r',
|
|
1351
|
+
'C-s',
|
|
1352
|
+
'C-g',
|
|
1353
|
+
'C-e',
|
|
1354
|
+
]
|
|
1355
|
+
const prefixConflicts = claudeBindings.includes(tmuxPrefix)
|
|
1356
|
+
|
|
1357
|
+
// Set env vars for the inner Claude to display tmux info in welcome message
|
|
1358
|
+
const tmuxEnv = {
|
|
1359
|
+
...process.env,
|
|
1360
|
+
CLAUDE_CODE_TMUX_SESSION: tmuxSessionName,
|
|
1361
|
+
CLAUDE_CODE_TMUX_PREFIX: tmuxPrefix,
|
|
1362
|
+
CLAUDE_CODE_TMUX_PREFIX_CONFLICTS: prefixConflicts ? '1' : '',
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
// Check if session already exists
|
|
1366
|
+
const hasSessionResult = spawnSync(
|
|
1367
|
+
'tmux',
|
|
1368
|
+
['has-session', '-t', tmuxSessionName],
|
|
1369
|
+
{ encoding: 'utf-8' },
|
|
1370
|
+
)
|
|
1371
|
+
const sessionExists = hasSessionResult.status === 0
|
|
1372
|
+
|
|
1373
|
+
// Check if we're already inside a tmux session
|
|
1374
|
+
const isAlreadyInTmux = Boolean(process.env.TMUX)
|
|
1375
|
+
|
|
1376
|
+
// Use tmux control mode (-CC) for native iTerm2 tab/pane integration
|
|
1377
|
+
// This lets users use iTerm2's UI instead of learning tmux keybindings
|
|
1378
|
+
// Use --tmux=classic to force traditional tmux even in iTerm2
|
|
1379
|
+
// Control mode doesn't make sense when already in tmux (would need to switch-client)
|
|
1380
|
+
const useControlMode = isInITerm2() && !forceClassicTmux && !isAlreadyInTmux
|
|
1381
|
+
const tmuxGlobalArgs = useControlMode ? ['-CC'] : []
|
|
1382
|
+
|
|
1383
|
+
// Print hint about iTerm2 preferences when using control mode
|
|
1384
|
+
if (useControlMode && !sessionExists) {
|
|
1385
|
+
const y = chalk.yellow
|
|
1386
|
+
// biome-ignore lint/suspicious/noConsole: intentional user guidance
|
|
1387
|
+
console.log(
|
|
1388
|
+
`\n${y('╭─ iTerm2 Tip ────────────────────────────────────────────────────────╮')}\n` +
|
|
1389
|
+
`${y('│')} To open as a tab instead of a new window: ${y('│')}\n` +
|
|
1390
|
+
`${y('│')} iTerm2 > Settings > General > tmux > "Tabs in attaching window" ${y('│')}\n` +
|
|
1391
|
+
`${y('╰─────────────────────────────────────────────────────────────────────╯')}\n`,
|
|
1392
|
+
)
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// For ants in claude-cli-internal, set up dev panes (watch + start)
|
|
1396
|
+
const isAnt = process.env.USER_TYPE === 'ant'
|
|
1397
|
+
const isClaudeCliInternal = repoName === 'claude-cli-internal'
|
|
1398
|
+
const shouldSetupDevPanes = isAnt && isClaudeCliInternal && !sessionExists
|
|
1399
|
+
|
|
1400
|
+
if (shouldSetupDevPanes) {
|
|
1401
|
+
// Create detached session with Claude in first pane
|
|
1402
|
+
spawnSync(
|
|
1403
|
+
'tmux',
|
|
1404
|
+
[
|
|
1405
|
+
'new-session',
|
|
1406
|
+
'-d', // detached
|
|
1407
|
+
'-s',
|
|
1408
|
+
tmuxSessionName,
|
|
1409
|
+
'-c',
|
|
1410
|
+
worktreeDir,
|
|
1411
|
+
'--',
|
|
1412
|
+
process.execPath,
|
|
1413
|
+
...newArgs,
|
|
1414
|
+
],
|
|
1415
|
+
{ cwd: worktreeDir, env: tmuxEnv },
|
|
1416
|
+
)
|
|
1417
|
+
|
|
1418
|
+
// Split horizontally and run watch
|
|
1419
|
+
spawnSync(
|
|
1420
|
+
'tmux',
|
|
1421
|
+
['split-window', '-h', '-t', tmuxSessionName, '-c', worktreeDir],
|
|
1422
|
+
{ cwd: worktreeDir },
|
|
1423
|
+
)
|
|
1424
|
+
spawnSync(
|
|
1425
|
+
'tmux',
|
|
1426
|
+
['send-keys', '-t', tmuxSessionName, 'bun run watch', 'Enter'],
|
|
1427
|
+
{ cwd: worktreeDir },
|
|
1428
|
+
)
|
|
1429
|
+
|
|
1430
|
+
// Split vertically and run start
|
|
1431
|
+
spawnSync(
|
|
1432
|
+
'tmux',
|
|
1433
|
+
['split-window', '-v', '-t', tmuxSessionName, '-c', worktreeDir],
|
|
1434
|
+
{ cwd: worktreeDir },
|
|
1435
|
+
)
|
|
1436
|
+
spawnSync('tmux', ['send-keys', '-t', tmuxSessionName, 'bun run start'], {
|
|
1437
|
+
cwd: worktreeDir,
|
|
1438
|
+
})
|
|
1439
|
+
|
|
1440
|
+
// Select the first pane (Claude)
|
|
1441
|
+
spawnSync('tmux', ['select-pane', '-t', `${tmuxSessionName}:0.0`], {
|
|
1442
|
+
cwd: worktreeDir,
|
|
1443
|
+
})
|
|
1444
|
+
|
|
1445
|
+
// Attach or switch to the session
|
|
1446
|
+
if (isAlreadyInTmux) {
|
|
1447
|
+
// Switch to sibling session (avoid nesting)
|
|
1448
|
+
spawnSync('tmux', ['switch-client', '-t', tmuxSessionName], {
|
|
1449
|
+
stdio: 'inherit',
|
|
1450
|
+
})
|
|
1451
|
+
} else {
|
|
1452
|
+
// Attach to the session
|
|
1453
|
+
spawnSync(
|
|
1454
|
+
'tmux',
|
|
1455
|
+
[...tmuxGlobalArgs, 'attach-session', '-t', tmuxSessionName],
|
|
1456
|
+
{
|
|
1457
|
+
stdio: 'inherit',
|
|
1458
|
+
cwd: worktreeDir,
|
|
1459
|
+
},
|
|
1460
|
+
)
|
|
1461
|
+
}
|
|
1462
|
+
} else {
|
|
1463
|
+
// Standard behavior: create or attach
|
|
1464
|
+
if (isAlreadyInTmux) {
|
|
1465
|
+
// Already in tmux - create detached session, then switch to it (sibling)
|
|
1466
|
+
// Check if session already exists first
|
|
1467
|
+
if (sessionExists) {
|
|
1468
|
+
// Just switch to existing session
|
|
1469
|
+
spawnSync('tmux', ['switch-client', '-t', tmuxSessionName], {
|
|
1470
|
+
stdio: 'inherit',
|
|
1471
|
+
})
|
|
1472
|
+
} else {
|
|
1473
|
+
// Create new detached session
|
|
1474
|
+
spawnSync(
|
|
1475
|
+
'tmux',
|
|
1476
|
+
[
|
|
1477
|
+
'new-session',
|
|
1478
|
+
'-d', // detached
|
|
1479
|
+
'-s',
|
|
1480
|
+
tmuxSessionName,
|
|
1481
|
+
'-c',
|
|
1482
|
+
worktreeDir,
|
|
1483
|
+
'--',
|
|
1484
|
+
process.execPath,
|
|
1485
|
+
...newArgs,
|
|
1486
|
+
],
|
|
1487
|
+
{ cwd: worktreeDir, env: tmuxEnv },
|
|
1488
|
+
)
|
|
1489
|
+
|
|
1490
|
+
// Switch to the new session
|
|
1491
|
+
spawnSync('tmux', ['switch-client', '-t', tmuxSessionName], {
|
|
1492
|
+
stdio: 'inherit',
|
|
1493
|
+
})
|
|
1494
|
+
}
|
|
1495
|
+
} else {
|
|
1496
|
+
// Not in tmux - create and attach (original behavior)
|
|
1497
|
+
const tmuxArgs = [
|
|
1498
|
+
...tmuxGlobalArgs,
|
|
1499
|
+
'new-session',
|
|
1500
|
+
'-A', // Attach if exists, create if not
|
|
1501
|
+
'-s',
|
|
1502
|
+
tmuxSessionName,
|
|
1503
|
+
'-c',
|
|
1504
|
+
worktreeDir,
|
|
1505
|
+
'--', // Separator before command
|
|
1506
|
+
process.execPath,
|
|
1507
|
+
...newArgs,
|
|
1508
|
+
]
|
|
1509
|
+
|
|
1510
|
+
spawnSync('tmux', tmuxArgs, {
|
|
1511
|
+
stdio: 'inherit',
|
|
1512
|
+
cwd: worktreeDir,
|
|
1513
|
+
env: tmuxEnv,
|
|
1514
|
+
})
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
return { handled: true }
|
|
1519
|
+
}
|