@xelauvas/xela-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +200 -0
- package/bin/xela +100 -0
- package/package.json +88 -0
- package/src/QueryEngine.ts +1295 -0
- package/src/Task.ts +125 -0
- package/src/Tool.ts +792 -0
- package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
- package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
- package/src/_shims/bun_bundle.js +9 -0
- package/src/_shims/cjs_stub.cjs +23 -0
- package/src/_shims/empty_stub.js +33 -0
- package/src/_shims/loader.js +352 -0
- package/src/_shims/openai_adapter.ts +486 -0
- package/src/_shims/react_compiler_runtime.js +17 -0
- package/src/_shims/register.js +148 -0
- package/src/assistant/sessionHistory.ts +87 -0
- package/src/bootstrap/state.ts +1759 -0
- package/src/bridge/bridgeApi.ts +539 -0
- package/src/bridge/bridgeConfig.ts +48 -0
- package/src/bridge/bridgeDebug.ts +135 -0
- package/src/bridge/bridgeEnabled.ts +202 -0
- package/src/bridge/bridgeMain.ts +2999 -0
- package/src/bridge/bridgeMessaging.ts +461 -0
- package/src/bridge/bridgePermissionCallbacks.ts +43 -0
- package/src/bridge/bridgePointer.ts +210 -0
- package/src/bridge/bridgeStatusUtil.ts +163 -0
- package/src/bridge/bridgeUI.ts +530 -0
- package/src/bridge/capacityWake.ts +56 -0
- package/src/bridge/codeSessionApi.ts +168 -0
- package/src/bridge/createSession.ts +384 -0
- package/src/bridge/debugUtils.ts +141 -0
- package/src/bridge/envLessBridgeConfig.ts +165 -0
- package/src/bridge/flushGate.ts +71 -0
- package/src/bridge/inboundAttachments.ts +175 -0
- package/src/bridge/inboundMessages.ts +80 -0
- package/src/bridge/initReplBridge.ts +569 -0
- package/src/bridge/jwtUtils.ts +256 -0
- package/src/bridge/pollConfig.ts +110 -0
- package/src/bridge/pollConfigDefaults.ts +82 -0
- package/src/bridge/remoteBridgeCore.ts +1008 -0
- package/src/bridge/replBridge.ts +2406 -0
- package/src/bridge/replBridgeHandle.ts +36 -0
- package/src/bridge/replBridgeTransport.ts +370 -0
- package/src/bridge/sessionIdCompat.ts +57 -0
- package/src/bridge/sessionRunner.ts +550 -0
- package/src/bridge/trustedDevice.ts +210 -0
- package/src/bridge/types.ts +262 -0
- package/src/bridge/workSecret.ts +127 -0
- package/src/buddy/CompanionSprite.tsx +371 -0
- package/src/buddy/companion.ts +133 -0
- package/src/buddy/prompt.ts +36 -0
- package/src/buddy/sprites.ts +514 -0
- package/src/buddy/types.ts +148 -0
- package/src/buddy/useBuddyNotification.tsx +98 -0
- package/src/cli/exit.ts +31 -0
- package/src/cli/handlers/agents.ts +70 -0
- package/src/cli/handlers/auth.ts +330 -0
- package/src/cli/handlers/autoMode.ts +170 -0
- package/src/cli/handlers/mcp.tsx +362 -0
- package/src/cli/handlers/plugins.ts +878 -0
- package/src/cli/handlers/util.tsx +110 -0
- package/src/cli/ndjsonSafeStringify.ts +32 -0
- package/src/cli/print.ts +5594 -0
- package/src/cli/remoteIO.ts +255 -0
- package/src/cli/structuredIO.ts +859 -0
- package/src/cli/transports/HybridTransport.ts +282 -0
- package/src/cli/transports/SSETransport.ts +711 -0
- package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/src/cli/transports/WebSocketTransport.ts +800 -0
- package/src/cli/transports/WorkerStateUploader.ts +131 -0
- package/src/cli/transports/ccrClient.ts +998 -0
- package/src/cli/transports/transportUtils.ts +45 -0
- package/src/cli/update.ts +422 -0
- package/src/commands/add-dir/add-dir.tsx +126 -0
- package/src/commands/add-dir/index.ts +11 -0
- package/src/commands/add-dir/validation.ts +110 -0
- package/src/commands/advisor.ts +109 -0
- package/src/commands/agents/agents.tsx +12 -0
- package/src/commands/agents/index.ts +10 -0
- package/src/commands/ant-trace/index.js +1 -0
- package/src/commands/autofix-pr/index.js +1 -0
- package/src/commands/backfill-sessions/index.js +1 -0
- package/src/commands/branch/branch.ts +296 -0
- package/src/commands/branch/index.ts +14 -0
- package/src/commands/break-cache/index.js +1 -0
- package/src/commands/bridge/bridge.tsx +509 -0
- package/src/commands/bridge/index.ts +26 -0
- package/src/commands/bridge-kick.ts +200 -0
- package/src/commands/brief.ts +130 -0
- package/src/commands/btw/btw.tsx +243 -0
- package/src/commands/btw/index.ts +13 -0
- package/src/commands/bughunter/index.js +1 -0
- package/src/commands/chrome/chrome.tsx +285 -0
- package/src/commands/chrome/index.ts +13 -0
- package/src/commands/clear/caches.ts +144 -0
- package/src/commands/clear/clear.ts +7 -0
- package/src/commands/clear/conversation.ts +251 -0
- package/src/commands/clear/index.ts +19 -0
- package/src/commands/color/color.ts +93 -0
- package/src/commands/color/index.ts +16 -0
- package/src/commands/commit-push-pr.ts +158 -0
- package/src/commands/commit.ts +92 -0
- package/src/commands/compact/compact.ts +287 -0
- package/src/commands/compact/index.ts +15 -0
- package/src/commands/config/config.tsx +7 -0
- package/src/commands/config/index.ts +11 -0
- package/src/commands/context/context-noninteractive.ts +325 -0
- package/src/commands/context/context.tsx +64 -0
- package/src/commands/context/index.ts +24 -0
- package/src/commands/copy/copy.tsx +371 -0
- package/src/commands/copy/index.ts +15 -0
- package/src/commands/cost/cost.ts +24 -0
- package/src/commands/cost/index.ts +23 -0
- package/src/commands/createMovedToPluginCommand.ts +65 -0
- package/src/commands/ctx_viz/index.js +1 -0
- package/src/commands/debug-tool-call/index.js +1 -0
- package/src/commands/desktop/desktop.tsx +9 -0
- package/src/commands/desktop/index.ts +26 -0
- package/src/commands/diff/diff.tsx +9 -0
- package/src/commands/diff/index.ts +8 -0
- package/src/commands/doctor/doctor.tsx +7 -0
- package/src/commands/doctor/index.ts +12 -0
- package/src/commands/effort/effort.tsx +183 -0
- package/src/commands/effort/index.ts +13 -0
- package/src/commands/env/index.js +1 -0
- package/src/commands/exit/exit.tsx +33 -0
- package/src/commands/exit/index.ts +12 -0
- package/src/commands/export/export.tsx +91 -0
- package/src/commands/export/index.ts +11 -0
- package/src/commands/extra-usage/extra-usage-core.ts +118 -0
- package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/src/commands/extra-usage/extra-usage.tsx +17 -0
- package/src/commands/extra-usage/index.ts +31 -0
- package/src/commands/fast/fast.tsx +269 -0
- package/src/commands/fast/index.ts +26 -0
- package/src/commands/feedback/feedback.tsx +25 -0
- package/src/commands/feedback/index.ts +26 -0
- package/src/commands/files/files.ts +19 -0
- package/src/commands/files/index.ts +12 -0
- package/src/commands/good-claude/index.js +1 -0
- package/src/commands/heapdump/heapdump.ts +17 -0
- package/src/commands/heapdump/index.ts +12 -0
- package/src/commands/help/help.tsx +11 -0
- package/src/commands/help/index.ts +10 -0
- package/src/commands/hooks/hooks.tsx +13 -0
- package/src/commands/hooks/index.ts +11 -0
- package/src/commands/ide/ide.tsx +646 -0
- package/src/commands/ide/index.ts +11 -0
- package/src/commands/init-verifiers.ts +262 -0
- package/src/commands/init.ts +256 -0
- package/src/commands/insights.ts +3200 -0
- package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/src/commands/install-github-app/CreatingStep.tsx +65 -0
- package/src/commands/install-github-app/ErrorStep.tsx +85 -0
- package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/src/commands/install-github-app/SuccessStep.tsx +96 -0
- package/src/commands/install-github-app/WarningsStep.tsx +73 -0
- package/src/commands/install-github-app/index.ts +13 -0
- package/src/commands/install-github-app/install-github-app.tsx +587 -0
- package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/src/commands/install-slack-app/index.ts +12 -0
- package/src/commands/install-slack-app/install-slack-app.ts +30 -0
- package/src/commands/install.tsx +300 -0
- package/src/commands/issue/index.js +1 -0
- package/src/commands/keybindings/index.ts +13 -0
- package/src/commands/keybindings/keybindings.ts +53 -0
- package/src/commands/login/index.ts +14 -0
- package/src/commands/login/login.tsx +104 -0
- package/src/commands/logout/index.ts +10 -0
- package/src/commands/logout/logout.tsx +82 -0
- package/src/commands/mcp/addCommand.ts +280 -0
- package/src/commands/mcp/index.ts +12 -0
- package/src/commands/mcp/mcp.tsx +85 -0
- package/src/commands/mcp/xaaIdpCommand.ts +266 -0
- package/src/commands/memory/index.ts +10 -0
- package/src/commands/memory/memory.tsx +90 -0
- package/src/commands/mobile/index.ts +11 -0
- package/src/commands/mobile/mobile.tsx +274 -0
- package/src/commands/mock-limits/index.js +1 -0
- package/src/commands/model/index.ts +16 -0
- package/src/commands/model/model.tsx +297 -0
- package/src/commands/oauth-refresh/index.js +1 -0
- package/src/commands/onboarding/index.js +1 -0
- package/src/commands/output-style/index.ts +11 -0
- package/src/commands/output-style/output-style.tsx +7 -0
- package/src/commands/passes/index.ts +22 -0
- package/src/commands/passes/passes.tsx +24 -0
- package/src/commands/perf-issue/index.js +1 -0
- package/src/commands/permissions/index.ts +11 -0
- package/src/commands/permissions/permissions.tsx +10 -0
- package/src/commands/plan/index.ts +11 -0
- package/src/commands/plan/plan.tsx +122 -0
- package/src/commands/plugin/AddMarketplace.tsx +162 -0
- package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/src/commands/plugin/ManagePlugins.tsx +2215 -0
- package/src/commands/plugin/PluginErrors.tsx +124 -0
- package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/src/commands/plugin/PluginSettings.tsx +1072 -0
- package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/src/commands/plugin/ValidatePlugin.tsx +98 -0
- package/src/commands/plugin/index.tsx +11 -0
- package/src/commands/plugin/parseArgs.ts +103 -0
- package/src/commands/plugin/plugin.tsx +7 -0
- package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/src/commands/plugin/usePagination.ts +171 -0
- package/src/commands/pr_comments/index.ts +50 -0
- package/src/commands/privacy-settings/index.ts +14 -0
- package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/src/commands/rate-limit-options/index.ts +19 -0
- package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/src/commands/release-notes/index.ts +11 -0
- package/src/commands/release-notes/release-notes.ts +50 -0
- package/src/commands/reload-plugins/index.ts +18 -0
- package/src/commands/reload-plugins/reload-plugins.ts +61 -0
- package/src/commands/remote-env/index.ts +15 -0
- package/src/commands/remote-env/remote-env.tsx +7 -0
- package/src/commands/remote-setup/api.ts +182 -0
- package/src/commands/remote-setup/index.ts +20 -0
- package/src/commands/remote-setup/remote-setup.tsx +187 -0
- package/src/commands/rename/generateSessionName.ts +67 -0
- package/src/commands/rename/index.ts +12 -0
- package/src/commands/rename/rename.ts +87 -0
- package/src/commands/reset-limits/index.js +4 -0
- package/src/commands/resume/index.ts +12 -0
- package/src/commands/resume/resume.tsx +275 -0
- package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/src/commands/review/reviewRemote.ts +316 -0
- package/src/commands/review/ultrareviewCommand.tsx +58 -0
- package/src/commands/review/ultrareviewEnabled.ts +14 -0
- package/src/commands/review.ts +57 -0
- package/src/commands/rewind/index.ts +13 -0
- package/src/commands/rewind/rewind.ts +13 -0
- package/src/commands/sandbox-toggle/index.ts +50 -0
- package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/src/commands/security-review.ts +243 -0
- package/src/commands/session/index.ts +16 -0
- package/src/commands/session/session.tsx +140 -0
- package/src/commands/share/index.js +1 -0
- package/src/commands/skills/index.ts +10 -0
- package/src/commands/skills/skills.tsx +8 -0
- package/src/commands/stats/index.ts +10 -0
- package/src/commands/stats/stats.tsx +7 -0
- package/src/commands/status/index.ts +12 -0
- package/src/commands/status/status.tsx +8 -0
- package/src/commands/statusline.tsx +24 -0
- package/src/commands/stickers/index.ts +11 -0
- package/src/commands/stickers/stickers.ts +16 -0
- package/src/commands/summary/index.js +1 -0
- package/src/commands/tag/index.ts +12 -0
- package/src/commands/tag/tag.tsx +215 -0
- package/src/commands/tasks/index.ts +11 -0
- package/src/commands/tasks/tasks.tsx +8 -0
- package/src/commands/teleport/index.js +1 -0
- package/src/commands/terminalSetup/index.ts +23 -0
- package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/src/commands/theme/index.ts +10 -0
- package/src/commands/theme/theme.tsx +57 -0
- package/src/commands/thinkback/index.ts +13 -0
- package/src/commands/thinkback/thinkback.tsx +554 -0
- package/src/commands/thinkback-play/index.ts +17 -0
- package/src/commands/thinkback-play/thinkback-play.ts +43 -0
- package/src/commands/ultraplan.tsx +471 -0
- package/src/commands/upgrade/index.ts +16 -0
- package/src/commands/upgrade/upgrade.tsx +38 -0
- package/src/commands/usage/index.ts +9 -0
- package/src/commands/usage/usage.tsx +7 -0
- package/src/commands/version.ts +22 -0
- package/src/commands/vim/index.ts +11 -0
- package/src/commands/vim/vim.ts +38 -0
- package/src/commands/voice/index.ts +20 -0
- package/src/commands/voice/voice.ts +150 -0
- package/src/commands.ts +754 -0
- package/src/components/AgentProgressLine.tsx +136 -0
- package/src/components/App.tsx +56 -0
- package/src/components/ApproveApiKey.tsx +123 -0
- package/src/components/AutoModeOptInDialog.tsx +142 -0
- package/src/components/AutoUpdater.tsx +198 -0
- package/src/components/AutoUpdaterWrapper.tsx +91 -0
- package/src/components/AwsAuthStatusBox.tsx +82 -0
- package/src/components/BaseTextInput.tsx +136 -0
- package/src/components/BashModeProgress.tsx +56 -0
- package/src/components/BridgeDialog.tsx +401 -0
- package/src/components/BypassPermissionsModeDialog.tsx +87 -0
- package/src/components/ChannelDowngradeDialog.tsx +102 -0
- package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/src/components/ClickableImageRef.tsx +73 -0
- package/src/components/CompactSummary.tsx +118 -0
- package/src/components/ConfigurableShortcutHint.tsx +57 -0
- package/src/components/ConsoleOAuthFlow.tsx +631 -0
- package/src/components/ContextSuggestions.tsx +47 -0
- package/src/components/ContextVisualization.tsx +489 -0
- package/src/components/CoordinatorAgentStatus.tsx +273 -0
- package/src/components/CostThresholdDialog.tsx +50 -0
- package/src/components/CtrlOToExpand.tsx +51 -0
- package/src/components/CustomSelect/SelectMulti.tsx +213 -0
- package/src/components/CustomSelect/index.ts +3 -0
- package/src/components/CustomSelect/option-map.ts +50 -0
- package/src/components/CustomSelect/select-input-option.tsx +488 -0
- package/src/components/CustomSelect/select-option.tsx +68 -0
- package/src/components/CustomSelect/select.tsx +690 -0
- package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/src/components/CustomSelect/use-select-input.ts +287 -0
- package/src/components/CustomSelect/use-select-navigation.ts +653 -0
- package/src/components/CustomSelect/use-select-state.ts +157 -0
- package/src/components/DesktopHandoff.tsx +193 -0
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/src/components/DevBar.tsx +49 -0
- package/src/components/DevChannelsDialog.tsx +105 -0
- package/src/components/DiagnosticsDisplay.tsx +95 -0
- package/src/components/EffortCallout.tsx +265 -0
- package/src/components/EffortIndicator.ts +42 -0
- package/src/components/ExitFlow.tsx +48 -0
- package/src/components/ExportDialog.tsx +128 -0
- package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/src/components/FastIcon.tsx +46 -0
- package/src/components/Feedback.tsx +592 -0
- package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/src/components/FileEditToolDiff.tsx +181 -0
- package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/src/components/FilePathLink.tsx +43 -0
- package/src/components/FullscreenLayout.tsx +637 -0
- package/src/components/GlobalSearchDialog.tsx +343 -0
- package/src/components/HelpV2/Commands.tsx +82 -0
- package/src/components/HelpV2/General.tsx +23 -0
- package/src/components/HelpV2/HelpV2.tsx +184 -0
- package/src/components/HighlightedCode/Fallback.tsx +193 -0
- package/src/components/HighlightedCode.tsx +190 -0
- package/src/components/HistorySearchDialog.tsx +118 -0
- package/src/components/IdeAutoConnectDialog.tsx +154 -0
- package/src/components/IdeOnboardingDialog.tsx +167 -0
- package/src/components/IdeStatusIndicator.tsx +58 -0
- package/src/components/IdleReturnDialog.tsx +118 -0
- package/src/components/InterruptedByUser.tsx +15 -0
- package/src/components/InvalidConfigDialog.tsx +156 -0
- package/src/components/InvalidSettingsDialog.tsx +89 -0
- package/src/components/KeybindingWarnings.tsx +55 -0
- package/src/components/LanguagePicker.tsx +86 -0
- package/src/components/LogSelector.tsx +1575 -0
- package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/src/components/LogoV2/Clawd.tsx +240 -0
- package/src/components/LogoV2/CondensedLogo.tsx +161 -0
- package/src/components/LogoV2/EmergencyTip.tsx +58 -0
- package/src/components/LogoV2/Feed.tsx +112 -0
- package/src/components/LogoV2/FeedColumn.tsx +59 -0
- package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/src/components/LogoV2/LogoV2.tsx +543 -0
- package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/src/components/LogoV2/WelcomeV2.tsx +433 -0
- package/src/components/LogoV2/feedConfigs.tsx +92 -0
- package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/src/components/MCPServerApprovalDialog.tsx +115 -0
- package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/src/components/MCPServerDialogCopy.tsx +15 -0
- package/src/components/MCPServerMultiselectDialog.tsx +133 -0
- package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/src/components/Markdown.tsx +236 -0
- package/src/components/MarkdownTable.tsx +322 -0
- package/src/components/MemoryUsageIndicator.tsx +37 -0
- package/src/components/Message.tsx +627 -0
- package/src/components/MessageModel.tsx +43 -0
- package/src/components/MessageResponse.tsx +78 -0
- package/src/components/MessageRow.tsx +383 -0
- package/src/components/MessageSelector.tsx +831 -0
- package/src/components/MessageTimestamp.tsx +63 -0
- package/src/components/Messages.tsx +834 -0
- package/src/components/ModelPicker.tsx +448 -0
- package/src/components/NativeAutoUpdater.tsx +193 -0
- package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/src/components/OffscreenFreeze.tsx +44 -0
- package/src/components/Onboarding.tsx +244 -0
- package/src/components/OutputStylePicker.tsx +112 -0
- package/src/components/PackageManagerAutoUpdater.tsx +104 -0
- package/src/components/Passes/Passes.tsx +184 -0
- package/src/components/PrBadge.tsx +97 -0
- package/src/components/PressEnterToContinue.tsx +15 -0
- package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/src/components/PromptInput/Notifications.tsx +332 -0
- package/src/components/PromptInput/PromptInput.tsx +2339 -0
- package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
- package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/src/components/PromptInput/inputModes.ts +33 -0
- package/src/components/PromptInput/inputPaste.ts +90 -0
- package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
- package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/src/components/PromptInput/useSwarmBanner.ts +155 -0
- package/src/components/PromptInput/utils.ts +60 -0
- package/src/components/QuickOpenDialog.tsx +244 -0
- package/src/components/RemoteCallout.tsx +76 -0
- package/src/components/RemoteEnvironmentDialog.tsx +340 -0
- package/src/components/ResumeTask.tsx +268 -0
- package/src/components/SandboxViolationExpandedView.tsx +99 -0
- package/src/components/ScrollKeybindingHandler.tsx +1012 -0
- package/src/components/SearchBox.tsx +72 -0
- package/src/components/SentryErrorBoundary.ts +28 -0
- package/src/components/SessionBackgroundHint.tsx +108 -0
- package/src/components/SessionPreview.tsx +194 -0
- package/src/components/Settings/Config.tsx +1822 -0
- package/src/components/Settings/Settings.tsx +137 -0
- package/src/components/Settings/Status.tsx +241 -0
- package/src/components/Settings/Usage.tsx +377 -0
- package/src/components/ShowInIDEPrompt.tsx +170 -0
- package/src/components/SkillImprovementSurvey.tsx +152 -0
- package/src/components/Spinner/FlashingChar.tsx +61 -0
- package/src/components/Spinner/GlimmerMessage.tsx +328 -0
- package/src/components/Spinner/ShimmerChar.tsx +36 -0
- package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/src/components/Spinner/index.ts +10 -0
- package/src/components/Spinner/teammateSelectHint.ts +1 -0
- package/src/components/Spinner/useShimmerAnimation.ts +31 -0
- package/src/components/Spinner/useStalledAnimation.ts +75 -0
- package/src/components/Spinner/utils.ts +84 -0
- package/src/components/Spinner.tsx +562 -0
- package/src/components/Stats.tsx +1228 -0
- package/src/components/StatusLine.tsx +324 -0
- package/src/components/StatusNotices.tsx +55 -0
- package/src/components/StructuredDiff/Fallback.tsx +487 -0
- package/src/components/StructuredDiff/colorDiff.ts +37 -0
- package/src/components/StructuredDiff.tsx +190 -0
- package/src/components/StructuredDiffList.tsx +30 -0
- package/src/components/TagTabs.tsx +139 -0
- package/src/components/TaskListV2.tsx +378 -0
- package/src/components/TeammateViewHeader.tsx +82 -0
- package/src/components/TeleportError.tsx +189 -0
- package/src/components/TeleportProgress.tsx +140 -0
- package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/src/components/TeleportResumeWrapper.tsx +167 -0
- package/src/components/TeleportStash.tsx +116 -0
- package/src/components/TextInput.tsx +124 -0
- package/src/components/ThemePicker.tsx +333 -0
- package/src/components/ThinkingToggle.tsx +153 -0
- package/src/components/TokenWarning.tsx +179 -0
- package/src/components/ToolUseLoader.tsx +42 -0
- package/src/components/TrustDialog/TrustDialog.tsx +290 -0
- package/src/components/TrustDialog/utils.ts +245 -0
- package/src/components/ValidationErrorsList.tsx +148 -0
- package/src/components/VimTextInput.tsx +140 -0
- package/src/components/VirtualMessageList.tsx +1082 -0
- package/src/components/WorkflowMultiselectDialog.tsx +128 -0
- package/src/components/WorktreeExitDialog.tsx +231 -0
- package/src/components/agents/AgentDetail.tsx +220 -0
- package/src/components/agents/AgentEditor.tsx +178 -0
- package/src/components/agents/AgentNavigationFooter.tsx +26 -0
- package/src/components/agents/AgentsList.tsx +440 -0
- package/src/components/agents/AgentsMenu.tsx +800 -0
- package/src/components/agents/ColorPicker.tsx +112 -0
- package/src/components/agents/ModelSelector.tsx +68 -0
- package/src/components/agents/ToolSelector.tsx +562 -0
- package/src/components/agents/agentFileUtils.ts +272 -0
- package/src/components/agents/generateAgent.ts +197 -0
- package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/src/components/agents/types.ts +27 -0
- package/src/components/agents/utils.ts +18 -0
- package/src/components/agents/validateAgent.ts +109 -0
- package/src/components/design-system/Byline.tsx +77 -0
- package/src/components/design-system/Dialog.tsx +138 -0
- package/src/components/design-system/Divider.tsx +149 -0
- package/src/components/design-system/FuzzyPicker.tsx +312 -0
- package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/src/components/design-system/ListItem.tsx +244 -0
- package/src/components/design-system/LoadingState.tsx +94 -0
- package/src/components/design-system/Pane.tsx +77 -0
- package/src/components/design-system/ProgressBar.tsx +86 -0
- package/src/components/design-system/Ratchet.tsx +80 -0
- package/src/components/design-system/StatusIcon.tsx +95 -0
- package/src/components/design-system/Tabs.tsx +340 -0
- package/src/components/design-system/ThemeProvider.tsx +174 -0
- package/src/components/design-system/ThemedBox.tsx +156 -0
- package/src/components/design-system/ThemedText.tsx +124 -0
- package/src/components/design-system/color.ts +30 -0
- package/src/components/diff/DiffDetailView.tsx +281 -0
- package/src/components/diff/DiffDialog.tsx +383 -0
- package/src/components/diff/DiffFileList.tsx +292 -0
- package/src/components/grove/Grove.tsx +463 -0
- package/src/components/hooks/HooksConfigMenu.tsx +578 -0
- package/src/components/hooks/PromptDialog.tsx +90 -0
- package/src/components/hooks/SelectEventMode.tsx +127 -0
- package/src/components/hooks/SelectHookMode.tsx +112 -0
- package/src/components/hooks/SelectMatcherMode.tsx +144 -0
- package/src/components/hooks/ViewHookMode.tsx +199 -0
- package/src/components/mcp/CapabilitiesSection.tsx +61 -0
- package/src/components/mcp/ElicitationDialog.tsx +1169 -0
- package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/src/components/mcp/MCPListPanel.tsx +504 -0
- package/src/components/mcp/MCPReconnect.tsx +167 -0
- package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/src/components/mcp/MCPSettings.tsx +398 -0
- package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/src/components/mcp/MCPToolDetailView.tsx +212 -0
- package/src/components/mcp/MCPToolListView.tsx +141 -0
- package/src/components/mcp/McpParsingWarnings.tsx +213 -0
- package/src/components/mcp/index.ts +9 -0
- package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/src/components/memory/MemoryFileSelector.tsx +438 -0
- package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/src/components/messageActions.tsx +450 -0
- package/src/components/messages/AdvisorMessage.tsx +158 -0
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/src/components/messages/AssistantTextMessage.tsx +270 -0
- package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/src/components/messages/AttachmentMessage.tsx +536 -0
- package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/src/components/messages/GroupedToolUseContent.tsx +58 -0
- package/src/components/messages/HighlightedThinkingText.tsx +162 -0
- package/src/components/messages/HookProgressMessage.tsx +116 -0
- package/src/components/messages/PlanApprovalMessage.tsx +222 -0
- package/src/components/messages/RateLimitMessage.tsx +161 -0
- package/src/components/messages/ShutdownMessage.tsx +132 -0
- package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/src/components/messages/SystemTextMessage.tsx +827 -0
- package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/src/components/messages/UserBashInputMessage.tsx +58 -0
- package/src/components/messages/UserBashOutputMessage.tsx +54 -0
- package/src/components/messages/UserChannelMessage.tsx +137 -0
- package/src/components/messages/UserCommandMessage.tsx +108 -0
- package/src/components/messages/UserImageMessage.tsx +59 -0
- package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/src/components/messages/UserPlanMessage.tsx +42 -0
- package/src/components/messages/UserPromptMessage.tsx +80 -0
- package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/src/components/messages/UserTeammateMessage.tsx +206 -0
- package/src/components/messages/UserTextMessage.tsx +275 -0
- package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/src/components/messages/nullRenderingAttachments.ts +70 -0
- package/src/components/messages/teamMemCollapsed.tsx +140 -0
- package/src/components/messages/teamMemSaved.ts +19 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/src/components/permissions/PermissionDialog.tsx +72 -0
- package/src/components/permissions/PermissionExplanation.tsx +272 -0
- package/src/components/permissions/PermissionPrompt.tsx +336 -0
- package/src/components/permissions/PermissionRequest.tsx +217 -0
- package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/src/components/permissions/WorkerBadge.tsx +49 -0
- package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/src/components/permissions/hooks.ts +209 -0
- package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/src/components/permissions/utils.ts +25 -0
- package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/src/components/sandbox/SandboxSettings.tsx +296 -0
- package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/src/components/shell/OutputLine.tsx +118 -0
- package/src/components/shell/ShellProgressMessage.tsx +150 -0
- package/src/components/shell/ShellTimeDisplay.tsx +74 -0
- package/src/components/skills/SkillsMenu.tsx +237 -0
- package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/src/components/tasks/BackgroundTask.tsx +345 -0
- package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/src/components/tasks/DreamDetailDialog.tsx +251 -0
- package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/src/components/tasks/ShellDetailDialog.tsx +404 -0
- package/src/components/tasks/ShellProgress.tsx +87 -0
- package/src/components/tasks/renderToolActivity.tsx +33 -0
- package/src/components/tasks/taskStatusUtils.tsx +107 -0
- package/src/components/teams/TeamStatus.tsx +80 -0
- package/src/components/teams/TeamsDialog.tsx +715 -0
- package/src/components/ui/OrderedList.tsx +71 -0
- package/src/components/ui/OrderedListItem.tsx +45 -0
- package/src/components/ui/TreeSelect.tsx +397 -0
- package/src/components/wizard/WizardDialogLayout.tsx +65 -0
- package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/src/components/wizard/WizardProvider.tsx +213 -0
- package/src/components/wizard/index.ts +9 -0
- package/src/components/wizard/useWizard.ts +13 -0
- package/src/constants/apiLimits.ts +94 -0
- package/src/constants/betas.ts +52 -0
- package/src/constants/common.ts +33 -0
- package/src/constants/cyberRiskInstruction.ts +24 -0
- package/src/constants/errorIds.ts +15 -0
- package/src/constants/figures.ts +45 -0
- package/src/constants/files.ts +156 -0
- package/src/constants/github-app.ts +144 -0
- package/src/constants/keys.ts +11 -0
- package/src/constants/messages.ts +1 -0
- package/src/constants/oauth.ts +234 -0
- package/src/constants/outputStyles.ts +216 -0
- package/src/constants/product.ts +76 -0
- package/src/constants/prompts.ts +914 -0
- package/src/constants/spinnerVerbs.ts +204 -0
- package/src/constants/system.ts +95 -0
- package/src/constants/systemPromptSections.ts +68 -0
- package/src/constants/toolLimits.ts +56 -0
- package/src/constants/tools.ts +112 -0
- package/src/constants/turnCompletionVerbs.ts +12 -0
- package/src/constants/xml.ts +86 -0
- package/src/context/QueuedMessageContext.tsx +63 -0
- package/src/context/fpsMetrics.tsx +30 -0
- package/src/context/mailbox.tsx +38 -0
- package/src/context/modalContext.tsx +58 -0
- package/src/context/notifications.tsx +240 -0
- package/src/context/overlayContext.tsx +151 -0
- package/src/context/promptOverlayContext.tsx +125 -0
- package/src/context/stats.tsx +220 -0
- package/src/context/voice.tsx +88 -0
- package/src/context.ts +189 -0
- package/src/coordinator/coordinatorMode.ts +369 -0
- package/src/cost-tracker.ts +323 -0
- package/src/costHook.ts +22 -0
- package/src/dialogLaunchers.tsx +133 -0
- package/src/entrypoints/agentSdkTypes.ts +443 -0
- package/src/entrypoints/cli.tsx +303 -0
- package/src/entrypoints/init.ts +340 -0
- package/src/entrypoints/mcp.ts +196 -0
- package/src/entrypoints/sandboxTypes.ts +156 -0
- package/src/entrypoints/sdk/controlSchemas.ts +663 -0
- package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/src/entrypoints/sdk/coreTypes.ts +62 -0
- package/src/history.ts +464 -0
- package/src/hooks/fileSuggestions.ts +811 -0
- package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/src/hooks/notifs/useInstallMessages.tsx +26 -0
- package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/src/hooks/notifs/useStartupNotification.ts +41 -0
- package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/src/hooks/renderPlaceholder.ts +51 -0
- package/src/hooks/toolPermission/PermissionContext.ts +388 -0
- package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/src/hooks/toolPermission/permissionLogging.ts +238 -0
- package/src/hooks/unifiedSuggestions.ts +202 -0
- package/src/hooks/useAfterFirstRender.ts +17 -0
- package/src/hooks/useApiKeyVerification.ts +84 -0
- package/src/hooks/useArrowKeyHistory.tsx +229 -0
- package/src/hooks/useAssistantHistory.ts +250 -0
- package/src/hooks/useAwaySummary.ts +125 -0
- package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/src/hooks/useBlink.ts +34 -0
- package/src/hooks/useCanUseTool.tsx +204 -0
- package/src/hooks/useCancelRequest.ts +276 -0
- package/src/hooks/useChromeExtensionNotification.tsx +50 -0
- package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/src/hooks/useClipboardImageHint.ts +77 -0
- package/src/hooks/useCommandKeybindings.tsx +108 -0
- package/src/hooks/useCommandQueue.ts +15 -0
- package/src/hooks/useCopyOnSelect.ts +98 -0
- package/src/hooks/useDeferredHookMessages.ts +46 -0
- package/src/hooks/useDiffData.ts +110 -0
- package/src/hooks/useDiffInIDE.ts +379 -0
- package/src/hooks/useDirectConnect.ts +229 -0
- package/src/hooks/useDoublePress.ts +62 -0
- package/src/hooks/useDynamicConfig.ts +22 -0
- package/src/hooks/useElapsedTime.ts +37 -0
- package/src/hooks/useExitOnCtrlCD.ts +95 -0
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/src/hooks/useGlobalKeybindings.tsx +249 -0
- package/src/hooks/useHistorySearch.ts +303 -0
- package/src/hooks/useIDEIntegration.tsx +70 -0
- package/src/hooks/useIdeAtMentioned.ts +76 -0
- package/src/hooks/useIdeConnectionStatus.ts +33 -0
- package/src/hooks/useIdeLogging.ts +41 -0
- package/src/hooks/useIdeSelection.ts +150 -0
- package/src/hooks/useInboxPoller.ts +969 -0
- package/src/hooks/useInputBuffer.ts +132 -0
- package/src/hooks/useIssueFlagBanner.ts +133 -0
- package/src/hooks/useLogMessages.ts +119 -0
- package/src/hooks/useLspPluginRecommendation.tsx +194 -0
- package/src/hooks/useMailboxBridge.ts +21 -0
- package/src/hooks/useMainLoopModel.ts +34 -0
- package/src/hooks/useManagePlugins.ts +304 -0
- package/src/hooks/useMemoryUsage.ts +39 -0
- package/src/hooks/useMergedClients.ts +23 -0
- package/src/hooks/useMergedCommands.ts +15 -0
- package/src/hooks/useMergedTools.ts +44 -0
- package/src/hooks/useMinDisplayTime.ts +35 -0
- package/src/hooks/useNotifyAfterTimeout.ts +65 -0
- package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/src/hooks/usePasteHandler.ts +285 -0
- package/src/hooks/usePluginRecommendationBase.tsx +105 -0
- package/src/hooks/usePrStatus.ts +106 -0
- package/src/hooks/usePromptSuggestion.ts +177 -0
- package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/src/hooks/useQueueProcessor.ts +68 -0
- package/src/hooks/useRemoteSession.ts +605 -0
- package/src/hooks/useReplBridge.tsx +723 -0
- package/src/hooks/useSSHSession.ts +241 -0
- package/src/hooks/useScheduledTasks.ts +139 -0
- package/src/hooks/useSearchInput.ts +364 -0
- package/src/hooks/useSessionBackgrounding.ts +158 -0
- package/src/hooks/useSettings.ts +17 -0
- package/src/hooks/useSettingsChange.ts +25 -0
- package/src/hooks/useSkillImprovementSurvey.ts +105 -0
- package/src/hooks/useSkillsChange.ts +62 -0
- package/src/hooks/useSwarmInitialization.ts +81 -0
- package/src/hooks/useSwarmPermissionPoller.ts +330 -0
- package/src/hooks/useTaskListWatcher.ts +221 -0
- package/src/hooks/useTasksV2.ts +250 -0
- package/src/hooks/useTeammateViewAutoExit.ts +63 -0
- package/src/hooks/useTeleportResume.tsx +85 -0
- package/src/hooks/useTerminalSize.ts +15 -0
- package/src/hooks/useTextInput.ts +529 -0
- package/src/hooks/useTimeout.ts +14 -0
- package/src/hooks/useTurnDiffs.ts +213 -0
- package/src/hooks/useTypeahead.tsx +1385 -0
- package/src/hooks/useUpdateNotification.ts +34 -0
- package/src/hooks/useVimInput.ts +316 -0
- package/src/hooks/useVirtualScroll.ts +721 -0
- package/src/hooks/useVoice.ts +1144 -0
- package/src/hooks/useVoiceEnabled.ts +25 -0
- package/src/hooks/useVoiceIntegration.tsx +677 -0
- package/src/ink/Ansi.tsx +292 -0
- package/src/ink/bidi.ts +139 -0
- package/src/ink/clearTerminal.ts +74 -0
- package/src/ink/colorize.ts +231 -0
- package/src/ink/components/AlternateScreen.tsx +80 -0
- package/src/ink/components/App.tsx +659 -0
- package/src/ink/components/AppContext.ts +21 -0
- package/src/ink/components/Box.tsx +214 -0
- package/src/ink/components/Button.tsx +192 -0
- package/src/ink/components/ClockContext.tsx +112 -0
- package/src/ink/components/CursorDeclarationContext.ts +32 -0
- package/src/ink/components/ErrorOverview.tsx +109 -0
- package/src/ink/components/Link.tsx +42 -0
- package/src/ink/components/Newline.tsx +39 -0
- package/src/ink/components/NoSelect.tsx +68 -0
- package/src/ink/components/RawAnsi.tsx +57 -0
- package/src/ink/components/ScrollBox.tsx +237 -0
- package/src/ink/components/Spacer.tsx +20 -0
- package/src/ink/components/StdinContext.ts +49 -0
- package/src/ink/components/TerminalFocusContext.tsx +52 -0
- package/src/ink/components/TerminalSizeContext.tsx +7 -0
- package/src/ink/components/Text.tsx +254 -0
- package/src/ink/constants.ts +2 -0
- package/src/ink/dom.ts +484 -0
- package/src/ink/events/click-event.ts +38 -0
- package/src/ink/events/dispatcher.ts +233 -0
- package/src/ink/events/emitter.ts +39 -0
- package/src/ink/events/event-handlers.ts +73 -0
- package/src/ink/events/event.ts +11 -0
- package/src/ink/events/focus-event.ts +21 -0
- package/src/ink/events/input-event.ts +205 -0
- package/src/ink/events/keyboard-event.ts +51 -0
- package/src/ink/events/terminal-event.ts +107 -0
- package/src/ink/events/terminal-focus-event.ts +19 -0
- package/src/ink/focus.ts +181 -0
- package/src/ink/frame.ts +124 -0
- package/src/ink/get-max-width.ts +27 -0
- package/src/ink/hit-test.ts +130 -0
- package/src/ink/hooks/use-animation-frame.ts +57 -0
- package/src/ink/hooks/use-app.ts +8 -0
- package/src/ink/hooks/use-declared-cursor.ts +73 -0
- package/src/ink/hooks/use-input.ts +92 -0
- package/src/ink/hooks/use-interval.ts +67 -0
- package/src/ink/hooks/use-search-highlight.ts +53 -0
- package/src/ink/hooks/use-selection.ts +104 -0
- package/src/ink/hooks/use-stdin.ts +8 -0
- package/src/ink/hooks/use-tab-status.ts +72 -0
- package/src/ink/hooks/use-terminal-focus.ts +16 -0
- package/src/ink/hooks/use-terminal-title.ts +31 -0
- package/src/ink/hooks/use-terminal-viewport.ts +96 -0
- package/src/ink/ink.tsx +1728 -0
- package/src/ink/instances.ts +10 -0
- package/src/ink/layout/engine.ts +6 -0
- package/src/ink/layout/geometry.ts +97 -0
- package/src/ink/layout/node.ts +152 -0
- package/src/ink/layout/yoga.ts +308 -0
- package/src/ink/line-width-cache.ts +24 -0
- package/src/ink/log-update.ts +773 -0
- package/src/ink/measure-element.ts +23 -0
- package/src/ink/measure-text.ts +47 -0
- package/src/ink/node-cache.ts +54 -0
- package/src/ink/optimizer.ts +93 -0
- package/src/ink/output.ts +797 -0
- package/src/ink/parse-keypress.ts +801 -0
- package/src/ink/reconciler.ts +512 -0
- package/src/ink/render-border.ts +231 -0
- package/src/ink/render-node-to-output.ts +1462 -0
- package/src/ink/render-to-screen.ts +231 -0
- package/src/ink/renderer.ts +178 -0
- package/src/ink/root.ts +184 -0
- package/src/ink/screen.ts +1486 -0
- package/src/ink/searchHighlight.ts +93 -0
- package/src/ink/selection.ts +917 -0
- package/src/ink/squash-text-nodes.ts +92 -0
- package/src/ink/stringWidth.ts +222 -0
- package/src/ink/styles.ts +771 -0
- package/src/ink/supports-hyperlinks.ts +57 -0
- package/src/ink/tabstops.ts +46 -0
- package/src/ink/terminal-focus-state.ts +47 -0
- package/src/ink/terminal-querier.ts +212 -0
- package/src/ink/terminal.ts +248 -0
- package/src/ink/termio/ansi.ts +75 -0
- package/src/ink/termio/csi.ts +319 -0
- package/src/ink/termio/dec.ts +60 -0
- package/src/ink/termio/esc.ts +67 -0
- package/src/ink/termio/osc.ts +493 -0
- package/src/ink/termio/parser.ts +394 -0
- package/src/ink/termio/sgr.ts +308 -0
- package/src/ink/termio/tokenize.ts +319 -0
- package/src/ink/termio/types.ts +236 -0
- package/src/ink/termio.ts +42 -0
- package/src/ink/useTerminalNotification.ts +126 -0
- package/src/ink/warn.ts +9 -0
- package/src/ink/widest-line.ts +19 -0
- package/src/ink/wrap-text.ts +74 -0
- package/src/ink/wrapAnsi.ts +20 -0
- package/src/ink.ts +85 -0
- package/src/interactiveHelpers.tsx +367 -0
- package/src/keybindings/KeybindingContext.tsx +243 -0
- package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
- package/src/keybindings/defaultBindings.ts +340 -0
- package/src/keybindings/loadUserBindings.ts +472 -0
- package/src/keybindings/match.ts +120 -0
- package/src/keybindings/parser.ts +203 -0
- package/src/keybindings/reservedShortcuts.ts +127 -0
- package/src/keybindings/resolver.ts +244 -0
- package/src/keybindings/schema.ts +236 -0
- package/src/keybindings/shortcutFormat.ts +63 -0
- package/src/keybindings/template.ts +52 -0
- package/src/keybindings/useKeybinding.ts +196 -0
- package/src/keybindings/useShortcutDisplay.ts +59 -0
- package/src/keybindings/validate.ts +498 -0
- package/src/main.tsx +4684 -0
- package/src/memdir/findRelevantMemories.ts +141 -0
- package/src/memdir/memdir.ts +507 -0
- package/src/memdir/memoryAge.ts +53 -0
- package/src/memdir/memoryScan.ts +94 -0
- package/src/memdir/memoryTypes.ts +271 -0
- package/src/memdir/paths.ts +278 -0
- package/src/memdir/teamMemPaths.ts +292 -0
- package/src/memdir/teamMemPrompts.ts +100 -0
- package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
- package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
- package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
- package/src/migrations/migrateFennecToOpus.ts +45 -0
- package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
- package/src/migrations/migrateOpusToOpus1m.ts +43 -0
- package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
- package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
- package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
- package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
- package/src/migrations/resetProToOpusDefault.ts +51 -0
- package/src/moreright/useMoreRight.tsx +26 -0
- package/src/native-ts/color-diff/index.ts +999 -0
- package/src/native-ts/file-index/index.ts +370 -0
- package/src/native-ts/yoga-layout/enums.ts +134 -0
- package/src/native-ts/yoga-layout/index.ts +2578 -0
- package/src/outputStyles/loadOutputStylesDir.ts +98 -0
- package/src/plugins/builtinPlugins.ts +159 -0
- package/src/plugins/bundled/index.ts +23 -0
- package/src/projectOnboardingState.ts +83 -0
- package/src/query/config.ts +46 -0
- package/src/query/deps.ts +40 -0
- package/src/query/stopHooks.ts +473 -0
- package/src/query/tokenBudget.ts +93 -0
- package/src/query.ts +1729 -0
- package/src/remote/RemoteSessionManager.ts +343 -0
- package/src/remote/SessionsWebSocket.ts +404 -0
- package/src/remote/remotePermissionBridge.ts +78 -0
- package/src/remote/sdkMessageAdapter.ts +302 -0
- package/src/replLauncher.tsx +23 -0
- package/src/schemas/hooks.ts +222 -0
- package/src/screens/Doctor.tsx +575 -0
- package/src/screens/REPL.tsx +5006 -0
- package/src/screens/ResumeConversation.tsx +399 -0
- package/src/server/createDirectConnectSession.ts +88 -0
- package/src/server/directConnectManager.ts +213 -0
- package/src/server/types.ts +57 -0
- package/src/services/AgentSummary/agentSummary.ts +179 -0
- package/src/services/MagicDocs/magicDocs.ts +254 -0
- package/src/services/MagicDocs/prompts.ts +127 -0
- package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/src/services/PromptSuggestion/speculation.ts +991 -0
- package/src/services/SessionMemory/prompts.ts +324 -0
- package/src/services/SessionMemory/sessionMemory.ts +495 -0
- package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/src/services/analytics/config.ts +38 -0
- package/src/services/analytics/datadog.ts +307 -0
- package/src/services/analytics/firstPartyEventLogger.ts +449 -0
- package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/src/services/analytics/growthbook.ts +1157 -0
- package/src/services/analytics/index.ts +173 -0
- package/src/services/analytics/metadata.ts +973 -0
- package/src/services/analytics/sink.ts +114 -0
- package/src/services/analytics/sinkKillswitch.ts +25 -0
- package/src/services/api/adminRequests.ts +119 -0
- package/src/services/api/bootstrap.ts +142 -0
- package/src/services/api/claude.ts +3433 -0
- package/src/services/api/client.ts +395 -0
- package/src/services/api/dumpPrompts.ts +226 -0
- package/src/services/api/emptyUsage.ts +22 -0
- package/src/services/api/errorUtils.ts +260 -0
- package/src/services/api/errors.ts +1207 -0
- package/src/services/api/filesApi.ts +748 -0
- package/src/services/api/firstTokenDate.ts +60 -0
- package/src/services/api/grove.ts +357 -0
- package/src/services/api/logging.ts +788 -0
- package/src/services/api/metricsOptOut.ts +159 -0
- package/src/services/api/overageCreditGrant.ts +137 -0
- package/src/services/api/promptCacheBreakDetection.ts +727 -0
- package/src/services/api/referral.ts +281 -0
- package/src/services/api/sessionIngress.ts +514 -0
- package/src/services/api/ultrareviewQuota.ts +38 -0
- package/src/services/api/usage.ts +63 -0
- package/src/services/api/withRetry.ts +826 -0
- package/src/services/autoDream/autoDream.ts +324 -0
- package/src/services/autoDream/config.ts +21 -0
- package/src/services/autoDream/consolidationLock.ts +140 -0
- package/src/services/autoDream/consolidationPrompt.ts +65 -0
- package/src/services/awaySummary.ts +74 -0
- package/src/services/claudeAiLimits.ts +515 -0
- package/src/services/claudeAiLimitsHook.ts +23 -0
- package/src/services/compact/apiMicrocompact.ts +153 -0
- package/src/services/compact/autoCompact.ts +351 -0
- package/src/services/compact/compact.ts +1705 -0
- package/src/services/compact/compactWarningHook.ts +16 -0
- package/src/services/compact/compactWarningState.ts +18 -0
- package/src/services/compact/grouping.ts +63 -0
- package/src/services/compact/microCompact.ts +530 -0
- package/src/services/compact/postCompactCleanup.ts +77 -0
- package/src/services/compact/prompt.ts +374 -0
- package/src/services/compact/sessionMemoryCompact.ts +630 -0
- package/src/services/compact/timeBasedMCConfig.ts +43 -0
- package/src/services/diagnosticTracking.ts +397 -0
- package/src/services/extractMemories/extractMemories.ts +615 -0
- package/src/services/extractMemories/prompts.ts +154 -0
- package/src/services/internalLogging.ts +90 -0
- package/src/services/lsp/LSPClient.ts +447 -0
- package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/src/services/lsp/LSPServerInstance.ts +511 -0
- package/src/services/lsp/LSPServerManager.ts +420 -0
- package/src/services/lsp/config.ts +79 -0
- package/src/services/lsp/manager.ts +289 -0
- package/src/services/lsp/passiveFeedback.ts +328 -0
- package/src/services/mcp/InProcessTransport.ts +63 -0
- package/src/services/mcp/MCPConnectionManager.tsx +73 -0
- package/src/services/mcp/SdkControlTransport.ts +136 -0
- package/src/services/mcp/auth.ts +2465 -0
- package/src/services/mcp/channelAllowlist.ts +76 -0
- package/src/services/mcp/channelNotification.ts +316 -0
- package/src/services/mcp/channelPermissions.ts +240 -0
- package/src/services/mcp/claudeai.ts +164 -0
- package/src/services/mcp/client.ts +3348 -0
- package/src/services/mcp/config.ts +1578 -0
- package/src/services/mcp/elicitationHandler.ts +313 -0
- package/src/services/mcp/envExpansion.ts +38 -0
- package/src/services/mcp/headersHelper.ts +138 -0
- package/src/services/mcp/mcpStringUtils.ts +106 -0
- package/src/services/mcp/normalization.ts +23 -0
- package/src/services/mcp/oauthPort.ts +78 -0
- package/src/services/mcp/officialRegistry.ts +72 -0
- package/src/services/mcp/types.ts +258 -0
- package/src/services/mcp/useManageMCPConnections.ts +1141 -0
- package/src/services/mcp/utils.ts +575 -0
- package/src/services/mcp/vscodeSdkMcp.ts +112 -0
- package/src/services/mcp/xaa.ts +511 -0
- package/src/services/mcp/xaaIdpLogin.ts +487 -0
- package/src/services/mcpServerApproval.tsx +41 -0
- package/src/services/mockRateLimits.ts +882 -0
- package/src/services/notifier.ts +156 -0
- package/src/services/oauth/auth-code-listener.ts +211 -0
- package/src/services/oauth/client.ts +566 -0
- package/src/services/oauth/crypto.ts +23 -0
- package/src/services/oauth/getOauthProfile.ts +53 -0
- package/src/services/oauth/index.ts +198 -0
- package/src/services/plugins/PluginInstallationManager.ts +184 -0
- package/src/services/plugins/pluginCliCommands.ts +344 -0
- package/src/services/plugins/pluginOperations.ts +1088 -0
- package/src/services/policyLimits/index.ts +664 -0
- package/src/services/policyLimits/types.ts +27 -0
- package/src/services/preventSleep.ts +165 -0
- package/src/services/rateLimitMessages.ts +344 -0
- package/src/services/rateLimitMocking.ts +144 -0
- package/src/services/remoteManagedSettings/index.ts +639 -0
- package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/src/services/remoteManagedSettings/syncCache.ts +112 -0
- package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/src/services/remoteManagedSettings/types.ts +31 -0
- package/src/services/settingsSync/index.ts +581 -0
- package/src/services/settingsSync/types.ts +67 -0
- package/src/services/teamMemorySync/index.ts +1256 -0
- package/src/services/teamMemorySync/secretScanner.ts +324 -0
- package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/src/services/teamMemorySync/types.ts +156 -0
- package/src/services/teamMemorySync/watcher.ts +387 -0
- package/src/services/tips/tipHistory.ts +17 -0
- package/src/services/tips/tipRegistry.ts +686 -0
- package/src/services/tips/tipScheduler.ts +58 -0
- package/src/services/tokenEstimation.ts +495 -0
- package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/src/services/tools/StreamingToolExecutor.ts +530 -0
- package/src/services/tools/toolExecution.ts +1745 -0
- package/src/services/tools/toolHooks.ts +650 -0
- package/src/services/tools/toolOrchestration.ts +188 -0
- package/src/services/vcr.ts +406 -0
- package/src/services/voice.ts +525 -0
- package/src/services/voiceKeyterms.ts +106 -0
- package/src/services/voiceStreamSTT.ts +544 -0
- package/src/setup.ts +477 -0
- package/src/skills/bundled/batch.ts +124 -0
- package/src/skills/bundled/claudeApi.ts +196 -0
- package/src/skills/bundled/claudeApiContent.ts +75 -0
- package/src/skills/bundled/claudeInChrome.ts +34 -0
- package/src/skills/bundled/debug.ts +103 -0
- package/src/skills/bundled/index.ts +79 -0
- package/src/skills/bundled/keybindings.ts +339 -0
- package/src/skills/bundled/loop.ts +92 -0
- package/src/skills/bundled/loremIpsum.ts +282 -0
- package/src/skills/bundled/remember.ts +82 -0
- package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
- package/src/skills/bundled/simplify.ts +69 -0
- package/src/skills/bundled/skillify.ts +197 -0
- package/src/skills/bundled/stuck.ts +79 -0
- package/src/skills/bundled/updateConfig.ts +475 -0
- package/src/skills/bundled/verify.ts +30 -0
- package/src/skills/bundled/verifyContent.ts +13 -0
- package/src/skills/bundledSkills.ts +220 -0
- package/src/skills/loadSkillsDir.ts +1086 -0
- package/src/skills/mcpSkillBuilders.ts +44 -0
- package/src/state/AppState.tsx +200 -0
- package/src/state/AppStateStore.ts +569 -0
- package/src/state/onChangeAppState.ts +171 -0
- package/src/state/selectors.ts +76 -0
- package/src/state/store.ts +34 -0
- package/src/state/teammateViewHelpers.ts +141 -0
- package/src/tasks/DreamTask/DreamTask.ts +157 -0
- package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
- package/src/tasks/InProcessTeammateTask/types.ts +121 -0
- package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
- package/src/tasks/LocalMainSessionTask.ts +479 -0
- package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
- package/src/tasks/LocalShellTask/guards.ts +41 -0
- package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
- package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
- package/src/tasks/pillLabel.ts +82 -0
- package/src/tasks/stopTask.ts +100 -0
- package/src/tasks/types.ts +46 -0
- package/src/tasks.ts +39 -0
- package/src/tools/AgentTool/AgentTool.tsx +1398 -0
- package/src/tools/AgentTool/UI.tsx +872 -0
- package/src/tools/AgentTool/agentColorManager.ts +66 -0
- package/src/tools/AgentTool/agentDisplay.ts +104 -0
- package/src/tools/AgentTool/agentMemory.ts +177 -0
- package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/src/tools/AgentTool/agentToolUtils.ts +686 -0
- package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/src/tools/AgentTool/builtInAgents.ts +72 -0
- package/src/tools/AgentTool/constants.ts +12 -0
- package/src/tools/AgentTool/forkSubagent.ts +210 -0
- package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/src/tools/AgentTool/prompt.ts +287 -0
- package/src/tools/AgentTool/resumeAgent.ts +265 -0
- package/src/tools/AgentTool/runAgent.ts +973 -0
- package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/src/tools/BashTool/BashTool.tsx +1144 -0
- package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/src/tools/BashTool/UI.tsx +185 -0
- package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/src/tools/BashTool/bashPermissions.ts +2621 -0
- package/src/tools/BashTool/bashSecurity.ts +2592 -0
- package/src/tools/BashTool/commandSemantics.ts +140 -0
- package/src/tools/BashTool/commentLabel.ts +13 -0
- package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/src/tools/BashTool/modeValidation.ts +115 -0
- package/src/tools/BashTool/pathValidation.ts +1303 -0
- package/src/tools/BashTool/prompt.ts +369 -0
- package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/src/tools/BashTool/sedEditParser.ts +322 -0
- package/src/tools/BashTool/sedValidation.ts +684 -0
- package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/src/tools/BashTool/toolName.ts +2 -0
- package/src/tools/BashTool/utils.ts +223 -0
- package/src/tools/BriefTool/BriefTool.ts +204 -0
- package/src/tools/BriefTool/UI.tsx +101 -0
- package/src/tools/BriefTool/attachments.ts +110 -0
- package/src/tools/BriefTool/prompt.ts +22 -0
- package/src/tools/BriefTool/upload.ts +174 -0
- package/src/tools/ConfigTool/ConfigTool.ts +467 -0
- package/src/tools/ConfigTool/UI.tsx +38 -0
- package/src/tools/ConfigTool/constants.ts +1 -0
- package/src/tools/ConfigTool/prompt.ts +93 -0
- package/src/tools/ConfigTool/supportedSettings.ts +211 -0
- package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/src/tools/EnterPlanModeTool/constants.ts +1 -0
- package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/src/tools/EnterWorktreeTool/constants.ts +1 -0
- package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/src/tools/ExitPlanModeTool/constants.ts +2 -0
- package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/src/tools/ExitWorktreeTool/constants.ts +1 -0
- package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/src/tools/FileEditTool/FileEditTool.ts +625 -0
- package/src/tools/FileEditTool/UI.tsx +289 -0
- package/src/tools/FileEditTool/constants.ts +11 -0
- package/src/tools/FileEditTool/prompt.ts +28 -0
- package/src/tools/FileEditTool/types.ts +85 -0
- package/src/tools/FileEditTool/utils.ts +775 -0
- package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/src/tools/FileReadTool/UI.tsx +185 -0
- package/src/tools/FileReadTool/imageProcessor.ts +94 -0
- package/src/tools/FileReadTool/limits.ts +92 -0
- package/src/tools/FileReadTool/prompt.ts +49 -0
- package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/src/tools/FileWriteTool/UI.tsx +405 -0
- package/src/tools/FileWriteTool/prompt.ts +18 -0
- package/src/tools/GlobTool/GlobTool.ts +198 -0
- package/src/tools/GlobTool/UI.tsx +63 -0
- package/src/tools/GlobTool/prompt.ts +7 -0
- package/src/tools/GrepTool/GrepTool.ts +577 -0
- package/src/tools/GrepTool/UI.tsx +201 -0
- package/src/tools/GrepTool/prompt.ts +18 -0
- package/src/tools/LSPTool/LSPTool.ts +860 -0
- package/src/tools/LSPTool/UI.tsx +228 -0
- package/src/tools/LSPTool/formatters.ts +592 -0
- package/src/tools/LSPTool/prompt.ts +21 -0
- package/src/tools/LSPTool/schemas.ts +215 -0
- package/src/tools/LSPTool/symbolContext.ts +90 -0
- package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/src/tools/MCPTool/MCPTool.ts +77 -0
- package/src/tools/MCPTool/UI.tsx +403 -0
- package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/src/tools/MCPTool/prompt.ts +3 -0
- package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/src/tools/NotebookEditTool/UI.tsx +93 -0
- package/src/tools/NotebookEditTool/constants.ts +2 -0
- package/src/tools/NotebookEditTool/prompt.ts +3 -0
- package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/src/tools/PowerShellTool/UI.tsx +131 -0
- package/src/tools/PowerShellTool/clmTypes.ts +211 -0
- package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/src/tools/PowerShellTool/commonParameters.ts +30 -0
- package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/src/tools/PowerShellTool/gitSafety.ts +176 -0
- package/src/tools/PowerShellTool/modeValidation.ts +404 -0
- package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/src/tools/PowerShellTool/prompt.ts +145 -0
- package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/src/tools/PowerShellTool/toolName.ts +2 -0
- package/src/tools/REPLTool/constants.ts +46 -0
- package/src/tools/REPLTool/primitiveTools.ts +39 -0
- package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/src/tools/ScheduleCronTool/UI.tsx +60 -0
- package/src/tools/ScheduleCronTool/prompt.ts +135 -0
- package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/src/tools/SendMessageTool/UI.tsx +31 -0
- package/src/tools/SendMessageTool/constants.ts +1 -0
- package/src/tools/SendMessageTool/prompt.ts +49 -0
- package/src/tools/SkillTool/SkillTool.ts +1108 -0
- package/src/tools/SkillTool/UI.tsx +128 -0
- package/src/tools/SkillTool/constants.ts +1 -0
- package/src/tools/SkillTool/prompt.ts +241 -0
- package/src/tools/SleepTool/prompt.ts +17 -0
- package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/src/tools/TaskCreateTool/constants.ts +1 -0
- package/src/tools/TaskCreateTool/prompt.ts +56 -0
- package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/src/tools/TaskGetTool/constants.ts +1 -0
- package/src/tools/TaskGetTool/prompt.ts +24 -0
- package/src/tools/TaskListTool/TaskListTool.ts +116 -0
- package/src/tools/TaskListTool/constants.ts +1 -0
- package/src/tools/TaskListTool/prompt.ts +49 -0
- package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/src/tools/TaskOutputTool/constants.ts +1 -0
- package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/src/tools/TaskStopTool/UI.tsx +41 -0
- package/src/tools/TaskStopTool/prompt.ts +8 -0
- package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/src/tools/TaskUpdateTool/constants.ts +1 -0
- package/src/tools/TaskUpdateTool/prompt.ts +77 -0
- package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/src/tools/TeamCreateTool/UI.tsx +6 -0
- package/src/tools/TeamCreateTool/constants.ts +1 -0
- package/src/tools/TeamCreateTool/prompt.ts +113 -0
- package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/src/tools/TeamDeleteTool/UI.tsx +20 -0
- package/src/tools/TeamDeleteTool/constants.ts +1 -0
- package/src/tools/TeamDeleteTool/prompt.ts +16 -0
- package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/src/tools/TodoWriteTool/constants.ts +1 -0
- package/src/tools/TodoWriteTool/prompt.ts +184 -0
- package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/src/tools/ToolSearchTool/constants.ts +1 -0
- package/src/tools/ToolSearchTool/prompt.ts +121 -0
- package/src/tools/TungstenTool/TungstenTool.js +2 -0
- package/src/tools/TungstenTool/TungstenTool.ts +1 -0
- package/src/tools/WebFetchTool/UI.tsx +72 -0
- package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/src/tools/WebFetchTool/preapproved.ts +166 -0
- package/src/tools/WebFetchTool/prompt.ts +46 -0
- package/src/tools/WebFetchTool/utils.ts +530 -0
- package/src/tools/WebSearchTool/UI.tsx +101 -0
- package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/src/tools/WebSearchTool/prompt.ts +34 -0
- package/src/tools/shared/gitOperationTracking.ts +277 -0
- package/src/tools/shared/spawnMultiAgent.ts +1093 -0
- package/src/tools/testing/TestingPermissionTool.tsx +74 -0
- package/src/tools/utils.ts +40 -0
- package/src/tools.ts +389 -0
- package/src/types/command.ts +216 -0
- package/src/types/connectorText.js +5 -0
- package/src/types/connectorText.ts +1 -0
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/src/types/generated/google/protobuf/timestamp.ts +187 -0
- package/src/types/hooks.ts +290 -0
- package/src/types/ids.ts +44 -0
- package/src/types/logs.ts +330 -0
- package/src/types/permissions.ts +441 -0
- package/src/types/plugin.ts +363 -0
- package/src/types/textInputTypes.ts +387 -0
- package/src/upstreamproxy/relay.ts +455 -0
- package/src/upstreamproxy/upstreamproxy.ts +285 -0
- package/src/utils/CircularBuffer.ts +84 -0
- package/src/utils/Cursor.ts +1530 -0
- package/src/utils/QueryGuard.ts +121 -0
- package/src/utils/Shell.ts +474 -0
- package/src/utils/ShellCommand.ts +465 -0
- package/src/utils/abortController.ts +99 -0
- package/src/utils/activityManager.ts +164 -0
- package/src/utils/advisor.ts +145 -0
- package/src/utils/agentContext.ts +178 -0
- package/src/utils/agentId.ts +99 -0
- package/src/utils/agentSwarmsEnabled.ts +44 -0
- package/src/utils/agenticSessionSearch.ts +307 -0
- package/src/utils/analyzeContext.ts +1382 -0
- package/src/utils/ansiToPng.ts +334 -0
- package/src/utils/ansiToSvg.ts +272 -0
- package/src/utils/api.ts +718 -0
- package/src/utils/apiPreconnect.ts +72 -0
- package/src/utils/appleTerminalBackup.ts +124 -0
- package/src/utils/argumentSubstitution.ts +145 -0
- package/src/utils/array.ts +13 -0
- package/src/utils/asciicast.ts +239 -0
- package/src/utils/attachments.ts +3997 -0
- package/src/utils/attribution.ts +393 -0
- package/src/utils/auth.ts +2007 -0
- package/src/utils/authFileDescriptor.ts +196 -0
- package/src/utils/authPortable.ts +19 -0
- package/src/utils/autoModeDenials.ts +26 -0
- package/src/utils/autoRunIssue.tsx +122 -0
- package/src/utils/autoUpdater.ts +562 -0
- package/src/utils/aws.ts +74 -0
- package/src/utils/awsAuthStatusManager.ts +81 -0
- package/src/utils/background/remote/preconditions.ts +235 -0
- package/src/utils/background/remote/remoteSession.ts +98 -0
- package/src/utils/backgroundHousekeeping.ts +94 -0
- package/src/utils/bash/ParsedCommand.ts +318 -0
- package/src/utils/bash/ShellSnapshot.ts +582 -0
- package/src/utils/bash/ast.ts +2679 -0
- package/src/utils/bash/bashParser.ts +4436 -0
- package/src/utils/bash/bashPipeCommand.ts +294 -0
- package/src/utils/bash/commands.ts +1339 -0
- package/src/utils/bash/heredoc.ts +733 -0
- package/src/utils/bash/parser.ts +230 -0
- package/src/utils/bash/prefix.ts +204 -0
- package/src/utils/bash/registry.ts +53 -0
- package/src/utils/bash/shellCompletion.ts +259 -0
- package/src/utils/bash/shellPrefix.ts +28 -0
- package/src/utils/bash/shellQuote.ts +304 -0
- package/src/utils/bash/shellQuoting.ts +128 -0
- package/src/utils/bash/specs/alias.ts +14 -0
- package/src/utils/bash/specs/index.ts +18 -0
- package/src/utils/bash/specs/nohup.ts +13 -0
- package/src/utils/bash/specs/pyright.ts +91 -0
- package/src/utils/bash/specs/sleep.ts +13 -0
- package/src/utils/bash/specs/srun.ts +31 -0
- package/src/utils/bash/specs/time.ts +13 -0
- package/src/utils/bash/specs/timeout.ts +20 -0
- package/src/utils/bash/treeSitterAnalysis.ts +506 -0
- package/src/utils/betas.ts +438 -0
- package/src/utils/billing.ts +78 -0
- package/src/utils/binaryCheck.ts +53 -0
- package/src/utils/browser.ts +68 -0
- package/src/utils/bufferedWriter.ts +100 -0
- package/src/utils/bundledMode.ts +22 -0
- package/src/utils/caCerts.ts +115 -0
- package/src/utils/caCertsConfig.ts +88 -0
- package/src/utils/cachePaths.ts +38 -0
- package/src/utils/classifierApprovals.ts +88 -0
- package/src/utils/classifierApprovalsHook.ts +17 -0
- package/src/utils/claudeCodeHints.ts +193 -0
- package/src/utils/claudeDesktop.ts +152 -0
- package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/src/utils/claudeInChrome/common.ts +540 -0
- package/src/utils/claudeInChrome/mcpServer.ts +293 -0
- package/src/utils/claudeInChrome/prompt.ts +83 -0
- package/src/utils/claudeInChrome/setup.ts +400 -0
- package/src/utils/claudeInChrome/setupPortable.ts +233 -0
- package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/src/utils/claudemd.ts +1479 -0
- package/src/utils/cleanup.ts +602 -0
- package/src/utils/cleanupRegistry.ts +25 -0
- package/src/utils/cliArgs.ts +60 -0
- package/src/utils/cliHighlight.ts +54 -0
- package/src/utils/codeIndexing.ts +206 -0
- package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/src/utils/collapseHookSummaries.ts +59 -0
- package/src/utils/collapseReadSearch.ts +1109 -0
- package/src/utils/collapseTeammateShutdowns.ts +55 -0
- package/src/utils/combinedAbortSignal.ts +47 -0
- package/src/utils/commandLifecycle.ts +21 -0
- package/src/utils/commitAttribution.ts +961 -0
- package/src/utils/completionCache.ts +166 -0
- package/src/utils/computerUse/appNames.ts +196 -0
- package/src/utils/computerUse/cleanup.ts +86 -0
- package/src/utils/computerUse/common.ts +61 -0
- package/src/utils/computerUse/computerUseLock.ts +215 -0
- package/src/utils/computerUse/drainRunLoop.ts +79 -0
- package/src/utils/computerUse/escHotkey.ts +54 -0
- package/src/utils/computerUse/executor.ts +658 -0
- package/src/utils/computerUse/gates.ts +72 -0
- package/src/utils/computerUse/hostAdapter.ts +69 -0
- package/src/utils/computerUse/inputLoader.ts +30 -0
- package/src/utils/computerUse/mcpServer.ts +106 -0
- package/src/utils/computerUse/setup.ts +53 -0
- package/src/utils/computerUse/swiftLoader.ts +23 -0
- package/src/utils/computerUse/toolRendering.tsx +125 -0
- package/src/utils/computerUse/wrapper.tsx +336 -0
- package/src/utils/concurrentSessions.ts +204 -0
- package/src/utils/config.ts +1817 -0
- package/src/utils/configConstants.ts +21 -0
- package/src/utils/contentArray.ts +51 -0
- package/src/utils/context.ts +221 -0
- package/src/utils/contextAnalysis.ts +272 -0
- package/src/utils/contextSuggestions.ts +235 -0
- package/src/utils/controlMessageCompat.ts +32 -0
- package/src/utils/conversationRecovery.ts +597 -0
- package/src/utils/cron.ts +308 -0
- package/src/utils/cronJitterConfig.ts +75 -0
- package/src/utils/cronScheduler.ts +565 -0
- package/src/utils/cronTasks.ts +458 -0
- package/src/utils/cronTasksLock.ts +195 -0
- package/src/utils/crossProjectResume.ts +75 -0
- package/src/utils/crypto.ts +13 -0
- package/src/utils/cwd.ts +32 -0
- package/src/utils/debug.ts +268 -0
- package/src/utils/debugFilter.ts +157 -0
- package/src/utils/deepLink/banner.ts +123 -0
- package/src/utils/deepLink/parseDeepLink.ts +170 -0
- package/src/utils/deepLink/protocolHandler.ts +136 -0
- package/src/utils/deepLink/registerProtocol.ts +348 -0
- package/src/utils/deepLink/terminalLauncher.ts +557 -0
- package/src/utils/deepLink/terminalPreference.ts +54 -0
- package/src/utils/desktopDeepLink.ts +236 -0
- package/src/utils/detectRepository.ts +178 -0
- package/src/utils/diagLogs.ts +94 -0
- package/src/utils/diff.ts +177 -0
- package/src/utils/directMemberMessage.ts +69 -0
- package/src/utils/displayTags.ts +51 -0
- package/src/utils/doctorContextWarnings.ts +265 -0
- package/src/utils/doctorDiagnostic.ts +625 -0
- package/src/utils/dxt/helpers.ts +88 -0
- package/src/utils/dxt/zip.ts +226 -0
- package/src/utils/earlyInput.ts +191 -0
- package/src/utils/editor.ts +183 -0
- package/src/utils/effort.ts +329 -0
- package/src/utils/embeddedTools.ts +29 -0
- package/src/utils/env.ts +347 -0
- package/src/utils/envDynamic.ts +151 -0
- package/src/utils/envUtils.ts +183 -0
- package/src/utils/envValidation.ts +38 -0
- package/src/utils/errorLogSink.ts +235 -0
- package/src/utils/errors.ts +238 -0
- package/src/utils/exampleCommands.ts +184 -0
- package/src/utils/execFileNoThrow.ts +150 -0
- package/src/utils/execFileNoThrowPortable.ts +89 -0
- package/src/utils/execSyncWrapper.ts +38 -0
- package/src/utils/exportRenderer.tsx +98 -0
- package/src/utils/extraUsage.ts +23 -0
- package/src/utils/fastMode.ts +532 -0
- package/src/utils/file.ts +584 -0
- package/src/utils/fileHistory.ts +1115 -0
- package/src/utils/fileOperationAnalytics.ts +71 -0
- package/src/utils/filePersistence/filePersistence.ts +287 -0
- package/src/utils/filePersistence/outputsScanner.ts +126 -0
- package/src/utils/fileRead.ts +102 -0
- package/src/utils/fileReadCache.ts +96 -0
- package/src/utils/fileStateCache.ts +142 -0
- package/src/utils/findExecutable.ts +17 -0
- package/src/utils/fingerprint.ts +76 -0
- package/src/utils/forkedAgent.ts +689 -0
- package/src/utils/format.ts +308 -0
- package/src/utils/formatBriefTimestamp.ts +81 -0
- package/src/utils/fpsTracker.ts +47 -0
- package/src/utils/frontmatterParser.ts +370 -0
- package/src/utils/fsOperations.ts +770 -0
- package/src/utils/fullscreen.ts +202 -0
- package/src/utils/generatedFiles.ts +136 -0
- package/src/utils/generators.ts +88 -0
- package/src/utils/genericProcessUtils.ts +184 -0
- package/src/utils/getWorktreePaths.ts +70 -0
- package/src/utils/getWorktreePathsPortable.ts +27 -0
- package/src/utils/ghPrStatus.ts +106 -0
- package/src/utils/git/gitConfigParser.ts +277 -0
- package/src/utils/git/gitFilesystem.ts +699 -0
- package/src/utils/git/gitignore.ts +99 -0
- package/src/utils/git.ts +926 -0
- package/src/utils/gitDiff.ts +532 -0
- package/src/utils/gitSettings.ts +18 -0
- package/src/utils/github/ghAuthStatus.ts +29 -0
- package/src/utils/githubRepoPathMapping.ts +162 -0
- package/src/utils/glob.ts +130 -0
- package/src/utils/gracefulShutdown.ts +529 -0
- package/src/utils/groupToolUses.ts +182 -0
- package/src/utils/handlePromptSubmit.ts +610 -0
- package/src/utils/hash.ts +46 -0
- package/src/utils/headlessProfiler.ts +178 -0
- package/src/utils/heapDumpService.ts +303 -0
- package/src/utils/heatmap.ts +198 -0
- package/src/utils/highlightMatch.tsx +28 -0
- package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/src/utils/hooks/execAgentHook.ts +339 -0
- package/src/utils/hooks/execHttpHook.ts +242 -0
- package/src/utils/hooks/execPromptHook.ts +211 -0
- package/src/utils/hooks/fileChangedWatcher.ts +191 -0
- package/src/utils/hooks/hookEvents.ts +192 -0
- package/src/utils/hooks/hookHelpers.ts +83 -0
- package/src/utils/hooks/hooksConfigManager.ts +400 -0
- package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/src/utils/hooks/hooksSettings.ts +271 -0
- package/src/utils/hooks/postSamplingHooks.ts +70 -0
- package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/src/utils/hooks/registerSkillHooks.ts +64 -0
- package/src/utils/hooks/sessionHooks.ts +447 -0
- package/src/utils/hooks/skillImprovement.ts +267 -0
- package/src/utils/hooks/ssrfGuard.ts +294 -0
- package/src/utils/hooks.ts +5022 -0
- package/src/utils/horizontalScroll.ts +137 -0
- package/src/utils/http.ts +136 -0
- package/src/utils/hyperlink.ts +39 -0
- package/src/utils/iTermBackup.ts +73 -0
- package/src/utils/ide.ts +1494 -0
- package/src/utils/idePathConversion.ts +90 -0
- package/src/utils/idleTimeout.ts +53 -0
- package/src/utils/imagePaste.ts +416 -0
- package/src/utils/imageResizer.ts +880 -0
- package/src/utils/imageStore.ts +167 -0
- package/src/utils/imageValidation.ts +104 -0
- package/src/utils/immediateCommand.ts +15 -0
- package/src/utils/inProcessTeammateHelpers.ts +102 -0
- package/src/utils/ink.ts +26 -0
- package/src/utils/intl.ts +94 -0
- package/src/utils/jetbrains.ts +191 -0
- package/src/utils/json.ts +277 -0
- package/src/utils/jsonRead.ts +16 -0
- package/src/utils/keyboardShortcuts.ts +14 -0
- package/src/utils/lazySchema.ts +8 -0
- package/src/utils/listSessionsImpl.ts +454 -0
- package/src/utils/localInstaller.ts +162 -0
- package/src/utils/lockfile.ts +43 -0
- package/src/utils/log.ts +362 -0
- package/src/utils/logoV2Utils.ts +350 -0
- package/src/utils/mailbox.ts +73 -0
- package/src/utils/managedEnv.ts +199 -0
- package/src/utils/managedEnvConstants.ts +191 -0
- package/src/utils/markdown.ts +381 -0
- package/src/utils/markdownConfigLoader.ts +600 -0
- package/src/utils/mcp/dateTimeParser.ts +121 -0
- package/src/utils/mcp/elicitationValidation.ts +336 -0
- package/src/utils/mcpInstructionsDelta.ts +130 -0
- package/src/utils/mcpOutputStorage.ts +189 -0
- package/src/utils/mcpValidation.ts +208 -0
- package/src/utils/mcpWebSocketTransport.ts +200 -0
- package/src/utils/memoize.ts +269 -0
- package/src/utils/memory/types.ts +12 -0
- package/src/utils/memory/versions.ts +8 -0
- package/src/utils/memoryFileDetection.ts +289 -0
- package/src/utils/messagePredicates.ts +8 -0
- package/src/utils/messageQueueManager.ts +547 -0
- package/src/utils/messages/mappers.ts +290 -0
- package/src/utils/messages/systemInit.ts +96 -0
- package/src/utils/messages.ts +5512 -0
- package/src/utils/model/agent.ts +157 -0
- package/src/utils/model/aliases.ts +25 -0
- package/src/utils/model/antModels.ts +64 -0
- package/src/utils/model/bedrock.ts +265 -0
- package/src/utils/model/check1mAccess.ts +72 -0
- package/src/utils/model/configs.ts +118 -0
- package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/src/utils/model/deprecation.ts +101 -0
- package/src/utils/model/model.ts +634 -0
- package/src/utils/model/modelAllowlist.ts +170 -0
- package/src/utils/model/modelCapabilities.ts +118 -0
- package/src/utils/model/modelOptions.ts +540 -0
- package/src/utils/model/modelStrings.ts +166 -0
- package/src/utils/model/modelSupportOverrides.ts +50 -0
- package/src/utils/model/providers.ts +46 -0
- package/src/utils/model/validateModel.ts +159 -0
- package/src/utils/modelCost.ts +235 -0
- package/src/utils/modifiers.ts +36 -0
- package/src/utils/mtls.ts +179 -0
- package/src/utils/nativeInstaller/download.ts +523 -0
- package/src/utils/nativeInstaller/index.ts +18 -0
- package/src/utils/nativeInstaller/installer.ts +1708 -0
- package/src/utils/nativeInstaller/packageManagers.ts +336 -0
- package/src/utils/nativeInstaller/pidLock.ts +433 -0
- package/src/utils/notebook.ts +224 -0
- package/src/utils/objectGroupBy.ts +18 -0
- package/src/utils/pasteStore.ts +104 -0
- package/src/utils/path.ts +155 -0
- package/src/utils/pdf.ts +300 -0
- package/src/utils/pdfUtils.ts +70 -0
- package/src/utils/peerAddress.ts +21 -0
- package/src/utils/permissions/PermissionMode.ts +141 -0
- package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/src/utils/permissions/PermissionResult.ts +35 -0
- package/src/utils/permissions/PermissionRule.ts +40 -0
- package/src/utils/permissions/PermissionUpdate.ts +389 -0
- package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/src/utils/permissions/autoModeState.ts +39 -0
- package/src/utils/permissions/bashClassifier.ts +61 -0
- package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/src/utils/permissions/classifierDecision.ts +98 -0
- package/src/utils/permissions/classifierShared.ts +39 -0
- package/src/utils/permissions/dangerousPatterns.ts +80 -0
- package/src/utils/permissions/denialTracking.ts +45 -0
- package/src/utils/permissions/filesystem.ts +1777 -0
- package/src/utils/permissions/getNextPermissionMode.ts +101 -0
- package/src/utils/permissions/pathValidation.ts +485 -0
- package/src/utils/permissions/permissionExplainer.ts +250 -0
- package/src/utils/permissions/permissionRuleParser.ts +198 -0
- package/src/utils/permissions/permissionSetup.ts +1532 -0
- package/src/utils/permissions/permissions.ts +1486 -0
- package/src/utils/permissions/permissionsLoader.ts +296 -0
- package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/src/utils/permissions/shellRuleMatching.ts +228 -0
- package/src/utils/permissions/yoloClassifier.ts +1495 -0
- package/src/utils/planModeV2.ts +95 -0
- package/src/utils/plans.ts +397 -0
- package/src/utils/platform.ts +150 -0
- package/src/utils/plugins/addDirPluginSettings.ts +71 -0
- package/src/utils/plugins/cacheUtils.ts +196 -0
- package/src/utils/plugins/dependencyResolver.ts +305 -0
- package/src/utils/plugins/fetchTelemetry.ts +135 -0
- package/src/utils/plugins/gitAvailability.ts +69 -0
- package/src/utils/plugins/headlessPluginInstall.ts +174 -0
- package/src/utils/plugins/hintRecommendation.ts +164 -0
- package/src/utils/plugins/installCounts.ts +292 -0
- package/src/utils/plugins/installedPluginsManager.ts +1268 -0
- package/src/utils/plugins/loadPluginAgents.ts +348 -0
- package/src/utils/plugins/loadPluginCommands.ts +946 -0
- package/src/utils/plugins/loadPluginHooks.ts +287 -0
- package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/src/utils/plugins/lspPluginIntegration.ts +387 -0
- package/src/utils/plugins/lspRecommendation.ts +374 -0
- package/src/utils/plugins/managedPlugins.ts +27 -0
- package/src/utils/plugins/marketplaceHelpers.ts +592 -0
- package/src/utils/plugins/marketplaceManager.ts +2643 -0
- package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/src/utils/plugins/mcpbHandler.ts +968 -0
- package/src/utils/plugins/officialMarketplace.ts +25 -0
- package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/src/utils/plugins/performStartupChecks.tsx +70 -0
- package/src/utils/plugins/pluginAutoupdate.ts +284 -0
- package/src/utils/plugins/pluginBlocklist.ts +127 -0
- package/src/utils/plugins/pluginDirectories.ts +178 -0
- package/src/utils/plugins/pluginFlagging.ts +208 -0
- package/src/utils/plugins/pluginIdentifier.ts +123 -0
- package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/src/utils/plugins/pluginLoader.ts +3302 -0
- package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/src/utils/plugins/pluginPolicy.ts +20 -0
- package/src/utils/plugins/pluginStartupCheck.ts +341 -0
- package/src/utils/plugins/pluginVersioning.ts +157 -0
- package/src/utils/plugins/reconciler.ts +265 -0
- package/src/utils/plugins/refresh.ts +215 -0
- package/src/utils/plugins/schemas.ts +1681 -0
- package/src/utils/plugins/validatePlugin.ts +903 -0
- package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/src/utils/plugins/zipCache.ts +406 -0
- package/src/utils/plugins/zipCacheAdapters.ts +164 -0
- package/src/utils/powershell/dangerousCmdlets.ts +185 -0
- package/src/utils/powershell/parser.ts +1804 -0
- package/src/utils/powershell/staticPrefix.ts +316 -0
- package/src/utils/preflightChecks.tsx +151 -0
- package/src/utils/privacyLevel.ts +55 -0
- package/src/utils/process.ts +68 -0
- package/src/utils/processUserInput/processBashCommand.tsx +140 -0
- package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/src/utils/processUserInput/processTextPrompt.ts +100 -0
- package/src/utils/processUserInput/processUserInput.ts +605 -0
- package/src/utils/profilerBase.ts +46 -0
- package/src/utils/promptCategory.ts +49 -0
- package/src/utils/promptEditor.ts +188 -0
- package/src/utils/promptShellExecution.ts +183 -0
- package/src/utils/proxy.ts +426 -0
- package/src/utils/queryContext.ts +179 -0
- package/src/utils/queryHelpers.ts +552 -0
- package/src/utils/queryProfiler.ts +301 -0
- package/src/utils/queueProcessor.ts +95 -0
- package/src/utils/readEditContext.ts +227 -0
- package/src/utils/readFileInRange.ts +383 -0
- package/src/utils/releaseNotes.ts +360 -0
- package/src/utils/renderOptions.ts +77 -0
- package/src/utils/ripgrep.ts +679 -0
- package/src/utils/sandbox/sandbox-adapter.ts +985 -0
- package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/src/utils/sanitization.ts +91 -0
- package/src/utils/screenshotClipboard.ts +121 -0
- package/src/utils/sdkEventQueue.ts +134 -0
- package/src/utils/secureStorage/fallbackStorage.ts +70 -0
- package/src/utils/secureStorage/index.ts +17 -0
- package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/src/utils/secureStorage/plainTextStorage.ts +84 -0
- package/src/utils/semanticBoolean.ts +29 -0
- package/src/utils/semanticNumber.ts +36 -0
- package/src/utils/semver.ts +59 -0
- package/src/utils/sequential.ts +56 -0
- package/src/utils/sessionActivity.ts +133 -0
- package/src/utils/sessionEnvVars.ts +22 -0
- package/src/utils/sessionEnvironment.ts +166 -0
- package/src/utils/sessionFileAccessHooks.ts +250 -0
- package/src/utils/sessionIngressAuth.ts +140 -0
- package/src/utils/sessionRestore.ts +551 -0
- package/src/utils/sessionStart.ts +232 -0
- package/src/utils/sessionState.ts +150 -0
- package/src/utils/sessionStorage.ts +5105 -0
- package/src/utils/sessionStoragePortable.ts +793 -0
- package/src/utils/sessionTitle.ts +129 -0
- package/src/utils/sessionUrl.ts +64 -0
- package/src/utils/set.ts +53 -0
- package/src/utils/settings/allErrors.ts +32 -0
- package/src/utils/settings/applySettingsChange.ts +92 -0
- package/src/utils/settings/changeDetector.ts +488 -0
- package/src/utils/settings/constants.ts +202 -0
- package/src/utils/settings/internalWrites.ts +37 -0
- package/src/utils/settings/managedPath.ts +34 -0
- package/src/utils/settings/mdm/constants.ts +81 -0
- package/src/utils/settings/mdm/rawRead.ts +130 -0
- package/src/utils/settings/mdm/settings.ts +316 -0
- package/src/utils/settings/permissionValidation.ts +262 -0
- package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/src/utils/settings/schemaOutput.ts +8 -0
- package/src/utils/settings/settings.ts +1015 -0
- package/src/utils/settings/settingsCache.ts +80 -0
- package/src/utils/settings/toolValidationConfig.ts +103 -0
- package/src/utils/settings/types.ts +1148 -0
- package/src/utils/settings/validateEditTool.ts +45 -0
- package/src/utils/settings/validation.ts +265 -0
- package/src/utils/settings/validationTips.ts +164 -0
- package/src/utils/shell/bashProvider.ts +255 -0
- package/src/utils/shell/outputLimits.ts +14 -0
- package/src/utils/shell/powershellDetection.ts +107 -0
- package/src/utils/shell/powershellProvider.ts +123 -0
- package/src/utils/shell/prefix.ts +367 -0
- package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/src/utils/shell/resolveDefaultShell.ts +14 -0
- package/src/utils/shell/shellProvider.ts +33 -0
- package/src/utils/shell/shellToolUtils.ts +22 -0
- package/src/utils/shell/specPrefix.ts +241 -0
- package/src/utils/shellConfig.ts +167 -0
- package/src/utils/sideQuery.ts +222 -0
- package/src/utils/sideQuestion.ts +155 -0
- package/src/utils/signal.ts +43 -0
- package/src/utils/sinks.ts +16 -0
- package/src/utils/skills/skillChangeDetector.ts +311 -0
- package/src/utils/slashCommandParsing.ts +60 -0
- package/src/utils/sleep.ts +84 -0
- package/src/utils/sliceAnsi.ts +91 -0
- package/src/utils/slowOperations.ts +286 -0
- package/src/utils/standaloneAgent.ts +23 -0
- package/src/utils/startupProfiler.ts +194 -0
- package/src/utils/staticRender.tsx +116 -0
- package/src/utils/stats.ts +1061 -0
- package/src/utils/statsCache.ts +434 -0
- package/src/utils/status.tsx +362 -0
- package/src/utils/statusNoticeDefinitions.tsx +198 -0
- package/src/utils/statusNoticeHelpers.ts +20 -0
- package/src/utils/stream.ts +76 -0
- package/src/utils/streamJsonStdoutGuard.ts +123 -0
- package/src/utils/streamlinedTransform.ts +201 -0
- package/src/utils/stringUtils.ts +235 -0
- package/src/utils/subprocessEnv.ts +99 -0
- package/src/utils/suggestions/commandSuggestions.ts +567 -0
- package/src/utils/suggestions/directoryCompletion.ts +263 -0
- package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/src/utils/suggestions/skillUsageTracking.ts +55 -0
- package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/src/utils/swarm/backends/ITermBackend.ts +370 -0
- package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/src/utils/swarm/backends/detection.ts +128 -0
- package/src/utils/swarm/backends/it2Setup.ts +245 -0
- package/src/utils/swarm/backends/registry.ts +464 -0
- package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/src/utils/swarm/backends/types.ts +311 -0
- package/src/utils/swarm/constants.ts +33 -0
- package/src/utils/swarm/inProcessRunner.ts +1552 -0
- package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/src/utils/swarm/permissionSync.ts +928 -0
- package/src/utils/swarm/reconnection.ts +119 -0
- package/src/utils/swarm/spawnInProcess.ts +328 -0
- package/src/utils/swarm/spawnUtils.ts +146 -0
- package/src/utils/swarm/teamHelpers.ts +683 -0
- package/src/utils/swarm/teammateInit.ts +129 -0
- package/src/utils/swarm/teammateLayoutManager.ts +107 -0
- package/src/utils/swarm/teammateModel.ts +10 -0
- package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/src/utils/systemDirectories.ts +74 -0
- package/src/utils/systemPrompt.ts +123 -0
- package/src/utils/systemPromptType.ts +14 -0
- package/src/utils/systemTheme.ts +119 -0
- package/src/utils/taggedId.ts +54 -0
- package/src/utils/task/TaskOutput.ts +390 -0
- package/src/utils/task/diskOutput.ts +451 -0
- package/src/utils/task/framework.ts +308 -0
- package/src/utils/task/outputFormatting.ts +38 -0
- package/src/utils/task/sdkProgress.ts +36 -0
- package/src/utils/tasks.ts +862 -0
- package/src/utils/teamDiscovery.ts +81 -0
- package/src/utils/teamMemoryOps.ts +88 -0
- package/src/utils/teammate.ts +292 -0
- package/src/utils/teammateContext.ts +96 -0
- package/src/utils/teammateMailbox.ts +1183 -0
- package/src/utils/telemetry/betaSessionTracing.ts +491 -0
- package/src/utils/telemetry/bigqueryExporter.ts +252 -0
- package/src/utils/telemetry/events.ts +75 -0
- package/src/utils/telemetry/instrumentation.ts +825 -0
- package/src/utils/telemetry/logger.ts +26 -0
- package/src/utils/telemetry/perfettoTracing.ts +1120 -0
- package/src/utils/telemetry/pluginTelemetry.ts +289 -0
- package/src/utils/telemetry/sessionTracing.ts +927 -0
- package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/src/utils/telemetryAttributes.ts +71 -0
- package/src/utils/teleport/api.ts +466 -0
- package/src/utils/teleport/environmentSelection.ts +77 -0
- package/src/utils/teleport/environments.ts +120 -0
- package/src/utils/teleport/gitBundle.ts +292 -0
- package/src/utils/teleport.tsx +1226 -0
- package/src/utils/tempfile.ts +31 -0
- package/src/utils/terminal.ts +131 -0
- package/src/utils/terminalPanel.ts +191 -0
- package/src/utils/textHighlighting.ts +166 -0
- package/src/utils/theme.ts +639 -0
- package/src/utils/thinking.ts +162 -0
- package/src/utils/timeouts.ts +39 -0
- package/src/utils/tmuxSocket.ts +427 -0
- package/src/utils/todo/types.ts +18 -0
- package/src/utils/tokenBudget.ts +73 -0
- package/src/utils/tokens.ts +261 -0
- package/src/utils/toolErrors.ts +132 -0
- package/src/utils/toolPool.ts +79 -0
- package/src/utils/toolResultStorage.ts +1040 -0
- package/src/utils/toolSchemaCache.ts +26 -0
- package/src/utils/toolSearch.ts +756 -0
- package/src/utils/transcriptSearch.ts +202 -0
- package/src/utils/treeify.ts +170 -0
- package/src/utils/truncate.ts +179 -0
- package/src/utils/ultraplan/ccrSession.ts +349 -0
- package/src/utils/ultraplan/keyword.ts +127 -0
- package/src/utils/ultraplan/prompt.txt +1 -0
- package/src/utils/unaryLogging.ts +39 -0
- package/src/utils/undercover.ts +89 -0
- package/src/utils/user.ts +194 -0
- package/src/utils/userAgent.ts +10 -0
- package/src/utils/userPromptKeywords.ts +27 -0
- package/src/utils/uuid.ts +27 -0
- package/src/utils/warningHandler.ts +121 -0
- package/src/utils/which.ts +82 -0
- package/src/utils/windowsPaths.ts +173 -0
- package/src/utils/withResolvers.ts +13 -0
- package/src/utils/words.ts +800 -0
- package/src/utils/workloadContext.ts +57 -0
- package/src/utils/worktree.ts +1519 -0
- package/src/utils/worktreeModeEnabled.ts +11 -0
- package/src/utils/xdg.ts +65 -0
- package/src/utils/xml.ts +16 -0
- package/src/utils/yaml.ts +15 -0
- package/src/utils/zodToJsonSchema.ts +23 -0
- package/src/vim/motions.ts +82 -0
- package/src/vim/operators.ts +556 -0
- package/src/vim/textObjects.ts +186 -0
- package/src/vim/transitions.ts +490 -0
- package/src/vim/types.ts +199 -0
- package/src/voice/voiceModeEnabled.ts +54 -0
- package/start.js +1 -0
|
@@ -0,0 +1,1705 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import type { UUID } from 'crypto'
|
|
3
|
+
import uniqBy from 'lodash-es/uniqBy.js'
|
|
4
|
+
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
6
|
+
const sessionTranscriptModule = feature('KAIROS')
|
|
7
|
+
? (require('../sessionTranscript/sessionTranscript.js') as typeof import('../sessionTranscript/sessionTranscript.js'))
|
|
8
|
+
: null
|
|
9
|
+
|
|
10
|
+
import { APIUserAbortError } from '@anthropic-ai/sdk'
|
|
11
|
+
import { markPostCompaction } from 'src/bootstrap/state.js'
|
|
12
|
+
import { getInvokedSkillsForAgent } from '../../bootstrap/state.js'
|
|
13
|
+
import type { QuerySource } from '../../constants/querySource.js'
|
|
14
|
+
import type { CanUseToolFn } from '../../hooks/useCanUseTool.js'
|
|
15
|
+
import type { Tool, ToolUseContext } from '../../Tool.js'
|
|
16
|
+
import type { LocalAgentTaskState } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
|
|
17
|
+
import { FileReadTool } from '../../tools/FileReadTool/FileReadTool.js'
|
|
18
|
+
import {
|
|
19
|
+
FILE_READ_TOOL_NAME,
|
|
20
|
+
FILE_UNCHANGED_STUB,
|
|
21
|
+
} from '../../tools/FileReadTool/prompt.js'
|
|
22
|
+
import { ToolSearchTool } from '../../tools/ToolSearchTool/ToolSearchTool.js'
|
|
23
|
+
import type { AgentId } from '../../types/ids.js'
|
|
24
|
+
import type {
|
|
25
|
+
AssistantMessage,
|
|
26
|
+
AttachmentMessage,
|
|
27
|
+
HookResultMessage,
|
|
28
|
+
Message,
|
|
29
|
+
PartialCompactDirection,
|
|
30
|
+
SystemCompactBoundaryMessage,
|
|
31
|
+
SystemMessage,
|
|
32
|
+
UserMessage,
|
|
33
|
+
} from '../../types/message.js'
|
|
34
|
+
import {
|
|
35
|
+
createAttachmentMessage,
|
|
36
|
+
generateFileAttachment,
|
|
37
|
+
getAgentListingDeltaAttachment,
|
|
38
|
+
getDeferredToolsDeltaAttachment,
|
|
39
|
+
getMcpInstructionsDeltaAttachment,
|
|
40
|
+
} from '../../utils/attachments.js'
|
|
41
|
+
import { getMemoryPath } from '../../utils/config.js'
|
|
42
|
+
import { COMPACT_MAX_OUTPUT_TOKENS } from '../../utils/context.js'
|
|
43
|
+
import {
|
|
44
|
+
analyzeContext,
|
|
45
|
+
tokenStatsToStatsigMetrics,
|
|
46
|
+
} from '../../utils/contextAnalysis.js'
|
|
47
|
+
import { logForDebugging } from '../../utils/debug.js'
|
|
48
|
+
import { hasExactErrorMessage } from '../../utils/errors.js'
|
|
49
|
+
import { cacheToObject } from '../../utils/fileStateCache.js'
|
|
50
|
+
import {
|
|
51
|
+
type CacheSafeParams,
|
|
52
|
+
runForkedAgent,
|
|
53
|
+
} from '../../utils/forkedAgent.js'
|
|
54
|
+
import {
|
|
55
|
+
executePostCompactHooks,
|
|
56
|
+
executePreCompactHooks,
|
|
57
|
+
} from '../../utils/hooks.js'
|
|
58
|
+
import { logError } from '../../utils/log.js'
|
|
59
|
+
import { MEMORY_TYPE_VALUES } from '../../utils/memory/types.js'
|
|
60
|
+
import {
|
|
61
|
+
createCompactBoundaryMessage,
|
|
62
|
+
createUserMessage,
|
|
63
|
+
getAssistantMessageText,
|
|
64
|
+
getLastAssistantMessage,
|
|
65
|
+
getMessagesAfterCompactBoundary,
|
|
66
|
+
isCompactBoundaryMessage,
|
|
67
|
+
normalizeMessagesForAPI,
|
|
68
|
+
} from '../../utils/messages.js'
|
|
69
|
+
import { expandPath } from '../../utils/path.js'
|
|
70
|
+
import { getPlan, getPlanFilePath } from '../../utils/plans.js'
|
|
71
|
+
import {
|
|
72
|
+
isSessionActivityTrackingActive,
|
|
73
|
+
sendSessionActivitySignal,
|
|
74
|
+
} from '../../utils/sessionActivity.js'
|
|
75
|
+
import { processSessionStartHooks } from '../../utils/sessionStart.js'
|
|
76
|
+
import {
|
|
77
|
+
getTranscriptPath,
|
|
78
|
+
reAppendSessionMetadata,
|
|
79
|
+
} from '../../utils/sessionStorage.js'
|
|
80
|
+
import { sleep } from '../../utils/sleep.js'
|
|
81
|
+
import { jsonStringify } from '../../utils/slowOperations.js'
|
|
82
|
+
/* eslint-enable @typescript-eslint/no-require-imports */
|
|
83
|
+
import { asSystemPrompt } from '../../utils/systemPromptType.js'
|
|
84
|
+
import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
|
|
85
|
+
import {
|
|
86
|
+
getTokenUsage,
|
|
87
|
+
tokenCountFromLastAPIResponse,
|
|
88
|
+
tokenCountWithEstimation,
|
|
89
|
+
} from '../../utils/tokens.js'
|
|
90
|
+
import {
|
|
91
|
+
extractDiscoveredToolNames,
|
|
92
|
+
isToolSearchEnabled,
|
|
93
|
+
} from '../../utils/toolSearch.js'
|
|
94
|
+
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../analytics/growthbook.js'
|
|
95
|
+
import {
|
|
96
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
97
|
+
logEvent,
|
|
98
|
+
} from '../analytics/index.js'
|
|
99
|
+
import {
|
|
100
|
+
getMaxOutputTokensForModel,
|
|
101
|
+
queryModelWithStreaming,
|
|
102
|
+
} from '../api/claude.js'
|
|
103
|
+
import {
|
|
104
|
+
getPromptTooLongTokenGap,
|
|
105
|
+
PROMPT_TOO_LONG_ERROR_MESSAGE,
|
|
106
|
+
startsWithApiErrorPrefix,
|
|
107
|
+
} from '../api/errors.js'
|
|
108
|
+
import { notifyCompaction } from '../api/promptCacheBreakDetection.js'
|
|
109
|
+
import { getRetryDelay } from '../api/withRetry.js'
|
|
110
|
+
import { logPermissionContextForAnts } from '../internalLogging.js'
|
|
111
|
+
import {
|
|
112
|
+
roughTokenCountEstimation,
|
|
113
|
+
roughTokenCountEstimationForMessages,
|
|
114
|
+
} from '../tokenEstimation.js'
|
|
115
|
+
import { groupMessagesByApiRound } from './grouping.js'
|
|
116
|
+
import {
|
|
117
|
+
getCompactPrompt,
|
|
118
|
+
getCompactUserSummaryMessage,
|
|
119
|
+
getPartialCompactPrompt,
|
|
120
|
+
} from './prompt.js'
|
|
121
|
+
|
|
122
|
+
export const POST_COMPACT_MAX_FILES_TO_RESTORE = 5
|
|
123
|
+
export const POST_COMPACT_TOKEN_BUDGET = 50_000
|
|
124
|
+
export const POST_COMPACT_MAX_TOKENS_PER_FILE = 5_000
|
|
125
|
+
// Skills can be large (verify=18.7KB, claude-api=20.1KB). Previously re-injected
|
|
126
|
+
// unbounded on every compact → 5-10K tok/compact. Per-skill truncation beats
|
|
127
|
+
// dropping — instructions at the top of a skill file are usually the critical
|
|
128
|
+
// part. Budget sized to hold ~5 skills at the per-skill cap.
|
|
129
|
+
export const POST_COMPACT_MAX_TOKENS_PER_SKILL = 5_000
|
|
130
|
+
export const POST_COMPACT_SKILLS_TOKEN_BUDGET = 25_000
|
|
131
|
+
const MAX_COMPACT_STREAMING_RETRIES = 2
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Strip image blocks from user messages before sending for compaction.
|
|
135
|
+
* Images are not needed for generating a conversation summary and can
|
|
136
|
+
* cause the compaction API call itself to hit the prompt-too-long limit,
|
|
137
|
+
* especially in CCD sessions where users frequently attach images.
|
|
138
|
+
* Replaces image blocks with a text marker so the summary still notes
|
|
139
|
+
* that an image was shared.
|
|
140
|
+
*
|
|
141
|
+
* Note: Only user messages contain images (either directly attached or within
|
|
142
|
+
* tool_result content from tools). Assistant messages contain text, tool_use,
|
|
143
|
+
* and thinking blocks but not images.
|
|
144
|
+
*/
|
|
145
|
+
export function stripImagesFromMessages(messages: Message[]): Message[] {
|
|
146
|
+
return messages.map(message => {
|
|
147
|
+
if (message.type !== 'user') {
|
|
148
|
+
return message
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const content = message.message.content
|
|
152
|
+
if (!Array.isArray(content)) {
|
|
153
|
+
return message
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
let hasMediaBlock = false
|
|
157
|
+
const newContent = content.flatMap(block => {
|
|
158
|
+
if (block.type === 'image') {
|
|
159
|
+
hasMediaBlock = true
|
|
160
|
+
return [{ type: 'text' as const, text: '[image]' }]
|
|
161
|
+
}
|
|
162
|
+
if (block.type === 'document') {
|
|
163
|
+
hasMediaBlock = true
|
|
164
|
+
return [{ type: 'text' as const, text: '[document]' }]
|
|
165
|
+
}
|
|
166
|
+
// Also strip images/documents nested inside tool_result content arrays
|
|
167
|
+
if (block.type === 'tool_result' && Array.isArray(block.content)) {
|
|
168
|
+
let toolHasMedia = false
|
|
169
|
+
const newToolContent = block.content.map(item => {
|
|
170
|
+
if (item.type === 'image') {
|
|
171
|
+
toolHasMedia = true
|
|
172
|
+
return { type: 'text' as const, text: '[image]' }
|
|
173
|
+
}
|
|
174
|
+
if (item.type === 'document') {
|
|
175
|
+
toolHasMedia = true
|
|
176
|
+
return { type: 'text' as const, text: '[document]' }
|
|
177
|
+
}
|
|
178
|
+
return item
|
|
179
|
+
})
|
|
180
|
+
if (toolHasMedia) {
|
|
181
|
+
hasMediaBlock = true
|
|
182
|
+
return [{ ...block, content: newToolContent }]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return [block]
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
if (!hasMediaBlock) {
|
|
189
|
+
return message
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
...message,
|
|
194
|
+
message: {
|
|
195
|
+
...message.message,
|
|
196
|
+
content: newContent,
|
|
197
|
+
},
|
|
198
|
+
} as typeof message
|
|
199
|
+
})
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Strip attachment types that are re-injected post-compaction anyway.
|
|
204
|
+
* skill_discovery/skill_listing are re-surfaced by resetSentSkillNames()
|
|
205
|
+
* + the next turn's discovery signal, so feeding them to the summarizer
|
|
206
|
+
* wastes tokens and pollutes the summary with stale skill suggestions.
|
|
207
|
+
*
|
|
208
|
+
* No-op when EXPERIMENTAL_SKILL_SEARCH is off (the attachment types
|
|
209
|
+
* don't exist on external builds).
|
|
210
|
+
*/
|
|
211
|
+
export function stripReinjectedAttachments(messages: Message[]): Message[] {
|
|
212
|
+
if (feature('EXPERIMENTAL_SKILL_SEARCH')) {
|
|
213
|
+
return messages.filter(
|
|
214
|
+
m =>
|
|
215
|
+
!(
|
|
216
|
+
m.type === 'attachment' &&
|
|
217
|
+
(m.attachment.type === 'skill_discovery' ||
|
|
218
|
+
m.attachment.type === 'skill_listing')
|
|
219
|
+
),
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
return messages
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export const ERROR_MESSAGE_NOT_ENOUGH_MESSAGES =
|
|
226
|
+
'Not enough messages to compact.'
|
|
227
|
+
const MAX_PTL_RETRIES = 3
|
|
228
|
+
const PTL_RETRY_MARKER = '[earlier conversation truncated for compaction retry]'
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Drops the oldest API-round groups from messages until tokenGap is covered.
|
|
232
|
+
* Falls back to dropping 20% of groups when the gap is unparseable (some
|
|
233
|
+
* Vertex/Bedrock error formats). Returns null when nothing can be dropped
|
|
234
|
+
* without leaving an empty summarize set.
|
|
235
|
+
*
|
|
236
|
+
* This is the last-resort escape hatch for CC-1180 — when the compact request
|
|
237
|
+
* itself hits prompt-too-long, the user is otherwise stuck. Dropping the
|
|
238
|
+
* oldest context is lossy but unblocks them. The reactive-compact path
|
|
239
|
+
* (compactMessages.ts) has the proper retry loop that peels from the tail;
|
|
240
|
+
* this helper is the dumb-but-safe fallback for the proactive/manual path
|
|
241
|
+
* that wasn't migrated in bfdb472f's unification.
|
|
242
|
+
*/
|
|
243
|
+
export function truncateHeadForPTLRetry(
|
|
244
|
+
messages: Message[],
|
|
245
|
+
ptlResponse: AssistantMessage,
|
|
246
|
+
): Message[] | null {
|
|
247
|
+
// Strip our own synthetic marker from a previous retry before grouping.
|
|
248
|
+
// Otherwise it becomes its own group 0 and the 20% fallback stalls
|
|
249
|
+
// (drops only the marker, re-adds it, zero progress on retry 2+).
|
|
250
|
+
const input =
|
|
251
|
+
messages[0]?.type === 'user' &&
|
|
252
|
+
messages[0].isMeta &&
|
|
253
|
+
messages[0].message.content === PTL_RETRY_MARKER
|
|
254
|
+
? messages.slice(1)
|
|
255
|
+
: messages
|
|
256
|
+
|
|
257
|
+
const groups = groupMessagesByApiRound(input)
|
|
258
|
+
if (groups.length < 2) return null
|
|
259
|
+
|
|
260
|
+
const tokenGap = getPromptTooLongTokenGap(ptlResponse)
|
|
261
|
+
let dropCount: number
|
|
262
|
+
if (tokenGap !== undefined) {
|
|
263
|
+
let acc = 0
|
|
264
|
+
dropCount = 0
|
|
265
|
+
for (const g of groups) {
|
|
266
|
+
acc += roughTokenCountEstimationForMessages(g)
|
|
267
|
+
dropCount++
|
|
268
|
+
if (acc >= tokenGap) break
|
|
269
|
+
}
|
|
270
|
+
} else {
|
|
271
|
+
dropCount = Math.max(1, Math.floor(groups.length * 0.2))
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Keep at least one group so there's something to summarize.
|
|
275
|
+
dropCount = Math.min(dropCount, groups.length - 1)
|
|
276
|
+
if (dropCount < 1) return null
|
|
277
|
+
|
|
278
|
+
const sliced = groups.slice(dropCount).flat()
|
|
279
|
+
// groupMessagesByApiRound puts the preamble in group 0 and starts every
|
|
280
|
+
// subsequent group with an assistant message. Dropping group 0 leaves an
|
|
281
|
+
// assistant-first sequence which the API rejects (first message must be
|
|
282
|
+
// role=user). Prepend a synthetic user marker — ensureToolResultPairing
|
|
283
|
+
// already handles any orphaned tool_results this creates.
|
|
284
|
+
if (sliced[0]?.type === 'assistant') {
|
|
285
|
+
return [
|
|
286
|
+
createUserMessage({ content: PTL_RETRY_MARKER, isMeta: true }),
|
|
287
|
+
...sliced,
|
|
288
|
+
]
|
|
289
|
+
}
|
|
290
|
+
return sliced
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export const ERROR_MESSAGE_PROMPT_TOO_LONG =
|
|
294
|
+
'Conversation too long. Press esc twice to go up a few messages and try again.'
|
|
295
|
+
export const ERROR_MESSAGE_USER_ABORT = 'API Error: Request was aborted.'
|
|
296
|
+
export const ERROR_MESSAGE_INCOMPLETE_RESPONSE =
|
|
297
|
+
'Compaction interrupted · This may be due to network issues — please try again.'
|
|
298
|
+
|
|
299
|
+
export interface CompactionResult {
|
|
300
|
+
boundaryMarker: SystemMessage
|
|
301
|
+
summaryMessages: UserMessage[]
|
|
302
|
+
attachments: AttachmentMessage[]
|
|
303
|
+
hookResults: HookResultMessage[]
|
|
304
|
+
messagesToKeep?: Message[]
|
|
305
|
+
userDisplayMessage?: string
|
|
306
|
+
preCompactTokenCount?: number
|
|
307
|
+
postCompactTokenCount?: number
|
|
308
|
+
truePostCompactTokenCount?: number
|
|
309
|
+
compactionUsage?: ReturnType<typeof getTokenUsage>
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Diagnosis context passed from autoCompactIfNeeded into compactConversation.
|
|
314
|
+
* Lets the tengu_compact event disambiguate same-chain loops (H2) from
|
|
315
|
+
* cross-agent (H1/H5) and manual-vs-auto (H3) compactions without joins.
|
|
316
|
+
*/
|
|
317
|
+
export type RecompactionInfo = {
|
|
318
|
+
isRecompactionInChain: boolean
|
|
319
|
+
turnsSincePreviousCompact: number
|
|
320
|
+
previousCompactTurnId?: string
|
|
321
|
+
autoCompactThreshold: number
|
|
322
|
+
querySource?: QuerySource
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Build the base post-compact messages array from a CompactionResult.
|
|
327
|
+
* This ensures consistent ordering across all compaction paths.
|
|
328
|
+
* Order: boundaryMarker, summaryMessages, messagesToKeep, attachments, hookResults
|
|
329
|
+
*/
|
|
330
|
+
export function buildPostCompactMessages(result: CompactionResult): Message[] {
|
|
331
|
+
return [
|
|
332
|
+
result.boundaryMarker,
|
|
333
|
+
...result.summaryMessages,
|
|
334
|
+
...(result.messagesToKeep ?? []),
|
|
335
|
+
...result.attachments,
|
|
336
|
+
...result.hookResults,
|
|
337
|
+
]
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Annotate a compact boundary with relink metadata for messagesToKeep.
|
|
342
|
+
* Preserved messages keep their original parentUuids on disk (dedup-skipped);
|
|
343
|
+
* the loader uses this to patch head→anchor and anchor's-other-children→tail.
|
|
344
|
+
*
|
|
345
|
+
* `anchorUuid` = what sits immediately before keep[0] in the desired chain:
|
|
346
|
+
* - suffix-preserving (reactive/session-memory): last summary message
|
|
347
|
+
* - prefix-preserving (partial compact): the boundary itself
|
|
348
|
+
*/
|
|
349
|
+
export function annotateBoundaryWithPreservedSegment(
|
|
350
|
+
boundary: SystemCompactBoundaryMessage,
|
|
351
|
+
anchorUuid: UUID,
|
|
352
|
+
messagesToKeep: readonly Message[] | undefined,
|
|
353
|
+
): SystemCompactBoundaryMessage {
|
|
354
|
+
const keep = messagesToKeep ?? []
|
|
355
|
+
if (keep.length === 0) return boundary
|
|
356
|
+
return {
|
|
357
|
+
...boundary,
|
|
358
|
+
compactMetadata: {
|
|
359
|
+
...boundary.compactMetadata,
|
|
360
|
+
preservedSegment: {
|
|
361
|
+
headUuid: keep[0]!.uuid,
|
|
362
|
+
anchorUuid,
|
|
363
|
+
tailUuid: keep.at(-1)!.uuid,
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Merges user-supplied custom instructions with hook-provided instructions.
|
|
371
|
+
* User instructions come first; hook instructions are appended.
|
|
372
|
+
* Empty strings normalize to undefined.
|
|
373
|
+
*/
|
|
374
|
+
export function mergeHookInstructions(
|
|
375
|
+
userInstructions: string | undefined,
|
|
376
|
+
hookInstructions: string | undefined,
|
|
377
|
+
): string | undefined {
|
|
378
|
+
if (!hookInstructions) return userInstructions || undefined
|
|
379
|
+
if (!userInstructions) return hookInstructions
|
|
380
|
+
return `${userInstructions}\n\n${hookInstructions}`
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Creates a compact version of a conversation by summarizing older messages
|
|
385
|
+
* and preserving recent conversation history.
|
|
386
|
+
*/
|
|
387
|
+
export async function compactConversation(
|
|
388
|
+
messages: Message[],
|
|
389
|
+
context: ToolUseContext,
|
|
390
|
+
cacheSafeParams: CacheSafeParams,
|
|
391
|
+
suppressFollowUpQuestions: boolean,
|
|
392
|
+
customInstructions?: string,
|
|
393
|
+
isAutoCompact: boolean = false,
|
|
394
|
+
recompactionInfo?: RecompactionInfo,
|
|
395
|
+
): Promise<CompactionResult> {
|
|
396
|
+
try {
|
|
397
|
+
if (messages.length === 0) {
|
|
398
|
+
throw new Error(ERROR_MESSAGE_NOT_ENOUGH_MESSAGES)
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const preCompactTokenCount = tokenCountWithEstimation(messages)
|
|
402
|
+
|
|
403
|
+
const appState = context.getAppState()
|
|
404
|
+
void logPermissionContextForAnts(appState.toolPermissionContext, 'summary')
|
|
405
|
+
|
|
406
|
+
context.onCompactProgress?.({
|
|
407
|
+
type: 'hooks_start',
|
|
408
|
+
hookType: 'pre_compact',
|
|
409
|
+
})
|
|
410
|
+
|
|
411
|
+
// Execute PreCompact hooks
|
|
412
|
+
context.setSDKStatus?.('compacting')
|
|
413
|
+
const hookResult = await executePreCompactHooks(
|
|
414
|
+
{
|
|
415
|
+
trigger: isAutoCompact ? 'auto' : 'manual',
|
|
416
|
+
customInstructions: customInstructions ?? null,
|
|
417
|
+
},
|
|
418
|
+
context.abortController.signal,
|
|
419
|
+
)
|
|
420
|
+
customInstructions = mergeHookInstructions(
|
|
421
|
+
customInstructions,
|
|
422
|
+
hookResult.newCustomInstructions,
|
|
423
|
+
)
|
|
424
|
+
const userDisplayMessage = hookResult.userDisplayMessage
|
|
425
|
+
|
|
426
|
+
// Show requesting mode with up arrow and custom message
|
|
427
|
+
context.setStreamMode?.('requesting')
|
|
428
|
+
context.setResponseLength?.(() => 0)
|
|
429
|
+
context.onCompactProgress?.({ type: 'compact_start' })
|
|
430
|
+
|
|
431
|
+
// 3P default: true — forked-agent path reuses main conversation's prompt cache.
|
|
432
|
+
// Experiment (Jan 2026) confirmed: false path is 98% cache miss, costs ~0.76% of
|
|
433
|
+
// fleet cache_creation (~38B tok/day), concentrated in ephemeral envs (CCR/GHA/SDK)
|
|
434
|
+
// with cold GB cache and 3P providers where GB is disabled. GB gate kept as kill-switch.
|
|
435
|
+
const promptCacheSharingEnabled = getFeatureValue_CACHED_MAY_BE_STALE(
|
|
436
|
+
'tengu_compact_cache_prefix',
|
|
437
|
+
true,
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
const compactPrompt = getCompactPrompt(customInstructions)
|
|
441
|
+
const summaryRequest = createUserMessage({
|
|
442
|
+
content: compactPrompt,
|
|
443
|
+
})
|
|
444
|
+
|
|
445
|
+
let messagesToSummarize = messages
|
|
446
|
+
let retryCacheSafeParams = cacheSafeParams
|
|
447
|
+
let summaryResponse: AssistantMessage
|
|
448
|
+
let summary: string | null
|
|
449
|
+
let ptlAttempts = 0
|
|
450
|
+
for (;;) {
|
|
451
|
+
summaryResponse = await streamCompactSummary({
|
|
452
|
+
messages: messagesToSummarize,
|
|
453
|
+
summaryRequest,
|
|
454
|
+
appState,
|
|
455
|
+
context,
|
|
456
|
+
preCompactTokenCount,
|
|
457
|
+
cacheSafeParams: retryCacheSafeParams,
|
|
458
|
+
})
|
|
459
|
+
summary = getAssistantMessageText(summaryResponse)
|
|
460
|
+
if (!summary?.startsWith(PROMPT_TOO_LONG_ERROR_MESSAGE)) break
|
|
461
|
+
|
|
462
|
+
// CC-1180: compact request itself hit prompt-too-long. Truncate the
|
|
463
|
+
// oldest API-round groups and retry rather than leaving the user stuck.
|
|
464
|
+
ptlAttempts++
|
|
465
|
+
const truncated =
|
|
466
|
+
ptlAttempts <= MAX_PTL_RETRIES
|
|
467
|
+
? truncateHeadForPTLRetry(messagesToSummarize, summaryResponse)
|
|
468
|
+
: null
|
|
469
|
+
if (!truncated) {
|
|
470
|
+
logEvent('tengu_compact_failed', {
|
|
471
|
+
reason:
|
|
472
|
+
'prompt_too_long' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
473
|
+
preCompactTokenCount,
|
|
474
|
+
promptCacheSharingEnabled,
|
|
475
|
+
ptlAttempts,
|
|
476
|
+
})
|
|
477
|
+
throw new Error(ERROR_MESSAGE_PROMPT_TOO_LONG)
|
|
478
|
+
}
|
|
479
|
+
logEvent('tengu_compact_ptl_retry', {
|
|
480
|
+
attempt: ptlAttempts,
|
|
481
|
+
droppedMessages: messagesToSummarize.length - truncated.length,
|
|
482
|
+
remainingMessages: truncated.length,
|
|
483
|
+
})
|
|
484
|
+
messagesToSummarize = truncated
|
|
485
|
+
// The forked-agent path reads from cacheSafeParams.forkContextMessages,
|
|
486
|
+
// not the messages param — thread the truncated set through both paths.
|
|
487
|
+
retryCacheSafeParams = {
|
|
488
|
+
...retryCacheSafeParams,
|
|
489
|
+
forkContextMessages: truncated,
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (!summary) {
|
|
494
|
+
logForDebugging(
|
|
495
|
+
`Compact failed: no summary text in response. Response: ${jsonStringify(summaryResponse)}`,
|
|
496
|
+
{ level: 'error' },
|
|
497
|
+
)
|
|
498
|
+
logEvent('tengu_compact_failed', {
|
|
499
|
+
reason:
|
|
500
|
+
'no_summary' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
501
|
+
preCompactTokenCount,
|
|
502
|
+
promptCacheSharingEnabled,
|
|
503
|
+
})
|
|
504
|
+
throw new Error(
|
|
505
|
+
`Failed to generate conversation summary - response did not contain valid text content`,
|
|
506
|
+
)
|
|
507
|
+
} else if (startsWithApiErrorPrefix(summary)) {
|
|
508
|
+
logEvent('tengu_compact_failed', {
|
|
509
|
+
reason:
|
|
510
|
+
'api_error' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
511
|
+
preCompactTokenCount,
|
|
512
|
+
promptCacheSharingEnabled,
|
|
513
|
+
})
|
|
514
|
+
throw new Error(summary)
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Store the current file state before clearing
|
|
518
|
+
const preCompactReadFileState = cacheToObject(context.readFileState)
|
|
519
|
+
|
|
520
|
+
// Clear the cache
|
|
521
|
+
context.readFileState.clear()
|
|
522
|
+
context.loadedNestedMemoryPaths?.clear()
|
|
523
|
+
|
|
524
|
+
// Intentionally NOT resetting sentSkillNames: re-injecting the full
|
|
525
|
+
// skill_listing (~4K tokens) post-compact is pure cache_creation with
|
|
526
|
+
// marginal benefit. The model still has SkillTool in its schema and
|
|
527
|
+
// invoked_skills attachment (below) preserves used-skill content. Ants
|
|
528
|
+
// with EXPERIMENTAL_SKILL_SEARCH already skip re-injection via the
|
|
529
|
+
// early-return in getSkillListingAttachments.
|
|
530
|
+
|
|
531
|
+
// Run async attachment generation in parallel
|
|
532
|
+
const [fileAttachments, asyncAgentAttachments] = await Promise.all([
|
|
533
|
+
createPostCompactFileAttachments(
|
|
534
|
+
preCompactReadFileState,
|
|
535
|
+
context,
|
|
536
|
+
POST_COMPACT_MAX_FILES_TO_RESTORE,
|
|
537
|
+
),
|
|
538
|
+
createAsyncAgentAttachmentsIfNeeded(context),
|
|
539
|
+
])
|
|
540
|
+
|
|
541
|
+
const postCompactFileAttachments: AttachmentMessage[] = [
|
|
542
|
+
...fileAttachments,
|
|
543
|
+
...asyncAgentAttachments,
|
|
544
|
+
]
|
|
545
|
+
const planAttachment = createPlanAttachmentIfNeeded(context.agentId)
|
|
546
|
+
if (planAttachment) {
|
|
547
|
+
postCompactFileAttachments.push(planAttachment)
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Add plan mode instructions if currently in plan mode, so the model
|
|
551
|
+
// continues operating in plan mode after compaction
|
|
552
|
+
const planModeAttachment = await createPlanModeAttachmentIfNeeded(context)
|
|
553
|
+
if (planModeAttachment) {
|
|
554
|
+
postCompactFileAttachments.push(planModeAttachment)
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Add skill attachment if skills were invoked in this session
|
|
558
|
+
const skillAttachment = createSkillAttachmentIfNeeded(context.agentId)
|
|
559
|
+
if (skillAttachment) {
|
|
560
|
+
postCompactFileAttachments.push(skillAttachment)
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Compaction ate prior delta attachments. Re-announce from the current
|
|
564
|
+
// state so the model has tool/instruction context on the first
|
|
565
|
+
// post-compact turn. Empty message history → diff against nothing →
|
|
566
|
+
// announces the full set.
|
|
567
|
+
for (const att of getDeferredToolsDeltaAttachment(
|
|
568
|
+
context.options.tools,
|
|
569
|
+
context.options.mainLoopModel,
|
|
570
|
+
[],
|
|
571
|
+
{ callSite: 'compact_full' },
|
|
572
|
+
)) {
|
|
573
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
574
|
+
}
|
|
575
|
+
for (const att of getAgentListingDeltaAttachment(context, [])) {
|
|
576
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
577
|
+
}
|
|
578
|
+
for (const att of getMcpInstructionsDeltaAttachment(
|
|
579
|
+
context.options.mcpClients,
|
|
580
|
+
context.options.tools,
|
|
581
|
+
context.options.mainLoopModel,
|
|
582
|
+
[],
|
|
583
|
+
)) {
|
|
584
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
context.onCompactProgress?.({
|
|
588
|
+
type: 'hooks_start',
|
|
589
|
+
hookType: 'session_start',
|
|
590
|
+
})
|
|
591
|
+
// Execute SessionStart hooks after successful compaction
|
|
592
|
+
const hookMessages = await processSessionStartHooks('compact', {
|
|
593
|
+
model: context.options.mainLoopModel,
|
|
594
|
+
})
|
|
595
|
+
|
|
596
|
+
// Create the compact boundary marker and summary messages before the
|
|
597
|
+
// event so we can compute the true resulting-context size.
|
|
598
|
+
const boundaryMarker = createCompactBoundaryMessage(
|
|
599
|
+
isAutoCompact ? 'auto' : 'manual',
|
|
600
|
+
preCompactTokenCount ?? 0,
|
|
601
|
+
messages.at(-1)?.uuid,
|
|
602
|
+
)
|
|
603
|
+
// Carry loaded-tool state — the summary doesn't preserve tool_reference
|
|
604
|
+
// blocks, so the post-compact schema filter needs this to keep sending
|
|
605
|
+
// already-loaded deferred tool schemas to the API.
|
|
606
|
+
const preCompactDiscovered = extractDiscoveredToolNames(messages)
|
|
607
|
+
if (preCompactDiscovered.size > 0) {
|
|
608
|
+
boundaryMarker.compactMetadata.preCompactDiscoveredTools = [
|
|
609
|
+
...preCompactDiscovered,
|
|
610
|
+
].sort()
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
const transcriptPath = getTranscriptPath()
|
|
614
|
+
const summaryMessages: UserMessage[] = [
|
|
615
|
+
createUserMessage({
|
|
616
|
+
content: getCompactUserSummaryMessage(
|
|
617
|
+
summary,
|
|
618
|
+
suppressFollowUpQuestions,
|
|
619
|
+
transcriptPath,
|
|
620
|
+
),
|
|
621
|
+
isCompactSummary: true,
|
|
622
|
+
isVisibleInTranscriptOnly: true,
|
|
623
|
+
}),
|
|
624
|
+
]
|
|
625
|
+
|
|
626
|
+
// Previously "postCompactTokenCount" — renamed because this is the
|
|
627
|
+
// compact API call's total usage (input_tokens ≈ preCompactTokenCount),
|
|
628
|
+
// NOT the size of the resulting context. Kept for event-field continuity.
|
|
629
|
+
const compactionCallTotalTokens = tokenCountFromLastAPIResponse([
|
|
630
|
+
summaryResponse,
|
|
631
|
+
])
|
|
632
|
+
|
|
633
|
+
// Message-payload estimate of the resulting context. The next iteration's
|
|
634
|
+
// shouldAutoCompact will see this PLUS ~20-40K for system prompt + tools +
|
|
635
|
+
// userContext (via API usage.input_tokens). So `willRetriggerNextTurn: true`
|
|
636
|
+
// is a strong signal; `false` may still retrigger when this is close to threshold.
|
|
637
|
+
const truePostCompactTokenCount = roughTokenCountEstimationForMessages([
|
|
638
|
+
boundaryMarker,
|
|
639
|
+
...summaryMessages,
|
|
640
|
+
...postCompactFileAttachments,
|
|
641
|
+
...hookMessages,
|
|
642
|
+
])
|
|
643
|
+
|
|
644
|
+
// Extract compaction API usage metrics
|
|
645
|
+
const compactionUsage = getTokenUsage(summaryResponse)
|
|
646
|
+
|
|
647
|
+
const querySourceForEvent =
|
|
648
|
+
recompactionInfo?.querySource ?? context.options.querySource ?? 'unknown'
|
|
649
|
+
|
|
650
|
+
logEvent('tengu_compact', {
|
|
651
|
+
preCompactTokenCount,
|
|
652
|
+
// Kept for continuity — semantically the compact API call's total usage
|
|
653
|
+
postCompactTokenCount: compactionCallTotalTokens,
|
|
654
|
+
truePostCompactTokenCount,
|
|
655
|
+
autoCompactThreshold: recompactionInfo?.autoCompactThreshold ?? -1,
|
|
656
|
+
willRetriggerNextTurn:
|
|
657
|
+
recompactionInfo !== undefined &&
|
|
658
|
+
truePostCompactTokenCount >= recompactionInfo.autoCompactThreshold,
|
|
659
|
+
isAutoCompact,
|
|
660
|
+
querySource:
|
|
661
|
+
querySourceForEvent as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
662
|
+
queryChainId: (context.queryTracking?.chainId ??
|
|
663
|
+
'') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
664
|
+
queryDepth: context.queryTracking?.depth ?? -1,
|
|
665
|
+
isRecompactionInChain: recompactionInfo?.isRecompactionInChain ?? false,
|
|
666
|
+
turnsSincePreviousCompact:
|
|
667
|
+
recompactionInfo?.turnsSincePreviousCompact ?? -1,
|
|
668
|
+
previousCompactTurnId: (recompactionInfo?.previousCompactTurnId ??
|
|
669
|
+
'') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
670
|
+
compactionInputTokens: compactionUsage?.input_tokens,
|
|
671
|
+
compactionOutputTokens: compactionUsage?.output_tokens,
|
|
672
|
+
compactionCacheReadTokens: compactionUsage?.cache_read_input_tokens ?? 0,
|
|
673
|
+
compactionCacheCreationTokens:
|
|
674
|
+
compactionUsage?.cache_creation_input_tokens ?? 0,
|
|
675
|
+
compactionTotalTokens: compactionUsage
|
|
676
|
+
? compactionUsage.input_tokens +
|
|
677
|
+
(compactionUsage.cache_creation_input_tokens ?? 0) +
|
|
678
|
+
(compactionUsage.cache_read_input_tokens ?? 0) +
|
|
679
|
+
compactionUsage.output_tokens
|
|
680
|
+
: 0,
|
|
681
|
+
promptCacheSharingEnabled,
|
|
682
|
+
// analyzeContext walks every content block (~11ms on a 4.5K-message
|
|
683
|
+
// session) purely for this telemetry breakdown. Computed here, past
|
|
684
|
+
// the compaction-API await, so the sync walk doesn't starve the
|
|
685
|
+
// render loop before compaction even starts. Same deferral pattern
|
|
686
|
+
// as reactiveCompact.ts.
|
|
687
|
+
...(() => {
|
|
688
|
+
try {
|
|
689
|
+
return tokenStatsToStatsigMetrics(analyzeContext(messages))
|
|
690
|
+
} catch (error) {
|
|
691
|
+
logError(error as Error)
|
|
692
|
+
return {}
|
|
693
|
+
}
|
|
694
|
+
})(),
|
|
695
|
+
})
|
|
696
|
+
|
|
697
|
+
// Reset cache read baseline so the post-compact drop isn't flagged as a break
|
|
698
|
+
if (feature('PROMPT_CACHE_BREAK_DETECTION')) {
|
|
699
|
+
notifyCompaction(
|
|
700
|
+
context.options.querySource ?? 'compact',
|
|
701
|
+
context.agentId,
|
|
702
|
+
)
|
|
703
|
+
}
|
|
704
|
+
markPostCompaction()
|
|
705
|
+
|
|
706
|
+
// Re-append session metadata (custom title, tag) so it stays within
|
|
707
|
+
// the 16KB tail window that readLiteMetadata reads for --resume display.
|
|
708
|
+
// Without this, enough post-compaction messages push the metadata entry
|
|
709
|
+
// out of the window, causing --resume to show the auto-generated title
|
|
710
|
+
// instead of the user-set session name.
|
|
711
|
+
reAppendSessionMetadata()
|
|
712
|
+
|
|
713
|
+
// Write a reduced transcript segment for the pre-compaction messages
|
|
714
|
+
// (assistant mode only). Fire-and-forget — errors are logged internally.
|
|
715
|
+
if (feature('KAIROS')) {
|
|
716
|
+
void sessionTranscriptModule?.writeSessionTranscriptSegment(messages)
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
context.onCompactProgress?.({
|
|
720
|
+
type: 'hooks_start',
|
|
721
|
+
hookType: 'post_compact',
|
|
722
|
+
})
|
|
723
|
+
const postCompactHookResult = await executePostCompactHooks(
|
|
724
|
+
{
|
|
725
|
+
trigger: isAutoCompact ? 'auto' : 'manual',
|
|
726
|
+
compactSummary: summary,
|
|
727
|
+
},
|
|
728
|
+
context.abortController.signal,
|
|
729
|
+
)
|
|
730
|
+
|
|
731
|
+
const combinedUserDisplayMessage = [
|
|
732
|
+
userDisplayMessage,
|
|
733
|
+
postCompactHookResult.userDisplayMessage,
|
|
734
|
+
]
|
|
735
|
+
.filter(Boolean)
|
|
736
|
+
.join('\n')
|
|
737
|
+
|
|
738
|
+
return {
|
|
739
|
+
boundaryMarker,
|
|
740
|
+
summaryMessages,
|
|
741
|
+
attachments: postCompactFileAttachments,
|
|
742
|
+
hookResults: hookMessages,
|
|
743
|
+
userDisplayMessage: combinedUserDisplayMessage || undefined,
|
|
744
|
+
preCompactTokenCount,
|
|
745
|
+
postCompactTokenCount: compactionCallTotalTokens,
|
|
746
|
+
truePostCompactTokenCount,
|
|
747
|
+
compactionUsage,
|
|
748
|
+
}
|
|
749
|
+
} catch (error) {
|
|
750
|
+
// Only show the error notification for manual /compact.
|
|
751
|
+
// Auto-compact failures are retried on the next turn and the
|
|
752
|
+
// notification is confusing when compaction eventually succeeds.
|
|
753
|
+
if (!isAutoCompact) {
|
|
754
|
+
addErrorNotificationIfNeeded(error, context)
|
|
755
|
+
}
|
|
756
|
+
throw error
|
|
757
|
+
} finally {
|
|
758
|
+
context.setStreamMode?.('requesting')
|
|
759
|
+
context.setResponseLength?.(() => 0)
|
|
760
|
+
context.onCompactProgress?.({ type: 'compact_end' })
|
|
761
|
+
context.setSDKStatus?.(null)
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Performs a partial compaction around the selected message index.
|
|
767
|
+
* Direction 'from': summarizes messages after the index, keeps earlier ones.
|
|
768
|
+
* Prompt cache for kept (earlier) messages is preserved.
|
|
769
|
+
* Direction 'up_to': summarizes messages before the index, keeps later ones.
|
|
770
|
+
* Prompt cache is invalidated since the summary precedes the kept messages.
|
|
771
|
+
*/
|
|
772
|
+
export async function partialCompactConversation(
|
|
773
|
+
allMessages: Message[],
|
|
774
|
+
pivotIndex: number,
|
|
775
|
+
context: ToolUseContext,
|
|
776
|
+
cacheSafeParams: CacheSafeParams,
|
|
777
|
+
userFeedback?: string,
|
|
778
|
+
direction: PartialCompactDirection = 'from',
|
|
779
|
+
): Promise<CompactionResult> {
|
|
780
|
+
try {
|
|
781
|
+
const messagesToSummarize =
|
|
782
|
+
direction === 'up_to'
|
|
783
|
+
? allMessages.slice(0, pivotIndex)
|
|
784
|
+
: allMessages.slice(pivotIndex)
|
|
785
|
+
// 'up_to' must strip old compact boundaries/summaries: for 'up_to',
|
|
786
|
+
// summary_B sits BEFORE kept, so a stale boundary_A in kept wins
|
|
787
|
+
// findLastCompactBoundaryIndex's backward scan and drops summary_B.
|
|
788
|
+
// 'from' keeps them: summary_B sits AFTER kept (backward scan still
|
|
789
|
+
// works), and removing an old summary would lose its covered history.
|
|
790
|
+
const messagesToKeep =
|
|
791
|
+
direction === 'up_to'
|
|
792
|
+
? allMessages
|
|
793
|
+
.slice(pivotIndex)
|
|
794
|
+
.filter(
|
|
795
|
+
m =>
|
|
796
|
+
m.type !== 'progress' &&
|
|
797
|
+
!isCompactBoundaryMessage(m) &&
|
|
798
|
+
!(m.type === 'user' && m.isCompactSummary),
|
|
799
|
+
)
|
|
800
|
+
: allMessages.slice(0, pivotIndex).filter(m => m.type !== 'progress')
|
|
801
|
+
|
|
802
|
+
if (messagesToSummarize.length === 0) {
|
|
803
|
+
throw new Error(
|
|
804
|
+
direction === 'up_to'
|
|
805
|
+
? 'Nothing to summarize before the selected message.'
|
|
806
|
+
: 'Nothing to summarize after the selected message.',
|
|
807
|
+
)
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
const preCompactTokenCount = tokenCountWithEstimation(allMessages)
|
|
811
|
+
|
|
812
|
+
context.onCompactProgress?.({
|
|
813
|
+
type: 'hooks_start',
|
|
814
|
+
hookType: 'pre_compact',
|
|
815
|
+
})
|
|
816
|
+
|
|
817
|
+
context.setSDKStatus?.('compacting')
|
|
818
|
+
const hookResult = await executePreCompactHooks(
|
|
819
|
+
{
|
|
820
|
+
trigger: 'manual',
|
|
821
|
+
customInstructions: null,
|
|
822
|
+
},
|
|
823
|
+
context.abortController.signal,
|
|
824
|
+
)
|
|
825
|
+
|
|
826
|
+
// Merge hook instructions with user feedback
|
|
827
|
+
let customInstructions: string | undefined
|
|
828
|
+
if (hookResult.newCustomInstructions && userFeedback) {
|
|
829
|
+
customInstructions = `${hookResult.newCustomInstructions}\n\nUser context: ${userFeedback}`
|
|
830
|
+
} else if (hookResult.newCustomInstructions) {
|
|
831
|
+
customInstructions = hookResult.newCustomInstructions
|
|
832
|
+
} else if (userFeedback) {
|
|
833
|
+
customInstructions = `User context: ${userFeedback}`
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
context.setStreamMode?.('requesting')
|
|
837
|
+
context.setResponseLength?.(() => 0)
|
|
838
|
+
context.onCompactProgress?.({ type: 'compact_start' })
|
|
839
|
+
|
|
840
|
+
const compactPrompt = getPartialCompactPrompt(customInstructions, direction)
|
|
841
|
+
const summaryRequest = createUserMessage({
|
|
842
|
+
content: compactPrompt,
|
|
843
|
+
})
|
|
844
|
+
|
|
845
|
+
const failureMetadata = {
|
|
846
|
+
preCompactTokenCount,
|
|
847
|
+
direction:
|
|
848
|
+
direction as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
849
|
+
messagesSummarized: messagesToSummarize.length,
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
// 'up_to' prefix hits cache directly; 'from' sends all (tail wouldn't cache).
|
|
853
|
+
// PTL retry breaks the cache prefix but unblocks the user (CC-1180).
|
|
854
|
+
let apiMessages = direction === 'up_to' ? messagesToSummarize : allMessages
|
|
855
|
+
let retryCacheSafeParams =
|
|
856
|
+
direction === 'up_to'
|
|
857
|
+
? { ...cacheSafeParams, forkContextMessages: messagesToSummarize }
|
|
858
|
+
: cacheSafeParams
|
|
859
|
+
let summaryResponse: AssistantMessage
|
|
860
|
+
let summary: string | null
|
|
861
|
+
let ptlAttempts = 0
|
|
862
|
+
for (;;) {
|
|
863
|
+
summaryResponse = await streamCompactSummary({
|
|
864
|
+
messages: apiMessages,
|
|
865
|
+
summaryRequest,
|
|
866
|
+
appState: context.getAppState(),
|
|
867
|
+
context,
|
|
868
|
+
preCompactTokenCount,
|
|
869
|
+
cacheSafeParams: retryCacheSafeParams,
|
|
870
|
+
})
|
|
871
|
+
summary = getAssistantMessageText(summaryResponse)
|
|
872
|
+
if (!summary?.startsWith(PROMPT_TOO_LONG_ERROR_MESSAGE)) break
|
|
873
|
+
|
|
874
|
+
ptlAttempts++
|
|
875
|
+
const truncated =
|
|
876
|
+
ptlAttempts <= MAX_PTL_RETRIES
|
|
877
|
+
? truncateHeadForPTLRetry(apiMessages, summaryResponse)
|
|
878
|
+
: null
|
|
879
|
+
if (!truncated) {
|
|
880
|
+
logEvent('tengu_partial_compact_failed', {
|
|
881
|
+
reason:
|
|
882
|
+
'prompt_too_long' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
883
|
+
...failureMetadata,
|
|
884
|
+
ptlAttempts,
|
|
885
|
+
})
|
|
886
|
+
throw new Error(ERROR_MESSAGE_PROMPT_TOO_LONG)
|
|
887
|
+
}
|
|
888
|
+
logEvent('tengu_compact_ptl_retry', {
|
|
889
|
+
attempt: ptlAttempts,
|
|
890
|
+
droppedMessages: apiMessages.length - truncated.length,
|
|
891
|
+
remainingMessages: truncated.length,
|
|
892
|
+
path: 'partial' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
893
|
+
})
|
|
894
|
+
apiMessages = truncated
|
|
895
|
+
retryCacheSafeParams = {
|
|
896
|
+
...retryCacheSafeParams,
|
|
897
|
+
forkContextMessages: truncated,
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
if (!summary) {
|
|
901
|
+
logEvent('tengu_partial_compact_failed', {
|
|
902
|
+
reason:
|
|
903
|
+
'no_summary' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
904
|
+
...failureMetadata,
|
|
905
|
+
})
|
|
906
|
+
throw new Error(
|
|
907
|
+
'Failed to generate conversation summary - response did not contain valid text content',
|
|
908
|
+
)
|
|
909
|
+
} else if (startsWithApiErrorPrefix(summary)) {
|
|
910
|
+
logEvent('tengu_partial_compact_failed', {
|
|
911
|
+
reason:
|
|
912
|
+
'api_error' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
913
|
+
...failureMetadata,
|
|
914
|
+
})
|
|
915
|
+
throw new Error(summary)
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// Store the current file state before clearing
|
|
919
|
+
const preCompactReadFileState = cacheToObject(context.readFileState)
|
|
920
|
+
context.readFileState.clear()
|
|
921
|
+
context.loadedNestedMemoryPaths?.clear()
|
|
922
|
+
// Intentionally NOT resetting sentSkillNames — see compactConversation()
|
|
923
|
+
// for rationale (~4K tokens saved per compact event).
|
|
924
|
+
|
|
925
|
+
const [fileAttachments, asyncAgentAttachments] = await Promise.all([
|
|
926
|
+
createPostCompactFileAttachments(
|
|
927
|
+
preCompactReadFileState,
|
|
928
|
+
context,
|
|
929
|
+
POST_COMPACT_MAX_FILES_TO_RESTORE,
|
|
930
|
+
messagesToKeep,
|
|
931
|
+
),
|
|
932
|
+
createAsyncAgentAttachmentsIfNeeded(context),
|
|
933
|
+
])
|
|
934
|
+
|
|
935
|
+
const postCompactFileAttachments: AttachmentMessage[] = [
|
|
936
|
+
...fileAttachments,
|
|
937
|
+
...asyncAgentAttachments,
|
|
938
|
+
]
|
|
939
|
+
const planAttachment = createPlanAttachmentIfNeeded(context.agentId)
|
|
940
|
+
if (planAttachment) {
|
|
941
|
+
postCompactFileAttachments.push(planAttachment)
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
// Add plan mode instructions if currently in plan mode
|
|
945
|
+
const planModeAttachment = await createPlanModeAttachmentIfNeeded(context)
|
|
946
|
+
if (planModeAttachment) {
|
|
947
|
+
postCompactFileAttachments.push(planModeAttachment)
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
const skillAttachment = createSkillAttachmentIfNeeded(context.agentId)
|
|
951
|
+
if (skillAttachment) {
|
|
952
|
+
postCompactFileAttachments.push(skillAttachment)
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
// Re-announce only what was in the summarized portion — messagesToKeep
|
|
956
|
+
// is scanned, so anything already announced there is skipped.
|
|
957
|
+
for (const att of getDeferredToolsDeltaAttachment(
|
|
958
|
+
context.options.tools,
|
|
959
|
+
context.options.mainLoopModel,
|
|
960
|
+
messagesToKeep,
|
|
961
|
+
{ callSite: 'compact_partial' },
|
|
962
|
+
)) {
|
|
963
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
964
|
+
}
|
|
965
|
+
for (const att of getAgentListingDeltaAttachment(context, messagesToKeep)) {
|
|
966
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
967
|
+
}
|
|
968
|
+
for (const att of getMcpInstructionsDeltaAttachment(
|
|
969
|
+
context.options.mcpClients,
|
|
970
|
+
context.options.tools,
|
|
971
|
+
context.options.mainLoopModel,
|
|
972
|
+
messagesToKeep,
|
|
973
|
+
)) {
|
|
974
|
+
postCompactFileAttachments.push(createAttachmentMessage(att))
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
context.onCompactProgress?.({
|
|
978
|
+
type: 'hooks_start',
|
|
979
|
+
hookType: 'session_start',
|
|
980
|
+
})
|
|
981
|
+
const hookMessages = await processSessionStartHooks('compact', {
|
|
982
|
+
model: context.options.mainLoopModel,
|
|
983
|
+
})
|
|
984
|
+
|
|
985
|
+
const postCompactTokenCount = tokenCountFromLastAPIResponse([
|
|
986
|
+
summaryResponse,
|
|
987
|
+
])
|
|
988
|
+
const compactionUsage = getTokenUsage(summaryResponse)
|
|
989
|
+
|
|
990
|
+
logEvent('tengu_partial_compact', {
|
|
991
|
+
preCompactTokenCount,
|
|
992
|
+
postCompactTokenCount,
|
|
993
|
+
messagesKept: messagesToKeep.length,
|
|
994
|
+
messagesSummarized: messagesToSummarize.length,
|
|
995
|
+
direction:
|
|
996
|
+
direction as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
997
|
+
hasUserFeedback: !!userFeedback,
|
|
998
|
+
trigger:
|
|
999
|
+
'message_selector' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1000
|
+
compactionInputTokens: compactionUsage?.input_tokens,
|
|
1001
|
+
compactionOutputTokens: compactionUsage?.output_tokens,
|
|
1002
|
+
compactionCacheReadTokens: compactionUsage?.cache_read_input_tokens ?? 0,
|
|
1003
|
+
compactionCacheCreationTokens:
|
|
1004
|
+
compactionUsage?.cache_creation_input_tokens ?? 0,
|
|
1005
|
+
})
|
|
1006
|
+
|
|
1007
|
+
// Progress messages aren't loggable, so forkSessionImpl would null out
|
|
1008
|
+
// a logicalParentUuid pointing at one. Both directions skip them.
|
|
1009
|
+
const lastPreCompactUuid =
|
|
1010
|
+
direction === 'up_to'
|
|
1011
|
+
? allMessages.slice(0, pivotIndex).findLast(m => m.type !== 'progress')
|
|
1012
|
+
?.uuid
|
|
1013
|
+
: messagesToKeep.at(-1)?.uuid
|
|
1014
|
+
const boundaryMarker = createCompactBoundaryMessage(
|
|
1015
|
+
'manual',
|
|
1016
|
+
preCompactTokenCount ?? 0,
|
|
1017
|
+
lastPreCompactUuid,
|
|
1018
|
+
userFeedback,
|
|
1019
|
+
messagesToSummarize.length,
|
|
1020
|
+
)
|
|
1021
|
+
// allMessages not just messagesToSummarize — set union is idempotent,
|
|
1022
|
+
// simpler than tracking which half each tool lived in.
|
|
1023
|
+
const preCompactDiscovered = extractDiscoveredToolNames(allMessages)
|
|
1024
|
+
if (preCompactDiscovered.size > 0) {
|
|
1025
|
+
boundaryMarker.compactMetadata.preCompactDiscoveredTools = [
|
|
1026
|
+
...preCompactDiscovered,
|
|
1027
|
+
].sort()
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
const transcriptPath = getTranscriptPath()
|
|
1031
|
+
const summaryMessages: UserMessage[] = [
|
|
1032
|
+
createUserMessage({
|
|
1033
|
+
content: getCompactUserSummaryMessage(summary, false, transcriptPath),
|
|
1034
|
+
isCompactSummary: true,
|
|
1035
|
+
...(messagesToKeep.length > 0
|
|
1036
|
+
? {
|
|
1037
|
+
summarizeMetadata: {
|
|
1038
|
+
messagesSummarized: messagesToSummarize.length,
|
|
1039
|
+
userContext: userFeedback,
|
|
1040
|
+
direction,
|
|
1041
|
+
},
|
|
1042
|
+
}
|
|
1043
|
+
: { isVisibleInTranscriptOnly: true as const }),
|
|
1044
|
+
}),
|
|
1045
|
+
]
|
|
1046
|
+
|
|
1047
|
+
if (feature('PROMPT_CACHE_BREAK_DETECTION')) {
|
|
1048
|
+
notifyCompaction(
|
|
1049
|
+
context.options.querySource ?? 'compact',
|
|
1050
|
+
context.agentId,
|
|
1051
|
+
)
|
|
1052
|
+
}
|
|
1053
|
+
markPostCompaction()
|
|
1054
|
+
|
|
1055
|
+
// Re-append session metadata (custom title, tag) so it stays within
|
|
1056
|
+
// the 16KB tail window that readLiteMetadata reads for --resume display.
|
|
1057
|
+
reAppendSessionMetadata()
|
|
1058
|
+
|
|
1059
|
+
if (feature('KAIROS')) {
|
|
1060
|
+
void sessionTranscriptModule?.writeSessionTranscriptSegment(
|
|
1061
|
+
messagesToSummarize,
|
|
1062
|
+
)
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
context.onCompactProgress?.({
|
|
1066
|
+
type: 'hooks_start',
|
|
1067
|
+
hookType: 'post_compact',
|
|
1068
|
+
})
|
|
1069
|
+
const postCompactHookResult = await executePostCompactHooks(
|
|
1070
|
+
{
|
|
1071
|
+
trigger: 'manual',
|
|
1072
|
+
compactSummary: summary,
|
|
1073
|
+
},
|
|
1074
|
+
context.abortController.signal,
|
|
1075
|
+
)
|
|
1076
|
+
|
|
1077
|
+
// 'from': prefix-preserving → boundary; 'up_to': suffix → last summary
|
|
1078
|
+
const anchorUuid =
|
|
1079
|
+
direction === 'up_to'
|
|
1080
|
+
? (summaryMessages.at(-1)?.uuid ?? boundaryMarker.uuid)
|
|
1081
|
+
: boundaryMarker.uuid
|
|
1082
|
+
return {
|
|
1083
|
+
boundaryMarker: annotateBoundaryWithPreservedSegment(
|
|
1084
|
+
boundaryMarker,
|
|
1085
|
+
anchorUuid,
|
|
1086
|
+
messagesToKeep,
|
|
1087
|
+
),
|
|
1088
|
+
summaryMessages,
|
|
1089
|
+
messagesToKeep,
|
|
1090
|
+
attachments: postCompactFileAttachments,
|
|
1091
|
+
hookResults: hookMessages,
|
|
1092
|
+
userDisplayMessage: postCompactHookResult.userDisplayMessage,
|
|
1093
|
+
preCompactTokenCount,
|
|
1094
|
+
postCompactTokenCount,
|
|
1095
|
+
compactionUsage,
|
|
1096
|
+
}
|
|
1097
|
+
} catch (error) {
|
|
1098
|
+
addErrorNotificationIfNeeded(error, context)
|
|
1099
|
+
throw error
|
|
1100
|
+
} finally {
|
|
1101
|
+
context.setStreamMode?.('requesting')
|
|
1102
|
+
context.setResponseLength?.(() => 0)
|
|
1103
|
+
context.onCompactProgress?.({ type: 'compact_end' })
|
|
1104
|
+
context.setSDKStatus?.(null)
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
function addErrorNotificationIfNeeded(
|
|
1109
|
+
error: unknown,
|
|
1110
|
+
context: Pick<ToolUseContext, 'addNotification'>,
|
|
1111
|
+
) {
|
|
1112
|
+
if (
|
|
1113
|
+
!hasExactErrorMessage(error, ERROR_MESSAGE_USER_ABORT) &&
|
|
1114
|
+
!hasExactErrorMessage(error, ERROR_MESSAGE_NOT_ENOUGH_MESSAGES)
|
|
1115
|
+
) {
|
|
1116
|
+
context.addNotification?.({
|
|
1117
|
+
key: 'error-compacting-conversation',
|
|
1118
|
+
text: 'Error compacting conversation',
|
|
1119
|
+
priority: 'immediate',
|
|
1120
|
+
color: 'error',
|
|
1121
|
+
})
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
export function createCompactCanUseTool(): CanUseToolFn {
|
|
1126
|
+
return async () => ({
|
|
1127
|
+
behavior: 'deny' as const,
|
|
1128
|
+
message: 'Tool use is not allowed during compaction',
|
|
1129
|
+
decisionReason: {
|
|
1130
|
+
type: 'other' as const,
|
|
1131
|
+
reason: 'compaction agent should only produce text summary',
|
|
1132
|
+
},
|
|
1133
|
+
})
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
async function streamCompactSummary({
|
|
1137
|
+
messages,
|
|
1138
|
+
summaryRequest,
|
|
1139
|
+
appState,
|
|
1140
|
+
context,
|
|
1141
|
+
preCompactTokenCount,
|
|
1142
|
+
cacheSafeParams,
|
|
1143
|
+
}: {
|
|
1144
|
+
messages: Message[]
|
|
1145
|
+
summaryRequest: UserMessage
|
|
1146
|
+
appState: Awaited<ReturnType<ToolUseContext['getAppState']>>
|
|
1147
|
+
context: ToolUseContext
|
|
1148
|
+
preCompactTokenCount: number
|
|
1149
|
+
cacheSafeParams: CacheSafeParams
|
|
1150
|
+
}): Promise<AssistantMessage> {
|
|
1151
|
+
// When prompt cache sharing is enabled, use forked agent to reuse the
|
|
1152
|
+
// main conversation's cached prefix (system prompt, tools, context messages).
|
|
1153
|
+
// Falls back to regular streaming path on failure.
|
|
1154
|
+
// 3P default: true — see comment at the other tengu_compact_cache_prefix read above.
|
|
1155
|
+
const promptCacheSharingEnabled = getFeatureValue_CACHED_MAY_BE_STALE(
|
|
1156
|
+
'tengu_compact_cache_prefix',
|
|
1157
|
+
true,
|
|
1158
|
+
)
|
|
1159
|
+
// Send keep-alive signals during compaction to prevent remote session
|
|
1160
|
+
// WebSocket idle timeouts from dropping bridge connections. Compaction
|
|
1161
|
+
// API calls can take 5-10+ seconds, during which no other messages
|
|
1162
|
+
// flow through the transport — without keep-alives, the server may
|
|
1163
|
+
// close the WebSocket for inactivity.
|
|
1164
|
+
// Two signals: (1) PUT /worker heartbeat via sessionActivity, and
|
|
1165
|
+
// (2) re-emit 'compacting' status so the SDK event stream stays active
|
|
1166
|
+
// and the server doesn't consider the session stale.
|
|
1167
|
+
const activityInterval = isSessionActivityTrackingActive()
|
|
1168
|
+
? setInterval(
|
|
1169
|
+
(statusSetter?: (status: 'compacting' | null) => void) => {
|
|
1170
|
+
sendSessionActivitySignal()
|
|
1171
|
+
statusSetter?.('compacting')
|
|
1172
|
+
},
|
|
1173
|
+
30_000,
|
|
1174
|
+
context.setSDKStatus,
|
|
1175
|
+
)
|
|
1176
|
+
: undefined
|
|
1177
|
+
|
|
1178
|
+
try {
|
|
1179
|
+
if (promptCacheSharingEnabled) {
|
|
1180
|
+
try {
|
|
1181
|
+
// DO NOT set maxOutputTokens here. The fork piggybacks on the main thread's
|
|
1182
|
+
// prompt cache by sending identical cache-key params (system, tools, model,
|
|
1183
|
+
// messages prefix, thinking config). Setting maxOutputTokens would clamp
|
|
1184
|
+
// budget_tokens via Math.min(budget, maxOutputTokens-1) in claude.ts,
|
|
1185
|
+
// creating a thinking config mismatch that invalidates the cache.
|
|
1186
|
+
// The streaming fallback path (below) can safely set maxOutputTokensOverride
|
|
1187
|
+
// since it doesn't share cache with the main thread.
|
|
1188
|
+
const result = await runForkedAgent({
|
|
1189
|
+
promptMessages: [summaryRequest],
|
|
1190
|
+
cacheSafeParams,
|
|
1191
|
+
canUseTool: createCompactCanUseTool(),
|
|
1192
|
+
querySource: 'compact',
|
|
1193
|
+
forkLabel: 'compact',
|
|
1194
|
+
maxTurns: 1,
|
|
1195
|
+
skipCacheWrite: true,
|
|
1196
|
+
// Pass the compact context's abortController so user Esc aborts the
|
|
1197
|
+
// fork — same signal the streaming fallback uses at
|
|
1198
|
+
// `signal: context.abortController.signal` below.
|
|
1199
|
+
overrides: { abortController: context.abortController },
|
|
1200
|
+
})
|
|
1201
|
+
const assistantMsg = getLastAssistantMessage(result.messages)
|
|
1202
|
+
const assistantText = assistantMsg
|
|
1203
|
+
? getAssistantMessageText(assistantMsg)
|
|
1204
|
+
: null
|
|
1205
|
+
// Guard isApiErrorMessage: query() catches API errors (including
|
|
1206
|
+
// APIUserAbortError on ESC) and yields them as synthetic assistant
|
|
1207
|
+
// messages. Without this check, an aborted compact "succeeds" with
|
|
1208
|
+
// "Request was aborted." as the summary — the text doesn't start with
|
|
1209
|
+
// "API Error" so the caller's startsWithApiErrorPrefix guard misses it.
|
|
1210
|
+
if (assistantMsg && assistantText && !assistantMsg.isApiErrorMessage) {
|
|
1211
|
+
// Skip success logging for PTL error text — it's returned so the
|
|
1212
|
+
// caller's retry loop catches it, but it's not a successful summary.
|
|
1213
|
+
if (!assistantText.startsWith(PROMPT_TOO_LONG_ERROR_MESSAGE)) {
|
|
1214
|
+
logEvent('tengu_compact_cache_sharing_success', {
|
|
1215
|
+
preCompactTokenCount,
|
|
1216
|
+
outputTokens: result.totalUsage.output_tokens,
|
|
1217
|
+
cacheReadInputTokens: result.totalUsage.cache_read_input_tokens,
|
|
1218
|
+
cacheCreationInputTokens:
|
|
1219
|
+
result.totalUsage.cache_creation_input_tokens,
|
|
1220
|
+
cacheHitRate:
|
|
1221
|
+
result.totalUsage.cache_read_input_tokens > 0
|
|
1222
|
+
? result.totalUsage.cache_read_input_tokens /
|
|
1223
|
+
(result.totalUsage.cache_read_input_tokens +
|
|
1224
|
+
result.totalUsage.cache_creation_input_tokens +
|
|
1225
|
+
result.totalUsage.input_tokens)
|
|
1226
|
+
: 0,
|
|
1227
|
+
})
|
|
1228
|
+
}
|
|
1229
|
+
return assistantMsg
|
|
1230
|
+
}
|
|
1231
|
+
logForDebugging(
|
|
1232
|
+
`Compact cache sharing: no text in response, falling back. Response: ${jsonStringify(assistantMsg)}`,
|
|
1233
|
+
{ level: 'warn' },
|
|
1234
|
+
)
|
|
1235
|
+
logEvent('tengu_compact_cache_sharing_fallback', {
|
|
1236
|
+
reason:
|
|
1237
|
+
'no_text_response' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1238
|
+
preCompactTokenCount,
|
|
1239
|
+
})
|
|
1240
|
+
} catch (error) {
|
|
1241
|
+
logError(error)
|
|
1242
|
+
logEvent('tengu_compact_cache_sharing_fallback', {
|
|
1243
|
+
reason:
|
|
1244
|
+
'error' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1245
|
+
preCompactTokenCount,
|
|
1246
|
+
})
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
// Regular streaming path (fallback when cache sharing fails or is disabled)
|
|
1251
|
+
const retryEnabled = getFeatureValue_CACHED_MAY_BE_STALE(
|
|
1252
|
+
'tengu_compact_streaming_retry',
|
|
1253
|
+
false,
|
|
1254
|
+
)
|
|
1255
|
+
const maxAttempts = retryEnabled ? MAX_COMPACT_STREAMING_RETRIES : 1
|
|
1256
|
+
|
|
1257
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
1258
|
+
// Reset state for retry
|
|
1259
|
+
let hasStartedStreaming = false
|
|
1260
|
+
let response: AssistantMessage | undefined
|
|
1261
|
+
context.setResponseLength?.(() => 0)
|
|
1262
|
+
|
|
1263
|
+
// Check if tool search is enabled using the main loop's tools list.
|
|
1264
|
+
// context.options.tools includes MCP tools merged via useMergedTools.
|
|
1265
|
+
const useToolSearch = await isToolSearchEnabled(
|
|
1266
|
+
context.options.mainLoopModel,
|
|
1267
|
+
context.options.tools,
|
|
1268
|
+
async () => appState.toolPermissionContext,
|
|
1269
|
+
context.options.agentDefinitions.activeAgents,
|
|
1270
|
+
'compact',
|
|
1271
|
+
)
|
|
1272
|
+
|
|
1273
|
+
// When tool search is enabled, include ToolSearchTool and MCP tools. They get
|
|
1274
|
+
// defer_loading: true and don't count against context - the API filters them out
|
|
1275
|
+
// of system_prompt_tools before token counting (see api/token_count_api/counting.py:188
|
|
1276
|
+
// and api/public_api/messages/handler.py:324).
|
|
1277
|
+
// Filter MCP tools from context.options.tools (not appState.mcp.tools) so we
|
|
1278
|
+
// get the permission-filtered set from useMergedTools — same source used for
|
|
1279
|
+
// isToolSearchEnabled above and normalizeMessagesForAPI below.
|
|
1280
|
+
// Deduplicate by name to avoid API errors when MCP tools share names with built-in tools.
|
|
1281
|
+
const tools: Tool[] = useToolSearch
|
|
1282
|
+
? uniqBy(
|
|
1283
|
+
[
|
|
1284
|
+
FileReadTool,
|
|
1285
|
+
ToolSearchTool,
|
|
1286
|
+
...context.options.tools.filter(t => t.isMcp),
|
|
1287
|
+
],
|
|
1288
|
+
'name',
|
|
1289
|
+
)
|
|
1290
|
+
: [FileReadTool]
|
|
1291
|
+
|
|
1292
|
+
const streamingGen = queryModelWithStreaming({
|
|
1293
|
+
messages: normalizeMessagesForAPI(
|
|
1294
|
+
stripImagesFromMessages(
|
|
1295
|
+
stripReinjectedAttachments([
|
|
1296
|
+
...getMessagesAfterCompactBoundary(messages),
|
|
1297
|
+
summaryRequest,
|
|
1298
|
+
]),
|
|
1299
|
+
),
|
|
1300
|
+
context.options.tools,
|
|
1301
|
+
),
|
|
1302
|
+
systemPrompt: asSystemPrompt([
|
|
1303
|
+
'You are a helpful AI assistant tasked with summarizing conversations.',
|
|
1304
|
+
]),
|
|
1305
|
+
thinkingConfig: { type: 'disabled' as const },
|
|
1306
|
+
tools,
|
|
1307
|
+
signal: context.abortController.signal,
|
|
1308
|
+
options: {
|
|
1309
|
+
async getToolPermissionContext() {
|
|
1310
|
+
const appState = context.getAppState()
|
|
1311
|
+
return appState.toolPermissionContext
|
|
1312
|
+
},
|
|
1313
|
+
model: context.options.mainLoopModel,
|
|
1314
|
+
toolChoice: undefined,
|
|
1315
|
+
isNonInteractiveSession: context.options.isNonInteractiveSession,
|
|
1316
|
+
hasAppendSystemPrompt: !!context.options.appendSystemPrompt,
|
|
1317
|
+
maxOutputTokensOverride: Math.min(
|
|
1318
|
+
COMPACT_MAX_OUTPUT_TOKENS,
|
|
1319
|
+
getMaxOutputTokensForModel(context.options.mainLoopModel),
|
|
1320
|
+
),
|
|
1321
|
+
querySource: 'compact',
|
|
1322
|
+
agents: context.options.agentDefinitions.activeAgents,
|
|
1323
|
+
mcpTools: [],
|
|
1324
|
+
effortValue: appState.effortValue,
|
|
1325
|
+
},
|
|
1326
|
+
})
|
|
1327
|
+
const streamIter = streamingGen[Symbol.asyncIterator]()
|
|
1328
|
+
let next = await streamIter.next()
|
|
1329
|
+
|
|
1330
|
+
while (!next.done) {
|
|
1331
|
+
const event = next.value
|
|
1332
|
+
|
|
1333
|
+
if (
|
|
1334
|
+
!hasStartedStreaming &&
|
|
1335
|
+
event.type === 'stream_event' &&
|
|
1336
|
+
event.event.type === 'content_block_start' &&
|
|
1337
|
+
event.event.content_block.type === 'text'
|
|
1338
|
+
) {
|
|
1339
|
+
hasStartedStreaming = true
|
|
1340
|
+
context.setStreamMode?.('responding')
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
if (
|
|
1344
|
+
event.type === 'stream_event' &&
|
|
1345
|
+
event.event.type === 'content_block_delta' &&
|
|
1346
|
+
event.event.delta.type === 'text_delta'
|
|
1347
|
+
) {
|
|
1348
|
+
const charactersStreamed = event.event.delta.text.length
|
|
1349
|
+
context.setResponseLength?.(length => length + charactersStreamed)
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
if (event.type === 'assistant') {
|
|
1353
|
+
response = event
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
next = await streamIter.next()
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
if (response) {
|
|
1360
|
+
return response
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
if (attempt < maxAttempts) {
|
|
1364
|
+
logEvent('tengu_compact_streaming_retry', {
|
|
1365
|
+
attempt,
|
|
1366
|
+
preCompactTokenCount,
|
|
1367
|
+
hasStartedStreaming,
|
|
1368
|
+
})
|
|
1369
|
+
await sleep(getRetryDelay(attempt), context.abortController.signal, {
|
|
1370
|
+
abortError: () => new APIUserAbortError(),
|
|
1371
|
+
})
|
|
1372
|
+
continue
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
logForDebugging(
|
|
1376
|
+
`Compact streaming failed after ${attempt} attempts. hasStartedStreaming=${hasStartedStreaming}`,
|
|
1377
|
+
{ level: 'error' },
|
|
1378
|
+
)
|
|
1379
|
+
logEvent('tengu_compact_failed', {
|
|
1380
|
+
reason:
|
|
1381
|
+
'no_streaming_response' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
1382
|
+
preCompactTokenCount,
|
|
1383
|
+
hasStartedStreaming,
|
|
1384
|
+
retryEnabled,
|
|
1385
|
+
attempts: attempt,
|
|
1386
|
+
promptCacheSharingEnabled,
|
|
1387
|
+
})
|
|
1388
|
+
throw new Error(ERROR_MESSAGE_INCOMPLETE_RESPONSE)
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
// This should never be reached due to the throw above, but TypeScript needs it
|
|
1392
|
+
throw new Error(ERROR_MESSAGE_INCOMPLETE_RESPONSE)
|
|
1393
|
+
} finally {
|
|
1394
|
+
clearInterval(activityInterval)
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
/**
|
|
1399
|
+
* Creates attachment messages for recently accessed files to restore them after compaction.
|
|
1400
|
+
* This prevents the model from having to re-read files that were recently accessed.
|
|
1401
|
+
* Re-reads files using FileReadTool to get fresh content with proper validation.
|
|
1402
|
+
* Files are selected based on recency, but constrained by both file count and token budget limits.
|
|
1403
|
+
*
|
|
1404
|
+
* Files already present as Read tool results in preservedMessages are skipped —
|
|
1405
|
+
* re-injecting identical content the model can already see in the preserved tail
|
|
1406
|
+
* is pure waste (up to 25K tok/compact). Mirrors the diff-against-preserved
|
|
1407
|
+
* pattern that getDeferredToolsDeltaAttachment uses at the same call sites.
|
|
1408
|
+
*
|
|
1409
|
+
* @param readFileState The current file state tracking recently read files
|
|
1410
|
+
* @param toolUseContext The tool use context for calling FileReadTool
|
|
1411
|
+
* @param maxFiles Maximum number of files to restore (default: 5)
|
|
1412
|
+
* @param preservedMessages Messages kept post-compact; Read results here are skipped
|
|
1413
|
+
* @returns Array of attachment messages for the most recently accessed files that fit within token budget
|
|
1414
|
+
*/
|
|
1415
|
+
export async function createPostCompactFileAttachments(
|
|
1416
|
+
readFileState: Record<string, { content: string; timestamp: number }>,
|
|
1417
|
+
toolUseContext: ToolUseContext,
|
|
1418
|
+
maxFiles: number,
|
|
1419
|
+
preservedMessages: Message[] = [],
|
|
1420
|
+
): Promise<AttachmentMessage[]> {
|
|
1421
|
+
const preservedReadPaths = collectReadToolFilePaths(preservedMessages)
|
|
1422
|
+
const recentFiles = Object.entries(readFileState)
|
|
1423
|
+
.map(([filename, state]) => ({ filename, ...state }))
|
|
1424
|
+
.filter(
|
|
1425
|
+
file =>
|
|
1426
|
+
!shouldExcludeFromPostCompactRestore(
|
|
1427
|
+
file.filename,
|
|
1428
|
+
toolUseContext.agentId,
|
|
1429
|
+
) && !preservedReadPaths.has(expandPath(file.filename)),
|
|
1430
|
+
)
|
|
1431
|
+
.sort((a, b) => b.timestamp - a.timestamp)
|
|
1432
|
+
.slice(0, maxFiles)
|
|
1433
|
+
|
|
1434
|
+
const results = await Promise.all(
|
|
1435
|
+
recentFiles.map(async file => {
|
|
1436
|
+
const attachment = await generateFileAttachment(
|
|
1437
|
+
file.filename,
|
|
1438
|
+
{
|
|
1439
|
+
...toolUseContext,
|
|
1440
|
+
fileReadingLimits: {
|
|
1441
|
+
maxTokens: POST_COMPACT_MAX_TOKENS_PER_FILE,
|
|
1442
|
+
},
|
|
1443
|
+
},
|
|
1444
|
+
'tengu_post_compact_file_restore_success',
|
|
1445
|
+
'tengu_post_compact_file_restore_error',
|
|
1446
|
+
'compact',
|
|
1447
|
+
)
|
|
1448
|
+
return attachment ? createAttachmentMessage(attachment) : null
|
|
1449
|
+
}),
|
|
1450
|
+
)
|
|
1451
|
+
|
|
1452
|
+
let usedTokens = 0
|
|
1453
|
+
return results.filter((result): result is AttachmentMessage => {
|
|
1454
|
+
if (result === null) {
|
|
1455
|
+
return false
|
|
1456
|
+
}
|
|
1457
|
+
const attachmentTokens = roughTokenCountEstimation(jsonStringify(result))
|
|
1458
|
+
if (usedTokens + attachmentTokens <= POST_COMPACT_TOKEN_BUDGET) {
|
|
1459
|
+
usedTokens += attachmentTokens
|
|
1460
|
+
return true
|
|
1461
|
+
}
|
|
1462
|
+
return false
|
|
1463
|
+
})
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* Creates a plan file attachment if a plan file exists for the current session.
|
|
1468
|
+
* This ensures the plan is preserved after compaction.
|
|
1469
|
+
*/
|
|
1470
|
+
export function createPlanAttachmentIfNeeded(
|
|
1471
|
+
agentId?: AgentId,
|
|
1472
|
+
): AttachmentMessage | null {
|
|
1473
|
+
const planContent = getPlan(agentId)
|
|
1474
|
+
|
|
1475
|
+
if (!planContent) {
|
|
1476
|
+
return null
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
const planFilePath = getPlanFilePath(agentId)
|
|
1480
|
+
|
|
1481
|
+
return createAttachmentMessage({
|
|
1482
|
+
type: 'plan_file_reference',
|
|
1483
|
+
planFilePath,
|
|
1484
|
+
planContent,
|
|
1485
|
+
})
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
/**
|
|
1489
|
+
* Creates an attachment for invoked skills to preserve their content across compaction.
|
|
1490
|
+
* Only includes skills scoped to the given agent (or main session when agentId is null/undefined).
|
|
1491
|
+
* This ensures skill guidelines remain available after the conversation is summarized
|
|
1492
|
+
* without leaking skills from other agent contexts.
|
|
1493
|
+
*/
|
|
1494
|
+
export function createSkillAttachmentIfNeeded(
|
|
1495
|
+
agentId?: string,
|
|
1496
|
+
): AttachmentMessage | null {
|
|
1497
|
+
const invokedSkills = getInvokedSkillsForAgent(agentId)
|
|
1498
|
+
|
|
1499
|
+
if (invokedSkills.size === 0) {
|
|
1500
|
+
return null
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
// Sorted most-recent-first so budget pressure drops the least-relevant skills.
|
|
1504
|
+
// Per-skill truncation keeps the head of each file (where setup/usage
|
|
1505
|
+
// instructions typically live) rather than dropping whole skills.
|
|
1506
|
+
let usedTokens = 0
|
|
1507
|
+
const skills = Array.from(invokedSkills.values())
|
|
1508
|
+
.sort((a, b) => b.invokedAt - a.invokedAt)
|
|
1509
|
+
.map(skill => ({
|
|
1510
|
+
name: skill.skillName,
|
|
1511
|
+
path: skill.skillPath,
|
|
1512
|
+
content: truncateToTokens(
|
|
1513
|
+
skill.content,
|
|
1514
|
+
POST_COMPACT_MAX_TOKENS_PER_SKILL,
|
|
1515
|
+
),
|
|
1516
|
+
}))
|
|
1517
|
+
.filter(skill => {
|
|
1518
|
+
const tokens = roughTokenCountEstimation(skill.content)
|
|
1519
|
+
if (usedTokens + tokens > POST_COMPACT_SKILLS_TOKEN_BUDGET) {
|
|
1520
|
+
return false
|
|
1521
|
+
}
|
|
1522
|
+
usedTokens += tokens
|
|
1523
|
+
return true
|
|
1524
|
+
})
|
|
1525
|
+
|
|
1526
|
+
if (skills.length === 0) {
|
|
1527
|
+
return null
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
return createAttachmentMessage({
|
|
1531
|
+
type: 'invoked_skills',
|
|
1532
|
+
skills,
|
|
1533
|
+
})
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
/**
|
|
1537
|
+
* Creates a plan_mode attachment if the user is currently in plan mode.
|
|
1538
|
+
* This ensures the model continues to operate in plan mode after compaction
|
|
1539
|
+
* (otherwise it would lose the plan mode instructions since those are
|
|
1540
|
+
* normally only injected on tool-use turns via getAttachmentMessages).
|
|
1541
|
+
*/
|
|
1542
|
+
export async function createPlanModeAttachmentIfNeeded(
|
|
1543
|
+
context: ToolUseContext,
|
|
1544
|
+
): Promise<AttachmentMessage | null> {
|
|
1545
|
+
const appState = context.getAppState()
|
|
1546
|
+
if (appState.toolPermissionContext.mode !== 'plan') {
|
|
1547
|
+
return null
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
const planFilePath = getPlanFilePath(context.agentId)
|
|
1551
|
+
const planExists = getPlan(context.agentId) !== null
|
|
1552
|
+
|
|
1553
|
+
return createAttachmentMessage({
|
|
1554
|
+
type: 'plan_mode',
|
|
1555
|
+
reminderType: 'full',
|
|
1556
|
+
isSubAgent: !!context.agentId,
|
|
1557
|
+
planFilePath,
|
|
1558
|
+
planExists,
|
|
1559
|
+
})
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
/**
|
|
1563
|
+
* Creates attachments for async agents so the model knows about them after
|
|
1564
|
+
* compaction. Covers both agents still running in the background (so the model
|
|
1565
|
+
* doesn't spawn a duplicate) and agents that have finished but whose results
|
|
1566
|
+
* haven't been retrieved yet.
|
|
1567
|
+
*/
|
|
1568
|
+
export async function createAsyncAgentAttachmentsIfNeeded(
|
|
1569
|
+
context: ToolUseContext,
|
|
1570
|
+
): Promise<AttachmentMessage[]> {
|
|
1571
|
+
const appState = context.getAppState()
|
|
1572
|
+
const asyncAgents = Object.values(appState.tasks).filter(
|
|
1573
|
+
(task): task is LocalAgentTaskState => task.type === 'local_agent',
|
|
1574
|
+
)
|
|
1575
|
+
|
|
1576
|
+
return asyncAgents.flatMap(agent => {
|
|
1577
|
+
if (
|
|
1578
|
+
agent.retrieved ||
|
|
1579
|
+
agent.status === 'pending' ||
|
|
1580
|
+
agent.agentId === context.agentId
|
|
1581
|
+
) {
|
|
1582
|
+
return []
|
|
1583
|
+
}
|
|
1584
|
+
return [
|
|
1585
|
+
createAttachmentMessage({
|
|
1586
|
+
type: 'task_status',
|
|
1587
|
+
taskId: agent.agentId,
|
|
1588
|
+
taskType: 'local_agent',
|
|
1589
|
+
description: agent.description,
|
|
1590
|
+
status: agent.status,
|
|
1591
|
+
deltaSummary:
|
|
1592
|
+
agent.status === 'running'
|
|
1593
|
+
? (agent.progress?.summary ?? null)
|
|
1594
|
+
: (agent.error ?? null),
|
|
1595
|
+
outputFilePath: getTaskOutputPath(agent.agentId),
|
|
1596
|
+
}),
|
|
1597
|
+
]
|
|
1598
|
+
})
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
/**
|
|
1602
|
+
* Scan messages for Read tool_use blocks and collect their file_path inputs
|
|
1603
|
+
* (normalized via expandPath). Used to dedup post-compact file restoration
|
|
1604
|
+
* against what's already visible in the preserved tail.
|
|
1605
|
+
*
|
|
1606
|
+
* Skips Reads whose tool_result is a dedup stub — the stub points at an
|
|
1607
|
+
* earlier full Read that may have been compacted away, so we want
|
|
1608
|
+
* createPostCompactFileAttachments to re-inject the real content.
|
|
1609
|
+
*/
|
|
1610
|
+
function collectReadToolFilePaths(messages: Message[]): Set<string> {
|
|
1611
|
+
const stubIds = new Set<string>()
|
|
1612
|
+
for (const message of messages) {
|
|
1613
|
+
if (message.type !== 'user' || !Array.isArray(message.message.content)) {
|
|
1614
|
+
continue
|
|
1615
|
+
}
|
|
1616
|
+
for (const block of message.message.content) {
|
|
1617
|
+
if (
|
|
1618
|
+
block.type === 'tool_result' &&
|
|
1619
|
+
typeof block.content === 'string' &&
|
|
1620
|
+
block.content.startsWith(FILE_UNCHANGED_STUB)
|
|
1621
|
+
) {
|
|
1622
|
+
stubIds.add(block.tool_use_id)
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
const paths = new Set<string>()
|
|
1628
|
+
for (const message of messages) {
|
|
1629
|
+
if (
|
|
1630
|
+
message.type !== 'assistant' ||
|
|
1631
|
+
!Array.isArray(message.message.content)
|
|
1632
|
+
) {
|
|
1633
|
+
continue
|
|
1634
|
+
}
|
|
1635
|
+
for (const block of message.message.content) {
|
|
1636
|
+
if (
|
|
1637
|
+
block.type !== 'tool_use' ||
|
|
1638
|
+
block.name !== FILE_READ_TOOL_NAME ||
|
|
1639
|
+
stubIds.has(block.id)
|
|
1640
|
+
) {
|
|
1641
|
+
continue
|
|
1642
|
+
}
|
|
1643
|
+
const input = block.input
|
|
1644
|
+
if (
|
|
1645
|
+
input &&
|
|
1646
|
+
typeof input === 'object' &&
|
|
1647
|
+
'file_path' in input &&
|
|
1648
|
+
typeof input.file_path === 'string'
|
|
1649
|
+
) {
|
|
1650
|
+
paths.add(expandPath(input.file_path))
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
return paths
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
const SKILL_TRUNCATION_MARKER =
|
|
1658
|
+
'\n\n[... skill content truncated for compaction; use Read on the skill path if you need the full text]'
|
|
1659
|
+
|
|
1660
|
+
/**
|
|
1661
|
+
* Truncate content to roughly maxTokens, keeping the head. roughTokenCountEstimation
|
|
1662
|
+
* uses ~4 chars/token (its default bytesPerToken), so char budget = maxTokens * 4
|
|
1663
|
+
* minus the marker so the result stays within budget. Marker tells the model it
|
|
1664
|
+
* can Read the full file if needed.
|
|
1665
|
+
*/
|
|
1666
|
+
function truncateToTokens(content: string, maxTokens: number): string {
|
|
1667
|
+
if (roughTokenCountEstimation(content) <= maxTokens) {
|
|
1668
|
+
return content
|
|
1669
|
+
}
|
|
1670
|
+
const charBudget = maxTokens * 4 - SKILL_TRUNCATION_MARKER.length
|
|
1671
|
+
return content.slice(0, charBudget) + SKILL_TRUNCATION_MARKER
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
function shouldExcludeFromPostCompactRestore(
|
|
1675
|
+
filename: string,
|
|
1676
|
+
agentId?: AgentId,
|
|
1677
|
+
): boolean {
|
|
1678
|
+
const normalizedFilename = expandPath(filename)
|
|
1679
|
+
// Exclude plan files
|
|
1680
|
+
try {
|
|
1681
|
+
const planFilePath = expandPath(getPlanFilePath(agentId))
|
|
1682
|
+
if (normalizedFilename === planFilePath) {
|
|
1683
|
+
return true
|
|
1684
|
+
}
|
|
1685
|
+
} catch {
|
|
1686
|
+
// If we can't get plan file path, continue with other checks
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
// Exclude all types of claude.md files
|
|
1690
|
+
// TODO: Refactor to use isMemoryFilePath() from claudemd.ts for consistency
|
|
1691
|
+
// and to also match child directory memory files (.claude/rules/*.md, etc.)
|
|
1692
|
+
try {
|
|
1693
|
+
const normalizedMemoryPaths = new Set(
|
|
1694
|
+
MEMORY_TYPE_VALUES.map(type => expandPath(getMemoryPath(type))),
|
|
1695
|
+
)
|
|
1696
|
+
|
|
1697
|
+
if (normalizedMemoryPaths.has(normalizedFilename)) {
|
|
1698
|
+
return true
|
|
1699
|
+
}
|
|
1700
|
+
} catch {
|
|
1701
|
+
// If we can't get memory paths, continue
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
return false
|
|
1705
|
+
}
|