dartmind 17.0.0 → 17.3.1

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 (60) hide show
  1. package/dist/cli/InteractiveModeV12.d.ts +4 -0
  2. package/dist/cli/InteractiveModeV12.d.ts.map +1 -1
  3. package/dist/cli/InteractiveModeV12.js +57 -1
  4. package/dist/cli/InteractiveModeV12.js.map +1 -1
  5. package/dist/cli/commands/SlashCommands.d.ts.map +1 -1
  6. package/dist/cli/commands/SlashCommands.js +21 -5
  7. package/dist/cli/commands/SlashCommands.js.map +1 -1
  8. package/dist/core/cost/__tests__/day1.test.d.ts +9 -0
  9. package/dist/core/cost/__tests__/day1.test.d.ts.map +1 -0
  10. package/dist/core/cost/__tests__/day1.test.js +284 -0
  11. package/dist/core/cost/__tests__/day1.test.js.map +1 -0
  12. package/dist/core/cost/__tests__/day2.test.d.ts +9 -0
  13. package/dist/core/cost/__tests__/day2.test.d.ts.map +1 -0
  14. package/dist/core/cost/__tests__/day2.test.js +414 -0
  15. package/dist/core/cost/__tests__/day2.test.js.map +1 -0
  16. package/dist/core/cost/__tests__/day3.test.d.ts +9 -0
  17. package/dist/core/cost/__tests__/day3.test.d.ts.map +1 -0
  18. package/dist/core/cost/__tests__/day3.test.js +415 -0
  19. package/dist/core/cost/__tests__/day3.test.js.map +1 -0
  20. package/dist/core/cost/__tests__/day4.test.d.ts +9 -0
  21. package/dist/core/cost/__tests__/day4.test.d.ts.map +1 -0
  22. package/dist/core/cost/__tests__/day4.test.js +354 -0
  23. package/dist/core/cost/__tests__/day4.test.js.map +1 -0
  24. package/dist/core/cost/context-scaler.d.ts +129 -0
  25. package/dist/core/cost/context-scaler.d.ts.map +1 -0
  26. package/dist/core/cost/context-scaler.js +336 -0
  27. package/dist/core/cost/context-scaler.js.map +1 -0
  28. package/dist/core/cost/index.d.ts +31 -0
  29. package/dist/core/cost/index.d.ts.map +1 -0
  30. package/dist/core/cost/index.js +103 -0
  31. package/dist/core/cost/index.js.map +1 -0
  32. package/dist/core/cost/integration.d.ts +144 -0
  33. package/dist/core/cost/integration.d.ts.map +1 -0
  34. package/dist/core/cost/integration.js +349 -0
  35. package/dist/core/cost/integration.js.map +1 -0
  36. package/dist/core/cost/model-router.d.ts +70 -0
  37. package/dist/core/cost/model-router.d.ts.map +1 -0
  38. package/dist/core/cost/model-router.js +319 -0
  39. package/dist/core/cost/model-router.js.map +1 -0
  40. package/dist/core/cost/prompt-cache.d.ts +98 -0
  41. package/dist/core/cost/prompt-cache.d.ts.map +1 -0
  42. package/dist/core/cost/prompt-cache.js +219 -0
  43. package/dist/core/cost/prompt-cache.js.map +1 -0
  44. package/dist/core/cost/reflex-layer.d.ts +48 -0
  45. package/dist/core/cost/reflex-layer.d.ts.map +1 -0
  46. package/dist/core/cost/reflex-layer.js +295 -0
  47. package/dist/core/cost/reflex-layer.js.map +1 -0
  48. package/dist/core/cost/response-cache.d.ts +139 -0
  49. package/dist/core/cost/response-cache.d.ts.map +1 -0
  50. package/dist/core/cost/response-cache.js +290 -0
  51. package/dist/core/cost/response-cache.js.map +1 -0
  52. package/dist/core/cost/tool-loader.d.ts +94 -0
  53. package/dist/core/cost/tool-loader.d.ts.map +1 -0
  54. package/dist/core/cost/tool-loader.js +233 -0
  55. package/dist/core/cost/tool-loader.js.map +1 -0
  56. package/dist/core/cost/types.d.ts +93 -0
  57. package/dist/core/cost/types.d.ts.map +1 -0
  58. package/dist/core/cost/types.js +29 -0
  59. package/dist/core/cost/types.js.map +1 -0
  60. package/package.json +1 -1
