@xortex/xcode 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QueryEngine.ts +1331 -0
- package/Task.ts +125 -0
- package/Tool.ts +792 -0
- package/assistant/sessionHistory.ts +87 -0
- package/bin/xcode +57 -25
- package/bridge/bridgeApi.ts +539 -0
- package/bridge/bridgeConfig.ts +48 -0
- package/bridge/bridgeDebug.ts +135 -0
- package/bridge/bridgeEnabled.ts +202 -0
- package/bridge/bridgeMain.ts +2999 -0
- package/bridge/bridgeMessaging.ts +461 -0
- package/bridge/bridgePermissionCallbacks.ts +43 -0
- package/bridge/bridgePointer.ts +210 -0
- package/bridge/bridgeStatusUtil.ts +163 -0
- package/bridge/bridgeUI.ts +530 -0
- package/bridge/capacityWake.ts +56 -0
- package/bridge/codeSessionApi.ts +168 -0
- package/bridge/createSession.ts +384 -0
- package/bridge/debugUtils.ts +141 -0
- package/bridge/envLessBridgeConfig.ts +165 -0
- package/bridge/flushGate.ts +71 -0
- package/bridge/inboundAttachments.ts +175 -0
- package/bridge/inboundMessages.ts +80 -0
- package/bridge/initReplBridge.ts +569 -0
- package/bridge/jwtUtils.ts +256 -0
- package/bridge/pollConfig.ts +110 -0
- package/bridge/pollConfigDefaults.ts +82 -0
- package/bridge/remoteBridgeCore.ts +1008 -0
- package/bridge/replBridge.ts +2406 -0
- package/bridge/replBridgeHandle.ts +36 -0
- package/bridge/replBridgeTransport.ts +370 -0
- package/bridge/sessionIdCompat.ts +57 -0
- package/bridge/sessionRunner.ts +550 -0
- package/bridge/trustedDevice.ts +210 -0
- package/bridge/types.ts +262 -0
- package/bridge/workSecret.ts +127 -0
- package/buddy/CompanionSprite.tsx +371 -0
- package/buddy/companion.ts +133 -0
- package/buddy/prompt.ts +36 -0
- package/buddy/sprites.ts +514 -0
- package/buddy/types.ts +148 -0
- package/buddy/useBuddyNotification.tsx +98 -0
- package/cli/exit.ts +31 -0
- package/cli/handlers/agents.ts +70 -0
- package/cli/handlers/auth.ts +330 -0
- package/cli/handlers/autoMode.ts +170 -0
- package/cli/handlers/mcp.tsx +362 -0
- package/cli/handlers/plugins.ts +878 -0
- package/cli/handlers/util.tsx +110 -0
- package/cli/ndjsonSafeStringify.ts +32 -0
- package/cli/print.ts +5594 -0
- package/cli/remoteIO.ts +255 -0
- package/cli/structuredIO.ts +859 -0
- package/cli/transports/HybridTransport.ts +282 -0
- package/cli/transports/SSETransport.ts +711 -0
- package/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/cli/transports/WebSocketTransport.ts +800 -0
- package/cli/transports/WorkerStateUploader.ts +131 -0
- package/cli/transports/ccrClient.ts +998 -0
- package/cli/transports/transportUtils.ts +45 -0
- package/cli/update.ts +422 -0
- package/commands/add-dir/add-dir.tsx +126 -0
- package/commands/add-dir/index.ts +11 -0
- package/commands/add-dir/validation.ts +110 -0
- package/commands/advisor.ts +109 -0
- package/commands/agents/agents.tsx +12 -0
- package/commands/agents/index.ts +10 -0
- package/commands/ant-trace/index.js +1 -0
- package/commands/autofix-pr/index.js +1 -0
- package/commands/backfill-sessions/index.js +1 -0
- package/commands/branch/branch.ts +296 -0
- package/commands/branch/index.ts +14 -0
- package/commands/break-cache/index.js +1 -0
- package/commands/bridge/bridge.tsx +509 -0
- package/commands/bridge/index.ts +26 -0
- package/commands/bridge-kick.ts +200 -0
- package/commands/brief.ts +130 -0
- package/commands/btw/btw.tsx +243 -0
- package/commands/btw/index.ts +13 -0
- package/commands/bughunter/index.js +1 -0
- package/commands/chrome/chrome.tsx +285 -0
- package/commands/chrome/index.ts +13 -0
- package/commands/clear/caches.ts +144 -0
- package/commands/clear/clear.ts +7 -0
- package/commands/clear/conversation.ts +251 -0
- package/commands/clear/index.ts +19 -0
- package/commands/color/color.ts +93 -0
- package/commands/color/index.ts +16 -0
- package/commands/commit-push-pr.ts +158 -0
- package/commands/commit.ts +92 -0
- package/commands/compact/compact.ts +287 -0
- package/commands/compact/index.ts +15 -0
- package/commands/config/config.tsx +7 -0
- package/commands/config/index.ts +11 -0
- package/commands/context/context-noninteractive.ts +325 -0
- package/commands/context/context.tsx +64 -0
- package/commands/context/index.ts +24 -0
- package/commands/copy/copy.tsx +371 -0
- package/commands/copy/index.ts +15 -0
- package/commands/cost/cost.ts +24 -0
- package/commands/cost/index.ts +23 -0
- package/commands/createMovedToPluginCommand.ts +65 -0
- package/commands/ctx_viz/index.js +1 -0
- package/commands/debug-tool-call/index.js +1 -0
- package/commands/desktop/desktop.tsx +9 -0
- package/commands/desktop/index.ts +26 -0
- package/commands/diff/diff.tsx +9 -0
- package/commands/diff/index.ts +8 -0
- package/commands/doctor/doctor.tsx +7 -0
- package/commands/doctor/index.ts +12 -0
- package/commands/effort/effort.tsx +183 -0
- package/commands/effort/index.ts +13 -0
- package/commands/env/index.js +1 -0
- package/commands/exit/exit.tsx +33 -0
- package/commands/exit/index.ts +12 -0
- package/commands/export/export.tsx +91 -0
- package/commands/export/index.ts +11 -0
- package/commands/extra-usage/extra-usage-core.ts +118 -0
- package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/commands/extra-usage/extra-usage.tsx +17 -0
- package/commands/extra-usage/index.ts +31 -0
- package/commands/fast/fast.tsx +269 -0
- package/commands/fast/index.ts +26 -0
- package/commands/feedback/feedback.tsx +25 -0
- package/commands/feedback/index.ts +26 -0
- package/commands/files/files.ts +19 -0
- package/commands/files/index.ts +12 -0
- package/commands/good-claude/index.js +1 -0
- package/commands/heapdump/heapdump.ts +17 -0
- package/commands/heapdump/index.ts +12 -0
- package/commands/help/help.tsx +11 -0
- package/commands/help/index.ts +10 -0
- package/commands/hooks/hooks.tsx +13 -0
- package/commands/hooks/index.ts +11 -0
- package/commands/ide/ide.tsx +646 -0
- package/commands/ide/index.ts +11 -0
- package/commands/init-verifiers.ts +262 -0
- package/commands/init.ts +256 -0
- package/commands/insights.ts +3200 -0
- package/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/commands/install-github-app/CreatingStep.tsx +65 -0
- package/commands/install-github-app/ErrorStep.tsx +85 -0
- package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/commands/install-github-app/SuccessStep.tsx +96 -0
- package/commands/install-github-app/WarningsStep.tsx +73 -0
- package/commands/install-github-app/index.ts +13 -0
- package/commands/install-github-app/install-github-app.tsx +587 -0
- package/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/commands/install-slack-app/index.ts +12 -0
- package/commands/install-slack-app/install-slack-app.ts +30 -0
- package/commands/install.tsx +300 -0
- package/commands/issue/index.js +1 -0
- package/commands/keybindings/index.ts +13 -0
- package/commands/keybindings/keybindings.ts +53 -0
- package/commands/login/index.ts +14 -0
- package/commands/login/login.tsx +104 -0
- package/commands/logout/index.ts +10 -0
- package/commands/logout/logout.tsx +82 -0
- package/commands/mcp/addCommand.ts +280 -0
- package/commands/mcp/index.ts +12 -0
- package/commands/mcp/mcp.tsx +85 -0
- package/commands/mcp/xaaIdpCommand.ts +266 -0
- package/commands/memory/index.ts +10 -0
- package/commands/memory/memory.tsx +90 -0
- package/commands/mobile/index.ts +11 -0
- package/commands/mobile/mobile.tsx +274 -0
- package/commands/mock-limits/index.js +1 -0
- package/commands/model/index.ts +16 -0
- package/commands/model/model.tsx +297 -0
- package/commands/oauth-refresh/index.js +1 -0
- package/commands/onboarding/index.js +1 -0
- package/commands/output-style/index.ts +11 -0
- package/commands/output-style/output-style.tsx +7 -0
- package/commands/passes/index.ts +22 -0
- package/commands/passes/passes.tsx +24 -0
- package/commands/perf-issue/index.js +1 -0
- package/commands/permissions/index.ts +11 -0
- package/commands/permissions/permissions.tsx +10 -0
- package/commands/plan/index.ts +11 -0
- package/commands/plan/plan.tsx +122 -0
- package/commands/plugin/AddMarketplace.tsx +162 -0
- package/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/commands/plugin/ManagePlugins.tsx +2215 -0
- package/commands/plugin/PluginErrors.tsx +124 -0
- package/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/commands/plugin/PluginSettings.tsx +1072 -0
- package/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/commands/plugin/ValidatePlugin.tsx +98 -0
- package/commands/plugin/index.tsx +11 -0
- package/commands/plugin/parseArgs.ts +103 -0
- package/commands/plugin/plugin.tsx +7 -0
- package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/commands/plugin/usePagination.ts +171 -0
- package/commands/pr_comments/index.ts +50 -0
- package/commands/privacy-settings/index.ts +14 -0
- package/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/commands/rate-limit-options/index.ts +19 -0
- package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/commands/release-notes/index.ts +11 -0
- package/commands/release-notes/release-notes.ts +50 -0
- package/commands/reload-plugins/index.ts +18 -0
- package/commands/reload-plugins/reload-plugins.ts +61 -0
- package/commands/remote-env/index.ts +15 -0
- package/commands/remote-env/remote-env.tsx +7 -0
- package/commands/remote-setup/api.ts +182 -0
- package/commands/remote-setup/index.ts +20 -0
- package/commands/remote-setup/remote-setup.tsx +187 -0
- package/commands/rename/generateSessionName.ts +67 -0
- package/commands/rename/index.ts +12 -0
- package/commands/rename/rename.ts +87 -0
- package/commands/reset-limits/index.js +4 -0
- package/commands/resume/index.ts +12 -0
- package/commands/resume/resume.tsx +275 -0
- package/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/commands/review/reviewRemote.ts +316 -0
- package/commands/review/ultrareviewCommand.tsx +58 -0
- package/commands/review/ultrareviewEnabled.ts +14 -0
- package/commands/review.ts +57 -0
- package/commands/rewind/index.ts +13 -0
- package/commands/rewind/rewind.ts +13 -0
- package/commands/sandbox-toggle/index.ts +50 -0
- package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/commands/security-review.ts +243 -0
- package/commands/session/index.ts +16 -0
- package/commands/session/session.tsx +140 -0
- package/commands/share/index.js +1 -0
- package/commands/skills/index.ts +10 -0
- package/commands/skills/skills.tsx +8 -0
- package/commands/stats/index.ts +10 -0
- package/commands/stats/stats.tsx +7 -0
- package/commands/status/index.ts +12 -0
- package/commands/status/status.tsx +8 -0
- package/commands/statusline.tsx +24 -0
- package/commands/stickers/index.ts +11 -0
- package/commands/stickers/stickers.ts +16 -0
- package/commands/summary/index.js +1 -0
- package/commands/tag/index.ts +12 -0
- package/commands/tag/tag.tsx +215 -0
- package/commands/tasks/index.ts +11 -0
- package/commands/tasks/tasks.tsx +8 -0
- package/commands/teleport/index.js +1 -0
- package/commands/terminalSetup/index.ts +23 -0
- package/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/commands/theme/index.ts +10 -0
- package/commands/theme/theme.tsx +57 -0
- package/commands/thinkback/index.ts +13 -0
- package/commands/thinkback/thinkback.tsx +554 -0
- package/commands/thinkback-play/index.ts +17 -0
- package/commands/thinkback-play/thinkback-play.ts +43 -0
- package/commands/ultraplan.tsx +471 -0
- package/commands/upgrade/index.ts +16 -0
- package/commands/upgrade/upgrade.tsx +38 -0
- package/commands/usage/index.ts +9 -0
- package/commands/usage/usage.tsx +7 -0
- package/commands/version.ts +22 -0
- package/commands/vim/index.ts +11 -0
- package/commands/vim/vim.ts +38 -0
- package/commands/voice/index.ts +20 -0
- package/commands/voice/voice.ts +150 -0
- package/commands/xingest/index.ts +11 -0
- package/commands/xingest/xingest.ts +90 -0
- package/commands/xsearch/index.ts +11 -0
- package/commands/xsearch/xsearch.ts +56 -0
- package/commands.ts +758 -0
- package/components/AgentProgressLine.tsx +136 -0
- package/components/App.tsx +56 -0
- package/components/ApproveApiKey.tsx +123 -0
- package/components/AutoModeOptInDialog.tsx +142 -0
- package/components/AutoUpdater.tsx +198 -0
- package/components/AutoUpdaterWrapper.tsx +91 -0
- package/components/AwsAuthStatusBox.tsx +82 -0
- package/components/BaseTextInput.tsx +136 -0
- package/components/BashModeProgress.tsx +56 -0
- package/components/BridgeDialog.tsx +401 -0
- package/components/BypassPermissionsModeDialog.tsx +87 -0
- package/components/ChannelDowngradeDialog.tsx +102 -0
- package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/components/ClickableImageRef.tsx +73 -0
- package/components/CompactSummary.tsx +118 -0
- package/components/ConfigurableShortcutHint.tsx +57 -0
- package/components/ConsoleOAuthFlow.tsx +631 -0
- package/components/ContextSuggestions.tsx +47 -0
- package/components/ContextVisualization.tsx +489 -0
- package/components/CoordinatorAgentStatus.tsx +273 -0
- package/components/CostThresholdDialog.tsx +50 -0
- package/components/CtrlOToExpand.tsx +51 -0
- package/components/CustomSelect/SelectMulti.tsx +213 -0
- package/components/CustomSelect/index.ts +3 -0
- package/components/CustomSelect/option-map.ts +50 -0
- package/components/CustomSelect/select-input-option.tsx +488 -0
- package/components/CustomSelect/select-option.tsx +68 -0
- package/components/CustomSelect/select.tsx +690 -0
- package/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/components/CustomSelect/use-select-input.ts +287 -0
- package/components/CustomSelect/use-select-navigation.ts +653 -0
- package/components/CustomSelect/use-select-state.ts +157 -0
- package/components/DesktopHandoff.tsx +193 -0
- package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/components/DevBar.tsx +49 -0
- package/components/DevChannelsDialog.tsx +105 -0
- package/components/DiagnosticsDisplay.tsx +95 -0
- package/components/EffortCallout.tsx +265 -0
- package/components/EffortIndicator.ts +42 -0
- package/components/ExitFlow.tsx +48 -0
- package/components/ExportDialog.tsx +128 -0
- package/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/components/FastIcon.tsx +46 -0
- package/components/Feedback.tsx +592 -0
- package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/components/FileEditToolDiff.tsx +181 -0
- package/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/components/FilePathLink.tsx +43 -0
- package/components/FullscreenLayout.tsx +645 -0
- package/components/GlobalSearchDialog.tsx +343 -0
- package/components/HelpV2/Commands.tsx +82 -0
- package/components/HelpV2/General.tsx +23 -0
- package/components/HelpV2/HelpV2.tsx +184 -0
- package/components/HighlightedCode/Fallback.tsx +193 -0
- package/components/HighlightedCode.tsx +190 -0
- package/components/HistorySearchDialog.tsx +118 -0
- package/components/IdeAutoConnectDialog.tsx +154 -0
- package/components/IdeOnboardingDialog.tsx +167 -0
- package/components/IdeStatusIndicator.tsx +58 -0
- package/components/IdleReturnDialog.tsx +118 -0
- package/components/InterruptedByUser.tsx +15 -0
- package/components/InvalidConfigDialog.tsx +156 -0
- package/components/InvalidSettingsDialog.tsx +89 -0
- package/components/KeybindingWarnings.tsx +55 -0
- package/components/LanguagePicker.tsx +86 -0
- package/components/LogSelector.tsx +1575 -0
- package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/components/LogoV2/Clawd.tsx +14 -0
- package/components/LogoV2/CondensedLogo.tsx +161 -0
- package/components/LogoV2/EmergencyTip.tsx +58 -0
- package/components/LogoV2/Feed.tsx +112 -0
- package/components/LogoV2/FeedColumn.tsx +59 -0
- package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/components/LogoV2/LogoV2.tsx +543 -0
- package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/components/LogoV2/WelcomeV2.tsx +433 -0
- package/components/LogoV2/feedConfigs.tsx +92 -0
- package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/components/MCPServerApprovalDialog.tsx +115 -0
- package/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/components/MCPServerDialogCopy.tsx +15 -0
- package/components/MCPServerMultiselectDialog.tsx +133 -0
- package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/components/Markdown.tsx +236 -0
- package/components/MarkdownTable.tsx +322 -0
- package/components/MemoryUsageIndicator.tsx +37 -0
- package/components/Message.tsx +627 -0
- package/components/MessageModel.tsx +43 -0
- package/components/MessageResponse.tsx +78 -0
- package/components/MessageRow.tsx +383 -0
- package/components/MessageSelector.tsx +831 -0
- package/components/MessageTimestamp.tsx +63 -0
- package/components/Messages.tsx +834 -0
- package/components/ModelPicker.tsx +448 -0
- package/components/NativeAutoUpdater.tsx +193 -0
- package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/components/OffscreenFreeze.tsx +44 -0
- package/components/Onboarding.tsx +244 -0
- package/components/OutputStylePicker.tsx +112 -0
- package/components/PackageManagerAutoUpdater.tsx +104 -0
- package/components/Passes/Passes.tsx +184 -0
- package/components/PrBadge.tsx +97 -0
- package/components/PressEnterToContinue.tsx +15 -0
- package/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/components/PromptInput/Notifications.tsx +332 -0
- package/components/PromptInput/PromptInput.tsx +2350 -0
- package/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/components/PromptInput/PromptInputFooterLeftSide.tsx +524 -0
- package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/components/PromptInput/inputModes.ts +33 -0
- package/components/PromptInput/inputPaste.ts +90 -0
- package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/components/PromptInput/usePromptInputPlaceholder.ts +78 -0
- package/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/components/PromptInput/useSwarmBanner.ts +155 -0
- package/components/PromptInput/utils.ts +60 -0
- package/components/QuickOpenDialog.tsx +244 -0
- package/components/RemoteCallout.tsx +76 -0
- package/components/RemoteEnvironmentDialog.tsx +340 -0
- package/components/ResumeTask.tsx +268 -0
- package/components/SandboxViolationExpandedView.tsx +99 -0
- package/components/ScrollKeybindingHandler.tsx +1012 -0
- package/components/SearchBox.tsx +72 -0
- package/components/SentryErrorBoundary.ts +28 -0
- package/components/SessionBackgroundHint.tsx +108 -0
- package/components/SessionPreview.tsx +194 -0
- package/components/Settings/Config.tsx +1822 -0
- package/components/Settings/Settings.tsx +137 -0
- package/components/Settings/Status.tsx +241 -0
- package/components/Settings/Usage.tsx +377 -0
- package/components/ShowInIDEPrompt.tsx +170 -0
- package/components/SkillImprovementSurvey.tsx +152 -0
- package/components/Spinner/FlashingChar.tsx +61 -0
- package/components/Spinner/GlimmerMessage.tsx +328 -0
- package/components/Spinner/ShimmerChar.tsx +36 -0
- package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/components/Spinner/index.ts +10 -0
- package/components/Spinner/teammateSelectHint.ts +1 -0
- package/components/Spinner/useShimmerAnimation.ts +31 -0
- package/components/Spinner/useStalledAnimation.ts +75 -0
- package/components/Spinner/utils.ts +84 -0
- package/components/Spinner.tsx +562 -0
- package/components/Stats.tsx +1228 -0
- package/components/StatusLine.tsx +324 -0
- package/components/StatusNotices.tsx +55 -0
- package/components/StructuredDiff/Fallback.tsx +487 -0
- package/components/StructuredDiff/colorDiff.ts +37 -0
- package/components/StructuredDiff.tsx +190 -0
- package/components/StructuredDiffList.tsx +30 -0
- package/components/TagTabs.tsx +139 -0
- package/components/TaskListV2.tsx +378 -0
- package/components/TeammateViewHeader.tsx +82 -0
- package/components/TeleportError.tsx +189 -0
- package/components/TeleportProgress.tsx +140 -0
- package/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/components/TeleportResumeWrapper.tsx +167 -0
- package/components/TeleportStash.tsx +116 -0
- package/components/TextInput.tsx +124 -0
- package/components/ThemePicker.tsx +333 -0
- package/components/ThinkingToggle.tsx +153 -0
- package/components/TokenWarning.tsx +179 -0
- package/components/ToolUseLoader.tsx +42 -0
- package/components/TrustDialog/TrustDialog.tsx +290 -0
- package/components/TrustDialog/utils.ts +245 -0
- package/components/ValidationErrorsList.tsx +148 -0
- package/components/VimTextInput.tsx +140 -0
- package/components/VirtualMessageList.tsx +1082 -0
- package/components/WorkflowMultiselectDialog.tsx +128 -0
- package/components/WorktreeExitDialog.tsx +231 -0
- package/components/agents/AgentDetail.tsx +220 -0
- package/components/agents/AgentEditor.tsx +178 -0
- package/components/agents/AgentNavigationFooter.tsx +26 -0
- package/components/agents/AgentsList.tsx +440 -0
- package/components/agents/AgentsMenu.tsx +800 -0
- package/components/agents/ColorPicker.tsx +112 -0
- package/components/agents/ModelSelector.tsx +68 -0
- package/components/agents/ToolSelector.tsx +562 -0
- package/components/agents/agentFileUtils.ts +272 -0
- package/components/agents/generateAgent.ts +197 -0
- package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/components/agents/types.ts +27 -0
- package/components/agents/utils.ts +18 -0
- package/components/agents/validateAgent.ts +109 -0
- package/components/design-system/Byline.tsx +77 -0
- package/components/design-system/Dialog.tsx +138 -0
- package/components/design-system/Divider.tsx +149 -0
- package/components/design-system/FuzzyPicker.tsx +312 -0
- package/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/components/design-system/ListItem.tsx +244 -0
- package/components/design-system/LoadingState.tsx +94 -0
- package/components/design-system/Pane.tsx +77 -0
- package/components/design-system/ProgressBar.tsx +86 -0
- package/components/design-system/Ratchet.tsx +80 -0
- package/components/design-system/StatusIcon.tsx +95 -0
- package/components/design-system/Tabs.tsx +340 -0
- package/components/design-system/ThemeProvider.tsx +170 -0
- package/components/design-system/ThemedBox.tsx +156 -0
- package/components/design-system/ThemedText.tsx +124 -0
- package/components/design-system/color.ts +30 -0
- package/components/diff/DiffDetailView.tsx +281 -0
- package/components/diff/DiffDialog.tsx +383 -0
- package/components/diff/DiffFileList.tsx +292 -0
- package/components/grove/Grove.tsx +463 -0
- package/components/hooks/HooksConfigMenu.tsx +578 -0
- package/components/hooks/PromptDialog.tsx +90 -0
- package/components/hooks/SelectEventMode.tsx +127 -0
- package/components/hooks/SelectHookMode.tsx +112 -0
- package/components/hooks/SelectMatcherMode.tsx +144 -0
- package/components/hooks/ViewHookMode.tsx +199 -0
- package/components/mcp/CapabilitiesSection.tsx +61 -0
- package/components/mcp/ElicitationDialog.tsx +1169 -0
- package/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/components/mcp/MCPListPanel.tsx +504 -0
- package/components/mcp/MCPReconnect.tsx +167 -0
- package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/components/mcp/MCPSettings.tsx +398 -0
- package/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/components/mcp/MCPToolDetailView.tsx +212 -0
- package/components/mcp/MCPToolListView.tsx +141 -0
- package/components/mcp/McpParsingWarnings.tsx +213 -0
- package/components/mcp/index.ts +9 -0
- package/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/components/memory/MemoryFileSelector.tsx +438 -0
- package/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/components/messageActions.tsx +450 -0
- package/components/messages/AdvisorMessage.tsx +158 -0
- package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/components/messages/AssistantTextMessage.tsx +270 -0
- package/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/components/messages/AttachmentMessage.tsx +536 -0
- package/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/components/messages/GroupedToolUseContent.tsx +58 -0
- package/components/messages/HighlightedThinkingText.tsx +162 -0
- package/components/messages/HookProgressMessage.tsx +116 -0
- package/components/messages/PlanApprovalMessage.tsx +222 -0
- package/components/messages/RateLimitMessage.tsx +161 -0
- package/components/messages/ShutdownMessage.tsx +132 -0
- package/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/components/messages/SystemTextMessage.tsx +827 -0
- package/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/components/messages/UserBashInputMessage.tsx +58 -0
- package/components/messages/UserBashOutputMessage.tsx +54 -0
- package/components/messages/UserChannelMessage.tsx +137 -0
- package/components/messages/UserCommandMessage.tsx +108 -0
- package/components/messages/UserImageMessage.tsx +59 -0
- package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/components/messages/UserPlanMessage.tsx +42 -0
- package/components/messages/UserPromptMessage.tsx +80 -0
- package/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/components/messages/UserTeammateMessage.tsx +206 -0
- package/components/messages/UserTextMessage.tsx +275 -0
- package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/components/messages/nullRenderingAttachments.ts +70 -0
- package/components/messages/teamMemCollapsed.tsx +140 -0
- package/components/messages/teamMemSaved.ts +19 -0
- package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/components/permissions/PermissionDialog.tsx +72 -0
- package/components/permissions/PermissionExplanation.tsx +272 -0
- package/components/permissions/PermissionPrompt.tsx +336 -0
- package/components/permissions/PermissionRequest.tsx +217 -0
- package/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/components/permissions/WorkerBadge.tsx +49 -0
- package/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/components/permissions/hooks.ts +209 -0
- package/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/components/permissions/utils.ts +25 -0
- package/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/components/sandbox/SandboxSettings.tsx +296 -0
- package/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/components/shell/OutputLine.tsx +118 -0
- package/components/shell/ShellProgressMessage.tsx +150 -0
- package/components/shell/ShellTimeDisplay.tsx +74 -0
- package/components/skills/SkillsMenu.tsx +237 -0
- package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/components/tasks/BackgroundTask.tsx +345 -0
- package/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/components/tasks/DreamDetailDialog.tsx +251 -0
- package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/components/tasks/ShellDetailDialog.tsx +404 -0
- package/components/tasks/ShellProgress.tsx +87 -0
- package/components/tasks/renderToolActivity.tsx +33 -0
- package/components/tasks/taskStatusUtils.tsx +107 -0
- package/components/teams/TeamStatus.tsx +80 -0
- package/components/teams/TeamsDialog.tsx +715 -0
- package/components/ui/OrderedList.tsx +71 -0
- package/components/ui/OrderedListItem.tsx +45 -0
- package/components/ui/TreeSelect.tsx +397 -0
- package/components/wizard/WizardDialogLayout.tsx +65 -0
- package/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/components/wizard/WizardProvider.tsx +213 -0
- package/components/wizard/index.ts +9 -0
- package/components/wizard/useWizard.ts +13 -0
- package/context.ts +189 -0
- package/cost-tracker.ts +323 -0
- package/entrypoints/cli.tsx +1 -1
- package/history.ts +464 -0
- package/hooks/fileSuggestions.ts +811 -0
- package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/hooks/notifs/useInstallMessages.tsx +26 -0
- package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/hooks/notifs/useStartupNotification.ts +41 -0
- package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/hooks/renderPlaceholder.ts +51 -0
- package/hooks/toolPermission/PermissionContext.ts +388 -0
- package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/hooks/toolPermission/permissionLogging.ts +238 -0
- package/hooks/unifiedSuggestions.ts +202 -0
- package/hooks/useAfterFirstRender.ts +17 -0
- package/hooks/useApiKeyVerification.ts +84 -0
- package/hooks/useArrowKeyHistory.tsx +229 -0
- package/hooks/useAssistantHistory.ts +250 -0
- package/hooks/useAwaySummary.ts +125 -0
- package/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/hooks/useBlink.ts +34 -0
- package/hooks/useCanUseTool.tsx +204 -0
- package/hooks/useCancelRequest.ts +276 -0
- package/hooks/useChromeExtensionNotification.tsx +50 -0
- package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/hooks/useClipboardImageHint.ts +77 -0
- package/hooks/useCommandKeybindings.tsx +108 -0
- package/hooks/useCommandQueue.ts +15 -0
- package/hooks/useCopyOnSelect.ts +98 -0
- package/hooks/useDeferredHookMessages.ts +46 -0
- package/hooks/useDiffData.ts +110 -0
- package/hooks/useDiffInIDE.ts +379 -0
- package/hooks/useDirectConnect.ts +229 -0
- package/hooks/useDoublePress.ts +62 -0
- package/hooks/useDynamicConfig.ts +22 -0
- package/hooks/useElapsedTime.ts +37 -0
- package/hooks/useExitOnCtrlCD.ts +95 -0
- package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/hooks/useGlobalKeybindings.tsx +249 -0
- package/hooks/useHistorySearch.ts +303 -0
- package/hooks/useIDEIntegration.tsx +70 -0
- package/hooks/useIdeAtMentioned.ts +76 -0
- package/hooks/useIdeConnectionStatus.ts +33 -0
- package/hooks/useIdeLogging.ts +41 -0
- package/hooks/useIdeSelection.ts +150 -0
- package/hooks/useInboxPoller.ts +969 -0
- package/hooks/useInputBuffer.ts +132 -0
- package/hooks/useIssueFlagBanner.ts +133 -0
- package/hooks/useLogMessages.ts +119 -0
- package/hooks/useLspPluginRecommendation.tsx +194 -0
- package/hooks/useMailboxBridge.ts +21 -0
- package/hooks/useMainLoopModel.ts +34 -0
- package/hooks/useManagePlugins.ts +304 -0
- package/hooks/useMemoryUsage.ts +39 -0
- package/hooks/useMergedClients.ts +23 -0
- package/hooks/useMergedCommands.ts +15 -0
- package/hooks/useMergedTools.ts +44 -0
- package/hooks/useMinDisplayTime.ts +35 -0
- package/hooks/useNotifyAfterTimeout.ts +65 -0
- package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/hooks/usePasteHandler.ts +285 -0
- package/hooks/usePluginRecommendationBase.tsx +105 -0
- package/hooks/usePrStatus.ts +106 -0
- package/hooks/usePromptSuggestion.ts +177 -0
- package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/hooks/useQueueProcessor.ts +68 -0
- package/hooks/useRemoteSession.ts +605 -0
- package/hooks/useReplBridge.tsx +723 -0
- package/hooks/useSSHSession.ts +241 -0
- package/hooks/useScheduledTasks.ts +139 -0
- package/hooks/useSearchInput.ts +364 -0
- package/hooks/useSessionBackgrounding.ts +158 -0
- package/hooks/useSettings.ts +17 -0
- package/hooks/useSettingsChange.ts +25 -0
- package/hooks/useSkillImprovementSurvey.ts +105 -0
- package/hooks/useSkillsChange.ts +62 -0
- package/hooks/useSwarmInitialization.ts +81 -0
- package/hooks/useSwarmPermissionPoller.ts +330 -0
- package/hooks/useTaskListWatcher.ts +221 -0
- package/hooks/useTasksV2.ts +250 -0
- package/hooks/useTeammateViewAutoExit.ts +63 -0
- package/hooks/useTeleportResume.tsx +85 -0
- package/hooks/useTerminalSize.ts +15 -0
- package/hooks/useTextInput.ts +529 -0
- package/hooks/useTimeout.ts +14 -0
- package/hooks/useTurnDiffs.ts +213 -0
- package/hooks/useTypeahead.tsx +1385 -0
- package/hooks/useUpdateNotification.ts +34 -0
- package/hooks/useVimInput.ts +316 -0
- package/hooks/useVirtualScroll.ts +721 -0
- package/hooks/useVoice.ts +1144 -0
- package/hooks/useVoiceEnabled.ts +25 -0
- package/hooks/useVoiceIntegration.tsx +677 -0
- package/ink/Ansi.tsx +292 -0
- package/ink/bidi.ts +139 -0
- package/ink/clearTerminal.ts +74 -0
- package/ink/colorize.ts +231 -0
- package/ink/components/AlternateScreen.tsx +80 -0
- package/ink/components/App.tsx +658 -0
- package/ink/components/AppContext.ts +21 -0
- package/ink/components/Box.tsx +214 -0
- package/ink/components/Button.tsx +192 -0
- package/ink/components/ClockContext.tsx +112 -0
- package/ink/components/CursorDeclarationContext.ts +32 -0
- package/ink/components/ErrorOverview.tsx +109 -0
- package/ink/components/Link.tsx +42 -0
- package/ink/components/Newline.tsx +39 -0
- package/ink/components/NoSelect.tsx +68 -0
- package/ink/components/RawAnsi.tsx +57 -0
- package/ink/components/ScrollBox.tsx +237 -0
- package/ink/components/Spacer.tsx +20 -0
- package/ink/components/StdinContext.ts +49 -0
- package/ink/components/TerminalFocusContext.tsx +52 -0
- package/ink/components/TerminalSizeContext.tsx +7 -0
- package/ink/components/Text.tsx +254 -0
- package/ink/constants.ts +2 -0
- package/ink/dom.ts +484 -0
- package/ink/events/click-event.ts +38 -0
- package/ink/events/dispatcher.ts +233 -0
- package/ink/events/emitter.ts +39 -0
- package/ink/events/event-handlers.ts +73 -0
- package/ink/events/event.ts +11 -0
- package/ink/events/focus-event.ts +21 -0
- package/ink/events/input-event.ts +205 -0
- package/ink/events/keyboard-event.ts +51 -0
- package/ink/events/terminal-event.ts +107 -0
- package/ink/events/terminal-focus-event.ts +19 -0
- package/ink/focus.ts +181 -0
- package/ink/frame.ts +124 -0
- package/ink/get-max-width.ts +27 -0
- package/ink/global.d.ts +26 -0
- package/ink/hit-test.ts +130 -0
- package/ink/hooks/use-animation-frame.ts +57 -0
- package/ink/hooks/use-app.ts +8 -0
- package/ink/hooks/use-declared-cursor.ts +73 -0
- package/ink/hooks/use-input.ts +92 -0
- package/ink/hooks/use-interval.ts +67 -0
- package/ink/hooks/use-search-highlight.ts +53 -0
- package/ink/hooks/use-selection.ts +104 -0
- package/ink/hooks/use-stdin.ts +8 -0
- package/ink/hooks/use-tab-status.ts +72 -0
- package/ink/hooks/use-terminal-focus.ts +16 -0
- package/ink/hooks/use-terminal-title.ts +31 -0
- package/ink/hooks/use-terminal-viewport.ts +96 -0
- package/ink/ink.tsx +1754 -0
- package/ink/instances.ts +10 -0
- package/ink/layout/engine.ts +6 -0
- package/ink/layout/geometry.ts +97 -0
- package/ink/layout/node.ts +152 -0
- package/ink/layout/yoga.ts +308 -0
- package/ink/line-width-cache.ts +24 -0
- package/ink/log-update.ts +773 -0
- package/ink/measure-element.ts +23 -0
- package/ink/measure-text.ts +47 -0
- package/ink/node-cache.ts +54 -0
- package/ink/optimizer.ts +93 -0
- package/ink/output.ts +797 -0
- package/ink/parse-keypress.ts +801 -0
- package/ink/reconciler.ts +512 -0
- package/ink/render-border.ts +231 -0
- package/ink/render-node-to-output.ts +1462 -0
- package/ink/render-to-screen.ts +231 -0
- package/ink/renderer.ts +178 -0
- package/ink/root.ts +184 -0
- package/ink/screen.ts +1486 -0
- package/ink/searchHighlight.ts +93 -0
- package/ink/selection.ts +917 -0
- package/ink/squash-text-nodes.ts +92 -0
- package/ink/stringWidth.ts +223 -0
- package/ink/styles.ts +771 -0
- package/ink/supports-hyperlinks.ts +57 -0
- package/ink/tabstops.ts +46 -0
- package/ink/terminal-focus-state.ts +47 -0
- package/ink/terminal-querier.ts +212 -0
- package/ink/terminal.ts +248 -0
- package/ink/termio/ansi.ts +75 -0
- package/ink/termio/csi.ts +319 -0
- package/ink/termio/dec.ts +60 -0
- package/ink/termio/esc.ts +67 -0
- package/ink/termio/osc.ts +493 -0
- package/ink/termio/parser.ts +394 -0
- package/ink/termio/sgr.ts +308 -0
- package/ink/termio/tokenize.ts +319 -0
- package/ink/termio/types.ts +236 -0
- package/ink/termio.ts +42 -0
- package/ink/useTerminalNotification.ts +126 -0
- package/ink/warn.ts +9 -0
- package/ink/widest-line.ts +19 -0
- package/ink/wrap-text.ts +74 -0
- package/ink/wrapAnsi.ts +20 -0
- package/inspect.js +7 -0
- package/keybindings/KeybindingContext.tsx +243 -0
- package/keybindings/KeybindingProviderSetup.tsx +308 -0
- package/keybindings/defaultBindings.ts +340 -0
- package/keybindings/loadUserBindings.ts +472 -0
- package/keybindings/match.ts +120 -0
- package/keybindings/parser.ts +203 -0
- package/keybindings/reservedShortcuts.ts +127 -0
- package/keybindings/resolver.ts +244 -0
- package/keybindings/schema.ts +236 -0
- package/keybindings/shortcutFormat.ts +63 -0
- package/keybindings/template.ts +52 -0
- package/keybindings/useKeybinding.ts +196 -0
- package/keybindings/useShortcutDisplay.ts +59 -0
- package/keybindings/validate.ts +498 -0
- package/macro.ts +24 -0
- package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
- package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
- package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
- package/migrations/migrateFennecToOpus.ts +45 -0
- package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
- package/migrations/migrateOpusToOpus1m.ts +43 -0
- package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
- package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
- package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
- package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
- package/migrations/resetProToOpusDefault.ts +51 -0
- package/package.json +29 -3
- package/patch-box.js +54 -0
- package/patch-compact.js +13 -0
- package/patch-condensed-center.js +13 -0
- package/patch-condensed-row.js +13 -0
- package/patch-condensed.js +13 -0
- package/patch-final.js +58 -0
- package/patch-input-body.js +46 -0
- package/patch-input-body2.js +35 -0
- package/patch-input-style.js +13 -0
- package/patch-input-width.js +13 -0
- package/patch-layout.js +87 -0
- package/patch-logo-row.js +12 -0
- package/patch-width.js +13 -0
- package/patch-width2.js +13 -0
- package/patch2.js +74 -0
- package/patch3.js +13 -0
- package/query.ts +1750 -0
- package/remote/RemoteSessionManager.ts +343 -0
- package/remote/SessionsWebSocket.ts +404 -0
- package/remote/remotePermissionBridge.ts +78 -0
- package/remote/sdkMessageAdapter.ts +302 -0
- package/skills/bundled/batch.ts +124 -0
- package/skills/bundled/claudeApi.ts +196 -0
- package/skills/bundled/claudeApiContent.ts +75 -0
- package/skills/bundled/claudeInChrome.ts +34 -0
- package/skills/bundled/debug.ts +103 -0
- package/skills/bundled/index.ts +79 -0
- package/skills/bundled/keybindings.ts +339 -0
- package/skills/bundled/loop.ts +92 -0
- package/skills/bundled/loremIpsum.ts +282 -0
- package/skills/bundled/remember.ts +82 -0
- package/skills/bundled/scheduleRemoteAgents.ts +447 -0
- package/skills/bundled/simplify.ts +69 -0
- package/skills/bundled/skillify.ts +197 -0
- package/skills/bundled/stuck.ts +79 -0
- package/skills/bundled/updateConfig.ts +475 -0
- package/skills/bundled/verify/SKILL.md +3 -0
- package/skills/bundled/verify/examples/cli.md +3 -0
- package/skills/bundled/verify/examples/server.md +3 -0
- package/skills/bundled/verify.ts +30 -0
- package/skills/bundled/verifyContent.ts +13 -0
- package/skills/bundledSkills.ts +220 -0
- package/skills/loadSkillsDir.ts +1086 -0
- package/skills/mcpSkillBuilders.ts +44 -0
- package/state/AppState.tsx +200 -0
- package/state/AppStateStore.ts +569 -0
- package/state/onChangeAppState.ts +171 -0
- package/state/selectors.ts +76 -0
- package/state/store.ts +34 -0
- package/state/teammateViewHelpers.ts +141 -0
- package/tasks/DreamTask/DreamTask.ts +157 -0
- package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
- package/tasks/InProcessTeammateTask/types.ts +121 -0
- package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
- package/tasks/LocalMainSessionTask.ts +479 -0
- package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
- package/tasks/LocalShellTask/guards.ts +41 -0
- package/tasks/LocalShellTask/killShellTasks.ts +76 -0
- package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
- package/tasks/pillLabel.ts +82 -0
- package/tasks/stopTask.ts +100 -0
- package/tasks/types.ts +46 -0
- package/types/command.ts +216 -0
- package/types/connectorText.ts +13 -0
- package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/types/generated/google/protobuf/timestamp.ts +187 -0
- package/types/hooks.ts +290 -0
- package/types/ids.ts +44 -0
- package/types/logs.ts +330 -0
- package/types/permissions.ts +441 -0
- package/types/plugin.ts +363 -0
- package/types/textInputTypes.ts +387 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useCallback, useEffect } from 'react'
|
|
2
|
+
import type { Command } from '../commands.js'
|
|
3
|
+
import {
|
|
4
|
+
clearCommandMemoizationCaches,
|
|
5
|
+
clearCommandsCache,
|
|
6
|
+
getCommands,
|
|
7
|
+
} from '../commands.js'
|
|
8
|
+
import { onGrowthBookRefresh } from '../services/analytics/growthbook.js'
|
|
9
|
+
import { logError } from '../utils/log.js'
|
|
10
|
+
import { skillChangeDetector } from '../utils/skills/skillChangeDetector.js'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Keep the commands list fresh across two triggers:
|
|
14
|
+
*
|
|
15
|
+
* 1. Skill file changes (watcher) — full cache clear + disk re-scan, since
|
|
16
|
+
* skill content changed on disk.
|
|
17
|
+
* 2. GrowthBook init/refresh — memo-only clear, since only `isEnabled()`
|
|
18
|
+
* predicates may have changed. Handles commands like /btw whose gate
|
|
19
|
+
* reads a flag that isn't in the disk cache yet on first session after
|
|
20
|
+
* a flag rename: getCommands() runs before GB init (main.tsx:2855 vs
|
|
21
|
+
* showSetupScreens at :3106), so the memoized list is baked with the
|
|
22
|
+
* default. Once init populates remoteEvalFeatureValues, re-filter.
|
|
23
|
+
*/
|
|
24
|
+
export function useSkillsChange(
|
|
25
|
+
cwd: string | undefined,
|
|
26
|
+
onCommandsChange: (commands: Command[]) => void,
|
|
27
|
+
): void {
|
|
28
|
+
const handleChange = useCallback(async () => {
|
|
29
|
+
if (!cwd) return
|
|
30
|
+
try {
|
|
31
|
+
// Clear all command caches to ensure fresh load
|
|
32
|
+
clearCommandsCache()
|
|
33
|
+
const commands = await getCommands(cwd)
|
|
34
|
+
onCommandsChange(commands)
|
|
35
|
+
} catch (error) {
|
|
36
|
+
// Errors during reload are non-fatal - log and continue
|
|
37
|
+
if (error instanceof Error) {
|
|
38
|
+
logError(error)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, [cwd, onCommandsChange])
|
|
42
|
+
|
|
43
|
+
useEffect(() => skillChangeDetector.subscribe(handleChange), [handleChange])
|
|
44
|
+
|
|
45
|
+
const handleGrowthBookRefresh = useCallback(async () => {
|
|
46
|
+
if (!cwd) return
|
|
47
|
+
try {
|
|
48
|
+
clearCommandMemoizationCaches()
|
|
49
|
+
const commands = await getCommands(cwd)
|
|
50
|
+
onCommandsChange(commands)
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof Error) {
|
|
53
|
+
logError(error)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}, [cwd, onCommandsChange])
|
|
57
|
+
|
|
58
|
+
useEffect(
|
|
59
|
+
() => onGrowthBookRefresh(handleGrowthBookRefresh),
|
|
60
|
+
[handleGrowthBookRefresh],
|
|
61
|
+
)
|
|
62
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Initialization Hook
|
|
3
|
+
*
|
|
4
|
+
* Initializes swarm features: teammate hooks and context.
|
|
5
|
+
* Handles both fresh spawns and resumed teammate sessions.
|
|
6
|
+
*
|
|
7
|
+
* This hook is conditionally loaded to allow dead code elimination when swarms are disabled.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useEffect } from 'react'
|
|
11
|
+
import { getSessionId } from '../bootstrap/state.js'
|
|
12
|
+
import type { AppState } from '../state/AppState.js'
|
|
13
|
+
import type { Message } from '../types/message.js'
|
|
14
|
+
import { isAgentSwarmsEnabled } from '../utils/agentSwarmsEnabled.js'
|
|
15
|
+
import { initializeTeammateContextFromSession } from '../utils/swarm/reconnection.js'
|
|
16
|
+
import { readTeamFile } from '../utils/swarm/teamHelpers.js'
|
|
17
|
+
import { initializeTeammateHooks } from '../utils/swarm/teammateInit.js'
|
|
18
|
+
import { getDynamicTeamContext } from '../utils/teammate.js'
|
|
19
|
+
|
|
20
|
+
type SetAppState = (f: (prevState: AppState) => AppState) => void
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Hook that initializes swarm features when ENABLE_AGENT_SWARMS is true.
|
|
24
|
+
*
|
|
25
|
+
* Handles both:
|
|
26
|
+
* - Resumed teammate sessions (from --resume or /resume) where teamName/agentName
|
|
27
|
+
* are stored in transcript messages
|
|
28
|
+
* - Fresh spawns where context is read from environment variables
|
|
29
|
+
*/
|
|
30
|
+
export function useSwarmInitialization(
|
|
31
|
+
setAppState: SetAppState,
|
|
32
|
+
initialMessages: Message[] | undefined,
|
|
33
|
+
{ enabled = true }: { enabled?: boolean } = {},
|
|
34
|
+
): void {
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!enabled) return
|
|
37
|
+
if (isAgentSwarmsEnabled()) {
|
|
38
|
+
// Check if this is a resumed agent session (from --resume or /resume)
|
|
39
|
+
// Resumed sessions have teamName/agentName stored in transcript messages
|
|
40
|
+
const firstMessage = initialMessages?.[0]
|
|
41
|
+
const teamName =
|
|
42
|
+
firstMessage && 'teamName' in firstMessage
|
|
43
|
+
? (firstMessage.teamName as string | undefined)
|
|
44
|
+
: undefined
|
|
45
|
+
const agentName =
|
|
46
|
+
firstMessage && 'agentName' in firstMessage
|
|
47
|
+
? (firstMessage.agentName as string | undefined)
|
|
48
|
+
: undefined
|
|
49
|
+
|
|
50
|
+
if (teamName && agentName) {
|
|
51
|
+
// Resumed agent session - set up team context from stored info
|
|
52
|
+
initializeTeammateContextFromSession(setAppState, teamName, agentName)
|
|
53
|
+
|
|
54
|
+
// Get agentId from team file for hook initialization
|
|
55
|
+
const teamFile = readTeamFile(teamName)
|
|
56
|
+
const member = teamFile?.members.find(
|
|
57
|
+
(m: { name: string }) => m.name === agentName,
|
|
58
|
+
)
|
|
59
|
+
if (member) {
|
|
60
|
+
initializeTeammateHooks(setAppState, getSessionId(), {
|
|
61
|
+
teamName,
|
|
62
|
+
agentId: member.agentId,
|
|
63
|
+
agentName,
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
// Fresh spawn or standalone session
|
|
68
|
+
// teamContext is already computed in main.tsx via computeInitialTeamContext()
|
|
69
|
+
// and included in initialState, so we only need to initialize hooks here
|
|
70
|
+
const context = getDynamicTeamContext?.()
|
|
71
|
+
if (context?.teamName && context?.agentId && context?.agentName) {
|
|
72
|
+
initializeTeammateHooks(setAppState, getSessionId(), {
|
|
73
|
+
teamName: context.teamName,
|
|
74
|
+
agentId: context.agentId,
|
|
75
|
+
agentName: context.agentName,
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}, [setAppState, initialMessages, enabled])
|
|
81
|
+
}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Permission Poller Hook
|
|
3
|
+
*
|
|
4
|
+
* This hook polls for permission responses from the team leader when running
|
|
5
|
+
* as a worker agent in a swarm. When a response is received, it calls the
|
|
6
|
+
* appropriate callback (onAllow/onReject) to continue execution.
|
|
7
|
+
*
|
|
8
|
+
* This hook should be used in conjunction with the worker-side integration
|
|
9
|
+
* in useCanUseTool.ts, which creates pending requests that this hook monitors.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { useCallback, useEffect, useRef } from 'react'
|
|
13
|
+
import { useInterval } from 'usehooks-ts'
|
|
14
|
+
import { logForDebugging } from '../utils/debug.js'
|
|
15
|
+
import { errorMessage } from '../utils/errors.js'
|
|
16
|
+
import {
|
|
17
|
+
type PermissionUpdate,
|
|
18
|
+
permissionUpdateSchema,
|
|
19
|
+
} from '../utils/permissions/PermissionUpdateSchema.js'
|
|
20
|
+
import {
|
|
21
|
+
isSwarmWorker,
|
|
22
|
+
type PermissionResponse,
|
|
23
|
+
pollForResponse,
|
|
24
|
+
removeWorkerResponse,
|
|
25
|
+
} from '../utils/swarm/permissionSync.js'
|
|
26
|
+
import { getAgentName, getTeamName } from '../utils/teammate.js'
|
|
27
|
+
|
|
28
|
+
const POLL_INTERVAL_MS = 500
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Validate permissionUpdates from external sources (mailbox IPC, disk polling).
|
|
32
|
+
* Malformed entries from buggy/old teammate processes are filtered out rather
|
|
33
|
+
* than propagated unchecked into callback.onAllow().
|
|
34
|
+
*/
|
|
35
|
+
function parsePermissionUpdates(raw: unknown): PermissionUpdate[] {
|
|
36
|
+
if (!Array.isArray(raw)) {
|
|
37
|
+
return []
|
|
38
|
+
}
|
|
39
|
+
const schema = permissionUpdateSchema()
|
|
40
|
+
const valid: PermissionUpdate[] = []
|
|
41
|
+
for (const entry of raw) {
|
|
42
|
+
const result = schema.safeParse(entry)
|
|
43
|
+
if (result.success) {
|
|
44
|
+
valid.push(result.data)
|
|
45
|
+
} else {
|
|
46
|
+
logForDebugging(
|
|
47
|
+
`[SwarmPermissionPoller] Dropping malformed permissionUpdate entry: ${result.error.message}`,
|
|
48
|
+
{ level: 'warn' },
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return valid
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Callback signature for handling permission responses
|
|
57
|
+
*/
|
|
58
|
+
export type PermissionResponseCallback = {
|
|
59
|
+
requestId: string
|
|
60
|
+
toolUseId: string
|
|
61
|
+
onAllow: (
|
|
62
|
+
updatedInput: Record<string, unknown> | undefined,
|
|
63
|
+
permissionUpdates: PermissionUpdate[],
|
|
64
|
+
feedback?: string,
|
|
65
|
+
) => void
|
|
66
|
+
onReject: (feedback?: string) => void
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Registry for pending permission request callbacks
|
|
71
|
+
* This allows the poller to find and invoke the right callbacks when responses arrive
|
|
72
|
+
*/
|
|
73
|
+
type PendingCallbackRegistry = Map<string, PermissionResponseCallback>
|
|
74
|
+
|
|
75
|
+
// Module-level registry that persists across renders
|
|
76
|
+
const pendingCallbacks: PendingCallbackRegistry = new Map()
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Register a callback for a pending permission request
|
|
80
|
+
* Called by useCanUseTool when a worker submits a permission request
|
|
81
|
+
*/
|
|
82
|
+
export function registerPermissionCallback(
|
|
83
|
+
callback: PermissionResponseCallback,
|
|
84
|
+
): void {
|
|
85
|
+
pendingCallbacks.set(callback.requestId, callback)
|
|
86
|
+
logForDebugging(
|
|
87
|
+
`[SwarmPermissionPoller] Registered callback for request ${callback.requestId}`,
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Unregister a callback (e.g., when the request is resolved locally or times out)
|
|
93
|
+
*/
|
|
94
|
+
export function unregisterPermissionCallback(requestId: string): void {
|
|
95
|
+
pendingCallbacks.delete(requestId)
|
|
96
|
+
logForDebugging(
|
|
97
|
+
`[SwarmPermissionPoller] Unregistered callback for request ${requestId}`,
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if a request has a registered callback
|
|
103
|
+
*/
|
|
104
|
+
export function hasPermissionCallback(requestId: string): boolean {
|
|
105
|
+
return pendingCallbacks.has(requestId)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Clear all pending callbacks (both permission and sandbox).
|
|
110
|
+
* Called from clearSessionCaches() on /clear to reset stale state,
|
|
111
|
+
* and also used in tests for isolation.
|
|
112
|
+
*/
|
|
113
|
+
export function clearAllPendingCallbacks(): void {
|
|
114
|
+
pendingCallbacks.clear()
|
|
115
|
+
pendingSandboxCallbacks.clear()
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Process a permission response from a mailbox message.
|
|
120
|
+
* This is called by the inbox poller when it detects a permission_response message.
|
|
121
|
+
*
|
|
122
|
+
* @returns true if the response was processed, false if no callback was registered
|
|
123
|
+
*/
|
|
124
|
+
export function processMailboxPermissionResponse(params: {
|
|
125
|
+
requestId: string
|
|
126
|
+
decision: 'approved' | 'rejected'
|
|
127
|
+
feedback?: string
|
|
128
|
+
updatedInput?: Record<string, unknown>
|
|
129
|
+
permissionUpdates?: unknown
|
|
130
|
+
}): boolean {
|
|
131
|
+
const callback = pendingCallbacks.get(params.requestId)
|
|
132
|
+
|
|
133
|
+
if (!callback) {
|
|
134
|
+
logForDebugging(
|
|
135
|
+
`[SwarmPermissionPoller] No callback registered for mailbox response ${params.requestId}`,
|
|
136
|
+
)
|
|
137
|
+
return false
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
logForDebugging(
|
|
141
|
+
`[SwarmPermissionPoller] Processing mailbox response for request ${params.requestId}: ${params.decision}`,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
// Remove from registry before invoking callback
|
|
145
|
+
pendingCallbacks.delete(params.requestId)
|
|
146
|
+
|
|
147
|
+
if (params.decision === 'approved') {
|
|
148
|
+
const permissionUpdates = parsePermissionUpdates(params.permissionUpdates)
|
|
149
|
+
const updatedInput = params.updatedInput
|
|
150
|
+
callback.onAllow(updatedInput, permissionUpdates)
|
|
151
|
+
} else {
|
|
152
|
+
callback.onReject(params.feedback)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return true
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// Sandbox Permission Callback Registry
|
|
160
|
+
// ============================================================================
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Callback signature for handling sandbox permission responses
|
|
164
|
+
*/
|
|
165
|
+
export type SandboxPermissionResponseCallback = {
|
|
166
|
+
requestId: string
|
|
167
|
+
host: string
|
|
168
|
+
resolve: (allow: boolean) => void
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Module-level registry for sandbox permission callbacks
|
|
172
|
+
const pendingSandboxCallbacks: Map<string, SandboxPermissionResponseCallback> =
|
|
173
|
+
new Map()
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Register a callback for a pending sandbox permission request
|
|
177
|
+
* Called when a worker sends a sandbox permission request to the leader
|
|
178
|
+
*/
|
|
179
|
+
export function registerSandboxPermissionCallback(
|
|
180
|
+
callback: SandboxPermissionResponseCallback,
|
|
181
|
+
): void {
|
|
182
|
+
pendingSandboxCallbacks.set(callback.requestId, callback)
|
|
183
|
+
logForDebugging(
|
|
184
|
+
`[SwarmPermissionPoller] Registered sandbox callback for request ${callback.requestId}`,
|
|
185
|
+
)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Check if a sandbox request has a registered callback
|
|
190
|
+
*/
|
|
191
|
+
export function hasSandboxPermissionCallback(requestId: string): boolean {
|
|
192
|
+
return pendingSandboxCallbacks.has(requestId)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Process a sandbox permission response from a mailbox message.
|
|
197
|
+
* Called by the inbox poller when it detects a sandbox_permission_response message.
|
|
198
|
+
*
|
|
199
|
+
* @returns true if the response was processed, false if no callback was registered
|
|
200
|
+
*/
|
|
201
|
+
export function processSandboxPermissionResponse(params: {
|
|
202
|
+
requestId: string
|
|
203
|
+
host: string
|
|
204
|
+
allow: boolean
|
|
205
|
+
}): boolean {
|
|
206
|
+
const callback = pendingSandboxCallbacks.get(params.requestId)
|
|
207
|
+
|
|
208
|
+
if (!callback) {
|
|
209
|
+
logForDebugging(
|
|
210
|
+
`[SwarmPermissionPoller] No sandbox callback registered for request ${params.requestId}`,
|
|
211
|
+
)
|
|
212
|
+
return false
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
logForDebugging(
|
|
216
|
+
`[SwarmPermissionPoller] Processing sandbox response for request ${params.requestId}: allow=${params.allow}`,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
// Remove from registry before invoking callback
|
|
220
|
+
pendingSandboxCallbacks.delete(params.requestId)
|
|
221
|
+
|
|
222
|
+
// Resolve the promise with the allow decision
|
|
223
|
+
callback.resolve(params.allow)
|
|
224
|
+
|
|
225
|
+
return true
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Process a permission response by invoking the registered callback
|
|
230
|
+
*/
|
|
231
|
+
function processResponse(response: PermissionResponse): boolean {
|
|
232
|
+
const callback = pendingCallbacks.get(response.requestId)
|
|
233
|
+
|
|
234
|
+
if (!callback) {
|
|
235
|
+
logForDebugging(
|
|
236
|
+
`[SwarmPermissionPoller] No callback registered for request ${response.requestId}`,
|
|
237
|
+
)
|
|
238
|
+
return false
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
logForDebugging(
|
|
242
|
+
`[SwarmPermissionPoller] Processing response for request ${response.requestId}: ${response.decision}`,
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
// Remove from registry before invoking callback
|
|
246
|
+
pendingCallbacks.delete(response.requestId)
|
|
247
|
+
|
|
248
|
+
if (response.decision === 'approved') {
|
|
249
|
+
const permissionUpdates = parsePermissionUpdates(response.permissionUpdates)
|
|
250
|
+
const updatedInput = response.updatedInput
|
|
251
|
+
callback.onAllow(updatedInput, permissionUpdates)
|
|
252
|
+
} else {
|
|
253
|
+
callback.onReject(response.feedback)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return true
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Hook that polls for permission responses when running as a swarm worker.
|
|
261
|
+
*
|
|
262
|
+
* This hook:
|
|
263
|
+
* 1. Only activates when isSwarmWorker() returns true
|
|
264
|
+
* 2. Polls every 500ms for responses
|
|
265
|
+
* 3. When a response is found, invokes the registered callback
|
|
266
|
+
* 4. Cleans up the response file after processing
|
|
267
|
+
*/
|
|
268
|
+
export function useSwarmPermissionPoller(): void {
|
|
269
|
+
const isProcessingRef = useRef(false)
|
|
270
|
+
|
|
271
|
+
const poll = useCallback(async () => {
|
|
272
|
+
// Don't poll if not a swarm worker
|
|
273
|
+
if (!isSwarmWorker()) {
|
|
274
|
+
return
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Prevent concurrent polling
|
|
278
|
+
if (isProcessingRef.current) {
|
|
279
|
+
return
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Don't poll if no callbacks are registered
|
|
283
|
+
if (pendingCallbacks.size === 0) {
|
|
284
|
+
return
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
isProcessingRef.current = true
|
|
288
|
+
|
|
289
|
+
try {
|
|
290
|
+
const agentName = getAgentName()
|
|
291
|
+
const teamName = getTeamName()
|
|
292
|
+
|
|
293
|
+
if (!agentName || !teamName) {
|
|
294
|
+
return
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Check each pending request for a response
|
|
298
|
+
for (const [requestId, _callback] of pendingCallbacks) {
|
|
299
|
+
const response = await pollForResponse(requestId, agentName, teamName)
|
|
300
|
+
|
|
301
|
+
if (response) {
|
|
302
|
+
// Process the response
|
|
303
|
+
const processed = processResponse(response)
|
|
304
|
+
|
|
305
|
+
if (processed) {
|
|
306
|
+
// Clean up the response from the worker's inbox
|
|
307
|
+
await removeWorkerResponse(requestId, agentName, teamName)
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
} catch (error) {
|
|
312
|
+
logForDebugging(
|
|
313
|
+
`[SwarmPermissionPoller] Error during poll: ${errorMessage(error)}`,
|
|
314
|
+
)
|
|
315
|
+
} finally {
|
|
316
|
+
isProcessingRef.current = false
|
|
317
|
+
}
|
|
318
|
+
}, [])
|
|
319
|
+
|
|
320
|
+
// Only poll if we're a swarm worker
|
|
321
|
+
const shouldPoll = isSwarmWorker()
|
|
322
|
+
useInterval(() => void poll(), shouldPoll ? POLL_INTERVAL_MS : null)
|
|
323
|
+
|
|
324
|
+
// Initial poll on mount
|
|
325
|
+
useEffect(() => {
|
|
326
|
+
if (isSwarmWorker()) {
|
|
327
|
+
void poll()
|
|
328
|
+
}
|
|
329
|
+
}, [poll])
|
|
330
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { type FSWatcher, watch } from 'fs'
|
|
2
|
+
import { useEffect, useRef } from 'react'
|
|
3
|
+
import { logForDebugging } from '../utils/debug.js'
|
|
4
|
+
import {
|
|
5
|
+
claimTask,
|
|
6
|
+
DEFAULT_TASKS_MODE_TASK_LIST_ID,
|
|
7
|
+
ensureTasksDir,
|
|
8
|
+
getTasksDir,
|
|
9
|
+
listTasks,
|
|
10
|
+
type Task,
|
|
11
|
+
updateTask,
|
|
12
|
+
} from '../utils/tasks.js'
|
|
13
|
+
|
|
14
|
+
const DEBOUNCE_MS = 1000
|
|
15
|
+
|
|
16
|
+
type Props = {
|
|
17
|
+
/** When undefined, the hook does nothing. The task list id is also used as the agent ID. */
|
|
18
|
+
taskListId?: string
|
|
19
|
+
isLoading: boolean
|
|
20
|
+
/**
|
|
21
|
+
* Called when a task is ready to be worked on.
|
|
22
|
+
* Returns true if submission succeeded, false if rejected.
|
|
23
|
+
*/
|
|
24
|
+
onSubmitTask: (prompt: string) => boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Hook that watches a task list directory and automatically picks up
|
|
29
|
+
* open, unowned tasks to work on.
|
|
30
|
+
*
|
|
31
|
+
* This enables "tasks mode" where Claude watches for externally-created
|
|
32
|
+
* tasks and processes them one at a time.
|
|
33
|
+
*/
|
|
34
|
+
export function useTaskListWatcher({
|
|
35
|
+
taskListId,
|
|
36
|
+
isLoading,
|
|
37
|
+
onSubmitTask,
|
|
38
|
+
}: Props): void {
|
|
39
|
+
const currentTaskRef = useRef<string | null>(null)
|
|
40
|
+
const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
41
|
+
|
|
42
|
+
// Stabilize unstable props via refs so the watcher effect doesn't depend on
|
|
43
|
+
// them. isLoading flips every turn, and onSubmitTask's identity changes
|
|
44
|
+
// whenever onQuery's deps change. Without this, the watcher effect re-runs
|
|
45
|
+
// on every turn, calling watcher.close() + watch() each time — which is a
|
|
46
|
+
// trigger for Bun's PathWatcherManager deadlock (oven-sh/bun#27469).
|
|
47
|
+
const isLoadingRef = useRef(isLoading)
|
|
48
|
+
isLoadingRef.current = isLoading
|
|
49
|
+
const onSubmitTaskRef = useRef(onSubmitTask)
|
|
50
|
+
onSubmitTaskRef.current = onSubmitTask
|
|
51
|
+
|
|
52
|
+
const enabled = taskListId !== undefined
|
|
53
|
+
const agentId = taskListId ?? DEFAULT_TASKS_MODE_TASK_LIST_ID
|
|
54
|
+
|
|
55
|
+
// checkForTasks reads isLoading and onSubmitTask from refs — always
|
|
56
|
+
// up-to-date, no stale closure, and doesn't force a new function identity
|
|
57
|
+
// per render. Stored in a ref so the watcher effect can call it without
|
|
58
|
+
// depending on it.
|
|
59
|
+
const checkForTasksRef = useRef<() => Promise<void>>(async () => {})
|
|
60
|
+
checkForTasksRef.current = async () => {
|
|
61
|
+
if (!enabled) {
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Don't need to submit new tasks if we are already working
|
|
66
|
+
if (isLoadingRef.current) {
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const tasks = await listTasks(taskListId)
|
|
71
|
+
|
|
72
|
+
// If we have a current task, check if it's been resolved
|
|
73
|
+
if (currentTaskRef.current !== null) {
|
|
74
|
+
const currentTask = tasks.find(t => t.id === currentTaskRef.current)
|
|
75
|
+
if (!currentTask || currentTask.status === 'completed') {
|
|
76
|
+
logForDebugging(
|
|
77
|
+
`[TaskListWatcher] Task #${currentTaskRef.current} is marked complete, ready for next task`,
|
|
78
|
+
)
|
|
79
|
+
currentTaskRef.current = null
|
|
80
|
+
} else {
|
|
81
|
+
// Still working on current task
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Find an open task with no owner that isn't blocked
|
|
87
|
+
const availableTask = findAvailableTask(tasks)
|
|
88
|
+
|
|
89
|
+
if (!availableTask) {
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
logForDebugging(
|
|
94
|
+
`[TaskListWatcher] Found available task #${availableTask.id}: ${availableTask.subject}`,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
// Claim the task using the task list's agent ID
|
|
98
|
+
const result = await claimTask(taskListId, availableTask.id, agentId)
|
|
99
|
+
|
|
100
|
+
if (!result.success) {
|
|
101
|
+
logForDebugging(
|
|
102
|
+
`[TaskListWatcher] Failed to claim task #${availableTask.id}: ${result.reason}`,
|
|
103
|
+
)
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
currentTaskRef.current = availableTask.id
|
|
108
|
+
|
|
109
|
+
// Format the task as a prompt
|
|
110
|
+
const prompt = formatTaskAsPrompt(availableTask)
|
|
111
|
+
|
|
112
|
+
logForDebugging(
|
|
113
|
+
`[TaskListWatcher] Submitting task #${availableTask.id} as prompt`,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
const submitted = onSubmitTaskRef.current(prompt)
|
|
117
|
+
if (!submitted) {
|
|
118
|
+
logForDebugging(
|
|
119
|
+
`[TaskListWatcher] Failed to submit task #${availableTask.id}, releasing claim`,
|
|
120
|
+
)
|
|
121
|
+
// Release the claim
|
|
122
|
+
await updateTask(taskListId, availableTask.id, { owner: undefined })
|
|
123
|
+
currentTaskRef.current = null
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// -- Watcher setup
|
|
128
|
+
|
|
129
|
+
// Schedules a check after DEBOUNCE_MS, collapsing rapid fs events.
|
|
130
|
+
// Shared between the watcher callback and the idle-trigger effect below.
|
|
131
|
+
const scheduleCheckRef = useRef<() => void>(() => {})
|
|
132
|
+
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
if (!enabled) return
|
|
135
|
+
|
|
136
|
+
void ensureTasksDir(taskListId)
|
|
137
|
+
const tasksDir = getTasksDir(taskListId)
|
|
138
|
+
|
|
139
|
+
let watcher: FSWatcher | null = null
|
|
140
|
+
|
|
141
|
+
const debouncedCheck = (): void => {
|
|
142
|
+
if (debounceTimerRef.current) {
|
|
143
|
+
clearTimeout(debounceTimerRef.current)
|
|
144
|
+
}
|
|
145
|
+
debounceTimerRef.current = setTimeout(
|
|
146
|
+
ref => void ref.current(),
|
|
147
|
+
DEBOUNCE_MS,
|
|
148
|
+
checkForTasksRef,
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
scheduleCheckRef.current = debouncedCheck
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
watcher = watch(tasksDir, debouncedCheck)
|
|
155
|
+
watcher.unref()
|
|
156
|
+
logForDebugging(`[TaskListWatcher] Watching for tasks in ${tasksDir}`)
|
|
157
|
+
} catch (error) {
|
|
158
|
+
// fs.watch throws synchronously on ENOENT — ensureTasksDir should have
|
|
159
|
+
// created the dir, but handle the race gracefully
|
|
160
|
+
logForDebugging(`[TaskListWatcher] Failed to watch ${tasksDir}: ${error}`)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Initial check
|
|
164
|
+
debouncedCheck()
|
|
165
|
+
|
|
166
|
+
return () => {
|
|
167
|
+
// This cleanup only fires when taskListId changes or on unmount —
|
|
168
|
+
// never per-turn. That keeps watcher.close() out of the Bun
|
|
169
|
+
// PathWatcherManager deadlock window.
|
|
170
|
+
scheduleCheckRef.current = () => {}
|
|
171
|
+
if (watcher) {
|
|
172
|
+
watcher.close()
|
|
173
|
+
}
|
|
174
|
+
if (debounceTimerRef.current) {
|
|
175
|
+
clearTimeout(debounceTimerRef.current)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}, [enabled, taskListId])
|
|
179
|
+
|
|
180
|
+
// Previously, the watcher effect depended on checkForTasks (and transitively
|
|
181
|
+
// isLoading), so going idle triggered a re-setup whose initial debouncedCheck
|
|
182
|
+
// would pick up the next task. Preserve that behavior explicitly: when
|
|
183
|
+
// isLoading drops, schedule a check.
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
if (!enabled) return
|
|
186
|
+
if (isLoading) return
|
|
187
|
+
scheduleCheckRef.current()
|
|
188
|
+
}, [enabled, isLoading])
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Find an available task that can be worked on:
|
|
193
|
+
* - Status is 'pending'
|
|
194
|
+
* - No owner assigned
|
|
195
|
+
* - Not blocked by any unresolved tasks
|
|
196
|
+
*/
|
|
197
|
+
function findAvailableTask(tasks: Task[]): Task | undefined {
|
|
198
|
+
const unresolvedTaskIds = new Set(
|
|
199
|
+
tasks.filter(t => t.status !== 'completed').map(t => t.id),
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return tasks.find(task => {
|
|
203
|
+
if (task.status !== 'pending') return false
|
|
204
|
+
if (task.owner) return false
|
|
205
|
+
// Check all blockers are completed
|
|
206
|
+
return task.blockedBy.every(id => !unresolvedTaskIds.has(id))
|
|
207
|
+
})
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Format a task as a prompt for Claude to work on.
|
|
212
|
+
*/
|
|
213
|
+
function formatTaskAsPrompt(task: Task): string {
|
|
214
|
+
let prompt = `Complete all open tasks. Start with task #${task.id}: \n\n ${task.subject}`
|
|
215
|
+
|
|
216
|
+
if (task.description) {
|
|
217
|
+
prompt += `\n\n${task.description}`
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return prompt
|
|
221
|
+
}
|