token-pilot 0.2.1 → 0.2.2

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 (39) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +7 -0
  3. package/package.json +3 -2
  4. package/dist/core/context-window-tracker.d.ts +0 -89
  5. package/dist/core/context-window-tracker.d.ts.map +0 -1
  6. package/dist/core/context-window-tracker.js +0 -161
  7. package/dist/core/context-window-tracker.js.map +0 -1
  8. package/dist/core/context-window-tracker.test.d.ts +0 -2
  9. package/dist/core/context-window-tracker.test.d.ts.map +0 -1
  10. package/dist/core/context-window-tracker.test.js +0 -238
  11. package/dist/core/context-window-tracker.test.js.map +0 -1
  12. package/dist/core/diff-engine.d.ts +0 -64
  13. package/dist/core/diff-engine.d.ts.map +0 -1
  14. package/dist/core/diff-engine.js +0 -185
  15. package/dist/core/diff-engine.js.map +0 -1
  16. package/dist/core/diff-engine.test.d.ts +0 -2
  17. package/dist/core/diff-engine.test.d.ts.map +0 -1
  18. package/dist/core/diff-engine.test.js +0 -351
  19. package/dist/core/diff-engine.test.js.map +0 -1
  20. package/dist/core/persistent-cache.d.ts +0 -153
  21. package/dist/core/persistent-cache.d.ts.map +0 -1
  22. package/dist/core/persistent-cache.js +0 -555
  23. package/dist/core/persistent-cache.js.map +0 -1
  24. package/dist/core/persistent-cache.test.d.ts +0 -2
  25. package/dist/core/persistent-cache.test.d.ts.map +0 -1
  26. package/dist/core/persistent-cache.test.js +0 -251
  27. package/dist/core/persistent-cache.test.js.map +0 -1
  28. package/dist/core/real-token-estimator.d.ts +0 -49
  29. package/dist/core/real-token-estimator.d.ts.map +0 -1
  30. package/dist/core/real-token-estimator.js +0 -93
  31. package/dist/core/real-token-estimator.js.map +0 -1
  32. package/dist/formatters/context-markup.d.ts +0 -40
  33. package/dist/formatters/context-markup.d.ts.map +0 -1
  34. package/dist/formatters/context-markup.js +0 -55
  35. package/dist/formatters/context-markup.js.map +0 -1
  36. package/dist/formatters/smart-read-xml.d.ts +0 -20
  37. package/dist/formatters/smart-read-xml.d.ts.map +0 -1
  38. package/dist/formatters/smart-read-xml.js +0 -163
  39. package/dist/formatters/smart-read-xml.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "token-pilot",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Reduces token consumption by 80-95% via AST-aware lazy file reading. Returns structural overviews instead of full files.",
5
5
  "author": "token-pilot",
6
6
  "license": "MIT",
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to Token Pilot will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.2] - 2026-03-01
9
+
10
+ ### Fixed
11
+ - Published 0.2.1 contained stale Haiku files in dist/ (tsc doesn't clean old outputs)
12
+ - Added `prebuild` script (`rm -rf dist`) to prevent stale artifacts
13
+ - Added `chmod +x` in prepublishOnly to ensure bin is executable
14
+
8
15
  ## [0.2.1] - 2026-03-01
9
16
 
10
17
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "token-pilot",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "MCP server that reduces token consumption in AI coding assistants via AST-aware lazy file reading",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,13 +17,14 @@
17
17
  "CHANGELOG.md"
18
18
  ],
19
19
  "scripts": {
20
+ "prebuild": "rm -rf dist",
20
21
  "build": "tsc",
21
22
  "dev": "tsc --watch",
22
23
  "start": "node dist/index.js",
23
24
  "test": "vitest run",
24
25
  "test:watch": "vitest",
25
26
  "lint": "tsc --noEmit",
26
- "prepublishOnly": "npm run build"
27
+ "prepublishOnly": "npm run build && chmod +x dist/index.js"
27
28
  },
