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.
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,290 @@
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
+ export const DEFAULT_RESPONSE_CACHE_CONFIG = {
24
+ enabled: true,
25
+ maxEntries: 100,
26
+ ttlMs: 5 * 60 * 1000, // 5 minutes
27
+ cacheableIntents: [
28
+ 'explain',
29
+ 'read',
30
+ 'search',
31
+ 'list',
32
+ 'simple_qa',
33
+ ],
34
+ };
35
+ // Intents that should NEVER be cached
36
+ export const UNCACHEABLE_INTENTS = [
37
+ 'generate',
38
+ 'refactor',
39
+ 'fix_bug',
40
+ 'write_tests',
41
+ 'multi_file',
42
+ 'architecture',
43
+ 'security',
44
+ 'complex',
45
+ 'unknown',
46
+ ];
47
+ // ═══════════════════════════════════════════════════════════════
48
+ // RESPONSE CACHE CLASS
49
+ // ═══════════════════════════════════════════════════════════════
50
+ export class ResponseCache {
51
+ cache = new Map();
52
+ config;
53
+ stats = {
54
+ hits: 0,
55
+ misses: 0,
56
+ evictions: 0,
57
+ totalSaved: 0, // Estimated tokens saved
58
+ };
59
+ constructor(config = {}) {
60
+ this.config = { ...DEFAULT_RESPONSE_CACHE_CONFIG, ...config };
61
+ }
62
+ /**
63
+ * Get cached response for a query.
64
+ *
65
+ * @param query - User query
66
+ * @param intent - Task intent (for validation)
67
+ * @returns Cached response or undefined
68
+ */
69
+ get(query, intent) {
70
+ if (!this.config.enabled) {
71
+ return undefined;
72
+ }
73
+ // Check if intent is cacheable
74
+ if (!this.isCacheableIntent(intent)) {
75
+ this.stats.misses++;
76
+ return undefined;
77
+ }
78
+ const key = this.getKey(query);
79
+ const entry = this.cache.get(key);
80
+ if (!entry) {
81
+ this.stats.misses++;
82
+ return undefined;
83
+ }
84
+ // Check TTL
85
+ if (Date.now() - entry.timestamp > this.config.ttlMs) {
86
+ this.cache.delete(key);
87
+ this.stats.misses++;
88
+ return undefined;
89
+ }
90
+ // Cache hit
91
+ entry.hitCount++;
92
+ this.stats.hits++;
93
+ this.stats.totalSaved += this.estimateTokens(entry.response);
94
+ return entry.response;
95
+ }
96
+ /**
97
+ * Store response in cache.
98
+ *
99
+ * @param query - User query
100
+ * @param response - API response
101
+ * @param intent - Task intent
102
+ */
103
+ set(query, response, intent) {
104
+ if (!this.config.enabled) {
105
+ return;
106
+ }
107
+ // Don't cache uncacheable intents
108
+ if (!this.isCacheableIntent(intent)) {
109
+ return;
110
+ }
111
+ const key = this.getKey(query);
112
+ // Evict if at capacity
113
+ if (this.cache.size >= this.config.maxEntries) {
114
+ this.evictLRU();
115
+ }
116
+ this.cache.set(key, {
117
+ query,
118
+ response,
119
+ intent,
120
+ timestamp: Date.now(),
121
+ hitCount: 0,
122
+ });
123
+ }
124
+ /**
125
+ * Check if an intent is cacheable.
126
+ */
127
+ isCacheableIntent(intent) {
128
+ return this.config.cacheableIntents.includes(intent) &&
129
+ !UNCACHEABLE_INTENTS.includes(intent);
130
+ }
131
+ /**
132
+ * Clear entire cache.
133
+ */
134
+ clear() {
135
+ this.cache.clear();
136
+ }
137
+ /**
138
+ * Clear cache entries related to file modifications.
139
+ * Call this when files are modified to prevent stale cache hits.
140
+ *
141
+ * @param filePath - Path of modified file
142
+ */
143
+ invalidateForFile(filePath) {
144
+ const keysToDelete = [];
145
+ for (const [key, entry] of this.cache) {
146
+ // Invalidate if query mentions the file
147
+ if (entry.query.includes(filePath) ||
148
+ entry.response.includes(filePath)) {
149
+ keysToDelete.push(key);
150
+ }
151
+ }
152
+ keysToDelete.forEach(key => {
153
+ this.cache.delete(key);
154
+ this.stats.evictions++;
155
+ });
156
+ }
157
+ /**
158
+ * Get cache statistics.
159
+ */
160
+ getStats() {
161
+ const total = this.stats.hits + this.stats.misses;
162
+ return {
163
+ hits: this.stats.hits,
164
+ misses: this.stats.misses,
165
+ hitRate: total > 0 ? (this.stats.hits / total) * 100 : 0,
166
+ entries: this.cache.size,
167
+ evictions: this.stats.evictions,
168
+ totalSaved: this.stats.totalSaved,
169
+ };
170
+ }
171
+ /**
172
+ * Format cache stats for logging.
173
+ */
174
+ formatStats() {
175
+ const stats = this.getStats();
176
+ return [
177
+ `Cache: ${stats.hits} hits, ${stats.misses} misses`,
178
+ `${stats.hitRate.toFixed(1)}% hit rate`,
179
+ `${stats.entries}/${this.config.maxEntries} entries`,
180
+ `~${stats.totalSaved.toLocaleString()} tokens saved`,
181
+ ].join(' | ');
182
+ }
183
+ /**
184
+ * Reset statistics.
185
+ */
186
+ resetStats() {
187
+ this.stats = { hits: 0, misses: 0, evictions: 0, totalSaved: 0 };
188
+ }
189
+ /**
190
+ * Update configuration.
191
+ */
192
+ updateConfig(config) {
193
+ this.config = { ...this.config, ...config };
194
+ }
195
+ /**
196
+ * Get current configuration.
197
+ */
198
+ getConfig() {
199
+ return { ...this.config };
200
+ }
201
+ // ─────────────────────────────────────────────────────────────
202
+ // PRIVATE METHODS
203
+ // ─────────────────────────────────────────────────────────────
204
+ getKey(query) {
205
+ // Normalize query for key generation
206
+ return query.trim().toLowerCase();
207
+ }
208
+ evictLRU() {
209
+ // Find entry with oldest timestamp and lowest hit count
210
+ let oldest = null;
211
+ let oldestTime = Infinity;
212
+ let lowestHits = Infinity;
213
+ for (const [key, entry] of this.cache) {
214
+ // Prioritize removing entries with fewer hits
215
+ if (entry.hitCount < lowestHits ||
216
+ (entry.hitCount === lowestHits && entry.timestamp < oldestTime)) {
217
+ oldest = key;
218
+ oldestTime = entry.timestamp;
219
+ lowestHits = entry.hitCount;
220
+ }
221
+ }
222
+ if (oldest) {
223
+ this.cache.delete(oldest);
224
+ this.stats.evictions++;
225
+ }
226
+ }
227
+ estimateTokens(text) {
228
+ return Math.ceil(text.length / 4);
229
+ }
230
+ }
231
+ // ═══════════════════════════════════════════════════════════════
232
+ // SINGLETON INSTANCE
233
+ // ═══════════════════════════════════════════════════════════════
234
+ /**
235
+ * Default response cache instance.
236
+ */
237
+ export const responseCache = new ResponseCache();
238
+ // ═══════════════════════════════════════════════════════════════
239
+ // CONVENIENCE FUNCTIONS
240
+ // ═══════════════════════════════════════════════════════════════
241
+ /**
242
+ * Quick check if a response is cached.
243
+ */
244
+ export function getCachedResponse(query, intent) {
245
+ return responseCache.get(query, intent);
246
+ }
247
+ /**
248
+ * Quick cache a response.
249
+ */
250
+ export function cacheResponse(query, response, intent) {
251
+ responseCache.set(query, response, intent);
252
+ }
253
+ /**
254
+ * Check if an intent allows caching.
255
+ */
256
+ export function isIntentCacheable(intent) {
257
+ return responseCache.isCacheableIntent(intent);
258
+ }
259
+ /**
260
+ * Invalidate cache when a file is modified.
261
+ */
262
+ export function invalidateCacheForFile(filePath) {
263
+ responseCache.invalidateForFile(filePath);
264
+ }
265
+ // ═══════════════════════════════════════════════════════════════
266
+ // CACHE OVERRIDE DETECTION
267
+ // ═══════════════════════════════════════════════════════════════
268
+ /**
269
+ * Check if user requested to bypass cache.
270
+ * Supports: /no-cache, /fresh
271
+ */
272
+ export function checkNoCacheOverride(input) {
273
+ const trimmed = input.trim();
274
+ const patterns = [/^\/no-cache\s+(.+)$/i, /^\/fresh\s+(.+)$/i];
275
+ for (const pattern of patterns) {
276
+ const match = trimmed.match(pattern);
277
+ if (match) {
278
+ return { bypass: true, query: match[1].trim() };
279
+ }
280
+ }
281
+ return null;
282
+ }
283
+ /**
284
+ * Check if user requested to clear cache.
285
+ * Supports: /clear-cache
286
+ */
287
+ export function checkClearCacheCommand(input) {
288
+ return /^\/clear-cache\s*$/i.test(input.trim());
289
+ }
290
+ //# sourceMappingURL=response-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-cache.js","sourceRoot":"","sources":["../../../src/core/cost/response-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * DartMind V17.3 - Tool Loading Optimization
3
+ *
4
+ * PURPOSE: Load only tools needed for the current task.
5
+ * COST IMPACT: 10-15% savings by reducing token overhead
6
+ * QUALITY IMPACT: NONE (all needed tools available)
7
+ *
8
+ * TOOL GROUPS:
9
+ * - Core: Always loaded (Read, Write, Edit, Bash)
10
+ * - Analysis: For code review/explain (Grep, Glob)
11
+ * - Generation: For code creation (Write, Edit, TodoWrite)
12
+ * - Testing: For test-related tasks (Bash, Glob)
13
+ * - MCP: For DartMind tools (verify_package, analyze_dart, etc.)
14
+ *
15
+ * SAFETY:
16
+ * - Core tools always available
17
+ * - Unknown intents get all tools
18
+ * - User can force all tools with /all-tools
19
+ *
20
+ * @module cost/tool-loader
21
+ * @version 17.3.0
22
+ */
23
+ import { TaskIntent } from './types.js';
24
+ export type ToolName = 'Read' | 'Write' | 'Edit' | 'Bash' | 'Glob' | 'Grep' | 'TodoWrite' | 'WebFetch' | 'WebSearch' | 'mcp__verify_package' | 'mcp__analyze_dart' | 'mcp__security_scan' | 'mcp__check_policy';
25
+ export type ToolGroup = 'core' | 'analysis' | 'generation' | 'testing' | 'mcp' | 'web';
26
+ export declare const TOOL_GROUPS: Record<ToolGroup, ToolName[]>;
27
+ export declare const ALL_TOOLS: ToolName[];
28
+ /**
29
+ * Maps task intents to required tool groups.
30
+ * Design principle: Include all potentially needed tools, exclude clearly unnecessary ones.
31
+ */
32
+ export declare const INTENT_TOOLS_MAP: Record<TaskIntent, ToolGroup[]>;
33
+ export interface ToolLoaderConfig {
34
+ alwaysIncludeCore: boolean;
35
+ enableMcpTools: boolean;
36
+ enableWebTools: boolean;
37
+ maxTools: number;
38
+ }
39
+ export declare const DEFAULT_TOOL_CONFIG: ToolLoaderConfig;
40
+ /**
41
+ * Get tools needed for a specific intent.
42
+ *
43
+ * @param intent - Task intent
44
+ * @param config - Tool loader configuration
45
+ * @returns Array of tool names to load
46
+ */
47
+ export declare function getToolsForIntent(intent: TaskIntent, config?: ToolLoaderConfig): ToolName[];
48
+ /**
49
+ * Get all available tools (for /all-tools override).
50
+ */
51
+ export declare function getAllTools(): ToolName[];
52
+ /**
53
+ * Get tools for multiple intents (union).
54
+ */
55
+ export declare function getToolsForIntents(intents: TaskIntent[], config?: ToolLoaderConfig): ToolName[];
56
+ export interface ToolMetrics {
57
+ toolsLoaded: number;
58
+ toolsAvailable: number;
59
+ tokensEstimate: number;
60
+ savingsPercent: number;
61
+ }
62
+ /**
63
+ * Calculate metrics for loaded tools.
64
+ */
65
+ export declare function calculateToolMetrics(loadedTools: ToolName[]): ToolMetrics;
66
+ /**
67
+ * Format tool metrics for logging.
68
+ */
69
+ export declare function formatToolMetrics(metrics: ToolMetrics): string;
70
+ /**
71
+ * Check if user requested all tools.
72
+ * Supports: /all-tools, /full-tools
73
+ */
74
+ export declare function checkAllToolsOverride(input: string): {
75
+ override: boolean;
76
+ query: string;
77
+ } | null;
78
+ /**
79
+ * Check if user requested specific tool groups.
80
+ * Supports: /tools:core, /tools:analysis,generation
81
+ */
82
+ export declare function checkToolGroupOverride(input: string): {
83
+ groups: ToolGroup[];
84
+ query: string;
85
+ } | null;
86
+ /**
87
+ * Get tools from specific groups.
88
+ */
89
+ export declare function getToolsFromGroups(groups: ToolGroup[], config?: ToolLoaderConfig): ToolName[];
90
+ /**
91
+ * Get a human-readable description of which tools will be loaded.
92
+ */
93
+ export declare function describeTools(tools: ToolName[]): string;
94
+ //# sourceMappingURL=tool-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loader.d.ts","sourceRoot":"","sources":["../../../src/core/cost/tool-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAMxC,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,WAAW,GACX,UAAU,GACV,WAAW,GAEX,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,mBAAmB,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAOrD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,QAAQ,EAI/B,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,CA+B5D,CAAC;AAMF,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAKjC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,MAAM,GAAE,gBAAsC,GAC7C,QAAQ,EAAE,CAwBZ;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,GAAE,gBAAsC,GAC7C,QAAQ,EAAE,CASZ;AAMD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAmBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,WAAW,CAqBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAM9D;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAahG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBnG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,GAAE,gBAAsC,GAC7C,QAAQ,EAAE,CAgBZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAUvD"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * DartMind V17.3 - Tool Loading Optimization
3
+ *
4
+ * PURPOSE: Load only tools needed for the current task.
5
+ * COST IMPACT: 10-15% savings by reducing token overhead
6
+ * QUALITY IMPACT: NONE (all needed tools available)
7
+ *
8
+ * TOOL GROUPS:
9
+ * - Core: Always loaded (Read, Write, Edit, Bash)
10
+ * - Analysis: For code review/explain (Grep, Glob)
11
+ * - Generation: For code creation (Write, Edit, TodoWrite)
12
+ * - Testing: For test-related tasks (Bash, Glob)
13
+ * - MCP: For DartMind tools (verify_package, analyze_dart, etc.)
14
+ *
15
+ * SAFETY:
16
+ * - Core tools always available
17
+ * - Unknown intents get all tools
18
+ * - User can force all tools with /all-tools
19
+ *
20
+ * @module cost/tool-loader
21
+ * @version 17.3.0
22
+ */
23
+ export const TOOL_GROUPS = {
24
+ core: ['Read', 'Bash'],
25
+ analysis: ['Grep', 'Glob'],
26
+ generation: ['Write', 'Edit', 'TodoWrite'],
27
+ testing: ['Bash', 'Glob', 'Grep'],
28
+ mcp: ['mcp__verify_package', 'mcp__analyze_dart', 'mcp__security_scan', 'mcp__check_policy'],
29
+ web: ['WebFetch', 'WebSearch'],
30
+ };
31
+ export const ALL_TOOLS = [
32
+ 'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep',
33
+ 'TodoWrite', 'WebFetch', 'WebSearch',
34
+ 'mcp__verify_package', 'mcp__analyze_dart', 'mcp__security_scan', 'mcp__check_policy'
35
+ ];
36
+ // ═══════════════════════════════════════════════════════════════
37
+ // INTENT TO TOOLS MAPPING
38
+ // ═══════════════════════════════════════════════════════════════
39
+ /**
40
+ * Maps task intents to required tool groups.
41
+ * Design principle: Include all potentially needed tools, exclude clearly unnecessary ones.
42
+ */
43
+ export const INTENT_TOOLS_MAP = {
44
+ // Reflex - No tools needed
45
+ greeting: [],
46
+ farewell: [],
47
+ gibberish: [],
48
+ affirmation: [],
49
+ command: [],
50
+ // Simple tasks - Core only
51
+ simple_qa: ['core'],
52
+ search: ['core', 'analysis'],
53
+ // Read/explain - Core + Analysis
54
+ explain: ['core', 'analysis'],
55
+ read: ['core', 'analysis'],
56
+ list: ['core', 'analysis'],
57
+ // Code generation - Core + Generation + MCP
58
+ generate: ['core', 'generation', 'mcp'],
59
+ refactor: ['core', 'analysis', 'generation', 'mcp'],
60
+ fix_bug: ['core', 'analysis', 'generation', 'mcp'],
61
+ write_tests: ['core', 'analysis', 'generation', 'testing'],
62
+ // Complex tasks - All tools
63
+ multi_file: ['core', 'analysis', 'generation', 'mcp'],
64
+ architecture: ['core', 'analysis', 'generation', 'mcp'],
65
+ security: ['core', 'analysis', 'generation', 'mcp'],
66
+ complex: ['core', 'analysis', 'generation', 'mcp', 'web'],
67
+ // Unknown - All tools (safe default)
68
+ unknown: ['core', 'analysis', 'generation', 'mcp', 'web'],
69
+ };
70
+ export const DEFAULT_TOOL_CONFIG = {
71
+ alwaysIncludeCore: true,
72
+ enableMcpTools: true,
73
+ enableWebTools: true,
74
+ maxTools: 20,
75
+ };
76
+ /**
77
+ * Get tools needed for a specific intent.
78
+ *
79
+ * @param intent - Task intent
80
+ * @param config - Tool loader configuration
81
+ * @returns Array of tool names to load
82
+ */
83
+ export function getToolsForIntent(intent, config = DEFAULT_TOOL_CONFIG) {
84
+ const toolSet = new Set();
85
+ // Always include core tools
86
+ if (config.alwaysIncludeCore) {
87
+ TOOL_GROUPS.core.forEach(tool => toolSet.add(tool));
88
+ }
89
+ // Get tool groups for intent
90
+ const groups = INTENT_TOOLS_MAP[intent] || INTENT_TOOLS_MAP.unknown;
91
+ // Add tools from each group
92
+ for (const group of groups) {
93
+ // Skip MCP/web tools if disabled
94
+ if (group === 'mcp' && !config.enableMcpTools)
95
+ continue;
96
+ if (group === 'web' && !config.enableWebTools)
97
+ continue;
98
+ const tools = TOOL_GROUPS[group];
99
+ tools.forEach(tool => toolSet.add(tool));
100
+ }
101
+ // Convert to array and limit
102
+ const result = Array.from(toolSet).slice(0, config.maxTools);
103
+ return result;
104
+ }
105
+ /**
106
+ * Get all available tools (for /all-tools override).
107
+ */
108
+ export function getAllTools() {
109
+ return [...ALL_TOOLS];
110
+ }
111
+ /**
112
+ * Get tools for multiple intents (union).
113
+ */
114
+ export function getToolsForIntents(intents, config = DEFAULT_TOOL_CONFIG) {
115
+ const toolSet = new Set();
116
+ for (const intent of intents) {
117
+ const tools = getToolsForIntent(intent, config);
118
+ tools.forEach(tool => toolSet.add(tool));
119
+ }
120
+ return Array.from(toolSet).slice(0, config.maxTools);
121
+ }
122
+ // Rough token estimates per tool definition
123
+ const TOOL_TOKEN_ESTIMATES = {
124
+ Read: 100,
125
+ Write: 120,
126
+ Edit: 150,
127
+ Bash: 200,
128
+ Glob: 80,
129
+ Grep: 100,
130
+ TodoWrite: 150,
131
+ WebFetch: 100,
132
+ WebSearch: 100,
133
+ mcp__verify_package: 80,
134
+ mcp__analyze_dart: 80,
135
+ mcp__security_scan: 80,
136
+ mcp__check_policy: 80,
137
+ };
138
+ /**
139
+ * Calculate metrics for loaded tools.
140
+ */
141
+ export function calculateToolMetrics(loadedTools) {
142
+ const tokensLoaded = loadedTools.reduce((sum, tool) => sum + (TOOL_TOKEN_ESTIMATES[tool] || 100), 0);
143
+ const allToolsTokens = ALL_TOOLS.reduce((sum, tool) => sum + (TOOL_TOKEN_ESTIMATES[tool] || 100), 0);
144
+ const savings = allToolsTokens > 0
145
+ ? ((allToolsTokens - tokensLoaded) / allToolsTokens) * 100
146
+ : 0;
147
+ return {
148
+ toolsLoaded: loadedTools.length,
149
+ toolsAvailable: ALL_TOOLS.length,
150
+ tokensEstimate: tokensLoaded,
151
+ savingsPercent: savings,
152
+ };
153
+ }
154
+ /**
155
+ * Format tool metrics for logging.
156
+ */
157
+ export function formatToolMetrics(metrics) {
158
+ return [
159
+ `Tools: ${metrics.toolsLoaded}/${metrics.toolsAvailable}`,
160
+ `~${metrics.tokensEstimate} tokens`,
161
+ `${metrics.savingsPercent.toFixed(1)}% saved`,
162
+ ].join(' | ');
163
+ }
164
+ // ═══════════════════════════════════════════════════════════════
165
+ // TOOL OVERRIDE DETECTION
166
+ // ═══════════════════════════════════════════════════════════════
167
+ /**
168
+ * Check if user requested all tools.
169
+ * Supports: /all-tools, /full-tools
170
+ */
171
+ export function checkAllToolsOverride(input) {
172
+ const trimmed = input.trim();
173
+ const patterns = [/^\/all-tools\s+(.+)$/i, /^\/full-tools\s+(.+)$/i];
174
+ for (const pattern of patterns) {
175
+ const match = trimmed.match(pattern);
176
+ if (match) {
177
+ return { override: true, query: match[1].trim() };
178
+ }
179
+ }
180
+ return null;
181
+ }
182
+ /**
183
+ * Check if user requested specific tool groups.
184
+ * Supports: /tools:core, /tools:analysis,generation
185
+ */
186
+ export function checkToolGroupOverride(input) {
187
+ const trimmed = input.trim();
188
+ const match = trimmed.match(/^\/tools:([a-z,]+)\s+(.+)$/i);
189
+ if (match) {
190
+ const groupNames = match[1].split(',').map(g => g.trim().toLowerCase());
191
+ const validGroups = [];
192
+ for (const name of groupNames) {
193
+ if (name in TOOL_GROUPS) {
194
+ validGroups.push(name);
195
+ }
196
+ }
197
+ if (validGroups.length > 0) {
198
+ return { groups: validGroups, query: match[2].trim() };
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+ /**
204
+ * Get tools from specific groups.
205
+ */
206
+ export function getToolsFromGroups(groups, config = DEFAULT_TOOL_CONFIG) {
207
+ const toolSet = new Set();
208
+ // Always include core
209
+ if (config.alwaysIncludeCore) {
210
+ TOOL_GROUPS.core.forEach(tool => toolSet.add(tool));
211
+ }
212
+ for (const group of groups) {
213
+ if (group === 'mcp' && !config.enableMcpTools)
214
+ continue;
215
+ if (group === 'web' && !config.enableWebTools)
216
+ continue;
217
+ TOOL_GROUPS[group].forEach(tool => toolSet.add(tool));
218
+ }
219
+ return Array.from(toolSet).slice(0, config.maxTools);
220
+ }
221
+ /**
222
+ * Get a human-readable description of which tools will be loaded.
223
+ */
224
+ export function describeTools(tools) {
225
+ const groups = [];
226
+ for (const [group, groupTools] of Object.entries(TOOL_GROUPS)) {
227
+ if (groupTools.some(t => tools.includes(t))) {
228
+ groups.push(group);
229
+ }
230
+ }
231
+ return `${tools.length} tools (${groups.join(', ')})`;
232
+ }
233
+ //# sourceMappingURL=tool-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loader.js","sourceRoot":"","sources":["../../../src/core/cost/tool-loader.ts"],"names":[],"mappings":"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"}