dartmind 17.0.0 → 17.3.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/dist/cli/InteractiveModeV12.d.ts +4 -0
- package/dist/cli/InteractiveModeV12.d.ts.map +1 -1
- package/dist/cli/InteractiveModeV12.js +57 -1
- package/dist/cli/InteractiveModeV12.js.map +1 -1
- package/dist/cli/commands/SlashCommands.d.ts.map +1 -1
- package/dist/cli/commands/SlashCommands.js +21 -5
- package/dist/cli/commands/SlashCommands.js.map +1 -1
- package/dist/core/cost/__tests__/day1.test.d.ts +9 -0
- package/dist/core/cost/__tests__/day1.test.d.ts.map +1 -0
- package/dist/core/cost/__tests__/day1.test.js +284 -0
- package/dist/core/cost/__tests__/day1.test.js.map +1 -0
- package/dist/core/cost/__tests__/day2.test.d.ts +9 -0
- package/dist/core/cost/__tests__/day2.test.d.ts.map +1 -0
- package/dist/core/cost/__tests__/day2.test.js +414 -0
- package/dist/core/cost/__tests__/day2.test.js.map +1 -0
- package/dist/core/cost/__tests__/day3.test.d.ts +9 -0
- package/dist/core/cost/__tests__/day3.test.d.ts.map +1 -0
- package/dist/core/cost/__tests__/day3.test.js +415 -0
- package/dist/core/cost/__tests__/day3.test.js.map +1 -0
- package/dist/core/cost/__tests__/day4.test.d.ts +9 -0
- package/dist/core/cost/__tests__/day4.test.d.ts.map +1 -0
- package/dist/core/cost/__tests__/day4.test.js +354 -0
- package/dist/core/cost/__tests__/day4.test.js.map +1 -0
- package/dist/core/cost/context-scaler.d.ts +129 -0
- package/dist/core/cost/context-scaler.d.ts.map +1 -0
- package/dist/core/cost/context-scaler.js +336 -0
- package/dist/core/cost/context-scaler.js.map +1 -0
- package/dist/core/cost/index.d.ts +31 -0
- package/dist/core/cost/index.d.ts.map +1 -0
- package/dist/core/cost/index.js +103 -0
- package/dist/core/cost/index.js.map +1 -0
- package/dist/core/cost/integration.d.ts +144 -0
- package/dist/core/cost/integration.d.ts.map +1 -0
- package/dist/core/cost/integration.js +349 -0
- package/dist/core/cost/integration.js.map +1 -0
- package/dist/core/cost/model-router.d.ts +70 -0
- package/dist/core/cost/model-router.d.ts.map +1 -0
- package/dist/core/cost/model-router.js +319 -0
- package/dist/core/cost/model-router.js.map +1 -0
- package/dist/core/cost/prompt-cache.d.ts +98 -0
- package/dist/core/cost/prompt-cache.d.ts.map +1 -0
- package/dist/core/cost/prompt-cache.js +219 -0
- package/dist/core/cost/prompt-cache.js.map +1 -0
- package/dist/core/cost/reflex-layer.d.ts +48 -0
- package/dist/core/cost/reflex-layer.d.ts.map +1 -0
- package/dist/core/cost/reflex-layer.js +295 -0
- package/dist/core/cost/reflex-layer.js.map +1 -0
- package/dist/core/cost/response-cache.d.ts +139 -0
- package/dist/core/cost/response-cache.d.ts.map +1 -0
- package/dist/core/cost/response-cache.js +290 -0
- package/dist/core/cost/response-cache.js.map +1 -0
- package/dist/core/cost/tool-loader.d.ts +94 -0
- package/dist/core/cost/tool-loader.d.ts.map +1 -0
- package/dist/core/cost/tool-loader.js +233 -0
- package/dist/core/cost/tool-loader.js.map +1 -0
- package/dist/core/cost/types.d.ts +93 -0
- package/dist/core/cost/types.d.ts.map +1 -0
- package/dist/core/cost/types.js +29 -0
- package/dist/core/cost/types.js.map +1 -0
- 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"}
|