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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +7 -0
- package/package.json +3 -2
- package/dist/core/context-window-tracker.d.ts +0 -89
- package/dist/core/context-window-tracker.d.ts.map +0 -1
- package/dist/core/context-window-tracker.js +0 -161
- package/dist/core/context-window-tracker.js.map +0 -1
- package/dist/core/context-window-tracker.test.d.ts +0 -2
- package/dist/core/context-window-tracker.test.d.ts.map +0 -1
- package/dist/core/context-window-tracker.test.js +0 -238
- package/dist/core/context-window-tracker.test.js.map +0 -1
- package/dist/core/diff-engine.d.ts +0 -64
- package/dist/core/diff-engine.d.ts.map +0 -1
- package/dist/core/diff-engine.js +0 -185
- package/dist/core/diff-engine.js.map +0 -1
- package/dist/core/diff-engine.test.d.ts +0 -2
- package/dist/core/diff-engine.test.d.ts.map +0 -1
- package/dist/core/diff-engine.test.js +0 -351
- package/dist/core/diff-engine.test.js.map +0 -1
- package/dist/core/persistent-cache.d.ts +0 -153
- package/dist/core/persistent-cache.d.ts.map +0 -1
- package/dist/core/persistent-cache.js +0 -555
- package/dist/core/persistent-cache.js.map +0 -1
- package/dist/core/persistent-cache.test.d.ts +0 -2
- package/dist/core/persistent-cache.test.d.ts.map +0 -1
- package/dist/core/persistent-cache.test.js +0 -251
- package/dist/core/persistent-cache.test.js.map +0 -1
- package/dist/core/real-token-estimator.d.ts +0 -49
- package/dist/core/real-token-estimator.d.ts.map +0 -1
- package/dist/core/real-token-estimator.js +0 -93
- package/dist/core/real-token-estimator.js.map +0 -1
- package/dist/formatters/context-markup.d.ts +0 -40
- package/dist/formatters/context-markup.d.ts.map +0 -1
- package/dist/formatters/context-markup.js +0 -55
- package/dist/formatters/context-markup.js.map +0 -1
- package/dist/formatters/smart-read-xml.d.ts +0 -20
- package/dist/formatters/smart-read-xml.d.ts.map +0 -1
- package/dist/formatters/smart-read-xml.js +0 -163
- package/dist/formatters/smart-read-xml.js.map +0 -1
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.
|
|
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 +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"}
|