@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
package/dist/diff.js ADDED
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Calliope CLI - Diff Preview System
3
+ *
4
+ * Shows diffs before applying file changes, with approve/reject workflow.
5
+ */
6
+ import * as fs from 'fs';
7
+ // ============================================================================
8
+ // Diff Generation
9
+ // ============================================================================
10
+ /**
11
+ * Simple line-by-line diff algorithm
12
+ */
13
+ export function generateDiff(oldContent, newContent, path) {
14
+ const oldLines = oldContent.split('\n');
15
+ const newLines = newContent.split('\n');
16
+ const diffLines = [];
17
+ let additions = 0;
18
+ let deletions = 0;
19
+ // Add header
20
+ diffLines.push({ type: 'header', content: `--- a/${path}` });
21
+ diffLines.push({ type: 'header', content: `+++ b/${path}` });
22
+ // Simple LCS-based diff
23
+ const lcs = longestCommonSubsequence(oldLines, newLines);
24
+ let oldIdx = 0;
25
+ let newIdx = 0;
26
+ let oldLineNum = 1;
27
+ let newLineNum = 1;
28
+ for (const [oldLcsIdx, newLcsIdx] of lcs) {
29
+ // Add deletions (lines in old but not in LCS)
30
+ while (oldIdx < oldLcsIdx) {
31
+ diffLines.push({
32
+ type: 'remove',
33
+ content: oldLines[oldIdx],
34
+ oldLineNum: oldLineNum++,
35
+ });
36
+ deletions++;
37
+ oldIdx++;
38
+ }
39
+ // Add additions (lines in new but not in LCS)
40
+ while (newIdx < newLcsIdx) {
41
+ diffLines.push({
42
+ type: 'add',
43
+ content: newLines[newIdx],
44
+ newLineNum: newLineNum++,
45
+ });
46
+ additions++;
47
+ newIdx++;
48
+ }
49
+ // Add context (matching line)
50
+ diffLines.push({
51
+ type: 'context',
52
+ content: oldLines[oldIdx],
53
+ oldLineNum: oldLineNum++,
54
+ newLineNum: newLineNum++,
55
+ });
56
+ oldIdx++;
57
+ newIdx++;
58
+ }
59
+ // Remaining deletions
60
+ while (oldIdx < oldLines.length) {
61
+ diffLines.push({
62
+ type: 'remove',
63
+ content: oldLines[oldIdx],
64
+ oldLineNum: oldLineNum++,
65
+ });
66
+ deletions++;
67
+ oldIdx++;
68
+ }
69
+ // Remaining additions
70
+ while (newIdx < newLines.length) {
71
+ diffLines.push({
72
+ type: 'add',
73
+ content: newLines[newIdx],
74
+ newLineNum: newLineNum++,
75
+ });
76
+ additions++;
77
+ newIdx++;
78
+ }
79
+ return {
80
+ path,
81
+ oldContent,
82
+ newContent,
83
+ lines: diffLines,
84
+ additions,
85
+ deletions,
86
+ };
87
+ }
88
+ /**
89
+ * LCS algorithm for diff
90
+ */
91
+ function longestCommonSubsequence(a, b) {
92
+ const m = a.length;
93
+ const n = b.length;
94
+ const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));
95
+ for (let i = 1; i <= m; i++) {
96
+ for (let j = 1; j <= n; j++) {
97
+ if (a[i - 1] === b[j - 1]) {
98
+ dp[i][j] = dp[i - 1][j - 1] + 1;
99
+ }
100
+ else {
101
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
102
+ }
103
+ }
104
+ }
105
+ // Backtrack to find LCS indices
106
+ const result = [];
107
+ let i = m, j = n;
108
+ while (i > 0 && j > 0) {
109
+ if (a[i - 1] === b[j - 1]) {
110
+ result.unshift([i - 1, j - 1]);
111
+ i--;
112
+ j--;
113
+ }
114
+ else if (dp[i - 1][j] > dp[i][j - 1]) {
115
+ i--;
116
+ }
117
+ else {
118
+ j--;
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ // ============================================================================
124
+ // Diff Formatting
125
+ // ============================================================================
126
+ // ANSI colors
127
+ const COLORS = {
128
+ reset: '\x1b[0m',
129
+ red: '\x1b[31m',
130
+ green: '\x1b[32m',
131
+ cyan: '\x1b[36m',
132
+ dim: '\x1b[2m',
133
+ bgRed: '\x1b[41m',
134
+ bgGreen: '\x1b[42m',
135
+ };
136
+ /**
137
+ * Format diff for terminal display
138
+ */
139
+ export function formatDiff(diff, contextLines = 3) {
140
+ const lines = [];
141
+ // Header
142
+ lines.push(`${COLORS.cyan}${diff.lines[0].content}${COLORS.reset}`);
143
+ lines.push(`${COLORS.cyan}${diff.lines[1].content}${COLORS.reset}`);
144
+ lines.push('');
145
+ // Group consecutive changes with context
146
+ const chunks = groupDiffChunks(diff.lines.slice(2), contextLines);
147
+ for (const chunk of chunks) {
148
+ // Chunk header
149
+ const startOld = chunk.find(l => l.oldLineNum)?.oldLineNum || 1;
150
+ const startNew = chunk.find(l => l.newLineNum)?.newLineNum || 1;
151
+ lines.push(`${COLORS.cyan}@@ -${startOld} +${startNew} @@${COLORS.reset}`);
152
+ for (const line of chunk) {
153
+ switch (line.type) {
154
+ case 'add':
155
+ lines.push(`${COLORS.green}+${line.content}${COLORS.reset}`);
156
+ break;
157
+ case 'remove':
158
+ lines.push(`${COLORS.red}-${line.content}${COLORS.reset}`);
159
+ break;
160
+ case 'context':
161
+ lines.push(`${COLORS.dim} ${line.content}${COLORS.reset}`);
162
+ break;
163
+ }
164
+ }
165
+ lines.push('');
166
+ }
167
+ // Summary
168
+ lines.push(`${COLORS.green}+${diff.additions}${COLORS.reset} ${COLORS.red}-${diff.deletions}${COLORS.reset}`);
169
+ return lines.join('\n');
170
+ }
171
+ /**
172
+ * Format diff as compact summary
173
+ */
174
+ export function formatDiffSummary(diff) {
175
+ return `${diff.path}: ${COLORS.green}+${diff.additions}${COLORS.reset} ${COLORS.red}-${diff.deletions}${COLORS.reset}`;
176
+ }
177
+ /**
178
+ * Group diff lines into chunks with context
179
+ */
180
+ function groupDiffChunks(lines, contextLines) {
181
+ const chunks = [];
182
+ let currentChunk = [];
183
+ let contextCount = 0;
184
+ for (let i = 0; i < lines.length; i++) {
185
+ const line = lines[i];
186
+ if (line.type === 'context') {
187
+ contextCount++;
188
+ // Check if there are changes within contextLines ahead
189
+ let hasChangesAhead = false;
190
+ for (let j = i + 1; j < Math.min(i + contextLines + 1, lines.length); j++) {
191
+ if (lines[j].type !== 'context') {
192
+ hasChangesAhead = true;
193
+ break;
194
+ }
195
+ }
196
+ if (currentChunk.length > 0 || hasChangesAhead) {
197
+ if (contextCount <= contextLines * 2) {
198
+ currentChunk.push(line);
199
+ }
200
+ else if (hasChangesAhead) {
201
+ // Start new chunk if changes ahead
202
+ if (currentChunk.length > 0) {
203
+ chunks.push(currentChunk);
204
+ currentChunk = [];
205
+ }
206
+ currentChunk.push(line);
207
+ contextCount = 1;
208
+ }
209
+ }
210
+ }
211
+ else {
212
+ // Add or remove line
213
+ currentChunk.push(line);
214
+ contextCount = 0;
215
+ }
216
+ }
217
+ if (currentChunk.length > 0) {
218
+ chunks.push(currentChunk);
219
+ }
220
+ return chunks;
221
+ }
222
+ // ============================================================================
223
+ // Pending Changes Management
224
+ // ============================================================================
225
+ let pendingChanges = [];
226
+ /**
227
+ * Queue a file change for approval
228
+ */
229
+ export function queueChange(type, path, newContent) {
230
+ const oldContent = fs.existsSync(path) ? fs.readFileSync(path, 'utf-8') : '';
231
+ const diff = generateDiff(oldContent, newContent, path);
232
+ const change = {
233
+ id: `change_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
234
+ type,
235
+ path,
236
+ oldContent,
237
+ newContent,
238
+ diff,
239
+ approved: null,
240
+ };
241
+ pendingChanges.push(change);
242
+ return change;
243
+ }
244
+ /**
245
+ * Get all pending changes
246
+ */
247
+ export function getPendingChanges() {
248
+ return pendingChanges.filter(c => c.approved === null);
249
+ }
250
+ /**
251
+ * Approve a change and apply it
252
+ */
253
+ export function approveChange(id) {
254
+ const change = pendingChanges.find(c => c.id === id);
255
+ if (!change)
256
+ return false;
257
+ change.approved = true;
258
+ // Apply the change
259
+ if (change.type === 'delete') {
260
+ if (fs.existsSync(change.path)) {
261
+ fs.unlinkSync(change.path);
262
+ }
263
+ }
264
+ else {
265
+ fs.writeFileSync(change.path, change.newContent);
266
+ }
267
+ return true;
268
+ }
269
+ /**
270
+ * Reject a change
271
+ */
272
+ export function rejectChange(id) {
273
+ const change = pendingChanges.find(c => c.id === id);
274
+ if (!change)
275
+ return false;
276
+ change.approved = false;
277
+ return true;
278
+ }
279
+ /**
280
+ * Approve all pending changes
281
+ */
282
+ export function approveAllChanges() {
283
+ let count = 0;
284
+ for (const change of pendingChanges) {
285
+ if (change.approved === null) {
286
+ approveChange(change.id);
287
+ count++;
288
+ }
289
+ }
290
+ return count;
291
+ }
292
+ /**
293
+ * Reject all pending changes
294
+ */
295
+ export function rejectAllChanges() {
296
+ let count = 0;
297
+ for (const change of pendingChanges) {
298
+ if (change.approved === null) {
299
+ rejectChange(change.id);
300
+ count++;
301
+ }
302
+ }
303
+ return count;
304
+ }
305
+ /**
306
+ * Clear change history
307
+ */
308
+ export function clearChanges() {
309
+ pendingChanges = [];
310
+ }
311
+ /**
312
+ * Get change by ID
313
+ */
314
+ export function getChange(id) {
315
+ return pendingChanges.find(c => c.id === id);
316
+ }
317
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Calliope CLI - Error Handling
3
+ *
4
+ * Provides retry logic, error classification, and actionable suggestions.
5
+ */
6
+ export type ErrorCategory = 'network' | 'rate_limit' | 'auth' | 'invalid_request' | 'server' | 'timeout' | 'unknown';
7
+ export interface ClassifiedError {
8
+ category: ErrorCategory;
9
+ message: string;
10
+ suggestion: string;
11
+ retryable: boolean;
12
+ retryAfterMs?: number;
13
+ }
14
+ export interface RetryOptions {
15
+ maxRetries?: number;
16
+ initialDelayMs?: number;
17
+ maxDelayMs?: number;
18
+ backoffMultiplier?: number;
19
+ onRetry?: (attempt: number, error: Error, delayMs: number) => void;
20
+ }
21
+ /**
22
+ * Classify an error and provide actionable suggestions
23
+ */
24
+ export declare function classifyError(error: unknown): ClassifiedError;
25
+ /**
26
+ * Format an error for user display
27
+ */
28
+ export declare function formatError(error: unknown): string;
29
+ /**
30
+ * Execute a function with retry logic
31
+ */
32
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
33
+ /**
34
+ * Wrap an async function to add retry logic
35
+ */
36
+ export declare function retryable<T extends (...args: unknown[]) => Promise<unknown>>(fn: T, options?: RetryOptions): T;
37
+ /**
38
+ * Get provider-specific suggestions
39
+ */
40
+ export declare function getProviderSuggestion(provider: string, error: unknown): string | null;
41
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,YAAY,GACZ,MAAM,GACN,iBAAiB,GACjB,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAkH7D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASlD;AAoBD;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAmCZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EAC1E,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,YAAiB,GACzB,CAAC,CAEH;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAuBrF"}
package/dist/errors.js ADDED
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Calliope CLI - Error Handling
3
+ *
4
+ * Provides retry logic, error classification, and actionable suggestions.
5
+ */
6
+ // ============================================================================
7
+ // Error Classification
8
+ // ============================================================================
9
+ /**
10
+ * Classify an error and provide actionable suggestions
11
+ */
12
+ export function classifyError(error) {
13
+ const message = error instanceof Error ? error.message : String(error);
14
+ const lowerMessage = message.toLowerCase();
15
+ // Network errors
16
+ if (lowerMessage.includes('econnrefused') ||
17
+ lowerMessage.includes('enotfound') ||
18
+ lowerMessage.includes('network') ||
19
+ lowerMessage.includes('dns') ||
20
+ lowerMessage.includes('socket')) {
21
+ return {
22
+ category: 'network',
23
+ message: 'Network connection failed',
24
+ suggestion: 'Check your internet connection and try again.',
25
+ retryable: true,
26
+ retryAfterMs: 2000,
27
+ };
28
+ }
29
+ // Rate limiting
30
+ if (lowerMessage.includes('rate limit') ||
31
+ lowerMessage.includes('too many requests') ||
32
+ lowerMessage.includes('429') ||
33
+ lowerMessage.includes('quota')) {
34
+ // Try to extract retry-after from error
35
+ const retryMatch = message.match(/retry.?after[:\s]+(\d+)/i);
36
+ const retryAfterMs = retryMatch ? parseInt(retryMatch[1]) * 1000 : 60000;
37
+ return {
38
+ category: 'rate_limit',
39
+ message: 'Rate limit exceeded',
40
+ suggestion: `Wait ${Math.round(retryAfterMs / 1000)} seconds and try again, or switch providers with /provider.`,
41
+ retryable: true,
42
+ retryAfterMs,
43
+ };
44
+ }
45
+ // Authentication errors
46
+ if (lowerMessage.includes('unauthorized') ||
47
+ lowerMessage.includes('401') ||
48
+ lowerMessage.includes('api key') ||
49
+ lowerMessage.includes('authentication') ||
50
+ lowerMessage.includes('invalid key') ||
51
+ lowerMessage.includes('invalid_api_key')) {
52
+ return {
53
+ category: 'auth',
54
+ message: 'Authentication failed',
55
+ suggestion: 'Check your API key with /config or run `calliope --setup` to reconfigure.',
56
+ retryable: false,
57
+ };
58
+ }
59
+ // Invalid request errors
60
+ if (lowerMessage.includes('bad request') ||
61
+ lowerMessage.includes('400') ||
62
+ lowerMessage.includes('invalid') ||
63
+ lowerMessage.includes('malformed')) {
64
+ return {
65
+ category: 'invalid_request',
66
+ message: 'Invalid request',
67
+ suggestion: 'Try rephrasing your message or use /clear to reset the conversation.',
68
+ retryable: false,
69
+ };
70
+ }
71
+ // Timeout errors
72
+ if (lowerMessage.includes('timeout') ||
73
+ lowerMessage.includes('timed out') ||
74
+ lowerMessage.includes('etimedout')) {
75
+ return {
76
+ category: 'timeout',
77
+ message: 'Request timed out',
78
+ suggestion: 'The request took too long. Try a simpler query or check server status.',
79
+ retryable: true,
80
+ retryAfterMs: 5000,
81
+ };
82
+ }
83
+ // Server errors
84
+ if (lowerMessage.includes('500') ||
85
+ lowerMessage.includes('502') ||
86
+ lowerMessage.includes('503') ||
87
+ lowerMessage.includes('504') ||
88
+ lowerMessage.includes('internal server') ||
89
+ lowerMessage.includes('service unavailable')) {
90
+ return {
91
+ category: 'server',
92
+ message: 'Server error',
93
+ suggestion: 'The API server is having issues. Wait a moment and try again, or switch providers.',
94
+ retryable: true,
95
+ retryAfterMs: 10000,
96
+ };
97
+ }
98
+ // Unknown error
99
+ return {
100
+ category: 'unknown',
101
+ message: message.length > 100 ? message.substring(0, 100) + '...' : message,
102
+ suggestion: 'An unexpected error occurred. Try again or use /clear to reset.',
103
+ retryable: true,
104
+ retryAfterMs: 3000,
105
+ };
106
+ }
107
+ /**
108
+ * Format an error for user display
109
+ */
110
+ export function formatError(error) {
111
+ const classified = classifyError(error);
112
+ let output = `✗ ${classified.message}`;
113
+ if (classified.suggestion) {
114
+ output += `\n 💡 ${classified.suggestion}`;
115
+ }
116
+ return output;
117
+ }
118
+ // ============================================================================
119
+ // Retry Logic
120
+ // ============================================================================
121
+ const DEFAULT_RETRY_OPTIONS = {
122
+ maxRetries: 3,
123
+ initialDelayMs: 1000,
124
+ maxDelayMs: 30000,
125
+ backoffMultiplier: 2,
126
+ };
127
+ /**
128
+ * Sleep for a given number of milliseconds
129
+ */
130
+ function sleep(ms) {
131
+ return new Promise(resolve => setTimeout(resolve, ms));
132
+ }
133
+ /**
134
+ * Execute a function with retry logic
135
+ */
136
+ export async function withRetry(fn, options = {}) {
137
+ const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
138
+ let lastError;
139
+ let delay = opts.initialDelayMs;
140
+ for (let attempt = 1; attempt <= opts.maxRetries + 1; attempt++) {
141
+ try {
142
+ return await fn();
143
+ }
144
+ catch (error) {
145
+ lastError = error instanceof Error ? error : new Error(String(error));
146
+ // Check if we should retry
147
+ const classified = classifyError(error);
148
+ if (!classified.retryable || attempt > opts.maxRetries) {
149
+ throw lastError;
150
+ }
151
+ // Use the error's suggested delay if available
152
+ const retryDelay = classified.retryAfterMs
153
+ ? Math.min(classified.retryAfterMs, opts.maxDelayMs)
154
+ : Math.min(delay, opts.maxDelayMs);
155
+ // Notify about retry
156
+ if (opts.onRetry) {
157
+ opts.onRetry(attempt, lastError, retryDelay);
158
+ }
159
+ await sleep(retryDelay);
160
+ // Exponential backoff
161
+ delay *= opts.backoffMultiplier;
162
+ }
163
+ }
164
+ throw lastError || new Error('Max retries exceeded');
165
+ }
166
+ /**
167
+ * Wrap an async function to add retry logic
168
+ */
169
+ export function retryable(fn, options = {}) {
170
+ return ((...args) => withRetry(() => fn(...args), options));
171
+ }
172
+ // ============================================================================
173
+ // Provider-Specific Error Handling
174
+ // ============================================================================
175
+ /**
176
+ * Get provider-specific suggestions
177
+ */
178
+ export function getProviderSuggestion(provider, error) {
179
+ const classified = classifyError(error);
180
+ if (classified.category === 'auth') {
181
+ switch (provider) {
182
+ case 'anthropic':
183
+ return 'Get your API key at https://console.anthropic.com/';
184
+ case 'openai':
185
+ return 'Get your API key at https://platform.openai.com/api-keys';
186
+ case 'google':
187
+ return 'Get your API key at https://aistudio.google.com/apikey';
188
+ case 'openrouter':
189
+ return 'Get your API key at https://openrouter.ai/keys';
190
+ default:
191
+ return null;
192
+ }
193
+ }
194
+ if (classified.category === 'rate_limit') {
195
+ return `Try switching to another provider with /provider`;
196
+ }
197
+ return null;
198
+ }
199
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,iBAAiB;IACjB,IACE,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC/B,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,2BAA2B;YACpC,UAAU,EAAE,+CAA+C;YAC3D,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IACE,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;QACnC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1C,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC9B,CAAC;QACD,wCAAwC;QACxC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAEzE,OAAO;YACL,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,qBAAqB;YAC9B,UAAU,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,6DAA6D;YAChH,SAAS,EAAE,IAAI;YACf,YAAY;SACb,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IACE,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACvC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACxC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,uBAAuB;YAChC,UAAU,EAAE,2EAA2E;YACvF,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IACE,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAClC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,iBAAiB;YAC3B,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,sEAAsE;YAClF,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IACE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAClC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,mBAAmB;YAC5B,UAAU,EAAE,wEAAwE;YACpF,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IACE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACxC,YAAY,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAC5C,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,oFAAoF;YAChG,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO;QAC3E,UAAU,EAAE,iEAAiE;QAC7E,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,MAAM,GAAG,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,UAAU,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,qBAAqB,GAA4C;IACrE,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,IAAI,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,OAAO,EAAE,CAAC;IACtD,IAAI,SAA4B,CAAC;IACjC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;IAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,2BAA2B;YAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvD,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,+CAA+C;YAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY;gBACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC;gBACpD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAErC,qBAAqB;YACrB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;YAExB,sBAAsB;YACtB,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,EAAK,EACL,UAAwB,EAAE;IAE1B,OAAO,CAAC,CAAC,GAAG,IAAmB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAM,CAAC;AAClF,CAAC;AAED,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,KAAc;IACpE,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACnC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,WAAW;gBACd,OAAO,oDAAoD,CAAC;YAC9D,KAAK,QAAQ;gBACX,OAAO,0DAA0D,CAAC;YACpE,KAAK,QAAQ;gBACX,OAAO,wDAAwD,CAAC;YAClE,KAAK,YAAY;gBACf,OAAO,gDAAgD,CAAC;YAC1D;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACzC,OAAO,kDAAkD,CAAC;IAC5D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Calliope CLI - File Watcher
3
+ *
4
+ * Watch for file changes and notify the agent.
5
+ */
6
+ export type WatchEventType = 'add' | 'change' | 'unlink';
7
+ export interface WatchEvent {
8
+ type: WatchEventType;
9
+ path: string;
10
+ relativePath: string;
11
+ timestamp: Date;
12
+ }
13
+ export interface WatcherOptions {
14
+ patterns?: string[];
15
+ ignorePatterns?: string[];
16
+ debounceMs?: number;
17
+ recursive?: boolean;
18
+ }
19
+ export type WatchCallback = (event: WatchEvent) => void;
20
+ export declare class FileWatcher {
21
+ private watchers;
22
+ private callbacks;
23
+ private debounceTimers;
24
+ private options;
25
+ private baseDir;
26
+ private running;
27
+ constructor(baseDir: string, options?: WatcherOptions);
28
+ /**
29
+ * Start watching
30
+ */
31
+ start(): void;
32
+ /**
33
+ * Stop watching
34
+ */
35
+ stop(): void;
36
+ /**
37
+ * Add event listener
38
+ */
39
+ on(callback: WatchCallback): void;
40
+ /**
41
+ * Remove event listener
42
+ */
43
+ off(callback: WatchCallback): void;
44
+ /**
45
+ * Watch a directory
46
+ */
47
+ private watchDirectory;
48
+ /**
49
+ * Check if path should be ignored
50
+ */
51
+ private shouldIgnore;
52
+ /**
53
+ * Simple pattern matching
54
+ */
55
+ private matchPattern;
56
+ /**
57
+ * Debounce file events
58
+ */
59
+ private debounceEvent;
60
+ /**
61
+ * Emit event to callbacks
62
+ */
63
+ private emitEvent;
64
+ }
65
+ /**
66
+ * Get or create global file watcher
67
+ */
68
+ export declare function getWatcher(baseDir?: string): FileWatcher;
69
+ /**
70
+ * Start global file watcher
71
+ */
72
+ export declare function startWatching(baseDir: string, options?: WatcherOptions): FileWatcher;
73
+ /**
74
+ * Stop global file watcher
75
+ */
76
+ export declare function stopWatching(): void;
77
+ export interface AggregatedChanges {
78
+ added: string[];
79
+ changed: string[];
80
+ deleted: string[];
81
+ summary: string;
82
+ }
83
+ /**
84
+ * Aggregate watch events over a time period
85
+ */
86
+ export declare function createChangeAggregator(watcher: FileWatcher, windowMs?: number): {
87
+ getChanges: () => AggregatedChanges;
88
+ clear: () => void;
89
+ destroy: () => void;
90
+ };
91
+ //# sourceMappingURL=file-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAuBxD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB;IAUzD;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIjC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOlC;;OAEG;IACH,OAAO,CAAC,cAAc;IA2BtB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,SAAS;CA0BlB;AAQD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAKxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,WAAW,CAOpF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAKnC;AAMD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,SAAO,GACd;IACD,UAAU,EAAE,MAAM,iBAAiB,CAAC;IACpC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA0DA"}