@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.
Files changed (206) hide show
  1. package/README.md +1 -0
  2. package/dist/package.json +6 -4
  3. package/dist/src/acp/acpPeer.js +72 -64
  4. package/dist/src/acp/acpPeer.js.map +1 -1
  5. package/dist/src/commands/mcp/add.d.ts +7 -0
  6. package/dist/src/commands/mcp/add.js +155 -0
  7. package/dist/src/commands/mcp/add.js.map +1 -0
  8. package/dist/src/commands/mcp/list.d.ts +8 -0
  9. package/dist/src/commands/mcp/list.js +110 -0
  10. package/dist/src/commands/mcp/list.js.map +1 -0
  11. package/dist/src/commands/mcp/remove.d.ts +7 -0
  12. package/dist/src/commands/mcp/remove.js +44 -0
  13. package/dist/src/commands/mcp/remove.js.map +1 -0
  14. package/dist/src/commands/mcp.d.ts +7 -0
  15. package/dist/src/commands/mcp.js +23 -0
  16. package/dist/src/commands/mcp.js.map +1 -0
  17. package/dist/src/config/auth.js +5 -0
  18. package/dist/src/config/auth.js.map +1 -1
  19. package/dist/src/config/config.js +80 -37
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/keyBindings.d.ts +64 -0
  22. package/dist/src/config/keyBindings.js +137 -0
  23. package/dist/src/config/keyBindings.js.map +1 -0
  24. package/dist/src/config/settings.d.ts +7 -1
  25. package/dist/src/config/settings.js +20 -4
  26. package/dist/src/config/settings.js.map +1 -1
  27. package/dist/src/gemini.js +12 -109
  28. package/dist/src/gemini.js.map +1 -1
  29. package/dist/src/generated/git-commit.d.ts +1 -1
  30. package/dist/src/generated/git-commit.js +1 -1
  31. package/dist/src/nonInteractiveCli.js +0 -1
  32. package/dist/src/nonInteractiveCli.js.map +1 -1
  33. package/dist/src/providers/logging/git-stats-service-impl.d.ts +19 -0
  34. package/dist/src/providers/logging/git-stats-service-impl.js +25 -0
  35. package/dist/src/providers/logging/git-stats-service-impl.js.map +1 -0
  36. package/dist/src/providers/logging/git-stats.d.ts +43 -0
  37. package/dist/src/providers/logging/git-stats.js +137 -0
  38. package/dist/src/providers/logging/git-stats.js.map +1 -0
  39. package/dist/src/providers/providerManagerInstance.js +7 -0
  40. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  41. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  42. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  43. package/dist/src/services/todo-continuation/todoContinuationService.d.ts +172 -0
  44. package/dist/src/services/todo-continuation/todoContinuationService.js +387 -0
  45. package/dist/src/services/todo-continuation/todoContinuationService.js.map +1 -0
  46. package/dist/src/services/todo-continuation/todoContinuationService.spec.d.ts +6 -0
  47. package/dist/src/services/todo-continuation/todoContinuationService.spec.js +385 -0
  48. package/dist/src/services/todo-continuation/todoContinuationService.spec.js.map +1 -0
  49. package/dist/src/ui/App.js +111 -35
  50. package/dist/src/ui/App.js.map +1 -1
  51. package/dist/src/ui/IdeIntegrationNudge.d.ts +14 -0
  52. package/dist/src/ui/IdeIntegrationNudge.js +32 -0
  53. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
  54. package/dist/src/ui/colors.d.ts +5 -0
  55. package/dist/src/ui/colors.js +51 -0
  56. package/dist/src/ui/colors.js.map +1 -1
  57. package/dist/src/ui/commands/chatCommand.js +16 -0
  58. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  59. package/dist/src/ui/commands/diagnosticsCommand.js +9 -1
  60. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
  61. package/dist/src/ui/commands/ideCommand.js +67 -31
  62. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  63. package/dist/src/ui/commands/loggingCommand.d.ts +15 -0
  64. package/dist/src/ui/commands/loggingCommand.js +421 -0
  65. package/dist/src/ui/commands/loggingCommand.js.map +1 -0
  66. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  67. package/dist/src/ui/commands/privacyCommand.d.ts +3 -0
  68. package/dist/src/ui/commands/privacyCommand.js +6 -3
  69. package/dist/src/ui/commands/privacyCommand.js.map +1 -1
  70. package/dist/src/ui/commands/profileCommand.js +1 -0
  71. package/dist/src/ui/commands/profileCommand.js.map +1 -1
  72. package/dist/src/ui/commands/setCommand.js +2 -0
  73. package/dist/src/ui/commands/setCommand.js.map +1 -1
  74. package/dist/src/ui/commands/setupGithubCommand.js +90 -26
  75. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  76. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  77. package/dist/src/ui/commands/types.d.ts +14 -2
  78. package/dist/src/ui/commands/types.js.map +1 -1
  79. package/dist/src/ui/components/AuthInProgress.js +3 -3
  80. package/dist/src/ui/components/AuthInProgress.js.map +1 -1
  81. package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
  82. package/dist/src/ui/components/ContextUsageDisplay.js +27 -0
  83. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
  84. package/dist/src/ui/components/FolderTrustDialog.d.ts +16 -0
  85. package/dist/src/ui/components/FolderTrustDialog.js +38 -0
  86. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
  87. package/dist/src/ui/components/Footer.d.ts +0 -1
  88. package/dist/src/ui/components/Footer.js +132 -15
  89. package/dist/src/ui/components/Footer.js.map +1 -1
  90. package/dist/src/ui/components/InputPrompt.js +32 -28
  91. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  92. package/dist/src/ui/components/LoggingDialog.d.ts +37 -0
  93. package/dist/src/ui/components/LoggingDialog.js +155 -0
  94. package/dist/src/ui/components/LoggingDialog.js.map +1 -0
  95. package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
  96. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  97. package/dist/src/ui/components/ProviderDialog.js +100 -26
  98. package/dist/src/ui/components/ProviderDialog.js.map +1 -1
  99. package/dist/src/ui/components/ProviderModelDialog.js +99 -27
  100. package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
  101. package/dist/src/ui/components/TodoPanel.d.ts +11 -0
  102. package/dist/src/ui/components/TodoPanel.js +206 -0
  103. package/dist/src/ui/components/TodoPanel.js.map +1 -0
  104. package/dist/src/ui/components/ToolsDialog.d.ts +2 -2
  105. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +116 -16
  106. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  107. package/dist/src/ui/components/messages/ToolGroupMessage.js +36 -8
  108. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  109. package/dist/src/ui/components/todo-utils.d.ts +16 -0
  110. package/dist/src/ui/components/todo-utils.js +41 -0
  111. package/dist/src/ui/components/todo-utils.js.map +1 -0
  112. package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
  113. package/dist/src/ui/contexts/SettingsContext.js +15 -0
  114. package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
  115. package/dist/src/ui/contexts/TodoContext.d.ts +15 -0
  116. package/dist/src/ui/contexts/TodoContext.js +18 -0
  117. package/dist/src/ui/contexts/TodoContext.js.map +1 -0
  118. package/dist/src/ui/contexts/TodoProvider.d.ts +7 -0
  119. package/dist/src/ui/contexts/TodoProvider.js +62 -0
  120. package/dist/src/ui/contexts/TodoProvider.js.map +1 -0
  121. package/dist/src/ui/contexts/ToolCallContext.d.ts +19 -0
  122. package/dist/src/ui/contexts/ToolCallContext.js +13 -0
  123. package/dist/src/ui/contexts/ToolCallContext.js.map +1 -0
  124. package/dist/src/ui/contexts/ToolCallProvider.d.ts +12 -0
  125. package/dist/src/ui/contexts/ToolCallProvider.js +62 -0
  126. package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -0
  127. package/dist/src/ui/hooks/atCommandProcessor.js +28 -4
  128. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  129. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -1
  130. package/dist/src/ui/hooks/slashCommandProcessor.js +137 -112
  131. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  132. package/dist/src/ui/hooks/useAtCompletion.d.ts +23 -0
  133. package/dist/src/ui/hooks/useAtCompletion.js +180 -0
  134. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
  135. package/dist/src/ui/hooks/useConsoleMessages.js +7 -0
  136. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  137. package/dist/src/ui/hooks/useFolderTrust.d.ts +11 -0
  138. package/dist/src/ui/hooks/useFolderTrust.js +22 -0
  139. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
  140. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
  141. package/dist/src/ui/hooks/useGeminiStream.js +16 -4
  142. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  143. package/dist/src/ui/hooks/useReactToolScheduler.js +12 -12
  144. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  145. package/dist/src/ui/hooks/useResponsive.d.ts +14 -0
  146. package/dist/src/ui/hooks/useResponsive.js +19 -0
  147. package/dist/src/ui/hooks/useResponsive.js.map +1 -0
  148. package/dist/src/ui/hooks/useTodoContinuation.d.ts +31 -0
  149. package/dist/src/ui/hooks/useTodoContinuation.js +148 -0
  150. package/dist/src/ui/hooks/useTodoContinuation.js.map +1 -0
  151. package/dist/src/ui/hooks/useTodoContinuation.spec.d.ts +6 -0
  152. package/dist/src/ui/hooks/useTodoContinuation.spec.js +378 -0
  153. package/dist/src/ui/hooks/useTodoContinuation.spec.js.map +1 -0
  154. package/dist/src/ui/hooks/useToolsDialog.d.ts +2 -2
  155. package/dist/src/ui/hooks/useToolsDialog.js.map +1 -1
  156. package/dist/src/ui/keyMatchers.d.ts +26 -0
  157. package/dist/src/ui/keyMatchers.js +68 -0
  158. package/dist/src/ui/keyMatchers.js.map +1 -0
  159. package/dist/src/ui/privacy/PrivacyNotice.js +10 -4
  160. package/dist/src/ui/privacy/PrivacyNotice.js.map +1 -1
  161. package/dist/src/ui/themes/semantic-resolver.d.ts +12 -0
  162. package/dist/src/ui/themes/semantic-resolver.js +32 -0
  163. package/dist/src/ui/themes/semantic-resolver.js.map +1 -0
  164. package/dist/src/ui/themes/semantic-tokens.d.ts +52 -0
  165. package/dist/src/ui/themes/semantic-tokens.js +7 -0
  166. package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
  167. package/dist/src/ui/themes/theme-compat.d.ts +34 -0
  168. package/dist/src/ui/themes/theme-compat.js +65 -0
  169. package/dist/src/ui/themes/theme-compat.js.map +1 -0
  170. package/dist/src/ui/themes/theme-manager.d.ts +8 -0
  171. package/dist/src/ui/themes/theme-manager.js +18 -0
  172. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  173. package/dist/src/ui/types.d.ts +1 -1
  174. package/dist/src/ui/utils/CodeColorizer.d.ts +2 -1
  175. package/dist/src/ui/utils/CodeColorizer.js +4 -3
  176. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  177. package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -0
  178. package/dist/src/ui/utils/ConsolePatcher.js +3 -0
  179. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  180. package/dist/src/ui/utils/MarkdownDisplay.js +4 -2
  181. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  182. package/dist/src/ui/utils/commandUtils.d.ts +1 -0
  183. package/dist/src/ui/utils/commandUtils.js +22 -1
  184. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  185. package/dist/src/ui/utils/responsive.d.ts +16 -0
  186. package/dist/src/ui/utils/responsive.js +111 -0
  187. package/dist/src/ui/utils/responsive.js.map +1 -0
  188. package/dist/src/utils/cleanup.d.ts +2 -2
  189. package/dist/src/utils/cleanup.js +2 -2
  190. package/dist/src/utils/cleanup.js.map +1 -1
  191. package/dist/src/utils/gitUtils.d.ts +21 -1
  192. package/dist/src/utils/gitUtils.js +70 -3
  193. package/dist/src/utils/gitUtils.js.map +1 -1
  194. package/dist/src/utils/privacy/ConversationDataRedactor.d.ts +75 -0
  195. package/dist/src/utils/privacy/ConversationDataRedactor.js +412 -0
  196. package/dist/src/utils/privacy/ConversationDataRedactor.js.map +1 -0
  197. package/dist/src/utils/privacy/PrivacyManager.d.ts +58 -0
  198. package/dist/src/utils/privacy/PrivacyManager.js +133 -0
  199. package/dist/src/utils/privacy/PrivacyManager.js.map +1 -0
  200. package/dist/src/utils/sandbox.js +430 -401
  201. package/dist/src/utils/sandbox.js.map +1 -1
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +6 -4
  204. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +0 -12
  205. package/dist/src/ui/components/IDEContextDetailDisplay.js +0 -17
  206. 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,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -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 { Tool, Config } from '@vybestack/llxprt-code-core';
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: Tool<unknown, import("@vybestack/llxprt-code-core").ToolResult>[];
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":"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"}
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 };