@redplanethq/corebrain 2.8.6 → 2.8.10
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/commands/coding/read.d.ts +0 -3
- package/dist/commands/coding/read.d.ts.map +1 -1
- package/dist/commands/coding/read.js +15 -14
- package/dist/commands/coding/read.js.map +1 -1
- package/dist/server/tools/coding-tools.d.ts.map +1 -1
- package/dist/server/tools/coding-tools.js +52 -24
- package/dist/server/tools/coding-tools.js.map +1 -1
- package/dist/tui/chat.d.ts.map +1 -1
- package/dist/tui/chat.js +162 -59
- package/dist/tui/chat.js.map +1 -1
- package/dist/tui/components/approval-bar.d.ts +14 -0
- package/dist/tui/components/approval-bar.d.ts.map +1 -0
- package/dist/tui/components/approval-bar.js +32 -0
- package/dist/tui/components/approval-bar.js.map +1 -0
- package/dist/tui/components/approval-panel.d.ts +31 -0
- package/dist/tui/components/approval-panel.d.ts.map +1 -0
- package/dist/tui/components/approval-panel.js +184 -0
- package/dist/tui/components/approval-panel.js.map +1 -0
- package/dist/tui/components/dashboard-view.js +1 -1
- package/dist/tui/components/dashboard-view.js.map +1 -1
- package/dist/tui/components/status-line.d.ts +2 -0
- package/dist/tui/components/status-line.d.ts.map +1 -1
- package/dist/tui/components/status-line.js +12 -3
- package/dist/tui/components/status-line.js.map +1 -1
- package/dist/tui/components/tool-call-item.d.ts +26 -0
- package/dist/tui/components/tool-call-item.d.ts.map +1 -1
- package/dist/tui/components/tool-call-item.js +53 -3
- package/dist/tui/components/tool-call-item.js.map +1 -1
- package/dist/tui/components/widgets-view.js +3 -3
- package/dist/tui/components/widgets-view.js.map +1 -1
- package/dist/tui/hooks/use-conversation.d.ts +2 -0
- package/dist/tui/hooks/use-conversation.d.ts.map +1 -1
- package/dist/tui/hooks/use-conversation.js +313 -122
- package/dist/tui/hooks/use-conversation.js.map +1 -1
- package/dist/tui/utils/avatar.d.ts +27 -0
- package/dist/tui/utils/avatar.d.ts.map +1 -0
- package/dist/tui/utils/avatar.js +96 -0
- package/dist/tui/utils/avatar.js.map +1 -0
- package/dist/tui/utils/bundle-loader.d.ts +3 -0
- package/dist/tui/utils/bundle-loader.d.ts.map +1 -0
- package/dist/tui/utils/bundle-loader.js +49 -0
- package/dist/tui/utils/bundle-loader.js.map +1 -0
- package/dist/tui/utils/integration-loader.d.ts +14 -0
- package/dist/tui/utils/integration-loader.d.ts.map +1 -0
- package/dist/tui/utils/integration-loader.js +6 -0
- package/dist/tui/utils/integration-loader.js.map +1 -0
- package/dist/tui/utils/stream.d.ts +37 -5
- package/dist/tui/utils/stream.d.ts.map +1 -1
- package/dist/tui/utils/stream.js +70 -24
- package/dist/tui/utils/stream.js.map +1 -1
- package/dist/tui/utils/widget-loader.d.ts +19 -3
- package/dist/tui/utils/widget-loader.d.ts.map +1 -1
- package/dist/tui/utils/widget-loader.js +4 -53
- package/dist/tui/utils/widget-loader.js.map +1 -1
- package/dist/types/config.d.ts +1 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/coding-agents/claude-code.d.ts +3 -1
- package/dist/utils/coding-agents/claude-code.d.ts.map +1 -1
- package/dist/utils/coding-agents/claude-code.js +35 -0
- package/dist/utils/coding-agents/claude-code.js.map +1 -1
- package/dist/utils/coding-agents/codex.d.ts +3 -1
- package/dist/utils/coding-agents/codex.d.ts.map +1 -1
- package/dist/utils/coding-agents/codex.js +40 -0
- package/dist/utils/coding-agents/codex.js.map +1 -1
- package/dist/utils/coding-agents/index.d.ts +6 -3
- package/dist/utils/coding-agents/index.d.ts.map +1 -1
- package/dist/utils/coding-agents/index.js +17 -5
- package/dist/utils/coding-agents/index.js.map +1 -1
- package/dist/utils/coding-agents/types.d.ts +14 -0
- package/dist/utils/coding-agents/types.d.ts.map +1 -1
- package/dist/utils/coding-agents/types.js.map +1 -1
- package/package.json +4 -3
|
@@ -1,12 +1,310 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { appendFileSync } from 'node:fs';
|
|
2
|
+
import { createConversationApi, streamConversation, streamConversationApproval } from '../utils/stream.js';
|
|
2
3
|
import { ToolCallItem } from '../components/tool-call-item.js';
|
|
3
4
|
// Tools whose sub-calls should be shown as nested children
|
|
4
|
-
const CONTAINER_TOOLS = new Set([
|
|
5
|
+
const CONTAINER_TOOLS = new Set([
|
|
6
|
+
'gather_context',
|
|
7
|
+
'take_action',
|
|
8
|
+
'agent-take_action',
|
|
9
|
+
'agent-gather_context',
|
|
10
|
+
'agent-think',
|
|
11
|
+
]);
|
|
12
|
+
// ── Convert Mastra data-tool-agent payload to OutputPart[] ────────────────────
|
|
13
|
+
function mastraDataToOutputParts(data) {
|
|
14
|
+
const parts = [];
|
|
15
|
+
// Use latest step's data if available, otherwise top-level
|
|
16
|
+
const steps = Array.isArray(data.steps) ? data.steps : [];
|
|
17
|
+
const source = steps.length > 0 ? steps[steps.length - 1] : data;
|
|
18
|
+
// Merge calls from latest step + top-level
|
|
19
|
+
const stepCalls = source.toolCalls ?? [];
|
|
20
|
+
const topCalls = steps.length > 0 ? (data.toolCalls ?? []) : [];
|
|
21
|
+
const stepCallIds = new Set(stepCalls.map(tc => (tc.payload ?? tc).toolCallId));
|
|
22
|
+
const mergedCalls = [
|
|
23
|
+
...stepCalls,
|
|
24
|
+
...topCalls.filter(tc => !stepCallIds.has((tc.payload ?? tc).toolCallId)),
|
|
25
|
+
];
|
|
26
|
+
// Merge results from latest step + top-level
|
|
27
|
+
const stepResults = source.toolResults ?? [];
|
|
28
|
+
const topResults = steps.length > 0 ? (data.toolResults ?? []) : [];
|
|
29
|
+
const stepResultIds = new Set(stepResults.map(r => (r.payload ?? r).toolCallId));
|
|
30
|
+
const allResults = [
|
|
31
|
+
...stepResults,
|
|
32
|
+
...topResults.filter(r => !stepResultIds.has((r.payload ?? r).toolCallId)),
|
|
33
|
+
];
|
|
34
|
+
const resultMap = new Map();
|
|
35
|
+
for (const r of allResults) {
|
|
36
|
+
const res = r.payload ?? r;
|
|
37
|
+
resultMap.set(res.toolCallId, res.result);
|
|
38
|
+
}
|
|
39
|
+
const seenCallIds = new Set();
|
|
40
|
+
for (const tc of mergedCalls) {
|
|
41
|
+
const call = tc.payload ?? tc;
|
|
42
|
+
if (seenCallIds.has(call.toolCallId))
|
|
43
|
+
continue;
|
|
44
|
+
seenCallIds.add(call.toolCallId);
|
|
45
|
+
const hasResult = resultMap.has(call.toolCallId);
|
|
46
|
+
const part = {
|
|
47
|
+
type: `tool-${call.toolName}`,
|
|
48
|
+
toolCallId: call.toolCallId,
|
|
49
|
+
input: call.args,
|
|
50
|
+
state: hasResult ? 'output-available' : 'in-progress',
|
|
51
|
+
...(hasResult && { output: resultMap.get(call.toolCallId) }),
|
|
52
|
+
};
|
|
53
|
+
parts.push(part);
|
|
54
|
+
}
|
|
55
|
+
const text = source.text ?? data.text;
|
|
56
|
+
if (text) {
|
|
57
|
+
parts.push({ type: 'text', text, state: 'done' });
|
|
58
|
+
}
|
|
59
|
+
return parts;
|
|
60
|
+
}
|
|
5
61
|
// ── Factory (hook-like, no React required) ────────────────────────────────────
|
|
62
|
+
let streamCounter = 0;
|
|
6
63
|
export function createConversation(baseUrl, apiKey) {
|
|
7
64
|
let conversationId = null;
|
|
8
65
|
let incognito = false;
|
|
9
66
|
let activeAbortController = null;
|
|
67
|
+
// Equivalent of webapp's cachedNestedPartsRef — persists agent item across streams
|
|
68
|
+
let savedAgentItem = null;
|
|
69
|
+
// ── Shared stream event processor ─────────────────────────────────────────
|
|
70
|
+
async function processStream(gen, callbacks, controller) {
|
|
71
|
+
const streamNum = ++streamCounter;
|
|
72
|
+
const logFile = `/tmp/core-stream-${streamNum}.log`;
|
|
73
|
+
const activeTools = new Map();
|
|
74
|
+
const toolNameMap = new Map(); // toolCallId → toolName
|
|
75
|
+
const toolInputMap = new Map(); // toolCallId → input
|
|
76
|
+
let activeParent = null;
|
|
77
|
+
let lastAgentItem = savedAgentItem; // restored from prior stream (like cachedNestedPartsRef)
|
|
78
|
+
let hadApprovalRequest = false;
|
|
79
|
+
const approvedContainerIds = new Set(); // prevent duplicate approval expansion
|
|
80
|
+
try {
|
|
81
|
+
for await (const event of gen) {
|
|
82
|
+
try {
|
|
83
|
+
appendFileSync(logFile, JSON.stringify(event) + '\n');
|
|
84
|
+
}
|
|
85
|
+
catch { /* ignore */ }
|
|
86
|
+
switch (event.type) {
|
|
87
|
+
case 'text-delta': {
|
|
88
|
+
callbacks.onTextDelta(event.delta);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'tool-input-start': {
|
|
92
|
+
toolNameMap.set(event.toolCallId, event.toolName);
|
|
93
|
+
const item = new ToolCallItem(event.toolName);
|
|
94
|
+
activeTools.set(event.toolCallId, item);
|
|
95
|
+
if (CONTAINER_TOOLS.has(event.toolName)) {
|
|
96
|
+
activeParent = { id: event.toolCallId, item };
|
|
97
|
+
if (event.toolName.startsWith('agent-'))
|
|
98
|
+
lastAgentItem = item;
|
|
99
|
+
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
100
|
+
}
|
|
101
|
+
else if (activeParent) {
|
|
102
|
+
activeParent.item.addChild(item);
|
|
103
|
+
callbacks.onRerender?.();
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'tool-input-delta': {
|
|
111
|
+
activeTools
|
|
112
|
+
.get(event.toolCallId)
|
|
113
|
+
?.appendArgsDelta(event.inputTextDelta);
|
|
114
|
+
callbacks.onRerender?.();
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'tool-input-available': {
|
|
118
|
+
toolInputMap.set(event.toolCallId, event.input);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'tool-call': {
|
|
122
|
+
toolNameMap.set(event.toolCallId, event.toolName);
|
|
123
|
+
toolInputMap.set(event.toolCallId, event.args);
|
|
124
|
+
const item = new ToolCallItem(event.toolName);
|
|
125
|
+
item.setArgs(event.args);
|
|
126
|
+
activeTools.set(event.toolCallId, item);
|
|
127
|
+
if (CONTAINER_TOOLS.has(event.toolName)) {
|
|
128
|
+
activeParent = { id: event.toolCallId, item };
|
|
129
|
+
if (event.toolName.startsWith('agent-'))
|
|
130
|
+
lastAgentItem = item;
|
|
131
|
+
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
132
|
+
}
|
|
133
|
+
else if (activeParent) {
|
|
134
|
+
item.setDone();
|
|
135
|
+
activeParent.item.addChild(item);
|
|
136
|
+
callbacks.onRerender?.();
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 'tool-output-available': {
|
|
144
|
+
const parentItem = activeTools.get(event.toolCallId);
|
|
145
|
+
if (parentItem && event.output) {
|
|
146
|
+
let parts = null;
|
|
147
|
+
if (Array.isArray(event.output.parts)) {
|
|
148
|
+
parts = event.output.parts;
|
|
149
|
+
}
|
|
150
|
+
else if (event.output.toolCalls ?? event.output.toolResults ?? event.output.steps) {
|
|
151
|
+
parts = mastraDataToOutputParts(event.output);
|
|
152
|
+
}
|
|
153
|
+
if (parts)
|
|
154
|
+
parentItem.updateFromOutputParts(parts);
|
|
155
|
+
}
|
|
156
|
+
if (!event.preliminary && activeParent?.id === event.toolCallId) {
|
|
157
|
+
parentItem?.setDone();
|
|
158
|
+
activeParent = null;
|
|
159
|
+
if (lastAgentItem === parentItem)
|
|
160
|
+
lastAgentItem = null;
|
|
161
|
+
}
|
|
162
|
+
callbacks.onRerender?.();
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
case 'tool-result': {
|
|
166
|
+
const item = activeTools.get(event.toolCallId);
|
|
167
|
+
if (item) {
|
|
168
|
+
item.setDone(event.result);
|
|
169
|
+
if (activeParent?.id === event.toolCallId) {
|
|
170
|
+
activeParent = null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
callbacks.onRerender?.();
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'tool-approval-request': {
|
|
177
|
+
hadApprovalRequest = true;
|
|
178
|
+
const toolName = toolNameMap.get(event.toolCallId) ?? event.toolCallId;
|
|
179
|
+
// Save agent item unconditionally — must happen before any early break
|
|
180
|
+
// so the next processStream (approval resume stream) can look up children.
|
|
181
|
+
if (lastAgentItem)
|
|
182
|
+
savedAgentItem = lastAgentItem;
|
|
183
|
+
// Mirror webapp's findPendingApprovals: expand container tools into
|
|
184
|
+
// their pending children so the user sees the actual leaf tools.
|
|
185
|
+
const containerItem = activeTools.get(event.toolCallId);
|
|
186
|
+
const isContainerTool = toolName === 'agent-take_action' || toolName === 'take_action';
|
|
187
|
+
if (isContainerTool && containerItem) {
|
|
188
|
+
// Deduplicate: parallel tool calls fire multiple approval events for
|
|
189
|
+
// the same container. Only expand once — one approval covers all children.
|
|
190
|
+
if (approvedContainerIds.has(event.toolCallId))
|
|
191
|
+
break;
|
|
192
|
+
approvedContainerIds.add(event.toolCallId);
|
|
193
|
+
const pendingChildren = containerItem.getPendingChildren();
|
|
194
|
+
if (pendingChildren.length > 0) {
|
|
195
|
+
for (const child of pendingChildren) {
|
|
196
|
+
callbacks.onApprovalRequested?.(event.approvalId, event.toolCallId, child.toolName, child.input);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Fall back: if toolName wasn't resolved, check children cached from first stream
|
|
202
|
+
let resolvedName = toolName;
|
|
203
|
+
let toolInput = toolInputMap.get(event.toolCallId);
|
|
204
|
+
if (resolvedName === event.toolCallId && lastAgentItem) {
|
|
205
|
+
const childInfo = lastAgentItem.getChildInfo(event.toolCallId);
|
|
206
|
+
if (childInfo) {
|
|
207
|
+
resolvedName = childInfo.toolName;
|
|
208
|
+
toolInput = childInfo.input;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
callbacks.onApprovalRequested?.(event.approvalId, event.toolCallId, resolvedName, toolInput);
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case 'data-tool-agent': {
|
|
215
|
+
// Mirror webapp's mergeAgentParts: agentData = raw.data ?? raw
|
|
216
|
+
const agentData = event.data ?? event;
|
|
217
|
+
if (agentData.toolCalls || agentData.toolResults || agentData.steps) {
|
|
218
|
+
// Orphan in resumed approval stream — create synthetic item like webapp
|
|
219
|
+
if (!lastAgentItem) {
|
|
220
|
+
lastAgentItem = new ToolCallItem('agent-take_action');
|
|
221
|
+
}
|
|
222
|
+
const allAgentCalls = [
|
|
223
|
+
...(agentData.toolCalls ?? []),
|
|
224
|
+
...(Array.isArray(agentData.steps)
|
|
225
|
+
? agentData.steps.flatMap((s) => s.toolCalls ?? [])
|
|
226
|
+
: []),
|
|
227
|
+
];
|
|
228
|
+
for (const tc of allAgentCalls) {
|
|
229
|
+
const call = tc.payload ?? tc;
|
|
230
|
+
if (call.toolCallId && call.toolName) {
|
|
231
|
+
toolNameMap.set(call.toolCallId, call.toolName);
|
|
232
|
+
if (call.args)
|
|
233
|
+
toolInputMap.set(call.toolCallId, call.args);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const parts = mastraDataToOutputParts(agentData);
|
|
237
|
+
if (parts.length > 0) {
|
|
238
|
+
lastAgentItem.updateFromOutputParts(parts);
|
|
239
|
+
callbacks.onRerender?.();
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
// Post-approval pattern: toolCalls is [] but toolResults has results
|
|
243
|
+
// for children registered in an earlier snapshot — mark them done.
|
|
244
|
+
const allResults = [
|
|
245
|
+
...(agentData.toolResults ?? []),
|
|
246
|
+
...(Array.isArray(agentData.steps)
|
|
247
|
+
? agentData.steps.flatMap((s) => s.toolResults ?? [])
|
|
248
|
+
: []),
|
|
249
|
+
];
|
|
250
|
+
if (allResults.length > 0) {
|
|
251
|
+
const resultMap = new Map();
|
|
252
|
+
for (const r of allResults) {
|
|
253
|
+
const res = r.payload ?? r;
|
|
254
|
+
if (res.toolCallId)
|
|
255
|
+
resultMap.set(res.toolCallId, res.result);
|
|
256
|
+
}
|
|
257
|
+
lastAgentItem.markChildrenDoneByIds(resultMap);
|
|
258
|
+
callbacks.onRerender?.();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case 'finish-step': {
|
|
265
|
+
for (const item of activeTools.values()) {
|
|
266
|
+
item.setDone();
|
|
267
|
+
}
|
|
268
|
+
activeParent = null;
|
|
269
|
+
lastAgentItem = null;
|
|
270
|
+
activeTools.clear();
|
|
271
|
+
callbacks.onStepFinish?.();
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
case 'error': {
|
|
275
|
+
if (event.error === 'terminated')
|
|
276
|
+
break;
|
|
277
|
+
callbacks.onError?.(new Error(event.error));
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
default:
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Only fire finish if this wasn't an approval pause
|
|
285
|
+
if (!hadApprovalRequest) {
|
|
286
|
+
callbacks.onFinish?.();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
291
|
+
callbacks.onAbort?.();
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
295
|
+
if (msg === 'terminated') {
|
|
296
|
+
if (!hadApprovalRequest)
|
|
297
|
+
callbacks.onFinish?.();
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
callbacks.onError?.(err instanceof Error ? err : new Error(msg));
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
if (activeAbortController === controller) {
|
|
304
|
+
activeAbortController = null;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
10
308
|
return {
|
|
11
309
|
get conversationId() {
|
|
12
310
|
return conversationId;
|
|
@@ -20,6 +318,7 @@ export function createConversation(baseUrl, apiKey) {
|
|
|
20
318
|
},
|
|
21
319
|
clear() {
|
|
22
320
|
conversationId = null;
|
|
321
|
+
savedAgentItem = null;
|
|
23
322
|
},
|
|
24
323
|
resume(id) {
|
|
25
324
|
conversationId = id;
|
|
@@ -30,131 +329,23 @@ export function createConversation(baseUrl, apiKey) {
|
|
|
30
329
|
async send(message, callbacks) {
|
|
31
330
|
const controller = new AbortController();
|
|
32
331
|
activeAbortController = controller;
|
|
33
|
-
|
|
34
|
-
|
|
332
|
+
if (!conversationId) {
|
|
333
|
+
try {
|
|
35
334
|
conversationId = await createConversationApi(baseUrl, apiKey, message, incognito);
|
|
36
335
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
let activeParent = null;
|
|
40
|
-
for await (const event of streamConversation(baseUrl, apiKey, conversationId, message, controller.signal)) {
|
|
41
|
-
switch (event.type) {
|
|
42
|
-
case 'text-delta': {
|
|
43
|
-
callbacks.onTextDelta(event.delta);
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
case 'tool-input-start': {
|
|
47
|
-
const item = new ToolCallItem(event.toolName);
|
|
48
|
-
activeTools.set(event.toolCallId, item);
|
|
49
|
-
if (CONTAINER_TOOLS.has(event.toolName)) {
|
|
50
|
-
// Container tool — show at top level, track as parent
|
|
51
|
-
activeParent = { id: event.toolCallId, item };
|
|
52
|
-
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
53
|
-
}
|
|
54
|
-
else if (activeParent) {
|
|
55
|
-
// Nested tool — attach as child of the active container
|
|
56
|
-
activeParent.item.addChild(item);
|
|
57
|
-
callbacks.onRerender?.();
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
61
|
-
}
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
case 'tool-input-delta': {
|
|
65
|
-
activeTools
|
|
66
|
-
.get(event.toolCallId)
|
|
67
|
-
?.appendArgsDelta(event.inputTextDelta);
|
|
68
|
-
callbacks.onRerender?.();
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
case 'tool-call': {
|
|
72
|
-
// Non-streaming complete tool call
|
|
73
|
-
const item = new ToolCallItem(event.toolName);
|
|
74
|
-
item.setArgs(event.args);
|
|
75
|
-
activeTools.set(event.toolCallId, item);
|
|
76
|
-
if (CONTAINER_TOOLS.has(event.toolName)) {
|
|
77
|
-
activeParent = { id: event.toolCallId, item };
|
|
78
|
-
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
79
|
-
}
|
|
80
|
-
else if (activeParent) {
|
|
81
|
-
item.setDone();
|
|
82
|
-
activeParent.item.addChild(item);
|
|
83
|
-
callbacks.onRerender?.();
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
callbacks.onToolStart?.(event.toolCallId, event.toolName, item);
|
|
87
|
-
}
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
case 'tool-output-available': {
|
|
91
|
-
// Streaming output from gather_context / take_action —
|
|
92
|
-
// output.parts[] carries nested tool states in real-time
|
|
93
|
-
const parentItem = activeTools.get(event.toolCallId);
|
|
94
|
-
if (parentItem && event.output?.parts) {
|
|
95
|
-
parentItem.updateFromOutputParts(event.output.parts);
|
|
96
|
-
}
|
|
97
|
-
// Mark parent done on final (non-preliminary) update
|
|
98
|
-
if (!event.preliminary && activeParent?.id === event.toolCallId) {
|
|
99
|
-
parentItem?.setDone();
|
|
100
|
-
activeParent = null;
|
|
101
|
-
}
|
|
102
|
-
callbacks.onRerender?.();
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
case 'tool-result': {
|
|
106
|
-
const item = activeTools.get(event.toolCallId);
|
|
107
|
-
if (item) {
|
|
108
|
-
item.setDone(event.result);
|
|
109
|
-
if (activeParent?.id === event.toolCallId) {
|
|
110
|
-
activeParent = null;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
callbacks.onRerender?.();
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case 'finish-step': {
|
|
117
|
-
for (const item of activeTools.values()) {
|
|
118
|
-
item.setDone();
|
|
119
|
-
}
|
|
120
|
-
activeParent = null;
|
|
121
|
-
activeTools.clear();
|
|
122
|
-
callbacks.onStepFinish?.();
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
case 'error': {
|
|
126
|
-
// AI SDK emits "terminated" as a normal end-of-stream signal
|
|
127
|
-
if (event.error === 'terminated')
|
|
128
|
-
break;
|
|
129
|
-
callbacks.onError?.(new Error(event.error));
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
default:
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Stream ended — fire finish once
|
|
137
|
-
callbacks.onFinish?.();
|
|
138
|
-
}
|
|
139
|
-
catch (err) {
|
|
140
|
-
// Aborted by user — not an error
|
|
141
|
-
if (err instanceof Error && err.name === 'AbortError') {
|
|
142
|
-
callbacks.onAbort?.();
|
|
336
|
+
catch (err) {
|
|
337
|
+
callbacks.onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
143
338
|
return;
|
|
144
339
|
}
|
|
145
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
146
|
-
// undici throws "terminated" when the server closes the SSE connection normally
|
|
147
|
-
if (message === 'terminated') {
|
|
148
|
-
callbacks.onFinish?.();
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
callbacks.onError?.(err instanceof Error ? err : new Error(message));
|
|
152
|
-
}
|
|
153
|
-
finally {
|
|
154
|
-
if (activeAbortController === controller) {
|
|
155
|
-
activeAbortController = null;
|
|
156
|
-
}
|
|
157
340
|
}
|
|
341
|
+
await processStream(streamConversation(baseUrl, apiKey, conversationId, message, controller.signal), callbacks, controller);
|
|
342
|
+
},
|
|
343
|
+
async approve(approved, toolCallId, callbacks) {
|
|
344
|
+
if (!conversationId)
|
|
345
|
+
return;
|
|
346
|
+
const controller = new AbortController();
|
|
347
|
+
activeAbortController = controller;
|
|
348
|
+
await processStream(streamConversationApproval(baseUrl, apiKey, conversationId, toolCallId, approved, controller.signal), callbacks, controller);
|
|
158
349
|
},
|
|
159
350
|
};
|
|
160
351
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation.js","sourceRoot":"","sources":["../../../src/tui/hooks/use-conversation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-conversation.js","sourceRoot":"","sources":["../../../src/tui/hooks/use-conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Text } from '@mariozechner/pi-tui';
|
|
2
|
+
import type { Component } from '@mariozechner/pi-tui';
|
|
3
|
+
/**
|
|
4
|
+
* Checks if the current terminal supports inline images.
|
|
5
|
+
* Extends pi-tui's detection with tmux passthrough and explicit override.
|
|
6
|
+
*/
|
|
7
|
+
export declare function supportsImages(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Builds an inline PNG Image component from base64 data.
|
|
10
|
+
* Returns null if terminal doesn't support images.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildImageAvatar(base64Png: string, accentHex: string): Component | null;
|
|
13
|
+
/**
|
|
14
|
+
* Renders a PNG (base64) as colored Unicode half-block characters.
|
|
15
|
+
* Uses ▀ (upper half block) with ANSI 24-bit fg/bg colors to pack
|
|
16
|
+
* 2 pixel rows into each terminal line, preserving aspect ratio.
|
|
17
|
+
* Works in any terminal that supports truecolor (no Kitty/iTerm2 needed).
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildColorBlockAvatar(base64Png: string, targetCols?: number): Text;
|
|
20
|
+
/**
|
|
21
|
+
* Returns the best available avatar component:
|
|
22
|
+
* - Inline PNG image (if terminal supports Kitty/iTerm2 protocol)
|
|
23
|
+
* - Colored half-block rendering (truecolor, works everywhere)
|
|
24
|
+
* - Deterministic accent-colored pixel grid (final fallback, no PNG needed)
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildAvatar(name: string, accentHex: string, base64Png?: string | null): Component;
|
|
27
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/tui/utils/avatar.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,IAAI,EAKJ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAkBxC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAWvF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,IAAI,CA8B9E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,SAAS,CAcX"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { decode as decodePng } from 'fast-png';
|
|
3
|
+
import { Text, Image, getPngDimensions, getCapabilities, resetCapabilitiesCache, } from '@mariozechner/pi-tui';
|
|
4
|
+
/**
|
|
5
|
+
* Checks if the current terminal supports inline images.
|
|
6
|
+
* Extends pi-tui's detection with tmux passthrough and explicit override.
|
|
7
|
+
*/
|
|
8
|
+
export function supportsImages() {
|
|
9
|
+
// Allow explicit override via env var
|
|
10
|
+
if (process.env.CORE_IMAGE_PROTOCOL === 'iterm2' || process.env.CORE_IMAGE_PROTOCOL === 'kitty') {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
// tmux passes TERM_PROGRAM through — but some setups don't.
|
|
14
|
+
// If running inside tmux, check if the outer terminal supports images.
|
|
15
|
+
if (process.env.TERM === 'screen' || process.env.TMUX) {
|
|
16
|
+
const outerTerm = (process.env.TERM_PROGRAM ?? '').toLowerCase();
|
|
17
|
+
if (outerTerm === 'iterm.app' || process.env.ITERM_SESSION_ID)
|
|
18
|
+
return true;
|
|
19
|
+
if (outerTerm === 'kitty' || process.env.KITTY_WINDOW_ID)
|
|
20
|
+
return true;
|
|
21
|
+
if (outerTerm === 'wezterm' || process.env.WEZTERM_PANE)
|
|
22
|
+
return true;
|
|
23
|
+
if (outerTerm === 'ghostty' || process.env.GHOSTTY_RESOURCES_DIR)
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
resetCapabilitiesCache();
|
|
27
|
+
return getCapabilities().images !== null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Builds an inline PNG Image component from base64 data.
|
|
31
|
+
* Returns null if terminal doesn't support images.
|
|
32
|
+
*/
|
|
33
|
+
export function buildImageAvatar(base64Png, accentHex) {
|
|
34
|
+
if (!supportsImages())
|
|
35
|
+
return null;
|
|
36
|
+
const dims = getPngDimensions(base64Png);
|
|
37
|
+
if (!dims)
|
|
38
|
+
return null;
|
|
39
|
+
return new Image(base64Png, 'image/png', { fallbackColor: chalk.hex(accentHex) }, { maxWidthCells: 8, maxHeightCells: 4 }, dims);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Renders a PNG (base64) as colored Unicode half-block characters.
|
|
43
|
+
* Uses ▀ (upper half block) with ANSI 24-bit fg/bg colors to pack
|
|
44
|
+
* 2 pixel rows into each terminal line, preserving aspect ratio.
|
|
45
|
+
* Works in any terminal that supports truecolor (no Kitty/iTerm2 needed).
|
|
46
|
+
*/
|
|
47
|
+
export function buildColorBlockAvatar(base64Png, targetCols = 10) {
|
|
48
|
+
const buffer = Buffer.from(base64Png, 'base64');
|
|
49
|
+
const png = decodePng(buffer);
|
|
50
|
+
const { width, height, data, channels } = png;
|
|
51
|
+
// Terminal cells are ~1:2 (width:height). Half-blocks split each line into
|
|
52
|
+
// 2 pixel rows, but the visual height of a line is still 2× the cell width.
|
|
53
|
+
// Dividing by 2 cancels that out so the rendered output is visually square.
|
|
54
|
+
const termRows = Math.max(1, Math.round((targetCols * height) / (width * 2)));
|
|
55
|
+
const pixelRows = termRows * 2;
|
|
56
|
+
function getPixel(pxRow, pxCol) {
|
|
57
|
+
const srcRow = Math.min(Math.floor((pxRow * height) / pixelRows), height - 1);
|
|
58
|
+
const srcCol = Math.min(Math.floor((pxCol * width) / targetCols), width - 1);
|
|
59
|
+
const idx = (srcRow * width + srcCol) * channels;
|
|
60
|
+
return [data[idx], data[idx + 1], data[idx + 2]];
|
|
61
|
+
}
|
|
62
|
+
const lines = [];
|
|
63
|
+
for (let row = 0; row < termRows; row++) {
|
|
64
|
+
let line = '';
|
|
65
|
+
for (let col = 0; col < targetCols; col++) {
|
|
66
|
+
const [tr, tg, tb] = getPixel(row * 2, col);
|
|
67
|
+
const [br, bg, bb] = getPixel(row * 2 + 1, col);
|
|
68
|
+
line += chalk.rgb(tr, tg, tb).bgRgb(br, bg, bb)('▀');
|
|
69
|
+
}
|
|
70
|
+
lines.push(line);
|
|
71
|
+
}
|
|
72
|
+
return new Text(lines.join('\n'), 0, 1);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns the best available avatar component:
|
|
76
|
+
* - Inline PNG image (if terminal supports Kitty/iTerm2 protocol)
|
|
77
|
+
* - Colored half-block rendering (truecolor, works everywhere)
|
|
78
|
+
* - Deterministic accent-colored pixel grid (final fallback, no PNG needed)
|
|
79
|
+
*/
|
|
80
|
+
export function buildAvatar(name, accentHex, base64Png) {
|
|
81
|
+
if (base64Png) {
|
|
82
|
+
const img = buildImageAvatar(base64Png, accentHex);
|
|
83
|
+
if (img)
|
|
84
|
+
return img;
|
|
85
|
+
try {
|
|
86
|
+
return buildColorBlockAvatar(base64Png);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// fall through to accent-colored fallback
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Final fallback: simple accent block (no PNG)
|
|
93
|
+
const block = chalk.hex(accentHex)('██\n██\n██');
|
|
94
|
+
return new Text(block, 0, 1);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/tui/utils/avatar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-loader.d.ts","sourceRoot":"","sources":["../../../src/tui/utils/bundle-loader.ts"],"names":[],"mappings":"AAgCA,2FAA2F;AAC3F,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwBtF"}
|