@@ -0,0 +1,48 @@
1
+ /**
2
+ * DartMind V17.3 - Reflex Layer
3
+ *
4
+ * PURPOSE: Handle trivial inputs locally without API calls.
5
+ * COST IMPACT: 15-20% of requests → $0.00
6
+ * QUALITY IMPACT: NONE (only exact pattern matches)
7
+ *
8
+ * SAFETY FEATURES:
9
+ * - Only matches exact patterns (no fuzzy matching)
10
+ * - Falls through to AI for ANY uncertainty
11
+ * - Can be disabled via config.enableReflexLayer
12
+ * - Never intercepts questions or code-related queries
13
+ *
14
+ * @module cost/reflex-layer
15
+ * @version 17.3.0
16
+ */
17
+ import { ReflexResult } from './types.js';
18
+ interface CommandHandler {
19
+ command: string;
20
+ aliases: string[];
21
+ description: string;
22
+ handler: (args?: string) => string;
23
+ }
24
+ /**
25
+ * Check if input should bypass reflex layer entirely.
26
+ * Returns true if the input looks like a real query.
27
+ */
28
+ export declare function shouldBypassReflex(input: string): boolean;
29
+ /**
30
+ * Try to handle input with reflex layer.
31
+ * Returns handled=true if we can respond locally.
32
+ * Returns handled=false if we should pass to AI.
33
+ */
34
+ export declare function tryReflex(input: string): ReflexResult;
35
+ /**
36
+ * Get all available commands (for help/autocomplete)
37
+ */
38
+ export declare function getCommands(): CommandHandler[];
39
+ /**
40
+ * Check if input is a model override command
41
+ * Returns the model tier if found, null otherwise
42
+ */
43
+ export declare function checkModelOverride(input: string): {
44
+ model: 'haiku' | 'sonnet' | 'opus';
45
+ query: string;
46
+ } | null;
47
+ export {};
48
+ //# sourceMappingURL=reflex-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflex-layer.d.ts","sourceRoot":"","sources":["../../../src/core/cost/reflex-layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAmHtD,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AA6FD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAmBzD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAoDrD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAE9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAe9G"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * DartMind V17.3 - Reflex Layer
3
+ *
4
+ * PURPOSE: Handle trivial inputs locally without API calls.
5
+ * COST IMPACT: 15-20% of requests → $0.00
6
+ * QUALITY IMPACT: NONE (only exact pattern matches)
7
+ *
8
+ * SAFETY FEATURES:
9
+ * - Only matches exact patterns (no fuzzy matching)
10
+ * - Falls through to AI for ANY uncertainty
11
+ * - Can be disabled via config.enableReflexLayer
12
+ * - Never intercepts questions or code-related queries
13
+ *
14
+ * @module cost/reflex-layer
15
+ * @version 17.3.0
16
+ */
17
+ const REFLEX_PATTERNS = [
18
+ // ─────────────────────────────────────────────────────────────
19
+ // GREETINGS - Friendly response, no AI needed
20
+ // ─────────────────────────────────────────────────────────────
21
+ {
22
+ name: 'greeting_simple',
23
+ intent: 'greeting',
24
+ pattern: /^(hi|hello|hey|yo|sup|hola|howdy|hiya)[\s!.,;:]*$/i,
25
+ response: `Hello! I'm ready to help with your Flutter project. What would you like to work on?`
26
+ },
27
+ {
28
+ name: 'greeting_morning',
29
+ intent: 'greeting',
30
+ pattern: /^good\s*(morning|afternoon|evening|day)[\s!.,;:]*$/i,
31
+ response: `Good day! I'm ready to assist with your Flutter development. What can I help you build?`
32
+ },
33
+ {
34
+ name: 'greeting_whatsup',
35
+ intent: 'greeting',
36
+ pattern: /^(what'?s?\s*up|wh?assup|wassup)[\s!?,;:]*$/i,
37
+ response: `Hey! Ready to help with your Flutter project. What are we building today?`
38
+ },
39
+ // ─────────────────────────────────────────────────────────────
40
+ // FAREWELLS - Polite goodbye
41
+ // ─────────────────────────────────────────────────────────────
42
+ {
43
+ name: 'farewell',
44
+ intent: 'farewell',
45
+ pattern: /^(bye|goodbye|good\s*bye|see\s*ya|later|cya|quit|exit|done)[\s!.,;:]*$/i,
46
+ response: `Goodbye! Happy coding!`
47
+ },
48
+ // ─────────────────────────────────────────────────────────────
49
+ // THANKS - Acknowledge politely
50
+ // ─────────────────────────────────────────────────────────────
51
+ {
52
+ name: 'thanks',
53
+ intent: 'affirmation',
54
+ pattern: /^(thanks?|thank\s*you|thx|ty|cheers|ta|appreciated?)[\s!.,;:]*$/i,
55
+ response: `You're welcome! Let me know if you need anything else.`
56
+ },
57
+ {
58
+ name: 'thanks_extended',
59
+ intent: 'affirmation',
60
+ pattern: /^(thanks?\s*(a\s*lot|so\s*much|very\s*much)|much\s*appreciated)[\s!.,;:]*$/i,
61
+ response: `You're very welcome! Happy to help anytime.`
62
+ },
63
+ // ─────────────────────────────────────────────────────────────
64
+ // AFFIRMATIONS - No response needed
65
+ // ─────────────────────────────────────────────────────────────
66
+ {
67
+ name: 'affirmation_yes',
68
+ intent: 'affirmation',
69
+ pattern: /^(ok|okay|k|got\s*it|understood|sure|yep|yes|yeah|yea|alright|right|cool|nice|great|perfect|awesome|good|fine)[\s!.,;:]*$/i,
70
+ response: null // Skip - no response needed
71
+ },
72
+ {
73
+ name: 'affirmation_no',
74
+ intent: 'affirmation',
75
+ pattern: /^(no|nope|nah|never\s*mind|nevermind|cancel|stop)[\s!.,;:]*$/i,
76
+ response: null // Skip - no response needed
77
+ },
78
+ // ─────────────────────────────────────────────────────────────
79
+ // EMPTY / WHITESPACE - Skip
80
+ // ─────────────────────────────────────────────────────────────
81
+ {
82
+ name: 'empty',
83
+ intent: 'affirmation',
84
+ pattern: /^\s*$/,
85
+ response: null
86
+ },
87
+ // ─────────────────────────────────────────────────────────────
88
+ // GIBBERISH - Ask for clarification
89
+ // ─────────────────────────────────────────────────────────────
90
+ {
91
+ name: 'gibberish_no_letters',
92
+ intent: 'gibberish',
93
+ pattern: /^[^a-zA-Z]{4,}$/,
94
+ response: `I didn't catch that. Could you describe what you'd like help with?`
95
+ },
96
+ {
97
+ name: 'gibberish_random_long',
98
+ intent: 'gibberish',
99
+ pattern: /^[a-zA-Z]{20,}$/, // Very long string with no spaces/punctuation
100
+ response: `That doesn't look like a question. What would you like to work on?`
101
+ },
102
+ {
103
+ name: 'gibberish_keyboard_smash',
104
+ intent: 'gibberish',
105
+ pattern: /^[asdfghjklqwertyuiopzxcvbnm]{8,}$/i, // Keyboard row patterns
106
+ response: `Looks like a keyboard mishap! What can I help you with?`
107
+ },
108
+ ];
109
+ const COMMAND_HANDLERS = [
110
+ {
111
+ command: '/help',
112
+ aliases: ['/h', '/?', 'help'],
113
+ description: 'Show help message',
114
+ handler: () => `
115
+ **DartMind Commands**
116
+
117
+ **General:**
118
+ \`/help\` - Show this help message
119
+ \`/status\` - Show session status and cost
120
+ \`/version\` - Show DartMind version
121
+ \`/clear\` - Clear conversation history
122
+ \`/cost\` - Show detailed cost breakdown
123
+
124
+ **Model Control:**
125
+ \`/haiku <query>\` - Force use Haiku (cheapest)
126
+ \`/sonnet <query>\` - Force use Sonnet (default)
127
+ \`/opus <query>\` - Force use Opus (most capable)
128
+
129
+ **Tips for Lower Costs:**
130
+ - Be specific in one message instead of multiple
131
+ - Use \`flutter analyze\` locally before asking AI
132
+ - Batch related requests together
133
+ `.trim()
134
+ },
135
+ {
136
+ command: '/version',
137
+ aliases: ['/v', 'version'],
138
+ description: 'Show version',
139
+ handler: () => `DartMind V17.3 - Cost Optimized Edition\n\nOptimizations: Reflex Layer, Prompt Caching, Model Routing, Context Scaling`
140
+ },
141
+ {
142
+ command: '/status',
143
+ aliases: ['/s', 'status'],
144
+ description: 'Show status',
145
+ handler: () => `Session active. All optimizations enabled.\n\nUse \`/cost\` for detailed breakdown.`
146
+ },
147
+ {
148
+ command: '/clear',
149
+ aliases: ['/c', 'clear'],
150
+ description: 'Clear history',
151
+ handler: () => `Conversation cleared. Ready for new task.`
152
+ },
153
+ {
154
+ command: '/cost',
155
+ aliases: ['cost'],
156
+ description: 'Show cost breakdown',
157
+ handler: () => `Cost tracking active. Details will appear after requests.`
158
+ },
159
+ {
160
+ command: '/models',
161
+ aliases: ['/m', 'models'],
162
+ description: 'Show available models',
163
+ handler: () => `
164
+ **Available Models:**
165
+
166
+ | Model | Cost | Best For |
167
+ |-------|------|----------|
168
+ | Haiku 3.5 | $0.80/1M | Simple tasks, reading, explaining |
169
+ | Sonnet 4 | $3.00/1M | Code generation, refactoring |
170
+ | Opus 4 | $15.00/1M | Architecture, complex reasoning |
171
+
172
+ Use \`/haiku\`, \`/sonnet\`, or \`/opus\` prefix to force a model.
173
+ `.trim()
174
+ },
175
+ ];
176
+ // ═══════════════════════════════════════════════════════════════
177
+ // SAFETY: PATTERNS THAT SHOULD NEVER BE REFLEXED
178
+ // These ensure we don't accidentally handle real queries locally
179
+ // ═══════════════════════════════════════════════════════════════
180
+ const BYPASS_PATTERNS = [
181
+ /\?/, // Any question mark = real question
182
+ /\b(create|build|make|generate|implement|add|write)\b/i, // Generation
183
+ /\b(fix|debug|solve|resolve|error|bug|issue|problem)\b/i, // Bug fixes
184
+ /\b(explain|what|how|why|when|where|which)\b.*\b(is|does|do|are|was|were|can|could|should|would)\b/i, // Questions
185
+ /\b(code|function|class|widget|screen|component|method)\b/i, // Code-related
186
+ /\b(refactor|convert|migrate|change|update|modify)\b/i, // Modifications
187
+ /\b(test|spec|unittest)\b/i, // Testing
188
+ /\b(import|package|dependency|pubspec)\b/i, // Dependencies
189
+ /\b(flutter|dart|riverpod|bloc|getx|provider)\b/i, // Framework-specific
190
+ /```/, // Code blocks
191
+ /\n/, // Multi-line input
192
+ ];
193
+ // ═══════════════════════════════════════════════════════════════
194
+ // MAIN FUNCTIONS
195
+ // ═══════════════════════════════════════════════════════════════
196
+ /**
197
+ * Check if input should bypass reflex layer entirely.
198
+ * Returns true if the input looks like a real query.
199
+ */
200
+ export function shouldBypassReflex(input) {
201
+ const trimmed = input.trim();
202
+ // Empty is handled by reflex
203
+ if (!trimmed)
204
+ return false;
205
+ // Check bypass patterns
206
+ for (const pattern of BYPASS_PATTERNS) {
207
+ if (pattern.test(trimmed)) {
208
+ return true;
209
+ }
210
+ }
211
+ // Long inputs (>50 chars) are likely real queries
212
+ if (trimmed.length > 50) {
213
+ return true;
214
+ }
215
+ return false;
216
+ }
217
+ /**
218
+ * Try to handle input with reflex layer.
219
+ * Returns handled=true if we can respond locally.
220
+ * Returns handled=false if we should pass to AI.
221
+ */
222
+ export function tryReflex(input) {
223
+ const trimmed = input.trim();
224
+ const lowerInput = trimmed.toLowerCase();
225
+ // ─────────────────────────────────────────────────────────────
226
+ // Check commands first (highest priority)
227
+ // ─────────────────────────────────────────────────────────────
228
+ for (const cmd of COMMAND_HANDLERS) {
229
+ // Exact command match
230
+ if (lowerInput === cmd.command || cmd.aliases.includes(lowerInput)) {
231
+ return {
232
+ handled: true,
233
+ response: cmd.handler(),
234
+ reason: `command:${cmd.command}`,
235
+ cost: 0
236
+ };
237
+ }
238
+ // Command with arguments (e.g., "/help topic")
239
+ const cmdWithSpace = cmd.command + ' ';
240
+ if (lowerInput.startsWith(cmdWithSpace)) {
241
+ const args = trimmed.slice(cmdWithSpace.length);
242
+ return {
243
+ handled: true,
244
+ response: cmd.handler(args),
245
+ reason: `command:${cmd.command}`,
246
+ cost: 0
247
+ };
248
+ }
249
+ }
250
+ // ─────────────────────────────────────────────────────────────
251
+ // Check reflex patterns
252
+ // ─────────────────────────────────────────────────────────────
253
+ for (const { name, pattern, response, intent } of REFLEX_PATTERNS) {
254
+ if (pattern.test(trimmed)) {
255
+ return {
256
+ handled: true,
257
+ response: response ?? undefined,
258
+ reason: `pattern:${name}:${intent}`,
259
+ cost: 0
260
+ };
261
+ }
262
+ }
263
+ // ─────────────────────────────────────────────────────────────
264
+ // Not handled - pass to AI
265
+ // ─────────────────────────────────────────────────────────────
266
+ return {
267
+ handled: false,
268
+ cost: 0
269
+ };
270
+ }
271
+ /**
272
+ * Get all available commands (for help/autocomplete)
273
+ */
274
+ export function getCommands() {
275
+ return [...COMMAND_HANDLERS];
276
+ }
277
+ /**
278
+ * Check if input is a model override command
279
+ * Returns the model tier if found, null otherwise
280
+ */
281
+ export function checkModelOverride(input) {
282
+ const trimmed = input.trim();
283
+ const lower = trimmed.toLowerCase();
284
+ if (lower.startsWith('/haiku ')) {
285
+ return { model: 'haiku', query: trimmed.slice(7) };
286
+ }
287
+ if (lower.startsWith('/sonnet ')) {
288
+ return { model: 'sonnet', query: trimmed.slice(8) };
289
+ }
290
+ if (lower.startsWith('/opus ')) {
291
+ return { model: 'opus', query: trimmed.slice(6) };
292
+ }
293
+ return null;
294
+ }
295
+ //# sourceMappingURL=reflex-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflex-layer.js","sourceRoot":"","sources":["../../../src/core/cost/reflex-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * DartMind V17.3 - Response Caching
3
+ *
4
+ * PURPOSE: Cache repeated queries locally to avoid redundant API calls.
5
+ * COST IMPACT: 5-10% savings on repeated queries within session
6
+ * QUALITY IMPACT: NONE (identical responses for identical queries)
7
+ *
8
+ * CACHING RULES:
9
+ * - Only cache for specific intents (explain, search, list, simple_qa)
10
+ * - TTL: 5 minutes (matches Anthropic's prompt cache)
11
+ * - Max entries: 100 (LRU eviction)
12
+ * - Only exact query matches (no fuzzy matching)
13
+ *
14
+ * SAFETY:
15
+ * - Code generation NEVER cached (context-dependent)
16
+ * - Bug fixes NEVER cached (need latest context)
17
+ * - Refactoring NEVER cached (code may have changed)
18
+ * - Cache cleared on file modifications
19
+ *
20
+ * @module cost/response-cache
21
+ * @version 17.3.0
22
+ */
23
+ import { TaskIntent } from './types.js';
24
+ export interface CachedResponse {
25
+ query: string;
26
+ response: string;
27
+ intent: TaskIntent;
28
+ timestamp: number;
29
+ hitCount: number;
30
+ }
31
+ export interface ResponseCacheConfig {
32
+ enabled: boolean;
33
+ maxEntries: number;
34
+ ttlMs: number;
35
+ cacheableIntents: TaskIntent[];
36
+ }
37
+ export declare const DEFAULT_RESPONSE_CACHE_CONFIG: ResponseCacheConfig;
38
+ export declare const UNCACHEABLE_INTENTS: TaskIntent[];
39
+ export declare class ResponseCache {
40
+ private cache;
41
+ private config;
42
+ private stats;
43
+ constructor(config?: Partial<ResponseCacheConfig>);
44
+ /**
45
+ * Get cached response for a query.
46
+ *
47
+ * @param query - User query
48
+ * @param intent - Task intent (for validation)
49
+ * @returns Cached response or undefined
50
+ */
51
+ get(query: string, intent: TaskIntent): string | undefined;
52
+ /**
53
+ * Store response in cache.
54
+ *
55
+ * @param query - User query
56
+ * @param response - API response
57
+ * @param intent - Task intent
58
+ */
59
+ set(query: string, response: string, intent: TaskIntent): void;
60
+ /**
61
+ * Check if an intent is cacheable.
62
+ */
63
+ isCacheableIntent(intent: TaskIntent): boolean;
64
+ /**
65
+ * Clear entire cache.
66
+ */
67
+ clear(): void;
68
+ /**
69
+ * Clear cache entries related to file modifications.
70
+ * Call this when files are modified to prevent stale cache hits.
71
+ *
72
+ * @param filePath - Path of modified file
73
+ */
74
+ invalidateForFile(filePath: string): void;
75
+ /**
76
+ * Get cache statistics.
77
+ */
78
+ getStats(): {
79
+ hits: number;
80
+ misses: number;
81
+ hitRate: number;
82
+ entries: number;
83
+ evictions: number;
84
+ totalSaved: number;
85
+ };
86
+ /**
87
+ * Format cache stats for logging.
88
+ */
89
+ formatStats(): string;
90
+ /**
91
+ * Reset statistics.
92
+ */
93
+ resetStats(): void;
94
+ /**
95
+ * Update configuration.
96
+ */
97
+ updateConfig(config: Partial<ResponseCacheConfig>): void;
98
+ /**
99
+ * Get current configuration.
100
+ */
101
+ getConfig(): ResponseCacheConfig;
102
+ private getKey;
103
+ private evictLRU;
104
+ private estimateTokens;
105
+ }
106
+ /**
107
+ * Default response cache instance.
108
+ */
109
+ export declare const responseCache: ResponseCache;
110
+ /**
111
+ * Quick check if a response is cached.
112
+ */
113
+ export declare function getCachedResponse(query: string, intent: TaskIntent): string | undefined;
114
+ /**
115
+ * Quick cache a response.
116
+ */
117
+ export declare function cacheResponse(query: string, response: string, intent: TaskIntent): void;
118
+ /**
119
+ * Check if an intent allows caching.
120
+ */
121
+ export declare function isIntentCacheable(intent: TaskIntent): boolean;
122
+ /**
123
+ * Invalidate cache when a file is modified.
124
+ */
125
+ export declare function invalidateCacheForFile(filePath: string): void;
126
+ /**
127
+ * Check if user requested to bypass cache.
128
+ * Supports: /no-cache, /fresh
129
+ */
130
+ export declare function checkNoCacheOverride(input: string): {
131
+ bypass: boolean;
132
+ query: string;
133
+ } | null;
134
+ /**
135
+ * Check if user requested to clear cache.
136
+ * Supports: /clear-cache
137
+ */
138
+ export declare function checkClearCacheCommand(input: string): boolean;
139
+ //# sourceMappingURL=response-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-cache.d.ts","sourceRoot":"","sources":["../../../src/core/cost/response-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAMxC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,UAAU,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAW3C,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAU3C,CAAC;AAMF,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,KAAK,CAKX;gBAEU,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAIrD;;;;;;OAMG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAkC1D;;;;;;OAMG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IA0B9D;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAK9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiBzC;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB;IAYD;;OAEG;IACH,WAAW,IAAI,MAAM;IAUrB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAIxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;IAQhC,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,cAAc;CAGvB;AAMD;;GAEG;AACH,eAAO,MAAM,aAAa,eAAsB,CAAC;AAMjD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAEvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7D;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa7F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D"}