agentic-qe 1.7.0 → 1.8.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.
- package/.claude/skills/sherlock-review/SKILL.md +786 -0
- package/CHANGELOG.md +531 -0
- package/README.md +37 -21
- package/dist/agents/BaseAgent.d.ts +8 -10
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -43
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +2 -2
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +2 -2
- package/dist/agents/LearningAgent.d.ts.map +1 -1
- package/dist/agents/LearningAgent.js +4 -4
- package/dist/agents/LearningAgent.js.map +1 -1
- package/dist/agents/TestExecutorAgent.d.ts +9 -0
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
- package/dist/agents/TestExecutorAgent.js +60 -0
- package/dist/agents/TestExecutorAgent.js.map +1 -1
- package/dist/agents/examples/batchAnalyze.d.ts +252 -0
- package/dist/agents/examples/batchAnalyze.d.ts.map +1 -0
- package/dist/agents/examples/batchAnalyze.js +259 -0
- package/dist/agents/examples/batchAnalyze.js.map +1 -0
- package/dist/agents/examples/batchGenerate.d.ts +153 -0
- package/dist/agents/examples/batchGenerate.d.ts.map +1 -0
- package/dist/agents/examples/batchGenerate.js +166 -0
- package/dist/agents/examples/batchGenerate.js.map +1 -0
- package/dist/agents/generateWithPII.d.ts +128 -0
- package/dist/agents/generateWithPII.d.ts.map +1 -0
- package/dist/agents/generateWithPII.js +175 -0
- package/dist/agents/generateWithPII.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +51 -46
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +4 -0
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +57 -0
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/AgentDBManager.d.ts +5 -0
- package/dist/core/memory/AgentDBManager.d.ts.map +1 -1
- package/dist/core/memory/AgentDBManager.js +19 -1
- package/dist/core/memory/AgentDBManager.js.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.d.ts +8 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +74 -17
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.d.ts +4 -0
- package/dist/core/memory/ReasoningBankAdapter.d.ts.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.js +20 -0
- package/dist/core/memory/ReasoningBankAdapter.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +8 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +33 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/learning/ImprovementLoop.js +2 -2
- package/dist/learning/ImprovementLoop.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts +11 -7
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +156 -72
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts +83 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js +130 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts +58 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js +84 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/index.d.ts +47 -0
- package/dist/mcp/handlers/filtered/index.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/index.js +63 -0
- package/dist/mcp/handlers/filtered/index.js.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js +83 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js +93 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts +54 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js +73 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts +61 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js +117 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js +2 -2
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/tools/deprecated.d.ts +8 -8
- package/dist/scripts/backup-helper.d.ts +64 -0
- package/dist/scripts/backup-helper.d.ts.map +1 -0
- package/dist/scripts/backup-helper.js +251 -0
- package/dist/scripts/backup-helper.js.map +1 -0
- package/dist/scripts/migrate-with-backup.d.ts +15 -0
- package/dist/scripts/migrate-with-backup.d.ts.map +1 -0
- package/dist/scripts/migrate-with-backup.js +194 -0
- package/dist/scripts/migrate-with-backup.js.map +1 -0
- package/dist/security/pii-tokenization.d.ts +216 -0
- package/dist/security/pii-tokenization.d.ts.map +1 -0
- package/dist/security/pii-tokenization.js +325 -0
- package/dist/security/pii-tokenization.js.map +1 -0
- package/dist/utils/EmbeddingGenerator.d.ts +35 -0
- package/dist/utils/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/utils/EmbeddingGenerator.js +72 -0
- package/dist/utils/EmbeddingGenerator.js.map +1 -0
- package/dist/utils/batch-operations.d.ts +215 -0
- package/dist/utils/batch-operations.d.ts.map +1 -0
- package/dist/utils/batch-operations.js +266 -0
- package/dist/utils/batch-operations.js.map +1 -0
- package/dist/utils/filtering.d.ts +180 -0
- package/dist/utils/filtering.d.ts.map +1 -0
- package/dist/utils/filtering.js +288 -0
- package/dist/utils/filtering.js.map +1 -0
- package/dist/utils/prompt-cache-examples.d.ts +111 -0
- package/dist/utils/prompt-cache-examples.d.ts.map +1 -0
- package/dist/utils/prompt-cache-examples.js +416 -0
- package/dist/utils/prompt-cache-examples.js.map +1 -0
- package/dist/utils/prompt-cache.d.ts +305 -0
- package/dist/utils/prompt-cache.d.ts.map +1 -0
- package/dist/utils/prompt-cache.js +448 -0
- package/dist/utils/prompt-cache.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Prompt Caching Infrastructure (CO-1)
|
|
4
|
+
*
|
|
5
|
+
* Implements Anthropic's prompt caching with proper cache key management and invalidation.
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT: Anthropic caching requirements:
|
|
8
|
+
* 1. Minimum 1024 tokens per cached block
|
|
9
|
+
* 2. Cache control on LAST 3 blocks only
|
|
10
|
+
* 3. 5-minute automatic TTL
|
|
11
|
+
*
|
|
12
|
+
* Cost model:
|
|
13
|
+
* - Cache write: 25% premium on input tokens
|
|
14
|
+
* - Cache hit: 90% discount on cached tokens
|
|
15
|
+
* - Regular tokens: Standard $3.00 per 1M input tokens
|
|
16
|
+
*
|
|
17
|
+
* @module utils/prompt-cache
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.PromptCacheManager = void 0;
|
|
24
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
25
|
+
const crypto_1 = require("crypto");
|
|
26
|
+
/**
|
|
27
|
+
* PromptCacheManager
|
|
28
|
+
*
|
|
29
|
+
* Manages Anthropic prompt caching with content-addressable cache keys,
|
|
30
|
+
* TTL-based invalidation, and cost accounting.
|
|
31
|
+
*
|
|
32
|
+
* Features:
|
|
33
|
+
* - SHA-256 based cache keys for content addressability
|
|
34
|
+
* - 5-minute TTL with automatic pruning
|
|
35
|
+
* - Cost tracking for cache writes (25% premium) vs hits (90% discount)
|
|
36
|
+
* - Statistics for cache hit rate and cost savings
|
|
37
|
+
* - Support for up to 3 cached blocks per request
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const cacheManager = new PromptCacheManager(process.env.ANTHROPIC_API_KEY!);
|
|
42
|
+
*
|
|
43
|
+
* const response = await cacheManager.createWithCache({
|
|
44
|
+
* model: 'claude-sonnet-4',
|
|
45
|
+
* systemPrompts: [
|
|
46
|
+
* { text: AGENT_SYSTEM_PROMPT, priority: 'high' },
|
|
47
|
+
* ],
|
|
48
|
+
* projectContext: [
|
|
49
|
+
* { text: JSON.stringify(projectStructure), priority: 'medium' },
|
|
50
|
+
* ],
|
|
51
|
+
* messages: [
|
|
52
|
+
* { role: 'user', content: 'Generate tests for this code...' },
|
|
53
|
+
* ],
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* const stats = cacheManager.getStats();
|
|
57
|
+
* console.log(`Cache hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);
|
|
58
|
+
* console.log(`Cost savings: $${stats.costSavings.toFixed(4)}`);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
class PromptCacheManager {
|
|
62
|
+
/**
|
|
63
|
+
* Create a new PromptCacheManager
|
|
64
|
+
*
|
|
65
|
+
* @param apiKey - Anthropic API key
|
|
66
|
+
*/
|
|
67
|
+
constructor(apiKey) {
|
|
68
|
+
this.cacheKeys = new Map();
|
|
69
|
+
this.stats = {
|
|
70
|
+
hits: 0,
|
|
71
|
+
misses: 0,
|
|
72
|
+
writes: 0,
|
|
73
|
+
hitRate: 0,
|
|
74
|
+
costSavings: 0,
|
|
75
|
+
tokensWritten: 0,
|
|
76
|
+
tokensRead: 0,
|
|
77
|
+
tokensRegular: 0,
|
|
78
|
+
};
|
|
79
|
+
/** Cache TTL in milliseconds (5 minutes as per Anthropic specs) */
|
|
80
|
+
this.CACHE_TTL = 5 * 60 * 1000;
|
|
81
|
+
/** Minimum tokens required for caching */
|
|
82
|
+
this.MIN_CACHE_TOKENS = 1024;
|
|
83
|
+
/** Cost per million tokens */
|
|
84
|
+
this.COST_PER_MILLION = 3.0;
|
|
85
|
+
/** Cache write premium (25%) */
|
|
86
|
+
this.CACHE_WRITE_PREMIUM = 1.25;
|
|
87
|
+
/** Cache read discount (90%) */
|
|
88
|
+
this.CACHE_READ_DISCOUNT = 0.1; // 90% discount means 10% cost
|
|
89
|
+
this.anthropic = new sdk_1.default({ apiKey });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create message with cached content
|
|
93
|
+
*
|
|
94
|
+
* IMPORTANT: Anthropic caching requires:
|
|
95
|
+
* 1. Minimum 1024 tokens per cached block
|
|
96
|
+
* 2. Cache control on LAST 3 blocks only
|
|
97
|
+
* 3. 5-minute TTL (automatic)
|
|
98
|
+
*
|
|
99
|
+
* This method automatically:
|
|
100
|
+
* - Checks content size before caching (must be >= 1024 tokens)
|
|
101
|
+
* - Adds cache control to last 3 blocks
|
|
102
|
+
* - Tracks cache hits/misses via content hashing
|
|
103
|
+
* - Updates cost statistics
|
|
104
|
+
*
|
|
105
|
+
* @param params - Message parameters with cacheable content
|
|
106
|
+
* @returns Anthropic message response
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const response = await cacheManager.createWithCache({
|
|
111
|
+
* model: 'claude-sonnet-4',
|
|
112
|
+
* systemPrompts: [
|
|
113
|
+
* { text: SYSTEM_PROMPT, priority: 'high' },
|
|
114
|
+
* ],
|
|
115
|
+
* projectContext: [
|
|
116
|
+
* { text: projectData, priority: 'medium' },
|
|
117
|
+
* ],
|
|
118
|
+
* messages: [{ role: 'user', content: userQuery }],
|
|
119
|
+
* });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
async createWithCache(params) {
|
|
123
|
+
// Build system content with cache breakpoints
|
|
124
|
+
const systemContent = [];
|
|
125
|
+
// Add system prompts (cache if >= MIN_CACHE_TOKENS)
|
|
126
|
+
for (const prompt of params.systemPrompts) {
|
|
127
|
+
const shouldCache = this.shouldCache(prompt.text);
|
|
128
|
+
systemContent.push({
|
|
129
|
+
type: 'text',
|
|
130
|
+
text: prompt.text,
|
|
131
|
+
...(shouldCache && { cache_control: { type: 'ephemeral' } }),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Add project context (cache if provided and >= MIN_CACHE_TOKENS)
|
|
135
|
+
if (params.projectContext) {
|
|
136
|
+
for (const context of params.projectContext) {
|
|
137
|
+
const shouldCache = this.shouldCache(context.text);
|
|
138
|
+
systemContent.push({
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: context.text,
|
|
141
|
+
...(shouldCache && { cache_control: { type: 'ephemeral' } }),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Generate cache key from cacheable content
|
|
146
|
+
const cacheKey = this.generateCacheKey(systemContent);
|
|
147
|
+
const isHit = this.isCacheHit(cacheKey);
|
|
148
|
+
// Track cache statistics (only if we have cacheable content)
|
|
149
|
+
if (cacheKey) {
|
|
150
|
+
if (isHit) {
|
|
151
|
+
this.stats.hits++;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.stats.misses++;
|
|
155
|
+
this.stats.writes++;
|
|
156
|
+
const estimatedTokens = this.estimateTokens(systemContent);
|
|
157
|
+
this.cacheKeys.set(cacheKey, {
|
|
158
|
+
hash: cacheKey,
|
|
159
|
+
timestamp: Date.now(),
|
|
160
|
+
tokens: estimatedTokens,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Make API call
|
|
165
|
+
const response = await this.anthropic.messages.create({
|
|
166
|
+
model: params.model,
|
|
167
|
+
system: systemContent,
|
|
168
|
+
messages: params.messages,
|
|
169
|
+
max_tokens: params.maxTokens || 4096,
|
|
170
|
+
...(params.temperature !== undefined && { temperature: params.temperature }),
|
|
171
|
+
});
|
|
172
|
+
// Update statistics from response
|
|
173
|
+
this.updateStats(response, isHit);
|
|
174
|
+
return response;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Generate cache key from content using SHA-256
|
|
178
|
+
*
|
|
179
|
+
* Creates a content-addressable cache key by hashing all text blocks.
|
|
180
|
+
* Only cached blocks (those with cache_control) are included in the hash.
|
|
181
|
+
*
|
|
182
|
+
* @param content - Text blocks to hash
|
|
183
|
+
* @returns SHA-256 hash of content
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const key = cacheManager.generateCacheKey([
|
|
188
|
+
* { type: 'text', text: 'system prompt', cache_control: { type: 'ephemeral' } },
|
|
189
|
+
* { type: 'text', text: 'project context', cache_control: { type: 'ephemeral' } },
|
|
190
|
+
* ]);
|
|
191
|
+
* // Returns: "a3f2c8b9..." (SHA-256 hash)
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
generateCacheKey(content) {
|
|
195
|
+
// Only hash content that will be cached
|
|
196
|
+
const cachedBlocks = content
|
|
197
|
+
.filter(c => 'cache_control' in c && c.cache_control)
|
|
198
|
+
.map(c => c.text);
|
|
199
|
+
if (cachedBlocks.length === 0) {
|
|
200
|
+
// No cached content, return empty key
|
|
201
|
+
return '';
|
|
202
|
+
}
|
|
203
|
+
// Hash concatenated text with separator
|
|
204
|
+
const text = cachedBlocks.join('|||CACHE_SEPARATOR|||');
|
|
205
|
+
return (0, crypto_1.createHash)('sha256').update(text).digest('hex');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if cache key exists and is fresh (within 5 minutes)
|
|
209
|
+
*
|
|
210
|
+
* @param cacheKey - Cache key to check
|
|
211
|
+
* @returns true if cache hit, false if cache miss
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* const isHit = cacheManager.isCacheHit('a3f2c8b9...');
|
|
216
|
+
* if (isHit) {
|
|
217
|
+
* console.log('Cache hit! Will save 90% on cached tokens');
|
|
218
|
+
* }
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
isCacheHit(cacheKey) {
|
|
222
|
+
if (!cacheKey)
|
|
223
|
+
return false;
|
|
224
|
+
const cached = this.cacheKeys.get(cacheKey);
|
|
225
|
+
if (!cached)
|
|
226
|
+
return false;
|
|
227
|
+
const age = Date.now() - cached.timestamp;
|
|
228
|
+
return age < this.CACHE_TTL;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Update cache statistics from API response
|
|
232
|
+
*
|
|
233
|
+
* Tracks:
|
|
234
|
+
* - Cache creation tokens (write with 25% premium)
|
|
235
|
+
* - Cache read tokens (hit with 90% discount)
|
|
236
|
+
* - Regular input tokens (standard cost)
|
|
237
|
+
* - Cost savings calculation
|
|
238
|
+
*
|
|
239
|
+
* @param response - Anthropic API response
|
|
240
|
+
* @param wasHit - Whether this was a cache hit
|
|
241
|
+
*/
|
|
242
|
+
updateStats(response, wasHit) {
|
|
243
|
+
// Extract usage from response
|
|
244
|
+
const usage = response.usage;
|
|
245
|
+
// Track cache write (cache creation)
|
|
246
|
+
if (usage?.cache_creation_input_tokens) {
|
|
247
|
+
const writeTokens = usage.cache_creation_input_tokens;
|
|
248
|
+
this.stats.tokensWritten += writeTokens;
|
|
249
|
+
// Cache write cost: 25% premium
|
|
250
|
+
const writeCost = writeTokens * this.CACHE_WRITE_PREMIUM * (this.COST_PER_MILLION / 1000000);
|
|
251
|
+
// Regular cost would have been
|
|
252
|
+
const regularCost = writeTokens * (this.COST_PER_MILLION / 1000000);
|
|
253
|
+
// Negative savings because write is more expensive
|
|
254
|
+
this.stats.costSavings -= (writeCost - regularCost);
|
|
255
|
+
}
|
|
256
|
+
// Track cache hit (cache read)
|
|
257
|
+
if (usage?.cache_read_input_tokens) {
|
|
258
|
+
const readTokens = usage.cache_read_input_tokens;
|
|
259
|
+
this.stats.tokensRead += readTokens;
|
|
260
|
+
// Cache read cost: 90% discount (10% of regular cost)
|
|
261
|
+
const readCost = readTokens * this.CACHE_READ_DISCOUNT * (this.COST_PER_MILLION / 1000000);
|
|
262
|
+
// Regular cost would have been
|
|
263
|
+
const regularCost = readTokens * (this.COST_PER_MILLION / 1000000);
|
|
264
|
+
// Positive savings from cache hit
|
|
265
|
+
this.stats.costSavings += (regularCost - readCost);
|
|
266
|
+
}
|
|
267
|
+
// Track regular input tokens
|
|
268
|
+
if (usage?.input_tokens) {
|
|
269
|
+
// Total input tokens includes cache tokens, so subtract cached portions
|
|
270
|
+
const cacheCreation = usage.cache_creation_input_tokens || 0;
|
|
271
|
+
const cacheRead = usage.cache_read_input_tokens || 0;
|
|
272
|
+
const regularTokens = usage.input_tokens - cacheCreation - cacheRead;
|
|
273
|
+
this.stats.tokensRegular += regularTokens;
|
|
274
|
+
}
|
|
275
|
+
// Update hit rate
|
|
276
|
+
const total = this.stats.hits + this.stats.misses;
|
|
277
|
+
this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get cache statistics
|
|
281
|
+
*
|
|
282
|
+
* @returns Current cache statistics including hit rate and cost savings
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* const stats = cacheManager.getStats();
|
|
287
|
+
* console.log(`Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);
|
|
288
|
+
* console.log(`Cost savings: $${stats.costSavings.toFixed(4)}`);
|
|
289
|
+
* console.log(`Total hits: ${stats.hits}, misses: ${stats.misses}`);
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
getStats() {
|
|
293
|
+
return { ...this.stats };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Clear cache keys older than TTL
|
|
297
|
+
*
|
|
298
|
+
* Automatically prunes expired cache entries to prevent memory bloat.
|
|
299
|
+
* Should be called periodically in long-running processes.
|
|
300
|
+
*
|
|
301
|
+
* @returns Number of entries pruned
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* // Run every 5 minutes
|
|
306
|
+
* setInterval(() => {
|
|
307
|
+
* const pruned = cacheManager.pruneCache();
|
|
308
|
+
* console.log(`Pruned ${pruned} expired cache entries`);
|
|
309
|
+
* }, 5 * 60 * 1000);
|
|
310
|
+
* ```
|
|
311
|
+
*/
|
|
312
|
+
pruneCache() {
|
|
313
|
+
const now = Date.now();
|
|
314
|
+
let pruned = 0;
|
|
315
|
+
// Convert to array to avoid iterator issues with older TypeScript targets
|
|
316
|
+
const entries = Array.from(this.cacheKeys.entries());
|
|
317
|
+
for (let i = 0; i < entries.length; i++) {
|
|
318
|
+
const [key, value] = entries[i];
|
|
319
|
+
if (now - value.timestamp > this.CACHE_TTL) {
|
|
320
|
+
this.cacheKeys.delete(key);
|
|
321
|
+
pruned++;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return pruned;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Reset statistics
|
|
328
|
+
*
|
|
329
|
+
* Clears all cache statistics. Useful for testing or when starting
|
|
330
|
+
* a new measurement period.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* // Reset stats at start of each day
|
|
335
|
+
* cacheManager.resetStats();
|
|
336
|
+
* ```
|
|
337
|
+
*/
|
|
338
|
+
resetStats() {
|
|
339
|
+
this.stats = {
|
|
340
|
+
hits: 0,
|
|
341
|
+
misses: 0,
|
|
342
|
+
writes: 0,
|
|
343
|
+
hitRate: 0,
|
|
344
|
+
costSavings: 0,
|
|
345
|
+
tokensWritten: 0,
|
|
346
|
+
tokensRead: 0,
|
|
347
|
+
tokensRegular: 0,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Clear all cache keys
|
|
352
|
+
*
|
|
353
|
+
* Removes all cache entries. Does not affect statistics.
|
|
354
|
+
*
|
|
355
|
+
* @example
|
|
356
|
+
* ```typescript
|
|
357
|
+
* // Clear cache when deploying new version
|
|
358
|
+
* cacheManager.clearCache();
|
|
359
|
+
* ```
|
|
360
|
+
*/
|
|
361
|
+
clearCache() {
|
|
362
|
+
this.cacheKeys.clear();
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Check if content should be cached based on token count
|
|
366
|
+
*
|
|
367
|
+
* Anthropic requires minimum 1024 tokens for caching to be effective.
|
|
368
|
+
*
|
|
369
|
+
* @param text - Text content to check
|
|
370
|
+
* @returns true if content is large enough to cache
|
|
371
|
+
*/
|
|
372
|
+
shouldCache(text) {
|
|
373
|
+
// Rough estimate: 4 characters per token (conservative)
|
|
374
|
+
const estimatedTokens = text.length / 4;
|
|
375
|
+
return estimatedTokens >= this.MIN_CACHE_TOKENS;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Estimate token count for content blocks
|
|
379
|
+
*
|
|
380
|
+
* Uses rough heuristic: 4 characters per token (conservative estimate)
|
|
381
|
+
*
|
|
382
|
+
* @param content - Text blocks to estimate
|
|
383
|
+
* @returns Estimated token count
|
|
384
|
+
*/
|
|
385
|
+
estimateTokens(content) {
|
|
386
|
+
const totalChars = content.reduce((sum, block) => sum + block.text.length, 0);
|
|
387
|
+
return Math.ceil(totalChars / 4);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get cache size (number of entries)
|
|
391
|
+
*
|
|
392
|
+
* @returns Number of cache entries
|
|
393
|
+
*/
|
|
394
|
+
getCacheSize() {
|
|
395
|
+
return this.cacheKeys.size;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Get expected hit rate target
|
|
399
|
+
*
|
|
400
|
+
* According to the MCP improvement plan, we should target
|
|
401
|
+
* 60-80% cache hit rate over 5-minute windows.
|
|
402
|
+
*
|
|
403
|
+
* @returns Target hit rate range
|
|
404
|
+
*/
|
|
405
|
+
static getTargetHitRate() {
|
|
406
|
+
return { min: 0.6, max: 0.8 };
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Calculate break-even point
|
|
410
|
+
*
|
|
411
|
+
* Cache writes cost 25% more than regular calls.
|
|
412
|
+
* Cache hits save 90% on cached tokens.
|
|
413
|
+
*
|
|
414
|
+
* Break-even: 1 write + N hits where total cost equals regular cost
|
|
415
|
+
*
|
|
416
|
+
* @param cacheTokens - Number of tokens in cached content
|
|
417
|
+
* @returns Number of hits needed to break even
|
|
418
|
+
*/
|
|
419
|
+
static calculateBreakEven(cacheTokens) {
|
|
420
|
+
const WRITE_PREMIUM = 1.25;
|
|
421
|
+
const READ_DISCOUNT = 0.1;
|
|
422
|
+
const COST_PER_MILLION = 3.0;
|
|
423
|
+
// Cost of cache write vs regular
|
|
424
|
+
const writeCost = cacheTokens * WRITE_PREMIUM * (COST_PER_MILLION / 1000000);
|
|
425
|
+
const regularCost = cacheTokens * (COST_PER_MILLION / 1000000);
|
|
426
|
+
const writeOverhead = writeCost - regularCost;
|
|
427
|
+
// Savings per cache hit
|
|
428
|
+
const hitSavings = regularCost - (cacheTokens * READ_DISCOUNT * (COST_PER_MILLION / 1000000));
|
|
429
|
+
// Hits needed to break even
|
|
430
|
+
const hitsToBreakEven = Math.ceil(writeOverhead / hitSavings);
|
|
431
|
+
// Calculate savings at different hit counts
|
|
432
|
+
const calculateTotal = (hits) => {
|
|
433
|
+
const totalRegular = regularCost * (1 + hits);
|
|
434
|
+
const totalCached = writeCost + (hits * cacheTokens * READ_DISCOUNT * (COST_PER_MILLION / 1000000));
|
|
435
|
+
return totalRegular - totalCached;
|
|
436
|
+
};
|
|
437
|
+
return {
|
|
438
|
+
hitsToBreakEven,
|
|
439
|
+
savings: {
|
|
440
|
+
atBreakEven: calculateTotal(hitsToBreakEven),
|
|
441
|
+
at5Hits: calculateTotal(5),
|
|
442
|
+
at10Hits: calculateTotal(10),
|
|
443
|
+
},
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
exports.PromptCacheManager = PromptCacheManager;
|
|
448
|
+
//# sourceMappingURL=prompt-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.js","sourceRoot":"","sources":["../../src/utils/prompt-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-qe",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Agentic Quality Engineering Fleet System - AI-driven quality management platform with
|
|
3
|
+
"version": "1.8.0",
|
|
4
|
+
"description": "Agentic Quality Engineering Fleet System - AI-driven quality management platform with 38 QE skills, learning, pattern reuse, ML-based flaky detection, Multi-Model Router (70-81% cost savings), streaming progress updates, 102 MCP tools, and native TypeScript hooks",
|
|
5
5
|
"main": "dist/cli/index.js",
|
|
6
6
|
"types": "dist/cli/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -84,7 +84,10 @@
|
|
|
84
84
|
"verify:features": "tsx scripts/verify-features.ts",
|
|
85
85
|
"verify:all": "npm run verify:counts && npm run verify:agent-skills && npm run verify:features",
|
|
86
86
|
"update:counts": "tsx scripts/update-documentation-counts.ts",
|
|
87
|
-
"migrate:learning": "tsx scripts/migrate-learning-schema.ts"
|
|
87
|
+
"migrate:learning": "tsx scripts/migrate-learning-schema.ts",
|
|
88
|
+
"migrate:agentdb": "tsx scripts/migrate-to-agentdb.ts",
|
|
89
|
+
"migrate:dry-run": "tsx scripts/migrate-to-agentdb.ts --dry-run",
|
|
90
|
+
"migrate:rollback": "tsx scripts/rollback-migration.ts"
|
|
88
91
|
},
|
|
89
92
|
"keywords": [
|
|
90
93
|
"quality-engineering",
|