osagent-cli 0.1.39 → 0.1.87
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/dist/package.json +4 -3
- package/dist/src/commands/doctor.js +27 -4
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +2 -1
- package/dist/src/config/keyBindings.js +4 -0
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/settings.d.ts +1 -1
- package/dist/src/config/settings.js +1 -1
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +9 -0
- package/dist/src/config/settingsSchema.js +9 -0
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +1 -1
- package/dist/src/config/trustedFolders.js +1 -1
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/core/initializer.js +24 -0
- package/dist/src/core/initializer.js.map +1 -1
- package/dist/src/gemini.js +6 -3
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/services/SystemDetectionService.d.ts +56 -0
- package/dist/src/services/SystemDetectionService.js +248 -0
- package/dist/src/services/SystemDetectionService.js.map +1 -0
- package/dist/src/ui/App.js +2 -1
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.js +156 -17
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.d.ts +3 -1
- package/dist/src/ui/IdeIntegrationNudge.js +6 -7
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.js +9 -6
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthInProgress.d.ts +3 -1
- package/dist/src/ui/auth/AuthInProgress.js +5 -6
- package/dist/src/ui/auth/AuthInProgress.js.map +1 -1
- package/dist/src/ui/auth/useAuth.js +48 -10
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/commands/doctorCommand.js +282 -108
- package/dist/src/ui/commands/doctorCommand.js.map +1 -1
- package/dist/src/ui/commands/initCommand.js +80 -28
- package/dist/src/ui/commands/initCommand.js.map +1 -1
- package/dist/src/ui/commands/viewCommand.js +1 -1
- package/dist/src/ui/commands/viewCommand.js.map +1 -1
- package/dist/src/ui/components/ApprovalModeDialog.d.ts +2 -0
- package/dist/src/ui/components/ApprovalModeDialog.js +10 -7
- package/dist/src/ui/components/ApprovalModeDialog.js.map +1 -1
- package/dist/src/ui/components/AsciiArt.d.ts +12 -0
- package/dist/src/ui/components/AsciiArt.js +41 -30
- package/dist/src/ui/components/AsciiArt.js.map +1 -1
- package/dist/src/ui/components/CollapsibleOutput.d.ts +31 -0
- package/dist/src/ui/components/CollapsibleOutput.js +49 -0
- package/dist/src/ui/components/CollapsibleOutput.js.map +1 -0
- package/dist/src/ui/components/CompactionStatusDisplay.d.ts +22 -0
- package/dist/src/ui/components/CompactionStatusDisplay.js +49 -0
- package/dist/src/ui/components/CompactionStatusDisplay.js.map +1 -0
- package/dist/src/ui/components/Composer.js +1 -1
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/ContextCompactionIndicator.d.ts +17 -0
- package/dist/src/ui/components/ContextCompactionIndicator.js +47 -0
- package/dist/src/ui/components/ContextCompactionIndicator.js.map +1 -0
- package/dist/src/ui/components/ContextUsageDisplay.js +5 -4
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.d.ts +6 -1
- package/dist/src/ui/components/DebugProfiler.js +2 -2
- package/dist/src/ui/components/DebugProfiler.js.map +1 -1
- package/dist/src/ui/components/EditorSettingsDialog.d.ts +2 -0
- package/dist/src/ui/components/EditorSettingsDialog.js +10 -7
- package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.js +8 -6
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/Footer.js +6 -3
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +3 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.js +5 -6
- package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -1
- package/dist/src/ui/components/InitDisplay.d.ts +26 -0
- package/dist/src/ui/components/InitDisplay.js +82 -0
- package/dist/src/ui/components/InitDisplay.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.d.ts +1 -1
- package/dist/src/ui/components/InputPrompt.js +44 -13
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.js +5 -2
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoopDetectionConfirmation.js +8 -6
- package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +21 -4
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +28 -13
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelSwitchDialog.d.ts +2 -0
- package/dist/src/ui/components/ModelSwitchDialog.js +8 -6
- package/dist/src/ui/components/ModelSwitchDialog.js.map +1 -1
- package/dist/src/ui/components/OpenAIKeyPrompt.d.ts +3 -1
- package/dist/src/ui/components/OpenAIKeyPrompt.js +18 -53
- package/dist/src/ui/components/OpenAIKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.d.ts +2 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +9 -7
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
- package/dist/src/ui/components/PlanApprovalDisplay.d.ts +18 -0
- package/dist/src/ui/components/PlanApprovalDisplay.js +97 -0
- package/dist/src/ui/components/PlanApprovalDisplay.js.map +1 -0
- package/dist/src/ui/components/PrepareLabel.d.ts +1 -0
- package/dist/src/ui/components/PrepareLabel.js +4 -4
- package/dist/src/ui/components/PrepareLabel.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.js +8 -6
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/QuitConfirmationDialog.js +8 -6
- package/dist/src/ui/components/QuitConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/QwenOAuthProgress.d.ts +3 -1
- package/dist/src/ui/components/QwenOAuthProgress.js +5 -6
- package/dist/src/ui/components/QwenOAuthProgress.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +30 -35
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js +8 -6
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/StatusBar.js +40 -13
- package/dist/src/ui/components/StatusBar.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +5 -4
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/TaskMasterPanel.js +73 -37
- package/dist/src/ui/components/TaskMasterPanel.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.js +11 -8
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/TodoDisplay.js +9 -6
- package/dist/src/ui/components/TodoDisplay.js.map +1 -1
- package/dist/src/ui/components/TreeToolDisplay.d.ts +37 -0
- package/dist/src/ui/components/TreeToolDisplay.js +179 -0
- package/dist/src/ui/components/TreeToolDisplay.js.map +1 -0
- package/dist/src/ui/components/WelcomeBackDialog.js +8 -6
- package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +8 -6
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -5
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +120 -12
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +45 -9
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.d.ts +4 -0
- package/dist/src/ui/components/messages/UserMessage.js +96 -2
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.d.ts +2 -0
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js +9 -6
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js.map +1 -1
- package/dist/src/ui/components/subagents/create/ColorSelector.d.ts +3 -1
- package/dist/src/ui/components/subagents/create/ColorSelector.js +2 -2
- package/dist/src/ui/components/subagents/create/ColorSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/CreationSummary.d.ts +1 -1
- package/dist/src/ui/components/subagents/create/CreationSummary.js +6 -7
- package/dist/src/ui/components/subagents/create/CreationSummary.js.map +1 -1
- package/dist/src/ui/components/subagents/create/DescriptionInput.js +4 -10
- package/dist/src/ui/components/subagents/create/DescriptionInput.js.map +1 -1
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.d.ts +1 -1
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js +2 -2
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/LocationSelector.d.ts +1 -1
- package/dist/src/ui/components/subagents/create/LocationSelector.js +2 -2
- package/dist/src/ui/components/subagents/create/LocationSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/ToolSelector.d.ts +3 -1
- package/dist/src/ui/components/subagents/create/ToolSelector.js +2 -2
- package/dist/src/ui/components/subagents/create/ToolSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.d.ts +3 -1
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js +2 -2
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.d.ts +3 -1
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js +15 -14
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentEditStep.d.ts +3 -1
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js +2 -2
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.d.ts +3 -1
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +7 -9
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.d.ts +2 -0
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js +11 -8
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js.map +1 -1
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.d.ts +2 -0
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +6 -7
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
- package/dist/src/ui/components/subagents/runtime/MultiAgentSummary.d.ts +51 -0
- package/dist/src/ui/components/subagents/runtime/MultiAgentSummary.js +126 -0
- package/dist/src/ui/components/subagents/runtime/MultiAgentSummary.js.map +1 -0
- package/dist/src/ui/components/subagents/types.d.ts +4 -0
- package/dist/src/ui/components/subagents/types.js.map +1 -1
- package/dist/src/ui/contexts/ConsultationContext.js +38 -13
- package/dist/src/ui/contexts/ConsultationContext.js.map +1 -1
- package/dist/src/ui/contexts/FocusContext.d.ts +114 -0
- package/dist/src/ui/contexts/FocusContext.js +129 -0
- package/dist/src/ui/contexts/FocusContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.js +23 -2
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/RoadmapContext.js +21 -3
- package/dist/src/ui/contexts/RoadmapContext.js.map +1 -1
- package/dist/src/ui/contexts/TodoContext.d.ts +4 -0
- package/dist/src/ui/contexts/TodoContext.js +7 -1
- package/dist/src/ui/contexts/TodoContext.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +1 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/contexts/VimModeContext.js +18 -8
- package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
- package/dist/src/ui/hooks/useAutoCompaction.d.ts +44 -0
- package/dist/src/ui/hooks/useAutoCompaction.js +141 -0
- package/dist/src/ui/hooks/useAutoCompaction.js.map +1 -0
- package/dist/src/ui/hooks/useAutoProjectContext.d.ts +34 -0
- package/dist/src/ui/hooks/useAutoProjectContext.js +194 -0
- package/dist/src/ui/hooks/useAutoProjectContext.js.map +1 -0
- package/dist/src/ui/hooks/useEpisodicMemory.d.ts +33 -0
- package/dist/src/ui/hooks/useEpisodicMemory.js +182 -0
- package/dist/src/ui/hooks/useEpisodicMemory.js.map +1 -0
- package/dist/src/ui/hooks/useFocusScope.d.ts +69 -0
- package/dist/src/ui/hooks/useFocusScope.js +121 -0
- package/dist/src/ui/hooks/useFocusScope.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +34 -5
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.js +35 -6
- package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
- package/dist/src/ui/hooks/useKeypress.d.ts +6 -0
- package/dist/src/ui/hooks/useKeypress.js +27 -4
- package/dist/src/ui/hooks/useKeypress.js.map +1 -1
- package/dist/src/ui/hooks/useMessageQueue.js +16 -5
- package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
- package/dist/src/ui/hooks/useOrchestrationTracker.d.ts +24 -0
- package/dist/src/ui/hooks/useOrchestrationTracker.js +50 -0
- package/dist/src/ui/hooks/useOrchestrationTracker.js.map +1 -0
- package/dist/src/ui/hooks/useOrchestratorExecutor.d.ts +21 -0
- package/dist/src/ui/hooks/useOrchestratorExecutor.js +110 -0
- package/dist/src/ui/hooks/useOrchestratorExecutor.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.js +10 -8
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSkillPlugins.d.ts +26 -0
- package/dist/src/ui/hooks/useSkillPlugins.js +72 -0
- package/dist/src/ui/hooks/useSkillPlugins.js.map +1 -0
- package/dist/src/ui/hooks/useSubagentHooksRegistration.d.ts +16 -0
- package/dist/src/ui/hooks/useSubagentHooksRegistration.js +53 -0
- package/dist/src/ui/hooks/useSubagentHooksRegistration.js.map +1 -0
- package/dist/src/ui/hooks/useVectorMemory.d.ts +33 -0
- package/dist/src/ui/hooks/useVectorMemory.js +92 -0
- package/dist/src/ui/hooks/useVectorMemory.js.map +1 -0
- package/dist/src/ui/keyMatchers.test.js +1 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/models/availableModels.d.ts +3 -1
- package/dist/src/ui/models/availableModels.js +14 -7
- package/dist/src/ui/models/availableModels.js.map +1 -1
- package/dist/src/ui/themes/theme.js +2 -2
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/types.d.ts +20 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +12 -0
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +306 -306
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/dist/src/ui/contexts/IntelligentOrchestratorContext.d.ts +0 -87
- package/dist/src/ui/contexts/IntelligentOrchestratorContext.js +0 -336
- package/dist/src/ui/contexts/IntelligentOrchestratorContext.js.map +0 -1
- package/dist/src/ui/contexts/TaskmasterContext.d.ts +0 -87
- package/dist/src/ui/contexts/TaskmasterContext.js +0 -184
- package/dist/src/ui/contexts/TaskmasterContext.js.map +0 -1
- package/dist/src/ui/hooks/useTaskmasterOrchestrator.d.ts +0 -35
- package/dist/src/ui/hooks/useTaskmasterOrchestrator.js +0 -177
- package/dist/src/ui/hooks/useTaskmasterOrchestrator.js.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { theme } from '../../../semantic-colors.js';
|
|
5
|
+
import { Colors } from '../../../colors.js';
|
|
6
|
+
import { useKeypress } from '../../../hooks/useKeypress.js';
|
|
7
|
+
/**
|
|
8
|
+
* Displays a summary of multiple parallel agent executions.
|
|
9
|
+
* Shows a collapsed view with count and expand hint, or expanded view with details.
|
|
10
|
+
*
|
|
11
|
+
* Example collapsed:
|
|
12
|
+
* ● 3 Explore agents finished (ctrl+o to expand)
|
|
13
|
+
*
|
|
14
|
+
* Example expanded:
|
|
15
|
+
* ● 3 Explore agents finished (ctrl+o to expand)
|
|
16
|
+
* ├─ Audit core backend services · 38 tool uses · 94.0k tokens
|
|
17
|
+
* │ └ Done
|
|
18
|
+
* ├─ Explore orchestration system · 14 tool uses · 50.0k tokens
|
|
19
|
+
* │ └ Done
|
|
20
|
+
* └─ Explore CLI frontend architecture · 44 tool uses · 74.0k tokens
|
|
21
|
+
* └ Done
|
|
22
|
+
*/
|
|
23
|
+
export const MultiAgentSummary = ({ agents, groupLabel = 'agents', expandable = true, defaultExpanded = false, isFocused = true, }) => {
|
|
24
|
+
const [expanded, setExpanded] = useState(defaultExpanded);
|
|
25
|
+
const completedCount = useMemo(() => agents.filter(a => a.status === 'completed').length, [agents]);
|
|
26
|
+
const runningCount = useMemo(() => agents.filter(a => a.status === 'running').length, [agents]);
|
|
27
|
+
const failedCount = useMemo(() => agents.filter(a => a.status === 'failed').length, [agents]);
|
|
28
|
+
const allDone = runningCount === 0;
|
|
29
|
+
const hasFailures = failedCount > 0;
|
|
30
|
+
// Determine status color
|
|
31
|
+
const statusColor = useMemo(() => {
|
|
32
|
+
if (runningCount > 0)
|
|
33
|
+
return Colors.AccentYellow;
|
|
34
|
+
if (hasFailures)
|
|
35
|
+
return Colors.AccentRed;
|
|
36
|
+
return Colors.AccentBlue;
|
|
37
|
+
}, [runningCount, hasFailures]);
|
|
38
|
+
// Format token count (e.g., 94000 -> "94.0k")
|
|
39
|
+
const formatTokens = (count) => {
|
|
40
|
+
if (count >= 1000) {
|
|
41
|
+
return `${(count / 1000).toFixed(1)}k`;
|
|
42
|
+
}
|
|
43
|
+
return String(count);
|
|
44
|
+
};
|
|
45
|
+
// Generate summary text
|
|
46
|
+
const summaryText = useMemo(() => {
|
|
47
|
+
if (runningCount > 0) {
|
|
48
|
+
return `${agents.length} ${groupLabel} running`;
|
|
49
|
+
}
|
|
50
|
+
if (allDone && !hasFailures) {
|
|
51
|
+
return `${completedCount} ${groupLabel} finished`;
|
|
52
|
+
}
|
|
53
|
+
if (hasFailures) {
|
|
54
|
+
return `${completedCount} finished, ${failedCount} failed`;
|
|
55
|
+
}
|
|
56
|
+
return `${agents.length} ${groupLabel}`;
|
|
57
|
+
}, [agents.length, groupLabel, runningCount, allDone, hasFailures, completedCount, failedCount]);
|
|
58
|
+
// Handle keyboard shortcut for expand/collapse
|
|
59
|
+
const handleKeypress = useCallback((key) => {
|
|
60
|
+
if (expandable && key.ctrl && key.name === 'o') {
|
|
61
|
+
setExpanded(prev => !prev);
|
|
62
|
+
}
|
|
63
|
+
}, [expandable]);
|
|
64
|
+
// Use focus-aware keypress to prevent conflicts with dialogs
|
|
65
|
+
useKeypress(handleKeypress, { isActive: isFocused && expandable });
|
|
66
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: statusColor, children: "\u25CF " }), _jsx(Text, { bold: true, color: statusColor, children: summaryText }), expandable && (_jsxs(Text, { color: theme.text.secondary, children: [' ', "(ctrl+o to ", expanded ? 'collapse' : 'expand', ")"] }))] }), expanded && (_jsx(Box, { flexDirection: "column", marginLeft: 2, children: agents.map((agent, index) => {
|
|
67
|
+
const isLast = index === agents.length - 1;
|
|
68
|
+
const prefix = isLast ? '└─' : '├─';
|
|
69
|
+
const statusPrefix = isLast ? ' ' : '│ ';
|
|
70
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: theme.text.secondary, children: [prefix, " "] }), _jsx(Text, { bold: true, children: agent.description || agent.name }), _jsxs(Text, { color: theme.text.secondary, children: [' ', "\u00B7 ", agent.toolUses, " tool uses \u00B7 ", formatTokens(agent.tokenCount), " tokens"] })] }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: theme.text.secondary, children: [statusPrefix, "\u2514 "] }), _jsx(AgentStatusText, { status: agent.status, error: agent.error })] })] }, agent.id));
|
|
71
|
+
}) })), !expanded && allDone && (_jsx(Box, { flexDirection: "row", marginLeft: 2, children: _jsxs(Text, { color: theme.text.secondary, children: ["Total: ", agents.reduce((sum, a) => sum + a.toolUses, 0), " tool uses \u00B7 ", ' ', formatTokens(agents.reduce((sum, a) => sum + a.tokenCount, 0)), " tokens"] }) }))] }));
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Status text component for individual agents
|
|
75
|
+
*/
|
|
76
|
+
const AgentStatusText = ({ status, error }) => {
|
|
77
|
+
switch (status) {
|
|
78
|
+
case 'running':
|
|
79
|
+
return _jsx(Text, { color: Colors.AccentYellow, children: "Running..." });
|
|
80
|
+
case 'completed':
|
|
81
|
+
return _jsx(Text, { color: Colors.AccentGreen, children: "Done" });
|
|
82
|
+
case 'failed':
|
|
83
|
+
return (_jsxs(Text, { color: Colors.AccentRed, children: ["Failed", error ? `: ${error}` : ''] }));
|
|
84
|
+
case 'cancelled':
|
|
85
|
+
return _jsx(Text, { color: Colors.AccentYellow, children: "Cancelled" });
|
|
86
|
+
default:
|
|
87
|
+
return _jsx(Text, { color: theme.text.secondary, children: "Unknown" });
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Hook to track multiple parallel agent executions
|
|
92
|
+
*/
|
|
93
|
+
export function useMultiAgentTracking() {
|
|
94
|
+
const [agents, setAgents] = useState(new Map());
|
|
95
|
+
const addAgent = (agent) => {
|
|
96
|
+
setAgents(prev => new Map(prev).set(agent.id, agent));
|
|
97
|
+
};
|
|
98
|
+
const updateAgent = (id, updates) => {
|
|
99
|
+
setAgents(prev => {
|
|
100
|
+
const updated = new Map(prev);
|
|
101
|
+
const existing = updated.get(id);
|
|
102
|
+
if (existing) {
|
|
103
|
+
updated.set(id, { ...existing, ...updates });
|
|
104
|
+
}
|
|
105
|
+
return updated;
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
const removeAgent = (id) => {
|
|
109
|
+
setAgents(prev => {
|
|
110
|
+
const updated = new Map(prev);
|
|
111
|
+
updated.delete(id);
|
|
112
|
+
return updated;
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const clearAgents = () => {
|
|
116
|
+
setAgents(new Map());
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
agents: Array.from(agents.values()),
|
|
120
|
+
addAgent,
|
|
121
|
+
updateAgent,
|
|
122
|
+
removeAgent,
|
|
123
|
+
clearAgents,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=MultiAgentSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiAgentSummary.js","sourceRoot":"","sources":["../../../../../../src/ui/components/subagents/runtime/MultiAgentSummary.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAsB5D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,MAAM,EACN,UAAU,GAAG,QAAQ,EACrB,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,KAAK,EACvB,SAAS,GAAG,IAAI,GACjB,EAAE,EAAE;IACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE1D,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,EACzD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EACvD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,EACtD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;IAEpC,yBAAyB;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;QACjD,IAAI,WAAW;YAAE,OAAO,MAAM,CAAC,SAAS,CAAC;QACzC,OAAO,MAAM,CAAC,UAAU,CAAC;IAC3B,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAEhC,8CAA8C;IAC9C,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE;QAC7C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,wBAAwB;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,UAAU,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5B,OAAO,GAAG,cAAc,IAAI,UAAU,WAAW,CAAC;QACpD,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,GAAG,cAAc,cAAc,WAAW,SAAS,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;IAEjG,+CAA+C;IAC/C,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,GAAsC,EAAE,EAAE;QACzC,IAAI,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/C,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,6DAA6D;IAC7D,WAAW,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;IAEnE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAEzB,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,wBAAW,EACnC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,WAAW,YAC1B,WAAW,GACP,EACN,UAAU,IAAI,CACb,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,aAC9B,GAAG,iBAAa,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,SAC5C,CACR,IACG,EAGL,QAAQ,IAAI,CACX,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACtC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC3B,MAAM,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;oBAE5C,OAAO,CACL,MAAC,GAAG,IAAgB,aAAa,EAAC,QAAQ,aAExC,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,aAAG,MAAM,SAAS,EACnD,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,GAAQ,EACnD,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,aAC9B,GAAG,aAAI,KAAK,CAAC,QAAQ,wBAAe,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,eAC9D,IACH,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,aAAG,YAAY,eAAU,EAC1D,KAAC,eAAe,IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,IACzD,KAdE,KAAK,CAAC,EAAE,CAeZ,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,CACP,EAGA,CAAC,QAAQ,IAAI,OAAO,IAAI,CACvB,KAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAE,CAAC,YACpC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,wBACvB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,wBAAe,GAAG,EACvE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,eAC1D,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAGhB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IACzB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,YAAY,2BAAmB,CAAC;QAC7D,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,qBAAa,CAAC;QACtD,KAAK,QAAQ;YACX,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,uBACpB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAC3B,CACR,CAAC;QACJ,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,YAAY,0BAAkB,CAAC;QAC5D;YACE,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,wBAAgB,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAqC,IAAI,GAAG,EAAE,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAG,CAAC,KAA4B,EAAE,EAAE;QAChD,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,OAAuC,EAAE,EAAE;QAC1E,SAAS,CAAC,IAAI,CAAC,EAAE;YACf,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE;QACjC,SAAS,CAAC,IAAI,CAAC,EAAE;YACf,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,QAAQ;QACR,WAAW;QACX,WAAW;QACX,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -107,6 +107,8 @@ export interface WizardStepProps {
|
|
|
107
107
|
onPrevious: () => void;
|
|
108
108
|
onCancel: () => void;
|
|
109
109
|
config: Config | null;
|
|
110
|
+
/** Whether this step should respond to keyboard input. */
|
|
111
|
+
isFocused?: boolean;
|
|
110
112
|
}
|
|
111
113
|
/**
|
|
112
114
|
* Result of the wizard completion.
|
|
@@ -134,4 +136,6 @@ export declare const MANAGEMENT_STEPS: {
|
|
|
134
136
|
export interface StepNavigationProps {
|
|
135
137
|
onNavigateToStep: (step: string) => void;
|
|
136
138
|
onNavigateBack: () => void;
|
|
139
|
+
/** Whether this step should respond to keyboard input. */
|
|
140
|
+
isFocused?: boolean;
|
|
137
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/ui/components/subagents/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/ui/components/subagents/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkHH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;CAClC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useState, useCallback, } from 'react';
|
|
2
|
+
import { createContext, useContext, useState, useCallback, useRef, useMemo, } from 'react';
|
|
3
3
|
const ConsultationContext = createContext(null);
|
|
4
4
|
export function useConsultation() {
|
|
5
5
|
const context = useContext(ConsultationContext);
|
|
@@ -23,6 +23,12 @@ export function ConsultationProvider({ children }) {
|
|
|
23
23
|
userPreferences: {},
|
|
24
24
|
});
|
|
25
25
|
const generateId = () => `q_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
26
|
+
// Use refs to avoid unstable callback identities that cause infinite loops
|
|
27
|
+
// These refs allow callbacks to access current values without being dependencies
|
|
28
|
+
const currentQuestionRef = useRef(currentQuestion);
|
|
29
|
+
currentQuestionRef.current = currentQuestion;
|
|
30
|
+
const consultationModeRef = useRef(consultationMode);
|
|
31
|
+
consultationModeRef.current = consultationMode;
|
|
26
32
|
const addQuestion = useCallback((question) => {
|
|
27
33
|
const newQuestion = {
|
|
28
34
|
...question,
|
|
@@ -43,14 +49,15 @@ export function ConsultationProvider({ children }) {
|
|
|
43
49
|
questions: [...prev.questions, newQuestion],
|
|
44
50
|
}));
|
|
45
51
|
// If no current question, set this as current
|
|
46
|
-
|
|
52
|
+
// Use refs to access current state without adding to dependencies
|
|
53
|
+
if (!currentQuestionRef.current) {
|
|
47
54
|
setCurrentQuestion(newQuestion);
|
|
48
55
|
// In blocking mode, high-priority questions pause the agent
|
|
49
|
-
if (
|
|
56
|
+
if (consultationModeRef.current === 'blocking' && newQuestion.priority === 'high') {
|
|
50
57
|
setIsBlocking(true);
|
|
51
58
|
}
|
|
52
59
|
}
|
|
53
|
-
}, [
|
|
60
|
+
}, []); // Empty deps - use refs for state access
|
|
54
61
|
const answerQuestion = useCallback((questionId, answer) => {
|
|
55
62
|
setCollectedContext(prev => {
|
|
56
63
|
const newAnswers = new Map(prev.answers);
|
|
@@ -68,14 +75,14 @@ export function ConsultationProvider({ children }) {
|
|
|
68
75
|
};
|
|
69
76
|
});
|
|
70
77
|
setQuestionQueue(prev => prev.filter(q => q.id !== questionId));
|
|
71
|
-
// Move to next question
|
|
78
|
+
// Move to next question - use ref to access consultationMode
|
|
72
79
|
setQuestionQueue(prev => {
|
|
73
80
|
const next = prev[0] || null;
|
|
74
81
|
setCurrentQuestion(next);
|
|
75
82
|
if (!next) {
|
|
76
83
|
setIsBlocking(false);
|
|
77
84
|
}
|
|
78
|
-
else if (
|
|
85
|
+
else if (consultationModeRef.current === 'blocking' && next.priority === 'high') {
|
|
79
86
|
setIsBlocking(true);
|
|
80
87
|
}
|
|
81
88
|
else {
|
|
@@ -83,7 +90,7 @@ export function ConsultationProvider({ children }) {
|
|
|
83
90
|
}
|
|
84
91
|
return prev.slice(1);
|
|
85
92
|
});
|
|
86
|
-
}, [
|
|
93
|
+
}, []); // Empty deps - use ref for consultationMode
|
|
87
94
|
const skipQuestion = useCallback((questionId) => {
|
|
88
95
|
setQuestionQueue(prev => {
|
|
89
96
|
const filtered = prev.filter(q => q.id !== questionId);
|
|
@@ -92,7 +99,7 @@ export function ConsultationProvider({ children }) {
|
|
|
92
99
|
if (!next) {
|
|
93
100
|
setIsBlocking(false);
|
|
94
101
|
}
|
|
95
|
-
else if (
|
|
102
|
+
else if (consultationModeRef.current === 'blocking' && next.priority === 'high') {
|
|
96
103
|
setIsBlocking(true);
|
|
97
104
|
}
|
|
98
105
|
else {
|
|
@@ -100,17 +107,18 @@ export function ConsultationProvider({ children }) {
|
|
|
100
107
|
}
|
|
101
108
|
return filtered.slice(1);
|
|
102
109
|
});
|
|
103
|
-
}, [
|
|
110
|
+
}, []); // Empty deps - use ref for consultationMode
|
|
104
111
|
const setConsultationMode = useCallback((mode) => {
|
|
105
112
|
setConsultationModeState(mode);
|
|
106
113
|
// In blocking mode, check if current question should block
|
|
107
|
-
|
|
114
|
+
// Use ref to access currentQuestion without adding to dependencies
|
|
115
|
+
if (mode === 'blocking' && currentQuestionRef.current?.priority === 'high') {
|
|
108
116
|
setIsBlocking(true);
|
|
109
117
|
}
|
|
110
118
|
else if (mode === 'active') {
|
|
111
119
|
setIsBlocking(false);
|
|
112
120
|
}
|
|
113
|
-
}, [
|
|
121
|
+
}, []); // Empty deps - use ref for currentQuestion
|
|
114
122
|
const getContextForAgent = useCallback(() => {
|
|
115
123
|
const contextParts = [];
|
|
116
124
|
if (collectedContext.projectContext.length > 0) {
|
|
@@ -165,7 +173,9 @@ export function ConsultationProvider({ children }) {
|
|
|
165
173
|
};
|
|
166
174
|
});
|
|
167
175
|
}, []);
|
|
168
|
-
|
|
176
|
+
// CRITICAL: Memoize context value to prevent unnecessary re-renders of all consumers
|
|
177
|
+
// Without this, every render creates a new object, causing infinite re-render loops
|
|
178
|
+
const value = useMemo(() => ({
|
|
169
179
|
isActive,
|
|
170
180
|
currentQuestion,
|
|
171
181
|
questionQueue,
|
|
@@ -180,7 +190,22 @@ export function ConsultationProvider({ children }) {
|
|
|
180
190
|
clearContext,
|
|
181
191
|
setBlocking,
|
|
182
192
|
addUserContext,
|
|
183
|
-
}
|
|
193
|
+
}), [
|
|
194
|
+
isActive,
|
|
195
|
+
currentQuestion,
|
|
196
|
+
questionQueue,
|
|
197
|
+
collectedContext,
|
|
198
|
+
isBlocking,
|
|
199
|
+
consultationMode,
|
|
200
|
+
addQuestion,
|
|
201
|
+
answerQuestion,
|
|
202
|
+
skipQuestion,
|
|
203
|
+
setConsultationMode,
|
|
204
|
+
getContextForAgent,
|
|
205
|
+
clearContext,
|
|
206
|
+
setBlocking,
|
|
207
|
+
addUserContext,
|
|
208
|
+
]);
|
|
184
209
|
return (_jsx(ConsultationContext.Provider, { value: value, children: children }));
|
|
185
210
|
}
|
|
186
211
|
//# sourceMappingURL=ConsultationContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsultationContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ConsultationContext.tsx"],"names":[],"mappings":";AAOA,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,WAAW,
|
|
1
|
+
{"version":3,"file":"ConsultationContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ConsultationContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* FocusContext provides centralized focus management for the entire UI.
|
|
9
|
+
*
|
|
10
|
+
* This solves the problem of multiple conflicting focus mechanisms
|
|
11
|
+
* (useKeypress, useSelectionList, etc.) by providing
|
|
12
|
+
* a single source of truth for which component currently has focus.
|
|
13
|
+
*
|
|
14
|
+
* Architecture:
|
|
15
|
+
* - Uses a stack-based model for nested dialogs
|
|
16
|
+
* - Last item on stack has focus, all others are paused
|
|
17
|
+
* - Components auto-register on mount, auto-unregister on unmount
|
|
18
|
+
* - Backward compatible with existing isFocused props
|
|
19
|
+
*/
|
|
20
|
+
export interface FocusContextValue {
|
|
21
|
+
/**
|
|
22
|
+
* Stack of focused component IDs. The last item has focus.
|
|
23
|
+
* When empty, 'main-input' (the InputPrompt) has implicit focus.
|
|
24
|
+
*/
|
|
25
|
+
focusStack: readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Push a component onto the focus stack.
|
|
28
|
+
* Called when a dialog mounts.
|
|
29
|
+
*/
|
|
30
|
+
pushFocus: (id: string) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Remove a component from the focus stack.
|
|
33
|
+
* Called when a dialog unmounts.
|
|
34
|
+
* Idempotent - safe to call multiple times.
|
|
35
|
+
*/
|
|
36
|
+
popFocus: (id: string) => void;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a specific component currently has focus.
|
|
39
|
+
* Returns true only if the id is at the top of the stack.
|
|
40
|
+
*/
|
|
41
|
+
hasFocus: (id: string) => boolean;
|
|
42
|
+
/**
|
|
43
|
+
* The currently focused component ID, or null if stack is empty.
|
|
44
|
+
* When null, 'main-input' has implicit focus.
|
|
45
|
+
*/
|
|
46
|
+
currentFocus: string | null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Hook to access the FocusContext.
|
|
50
|
+
* Throws if used outside of FocusProvider.
|
|
51
|
+
*/
|
|
52
|
+
export declare function useFocusContext(): FocusContextValue;
|
|
53
|
+
/**
|
|
54
|
+
* Optional hook that returns null if not within FocusProvider.
|
|
55
|
+
* Useful for backward compatibility during migration.
|
|
56
|
+
*/
|
|
57
|
+
export declare function useFocusContextOptional(): FocusContextValue | null;
|
|
58
|
+
interface FocusProviderProps {
|
|
59
|
+
children: React.ReactNode;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* FocusProvider manages the focus stack for the entire application.
|
|
63
|
+
*
|
|
64
|
+
* Usage:
|
|
65
|
+
* ```tsx
|
|
66
|
+
* <FocusProvider>
|
|
67
|
+
* <App />
|
|
68
|
+
* </FocusProvider>
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* Then in dialogs:
|
|
72
|
+
* ```tsx
|
|
73
|
+
* function MyDialog() {
|
|
74
|
+
* const { isFocused } = useFocusScope('my-dialog');
|
|
75
|
+
* // isFocused is true when this dialog is at top of stack
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function FocusProvider({ children }: FocusProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
80
|
+
/**
|
|
81
|
+
* Special focus ID for the main input prompt.
|
|
82
|
+
* This component has focus when the focus stack is empty.
|
|
83
|
+
*/
|
|
84
|
+
export declare const MAIN_INPUT_FOCUS_ID = "main-input";
|
|
85
|
+
/**
|
|
86
|
+
* Predefined focus IDs for dialogs.
|
|
87
|
+
* Using constants prevents typos and enables autocomplete.
|
|
88
|
+
*/
|
|
89
|
+
export declare const FocusIds: {
|
|
90
|
+
readonly MAIN_INPUT: "main-input";
|
|
91
|
+
readonly AUTH_DIALOG: "auth-dialog";
|
|
92
|
+
readonly MODEL_DIALOG: "model-dialog";
|
|
93
|
+
readonly THEME_DIALOG: "theme-dialog";
|
|
94
|
+
readonly SETTINGS_DIALOG: "settings-dialog";
|
|
95
|
+
readonly FOLDER_TRUST_DIALOG: "folder-trust-dialog";
|
|
96
|
+
readonly APPROVAL_MODE_DIALOG: "approval-mode-dialog";
|
|
97
|
+
readonly EDITOR_SETTINGS_DIALOG: "editor-settings-dialog";
|
|
98
|
+
readonly PRO_QUOTA_DIALOG: "pro-quota-dialog";
|
|
99
|
+
readonly QUIT_CONFIRMATION_DIALOG: "quit-confirmation-dialog";
|
|
100
|
+
readonly SHELL_CONFIRMATION_DIALOG: "shell-confirmation-dialog";
|
|
101
|
+
readonly WELCOME_BACK_DIALOG: "welcome-back-dialog";
|
|
102
|
+
readonly WORKSPACE_MIGRATION_DIALOG: "workspace-migration-dialog";
|
|
103
|
+
readonly PERMISSIONS_DIALOG: "permissions-dialog";
|
|
104
|
+
readonly MODEL_SWITCH_DIALOG: "model-switch-dialog";
|
|
105
|
+
readonly LOOP_DETECTION_DIALOG: "loop-detection-dialog";
|
|
106
|
+
readonly AGENTS_MANAGER_DIALOG: "agents-manager-dialog";
|
|
107
|
+
readonly AGENT_CREATION_DIALOG: "agent-creation-dialog";
|
|
108
|
+
readonly IDE_INTEGRATION_NUDGE: "ide-integration-nudge";
|
|
109
|
+
readonly IDE_TRUST_CHANGE_DIALOG: "ide-trust-change-dialog";
|
|
110
|
+
readonly OPENAI_KEY_PROMPT: "openai-key-prompt";
|
|
111
|
+
readonly CONSENT_PROMPT: "consent-prompt";
|
|
112
|
+
};
|
|
113
|
+
export type FocusId = (typeof FocusIds)[keyof typeof FocusIds];
|
|
114
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2025 OSAgent OC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
import React, { createContext, useContext, useCallback, useMemo, useRef, useState, } from 'react';
|
|
8
|
+
const FocusContext = createContext(null);
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access the FocusContext.
|
|
11
|
+
* Throws if used outside of FocusProvider.
|
|
12
|
+
*/
|
|
13
|
+
export function useFocusContext() {
|
|
14
|
+
const context = useContext(FocusContext);
|
|
15
|
+
if (!context) {
|
|
16
|
+
throw new Error('useFocusContext must be used within a FocusProvider');
|
|
17
|
+
}
|
|
18
|
+
return context;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Optional hook that returns null if not within FocusProvider.
|
|
22
|
+
* Useful for backward compatibility during migration.
|
|
23
|
+
*/
|
|
24
|
+
export function useFocusContextOptional() {
|
|
25
|
+
return useContext(FocusContext);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* FocusProvider manages the focus stack for the entire application.
|
|
29
|
+
*
|
|
30
|
+
* Usage:
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <FocusProvider>
|
|
33
|
+
* <App />
|
|
34
|
+
* </FocusProvider>
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* Then in dialogs:
|
|
38
|
+
* ```tsx
|
|
39
|
+
* function MyDialog() {
|
|
40
|
+
* const { isFocused } = useFocusScope('my-dialog');
|
|
41
|
+
* // isFocused is true when this dialog is at top of stack
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function FocusProvider({ children }) {
|
|
46
|
+
const [focusStack, setFocusStack] = useState([]);
|
|
47
|
+
// Use ref for immediate access in callbacks (prevents stale closure issues)
|
|
48
|
+
const focusStackRef = useRef([]);
|
|
49
|
+
focusStackRef.current = focusStack;
|
|
50
|
+
const pushFocus = useCallback((id) => {
|
|
51
|
+
setFocusStack((prev) => {
|
|
52
|
+
// Don't add duplicates
|
|
53
|
+
if (prev.includes(id)) {
|
|
54
|
+
return prev;
|
|
55
|
+
}
|
|
56
|
+
const newStack = [...prev, id];
|
|
57
|
+
focusStackRef.current = newStack;
|
|
58
|
+
return newStack;
|
|
59
|
+
});
|
|
60
|
+
}, []);
|
|
61
|
+
const popFocus = useCallback((id) => {
|
|
62
|
+
setFocusStack((prev) => {
|
|
63
|
+
// Remove the id from anywhere in the stack (handles out-of-order unmounts)
|
|
64
|
+
const newStack = prev.filter((item) => item !== id);
|
|
65
|
+
if (newStack.length === prev.length) {
|
|
66
|
+
// Id wasn't in stack, no change needed
|
|
67
|
+
return prev;
|
|
68
|
+
}
|
|
69
|
+
focusStackRef.current = newStack;
|
|
70
|
+
return newStack;
|
|
71
|
+
});
|
|
72
|
+
}, []);
|
|
73
|
+
const hasFocus = useCallback((id) => {
|
|
74
|
+
// Use ref for synchronous access (important for keypress handlers)
|
|
75
|
+
const stack = focusStackRef.current;
|
|
76
|
+
if (stack.length === 0) {
|
|
77
|
+
// When stack is empty, main-input has focus
|
|
78
|
+
return id === 'main-input';
|
|
79
|
+
}
|
|
80
|
+
// Only the top of the stack has focus
|
|
81
|
+
return stack[stack.length - 1] === id;
|
|
82
|
+
}, []);
|
|
83
|
+
const currentFocus = useMemo(() => {
|
|
84
|
+
return focusStack.length > 0 ? focusStack[focusStack.length - 1] ?? null : null;
|
|
85
|
+
}, [focusStack]);
|
|
86
|
+
// Memoize context value to prevent unnecessary re-renders
|
|
87
|
+
const contextValue = useMemo(() => ({
|
|
88
|
+
focusStack,
|
|
89
|
+
pushFocus,
|
|
90
|
+
popFocus,
|
|
91
|
+
hasFocus,
|
|
92
|
+
currentFocus,
|
|
93
|
+
}), [focusStack, pushFocus, popFocus, hasFocus, currentFocus]);
|
|
94
|
+
return (_jsx(FocusContext.Provider, { value: contextValue, children: children }));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Special focus ID for the main input prompt.
|
|
98
|
+
* This component has focus when the focus stack is empty.
|
|
99
|
+
*/
|
|
100
|
+
export const MAIN_INPUT_FOCUS_ID = 'main-input';
|
|
101
|
+
/**
|
|
102
|
+
* Predefined focus IDs for dialogs.
|
|
103
|
+
* Using constants prevents typos and enables autocomplete.
|
|
104
|
+
*/
|
|
105
|
+
export const FocusIds = {
|
|
106
|
+
MAIN_INPUT: 'main-input',
|
|
107
|
+
AUTH_DIALOG: 'auth-dialog',
|
|
108
|
+
MODEL_DIALOG: 'model-dialog',
|
|
109
|
+
THEME_DIALOG: 'theme-dialog',
|
|
110
|
+
SETTINGS_DIALOG: 'settings-dialog',
|
|
111
|
+
FOLDER_TRUST_DIALOG: 'folder-trust-dialog',
|
|
112
|
+
APPROVAL_MODE_DIALOG: 'approval-mode-dialog',
|
|
113
|
+
EDITOR_SETTINGS_DIALOG: 'editor-settings-dialog',
|
|
114
|
+
PRO_QUOTA_DIALOG: 'pro-quota-dialog',
|
|
115
|
+
QUIT_CONFIRMATION_DIALOG: 'quit-confirmation-dialog',
|
|
116
|
+
SHELL_CONFIRMATION_DIALOG: 'shell-confirmation-dialog',
|
|
117
|
+
WELCOME_BACK_DIALOG: 'welcome-back-dialog',
|
|
118
|
+
WORKSPACE_MIGRATION_DIALOG: 'workspace-migration-dialog',
|
|
119
|
+
PERMISSIONS_DIALOG: 'permissions-dialog',
|
|
120
|
+
MODEL_SWITCH_DIALOG: 'model-switch-dialog',
|
|
121
|
+
LOOP_DETECTION_DIALOG: 'loop-detection-dialog',
|
|
122
|
+
AGENTS_MANAGER_DIALOG: 'agents-manager-dialog',
|
|
123
|
+
AGENT_CREATION_DIALOG: 'agent-creation-dialog',
|
|
124
|
+
IDE_INTEGRATION_NUDGE: 'ide-integration-nudge',
|
|
125
|
+
IDE_TRUST_CHANGE_DIALOG: 'ide-trust-change-dialog',
|
|
126
|
+
OPENAI_KEY_PROMPT: 'openai-key-prompt',
|
|
127
|
+
CONSENT_PROMPT: 'consent-prompt',
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=FocusContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FocusContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/FocusContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { KittySequenceOverflowEvent, logKittySequenceOverflow, } from 'osagent-core';
|
|
3
3
|
import { useStdin } from 'ink';
|
|
4
|
-
import { createContext, useCallback, useContext, useEffect, useRef, } from 'react';
|
|
4
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, } from 'react';
|
|
5
5
|
import readline from 'node:readline';
|
|
6
6
|
import { PassThrough } from 'node:stream';
|
|
7
7
|
import { BACKSLASH_ENTER_DETECTION_WINDOW_MS, CHAR_CODE_ESC, KITTY_CTRL_C, KITTY_KEYCODE_BACKSPACE, KITTY_KEYCODE_ENTER, KITTY_KEYCODE_NUMPAD_ENTER, KITTY_KEYCODE_TAB, MAX_KITTY_SEQUENCE_LENGTH, KITTY_MODIFIER_BASE, KITTY_MODIFIER_EVENT_TYPES_OFFSET, MODIFIER_SHIFT_BIT, MODIFIER_ALT_BIT, MODIFIER_CTRL_BIT, } from '../utils/platformConstants.js';
|
|
@@ -558,6 +558,20 @@ export function KeypressProvider({ children, kittyProtocolEnabled, pasteWorkarou
|
|
|
558
558
|
flushRawBuffer();
|
|
559
559
|
}
|
|
560
560
|
};
|
|
561
|
+
// Handle stdin errors gracefully - EIO and EBADF are recoverable TTY errors
|
|
562
|
+
// that occur when terminal has I/O issues (SSH disconnect, rapid resize, etc.)
|
|
563
|
+
const handleStdinError = (err) => {
|
|
564
|
+
if (err.code === 'EIO' || err.code === 'EBADF') {
|
|
565
|
+
// Recoverable TTY errors - don't crash the application
|
|
566
|
+
if (debugKeystrokeLogging) {
|
|
567
|
+
// eslint-disable-next-line no-console
|
|
568
|
+
console.warn('[DEBUG] stdin error (recoverable):', err.code, err.message);
|
|
569
|
+
}
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
// Re-throw non-recoverable errors
|
|
573
|
+
throw err;
|
|
574
|
+
};
|
|
561
575
|
let rl;
|
|
562
576
|
if (usePassthrough) {
|
|
563
577
|
rl = readline.createInterface({
|
|
@@ -567,13 +581,17 @@ export function KeypressProvider({ children, kittyProtocolEnabled, pasteWorkarou
|
|
|
567
581
|
readline.emitKeypressEvents(keypressStream, rl);
|
|
568
582
|
keypressStream.on('keypress', handleKeypress);
|
|
569
583
|
stdin.on('data', handleRawKeypress);
|
|
584
|
+
stdin.on('error', handleStdinError);
|
|
570
585
|
}
|
|
571
586
|
else {
|
|
572
587
|
rl = readline.createInterface({ input: stdin, escapeCodeTimeout: 0 });
|
|
573
588
|
readline.emitKeypressEvents(stdin, rl);
|
|
574
589
|
stdin.on('keypress', handleKeypress);
|
|
590
|
+
stdin.on('error', handleStdinError);
|
|
575
591
|
}
|
|
576
592
|
return () => {
|
|
593
|
+
// Remove stdin error handler first
|
|
594
|
+
stdin.removeListener('error', handleStdinError);
|
|
577
595
|
if (usePassthrough) {
|
|
578
596
|
keypressStream.removeListener('keypress', handleKeypress);
|
|
579
597
|
stdin.removeListener('data', handleRawKeypress);
|
|
@@ -632,6 +650,9 @@ export function KeypressProvider({ children, kittyProtocolEnabled, pasteWorkarou
|
|
|
632
650
|
config,
|
|
633
651
|
subscribers,
|
|
634
652
|
]);
|
|
635
|
-
|
|
653
|
+
// Memoize context value to prevent infinite render loops
|
|
654
|
+
// (inline object creates new reference every render)
|
|
655
|
+
const contextValue = useMemo(() => ({ subscribe, unsubscribe }), [subscribe, unsubscribe]);
|
|
656
|
+
return (_jsx(KeypressContext.Provider, { value: contextValue, children: children }));
|
|
636
657
|
}
|
|
637
658
|
//# sourceMappingURL=KeypressContext.js.map
|