28
29
  "keywords": [
29
30
  "mcp",
@@ -1,89 +0,0 @@
1
- import type { ContextWindowStatus, SupportedModel } from '../types';
2
- /**
3
- * Context Window Tracker
4
- *
5
- * Provides real-time visibility into context window usage
6
- * Prevents accidental context overflow by tracking token usage per model
7
- *
8
- * Problem: No visibility into how many tokens have been used
9
- * Solution: Track usage across all loaded files and provide safety warnings
10
- */
11
- export declare class ContextWindowTracker {
12
- private model;
13
- private usedTokens;
14
- private safetyMargin;
15
- private entries;
16
- private modelLimits;
17
- constructor(model?: SupportedModel);
18
- /**
19
- * Check if can safely load additional tokens
20
- * Returns true if (usedTokens + newTokens) <= (limit * safetyMargin)
21
- */
22
- canLoad(tokens: number): boolean;
23
- /**
24
- * Track tokens for a specific source (file, symbol, range, etc)
25
- */
26
- track(source: string, tokens: number): void;
27
- /**
28
- * Remove tracking for a source (e.g., when cache is cleared)
29
- */
30
- untrack(source: string): void;
31
- /**
32
- * Get current context window status
33
- */
34
- getStatus(): ContextWindowStatus;
35
- /**
36
- * Get remaining safe tokens before hitting safety margin
37
- */
38
- getSafeRemaining(): number;
39
- /**
40
- * Check if usage exceeds safety margin (warning zone)
41
- */
42
- isInWarningZone(): boolean;
43
- /**
44
- * Check if usage exceeds hard limit
45
- */
46
- isOverflowing(): boolean;
47
- /**
48
- * Reset all tracking
49
- */
50
- reset(): void;
51
- /**
52
- * Set model and reset usage (since different models have different limits)
53
- */
54
- setModel(model: SupportedModel): void;
55
- /**
56
- * Set custom safety margin (0.0 to 1.0)
57
- * 0.8 = use 80% of context window as safe zone
58
- * 0.9 = use 90% of context window as safe zone
59
- */
60
- setSafetyMargin(margin: number): void;
61
- /**
62
- * Get current model
63
- */
64
- getModel(): SupportedModel;
65
- /**
66
- * Get total token limit for current model
67
- */
68
- getTotalTokens(): number;
69
- /**
70
- * Get used tokens
71
- */
72
- getUsedTokens(): number;
73
- /**
74
- * Get all tracked entries
75
- */
76
- getEntries(): Array<{
77
- source: string;
78
- tokens: number;
79
- }>;
80
- /**
81
- * Get token usage as percentage (0-100)
82
- */
83
- getPercentageUsed(): number;
84
- }
85
- /**
86
- * Singleton instance for global use
87
- */
88
- export declare const contextWindowTracker: ContextWindowTracker;
89
- //# sourceMappingURL=context-window-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-window-tracker.d.ts","sourceRoot":"","sources":["../../src/core/context-window-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEnE;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,WAAW,CAOlB;gBAEW,KAAK,GAAE,cAAwB;IAI3C;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAMhC;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK7B;;OAEG;IACH,SAAS,IAAI,mBAAmB;IAsBhC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAM1B;;OAEG;IACH,eAAe,IAAI,OAAO;IAS1B;;OAEG;IACH,aAAa,IAAI,OAAO;IAKxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKrC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOrC;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,UAAU,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAOvD;;OAEG;IACH,iBAAiB,IAAI,MAAM;CAI5B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,sBAA6B,CAAA"}
@@ -1,161 +0,0 @@
1
- /**
2
- * Context Window Tracker
3
- *
4
- * Provides real-time visibility into context window usage
5
- * Prevents accidental context overflow by tracking token usage per model
6
- *
7
- * Problem: No visibility into how many tokens have been used
8
- * Solution: Track usage across all loaded files and provide safety warnings
9
- */
10
- export class ContextWindowTracker {
11
- model;
12
- usedTokens = 0;
13
- safetyMargin = 0.8; // 80% = safe zone, 80-100% = warning, >100% = overflow
14
- entries = new Map();
15
- modelLimits = {
16
- 'gpt-4': 8192,
17
- 'gpt-4-turbo': 128000,
18
- 'gpt-3.5-turbo': 4096,
19
- 'claude-3-opus': 200000,
20
- 'claude-3-sonnet': 200000,
21
- 'claude-3-haiku': 200000
22
- };
23
- constructor(model = 'gpt-4') {
24
- this.model = model;
25
- }
26
- /**
27
- * Check if can safely load additional tokens
28
- * Returns true if (usedTokens + newTokens) <= (limit * safetyMargin)
29
- */
30
- canLoad(tokens) {
31
- const limit = this.modelLimits[this.model];
32
- const safeLimit = limit * this.safetyMargin;
33
- return (this.usedTokens + tokens) <= safeLimit;
34
- }
35
- /**
36
- * Track tokens for a specific source (file, symbol, range, etc)
37
- */
38
- track(source, tokens) {
39
- this.entries.set(source, tokens);
40
- this.usedTokens = Array.from(this.entries.values()).reduce((sum, t) => sum + t, 0);
41
- }
42
- /**
43
- * Remove tracking for a source (e.g., when cache is cleared)
44
- */
45
- untrack(source) {
46
- this.entries.delete(source);
47
- this.usedTokens = Array.from(this.entries.values()).reduce((sum, t) => sum + t, 0);
48
- }
49
- /**
50
- * Get current context window status
51
- */
52
- getStatus() {
53
- const limit = this.modelLimits[this.model];
54
- const percentageUsed = (this.usedTokens / limit) * 100;
55
- const availableTokens = limit - this.usedTokens;
56
- const safeLimit = limit * this.safetyMargin;
57
- return {
58
- model: this.model,
59
- totalTokens: limit,
60
- usedTokens: this.usedTokens,
61
- availableTokens: availableTokens,
62
- percentageUsed: percentageUsed,
63
- safetyMargin: this.safetyMargin,
64
- isSafe: this.usedTokens <= safeLimit,
65
- entries: Array.from(this.entries.entries()).map(([source, tokens]) => ({
66
- source,
67
- tokens
68
- })),
69
- timestamp: Date.now()
70
- };
71
- }
72
- /**
73
- * Get remaining safe tokens before hitting safety margin
74
- */
75
- getSafeRemaining() {
76
- const limit = this.modelLimits[this.model];
77
- const safeLimit = limit * this.safetyMargin;
78
- return Math.max(0, safeLimit - this.usedTokens);
79
- }
80
- /**
81
- * Check if usage exceeds safety margin (warning zone)
82
- */
83
- isInWarningZone() {
84
- const limit = this.modelLimits[this.model];
85
- const safeLimit = limit * this.safetyMargin;
86
- const hardLimit = limit * 0.99; // 99% = critical zone
87
- const percentageUsed = (this.usedTokens / limit) * 100;
88
- return percentageUsed >= (this.safetyMargin * 100) && percentageUsed < 99;
89
- }
90
- /**
91
- * Check if usage exceeds hard limit
92
- */
93
- isOverflowing() {
94
- const limit = this.modelLimits[this.model];
95
- return this.usedTokens >= limit * 0.99;
96
- }
97
- /**
98
- * Reset all tracking
99
- */
100
- reset() {
101
- this.usedTokens = 0;
102
- this.entries.clear();
103
- }
104
- /**
105
- * Set model and reset usage (since different models have different limits)
106
- */
107
- setModel(model) {
108
- this.model = model;
109
- this.reset();
110
- }
111
- /**
112
- * Set custom safety margin (0.0 to 1.0)
113
- * 0.8 = use 80% of context window as safe zone
114
- * 0.9 = use 90% of context window as safe zone
115
- */
116
- setSafetyMargin(margin) {
117
- if (margin < 0 || margin > 1) {
118
- throw new Error('Safety margin must be between 0 and 1');
119
- }
120
- this.safetyMargin = margin;
121
- }
122
- /**
123
- * Get current model
124
- */
125
- getModel() {
126
- return this.model;
127
- }
128
- /**
129
- * Get total token limit for current model
130
- */
131
- getTotalTokens() {
132
- return this.modelLimits[this.model];
133
- }
134
- /**
135
- * Get used tokens
136
- */
137
- getUsedTokens() {
138
- return this.usedTokens;
139
- }
140
- /**
141
- * Get all tracked entries
142
- */
143
- getEntries() {
144
- return Array.from(this.entries.entries()).map(([source, tokens]) => ({
145
- source,
146
- tokens
147
- }));
148
- }
149
- /**
150
- * Get token usage as percentage (0-100)
151
- */
152
- getPercentageUsed() {
153
- const limit = this.modelLimits[this.model];
154
- return (this.usedTokens / limit) * 100;
155
- }
156
- }
157
- /**
158
- * Singleton instance for global use
159
- */
160
- export const contextWindowTracker = new ContextWindowTracker();
161
- //# sourceMappingURL=context-window-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-window-tracker.js","sourceRoot":"","sources":["../../src/core/context-window-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=context-window-tracker.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-window-tracker.test.d.ts","sourceRoot":"","sources":["../../src/core/context-window-tracker.test.ts"],"names":[],"mappings":""}
@@ -1,238 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { ContextWindowTracker } from './context-window-tracker';
3
- describe('ContextWindowTracker', () => {
4
- let tracker;
5
- beforeEach(() => {
6
- tracker = new ContextWindowTracker('gpt-4');
7
- });
8
- describe('basic tracking', () => {
9
- it('should start with zero tokens', () => {
10
- expect(tracker.getUsedTokens()).toBe(0);
11
- expect(tracker.getStatus().usedTokens).toBe(0);
12
- });
13
- it('should track tokens for a source', () => {
14
- tracker.track('file1.ts', 100);
15
- expect(tracker.getUsedTokens()).toBe(100);
16
- });
17
- it('should sum tokens from multiple sources', () => {
18
- tracker.track('file1.ts', 100);
19
- tracker.track('file2.ts', 200);
20
- tracker.track('symbol.ts', 50);
21
- expect(tracker.getUsedTokens()).toBe(350);
22
- });
23
- it('should update total when overwriting a source', () => {
24
- tracker.track('file1.ts', 100);
25
- expect(tracker.getUsedTokens()).toBe(100);
26
- tracker.track('file1.ts', 150);
27
- expect(tracker.getUsedTokens()).toBe(150);
28
- });
29
- it('should untrack sources', () => {
30
- tracker.track('file1.ts', 100);
31
- tracker.track('file2.ts', 200);
32
- expect(tracker.getUsedTokens()).toBe(300);
33
- tracker.untrack('file1.ts');
34
- expect(tracker.getUsedTokens()).toBe(200);
35
- });
36
- });
37
- describe('canLoad() safety checks', () => {
38
- it('should allow loading within safe zone', () => {
39
- // GPT-4 has 8192 tokens, safe zone is 80% = 6553 tokens
40
- tracker.track('file1.ts', 5000);
41
- expect(tracker.canLoad(1000)).toBe(true);
42
- });
43
- it('should prevent loading beyond safe zone', () => {
44
- // GPT-4 safe zone: 8192 * 0.8 = 6553
45
- tracker.track('file1.ts', 6000);
46
- expect(tracker.canLoad(1000)).toBe(false);
47
- });
48
- it('should prevent loading when already at safe limit', () => {
49
- // GPT-4 safe zone: 8192 * 0.8 = 6553
50
- tracker.track('file1.ts', 6553);
51
- expect(tracker.canLoad(1)).toBe(false);
52
- });
53
- it('should allow loading exactly at safe limit', () => {
54
- tracker.track('file1.ts', 6000);
55
- const safeRemaining = tracker.getSafeRemaining();
56
- expect(tracker.canLoad(safeRemaining)).toBe(true);
57
- });
58
- });
59
- describe('model switching', () => {
60
- it('should support different models with different limits', () => {
61
- tracker = new ContextWindowTracker('gpt-4');
62
- expect(tracker.getTotalTokens()).toBe(8192);
63
- tracker.setModel('gpt-4-turbo');
64
- expect(tracker.getTotalTokens()).toBe(128000);
65
- tracker.setModel('claude-3-opus');
66
- expect(tracker.getTotalTokens()).toBe(200000);
67
- });
68
- it('should reset usage when switching models', () => {
69
- tracker.track('file1.ts', 1000);
70
- expect(tracker.getUsedTokens()).toBe(1000);
71
- tracker.setModel('claude-3-opus');
72
- expect(tracker.getUsedTokens()).toBe(0);
73
- expect(tracker.getEntries()).toHaveLength(0);
74
- });
75
- it('should update safety calculations for new model', () => {
76
- tracker = new ContextWindowTracker('gpt-4');
77
- tracker.track('file1.ts', 5000);
78
- expect(tracker.canLoad(2000)).toBe(false);
79
- tracker.setModel('claude-3-opus');
80
- expect(tracker.getUsedTokens()).toBe(0);
81
- expect(tracker.canLoad(2000)).toBe(true);
82
- });
83
- });
84
- describe('safety margin', () => {
85
- it('should respect safety margin', () => {
86
- tracker.setSafetyMargin(0.9);
87
- // GPT-4 safe zone: 8192 * 0.9 = 7372
88
- tracker.track('file1.ts', 7000);
89
- expect(tracker.canLoad(500)).toBe(false);
90
- });
91
- it('should allow customizing safety margin', () => {
92
- tracker.setSafetyMargin(0.5);
93
- // GPT-4 safe zone: 8192 * 0.5 = 4096
94
- tracker.track('file1.ts', 4000);
95
- expect(tracker.canLoad(100)).toBe(false);
96
- });
97
- it('should reject invalid safety margins', () => {
98
- expect(() => tracker.setSafetyMargin(-0.1)).toThrow();
99
- expect(() => tracker.setSafetyMargin(1.1)).toThrow();
100
- });
101
- });
102
- describe('warning zone detection', () => {
103
- it('should detect when in warning zone', () => {
104
- // Safe zone is 80%, warning is 80-99%
105
- tracker.track('file1.ts', 6600); // 80.5% of 8192
106
- expect(tracker.isInWarningZone()).toBe(true);
107
- });
108
- it('should not warn when below warning zone', () => {
109
- tracker.track('file1.ts', 5000); // ~61% of 8192
110
- expect(tracker.isInWarningZone()).toBe(false);
111
- });
112
- it('should not warn at exact safe margin', () => {
113
- const safeLimit = 8192 * 0.8; // 6553
114
- tracker.track('file1.ts', safeLimit);
115
- expect(tracker.isInWarningZone()).toBe(false);
116
- });
117
- });
118
- describe('overflow detection', () => {
119
- it('should detect overflow (>99% of limit)', () => {
120
- // 99% of GPT-4 is 8110
121
- tracker.track('file1.ts', 8100);
122
- expect(tracker.isOverflowing()).toBe(true);
123
- });
124
- it('should not detect overflow below 99%', () => {
125
- // 98% of GPT-4 is 8027
126
- tracker.track('file1.ts', 8000);
127
- expect(tracker.isOverflowing()).toBe(false);
128
- });
129
- it('should detect overflow at exactly 99%', () => {
130
- const hardLimit = 8192 * 0.99; // 8110
131
- tracker.track('file1.ts', hardLimit);
132
- expect(tracker.isOverflowing()).toBe(true);
133
- });
134
- });
135
- describe('status reporting', () => {
136
- it('should report accurate status', () => {
137
- tracker.track('file1.ts', 1000);
138
- tracker.track('file2.ts', 500);
139
- const status = tracker.getStatus();
140
- expect(status.model).toBe('gpt-4');
141
- expect(status.usedTokens).toBe(1500);
142
- expect(status.totalTokens).toBe(8192);
143
- expect(status.availableTokens).toBe(6692);
144
- expect(status.isSafe).toBe(true);
145
- expect(status.timestamp).toBeGreaterThan(0);
146
- });
147
- it('should mark as unsafe when approaching limit', () => {
148
- tracker.track('file1.ts', 6700); // Beyond safe margin
149
- const status = tracker.getStatus();
150
- expect(status.isSafe).toBe(false);
151
- });
152
- it('should include all tracked entries in status', () => {
153
- tracker.track('file1.ts', 100);
154
- tracker.track('file2.ts', 200);
155
- tracker.track('symbol.ts', 300);
156
- const status = tracker.getStatus();
157
- expect(status.entries).toHaveLength(3);
158
- expect(status.entries).toContainEqual({ source: 'file1.ts', tokens: 100 });
159
- expect(status.entries).toContainEqual({ source: 'file2.ts', tokens: 200 });
160
- expect(status.entries).toContainEqual({ source: 'symbol.ts', tokens: 300 });
161
- });
162
- });
163
- describe('percentage tracking', () => {
164
- it('should calculate percentage used correctly', () => {
165
- tracker.track('file1.ts', 8192 / 2); // 50%
166
- expect(tracker.getPercentageUsed()).toBe(50);
167
- });
168
- it('should report 0% when empty', () => {
169
- expect(tracker.getPercentageUsed()).toBe(0);
170
- });
171
- it('should report correct percentage in status', () => {
172
- tracker.track('file1.ts', 4096); // 50% of 8192
173
- const status = tracker.getStatus();
174
- expect(status.percentageUsed).toBe(50);
175
- });
176
- });
177
- describe('entries management', () => {
178
- it('should return all tracked entries', () => {
179
- tracker.track('file1.ts', 100);
180
- tracker.track('file2.ts', 200);
181
- const entries = tracker.getEntries();
182
- expect(entries).toHaveLength(2);
183
- expect(entries[0].source).toBe('file1.ts');
184
- expect(entries[0].tokens).toBe(100);
185
- });
186
- it('should return empty entries after reset', () => {
187
- tracker.track('file1.ts', 100);
188
- tracker.reset();
189
- expect(tracker.getEntries()).toHaveLength(0);
190
- expect(tracker.getUsedTokens()).toBe(0);
191
- });
192
- });
193
- describe('safe remaining calculation', () => {
194
- it('should calculate safe remaining tokens', () => {
195
- // GPT-4: 8192, safe zone: 6553.6
196
- tracker.track('file1.ts', 1000);
197
- const remaining = tracker.getSafeRemaining();
198
- const safeZone = 8192 * 0.8;
199
- expect(remaining).toBe(safeZone - 1000);
200
- });
201
- it('should return 0 when already beyond safe zone', () => {
202
- tracker.track('file1.ts', 7000);
203
- const remaining = tracker.getSafeRemaining();
204
- expect(remaining).toBe(0);
205
- });
206
- it('should return full safe zone when empty', () => {
207
- const remaining = tracker.getSafeRemaining();
208
- const expectedSafeZone = 8192 * 0.8;
209
- expect(remaining).toBe(expectedSafeZone);
210
- });
211
- });
212
- describe('all supported models', () => {
213
- it('should support all declared models', () => {
214
- const models = [
215
- 'gpt-4',
216
- 'gpt-4-turbo',
217
- 'gpt-3.5-turbo',
218
- 'claude-3-opus',
219
- 'claude-3-sonnet',
220
- 'claude-3-haiku'
221
- ];
222
- const expectedLimits = {
223
- 'gpt-4': 8192,
224
- 'gpt-4-turbo': 128000,
225
- 'gpt-3.5-turbo': 4096,
226
- 'claude-3-opus': 200000,
227
- 'claude-3-sonnet': 200000,
228
- 'claude-3-haiku': 200000
229
- };
230
- models.forEach(model => {
231
- tracker.setModel(model);
232
- expect(tracker.getTotalTokens()).toBe(expectedLimits[model]);
233
- expect(tracker.getModel()).toBe(model);
234
- });
235
- });
236
- });
237
- });
238
- //# sourceMappingURL=context-window-tracker.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-window-tracker.test.js","sourceRoot":"","sources":["../../src/core/context-window-tracker.test.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- import type { FileStructure, SymbolInfo } from '../types';
2
- export interface DiffOperation {
3
- type: 'add' | 'remove' | 'modify';
4
- oldStartLine: number;
5
- oldEndLine: number;
6
- newStartLine: number;
7
- newEndLine: number;
8
- count: number;
9
- }
10
- export interface DiffResult {
11
- operations: DiffOperation[];
12
- totalAddedLines: number;
13
- totalRemovedLines: number;
14
- totalModifiedLines: number;
15
- changePercentage: number;
16
- }
17
- /**
18
- * Diff Engine using Myers Algorithm (via diff library)
19
- *
20
- * Optimizes re-reading of changed files:
21
- * - Identifies exactly which lines changed
22
- * - Extracts which symbols were affected
23
- * - Returns only changed symbols (~20 tokens vs 3000 tokens for full file)
24
- *
25
- * Problem: read_diff returns full file causing unnecessary token usage
26
- * Solution: Compute line-level diff and extract only changed symbols
27
- */
28
- export declare class DiffEngine {
29
- /**
30
- * Compute diff between two file versions
31
- * Uses Myers algorithm (via diff library) for optimal edit distance
32
- *
33
- * Performance: O(n+m) where n,m are line counts (vs O(n*m) naive approach)
34
- */
35
- computeDiff(oldContent: string, newContent: string): DiffResult;
36
- /**
37
- * Extract symbols that have changed based on diff and symbol locations
38
- * Filters to only symbols that intersect with changed line ranges
39
- */
40
- extractChangedSymbols(diff: DiffResult, oldStructure: FileStructure, newStructure: FileStructure): SymbolInfo[];
41
- /**
42
- * Get which lines were marked as changed in diff
43
- */
44
- private getChangedLineRanges;
45
- /**
46
- * Check if two line ranges overlap
47
- */
48
- private rangesOverlap;
49
- /**
50
- * Merge adjacent remove + add operations into modify operations
51
- * This is more semantically accurate than separate add/remove
52
- */
53
- private mergeAdjacentChanges;
54
- /**
55
- * Calculate token savings when using delta read vs full read
56
- * Assumes full file tokens vs changed symbols only
57
- */
58
- estimateTokenSavings(fullFileTokens: number, changedSymbols: SymbolInfo[]): number;
59
- }
60
- /**
61
- * Singleton instance for global use
62
- */
63
- export declare const diffEngine: DiffEngine;
64
- //# sourceMappingURL=diff-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff-engine.d.ts","sourceRoot":"","sources":["../../src/core/diff-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAA;AAEvE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU;IAyE/D;;;OAGG;IACH,qBAAqB,CACnB,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa,GAC1B,UAAU,EAAE;IA2Bf;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;OAGG;IACH,oBAAoB,CAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,UAAU,EAAE,GAC3B,MAAM;CAOV;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAA"}