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.
Files changed (128) hide show
  1. package/dist/agent/service.d.ts +5 -0
  2. package/dist/agent/service.d.ts.map +1 -1
  3. package/dist/agent/service.js +8 -4
  4. package/dist/agent/service.js.map +1 -1
  5. package/dist/agent/types.d.ts +12 -2
  6. package/dist/agent/types.d.ts.map +1 -1
  7. package/dist/agent/utils.d.ts.map +1 -1
  8. package/dist/agent/utils.js +47 -32
  9. package/dist/agent/utils.js.map +1 -1
  10. package/dist/api/auth.d.ts +7 -0
  11. package/dist/api/auth.d.ts.map +1 -1
  12. package/dist/api/auth.js +70 -0
  13. package/dist/api/auth.js.map +1 -1
  14. package/dist/api/client.d.ts.map +1 -1
  15. package/dist/api/client.js +101 -7
  16. package/dist/api/client.js.map +1 -1
  17. package/dist/api/devices.d.ts +35 -0
  18. package/dist/api/devices.d.ts.map +1 -0
  19. package/dist/api/devices.js +77 -0
  20. package/dist/api/devices.js.map +1 -0
  21. package/dist/api/todo.d.ts +21 -0
  22. package/dist/api/todo.d.ts.map +1 -1
  23. package/dist/api/todo.js +18 -0
  24. package/dist/api/todo.js.map +1 -1
  25. package/dist/cli.js +17 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/completion.d.ts +7 -0
  28. package/dist/commands/completion.d.ts.map +1 -0
  29. package/dist/commands/completion.js +217 -0
  30. package/dist/commands/completion.js.map +1 -0
  31. package/dist/commands/config.d.ts +7 -0
  32. package/dist/commands/config.d.ts.map +1 -0
  33. package/dist/commands/config.js +107 -0
  34. package/dist/commands/config.js.map +1 -0
  35. package/dist/commands/devices.d.ts +7 -0
  36. package/dist/commands/devices.d.ts.map +1 -0
  37. package/dist/commands/devices.js +86 -0
  38. package/dist/commands/devices.js.map +1 -0
  39. package/dist/commands/history.d.ts +20 -0
  40. package/dist/commands/history.d.ts.map +1 -1
  41. package/dist/commands/history.js +160 -10
  42. package/dist/commands/history.js.map +1 -1
  43. package/dist/commands/login.d.ts.map +1 -1
  44. package/dist/commands/login.js +110 -1
  45. package/dist/commands/login.js.map +1 -1
  46. package/dist/commands/logout.d.ts.map +1 -1
  47. package/dist/commands/logout.js +11 -0
  48. package/dist/commands/logout.js.map +1 -1
  49. package/dist/commands/mcp.d.ts +7 -0
  50. package/dist/commands/mcp.d.ts.map +1 -0
  51. package/dist/commands/mcp.js +179 -0
  52. package/dist/commands/mcp.js.map +1 -0
  53. package/dist/commands/sparklet.d.ts +7 -0
  54. package/dist/commands/sparklet.d.ts.map +1 -0
  55. package/dist/commands/sparklet.js +145 -0
  56. package/dist/commands/sparklet.js.map +1 -0
  57. package/dist/commands/tasks.d.ts.map +1 -1
  58. package/dist/commands/tasks.js +48 -1
  59. package/dist/commands/tasks.js.map +1 -1
  60. package/dist/commands/worker.d.ts.map +1 -1
  61. package/dist/commands/worker.js +83 -27
  62. package/dist/commands/worker.js.map +1 -1
  63. package/dist/mcp/cli-agent-tools.d.ts.map +1 -1
  64. package/dist/mcp/cli-agent-tools.js +4 -2
  65. package/dist/mcp/cli-agent-tools.js.map +1 -1
  66. package/dist/mcp/client.d.ts +5 -0
  67. package/dist/mcp/client.d.ts.map +1 -1
  68. package/dist/mcp/client.js +23 -2
  69. package/dist/mcp/client.js.map +1 -1
  70. package/dist/mcp/system.d.ts.map +1 -1
  71. package/dist/mcp/system.js +291 -3
  72. package/dist/mcp/system.js.map +1 -1
  73. package/dist/mcp/tools.d.ts.map +1 -1
  74. package/dist/mcp/tools.js +287 -4
  75. package/dist/mcp/tools.js.map +1 -1
  76. package/dist/mcp/worker-tools.js +1 -1
  77. package/dist/mcp/worker-tools.js.map +1 -1
  78. package/dist/ui/App.d.ts.map +1 -1
  79. package/dist/ui/App.js +4 -4
  80. package/dist/ui/App.js.map +1 -1
  81. package/dist/ui/components/InputArea.d.ts +3 -1
  82. package/dist/ui/components/InputArea.d.ts.map +1 -1
  83. package/dist/ui/components/InputArea.js +164 -26
  84. package/dist/ui/components/InputArea.js.map +1 -1
  85. package/dist/ui/components/ToolCallIndicator.d.ts +23 -0
  86. package/dist/ui/components/ToolCallIndicator.d.ts.map +1 -1
  87. package/dist/ui/components/ToolCallIndicator.js +31 -4
  88. package/dist/ui/components/ToolCallIndicator.js.map +1 -1
  89. package/dist/ui/components/index.d.ts +2 -1
  90. package/dist/ui/components/index.d.ts.map +1 -1
  91. package/dist/ui/components/index.js +1 -1
  92. package/dist/ui/components/index.js.map +1 -1
  93. package/dist/ui/hooks/useAgentStream.d.ts +2 -0
  94. package/dist/ui/hooks/useAgentStream.d.ts.map +1 -1
  95. package/dist/ui/hooks/useAgentStream.js +41 -8
  96. package/dist/ui/hooks/useAgentStream.js.map +1 -1
  97. package/dist/ui/hooks/useCommands.d.ts +4 -5
  98. package/dist/ui/hooks/useCommands.d.ts.map +1 -1
  99. package/dist/ui/hooks/useCommands.js +76 -11
  100. package/dist/ui/hooks/useCommands.js.map +1 -1
  101. package/dist/utils/config.d.ts +18 -0
  102. package/dist/utils/config.d.ts.map +1 -1
  103. package/dist/utils/config.js +39 -3
  104. package/dist/utils/config.js.map +1 -1
  105. package/dist/utils/output.d.ts +25 -8
  106. package/dist/utils/output.d.ts.map +1 -1
  107. package/dist/utils/output.js +46 -9
  108. package/dist/utils/output.js.map +1 -1
  109. package/dist/worker/executors/articulate.d.ts +23 -0
  110. package/dist/worker/executors/articulate.d.ts.map +1 -0
  111. package/dist/worker/executors/articulate.js +151 -0
  112. package/dist/worker/executors/articulate.js.map +1 -0
  113. package/dist/worker/index.d.ts +1 -0
  114. package/dist/worker/index.d.ts.map +1 -1
  115. package/dist/worker/index.js +1 -0
  116. package/dist/worker/index.js.map +1 -1
  117. package/dist/worker/service.d.ts +1 -0
  118. package/dist/worker/service.d.ts.map +1 -1
  119. package/dist/worker/service.js +8 -0
  120. package/dist/worker/service.js.map +1 -1
  121. package/dist/worker/supervisor.d.ts.map +1 -1
  122. package/dist/worker/supervisor.js +59 -21
  123. package/dist/worker/supervisor.js.map +1 -1
  124. package/dist/worker/types.d.ts +3 -1
  125. package/dist/worker/types.d.ts.map +1 -1
  126. package/dist/worker/types.js +20 -2
  127. package/dist/worker/types.js.map +1 -1
  128. 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
