@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.
Files changed (112) hide show
  1. package/README.md +258 -105
  2. package/dist/branching.d.ts +56 -0
  3. package/dist/branching.d.ts.map +1 -0
  4. package/dist/branching.js +211 -0
  5. package/dist/branching.js.map +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +235 -2
  8. package/dist/cli.js.map +1 -1
  9. package/dist/completion.d.ts +75 -0
  10. package/dist/completion.d.ts.map +1 -0
  11. package/dist/completion.js +234 -0
  12. package/dist/completion.js.map +1 -0
  13. package/dist/config.d.ts +36 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +90 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/diff.d.ts +73 -0
  18. package/dist/diff.d.ts.map +1 -0
  19. package/dist/diff.js +317 -0
  20. package/dist/diff.js.map +1 -0
  21. package/dist/errors.d.ts +41 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +199 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/file-watcher.d.ts +91 -0
  26. package/dist/file-watcher.d.ts.map +1 -0
  27. package/dist/file-watcher.js +269 -0
  28. package/dist/file-watcher.js.map +1 -0
  29. package/dist/files.d.ts +49 -0
  30. package/dist/files.d.ts.map +1 -0
  31. package/dist/files.js +191 -0
  32. package/dist/files.js.map +1 -0
  33. package/dist/fuzzy-search.d.ts +75 -0
  34. package/dist/fuzzy-search.d.ts.map +1 -0
  35. package/dist/fuzzy-search.js +240 -0
  36. package/dist/fuzzy-search.js.map +1 -0
  37. package/dist/hooks.d.ts +79 -0
  38. package/dist/hooks.d.ts.map +1 -0
  39. package/dist/hooks.js +271 -0
  40. package/dist/hooks.js.map +1 -0
  41. package/dist/keyboard.d.ts +57 -0
  42. package/dist/keyboard.d.ts.map +1 -0
  43. package/dist/keyboard.js +265 -0
  44. package/dist/keyboard.js.map +1 -0
  45. package/dist/markdown.d.ts +14 -0
  46. package/dist/markdown.d.ts.map +1 -0
  47. package/dist/markdown.js +248 -0
  48. package/dist/markdown.js.map +1 -0
  49. package/dist/mcp.d.ts +90 -0
  50. package/dist/mcp.d.ts.map +1 -0
  51. package/dist/mcp.js +290 -0
  52. package/dist/mcp.js.map +1 -0
  53. package/dist/memory.d.ts +104 -0
  54. package/dist/memory.d.ts.map +1 -0
  55. package/dist/memory.js +394 -0
  56. package/dist/memory.js.map +1 -0
  57. package/dist/model-router.d.ts +67 -0
  58. package/dist/model-router.d.ts.map +1 -0
  59. package/dist/model-router.js +289 -0
  60. package/dist/model-router.js.map +1 -0
  61. package/dist/parallel-tools.d.ts +51 -0
  62. package/dist/parallel-tools.d.ts.map +1 -0
  63. package/dist/parallel-tools.js +278 -0
  64. package/dist/parallel-tools.js.map +1 -0
  65. package/dist/project-config.d.ts +84 -0
  66. package/dist/project-config.d.ts.map +1 -0
  67. package/dist/project-config.js +250 -0
  68. package/dist/project-config.js.map +1 -0
  69. package/dist/providers.d.ts +10 -2
  70. package/dist/providers.d.ts.map +1 -1
  71. package/dist/providers.js +240 -38
  72. package/dist/providers.js.map +1 -1
  73. package/dist/risk.d.ts +31 -0
  74. package/dist/risk.d.ts.map +1 -0
  75. package/dist/risk.js +367 -0
  76. package/dist/risk.js.map +1 -0
  77. package/dist/sandbox.d.ts +49 -0
  78. package/dist/sandbox.d.ts.map +1 -0
  79. package/dist/sandbox.js +347 -0
  80. package/dist/sandbox.js.map +1 -0
  81. package/dist/skills.d.ts +71 -0
  82. package/dist/skills.d.ts.map +1 -0
  83. package/dist/skills.js +383 -0
  84. package/dist/skills.js.map +1 -0
  85. package/dist/storage.d.ts +139 -0
  86. package/dist/storage.d.ts.map +1 -0
  87. package/dist/storage.js +508 -0
  88. package/dist/storage.js.map +1 -0
  89. package/dist/streaming.d.ts +94 -0
  90. package/dist/streaming.d.ts.map +1 -0
  91. package/dist/streaming.js +305 -0
  92. package/dist/streaming.js.map +1 -0
  93. package/dist/summarization.d.ts +76 -0
  94. package/dist/summarization.d.ts.map +1 -0
  95. package/dist/summarization.js +242 -0
  96. package/dist/summarization.js.map +1 -0
  97. package/dist/themes.d.ts +110 -0
  98. package/dist/themes.d.ts.map +1 -0
  99. package/dist/themes.js +329 -0
  100. package/dist/themes.js.map +1 -0
  101. package/dist/tools.d.ts.map +1 -1
  102. package/dist/tools.js +335 -1
  103. package/dist/tools.js.map +1 -1
  104. package/dist/types.d.ts +56 -1
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +105 -0
  107. package/dist/types.js.map +1 -1
  108. package/dist/ui-cli.d.ts +9 -2
  109. package/dist/ui-cli.d.ts.map +1 -1
  110. package/dist/ui-cli.js +1315 -220
  111. package/dist/ui-cli.js.map +1 -1
  112. 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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"}
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,6BAA6B;AAC7B,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpE,4DAA4D;AAC5D,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,WAAW,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,GAAW;IAI5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,SAAS,GAAG,cAAc,CAAC;IACjC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChF,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,UAAU,GAAG,oCAAoC,CAAC;IACxD,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,UAAU,GAAG,uCAAuC,CAAC;IAC3D,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,SAAS,GAAG,KAAK;SAClB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IAEV,OAAO,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,QAAQ,iBAAiB,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,aAAa,GAAG,IAAI,KAAK,EAAE,CAAC;QACtH,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACzG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,cAAc,GAAG,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QAC5J,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE7C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAChI,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,KAAe,EACf,cAAuB;IAKvB,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,uBAAuB;IACvB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,4CAA4C,CAAC,CAAC;gBAC1E,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC,CAAC;gBACH,kCAAkC;gBAClC,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB,QAAQ,GAAG;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY;YACZ,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,eAAe,QAAQ,SAAS,MAAM,CAAC,OAAO,gBAAgB,QAAQ,QAAQ;iBACrF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI;gBAC5B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG;gBAClB,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;oBACxB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;oBACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -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"}