paean 0.8.13 → 0.8.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/service.d.ts +5 -0
- package/dist/agent/service.d.ts.map +1 -1
- package/dist/agent/service.js +8 -4
- package/dist/agent/service.js.map +1 -1
- package/dist/agent/types.d.ts +12 -2
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/utils.d.ts.map +1 -1
- package/dist/agent/utils.js +47 -32
- package/dist/agent/utils.js.map +1 -1
- package/dist/api/auth.d.ts +7 -0
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +70 -0
- package/dist/api/auth.js.map +1 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +101 -7
- package/dist/api/client.js.map +1 -1
- package/dist/api/devices.d.ts +35 -0
- package/dist/api/devices.d.ts.map +1 -0
- package/dist/api/devices.js +77 -0
- package/dist/api/devices.js.map +1 -0
- package/dist/api/todo.d.ts +21 -0
- package/dist/api/todo.d.ts.map +1 -1
- package/dist/api/todo.js +18 -0
- package/dist/api/todo.js.map +1 -1
- package/dist/cli.js +17 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/completion.d.ts +7 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +217 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +107 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/devices.d.ts +7 -0
- package/dist/commands/devices.d.ts.map +1 -0
- package/dist/commands/devices.js +86 -0
- package/dist/commands/devices.js.map +1 -0
- package/dist/commands/history.d.ts +20 -0
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +160 -10
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +110 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +11 -0
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mcp.d.ts +7 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +179 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/sparklet.d.ts +7 -0
- package/dist/commands/sparklet.d.ts.map +1 -0
- package/dist/commands/sparklet.js +145 -0
- package/dist/commands/sparklet.js.map +1 -0
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +48 -1
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/worker.d.ts.map +1 -1
- package/dist/commands/worker.js +83 -27
- package/dist/commands/worker.js.map +1 -1
- package/dist/mcp/cli-agent-tools.d.ts.map +1 -1
- package/dist/mcp/cli-agent-tools.js +4 -2
- package/dist/mcp/cli-agent-tools.js.map +1 -1
- package/dist/mcp/client.d.ts +5 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +23 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/system.d.ts.map +1 -1
- package/dist/mcp/system.js +291 -3
- package/dist/mcp/system.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +287 -4
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/worker-tools.js +1 -1
- package/dist/mcp/worker-tools.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +4 -4
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts +3 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +164 -26
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ToolCallIndicator.d.ts +23 -0
- package/dist/ui/components/ToolCallIndicator.d.ts.map +1 -1
- package/dist/ui/components/ToolCallIndicator.js +31 -4
- package/dist/ui/components/ToolCallIndicator.js.map +1 -1
- package/dist/ui/components/index.d.ts +2 -1
- package/dist/ui/components/index.d.ts.map +1 -1
- package/dist/ui/components/index.js +1 -1
- package/dist/ui/components/index.js.map +1 -1
- package/dist/ui/hooks/useAgentStream.d.ts +2 -0
- package/dist/ui/hooks/useAgentStream.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentStream.js +41 -8
- package/dist/ui/hooks/useAgentStream.js.map +1 -1
- package/dist/ui/hooks/useCommands.d.ts +4 -5
- package/dist/ui/hooks/useCommands.d.ts.map +1 -1
- package/dist/ui/hooks/useCommands.js +76 -11
- package/dist/ui/hooks/useCommands.js.map +1 -1
- package/dist/utils/config.d.ts +18 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +39 -3
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/output.d.ts +25 -8
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +46 -9
- package/dist/utils/output.js.map +1 -1
- package/dist/worker/executors/articulate.d.ts +23 -0
- package/dist/worker/executors/articulate.d.ts.map +1 -0
- package/dist/worker/executors/articulate.js +151 -0
- package/dist/worker/executors/articulate.js.map +1 -0
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +1 -0
- package/dist/worker/index.js.map +1 -1
- package/dist/worker/service.d.ts +1 -0
- package/dist/worker/service.d.ts.map +1 -1
- package/dist/worker/service.js +8 -0
- package/dist/worker/service.js.map +1 -1
- package/dist/worker/supervisor.d.ts.map +1 -1
- package/dist/worker/supervisor.js +59 -21
- package/dist/worker/supervisor.js.map +1 -1
- package/dist/worker/types.d.ts +3 -1
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/types.js +20 -2
- package/dist/worker/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,59 +2,60 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
/**
|
|
3
3
|
* InputArea Component
|
|
4
4
|
* User input with command handling using useStdin for raw input handling
|
|
5
|
-
* Features: Tab completion, command suggestions, styled input box
|
|
5
|
+
* Features: Tab completion, command suggestions, styled input box,
|
|
6
|
+
* input history (Up/Down), cursor movement (Left/Right),
|
|
7
|
+
* and multi-line input (backslash continuation)
|
|
6
8
|
*/
|
|
7
9
|
import { useState, useEffect, useRef, useMemo } from 'react';
|
|
8
10
|
import { Box, Text, useStdin } from 'ink';
|
|
9
11
|
import { SYMBOLS, INK_COLORS, SEPARATOR_CHAR } from '../theme/ink-theme.js';
|
|
10
12
|
import { useTerminalSize } from '../hooks/index.js';
|
|
13
|
+
/** Maximum number of input history entries to retain */
|
|
14
|
+
const MAX_HISTORY = 100;
|
|
11
15
|
export const InputArea = ({ onSubmit, onInputChange, onTabComplete, suggestions = [], disabled = false }) => {
|
|
12
16
|
const [value, setValue] = useState('');
|
|
17
|
+
const [cursorPos, setCursorPos] = useState(0);
|
|
13
18
|
const { stdin, setRawMode } = useStdin();
|
|
14
19
|
const rawModeRef = useRef(true);
|
|
15
|
-
// Use refs to avoid re-attaching stdin listener on every callback change
|
|
16
20
|
const callbacksRef = useRef({ onSubmit, onInputChange, onTabComplete });
|
|
17
|
-
//
|
|
21
|
+
// Input history for Up/Down navigation
|
|
22
|
+
const historyRef = useRef([]);
|
|
23
|
+
const historyIndexRef = useRef(-1);
|
|
24
|
+
const savedInputRef = useRef('');
|
|
18
25
|
useEffect(() => {
|
|
19
26
|
callbacksRef.current = { onSubmit, onInputChange, onTabComplete };
|
|
20
27
|
});
|
|
21
|
-
// Notify parent of value changes via useEffect (not during render/setState)
|
|
22
28
|
const prevValueRef = useRef(value);
|
|
23
29
|
useEffect(() => {
|
|
24
30
|
if (prevValueRef.current !== value) {
|
|
25
31
|
prevValueRef.current = value;
|
|
26
|
-
// Call onInputChange after render is complete
|
|
27
32
|
callbacksRef.current.onInputChange?.(value);
|
|
28
33
|
}
|
|
29
34
|
}, [value]);
|
|
30
|
-
// Use reactive terminal size hook for responsive separator
|
|
31
35
|
const { columns } = useTerminalSize();
|
|
32
|
-
// Separator line - account for outer padding (2 chars total)
|
|
33
36
|
const separatorLine = useMemo(() => {
|
|
34
37
|
const width = Math.max(0, columns - 2);
|
|
35
38
|
return SEPARATOR_CHAR.repeat(width);
|
|
36
39
|
}, [columns]);
|
|
37
40
|
useEffect(() => {
|
|
38
|
-
// Set raw mode to capture individual key presses
|
|
39
41
|
setRawMode(true);
|
|
40
42
|
rawModeRef.current = true;
|
|
41
43
|
const handleData = (data) => {
|
|
42
44
|
const input = data.toString();
|
|
43
|
-
// Ctrl+C
|
|
44
|
-
// Let it pass through - do NOT consume or block it here
|
|
45
|
+
// Ctrl+C - pass through to App.tsx
|
|
45
46
|
if (input === '\x03') {
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
|
-
// Block all other input when disabled (during processing)
|
|
49
49
|
if (disabled)
|
|
50
50
|
return;
|
|
51
|
-
//
|
|
51
|
+
// Tab key - command completion
|
|
52
52
|
if (input === '\t') {
|
|
53
53
|
const { onTabComplete } = callbacksRef.current;
|
|
54
54
|
setValue(currentValue => {
|
|
55
55
|
if (onTabComplete && currentValue.startsWith('/')) {
|
|
56
56
|
const completed = onTabComplete(currentValue);
|
|
57
57
|
if (completed) {
|
|
58
|
+
setCursorPos(completed.length);
|
|
58
59
|
return completed;
|
|
59
60
|
}
|
|
60
61
|
}
|
|
@@ -62,43 +63,177 @@ export const InputArea = ({ onSubmit, onInputChange, onTabComplete, suggestions
|
|
|
62
63
|
});
|
|
63
64
|
return;
|
|
64
65
|
}
|
|
65
|
-
//
|
|
66
|
+
// Arrow keys and other escape sequences
|
|
67
|
+
if (input.startsWith('\x1b[') || input.startsWith('\x1b\x4f')) {
|
|
68
|
+
const seq = input.startsWith('\x1b[') ? input.slice(2) : input.slice(2);
|
|
69
|
+
// Up arrow - history previous
|
|
70
|
+
if (seq === 'A') {
|
|
71
|
+
const history = historyRef.current;
|
|
72
|
+
if (history.length === 0)
|
|
73
|
+
return;
|
|
74
|
+
setValue(currentValue => {
|
|
75
|
+
if (historyIndexRef.current === -1) {
|
|
76
|
+
savedInputRef.current = currentValue;
|
|
77
|
+
}
|
|
78
|
+
const newIndex = Math.min(historyIndexRef.current + 1, history.length - 1);
|
|
79
|
+
historyIndexRef.current = newIndex;
|
|
80
|
+
const historyValue = history[history.length - 1 - newIndex];
|
|
81
|
+
setCursorPos(historyValue.length);
|
|
82
|
+
return historyValue;
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Down arrow - history next
|
|
87
|
+
if (seq === 'B') {
|
|
88
|
+
setValue(() => {
|
|
89
|
+
if (historyIndexRef.current <= 0) {
|
|
90
|
+
historyIndexRef.current = -1;
|
|
91
|
+
const saved = savedInputRef.current;
|
|
92
|
+
setCursorPos(saved.length);
|
|
93
|
+
return saved;
|
|
94
|
+
}
|
|
95
|
+
historyIndexRef.current -= 1;
|
|
96
|
+
const history = historyRef.current;
|
|
97
|
+
const historyValue = history[history.length - 1 - historyIndexRef.current];
|
|
98
|
+
setCursorPos(historyValue.length);
|
|
99
|
+
return historyValue;
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Right arrow - move cursor right
|
|
104
|
+
if (seq === 'C') {
|
|
105
|
+
setCursorPos(pos => {
|
|
106
|
+
// Need current value length - we read it from ref
|
|
107
|
+
return Math.min(pos + 1, prevValueRef.current.length);
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Left arrow - move cursor left
|
|
112
|
+
if (seq === 'D') {
|
|
113
|
+
setCursorPos(pos => Math.max(pos - 1, 0));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Home key
|
|
117
|
+
if (seq === 'H' || seq === '1~') {
|
|
118
|
+
setCursorPos(0);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// End key
|
|
122
|
+
if (seq === 'F' || seq === '4~') {
|
|
123
|
+
setCursorPos(prevValueRef.current.length);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Delete key
|
|
127
|
+
if (seq === '3~') {
|
|
128
|
+
setValue(currentValue => {
|
|
129
|
+
setCursorPos(pos => pos); // maintain position
|
|
130
|
+
return currentValue.slice(0, cursorPos) + currentValue.slice(cursorPos + 1);
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
return; // Ignore other escape sequences
|
|
135
|
+
}
|
|
136
|
+
// Plain Escape - clear input
|
|
137
|
+
if (input === '\x1b') {
|
|
138
|
+
setValue('');
|
|
139
|
+
setCursorPos(0);
|
|
140
|
+
historyIndexRef.current = -1;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Enter - submit or handle backslash continuation
|
|
66
144
|
if (input === '\r' || input === '\n') {
|
|
67
145
|
setValue(currentValue => {
|
|
146
|
+
// Backslash continuation for multi-line
|
|
147
|
+
if (currentValue.endsWith('\\')) {
|
|
148
|
+
const continued = currentValue.slice(0, -1) + '\n';
|
|
149
|
+
setCursorPos(continued.length);
|
|
150
|
+
return continued;
|
|
151
|
+
}
|
|
68
152
|
if (currentValue.trim()) {
|
|
69
|
-
//
|
|
153
|
+
// Add to history
|
|
154
|
+
historyRef.current.push(currentValue.trim());
|
|
155
|
+
if (historyRef.current.length > MAX_HISTORY) {
|
|
156
|
+
historyRef.current.shift();
|
|
157
|
+
}
|
|
158
|
+
historyIndexRef.current = -1;
|
|
70
159
|
setTimeout(() => {
|
|
71
160
|
callbacksRef.current.onSubmit(currentValue.trim());
|
|
72
161
|
}, 0);
|
|
162
|
+
setCursorPos(0);
|
|
73
163
|
return '';
|
|
74
164
|
}
|
|
75
165
|
return currentValue;
|
|
76
166
|
});
|
|
77
167
|
return;
|
|
78
168
|
}
|
|
79
|
-
//
|
|
169
|
+
// Backspace
|
|
80
170
|
if (input === '\x7f' || input === '\x08') {
|
|
81
|
-
setValue(
|
|
171
|
+
setValue(currentValue => {
|
|
172
|
+
if (cursorPos > 0) {
|
|
173
|
+
setCursorPos(pos => pos - 1);
|
|
174
|
+
return currentValue.slice(0, cursorPos - 1) + currentValue.slice(cursorPos);
|
|
175
|
+
}
|
|
176
|
+
return currentValue;
|
|
177
|
+
});
|
|
82
178
|
return;
|
|
83
179
|
}
|
|
84
|
-
//
|
|
85
|
-
if (input === '\
|
|
86
|
-
|
|
180
|
+
// Ctrl+A - move to start
|
|
181
|
+
if (input === '\x01') {
|
|
182
|
+
setCursorPos(0);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Ctrl+E - move to end
|
|
186
|
+
if (input === '\x05') {
|
|
187
|
+
setCursorPos(prevValueRef.current.length);
|
|
87
188
|
return;
|
|
88
189
|
}
|
|
89
|
-
//
|
|
190
|
+
// Ctrl+U - clear line before cursor
|
|
191
|
+
if (input === '\x15') {
|
|
192
|
+
setValue(currentValue => {
|
|
193
|
+
const after = currentValue.slice(cursorPos);
|
|
194
|
+
setCursorPos(0);
|
|
195
|
+
return after;
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// Ctrl+K - clear line after cursor
|
|
200
|
+
if (input === '\x0b') {
|
|
201
|
+
setValue(currentValue => currentValue.slice(0, cursorPos));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Ctrl+W - delete word before cursor
|
|
205
|
+
if (input === '\x17') {
|
|
206
|
+
setValue(currentValue => {
|
|
207
|
+
const before = currentValue.slice(0, cursorPos);
|
|
208
|
+
const after = currentValue.slice(cursorPos);
|
|
209
|
+
const trimmed = before.replace(/\S+\s*$/, '');
|
|
210
|
+
setCursorPos(trimmed.length);
|
|
211
|
+
return trimmed + after;
|
|
212
|
+
});
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// Regular printable characters
|
|
90
216
|
if (input.length === 1 && input.charCodeAt(0) >= 32) {
|
|
91
|
-
setValue(
|
|
217
|
+
setValue(currentValue => {
|
|
218
|
+
const newValue = currentValue.slice(0, cursorPos) + input + currentValue.slice(cursorPos);
|
|
219
|
+
setCursorPos(pos => pos + 1);
|
|
220
|
+
return newValue;
|
|
221
|
+
});
|
|
222
|
+
historyIndexRef.current = -1;
|
|
92
223
|
}
|
|
93
224
|
else if (input.length > 1 && !input.startsWith('\x1b')) {
|
|
94
225
|
// Handle pasted text
|
|
95
|
-
setValue(
|
|
226
|
+
setValue(currentValue => {
|
|
227
|
+
const newValue = currentValue.slice(0, cursorPos) + input + currentValue.slice(cursorPos);
|
|
228
|
+
setCursorPos(pos => pos + input.length);
|
|
229
|
+
return newValue;
|
|
230
|
+
});
|
|
231
|
+
historyIndexRef.current = -1;
|
|
96
232
|
}
|
|
97
233
|
};
|
|
98
234
|
stdin.on('data', handleData);
|
|
99
235
|
return () => {
|
|
100
236
|
stdin.off('data', handleData);
|
|
101
|
-
// Cleanup raw mode on unmount
|
|
102
237
|
if (rawModeRef.current) {
|
|
103
238
|
try {
|
|
104
239
|
setRawMode(false);
|
|
@@ -109,8 +244,11 @@ export const InputArea = ({ onSubmit, onInputChange, onTabComplete, suggestions
|
|
|
109
244
|
}
|
|
110
245
|
}
|
|
111
246
|
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
247
|
+
}, [stdin, setRawMode, disabled, cursorPos]);
|
|
248
|
+
// Split value for cursor rendering
|
|
249
|
+
const beforeCursor = value.slice(0, cursorPos);
|
|
250
|
+
const afterCursor = value.slice(cursorPos);
|
|
251
|
+
const isMultiLine = value.includes('\n');
|
|
252
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsx(Text, { color: "gray", children: separatorLine }) }), _jsxs(Box, { marginTop: 0, children: [_jsxs(Text, { color: INK_COLORS.primary, children: [SYMBOLS.prompt, " "] }), disabled ? (_jsx(Text, { dimColor: true, children: "..." })) : (_jsxs(_Fragment, { children: [_jsx(Text, { children: beforeCursor }), _jsx(Text, { color: INK_COLORS.primary, children: "\u258C" }), _jsx(Text, { children: afterCursor })] }))] }), !disabled && isMultiLine && (_jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "... (multi-line, press Enter to send)" }) })), !disabled && suggestions.length > 0 && (_jsxs(Box, { marginLeft: 2, marginTop: 0, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "+- Commands -+" }), suggestions.slice(0, 5).map((suggestion, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "| " }), _jsx(Text, { color: INK_COLORS.success, children: suggestion })] }, i))), _jsx(Text, { dimColor: true, children: "+-- Tab to complete" })] })), _jsx(Box, { marginTop: 0, children: _jsx(Text, { color: "gray", children: separatorLine }) })] }));
|
|
115
253
|
};
|
|
116
254
|
//# sourceMappingURL=InputArea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputArea.js","sourceRoot":"","sources":["../../../src/ui/components/InputArea.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"InputArea.js","sourceRoot":"","sources":["../../../src/ui/components/InputArea.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ToolCallIndicator Component
|
|
3
3
|
* Visual indicator for tool calls and MCP operations
|
|
4
|
+
* Supports both current (spinning) and historical (completed/error) states
|
|
4
5
|
*/
|
|
5
6
|
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Convert internal tool names to human-friendly display names.
|
|
9
|
+
* e.g. "paean_list_tasks" → "List Tasks"
|
|
10
|
+
* "getTodoItems" → "Get Todo Items"
|
|
11
|
+
* "searchNotes" → "Search Notes"
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatToolName(name: string): string;
|
|
6
14
|
interface ToolCallIndicatorProps {
|
|
7
15
|
name: string;
|
|
8
16
|
type?: 'tool' | 'mcp';
|
|
@@ -10,5 +18,20 @@ interface ToolCallIndicatorProps {
|
|
|
10
18
|
status?: 'pending' | 'completed' | 'error';
|
|
11
19
|
}
|
|
12
20
|
export declare const ToolCallIndicator: React.FC<ToolCallIndicatorProps>;
|
|
21
|
+
/**
|
|
22
|
+
* ToolCallHistory — renders a compact log of all tool calls in the current turn.
|
|
23
|
+
*/
|
|
24
|
+
export interface ToolCallRecord {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
type: 'tool' | 'mcp';
|
|
28
|
+
serverName?: string;
|
|
29
|
+
status: 'pending' | 'completed' | 'error';
|
|
30
|
+
timestamp: number;
|
|
31
|
+
}
|
|
32
|
+
interface ToolCallHistoryProps {
|
|
33
|
+
history: ToolCallRecord[];
|
|
34
|
+
}
|
|
35
|
+
export declare const ToolCallHistory: React.FC<ToolCallHistoryProps>;
|
|
13
36
|
export {};
|
|
14
37
|
//# sourceMappingURL=ToolCallIndicator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ToolCallIndicator.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ToolCallIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ToolCallIndicator.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAenD;AAED,UAAU,sBAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;CAC9C;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA6B9D,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,oBAAoB;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA2B1D,CAAC"}
|
|
@@ -1,10 +1,37 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import InkSpinner from 'ink-spinner';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Convert internal tool names to human-friendly display names.
|
|
6
|
+
* e.g. "paean_list_tasks" → "List Tasks"
|
|
7
|
+
* "getTodoItems" → "Get Todo Items"
|
|
8
|
+
* "searchNotes" → "Search Notes"
|
|
9
|
+
*/
|
|
10
|
+
export function formatToolName(name) {
|
|
11
|
+
// Strip paean_ prefix
|
|
12
|
+
let clean = name.replace(/^paean_/, '');
|
|
13
|
+
// Handle camelCase (e.g. getTodoItems → get Todo Items)
|
|
14
|
+
clean = clean.replace(/([a-z])([A-Z])/g, '$1 $2');
|
|
15
|
+
// Handle snake_case (e.g. list_tasks → list tasks)
|
|
16
|
+
clean = clean.replace(/_/g, ' ');
|
|
17
|
+
// Title case each word
|
|
18
|
+
return clean
|
|
19
|
+
.split(' ')
|
|
20
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
21
|
+
.join(' ');
|
|
22
|
+
}
|
|
23
|
+
export const ToolCallIndicator = ({ name, type: _type = 'tool', serverName, status = 'pending' }) => {
|
|
24
|
+
const displayName = formatToolName(name);
|
|
6
25
|
const color = status === 'error' ? 'red' : status === 'completed' ? 'green' : 'cyan';
|
|
7
26
|
const statusIcon = status === 'completed' ? '✓' : status === 'error' ? '✗' : null;
|
|
8
|
-
return (_jsxs(Box, { children: [status === 'pending' ? (_jsx(Text, { color: color, children: _jsx(InkSpinner, { type: "dots" }) })) : (_jsx(Text, { color: color, children: statusIcon })),
|
|
27
|
+
return (_jsxs(Box, { children: [status === 'pending' ? (_jsx(Text, { color: color, children: _jsx(InkSpinner, { type: "dots" }) })) : (_jsx(Text, { color: color, children: statusIcon })), _jsx(Text, { dimColor: true, children: " " }), serverName && serverName !== 'paean-system' && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "yellow", children: serverName }), _jsx(Text, { dimColor: true, children: " \u2192 " })] })), _jsx(Text, { color: color, bold: status === 'pending', children: displayName })] }));
|
|
28
|
+
};
|
|
29
|
+
export const ToolCallHistory = ({ history }) => {
|
|
30
|
+
if (history.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
// Show completed/error entries as compact history, pending as active
|
|
33
|
+
const completed = history.filter(h => h.status !== 'pending');
|
|
34
|
+
const pending = history.find(h => h.status === 'pending');
|
|
35
|
+
return (_jsxs(Box, { flexDirection: "column", children: [completed.map((entry) => (_jsxs(Box, { children: [_jsx(Text, { color: entry.status === 'error' ? 'red' : 'green', children: entry.status === 'error' ? '✗' : '✓' }), _jsxs(Text, { dimColor: true, children: [" ", formatToolName(entry.name)] })] }, entry.id))), pending && (_jsx(ToolCallIndicator, { name: pending.name, type: pending.type, serverName: pending.serverName, status: "pending" }))] }));
|
|
9
36
|
};
|
|
10
37
|
//# sourceMappingURL=ToolCallIndicator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/ToolCallIndicator.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"ToolCallIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/ToolCallIndicator.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,sBAAsB;IACtB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAExC,wDAAwD;IACxD,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAElD,mDAAmD;IACnD,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEjC,uBAAuB;IACvB,OAAO,KAAK;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AASD,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAChE,IAAI,EACJ,IAAI,EAAE,KAAK,GAAG,MAAM,EACpB,UAAU,EACV,MAAM,GAAG,SAAS,EACrB,EAAE,EAAE;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,UAAU,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAElF,OAAO,CACH,MAAC,GAAG,eACC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACpB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACd,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,GAAG,GACvB,CACV,CAAC,CAAC,CAAC,CACA,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,UAAU,GAAQ,CAC1C,EACD,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACtB,UAAU,IAAI,UAAU,KAAK,cAAc,IAAI,CAC5C,8BACI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,UAAU,GAAQ,EACxC,KAAC,IAAI,IAAC,QAAQ,+BAAW,IAC1B,CACN,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,YAAG,WAAW,GAAQ,IAClE,CACT,CAAC;AACN,CAAC,CAAC;AAkBF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,qEAAqE;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAE1D,OAAO,CACH,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACtB,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,MAAC,GAAG,eACA,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,YAClD,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAClC,EACP,MAAC,IAAI,IAAC,QAAQ,wBAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAQ,KAJ7C,KAAK,CAAC,EAAE,CAKZ,CACT,CAAC,EACD,OAAO,IAAI,CACR,KAAC,iBAAiB,IACd,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,UAAU,EAAE,OAAO,CAAC,UAAU,EAC9B,MAAM,EAAC,SAAS,GAClB,CACL,IACC,CACT,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -6,5 +6,6 @@ export { InputArea } from './InputArea.js';
|
|
|
6
6
|
export { MarkdownText } from './MarkdownText.js';
|
|
7
7
|
export { Spinner } from './Spinner.js';
|
|
8
8
|
export { StreamingText } from './StreamingText.js';
|
|
9
|
-
export { ToolCallIndicator } from './ToolCallIndicator.js';
|
|
9
|
+
export { ToolCallIndicator, ToolCallHistory } from './ToolCallIndicator.js';
|
|
10
|
+
export type { ToolCallRecord } from './ToolCallIndicator.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -6,5 +6,5 @@ export { InputArea } from './InputArea.js';
|
|
|
6
6
|
export { MarkdownText } from './MarkdownText.js';
|
|
7
7
|
export { Spinner } from './Spinner.js';
|
|
8
8
|
export { StreamingText } from './StreamingText.js';
|
|
9
|
-
export { ToolCallIndicator } from './ToolCallIndicator.js';
|
|
9
|
+
export { ToolCallIndicator, ToolCallHistory } from './ToolCallIndicator.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Custom hook for managing agent streaming communication
|
|
4
4
|
*/
|
|
5
5
|
import type { McpState, McpToolResult } from '../../agent/types.js';
|
|
6
|
+
import type { ToolCallRecord } from '../components/ToolCallIndicator.js';
|
|
6
7
|
export interface Message {
|
|
7
8
|
id: string;
|
|
8
9
|
role: 'user' | 'assistant';
|
|
@@ -31,6 +32,7 @@ export interface UseAgentStreamReturn {
|
|
|
31
32
|
type: 'tool' | 'mcp';
|
|
32
33
|
serverName?: string;
|
|
33
34
|
} | null;
|
|
35
|
+
toolCallHistory: ToolCallRecord[];
|
|
34
36
|
streamingText: string;
|
|
35
37
|
conversationId: string | undefined;
|
|
36
38
|
sendMessage: (message: string) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentStream.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useAgentStream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAgentStream.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useAgentStream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;KAC7C,CAAC,CAAC;CACN;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpF,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CA+MxF"}
|
|
@@ -11,14 +11,24 @@ export function useAgentStream(options = {}) {
|
|
|
11
11
|
const [messages, setMessages] = useState([]);
|
|
12
12
|
const [isProcessing, setIsProcessing] = useState(false);
|
|
13
13
|
const [currentToolCall, setCurrentToolCall] = useState(null);
|
|
14
|
+
const [toolCallHistory, setToolCallHistory] = useState([]);
|
|
14
15
|
const [streamingText, setStreamingText] = useState('');
|
|
15
16
|
const [conversationId, setConversationId] = useState(resumeConversationId);
|
|
16
17
|
const conversationIdRef = useRef(resumeConversationId);
|
|
17
18
|
const toolTrackerRef = useRef(createToolCallTracker());
|
|
19
|
+
/** Add or update a tool call record in history */
|
|
20
|
+
const trackToolCall = useCallback((id, name, type, status, serverName) => {
|
|
21
|
+
setToolCallHistory(prev => {
|
|
22
|
+
const existing = prev.findIndex(t => t.id === id);
|
|
23
|
+
if (existing >= 0) {
|
|
24
|
+
const updated = [...prev];
|
|
25
|
+
updated[existing] = { ...updated[existing], status };
|
|
26
|
+
return updated;
|
|
27
|
+
}
|
|
28
|
+
return [...prev, { id, name, type, serverName, status, timestamp: Date.now() }];
|
|
29
|
+
});
|
|
30
|
+
}, []);
|
|
18
31
|
const abort = useCallback(() => {
|
|
19
|
-
// Call abort directly on the singleton agentService instance.
|
|
20
|
-
// This avoids the race condition where the returned abort function
|
|
21
|
-
// was only available after the stream completed (which defeats the purpose).
|
|
22
32
|
agentService.abort();
|
|
23
33
|
setIsProcessing(false);
|
|
24
34
|
setCurrentToolCall(null);
|
|
@@ -34,6 +44,7 @@ export function useAgentStream(options = {}) {
|
|
|
34
44
|
}]);
|
|
35
45
|
setIsProcessing(true);
|
|
36
46
|
setStreamingText('');
|
|
47
|
+
setToolCallHistory([]);
|
|
37
48
|
toolTrackerRef.current.clear();
|
|
38
49
|
let responseText = '';
|
|
39
50
|
const callbacks = {
|
|
@@ -48,15 +59,17 @@ export function useAgentStream(options = {}) {
|
|
|
48
59
|
},
|
|
49
60
|
onToolCall: (id, name) => {
|
|
50
61
|
setCurrentToolCall({ name, type: 'tool' });
|
|
62
|
+
trackToolCall(id, name, 'tool', 'pending');
|
|
51
63
|
if (showToolCalls) {
|
|
52
64
|
toolTrackerRef.current.start(id, name, 'local');
|
|
53
65
|
}
|
|
54
66
|
},
|
|
55
67
|
onToolResult: (id, _name, result) => {
|
|
56
68
|
setCurrentToolCall(null);
|
|
69
|
+
const isError = result && typeof result === 'object' &&
|
|
70
|
+
result.isError === true;
|
|
71
|
+
trackToolCall(id, _name, 'tool', isError ? 'error' : 'completed');
|
|
57
72
|
if (showToolCalls) {
|
|
58
|
-
const isError = result && typeof result === 'object' &&
|
|
59
|
-
result.isError === true;
|
|
60
73
|
if (isError) {
|
|
61
74
|
toolTrackerRef.current.error(id, 'Tool returned error');
|
|
62
75
|
}
|
|
@@ -67,6 +80,7 @@ export function useAgentStream(options = {}) {
|
|
|
67
80
|
},
|
|
68
81
|
onMcpToolCall: async (callId, serverName, toolName, args) => {
|
|
69
82
|
setCurrentToolCall({ name: toolName, type: 'mcp', serverName });
|
|
83
|
+
trackToolCall(callId, toolName, 'mcp', 'pending', serverName);
|
|
70
84
|
if (showToolCalls) {
|
|
71
85
|
toolTrackerRef.current.start(callId, toolName, 'mcp', args, serverName);
|
|
72
86
|
}
|
|
@@ -74,6 +88,7 @@ export function useAgentStream(options = {}) {
|
|
|
74
88
|
try {
|
|
75
89
|
const result = await onMcpToolCall(callId, serverName, toolName, args);
|
|
76
90
|
setCurrentToolCall(null);
|
|
91
|
+
trackToolCall(callId, toolName, 'mcp', result.isError ? 'error' : 'completed', serverName);
|
|
77
92
|
if (showToolCalls) {
|
|
78
93
|
if (result.isError) {
|
|
79
94
|
const errorText = result.content[0]?.text || 'Unknown error';
|
|
@@ -87,6 +102,7 @@ export function useAgentStream(options = {}) {
|
|
|
87
102
|
}
|
|
88
103
|
catch (error) {
|
|
89
104
|
setCurrentToolCall(null);
|
|
105
|
+
trackToolCall(callId, toolName, 'mcp', 'error', serverName);
|
|
90
106
|
if (showToolCalls) {
|
|
91
107
|
toolTrackerRef.current.error(callId, error.message);
|
|
92
108
|
}
|
|
@@ -97,14 +113,29 @@ export function useAgentStream(options = {}) {
|
|
|
97
113
|
}
|
|
98
114
|
}
|
|
99
115
|
setCurrentToolCall(null);
|
|
116
|
+
trackToolCall(callId, toolName, 'mcp', 'error', serverName);
|
|
100
117
|
return {
|
|
101
118
|
content: [{ type: 'text', text: 'MCP not available' }],
|
|
102
119
|
isError: true,
|
|
103
120
|
};
|
|
104
121
|
},
|
|
122
|
+
onGrounding: (sources) => {
|
|
123
|
+
if (sources.length > 0) {
|
|
124
|
+
const sourceLines = sources
|
|
125
|
+
.filter(s => s.title || s.url)
|
|
126
|
+
.map(s => ` - ${s.title || s.url}${s.url ? ` (${s.url})` : ''}`)
|
|
127
|
+
.join('\n');
|
|
128
|
+
if (sourceLines) {
|
|
129
|
+
const groundingInfo = `\n\nSources:\n${sourceLines}\n`;
|
|
130
|
+
setStreamingText(prev => prev + groundingInfo);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
105
134
|
onDone: (convId) => {
|
|
106
|
-
|
|
107
|
-
|
|
135
|
+
if (convId) {
|
|
136
|
+
conversationIdRef.current = convId;
|
|
137
|
+
setConversationId(convId);
|
|
138
|
+
}
|
|
108
139
|
// Add assistant message
|
|
109
140
|
const assistantMessageId = `assistant-${Date.now()}`;
|
|
110
141
|
setMessages(prev => [...prev, {
|
|
@@ -114,6 +145,7 @@ export function useAgentStream(options = {}) {
|
|
|
114
145
|
}]);
|
|
115
146
|
setIsProcessing(false);
|
|
116
147
|
setCurrentToolCall(null);
|
|
148
|
+
setToolCallHistory([]);
|
|
117
149
|
setStreamingText('');
|
|
118
150
|
},
|
|
119
151
|
onSparkletCreated: (hashKey, title) => {
|
|
@@ -151,11 +183,12 @@ export function useAgentStream(options = {}) {
|
|
|
151
183
|
catch (error) {
|
|
152
184
|
callbacks.onError?.(error.message);
|
|
153
185
|
}
|
|
154
|
-
}, [mcpState, onMcpToolCall, cliMode, showToolCalls]);
|
|
186
|
+
}, [mcpState, onMcpToolCall, cliMode, showToolCalls, trackToolCall]);
|
|
155
187
|
return {
|
|
156
188
|
messages,
|
|
157
189
|
isProcessing,
|
|
158
190
|
currentToolCall,
|
|
191
|
+
toolCallHistory,
|
|
159
192
|
streamingText,
|
|
160
193
|
conversationId,
|
|
161
194
|
sendMessage,
|