yzcode-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QueryEngine.ts +1295 -0
- package/Task.ts +125 -0
- package/Tool.ts +792 -0
- package/bin/yzcode-init.js +31 -0
- package/bin/yzcode.js +35 -0
- package/cli/exit.ts +31 -0
- package/cli/handlers/agents.ts +70 -0
- package/cli/handlers/auth.ts +330 -0
- package/cli/handlers/autoMode.ts +170 -0
- package/cli/handlers/mcp.tsx +362 -0
- package/cli/handlers/plugins.ts +878 -0
- package/cli/handlers/util.tsx +110 -0
- package/cli/ndjsonSafeStringify.ts +32 -0
- package/cli/print.ts +5594 -0
- package/cli/remoteIO.ts +255 -0
- package/cli/structuredIO.ts +859 -0
- package/cli/transports/HybridTransport.ts +282 -0
- package/cli/transports/SSETransport.ts +711 -0
- package/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/cli/transports/WebSocketTransport.ts +800 -0
- package/cli/transports/WorkerStateUploader.ts +131 -0
- package/cli/transports/ccrClient.ts +998 -0
- package/cli/transports/transportUtils.ts +45 -0
- package/cli/update.ts +422 -0
- package/commands/add-dir/add-dir.tsx +126 -0
- package/commands/add-dir/index.ts +11 -0
- package/commands/add-dir/validation.ts +110 -0
- package/commands/advisor.ts +109 -0
- package/commands/agents/agents.tsx +12 -0
- package/commands/agents/index.ts +10 -0
- package/commands/ant-trace/index.js +1 -0
- package/commands/autofix-pr/index.js +1 -0
- package/commands/backfill-sessions/index.js +1 -0
- package/commands/branch/branch.ts +296 -0
- package/commands/branch/index.ts +14 -0
- package/commands/break-cache/index.js +1 -0
- package/commands/bridge/bridge.tsx +509 -0
- package/commands/bridge/index.ts +26 -0
- package/commands/bridge-kick.ts +200 -0
- package/commands/brief.ts +130 -0
- package/commands/btw/btw.tsx +243 -0
- package/commands/btw/index.ts +13 -0
- package/commands/bughunter/index.js +1 -0
- package/commands/chrome/chrome.tsx +285 -0
- package/commands/chrome/index.ts +13 -0
- package/commands/clear/caches.ts +144 -0
- package/commands/clear/clear.ts +7 -0
- package/commands/clear/conversation.ts +251 -0
- package/commands/clear/index.ts +19 -0
- package/commands/color/color.ts +93 -0
- package/commands/color/index.ts +16 -0
- package/commands/commit-push-pr.ts +158 -0
- package/commands/commit.ts +92 -0
- package/commands/compact/compact.ts +287 -0
- package/commands/compact/index.ts +15 -0
- package/commands/config/config.tsx +7 -0
- package/commands/config/index.ts +11 -0
- package/commands/context/context-noninteractive.ts +325 -0
- package/commands/context/context.tsx +64 -0
- package/commands/context/index.ts +24 -0
- package/commands/copy/copy.tsx +371 -0
- package/commands/copy/index.ts +15 -0
- package/commands/cost/cost.ts +24 -0
- package/commands/cost/index.ts +23 -0
- package/commands/createMovedToPluginCommand.ts +65 -0
- package/commands/ctx_viz/index.js +1 -0
- package/commands/debug-tool-call/index.js +1 -0
- package/commands/desktop/desktop.tsx +9 -0
- package/commands/desktop/index.ts +26 -0
- package/commands/diff/diff.tsx +9 -0
- package/commands/diff/index.ts +8 -0
- package/commands/doctor/doctor.tsx +7 -0
- package/commands/doctor/index.ts +12 -0
- package/commands/effort/effort.tsx +183 -0
- package/commands/effort/index.ts +13 -0
- package/commands/env/index.js +1 -0
- package/commands/exit/exit.tsx +33 -0
- package/commands/exit/index.ts +12 -0
- package/commands/export/export.tsx +91 -0
- package/commands/export/index.ts +11 -0
- package/commands/extra-usage/extra-usage-core.ts +118 -0
- package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/commands/extra-usage/extra-usage.tsx +17 -0
- package/commands/extra-usage/index.ts +31 -0
- package/commands/fast/fast.tsx +269 -0
- package/commands/fast/index.ts +26 -0
- package/commands/feedback/feedback.tsx +25 -0
- package/commands/feedback/index.ts +26 -0
- package/commands/files/files.ts +19 -0
- package/commands/files/index.ts +12 -0
- package/commands/good-claude/index.js +1 -0
- package/commands/heapdump/heapdump.ts +17 -0
- package/commands/heapdump/index.ts +12 -0
- package/commands/help/help.tsx +11 -0
- package/commands/help/index.ts +10 -0
- package/commands/hooks/hooks.tsx +13 -0
- package/commands/hooks/index.ts +11 -0
- package/commands/ide/ide.tsx +646 -0
- package/commands/ide/index.ts +11 -0
- package/commands/init-verifiers.ts +262 -0
- package/commands/init.ts +256 -0
- package/commands/insights.ts +3200 -0
- package/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/commands/install-github-app/CreatingStep.tsx +65 -0
- package/commands/install-github-app/ErrorStep.tsx +85 -0
- package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/commands/install-github-app/SuccessStep.tsx +96 -0
- package/commands/install-github-app/WarningsStep.tsx +73 -0
- package/commands/install-github-app/index.ts +13 -0
- package/commands/install-github-app/install-github-app.tsx +587 -0
- package/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/commands/install-slack-app/index.ts +12 -0
- package/commands/install-slack-app/install-slack-app.ts +30 -0
- package/commands/install.tsx +300 -0
- package/commands/issue/index.js +1 -0
- package/commands/keybindings/index.ts +13 -0
- package/commands/keybindings/keybindings.ts +53 -0
- package/commands/login/index.ts +14 -0
- package/commands/login/login.tsx +104 -0
- package/commands/logout/index.ts +10 -0
- package/commands/logout/logout.tsx +82 -0
- package/commands/mcp/addCommand.ts +280 -0
- package/commands/mcp/index.ts +12 -0
- package/commands/mcp/mcp.tsx +85 -0
- package/commands/mcp/xaaIdpCommand.ts +266 -0
- package/commands/memory/index.ts +10 -0
- package/commands/memory/memory.tsx +90 -0
- package/commands/mobile/index.ts +11 -0
- package/commands/mobile/mobile.tsx +274 -0
- package/commands/mock-limits/index.js +1 -0
- package/commands/model/index.ts +16 -0
- package/commands/model/model.tsx +297 -0
- package/commands/oauth-refresh/index.js +1 -0
- package/commands/onboarding/index.js +1 -0
- package/commands/output-style/index.ts +11 -0
- package/commands/output-style/output-style.tsx +7 -0
- package/commands/passes/index.ts +22 -0
- package/commands/passes/passes.tsx +24 -0
- package/commands/perf-issue/index.js +1 -0
- package/commands/permissions/index.ts +11 -0
- package/commands/permissions/permissions.tsx +10 -0
- package/commands/plan/index.ts +11 -0
- package/commands/plan/plan.tsx +122 -0
- package/commands/plugin/AddMarketplace.tsx +162 -0
- package/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/commands/plugin/ManagePlugins.tsx +2215 -0
- package/commands/plugin/PluginErrors.tsx +124 -0
- package/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/commands/plugin/PluginSettings.tsx +1072 -0
- package/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/commands/plugin/ValidatePlugin.tsx +98 -0
- package/commands/plugin/index.tsx +11 -0
- package/commands/plugin/parseArgs.ts +103 -0
- package/commands/plugin/plugin.tsx +7 -0
- package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/commands/plugin/usePagination.ts +171 -0
- package/commands/pr_comments/index.ts +50 -0
- package/commands/privacy-settings/index.ts +14 -0
- package/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/commands/rate-limit-options/index.ts +19 -0
- package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/commands/release-notes/index.ts +11 -0
- package/commands/release-notes/release-notes.ts +50 -0
- package/commands/reload-plugins/index.ts +18 -0
- package/commands/reload-plugins/reload-plugins.ts +61 -0
- package/commands/remote-env/index.ts +15 -0
- package/commands/remote-env/remote-env.tsx +7 -0
- package/commands/remote-setup/api.ts +182 -0
- package/commands/remote-setup/index.ts +20 -0
- package/commands/remote-setup/remote-setup.tsx +187 -0
- package/commands/rename/generateSessionName.ts +67 -0
- package/commands/rename/index.ts +12 -0
- package/commands/rename/rename.ts +87 -0
- package/commands/reset-limits/index.js +4 -0
- package/commands/resume/index.ts +12 -0
- package/commands/resume/resume.tsx +275 -0
- package/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/commands/review/reviewRemote.ts +316 -0
- package/commands/review/ultrareviewCommand.tsx +58 -0
- package/commands/review/ultrareviewEnabled.ts +14 -0
- package/commands/review.ts +57 -0
- package/commands/rewind/index.ts +13 -0
- package/commands/rewind/rewind.ts +13 -0
- package/commands/sandbox-toggle/index.ts +50 -0
- package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/commands/security-review.ts +243 -0
- package/commands/session/index.ts +16 -0
- package/commands/session/session.tsx +140 -0
- package/commands/share/index.js +1 -0
- package/commands/skills/index.ts +10 -0
- package/commands/skills/skills.tsx +8 -0
- package/commands/stats/index.ts +10 -0
- package/commands/stats/stats.tsx +7 -0
- package/commands/status/index.ts +12 -0
- package/commands/status/status.tsx +8 -0
- package/commands/statusline.tsx +24 -0
- package/commands/stickers/index.ts +11 -0
- package/commands/stickers/stickers.ts +16 -0
- package/commands/summary/index.js +1 -0
- package/commands/tag/index.ts +12 -0
- package/commands/tag/tag.tsx +215 -0
- package/commands/tasks/index.ts +11 -0
- package/commands/tasks/tasks.tsx +8 -0
- package/commands/teleport/index.js +1 -0
- package/commands/terminalSetup/index.ts +23 -0
- package/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/commands/theme/index.ts +10 -0
- package/commands/theme/theme.tsx +57 -0
- package/commands/thinkback/index.ts +13 -0
- package/commands/thinkback/thinkback.tsx +554 -0
- package/commands/thinkback-play/index.ts +17 -0
- package/commands/thinkback-play/thinkback-play.ts +43 -0
- package/commands/ultraplan.tsx +471 -0
- package/commands/upgrade/index.ts +16 -0
- package/commands/upgrade/upgrade.tsx +38 -0
- package/commands/usage/index.ts +9 -0
- package/commands/usage/usage.tsx +7 -0
- package/commands/version.ts +22 -0
- package/commands/vim/index.ts +11 -0
- package/commands/vim/vim.ts +38 -0
- package/commands/voice/index.ts +20 -0
- package/commands/voice/voice.ts +150 -0
- package/commands.ts +754 -0
- package/components/AgentProgressLine.tsx +136 -0
- package/components/App.tsx +56 -0
- package/components/ApproveApiKey.tsx +123 -0
- package/components/AutoModeOptInDialog.tsx +142 -0
- package/components/AutoUpdater.tsx +198 -0
- package/components/AutoUpdaterWrapper.tsx +91 -0
- package/components/AwsAuthStatusBox.tsx +82 -0
- package/components/BaseTextInput.tsx +136 -0
- package/components/BashModeProgress.tsx +56 -0
- package/components/BridgeDialog.tsx +401 -0
- package/components/BypassPermissionsModeDialog.tsx +87 -0
- package/components/ChannelDowngradeDialog.tsx +102 -0
- package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/components/ClickableImageRef.tsx +73 -0
- package/components/CompactSummary.tsx +118 -0
- package/components/ConfigurableShortcutHint.tsx +57 -0
- package/components/ConsoleOAuthFlow.tsx +631 -0
- package/components/ContextSuggestions.tsx +47 -0
- package/components/ContextVisualization.tsx +489 -0
- package/components/CoordinatorAgentStatus.tsx +273 -0
- package/components/CostThresholdDialog.tsx +50 -0
- package/components/CtrlOToExpand.tsx +51 -0
- package/components/CustomSelect/SelectMulti.tsx +213 -0
- package/components/CustomSelect/index.ts +3 -0
- package/components/CustomSelect/option-map.ts +50 -0
- package/components/CustomSelect/select-input-option.tsx +488 -0
- package/components/CustomSelect/select-option.tsx +68 -0
- package/components/CustomSelect/select.tsx +690 -0
- package/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/components/CustomSelect/use-select-input.ts +287 -0
- package/components/CustomSelect/use-select-navigation.ts +653 -0
- package/components/CustomSelect/use-select-state.ts +157 -0
- package/components/DesktopHandoff.tsx +193 -0
- package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/components/DevBar.tsx +49 -0
- package/components/DevChannelsDialog.tsx +105 -0
- package/components/DiagnosticsDisplay.tsx +95 -0
- package/components/EffortCallout.tsx +265 -0
- package/components/EffortIndicator.ts +42 -0
- package/components/ExitFlow.tsx +48 -0
- package/components/ExportDialog.tsx +128 -0
- package/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/components/FastIcon.tsx +46 -0
- package/components/Feedback.tsx +592 -0
- package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/components/FileEditToolDiff.tsx +181 -0
- package/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/components/FilePathLink.tsx +43 -0
- package/components/FullscreenLayout.tsx +637 -0
- package/components/GlobalSearchDialog.tsx +343 -0
- package/components/HelpV2/Commands.tsx +82 -0
- package/components/HelpV2/General.tsx +23 -0
- package/components/HelpV2/HelpV2.tsx +184 -0
- package/components/HighlightedCode/Fallback.tsx +193 -0
- package/components/HighlightedCode.tsx +190 -0
- package/components/HistorySearchDialog.tsx +118 -0
- package/components/IdeAutoConnectDialog.tsx +154 -0
- package/components/IdeOnboardingDialog.tsx +167 -0
- package/components/IdeStatusIndicator.tsx +58 -0
- package/components/IdleReturnDialog.tsx +118 -0
- package/components/InterruptedByUser.tsx +15 -0
- package/components/InvalidConfigDialog.tsx +156 -0
- package/components/InvalidSettingsDialog.tsx +89 -0
- package/components/KeybindingWarnings.tsx +55 -0
- package/components/LanguagePicker.tsx +86 -0
- package/components/LogSelector.tsx +1575 -0
- package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/components/LogoV2/Clawd.tsx +240 -0
- package/components/LogoV2/CondensedLogo.tsx +161 -0
- package/components/LogoV2/EmergencyTip.tsx +58 -0
- package/components/LogoV2/Feed.tsx +112 -0
- package/components/LogoV2/FeedColumn.tsx +59 -0
- package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/components/LogoV2/LogoV2.tsx +543 -0
- package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/components/LogoV2/WelcomeV2.tsx +433 -0
- package/components/LogoV2/feedConfigs.tsx +92 -0
- package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/components/MCPServerApprovalDialog.tsx +115 -0
- package/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/components/MCPServerDialogCopy.tsx +15 -0
- package/components/MCPServerMultiselectDialog.tsx +133 -0
- package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/components/Markdown.tsx +236 -0
- package/components/MarkdownTable.tsx +322 -0
- package/components/MemoryUsageIndicator.tsx +37 -0
- package/components/Message.tsx +627 -0
- package/components/MessageModel.tsx +43 -0
- package/components/MessageResponse.tsx +78 -0
- package/components/MessageRow.tsx +383 -0
- package/components/MessageSelector.tsx +831 -0
- package/components/MessageTimestamp.tsx +63 -0
- package/components/Messages.tsx +834 -0
- package/components/ModelPicker.tsx +448 -0
- package/components/NativeAutoUpdater.tsx +193 -0
- package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/components/OffscreenFreeze.tsx +44 -0
- package/components/Onboarding.tsx +244 -0
- package/components/OutputStylePicker.tsx +112 -0
- package/components/PackageManagerAutoUpdater.tsx +104 -0
- package/components/Passes/Passes.tsx +184 -0
- package/components/PrBadge.tsx +97 -0
- package/components/PressEnterToContinue.tsx +15 -0
- package/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/components/PromptInput/Notifications.tsx +332 -0
- package/components/PromptInput/PromptInput.tsx +2339 -0
- package/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
- package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/components/PromptInput/inputModes.ts +33 -0
- package/components/PromptInput/inputPaste.ts +90 -0
- package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
- package/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/components/PromptInput/useSwarmBanner.ts +155 -0
- package/components/PromptInput/utils.ts +60 -0
- package/components/QuickOpenDialog.tsx +244 -0
- package/components/RemoteCallout.tsx +76 -0
- package/components/RemoteEnvironmentDialog.tsx +340 -0
- package/components/ResumeTask.tsx +268 -0
- package/components/SandboxViolationExpandedView.tsx +99 -0
- package/components/ScrollKeybindingHandler.tsx +1012 -0
- package/components/SearchBox.tsx +72 -0
- package/components/SentryErrorBoundary.ts +28 -0
- package/components/SessionBackgroundHint.tsx +108 -0
- package/components/SessionPreview.tsx +194 -0
- package/components/Settings/Config.tsx +1822 -0
- package/components/Settings/Settings.tsx +137 -0
- package/components/Settings/Status.tsx +241 -0
- package/components/Settings/Usage.tsx +377 -0
- package/components/ShowInIDEPrompt.tsx +170 -0
- package/components/SkillImprovementSurvey.tsx +152 -0
- package/components/Spinner/FlashingChar.tsx +61 -0
- package/components/Spinner/GlimmerMessage.tsx +328 -0
- package/components/Spinner/ShimmerChar.tsx +36 -0
- package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/components/Spinner/index.ts +10 -0
- package/components/Spinner/teammateSelectHint.ts +1 -0
- package/components/Spinner/useShimmerAnimation.ts +31 -0
- package/components/Spinner/useStalledAnimation.ts +75 -0
- package/components/Spinner/utils.ts +84 -0
- package/components/Spinner.tsx +562 -0
- package/components/Stats.tsx +1228 -0
- package/components/StatusLine.tsx +324 -0
- package/components/StatusNotices.tsx +55 -0
- package/components/StructuredDiff/Fallback.tsx +487 -0
- package/components/StructuredDiff/colorDiff.ts +37 -0
- package/components/StructuredDiff.tsx +190 -0
- package/components/StructuredDiffList.tsx +30 -0
- package/components/TagTabs.tsx +139 -0
- package/components/TaskListV2.tsx +378 -0
- package/components/TeammateViewHeader.tsx +82 -0
- package/components/TeleportError.tsx +189 -0
- package/components/TeleportProgress.tsx +140 -0
- package/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/components/TeleportResumeWrapper.tsx +167 -0
- package/components/TeleportStash.tsx +116 -0
- package/components/TextInput.tsx +124 -0
- package/components/ThemePicker.tsx +333 -0
- package/components/ThinkingToggle.tsx +153 -0
- package/components/TokenWarning.tsx +179 -0
- package/components/ToolUseLoader.tsx +42 -0
- package/components/TrustDialog/TrustDialog.tsx +290 -0
- package/components/TrustDialog/utils.ts +245 -0
- package/components/ValidationErrorsList.tsx +148 -0
- package/components/VimTextInput.tsx +140 -0
- package/components/VirtualMessageList.tsx +1082 -0
- package/components/WorkflowMultiselectDialog.tsx +128 -0
- package/components/WorktreeExitDialog.tsx +231 -0
- package/components/agents/AgentDetail.tsx +220 -0
- package/components/agents/AgentEditor.tsx +178 -0
- package/components/agents/AgentNavigationFooter.tsx +26 -0
- package/components/agents/AgentsList.tsx +440 -0
- package/components/agents/AgentsMenu.tsx +800 -0
- package/components/agents/ColorPicker.tsx +112 -0
- package/components/agents/ModelSelector.tsx +68 -0
- package/components/agents/ToolSelector.tsx +562 -0
- package/components/agents/agentFileUtils.ts +272 -0
- package/components/agents/generateAgent.ts +197 -0
- package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/components/agents/types.ts +27 -0
- package/components/agents/utils.ts +18 -0
- package/components/agents/validateAgent.ts +109 -0
- package/components/design-system/Byline.tsx +77 -0
- package/components/design-system/Dialog.tsx +138 -0
- package/components/design-system/Divider.tsx +149 -0
- package/components/design-system/FuzzyPicker.tsx +312 -0
- package/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/components/design-system/ListItem.tsx +244 -0
- package/components/design-system/LoadingState.tsx +94 -0
- package/components/design-system/Pane.tsx +77 -0
- package/components/design-system/ProgressBar.tsx +86 -0
- package/components/design-system/Ratchet.tsx +80 -0
- package/components/design-system/StatusIcon.tsx +95 -0
- package/components/design-system/Tabs.tsx +340 -0
- package/components/design-system/ThemeProvider.tsx +170 -0
- package/components/design-system/ThemedBox.tsx +156 -0
- package/components/design-system/ThemedText.tsx +124 -0
- package/components/design-system/color.ts +30 -0
- package/components/diff/DiffDetailView.tsx +281 -0
- package/components/diff/DiffDialog.tsx +383 -0
- package/components/diff/DiffFileList.tsx +292 -0
- package/components/grove/Grove.tsx +463 -0
- package/components/hooks/HooksConfigMenu.tsx +578 -0
- package/components/hooks/PromptDialog.tsx +90 -0
- package/components/hooks/SelectEventMode.tsx +127 -0
- package/components/hooks/SelectHookMode.tsx +112 -0
- package/components/hooks/SelectMatcherMode.tsx +144 -0
- package/components/hooks/ViewHookMode.tsx +199 -0
- package/components/mcp/CapabilitiesSection.tsx +61 -0
- package/components/mcp/ElicitationDialog.tsx +1169 -0
- package/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/components/mcp/MCPListPanel.tsx +504 -0
- package/components/mcp/MCPReconnect.tsx +167 -0
- package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/components/mcp/MCPSettings.tsx +398 -0
- package/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/components/mcp/MCPToolDetailView.tsx +212 -0
- package/components/mcp/MCPToolListView.tsx +141 -0
- package/components/mcp/McpParsingWarnings.tsx +213 -0
- package/components/mcp/index.ts +9 -0
- package/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/components/memory/MemoryFileSelector.tsx +438 -0
- package/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/components/messageActions.tsx +450 -0
- package/components/messages/AdvisorMessage.tsx +158 -0
- package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/components/messages/AssistantTextMessage.tsx +270 -0
- package/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/components/messages/AttachmentMessage.tsx +536 -0
- package/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/components/messages/GroupedToolUseContent.tsx +58 -0
- package/components/messages/HighlightedThinkingText.tsx +162 -0
- package/components/messages/HookProgressMessage.tsx +116 -0
- package/components/messages/PlanApprovalMessage.tsx +222 -0
- package/components/messages/RateLimitMessage.tsx +161 -0
- package/components/messages/ShutdownMessage.tsx +132 -0
- package/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/components/messages/SystemTextMessage.tsx +827 -0
- package/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/components/messages/UserBashInputMessage.tsx +58 -0
- package/components/messages/UserBashOutputMessage.tsx +54 -0
- package/components/messages/UserChannelMessage.tsx +137 -0
- package/components/messages/UserCommandMessage.tsx +108 -0
- package/components/messages/UserImageMessage.tsx +59 -0
- package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/components/messages/UserPlanMessage.tsx +42 -0
- package/components/messages/UserPromptMessage.tsx +80 -0
- package/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/components/messages/UserTeammateMessage.tsx +206 -0
- package/components/messages/UserTextMessage.tsx +275 -0
- package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/components/messages/nullRenderingAttachments.ts +70 -0
- package/components/messages/teamMemCollapsed.tsx +140 -0
- package/components/messages/teamMemSaved.ts +19 -0
- package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/components/permissions/PermissionDialog.tsx +72 -0
- package/components/permissions/PermissionExplanation.tsx +272 -0
- package/components/permissions/PermissionPrompt.tsx +336 -0
- package/components/permissions/PermissionRequest.tsx +217 -0
- package/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/components/permissions/WorkerBadge.tsx +49 -0
- package/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/components/permissions/hooks.ts +209 -0
- package/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/components/permissions/utils.ts +25 -0
- package/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/components/sandbox/SandboxSettings.tsx +296 -0
- package/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/components/shell/OutputLine.tsx +118 -0
- package/components/shell/ShellProgressMessage.tsx +150 -0
- package/components/shell/ShellTimeDisplay.tsx +74 -0
- package/components/skills/SkillsMenu.tsx +237 -0
- package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/components/tasks/BackgroundTask.tsx +345 -0
- package/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/components/tasks/DreamDetailDialog.tsx +251 -0
- package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/components/tasks/ShellDetailDialog.tsx +404 -0
- package/components/tasks/ShellProgress.tsx +87 -0
- package/components/tasks/renderToolActivity.tsx +33 -0
- package/components/tasks/taskStatusUtils.tsx +107 -0
- package/components/teams/TeamStatus.tsx +80 -0
- package/components/teams/TeamsDialog.tsx +715 -0
- package/components/ui/OrderedList.tsx +71 -0
- package/components/ui/OrderedListItem.tsx +45 -0
- package/components/ui/TreeSelect.tsx +397 -0
- package/components/wizard/WizardDialogLayout.tsx +65 -0
- package/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/components/wizard/WizardProvider.tsx +213 -0
- package/components/wizard/index.ts +9 -0
- package/components/wizard/useWizard.ts +13 -0
- package/constants/apiLimits.ts +94 -0
- package/constants/betas.ts +52 -0
- package/constants/common.ts +33 -0
- package/constants/cyberRiskInstruction.ts +24 -0
- package/constants/errorIds.ts +15 -0
- package/constants/figures.ts +45 -0
- package/constants/files.ts +156 -0
- package/constants/github-app.ts +144 -0
- package/constants/keys.ts +11 -0
- package/constants/messages.ts +1 -0
- package/constants/oauth.ts +234 -0
- package/constants/outputStyles.ts +216 -0
- package/constants/product.ts +76 -0
- package/constants/prompts.ts +914 -0
- package/constants/spinnerVerbs.ts +204 -0
- package/constants/system.ts +95 -0
- package/constants/systemPromptSections.ts +68 -0
- package/constants/toolLimits.ts +56 -0
- package/constants/tools.ts +112 -0
- package/constants/turnCompletionVerbs.ts +12 -0
- package/constants/xml.ts +86 -0
- package/context/QueuedMessageContext.tsx +63 -0
- package/context/fpsMetrics.tsx +30 -0
- package/context/mailbox.tsx +38 -0
- package/context/modalContext.tsx +58 -0
- package/context/notifications.tsx +240 -0
- package/context/overlayContext.tsx +151 -0
- package/context/promptOverlayContext.tsx +125 -0
- package/context/stats.tsx +220 -0
- package/context/voice.tsx +88 -0
- package/context.ts +189 -0
- package/cost-tracker.ts +323 -0
- package/costHook.ts +22 -0
- package/dialogLaunchers.tsx +133 -0
- package/entrypoints/agentSdkTypes.ts +443 -0
- package/entrypoints/cli.tsx +310 -0
- package/entrypoints/init.ts +340 -0
- package/entrypoints/mcp.ts +196 -0
- package/entrypoints/sandboxTypes.ts +156 -0
- package/entrypoints/sdk/controlSchemas.ts +663 -0
- package/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/entrypoints/sdk/coreTypes.generated.ts +73 -0
- package/entrypoints/sdk/coreTypes.ts +62 -0
- package/entrypoints/sdk/runtimeTypes.ts +74 -0
- package/entrypoints/sdk/toolTypes.ts +12 -0
- package/global.d.ts +18 -0
- package/history.ts +464 -0
- package/hooks/fileSuggestions.ts +811 -0
- package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/hooks/notifs/useInstallMessages.tsx +26 -0
- package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/hooks/notifs/useStartupNotification.ts +41 -0
- package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/hooks/renderPlaceholder.ts +51 -0
- package/hooks/toolPermission/PermissionContext.ts +388 -0
- package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/hooks/toolPermission/permissionLogging.ts +238 -0
- package/hooks/unifiedSuggestions.ts +202 -0
- package/hooks/useAfterFirstRender.ts +17 -0
- package/hooks/useApiKeyVerification.ts +84 -0
- package/hooks/useArrowKeyHistory.tsx +229 -0
- package/hooks/useAssistantHistory.ts +250 -0
- package/hooks/useAwaySummary.ts +125 -0
- package/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/hooks/useBlink.ts +34 -0
- package/hooks/useCanUseTool.tsx +204 -0
- package/hooks/useCancelRequest.ts +276 -0
- package/hooks/useChromeExtensionNotification.tsx +50 -0
- package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/hooks/useClipboardImageHint.ts +77 -0
- package/hooks/useCommandKeybindings.tsx +108 -0
- package/hooks/useCommandQueue.ts +15 -0
- package/hooks/useCopyOnSelect.ts +98 -0
- package/hooks/useDeferredHookMessages.ts +46 -0
- package/hooks/useDiffData.ts +110 -0
- package/hooks/useDiffInIDE.ts +379 -0
- package/hooks/useDirectConnect.ts +229 -0
- package/hooks/useDoublePress.ts +62 -0
- package/hooks/useDynamicConfig.ts +22 -0
- package/hooks/useElapsedTime.ts +37 -0
- package/hooks/useExitOnCtrlCD.ts +95 -0
- package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/hooks/useGlobalKeybindings.tsx +249 -0
- package/hooks/useHistorySearch.ts +303 -0
- package/hooks/useIDEIntegration.tsx +70 -0
- package/hooks/useIdeAtMentioned.ts +76 -0
- package/hooks/useIdeConnectionStatus.ts +33 -0
- package/hooks/useIdeLogging.ts +41 -0
- package/hooks/useIdeSelection.ts +150 -0
- package/hooks/useInboxPoller.ts +969 -0
- package/hooks/useInputBuffer.ts +132 -0
- package/hooks/useIssueFlagBanner.ts +133 -0
- package/hooks/useLogMessages.ts +119 -0
- package/hooks/useLspPluginRecommendation.tsx +194 -0
- package/hooks/useMailboxBridge.ts +21 -0
- package/hooks/useMainLoopModel.ts +34 -0
- package/hooks/useManagePlugins.ts +304 -0
- package/hooks/useMemoryUsage.ts +39 -0
- package/hooks/useMergedClients.ts +23 -0
- package/hooks/useMergedCommands.ts +15 -0
- package/hooks/useMergedTools.ts +44 -0
- package/hooks/useMinDisplayTime.ts +35 -0
- package/hooks/useNotifyAfterTimeout.ts +65 -0
- package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/hooks/usePasteHandler.ts +285 -0
- package/hooks/usePluginRecommendationBase.tsx +105 -0
- package/hooks/usePrStatus.ts +106 -0
- package/hooks/usePromptSuggestion.ts +177 -0
- package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/hooks/useQueueProcessor.ts +68 -0
- package/hooks/useRemoteSession.ts +605 -0
- package/hooks/useReplBridge.tsx +723 -0
- package/hooks/useSSHSession.ts +241 -0
- package/hooks/useScheduledTasks.ts +139 -0
- package/hooks/useSearchInput.ts +364 -0
- package/hooks/useSessionBackgrounding.ts +158 -0
- package/hooks/useSettings.ts +17 -0
- package/hooks/useSettingsChange.ts +25 -0
- package/hooks/useSkillImprovementSurvey.ts +105 -0
- package/hooks/useSkillsChange.ts +62 -0
- package/hooks/useSwarmInitialization.ts +81 -0
- package/hooks/useSwarmPermissionPoller.ts +330 -0
- package/hooks/useTaskListWatcher.ts +221 -0
- package/hooks/useTasksV2.ts +250 -0
- package/hooks/useTeammateViewAutoExit.ts +63 -0
- package/hooks/useTeleportResume.tsx +85 -0
- package/hooks/useTerminalSize.ts +15 -0
- package/hooks/useTextInput.ts +529 -0
- package/hooks/useTimeout.ts +14 -0
- package/hooks/useTurnDiffs.ts +213 -0
- package/hooks/useTypeahead.tsx +1385 -0
- package/hooks/useUpdateNotification.ts +34 -0
- package/hooks/useVimInput.ts +316 -0
- package/hooks/useVirtualScroll.ts +721 -0
- package/hooks/useVoice.ts +1144 -0
- package/hooks/useVoiceEnabled.ts +25 -0
- package/hooks/useVoiceIntegration.tsx +677 -0
- package/ink/Ansi.tsx +292 -0
- package/ink/bidi.ts +139 -0
- package/ink/clearTerminal.ts +74 -0
- package/ink/colorize.ts +231 -0
- package/ink/components/AlternateScreen.tsx +80 -0
- package/ink/components/App.tsx +658 -0
- package/ink/components/AppContext.ts +21 -0
- package/ink/components/Box.tsx +214 -0
- package/ink/components/Button.tsx +192 -0
- package/ink/components/ClockContext.tsx +112 -0
- package/ink/components/CursorDeclarationContext.ts +32 -0
- package/ink/components/ErrorOverview.tsx +109 -0
- package/ink/components/Link.tsx +42 -0
- package/ink/components/Newline.tsx +39 -0
- package/ink/components/NoSelect.tsx +68 -0
- package/ink/components/RawAnsi.tsx +57 -0
- package/ink/components/ScrollBox.tsx +237 -0
- package/ink/components/Spacer.tsx +20 -0
- package/ink/components/StdinContext.ts +49 -0
- package/ink/components/TerminalFocusContext.tsx +52 -0
- package/ink/components/TerminalSizeContext.tsx +7 -0
- package/ink/components/Text.tsx +254 -0
- package/ink/constants.ts +2 -0
- package/ink/dom.ts +484 -0
- package/ink/events/click-event.ts +38 -0
- package/ink/events/dispatcher.ts +235 -0
- package/ink/events/emitter.ts +39 -0
- package/ink/events/event-handlers.ts +73 -0
- package/ink/events/event.ts +11 -0
- package/ink/events/focus-event.ts +21 -0
- package/ink/events/input-event.ts +205 -0
- package/ink/events/keyboard-event.ts +51 -0
- package/ink/events/terminal-event.ts +107 -0
- package/ink/events/terminal-focus-event.ts +19 -0
- package/ink/focus.ts +181 -0
- package/ink/frame.ts +124 -0
- package/ink/get-max-width.ts +27 -0
- package/ink/global.d.ts +14 -0
- package/ink/hit-test.ts +130 -0
- package/ink/hooks/use-animation-frame.ts +57 -0
- package/ink/hooks/use-app.ts +8 -0
- package/ink/hooks/use-declared-cursor.ts +73 -0
- package/ink/hooks/use-input.ts +92 -0
- package/ink/hooks/use-interval.ts +67 -0
- package/ink/hooks/use-search-highlight.ts +53 -0
- package/ink/hooks/use-selection.ts +104 -0
- package/ink/hooks/use-stdin.ts +8 -0
- package/ink/hooks/use-tab-status.ts +72 -0
- package/ink/hooks/use-terminal-focus.ts +16 -0
- package/ink/hooks/use-terminal-title.ts +31 -0
- package/ink/hooks/use-terminal-viewport.ts +96 -0
- package/ink/ink.tsx +1723 -0
- package/ink/instances.ts +10 -0
- package/ink/layout/engine.ts +6 -0
- package/ink/layout/geometry.ts +97 -0
- package/ink/layout/node.ts +152 -0
- package/ink/layout/yoga.ts +308 -0
- package/ink/line-width-cache.ts +24 -0
- package/ink/log-update.ts +773 -0
- package/ink/measure-element.ts +23 -0
- package/ink/measure-text.ts +47 -0
- package/ink/node-cache.ts +54 -0
- package/ink/optimizer.ts +93 -0
- package/ink/output.ts +797 -0
- package/ink/parse-keypress.ts +801 -0
- package/ink/reconciler.ts +512 -0
- package/ink/render-border.ts +231 -0
- package/ink/render-node-to-output.ts +1462 -0
- package/ink/render-to-screen.ts +231 -0
- package/ink/renderer.ts +178 -0
- package/ink/root.ts +184 -0
- package/ink/screen.ts +1486 -0
- package/ink/searchHighlight.ts +93 -0
- package/ink/selection.ts +917 -0
- package/ink/squash-text-nodes.ts +92 -0
- package/ink/stringWidth.ts +222 -0
- package/ink/styles.ts +771 -0
- package/ink/supports-hyperlinks.ts +57 -0
- package/ink/tabstops.ts +46 -0
- package/ink/terminal-focus-state.ts +47 -0
- package/ink/terminal-querier.ts +212 -0
- package/ink/terminal.ts +248 -0
- package/ink/termio/ansi.ts +75 -0
- package/ink/termio/csi.ts +319 -0
- package/ink/termio/dec.ts +60 -0
- package/ink/termio/esc.ts +67 -0
- package/ink/termio/osc.ts +493 -0
- package/ink/termio/parser.ts +394 -0
- package/ink/termio/sgr.ts +308 -0
- package/ink/termio/tokenize.ts +319 -0
- package/ink/termio/types.ts +236 -0
- package/ink/termio.ts +42 -0
- package/ink/useTerminalNotification.ts +126 -0
- package/ink/warn.ts +9 -0
- package/ink/widest-line.ts +19 -0
- package/ink/wrap-text.ts +74 -0
- package/ink/wrapAnsi.ts +20 -0
- package/ink.ts +85 -0
- package/interactiveHelpers.tsx +366 -0
- package/main.tsx +4702 -0
- package/package.json +95 -0
- package/projectOnboardingState.ts +83 -0
- package/query/config.ts +46 -0
- package/query/deps.ts +40 -0
- package/query/stopHooks.ts +473 -0
- package/query/tokenBudget.ts +93 -0
- package/query.ts +1729 -0
- package/replLauncher.tsx +23 -0
- package/services/AgentSummary/agentSummary.ts +179 -0
- package/services/MagicDocs/magicDocs.ts +254 -0
- package/services/MagicDocs/prompts.ts +127 -0
- package/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/services/PromptSuggestion/speculation.ts +991 -0
- package/services/SessionMemory/prompts.ts +324 -0
- package/services/SessionMemory/sessionMemory.ts +495 -0
- package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/services/analytics/config.ts +38 -0
- package/services/analytics/datadog.ts +307 -0
- package/services/analytics/firstPartyEventLogger.ts +449 -0
- package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/services/analytics/growthbook.ts +1155 -0
- package/services/analytics/index.ts +173 -0
- package/services/analytics/metadata.ts +973 -0
- package/services/analytics/sink.ts +114 -0
- package/services/analytics/sinkKillswitch.ts +25 -0
- package/services/api/adminRequests.ts +119 -0
- package/services/api/bootstrap.ts +141 -0
- package/services/api/claude.ts +3419 -0
- package/services/api/client.ts +389 -0
- package/services/api/dumpPrompts.ts +226 -0
- package/services/api/emptyUsage.ts +22 -0
- package/services/api/errorUtils.ts +260 -0
- package/services/api/errors.ts +1207 -0
- package/services/api/filesApi.ts +748 -0
- package/services/api/firstTokenDate.ts +60 -0
- package/services/api/grove.ts +357 -0
- package/services/api/logging.ts +788 -0
- package/services/api/metricsOptOut.ts +159 -0
- package/services/api/overageCreditGrant.ts +137 -0
- package/services/api/promptCacheBreakDetection.ts +727 -0
- package/services/api/referral.ts +281 -0
- package/services/api/sessionIngress.ts +514 -0
- package/services/api/ultrareviewQuota.ts +38 -0
- package/services/api/usage.ts +63 -0
- package/services/api/withRetry.ts +822 -0
- package/services/autoDream/autoDream.ts +324 -0
- package/services/autoDream/config.ts +21 -0
- package/services/autoDream/consolidationLock.ts +140 -0
- package/services/autoDream/consolidationPrompt.ts +65 -0
- package/services/awaySummary.ts +74 -0
- package/services/claudeAiLimits.ts +515 -0
- package/services/claudeAiLimitsHook.ts +23 -0
- package/services/compact/apiMicrocompact.ts +153 -0
- package/services/compact/autoCompact.ts +351 -0
- package/services/compact/compact.ts +1705 -0
- package/services/compact/compactWarningHook.ts +16 -0
- package/services/compact/compactWarningState.ts +18 -0
- package/services/compact/grouping.ts +63 -0
- package/services/compact/microCompact.ts +530 -0
- package/services/compact/postCompactCleanup.ts +77 -0
- package/services/compact/prompt.ts +374 -0
- package/services/compact/sessionMemoryCompact.ts +630 -0
- package/services/compact/timeBasedMCConfig.ts +43 -0
- package/services/diagnosticTracking.ts +397 -0
- package/services/extractMemories/extractMemories.ts +615 -0
- package/services/extractMemories/prompts.ts +154 -0
- package/services/internalLogging.ts +90 -0
- package/services/lsp/LSPClient.ts +447 -0
- package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/services/lsp/LSPServerInstance.ts +511 -0
- package/services/lsp/LSPServerManager.ts +420 -0
- package/services/lsp/config.ts +79 -0
- package/services/lsp/manager.ts +289 -0
- package/services/lsp/passiveFeedback.ts +328 -0
- package/services/mcp/InProcessTransport.ts +63 -0
- package/services/mcp/MCPConnectionManager.tsx +73 -0
- package/services/mcp/SdkControlTransport.ts +136 -0
- package/services/mcp/auth.ts +2465 -0
- package/services/mcp/channelAllowlist.ts +76 -0
- package/services/mcp/channelNotification.ts +316 -0
- package/services/mcp/channelPermissions.ts +240 -0
- package/services/mcp/claudeai.ts +164 -0
- package/services/mcp/client.ts +3348 -0
- package/services/mcp/config.ts +1578 -0
- package/services/mcp/elicitationHandler.ts +313 -0
- package/services/mcp/envExpansion.ts +38 -0
- package/services/mcp/headersHelper.ts +138 -0
- package/services/mcp/mcpStringUtils.ts +106 -0
- package/services/mcp/normalization.ts +23 -0
- package/services/mcp/oauthPort.ts +78 -0
- package/services/mcp/officialRegistry.ts +72 -0
- package/services/mcp/types.ts +258 -0
- package/services/mcp/useManageMCPConnections.ts +1141 -0
- package/services/mcp/utils.ts +575 -0
- package/services/mcp/vscodeSdkMcp.ts +112 -0
- package/services/mcp/xaa.ts +511 -0
- package/services/mcp/xaaIdpLogin.ts +487 -0
- package/services/mcpServerApproval.tsx +41 -0
- package/services/mockRateLimits.ts +882 -0
- package/services/notifier.ts +156 -0
- package/services/oauth/auth-code-listener.ts +211 -0
- package/services/oauth/client.ts +566 -0
- package/services/oauth/crypto.ts +23 -0
- package/services/oauth/getOauthProfile.ts +53 -0
- package/services/oauth/index.ts +198 -0
- package/services/plugins/PluginInstallationManager.ts +184 -0
- package/services/plugins/pluginCliCommands.ts +344 -0
- package/services/plugins/pluginOperations.ts +1088 -0
- package/services/policyLimits/index.ts +663 -0
- package/services/policyLimits/types.ts +27 -0
- package/services/preventSleep.ts +165 -0
- package/services/rateLimitMessages.ts +344 -0
- package/services/rateLimitMocking.ts +144 -0
- package/services/remoteManagedSettings/index.ts +638 -0
- package/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/services/remoteManagedSettings/syncCache.ts +112 -0
- package/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/services/remoteManagedSettings/types.ts +31 -0
- package/services/settingsSync/index.ts +581 -0
- package/services/settingsSync/types.ts +67 -0
- package/services/teamMemorySync/index.ts +1256 -0
- package/services/teamMemorySync/secretScanner.ts +324 -0
- package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/services/teamMemorySync/types.ts +156 -0
- package/services/teamMemorySync/watcher.ts +387 -0
- package/services/tips/tipHistory.ts +17 -0
- package/services/tips/tipRegistry.ts +686 -0
- package/services/tips/tipScheduler.ts +58 -0
- package/services/tokenEstimation.ts +495 -0
- package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/services/tools/StreamingToolExecutor.ts +530 -0
- package/services/tools/toolExecution.ts +1745 -0
- package/services/tools/toolHooks.ts +650 -0
- package/services/tools/toolOrchestration.ts +188 -0
- package/services/vcr.ts +406 -0
- package/services/voice.ts +525 -0
- package/services/voiceKeyterms.ts +106 -0
- package/services/voiceStreamSTT.ts +544 -0
- package/setup.ts +477 -0
- package/state/AppState.tsx +200 -0
- package/state/AppStateStore.ts +569 -0
- package/state/onChangeAppState.ts +171 -0
- package/state/selectors.ts +76 -0
- package/state/store.ts +34 -0
- package/state/teammateViewHelpers.ts +141 -0
- package/tasks.ts +39 -0
- package/tools/AgentTool/AgentTool.tsx +1398 -0
- package/tools/AgentTool/UI.tsx +872 -0
- package/tools/AgentTool/agentColorManager.ts +66 -0
- package/tools/AgentTool/agentDisplay.ts +104 -0
- package/tools/AgentTool/agentMemory.ts +177 -0
- package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/tools/AgentTool/agentToolUtils.ts +686 -0
- package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/tools/AgentTool/builtInAgents.ts +72 -0
- package/tools/AgentTool/constants.ts +12 -0
- package/tools/AgentTool/forkSubagent.ts +210 -0
- package/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/tools/AgentTool/prompt.ts +287 -0
- package/tools/AgentTool/resumeAgent.ts +265 -0
- package/tools/AgentTool/runAgent.ts +973 -0
- package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/tools/BashTool/BashTool.tsx +1144 -0
- package/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/tools/BashTool/UI.tsx +185 -0
- package/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/tools/BashTool/bashPermissions.ts +2621 -0
- package/tools/BashTool/bashSecurity.ts +2592 -0
- package/tools/BashTool/commandSemantics.ts +140 -0
- package/tools/BashTool/commentLabel.ts +13 -0
- package/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/tools/BashTool/modeValidation.ts +115 -0
- package/tools/BashTool/pathValidation.ts +1303 -0
- package/tools/BashTool/prompt.ts +369 -0
- package/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/tools/BashTool/sedEditParser.ts +322 -0
- package/tools/BashTool/sedValidation.ts +684 -0
- package/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/tools/BashTool/toolName.ts +2 -0
- package/tools/BashTool/utils.ts +223 -0
- package/tools/BriefTool/BriefTool.ts +204 -0
- package/tools/BriefTool/UI.tsx +101 -0
- package/tools/BriefTool/attachments.ts +110 -0
- package/tools/BriefTool/prompt.ts +22 -0
- package/tools/BriefTool/upload.ts +174 -0
- package/tools/ConfigTool/ConfigTool.ts +467 -0
- package/tools/ConfigTool/UI.tsx +38 -0
- package/tools/ConfigTool/constants.ts +1 -0
- package/tools/ConfigTool/prompt.ts +93 -0
- package/tools/ConfigTool/supportedSettings.ts +211 -0
- package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/tools/EnterPlanModeTool/constants.ts +1 -0
- package/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/tools/EnterWorktreeTool/constants.ts +1 -0
- package/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/tools/ExitPlanModeTool/constants.ts +2 -0
- package/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/tools/ExitWorktreeTool/constants.ts +1 -0
- package/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/tools/FileEditTool/FileEditTool.ts +625 -0
- package/tools/FileEditTool/UI.tsx +289 -0
- package/tools/FileEditTool/constants.ts +11 -0
- package/tools/FileEditTool/prompt.ts +28 -0
- package/tools/FileEditTool/types.ts +85 -0
- package/tools/FileEditTool/utils.ts +775 -0
- package/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/tools/FileReadTool/UI.tsx +185 -0
- package/tools/FileReadTool/imageProcessor.ts +94 -0
- package/tools/FileReadTool/limits.ts +92 -0
- package/tools/FileReadTool/prompt.ts +49 -0
- package/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/tools/FileWriteTool/UI.tsx +405 -0
- package/tools/FileWriteTool/prompt.ts +18 -0
- package/tools/GlobTool/GlobTool.ts +198 -0
- package/tools/GlobTool/UI.tsx +63 -0
- package/tools/GlobTool/prompt.ts +7 -0
- package/tools/GrepTool/GrepTool.ts +577 -0
- package/tools/GrepTool/UI.tsx +201 -0
- package/tools/GrepTool/prompt.ts +18 -0
- package/tools/LSPTool/LSPTool.ts +860 -0
- package/tools/LSPTool/UI.tsx +228 -0
- package/tools/LSPTool/formatters.ts +592 -0
- package/tools/LSPTool/prompt.ts +21 -0
- package/tools/LSPTool/schemas.ts +215 -0
- package/tools/LSPTool/symbolContext.ts +90 -0
- package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/tools/MCPTool/MCPTool.ts +77 -0
- package/tools/MCPTool/UI.tsx +403 -0
- package/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/tools/MCPTool/prompt.ts +3 -0
- package/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/tools/NotebookEditTool/UI.tsx +93 -0
- package/tools/NotebookEditTool/constants.ts +2 -0
- package/tools/NotebookEditTool/prompt.ts +3 -0
- package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/tools/PowerShellTool/UI.tsx +131 -0
- package/tools/PowerShellTool/clmTypes.ts +211 -0
- package/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/tools/PowerShellTool/commonParameters.ts +30 -0
- package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/tools/PowerShellTool/gitSafety.ts +176 -0
- package/tools/PowerShellTool/modeValidation.ts +404 -0
- package/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/tools/PowerShellTool/prompt.ts +145 -0
- package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/tools/PowerShellTool/toolName.ts +2 -0
- package/tools/REPLTool/constants.ts +46 -0
- package/tools/REPLTool/primitiveTools.ts +39 -0
- package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/tools/ScheduleCronTool/UI.tsx +60 -0
- package/tools/ScheduleCronTool/prompt.ts +135 -0
- package/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/tools/SendMessageTool/UI.tsx +31 -0
- package/tools/SendMessageTool/constants.ts +1 -0
- package/tools/SendMessageTool/prompt.ts +49 -0
- package/tools/SkillTool/SkillTool.ts +1108 -0
- package/tools/SkillTool/UI.tsx +128 -0
- package/tools/SkillTool/constants.ts +1 -0
- package/tools/SkillTool/prompt.ts +241 -0
- package/tools/SleepTool/prompt.ts +17 -0
- package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/tools/TaskCreateTool/constants.ts +1 -0
- package/tools/TaskCreateTool/prompt.ts +56 -0
- package/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/tools/TaskGetTool/constants.ts +1 -0
- package/tools/TaskGetTool/prompt.ts +24 -0
- package/tools/TaskListTool/TaskListTool.ts +116 -0
- package/tools/TaskListTool/constants.ts +1 -0
- package/tools/TaskListTool/prompt.ts +49 -0
- package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/tools/TaskOutputTool/constants.ts +1 -0
- package/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/tools/TaskStopTool/UI.tsx +41 -0
- package/tools/TaskStopTool/prompt.ts +8 -0
- package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/tools/TaskUpdateTool/constants.ts +1 -0
- package/tools/TaskUpdateTool/prompt.ts +77 -0
- package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/tools/TeamCreateTool/UI.tsx +6 -0
- package/tools/TeamCreateTool/constants.ts +1 -0
- package/tools/TeamCreateTool/prompt.ts +113 -0
- package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/tools/TeamDeleteTool/UI.tsx +20 -0
- package/tools/TeamDeleteTool/constants.ts +1 -0
- package/tools/TeamDeleteTool/prompt.ts +16 -0
- package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/tools/TodoWriteTool/constants.ts +1 -0
- package/tools/TodoWriteTool/prompt.ts +184 -0
- package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/tools/ToolSearchTool/constants.ts +1 -0
- package/tools/ToolSearchTool/prompt.ts +121 -0
- package/tools/WebFetchTool/UI.tsx +72 -0
- package/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/tools/WebFetchTool/preapproved.ts +166 -0
- package/tools/WebFetchTool/prompt.ts +46 -0
- package/tools/WebFetchTool/utils.ts +530 -0
- package/tools/WebSearchTool/UI.tsx +101 -0
- package/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/tools/WebSearchTool/prompt.ts +34 -0
- package/tools/WorkflowTool/constants.ts +5 -0
- package/tools/shared/gitOperationTracking.ts +277 -0
- package/tools/shared/spawnMultiAgent.ts +1093 -0
- package/tools/testing/TestingPermissionTool.tsx +74 -0
- package/tools/utils.ts +40 -0
- package/tools.ts +392 -0
- package/types/command.ts +216 -0
- package/types/connectorText.ts +21 -0
- package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/types/generated/google/protobuf/timestamp.ts +187 -0
- package/types/hooks.ts +290 -0
- package/types/ids.ts +44 -0
- package/types/logs.ts +330 -0
- package/types/permissions.ts +441 -0
- package/types/plugin.ts +363 -0
- package/types/textInputTypes.ts +387 -0
- package/utils/CircularBuffer.ts +84 -0
- package/utils/Cursor.ts +1530 -0
- package/utils/QueryGuard.ts +121 -0
- package/utils/Shell.ts +474 -0
- package/utils/ShellCommand.ts +465 -0
- package/utils/abortController.ts +99 -0
- package/utils/activityManager.ts +164 -0
- package/utils/advisor.ts +145 -0
- package/utils/agentContext.ts +178 -0
- package/utils/agentId.ts +99 -0
- package/utils/agentSwarmsEnabled.ts +44 -0
- package/utils/agenticSessionSearch.ts +307 -0
- package/utils/analyzeContext.ts +1382 -0
- package/utils/ansiToPng.ts +334 -0
- package/utils/ansiToSvg.ts +272 -0
- package/utils/api.ts +718 -0
- package/utils/apiPreconnect.ts +71 -0
- package/utils/appleTerminalBackup.ts +124 -0
- package/utils/argumentSubstitution.ts +145 -0
- package/utils/array.ts +13 -0
- package/utils/asciicast.ts +239 -0
- package/utils/attachments.ts +3997 -0
- package/utils/attribution.ts +393 -0
- package/utils/auth.ts +2002 -0
- package/utils/authFileDescriptor.ts +196 -0
- package/utils/authPortable.ts +19 -0
- package/utils/autoModeDenials.ts +26 -0
- package/utils/autoRunIssue.tsx +122 -0
- package/utils/autoUpdater.ts +561 -0
- package/utils/aws.ts +74 -0
- package/utils/awsAuthStatusManager.ts +81 -0
- package/utils/background/remote/preconditions.ts +235 -0
- package/utils/background/remote/remoteSession.ts +98 -0
- package/utils/backgroundHousekeeping.ts +94 -0
- package/utils/bash/ParsedCommand.ts +318 -0
- package/utils/bash/ShellSnapshot.ts +582 -0
- package/utils/bash/ast.ts +2679 -0
- package/utils/bash/bashParser.ts +4436 -0
- package/utils/bash/bashPipeCommand.ts +294 -0
- package/utils/bash/commands.ts +1339 -0
- package/utils/bash/heredoc.ts +733 -0
- package/utils/bash/parser.ts +230 -0
- package/utils/bash/prefix.ts +204 -0
- package/utils/bash/registry.ts +53 -0
- package/utils/bash/shellCompletion.ts +259 -0
- package/utils/bash/shellPrefix.ts +28 -0
- package/utils/bash/shellQuote.ts +304 -0
- package/utils/bash/shellQuoting.ts +128 -0
- package/utils/bash/specs/alias.ts +14 -0
- package/utils/bash/specs/index.ts +18 -0
- package/utils/bash/specs/nohup.ts +13 -0
- package/utils/bash/specs/pyright.ts +91 -0
- package/utils/bash/specs/sleep.ts +13 -0
- package/utils/bash/specs/srun.ts +31 -0
- package/utils/bash/specs/time.ts +13 -0
- package/utils/bash/specs/timeout.ts +20 -0
- package/utils/bash/treeSitterAnalysis.ts +506 -0
- package/utils/betas.ts +434 -0
- package/utils/billing.ts +78 -0
- package/utils/binaryCheck.ts +53 -0
- package/utils/browser.ts +68 -0
- package/utils/bufferedWriter.ts +100 -0
- package/utils/bundledMode.ts +22 -0
- package/utils/caCerts.ts +115 -0
- package/utils/caCertsConfig.ts +88 -0
- package/utils/cachePaths.ts +38 -0
- package/utils/classifierApprovals.ts +88 -0
- package/utils/classifierApprovalsHook.ts +17 -0
- package/utils/claudeCodeHints.ts +193 -0
- package/utils/claudeDesktop.ts +152 -0
- package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/utils/claudeInChrome/common.ts +540 -0
- package/utils/claudeInChrome/mcpServer.ts +293 -0
- package/utils/claudeInChrome/prompt.ts +83 -0
- package/utils/claudeInChrome/setup.ts +400 -0
- package/utils/claudeInChrome/setupPortable.ts +233 -0
- package/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/utils/claudemd.ts +1479 -0
- package/utils/cleanup.ts +602 -0
- package/utils/cleanupRegistry.ts +25 -0
- package/utils/cliArgs.ts +60 -0
- package/utils/cliHighlight.ts +54 -0
- package/utils/codeIndexing.ts +206 -0
- package/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/utils/collapseHookSummaries.ts +59 -0
- package/utils/collapseReadSearch.ts +1109 -0
- package/utils/collapseTeammateShutdowns.ts +55 -0
- package/utils/combinedAbortSignal.ts +47 -0
- package/utils/commandLifecycle.ts +21 -0
- package/utils/commitAttribution.ts +961 -0
- package/utils/completionCache.ts +166 -0
- package/utils/computerUse/appNames.ts +196 -0
- package/utils/computerUse/cleanup.ts +86 -0
- package/utils/computerUse/common.ts +61 -0
- package/utils/computerUse/computerUseLock.ts +215 -0
- package/utils/computerUse/drainRunLoop.ts +79 -0
- package/utils/computerUse/escHotkey.ts +54 -0
- package/utils/computerUse/executor.ts +658 -0
- package/utils/computerUse/gates.ts +72 -0
- package/utils/computerUse/hostAdapter.ts +69 -0
- package/utils/computerUse/inputLoader.ts +30 -0
- package/utils/computerUse/mcpServer.ts +106 -0
- package/utils/computerUse/setup.ts +53 -0
- package/utils/computerUse/swiftLoader.ts +23 -0
- package/utils/computerUse/toolRendering.tsx +125 -0
- package/utils/computerUse/wrapper.tsx +336 -0
- package/utils/concurrentSessions.ts +204 -0
- package/utils/config.ts +1817 -0
- package/utils/configConstants.ts +21 -0
- package/utils/contentArray.ts +51 -0
- package/utils/context.ts +221 -0
- package/utils/contextAnalysis.ts +272 -0
- package/utils/contextSuggestions.ts +235 -0
- package/utils/controlMessageCompat.ts +32 -0
- package/utils/conversationRecovery.ts +597 -0
- package/utils/cron.ts +308 -0
- package/utils/cronJitterConfig.ts +75 -0
- package/utils/cronScheduler.ts +565 -0
- package/utils/cronTasks.ts +458 -0
- package/utils/cronTasksLock.ts +195 -0
- package/utils/crossProjectResume.ts +75 -0
- package/utils/crypto.ts +13 -0
- package/utils/cwd.ts +32 -0
- package/utils/debug.ts +268 -0
- package/utils/debugFilter.ts +157 -0
- package/utils/deepLink/banner.ts +123 -0
- package/utils/deepLink/parseDeepLink.ts +170 -0
- package/utils/deepLink/protocolHandler.ts +136 -0
- package/utils/deepLink/registerProtocol.ts +348 -0
- package/utils/deepLink/terminalLauncher.ts +557 -0
- package/utils/deepLink/terminalPreference.ts +54 -0
- package/utils/desktopDeepLink.ts +236 -0
- package/utils/detectRepository.ts +178 -0
- package/utils/diagLogs.ts +94 -0
- package/utils/diff.ts +177 -0
- package/utils/directMemberMessage.ts +69 -0
- package/utils/displayTags.ts +51 -0
- package/utils/doctorContextWarnings.ts +265 -0
- package/utils/doctorDiagnostic.ts +625 -0
- package/utils/dxt/helpers.ts +88 -0
- package/utils/dxt/zip.ts +226 -0
- package/utils/earlyInput.ts +191 -0
- package/utils/editor.ts +183 -0
- package/utils/effort.ts +329 -0
- package/utils/embeddedTools.ts +29 -0
- package/utils/env.ts +347 -0
- package/utils/envDynamic.ts +151 -0
- package/utils/envUtils.ts +183 -0
- package/utils/envValidation.ts +38 -0
- package/utils/errorLogSink.ts +235 -0
- package/utils/errors.ts +238 -0
- package/utils/exampleCommands.ts +184 -0
- package/utils/execFileNoThrow.ts +150 -0
- package/utils/execFileNoThrowPortable.ts +89 -0
- package/utils/execSyncWrapper.ts +38 -0
- package/utils/exportRenderer.tsx +98 -0
- package/utils/extraUsage.ts +23 -0
- package/utils/fastMode.ts +532 -0
- package/utils/file.ts +584 -0
- package/utils/fileHistory.ts +1115 -0
- package/utils/fileOperationAnalytics.ts +71 -0
- package/utils/filePersistence/filePersistence.ts +287 -0
- package/utils/filePersistence/outputsScanner.ts +126 -0
- package/utils/filePersistence/types.ts +28 -0
- package/utils/fileRead.ts +102 -0
- package/utils/fileReadCache.ts +96 -0
- package/utils/fileStateCache.ts +142 -0
- package/utils/findExecutable.ts +17 -0
- package/utils/fingerprint.ts +76 -0
- package/utils/forkedAgent.ts +689 -0
- package/utils/format.ts +308 -0
- package/utils/formatBriefTimestamp.ts +81 -0
- package/utils/fpsTracker.ts +47 -0
- package/utils/frontmatterParser.ts +370 -0
- package/utils/fsOperations.ts +770 -0
- package/utils/fullscreen.ts +202 -0
- package/utils/generatedFiles.ts +136 -0
- package/utils/generators.ts +88 -0
- package/utils/genericProcessUtils.ts +184 -0
- package/utils/getWorktreePaths.ts +70 -0
- package/utils/getWorktreePathsPortable.ts +27 -0
- package/utils/ghPrStatus.ts +106 -0
- package/utils/git/gitConfigParser.ts +277 -0
- package/utils/git/gitFilesystem.ts +699 -0
- package/utils/git/gitignore.ts +99 -0
- package/utils/git.ts +926 -0
- package/utils/gitDiff.ts +532 -0
- package/utils/gitSettings.ts +18 -0
- package/utils/github/ghAuthStatus.ts +29 -0
- package/utils/githubRepoPathMapping.ts +162 -0
- package/utils/glob.ts +130 -0
- package/utils/gracefulShutdown.ts +529 -0
- package/utils/groupToolUses.ts +182 -0
- package/utils/handlePromptSubmit.ts +610 -0
- package/utils/hash.ts +46 -0
- package/utils/headlessProfiler.ts +178 -0
- package/utils/heapDumpService.ts +303 -0
- package/utils/heatmap.ts +198 -0
- package/utils/highlightMatch.tsx +28 -0
- package/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/utils/hooks/execAgentHook.ts +339 -0
- package/utils/hooks/execHttpHook.ts +242 -0
- package/utils/hooks/execPromptHook.ts +211 -0
- package/utils/hooks/fileChangedWatcher.ts +191 -0
- package/utils/hooks/hookEvents.ts +192 -0
- package/utils/hooks/hookHelpers.ts +83 -0
- package/utils/hooks/hooksConfigManager.ts +400 -0
- package/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/utils/hooks/hooksSettings.ts +271 -0
- package/utils/hooks/postSamplingHooks.ts +70 -0
- package/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/utils/hooks/registerSkillHooks.ts +64 -0
- package/utils/hooks/sessionHooks.ts +447 -0
- package/utils/hooks/skillImprovement.ts +267 -0
- package/utils/hooks/ssrfGuard.ts +294 -0
- package/utils/hooks.ts +5022 -0
- package/utils/horizontalScroll.ts +137 -0
- package/utils/http.ts +136 -0
- package/utils/hyperlink.ts +39 -0
- package/utils/iTermBackup.ts +73 -0
- package/utils/ide.ts +1494 -0
- package/utils/idePathConversion.ts +90 -0
- package/utils/idleTimeout.ts +53 -0
- package/utils/imagePaste.ts +416 -0
- package/utils/imageResizer.ts +880 -0
- package/utils/imageStore.ts +167 -0
- package/utils/imageValidation.ts +104 -0
- package/utils/immediateCommand.ts +15 -0
- package/utils/inProcessTeammateHelpers.ts +102 -0
- package/utils/ink.ts +26 -0
- package/utils/intl.ts +94 -0
- package/utils/jetbrains.ts +191 -0
- package/utils/json.ts +277 -0
- package/utils/jsonRead.ts +16 -0
- package/utils/keyboardShortcuts.ts +14 -0
- package/utils/lazySchema.ts +8 -0
- package/utils/listSessionsImpl.ts +454 -0
- package/utils/localInstaller.ts +162 -0
- package/utils/lockfile.ts +43 -0
- package/utils/log.ts +362 -0
- package/utils/logoV2Utils.ts +350 -0
- package/utils/mailbox.ts +73 -0
- package/utils/managedEnv.ts +199 -0
- package/utils/managedEnvConstants.ts +191 -0
- package/utils/markdown.ts +381 -0
- package/utils/markdownConfigLoader.ts +600 -0
- package/utils/mcp/dateTimeParser.ts +121 -0
- package/utils/mcp/elicitationValidation.ts +336 -0
- package/utils/mcpInstructionsDelta.ts +130 -0
- package/utils/mcpOutputStorage.ts +189 -0
- package/utils/mcpValidation.ts +208 -0
- package/utils/mcpWebSocketTransport.ts +200 -0
- package/utils/memoize.ts +269 -0
- package/utils/memory/types.ts +12 -0
- package/utils/memory/versions.ts +8 -0
- package/utils/memoryFileDetection.ts +289 -0
- package/utils/messagePredicates.ts +8 -0
- package/utils/messageQueueManager.ts +547 -0
- package/utils/messages/mappers.ts +290 -0
- package/utils/messages/systemInit.ts +96 -0
- package/utils/messages.ts +5512 -0
- package/utils/model/agent.ts +157 -0
- package/utils/model/aliases.ts +25 -0
- package/utils/model/antModels.ts +64 -0
- package/utils/model/bedrock.ts +265 -0
- package/utils/model/check1mAccess.ts +72 -0
- package/utils/model/configs.ts +118 -0
- package/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/utils/model/deprecation.ts +101 -0
- package/utils/model/model.ts +618 -0
- package/utils/model/modelAllowlist.ts +170 -0
- package/utils/model/modelCapabilities.ts +118 -0
- package/utils/model/modelOptions.ts +540 -0
- package/utils/model/modelStrings.ts +166 -0
- package/utils/model/modelSupportOverrides.ts +50 -0
- package/utils/model/providers.ts +40 -0
- package/utils/model/validateModel.ts +159 -0
- package/utils/modelCost.ts +231 -0
- package/utils/modifiers.ts +36 -0
- package/utils/mtls.ts +179 -0
- package/utils/nativeInstaller/download.ts +523 -0
- package/utils/nativeInstaller/index.ts +18 -0
- package/utils/nativeInstaller/installer.ts +1708 -0
- package/utils/nativeInstaller/packageManagers.ts +336 -0
- package/utils/nativeInstaller/pidLock.ts +433 -0
- package/utils/notebook.ts +224 -0
- package/utils/objectGroupBy.ts +18 -0
- package/utils/pasteStore.ts +104 -0
- package/utils/path.ts +155 -0
- package/utils/pdf.ts +300 -0
- package/utils/pdfUtils.ts +70 -0
- package/utils/peerAddress.ts +21 -0
- package/utils/permissions/PermissionMode.ts +141 -0
- package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/utils/permissions/PermissionResult.ts +35 -0
- package/utils/permissions/PermissionRule.ts +40 -0
- package/utils/permissions/PermissionUpdate.ts +389 -0
- package/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/utils/permissions/autoModeState.ts +39 -0
- package/utils/permissions/bashClassifier.ts +61 -0
- package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/utils/permissions/classifierDecision.ts +98 -0
- package/utils/permissions/classifierShared.ts +39 -0
- package/utils/permissions/dangerousPatterns.ts +80 -0
- package/utils/permissions/denialTracking.ts +45 -0
- package/utils/permissions/filesystem.ts +1777 -0
- package/utils/permissions/getNextPermissionMode.ts +101 -0
- package/utils/permissions/pathValidation.ts +485 -0
- package/utils/permissions/permissionExplainer.ts +250 -0
- package/utils/permissions/permissionRuleParser.ts +198 -0
- package/utils/permissions/permissionSetup.ts +1532 -0
- package/utils/permissions/permissions.ts +1486 -0
- package/utils/permissions/permissionsLoader.ts +296 -0
- package/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/utils/permissions/shellRuleMatching.ts +228 -0
- package/utils/permissions/yoloClassifier.ts +1495 -0
- package/utils/planModeV2.ts +95 -0
- package/utils/plans.ts +397 -0
- package/utils/platform.ts +150 -0
- package/utils/plugins/addDirPluginSettings.ts +71 -0
- package/utils/plugins/cacheUtils.ts +196 -0
- package/utils/plugins/dependencyResolver.ts +305 -0
- package/utils/plugins/fetchTelemetry.ts +135 -0
- package/utils/plugins/gitAvailability.ts +69 -0
- package/utils/plugins/headlessPluginInstall.ts +174 -0
- package/utils/plugins/hintRecommendation.ts +164 -0
- package/utils/plugins/installCounts.ts +292 -0
- package/utils/plugins/installedPluginsManager.ts +1268 -0
- package/utils/plugins/loadPluginAgents.ts +348 -0
- package/utils/plugins/loadPluginCommands.ts +946 -0
- package/utils/plugins/loadPluginHooks.ts +287 -0
- package/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/utils/plugins/lspPluginIntegration.ts +387 -0
- package/utils/plugins/lspRecommendation.ts +374 -0
- package/utils/plugins/managedPlugins.ts +27 -0
- package/utils/plugins/marketplaceHelpers.ts +592 -0
- package/utils/plugins/marketplaceManager.ts +2643 -0
- package/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/utils/plugins/mcpbHandler.ts +968 -0
- package/utils/plugins/officialMarketplace.ts +25 -0
- package/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/utils/plugins/performStartupChecks.tsx +70 -0
- package/utils/plugins/pluginAutoupdate.ts +284 -0
- package/utils/plugins/pluginBlocklist.ts +127 -0
- package/utils/plugins/pluginDirectories.ts +178 -0
- package/utils/plugins/pluginFlagging.ts +208 -0
- package/utils/plugins/pluginIdentifier.ts +123 -0
- package/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/utils/plugins/pluginLoader.ts +3302 -0
- package/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/utils/plugins/pluginPolicy.ts +20 -0
- package/utils/plugins/pluginStartupCheck.ts +341 -0
- package/utils/plugins/pluginVersioning.ts +157 -0
- package/utils/plugins/reconciler.ts +265 -0
- package/utils/plugins/refresh.ts +215 -0
- package/utils/plugins/schemas.ts +1681 -0
- package/utils/plugins/validatePlugin.ts +903 -0
- package/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/utils/plugins/zipCache.ts +406 -0
- package/utils/plugins/zipCacheAdapters.ts +164 -0
- package/utils/powershell/dangerousCmdlets.ts +185 -0
- package/utils/powershell/parser.ts +1804 -0
- package/utils/powershell/staticPrefix.ts +316 -0
- package/utils/preflightChecks.tsx +151 -0
- package/utils/privacyLevel.ts +55 -0
- package/utils/process.ts +68 -0
- package/utils/processUserInput/processBashCommand.tsx +140 -0
- package/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/utils/processUserInput/processTextPrompt.ts +100 -0
- package/utils/processUserInput/processUserInput.ts +605 -0
- package/utils/profilerBase.ts +46 -0
- package/utils/promptCategory.ts +49 -0
- package/utils/promptEditor.ts +188 -0
- package/utils/promptShellExecution.ts +183 -0
- package/utils/proxy.ts +426 -0
- package/utils/queryContext.ts +179 -0
- package/utils/queryHelpers.ts +552 -0
- package/utils/queryProfiler.ts +301 -0
- package/utils/queueProcessor.ts +95 -0
- package/utils/readEditContext.ts +227 -0
- package/utils/readFileInRange.ts +383 -0
- package/utils/releaseNotes.ts +360 -0
- package/utils/renderOptions.ts +77 -0
- package/utils/ripgrep.ts +679 -0
- package/utils/sandbox/sandbox-adapter.ts +987 -0
- package/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/utils/sanitization.ts +91 -0
- package/utils/screenshotClipboard.ts +121 -0
- package/utils/sdkEventQueue.ts +134 -0
- package/utils/secureStorage/fallbackStorage.ts +70 -0
- package/utils/secureStorage/index.ts +17 -0
- package/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/utils/secureStorage/plainTextStorage.ts +84 -0
- package/utils/semanticBoolean.ts +29 -0
- package/utils/semanticNumber.ts +36 -0
- package/utils/semver.ts +59 -0
- package/utils/sequential.ts +56 -0
- package/utils/sessionActivity.ts +133 -0
- package/utils/sessionEnvVars.ts +22 -0
- package/utils/sessionEnvironment.ts +166 -0
- package/utils/sessionFileAccessHooks.ts +250 -0
- package/utils/sessionIngressAuth.ts +140 -0
- package/utils/sessionRestore.ts +551 -0
- package/utils/sessionStart.ts +232 -0
- package/utils/sessionState.ts +150 -0
- package/utils/sessionStorage.ts +5105 -0
- package/utils/sessionStoragePortable.ts +793 -0
- package/utils/sessionTitle.ts +129 -0
- package/utils/sessionUrl.ts +64 -0
- package/utils/set.ts +53 -0
- package/utils/settings/allErrors.ts +32 -0
- package/utils/settings/applySettingsChange.ts +92 -0
- package/utils/settings/changeDetector.ts +488 -0
- package/utils/settings/constants.ts +202 -0
- package/utils/settings/internalWrites.ts +37 -0
- package/utils/settings/managedPath.ts +34 -0
- package/utils/settings/mdm/constants.ts +81 -0
- package/utils/settings/mdm/rawRead.ts +130 -0
- package/utils/settings/mdm/settings.ts +316 -0
- package/utils/settings/permissionValidation.ts +262 -0
- package/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/utils/settings/schemaOutput.ts +8 -0
- package/utils/settings/settings.ts +1015 -0
- package/utils/settings/settingsCache.ts +80 -0
- package/utils/settings/toolValidationConfig.ts +103 -0
- package/utils/settings/types.ts +1148 -0
- package/utils/settings/validateEditTool.ts +45 -0
- package/utils/settings/validation.ts +265 -0
- package/utils/settings/validationTips.ts +164 -0
- package/utils/shell/bashProvider.ts +255 -0
- package/utils/shell/outputLimits.ts +14 -0
- package/utils/shell/powershellDetection.ts +107 -0
- package/utils/shell/powershellProvider.ts +123 -0
- package/utils/shell/prefix.ts +367 -0
- package/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/utils/shell/resolveDefaultShell.ts +14 -0
- package/utils/shell/shellProvider.ts +33 -0
- package/utils/shell/shellToolUtils.ts +22 -0
- package/utils/shell/specPrefix.ts +241 -0
- package/utils/shellConfig.ts +167 -0
- package/utils/sideQuery.ts +222 -0
- package/utils/sideQuestion.ts +155 -0
- package/utils/signal.ts +43 -0
- package/utils/sinks.ts +16 -0
- package/utils/skills/skillChangeDetector.ts +311 -0
- package/utils/slashCommandParsing.ts +60 -0
- package/utils/sleep.ts +84 -0
- package/utils/sliceAnsi.ts +91 -0
- package/utils/slowOperations.ts +286 -0
- package/utils/standaloneAgent.ts +23 -0
- package/utils/startupProfiler.ts +194 -0
- package/utils/staticRender.tsx +116 -0
- package/utils/stats.ts +1061 -0
- package/utils/statsCache.ts +434 -0
- package/utils/status.tsx +362 -0
- package/utils/statusNoticeDefinitions.tsx +198 -0
- package/utils/statusNoticeHelpers.ts +20 -0
- package/utils/stream.ts +76 -0
- package/utils/streamJsonStdoutGuard.ts +123 -0
- package/utils/streamlinedTransform.ts +201 -0
- package/utils/stringUtils.ts +235 -0
- package/utils/subprocessEnv.ts +99 -0
- package/utils/suggestions/commandSuggestions.ts +567 -0
- package/utils/suggestions/directoryCompletion.ts +263 -0
- package/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/utils/suggestions/skillUsageTracking.ts +55 -0
- package/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/utils/swarm/backends/ITermBackend.ts +370 -0
- package/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/utils/swarm/backends/detection.ts +128 -0
- package/utils/swarm/backends/it2Setup.ts +245 -0
- package/utils/swarm/backends/registry.ts +464 -0
- package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/utils/swarm/backends/types.ts +311 -0
- package/utils/swarm/constants.ts +33 -0
- package/utils/swarm/inProcessRunner.ts +1552 -0
- package/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/utils/swarm/permissionSync.ts +928 -0
- package/utils/swarm/reconnection.ts +119 -0
- package/utils/swarm/spawnInProcess.ts +328 -0
- package/utils/swarm/spawnUtils.ts +146 -0
- package/utils/swarm/teamHelpers.ts +683 -0
- package/utils/swarm/teammateInit.ts +129 -0
- package/utils/swarm/teammateLayoutManager.ts +107 -0
- package/utils/swarm/teammateModel.ts +10 -0
- package/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/utils/systemDirectories.ts +74 -0
- package/utils/systemPrompt.ts +123 -0
- package/utils/systemPromptType.ts +14 -0
- package/utils/systemTheme.ts +119 -0
- package/utils/taggedId.ts +54 -0
- package/utils/task/TaskOutput.ts +390 -0
- package/utils/task/diskOutput.ts +451 -0
- package/utils/task/framework.ts +308 -0
- package/utils/task/outputFormatting.ts +38 -0
- package/utils/task/sdkProgress.ts +36 -0
- package/utils/tasks.ts +862 -0
- package/utils/teamDiscovery.ts +81 -0
- package/utils/teamMemoryOps.ts +88 -0
- package/utils/teammate.ts +292 -0
- package/utils/teammateContext.ts +96 -0
- package/utils/teammateMailbox.ts +1183 -0
- package/utils/telemetry/betaSessionTracing.ts +491 -0
- package/utils/telemetry/bigqueryExporter.ts +252 -0
- package/utils/telemetry/events.ts +75 -0
- package/utils/telemetry/instrumentation.ts +825 -0
- package/utils/telemetry/logger.ts +26 -0
- package/utils/telemetry/perfettoTracing.ts +1120 -0
- package/utils/telemetry/pluginTelemetry.ts +289 -0
- package/utils/telemetry/sessionTracing.ts +927 -0
- package/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/utils/telemetryAttributes.ts +71 -0
- package/utils/teleport/api.ts +466 -0
- package/utils/teleport/environmentSelection.ts +77 -0
- package/utils/teleport/environments.ts +120 -0
- package/utils/teleport/gitBundle.ts +292 -0
- package/utils/teleport.tsx +1226 -0
- package/utils/tempfile.ts +31 -0
- package/utils/terminal.ts +131 -0
- package/utils/terminalPanel.ts +191 -0
- package/utils/textHighlighting.ts +166 -0
- package/utils/theme.ts +639 -0
- package/utils/thinking.ts +162 -0
- package/utils/timeouts.ts +39 -0
- package/utils/tmuxSocket.ts +427 -0
- package/utils/todo/types.ts +18 -0
- package/utils/tokenBudget.ts +73 -0
- package/utils/tokens.ts +261 -0
- package/utils/toolErrors.ts +132 -0
- package/utils/toolPool.ts +79 -0
- package/utils/toolResultStorage.ts +1040 -0
- package/utils/toolSchemaCache.ts +26 -0
- package/utils/toolSearch.ts +756 -0
- package/utils/transcriptSearch.ts +202 -0
- package/utils/treeify.ts +170 -0
- package/utils/truncate.ts +179 -0
- package/utils/ultraplan/ccrSession.ts +349 -0
- package/utils/ultraplan/keyword.ts +127 -0
- package/utils/unaryLogging.ts +39 -0
- package/utils/undercover.ts +89 -0
- package/utils/user.ts +194 -0
- package/utils/userAgent.ts +10 -0
- package/utils/userConfig.ts +181 -0
- package/utils/userPromptKeywords.ts +27 -0
- package/utils/uuid.ts +27 -0
- package/utils/warningHandler.ts +121 -0
- package/utils/which.ts +82 -0
- package/utils/windowsPaths.ts +173 -0
- package/utils/withResolvers.ts +13 -0
- package/utils/words.ts +800 -0
- package/utils/workloadContext.ts +57 -0
- package/utils/worktree.ts +1519 -0
- package/utils/worktreeModeEnabled.ts +11 -0
- package/utils/xdg.ts +65 -0
- package/utils/xml.ts +16 -0
- package/utils/yaml.ts +15 -0
- package/utils/zodToJsonSchema.ts +23 -0
|
@@ -0,0 +1,1745 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import type {
|
|
3
|
+
ContentBlockParam,
|
|
4
|
+
ToolResultBlockParam,
|
|
5
|
+
ToolUseBlock,
|
|
6
|
+
} from '@anthropic-ai/sdk/resources/index.mjs'
|
|
7
|
+
import {
|
|
8
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
9
|
+
logEvent,
|
|
10
|
+
} from 'src/services/analytics/index.js'
|
|
11
|
+
import {
|
|
12
|
+
extractMcpToolDetails,
|
|
13
|
+
extractSkillName,
|
|
14
|
+
extractToolInputForTelemetry,
|
|
15
|
+
getFileExtensionForAnalytics,
|
|
16
|
+
getFileExtensionsFromBashCommand,
|
|
17
|
+
isToolDetailsLoggingEnabled,
|
|
18
|
+
mcpToolDetailsForAnalytics,
|
|
19
|
+
sanitizeToolNameForAnalytics,
|
|
20
|
+
} from 'src/services/analytics/metadata.js'
|
|
21
|
+
import {
|
|
22
|
+
addToToolDuration,
|
|
23
|
+
getCodeEditToolDecisionCounter,
|
|
24
|
+
getStatsStore,
|
|
25
|
+
} from '../../bootstrap/state.js'
|
|
26
|
+
import {
|
|
27
|
+
buildCodeEditToolAttributes,
|
|
28
|
+
isCodeEditingTool,
|
|
29
|
+
} from '../../hooks/toolPermission/permissionLogging.js'
|
|
30
|
+
import type { CanUseToolFn } from '../../hooks/useCanUseTool.js'
|
|
31
|
+
import {
|
|
32
|
+
findToolByName,
|
|
33
|
+
type Tool,
|
|
34
|
+
type ToolProgress,
|
|
35
|
+
type ToolProgressData,
|
|
36
|
+
type ToolUseContext,
|
|
37
|
+
} from '../../Tool.js'
|
|
38
|
+
import type { BashToolInput } from '../../tools/BashTool/BashTool.js'
|
|
39
|
+
import { startSpeculativeClassifierCheck } from '../../tools/BashTool/bashPermissions.js'
|
|
40
|
+
import { BASH_TOOL_NAME } from '../../tools/BashTool/toolName.js'
|
|
41
|
+
import { FILE_EDIT_TOOL_NAME } from '../../tools/FileEditTool/constants.js'
|
|
42
|
+
import { FILE_READ_TOOL_NAME } from '../../tools/FileReadTool/prompt.js'
|
|
43
|
+
import { FILE_WRITE_TOOL_NAME } from '../../tools/FileWriteTool/prompt.js'
|
|
44
|
+
import { NOTEBOOK_EDIT_TOOL_NAME } from '../../tools/NotebookEditTool/constants.js'
|
|
45
|
+
import { POWERSHELL_TOOL_NAME } from '../../tools/PowerShellTool/toolName.js'
|
|
46
|
+
import { parseGitCommitId } from '../../tools/shared/gitOperationTracking.js'
|
|
47
|
+
import {
|
|
48
|
+
isDeferredTool,
|
|
49
|
+
TOOL_SEARCH_TOOL_NAME,
|
|
50
|
+
} from '../../tools/ToolSearchTool/prompt.js'
|
|
51
|
+
import { getAllBaseTools } from '../../tools.js'
|
|
52
|
+
import type { HookProgress } from '../../types/hooks.js'
|
|
53
|
+
import type {
|
|
54
|
+
AssistantMessage,
|
|
55
|
+
AttachmentMessage,
|
|
56
|
+
Message,
|
|
57
|
+
ProgressMessage,
|
|
58
|
+
StopHookInfo,
|
|
59
|
+
} from '../../types/message.js'
|
|
60
|
+
import { count } from '../../utils/array.js'
|
|
61
|
+
import { createAttachmentMessage } from '../../utils/attachments.js'
|
|
62
|
+
import { logForDebugging } from '../../utils/debug.js'
|
|
63
|
+
import {
|
|
64
|
+
AbortError,
|
|
65
|
+
errorMessage,
|
|
66
|
+
getErrnoCode,
|
|
67
|
+
ShellError,
|
|
68
|
+
TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
69
|
+
} from '../../utils/errors.js'
|
|
70
|
+
import { executePermissionDeniedHooks } from '../../utils/hooks.js'
|
|
71
|
+
import { logError } from '../../utils/log.js'
|
|
72
|
+
import {
|
|
73
|
+
CANCEL_MESSAGE,
|
|
74
|
+
createProgressMessage,
|
|
75
|
+
createStopHookSummaryMessage,
|
|
76
|
+
createToolResultStopMessage,
|
|
77
|
+
createUserMessage,
|
|
78
|
+
withMemoryCorrectionHint,
|
|
79
|
+
} from '../../utils/messages.js'
|
|
80
|
+
import type {
|
|
81
|
+
PermissionDecisionReason,
|
|
82
|
+
PermissionResult,
|
|
83
|
+
} from '../../utils/permissions/PermissionResult.js'
|
|
84
|
+
import {
|
|
85
|
+
startSessionActivity,
|
|
86
|
+
stopSessionActivity,
|
|
87
|
+
} from '../../utils/sessionActivity.js'
|
|
88
|
+
import { jsonStringify } from '../../utils/slowOperations.js'
|
|
89
|
+
import { Stream } from '../../utils/stream.js'
|
|
90
|
+
import { logOTelEvent } from '../../utils/telemetry/events.js'
|
|
91
|
+
import {
|
|
92
|
+
addToolContentEvent,
|
|
93
|
+
endToolBlockedOnUserSpan,
|
|
94
|
+
endToolExecutionSpan,
|
|
95
|
+
endToolSpan,
|
|
96
|
+
isBetaTracingEnabled,
|
|
97
|
+
startToolBlockedOnUserSpan,
|
|
98
|
+
startToolExecutionSpan,
|
|
99
|
+
startToolSpan,
|
|
100
|
+
} from '../../utils/telemetry/sessionTracing.js'
|
|
101
|
+
import {
|
|
102
|
+
formatError,
|
|
103
|
+
formatZodValidationError,
|
|
104
|
+
} from '../../utils/toolErrors.js'
|
|
105
|
+
import {
|
|
106
|
+
processPreMappedToolResultBlock,
|
|
107
|
+
processToolResultBlock,
|
|
108
|
+
} from '../../utils/toolResultStorage.js'
|
|
109
|
+
import {
|
|
110
|
+
extractDiscoveredToolNames,
|
|
111
|
+
isToolSearchEnabledOptimistic,
|
|
112
|
+
isToolSearchToolAvailable,
|
|
113
|
+
} from '../../utils/toolSearch.js'
|
|
114
|
+
import {
|
|
115
|
+
McpAuthError,
|
|
116
|
+
McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
117
|
+
} from '../mcp/client.js'
|
|
118
|
+
import { mcpInfoFromString } from '../mcp/mcpStringUtils.js'
|
|
119
|
+
import { normalizeNameForMCP } from '../mcp/normalization.js'
|
|
120
|
+
import type { MCPServerConnection } from '../mcp/types.js'
|
|
121
|
+
import {
|
|
122
|
+
getLoggingSafeMcpBaseUrl,
|
|
123
|
+
getMcpServerScopeFromToolName,
|
|
124
|
+
isMcpTool,
|
|
125
|
+
} from '../mcp/utils.js'
|
|
126
|
+
import {
|
|
127
|
+
resolveHookPermissionDecision,
|
|
128
|
+
runPostToolUseFailureHooks,
|
|
129
|
+
runPostToolUseHooks,
|
|
130
|
+
runPreToolUseHooks,
|
|
131
|
+
} from './toolHooks.js'
|
|
132
|
+
|
|
133
|
+
/** Minimum total hook duration (ms) to show inline timing summary */
|
|
134
|
+
export const HOOK_TIMING_DISPLAY_THRESHOLD_MS = 500
|
|
135
|
+
/** Log a debug warning when hooks/permission-decision block for this long. Matches
|
|
136
|
+
* BashTool's PROGRESS_THRESHOLD_MS — the collapsed view feels stuck past this. */
|
|
137
|
+
const SLOW_PHASE_LOG_THRESHOLD_MS = 2000
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Classify a tool execution error into a telemetry-safe string.
|
|
141
|
+
*
|
|
142
|
+
* In minified/external builds, `error.constructor.name` is mangled into
|
|
143
|
+
* short identifiers like "nJT" or "Chq" — useless for diagnostics.
|
|
144
|
+
* This function extracts structured, telemetry-safe information instead:
|
|
145
|
+
* - TelemetrySafeError: use its telemetryMessage (already vetted)
|
|
146
|
+
* - Node.js fs errors: log the error code (ENOENT, EACCES, etc.)
|
|
147
|
+
* - Known error types: use their unminified name
|
|
148
|
+
* - Fallback: "Error" (better than a mangled 3-char identifier)
|
|
149
|
+
*/
|
|
150
|
+
export function classifyToolError(error: unknown): string {
|
|
151
|
+
if (
|
|
152
|
+
error instanceof TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
153
|
+
) {
|
|
154
|
+
return error.telemetryMessage.slice(0, 200)
|
|
155
|
+
}
|
|
156
|
+
if (error instanceof Error) {
|
|
157
|
+
// Node.js filesystem errors have a `code` property (ENOENT, EACCES, etc.)
|
|
158
|
+
// These are safe to log and much more useful than the constructor name.
|
|
159
|
+
const errnoCode = getErrnoCode(error)
|
|
160
|
+
if (typeof errnoCode === 'string') {
|
|
161
|
+
return `Error:${errnoCode}`
|
|
162
|
+
}
|
|
163
|
+
// ShellError, ImageSizeError, etc. have stable `.name` properties
|
|
164
|
+
// that survive minification (they're set in the constructor).
|
|
165
|
+
if (error.name && error.name !== 'Error' && error.name.length > 3) {
|
|
166
|
+
return error.name.slice(0, 60)
|
|
167
|
+
}
|
|
168
|
+
return 'Error'
|
|
169
|
+
}
|
|
170
|
+
return 'UnknownError'
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Map a rule's origin to the documented OTel `source` vocabulary, matching
|
|
175
|
+
* the interactive path's semantics (permissionLogging.ts:81): session-scoped
|
|
176
|
+
* grants are temporary, on-disk grants are permanent, and user-authored
|
|
177
|
+
* denies are user_reject regardless of persistence. Everything the user
|
|
178
|
+
* didn't write (cliArg, policySettings, projectSettings, flagSettings) is
|
|
179
|
+
* config.
|
|
180
|
+
*/
|
|
181
|
+
function ruleSourceToOTelSource(
|
|
182
|
+
ruleSource: string,
|
|
183
|
+
behavior: 'allow' | 'deny',
|
|
184
|
+
): string {
|
|
185
|
+
switch (ruleSource) {
|
|
186
|
+
case 'session':
|
|
187
|
+
return behavior === 'allow' ? 'user_temporary' : 'user_reject'
|
|
188
|
+
case 'localSettings':
|
|
189
|
+
case 'userSettings':
|
|
190
|
+
return behavior === 'allow' ? 'user_permanent' : 'user_reject'
|
|
191
|
+
default:
|
|
192
|
+
return 'config'
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Map a PermissionDecisionReason to the OTel `source` label for the
|
|
198
|
+
* non-interactive tool_decision path, staying within the documented
|
|
199
|
+
* vocabulary (config, hook, user_permanent, user_temporary, user_reject).
|
|
200
|
+
*
|
|
201
|
+
* For permissionPromptTool, the SDK host may set decisionClassification on
|
|
202
|
+
* the PermissionResult to tell us exactly what happened (once vs always vs
|
|
203
|
+
* cache hit — the host knows, we can't tell from {behavior:'allow'} alone).
|
|
204
|
+
* Without it, we fall back conservatively: allow → user_temporary,
|
|
205
|
+
* deny → user_reject.
|
|
206
|
+
*/
|
|
207
|
+
function decisionReasonToOTelSource(
|
|
208
|
+
reason: PermissionDecisionReason | undefined,
|
|
209
|
+
behavior: 'allow' | 'deny',
|
|
210
|
+
): string {
|
|
211
|
+
if (!reason) {
|
|
212
|
+
return 'config'
|
|
213
|
+
}
|
|
214
|
+
switch (reason.type) {
|
|
215
|
+
case 'permissionPromptTool': {
|
|
216
|
+
// toolResult is typed `unknown` on PermissionDecisionReason but carries
|
|
217
|
+
// the parsed Output from PermissionPromptToolResultSchema. Narrow at
|
|
218
|
+
// runtime rather than widen the cross-file type.
|
|
219
|
+
const toolResult = reason.toolResult as
|
|
220
|
+
| { decisionClassification?: string }
|
|
221
|
+
| undefined
|
|
222
|
+
const classified = toolResult?.decisionClassification
|
|
223
|
+
if (
|
|
224
|
+
classified === 'user_temporary' ||
|
|
225
|
+
classified === 'user_permanent' ||
|
|
226
|
+
classified === 'user_reject'
|
|
227
|
+
) {
|
|
228
|
+
return classified
|
|
229
|
+
}
|
|
230
|
+
return behavior === 'allow' ? 'user_temporary' : 'user_reject'
|
|
231
|
+
}
|
|
232
|
+
case 'rule':
|
|
233
|
+
return ruleSourceToOTelSource(reason.rule.source, behavior)
|
|
234
|
+
case 'hook':
|
|
235
|
+
return 'hook'
|
|
236
|
+
case 'mode':
|
|
237
|
+
case 'classifier':
|
|
238
|
+
case 'subcommandResults':
|
|
239
|
+
case 'asyncAgent':
|
|
240
|
+
case 'sandboxOverride':
|
|
241
|
+
case 'workingDir':
|
|
242
|
+
case 'safetyCheck':
|
|
243
|
+
case 'other':
|
|
244
|
+
return 'config'
|
|
245
|
+
default: {
|
|
246
|
+
const _exhaustive: never = reason
|
|
247
|
+
return 'config'
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function getNextImagePasteId(messages: Message[]): number {
|
|
253
|
+
let maxId = 0
|
|
254
|
+
for (const message of messages) {
|
|
255
|
+
if (message.type === 'user' && message.imagePasteIds) {
|
|
256
|
+
for (const id of message.imagePasteIds) {
|
|
257
|
+
if (id > maxId) maxId = id
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return maxId + 1
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export type MessageUpdateLazy<M extends Message = Message> = {
|
|
265
|
+
message: M
|
|
266
|
+
contextModifier?: {
|
|
267
|
+
toolUseID: string
|
|
268
|
+
modifyContext: (context: ToolUseContext) => ToolUseContext
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export type McpServerType =
|
|
273
|
+
| 'stdio'
|
|
274
|
+
| 'sse'
|
|
275
|
+
| 'http'
|
|
276
|
+
| 'ws'
|
|
277
|
+
| 'sdk'
|
|
278
|
+
| 'sse-ide'
|
|
279
|
+
| 'ws-ide'
|
|
280
|
+
| 'claudeai-proxy'
|
|
281
|
+
| undefined
|
|
282
|
+
|
|
283
|
+
function findMcpServerConnection(
|
|
284
|
+
toolName: string,
|
|
285
|
+
mcpClients: MCPServerConnection[],
|
|
286
|
+
): MCPServerConnection | undefined {
|
|
287
|
+
if (!toolName.startsWith('mcp__')) {
|
|
288
|
+
return undefined
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const mcpInfo = mcpInfoFromString(toolName)
|
|
292
|
+
if (!mcpInfo) {
|
|
293
|
+
return undefined
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// mcpInfo.serverName is normalized (e.g., "claude_ai_Slack"), but client.name
|
|
297
|
+
// is the original name (e.g., "claude.ai Slack"). Normalize both for comparison.
|
|
298
|
+
return mcpClients.find(
|
|
299
|
+
client => normalizeNameForMCP(client.name) === mcpInfo.serverName,
|
|
300
|
+
)
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Extracts the MCP server transport type from a tool name.
|
|
305
|
+
* Returns the server type (stdio, sse, http, ws, sdk, etc.) for MCP tools,
|
|
306
|
+
* or undefined for built-in tools.
|
|
307
|
+
*/
|
|
308
|
+
function getMcpServerType(
|
|
309
|
+
toolName: string,
|
|
310
|
+
mcpClients: MCPServerConnection[],
|
|
311
|
+
): McpServerType {
|
|
312
|
+
const serverConnection = findMcpServerConnection(toolName, mcpClients)
|
|
313
|
+
|
|
314
|
+
if (serverConnection?.type === 'connected') {
|
|
315
|
+
// Handle stdio configs where type field is optional (defaults to 'stdio')
|
|
316
|
+
return serverConnection.config.type ?? 'stdio'
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return undefined
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Extracts the MCP server base URL for a tool by looking up its server connection.
|
|
324
|
+
* Returns undefined for stdio servers, built-in tools, or if the server is not connected.
|
|
325
|
+
*/
|
|
326
|
+
function getMcpServerBaseUrlFromToolName(
|
|
327
|
+
toolName: string,
|
|
328
|
+
mcpClients: MCPServerConnection[],
|
|
329
|
+
): string | undefined {
|
|
330
|
+
const serverConnection = findMcpServerConnection(toolName, mcpClients)
|
|
331
|
+
if (serverConnection?.type !== 'connected') {
|
|
332
|
+
return undefined
|
|
333
|
+
}
|
|
334
|
+
return getLoggingSafeMcpBaseUrl(serverConnection.config)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export async function* runToolUse(
|
|
338
|
+
toolUse: ToolUseBlock,
|
|
339
|
+
assistantMessage: AssistantMessage,
|
|
340
|
+
canUseTool: CanUseToolFn,
|
|
341
|
+
toolUseContext: ToolUseContext,
|
|
342
|
+
): AsyncGenerator<MessageUpdateLazy, void> {
|
|
343
|
+
const toolName = toolUse.name
|
|
344
|
+
// First try to find in the available tools (what the model sees)
|
|
345
|
+
let tool = findToolByName(toolUseContext.options.tools, toolName)
|
|
346
|
+
|
|
347
|
+
// If not found, check if it's a deprecated tool being called by alias
|
|
348
|
+
// (e.g., old transcripts calling "KillShell" which is now an alias for "TaskStop")
|
|
349
|
+
// Only fall back for tools where the name matches an alias, not the primary name
|
|
350
|
+
if (!tool) {
|
|
351
|
+
const fallbackTool = findToolByName(getAllBaseTools(), toolName)
|
|
352
|
+
// Only use fallback if the tool was found via alias (deprecated name)
|
|
353
|
+
if (fallbackTool && fallbackTool.aliases?.includes(toolName)) {
|
|
354
|
+
tool = fallbackTool
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const messageId = assistantMessage.message.id
|
|
358
|
+
const requestId = assistantMessage.requestId
|
|
359
|
+
const mcpServerType = getMcpServerType(
|
|
360
|
+
toolName,
|
|
361
|
+
toolUseContext.options.mcpClients,
|
|
362
|
+
)
|
|
363
|
+
const mcpServerBaseUrl = getMcpServerBaseUrlFromToolName(
|
|
364
|
+
toolName,
|
|
365
|
+
toolUseContext.options.mcpClients,
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
// Check if the tool exists
|
|
369
|
+
if (!tool) {
|
|
370
|
+
const sanitizedToolName = sanitizeToolNameForAnalytics(toolName)
|
|
371
|
+
logForDebugging(`Unknown tool ${toolName}: ${toolUse.id}`)
|
|
372
|
+
logEvent('tengu_tool_use_error', {
|
|
373
|
+
error:
|
|
374
|
+
`No such tool available: ${sanitizedToolName}` as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
375
|
+
toolName: sanitizedToolName,
|
|
376
|
+
toolUseID:
|
|
377
|
+
toolUse.id as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
378
|
+
isMcp: toolName.startsWith('mcp__'),
|
|
379
|
+
queryChainId: toolUseContext.queryTracking
|
|
380
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
381
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
382
|
+
...(mcpServerType && {
|
|
383
|
+
mcpServerType:
|
|
384
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
385
|
+
}),
|
|
386
|
+
...(mcpServerBaseUrl && {
|
|
387
|
+
mcpServerBaseUrl:
|
|
388
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
389
|
+
}),
|
|
390
|
+
...(requestId && {
|
|
391
|
+
requestId:
|
|
392
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
393
|
+
}),
|
|
394
|
+
...mcpToolDetailsForAnalytics(toolName, mcpServerType, mcpServerBaseUrl),
|
|
395
|
+
})
|
|
396
|
+
yield {
|
|
397
|
+
message: createUserMessage({
|
|
398
|
+
content: [
|
|
399
|
+
{
|
|
400
|
+
type: 'tool_result',
|
|
401
|
+
content: `<tool_use_error>Error: No such tool available: ${toolName}</tool_use_error>`,
|
|
402
|
+
is_error: true,
|
|
403
|
+
tool_use_id: toolUse.id,
|
|
404
|
+
},
|
|
405
|
+
],
|
|
406
|
+
toolUseResult: `Error: No such tool available: ${toolName}`,
|
|
407
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
408
|
+
}),
|
|
409
|
+
}
|
|
410
|
+
return
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
const toolInput = toolUse.input as { [key: string]: string }
|
|
414
|
+
try {
|
|
415
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
416
|
+
logEvent('tengu_tool_use_cancelled', {
|
|
417
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
418
|
+
toolUseID:
|
|
419
|
+
toolUse.id as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
420
|
+
isMcp: tool.isMcp ?? false,
|
|
421
|
+
|
|
422
|
+
queryChainId: toolUseContext.queryTracking
|
|
423
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
424
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
425
|
+
...(mcpServerType && {
|
|
426
|
+
mcpServerType:
|
|
427
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
428
|
+
}),
|
|
429
|
+
...(mcpServerBaseUrl && {
|
|
430
|
+
mcpServerBaseUrl:
|
|
431
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
432
|
+
}),
|
|
433
|
+
...(requestId && {
|
|
434
|
+
requestId:
|
|
435
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
436
|
+
}),
|
|
437
|
+
...mcpToolDetailsForAnalytics(
|
|
438
|
+
tool.name,
|
|
439
|
+
mcpServerType,
|
|
440
|
+
mcpServerBaseUrl,
|
|
441
|
+
),
|
|
442
|
+
})
|
|
443
|
+
const content = createToolResultStopMessage(toolUse.id)
|
|
444
|
+
content.content = withMemoryCorrectionHint(CANCEL_MESSAGE)
|
|
445
|
+
yield {
|
|
446
|
+
message: createUserMessage({
|
|
447
|
+
content: [content],
|
|
448
|
+
toolUseResult: CANCEL_MESSAGE,
|
|
449
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
450
|
+
}),
|
|
451
|
+
}
|
|
452
|
+
return
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
for await (const update of streamedCheckPermissionsAndCallTool(
|
|
456
|
+
tool,
|
|
457
|
+
toolUse.id,
|
|
458
|
+
toolInput,
|
|
459
|
+
toolUseContext,
|
|
460
|
+
canUseTool,
|
|
461
|
+
assistantMessage,
|
|
462
|
+
messageId,
|
|
463
|
+
requestId,
|
|
464
|
+
mcpServerType,
|
|
465
|
+
mcpServerBaseUrl,
|
|
466
|
+
)) {
|
|
467
|
+
yield update
|
|
468
|
+
}
|
|
469
|
+
} catch (error) {
|
|
470
|
+
logError(error)
|
|
471
|
+
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
472
|
+
const toolInfo = tool ? ` (${tool.name})` : ''
|
|
473
|
+
const detailedError = `Error calling tool${toolInfo}: ${errorMessage}`
|
|
474
|
+
|
|
475
|
+
yield {
|
|
476
|
+
message: createUserMessage({
|
|
477
|
+
content: [
|
|
478
|
+
{
|
|
479
|
+
type: 'tool_result',
|
|
480
|
+
content: `<tool_use_error>${detailedError}</tool_use_error>`,
|
|
481
|
+
is_error: true,
|
|
482
|
+
tool_use_id: toolUse.id,
|
|
483
|
+
},
|
|
484
|
+
],
|
|
485
|
+
toolUseResult: detailedError,
|
|
486
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
487
|
+
}),
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
function streamedCheckPermissionsAndCallTool(
|
|
493
|
+
tool: Tool,
|
|
494
|
+
toolUseID: string,
|
|
495
|
+
input: { [key: string]: boolean | string | number },
|
|
496
|
+
toolUseContext: ToolUseContext,
|
|
497
|
+
canUseTool: CanUseToolFn,
|
|
498
|
+
assistantMessage: AssistantMessage,
|
|
499
|
+
messageId: string,
|
|
500
|
+
requestId: string | undefined,
|
|
501
|
+
mcpServerType: McpServerType,
|
|
502
|
+
mcpServerBaseUrl: ReturnType<typeof getLoggingSafeMcpBaseUrl>,
|
|
503
|
+
): AsyncIterable<MessageUpdateLazy> {
|
|
504
|
+
// This is a bit of a hack to get progress events and final results
|
|
505
|
+
// into a single async iterable.
|
|
506
|
+
//
|
|
507
|
+
// Ideally the progress reporting and tool call reporting would
|
|
508
|
+
// be via separate mechanisms.
|
|
509
|
+
const stream = new Stream<MessageUpdateLazy>()
|
|
510
|
+
checkPermissionsAndCallTool(
|
|
511
|
+
tool,
|
|
512
|
+
toolUseID,
|
|
513
|
+
input,
|
|
514
|
+
toolUseContext,
|
|
515
|
+
canUseTool,
|
|
516
|
+
assistantMessage,
|
|
517
|
+
messageId,
|
|
518
|
+
requestId,
|
|
519
|
+
mcpServerType,
|
|
520
|
+
mcpServerBaseUrl,
|
|
521
|
+
progress => {
|
|
522
|
+
logEvent('tengu_tool_use_progress', {
|
|
523
|
+
messageID:
|
|
524
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
525
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
526
|
+
isMcp: tool.isMcp ?? false,
|
|
527
|
+
|
|
528
|
+
queryChainId: toolUseContext.queryTracking
|
|
529
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
530
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
531
|
+
...(mcpServerType && {
|
|
532
|
+
mcpServerType:
|
|
533
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
534
|
+
}),
|
|
535
|
+
...(mcpServerBaseUrl && {
|
|
536
|
+
mcpServerBaseUrl:
|
|
537
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
538
|
+
}),
|
|
539
|
+
...(requestId && {
|
|
540
|
+
requestId:
|
|
541
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
542
|
+
}),
|
|
543
|
+
...mcpToolDetailsForAnalytics(
|
|
544
|
+
tool.name,
|
|
545
|
+
mcpServerType,
|
|
546
|
+
mcpServerBaseUrl,
|
|
547
|
+
),
|
|
548
|
+
})
|
|
549
|
+
stream.enqueue({
|
|
550
|
+
message: createProgressMessage({
|
|
551
|
+
toolUseID: progress.toolUseID,
|
|
552
|
+
parentToolUseID: toolUseID,
|
|
553
|
+
data: progress.data,
|
|
554
|
+
}),
|
|
555
|
+
})
|
|
556
|
+
},
|
|
557
|
+
)
|
|
558
|
+
.then(results => {
|
|
559
|
+
for (const result of results) {
|
|
560
|
+
stream.enqueue(result)
|
|
561
|
+
}
|
|
562
|
+
})
|
|
563
|
+
.catch(error => {
|
|
564
|
+
stream.error(error)
|
|
565
|
+
})
|
|
566
|
+
.finally(() => {
|
|
567
|
+
stream.done()
|
|
568
|
+
})
|
|
569
|
+
return stream
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Appended to Zod errors when a deferred tool wasn't in the discovered-tool
|
|
574
|
+
* set — re-runs the claude.ts schema-filter scan dispatch-time to detect the
|
|
575
|
+
* mismatch. The raw Zod error ("expected array, got string") doesn't tell the
|
|
576
|
+
* model to re-load the tool; this hint does. Null if the schema was sent.
|
|
577
|
+
*/
|
|
578
|
+
export function buildSchemaNotSentHint(
|
|
579
|
+
tool: Tool,
|
|
580
|
+
messages: Message[],
|
|
581
|
+
tools: readonly { name: string }[],
|
|
582
|
+
): string | null {
|
|
583
|
+
// Optimistic gating — reconstructing claude.ts's full useToolSearch
|
|
584
|
+
// computation is fragile. These two gates prevent pointing at a ToolSearch
|
|
585
|
+
// that isn't callable; occasional misfires (Haiku, tst-auto below threshold)
|
|
586
|
+
// cost one extra round-trip on an already-failing path.
|
|
587
|
+
if (!isToolSearchEnabledOptimistic()) return null
|
|
588
|
+
if (!isToolSearchToolAvailable(tools)) return null
|
|
589
|
+
if (!isDeferredTool(tool)) return null
|
|
590
|
+
const discovered = extractDiscoveredToolNames(messages)
|
|
591
|
+
if (discovered.has(tool.name)) return null
|
|
592
|
+
return (
|
|
593
|
+
`\n\nThis tool's schema was not sent to the API — it was not in the discovered-tool set derived from message history. ` +
|
|
594
|
+
`Without the schema in your prompt, typed parameters (arrays, numbers, booleans) get emitted as strings and the client-side parser rejects them. ` +
|
|
595
|
+
`Load the tool first: call ${TOOL_SEARCH_TOOL_NAME} with query "select:${tool.name}", then retry this call.`
|
|
596
|
+
)
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
async function checkPermissionsAndCallTool(
|
|
600
|
+
tool: Tool,
|
|
601
|
+
toolUseID: string,
|
|
602
|
+
input: { [key: string]: boolean | string | number },
|
|
603
|
+
toolUseContext: ToolUseContext,
|
|
604
|
+
canUseTool: CanUseToolFn,
|
|
605
|
+
assistantMessage: AssistantMessage,
|
|
606
|
+
messageId: string,
|
|
607
|
+
requestId: string | undefined,
|
|
608
|
+
mcpServerType: McpServerType,
|
|
609
|
+
mcpServerBaseUrl: ReturnType<typeof getLoggingSafeMcpBaseUrl>,
|
|
610
|
+
onToolProgress: (
|
|
611
|
+
progress: ToolProgress<ToolProgressData> | ProgressMessage<HookProgress>,
|
|
612
|
+
) => void,
|
|
613
|
+
): Promise<MessageUpdateLazy[]> {
|
|
614
|
+
// Validate input types with zod (surprisingly, the model is not great at generating valid input)
|
|
615
|
+
const parsedInput = tool.inputSchema.safeParse(input)
|
|
616
|
+
if (!parsedInput.success) {
|
|
617
|
+
let errorContent = formatZodValidationError(tool.name, parsedInput.error)
|
|
618
|
+
|
|
619
|
+
const schemaHint = buildSchemaNotSentHint(
|
|
620
|
+
tool,
|
|
621
|
+
toolUseContext.messages,
|
|
622
|
+
toolUseContext.options.tools,
|
|
623
|
+
)
|
|
624
|
+
if (schemaHint) {
|
|
625
|
+
logEvent('tengu_deferred_tool_schema_not_sent', {
|
|
626
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
627
|
+
isMcp: tool.isMcp ?? false,
|
|
628
|
+
})
|
|
629
|
+
errorContent += schemaHint
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
logForDebugging(
|
|
633
|
+
`${tool.name} tool input error: ${errorContent.slice(0, 200)}`,
|
|
634
|
+
)
|
|
635
|
+
logEvent('tengu_tool_use_error', {
|
|
636
|
+
error:
|
|
637
|
+
'InputValidationError' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
638
|
+
errorDetails: errorContent.slice(
|
|
639
|
+
0,
|
|
640
|
+
2000,
|
|
641
|
+
) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
642
|
+
messageID:
|
|
643
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
644
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
645
|
+
isMcp: tool.isMcp ?? false,
|
|
646
|
+
|
|
647
|
+
queryChainId: toolUseContext.queryTracking
|
|
648
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
649
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
650
|
+
...(mcpServerType && {
|
|
651
|
+
mcpServerType:
|
|
652
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
653
|
+
}),
|
|
654
|
+
...(mcpServerBaseUrl && {
|
|
655
|
+
mcpServerBaseUrl:
|
|
656
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
657
|
+
}),
|
|
658
|
+
...(requestId && {
|
|
659
|
+
requestId:
|
|
660
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
661
|
+
}),
|
|
662
|
+
...mcpToolDetailsForAnalytics(tool.name, mcpServerType, mcpServerBaseUrl),
|
|
663
|
+
})
|
|
664
|
+
return [
|
|
665
|
+
{
|
|
666
|
+
message: createUserMessage({
|
|
667
|
+
content: [
|
|
668
|
+
{
|
|
669
|
+
type: 'tool_result',
|
|
670
|
+
content: `<tool_use_error>InputValidationError: ${errorContent}</tool_use_error>`,
|
|
671
|
+
is_error: true,
|
|
672
|
+
tool_use_id: toolUseID,
|
|
673
|
+
},
|
|
674
|
+
],
|
|
675
|
+
toolUseResult: `InputValidationError: ${parsedInput.error.message}`,
|
|
676
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
677
|
+
}),
|
|
678
|
+
},
|
|
679
|
+
]
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Validate input values. Each tool has its own validation logic
|
|
683
|
+
const isValidCall = await tool.validateInput?.(
|
|
684
|
+
parsedInput.data,
|
|
685
|
+
toolUseContext,
|
|
686
|
+
)
|
|
687
|
+
if (isValidCall?.result === false) {
|
|
688
|
+
logForDebugging(
|
|
689
|
+
`${tool.name} tool validation error: ${isValidCall.message?.slice(0, 200)}`,
|
|
690
|
+
)
|
|
691
|
+
logEvent('tengu_tool_use_error', {
|
|
692
|
+
messageID:
|
|
693
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
694
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
695
|
+
error:
|
|
696
|
+
isValidCall.message as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
697
|
+
errorCode: isValidCall.errorCode,
|
|
698
|
+
isMcp: tool.isMcp ?? false,
|
|
699
|
+
|
|
700
|
+
queryChainId: toolUseContext.queryTracking
|
|
701
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
702
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
703
|
+
...(mcpServerType && {
|
|
704
|
+
mcpServerType:
|
|
705
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
706
|
+
}),
|
|
707
|
+
...(mcpServerBaseUrl && {
|
|
708
|
+
mcpServerBaseUrl:
|
|
709
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
710
|
+
}),
|
|
711
|
+
...(requestId && {
|
|
712
|
+
requestId:
|
|
713
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
714
|
+
}),
|
|
715
|
+
...mcpToolDetailsForAnalytics(tool.name, mcpServerType, mcpServerBaseUrl),
|
|
716
|
+
})
|
|
717
|
+
return [
|
|
718
|
+
{
|
|
719
|
+
message: createUserMessage({
|
|
720
|
+
content: [
|
|
721
|
+
{
|
|
722
|
+
type: 'tool_result',
|
|
723
|
+
content: `<tool_use_error>${isValidCall.message}</tool_use_error>`,
|
|
724
|
+
is_error: true,
|
|
725
|
+
tool_use_id: toolUseID,
|
|
726
|
+
},
|
|
727
|
+
],
|
|
728
|
+
toolUseResult: `Error: ${isValidCall.message}`,
|
|
729
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
730
|
+
}),
|
|
731
|
+
},
|
|
732
|
+
]
|
|
733
|
+
}
|
|
734
|
+
// Speculatively start the bash allow classifier check early so it runs in
|
|
735
|
+
// parallel with pre-tool hooks, deny/ask classifiers, and permission dialog
|
|
736
|
+
// setup. The UI indicator (setClassifierChecking) is NOT set here — it's
|
|
737
|
+
// set in interactiveHandler.ts only when the permission check returns `ask`
|
|
738
|
+
// with a pendingClassifierCheck. This avoids flashing "classifier running"
|
|
739
|
+
// for commands that auto-allow via prefix rules.
|
|
740
|
+
if (
|
|
741
|
+
tool.name === BASH_TOOL_NAME &&
|
|
742
|
+
parsedInput.data &&
|
|
743
|
+
'command' in parsedInput.data
|
|
744
|
+
) {
|
|
745
|
+
const appState = toolUseContext.getAppState()
|
|
746
|
+
startSpeculativeClassifierCheck(
|
|
747
|
+
(parsedInput.data as BashToolInput).command,
|
|
748
|
+
appState.toolPermissionContext,
|
|
749
|
+
toolUseContext.abortController.signal,
|
|
750
|
+
toolUseContext.options.isNonInteractiveSession,
|
|
751
|
+
)
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
const resultingMessages = []
|
|
755
|
+
|
|
756
|
+
// Defense-in-depth: strip _simulatedSedEdit from model-provided Bash input.
|
|
757
|
+
// This field is internal-only — it must only be injected by the permission
|
|
758
|
+
// system (SedEditPermissionRequest) after user approval. If the model supplies
|
|
759
|
+
// it, the schema's strictObject should already reject it, but we strip here
|
|
760
|
+
// as a safeguard against future regressions.
|
|
761
|
+
let processedInput = parsedInput.data
|
|
762
|
+
if (
|
|
763
|
+
tool.name === BASH_TOOL_NAME &&
|
|
764
|
+
processedInput &&
|
|
765
|
+
typeof processedInput === 'object' &&
|
|
766
|
+
'_simulatedSedEdit' in processedInput
|
|
767
|
+
) {
|
|
768
|
+
const { _simulatedSedEdit: _, ...rest } =
|
|
769
|
+
processedInput as typeof processedInput & {
|
|
770
|
+
_simulatedSedEdit: unknown
|
|
771
|
+
}
|
|
772
|
+
processedInput = rest as typeof processedInput
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// Backfill legacy/derived fields on a shallow clone so hooks/canUseTool see
|
|
776
|
+
// them without affecting tool.call(). SendMessageTool adds fields; file
|
|
777
|
+
// tools overwrite file_path with expandPath — that mutation must not reach
|
|
778
|
+
// call() because tool results embed the input path verbatim (e.g. "File
|
|
779
|
+
// created successfully at: {path}"), and changing it alters the serialized
|
|
780
|
+
// transcript and VCR fixture hashes. If a hook/permission later returns a
|
|
781
|
+
// fresh updatedInput, callInput converges on it below — that replacement
|
|
782
|
+
// is intentional and should reach call().
|
|
783
|
+
let callInput = processedInput
|
|
784
|
+
const backfilledClone =
|
|
785
|
+
tool.backfillObservableInput &&
|
|
786
|
+
typeof processedInput === 'object' &&
|
|
787
|
+
processedInput !== null
|
|
788
|
+
? ({ ...processedInput } as typeof processedInput)
|
|
789
|
+
: null
|
|
790
|
+
if (backfilledClone) {
|
|
791
|
+
tool.backfillObservableInput!(backfilledClone as Record<string, unknown>)
|
|
792
|
+
processedInput = backfilledClone
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
let shouldPreventContinuation = false
|
|
796
|
+
let stopReason: string | undefined
|
|
797
|
+
let hookPermissionResult: PermissionResult | undefined
|
|
798
|
+
const preToolHookInfos: StopHookInfo[] = []
|
|
799
|
+
const preToolHookStart = Date.now()
|
|
800
|
+
for await (const result of runPreToolUseHooks(
|
|
801
|
+
toolUseContext,
|
|
802
|
+
tool,
|
|
803
|
+
processedInput,
|
|
804
|
+
toolUseID,
|
|
805
|
+
assistantMessage.message.id,
|
|
806
|
+
requestId,
|
|
807
|
+
mcpServerType,
|
|
808
|
+
mcpServerBaseUrl,
|
|
809
|
+
)) {
|
|
810
|
+
switch (result.type) {
|
|
811
|
+
case 'message':
|
|
812
|
+
if (result.message.message.type === 'progress') {
|
|
813
|
+
onToolProgress(result.message.message)
|
|
814
|
+
} else {
|
|
815
|
+
resultingMessages.push(result.message)
|
|
816
|
+
const att = result.message.message.attachment
|
|
817
|
+
if (
|
|
818
|
+
att &&
|
|
819
|
+
'command' in att &&
|
|
820
|
+
att.command !== undefined &&
|
|
821
|
+
'durationMs' in att &&
|
|
822
|
+
att.durationMs !== undefined
|
|
823
|
+
) {
|
|
824
|
+
preToolHookInfos.push({
|
|
825
|
+
command: att.command,
|
|
826
|
+
durationMs: att.durationMs,
|
|
827
|
+
})
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
break
|
|
831
|
+
case 'hookPermissionResult':
|
|
832
|
+
hookPermissionResult = result.hookPermissionResult
|
|
833
|
+
break
|
|
834
|
+
case 'hookUpdatedInput':
|
|
835
|
+
// Hook provided updatedInput without making a permission decision (passthrough)
|
|
836
|
+
// Update processedInput so it's used in the normal permission flow
|
|
837
|
+
processedInput = result.updatedInput
|
|
838
|
+
break
|
|
839
|
+
case 'preventContinuation':
|
|
840
|
+
shouldPreventContinuation = result.shouldPreventContinuation
|
|
841
|
+
break
|
|
842
|
+
case 'stopReason':
|
|
843
|
+
stopReason = result.stopReason
|
|
844
|
+
break
|
|
845
|
+
case 'additionalContext':
|
|
846
|
+
resultingMessages.push(result.message)
|
|
847
|
+
break
|
|
848
|
+
case 'stop':
|
|
849
|
+
getStatsStore()?.observe(
|
|
850
|
+
'pre_tool_hook_duration_ms',
|
|
851
|
+
Date.now() - preToolHookStart,
|
|
852
|
+
)
|
|
853
|
+
resultingMessages.push({
|
|
854
|
+
message: createUserMessage({
|
|
855
|
+
content: [createToolResultStopMessage(toolUseID)],
|
|
856
|
+
toolUseResult: `Error: ${stopReason}`,
|
|
857
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
858
|
+
}),
|
|
859
|
+
})
|
|
860
|
+
return resultingMessages
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
const preToolHookDurationMs = Date.now() - preToolHookStart
|
|
864
|
+
getStatsStore()?.observe('pre_tool_hook_duration_ms', preToolHookDurationMs)
|
|
865
|
+
if (preToolHookDurationMs >= SLOW_PHASE_LOG_THRESHOLD_MS) {
|
|
866
|
+
logForDebugging(
|
|
867
|
+
`Slow PreToolUse hooks: ${preToolHookDurationMs}ms for ${tool.name} (${preToolHookInfos.length} hooks)`,
|
|
868
|
+
{ level: 'info' },
|
|
869
|
+
)
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Emit PreToolUse summary immediately so it's visible while the tool executes.
|
|
873
|
+
// Use wall-clock time (not sum of individual durations) since hooks run in parallel.
|
|
874
|
+
if (process.env.USER_TYPE === 'ant' && preToolHookInfos.length > 0) {
|
|
875
|
+
if (preToolHookDurationMs > HOOK_TIMING_DISPLAY_THRESHOLD_MS) {
|
|
876
|
+
resultingMessages.push({
|
|
877
|
+
message: createStopHookSummaryMessage(
|
|
878
|
+
preToolHookInfos.length,
|
|
879
|
+
preToolHookInfos,
|
|
880
|
+
[],
|
|
881
|
+
false,
|
|
882
|
+
undefined,
|
|
883
|
+
false,
|
|
884
|
+
'suggestion',
|
|
885
|
+
undefined,
|
|
886
|
+
'PreToolUse',
|
|
887
|
+
preToolHookDurationMs,
|
|
888
|
+
),
|
|
889
|
+
})
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
const toolAttributes: Record<string, string | number | boolean> = {}
|
|
894
|
+
if (processedInput && typeof processedInput === 'object') {
|
|
895
|
+
if (tool.name === FILE_READ_TOOL_NAME && 'file_path' in processedInput) {
|
|
896
|
+
toolAttributes.file_path = String(processedInput.file_path)
|
|
897
|
+
} else if (
|
|
898
|
+
(tool.name === FILE_EDIT_TOOL_NAME ||
|
|
899
|
+
tool.name === FILE_WRITE_TOOL_NAME) &&
|
|
900
|
+
'file_path' in processedInput
|
|
901
|
+
) {
|
|
902
|
+
toolAttributes.file_path = String(processedInput.file_path)
|
|
903
|
+
} else if (tool.name === BASH_TOOL_NAME && 'command' in processedInput) {
|
|
904
|
+
const bashInput = processedInput as BashToolInput
|
|
905
|
+
toolAttributes.full_command = bashInput.command
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
startToolSpan(
|
|
910
|
+
tool.name,
|
|
911
|
+
toolAttributes,
|
|
912
|
+
isBetaTracingEnabled() ? jsonStringify(processedInput) : undefined,
|
|
913
|
+
)
|
|
914
|
+
startToolBlockedOnUserSpan()
|
|
915
|
+
|
|
916
|
+
// Check whether we have permission to use the tool,
|
|
917
|
+
// and ask the user for permission if we don't
|
|
918
|
+
const permissionMode = toolUseContext.getAppState().toolPermissionContext.mode
|
|
919
|
+
const permissionStart = Date.now()
|
|
920
|
+
|
|
921
|
+
const resolved = await resolveHookPermissionDecision(
|
|
922
|
+
hookPermissionResult,
|
|
923
|
+
tool,
|
|
924
|
+
processedInput,
|
|
925
|
+
toolUseContext,
|
|
926
|
+
canUseTool,
|
|
927
|
+
assistantMessage,
|
|
928
|
+
toolUseID,
|
|
929
|
+
)
|
|
930
|
+
const permissionDecision = resolved.decision
|
|
931
|
+
processedInput = resolved.input
|
|
932
|
+
const permissionDurationMs = Date.now() - permissionStart
|
|
933
|
+
// In auto mode, canUseTool awaits the classifier (side_query) — if that's
|
|
934
|
+
// slow the collapsed view shows "Running…" with no (Ns) tick since
|
|
935
|
+
// bash_progress hasn't started yet. Auto-only: in default mode this timer
|
|
936
|
+
// includes interactive-dialog wait (user think time), which is just noise.
|
|
937
|
+
if (
|
|
938
|
+
permissionDurationMs >= SLOW_PHASE_LOG_THRESHOLD_MS &&
|
|
939
|
+
permissionMode === 'auto'
|
|
940
|
+
) {
|
|
941
|
+
logForDebugging(
|
|
942
|
+
`Slow permission decision: ${permissionDurationMs}ms for ${tool.name} ` +
|
|
943
|
+
`(mode=${permissionMode}, behavior=${permissionDecision.behavior})`,
|
|
944
|
+
{ level: 'info' },
|
|
945
|
+
)
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
// Emit tool_decision OTel event and code-edit counter if the interactive
|
|
949
|
+
// permission path didn't already log it (headless mode bypasses permission
|
|
950
|
+
// logging, so we need to emit both the generic event and the code-edit
|
|
951
|
+
// counter here)
|
|
952
|
+
if (
|
|
953
|
+
permissionDecision.behavior !== 'ask' &&
|
|
954
|
+
!toolUseContext.toolDecisions?.has(toolUseID)
|
|
955
|
+
) {
|
|
956
|
+
const decision =
|
|
957
|
+
permissionDecision.behavior === 'allow' ? 'accept' : 'reject'
|
|
958
|
+
const source = decisionReasonToOTelSource(
|
|
959
|
+
permissionDecision.decisionReason,
|
|
960
|
+
permissionDecision.behavior,
|
|
961
|
+
)
|
|
962
|
+
void logOTelEvent('tool_decision', {
|
|
963
|
+
decision,
|
|
964
|
+
source,
|
|
965
|
+
tool_name: sanitizeToolNameForAnalytics(tool.name),
|
|
966
|
+
})
|
|
967
|
+
|
|
968
|
+
// Increment code-edit tool decision counter for headless mode
|
|
969
|
+
if (isCodeEditingTool(tool.name)) {
|
|
970
|
+
void buildCodeEditToolAttributes(
|
|
971
|
+
tool,
|
|
972
|
+
processedInput,
|
|
973
|
+
decision,
|
|
974
|
+
source,
|
|
975
|
+
).then(attributes => getCodeEditToolDecisionCounter()?.add(1, attributes))
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
// Add message if permission was granted/denied by PermissionRequest hook
|
|
980
|
+
if (
|
|
981
|
+
permissionDecision.decisionReason?.type === 'hook' &&
|
|
982
|
+
permissionDecision.decisionReason.hookName === 'PermissionRequest' &&
|
|
983
|
+
permissionDecision.behavior !== 'ask'
|
|
984
|
+
) {
|
|
985
|
+
resultingMessages.push({
|
|
986
|
+
message: createAttachmentMessage({
|
|
987
|
+
type: 'hook_permission_decision',
|
|
988
|
+
decision: permissionDecision.behavior,
|
|
989
|
+
toolUseID,
|
|
990
|
+
hookEvent: 'PermissionRequest',
|
|
991
|
+
}),
|
|
992
|
+
})
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
if (permissionDecision.behavior !== 'allow') {
|
|
996
|
+
logForDebugging(`${tool.name} tool permission denied`)
|
|
997
|
+
const decisionInfo = toolUseContext.toolDecisions?.get(toolUseID)
|
|
998
|
+
endToolBlockedOnUserSpan('reject', decisionInfo?.source || 'unknown')
|
|
999
|
+
endToolSpan()
|
|
1000
|
+
|
|
1001
|
+
logEvent('tengu_tool_use_can_use_tool_rejected', {
|
|
1002
|
+
messageID:
|
|
1003
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1004
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
1005
|
+
|
|
1006
|
+
queryChainId: toolUseContext.queryTracking
|
|
1007
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1008
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
1009
|
+
...(mcpServerType && {
|
|
1010
|
+
mcpServerType:
|
|
1011
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1012
|
+
}),
|
|
1013
|
+
...(mcpServerBaseUrl && {
|
|
1014
|
+
mcpServerBaseUrl:
|
|
1015
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1016
|
+
}),
|
|
1017
|
+
...(requestId && {
|
|
1018
|
+
requestId:
|
|
1019
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1020
|
+
}),
|
|
1021
|
+
...mcpToolDetailsForAnalytics(tool.name, mcpServerType, mcpServerBaseUrl),
|
|
1022
|
+
})
|
|
1023
|
+
let errorMessage = permissionDecision.message
|
|
1024
|
+
// Only use generic "Execution stopped" message if we don't have a detailed hook message
|
|
1025
|
+
if (shouldPreventContinuation && !errorMessage) {
|
|
1026
|
+
errorMessage = `Execution stopped by PreToolUse hook${stopReason ? `: ${stopReason}` : ''}`
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
// Build top-level content: tool_result (text-only for is_error compatibility) + images alongside
|
|
1030
|
+
const messageContent: ContentBlockParam[] = [
|
|
1031
|
+
{
|
|
1032
|
+
type: 'tool_result',
|
|
1033
|
+
content: errorMessage,
|
|
1034
|
+
is_error: true,
|
|
1035
|
+
tool_use_id: toolUseID,
|
|
1036
|
+
},
|
|
1037
|
+
]
|
|
1038
|
+
|
|
1039
|
+
// Add image blocks at top level (not inside tool_result, which rejects non-text with is_error)
|
|
1040
|
+
const rejectContentBlocks =
|
|
1041
|
+
permissionDecision.behavior === 'ask'
|
|
1042
|
+
? permissionDecision.contentBlocks
|
|
1043
|
+
: undefined
|
|
1044
|
+
if (rejectContentBlocks?.length) {
|
|
1045
|
+
messageContent.push(...rejectContentBlocks)
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
// Generate sequential imagePasteIds so each image renders with a distinct label
|
|
1049
|
+
let rejectImageIds: number[] | undefined
|
|
1050
|
+
if (rejectContentBlocks?.length) {
|
|
1051
|
+
const imageCount = count(
|
|
1052
|
+
rejectContentBlocks,
|
|
1053
|
+
(b: ContentBlockParam) => b.type === 'image',
|
|
1054
|
+
)
|
|
1055
|
+
if (imageCount > 0) {
|
|
1056
|
+
const startId = getNextImagePasteId(toolUseContext.messages)
|
|
1057
|
+
rejectImageIds = Array.from(
|
|
1058
|
+
{ length: imageCount },
|
|
1059
|
+
(_, i) => startId + i,
|
|
1060
|
+
)
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
resultingMessages.push({
|
|
1065
|
+
message: createUserMessage({
|
|
1066
|
+
content: messageContent,
|
|
1067
|
+
imagePasteIds: rejectImageIds,
|
|
1068
|
+
toolUseResult: `Error: ${errorMessage}`,
|
|
1069
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
1070
|
+
}),
|
|
1071
|
+
})
|
|
1072
|
+
|
|
1073
|
+
// Run PermissionDenied hooks for auto mode classifier denials.
|
|
1074
|
+
// If a hook returns {retry: true}, tell the model it may retry.
|
|
1075
|
+
if (
|
|
1076
|
+
feature('TRANSCRIPT_CLASSIFIER') &&
|
|
1077
|
+
permissionDecision.decisionReason?.type === 'classifier' &&
|
|
1078
|
+
permissionDecision.decisionReason.classifier === 'auto-mode'
|
|
1079
|
+
) {
|
|
1080
|
+
let hookSaysRetry = false
|
|
1081
|
+
for await (const result of executePermissionDeniedHooks(
|
|
1082
|
+
tool.name,
|
|
1083
|
+
toolUseID,
|
|
1084
|
+
processedInput,
|
|
1085
|
+
permissionDecision.decisionReason.reason ?? 'Permission denied',
|
|
1086
|
+
toolUseContext,
|
|
1087
|
+
permissionMode,
|
|
1088
|
+
toolUseContext.abortController.signal,
|
|
1089
|
+
)) {
|
|
1090
|
+
if (result.retry) hookSaysRetry = true
|
|
1091
|
+
}
|
|
1092
|
+
if (hookSaysRetry) {
|
|
1093
|
+
resultingMessages.push({
|
|
1094
|
+
message: createUserMessage({
|
|
1095
|
+
content:
|
|
1096
|
+
'The PermissionDenied hook indicated this command is now approved. You may retry it if you would like.',
|
|
1097
|
+
isMeta: true,
|
|
1098
|
+
}),
|
|
1099
|
+
})
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
return resultingMessages
|
|
1104
|
+
}
|
|
1105
|
+
logEvent('tengu_tool_use_can_use_tool_allowed', {
|
|
1106
|
+
messageID:
|
|
1107
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1108
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
1109
|
+
|
|
1110
|
+
queryChainId: toolUseContext.queryTracking
|
|
1111
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1112
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
1113
|
+
...(mcpServerType && {
|
|
1114
|
+
mcpServerType:
|
|
1115
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1116
|
+
}),
|
|
1117
|
+
...(mcpServerBaseUrl && {
|
|
1118
|
+
mcpServerBaseUrl:
|
|
1119
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1120
|
+
}),
|
|
1121
|
+
...(requestId && {
|
|
1122
|
+
requestId:
|
|
1123
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1124
|
+
}),
|
|
1125
|
+
...mcpToolDetailsForAnalytics(tool.name, mcpServerType, mcpServerBaseUrl),
|
|
1126
|
+
})
|
|
1127
|
+
|
|
1128
|
+
// Use the updated input from permissions if provided
|
|
1129
|
+
// (Don't overwrite if undefined - processedInput may have been modified by passthrough hooks)
|
|
1130
|
+
if (permissionDecision.updatedInput !== undefined) {
|
|
1131
|
+
processedInput = permissionDecision.updatedInput
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
// Prepare tool parameters for logging in tool_result event.
|
|
1135
|
+
// Gated by OTEL_LOG_TOOL_DETAILS — tool parameters can contain sensitive
|
|
1136
|
+
// content (bash commands, MCP server names, etc.) so they're opt-in only.
|
|
1137
|
+
const telemetryToolInput = extractToolInputForTelemetry(processedInput)
|
|
1138
|
+
let toolParameters: Record<string, unknown> = {}
|
|
1139
|
+
if (isToolDetailsLoggingEnabled()) {
|
|
1140
|
+
if (tool.name === BASH_TOOL_NAME && 'command' in processedInput) {
|
|
1141
|
+
const bashInput = processedInput as BashToolInput
|
|
1142
|
+
const commandParts = bashInput.command.trim().split(/\s+/)
|
|
1143
|
+
const bashCommand = commandParts[0] || ''
|
|
1144
|
+
|
|
1145
|
+
toolParameters = {
|
|
1146
|
+
bash_command: bashCommand,
|
|
1147
|
+
full_command: bashInput.command,
|
|
1148
|
+
...(bashInput.timeout !== undefined && {
|
|
1149
|
+
timeout: bashInput.timeout,
|
|
1150
|
+
}),
|
|
1151
|
+
...(bashInput.description !== undefined && {
|
|
1152
|
+
description: bashInput.description,
|
|
1153
|
+
}),
|
|
1154
|
+
...('dangerouslyDisableSandbox' in bashInput && {
|
|
1155
|
+
dangerouslyDisableSandbox: bashInput.dangerouslyDisableSandbox,
|
|
1156
|
+
}),
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
const mcpDetails = extractMcpToolDetails(tool.name)
|
|
1161
|
+
if (mcpDetails) {
|
|
1162
|
+
toolParameters.mcp_server_name = mcpDetails.serverName
|
|
1163
|
+
toolParameters.mcp_tool_name = mcpDetails.mcpToolName
|
|
1164
|
+
}
|
|
1165
|
+
const skillName = extractSkillName(tool.name, processedInput)
|
|
1166
|
+
if (skillName) {
|
|
1167
|
+
toolParameters.skill_name = skillName
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
const decisionInfo = toolUseContext.toolDecisions?.get(toolUseID)
|
|
1172
|
+
endToolBlockedOnUserSpan(
|
|
1173
|
+
decisionInfo?.decision || 'unknown',
|
|
1174
|
+
decisionInfo?.source || 'unknown',
|
|
1175
|
+
)
|
|
1176
|
+
startToolExecutionSpan()
|
|
1177
|
+
|
|
1178
|
+
const startTime = Date.now()
|
|
1179
|
+
|
|
1180
|
+
startSessionActivity('tool_exec')
|
|
1181
|
+
// If processedInput still points at the backfill clone, no hook/permission
|
|
1182
|
+
// replaced it — pass the pre-backfill callInput so call() sees the model's
|
|
1183
|
+
// original field values. Otherwise converge on the hook-supplied input.
|
|
1184
|
+
// Permission/hook flows may return a fresh object derived from the
|
|
1185
|
+
// backfilled clone (e.g. via inputSchema.parse). If its file_path matches
|
|
1186
|
+
// the backfill-expanded value, restore the model's original so the tool
|
|
1187
|
+
// result string embeds the path the model emitted — keeps transcript/VCR
|
|
1188
|
+
// hashes stable. Other hook modifications flow through unchanged.
|
|
1189
|
+
if (
|
|
1190
|
+
backfilledClone &&
|
|
1191
|
+
processedInput !== callInput &&
|
|
1192
|
+
typeof processedInput === 'object' &&
|
|
1193
|
+
processedInput !== null &&
|
|
1194
|
+
'file_path' in processedInput &&
|
|
1195
|
+
'file_path' in (callInput as Record<string, unknown>) &&
|
|
1196
|
+
(processedInput as Record<string, unknown>).file_path ===
|
|
1197
|
+
(backfilledClone as Record<string, unknown>).file_path
|
|
1198
|
+
) {
|
|
1199
|
+
callInput = {
|
|
1200
|
+
...processedInput,
|
|
1201
|
+
file_path: (callInput as Record<string, unknown>).file_path,
|
|
1202
|
+
} as typeof processedInput
|
|
1203
|
+
} else if (processedInput !== backfilledClone) {
|
|
1204
|
+
callInput = processedInput
|
|
1205
|
+
}
|
|
1206
|
+
try {
|
|
1207
|
+
const result = await tool.call(
|
|
1208
|
+
callInput,
|
|
1209
|
+
{
|
|
1210
|
+
...toolUseContext,
|
|
1211
|
+
toolUseId: toolUseID,
|
|
1212
|
+
userModified: permissionDecision.userModified ?? false,
|
|
1213
|
+
},
|
|
1214
|
+
canUseTool,
|
|
1215
|
+
assistantMessage,
|
|
1216
|
+
progress => {
|
|
1217
|
+
onToolProgress({
|
|
1218
|
+
toolUseID: progress.toolUseID,
|
|
1219
|
+
data: progress.data,
|
|
1220
|
+
})
|
|
1221
|
+
},
|
|
1222
|
+
)
|
|
1223
|
+
const durationMs = Date.now() - startTime
|
|
1224
|
+
addToToolDuration(durationMs)
|
|
1225
|
+
|
|
1226
|
+
// Log tool content/output as span event if enabled
|
|
1227
|
+
if (result.data && typeof result.data === 'object') {
|
|
1228
|
+
const contentAttributes: Record<string, string | number | boolean> = {}
|
|
1229
|
+
|
|
1230
|
+
// Read tool: capture file_path and content
|
|
1231
|
+
if (tool.name === FILE_READ_TOOL_NAME && 'content' in result.data) {
|
|
1232
|
+
if ('file_path' in processedInput) {
|
|
1233
|
+
contentAttributes.file_path = String(processedInput.file_path)
|
|
1234
|
+
}
|
|
1235
|
+
contentAttributes.content = String(result.data.content)
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
// Edit/Write tools: capture file_path and diff
|
|
1239
|
+
if (
|
|
1240
|
+
(tool.name === FILE_EDIT_TOOL_NAME ||
|
|
1241
|
+
tool.name === FILE_WRITE_TOOL_NAME) &&
|
|
1242
|
+
'file_path' in processedInput
|
|
1243
|
+
) {
|
|
1244
|
+
contentAttributes.file_path = String(processedInput.file_path)
|
|
1245
|
+
|
|
1246
|
+
// For Edit, capture the actual changes made
|
|
1247
|
+
if (tool.name === FILE_EDIT_TOOL_NAME && 'diff' in result.data) {
|
|
1248
|
+
contentAttributes.diff = String(result.data.diff)
|
|
1249
|
+
}
|
|
1250
|
+
// For Write, capture the written content
|
|
1251
|
+
if (tool.name === FILE_WRITE_TOOL_NAME && 'content' in processedInput) {
|
|
1252
|
+
contentAttributes.content = String(processedInput.content)
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
// Bash tool: capture command
|
|
1257
|
+
if (tool.name === BASH_TOOL_NAME && 'command' in processedInput) {
|
|
1258
|
+
const bashInput = processedInput as BashToolInput
|
|
1259
|
+
contentAttributes.bash_command = bashInput.command
|
|
1260
|
+
// Also capture output if available
|
|
1261
|
+
if ('output' in result.data) {
|
|
1262
|
+
contentAttributes.output = String(result.data.output)
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
if (Object.keys(contentAttributes).length > 0) {
|
|
1267
|
+
addToolContentEvent('tool.output', contentAttributes)
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
// Capture structured output from tool result if present
|
|
1272
|
+
if (typeof result === 'object' && 'structured_output' in result) {
|
|
1273
|
+
// Store the structured output in an attachment message
|
|
1274
|
+
resultingMessages.push({
|
|
1275
|
+
message: createAttachmentMessage({
|
|
1276
|
+
type: 'structured_output',
|
|
1277
|
+
data: result.structured_output,
|
|
1278
|
+
}),
|
|
1279
|
+
})
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
endToolExecutionSpan({ success: true })
|
|
1283
|
+
// Pass tool result for new_context logging
|
|
1284
|
+
const toolResultStr =
|
|
1285
|
+
result.data && typeof result.data === 'object'
|
|
1286
|
+
? jsonStringify(result.data)
|
|
1287
|
+
: String(result.data ?? '')
|
|
1288
|
+
endToolSpan(toolResultStr)
|
|
1289
|
+
|
|
1290
|
+
// Map the tool result to API format once and cache it. This block is reused
|
|
1291
|
+
// by addToolResult (skipping the remap) and measured here for analytics.
|
|
1292
|
+
const mappedToolResultBlock = tool.mapToolResultToToolResultBlockParam(
|
|
1293
|
+
result.data,
|
|
1294
|
+
toolUseID,
|
|
1295
|
+
)
|
|
1296
|
+
const mappedContent = mappedToolResultBlock.content
|
|
1297
|
+
const toolResultSizeBytes = !mappedContent
|
|
1298
|
+
? 0
|
|
1299
|
+
: typeof mappedContent === 'string'
|
|
1300
|
+
? mappedContent.length
|
|
1301
|
+
: jsonStringify(mappedContent).length
|
|
1302
|
+
|
|
1303
|
+
// Extract file extension for file-related tools
|
|
1304
|
+
let fileExtension: ReturnType<typeof getFileExtensionForAnalytics>
|
|
1305
|
+
if (processedInput && typeof processedInput === 'object') {
|
|
1306
|
+
if (
|
|
1307
|
+
(tool.name === FILE_READ_TOOL_NAME ||
|
|
1308
|
+
tool.name === FILE_EDIT_TOOL_NAME ||
|
|
1309
|
+
tool.name === FILE_WRITE_TOOL_NAME) &&
|
|
1310
|
+
'file_path' in processedInput
|
|
1311
|
+
) {
|
|
1312
|
+
fileExtension = getFileExtensionForAnalytics(
|
|
1313
|
+
String(processedInput.file_path),
|
|
1314
|
+
)
|
|
1315
|
+
} else if (
|
|
1316
|
+
tool.name === NOTEBOOK_EDIT_TOOL_NAME &&
|
|
1317
|
+
'notebook_path' in processedInput
|
|
1318
|
+
) {
|
|
1319
|
+
fileExtension = getFileExtensionForAnalytics(
|
|
1320
|
+
String(processedInput.notebook_path),
|
|
1321
|
+
)
|
|
1322
|
+
} else if (tool.name === BASH_TOOL_NAME && 'command' in processedInput) {
|
|
1323
|
+
const bashInput = processedInput as BashToolInput
|
|
1324
|
+
fileExtension = getFileExtensionsFromBashCommand(
|
|
1325
|
+
bashInput.command,
|
|
1326
|
+
bashInput._simulatedSedEdit?.filePath,
|
|
1327
|
+
)
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
logEvent('tengu_tool_use_success', {
|
|
1332
|
+
messageID:
|
|
1333
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1334
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
1335
|
+
isMcp: tool.isMcp ?? false,
|
|
1336
|
+
durationMs,
|
|
1337
|
+
preToolHookDurationMs,
|
|
1338
|
+
toolResultSizeBytes,
|
|
1339
|
+
...(fileExtension !== undefined && { fileExtension }),
|
|
1340
|
+
|
|
1341
|
+
queryChainId: toolUseContext.queryTracking
|
|
1342
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1343
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
1344
|
+
...(mcpServerType && {
|
|
1345
|
+
mcpServerType:
|
|
1346
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1347
|
+
}),
|
|
1348
|
+
...(mcpServerBaseUrl && {
|
|
1349
|
+
mcpServerBaseUrl:
|
|
1350
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1351
|
+
}),
|
|
1352
|
+
...(requestId && {
|
|
1353
|
+
requestId:
|
|
1354
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1355
|
+
}),
|
|
1356
|
+
...mcpToolDetailsForAnalytics(tool.name, mcpServerType, mcpServerBaseUrl),
|
|
1357
|
+
})
|
|
1358
|
+
|
|
1359
|
+
// Enrich tool parameters with git commit ID from successful git commit output
|
|
1360
|
+
if (
|
|
1361
|
+
isToolDetailsLoggingEnabled() &&
|
|
1362
|
+
(tool.name === BASH_TOOL_NAME || tool.name === POWERSHELL_TOOL_NAME) &&
|
|
1363
|
+
'command' in processedInput &&
|
|
1364
|
+
typeof processedInput.command === 'string' &&
|
|
1365
|
+
processedInput.command.match(/\bgit\s+commit\b/) &&
|
|
1366
|
+
result.data &&
|
|
1367
|
+
typeof result.data === 'object' &&
|
|
1368
|
+
'stdout' in result.data
|
|
1369
|
+
) {
|
|
1370
|
+
const gitCommitId = parseGitCommitId(String(result.data.stdout))
|
|
1371
|
+
if (gitCommitId) {
|
|
1372
|
+
toolParameters.git_commit_id = gitCommitId
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
// Log tool result event for OTLP with tool parameters and decision context
|
|
1377
|
+
const mcpServerScope = isMcpTool(tool)
|
|
1378
|
+
? getMcpServerScopeFromToolName(tool.name)
|
|
1379
|
+
: null
|
|
1380
|
+
|
|
1381
|
+
void logOTelEvent('tool_result', {
|
|
1382
|
+
tool_name: sanitizeToolNameForAnalytics(tool.name),
|
|
1383
|
+
success: 'true',
|
|
1384
|
+
duration_ms: String(durationMs),
|
|
1385
|
+
...(Object.keys(toolParameters).length > 0 && {
|
|
1386
|
+
tool_parameters: jsonStringify(toolParameters),
|
|
1387
|
+
}),
|
|
1388
|
+
...(telemetryToolInput && { tool_input: telemetryToolInput }),
|
|
1389
|
+
tool_result_size_bytes: String(toolResultSizeBytes),
|
|
1390
|
+
...(decisionInfo && {
|
|
1391
|
+
decision_source: decisionInfo.source,
|
|
1392
|
+
decision_type: decisionInfo.decision,
|
|
1393
|
+
}),
|
|
1394
|
+
...(mcpServerScope && { mcp_server_scope: mcpServerScope }),
|
|
1395
|
+
})
|
|
1396
|
+
|
|
1397
|
+
// Run PostToolUse hooks
|
|
1398
|
+
let toolOutput = result.data
|
|
1399
|
+
const hookResults = []
|
|
1400
|
+
const toolContextModifier = result.contextModifier
|
|
1401
|
+
const mcpMeta = result.mcpMeta
|
|
1402
|
+
|
|
1403
|
+
async function addToolResult(
|
|
1404
|
+
toolUseResult: unknown,
|
|
1405
|
+
preMappedBlock?: ToolResultBlockParam,
|
|
1406
|
+
) {
|
|
1407
|
+
// Use the pre-mapped block when available (non-MCP tools where hooks
|
|
1408
|
+
// don't modify the output), otherwise map from scratch.
|
|
1409
|
+
const toolResultBlock = preMappedBlock
|
|
1410
|
+
? await processPreMappedToolResultBlock(
|
|
1411
|
+
preMappedBlock,
|
|
1412
|
+
tool.name,
|
|
1413
|
+
tool.maxResultSizeChars,
|
|
1414
|
+
)
|
|
1415
|
+
: await processToolResultBlock(tool, toolUseResult, toolUseID)
|
|
1416
|
+
|
|
1417
|
+
// Build content blocks - tool result first, then optional feedback
|
|
1418
|
+
const contentBlocks: ContentBlockParam[] = [toolResultBlock]
|
|
1419
|
+
// Add accept feedback if user provided feedback when approving
|
|
1420
|
+
// (acceptFeedback only exists on PermissionAllowDecision, which is guaranteed here)
|
|
1421
|
+
if (
|
|
1422
|
+
'acceptFeedback' in permissionDecision &&
|
|
1423
|
+
permissionDecision.acceptFeedback
|
|
1424
|
+
) {
|
|
1425
|
+
contentBlocks.push({
|
|
1426
|
+
type: 'text',
|
|
1427
|
+
text: permissionDecision.acceptFeedback,
|
|
1428
|
+
})
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
// Add content blocks (e.g., pasted images) from the permission decision
|
|
1432
|
+
const allowContentBlocks =
|
|
1433
|
+
'contentBlocks' in permissionDecision
|
|
1434
|
+
? permissionDecision.contentBlocks
|
|
1435
|
+
: undefined
|
|
1436
|
+
if (allowContentBlocks?.length) {
|
|
1437
|
+
contentBlocks.push(...allowContentBlocks)
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
// Generate sequential imagePasteIds so each image renders with a distinct label
|
|
1441
|
+
let allowImageIds: number[] | undefined
|
|
1442
|
+
if (allowContentBlocks?.length) {
|
|
1443
|
+
const imageCount = count(
|
|
1444
|
+
allowContentBlocks,
|
|
1445
|
+
(b: ContentBlockParam) => b.type === 'image',
|
|
1446
|
+
)
|
|
1447
|
+
if (imageCount > 0) {
|
|
1448
|
+
const startId = getNextImagePasteId(toolUseContext.messages)
|
|
1449
|
+
allowImageIds = Array.from(
|
|
1450
|
+
{ length: imageCount },
|
|
1451
|
+
(_, i) => startId + i,
|
|
1452
|
+
)
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
resultingMessages.push({
|
|
1457
|
+
message: createUserMessage({
|
|
1458
|
+
content: contentBlocks,
|
|
1459
|
+
imagePasteIds: allowImageIds,
|
|
1460
|
+
toolUseResult:
|
|
1461
|
+
toolUseContext.agentId && !toolUseContext.preserveToolUseResults
|
|
1462
|
+
? undefined
|
|
1463
|
+
: toolUseResult,
|
|
1464
|
+
mcpMeta: toolUseContext.agentId ? undefined : mcpMeta,
|
|
1465
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
1466
|
+
}),
|
|
1467
|
+
contextModifier: toolContextModifier
|
|
1468
|
+
? {
|
|
1469
|
+
toolUseID: toolUseID,
|
|
1470
|
+
modifyContext: toolContextModifier,
|
|
1471
|
+
}
|
|
1472
|
+
: undefined,
|
|
1473
|
+
})
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
// TOOD(hackyon): refactor so we don't have different experiences for MCP tools
|
|
1477
|
+
if (!isMcpTool(tool)) {
|
|
1478
|
+
await addToolResult(toolOutput, mappedToolResultBlock)
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
const postToolHookInfos: StopHookInfo[] = []
|
|
1482
|
+
const postToolHookStart = Date.now()
|
|
1483
|
+
for await (const hookResult of runPostToolUseHooks(
|
|
1484
|
+
toolUseContext,
|
|
1485
|
+
tool,
|
|
1486
|
+
toolUseID,
|
|
1487
|
+
assistantMessage.message.id,
|
|
1488
|
+
processedInput,
|
|
1489
|
+
toolOutput,
|
|
1490
|
+
requestId,
|
|
1491
|
+
mcpServerType,
|
|
1492
|
+
mcpServerBaseUrl,
|
|
1493
|
+
)) {
|
|
1494
|
+
if ('updatedMCPToolOutput' in hookResult) {
|
|
1495
|
+
if (isMcpTool(tool)) {
|
|
1496
|
+
toolOutput = hookResult.updatedMCPToolOutput
|
|
1497
|
+
}
|
|
1498
|
+
} else if (isMcpTool(tool)) {
|
|
1499
|
+
hookResults.push(hookResult)
|
|
1500
|
+
if (hookResult.message.type === 'attachment') {
|
|
1501
|
+
const att = hookResult.message.attachment
|
|
1502
|
+
if (
|
|
1503
|
+
'command' in att &&
|
|
1504
|
+
att.command !== undefined &&
|
|
1505
|
+
'durationMs' in att &&
|
|
1506
|
+
att.durationMs !== undefined
|
|
1507
|
+
) {
|
|
1508
|
+
postToolHookInfos.push({
|
|
1509
|
+
command: att.command,
|
|
1510
|
+
durationMs: att.durationMs,
|
|
1511
|
+
})
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
} else {
|
|
1515
|
+
resultingMessages.push(hookResult)
|
|
1516
|
+
if (hookResult.message.type === 'attachment') {
|
|
1517
|
+
const att = hookResult.message.attachment
|
|
1518
|
+
if (
|
|
1519
|
+
'command' in att &&
|
|
1520
|
+
att.command !== undefined &&
|
|
1521
|
+
'durationMs' in att &&
|
|
1522
|
+
att.durationMs !== undefined
|
|
1523
|
+
) {
|
|
1524
|
+
postToolHookInfos.push({
|
|
1525
|
+
command: att.command,
|
|
1526
|
+
durationMs: att.durationMs,
|
|
1527
|
+
})
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
const postToolHookDurationMs = Date.now() - postToolHookStart
|
|
1533
|
+
if (postToolHookDurationMs >= SLOW_PHASE_LOG_THRESHOLD_MS) {
|
|
1534
|
+
logForDebugging(
|
|
1535
|
+
`Slow PostToolUse hooks: ${postToolHookDurationMs}ms for ${tool.name} (${postToolHookInfos.length} hooks)`,
|
|
1536
|
+
{ level: 'info' },
|
|
1537
|
+
)
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
if (isMcpTool(tool)) {
|
|
1541
|
+
await addToolResult(toolOutput)
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
// Show PostToolUse hook timing inline below tool result when > 500ms.
|
|
1545
|
+
// Use wall-clock time (not sum of individual durations) since hooks run in parallel.
|
|
1546
|
+
if (process.env.USER_TYPE === 'ant' && postToolHookInfos.length > 0) {
|
|
1547
|
+
if (postToolHookDurationMs > HOOK_TIMING_DISPLAY_THRESHOLD_MS) {
|
|
1548
|
+
resultingMessages.push({
|
|
1549
|
+
message: createStopHookSummaryMessage(
|
|
1550
|
+
postToolHookInfos.length,
|
|
1551
|
+
postToolHookInfos,
|
|
1552
|
+
[],
|
|
1553
|
+
false,
|
|
1554
|
+
undefined,
|
|
1555
|
+
false,
|
|
1556
|
+
'suggestion',
|
|
1557
|
+
undefined,
|
|
1558
|
+
'PostToolUse',
|
|
1559
|
+
postToolHookDurationMs,
|
|
1560
|
+
),
|
|
1561
|
+
})
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
// If the tool provided new messages, add them to the list to return.
|
|
1566
|
+
if (result.newMessages && result.newMessages.length > 0) {
|
|
1567
|
+
for (const message of result.newMessages) {
|
|
1568
|
+
resultingMessages.push({ message })
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
// If hook indicated to prevent continuation after successful execution, yield a stop reason message
|
|
1572
|
+
if (shouldPreventContinuation) {
|
|
1573
|
+
resultingMessages.push({
|
|
1574
|
+
message: createAttachmentMessage({
|
|
1575
|
+
type: 'hook_stopped_continuation',
|
|
1576
|
+
message: stopReason || 'Execution stopped by hook',
|
|
1577
|
+
hookName: `PreToolUse:${tool.name}`,
|
|
1578
|
+
toolUseID: toolUseID,
|
|
1579
|
+
hookEvent: 'PreToolUse',
|
|
1580
|
+
}),
|
|
1581
|
+
})
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
// Yield the remaining hook results after the other messages are sent
|
|
1585
|
+
for (const hookResult of hookResults) {
|
|
1586
|
+
resultingMessages.push(hookResult)
|
|
1587
|
+
}
|
|
1588
|
+
return resultingMessages
|
|
1589
|
+
} catch (error) {
|
|
1590
|
+
const durationMs = Date.now() - startTime
|
|
1591
|
+
addToToolDuration(durationMs)
|
|
1592
|
+
|
|
1593
|
+
endToolExecutionSpan({
|
|
1594
|
+
success: false,
|
|
1595
|
+
error: errorMessage(error),
|
|
1596
|
+
})
|
|
1597
|
+
endToolSpan()
|
|
1598
|
+
|
|
1599
|
+
// Handle MCP auth errors by updating the client status to 'needs-auth'
|
|
1600
|
+
// This updates the /mcp display to show the server needs re-authorization
|
|
1601
|
+
if (error instanceof McpAuthError) {
|
|
1602
|
+
toolUseContext.setAppState(prevState => {
|
|
1603
|
+
const serverName = error.serverName
|
|
1604
|
+
const existingClientIndex = prevState.mcp.clients.findIndex(
|
|
1605
|
+
c => c.name === serverName,
|
|
1606
|
+
)
|
|
1607
|
+
if (existingClientIndex === -1) {
|
|
1608
|
+
return prevState
|
|
1609
|
+
}
|
|
1610
|
+
const existingClient = prevState.mcp.clients[existingClientIndex]
|
|
1611
|
+
// Only update if client was connected (don't overwrite other states)
|
|
1612
|
+
if (!existingClient || existingClient.type !== 'connected') {
|
|
1613
|
+
return prevState
|
|
1614
|
+
}
|
|
1615
|
+
const updatedClients = [...prevState.mcp.clients]
|
|
1616
|
+
updatedClients[existingClientIndex] = {
|
|
1617
|
+
name: serverName,
|
|
1618
|
+
type: 'needs-auth' as const,
|
|
1619
|
+
config: existingClient.config,
|
|
1620
|
+
}
|
|
1621
|
+
return {
|
|
1622
|
+
...prevState,
|
|
1623
|
+
mcp: {
|
|
1624
|
+
...prevState.mcp,
|
|
1625
|
+
clients: updatedClients,
|
|
1626
|
+
},
|
|
1627
|
+
}
|
|
1628
|
+
})
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
if (!(error instanceof AbortError)) {
|
|
1632
|
+
const errorMsg = errorMessage(error)
|
|
1633
|
+
logForDebugging(
|
|
1634
|
+
`${tool.name} tool error (${durationMs}ms): ${errorMsg.slice(0, 200)}`,
|
|
1635
|
+
)
|
|
1636
|
+
if (!(error instanceof ShellError)) {
|
|
1637
|
+
logError(error)
|
|
1638
|
+
}
|
|
1639
|
+
logEvent('tengu_tool_use_error', {
|
|
1640
|
+
messageID:
|
|
1641
|
+
messageId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1642
|
+
toolName: sanitizeToolNameForAnalytics(tool.name),
|
|
1643
|
+
error: classifyToolError(
|
|
1644
|
+
error,
|
|
1645
|
+
) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1646
|
+
isMcp: tool.isMcp ?? false,
|
|
1647
|
+
|
|
1648
|
+
queryChainId: toolUseContext.queryTracking
|
|
1649
|
+
?.chainId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1650
|
+
queryDepth: toolUseContext.queryTracking?.depth,
|
|
1651
|
+
...(mcpServerType && {
|
|
1652
|
+
mcpServerType:
|
|
1653
|
+
mcpServerType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1654
|
+
}),
|
|
1655
|
+
...(mcpServerBaseUrl && {
|
|
1656
|
+
mcpServerBaseUrl:
|
|
1657
|
+
mcpServerBaseUrl as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1658
|
+
}),
|
|
1659
|
+
...(requestId && {
|
|
1660
|
+
requestId:
|
|
1661
|
+
requestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1662
|
+
}),
|
|
1663
|
+
...mcpToolDetailsForAnalytics(
|
|
1664
|
+
tool.name,
|
|
1665
|
+
mcpServerType,
|
|
1666
|
+
mcpServerBaseUrl,
|
|
1667
|
+
),
|
|
1668
|
+
})
|
|
1669
|
+
// Log tool result error event for OTLP with tool parameters and decision context
|
|
1670
|
+
const mcpServerScope = isMcpTool(tool)
|
|
1671
|
+
? getMcpServerScopeFromToolName(tool.name)
|
|
1672
|
+
: null
|
|
1673
|
+
|
|
1674
|
+
void logOTelEvent('tool_result', {
|
|
1675
|
+
tool_name: sanitizeToolNameForAnalytics(tool.name),
|
|
1676
|
+
use_id: toolUseID,
|
|
1677
|
+
success: 'false',
|
|
1678
|
+
duration_ms: String(durationMs),
|
|
1679
|
+
error: errorMessage(error),
|
|
1680
|
+
...(Object.keys(toolParameters).length > 0 && {
|
|
1681
|
+
tool_parameters: jsonStringify(toolParameters),
|
|
1682
|
+
}),
|
|
1683
|
+
...(telemetryToolInput && { tool_input: telemetryToolInput }),
|
|
1684
|
+
...(decisionInfo && {
|
|
1685
|
+
decision_source: decisionInfo.source,
|
|
1686
|
+
decision_type: decisionInfo.decision,
|
|
1687
|
+
}),
|
|
1688
|
+
...(mcpServerScope && { mcp_server_scope: mcpServerScope }),
|
|
1689
|
+
})
|
|
1690
|
+
}
|
|
1691
|
+
const content = formatError(error)
|
|
1692
|
+
|
|
1693
|
+
// Determine if this was a user interrupt
|
|
1694
|
+
const isInterrupt = error instanceof AbortError
|
|
1695
|
+
|
|
1696
|
+
// Run PostToolUseFailure hooks
|
|
1697
|
+
const hookMessages: MessageUpdateLazy<
|
|
1698
|
+
AttachmentMessage | ProgressMessage<HookProgress>
|
|
1699
|
+
>[] = []
|
|
1700
|
+
for await (const hookResult of runPostToolUseFailureHooks(
|
|
1701
|
+
toolUseContext,
|
|
1702
|
+
tool,
|
|
1703
|
+
toolUseID,
|
|
1704
|
+
messageId,
|
|
1705
|
+
processedInput,
|
|
1706
|
+
content,
|
|
1707
|
+
isInterrupt,
|
|
1708
|
+
requestId,
|
|
1709
|
+
mcpServerType,
|
|
1710
|
+
mcpServerBaseUrl,
|
|
1711
|
+
)) {
|
|
1712
|
+
hookMessages.push(hookResult)
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
return [
|
|
1716
|
+
{
|
|
1717
|
+
message: createUserMessage({
|
|
1718
|
+
content: [
|
|
1719
|
+
{
|
|
1720
|
+
type: 'tool_result',
|
|
1721
|
+
content,
|
|
1722
|
+
is_error: true,
|
|
1723
|
+
tool_use_id: toolUseID,
|
|
1724
|
+
},
|
|
1725
|
+
],
|
|
1726
|
+
toolUseResult: `Error: ${content}`,
|
|
1727
|
+
mcpMeta: toolUseContext.agentId
|
|
1728
|
+
? undefined
|
|
1729
|
+
: error instanceof
|
|
1730
|
+
McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
1731
|
+
? error.mcpMeta
|
|
1732
|
+
: undefined,
|
|
1733
|
+
sourceToolAssistantUUID: assistantMessage.uuid,
|
|
1734
|
+
}),
|
|
1735
|
+
},
|
|
1736
|
+
...hookMessages,
|
|
1737
|
+
]
|
|
1738
|
+
} finally {
|
|
1739
|
+
stopSessionActivity('tool_exec')
|
|
1740
|
+
// Clean up decision info after logging
|
|
1741
|
+
if (decisionInfo) {
|
|
1742
|
+
toolUseContext.toolDecisions?.delete(toolUseID)
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
}
|