- // Update callbacks ref in useEffect to avoid assignments during render
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 is handled centrally in App.tsx via useInput
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
- // Handle Tab key (0x09)
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
- // Handle Enter (carriage return or newline)
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
- // Use setTimeout to call onSubmit after state update completes
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
- // Handle Backspace (0x7f or 0x08)
169
+ // Backspace
80
170
  if (input === '\x7f' || input === '\x08') {
81
- setValue(prev => prev.slice(0, -1));
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
- // Handle Escape - clear input
85
- if (input === '\x1b') {
86
- setValue('');
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
- // Handle regular printable characters
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(prev => prev + input);
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(prev => prev + input);
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
- // Only depend on stdin/setRawMode/disabled - use refs for callbacks
113
- }, [stdin, setRawMode, disabled]);
114
- 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: value }), _jsx(Text, { color: INK_COLORS.primary, children: "\u258C" })] }))] }), !disabled && suggestions.length > 0 && (_jsxs(Box, { marginLeft: 2, marginTop: 0, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "\u250C\u2500 Commands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }), suggestions.slice(0, 5).map((suggestion, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { color: INK_COLORS.success, children: suggestion })] }, i))), _jsx(Text, { dimColor: true, children: "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Tab to complete" })] })), _jsx(Box, { marginTop: 0, children: _jsx(Text, { color: "gray", children: separatorLine }) })] }));
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":"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"}
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;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,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,CA0B9D,CAAC"}
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
- export const ToolCallIndicator = ({ name, type = 'tool', serverName, status = 'pending' }) => {
5
- const icon = type === 'mcp' ? '🔌' : '🔧';
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 })), _jsxs(Text, { dimColor: true, children: [" ", icon, " "] }), serverName && _jsx(Text, { color: "yellow", children: serverName }), serverName && _jsx(Text, { dimColor: true, children: " \u2192 " }), _jsx(Text, { color: "cyan", children: name }), status === 'pending' && _jsx(Text, { dimColor: true, children: "..." })] }));
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":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,UAAU,MAAM,aAAa,CAAC;AASrC,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAChE,IAAI,EACJ,IAAI,GAAG,MAAM,EACb,UAAU,EACV,MAAM,GAAG,SAAS,EACrB,EAAE,EAAE;IACD,MAAM,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,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,MAAC,IAAI,IAAC,QAAQ,wBAAG,IAAI,SAAS,EAC7B,UAAU,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,UAAU,GAAQ,EACtD,UAAU,IAAI,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACxC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,IAAI,GAAQ,EAC/B,MAAM,KAAK,SAAS,IAAI,KAAC,IAAI,IAAC,QAAQ,0BAAW,IAChD,CACT,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"ToolCallIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/ToolCallIndicator.tsx"],"names":[],"mappings":"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"}
@@ -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;AAG1F,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,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,CA4KxF"}
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
- conversationIdRef.current = convId;
107
- setConversationId(convId);
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,