@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,1144 @@
|
|
|
1
|
+
// React hook for hold-to-talk voice input using Anthropic voice_stream STT.
|
|
2
|
+
//
|
|
3
|
+
// Hold the keybinding to record; release to stop and submit. Auto-repeat
|
|
4
|
+
// key events reset an internal timer — when no keypress arrives within
|
|
5
|
+
// RELEASE_TIMEOUT_MS the recording stops automatically. Uses the native
|
|
6
|
+
// audio module (macOS) or SoX for recording, and Anthropic's voice_stream
|
|
7
|
+
// endpoint (conversation_engine) for STT.
|
|
8
|
+
|
|
9
|
+
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
10
|
+
import { useSetVoiceState } from '../context/voice.js'
|
|
11
|
+
import { useTerminalFocus } from '../ink/hooks/use-terminal-focus.js'
|
|
12
|
+
import {
|
|
13
|
+
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
14
|
+
logEvent,
|
|
15
|
+
} from '../services/analytics/index.js'
|
|
16
|
+
import { getVoiceKeyterms } from '../services/voiceKeyterms.js'
|
|
17
|
+
import {
|
|
18
|
+
connectVoiceStream,
|
|
19
|
+
type FinalizeSource,
|
|
20
|
+
isVoiceStreamAvailable,
|
|
21
|
+
type VoiceStreamConnection,
|
|
22
|
+
} from '../services/voiceStreamSTT.js'
|
|
23
|
+
import { logForDebugging } from '../utils/debug.js'
|
|
24
|
+
import { toError } from '../utils/errors.js'
|
|
25
|
+
import { getSystemLocaleLanguage } from '../utils/intl.js'
|
|
26
|
+
import { logError } from '../utils/log.js'
|
|
27
|
+
import { getInitialSettings } from '../utils/settings/settings.js'
|
|
28
|
+
import { sleep } from '../utils/sleep.js'
|
|
29
|
+
|
|
30
|
+
// ─── Language normalization ─────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
const DEFAULT_STT_LANGUAGE = 'en'
|
|
33
|
+
|
|
34
|
+
// Maps language names (English and native) to BCP-47 codes supported by
|
|
35
|
+
// the voice_stream Deepgram backend. Keys must be lowercase.
|
|
36
|
+
//
|
|
37
|
+
// This list must be a SUBSET of the server-side supported_language_codes
|
|
38
|
+
// allowlist (GrowthBook: speech_to_text_voice_stream_config).
|
|
39
|
+
// If the CLI sends a code the server rejects, the WebSocket closes with
|
|
40
|
+
// 1008 "Unsupported language" and voice breaks. Unsupported languages
|
|
41
|
+
// fall back to DEFAULT_STT_LANGUAGE so recording still works.
|
|
42
|
+
const LANGUAGE_NAME_TO_CODE: Record<string, string> = {
|
|
43
|
+
english: 'en',
|
|
44
|
+
spanish: 'es',
|
|
45
|
+
español: 'es',
|
|
46
|
+
espanol: 'es',
|
|
47
|
+
french: 'fr',
|
|
48
|
+
français: 'fr',
|
|
49
|
+
francais: 'fr',
|
|
50
|
+
japanese: 'ja',
|
|
51
|
+
日本語: 'ja',
|
|
52
|
+
german: 'de',
|
|
53
|
+
deutsch: 'de',
|
|
54
|
+
portuguese: 'pt',
|
|
55
|
+
português: 'pt',
|
|
56
|
+
portugues: 'pt',
|
|
57
|
+
italian: 'it',
|
|
58
|
+
italiano: 'it',
|
|
59
|
+
korean: 'ko',
|
|
60
|
+
한국어: 'ko',
|
|
61
|
+
hindi: 'hi',
|
|
62
|
+
हिन्दी: 'hi',
|
|
63
|
+
हिंदी: 'hi',
|
|
64
|
+
indonesian: 'id',
|
|
65
|
+
'bahasa indonesia': 'id',
|
|
66
|
+
bahasa: 'id',
|
|
67
|
+
russian: 'ru',
|
|
68
|
+
русский: 'ru',
|
|
69
|
+
polish: 'pl',
|
|
70
|
+
polski: 'pl',
|
|
71
|
+
turkish: 'tr',
|
|
72
|
+
türkçe: 'tr',
|
|
73
|
+
turkce: 'tr',
|
|
74
|
+
dutch: 'nl',
|
|
75
|
+
nederlands: 'nl',
|
|
76
|
+
ukrainian: 'uk',
|
|
77
|
+
українська: 'uk',
|
|
78
|
+
greek: 'el',
|
|
79
|
+
ελληνικά: 'el',
|
|
80
|
+
czech: 'cs',
|
|
81
|
+
čeština: 'cs',
|
|
82
|
+
cestina: 'cs',
|
|
83
|
+
danish: 'da',
|
|
84
|
+
dansk: 'da',
|
|
85
|
+
swedish: 'sv',
|
|
86
|
+
svenska: 'sv',
|
|
87
|
+
norwegian: 'no',
|
|
88
|
+
norsk: 'no',
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Subset of the GrowthBook speech_to_text_voice_stream_config allowlist.
|
|
92
|
+
// Sending a code not in the server allowlist closes the connection.
|
|
93
|
+
const SUPPORTED_LANGUAGE_CODES = new Set([
|
|
94
|
+
'en',
|
|
95
|
+
'es',
|
|
96
|
+
'fr',
|
|
97
|
+
'ja',
|
|
98
|
+
'de',
|
|
99
|
+
'pt',
|
|
100
|
+
'it',
|
|
101
|
+
'ko',
|
|
102
|
+
'hi',
|
|
103
|
+
'id',
|
|
104
|
+
'ru',
|
|
105
|
+
'pl',
|
|
106
|
+
'tr',
|
|
107
|
+
'nl',
|
|
108
|
+
'uk',
|
|
109
|
+
'el',
|
|
110
|
+
'cs',
|
|
111
|
+
'da',
|
|
112
|
+
'sv',
|
|
113
|
+
'no',
|
|
114
|
+
])
|
|
115
|
+
|
|
116
|
+
// Normalize a language preference string (from settings.language) to a
|
|
117
|
+
// BCP-47 code supported by the voice_stream endpoint. Returns the
|
|
118
|
+
// default language if the input cannot be resolved. When the input is
|
|
119
|
+
// non-empty but unsupported, fellBackFrom is set to the original input so
|
|
120
|
+
// callers can surface a warning.
|
|
121
|
+
export function normalizeLanguageForSTT(language: string | undefined): {
|
|
122
|
+
code: string
|
|
123
|
+
fellBackFrom?: string
|
|
124
|
+
} {
|
|
125
|
+
if (!language) return { code: DEFAULT_STT_LANGUAGE }
|
|
126
|
+
const lower = language.toLowerCase().trim()
|
|
127
|
+
if (!lower) return { code: DEFAULT_STT_LANGUAGE }
|
|
128
|
+
if (SUPPORTED_LANGUAGE_CODES.has(lower)) return { code: lower }
|
|
129
|
+
const fromName = LANGUAGE_NAME_TO_CODE[lower]
|
|
130
|
+
if (fromName) return { code: fromName }
|
|
131
|
+
const base = lower.split('-')[0]
|
|
132
|
+
if (base && SUPPORTED_LANGUAGE_CODES.has(base)) return { code: base }
|
|
133
|
+
return { code: DEFAULT_STT_LANGUAGE, fellBackFrom: language }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Lazy-loaded voice module. We defer importing voice.ts (and its native
|
|
137
|
+
// audio-capture-napi dependency) until voice input is actually activated.
|
|
138
|
+
// On macOS, loading the native audio module can trigger a TCC microphone
|
|
139
|
+
// permission prompt — we must avoid that until voice input is actually enabled.
|
|
140
|
+
type VoiceModule = typeof import('../services/voice.js')
|
|
141
|
+
let voiceModule: VoiceModule | null = null
|
|
142
|
+
|
|
143
|
+
type VoiceState = 'idle' | 'recording' | 'processing'
|
|
144
|
+
|
|
145
|
+
type UseVoiceOptions = {
|
|
146
|
+
onTranscript: (text: string) => void
|
|
147
|
+
onError?: (message: string) => void
|
|
148
|
+
enabled: boolean
|
|
149
|
+
focusMode: boolean
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
type UseVoiceReturn = {
|
|
153
|
+
state: VoiceState
|
|
154
|
+
handleKeyEvent: (fallbackMs?: number) => void
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Gap (ms) between auto-repeat key events that signals key release.
|
|
158
|
+
// Terminal auto-repeat typically fires every 30-80ms; 200ms comfortably
|
|
159
|
+
// covers jitter while still feeling responsive.
|
|
160
|
+
const RELEASE_TIMEOUT_MS = 200
|
|
161
|
+
|
|
162
|
+
// Fallback (ms) to arm the release timer if no auto-repeat is seen.
|
|
163
|
+
// macOS default key repeat delay is ~500ms; 600ms gives headroom.
|
|
164
|
+
// If the user tapped and released before auto-repeat started, this
|
|
165
|
+
// ensures the release timer gets armed and recording stops.
|
|
166
|
+
//
|
|
167
|
+
// For modifier-combo first-press activation (handleKeyEvent called at
|
|
168
|
+
// t=0, before any auto-repeat), callers should pass FIRST_PRESS_FALLBACK_MS
|
|
169
|
+
// instead — the gap to the next keypress is the OS initial repeat *delay*
|
|
170
|
+
// (up to ~2s on macOS with slider at "Long"), not the repeat *rate*.
|
|
171
|
+
const REPEAT_FALLBACK_MS = 600
|
|
172
|
+
export const FIRST_PRESS_FALLBACK_MS = 2000
|
|
173
|
+
|
|
174
|
+
// How long (ms) to keep a focus-mode session alive without any speech
|
|
175
|
+
// before tearing it down to free the WebSocket connection. Re-arms on
|
|
176
|
+
// the next focus cycle (blur → refocus).
|
|
177
|
+
const FOCUS_SILENCE_TIMEOUT_MS = 5_000
|
|
178
|
+
|
|
179
|
+
// Number of bars shown in the recording waveform visualizer.
|
|
180
|
+
const AUDIO_LEVEL_BARS = 16
|
|
181
|
+
|
|
182
|
+
// Compute RMS amplitude from a 16-bit signed PCM buffer and return a
|
|
183
|
+
// normalized 0-1 value. A sqrt curve spreads quieter levels across more
|
|
184
|
+
// of the visual range so the waveform uses the full set of block heights.
|
|
185
|
+
export function computeLevel(chunk: Buffer): number {
|
|
186
|
+
const samples = chunk.length >> 1 // 16-bit = 2 bytes per sample
|
|
187
|
+
if (samples === 0) return 0
|
|
188
|
+
let sumSq = 0
|
|
189
|
+
for (let i = 0; i < chunk.length - 1; i += 2) {
|
|
190
|
+
// Read 16-bit signed little-endian
|
|
191
|
+
const sample = ((chunk[i]! | (chunk[i + 1]! << 8)) << 16) >> 16
|
|
192
|
+
sumSq += sample * sample
|
|
193
|
+
}
|
|
194
|
+
const rms = Math.sqrt(sumSq / samples)
|
|
195
|
+
const normalized = Math.min(rms / 2000, 1)
|
|
196
|
+
return Math.sqrt(normalized)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function useVoice({
|
|
200
|
+
onTranscript,
|
|
201
|
+
onError,
|
|
202
|
+
enabled,
|
|
203
|
+
focusMode,
|
|
204
|
+
}: UseVoiceOptions): UseVoiceReturn {
|
|
205
|
+
const [state, setState] = useState<VoiceState>('idle')
|
|
206
|
+
const stateRef = useRef<VoiceState>('idle')
|
|
207
|
+
const connectionRef = useRef<VoiceStreamConnection | null>(null)
|
|
208
|
+
const accumulatedRef = useRef('')
|
|
209
|
+
const onTranscriptRef = useRef(onTranscript)
|
|
210
|
+
const onErrorRef = useRef(onError)
|
|
211
|
+
const cleanupTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
212
|
+
const releaseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
213
|
+
// True once we've seen a second keypress (auto-repeat) while recording.
|
|
214
|
+
// The OS key repeat delay (~500ms on macOS) means the first keypress is
|
|
215
|
+
// solo — arming the release timer before auto-repeat starts would cause
|
|
216
|
+
// a false release.
|
|
217
|
+
const seenRepeatRef = useRef(false)
|
|
218
|
+
const repeatFallbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
|
|
219
|
+
null,
|
|
220
|
+
)
|
|
221
|
+
// True when the current recording session was started by terminal focus
|
|
222
|
+
// (not by a keypress). Focus-driven sessions end on blur, not key release.
|
|
223
|
+
const focusTriggeredRef = useRef(false)
|
|
224
|
+
// Timer that tears down the session after prolonged silence in focus mode.
|
|
225
|
+
const focusSilenceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
|
|
226
|
+
null,
|
|
227
|
+
)
|
|
228
|
+
// Set when a focus-mode session is torn down due to silence. Prevents
|
|
229
|
+
// the focus effect from immediately restarting. Cleared on blur so the
|
|
230
|
+
// next focus cycle re-arms recording.
|
|
231
|
+
const silenceTimedOutRef = useRef(false)
|
|
232
|
+
const recordingStartRef = useRef(0)
|
|
233
|
+
// Incremented on each startRecordingSession(). Callbacks capture their
|
|
234
|
+
// generation and bail if a newer session has started — prevents a zombie
|
|
235
|
+
// slow-connecting WS from an abandoned session from overwriting
|
|
236
|
+
// connectionRef mid-way through the next session.
|
|
237
|
+
const sessionGenRef = useRef(0)
|
|
238
|
+
// True if the early-error retry fired during this session.
|
|
239
|
+
// Tracked for the tengu_voice_recording_completed analytics event.
|
|
240
|
+
const retryUsedRef = useRef(false)
|
|
241
|
+
// Full audio captured this session, kept for silent-drop replay. ~1% of
|
|
242
|
+
// sessions get a sticky-broken CE pod that accepts audio but returns zero
|
|
243
|
+
// transcripts (anthropics/anthropic#287008 session-sticky variant); when
|
|
244
|
+
// finalize() resolves via no_data_timeout with hadAudioSignal=true, we
|
|
245
|
+
// replay the buffer on a fresh WS once. Bounded: 32KB/s × ~60s max ≈ 2MB.
|
|
246
|
+
const fullAudioRef = useRef<Buffer[]>([])
|
|
247
|
+
const silentDropRetriedRef = useRef(false)
|
|
248
|
+
// Bumped when the early-error retry is scheduled. Captured per
|
|
249
|
+
// attemptConnect — onError swallows stale-gen events (conn 1's
|
|
250
|
+
// trailing close-error) but surfaces current-gen ones (conn 2's
|
|
251
|
+
// genuine failure). Same shape as sessionGenRef, one level down.
|
|
252
|
+
const attemptGenRef = useRef(0)
|
|
253
|
+
// Running total of chars flushed in focus mode (each final transcript is
|
|
254
|
+
// injected immediately and accumulatedRef reset). Added to transcriptChars
|
|
255
|
+
// in the completed event so focus-mode sessions don't false-positive as
|
|
256
|
+
// silent-drops (transcriptChars=0 despite successful transcription).
|
|
257
|
+
const focusFlushedCharsRef = useRef(0)
|
|
258
|
+
// True if at least one audio chunk with non-trivial signal was received.
|
|
259
|
+
// Used to distinguish "microphone is silent/inaccessible" from "speech not detected".
|
|
260
|
+
const hasAudioSignalRef = useRef(false)
|
|
261
|
+
// True once onReady fired for the current session. Unlike connectionRef
|
|
262
|
+
// (which cleanup() nulls), this survives effect-order races where Effect 3
|
|
263
|
+
// cleanup runs before Effect 2's finishRecording() — e.g. /voice toggled
|
|
264
|
+
// off mid-recording in focus mode. Used for the wsConnected analytics
|
|
265
|
+
// dimension and error-message branching. Reset in startRecordingSession.
|
|
266
|
+
const everConnectedRef = useRef(false)
|
|
267
|
+
const audioLevelsRef = useRef<number[]>([])
|
|
268
|
+
const isFocused = useTerminalFocus()
|
|
269
|
+
const setVoiceState = useSetVoiceState()
|
|
270
|
+
|
|
271
|
+
// Keep callback refs current without triggering re-renders
|
|
272
|
+
onTranscriptRef.current = onTranscript
|
|
273
|
+
onErrorRef.current = onError
|
|
274
|
+
|
|
275
|
+
function updateState(newState: VoiceState): void {
|
|
276
|
+
stateRef.current = newState
|
|
277
|
+
setState(newState)
|
|
278
|
+
setVoiceState(prev => {
|
|
279
|
+
if (prev.voiceState === newState) return prev
|
|
280
|
+
return { ...prev, voiceState: newState }
|
|
281
|
+
})
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const cleanup = useCallback((): void => {
|
|
285
|
+
// Stale any in-flight session (main connection isStale(), replay
|
|
286
|
+
// isStale(), finishRecording continuation). Without this, disabling
|
|
287
|
+
// voice during the replay window lets the stale replay open a WS,
|
|
288
|
+
// accumulate transcript, and inject it after voice was torn down.
|
|
289
|
+
sessionGenRef.current++
|
|
290
|
+
if (cleanupTimerRef.current) {
|
|
291
|
+
clearTimeout(cleanupTimerRef.current)
|
|
292
|
+
cleanupTimerRef.current = null
|
|
293
|
+
}
|
|
294
|
+
if (releaseTimerRef.current) {
|
|
295
|
+
clearTimeout(releaseTimerRef.current)
|
|
296
|
+
releaseTimerRef.current = null
|
|
297
|
+
}
|
|
298
|
+
if (repeatFallbackTimerRef.current) {
|
|
299
|
+
clearTimeout(repeatFallbackTimerRef.current)
|
|
300
|
+
repeatFallbackTimerRef.current = null
|
|
301
|
+
}
|
|
302
|
+
if (focusSilenceTimerRef.current) {
|
|
303
|
+
clearTimeout(focusSilenceTimerRef.current)
|
|
304
|
+
focusSilenceTimerRef.current = null
|
|
305
|
+
}
|
|
306
|
+
silenceTimedOutRef.current = false
|
|
307
|
+
voiceModule?.stopRecording()
|
|
308
|
+
if (connectionRef.current) {
|
|
309
|
+
connectionRef.current.close()
|
|
310
|
+
connectionRef.current = null
|
|
311
|
+
}
|
|
312
|
+
accumulatedRef.current = ''
|
|
313
|
+
audioLevelsRef.current = []
|
|
314
|
+
fullAudioRef.current = []
|
|
315
|
+
setVoiceState(prev => {
|
|
316
|
+
if (prev.voiceInterimTranscript === '' && !prev.voiceAudioLevels.length)
|
|
317
|
+
return prev
|
|
318
|
+
return { ...prev, voiceInterimTranscript: '', voiceAudioLevels: [] }
|
|
319
|
+
})
|
|
320
|
+
}, [setVoiceState])
|
|
321
|
+
|
|
322
|
+
function finishRecording(): void {
|
|
323
|
+
logForDebugging(
|
|
324
|
+
'[voice] finishRecording: stopping recording, transitioning to processing',
|
|
325
|
+
)
|
|
326
|
+
// Session ending — stale any in-flight attempt so its late onError
|
|
327
|
+
// (conn 2 responding after user released key) doesn't double-fire on
|
|
328
|
+
// top of the "check network" message below.
|
|
329
|
+
attemptGenRef.current++
|
|
330
|
+
// Capture focusTriggered BEFORE clearing it — needed as an event dimension
|
|
331
|
+
// so BigQuery can filter out passive focus-mode auto-recordings (user focused
|
|
332
|
+
// terminal without speaking → ambient noise sets hadAudioSignal=true → false
|
|
333
|
+
// silent-drop signature). focusFlushedCharsRef fixes transcriptChars accuracy
|
|
334
|
+
// for sessions WITH speech; focusTriggered enables filtering sessions WITHOUT.
|
|
335
|
+
const focusTriggered = focusTriggeredRef.current
|
|
336
|
+
focusTriggeredRef.current = false
|
|
337
|
+
updateState('processing')
|
|
338
|
+
voiceModule?.stopRecording()
|
|
339
|
+
// Capture duration BEFORE the finalize round-trip so that the WebSocket
|
|
340
|
+
// wait time is not included (otherwise a quick tap looks like > 2s).
|
|
341
|
+
// All ref-backed values are captured here, BEFORE the async boundary —
|
|
342
|
+
// a keypress during the finalize wait can start a new session and reset
|
|
343
|
+
// these refs (e.g. focusFlushedCharsRef = 0 in startRecordingSession),
|
|
344
|
+
// reproducing the silent-drop false-positive this ref exists to prevent.
|
|
345
|
+
const recordingDurationMs = Date.now() - recordingStartRef.current
|
|
346
|
+
const hadAudioSignal = hasAudioSignalRef.current
|
|
347
|
+
const retried = retryUsedRef.current
|
|
348
|
+
const focusFlushedChars = focusFlushedCharsRef.current
|
|
349
|
+
// wsConnected distinguishes "backend received audio but dropped it" (the
|
|
350
|
+
// bug backend PR #287008 fixes) from "WS handshake never completed" —
|
|
351
|
+
// in the latter case audio is still in audioBuffer, never reached the
|
|
352
|
+
// server, but hasAudioSignalRef is already true from ambient noise.
|
|
353
|
+
const wsConnected = everConnectedRef.current
|
|
354
|
+
// Capture generation BEFORE the .then() — if a new session starts during
|
|
355
|
+
// the finalize wait, sessionGenRef has already advanced by the time the
|
|
356
|
+
// continuation runs, so capturing inside the .then() would yield the new
|
|
357
|
+
// session's gen and every staleness check would be a no-op.
|
|
358
|
+
const myGen = sessionGenRef.current
|
|
359
|
+
const isStale = () => sessionGenRef.current !== myGen
|
|
360
|
+
logForDebugging('[voice] Recording stopped')
|
|
361
|
+
|
|
362
|
+
// Send finalize and wait for the WebSocket to close before reading the
|
|
363
|
+
// accumulated transcript. The close handler promotes any unreported
|
|
364
|
+
// interim text to final, so we must wait for it to fire.
|
|
365
|
+
const finalizePromise: Promise<FinalizeSource | undefined> =
|
|
366
|
+
connectionRef.current
|
|
367
|
+
? connectionRef.current.finalize()
|
|
368
|
+
: Promise.resolve(undefined)
|
|
369
|
+
|
|
370
|
+
void finalizePromise
|
|
371
|
+
.then(async finalizeSource => {
|
|
372
|
+
if (isStale()) return
|
|
373
|
+
// Silent-drop replay: when the server accepted audio (wsConnected),
|
|
374
|
+
// the mic captured real signal (hadAudioSignal), but finalize timed
|
|
375
|
+
// out with zero transcript — the ~1% session-sticky CE-pod bug.
|
|
376
|
+
// Replay the buffered audio on a fresh connection once. A 250ms
|
|
377
|
+
// backoff clears the same-pod rapid-reconnect race (same gap as the
|
|
378
|
+
// early-error retry path below).
|
|
379
|
+
if (
|
|
380
|
+
finalizeSource === 'no_data_timeout' &&
|
|
381
|
+
hadAudioSignal &&
|
|
382
|
+
wsConnected &&
|
|
383
|
+
!focusTriggered &&
|
|
384
|
+
focusFlushedChars === 0 &&
|
|
385
|
+
accumulatedRef.current.trim() === '' &&
|
|
386
|
+
!silentDropRetriedRef.current &&
|
|
387
|
+
fullAudioRef.current.length > 0
|
|
388
|
+
) {
|
|
389
|
+
silentDropRetriedRef.current = true
|
|
390
|
+
logForDebugging(
|
|
391
|
+
`[voice] Silent-drop detected (no_data_timeout, ${String(fullAudioRef.current.length)} chunks); replaying on fresh connection`,
|
|
392
|
+
)
|
|
393
|
+
logEvent('tengu_voice_silent_drop_replay', {
|
|
394
|
+
recordingDurationMs,
|
|
395
|
+
chunkCount: fullAudioRef.current.length,
|
|
396
|
+
})
|
|
397
|
+
if (connectionRef.current) {
|
|
398
|
+
connectionRef.current.close()
|
|
399
|
+
connectionRef.current = null
|
|
400
|
+
}
|
|
401
|
+
const replayBuffer = fullAudioRef.current
|
|
402
|
+
await sleep(250)
|
|
403
|
+
if (isStale()) return
|
|
404
|
+
const stt = normalizeLanguageForSTT(getInitialSettings().language)
|
|
405
|
+
const keyterms = await getVoiceKeyterms()
|
|
406
|
+
if (isStale()) return
|
|
407
|
+
await new Promise<void>(resolve => {
|
|
408
|
+
void connectVoiceStream(
|
|
409
|
+
{
|
|
410
|
+
onTranscript: (t, isFinal) => {
|
|
411
|
+
if (isStale()) return
|
|
412
|
+
if (isFinal && t.trim()) {
|
|
413
|
+
if (accumulatedRef.current) accumulatedRef.current += ' '
|
|
414
|
+
accumulatedRef.current += t.trim()
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
onError: () => resolve(),
|
|
418
|
+
onClose: () => {},
|
|
419
|
+
onReady: conn => {
|
|
420
|
+
if (isStale()) {
|
|
421
|
+
conn.close()
|
|
422
|
+
resolve()
|
|
423
|
+
return
|
|
424
|
+
}
|
|
425
|
+
connectionRef.current = conn
|
|
426
|
+
const SLICE = 32_000
|
|
427
|
+
let slice: Buffer[] = []
|
|
428
|
+
let bytes = 0
|
|
429
|
+
for (const c of replayBuffer) {
|
|
430
|
+
if (bytes > 0 && bytes + c.length > SLICE) {
|
|
431
|
+
conn.send(Buffer.concat(slice))
|
|
432
|
+
slice = []
|
|
433
|
+
bytes = 0
|
|
434
|
+
}
|
|
435
|
+
slice.push(c)
|
|
436
|
+
bytes += c.length
|
|
437
|
+
}
|
|
438
|
+
if (slice.length) conn.send(Buffer.concat(slice))
|
|
439
|
+
void conn.finalize().then(() => {
|
|
440
|
+
conn.close()
|
|
441
|
+
resolve()
|
|
442
|
+
})
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
{ language: stt.code, keyterms },
|
|
446
|
+
).then(
|
|
447
|
+
c => {
|
|
448
|
+
if (!c) resolve()
|
|
449
|
+
},
|
|
450
|
+
() => resolve(),
|
|
451
|
+
)
|
|
452
|
+
})
|
|
453
|
+
if (isStale()) return
|
|
454
|
+
}
|
|
455
|
+
fullAudioRef.current = []
|
|
456
|
+
|
|
457
|
+
const text = accumulatedRef.current.trim()
|
|
458
|
+
logForDebugging(
|
|
459
|
+
`[voice] Final transcript assembled (${String(text.length)} chars): "${text.slice(0, 200)}"`,
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
// Tracks silent-drop rate: transcriptChars=0 + hadAudioSignal=true
|
|
463
|
+
// + recordingDurationMs>2000 = the bug backend PR #287008 fixes.
|
|
464
|
+
// focusFlushedCharsRef makes transcriptChars accurate for focus mode
|
|
465
|
+
// (where each final is injected immediately and accumulatedRef reset).
|
|
466
|
+
//
|
|
467
|
+
// NOTE: this fires only on the finishRecording() path. The onError
|
|
468
|
+
// fallthrough and !conn (no-OAuth) paths bypass this → don't compute
|
|
469
|
+
// COUNT(completed)/COUNT(started) as a success rate; the silent-drop
|
|
470
|
+
// denominator (completed events only) is internally consistent.
|
|
471
|
+
logEvent('tengu_voice_recording_completed', {
|
|
472
|
+
transcriptChars: text.length + focusFlushedChars,
|
|
473
|
+
recordingDurationMs,
|
|
474
|
+
hadAudioSignal,
|
|
475
|
+
retried,
|
|
476
|
+
silentDropRetried: silentDropRetriedRef.current,
|
|
477
|
+
wsConnected,
|
|
478
|
+
focusTriggered,
|
|
479
|
+
})
|
|
480
|
+
|
|
481
|
+
if (connectionRef.current) {
|
|
482
|
+
connectionRef.current.close()
|
|
483
|
+
connectionRef.current = null
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (text) {
|
|
487
|
+
logForDebugging(
|
|
488
|
+
`[voice] Injecting transcript (${String(text.length)} chars)`,
|
|
489
|
+
)
|
|
490
|
+
onTranscriptRef.current(text)
|
|
491
|
+
} else if (focusFlushedChars === 0 && recordingDurationMs > 2000) {
|
|
492
|
+
// Only warn about empty transcript if nothing was flushed in focus
|
|
493
|
+
// mode either, and recording was > 2s (short recordings = accidental
|
|
494
|
+
// taps → silently return to idle).
|
|
495
|
+
if (!wsConnected) {
|
|
496
|
+
// WS never connected → audio never reached backend. Not a silent
|
|
497
|
+
// drop; a connection failure (slow OAuth refresh, network, etc).
|
|
498
|
+
onErrorRef.current?.(
|
|
499
|
+
'Voice connection failed. Check your network and try again.',
|
|
500
|
+
)
|
|
501
|
+
} else if (!hadAudioSignal) {
|
|
502
|
+
// Distinguish silent mic (capture issue) from speech not recognized.
|
|
503
|
+
onErrorRef.current?.(
|
|
504
|
+
'No audio detected from microphone. Check that the correct input device is selected and that Claude Code has microphone access.',
|
|
505
|
+
)
|
|
506
|
+
} else {
|
|
507
|
+
onErrorRef.current?.('No speech detected.')
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
accumulatedRef.current = ''
|
|
512
|
+
setVoiceState(prev => {
|
|
513
|
+
if (prev.voiceInterimTranscript === '') return prev
|
|
514
|
+
return { ...prev, voiceInterimTranscript: '' }
|
|
515
|
+
})
|
|
516
|
+
updateState('idle')
|
|
517
|
+
})
|
|
518
|
+
.catch(err => {
|
|
519
|
+
logError(toError(err))
|
|
520
|
+
if (!isStale()) updateState('idle')
|
|
521
|
+
})
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// When voice is enabled, lazy-import voice.ts so checkRecordingAvailability
|
|
525
|
+
// et al. are ready when the user presses the voice key. Do NOT preload the
|
|
526
|
+
// native module — require('audio-capture.node') is a synchronous dlopen of
|
|
527
|
+
// CoreAudio/AudioUnit that blocks the event loop for ~1s (warm) to ~8s
|
|
528
|
+
// (cold coreaudiod). setImmediate doesn't help: it yields one tick, then the
|
|
529
|
+
// dlopen still blocks. The first voice keypress pays the dlopen cost instead.
|
|
530
|
+
useEffect(() => {
|
|
531
|
+
if (enabled && !voiceModule) {
|
|
532
|
+
void import('../services/voice.js').then(mod => {
|
|
533
|
+
voiceModule = mod
|
|
534
|
+
})
|
|
535
|
+
}
|
|
536
|
+
}, [enabled])
|
|
537
|
+
|
|
538
|
+
// ── Focus silence timer ────────────────────────────────────────────
|
|
539
|
+
// Arms (or resets) a timer that tears down the focus-mode session
|
|
540
|
+
// after FOCUS_SILENCE_TIMEOUT_MS of no speech. Called when a session
|
|
541
|
+
// starts and after each flushed transcript.
|
|
542
|
+
function armFocusSilenceTimer(): void {
|
|
543
|
+
if (focusSilenceTimerRef.current) {
|
|
544
|
+
clearTimeout(focusSilenceTimerRef.current)
|
|
545
|
+
}
|
|
546
|
+
focusSilenceTimerRef.current = setTimeout(
|
|
547
|
+
(
|
|
548
|
+
focusSilenceTimerRef,
|
|
549
|
+
stateRef,
|
|
550
|
+
focusTriggeredRef,
|
|
551
|
+
silenceTimedOutRef,
|
|
552
|
+
finishRecording,
|
|
553
|
+
) => {
|
|
554
|
+
focusSilenceTimerRef.current = null
|
|
555
|
+
if (stateRef.current === 'recording' && focusTriggeredRef.current) {
|
|
556
|
+
logForDebugging(
|
|
557
|
+
'[voice] Focus silence timeout — tearing down session',
|
|
558
|
+
)
|
|
559
|
+
silenceTimedOutRef.current = true
|
|
560
|
+
finishRecording()
|
|
561
|
+
}
|
|
562
|
+
},
|
|
563
|
+
FOCUS_SILENCE_TIMEOUT_MS,
|
|
564
|
+
focusSilenceTimerRef,
|
|
565
|
+
stateRef,
|
|
566
|
+
focusTriggeredRef,
|
|
567
|
+
silenceTimedOutRef,
|
|
568
|
+
finishRecording,
|
|
569
|
+
)
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// ── Focus-driven recording ──────────────────────────────────────────
|
|
573
|
+
// In focus mode, start recording when the terminal gains focus and
|
|
574
|
+
// stop when it loses focus. This enables a "multi-clauding army"
|
|
575
|
+
// workflow where voice input follows window focus.
|
|
576
|
+
useEffect(() => {
|
|
577
|
+
if (!enabled || !focusMode) {
|
|
578
|
+
// Focus mode was disabled while a focus-driven recording was active —
|
|
579
|
+
// stop the recording so it doesn't linger until the silence timer fires.
|
|
580
|
+
if (focusTriggeredRef.current && stateRef.current === 'recording') {
|
|
581
|
+
logForDebugging(
|
|
582
|
+
'[voice] Focus mode disabled during recording, finishing',
|
|
583
|
+
)
|
|
584
|
+
finishRecording()
|
|
585
|
+
}
|
|
586
|
+
return
|
|
587
|
+
}
|
|
588
|
+
let cancelled = false
|
|
589
|
+
if (
|
|
590
|
+
isFocused &&
|
|
591
|
+
stateRef.current === 'idle' &&
|
|
592
|
+
!silenceTimedOutRef.current
|
|
593
|
+
) {
|
|
594
|
+
const beginFocusRecording = (): void => {
|
|
595
|
+
// Re-check conditions — state or enabled/focusMode may have changed
|
|
596
|
+
// during the await (effect cleanup sets cancelled).
|
|
597
|
+
if (
|
|
598
|
+
cancelled ||
|
|
599
|
+
stateRef.current !== 'idle' ||
|
|
600
|
+
silenceTimedOutRef.current
|
|
601
|
+
)
|
|
602
|
+
return
|
|
603
|
+
logForDebugging('[voice] Focus gained, starting recording session')
|
|
604
|
+
focusTriggeredRef.current = true
|
|
605
|
+
void startRecordingSession()
|
|
606
|
+
armFocusSilenceTimer()
|
|
607
|
+
}
|
|
608
|
+
if (voiceModule) {
|
|
609
|
+
beginFocusRecording()
|
|
610
|
+
} else {
|
|
611
|
+
// Voice module is loading (async import resolves from cache as a
|
|
612
|
+
// microtask). Wait for it before starting the recording session.
|
|
613
|
+
void import('../services/voice.js').then(mod => {
|
|
614
|
+
voiceModule = mod
|
|
615
|
+
beginFocusRecording()
|
|
616
|
+
})
|
|
617
|
+
}
|
|
618
|
+
} else if (!isFocused) {
|
|
619
|
+
// Clear the silence timeout flag on blur so the next focus
|
|
620
|
+
// cycle re-arms recording.
|
|
621
|
+
silenceTimedOutRef.current = false
|
|
622
|
+
if (stateRef.current === 'recording') {
|
|
623
|
+
logForDebugging('[voice] Focus lost, finishing recording')
|
|
624
|
+
finishRecording()
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
return () => {
|
|
628
|
+
cancelled = true
|
|
629
|
+
}
|
|
630
|
+
}, [enabled, focusMode, isFocused])
|
|
631
|
+
|
|
632
|
+
// ── Start a new recording session (voice_stream connect + audio) ──
|
|
633
|
+
async function startRecordingSession(): Promise<void> {
|
|
634
|
+
if (!voiceModule) {
|
|
635
|
+
onErrorRef.current?.(
|
|
636
|
+
'Voice module not loaded yet. Try again in a moment.',
|
|
637
|
+
)
|
|
638
|
+
return
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// Transition to 'recording' synchronously, BEFORE any await. Callers
|
|
642
|
+
// read state synchronously right after `void startRecordingSession()`:
|
|
643
|
+
// - useVoiceIntegration.tsx space-hold guard reads voiceState from the
|
|
644
|
+
// store immediately — if it sees 'idle' it clears isSpaceHoldActiveRef
|
|
645
|
+
// and space auto-repeat leaks into the text input (100% repro)
|
|
646
|
+
// - handleKeyEvent's `currentState === 'idle'` re-entry check below
|
|
647
|
+
// If an await runs first, both see stale 'idle'. See PR #20873 review.
|
|
648
|
+
updateState('recording')
|
|
649
|
+
recordingStartRef.current = Date.now()
|
|
650
|
+
accumulatedRef.current = ''
|
|
651
|
+
seenRepeatRef.current = false
|
|
652
|
+
hasAudioSignalRef.current = false
|
|
653
|
+
retryUsedRef.current = false
|
|
654
|
+
silentDropRetriedRef.current = false
|
|
655
|
+
fullAudioRef.current = []
|
|
656
|
+
focusFlushedCharsRef.current = 0
|
|
657
|
+
everConnectedRef.current = false
|
|
658
|
+
const myGen = ++sessionGenRef.current
|
|
659
|
+
|
|
660
|
+
// ── Pre-check: can we actually record audio? ──────────────
|
|
661
|
+
const availability = await voiceModule.checkRecordingAvailability()
|
|
662
|
+
if (!availability.available) {
|
|
663
|
+
logForDebugging(
|
|
664
|
+
`[voice] Recording not available: ${availability.reason ?? 'unknown'}`,
|
|
665
|
+
)
|
|
666
|
+
onErrorRef.current?.(
|
|
667
|
+
availability.reason ?? 'Audio recording is not available.',
|
|
668
|
+
)
|
|
669
|
+
cleanup()
|
|
670
|
+
updateState('idle')
|
|
671
|
+
return
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
logForDebugging(
|
|
675
|
+
'[voice] Starting recording session, connecting voice stream',
|
|
676
|
+
)
|
|
677
|
+
// Clear any previous error
|
|
678
|
+
setVoiceState(prev => {
|
|
679
|
+
if (!prev.voiceError) return prev
|
|
680
|
+
return { ...prev, voiceError: null }
|
|
681
|
+
})
|
|
682
|
+
|
|
683
|
+
// Buffer audio chunks while the WebSocket connects. Once the connection
|
|
684
|
+
// is ready (onReady fires), buffered chunks are flushed and subsequent
|
|
685
|
+
// chunks are sent directly.
|
|
686
|
+
const audioBuffer: Buffer[] = []
|
|
687
|
+
|
|
688
|
+
// Start recording IMMEDIATELY — audio is buffered until the WebSocket
|
|
689
|
+
// opens, eliminating the 1-2s latency from waiting for OAuth + WS connect.
|
|
690
|
+
logForDebugging(
|
|
691
|
+
'[voice] startRecording: buffering audio while WebSocket connects',
|
|
692
|
+
)
|
|
693
|
+
audioLevelsRef.current = []
|
|
694
|
+
const started = await voiceModule.startRecording(
|
|
695
|
+
(chunk: Buffer) => {
|
|
696
|
+
// Copy for fullAudioRef replay buffer. send() in voiceStreamSTT
|
|
697
|
+
// copies again defensively — acceptable overhead at audio rates.
|
|
698
|
+
// Skip buffering in focus mode — replay is gated on !focusTriggered
|
|
699
|
+
// so the buffer is dead weight (up to ~20MB for a 10min session).
|
|
700
|
+
const owned = Buffer.from(chunk)
|
|
701
|
+
if (!focusTriggeredRef.current) {
|
|
702
|
+
fullAudioRef.current.push(owned)
|
|
703
|
+
}
|
|
704
|
+
if (connectionRef.current) {
|
|
705
|
+
connectionRef.current.send(owned)
|
|
706
|
+
} else {
|
|
707
|
+
audioBuffer.push(owned)
|
|
708
|
+
}
|
|
709
|
+
// Update audio level histogram for the recording visualizer
|
|
710
|
+
const level = computeLevel(chunk)
|
|
711
|
+
if (!hasAudioSignalRef.current && level > 0.01) {
|
|
712
|
+
hasAudioSignalRef.current = true
|
|
713
|
+
}
|
|
714
|
+
const levels = audioLevelsRef.current
|
|
715
|
+
if (levels.length >= AUDIO_LEVEL_BARS) {
|
|
716
|
+
levels.shift()
|
|
717
|
+
}
|
|
718
|
+
levels.push(level)
|
|
719
|
+
// Copy the array so React sees a new reference
|
|
720
|
+
const snapshot = [...levels]
|
|
721
|
+
audioLevelsRef.current = snapshot
|
|
722
|
+
setVoiceState(prev => ({ ...prev, voiceAudioLevels: snapshot }))
|
|
723
|
+
},
|
|
724
|
+
() => {
|
|
725
|
+
// External end (e.g. device error) - treat as stop
|
|
726
|
+
if (stateRef.current === 'recording') {
|
|
727
|
+
finishRecording()
|
|
728
|
+
}
|
|
729
|
+
},
|
|
730
|
+
{ silenceDetection: false },
|
|
731
|
+
)
|
|
732
|
+
|
|
733
|
+
if (!started) {
|
|
734
|
+
logError(new Error('[voice] Recording failed — no audio tool found'))
|
|
735
|
+
onErrorRef.current?.(
|
|
736
|
+
'Failed to start audio capture. Check that your microphone is accessible.',
|
|
737
|
+
)
|
|
738
|
+
cleanup()
|
|
739
|
+
updateState('idle')
|
|
740
|
+
setVoiceState(prev => ({
|
|
741
|
+
...prev,
|
|
742
|
+
voiceError: 'Recording failed — no audio tool found',
|
|
743
|
+
}))
|
|
744
|
+
return
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
const rawLanguage = getInitialSettings().language
|
|
748
|
+
const stt = normalizeLanguageForSTT(rawLanguage)
|
|
749
|
+
logEvent('tengu_voice_recording_started', {
|
|
750
|
+
focusTriggered: focusTriggeredRef.current,
|
|
751
|
+
sttLanguage:
|
|
752
|
+
stt.code as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
753
|
+
sttLanguageIsDefault: !rawLanguage?.trim(),
|
|
754
|
+
sttLanguageFellBack: stt.fellBackFrom !== undefined,
|
|
755
|
+
// ISO 639 subtag from Intl (bounded set, never user text). undefined if
|
|
756
|
+
// Intl failed — omitted from the payload, no retry cost (cached).
|
|
757
|
+
systemLocaleLanguage:
|
|
758
|
+
getSystemLocaleLanguage() as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
759
|
+
})
|
|
760
|
+
|
|
761
|
+
// Retry once if the connection errors before delivering any transcript.
|
|
762
|
+
// The conversation-engine proxy can reject rapid reconnects (~1/N_pods
|
|
763
|
+
// same-pod collision) or CE's Deepgram upstream can fail during its own
|
|
764
|
+
// teardown window (anthropics/anthropic#287008 surfaces this as
|
|
765
|
+
// TranscriptError instead of silent-drop). A 250ms backoff clears both.
|
|
766
|
+
// Audio captured during the retry window routes to audioBuffer (via the
|
|
767
|
+
// connectionRef.current null check in the recording callback above) and
|
|
768
|
+
// is flushed by the second onReady.
|
|
769
|
+
let sawTranscript = false
|
|
770
|
+
|
|
771
|
+
// Connect WebSocket in parallel with audio recording.
|
|
772
|
+
// Gather keyterms first (async but fast — no model calls), then connect.
|
|
773
|
+
// Bail from callbacks if a newer session has started. Prevents a
|
|
774
|
+
// slow-connecting zombie WS (e.g. user released, pressed again, first
|
|
775
|
+
// WS still handshaking) from firing onReady/onError into the new
|
|
776
|
+
// session and corrupting its connectionRef / triggering a bogus retry.
|
|
777
|
+
const isStale = () => sessionGenRef.current !== myGen
|
|
778
|
+
|
|
779
|
+
const attemptConnect = (keyterms: string[]): void => {
|
|
780
|
+
const myAttemptGen = attemptGenRef.current
|
|
781
|
+
void connectVoiceStream(
|
|
782
|
+
{
|
|
783
|
+
onTranscript: (text: string, isFinal: boolean) => {
|
|
784
|
+
if (isStale()) return
|
|
785
|
+
sawTranscript = true
|
|
786
|
+
logForDebugging(
|
|
787
|
+
`[voice] onTranscript: isFinal=${String(isFinal)} text="${text}"`,
|
|
788
|
+
)
|
|
789
|
+
if (isFinal && text.trim()) {
|
|
790
|
+
if (focusTriggeredRef.current) {
|
|
791
|
+
// Focus mode: flush each final transcript immediately and
|
|
792
|
+
// keep recording. This gives continuous transcription while
|
|
793
|
+
// the terminal is focused.
|
|
794
|
+
logForDebugging(
|
|
795
|
+
`[voice] Focus mode: flushing final transcript immediately: "${text.trim()}"`,
|
|
796
|
+
)
|
|
797
|
+
onTranscriptRef.current(text.trim())
|
|
798
|
+
focusFlushedCharsRef.current += text.trim().length
|
|
799
|
+
setVoiceState(prev => {
|
|
800
|
+
if (prev.voiceInterimTranscript === '') return prev
|
|
801
|
+
return { ...prev, voiceInterimTranscript: '' }
|
|
802
|
+
})
|
|
803
|
+
accumulatedRef.current = ''
|
|
804
|
+
// User is actively speaking — reset the silence timer.
|
|
805
|
+
armFocusSilenceTimer()
|
|
806
|
+
} else {
|
|
807
|
+
// Hold-to-talk: accumulate final transcripts separated by spaces
|
|
808
|
+
if (accumulatedRef.current) {
|
|
809
|
+
accumulatedRef.current += ' '
|
|
810
|
+
}
|
|
811
|
+
accumulatedRef.current += text.trim()
|
|
812
|
+
logForDebugging(
|
|
813
|
+
`[voice] Accumulated final transcript: "${accumulatedRef.current}"`,
|
|
814
|
+
)
|
|
815
|
+
// Clear interim since final supersedes it
|
|
816
|
+
setVoiceState(prev => {
|
|
817
|
+
const preview = accumulatedRef.current
|
|
818
|
+
if (prev.voiceInterimTranscript === preview) return prev
|
|
819
|
+
return { ...prev, voiceInterimTranscript: preview }
|
|
820
|
+
})
|
|
821
|
+
}
|
|
822
|
+
} else if (!isFinal) {
|
|
823
|
+
// Active interim speech resets the focus silence timer.
|
|
824
|
+
// Nova 3 disables auto-finalize so isFinal is never true
|
|
825
|
+
// mid-stream — without this, the 5s timer fires during
|
|
826
|
+
// active speech and tears down the session.
|
|
827
|
+
if (focusTriggeredRef.current) {
|
|
828
|
+
armFocusSilenceTimer()
|
|
829
|
+
}
|
|
830
|
+
// Show accumulated finals + current interim as live preview
|
|
831
|
+
const interim = text.trim()
|
|
832
|
+
const preview = accumulatedRef.current
|
|
833
|
+
? accumulatedRef.current + (interim ? ' ' + interim : '')
|
|
834
|
+
: interim
|
|
835
|
+
setVoiceState(prev => {
|
|
836
|
+
if (prev.voiceInterimTranscript === preview) return prev
|
|
837
|
+
return { ...prev, voiceInterimTranscript: preview }
|
|
838
|
+
})
|
|
839
|
+
}
|
|
840
|
+
},
|
|
841
|
+
onError: (error: string, opts?: { fatal?: boolean }) => {
|
|
842
|
+
if (isStale()) {
|
|
843
|
+
logForDebugging(
|
|
844
|
+
`[voice] ignoring onError from stale session: ${error}`,
|
|
845
|
+
)
|
|
846
|
+
return
|
|
847
|
+
}
|
|
848
|
+
// Swallow errors from superseded attempts. Covers conn 1's
|
|
849
|
+
// trailing close after retry is scheduled, AND the current
|
|
850
|
+
// conn's ws close event after its ws error already surfaced
|
|
851
|
+
// below (gen bumped at surface).
|
|
852
|
+
if (attemptGenRef.current !== myAttemptGen) {
|
|
853
|
+
logForDebugging(
|
|
854
|
+
`[voice] ignoring stale onError from superseded attempt: ${error}`,
|
|
855
|
+
)
|
|
856
|
+
return
|
|
857
|
+
}
|
|
858
|
+
// Early-failure retry: server error before any transcript =
|
|
859
|
+
// likely a transient upstream race (CE rejection, Deepgram
|
|
860
|
+
// not ready). Clear connectionRef so audio re-buffers, back
|
|
861
|
+
// off, reconnect. Skip if the user has already released the
|
|
862
|
+
// key (state left 'recording') — no point retrying a session
|
|
863
|
+
// they've ended. Fatal errors (Cloudflare bot challenge, auth
|
|
864
|
+
// rejection) are the same failure on every retry attempt, so
|
|
865
|
+
// fall through to surface the message.
|
|
866
|
+
if (
|
|
867
|
+
!opts?.fatal &&
|
|
868
|
+
!sawTranscript &&
|
|
869
|
+
stateRef.current === 'recording'
|
|
870
|
+
) {
|
|
871
|
+
if (!retryUsedRef.current) {
|
|
872
|
+
retryUsedRef.current = true
|
|
873
|
+
logForDebugging(
|
|
874
|
+
`[voice] early voice_stream error (pre-transcript), retrying once: ${error}`,
|
|
875
|
+
)
|
|
876
|
+
logEvent('tengu_voice_stream_early_retry', {})
|
|
877
|
+
connectionRef.current = null
|
|
878
|
+
attemptGenRef.current++
|
|
879
|
+
setTimeout(
|
|
880
|
+
(stateRef, attemptConnect, keyterms) => {
|
|
881
|
+
if (stateRef.current === 'recording') {
|
|
882
|
+
attemptConnect(keyterms)
|
|
883
|
+
}
|
|
884
|
+
},
|
|
885
|
+
250,
|
|
886
|
+
stateRef,
|
|
887
|
+
attemptConnect,
|
|
888
|
+
keyterms,
|
|
889
|
+
)
|
|
890
|
+
return
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
// Surfacing — bump gen so this conn's trailing close-error
|
|
894
|
+
// (ws fires error then close 1006) is swallowed above.
|
|
895
|
+
attemptGenRef.current++
|
|
896
|
+
logError(new Error(`[voice] voice_stream error: ${error}`))
|
|
897
|
+
onErrorRef.current?.(`Voice stream error: ${error}`)
|
|
898
|
+
// Clear the audio buffer on error to avoid memory leaks
|
|
899
|
+
audioBuffer.length = 0
|
|
900
|
+
focusTriggeredRef.current = false
|
|
901
|
+
cleanup()
|
|
902
|
+
updateState('idle')
|
|
903
|
+
},
|
|
904
|
+
onClose: () => {
|
|
905
|
+
// no-op; lifecycle handled by cleanup()
|
|
906
|
+
},
|
|
907
|
+
onReady: conn => {
|
|
908
|
+
// Only proceed if we're still in recording state AND this is
|
|
909
|
+
// still the current session. A zombie late-connecting WS from
|
|
910
|
+
// an abandoned session can pass the 'recording' check if the
|
|
911
|
+
// user has since started a new session.
|
|
912
|
+
if (isStale() || stateRef.current !== 'recording') {
|
|
913
|
+
conn.close()
|
|
914
|
+
return
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// The WebSocket is now truly open — assign connectionRef so
|
|
918
|
+
// subsequent audio callbacks send directly instead of buffering.
|
|
919
|
+
connectionRef.current = conn
|
|
920
|
+
everConnectedRef.current = true
|
|
921
|
+
|
|
922
|
+
// Flush all audio chunks that were buffered while the WebSocket
|
|
923
|
+
// was connecting. This is safe because onReady fires from the
|
|
924
|
+
// WebSocket 'open' event, guaranteeing send() will not be dropped.
|
|
925
|
+
//
|
|
926
|
+
// Coalesce into ~1s slices rather than one ws.send per chunk
|
|
927
|
+
// — fewer WS frames means less overhead on both ends.
|
|
928
|
+
const SLICE_TARGET_BYTES = 32_000 // ~1s at 16kHz/16-bit/mono
|
|
929
|
+
if (audioBuffer.length > 0) {
|
|
930
|
+
let totalBytes = 0
|
|
931
|
+
for (const c of audioBuffer) totalBytes += c.length
|
|
932
|
+
const slices: Buffer[][] = [[]]
|
|
933
|
+
let sliceBytes = 0
|
|
934
|
+
for (const chunk of audioBuffer) {
|
|
935
|
+
if (
|
|
936
|
+
sliceBytes > 0 &&
|
|
937
|
+
sliceBytes + chunk.length > SLICE_TARGET_BYTES
|
|
938
|
+
) {
|
|
939
|
+
slices.push([])
|
|
940
|
+
sliceBytes = 0
|
|
941
|
+
}
|
|
942
|
+
slices[slices.length - 1]!.push(chunk)
|
|
943
|
+
sliceBytes += chunk.length
|
|
944
|
+
}
|
|
945
|
+
logForDebugging(
|
|
946
|
+
`[voice] onReady: flushing ${String(audioBuffer.length)} buffered chunks (${String(totalBytes)} bytes) as ${String(slices.length)} coalesced frame(s)`,
|
|
947
|
+
)
|
|
948
|
+
for (const slice of slices) {
|
|
949
|
+
conn.send(Buffer.concat(slice))
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
audioBuffer.length = 0
|
|
953
|
+
|
|
954
|
+
// Reset the release timer now that the WebSocket is ready.
|
|
955
|
+
// Only arm it if auto-repeat has been seen — otherwise the OS
|
|
956
|
+
// key repeat delay (~500ms) hasn't elapsed yet and the timer
|
|
957
|
+
// would fire prematurely.
|
|
958
|
+
if (releaseTimerRef.current) {
|
|
959
|
+
clearTimeout(releaseTimerRef.current)
|
|
960
|
+
}
|
|
961
|
+
if (seenRepeatRef.current) {
|
|
962
|
+
releaseTimerRef.current = setTimeout(
|
|
963
|
+
(releaseTimerRef, stateRef, finishRecording) => {
|
|
964
|
+
releaseTimerRef.current = null
|
|
965
|
+
if (stateRef.current === 'recording') {
|
|
966
|
+
finishRecording()
|
|
967
|
+
}
|
|
968
|
+
},
|
|
969
|
+
RELEASE_TIMEOUT_MS,
|
|
970
|
+
releaseTimerRef,
|
|
971
|
+
stateRef,
|
|
972
|
+
finishRecording,
|
|
973
|
+
)
|
|
974
|
+
}
|
|
975
|
+
},
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
language: stt.code,
|
|
979
|
+
keyterms,
|
|
980
|
+
},
|
|
981
|
+
).then(conn => {
|
|
982
|
+
if (isStale()) {
|
|
983
|
+
conn?.close()
|
|
984
|
+
return
|
|
985
|
+
}
|
|
986
|
+
if (!conn) {
|
|
987
|
+
logForDebugging(
|
|
988
|
+
'[voice] Failed to connect to voice_stream (no OAuth token?)',
|
|
989
|
+
)
|
|
990
|
+
onErrorRef.current?.(
|
|
991
|
+
'Voice mode requires a Claude.ai account. Please run /login to sign in.',
|
|
992
|
+
)
|
|
993
|
+
// Clear the audio buffer on failure
|
|
994
|
+
audioBuffer.length = 0
|
|
995
|
+
cleanup()
|
|
996
|
+
updateState('idle')
|
|
997
|
+
return
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
// Safety check: if the user released the key before connectVoiceStream
|
|
1001
|
+
// resolved (but after onReady already ran), close the connection.
|
|
1002
|
+
if (stateRef.current !== 'recording') {
|
|
1003
|
+
audioBuffer.length = 0
|
|
1004
|
+
conn.close()
|
|
1005
|
+
return
|
|
1006
|
+
}
|
|
1007
|
+
})
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
void getVoiceKeyterms().then(attemptConnect)
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
// ── Hold-to-talk handler ────────────────────────────────────────────
|
|
1014
|
+
// Called on every keypress (including terminal auto-repeats while
|
|
1015
|
+
// the key is held). A gap longer than RELEASE_TIMEOUT_MS between
|
|
1016
|
+
// events is interpreted as key release.
|
|
1017
|
+
//
|
|
1018
|
+
// Recording starts immediately on the first keypress to eliminate
|
|
1019
|
+
// startup delay. The release timer is only armed after auto-repeat
|
|
1020
|
+
// is detected (to avoid false releases during the OS key repeat
|
|
1021
|
+
// delay of ~500ms on macOS).
|
|
1022
|
+
const handleKeyEvent = useCallback(
|
|
1023
|
+
(fallbackMs = REPEAT_FALLBACK_MS): void => {
|
|
1024
|
+
if (!enabled || !isVoiceStreamAvailable()) {
|
|
1025
|
+
return
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// In focus mode, recording is driven by terminal focus, not keypresses.
|
|
1029
|
+
if (focusTriggeredRef.current) {
|
|
1030
|
+
// Active focus recording — ignore key events (session ends on blur).
|
|
1031
|
+
return
|
|
1032
|
+
}
|
|
1033
|
+
if (focusMode && silenceTimedOutRef.current) {
|
|
1034
|
+
// Focus session timed out due to silence — keypress re-arms it.
|
|
1035
|
+
logForDebugging(
|
|
1036
|
+
'[voice] Re-arming focus recording after silence timeout',
|
|
1037
|
+
)
|
|
1038
|
+
silenceTimedOutRef.current = false
|
|
1039
|
+
focusTriggeredRef.current = true
|
|
1040
|
+
void startRecordingSession()
|
|
1041
|
+
armFocusSilenceTimer()
|
|
1042
|
+
return
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
const currentState = stateRef.current
|
|
1046
|
+
|
|
1047
|
+
// Ignore keypresses while processing
|
|
1048
|
+
if (currentState === 'processing') {
|
|
1049
|
+
return
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
if (currentState === 'idle') {
|
|
1053
|
+
logForDebugging(
|
|
1054
|
+
'[voice] handleKeyEvent: idle, starting recording session immediately',
|
|
1055
|
+
)
|
|
1056
|
+
void startRecordingSession()
|
|
1057
|
+
// Fallback: if no auto-repeat arrives within REPEAT_FALLBACK_MS,
|
|
1058
|
+
// arm the release timer anyway (the user likely tapped and released).
|
|
1059
|
+
repeatFallbackTimerRef.current = setTimeout(
|
|
1060
|
+
(
|
|
1061
|
+
repeatFallbackTimerRef,
|
|
1062
|
+
stateRef,
|
|
1063
|
+
seenRepeatRef,
|
|
1064
|
+
releaseTimerRef,
|
|
1065
|
+
finishRecording,
|
|
1066
|
+
) => {
|
|
1067
|
+
repeatFallbackTimerRef.current = null
|
|
1068
|
+
if (stateRef.current === 'recording' && !seenRepeatRef.current) {
|
|
1069
|
+
logForDebugging(
|
|
1070
|
+
'[voice] No auto-repeat seen, arming release timer via fallback',
|
|
1071
|
+
)
|
|
1072
|
+
seenRepeatRef.current = true
|
|
1073
|
+
releaseTimerRef.current = setTimeout(
|
|
1074
|
+
(releaseTimerRef, stateRef, finishRecording) => {
|
|
1075
|
+
releaseTimerRef.current = null
|
|
1076
|
+
if (stateRef.current === 'recording') {
|
|
1077
|
+
finishRecording()
|
|
1078
|
+
}
|
|
1079
|
+
},
|
|
1080
|
+
RELEASE_TIMEOUT_MS,
|
|
1081
|
+
releaseTimerRef,
|
|
1082
|
+
stateRef,
|
|
1083
|
+
finishRecording,
|
|
1084
|
+
)
|
|
1085
|
+
}
|
|
1086
|
+
},
|
|
1087
|
+
fallbackMs,
|
|
1088
|
+
repeatFallbackTimerRef,
|
|
1089
|
+
stateRef,
|
|
1090
|
+
seenRepeatRef,
|
|
1091
|
+
releaseTimerRef,
|
|
1092
|
+
finishRecording,
|
|
1093
|
+
)
|
|
1094
|
+
} else if (currentState === 'recording') {
|
|
1095
|
+
// Second+ keypress while recording — auto-repeat has started.
|
|
1096
|
+
seenRepeatRef.current = true
|
|
1097
|
+
if (repeatFallbackTimerRef.current) {
|
|
1098
|
+
clearTimeout(repeatFallbackTimerRef.current)
|
|
1099
|
+
repeatFallbackTimerRef.current = null
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
// Reset the release timer on every keypress (including auto-repeats)
|
|
1104
|
+
if (releaseTimerRef.current) {
|
|
1105
|
+
clearTimeout(releaseTimerRef.current)
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
// Only arm the release timer once auto-repeat has been seen.
|
|
1109
|
+
// The OS key repeat delay is ~500ms on macOS; without this gate
|
|
1110
|
+
// the 200ms timer fires before repeat starts, causing a false release.
|
|
1111
|
+
if (stateRef.current === 'recording' && seenRepeatRef.current) {
|
|
1112
|
+
releaseTimerRef.current = setTimeout(
|
|
1113
|
+
(releaseTimerRef, stateRef, finishRecording) => {
|
|
1114
|
+
releaseTimerRef.current = null
|
|
1115
|
+
if (stateRef.current === 'recording') {
|
|
1116
|
+
finishRecording()
|
|
1117
|
+
}
|
|
1118
|
+
},
|
|
1119
|
+
RELEASE_TIMEOUT_MS,
|
|
1120
|
+
releaseTimerRef,
|
|
1121
|
+
stateRef,
|
|
1122
|
+
finishRecording,
|
|
1123
|
+
)
|
|
1124
|
+
}
|
|
1125
|
+
},
|
|
1126
|
+
[enabled, focusMode, cleanup],
|
|
1127
|
+
)
|
|
1128
|
+
|
|
1129
|
+
// Cleanup only when disabled or unmounted - NOT on state changes
|
|
1130
|
+
useEffect(() => {
|
|
1131
|
+
if (!enabled && stateRef.current !== 'idle') {
|
|
1132
|
+
cleanup()
|
|
1133
|
+
updateState('idle')
|
|
1134
|
+
}
|
|
1135
|
+
return () => {
|
|
1136
|
+
cleanup()
|
|
1137
|
+
}
|
|
1138
|
+
}, [enabled, cleanup])
|
|
1139
|
+
|
|
1140
|
+
return {
|
|
1141
|
+
state,
|
|
1142
|
+
handleKeyEvent,
|
|
1143
|
+
}
|
|
1144
|
+
}
|