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,284 @@
1
+ /**
2
+ * Day 1 Tests - Reflex Layer + Prompt Caching
3
+ *
4
+ * Run with: npm test -- --testPathPattern=day1
5
+ *
6
+ * @module cost/__tests__/day1
7
+ */
8
+ import { describe, test, expect } from 'vitest';
9
+ import { tryReflex, shouldBypassReflex, checkModelOverride, buildCachedSystemBlocks, calculateCacheMetrics, DEFAULT_CACHE_CONFIG, CostOptimizer, shouldSkipAPI, getLocalResponse, } from '../index.js';
10
+ describe('Reflex Layer', () => {
11
+ describe('tryReflex', () => {
12
+ // Greetings should be handled
13
+ test.each([
14
+ ['hi', true],
15
+ ['Hi', true],
16
+ ['HI!', true],
17
+ ['hello', true],
18
+ ['Hello!', true],
19
+ ['hey', true],
20
+ ['yo', true],
21
+ ['sup', true],
22
+ ['good morning', true],
23
+ ['Good Evening!', true],
24
+ ])('handles greeting "%s"', (input, expectedHandled) => {
25
+ const result = tryReflex(input);
26
+ expect(result.handled).toBe(expectedHandled);
27
+ expect(result.cost).toBe(0);
28
+ if (expectedHandled) {
29
+ expect(result.response).toBeTruthy();
30
+ }
31
+ });
32
+ // Thanks should be handled
33
+ test.each([
34
+ ['thanks', true],
35
+ ['Thanks!', true],
36
+ ['thank you', true],
37
+ ['thx', true],
38
+ ['ty', true],
39
+ ])('handles thanks "%s"', (input, expectedHandled) => {
40
+ const result = tryReflex(input);
41
+ expect(result.handled).toBe(expectedHandled);
42
+ expect(result.cost).toBe(0);
43
+ });
44
+ // Affirmations should be handled (with null response)
45
+ test.each([
46
+ ['ok', true],
47
+ ['okay', true],
48
+ ['got it', true],
49
+ ['yes', true],
50
+ ['no', true],
51
+ ['cool', true],
52
+ ])('handles affirmation "%s"', (input, expectedHandled) => {
53
+ const result = tryReflex(input);
54
+ expect(result.handled).toBe(expectedHandled);
55
+ expect(result.response).toBeUndefined(); // Silent skip
56
+ });
57
+ // Gibberish should be handled
58
+ test.each([
59
+ ['asdfghjkl', true],
60
+ ['!@#$%^&*()', true],
61
+ ])('handles gibberish "%s"', (input, expectedHandled) => {
62
+ const result = tryReflex(input);
63
+ expect(result.handled).toBe(expectedHandled);
64
+ });
65
+ // Commands should be handled
66
+ test.each([
67
+ ['/help', true],
68
+ ['/version', true],
69
+ ['/status', true],
70
+ ['/models', true],
71
+ ])('handles command "%s"', (input, expectedHandled) => {
72
+ const result = tryReflex(input);
73
+ expect(result.handled).toBe(expectedHandled);
74
+ expect(result.response).toBeTruthy();
75
+ });
76
+ // Real queries should NOT be handled
77
+ test.each([
78
+ ['create a login screen', false],
79
+ ['what does this error mean?', false],
80
+ ['fix the bug in main.dart', false],
81
+ ['explain how riverpod works', false],
82
+ ['refactor this to use bloc', false],
83
+ ['hi, can you help me with flutter?', false], // "hi" + more
84
+ ['create a button widget', false],
85
+ ])('does NOT handle real query "%s"', (input, expectedHandled) => {
86
+ const result = tryReflex(input);
87
+ expect(result.handled).toBe(expectedHandled);
88
+ });
89
+ });
90
+ describe('shouldBypassReflex', () => {
91
+ test('bypasses questions', () => {
92
+ expect(shouldBypassReflex('what is flutter?')).toBe(true);
93
+ expect(shouldBypassReflex('how do I create a widget?')).toBe(true);
94
+ });
95
+ test('bypasses code-related', () => {
96
+ expect(shouldBypassReflex('create a new widget')).toBe(true);
97
+ expect(shouldBypassReflex('fix the error')).toBe(true);
98
+ });
99
+ test('bypasses multi-line', () => {
100
+ expect(shouldBypassReflex('line1\nline2')).toBe(true);
101
+ });
102
+ test('bypasses long inputs', () => {
103
+ expect(shouldBypassReflex('a'.repeat(51))).toBe(true);
104
+ });
105
+ test('does not bypass simple greetings', () => {
106
+ expect(shouldBypassReflex('hi')).toBe(false);
107
+ expect(shouldBypassReflex('hello')).toBe(false);
108
+ });
109
+ });
110
+ describe('checkModelOverride', () => {
111
+ test('detects /haiku prefix', () => {
112
+ const result = checkModelOverride('/haiku explain this error');
113
+ expect(result).toEqual({ model: 'haiku', query: 'explain this error' });
114
+ });
115
+ test('detects /sonnet prefix', () => {
116
+ const result = checkModelOverride('/sonnet create a widget');
117
+ expect(result).toEqual({ model: 'sonnet', query: 'create a widget' });
118
+ });
119
+ test('detects /opus prefix', () => {
120
+ const result = checkModelOverride('/opus design the architecture');
121
+ expect(result).toEqual({ model: 'opus', query: 'design the architecture' });
122
+ });
123
+ test('returns null for no override', () => {
124
+ expect(checkModelOverride('just a normal query')).toBeNull();
125
+ });
126
+ });
127
+ });
128
+ describe('Prompt Caching', () => {
129
+ describe('buildCachedSystemBlocks', () => {
130
+ test('creates blocks with cache_control when enabled', () => {
131
+ const blocks = buildCachedSystemBlocks('test project context', DEFAULT_CACHE_CONFIG);
132
+ expect(blocks.length).toBe(3);
133
+ expect(blocks[0].cache_control).toEqual({ type: 'ephemeral' });
134
+ expect(blocks[1].cache_control).toEqual({ type: 'ephemeral' });
135
+ expect(blocks[2].cache_control).toEqual({ type: 'ephemeral' });
136
+ });
137
+ test('creates blocks without cache_control when disabled', () => {
138
+ const config = {
139
+ enableSystemPromptCache: false,
140
+ enableToolDefinitionsCache: false,
141
+ enableProjectContextCache: false
142
+ };
143
+ const blocks = buildCachedSystemBlocks('test', config);
144
+ expect(blocks[0].cache_control).toBeUndefined();
145
+ expect(blocks[1].cache_control).toBeUndefined();
146
+ expect(blocks[2].cache_control).toBeUndefined();
147
+ });
148
+ test('handles missing project context', () => {
149
+ const blocks = buildCachedSystemBlocks(undefined, DEFAULT_CACHE_CONFIG);
150
+ expect(blocks.length).toBe(2); // Only system prompt and tools
151
+ });
152
+ });
153
+ describe('calculateCacheMetrics', () => {
154
+ test('calculates savings correctly', () => {
155
+ const usage = {
156
+ input_tokens: 10000,
157
+ cache_read_input_tokens: 8000,
158
+ cache_creation_input_tokens: 0
159
+ };
160
+ const metrics = calculateCacheMetrics(usage);
161
+ expect(metrics.cacheReadTokens).toBe(8000);
162
+ expect(metrics.freshInputTokens).toBe(2000);
163
+ expect(metrics.cacheSavingsPercent).toBeGreaterThan(70);
164
+ });
165
+ test('handles no cache hits', () => {
166
+ const usage = {
167
+ input_tokens: 10000,
168
+ cache_read_input_tokens: 0,
169
+ cache_creation_input_tokens: 10000
170
+ };
171
+ const metrics = calculateCacheMetrics(usage);
172
+ expect(metrics.cacheReadTokens).toBe(0);
173
+ expect(metrics.cacheSavingsPercent).toBe(0);
174
+ });
175
+ });
176
+ });
177
+ describe('CostOptimizer Integration', () => {
178
+ test('processInput handles reflex locally', () => {
179
+ const optimizer = new CostOptimizer({ debug: false });
180
+ const result = optimizer.processInput('hi');
181
+ expect(result.skipAPI).toBe(true);
182
+ expect(result.localResponse).toContain('Hello');
183
+ expect(result.reason).toContain('greeting');
184
+ });
185
+ test('processInput passes real queries to API', () => {
186
+ const optimizer = new CostOptimizer({ debug: false });
187
+ const result = optimizer.processInput('create a login screen');
188
+ expect(result.skipAPI).toBe(false);
189
+ expect(result.query).toBe('create a login screen');
190
+ });
191
+ test('processInput detects model overrides', () => {
192
+ const optimizer = new CostOptimizer({ debug: false });
193
+ const result = optimizer.processInput('/haiku explain this');
194
+ expect(result.skipAPI).toBe(false);
195
+ expect(result.modelOverride).toBe('haiku');
196
+ expect(result.query).toBe('explain this');
197
+ });
198
+ test('buildOptimizedRequest returns cached system blocks', () => {
199
+ const optimizer = new CostOptimizer({ debug: false });
200
+ const request = optimizer.buildOptimizedRequest();
201
+ expect(request.model).toContain('claude');
202
+ expect(request.system.length).toBeGreaterThan(0);
203
+ expect(request.system[0].cache_control).toEqual({ type: 'ephemeral' });
204
+ });
205
+ test('getMetrics tracks requests', () => {
206
+ const optimizer = new CostOptimizer({ debug: false });
207
+ optimizer.processInput('hi'); // Reflex
208
+ optimizer.processInput('create widget'); // API
209
+ const metrics = optimizer.getMetrics();
210
+ expect(metrics.totalRequests).toBe(2);
211
+ expect(metrics.reflexCount).toBe(1);
212
+ });
213
+ test('can disable reflex layer', () => {
214
+ const optimizer = new CostOptimizer({
215
+ debug: false,
216
+ enableReflexLayer: false
217
+ });
218
+ const result = optimizer.processInput('hi');
219
+ expect(result.skipAPI).toBe(false); // Not handled locally
220
+ });
221
+ test('can disable prompt caching', () => {
222
+ const optimizer = new CostOptimizer({
223
+ debug: false,
224
+ enablePromptCaching: false
225
+ });
226
+ const request = optimizer.buildOptimizedRequest();
227
+ expect(request.system[0].cache_control).toBeUndefined();
228
+ });
229
+ });
230
+ describe('Convenience Functions', () => {
231
+ test('shouldSkipAPI returns true for reflex inputs', () => {
232
+ expect(shouldSkipAPI('hi')).toBe(true);
233
+ expect(shouldSkipAPI('thanks')).toBe(true);
234
+ expect(shouldSkipAPI('/help')).toBe(true);
235
+ });
236
+ test('shouldSkipAPI returns false for real queries', () => {
237
+ expect(shouldSkipAPI('create a widget')).toBe(false);
238
+ expect(shouldSkipAPI('what is flutter?')).toBe(false);
239
+ });
240
+ test('getLocalResponse returns response for reflex inputs', () => {
241
+ const response = getLocalResponse('hi');
242
+ expect(response).toContain('Hello');
243
+ });
244
+ test('getLocalResponse returns undefined for real queries', () => {
245
+ const response = getLocalResponse('create a widget');
246
+ expect(response).toBeUndefined();
247
+ });
248
+ });
249
+ // Quick smoke test
250
+ describe('Integration Smoke Test', () => {
251
+ test('reflex layer handles "hi" correctly', () => {
252
+ const result = tryReflex('hi');
253
+ expect(result.handled).toBe(true);
254
+ expect(result.cost).toBe(0);
255
+ expect(result.response).toContain('Hello');
256
+ });
257
+ test('prompt cache blocks are structured correctly', () => {
258
+ const blocks = buildCachedSystemBlocks('Test Project');
259
+ // Verify structure for Anthropic API
260
+ for (const block of blocks) {
261
+ expect(block.type).toBe('text');
262
+ expect(typeof block.text).toBe('string');
263
+ expect(block.text.length).toBeGreaterThan(0);
264
+ }
265
+ });
266
+ test('cost optimizer complete flow', () => {
267
+ const optimizer = new CostOptimizer({ debug: false });
268
+ optimizer.setProjectContext('Test Flutter Project');
269
+ // Test reflex
270
+ const reflexResult = optimizer.processInput('hello');
271
+ expect(reflexResult.skipAPI).toBe(true);
272
+ // Test API pass-through
273
+ const apiResult = optimizer.processInput('create a login screen');
274
+ expect(apiResult.skipAPI).toBe(false);
275
+ // Test model override
276
+ const overrideResult = optimizer.processInput('/haiku explain widgets');
277
+ expect(overrideResult.modelOverride).toBe('haiku');
278
+ // Verify metrics
279
+ const metrics = optimizer.getMetrics();
280
+ expect(metrics.reflexCount).toBe(1);
281
+ expect(metrics.totalRequests).toBe(3);
282
+ });
283
+ });
284
+ //# sourceMappingURL=day1.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day1.test.js","sourceRoot":"","sources":["../../../../src/core/cost/__tests__/day1.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Day 2 Tests - Model Router
3
+ *
4
+ * Run with: npx vitest run src/core/cost/__tests__/day2.test.ts
5
+ *
6
+ * @module cost/__tests__/day2
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=day2.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day2.test.d.ts","sourceRoot":"","sources":["../../../../src/core/cost/__tests__/day2.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}