@vybestack/llxprt-code 0.1.18 → 0.1.19-alpha
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/config.js +48 -13
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/settings.d.ts +6 -1
- package/dist/src/config/settings.js +20 -4
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +3 -107
- 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/providerManagerInstance.js +3 -0
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/ui/App.js +53 -13
- 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/commands/diagnosticsCommand.js +9 -1
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.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/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 +15 -0
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
- package/dist/src/ui/components/Footer.js +13 -16
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/IDEContextDetailDisplay.js +14 -1
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
- package/dist/src/ui/components/TodoPanel.d.ts +11 -0
- package/dist/src/ui/components/TodoPanel.js +131 -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 +31 -9
- 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/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 +7 -4
- package/dist/src/ui/hooks/atCommandProcessor.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/useGeminiStream.d.ts +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +2 -1
- 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/useToolsDialog.d.ts +2 -2
- package/dist/src/ui/hooks/useToolsDialog.js.map +1 -1
- package/dist/src/ui/types.d.ts +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/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/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/sandbox.js +420 -401
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -4
@@ -0,0 +1,131 @@
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
/**
|
3
|
+
* @license
|
4
|
+
* Copyright 2025 Vybestack LLC
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
6
|
+
*/
|
7
|
+
import { useEffect, useState } from 'react';
|
8
|
+
import { Box, Text } from 'ink';
|
9
|
+
import { useTodoContext } from '../contexts/TodoContext.js';
|
10
|
+
import { useToolCallContext } from '../contexts/ToolCallContext.js';
|
11
|
+
import { Colors } from '../colors.js';
|
12
|
+
import { groupToolCalls } from './todo-utils.js';
|
13
|
+
const formatParameters = (parameters) => {
|
14
|
+
const paramStrings = [];
|
15
|
+
const MAX_LENGTH = 40; // Doubled from 20 to be less aggressive
|
16
|
+
for (const [key, value] of Object.entries(parameters)) {
|
17
|
+
if (typeof value === 'string') {
|
18
|
+
let displayValue = value;
|
19
|
+
// Special handling for file paths - show the end part
|
20
|
+
if (key === 'file_path' ||
|
21
|
+
key === 'absolute_path' ||
|
22
|
+
value.includes('/')) {
|
23
|
+
if (value.length > MAX_LENGTH) {
|
24
|
+
// For paths, show the last part which is more useful
|
25
|
+
displayValue = '...' + value.slice(-(MAX_LENGTH - 3));
|
26
|
+
}
|
27
|
+
}
|
28
|
+
else {
|
29
|
+
// For non-paths, truncate normally but with larger limit
|
30
|
+
displayValue =
|
31
|
+
value.length > MAX_LENGTH
|
32
|
+
? value.substring(0, MAX_LENGTH - 3) + '...'
|
33
|
+
: value;
|
34
|
+
}
|
35
|
+
paramStrings.push(`${key}: '${displayValue}'`);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
const jsonStr = JSON.stringify(value);
|
39
|
+
const displayValue = jsonStr.length > MAX_LENGTH
|
40
|
+
? jsonStr.substring(0, MAX_LENGTH - 3) + '...'
|
41
|
+
: jsonStr;
|
42
|
+
paramStrings.push(`${key}: ${displayValue}`);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
return paramStrings.join(', ');
|
46
|
+
};
|
47
|
+
const renderToolCall = (toolCall, count = 1, indent = ' ', index = 0) => {
|
48
|
+
const params = formatParameters(toolCall.parameters);
|
49
|
+
const toolText = `${toolCall.name}(${params})`;
|
50
|
+
const countText = count > 1 ? ` ${count}x` : '';
|
51
|
+
return (_jsx(Box, { flexDirection: "row", minHeight: 1, children: _jsxs(Text, { color: Colors.Gray, children: [indent, "\u21B3 ", toolText, countText] }) }, `${toolCall.id || `${toolCall.name}-${index}`}`));
|
52
|
+
};
|
53
|
+
const renderTodo = (todo, allToolCalls) => {
|
54
|
+
const elements = [];
|
55
|
+
// Todo status marker and content
|
56
|
+
let marker = '';
|
57
|
+
let markerColor = Colors.Foreground;
|
58
|
+
if (todo.status === 'completed') {
|
59
|
+
marker = '✔';
|
60
|
+
markerColor = Colors.AccentGreen;
|
61
|
+
}
|
62
|
+
else if (todo.status === 'pending') {
|
63
|
+
marker = '○';
|
64
|
+
markerColor = Colors.Gray;
|
65
|
+
}
|
66
|
+
else if (todo.status === 'in_progress') {
|
67
|
+
marker = '→';
|
68
|
+
markerColor = Colors.AccentYellow;
|
69
|
+
}
|
70
|
+
// Main todo line
|
71
|
+
elements.push(_jsxs(Box, { flexDirection: "row", minHeight: 1, children: [_jsxs(Text, { color: markerColor, bold: true, children: [marker, ' '] }), _jsx(Box, { flexGrow: 1, children: _jsxs(Text, { color: todo.status === 'in_progress'
|
72
|
+
? Colors.AccentYellow
|
73
|
+
: Colors.Foreground, bold: todo.status === 'in_progress', wrap: "wrap", children: [todo.content, todo.status === 'in_progress' && (_jsx(Text, { color: Colors.AccentYellow, children: " \u2190 current" }))] }) })] }, todo.id));
|
74
|
+
// Render subtasks and their tool calls
|
75
|
+
if (todo.subtasks && todo.subtasks.length > 0) {
|
76
|
+
for (const subtask of todo.subtasks) {
|
77
|
+
elements.push(_jsx(Box, { children: _jsxs(Text, { color: Colors.Gray, children: [" \u2022 ", subtask.content] }) }, `${todo.id}-subtask-${subtask.content}`));
|
78
|
+
if (subtask.toolCalls && subtask.toolCalls.length > 0) {
|
79
|
+
const grouped = groupToolCalls(subtask.toolCalls);
|
80
|
+
grouped.forEach((group, index) => {
|
81
|
+
elements.push(renderToolCall(group.toolCall, group.count, ' ', index));
|
82
|
+
});
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
// Group and render all tool calls from memory (only for in_progress tasks)
|
87
|
+
if (allToolCalls.length > 0 && todo.status === 'in_progress') {
|
88
|
+
const grouped = groupToolCalls(allToolCalls);
|
89
|
+
grouped.forEach((group, index) => {
|
90
|
+
elements.push(renderToolCall(group.toolCall, group.count, ' ', index));
|
91
|
+
});
|
92
|
+
}
|
93
|
+
return elements;
|
94
|
+
};
|
95
|
+
const TodoPanelComponent = ({ width }) => {
|
96
|
+
const { todos } = useTodoContext();
|
97
|
+
const { getExecutingToolCalls, subscribe } = useToolCallContext();
|
98
|
+
const [, forceUpdate] = useState({});
|
99
|
+
const [contentKey, setContentKey] = useState(0);
|
100
|
+
// Force re-render when todos change
|
101
|
+
useEffect(() => {
|
102
|
+
forceUpdate({});
|
103
|
+
setContentKey((prev) => prev + 1);
|
104
|
+
}, [todos]);
|
105
|
+
// Subscribe to tool call updates to re-render when they change
|
106
|
+
useEffect(() => {
|
107
|
+
const unsubscribe = subscribe(() => {
|
108
|
+
forceUpdate({});
|
109
|
+
setContentKey((prev) => prev + 1);
|
110
|
+
});
|
111
|
+
return unsubscribe;
|
112
|
+
}, [subscribe]);
|
113
|
+
if (todos.length === 0) {
|
114
|
+
return null; // Auto-hide when no todos exist
|
115
|
+
}
|
116
|
+
const allElements = [];
|
117
|
+
// Add header
|
118
|
+
allElements.push(_jsx(Box, { minHeight: 1, marginBottom: 1, children: _jsx(Text, { color: Colors.AccentBlue, bold: true, children: "Todo Progress" }) }, "header"));
|
119
|
+
// Add todos
|
120
|
+
for (const todo of todos) {
|
121
|
+
const allToolCalls = getExecutingToolCalls(todo.id); // This now gets all tool calls
|
122
|
+
const todoElements = renderTodo(todo, allToolCalls);
|
123
|
+
allElements.push(...todoElements);
|
124
|
+
// Add spacing between todos
|
125
|
+
allElements.push(_jsx(Box, { height: 1 }, `${todo.id}-spacer`));
|
126
|
+
}
|
127
|
+
return (_jsx(Box, { flexDirection: "column", width: width, borderStyle: "round", borderColor: Colors.AccentBlue, paddingX: 1, paddingY: 1, children: allElements }, `todo-panel-${contentKey}`));
|
128
|
+
};
|
129
|
+
// Export without memo to ensure updates when context changes
|
130
|
+
export const TodoPanel = TodoPanelComponent;
|
131
|
+
//# sourceMappingURL=TodoPanel.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"TodoPanel.js","sourceRoot":"","sources":["../../../../src/ui/components/TodoPanel.tsx"],"names":[],"mappings":"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"}
|
@@ -4,9 +4,9 @@
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
6
|
import React from 'react';
|
7
|
-
import {
|
7
|
+
import { AnyDeclarativeTool } from '@vybestack/llxprt-code-core';
|
8
8
|
interface ToolsDialogProps {
|
9
|
-
tools:
|
9
|
+
tools: AnyDeclarativeTool[];
|
10
10
|
action: 'enable' | 'disable';
|
11
11
|
disabledTools: string[];
|
12
12
|
onSelect: (toolName: string) => void;
|
@@ -11,17 +11,29 @@ import { Colors } from '../../colors.js';
|
|
11
11
|
import { ToolConfirmationOutcome, } from '@vybestack/llxprt-code-core';
|
12
12
|
import { RadioButtonSelect, } from '../shared/RadioButtonSelect.js';
|
13
13
|
import { MaxSizedBox } from '../shared/MaxSizedBox.js';
|
14
|
-
export const ToolConfirmationMessage = ({ confirmationDetails, isFocused = true, availableTerminalHeight, terminalWidth, }) => {
|
14
|
+
export const ToolConfirmationMessage = ({ confirmationDetails, config, isFocused = true, availableTerminalHeight, terminalWidth, }) => {
|
15
15
|
const { onConfirm } = confirmationDetails;
|
16
16
|
const childWidth = terminalWidth - 2; // 2 for padding
|
17
|
+
const handleConfirm = useCallback(async (outcome) => {
|
18
|
+
if (confirmationDetails.type === 'edit') {
|
19
|
+
const ideClient = config?.getIdeClient();
|
20
|
+
if (config?.getIdeMode() && config?.getIdeModeFeature()) {
|
21
|
+
const cliOutcome = outcome === ToolConfirmationOutcome.Cancel
|
22
|
+
? 'rejected'
|
23
|
+
: 'accepted';
|
24
|
+
await ideClient?.resolveDiffFromCli(confirmationDetails.filePath, cliOutcome);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
onConfirm(outcome);
|
28
|
+
}, [confirmationDetails, config, onConfirm]);
|
17
29
|
useInput((_, key) => {
|
18
30
|
if (!isFocused)
|
19
31
|
return;
|
20
32
|
if (key.escape) {
|
21
|
-
|
33
|
+
handleConfirm(ToolConfirmationOutcome.Cancel);
|
22
34
|
}
|
23
35
|
});
|
24
|
-
const handleSelect = useCallback((item) =>
|
36
|
+
const handleSelect = useCallback((item) => handleConfirm(item), [handleConfirm]);
|
25
37
|
let bodyContent = null; // Removed contextDisplay here
|
26
38
|
let question;
|
27
39
|
const options = new Array();
|
@@ -60,13 +72,23 @@ export const ToolConfirmationMessage = ({ confirmationDetails, isFocused = true,
|
|
60
72
|
}, {
|
61
73
|
label: 'Yes, allow always',
|
62
74
|
value: ToolConfirmationOutcome.ProceedAlways,
|
63
|
-
}, {
|
64
|
-
label: 'Modify with external editor',
|
65
|
-
value: ToolConfirmationOutcome.ModifyWithEditor,
|
66
|
-
}, {
|
67
|
-
label: 'No, suggest changes (esc)',
|
68
|
-
value: ToolConfirmationOutcome.Cancel,
|
69
75
|
});
|
76
|
+
if (config?.getIdeMode() && config?.getIdeModeFeature()) {
|
77
|
+
options.push({
|
78
|
+
label: 'No',
|
79
|
+
value: ToolConfirmationOutcome.Cancel,
|
80
|
+
});
|
81
|
+
}
|
82
|
+
else {
|
83
|
+
options.push({
|
84
|
+
label: 'Modify with external editor',
|
85
|
+
value: ToolConfirmationOutcome.ModifyWithEditor,
|
86
|
+
});
|
87
|
+
options.push({
|
88
|
+
label: 'No, suggest changes (esc)',
|
89
|
+
value: ToolConfirmationOutcome.Cancel,
|
90
|
+
});
|
91
|
+
}
|
70
92
|
bodyContent = (_jsx(DiffRenderer, { diffContent: confirmationDetails.fileDiff, filename: confirmationDetails.fileName, availableTerminalHeight: availableBodyContentHeight(), terminalWidth: childWidth }));
|
71
93
|
}
|
72
94
|
else if (confirmationDetails.type === 'exec') {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ToolConfirmationMessage.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/ToolConfirmationMessage.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAEL,uBAAuB,GAIxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,GAElB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD,MAAM,CAAC,MAAM,uBAAuB,GAEhC,CAAC,EACH,mBAAmB,EACnB,SAAS,GAAG,IAAI,EAChB,uBAAuB,EACvB,aAAa,GACd,EAAE,EAAE;IACH,MAAM,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;IAC1C,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,gBAAgB;IAEtD,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,
|
1
|
+
{"version":3,"file":"ToolConfirmationMessage.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/ToolConfirmationMessage.tsx"],"names":[],"mappings":"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"}
|
@@ -11,25 +11,53 @@ import { ToolMessage } from './ToolMessage.js';
|
|
11
11
|
import { ToolConfirmationMessage } from './ToolConfirmationMessage.js';
|
12
12
|
import { Colors } from '../../colors.js';
|
13
13
|
import { SHELL_COMMAND_NAME } from '../../constants.js';
|
14
|
+
import { useTodoContext } from '../../contexts/TodoContext.js';
|
14
15
|
// Main component renders the border and maps the tools using ToolMessage
|
15
16
|
export const ToolGroupMessage = ({ toolCalls, availableTerminalHeight, terminalWidth, config, isFocused = true, }) => {
|
16
|
-
const
|
17
|
-
const
|
17
|
+
const { todos } = useTodoContext();
|
18
|
+
const hasTodoPanel = todos.length > 0;
|
19
|
+
// only prompt for tool approval on the first 'confirming' tool in the list
|
20
|
+
// note, after the CTA, this automatically moves over to the next 'confirming' tool
|
21
|
+
const toolAwaitingApproval = useMemo(() => toolCalls.find((tc) => tc.status === ToolCallStatus.Confirming), [toolCalls]);
|
22
|
+
// Filter out todo_read completely when panel is visible
|
23
|
+
// and minimize todo_write output
|
24
|
+
const filteredToolCalls = useMemo(() => {
|
25
|
+
if (!hasTodoPanel)
|
26
|
+
return toolCalls;
|
27
|
+
return toolCalls
|
28
|
+
.map((tool) => {
|
29
|
+
if (tool.name === 'todo_read') {
|
30
|
+
return null; // Don't show todo_read at all when panel is visible
|
31
|
+
}
|
32
|
+
if (tool.name === 'todo_write') {
|
33
|
+
// Minimize todo_write output when panel is visible
|
34
|
+
return {
|
35
|
+
...tool,
|
36
|
+
resultDisplay: '✦ Todo list updated.',
|
37
|
+
};
|
38
|
+
}
|
39
|
+
return tool;
|
40
|
+
})
|
41
|
+
.filter(Boolean);
|
42
|
+
}, [toolCalls, hasTodoPanel]);
|
43
|
+
// If all tools were filtered out, don't render anything
|
44
|
+
if (filteredToolCalls.length === 0) {
|
45
|
+
return null;
|
46
|
+
}
|
47
|
+
const hasPending = !filteredToolCalls.every((t) => t.status === ToolCallStatus.Success);
|
48
|
+
const isShellCommand = filteredToolCalls.some((t) => t.name === SHELL_COMMAND_NAME);
|
18
49
|
const borderColor = hasPending || isShellCommand ? Colors.AccentYellow : Colors.Gray;
|
19
50
|
const staticHeight = /* border */ 2 + /* marginBottom */ 1;
|
20
51
|
// This is a bit of a magic number, but it accounts for the border and
|
21
52
|
// marginLeft.
|
22
53
|
const innerWidth = terminalWidth - 4;
|
23
|
-
// only prompt for tool approval on the first 'confirming' tool in the list
|
24
|
-
// note, after the CTA, this automatically moves over to the next 'confirming' tool
|
25
|
-
const toolAwaitingApproval = useMemo(() => toolCalls.find((tc) => tc.status === ToolCallStatus.Confirming), [toolCalls]);
|
26
54
|
let countToolCallsWithResults = 0;
|
27
|
-
for (const tool of
|
55
|
+
for (const tool of filteredToolCalls) {
|
28
56
|
if (tool.resultDisplay !== undefined && tool.resultDisplay !== '') {
|
29
57
|
countToolCallsWithResults++;
|
30
58
|
}
|
31
59
|
}
|
32
|
-
const countOneLineToolCalls =
|
60
|
+
const countOneLineToolCalls = filteredToolCalls.length - countToolCallsWithResults;
|
33
61
|
const availableTerminalHeightPerToolMessage = availableTerminalHeight
|
34
62
|
? Math.max(Math.floor((availableTerminalHeight - staticHeight - countOneLineToolCalls) /
|
35
63
|
Math.max(1, countToolCallsWithResults)), 1)
|
@@ -41,7 +69,7 @@ export const ToolGroupMessage = ({ toolCalls, availableTerminalHeight, terminalW
|
|
41
69
|
Ink to render the border of the box incorrectly and span multiple lines and even
|
42
70
|
cause tearing.
|
43
71
|
*/
|
44
|
-
width: "100%", marginLeft: 1, borderDimColor: hasPending, borderColor: borderColor, children:
|
72
|
+
width: "100%", marginLeft: 1, borderDimColor: hasPending, borderColor: borderColor, children: filteredToolCalls.map((tool) => {
|
45
73
|
const isConfirming = toolAwaitingApproval?.callId === tool.callId;
|
46
74
|
return (_jsxs(Box, { flexDirection: "column", minHeight: 1, children: [_jsx(Box, { flexDirection: "row", alignItems: "center", children: _jsx(ToolMessage, { callId: tool.callId, name: tool.name, description: tool.description, resultDisplay: tool.resultDisplay, status: tool.status, confirmationDetails: tool.confirmationDetails, availableTerminalHeight: availableTerminalHeightPerToolMessage, terminalWidth: innerWidth, emphasis: isConfirming
|
47
75
|
? 'high'
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ToolGroupMessage.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/ToolGroupMessage.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAA6B,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
1
|
+
{"version":3,"file":"ToolGroupMessage.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/ToolGroupMessage.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { TodoToolCall } from '@vybestack/llxprt-code-core';
|
7
|
+
export interface GroupedToolCall {
|
8
|
+
toolCall: TodoToolCall;
|
9
|
+
count: number;
|
10
|
+
}
|
11
|
+
/**
|
12
|
+
* Function to group consecutive identical tool calls
|
13
|
+
* Identical tool calls (same name and parameters) that occur consecutively are grouped with a count
|
14
|
+
* Different tool calls are shown separately
|
15
|
+
*/
|
16
|
+
export declare const groupToolCalls: (toolCalls: TodoToolCall[]) => GroupedToolCall[];
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
/**
|
7
|
+
* Function to group consecutive identical tool calls
|
8
|
+
* Identical tool calls (same name and parameters) that occur consecutively are grouped with a count
|
9
|
+
* Different tool calls are shown separately
|
10
|
+
*/
|
11
|
+
export const groupToolCalls = (toolCalls) => {
|
12
|
+
if (toolCalls.length === 0)
|
13
|
+
return [];
|
14
|
+
const grouped = [];
|
15
|
+
let currentGroup = {
|
16
|
+
toolCall: toolCalls[0],
|
17
|
+
count: 1,
|
18
|
+
};
|
19
|
+
for (let i = 1; i < toolCalls.length; i++) {
|
20
|
+
const current = toolCalls[i];
|
21
|
+
const prev = currentGroup.toolCall;
|
22
|
+
// Check if this is the same tool call as the previous one
|
23
|
+
if (current.name === prev.name &&
|
24
|
+
JSON.stringify(current.parameters) === JSON.stringify(prev.parameters)) {
|
25
|
+
// Increment count for consecutive identical call
|
26
|
+
currentGroup.count++;
|
27
|
+
}
|
28
|
+
else {
|
29
|
+
// Different call, save the current group and start a new one
|
30
|
+
grouped.push(currentGroup);
|
31
|
+
currentGroup = {
|
32
|
+
toolCall: current,
|
33
|
+
count: 1,
|
34
|
+
};
|
35
|
+
}
|
36
|
+
}
|
37
|
+
// Don't forget the last group
|
38
|
+
grouped.push(currentGroup);
|
39
|
+
return grouped;
|
40
|
+
};
|
41
|
+
//# sourceMappingURL=todo-utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"todo-utils.js","sourceRoot":"","sources":["../../../../src/ui/components/todo-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,SAAyB,EACN,EAAE;IACrB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,IAAI,YAAY,GAAoB;QAClC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACtB,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC;QAEnC,0DAA0D;QAC1D,IACE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EACtE,CAAC;YACD,iDAAiD;YACjD,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,6DAA6D;YAC7D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,YAAY,GAAG;gBACb,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
import { Todo } from '@vybestack/llxprt-code-core';
|
8
|
+
interface TodoContextType {
|
9
|
+
todos: Todo[];
|
10
|
+
updateTodos: (todos: Todo[]) => void;
|
11
|
+
refreshTodos: () => void;
|
12
|
+
}
|
13
|
+
export declare const TodoContext: React.Context<TodoContextType>;
|
14
|
+
export declare const useTodoContext: () => TodoContextType;
|
15
|
+
export {};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
const defaultContextValue = {
|
8
|
+
todos: [],
|
9
|
+
updateTodos: () => {
|
10
|
+
throw new Error('NotYetImplemented');
|
11
|
+
},
|
12
|
+
refreshTodos: () => {
|
13
|
+
throw new Error('NotYetImplemented');
|
14
|
+
},
|
15
|
+
};
|
16
|
+
export const TodoContext = React.createContext(defaultContextValue);
|
17
|
+
export const useTodoContext = () => React.useContext(TodoContext);
|
18
|
+
//# sourceMappingURL=TodoContext.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"TodoContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/TodoContext.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,mBAAmB,GAAoB;IAC3C,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,GAAG,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,YAAY,EAAE,GAAG,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GACtB,KAAK,CAAC,aAAa,CAAkB,mBAAmB,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC"}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
3
|
+
import { TodoStore, todoEvents, } from '@vybestack/llxprt-code-core';
|
4
|
+
import { TodoContext } from './TodoContext.js';
|
5
|
+
export const TodoProvider = ({ children, sessionId = 'default', }) => {
|
6
|
+
const [todos, setTodos] = useState([]);
|
7
|
+
const [loading, setLoading] = useState(true);
|
8
|
+
const [error, setError] = useState(null);
|
9
|
+
const refreshTodos = useCallback(async () => {
|
10
|
+
try {
|
11
|
+
setLoading(true);
|
12
|
+
const store = new TodoStore(sessionId);
|
13
|
+
const todos = await store.readTodos();
|
14
|
+
setTodos(todos);
|
15
|
+
setError(null);
|
16
|
+
}
|
17
|
+
catch (err) {
|
18
|
+
setError(`Failed to load todos: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
19
|
+
setTodos([]);
|
20
|
+
}
|
21
|
+
finally {
|
22
|
+
setLoading(false);
|
23
|
+
}
|
24
|
+
}, [sessionId]);
|
25
|
+
// Load initial data
|
26
|
+
useEffect(() => {
|
27
|
+
refreshTodos();
|
28
|
+
}, [refreshTodos]);
|
29
|
+
// Listen for todo updates
|
30
|
+
useEffect(() => {
|
31
|
+
const handleTodoUpdate = (eventData) => {
|
32
|
+
// Verify this update is for our session
|
33
|
+
if (eventData.sessionId === sessionId) {
|
34
|
+
// Use the todos from the event instead of re-reading from file
|
35
|
+
// This avoids race conditions with file I/O
|
36
|
+
setTodos(eventData.todos);
|
37
|
+
setError(null);
|
38
|
+
}
|
39
|
+
};
|
40
|
+
todoEvents.onTodoUpdated(handleTodoUpdate);
|
41
|
+
return () => {
|
42
|
+
todoEvents.offTodoUpdated(handleTodoUpdate);
|
43
|
+
};
|
44
|
+
}, [sessionId]);
|
45
|
+
const updateTodos = useCallback((newTodos) => {
|
46
|
+
setTodos(newTodos);
|
47
|
+
// Persist to store
|
48
|
+
const store = new TodoStore(sessionId);
|
49
|
+
store.writeTodos(newTodos).catch((err) => {
|
50
|
+
setError(`Failed to save todos: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
51
|
+
});
|
52
|
+
}, [sessionId]);
|
53
|
+
const contextValue = useMemo(() => ({
|
54
|
+
todos,
|
55
|
+
updateTodos,
|
56
|
+
refreshTodos,
|
57
|
+
loading,
|
58
|
+
error,
|
59
|
+
}), [todos, updateTodos, refreshTodos, loading, error]);
|
60
|
+
return (_jsx(TodoContext.Provider, { value: contextValue, children: children }));
|
61
|
+
};
|
62
|
+
//# sourceMappingURL=TodoProvider.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"TodoProvider.js","sourceRoot":"","sources":["../../../../src/ui/contexts/TodoProvider.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
import { TodoToolCall } from '@vybestack/llxprt-code-core';
|
8
|
+
export interface ToolCallContextType {
|
9
|
+
/**
|
10
|
+
* Get executing tool calls for a specific todo
|
11
|
+
*/
|
12
|
+
getExecutingToolCalls: (todoId: string) => TodoToolCall[];
|
13
|
+
/**
|
14
|
+
* Subscribe to tool call updates
|
15
|
+
*/
|
16
|
+
subscribe: (callback: () => void) => () => void;
|
17
|
+
}
|
18
|
+
export declare const ToolCallContext: React.Context<ToolCallContextType>;
|
19
|
+
export declare const useToolCallContext: () => ToolCallContextType;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
const defaultContextValue = {
|
8
|
+
getExecutingToolCalls: () => [],
|
9
|
+
subscribe: () => () => { },
|
10
|
+
};
|
11
|
+
export const ToolCallContext = React.createContext(defaultContextValue);
|
12
|
+
export const useToolCallContext = () => React.useContext(ToolCallContext);
|
13
|
+
//# sourceMappingURL=ToolCallContext.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ToolCallContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ToolCallContext.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,MAAM,mBAAmB,GAAwB;IAC/C,qBAAqB,EAAE,GAAG,EAAE,CAAC,EAAE;IAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,KAAK,CAAC,aAAa,CAAsB,mBAAmB,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
interface ToolCallProviderProps {
|
8
|
+
children: React.ReactNode;
|
9
|
+
sessionId: string;
|
10
|
+
}
|
11
|
+
export declare const ToolCallProvider: React.FC<ToolCallProviderProps>;
|
12
|
+
export {};
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
/**
|
3
|
+
* @license
|
4
|
+
* Copyright 2025 Vybestack LLC
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
6
|
+
*/
|
7
|
+
import { useState, useEffect, useCallback, useRef, useMemo, } from 'react';
|
8
|
+
import { ToolCallContext } from './ToolCallContext.js';
|
9
|
+
import { ToolCallTrackerService, } from '@vybestack/llxprt-code-core';
|
10
|
+
export const ToolCallProvider = ({ children, sessionId, }) => {
|
11
|
+
// Store executing tool calls in state to trigger re-renders
|
12
|
+
const [executingToolCalls, setExecutingToolCalls] = useState(new Map());
|
13
|
+
// Track if we've already subscribed to avoid duplicate subscriptions
|
14
|
+
const unsubscribeRef = useRef(null);
|
15
|
+
// Get executing tool calls for a specific todo
|
16
|
+
const getExecutingToolCalls = useCallback((todoId) => executingToolCalls.get(todoId) || [], [executingToolCalls]);
|
17
|
+
// Update the state with current tool calls
|
18
|
+
const updateExecutingToolCalls = useCallback(() => {
|
19
|
+
// Get all tool calls for this session
|
20
|
+
const allCalls = ToolCallTrackerService.getAllToolCallsForSession(sessionId);
|
21
|
+
// Convert to the format we want for state
|
22
|
+
const newExecutingToolCalls = new Map();
|
23
|
+
for (const [todoId] of allCalls) {
|
24
|
+
// Get all tool calls (both executing and completed)
|
25
|
+
const allToolCalls = ToolCallTrackerService.getAllToolCalls(sessionId, todoId);
|
26
|
+
newExecutingToolCalls.set(todoId, allToolCalls);
|
27
|
+
}
|
28
|
+
setExecutingToolCalls(newExecutingToolCalls);
|
29
|
+
}, [sessionId]);
|
30
|
+
// Set up subscription to tool call updates
|
31
|
+
useEffect(() => {
|
32
|
+
// Unsubscribe from previous subscription if it exists
|
33
|
+
if (unsubscribeRef.current) {
|
34
|
+
unsubscribeRef.current();
|
35
|
+
unsubscribeRef.current = null;
|
36
|
+
}
|
37
|
+
// Subscribe to updates
|
38
|
+
const unsubscribe = ToolCallTrackerService.subscribeToUpdates(sessionId, updateExecutingToolCalls);
|
39
|
+
unsubscribeRef.current = unsubscribe;
|
40
|
+
// Do an initial update to get current state
|
41
|
+
updateExecutingToolCalls();
|
42
|
+
// Clean up subscription on unmount
|
43
|
+
return () => {
|
44
|
+
if (unsubscribeRef.current) {
|
45
|
+
unsubscribeRef.current();
|
46
|
+
unsubscribeRef.current = null;
|
47
|
+
}
|
48
|
+
};
|
49
|
+
}, [sessionId, updateExecutingToolCalls]);
|
50
|
+
const contextValue = useMemo(() => ({
|
51
|
+
getExecutingToolCalls,
|
52
|
+
subscribe: (callback) => {
|
53
|
+
const unsubscribe = ToolCallTrackerService.subscribeToUpdates(sessionId, () => {
|
54
|
+
updateExecutingToolCalls();
|
55
|
+
callback();
|
56
|
+
});
|
57
|
+
return unsubscribe;
|
58
|
+
},
|
59
|
+
}), [getExecutingToolCalls, sessionId, updateExecutingToolCalls]);
|
60
|
+
return (_jsx(ToolCallContext.Provider, { value: contextValue, children: children }));
|
61
|
+
};
|
62
|
+
//# sourceMappingURL=ToolCallProvider.js.map
|