@calliopelabs/cli 0.4.6 → 0.6.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 +258 -105
- package/dist/branching.d.ts +56 -0
- package/dist/branching.d.ts.map +1 -0
- package/dist/branching.js +211 -0
- package/dist/branching.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +235 -2
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +75 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +234 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +90 -0
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +73 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +317 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +199 -0
- package/dist/errors.js.map +1 -0
- package/dist/file-watcher.d.ts +91 -0
- package/dist/file-watcher.d.ts.map +1 -0
- package/dist/file-watcher.js +269 -0
- package/dist/file-watcher.js.map +1 -0
- package/dist/files.d.ts +49 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +191 -0
- package/dist/files.js.map +1 -0
- package/dist/fuzzy-search.d.ts +75 -0
- package/dist/fuzzy-search.d.ts.map +1 -0
- package/dist/fuzzy-search.js +240 -0
- package/dist/fuzzy-search.js.map +1 -0
- package/dist/hooks.d.ts +79 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +271 -0
- package/dist/hooks.js.map +1 -0
- package/dist/keyboard.d.ts +57 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +265 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/markdown.d.ts +14 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +248 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mcp.d.ts +90 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +290 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +104 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +394 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +67 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +289 -0
- package/dist/model-router.js.map +1 -0
- package/dist/parallel-tools.d.ts +51 -0
- package/dist/parallel-tools.d.ts.map +1 -0
- package/dist/parallel-tools.js +278 -0
- package/dist/parallel-tools.js.map +1 -0
- package/dist/project-config.d.ts +84 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +250 -0
- package/dist/project-config.js.map +1 -0
- package/dist/providers.d.ts +10 -2
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +240 -38
- package/dist/providers.js.map +1 -1
- package/dist/risk.d.ts +31 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +367 -0
- package/dist/risk.js.map +1 -0
- package/dist/sandbox.d.ts +49 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +347 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/skills.d.ts +71 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +383 -0
- package/dist/skills.js.map +1 -0
- package/dist/storage.d.ts +139 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +508 -0
- package/dist/storage.js.map +1 -0
- package/dist/streaming.d.ts +94 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +305 -0
- package/dist/streaming.js.map +1 -0
- package/dist/summarization.d.ts +76 -0
- package/dist/summarization.d.ts.map +1 -0
- package/dist/summarization.js +242 -0
- package/dist/summarization.js.map +1 -0
- package/dist/themes.d.ts +110 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +329 -0
- package/dist/themes.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +335 -1
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +56 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +105 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-cli.d.ts +9 -2
- package/dist/ui-cli.d.ts.map +1 -1
- package/dist/ui-cli.js +1315 -220
- package/dist/ui-cli.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope CLI - File Watcher
|
|
3
|
+
*
|
|
4
|
+
* Watch for file changes and notify the agent.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Default Ignore Patterns
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const DEFAULT_IGNORE = [
|
|
12
|
+
'node_modules',
|
|
13
|
+
'.git',
|
|
14
|
+
'dist',
|
|
15
|
+
'build',
|
|
16
|
+
'.next',
|
|
17
|
+
'__pycache__',
|
|
18
|
+
'*.log',
|
|
19
|
+
'*.lock',
|
|
20
|
+
'.DS_Store',
|
|
21
|
+
'Thumbs.db',
|
|
22
|
+
];
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// File Watcher
|
|
25
|
+
// ============================================================================
|
|
26
|
+
export class FileWatcher {
|
|
27
|
+
watchers = [];
|
|
28
|
+
callbacks = [];
|
|
29
|
+
debounceTimers = new Map();
|
|
30
|
+
options;
|
|
31
|
+
baseDir;
|
|
32
|
+
running = false;
|
|
33
|
+
constructor(baseDir, options = {}) {
|
|
34
|
+
this.baseDir = baseDir;
|
|
35
|
+
this.options = {
|
|
36
|
+
patterns: options.patterns || ['**/*'],
|
|
37
|
+
ignorePatterns: options.ignorePatterns || DEFAULT_IGNORE,
|
|
38
|
+
debounceMs: options.debounceMs || 100,
|
|
39
|
+
recursive: options.recursive !== false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start watching
|
|
44
|
+
*/
|
|
45
|
+
start() {
|
|
46
|
+
if (this.running)
|
|
47
|
+
return;
|
|
48
|
+
this.running = true;
|
|
49
|
+
this.watchDirectory(this.baseDir);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Stop watching
|
|
53
|
+
*/
|
|
54
|
+
stop() {
|
|
55
|
+
this.running = false;
|
|
56
|
+
for (const watcher of this.watchers) {
|
|
57
|
+
watcher.close();
|
|
58
|
+
}
|
|
59
|
+
this.watchers = [];
|
|
60
|
+
for (const timer of this.debounceTimers.values()) {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
}
|
|
63
|
+
this.debounceTimers.clear();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Add event listener
|
|
67
|
+
*/
|
|
68
|
+
on(callback) {
|
|
69
|
+
this.callbacks.push(callback);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Remove event listener
|
|
73
|
+
*/
|
|
74
|
+
off(callback) {
|
|
75
|
+
const index = this.callbacks.indexOf(callback);
|
|
76
|
+
if (index >= 0) {
|
|
77
|
+
this.callbacks.splice(index, 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Watch a directory
|
|
82
|
+
*/
|
|
83
|
+
watchDirectory(dir) {
|
|
84
|
+
if (!this.running)
|
|
85
|
+
return;
|
|
86
|
+
try {
|
|
87
|
+
const watcher = fs.watch(dir, { recursive: this.options.recursive }, (eventType, filename) => {
|
|
88
|
+
if (!filename)
|
|
89
|
+
return;
|
|
90
|
+
const fullPath = path.join(dir, filename);
|
|
91
|
+
const relativePath = path.relative(this.baseDir, fullPath);
|
|
92
|
+
// Check ignore patterns
|
|
93
|
+
if (this.shouldIgnore(relativePath))
|
|
94
|
+
return;
|
|
95
|
+
// Debounce events
|
|
96
|
+
this.debounceEvent(fullPath, relativePath);
|
|
97
|
+
});
|
|
98
|
+
this.watchers.push(watcher);
|
|
99
|
+
watcher.on('error', (error) => {
|
|
100
|
+
console.error('Watcher error:', error);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Failed to watch directory:', dir, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if path should be ignored
|
|
109
|
+
*/
|
|
110
|
+
shouldIgnore(relativePath) {
|
|
111
|
+
for (const pattern of this.options.ignorePatterns) {
|
|
112
|
+
if (this.matchPattern(relativePath, pattern)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Simple pattern matching
|
|
120
|
+
*/
|
|
121
|
+
matchPattern(path, pattern) {
|
|
122
|
+
// Handle glob patterns
|
|
123
|
+
if (pattern.includes('*')) {
|
|
124
|
+
const regex = pattern
|
|
125
|
+
.replace(/\./g, '\\.')
|
|
126
|
+
.replace(/\*\*/g, '.*')
|
|
127
|
+
.replace(/\*/g, '[^/]*');
|
|
128
|
+
return new RegExp(regex).test(path);
|
|
129
|
+
}
|
|
130
|
+
// Direct match or directory match
|
|
131
|
+
return path === pattern || path.startsWith(pattern + '/') || path.includes('/' + pattern + '/') || path.includes('/' + pattern);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Debounce file events
|
|
135
|
+
*/
|
|
136
|
+
debounceEvent(fullPath, relativePath) {
|
|
137
|
+
// Clear existing timer
|
|
138
|
+
const existing = this.debounceTimers.get(fullPath);
|
|
139
|
+
if (existing) {
|
|
140
|
+
clearTimeout(existing);
|
|
141
|
+
}
|
|
142
|
+
// Set new timer
|
|
143
|
+
const timer = setTimeout(() => {
|
|
144
|
+
this.debounceTimers.delete(fullPath);
|
|
145
|
+
this.emitEvent(fullPath, relativePath);
|
|
146
|
+
}, this.options.debounceMs);
|
|
147
|
+
this.debounceTimers.set(fullPath, timer);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Emit event to callbacks
|
|
151
|
+
*/
|
|
152
|
+
emitEvent(fullPath, relativePath) {
|
|
153
|
+
let type;
|
|
154
|
+
try {
|
|
155
|
+
fs.accessSync(fullPath);
|
|
156
|
+
// File exists - is it new or changed?
|
|
157
|
+
type = 'change'; // We can't easily tell the difference
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
type = 'unlink';
|
|
161
|
+
}
|
|
162
|
+
const event = {
|
|
163
|
+
type,
|
|
164
|
+
path: fullPath,
|
|
165
|
+
relativePath,
|
|
166
|
+
timestamp: new Date(),
|
|
167
|
+
};
|
|
168
|
+
for (const callback of this.callbacks) {
|
|
169
|
+
try {
|
|
170
|
+
callback(event);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('Watch callback error:', error);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// Singleton Instance
|
|
180
|
+
// ============================================================================
|
|
181
|
+
let globalWatcher = null;
|
|
182
|
+
/**
|
|
183
|
+
* Get or create global file watcher
|
|
184
|
+
*/
|
|
185
|
+
export function getWatcher(baseDir) {
|
|
186
|
+
if (!globalWatcher && baseDir) {
|
|
187
|
+
globalWatcher = new FileWatcher(baseDir);
|
|
188
|
+
}
|
|
189
|
+
return globalWatcher;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Start global file watcher
|
|
193
|
+
*/
|
|
194
|
+
export function startWatching(baseDir, options) {
|
|
195
|
+
if (globalWatcher) {
|
|
196
|
+
globalWatcher.stop();
|
|
197
|
+
}
|
|
198
|
+
globalWatcher = new FileWatcher(baseDir, options);
|
|
199
|
+
globalWatcher.start();
|
|
200
|
+
return globalWatcher;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Stop global file watcher
|
|
204
|
+
*/
|
|
205
|
+
export function stopWatching() {
|
|
206
|
+
if (globalWatcher) {
|
|
207
|
+
globalWatcher.stop();
|
|
208
|
+
globalWatcher = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Aggregate watch events over a time period
|
|
213
|
+
*/
|
|
214
|
+
export function createChangeAggregator(watcher, windowMs = 1000) {
|
|
215
|
+
const changes = new Map();
|
|
216
|
+
let timer = null;
|
|
217
|
+
const callback = (event) => {
|
|
218
|
+
changes.set(event.relativePath, event.type);
|
|
219
|
+
// Reset timer
|
|
220
|
+
if (timer)
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
timer = setTimeout(() => {
|
|
223
|
+
// Changes are ready to be consumed
|
|
224
|
+
}, windowMs);
|
|
225
|
+
};
|
|
226
|
+
watcher.on(callback);
|
|
227
|
+
return {
|
|
228
|
+
getChanges() {
|
|
229
|
+
const added = [];
|
|
230
|
+
const changed = [];
|
|
231
|
+
const deleted = [];
|
|
232
|
+
for (const [path, type] of changes) {
|
|
233
|
+
switch (type) {
|
|
234
|
+
case 'add':
|
|
235
|
+
added.push(path);
|
|
236
|
+
break;
|
|
237
|
+
case 'change':
|
|
238
|
+
changed.push(path);
|
|
239
|
+
break;
|
|
240
|
+
case 'unlink':
|
|
241
|
+
deleted.push(path);
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const parts = [];
|
|
246
|
+
if (added.length)
|
|
247
|
+
parts.push(`${added.length} added`);
|
|
248
|
+
if (changed.length)
|
|
249
|
+
parts.push(`${changed.length} changed`);
|
|
250
|
+
if (deleted.length)
|
|
251
|
+
parts.push(`${deleted.length} deleted`);
|
|
252
|
+
return {
|
|
253
|
+
added,
|
|
254
|
+
changed,
|
|
255
|
+
deleted,
|
|
256
|
+
summary: parts.length > 0 ? parts.join(', ') : 'No changes',
|
|
257
|
+
};
|
|
258
|
+
},
|
|
259
|
+
clear() {
|
|
260
|
+
changes.clear();
|
|
261
|
+
},
|
|
262
|
+
destroy() {
|
|
263
|
+
watcher.off(callback);
|
|
264
|
+
if (timer)
|
|
265
|
+
clearTimeout(timer);
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope CLI - File Handling
|
|
3
|
+
*
|
|
4
|
+
* Handles file references, reading, and image processing for vision.
|
|
5
|
+
*/
|
|
6
|
+
import type { TextContent, ImageContent } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a file is an image based on extension
|
|
9
|
+
*/
|
|
10
|
+
export declare function isImageFile(filePath: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Get MIME type for an image file
|
|
13
|
+
*/
|
|
14
|
+
export declare function getImageMimeType(filePath: string): 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
|
|
15
|
+
/**
|
|
16
|
+
* Parse file references from input text
|
|
17
|
+
* Supports: @filename, @path/to/file, /absolute/path, ./relative/path
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseFileReferences(input: string, cwd: string): {
|
|
20
|
+
text: string;
|
|
21
|
+
files: string[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Read a text file
|
|
25
|
+
*/
|
|
26
|
+
export declare function readTextFile(filePath: string): {
|
|
27
|
+
content: string;
|
|
28
|
+
error?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Read an image file as base64
|
|
32
|
+
*/
|
|
33
|
+
export declare function readImageFile(filePath: string): {
|
|
34
|
+
data: string;
|
|
35
|
+
mediaType: ImageContent['mediaType'];
|
|
36
|
+
error?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Process files and create message content
|
|
40
|
+
*/
|
|
41
|
+
export declare function processFilesForMessage(text: string, files: string[], supportsVision: boolean): {
|
|
42
|
+
content: (TextContent | ImageContent)[];
|
|
43
|
+
warnings: string[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Format file info for display
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatFileInfo(files: string[]): string;
|
|
49
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS5D;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAe1G;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAwCA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBtH;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,cAAc,EAAE,OAAO,GACtB;IACD,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAiDA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAoBtD"}
|
package/dist/files.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope CLI - File Handling
|
|
3
|
+
*
|
|
4
|
+
* Handles file references, reading, and image processing for vision.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
// Supported image extensions
|
|
9
|
+
const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp'];
|
|
10
|
+
// Max file size for reading (1MB for text, 10MB for images)
|
|
11
|
+
const MAX_TEXT_SIZE = 1024 * 1024;
|
|
12
|
+
const MAX_IMAGE_SIZE = 10 * 1024 * 1024;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a file is an image based on extension
|
|
15
|
+
*/
|
|
16
|
+
export function isImageFile(filePath) {
|
|
17
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
18
|
+
return IMAGE_EXTENSIONS.includes(ext);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get MIME type for an image file
|
|
22
|
+
*/
|
|
23
|
+
export function getImageMimeType(filePath) {
|
|
24
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
25
|
+
switch (ext) {
|
|
26
|
+
case '.jpg':
|
|
27
|
+
case '.jpeg':
|
|
28
|
+
return 'image/jpeg';
|
|
29
|
+
case '.png':
|
|
30
|
+
return 'image/png';
|
|
31
|
+
case '.gif':
|
|
32
|
+
return 'image/gif';
|
|
33
|
+
case '.webp':
|
|
34
|
+
return 'image/webp';
|
|
35
|
+
default:
|
|
36
|
+
return 'image/jpeg';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse file references from input text
|
|
41
|
+
* Supports: @filename, @path/to/file, /absolute/path, ./relative/path
|
|
42
|
+
*/
|
|
43
|
+
export function parseFileReferences(input, cwd) {
|
|
44
|
+
const files = [];
|
|
45
|
+
// Match @file references
|
|
46
|
+
const atPattern = /@([\w./-]+)/g;
|
|
47
|
+
let match;
|
|
48
|
+
while ((match = atPattern.exec(input)) !== null) {
|
|
49
|
+
const filePath = match[1];
|
|
50
|
+
const absPath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath);
|
|
51
|
+
if (fs.existsSync(absPath)) {
|
|
52
|
+
files.push(absPath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Match absolute paths that look like files (contain extension)
|
|
56
|
+
const absPattern = /(?:^|\s)(\/[\w./-]+\.\w+)(?:\s|$)/g;
|
|
57
|
+
while ((match = absPattern.exec(input)) !== null) {
|
|
58
|
+
const filePath = match[1];
|
|
59
|
+
if (fs.existsSync(filePath) && !files.includes(filePath)) {
|
|
60
|
+
files.push(filePath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Match relative paths with ./
|
|
64
|
+
const relPattern = /(?:^|\s)(\.\/?[\w./-]+\.\w+)(?:\s|$)/g;
|
|
65
|
+
while ((match = relPattern.exec(input)) !== null) {
|
|
66
|
+
const filePath = match[1];
|
|
67
|
+
const absPath = path.join(cwd, filePath);
|
|
68
|
+
if (fs.existsSync(absPath) && !files.includes(absPath)) {
|
|
69
|
+
files.push(absPath);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Remove file references from text for cleaner display
|
|
73
|
+
let cleanText = input
|
|
74
|
+
.replace(/@[\w./-]+/g, '')
|
|
75
|
+
.replace(/\s+/g, ' ')
|
|
76
|
+
.trim();
|
|
77
|
+
return { text: cleanText || input, files };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Read a text file
|
|
81
|
+
*/
|
|
82
|
+
export function readTextFile(filePath) {
|
|
83
|
+
try {
|
|
84
|
+
const stats = fs.statSync(filePath);
|
|
85
|
+
if (stats.isDirectory()) {
|
|
86
|
+
return { content: '', error: `${filePath} is a directory` };
|
|
87
|
+
}
|
|
88
|
+
if (stats.size > MAX_TEXT_SIZE) {
|
|
89
|
+
return { content: '', error: `File too large (${Math.round(stats.size / 1024)}KB, max ${MAX_TEXT_SIZE / 1024}KB)` };
|
|
90
|
+
}
|
|
91
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
92
|
+
return { content };
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return { content: '', error: `Cannot read file: ${err instanceof Error ? err.message : String(err)}` };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Read an image file as base64
|
|
100
|
+
*/
|
|
101
|
+
export function readImageFile(filePath) {
|
|
102
|
+
try {
|
|
103
|
+
const stats = fs.statSync(filePath);
|
|
104
|
+
if (stats.size > MAX_IMAGE_SIZE) {
|
|
105
|
+
return { data: '', mediaType: 'image/jpeg', error: `Image too large (${Math.round(stats.size / 1024 / 1024)}MB, max ${MAX_IMAGE_SIZE / 1024 / 1024}MB)` };
|
|
106
|
+
}
|
|
107
|
+
const buffer = fs.readFileSync(filePath);
|
|
108
|
+
const data = buffer.toString('base64');
|
|
109
|
+
const mediaType = getImageMimeType(filePath);
|
|
110
|
+
return { data, mediaType };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return { data: '', mediaType: 'image/jpeg', error: `Cannot read image: ${err instanceof Error ? err.message : String(err)}` };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Process files and create message content
|
|
118
|
+
*/
|
|
119
|
+
export function processFilesForMessage(text, files, supportsVision) {
|
|
120
|
+
const content = [];
|
|
121
|
+
const warnings = [];
|
|
122
|
+
// Add the text content
|
|
123
|
+
if (text) {
|
|
124
|
+
content.push({ type: 'text', text });
|
|
125
|
+
}
|
|
126
|
+
// Process each file
|
|
127
|
+
for (const filePath of files) {
|
|
128
|
+
const fileName = path.basename(filePath);
|
|
129
|
+
if (isImageFile(filePath)) {
|
|
130
|
+
if (!supportsVision) {
|
|
131
|
+
warnings.push(`⚠️ ${fileName}: Vision not supported by current provider`);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const result = readImageFile(filePath);
|
|
135
|
+
if (result.error) {
|
|
136
|
+
warnings.push(`⚠️ ${fileName}: ${result.error}`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
content.push({
|
|
140
|
+
type: 'image',
|
|
141
|
+
mediaType: result.mediaType,
|
|
142
|
+
data: result.data,
|
|
143
|
+
});
|
|
144
|
+
// Add a text note about the image
|
|
145
|
+
content.push({
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: `[Attached image: ${fileName}]`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Text file
|
|
153
|
+
const result = readTextFile(filePath);
|
|
154
|
+
if (result.error) {
|
|
155
|
+
warnings.push(`⚠️ ${fileName}: ${result.error}`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
content.push({
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: `\n--- File: ${fileName} ---\n${result.content}\n--- End of ${fileName} ---\n`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return { content, warnings };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Format file info for display
|
|
169
|
+
*/
|
|
170
|
+
export function formatFileInfo(files) {
|
|
171
|
+
if (files.length === 0)
|
|
172
|
+
return '';
|
|
173
|
+
const fileInfos = files.map(f => {
|
|
174
|
+
const name = path.basename(f);
|
|
175
|
+
const isImage = isImageFile(f);
|
|
176
|
+
try {
|
|
177
|
+
const stats = fs.statSync(f);
|
|
178
|
+
const size = stats.size < 1024
|
|
179
|
+
? `${stats.size}B`
|
|
180
|
+
: stats.size < 1024 * 1024
|
|
181
|
+
? `${Math.round(stats.size / 1024)}KB`
|
|
182
|
+
: `${(stats.size / 1024 / 1024).toFixed(1)}MB`;
|
|
183
|
+
return `${isImage ? '🖼️' : '📄'} ${name} (${size})`;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return `${isImage ? '🖼️' : '📄'} ${name}`;
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
return fileInfos.join(', ');
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope CLI - Fuzzy File Search
|
|
3
|
+
*
|
|
4
|
+
* Fast fuzzy file finder with fzf-style matching.
|
|
5
|
+
*/
|
|
6
|
+
export interface SearchResult {
|
|
7
|
+
path: string;
|
|
8
|
+
relativePath: string;
|
|
9
|
+
score: number;
|
|
10
|
+
matches: Array<[number, number]>;
|
|
11
|
+
}
|
|
12
|
+
export interface SearchOptions {
|
|
13
|
+
maxResults?: number;
|
|
14
|
+
includeHidden?: boolean;
|
|
15
|
+
extensions?: string[];
|
|
16
|
+
excludeDirs?: string[];
|
|
17
|
+
caseSensitive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Recursively get all files in directory
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAllFiles(dir: string, options?: SearchOptions, basePath?: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Calculate fuzzy match score and positions
|
|
25
|
+
* Higher score = better match
|
|
26
|
+
*/
|
|
27
|
+
export declare function fuzzyMatch(pattern: string, text: string, caseSensitive?: boolean): {
|
|
28
|
+
score: number;
|
|
29
|
+
matches: Array<[number, number]>;
|
|
30
|
+
} | null;
|
|
31
|
+
/**
|
|
32
|
+
* Search files with fuzzy matching
|
|
33
|
+
*/
|
|
34
|
+
export declare function searchFiles(dir: string, pattern: string, options?: SearchOptions): SearchResult[];
|
|
35
|
+
/**
|
|
36
|
+
* Search with highlighting for display
|
|
37
|
+
*/
|
|
38
|
+
export declare function searchWithHighlight(dir: string, pattern: string, options?: SearchOptions): Array<{
|
|
39
|
+
path: string;
|
|
40
|
+
highlighted: string;
|
|
41
|
+
score: number;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Highlight matching segments in text
|
|
45
|
+
*/
|
|
46
|
+
export declare function highlightMatches(text: string, matches: Array<[number, number]>, highlightStart?: string, // Bold yellow
|
|
47
|
+
highlightEnd?: string): string;
|
|
48
|
+
export interface InteractiveSearchState {
|
|
49
|
+
query: string;
|
|
50
|
+
results: SearchResult[];
|
|
51
|
+
selectedIndex: number;
|
|
52
|
+
dir: string;
|
|
53
|
+
options: SearchOptions;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create interactive search state
|
|
57
|
+
*/
|
|
58
|
+
export declare function createSearchState(dir: string, options?: SearchOptions): InteractiveSearchState;
|
|
59
|
+
/**
|
|
60
|
+
* Update search with new query
|
|
61
|
+
*/
|
|
62
|
+
export declare function updateSearch(state: InteractiveSearchState, query: string): InteractiveSearchState;
|
|
63
|
+
/**
|
|
64
|
+
* Move selection up
|
|
65
|
+
*/
|
|
66
|
+
export declare function selectUp(state: InteractiveSearchState): InteractiveSearchState;
|
|
67
|
+
/**
|
|
68
|
+
* Move selection down
|
|
69
|
+
*/
|
|
70
|
+
export declare function selectDown(state: InteractiveSearchState): InteractiveSearchState;
|
|
71
|
+
/**
|
|
72
|
+
* Get selected result
|
|
73
|
+
*/
|
|
74
|
+
export declare function getSelected(state: InteractiveSearchState): SearchResult | null;
|
|
75
|
+
//# sourceMappingURL=fuzzy-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy-search.d.ts","sourceRoot":"","sources":["../src/fuzzy-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA6BD;;GAEG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAAkB,EAC3B,QAAQ,SAAM,GACb,MAAM,EAAE,CAsCV;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,aAAa,UAAQ,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GAAG,IAAI,CAgE5D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,YAAY,EAAE,CAqBhB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAChC,cAAc,SAAe,EAAG,cAAc;AAC9C,YAAY,SAAY,GACvB,MAAM,CAcR;AAMD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,sBAAsB,CAQlG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAQjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB,CAK9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB,CAKhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,GAAG,IAAI,CAK9E"}
|