@vybestack/llxprt-code 0.1.18 → 0.1.19-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/package.json +6 -4
- package/dist/src/acp/acpPeer.js +72 -64
- package/dist/src/acp/acpPeer.js.map +1 -1
- package/dist/src/commands/mcp/add.d.ts +7 -0
- package/dist/src/commands/mcp/add.js +155 -0
- package/dist/src/commands/mcp/add.js.map +1 -0
- package/dist/src/commands/mcp/list.d.ts +8 -0
- package/dist/src/commands/mcp/list.js +110 -0
- package/dist/src/commands/mcp/list.js.map +1 -0
- package/dist/src/commands/mcp/remove.d.ts +7 -0
- package/dist/src/commands/mcp/remove.js +44 -0
- package/dist/src/commands/mcp/remove.js.map +1 -0
- package/dist/src/commands/mcp.d.ts +7 -0
- package/dist/src/commands/mcp.js +23 -0
- package/dist/src/commands/mcp.js.map +1 -0
- package/dist/src/config/auth.js +5 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.js +80 -37
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +64 -0
- package/dist/src/config/keyBindings.js +137 -0
- package/dist/src/config/keyBindings.js.map +1 -0
- package/dist/src/config/settings.d.ts +7 -1
- package/dist/src/config/settings.js +20 -4
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +12 -109
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/nonInteractiveCli.js +0 -1
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/logging/git-stats-service-impl.d.ts +19 -0
- package/dist/src/providers/logging/git-stats-service-impl.js +25 -0
- package/dist/src/providers/logging/git-stats-service-impl.js.map +1 -0
- package/dist/src/providers/logging/git-stats.d.ts +43 -0
- package/dist/src/providers/logging/git-stats.js +137 -0
- package/dist/src/providers/logging/git-stats.js.map +1 -0
- package/dist/src/providers/providerManagerInstance.js +7 -0
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +2 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/todo-continuation/todoContinuationService.d.ts +172 -0
- package/dist/src/services/todo-continuation/todoContinuationService.js +387 -0
- package/dist/src/services/todo-continuation/todoContinuationService.js.map +1 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.d.ts +6 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.js +385 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.js.map +1 -0
- package/dist/src/ui/App.js +111 -35
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.d.ts +14 -0
- package/dist/src/ui/IdeIntegrationNudge.js +32 -0
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
- package/dist/src/ui/colors.d.ts +5 -0
- package/dist/src/ui/colors.js +51 -0
- package/dist/src/ui/colors.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +16 -0
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.js +9 -1
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +67 -31
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/loggingCommand.d.ts +15 -0
- package/dist/src/ui/commands/loggingCommand.js +421 -0
- package/dist/src/ui/commands/loggingCommand.js.map +1 -0
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/privacyCommand.d.ts +3 -0
- package/dist/src/ui/commands/privacyCommand.js +6 -3
- package/dist/src/ui/commands/privacyCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.js +1 -0
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.js +2 -0
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.js +90 -26
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +14 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AuthInProgress.js +3 -3
- package/dist/src/ui/components/AuthInProgress.js.map +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
- package/dist/src/ui/components/ContextUsageDisplay.js +27 -0
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.d.ts +16 -0
- package/dist/src/ui/components/FolderTrustDialog.js +38 -0
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
- package/dist/src/ui/components/Footer.d.ts +0 -1
- package/dist/src/ui/components/Footer.js +132 -15
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +32 -28
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoggingDialog.d.ts +37 -0
- package/dist/src/ui/components/LoggingDialog.js +155 -0
- package/dist/src/ui/components/LoggingDialog.js.map +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ProviderDialog.js +100 -26
- package/dist/src/ui/components/ProviderDialog.js.map +1 -1
- package/dist/src/ui/components/ProviderModelDialog.js +99 -27
- package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
- package/dist/src/ui/components/TodoPanel.d.ts +11 -0
- package/dist/src/ui/components/TodoPanel.js +206 -0
- package/dist/src/ui/components/TodoPanel.js.map +1 -0
- package/dist/src/ui/components/ToolsDialog.d.ts +2 -2
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +116 -16
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +36 -8
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/todo-utils.d.ts +16 -0
- package/dist/src/ui/components/todo-utils.js +41 -0
- package/dist/src/ui/components/todo-utils.js.map +1 -0
- package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
- package/dist/src/ui/contexts/SettingsContext.js +15 -0
- package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
- package/dist/src/ui/contexts/TodoContext.d.ts +15 -0
- package/dist/src/ui/contexts/TodoContext.js +18 -0
- package/dist/src/ui/contexts/TodoContext.js.map +1 -0
- package/dist/src/ui/contexts/TodoProvider.d.ts +7 -0
- package/dist/src/ui/contexts/TodoProvider.js +62 -0
- package/dist/src/ui/contexts/TodoProvider.js.map +1 -0
- package/dist/src/ui/contexts/ToolCallContext.d.ts +19 -0
- package/dist/src/ui/contexts/ToolCallContext.js +13 -0
- package/dist/src/ui/contexts/ToolCallContext.js.map +1 -0
- package/dist/src/ui/contexts/ToolCallProvider.d.ts +12 -0
- package/dist/src/ui/contexts/ToolCallProvider.js +62 -0
- package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +28 -4
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +137 -112
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.d.ts +23 -0
- package/dist/src/ui/hooks/useAtCompletion.js +180 -0
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useConsoleMessages.js +7 -0
- package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.d.ts +11 -0
- package/dist/src/ui/hooks/useFolderTrust.js +22 -0
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +16 -4
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +12 -12
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useResponsive.d.ts +14 -0
- package/dist/src/ui/hooks/useResponsive.js +19 -0
- package/dist/src/ui/hooks/useResponsive.js.map +1 -0
- package/dist/src/ui/hooks/useTodoContinuation.d.ts +31 -0
- package/dist/src/ui/hooks/useTodoContinuation.js +148 -0
- package/dist/src/ui/hooks/useTodoContinuation.js.map +1 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.d.ts +6 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.js +378 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.js.map +1 -0
- package/dist/src/ui/hooks/useToolsDialog.d.ts +2 -2
- package/dist/src/ui/hooks/useToolsDialog.js.map +1 -1
- package/dist/src/ui/keyMatchers.d.ts +26 -0
- package/dist/src/ui/keyMatchers.js +68 -0
- package/dist/src/ui/keyMatchers.js.map +1 -0
- package/dist/src/ui/privacy/PrivacyNotice.js +10 -4
- package/dist/src/ui/privacy/PrivacyNotice.js.map +1 -1
- package/dist/src/ui/themes/semantic-resolver.d.ts +12 -0
- package/dist/src/ui/themes/semantic-resolver.js +32 -0
- package/dist/src/ui/themes/semantic-resolver.js.map +1 -0
- package/dist/src/ui/themes/semantic-tokens.d.ts +52 -0
- package/dist/src/ui/themes/semantic-tokens.js +7 -0
- package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
- package/dist/src/ui/themes/theme-compat.d.ts +34 -0
- package/dist/src/ui/themes/theme-compat.js +65 -0
- package/dist/src/ui/themes/theme-compat.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.d.ts +8 -0
- package/dist/src/ui/themes/theme-manager.js +18 -0
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/types.d.ts +1 -1
- package/dist/src/ui/utils/CodeColorizer.d.ts +2 -1
- package/dist/src/ui/utils/CodeColorizer.js +4 -3
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -0
- package/dist/src/ui/utils/ConsolePatcher.js +3 -0
- package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +4 -2
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.d.ts +1 -0
- package/dist/src/ui/utils/commandUtils.js +22 -1
- package/dist/src/ui/utils/commandUtils.js.map +1 -1
- package/dist/src/ui/utils/responsive.d.ts +16 -0
- package/dist/src/ui/utils/responsive.js +111 -0
- package/dist/src/ui/utils/responsive.js.map +1 -0
- package/dist/src/utils/cleanup.d.ts +2 -2
- package/dist/src/utils/cleanup.js +2 -2
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/gitUtils.d.ts +21 -1
- package/dist/src/utils/gitUtils.js +70 -3
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/privacy/ConversationDataRedactor.d.ts +75 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.js +412 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.js.map +1 -0
- package/dist/src/utils/privacy/PrivacyManager.d.ts +58 -0
- package/dist/src/utils/privacy/PrivacyManager.js +133 -0
- package/dist/src/utils/privacy/PrivacyManager.js.map +1 -0
- package/dist/src/utils/sandbox.js +430 -401
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -4
- package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +0 -12
- package/dist/src/ui/components/IDEContextDetailDisplay.js +0 -17
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +0 -1
@@ -0,0 +1,148 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
7
|
+
import { ApprovalMode, } from '@vybestack/llxprt-code-core';
|
8
|
+
import { useTodoContext } from '../contexts/TodoContext.js';
|
9
|
+
/**
|
10
|
+
* React hook for todo continuation - monitors stream completion and triggers continuation
|
11
|
+
* prompts when active todos exist but no tool calls were made.
|
12
|
+
* [REQ-001] Todo Continuation Detection, [REQ-002] Continuation Prompting
|
13
|
+
*/
|
14
|
+
export const useTodoContinuation = (geminiClient, config, isResponding, onDebugMessage) => {
|
15
|
+
const [continuationState, setContinuationState] = useState({
|
16
|
+
isActive: false,
|
17
|
+
attemptCount: 0,
|
18
|
+
});
|
19
|
+
// Track if a continuation is currently in progress to prevent rapid firing
|
20
|
+
const continuationInProgressRef = useRef(false);
|
21
|
+
const todoContext = useTodoContext();
|
22
|
+
const abortControllerRef = useRef(undefined);
|
23
|
+
const continuationTimeoutRef = useRef(undefined);
|
24
|
+
// Private helper methods
|
25
|
+
const _evaluateContinuationConditions = useCallback((hadToolCalls) => {
|
26
|
+
const ephemeralSettings = config.getEphemeralSettings();
|
27
|
+
const isEnabled = ephemeralSettings['todo-continuation'] === true;
|
28
|
+
const hasActiveTodos = todoContext.todos.some((todo) => todo.status === 'pending' || todo.status === 'in_progress');
|
29
|
+
return {
|
30
|
+
streamCompleted: true,
|
31
|
+
noToolCallsMade: !hadToolCalls,
|
32
|
+
hasActiveTodos,
|
33
|
+
continuationEnabled: isEnabled,
|
34
|
+
notAlreadyContinuing: !continuationState.isActive,
|
35
|
+
};
|
36
|
+
}, [config, todoContext.todos, continuationState.isActive]);
|
37
|
+
const _shouldTriggerContinuation = useCallback((conditions) => {
|
38
|
+
// Don't trigger if AI is currently responding
|
39
|
+
if (isResponding) {
|
40
|
+
return false;
|
41
|
+
}
|
42
|
+
return (conditions.streamCompleted &&
|
43
|
+
conditions.noToolCallsMade &&
|
44
|
+
conditions.hasActiveTodos &&
|
45
|
+
conditions.continuationEnabled &&
|
46
|
+
conditions.notAlreadyContinuing);
|
47
|
+
}, [isResponding]);
|
48
|
+
const _findMostRelevantActiveTodo = useCallback((todos) => {
|
49
|
+
// Priority order: in_progress > pending
|
50
|
+
const inProgressTodos = todos.filter((todo) => todo.status === 'in_progress');
|
51
|
+
if (inProgressTodos.length > 0) {
|
52
|
+
return inProgressTodos[0];
|
53
|
+
}
|
54
|
+
const pendingTodos = todos.filter((todo) => todo.status === 'pending');
|
55
|
+
if (pendingTodos.length > 0) {
|
56
|
+
return pendingTodos[0];
|
57
|
+
}
|
58
|
+
return null;
|
59
|
+
}, []);
|
60
|
+
const _generateContinuationPrompt = useCallback((todo) => {
|
61
|
+
const isYoloMode = config.getApprovalMode() === ApprovalMode.YOLO;
|
62
|
+
if (isYoloMode) {
|
63
|
+
return `Continue to proceed with the active task without waiting for confirmation: "${todo.content}"`;
|
64
|
+
}
|
65
|
+
return `Please continue working on the following task: "${todo.content}"`;
|
66
|
+
}, [config]);
|
67
|
+
const _triggerContinuation = useCallback((activeTodo) => {
|
68
|
+
// Prevent multiple rapid continuations
|
69
|
+
if (continuationInProgressRef.current) {
|
70
|
+
return;
|
71
|
+
}
|
72
|
+
// Mark continuation as in progress
|
73
|
+
continuationInProgressRef.current = true;
|
74
|
+
// Update state to indicate continuation is active
|
75
|
+
setContinuationState((prev) => ({
|
76
|
+
isActive: true,
|
77
|
+
taskDescription: activeTodo.content,
|
78
|
+
attemptCount: prev.attemptCount + 1,
|
79
|
+
lastPromptTime: new Date(),
|
80
|
+
}));
|
81
|
+
// Generate continuation prompt
|
82
|
+
const continuationPrompt = _generateContinuationPrompt(activeTodo);
|
83
|
+
// Send out-of-band prompt (ephemeral, not stored in history)
|
84
|
+
// Fire and forget - don't await this
|
85
|
+
geminiClient.sendMessageStream(continuationPrompt, { ephemeral: true })
|
86
|
+
.catch((error) => {
|
87
|
+
onDebugMessage(`[TodoContinuation] Error sending continuation prompt: ${error instanceof Error ? error.message : String(error)}`);
|
88
|
+
// Reset state on error
|
89
|
+
setContinuationState((prev) => ({
|
90
|
+
isActive: false,
|
91
|
+
attemptCount: prev.attemptCount,
|
92
|
+
lastPromptTime: prev.lastPromptTime,
|
93
|
+
taskDescription: prev.taskDescription,
|
94
|
+
}));
|
95
|
+
})
|
96
|
+
.finally(() => {
|
97
|
+
// Always reset the in-progress flag
|
98
|
+
continuationInProgressRef.current = false;
|
99
|
+
});
|
100
|
+
}, [geminiClient, _generateContinuationPrompt, onDebugMessage]);
|
101
|
+
// Public interface methods
|
102
|
+
const handleStreamCompleted = useCallback((hadToolCalls) => {
|
103
|
+
// Reset continuation state if tool calls were made
|
104
|
+
if (hadToolCalls) {
|
105
|
+
setContinuationState((prev) => ({
|
106
|
+
...prev,
|
107
|
+
isActive: false,
|
108
|
+
}));
|
109
|
+
return;
|
110
|
+
}
|
111
|
+
// Check all continuation conditions
|
112
|
+
const conditions = _evaluateContinuationConditions(hadToolCalls);
|
113
|
+
if (!_shouldTriggerContinuation(conditions)) {
|
114
|
+
return;
|
115
|
+
}
|
116
|
+
// Find the most relevant active todo
|
117
|
+
const activeTodo = _findMostRelevantActiveTodo(todoContext.todos);
|
118
|
+
if (!activeTodo ||
|
119
|
+
!activeTodo.content ||
|
120
|
+
activeTodo.content.trim() === '') {
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
// Prevent multiple rapid continuations
|
124
|
+
if (continuationState.isActive || continuationInProgressRef.current) {
|
125
|
+
return;
|
126
|
+
}
|
127
|
+
// Start continuation process
|
128
|
+
_triggerContinuation(activeTodo);
|
129
|
+
}, [
|
130
|
+
_evaluateContinuationConditions,
|
131
|
+
_shouldTriggerContinuation,
|
132
|
+
_findMostRelevantActiveTodo,
|
133
|
+
_triggerContinuation,
|
134
|
+
todoContext.todos,
|
135
|
+
continuationState.isActive,
|
136
|
+
]);
|
137
|
+
const handleTodoPause = useCallback((reason) => ({
|
138
|
+
type: 'pause',
|
139
|
+
reason,
|
140
|
+
message: `Task paused: ${reason}`,
|
141
|
+
}), []);
|
142
|
+
useEffect(() => () => {
|
143
|
+
abortControllerRef.current?.abort();
|
144
|
+
clearTimeout(continuationTimeoutRef.current);
|
145
|
+
}, []);
|
146
|
+
return { handleStreamCompleted, continuationState, handleTodoPause };
|
147
|
+
};
|
148
|
+
//# sourceMappingURL=useTodoContinuation.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useTodoContinuation.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useTodoContinuation.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,378 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { describe, it, expect, vi, beforeEach, } from 'vitest';
|
7
|
+
import { renderHook, act } from '@testing-library/react';
|
8
|
+
import { useTodoContinuation } from './useTodoContinuation.js';
|
9
|
+
import { useTodoContext } from '../contexts/TodoContext.js';
|
10
|
+
import { Config, GeminiClient, ApprovalMode, } from '@vybestack/llxprt-code-core';
|
11
|
+
// Mock dependencies
|
12
|
+
vi.mock('../contexts/TodoContext.js');
|
13
|
+
vi.mock('@vybestack/llxprt-code-core', async () => {
|
14
|
+
const actual = (await vi.importActual('@vybestack/llxprt-code-core'));
|
15
|
+
return {
|
16
|
+
...actual,
|
17
|
+
Config: vi.fn(),
|
18
|
+
GeminiClient: vi.fn(),
|
19
|
+
};
|
20
|
+
});
|
21
|
+
describe('useTodoContinuation - Behavioral Tests', () => {
|
22
|
+
let mockConfig;
|
23
|
+
let mockGeminiClient;
|
24
|
+
let mockTodoContext;
|
25
|
+
let mockOnDebugMessage;
|
26
|
+
const createTodo = (id, content, status = 'pending') => ({
|
27
|
+
id,
|
28
|
+
content,
|
29
|
+
status,
|
30
|
+
priority: 'medium',
|
31
|
+
});
|
32
|
+
beforeEach(() => {
|
33
|
+
vi.resetAllMocks();
|
34
|
+
// Mock Config
|
35
|
+
mockConfig = {
|
36
|
+
getEphemeralSettings: vi.fn().mockReturnValue({}),
|
37
|
+
getApprovalMode: vi.fn().mockReturnValue(ApprovalMode.DEFAULT),
|
38
|
+
};
|
39
|
+
Config.mockImplementation(() => mockConfig);
|
40
|
+
// Mock GeminiClient
|
41
|
+
mockGeminiClient = {
|
42
|
+
sendMessageStream: vi.fn().mockResolvedValue(undefined),
|
43
|
+
};
|
44
|
+
GeminiClient.mockImplementation(() => mockGeminiClient);
|
45
|
+
// Mock TodoContext
|
46
|
+
mockTodoContext = {
|
47
|
+
todos: [],
|
48
|
+
updateTodos: vi.fn(),
|
49
|
+
refreshTodos: vi.fn(),
|
50
|
+
};
|
51
|
+
useTodoContext.mockReturnValue(mockTodoContext);
|
52
|
+
// Mock debug message handler
|
53
|
+
mockOnDebugMessage = vi.fn();
|
54
|
+
});
|
55
|
+
describe('Stream Completion Detection', () => {
|
56
|
+
it('@requirement REQ-001.1 should trigger continuation when stream completes without tool calls and has active todos', () => {
|
57
|
+
// Given: Active todos exist and todo-continuation is enabled
|
58
|
+
mockTodoContext.todos = [
|
59
|
+
createTodo('1', 'Complete feature implementation', 'in_progress'),
|
60
|
+
createTodo('2', 'Write tests', 'pending'),
|
61
|
+
];
|
62
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
63
|
+
'todo-continuation': true,
|
64
|
+
});
|
65
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, // not responding
|
66
|
+
mockOnDebugMessage));
|
67
|
+
// When: Stream completes without tool calls
|
68
|
+
act(() => {
|
69
|
+
result.current.handleStreamCompleted(false);
|
70
|
+
});
|
71
|
+
// Then: Continuation should be triggered
|
72
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.stringContaining('Complete feature implementation'), { ephemeral: true });
|
73
|
+
});
|
74
|
+
it('@requirement REQ-001.2 should NOT trigger when no active todos exist', () => {
|
75
|
+
// Given: No active todos
|
76
|
+
mockTodoContext.todos = [createTodo('1', 'Completed task', 'completed')];
|
77
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
78
|
+
'todo-continuation': true,
|
79
|
+
});
|
80
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
81
|
+
// When: Stream completes without tool calls
|
82
|
+
act(() => {
|
83
|
+
result.current.handleStreamCompleted(false);
|
84
|
+
});
|
85
|
+
// Then: No continuation should be triggered
|
86
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
87
|
+
});
|
88
|
+
it('@requirement REQ-001.2 should NOT trigger when tool calls were present', () => {
|
89
|
+
// Given: Active todos exist and continuation is enabled
|
90
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
91
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
92
|
+
'todo-continuation': true,
|
93
|
+
});
|
94
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
95
|
+
// When: Stream completes WITH tool calls
|
96
|
+
act(() => {
|
97
|
+
result.current.handleStreamCompleted(true);
|
98
|
+
});
|
99
|
+
// Then: No continuation should be triggered
|
100
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
101
|
+
});
|
102
|
+
it('@requirement REQ-001.4 should NOT trigger when todo-continuation setting is disabled', () => {
|
103
|
+
// Given: Active todos exist but continuation is disabled
|
104
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
105
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
106
|
+
'todo-continuation': false,
|
107
|
+
});
|
108
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
109
|
+
// When: Stream completes without tool calls
|
110
|
+
act(() => {
|
111
|
+
result.current.handleStreamCompleted(false);
|
112
|
+
});
|
113
|
+
// Then: No continuation should be triggered
|
114
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
115
|
+
});
|
116
|
+
it('@requirement REQ-001.3 should NOT trigger when AI is currently responding', () => {
|
117
|
+
// Given: Active todos and continuation enabled
|
118
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
119
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
120
|
+
'todo-continuation': true,
|
121
|
+
});
|
122
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, true, // currently responding
|
123
|
+
mockOnDebugMessage));
|
124
|
+
// When: Stream completes without tool calls
|
125
|
+
act(() => {
|
126
|
+
result.current.handleStreamCompleted(false);
|
127
|
+
});
|
128
|
+
// Then: No continuation should be triggered
|
129
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
130
|
+
});
|
131
|
+
});
|
132
|
+
describe('Prompt Generation', () => {
|
133
|
+
it('@requirement REQ-002.1 should send ephemeral prompt with most relevant active task', () => {
|
134
|
+
// Given: Multiple active todos with priorities
|
135
|
+
mockTodoContext.todos = [
|
136
|
+
createTodo('1', 'Fix critical bug', 'in_progress'),
|
137
|
+
createTodo('2', 'Update documentation', 'pending'),
|
138
|
+
createTodo('3', 'Add new feature', 'pending'),
|
139
|
+
];
|
140
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
141
|
+
'todo-continuation': true,
|
142
|
+
});
|
143
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
144
|
+
// When: Stream completes without tool calls
|
145
|
+
act(() => {
|
146
|
+
result.current.handleStreamCompleted(false);
|
147
|
+
});
|
148
|
+
// Then: Should send prompt with in_progress task (most relevant)
|
149
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.stringContaining('Fix critical bug'), { ephemeral: true });
|
150
|
+
});
|
151
|
+
it('@requirement REQ-002.2 should use different prompt for YOLO mode', () => {
|
152
|
+
// Given: YOLO mode is active
|
153
|
+
mockTodoContext.todos = [
|
154
|
+
createTodo('1', 'Complete implementation', 'in_progress'),
|
155
|
+
];
|
156
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
157
|
+
'todo-continuation': true,
|
158
|
+
});
|
159
|
+
mockConfig.getApprovalMode.mockReturnValue(ApprovalMode.YOLO);
|
160
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
161
|
+
// When: Stream completes without tool calls
|
162
|
+
act(() => {
|
163
|
+
result.current.handleStreamCompleted(false);
|
164
|
+
});
|
165
|
+
// Then: Should use YOLO-specific prompt
|
166
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.stringMatching(/(continue|proceed).*without.*confirmation/i), { ephemeral: true });
|
167
|
+
});
|
168
|
+
it('@requirement REQ-002.1 should NOT store prompt in conversation history', () => {
|
169
|
+
// Given: Active todos and continuation enabled
|
170
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
171
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
172
|
+
'todo-continuation': true,
|
173
|
+
});
|
174
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
175
|
+
// When: Stream completes without tool calls
|
176
|
+
act(() => {
|
177
|
+
result.current.handleStreamCompleted(false);
|
178
|
+
});
|
179
|
+
// Then: Should send with ephemeral flag
|
180
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.any(String), { ephemeral: true });
|
181
|
+
});
|
182
|
+
});
|
183
|
+
describe('Integration with TodoContext', () => {
|
184
|
+
it('@requirement REQ-003.1 should respond to todo state changes', () => {
|
185
|
+
const { result, rerender } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
186
|
+
// Given: Initially no todos
|
187
|
+
mockTodoContext.todos = [];
|
188
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
189
|
+
'todo-continuation': true,
|
190
|
+
});
|
191
|
+
// When: Stream completes (should not trigger)
|
192
|
+
act(() => {
|
193
|
+
result.current.handleStreamCompleted(false);
|
194
|
+
});
|
195
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
196
|
+
// When: Todos are updated with active task
|
197
|
+
mockTodoContext.todos = [
|
198
|
+
createTodo('1', 'New active task', 'in_progress'),
|
199
|
+
];
|
200
|
+
rerender();
|
201
|
+
// Then: Next completion should trigger continuation
|
202
|
+
act(() => {
|
203
|
+
result.current.handleStreamCompleted(false);
|
204
|
+
});
|
205
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.stringContaining('New active task'), { ephemeral: true });
|
206
|
+
});
|
207
|
+
it('@requirement REQ-003.2 should handle todo_pause events', () => {
|
208
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
209
|
+
// When: Todo pause is requested
|
210
|
+
const pauseResult = result.current.handleTodoPause('User requested pause');
|
211
|
+
// Then: Should return pause event structure
|
212
|
+
expect(pauseResult).toEqual({
|
213
|
+
type: 'pause',
|
214
|
+
reason: 'User requested pause',
|
215
|
+
message: expect.stringContaining('paused'),
|
216
|
+
});
|
217
|
+
});
|
218
|
+
});
|
219
|
+
describe('State Management', () => {
|
220
|
+
it('@requirement REQ-004.1 should track continuation state', () => {
|
221
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
222
|
+
// Initially not active
|
223
|
+
expect(result.current.continuationState.isActive).toBe(false);
|
224
|
+
expect(result.current.continuationState.attemptCount).toBe(0);
|
225
|
+
// Given: Active todos and continuation enabled
|
226
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
227
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
228
|
+
'todo-continuation': true,
|
229
|
+
});
|
230
|
+
// When: Continuation is triggered
|
231
|
+
act(() => {
|
232
|
+
result.current.handleStreamCompleted(false);
|
233
|
+
});
|
234
|
+
// Then: State should be updated
|
235
|
+
expect(result.current.continuationState.taskDescription).toContain('Active task');
|
236
|
+
});
|
237
|
+
it('@requirement REQ-004.2 should reset state appropriately', () => {
|
238
|
+
// Given: Active continuation state
|
239
|
+
mockTodoContext.todos = [createTodo('1', 'Task 1', 'in_progress')];
|
240
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
241
|
+
'todo-continuation': true,
|
242
|
+
});
|
243
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
244
|
+
// Trigger continuation
|
245
|
+
act(() => {
|
246
|
+
result.current.handleStreamCompleted(false);
|
247
|
+
});
|
248
|
+
// When: Stream completes with tool calls (should reset)
|
249
|
+
act(() => {
|
250
|
+
result.current.handleStreamCompleted(true);
|
251
|
+
});
|
252
|
+
// Then: State should be reset
|
253
|
+
expect(result.current.continuationState.isActive).toBe(false);
|
254
|
+
});
|
255
|
+
});
|
256
|
+
describe('Edge Cases', () => {
|
257
|
+
it('@requirement REQ-005.1 should handle multiple rapid completions', () => {
|
258
|
+
// Given: Continuation enabled with active todo
|
259
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
260
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
261
|
+
'todo-continuation': true,
|
262
|
+
});
|
263
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
264
|
+
// When: Multiple rapid completions occur
|
265
|
+
act(() => {
|
266
|
+
result.current.handleStreamCompleted(false);
|
267
|
+
result.current.handleStreamCompleted(false);
|
268
|
+
result.current.handleStreamCompleted(false);
|
269
|
+
});
|
270
|
+
// Then: Should not trigger multiple continuations simultaneously
|
271
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledTimes(1);
|
272
|
+
});
|
273
|
+
it('@requirement REQ-005.2 should handle changing settings mid-stream', () => {
|
274
|
+
// Given: Initially enabled
|
275
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
276
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
277
|
+
'todo-continuation': true,
|
278
|
+
});
|
279
|
+
const { result, rerender } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
280
|
+
// When: Setting is changed during hook lifecycle
|
281
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
282
|
+
'todo-continuation': false,
|
283
|
+
});
|
284
|
+
rerender();
|
285
|
+
// Then: Should respect new setting
|
286
|
+
act(() => {
|
287
|
+
result.current.handleStreamCompleted(false);
|
288
|
+
});
|
289
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
290
|
+
});
|
291
|
+
it('@requirement REQ-005.3 should handle malformed todos gracefully', () => {
|
292
|
+
// Given: Malformed todos (missing required fields)
|
293
|
+
mockTodoContext.todos = [
|
294
|
+
{
|
295
|
+
id: '1',
|
296
|
+
content: '',
|
297
|
+
status: 'in_progress',
|
298
|
+
priority: 'medium',
|
299
|
+
},
|
300
|
+
// @ts-expect-error Testing malformed data
|
301
|
+
{
|
302
|
+
id: '2',
|
303
|
+
status: 'pending',
|
304
|
+
priority: 'high',
|
305
|
+
},
|
306
|
+
];
|
307
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
308
|
+
'todo-continuation': true,
|
309
|
+
});
|
310
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
311
|
+
// When: Stream completes
|
312
|
+
act(() => {
|
313
|
+
result.current.handleStreamCompleted(false);
|
314
|
+
});
|
315
|
+
// Then: Should handle gracefully without crashing
|
316
|
+
expect(() => {
|
317
|
+
result.current.handleStreamCompleted(false);
|
318
|
+
}).not.toThrow();
|
319
|
+
// Should either skip malformed todos or handle them safely
|
320
|
+
if (mockGeminiClient.sendMessageStream.mock.calls.length > 0) {
|
321
|
+
const callArgs = mockGeminiClient.sendMessageStream.mock.calls[0];
|
322
|
+
expect(callArgs[0]).toBeTypeOf('string');
|
323
|
+
expect(callArgs[1]).toEqual({ ephemeral: true });
|
324
|
+
}
|
325
|
+
});
|
326
|
+
it('@requirement REQ-005.4 should prevent continuation loops', () => {
|
327
|
+
// Given: Continuation enabled
|
328
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
329
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
330
|
+
'todo-continuation': true,
|
331
|
+
});
|
332
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
333
|
+
// When: Continuation is triggered multiple times in sequence
|
334
|
+
act(() => {
|
335
|
+
result.current.handleStreamCompleted(false);
|
336
|
+
});
|
337
|
+
const firstCallCount = mockGeminiClient.sendMessageStream.mock.calls.length;
|
338
|
+
act(() => {
|
339
|
+
result.current.handleStreamCompleted(false);
|
340
|
+
});
|
341
|
+
// Then: Should not trigger additional continuations if already active
|
342
|
+
expect(mockGeminiClient.sendMessageStream.mock.calls.length).toBe(firstCallCount);
|
343
|
+
});
|
344
|
+
});
|
345
|
+
describe('Configuration Integration', () => {
|
346
|
+
it('@requirement REQ-006.1 should respect default settings when todo-continuation is undefined', () => {
|
347
|
+
// Given: Settings don't specify todo-continuation
|
348
|
+
mockTodoContext.todos = [createTodo('1', 'Active task', 'in_progress')];
|
349
|
+
mockConfig.getEphemeralSettings.mockReturnValue({});
|
350
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
351
|
+
// When: Stream completes without tool calls
|
352
|
+
act(() => {
|
353
|
+
result.current.handleStreamCompleted(false);
|
354
|
+
});
|
355
|
+
// Then: Should use default behavior (disabled)
|
356
|
+
expect(mockGeminiClient.sendMessageStream).not.toHaveBeenCalled();
|
357
|
+
});
|
358
|
+
it('@requirement REQ-006.2 should prioritize in_progress todos over pending ones', () => {
|
359
|
+
// Given: Mix of pending and in_progress todos
|
360
|
+
mockTodoContext.todos = [
|
361
|
+
createTodo('1', 'Pending task', 'pending'),
|
362
|
+
createTodo('2', 'Active task', 'in_progress'),
|
363
|
+
createTodo('3', 'Another pending', 'pending'),
|
364
|
+
];
|
365
|
+
mockConfig.getEphemeralSettings.mockReturnValue({
|
366
|
+
'todo-continuation': true,
|
367
|
+
});
|
368
|
+
const { result } = renderHook(() => useTodoContinuation(mockGeminiClient, mockConfig, false, mockOnDebugMessage));
|
369
|
+
// When: Stream completes
|
370
|
+
act(() => {
|
371
|
+
result.current.handleStreamCompleted(false);
|
372
|
+
});
|
373
|
+
// Then: Should select in_progress task
|
374
|
+
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(expect.stringContaining('Active task'), { ephemeral: true });
|
375
|
+
});
|
376
|
+
});
|
377
|
+
});
|
378
|
+
//# sourceMappingURL=useTodoContinuation.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useTodoContinuation.spec.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useTodoContinuation.spec.ts"],"names":[],"mappings":"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"}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
-
import {
|
6
|
+
import { AnyDeclarativeTool, Config } from '@vybestack/llxprt-code-core';
|
7
7
|
import { MessageType } from '../types.js';
|
8
8
|
import { AppState } from '../reducers/appReducer.js';
|
9
9
|
interface UseToolsDialogParams {
|
@@ -20,7 +20,7 @@ export declare const useToolsDialog: ({ addMessage, appState, config, }: UseTool
|
|
20
20
|
openDialog: (dialogAction: "enable" | "disable") => Promise<void>;
|
21
21
|
closeDialog: () => void;
|
22
22
|
action: "enable" | "disable";
|
23
|
-
availableTools:
|
23
|
+
availableTools: AnyDeclarativeTool[];
|
24
24
|
disabledTools: string[];
|
25
25
|
handleSelect: (toolName: string) => void;
|
26
26
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useToolsDialog.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useToolsDialog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAanE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,UAAU,EACV,QAAQ,EACR,MAAM,GACe,EAAE,EAAE;IACzB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAuB,SAAS,CAAC,CAAC;IACtE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,
|
1
|
+
{"version":3,"file":"useToolsDialog.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useToolsDialog.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Google LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import type { Key } from './hooks/useKeypress.js';
|
7
|
+
import { Command, KeyBindingConfig } from '../config/keyBindings.js';
|
8
|
+
/**
|
9
|
+
* Key matcher function type
|
10
|
+
*/
|
11
|
+
type KeyMatcher = (key: Key) => boolean;
|
12
|
+
/**
|
13
|
+
* Type for key matchers mapped to Command enum
|
14
|
+
*/
|
15
|
+
export type KeyMatchers = {
|
16
|
+
readonly [C in Command]: KeyMatcher;
|
17
|
+
};
|
18
|
+
/**
|
19
|
+
* Creates key matchers from a key binding configuration
|
20
|
+
*/
|
21
|
+
export declare function createKeyMatchers(config?: KeyBindingConfig): KeyMatchers;
|
22
|
+
/**
|
23
|
+
* Default key binding matchers using the default configuration
|
24
|
+
*/
|
25
|
+
export declare const keyMatchers: KeyMatchers;
|
26
|
+
export { Command };
|