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.
- 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,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DartMind V17.3 - Context Scaling
|
|
3
|
+
*
|
|
4
|
+
* PURPOSE: Match context size to task complexity for optimal cost/quality balance.
|
|
5
|
+
* COST IMPACT: 30-40% savings by reducing unnecessary context
|
|
6
|
+
* QUALITY IMPACT: NONE (right-sized context for each task)
|
|
7
|
+
*
|
|
8
|
+
* CONTEXT TIERS:
|
|
9
|
+
* - T0: Zero (~0 tokens) - Reflex handled, no API call
|
|
10
|
+
* - T1: Minimal (~1K tokens) - Simple Q&A, search, file lookup
|
|
11
|
+
* - T2: Focused (~4K tokens) - Explain code, read files, list items
|
|
12
|
+
* - T3: Standard (~16K tokens) - Generate, fix bugs, refactor
|
|
13
|
+
* - T4: Full (~64K tokens) - Multi-file, architecture, complex tasks
|
|
14
|
+
*
|
|
15
|
+
* SAFETY:
|
|
16
|
+
* - Always defaults UP when uncertain (better quality over savings)
|
|
17
|
+
* - User can override with explicit tier request
|
|
18
|
+
* - Configurable tier assignments per intent
|
|
19
|
+
*
|
|
20
|
+
* @module cost/context-scaler
|
|
21
|
+
* @version 17.3.0
|
|
22
|
+
*/
|
|
23
|
+
// ═══════════════════════════════════════════════════════════════
|
|
24
|
+
// CONTEXT TIER DEFINITIONS
|
|
25
|
+
// ═══════════════════════════════════════════════════════════════
|
|
26
|
+
export const CONTEXT_TIERS = {
|
|
27
|
+
0: {
|
|
28
|
+
tier: 0,
|
|
29
|
+
name: 'Zero',
|
|
30
|
+
maxTokens: 0,
|
|
31
|
+
includeSystemPrompt: false,
|
|
32
|
+
includeTools: false,
|
|
33
|
+
includeProjectStructure: false,
|
|
34
|
+
conversationHistoryLimit: 0,
|
|
35
|
+
includeRelevantFiles: false,
|
|
36
|
+
includePatternLibrary: false,
|
|
37
|
+
},
|
|
38
|
+
1: {
|
|
39
|
+
tier: 1,
|
|
40
|
+
name: 'Minimal',
|
|
41
|
+
maxTokens: 1024,
|
|
42
|
+
includeSystemPrompt: true,
|
|
43
|
+
includeTools: false,
|
|
44
|
+
includeProjectStructure: false,
|
|
45
|
+
conversationHistoryLimit: 2, // Last 2 messages
|
|
46
|
+
includeRelevantFiles: false,
|
|
47
|
+
includePatternLibrary: false,
|
|
48
|
+
},
|
|
49
|
+
2: {
|
|
50
|
+
tier: 2,
|
|
51
|
+
name: 'Focused',
|
|
52
|
+
maxTokens: 4096,
|
|
53
|
+
includeSystemPrompt: true,
|
|
54
|
+
includeTools: true,
|
|
55
|
+
includeProjectStructure: false,
|
|
56
|
+
conversationHistoryLimit: 5, // Last 5 messages
|
|
57
|
+
includeRelevantFiles: true, // 1-2 relevant files
|
|
58
|
+
includePatternLibrary: false,
|
|
59
|
+
},
|
|
60
|
+
3: {
|
|
61
|
+
tier: 3,
|
|
62
|
+
name: 'Standard',
|
|
63
|
+
maxTokens: 16384,
|
|
64
|
+
includeSystemPrompt: true,
|
|
65
|
+
includeTools: true,
|
|
66
|
+
includeProjectStructure: true,
|
|
67
|
+
conversationHistoryLimit: 10, // Last 10 messages
|
|
68
|
+
includeRelevantFiles: true, // Up to 5 relevant files
|
|
69
|
+
includePatternLibrary: true,
|
|
70
|
+
},
|
|
71
|
+
4: {
|
|
72
|
+
tier: 4,
|
|
73
|
+
name: 'Full',
|
|
74
|
+
maxTokens: 65536,
|
|
75
|
+
includeSystemPrompt: true,
|
|
76
|
+
includeTools: true,
|
|
77
|
+
includeProjectStructure: true,
|
|
78
|
+
conversationHistoryLimit: 20, // Full history (up to 20)
|
|
79
|
+
includeRelevantFiles: true, // All relevant files
|
|
80
|
+
includePatternLibrary: true,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
// ═══════════════════════════════════════════════════════════════
|
|
84
|
+
// INTENT TO TIER MAPPING
|
|
85
|
+
// ═══════════════════════════════════════════════════════════════
|
|
86
|
+
/**
|
|
87
|
+
* Maps task intents to appropriate context tiers.
|
|
88
|
+
* Design principle: Match context to task needs, not model capabilities.
|
|
89
|
+
*/
|
|
90
|
+
export const INTENT_TIER_MAP = {
|
|
91
|
+
// T0: Reflex (handled locally, no context needed)
|
|
92
|
+
greeting: 0,
|
|
93
|
+
farewell: 0,
|
|
94
|
+
gibberish: 0,
|
|
95
|
+
affirmation: 0,
|
|
96
|
+
command: 0,
|
|
97
|
+
// T1: Minimal context (simple lookups, quick answers)
|
|
98
|
+
simple_qa: 1,
|
|
99
|
+
search: 1,
|
|
100
|
+
// T2: Focused context (read/explain specific code)
|
|
101
|
+
explain: 2,
|
|
102
|
+
read: 2,
|
|
103
|
+
list: 2,
|
|
104
|
+
// T3: Standard context (code generation, modifications)
|
|
105
|
+
generate: 3,
|
|
106
|
+
refactor: 3,
|
|
107
|
+
fix_bug: 3,
|
|
108
|
+
write_tests: 3,
|
|
109
|
+
// T4: Full context (complex, multi-file operations)
|
|
110
|
+
multi_file: 4,
|
|
111
|
+
architecture: 4,
|
|
112
|
+
security: 4,
|
|
113
|
+
complex: 4,
|
|
114
|
+
// Unknown defaults to Standard (safe choice)
|
|
115
|
+
unknown: 3,
|
|
116
|
+
};
|
|
117
|
+
export const DEFAULT_SCALER_CONFIG = {
|
|
118
|
+
minTier: 1, // Never use T0 for API calls (T0 = reflex)
|
|
119
|
+
maxTier: 4, // Allow full context when needed
|
|
120
|
+
defaultTier: 3, // Standard tier by default
|
|
121
|
+
escalateOnLowConfidence: true,
|
|
122
|
+
confidenceThreshold: 0.5,
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Determine the appropriate context tier for a classification result.
|
|
126
|
+
*
|
|
127
|
+
* @param classification - The task classification result
|
|
128
|
+
* @param config - Scaler configuration
|
|
129
|
+
* @returns The appropriate context tier config
|
|
130
|
+
*/
|
|
131
|
+
export function determineContextTier(classification, config = DEFAULT_SCALER_CONFIG) {
|
|
132
|
+
// Get base tier from intent
|
|
133
|
+
let tier = INTENT_TIER_MAP[classification.intent];
|
|
134
|
+
// Escalate if confidence is low
|
|
135
|
+
if (config.escalateOnLowConfidence &&
|
|
136
|
+
classification.confidence < config.confidenceThreshold &&
|
|
137
|
+
tier < config.maxTier) {
|
|
138
|
+
tier = Math.min(tier + 1, config.maxTier);
|
|
139
|
+
}
|
|
140
|
+
// Apply bounds
|
|
141
|
+
tier = Math.max(config.minTier, Math.min(config.maxTier, tier));
|
|
142
|
+
return CONTEXT_TIERS[tier];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get tier for an intent directly (without classification object).
|
|
146
|
+
*/
|
|
147
|
+
export function getTierForIntent(intent) {
|
|
148
|
+
const tier = INTENT_TIER_MAP[intent];
|
|
149
|
+
return CONTEXT_TIERS[tier];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get tier by number.
|
|
153
|
+
*/
|
|
154
|
+
export function getTier(tier) {
|
|
155
|
+
return CONTEXT_TIERS[tier];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Build context based on tier configuration.
|
|
159
|
+
* Respects tier limits and includes appropriate components.
|
|
160
|
+
*
|
|
161
|
+
* @param tierConfig - The context tier configuration
|
|
162
|
+
* @param options - Available context components
|
|
163
|
+
* @returns Built context with token estimate
|
|
164
|
+
*/
|
|
165
|
+
export function buildContext(tierConfig, options) {
|
|
166
|
+
const parts = [];
|
|
167
|
+
const includedComponents = [];
|
|
168
|
+
let tokenEstimate = 0;
|
|
169
|
+
const estimateTokens = (text) => Math.ceil(text.length / 4);
|
|
170
|
+
const addPart = (name, content) => {
|
|
171
|
+
if (content && tokenEstimate + estimateTokens(content) <= tierConfig.maxTokens) {
|
|
172
|
+
parts.push(content);
|
|
173
|
+
includedComponents.push(name);
|
|
174
|
+
tokenEstimate += estimateTokens(content);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
};
|
|
179
|
+
// Add components in priority order
|
|
180
|
+
if (tierConfig.includeSystemPrompt && options.systemPrompt) {
|
|
181
|
+
addPart('systemPrompt', options.systemPrompt);
|
|
182
|
+
}
|
|
183
|
+
if (tierConfig.includeTools && options.tools) {
|
|
184
|
+
addPart('tools', options.tools);
|
|
185
|
+
}
|
|
186
|
+
if (tierConfig.includeProjectStructure && options.projectStructure) {
|
|
187
|
+
addPart('projectStructure', options.projectStructure);
|
|
188
|
+
}
|
|
189
|
+
if (tierConfig.includePatternLibrary && options.patternLibrary) {
|
|
190
|
+
addPart('patternLibrary', options.patternLibrary);
|
|
191
|
+
}
|
|
192
|
+
// Add relevant files (up to limit)
|
|
193
|
+
if (tierConfig.includeRelevantFiles && options.relevantFiles) {
|
|
194
|
+
const maxFiles = tierConfig.tier === 2 ? 2 :
|
|
195
|
+
tierConfig.tier === 3 ? 5 : 10;
|
|
196
|
+
for (let i = 0; i < Math.min(options.relevantFiles.length, maxFiles); i++) {
|
|
197
|
+
const file = options.relevantFiles[i];
|
|
198
|
+
const fileContent = `--- ${file.path} ---\n${file.content}\n`;
|
|
199
|
+
if (!addPart(`file:${file.path}`, fileContent)) {
|
|
200
|
+
break; // Stop if we've hit the token limit
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Add conversation history (most recent first, up to limit)
|
|
205
|
+
if (options.conversationHistory && tierConfig.conversationHistoryLimit > 0) {
|
|
206
|
+
const history = options.conversationHistory.slice(-tierConfig.conversationHistoryLimit);
|
|
207
|
+
for (const msg of history) {
|
|
208
|
+
const msgContent = `${msg.role}: ${msg.content}\n`;
|
|
209
|
+
if (!addPart(`history:${msg.role}`, msgContent)) {
|
|
210
|
+
break; // Stop if we've hit the token limit
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
content: parts.join('\n\n'),
|
|
216
|
+
tokenEstimate,
|
|
217
|
+
includedComponents,
|
|
218
|
+
tier: tierConfig.tier,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Calculate context metrics for reporting.
|
|
223
|
+
*/
|
|
224
|
+
export function calculateContextMetrics(builtContext, availableComponents) {
|
|
225
|
+
const tierConfig = CONTEXT_TIERS[builtContext.tier];
|
|
226
|
+
const utilization = tierConfig.maxTokens > 0
|
|
227
|
+
? (builtContext.tokenEstimate / tierConfig.maxTokens) * 100
|
|
228
|
+
: 0;
|
|
229
|
+
return {
|
|
230
|
+
tier: builtContext.tier,
|
|
231
|
+
tierName: tierConfig.name,
|
|
232
|
+
maxTokens: tierConfig.maxTokens,
|
|
233
|
+
actualTokens: builtContext.tokenEstimate,
|
|
234
|
+
utilizationPercent: utilization,
|
|
235
|
+
componentsIncluded: builtContext.includedComponents.length,
|
|
236
|
+
componentsAvailable: availableComponents,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Format context metrics for logging.
|
|
241
|
+
*/
|
|
242
|
+
export function formatContextMetrics(metrics) {
|
|
243
|
+
return [
|
|
244
|
+
`Context T${metrics.tier} (${metrics.tierName})`,
|
|
245
|
+
`${metrics.actualTokens.toLocaleString()}/${metrics.maxTokens.toLocaleString()} tokens`,
|
|
246
|
+
`${metrics.utilizationPercent.toFixed(1)}% used`,
|
|
247
|
+
`${metrics.componentsIncluded}/${metrics.componentsAvailable} components`,
|
|
248
|
+
].join(' | ');
|
|
249
|
+
}
|
|
250
|
+
// ═══════════════════════════════════════════════════════════════
|
|
251
|
+
// SAVINGS CALCULATION
|
|
252
|
+
// ═══════════════════════════════════════════════════════════════
|
|
253
|
+
/**
|
|
254
|
+
* Calculate cost savings from using right-sized context.
|
|
255
|
+
*
|
|
256
|
+
* @param actualTier - Tier actually used
|
|
257
|
+
* @param defaultTier - Tier that would have been used without scaling
|
|
258
|
+
* @param inputCostPerMillion - Input cost per 1M tokens
|
|
259
|
+
* @returns Estimated savings in dollars
|
|
260
|
+
*/
|
|
261
|
+
export function calculateContextSavings(actualTier, defaultTier = 4, inputCostPerMillion = 3.00 // Sonnet default
|
|
262
|
+
) {
|
|
263
|
+
const actualConfig = CONTEXT_TIERS[actualTier];
|
|
264
|
+
const defaultConfig = CONTEXT_TIERS[defaultTier];
|
|
265
|
+
// Estimate average usage at 60% of max
|
|
266
|
+
const actualTokens = Math.floor(actualConfig.maxTokens * 0.6);
|
|
267
|
+
const defaultTokens = Math.floor(defaultConfig.maxTokens * 0.6);
|
|
268
|
+
const actualCost = (actualTokens / 1_000_000) * inputCostPerMillion;
|
|
269
|
+
const defaultCost = (defaultTokens / 1_000_000) * inputCostPerMillion;
|
|
270
|
+
const savings = defaultCost - actualCost;
|
|
271
|
+
const savingsPercent = defaultCost > 0 ? (savings / defaultCost) * 100 : 0;
|
|
272
|
+
return {
|
|
273
|
+
actualTokens,
|
|
274
|
+
defaultTokens,
|
|
275
|
+
savings,
|
|
276
|
+
savingsPercent,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// ═══════════════════════════════════════════════════════════════
|
|
280
|
+
// TIER OVERRIDE DETECTION
|
|
281
|
+
// ═══════════════════════════════════════════════════════════════
|
|
282
|
+
/**
|
|
283
|
+
* Check if user explicitly requested a context tier.
|
|
284
|
+
* Supports: /t0, /t1, /t2, /t3, /t4, /minimal, /focused, /standard, /full
|
|
285
|
+
*
|
|
286
|
+
* @param input - User input
|
|
287
|
+
* @returns Override tier and cleaned query, or null
|
|
288
|
+
*/
|
|
289
|
+
export function checkTierOverride(input) {
|
|
290
|
+
const trimmed = input.trim();
|
|
291
|
+
// Check for /t0-/t4 prefix
|
|
292
|
+
const tierMatch = trimmed.match(/^\/t([0-4])\s+(.+)$/i);
|
|
293
|
+
if (tierMatch) {
|
|
294
|
+
return {
|
|
295
|
+
tier: parseInt(tierMatch[1]),
|
|
296
|
+
query: tierMatch[2].trim(),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// Check for named tier prefixes
|
|
300
|
+
const namedTiers = {
|
|
301
|
+
'/minimal': 1,
|
|
302
|
+
'/focused': 2,
|
|
303
|
+
'/standard': 3,
|
|
304
|
+
'/full': 4,
|
|
305
|
+
};
|
|
306
|
+
for (const [prefix, tier] of Object.entries(namedTiers)) {
|
|
307
|
+
if (trimmed.toLowerCase().startsWith(prefix + ' ')) {
|
|
308
|
+
return {
|
|
309
|
+
tier,
|
|
310
|
+
query: trimmed.slice(prefix.length).trim(),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get a description of what each tier includes.
|
|
318
|
+
*/
|
|
319
|
+
export function getTierDescription(tier) {
|
|
320
|
+
const config = CONTEXT_TIERS[tier];
|
|
321
|
+
const includes = [];
|
|
322
|
+
if (config.includeSystemPrompt)
|
|
323
|
+
includes.push('system prompt');
|
|
324
|
+
if (config.includeTools)
|
|
325
|
+
includes.push('tools');
|
|
326
|
+
if (config.includeProjectStructure)
|
|
327
|
+
includes.push('project structure');
|
|
328
|
+
if (config.includePatternLibrary)
|
|
329
|
+
includes.push('pattern library');
|
|
330
|
+
if (config.includeRelevantFiles)
|
|
331
|
+
includes.push('relevant files');
|
|
332
|
+
if (config.conversationHistoryLimit > 0)
|
|
333
|
+
includes.push(`${config.conversationHistoryLimit} messages`);
|
|
334
|
+
return `T${tier} ${config.name} (~${config.maxTokens.toLocaleString()} tokens): ${includes.join(', ') || 'none'}`;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=context-scaler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-scaler.js","sourceRoot":"","sources":["../../../src/core/cost/context-scaler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DartMind V17.3 - Cost Optimization Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides 6 layers of cost optimization:
|
|
5
|
+
* 1. Reflex Layer - Handle trivial inputs locally ($0.00)
|
|
6
|
+
* 2. Prompt Caching - Cache static content (90% cheaper)
|
|
7
|
+
* 3. Model Routing - Use cheapest suitable model (Day 2)
|
|
8
|
+
* 4. Context Scaling - Match context to task complexity (Day 3)
|
|
9
|
+
* 5. Tool Loading - Load only needed tools (Day 4)
|
|
10
|
+
* 6. Response Caching - Cache repeated queries locally (Day 4)
|
|
11
|
+
*
|
|
12
|
+
* TOTAL SAVINGS: 85-94%
|
|
13
|
+
*
|
|
14
|
+
* @module cost
|
|
15
|
+
* @version 17.3.0
|
|
16
|
+
*/
|
|
17
|
+
export { type ModelTier, MODEL_IDS, MODEL_COSTS, type TaskIntent, type ContextTier, type ContextTierConfig, type ReflexResult, type ClassificationResult, type CostMetrics, type CostControllerConfig, DEFAULT_CONFIG, type TokenUsage, type CostEvent, } from './types.js';
|
|
18
|
+
export { tryReflex, shouldBypassReflex, checkModelOverride, getCommands, } from './reflex-layer.js';
|
|
19
|
+
export { buildCachedSystemBlocks, buildProjectContext, buildSystemMessage, calculateCacheMetrics, formatCacheMetrics, estimateTokens, getSystemBlocksTokenEstimate, SYSTEM_PROMPT_CACHED, TOOL_DEFINITIONS_CACHED, DEFAULT_CACHE_CONFIG, } from './prompt-cache.js';
|
|
20
|
+
export type { CacheableBlock, CacheConfig, ProjectInfo, CacheMetrics, } from './prompt-cache.js';
|
|
21
|
+
export { classifyTask, routeToModel, applyEscalation, estimateCost, calculateSavings, formatClassification, getModelTier, DEFAULT_ROUTER_CONFIG, } from './model-router.js';
|
|
22
|
+
export type { RouterConfig, } from './model-router.js';
|
|
23
|
+
export { CONTEXT_TIERS, INTENT_TIER_MAP, determineContextTier, getTierForIntent, getTier, buildContext, calculateContextMetrics, formatContextMetrics, calculateContextSavings, checkTierOverride, getTierDescription, DEFAULT_SCALER_CONFIG, } from './context-scaler.js';
|
|
24
|
+
export type { ContextScalerConfig, ContextBuildOptions, BuiltContext, ContextMetrics, } from './context-scaler.js';
|
|
25
|
+
export { TOOL_GROUPS, ALL_TOOLS, INTENT_TOOLS_MAP, getToolsForIntent, getToolsForIntents, getAllTools, getToolsFromGroups, calculateToolMetrics, formatToolMetrics, checkAllToolsOverride, checkToolGroupOverride, describeTools, DEFAULT_TOOL_CONFIG, } from './tool-loader.js';
|
|
26
|
+
export type { ToolName, ToolGroup, ToolLoaderConfig, ToolMetrics, } from './tool-loader.js';
|
|
27
|
+
export { ResponseCache, responseCache, getCachedResponse, cacheResponse, isIntentCacheable, invalidateCacheForFile, checkNoCacheOverride, checkClearCacheCommand, UNCACHEABLE_INTENTS, DEFAULT_RESPONSE_CACHE_CONFIG, } from './response-cache.js';
|
|
28
|
+
export type { CachedResponse, ResponseCacheConfig, } from './response-cache.js';
|
|
29
|
+
export { CostOptimizer, costOptimizer, shouldSkipAPI, getLocalResponse, estimateRequestCost, } from './integration.js';
|
|
30
|
+
export type { ProcessedInput, OptimizedRequest, } from './integration.js';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/cost/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAEL,KAAK,SAAS,EACd,SAAS,EACT,WAAW,EAGX,KAAK,UAAU,EAGf,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAGtB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAGhB,KAAK,oBAAoB,EACzB,cAAc,EAGd,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AAMpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAEL,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAGlB,qBAAqB,EACrB,kBAAkB,EAGlB,cAAc,EACd,4BAA4B,EAG5B,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAEL,YAAY,EAGZ,YAAY,EACZ,eAAe,EAGf,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EAGZ,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,YAAY,GACb,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAEL,aAAa,EACb,eAAe,EAGf,oBAAoB,EACpB,gBAAgB,EAChB,OAAO,EAGP,YAAY,EAGZ,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EAGvB,iBAAiB,EACjB,kBAAkB,EAGlB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAEL,WAAW,EACX,SAAS,EACT,gBAAgB,EAGhB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAGlB,oBAAoB,EACpB,iBAAiB,EAGjB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EAGb,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAEL,aAAa,EAGb,aAAa,EAGb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EAGtB,oBAAoB,EACpB,sBAAsB,EAGtB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAEL,aAAa,EAGb,aAAa,EAGb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DartMind V17.3 - Cost Optimization Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides 6 layers of cost optimization:
|
|
5
|
+
* 1. Reflex Layer - Handle trivial inputs locally ($0.00)
|
|
6
|
+
* 2. Prompt Caching - Cache static content (90% cheaper)
|
|
7
|
+
* 3. Model Routing - Use cheapest suitable model (Day 2)
|
|
8
|
+
* 4. Context Scaling - Match context to task complexity (Day 3)
|
|
9
|
+
* 5. Tool Loading - Load only needed tools (Day 4)
|
|
10
|
+
* 6. Response Caching - Cache repeated queries locally (Day 4)
|
|
11
|
+
*
|
|
12
|
+
* TOTAL SAVINGS: 85-94%
|
|
13
|
+
*
|
|
14
|
+
* @module cost
|
|
15
|
+
* @version 17.3.0
|
|
16
|
+
*/
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════
|
|
18
|
+
// TYPES
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════
|
|
20
|
+
export { MODEL_IDS, MODEL_COSTS, DEFAULT_CONFIG, } from './types.js';
|
|
21
|
+
// ═══════════════════════════════════════════════════════════════
|
|
22
|
+
// LAYER 1: REFLEX
|
|
23
|
+
// ═══════════════════════════════════════════════════════════════
|
|
24
|
+
export { tryReflex, shouldBypassReflex, checkModelOverride, getCommands, } from './reflex-layer.js';
|
|
25
|
+
// ═══════════════════════════════════════════════════════════════
|
|
26
|
+
// LAYER 2: PROMPT CACHING
|
|
27
|
+
// ═══════════════════════════════════════════════════════════════
|
|
28
|
+
export {
|
|
29
|
+
// Builders
|
|
30
|
+
buildCachedSystemBlocks, buildProjectContext, buildSystemMessage,
|
|
31
|
+
// Metrics
|
|
32
|
+
calculateCacheMetrics, formatCacheMetrics,
|
|
33
|
+
// Token estimation
|
|
34
|
+
estimateTokens, getSystemBlocksTokenEstimate,
|
|
35
|
+
// Constants
|
|
36
|
+
SYSTEM_PROMPT_CACHED, TOOL_DEFINITIONS_CACHED, DEFAULT_CACHE_CONFIG, } from './prompt-cache.js';
|
|
37
|
+
// ═══════════════════════════════════════════════════════════════
|
|
38
|
+
// LAYER 3: MODEL ROUTING
|
|
39
|
+
// ═══════════════════════════════════════════════════════════════
|
|
40
|
+
export {
|
|
41
|
+
// Classification
|
|
42
|
+
classifyTask,
|
|
43
|
+
// Routing
|
|
44
|
+
routeToModel, applyEscalation,
|
|
45
|
+
// Cost helpers
|
|
46
|
+
estimateCost, calculateSavings, formatClassification, getModelTier,
|
|
47
|
+
// Config
|
|
48
|
+
DEFAULT_ROUTER_CONFIG, } from './model-router.js';
|
|
49
|
+
// ═══════════════════════════════════════════════════════════════
|
|
50
|
+
// LAYER 4: CONTEXT SCALING
|
|
51
|
+
// ═══════════════════════════════════════════════════════════════
|
|
52
|
+
export {
|
|
53
|
+
// Tier definitions
|
|
54
|
+
CONTEXT_TIERS, INTENT_TIER_MAP,
|
|
55
|
+
// Context determination
|
|
56
|
+
determineContextTier, getTierForIntent, getTier,
|
|
57
|
+
// Context building
|
|
58
|
+
buildContext,
|
|
59
|
+
// Metrics
|
|
60
|
+
calculateContextMetrics, formatContextMetrics, calculateContextSavings,
|
|
61
|
+
// Override detection
|
|
62
|
+
checkTierOverride, getTierDescription,
|
|
63
|
+
// Config
|
|
64
|
+
DEFAULT_SCALER_CONFIG, } from './context-scaler.js';
|
|
65
|
+
// ═══════════════════════════════════════════════════════════════
|
|
66
|
+
// LAYER 5: TOOL LOADING
|
|
67
|
+
// ═══════════════════════════════════════════════════════════════
|
|
68
|
+
export {
|
|
69
|
+
// Tool definitions
|
|
70
|
+
TOOL_GROUPS, ALL_TOOLS, INTENT_TOOLS_MAP,
|
|
71
|
+
// Tool loading
|
|
72
|
+
getToolsForIntent, getToolsForIntents, getAllTools, getToolsFromGroups,
|
|
73
|
+
// Metrics
|
|
74
|
+
calculateToolMetrics, formatToolMetrics,
|
|
75
|
+
// Override detection
|
|
76
|
+
checkAllToolsOverride, checkToolGroupOverride, describeTools,
|
|
77
|
+
// Config
|
|
78
|
+
DEFAULT_TOOL_CONFIG, } from './tool-loader.js';
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════
|
|
80
|
+
// LAYER 6: RESPONSE CACHING
|
|
81
|
+
// ═══════════════════════════════════════════════════════════════
|
|
82
|
+
export {
|
|
83
|
+
// Cache class
|
|
84
|
+
ResponseCache,
|
|
85
|
+
// Singleton instance
|
|
86
|
+
responseCache,
|
|
87
|
+
// Convenience functions
|
|
88
|
+
getCachedResponse, cacheResponse, isIntentCacheable, invalidateCacheForFile,
|
|
89
|
+
// Override detection
|
|
90
|
+
checkNoCacheOverride, checkClearCacheCommand,
|
|
91
|
+
// Constants
|
|
92
|
+
UNCACHEABLE_INTENTS, DEFAULT_RESPONSE_CACHE_CONFIG, } from './response-cache.js';
|
|
93
|
+
// ═══════════════════════════════════════════════════════════════
|
|
94
|
+
// INTEGRATION
|
|
95
|
+
// ═══════════════════════════════════════════════════════════════
|
|
96
|
+
export {
|
|
97
|
+
// Main class
|
|
98
|
+
CostOptimizer,
|
|
99
|
+
// Singleton instance
|
|
100
|
+
costOptimizer,
|
|
101
|
+
// Convenience functions
|
|
102
|
+
shouldSkipAPI, getLocalResponse, estimateRequestCost, } from './integration.js';
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/cost/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,kEAAkE;AAClE,QAAQ;AACR,kEAAkE;AAElE,OAAO,EAGL,SAAS,EACT,WAAW,EAgBX,cAAc,GAKf,MAAM,YAAY,CAAC;AAEpB,kEAAkE;AAClE,kBAAkB;AAClB,kEAAkE;AAElE,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,kEAAkE;AAClE,0BAA0B;AAC1B,kEAAkE;AAElE,OAAO;AACL,WAAW;AACX,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB;AAElB,UAAU;AACV,qBAAqB,EACrB,kBAAkB;AAElB,mBAAmB;AACnB,cAAc,EACd,4BAA4B;AAE5B,YAAY;AACZ,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAS3B,kEAAkE;AAClE,yBAAyB;AACzB,kEAAkE;AAElE,OAAO;AACL,iBAAiB;AACjB,YAAY;AAEZ,UAAU;AACV,YAAY,EACZ,eAAe;AAEf,eAAe;AACf,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,YAAY;AAEZ,SAAS;AACT,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAM3B,kEAAkE;AAClE,2BAA2B;AAC3B,kEAAkE;AAElE,OAAO;AACL,mBAAmB;AACnB,aAAa,EACb,eAAe;AAEf,wBAAwB;AACxB,oBAAoB,EACpB,gBAAgB,EAChB,OAAO;AAEP,mBAAmB;AACnB,YAAY;AAEZ,UAAU;AACV,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB;AAEvB,qBAAqB;AACrB,iBAAiB,EACjB,kBAAkB;AAElB,SAAS;AACT,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAS7B,kEAAkE;AAClE,wBAAwB;AACxB,kEAAkE;AAElE,OAAO;AACL,mBAAmB;AACnB,WAAW,EACX,SAAS,EACT,gBAAgB;AAEhB,eAAe;AACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB;AAElB,UAAU;AACV,oBAAoB,EACpB,iBAAiB;AAEjB,qBAAqB;AACrB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa;AAEb,SAAS;AACT,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,kEAAkE;AAClE,4BAA4B;AAC5B,kEAAkE;AAElE,OAAO;AACL,cAAc;AACd,aAAa;AAEb,qBAAqB;AACrB,aAAa;AAEb,wBAAwB;AACxB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,sBAAsB;AAEtB,qBAAqB;AACrB,oBAAoB,EACpB,sBAAsB;AAEtB,YAAY;AACZ,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAO7B,kEAAkE;AAClE,cAAc;AACd,kEAAkE;AAElE,OAAO;AACL,aAAa;AACb,aAAa;AAEb,qBAAqB;AACrB,aAAa;AAEb,wBAAwB;AACxB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DartMind V17.3 - Cost Optimization Integration
|
|
3
|
+
*
|
|
4
|
+
* This file provides integration helpers to connect the cost optimization
|
|
5
|
+
* module with your existing code WITHOUT modifying core logic.
|
|
6
|
+
*
|
|
7
|
+
* USAGE:
|
|
8
|
+
* 1. Import this module
|
|
9
|
+
* 2. Call processInput() before sending to API
|
|
10
|
+
* 3. Use buildOptimizedRequest() to get API parameters
|
|
11
|
+
*
|
|
12
|
+
* @module cost/integration
|
|
13
|
+
* @version 17.3.0
|
|
14
|
+
*/
|
|
15
|
+
import { CacheableBlock } from './prompt-cache.js';
|
|
16
|
+
import { RouterConfig } from './model-router.js';
|
|
17
|
+
import { ContextScalerConfig } from './context-scaler.js';
|
|
18
|
+
import { CostControllerConfig, ModelTier, ClassificationResult, CostMetrics, ContextTier, ContextTierConfig } from './types.js';
|
|
19
|
+
export interface ProcessedInput {
|
|
20
|
+
skipAPI: boolean;
|
|
21
|
+
localResponse?: string;
|
|
22
|
+
reason?: string;
|
|
23
|
+
query: string;
|
|
24
|
+
modelOverride?: ModelTier;
|
|
25
|
+
classification?: ClassificationResult;
|
|
26
|
+
contextTier?: ContextTierConfig;
|
|
27
|
+
}
|
|
28
|
+
export interface OptimizedRequest {
|
|
29
|
+
model: string;
|
|
30
|
+
system: CacheableBlock[];
|
|
31
|
+
}
|
|
32
|
+
export declare class CostOptimizer {
|
|
33
|
+
private config;
|
|
34
|
+
private routerConfig;
|
|
35
|
+
private scalerConfig;
|
|
36
|
+
private projectContext;
|
|
37
|
+
private reflexCount;
|
|
38
|
+
private apiCallCount;
|
|
39
|
+
private totalInputTokens;
|
|
40
|
+
private totalOutputTokens;
|
|
41
|
+
private totalCacheReadTokens;
|
|
42
|
+
private totalCost;
|
|
43
|
+
private totalSavings;
|
|
44
|
+
private modelCounts;
|
|
45
|
+
private tierCounts;
|
|
46
|
+
constructor(config?: Partial<CostControllerConfig>, routerConfig?: Partial<RouterConfig>, scalerConfig?: Partial<ContextScalerConfig>);
|
|
47
|
+
/**
|
|
48
|
+
* Set project context for caching.
|
|
49
|
+
* Call this once when project is loaded.
|
|
50
|
+
*/
|
|
51
|
+
setProjectContext(context: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Update configuration at runtime.
|
|
54
|
+
*/
|
|
55
|
+
updateConfig(config: Partial<CostControllerConfig>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Update router configuration at runtime.
|
|
58
|
+
*/
|
|
59
|
+
updateRouterConfig(config: Partial<RouterConfig>): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get current configuration.
|
|
62
|
+
*/
|
|
63
|
+
getConfig(): CostControllerConfig;
|
|
64
|
+
/**
|
|
65
|
+
* Get current router configuration.
|
|
66
|
+
*/
|
|
67
|
+
getRouterConfig(): RouterConfig;
|
|
68
|
+
/**
|
|
69
|
+
* Update scaler configuration at runtime.
|
|
70
|
+
*/
|
|
71
|
+
updateScalerConfig(config: Partial<ContextScalerConfig>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Get current scaler configuration.
|
|
74
|
+
*/
|
|
75
|
+
getScalerConfig(): ContextScalerConfig;
|
|
76
|
+
/**
|
|
77
|
+
* Process user input through cost optimization layers.
|
|
78
|
+
* Call this BEFORE sending to Anthropic API.
|
|
79
|
+
*
|
|
80
|
+
* @param input - Raw user input
|
|
81
|
+
* @returns ProcessedInput with skip decision and optional local response
|
|
82
|
+
*/
|
|
83
|
+
processInput(input: string): ProcessedInput;
|
|
84
|
+
/**
|
|
85
|
+
* Build optimized request parameters for Anthropic API.
|
|
86
|
+
*
|
|
87
|
+
* @param modelOverride - Optional model override from processInput
|
|
88
|
+
* @returns Partial request config with system blocks and model
|
|
89
|
+
*/
|
|
90
|
+
buildOptimizedRequest(modelOverride?: ModelTier): OptimizedRequest;
|
|
91
|
+
/**
|
|
92
|
+
* Process API response to extract cache metrics and track costs.
|
|
93
|
+
* Call this after receiving Anthropic API response.
|
|
94
|
+
*/
|
|
95
|
+
processResponse(usage: {
|
|
96
|
+
input_tokens: number;
|
|
97
|
+
output_tokens: number;
|
|
98
|
+
cache_creation_input_tokens?: number;
|
|
99
|
+
cache_read_input_tokens?: number;
|
|
100
|
+
}, model?: ModelTier): void;
|
|
101
|
+
/**
|
|
102
|
+
* Get current session metrics.
|
|
103
|
+
*/
|
|
104
|
+
getMetrics(): CostMetrics;
|
|
105
|
+
/**
|
|
106
|
+
* Format metrics for display.
|
|
107
|
+
*/
|
|
108
|
+
formatMetrics(): string;
|
|
109
|
+
/**
|
|
110
|
+
* Reset metrics (for new session).
|
|
111
|
+
*/
|
|
112
|
+
resetMetrics(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Get tier counts for metrics.
|
|
115
|
+
*/
|
|
116
|
+
getTierCounts(): Record<ContextTier, number>;
|
|
117
|
+
/**
|
|
118
|
+
* Check if a specific optimization layer is enabled.
|
|
119
|
+
*/
|
|
120
|
+
isLayerEnabled(layer: keyof CostControllerConfig): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Enable/disable a specific layer at runtime.
|
|
123
|
+
*/
|
|
124
|
+
setLayerEnabled(layer: keyof CostControllerConfig, enabled: boolean): void;
|
|
125
|
+
private log;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Default cost optimizer instance for easy use.
|
|
129
|
+
* Configure with costOptimizer.updateConfig({ ... })
|
|
130
|
+
*/
|
|
131
|
+
export declare const costOptimizer: CostOptimizer;
|
|
132
|
+
/**
|
|
133
|
+
* Quick check if input should skip API (reflex handled).
|
|
134
|
+
*/
|
|
135
|
+
export declare function shouldSkipAPI(input: string): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Get local response if available (for reflex-handled inputs).
|
|
138
|
+
*/
|
|
139
|
+
export declare function getLocalResponse(input: string): string | undefined;
|
|
140
|
+
/**
|
|
141
|
+
* Estimate cost for a request before making it.
|
|
142
|
+
*/
|
|
143
|
+
export declare function estimateRequestCost(inputTokens: number, outputTokens: number, model?: ModelTier): number;
|
|
144
|
+
//# sourceMappingURL=integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/core/cost/integration.ts"],"names":[],"mappings":"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"}
|