@felan-ai/felan 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +2 -1
- package/dist/application.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +20 -3
- package/dist/runtime.js.map +1 -1
- package/dist/settings.d.ts +6 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +17 -0
- package/dist/settings.js.map +1 -1
- package/dist/tool-activity/extension.d.ts +6 -0
- package/dist/tool-activity/extension.d.ts.map +1 -0
- package/dist/tool-activity/extension.js +55 -0
- package/dist/tool-activity/extension.js.map +1 -0
- package/dist/tool-activity/inspector.d.ts +18 -0
- package/dist/tool-activity/inspector.d.ts.map +1 -0
- package/dist/tool-activity/inspector.js +269 -0
- package/dist/tool-activity/inspector.js.map +1 -0
- package/dist/tool-activity/presentation.d.ts +7 -0
- package/dist/tool-activity/presentation.d.ts.map +1 -0
- package/dist/tool-activity/presentation.js +289 -0
- package/dist/tool-activity/presentation.js.map +1 -0
- package/dist/tool-activity/runtime-view.d.ts +5 -0
- package/dist/tool-activity/runtime-view.d.ts.map +1 -0
- package/dist/tool-activity/runtime-view.js +72 -0
- package/dist/tool-activity/runtime-view.js.map +1 -0
- package/dist/tool-activity/state.d.ts +60 -0
- package/dist/tool-activity/state.d.ts.map +1 -0
- package/dist/tool-activity/state.js +456 -0
- package/dist/tool-activity/state.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { Text, stripTerminalSequences, } from '@earendil-works/pi-tui';
|
|
2
|
+
import { ToolActivityState, } from './state.js';
|
|
3
|
+
const PREVIEW_LINES = 3;
|
|
4
|
+
const MAX_PREVIEW_WIDTH = 120;
|
|
5
|
+
class EmptyComponent {
|
|
6
|
+
render() {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
invalidate() { }
|
|
10
|
+
}
|
|
11
|
+
export function createToolActivityDisplayDefinition(state, toolName, original) {
|
|
12
|
+
return {
|
|
13
|
+
...original,
|
|
14
|
+
renderShell: 'self',
|
|
15
|
+
renderCall(args, theme, context) {
|
|
16
|
+
state.observeRendererCall(context.toolCallId, toolName, args);
|
|
17
|
+
state.registerRenderer(context.toolCallId, context.invalidate);
|
|
18
|
+
const placement = state.placement(context.toolCallId);
|
|
19
|
+
if (!placement?.anchor)
|
|
20
|
+
return empty(context);
|
|
21
|
+
return new Text(renderToolActivityGroup(state, placement.groupId, theme, context.expanded), 0, 0);
|
|
22
|
+
},
|
|
23
|
+
renderResult(_result, _options, _theme, context) {
|
|
24
|
+
state.registerRenderer(context.toolCallId, context.invalidate);
|
|
25
|
+
return empty(context);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function renderToolActivityGroup(state, groupId, theme, expanded) {
|
|
30
|
+
const group = state.group(groupId);
|
|
31
|
+
if (!group)
|
|
32
|
+
return theme.fg('warning', 'Tool activity unavailable');
|
|
33
|
+
const calls = group.callIds
|
|
34
|
+
.map((callId) => state.call(callId))
|
|
35
|
+
.filter((call) => call !== undefined);
|
|
36
|
+
if (calls.length === 0)
|
|
37
|
+
return theme.fg('warning', 'Tool activity unavailable');
|
|
38
|
+
const summary = toolGroupSummary(calls);
|
|
39
|
+
const status = groupStatus(calls, theme);
|
|
40
|
+
const metadata = groupMetadata(calls);
|
|
41
|
+
const inspectHint = expanded ? ' · Alt+T full details' : '';
|
|
42
|
+
const header = `${status} ${theme.bold(summary)}${theme.fg('muted', `${metadata ? ` · ${metadata}` : ''}${inspectHint}`)}`;
|
|
43
|
+
if (!expanded)
|
|
44
|
+
return header;
|
|
45
|
+
const lines = [header];
|
|
46
|
+
for (const call of calls) {
|
|
47
|
+
lines.push(` ${callStatus(call, theme)} ${toolCallLabel(call)}`);
|
|
48
|
+
for (const preview of resultPreview(call))
|
|
49
|
+
lines.push(theme.fg('dim', ` ${preview}`));
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
53
|
+
export function toolCallLabel(call) {
|
|
54
|
+
const label = callLabel(call);
|
|
55
|
+
const preview = argumentPreview(call);
|
|
56
|
+
return preview ? `${label} · ${preview}` : label;
|
|
57
|
+
}
|
|
58
|
+
export function toolGroupSummary(calls) {
|
|
59
|
+
if (calls.length === 1)
|
|
60
|
+
return toolCallLabel(calls[0]);
|
|
61
|
+
const running = calls.some((call) => call.status === 'pending' || call.status === 'running');
|
|
62
|
+
const counts = new Map();
|
|
63
|
+
for (const call of calls) {
|
|
64
|
+
const category = toolCategory(call.name);
|
|
65
|
+
counts.set(category, (counts.get(category) ?? 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
const parts = Array.from(counts, ([category, count]) => categorySummary(category, count, running));
|
|
68
|
+
if (parts.length === 1)
|
|
69
|
+
return capitalize(parts[0]);
|
|
70
|
+
if (parts.length === 2)
|
|
71
|
+
return capitalize(`${parts[0]} and ${parts[1]}`);
|
|
72
|
+
const remaining = Array.from(counts.values()).slice(2).reduce((total, count) => total + count, 0);
|
|
73
|
+
return capitalize(`${parts[0]}, ${parts[1]}, and ${remaining} more action${remaining === 1 ? '' : 's'}`);
|
|
74
|
+
}
|
|
75
|
+
function empty(context) {
|
|
76
|
+
return context.lastComponent instanceof EmptyComponent ? context.lastComponent : new EmptyComponent();
|
|
77
|
+
}
|
|
78
|
+
function groupStatus(calls, theme) {
|
|
79
|
+
if (calls.some((call) => call.isError))
|
|
80
|
+
return theme.fg('error', '✗');
|
|
81
|
+
if (calls.some((call) => call.status === 'pending' || call.status === 'running')) {
|
|
82
|
+
return theme.fg('warning', '◌');
|
|
83
|
+
}
|
|
84
|
+
return theme.fg('success', '✓');
|
|
85
|
+
}
|
|
86
|
+
function callStatus(call, theme) {
|
|
87
|
+
if (call.isError)
|
|
88
|
+
return theme.fg('error', '✗');
|
|
89
|
+
if (call.status === 'pending' || call.status === 'running')
|
|
90
|
+
return theme.fg('warning', '◌');
|
|
91
|
+
return theme.fg('success', '✓');
|
|
92
|
+
}
|
|
93
|
+
function groupMetadata(calls) {
|
|
94
|
+
const details = [`${calls.length} action${calls.length === 1 ? '' : 's'}`];
|
|
95
|
+
const failures = calls.filter((call) => call.isError).length;
|
|
96
|
+
const running = calls.filter((call) => call.status === 'pending' || call.status === 'running').length;
|
|
97
|
+
if (failures > 0)
|
|
98
|
+
details.push(`${failures} failed`);
|
|
99
|
+
if (running > 0)
|
|
100
|
+
details.push(`${running} running`);
|
|
101
|
+
if (failures === 0 && running === 0) {
|
|
102
|
+
const duration = groupDuration(calls);
|
|
103
|
+
if (duration)
|
|
104
|
+
details.push(duration);
|
|
105
|
+
}
|
|
106
|
+
return details.join(' · ');
|
|
107
|
+
}
|
|
108
|
+
function groupDuration(calls) {
|
|
109
|
+
if (calls.some((call) => call.startedAt === undefined || call.completedAt === undefined))
|
|
110
|
+
return undefined;
|
|
111
|
+
const startedAt = Math.min(...calls.map((call) => call.startedAt));
|
|
112
|
+
const completedAt = Math.max(...calls.map((call) => call.completedAt));
|
|
113
|
+
return formatDuration(completedAt - startedAt);
|
|
114
|
+
}
|
|
115
|
+
function formatDuration(durationMs) {
|
|
116
|
+
if (durationMs <= 0)
|
|
117
|
+
return undefined;
|
|
118
|
+
if (durationMs < 1_000)
|
|
119
|
+
return `${Math.round(durationMs)}ms`;
|
|
120
|
+
if (durationMs < 10_000)
|
|
121
|
+
return `${(durationMs / 1_000).toFixed(1).replace(/\.0$/, '')}s`;
|
|
122
|
+
if (durationMs < 60_000)
|
|
123
|
+
return `${Math.round(durationMs / 1_000)}s`;
|
|
124
|
+
const minutes = Math.floor(durationMs / 60_000);
|
|
125
|
+
const seconds = Math.round((durationMs % 60_000) / 1_000);
|
|
126
|
+
return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
|
|
127
|
+
}
|
|
128
|
+
function resultPreview(call) {
|
|
129
|
+
const text = call.result?.content
|
|
130
|
+
.filter((content) => content.type === 'text' && content.text)
|
|
131
|
+
.map((content) => stripTerminalSequences(content.text))
|
|
132
|
+
.join('\n')
|
|
133
|
+
.trim();
|
|
134
|
+
const images = call.result?.content.filter((content) => content.type === 'image') ?? [];
|
|
135
|
+
if (!text) {
|
|
136
|
+
return images.length === 0
|
|
137
|
+
? []
|
|
138
|
+
: images.slice(0, PREVIEW_LINES).map((image) => `[${image.mimeType ?? 'image'}]`);
|
|
139
|
+
}
|
|
140
|
+
const allLines = text.split('\n').map((line) => truncate(line.trimEnd(), MAX_PREVIEW_WIDTH));
|
|
141
|
+
let lines = allLines.slice(0, PREVIEW_LINES);
|
|
142
|
+
if (toolCategory(call.name) === 'command' && allLines.length > PREVIEW_LINES) {
|
|
143
|
+
lines = [...allLines.slice(0, PREVIEW_LINES - 1), allLines.at(-1)];
|
|
144
|
+
}
|
|
145
|
+
if (allLines.length > PREVIEW_LINES)
|
|
146
|
+
lines.push(`… ${allLines.length - PREVIEW_LINES} more lines`);
|
|
147
|
+
return lines;
|
|
148
|
+
}
|
|
149
|
+
function toolCategory(name) {
|
|
150
|
+
const normalized = name.toLowerCase();
|
|
151
|
+
if (normalized === 'read')
|
|
152
|
+
return 'read';
|
|
153
|
+
if (['web_search', 'source_check', 'fetch_content', 'get_search_content'].includes(normalized))
|
|
154
|
+
return 'web';
|
|
155
|
+
if (['grep', 'find', 'ls'].includes(normalized) || normalized.includes('search'))
|
|
156
|
+
return 'search';
|
|
157
|
+
if (normalized === 'bash'
|
|
158
|
+
|| normalized.includes('exec_command')
|
|
159
|
+
|| normalized.includes('write_stdin')
|
|
160
|
+
|| normalized.includes('background_bash'))
|
|
161
|
+
return 'command';
|
|
162
|
+
if (normalized.includes('edit') || normalized.includes('write') || normalized.includes('patch'))
|
|
163
|
+
return 'edit';
|
|
164
|
+
if (normalized.startsWith('task'))
|
|
165
|
+
return 'task';
|
|
166
|
+
if (normalized === 'agent' || normalized.includes('subagent'))
|
|
167
|
+
return 'delegate';
|
|
168
|
+
return 'other';
|
|
169
|
+
}
|
|
170
|
+
function categorySummary(category, count, running) {
|
|
171
|
+
const plural = count === 1 ? '' : 's';
|
|
172
|
+
switch (category) {
|
|
173
|
+
case 'read': return `${running ? 'reading' : 'read'} ${count} file${plural}`;
|
|
174
|
+
case 'search': return count === 1
|
|
175
|
+
? `${running ? 'searching' : 'searched'} code`
|
|
176
|
+
: `${running ? 'running' : 'ran'} ${count} searches`;
|
|
177
|
+
case 'edit': return `${running ? 'editing' : 'edited'} ${count} file${plural}`;
|
|
178
|
+
case 'command': return `${running ? 'running' : 'ran'} ${count} command${plural}`;
|
|
179
|
+
case 'task': return `${running ? 'updating' : 'updated'} ${count} task action${plural}`;
|
|
180
|
+
case 'web': return `${running ? 'researching' : 'completed'} ${count} web action${plural}`;
|
|
181
|
+
case 'delegate': return `${running ? 'coordinating' : 'completed'} ${count} agent action${plural}`;
|
|
182
|
+
case 'other': return `${running ? 'running' : 'completed'} ${count} action${plural}`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function callLabel(call) {
|
|
186
|
+
const running = call.status === 'pending' || call.status === 'running';
|
|
187
|
+
const normalized = call.name.toLowerCase();
|
|
188
|
+
if (normalized === 'read')
|
|
189
|
+
return running ? 'Reading' : 'Read';
|
|
190
|
+
if (normalized === 'grep')
|
|
191
|
+
return running ? 'Searching' : 'Searched';
|
|
192
|
+
if (normalized === 'find')
|
|
193
|
+
return running ? 'Finding files' : 'Found files';
|
|
194
|
+
if (normalized === 'ls')
|
|
195
|
+
return running ? 'Listing files' : 'Listed files';
|
|
196
|
+
if (toolCategory(call.name) === 'edit')
|
|
197
|
+
return running ? 'Editing' : 'Edited';
|
|
198
|
+
if (toolCategory(call.name) === 'command')
|
|
199
|
+
return running ? 'Running command' : 'Ran command';
|
|
200
|
+
if (normalized === 'web_search')
|
|
201
|
+
return running ? 'Searching the web' : 'Searched the web';
|
|
202
|
+
if (normalized === 'source_check')
|
|
203
|
+
return running ? 'Checking sources' : 'Checked sources';
|
|
204
|
+
if (normalized === 'fetch_content')
|
|
205
|
+
return running ? 'Fetching content' : 'Fetched content';
|
|
206
|
+
if (normalized === 'get_search_content')
|
|
207
|
+
return running ? 'Reading web content' : 'Read web content';
|
|
208
|
+
if (normalized === 'agent')
|
|
209
|
+
return running ? 'Starting subagent' : 'Started subagent';
|
|
210
|
+
if (normalized.startsWith('task'))
|
|
211
|
+
return formatToolName(call.name);
|
|
212
|
+
return running ? `Running ${formatToolName(call.name)}` : formatToolName(call.name);
|
|
213
|
+
}
|
|
214
|
+
function argumentPreview(call) {
|
|
215
|
+
const args = asRecord(call.args);
|
|
216
|
+
const normalized = call.name.toLowerCase();
|
|
217
|
+
let value;
|
|
218
|
+
if (['read', 'edit', 'write', 'view_image'].includes(normalized)) {
|
|
219
|
+
value = firstString(args, ['path', 'file_path']);
|
|
220
|
+
}
|
|
221
|
+
else if (normalized === 'grep') {
|
|
222
|
+
value = firstString(args, ['pattern']);
|
|
223
|
+
}
|
|
224
|
+
else if (normalized === 'find') {
|
|
225
|
+
value = firstString(args, ['pattern', 'path']);
|
|
226
|
+
}
|
|
227
|
+
else if (normalized === 'ls') {
|
|
228
|
+
value = firstString(args, ['path']);
|
|
229
|
+
}
|
|
230
|
+
else if (toolCategory(call.name) === 'command') {
|
|
231
|
+
value = firstString(args, ['cmd', 'command', 'id', 'session_id']);
|
|
232
|
+
}
|
|
233
|
+
else if (normalized.startsWith('task')) {
|
|
234
|
+
value = firstString(args, ['title', 'task_id', 'view']);
|
|
235
|
+
}
|
|
236
|
+
else if (normalized === 'web_search') {
|
|
237
|
+
value = firstString(args, ['query']) ?? firstArrayString(args, 'queries');
|
|
238
|
+
}
|
|
239
|
+
else if (normalized === 'source_check') {
|
|
240
|
+
value = firstString(args, ['claim']);
|
|
241
|
+
}
|
|
242
|
+
else if (normalized === 'fetch_content') {
|
|
243
|
+
value = firstString(args, ['url']) ?? firstArrayString(args, 'urls');
|
|
244
|
+
}
|
|
245
|
+
else if (normalized === 'agent') {
|
|
246
|
+
value = firstString(args, ['description', 'subagent_type']);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
value = firstString(args, ['description', 'query', 'path', 'name', 'id']);
|
|
250
|
+
}
|
|
251
|
+
return value ? truncate(oneLine(value), 88) : undefined;
|
|
252
|
+
}
|
|
253
|
+
function asRecord(value) {
|
|
254
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
255
|
+
? value
|
|
256
|
+
: {};
|
|
257
|
+
}
|
|
258
|
+
function firstString(record, keys) {
|
|
259
|
+
for (const key of keys) {
|
|
260
|
+
const value = record[key];
|
|
261
|
+
if (typeof value === 'string' && value.trim())
|
|
262
|
+
return value.trim();
|
|
263
|
+
if (typeof value === 'number')
|
|
264
|
+
return String(value);
|
|
265
|
+
}
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
function firstArrayString(record, key) {
|
|
269
|
+
const value = record[key];
|
|
270
|
+
return Array.isArray(value) && typeof value[0] === 'string' ? value[0].trim() || undefined : undefined;
|
|
271
|
+
}
|
|
272
|
+
function formatToolName(name) {
|
|
273
|
+
return name
|
|
274
|
+
.replace(/^mcp__/, '')
|
|
275
|
+
.replace(/__/g, ' · ')
|
|
276
|
+
.replace(/[._-]+/g, ' ')
|
|
277
|
+
.replace(/\b\w/g, (letter) => letter.toUpperCase())
|
|
278
|
+
.trim() || 'Tool';
|
|
279
|
+
}
|
|
280
|
+
function oneLine(value) {
|
|
281
|
+
return stripTerminalSequences(value).replace(/\s+/g, ' ').trim();
|
|
282
|
+
}
|
|
283
|
+
function truncate(value, maxLength) {
|
|
284
|
+
return value.length <= maxLength ? value : `${value.slice(0, maxLength - 1)}…`;
|
|
285
|
+
}
|
|
286
|
+
function capitalize(value) {
|
|
287
|
+
return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../src/tool-activity/presentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentSession, AgentSessionRuntime } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { ToolActivityState } from './state.js';
|
|
3
|
+
export declare function registerToolActivitySession(session: AgentSession, state: ToolActivityState): void;
|
|
4
|
+
export declare function createToolActivityRuntimeView<T extends AgentSessionRuntime>(runtime: T): T;
|
|
5
|
+
//# sourceMappingURL=runtime-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-view.d.ts","sourceRoot":"","sources":["../../src/tool-activity/runtime-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EAEpB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAS/C,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAEjG;AAED,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAW1F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createToolActivityDisplayDefinition } from './presentation.js';
|
|
2
|
+
import { ToolActivityState } from './state.js';
|
|
3
|
+
const sessionStates = new WeakMap();
|
|
4
|
+
const sessionViews = new WeakMap();
|
|
5
|
+
const displayDefinitions = new WeakMap();
|
|
6
|
+
export function registerToolActivitySession(session, state) {
|
|
7
|
+
sessionStates.set(session, state);
|
|
8
|
+
}
|
|
9
|
+
export function createToolActivityRuntimeView(runtime) {
|
|
10
|
+
const boundMethods = new Map();
|
|
11
|
+
return new Proxy(runtime, {
|
|
12
|
+
get(target, property) {
|
|
13
|
+
if (property === 'session')
|
|
14
|
+
return sessionView(target.session);
|
|
15
|
+
return boundValue(target, property, boundMethods);
|
|
16
|
+
},
|
|
17
|
+
set(target, property, value) {
|
|
18
|
+
return Reflect.set(target, property, value, target);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function sessionView(session) {
|
|
23
|
+
const state = sessionStates.get(session);
|
|
24
|
+
if (!state)
|
|
25
|
+
return session;
|
|
26
|
+
const existing = sessionViews.get(session);
|
|
27
|
+
if (existing)
|
|
28
|
+
return existing;
|
|
29
|
+
const boundMethods = new Map();
|
|
30
|
+
const getOriginalDefinition = session.getToolDefinition.bind(session);
|
|
31
|
+
const view = new Proxy(session, {
|
|
32
|
+
get(target, property) {
|
|
33
|
+
if (property === 'getToolDefinition') {
|
|
34
|
+
return (toolName) => presentationDefinition(state, toolName, getOriginalDefinition(toolName));
|
|
35
|
+
}
|
|
36
|
+
return boundValue(target, property, boundMethods);
|
|
37
|
+
},
|
|
38
|
+
set(target, property, value) {
|
|
39
|
+
return Reflect.set(target, property, value, target);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
sessionViews.set(session, view);
|
|
43
|
+
return view;
|
|
44
|
+
}
|
|
45
|
+
function presentationDefinition(state, toolName, original) {
|
|
46
|
+
state.rememberDefinition(toolName, original);
|
|
47
|
+
if (!original || state.mode === 'full' || state.isRendererPreserved(toolName))
|
|
48
|
+
return original;
|
|
49
|
+
let cache = displayDefinitions.get(state);
|
|
50
|
+
if (!cache) {
|
|
51
|
+
cache = new WeakMap();
|
|
52
|
+
displayDefinitions.set(state, cache);
|
|
53
|
+
}
|
|
54
|
+
const existing = cache.get(original);
|
|
55
|
+
if (existing)
|
|
56
|
+
return existing;
|
|
57
|
+
const definition = createToolActivityDisplayDefinition(state, toolName, original);
|
|
58
|
+
cache.set(original, definition);
|
|
59
|
+
return definition;
|
|
60
|
+
}
|
|
61
|
+
function boundValue(target, property, cache) {
|
|
62
|
+
const value = Reflect.get(target, property, target);
|
|
63
|
+
if (typeof value !== 'function')
|
|
64
|
+
return value;
|
|
65
|
+
const cached = cache.get(property);
|
|
66
|
+
if (cached && cached.source === value)
|
|
67
|
+
return cached.bound;
|
|
68
|
+
const bound = value.bind(target);
|
|
69
|
+
cache.set(property, { source: value, bound });
|
|
70
|
+
return bound;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=runtime-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-view.js","sourceRoot":"","sources":["../../src/tool-activity/runtime-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type AgentSession, type ToolDefinition } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { type LocalToolDisplayMode } from '../settings.js';
|
|
3
|
+
export interface ToolActivityContent {
|
|
4
|
+
readonly type: string;
|
|
5
|
+
readonly text?: string;
|
|
6
|
+
readonly data?: string;
|
|
7
|
+
readonly mimeType?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ToolActivityResult {
|
|
10
|
+
readonly content: readonly ToolActivityContent[];
|
|
11
|
+
readonly details?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export type ToolActivityStatus = 'pending' | 'running' | 'completed' | 'error';
|
|
14
|
+
export interface ToolActivityCall {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
args: unknown;
|
|
18
|
+
status: ToolActivityStatus;
|
|
19
|
+
isPartial: boolean;
|
|
20
|
+
isError: boolean;
|
|
21
|
+
startedAt?: number;
|
|
22
|
+
completedAt?: number;
|
|
23
|
+
result?: ToolActivityResult;
|
|
24
|
+
}
|
|
25
|
+
export interface ToolActivityGroup {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly callIds: readonly string[];
|
|
28
|
+
readonly standalone: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ToolActivityPlacement {
|
|
31
|
+
readonly groupId: string;
|
|
32
|
+
readonly anchor: boolean;
|
|
33
|
+
}
|
|
34
|
+
type ActivityListener = () => void;
|
|
35
|
+
type RendererInvalidator = () => void;
|
|
36
|
+
export declare class ToolActivityState {
|
|
37
|
+
#private;
|
|
38
|
+
private displayMode;
|
|
39
|
+
constructor(displayMode: LocalToolDisplayMode);
|
|
40
|
+
get mode(): LocalToolDisplayMode;
|
|
41
|
+
get cwd(): string;
|
|
42
|
+
setMode(mode: LocalToolDisplayMode): void;
|
|
43
|
+
refreshMode(): void;
|
|
44
|
+
attach(session: AgentSession): void;
|
|
45
|
+
dispose(): void;
|
|
46
|
+
rebuild(): void;
|
|
47
|
+
subscribe(listener: ActivityListener): () => void;
|
|
48
|
+
calls(): readonly ToolActivityCall[];
|
|
49
|
+
groups(): readonly ToolActivityGroup[];
|
|
50
|
+
group(groupId: string): ToolActivityGroup | undefined;
|
|
51
|
+
call(toolCallId: string): ToolActivityCall | undefined;
|
|
52
|
+
placement(toolCallId: string): ToolActivityPlacement | undefined;
|
|
53
|
+
rememberDefinition(toolName: string, definition: ToolDefinition<any, any, any> | undefined): void;
|
|
54
|
+
definition(toolName: string): ToolDefinition<any, any, any> | undefined;
|
|
55
|
+
registerRenderer(toolCallId: string, invalidate: RendererInvalidator): void;
|
|
56
|
+
observeRendererCall(toolCallId: string, toolName: string, args: unknown): void;
|
|
57
|
+
isRendererPreserved(toolName: string): boolean;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/tool-activity/state.ts"],"names":[],"mappings":"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"}
|