zerg-ztc 0.1.10 → 0.1.12
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/bin/.gitkeep +0 -0
- package/bin/ztc-audio-darwin-arm64 +0 -0
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +63 -2
- package/dist/App.js.map +1 -1
- package/dist/agent/commands/dictation.d.ts +3 -0
- package/dist/agent/commands/dictation.d.ts.map +1 -0
- package/dist/agent/commands/dictation.js +10 -0
- package/dist/agent/commands/dictation.js.map +1 -0
- package/dist/agent/commands/index.d.ts.map +1 -1
- package/dist/agent/commands/index.js +2 -1
- package/dist/agent/commands/index.js.map +1 -1
- package/dist/agent/commands/types.d.ts +7 -0
- package/dist/agent/commands/types.d.ts.map +1 -1
- package/dist/components/InputArea.d.ts +1 -0
- package/dist/components/InputArea.d.ts.map +1 -1
- package/dist/components/InputArea.js +591 -43
- package/dist/components/InputArea.js.map +1 -1
- package/dist/components/SingleMessage.d.ts.map +1 -1
- package/dist/components/SingleMessage.js +157 -7
- package/dist/components/SingleMessage.js.map +1 -1
- package/dist/config/types.d.ts +6 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/ui/views/status_bar.js +2 -2
- package/dist/ui/views/status_bar.js.map +1 -1
- package/dist/utils/dictation.d.ts +46 -0
- package/dist/utils/dictation.d.ts.map +1 -0
- package/dist/utils/dictation.js +409 -0
- package/dist/utils/dictation.js.map +1 -0
- package/dist/utils/dictation_native.d.ts +51 -0
- package/dist/utils/dictation_native.d.ts.map +1 -0
- package/dist/utils/dictation_native.js +236 -0
- package/dist/utils/dictation_native.js.map +1 -0
- package/dist/utils/path_format.d.ts +20 -0
- package/dist/utils/path_format.d.ts.map +1 -0
- package/dist/utils/path_format.js +90 -0
- package/dist/utils/path_format.js.map +1 -0
- package/dist/utils/table.d.ts +38 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +133 -0
- package/dist/utils/table.js.map +1 -0
- package/dist/utils/tool_trace.d.ts +7 -2
- package/dist/utils/tool_trace.d.ts.map +1 -1
- package/dist/utils/tool_trace.js +156 -51
- package/dist/utils/tool_trace.js.map +1 -1
- package/package.json +5 -1
- package/src/App.tsx +0 -813
- package/src/agent/agent.ts +0 -534
- package/src/agent/backends/anthropic.ts +0 -86
- package/src/agent/backends/gemini.ts +0 -119
- package/src/agent/backends/inception.ts +0 -23
- package/src/agent/backends/index.ts +0 -17
- package/src/agent/backends/openai.ts +0 -23
- package/src/agent/backends/openai_compatible.ts +0 -143
- package/src/agent/backends/types.ts +0 -83
- package/src/agent/commands/clipboard.ts +0 -77
- package/src/agent/commands/config.ts +0 -204
- package/src/agent/commands/debug.ts +0 -23
- package/src/agent/commands/emulation.ts +0 -80
- package/src/agent/commands/execution.ts +0 -9
- package/src/agent/commands/help.ts +0 -20
- package/src/agent/commands/history.ts +0 -13
- package/src/agent/commands/index.ts +0 -46
- package/src/agent/commands/input_mode.ts +0 -22
- package/src/agent/commands/keybindings.ts +0 -40
- package/src/agent/commands/model.ts +0 -11
- package/src/agent/commands/models.ts +0 -116
- package/src/agent/commands/permissions.ts +0 -64
- package/src/agent/commands/retry.ts +0 -9
- package/src/agent/commands/shell.ts +0 -68
- package/src/agent/commands/skills.ts +0 -54
- package/src/agent/commands/status.ts +0 -19
- package/src/agent/commands/types.ts +0 -80
- package/src/agent/commands/update.ts +0 -32
- package/src/agent/factory.ts +0 -60
- package/src/agent/index.ts +0 -20
- package/src/agent/runtime/capabilities.ts +0 -7
- package/src/agent/runtime/memory.ts +0 -23
- package/src/agent/runtime/policy.ts +0 -48
- package/src/agent/runtime/session.ts +0 -18
- package/src/agent/runtime/tracing.ts +0 -23
- package/src/agent/tools/file.ts +0 -178
- package/src/agent/tools/index.ts +0 -52
- package/src/agent/tools/screenshot.ts +0 -821
- package/src/agent/tools/search.ts +0 -138
- package/src/agent/tools/shell.ts +0 -69
- package/src/agent/tools/skills.ts +0 -28
- package/src/agent/tools/types.ts +0 -14
- package/src/agent/tools/zerg.ts +0 -50
- package/src/cli.tsx +0 -163
- package/src/components/ActivityLine.tsx +0 -23
- package/src/components/FullScreen.tsx +0 -79
- package/src/components/Header.tsx +0 -27
- package/src/components/InputArea.tsx +0 -1096
- package/src/components/MessageList.tsx +0 -71
- package/src/components/SingleMessage.tsx +0 -59
- package/src/components/StatusBar.tsx +0 -55
- package/src/components/index.tsx +0 -8
- package/src/config/types.ts +0 -12
- package/src/config.ts +0 -186
- package/src/debug/logger.ts +0 -14
- package/src/emulation/README.md +0 -24
- package/src/emulation/catalog.ts +0 -82
- package/src/emulation/trace_style.ts +0 -8
- package/src/emulation/types.ts +0 -7
- package/src/skills/index.ts +0 -36
- package/src/skills/loader.ts +0 -135
- package/src/skills/registry.ts +0 -6
- package/src/skills/types.ts +0 -10
- package/src/types.ts +0 -84
- package/src/ui/README.md +0 -44
- package/src/ui/core/factory.ts +0 -9
- package/src/ui/core/index.ts +0 -4
- package/src/ui/core/input.ts +0 -38
- package/src/ui/core/input_segments.ts +0 -410
- package/src/ui/core/input_state.ts +0 -17
- package/src/ui/core/layout_yoga.ts +0 -122
- package/src/ui/core/style.ts +0 -38
- package/src/ui/core/types.ts +0 -54
- package/src/ui/ink/index.tsx +0 -1
- package/src/ui/ink/render.tsx +0 -60
- package/src/ui/views/activity_line.ts +0 -33
- package/src/ui/views/app.ts +0 -111
- package/src/ui/views/header.ts +0 -44
- package/src/ui/views/input_area.ts +0 -255
- package/src/ui/views/message_list.ts +0 -443
- package/src/ui/views/status_bar.ts +0 -114
- package/src/ui/vue/index.ts +0 -53
- package/src/ui/web/frame_render.tsx +0 -148
- package/src/ui/web/index.tsx +0 -1
- package/src/ui/web/render.tsx +0 -41
- package/src/utils/clipboard.ts +0 -39
- package/src/utils/clipboard_image.ts +0 -40
- package/src/utils/diff.ts +0 -52
- package/src/utils/image_preview.ts +0 -36
- package/src/utils/models.ts +0 -98
- package/src/utils/path_complete.ts +0 -173
- package/src/utils/shell.ts +0 -72
- package/src/utils/spinner_frames.ts +0 -1
- package/src/utils/spinner_verbs.ts +0 -23
- package/src/utils/tool_summary.ts +0 -56
- package/src/utils/tool_trace.ts +0 -216
- package/src/utils/update.ts +0 -44
- package/src/utils/version.ts +0 -15
- package/src/web/index.html +0 -352
- package/src/web/mirror-favicon.svg +0 -4
- package/src/web/mirror.html +0 -641
- package/src/web/mirror_hook.ts +0 -25
- package/src/web/mirror_server.ts +0 -204
- package/tsconfig.json +0 -22
- package/vite.config.ts +0 -363
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native real-time dictation using ztc-audio Rust binary
|
|
3
|
+
* Provides:
|
|
4
|
+
* - Real-time audio level metering (VU meter)
|
|
5
|
+
* - Real-time transcription via whisper
|
|
6
|
+
* - Cross-platform support
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { createInterface } from 'readline';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
import { homedir, platform, arch } from 'os';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
let activeProcess = null;
|
|
17
|
+
let eventHandlers = [];
|
|
18
|
+
/**
|
|
19
|
+
* Get the platform-specific binary name
|
|
20
|
+
*/
|
|
21
|
+
function getBinaryName() {
|
|
22
|
+
const p = platform();
|
|
23
|
+
const a = arch();
|
|
24
|
+
let os;
|
|
25
|
+
switch (p) {
|
|
26
|
+
case 'darwin':
|
|
27
|
+
os = 'darwin';
|
|
28
|
+
break;
|
|
29
|
+
case 'linux':
|
|
30
|
+
os = 'linux';
|
|
31
|
+
break;
|
|
32
|
+
case 'win32':
|
|
33
|
+
os = 'win';
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
os = p;
|
|
37
|
+
}
|
|
38
|
+
let cpu;
|
|
39
|
+
switch (a) {
|
|
40
|
+
case 'x64':
|
|
41
|
+
cpu = 'x64';
|
|
42
|
+
break;
|
|
43
|
+
case 'arm64':
|
|
44
|
+
cpu = 'arm64';
|
|
45
|
+
break;
|
|
46
|
+
default:
|
|
47
|
+
cpu = a;
|
|
48
|
+
}
|
|
49
|
+
const ext = p === 'win32' ? '.exe' : '';
|
|
50
|
+
return `ztc-audio-${os}-${cpu}${ext}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the path to the ztc-audio binary
|
|
54
|
+
*/
|
|
55
|
+
function getBinaryPath() {
|
|
56
|
+
const binaryName = getBinaryName();
|
|
57
|
+
const possiblePaths = [
|
|
58
|
+
// Installed via npm (relative to this file in dist/utils/)
|
|
59
|
+
join(__dirname, '..', '..', 'bin', binaryName),
|
|
60
|
+
// Development: Rust build output
|
|
61
|
+
join(process.cwd(), 'packages', 'ztc-dictation', 'target', 'release', 'ztc-audio'),
|
|
62
|
+
// Development: bin directory (for local testing)
|
|
63
|
+
join(process.cwd(), 'bin', binaryName),
|
|
64
|
+
// Global install location
|
|
65
|
+
join(homedir(), '.ztc', 'bin', binaryName),
|
|
66
|
+
];
|
|
67
|
+
for (const p of possiblePaths) {
|
|
68
|
+
if (existsSync(p)) {
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if native dictation is available
|
|
76
|
+
*/
|
|
77
|
+
export function isNativeDictationAvailable() {
|
|
78
|
+
return getBinaryPath() !== null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check if currently recording
|
|
82
|
+
*/
|
|
83
|
+
export function isNativeRecording() {
|
|
84
|
+
return activeProcess !== null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Subscribe to dictation events
|
|
88
|
+
*/
|
|
89
|
+
export function onDictationEvent(handler) {
|
|
90
|
+
eventHandlers.push(handler);
|
|
91
|
+
return () => {
|
|
92
|
+
eventHandlers = eventHandlers.filter(h => h !== handler);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function emit(event) {
|
|
96
|
+
for (const handler of eventHandlers) {
|
|
97
|
+
try {
|
|
98
|
+
handler(event);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
// Ignore handler errors
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Start native recording with real-time transcription
|
|
107
|
+
*/
|
|
108
|
+
export function startNativeRecording(options = {}) {
|
|
109
|
+
if (activeProcess) {
|
|
110
|
+
return false; // Already recording
|
|
111
|
+
}
|
|
112
|
+
const binaryPath = getBinaryPath();
|
|
113
|
+
if (!binaryPath) {
|
|
114
|
+
emit({
|
|
115
|
+
type: 'error',
|
|
116
|
+
message: 'ztc-audio binary not found. Run: cargo build --release in native/ztc-audio'
|
|
117
|
+
});
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
const args = [];
|
|
121
|
+
if (options.model) {
|
|
122
|
+
args.push('--model', options.model);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
args.push('--model', 'tiny'); // Default to tiny for speed
|
|
126
|
+
}
|
|
127
|
+
if (options.device) {
|
|
128
|
+
args.push('--device', options.device);
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
activeProcess = spawn(binaryPath, args, {
|
|
132
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
133
|
+
});
|
|
134
|
+
// Parse JSON lines from stdout
|
|
135
|
+
const rl = createInterface({
|
|
136
|
+
input: activeProcess.stdout,
|
|
137
|
+
crlfDelay: Infinity,
|
|
138
|
+
});
|
|
139
|
+
rl.on('line', (line) => {
|
|
140
|
+
try {
|
|
141
|
+
const msg = JSON.parse(line);
|
|
142
|
+
emit(msg);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
// Ignore parse errors
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Capture stderr for debugging
|
|
149
|
+
activeProcess.stderr?.on('data', (data) => {
|
|
150
|
+
const text = data.toString().trim();
|
|
151
|
+
if (text && !text.includes('Downloading')) {
|
|
152
|
+
// Don't emit download progress as errors
|
|
153
|
+
// Could log this for debugging
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
activeProcess.on('close', (code) => {
|
|
157
|
+
activeProcess = null;
|
|
158
|
+
emit({ type: 'stopped' });
|
|
159
|
+
});
|
|
160
|
+
activeProcess.on('error', (err) => {
|
|
161
|
+
activeProcess = null;
|
|
162
|
+
emit({ type: 'error', message: err.message });
|
|
163
|
+
});
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
emit({
|
|
168
|
+
type: 'error',
|
|
169
|
+
message: `Failed to start ztc-audio: ${err instanceof Error ? err.message : 'Unknown error'}`
|
|
170
|
+
});
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Stop native recording
|
|
176
|
+
* Returns the final transcription
|
|
177
|
+
*/
|
|
178
|
+
export async function stopNativeRecording() {
|
|
179
|
+
if (!activeProcess) {
|
|
180
|
+
return '';
|
|
181
|
+
}
|
|
182
|
+
return new Promise((resolve) => {
|
|
183
|
+
let finalText = '';
|
|
184
|
+
// Listen for the final transcription
|
|
185
|
+
const cleanup = onDictationEvent((event) => {
|
|
186
|
+
if (event.type === 'text' && event.partial === false) {
|
|
187
|
+
finalText = event.content || '';
|
|
188
|
+
}
|
|
189
|
+
if (event.type === 'stopped') {
|
|
190
|
+
cleanup();
|
|
191
|
+
resolve(finalText);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// Send SIGINT to trigger graceful shutdown
|
|
195
|
+
activeProcess?.kill('SIGINT');
|
|
196
|
+
// Fallback timeout
|
|
197
|
+
setTimeout(() => {
|
|
198
|
+
if (activeProcess) {
|
|
199
|
+
activeProcess.kill('SIGKILL');
|
|
200
|
+
activeProcess = null;
|
|
201
|
+
}
|
|
202
|
+
cleanup();
|
|
203
|
+
resolve(finalText);
|
|
204
|
+
}, 3000);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Cancel native recording without getting transcription
|
|
209
|
+
*/
|
|
210
|
+
export function cancelNativeRecording() {
|
|
211
|
+
if (activeProcess) {
|
|
212
|
+
activeProcess.kill('SIGKILL');
|
|
213
|
+
activeProcess = null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get recording status info
|
|
218
|
+
*/
|
|
219
|
+
export function getNativeDictationStatus() {
|
|
220
|
+
const binaryPath = getBinaryPath();
|
|
221
|
+
const parts = [];
|
|
222
|
+
if (binaryPath) {
|
|
223
|
+
parts.push(`Native dictation: available`);
|
|
224
|
+
parts.push(`Binary: ${binaryPath}`);
|
|
225
|
+
parts.push(`Model: ~/.ztc/models/ggml-*.bin`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
parts.push('Native dictation: not available');
|
|
229
|
+
parts.push('Build with: cd native/ztc-audio && cargo build --release');
|
|
230
|
+
}
|
|
231
|
+
if (isNativeRecording()) {
|
|
232
|
+
parts.push('\nCurrently recording...');
|
|
233
|
+
}
|
|
234
|
+
return parts.join('\n');
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=dictation_native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictation_native.js","sourceRoot":"","sources":["../../src/utils/dictation_native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shorten a path for display:
|
|
3
|
+
* - Replace home directory with ~
|
|
4
|
+
* - Truncate middle of long paths
|
|
5
|
+
* - Show basename prominently
|
|
6
|
+
*/
|
|
7
|
+
export declare function shortenPath(path: string, maxLength?: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Format a path for trace display - very compact
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatTracePath(path: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format bytes in human readable form
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatBytes(bytes: number): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format duration in human readable form
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatDuration(ms: number): string;
|
|
20
|
+
//# sourceMappingURL=path_format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path_format.d.ts","sourceRoot":"","sources":["../../src/utils/path_format.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAsChE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { basename, dirname } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Shorten a path for display:
|
|
5
|
+
* - Replace home directory with ~
|
|
6
|
+
* - Truncate middle of long paths
|
|
7
|
+
* - Show basename prominently
|
|
8
|
+
*/
|
|
9
|
+
export function shortenPath(path, maxLength = 60) {
|
|
10
|
+
if (!path)
|
|
11
|
+
return '';
|
|
12
|
+
// Replace home directory with ~
|
|
13
|
+
const home = homedir();
|
|
14
|
+
let shortened = path;
|
|
15
|
+
if (path.startsWith(home)) {
|
|
16
|
+
shortened = '~' + path.slice(home.length);
|
|
17
|
+
}
|
|
18
|
+
// If short enough, return as-is
|
|
19
|
+
if (shortened.length <= maxLength) {
|
|
20
|
+
return shortened;
|
|
21
|
+
}
|
|
22
|
+
// Truncate middle, keeping start and end
|
|
23
|
+
const base = basename(shortened);
|
|
24
|
+
const dir = dirname(shortened);
|
|
25
|
+
// Always show at least the basename
|
|
26
|
+
if (base.length >= maxLength - 4) {
|
|
27
|
+
return '…' + base.slice(-(maxLength - 1));
|
|
28
|
+
}
|
|
29
|
+
// Show as much of the directory as we can
|
|
30
|
+
const availableForDir = maxLength - base.length - 2; // 2 for /…
|
|
31
|
+
if (availableForDir < 10) {
|
|
32
|
+
return '…/' + base;
|
|
33
|
+
}
|
|
34
|
+
// Split dir and keep start + end
|
|
35
|
+
const startLen = Math.floor(availableForDir * 0.4);
|
|
36
|
+
const endLen = availableForDir - startLen - 1; // 1 for …
|
|
37
|
+
const dirStart = dir.slice(0, startLen);
|
|
38
|
+
const dirEnd = dir.slice(-endLen);
|
|
39
|
+
return `${dirStart}…${dirEnd}/${base}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Format a path for trace display - very compact
|
|
43
|
+
*/
|
|
44
|
+
export function formatTracePath(path) {
|
|
45
|
+
if (!path)
|
|
46
|
+
return '""';
|
|
47
|
+
const home = homedir();
|
|
48
|
+
let formatted = path;
|
|
49
|
+
// Replace home with ~
|
|
50
|
+
if (path.startsWith(home)) {
|
|
51
|
+
formatted = '~' + path.slice(home.length);
|
|
52
|
+
}
|
|
53
|
+
// For very long paths, just show basename with hint
|
|
54
|
+
if (formatted.length > 50) {
|
|
55
|
+
const base = basename(formatted);
|
|
56
|
+
const dir = dirname(formatted);
|
|
57
|
+
// Show abbreviated dir + full basename
|
|
58
|
+
if (dir.length > 30) {
|
|
59
|
+
const dirParts = dir.split('/').filter(Boolean);
|
|
60
|
+
if (dirParts.length > 3) {
|
|
61
|
+
const abbreviated = dirParts.slice(0, 2).join('/') + '/…/' + dirParts.slice(-1).join('/');
|
|
62
|
+
return abbreviated + '/' + base;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return formatted;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Format bytes in human readable form
|
|
70
|
+
*/
|
|
71
|
+
export function formatBytes(bytes) {
|
|
72
|
+
if (bytes < 1024)
|
|
73
|
+
return `${bytes} bytes`;
|
|
74
|
+
if (bytes < 1024 * 1024)
|
|
75
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
76
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Format duration in human readable form
|
|
80
|
+
*/
|
|
81
|
+
export function formatDuration(ms) {
|
|
82
|
+
if (ms < 1000)
|
|
83
|
+
return `${ms}ms`;
|
|
84
|
+
if (ms < 60000)
|
|
85
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
86
|
+
const mins = Math.floor(ms / 60000);
|
|
87
|
+
const secs = Math.round((ms % 60000) / 1000);
|
|
88
|
+
return `${mins}m${secs}s`;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=path_format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path_format.js","sourceRoot":"","sources":["../../src/utils/path_format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Box-drawing table utilities
|
|
3
|
+
* Uses Unicode box-drawing characters for clean terminal tables
|
|
4
|
+
*/
|
|
5
|
+
export interface TableColumn {
|
|
6
|
+
header: string;
|
|
7
|
+
key: string;
|
|
8
|
+
width?: number;
|
|
9
|
+
align?: 'left' | 'right' | 'center';
|
|
10
|
+
}
|
|
11
|
+
export interface TableOptions {
|
|
12
|
+
rounded?: boolean;
|
|
13
|
+
headerSeparator?: boolean;
|
|
14
|
+
compact?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format data as a box-drawing table
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatTable(columns: TableColumn[], rows: Record<string, unknown>[], options?: TableOptions): string;
|
|
20
|
+
/**
|
|
21
|
+
* Simple two-column table (key-value style)
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatKeyValueTable(data: Array<{
|
|
24
|
+
label: string;
|
|
25
|
+
value: string;
|
|
26
|
+
}>, options?: TableOptions): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a schedule/calendar table
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatScheduleTable(events: Array<{
|
|
31
|
+
time: string;
|
|
32
|
+
event: string;
|
|
33
|
+
}>, options?: TableOptions): string;
|
|
34
|
+
/**
|
|
35
|
+
* Simple horizontal line/divider
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatDivider(width?: number, char?: string): string;
|
|
38
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6BD;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,GAAE,YAAiB,GACzB,MAAM,CAoDR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7C,OAAO,GAAE,YAAiB,GACzB,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9C,OAAO,GAAE,YAAiB,GACzB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAK,EAAE,IAAI,SAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Box-drawing table utilities
|
|
3
|
+
* Uses Unicode box-drawing characters for clean terminal tables
|
|
4
|
+
*/
|
|
5
|
+
// Box-drawing characters
|
|
6
|
+
const BOX = {
|
|
7
|
+
topLeft: '┌',
|
|
8
|
+
topRight: '┐',
|
|
9
|
+
bottomLeft: '└',
|
|
10
|
+
bottomRight: '┘',
|
|
11
|
+
horizontal: '─',
|
|
12
|
+
vertical: '│',
|
|
13
|
+
leftT: '├',
|
|
14
|
+
rightT: '┤',
|
|
15
|
+
topT: '┬',
|
|
16
|
+
bottomT: '┴',
|
|
17
|
+
cross: '┼'
|
|
18
|
+
};
|
|
19
|
+
// Light box (for subtler tables)
|
|
20
|
+
const BOX_LIGHT = {
|
|
21
|
+
topLeft: '╭',
|
|
22
|
+
topRight: '╮',
|
|
23
|
+
bottomLeft: '╰',
|
|
24
|
+
bottomRight: '╯',
|
|
25
|
+
horizontal: '─',
|
|
26
|
+
vertical: '│',
|
|
27
|
+
leftT: '├',
|
|
28
|
+
rightT: '┤',
|
|
29
|
+
topT: '┬',
|
|
30
|
+
bottomT: '┴',
|
|
31
|
+
cross: '┼'
|
|
32
|
+
};
|
|
33
|
+
function padString(str, width, align = 'left') {
|
|
34
|
+
const visibleLength = str.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
35
|
+
const padding = Math.max(0, width - visibleLength);
|
|
36
|
+
if (align === 'right') {
|
|
37
|
+
return ' '.repeat(padding) + str;
|
|
38
|
+
}
|
|
39
|
+
if (align === 'center') {
|
|
40
|
+
const left = Math.floor(padding / 2);
|
|
41
|
+
const right = padding - left;
|
|
42
|
+
return ' '.repeat(left) + str + ' '.repeat(right);
|
|
43
|
+
}
|
|
44
|
+
return str + ' '.repeat(padding);
|
|
45
|
+
}
|
|
46
|
+
function getColumnWidths(columns, rows) {
|
|
47
|
+
return columns.map(col => {
|
|
48
|
+
const headerWidth = col.header.length;
|
|
49
|
+
const dataWidth = rows.reduce((max, row) => {
|
|
50
|
+
const value = String(row[col.key] || '');
|
|
51
|
+
const visibleLength = value.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
52
|
+
return Math.max(max, visibleLength);
|
|
53
|
+
}, 0);
|
|
54
|
+
return col.width || Math.max(headerWidth, dataWidth);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Format data as a box-drawing table
|
|
59
|
+
*/
|
|
60
|
+
export function formatTable(columns, rows, options = {}) {
|
|
61
|
+
const { rounded = false, headerSeparator = true, compact = false } = options;
|
|
62
|
+
const box = rounded ? BOX_LIGHT : BOX;
|
|
63
|
+
const widths = getColumnWidths(columns, rows);
|
|
64
|
+
const lines = [];
|
|
65
|
+
// Top border
|
|
66
|
+
const topBorder = box.topLeft +
|
|
67
|
+
widths.map(w => box.horizontal.repeat(w + 2)).join(box.topT) +
|
|
68
|
+
box.topRight;
|
|
69
|
+
lines.push(topBorder);
|
|
70
|
+
// Header row
|
|
71
|
+
const headerRow = box.vertical +
|
|
72
|
+
columns.map((col, i) => ' ' + padString(col.header, widths[i], 'center') + ' ').join(box.vertical) +
|
|
73
|
+
box.vertical;
|
|
74
|
+
lines.push(headerRow);
|
|
75
|
+
// Header separator
|
|
76
|
+
if (headerSeparator) {
|
|
77
|
+
const separator = box.leftT +
|
|
78
|
+
widths.map(w => box.horizontal.repeat(w + 2)).join(box.cross) +
|
|
79
|
+
box.rightT;
|
|
80
|
+
lines.push(separator);
|
|
81
|
+
}
|
|
82
|
+
// Data rows
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
const dataRow = box.vertical +
|
|
85
|
+
columns.map((col, i) => {
|
|
86
|
+
const value = String(row[col.key] || '');
|
|
87
|
+
return ' ' + padString(value, widths[i], col.align) + ' ';
|
|
88
|
+
}).join(box.vertical) +
|
|
89
|
+
box.vertical;
|
|
90
|
+
lines.push(dataRow);
|
|
91
|
+
// Row separator (if not compact)
|
|
92
|
+
if (!compact && rows.indexOf(row) < rows.length - 1) {
|
|
93
|
+
const rowSep = box.leftT +
|
|
94
|
+
widths.map(w => box.horizontal.repeat(w + 2)).join(box.cross) +
|
|
95
|
+
box.rightT;
|
|
96
|
+
lines.push(rowSep);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Bottom border
|
|
100
|
+
const bottomBorder = box.bottomLeft +
|
|
101
|
+
widths.map(w => box.horizontal.repeat(w + 2)).join(box.bottomT) +
|
|
102
|
+
box.bottomRight;
|
|
103
|
+
lines.push(bottomBorder);
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Simple two-column table (key-value style)
|
|
108
|
+
*/
|
|
109
|
+
export function formatKeyValueTable(data, options = {}) {
|
|
110
|
+
const columns = [
|
|
111
|
+
{ header: 'Key', key: 'label', align: 'left' },
|
|
112
|
+
{ header: 'Value', key: 'value', align: 'left' }
|
|
113
|
+
];
|
|
114
|
+
const rows = data.map(d => ({ label: d.label, value: d.value }));
|
|
115
|
+
return formatTable(columns, rows, { ...options, headerSeparator: false });
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format a schedule/calendar table
|
|
119
|
+
*/
|
|
120
|
+
export function formatScheduleTable(events, options = {}) {
|
|
121
|
+
const columns = [
|
|
122
|
+
{ header: 'Time', key: 'time', align: 'left', width: 7 },
|
|
123
|
+
{ header: 'Event', key: 'event', align: 'left' }
|
|
124
|
+
];
|
|
125
|
+
return formatTable(columns, events, { rounded: true, compact: true, ...options });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Simple horizontal line/divider
|
|
129
|
+
*/
|
|
130
|
+
export function formatDivider(width = 80, char = '─') {
|
|
131
|
+
return char.repeat(width);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
export declare function formatToolStart(tool: string, args: Record<string, unknown>, emulationId?: string): string;
|
|
2
2
|
export declare function formatToolEnd(tool: string, result: string, durationMs?: number, emulationId?: string): string;
|
|
3
3
|
export declare function formatToolError(tool: string, error: string, emulationId?: string): string;
|
|
4
|
-
export
|
|
4
|
+
export interface ToolOutputMessage {
|
|
5
5
|
preview: string;
|
|
6
6
|
full: string;
|
|
7
7
|
truncated: boolean;
|
|
8
|
-
|
|
8
|
+
diffLines?: Array<{
|
|
9
|
+
type: 'add' | 'remove' | 'context';
|
|
10
|
+
text: string;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export declare function buildToolOutputMessage(tool: string, result: string, durationMs?: number, emulationId?: string): ToolOutputMessage;
|
|
9
14
|
//# sourceMappingURL=tool_trace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_trace.d.ts","sourceRoot":"","sources":["../../src/utils/tool_trace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool_trace.d.ts","sourceRoot":"","sources":["../../src/utils/tool_trace.ts"],"names":[],"mappings":"AAkOA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBzG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB7G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBzF;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,iBAAiB,CAmDnB"}
|