olympus-ai 3.3.0 → 3.4.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-plugin/marketplace.json +1 -1
- package/README.md +2 -0
- package/dist/__tests__/learning/aggregation.test.d.ts +2 -0
- package/dist/__tests__/learning/aggregation.test.d.ts.map +1 -0
- package/dist/__tests__/learning/aggregation.test.js +282 -0
- package/dist/__tests__/learning/aggregation.test.js.map +1 -0
- package/dist/__tests__/learning/anomaly.test.d.ts +2 -0
- package/dist/__tests__/learning/anomaly.test.d.ts.map +1 -0
- package/dist/__tests__/learning/anomaly.test.js +107 -0
- package/dist/__tests__/learning/anomaly.test.js.map +1 -0
- package/dist/__tests__/learning/baselines.test.d.ts +2 -0
- package/dist/__tests__/learning/baselines.test.d.ts.map +1 -0
- package/dist/__tests__/learning/baselines.test.js +155 -0
- package/dist/__tests__/learning/baselines.test.js.map +1 -0
- package/dist/__tests__/learning/efficiency.test.d.ts +2 -0
- package/dist/__tests__/learning/efficiency.test.d.ts.map +1 -0
- package/dist/__tests__/learning/efficiency.test.js +94 -0
- package/dist/__tests__/learning/efficiency.test.js.map +1 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.d.ts +6 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.d.ts.map +1 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.js +288 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.js.map +1 -0
- package/dist/__tests__/learning/learning-capture-integration.test.d.ts +6 -0
- package/dist/__tests__/learning/learning-capture-integration.test.d.ts.map +1 -0
- package/dist/__tests__/learning/learning-capture-integration.test.js +151 -0
- package/dist/__tests__/learning/learning-capture-integration.test.js.map +1 -0
- package/dist/__tests__/learning/token-metrics.test.d.ts +2 -0
- package/dist/__tests__/learning/token-metrics.test.d.ts.map +1 -0
- package/dist/__tests__/learning/token-metrics.test.js +308 -0
- package/dist/__tests__/learning/token-metrics.test.js.map +1 -0
- package/dist/__tests__/token-tracking-integration.test.d.ts +8 -0
- package/dist/__tests__/token-tracking-integration.test.d.ts.map +1 -0
- package/dist/__tests__/token-tracking-integration.test.js +669 -0
- package/dist/__tests__/token-tracking-integration.test.js.map +1 -0
- package/dist/cli/commands/metrics.d.ts +10 -2
- package/dist/cli/commands/metrics.d.ts.map +1 -1
- package/dist/cli/commands/metrics.js +25 -239
- package/dist/cli/commands/metrics.js.map +1 -1
- package/dist/cli/index.js +196 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +14 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/hooks/registrations/budget-warning.d.ts +8 -0
- package/dist/hooks/registrations/budget-warning.d.ts.map +1 -0
- package/dist/hooks/registrations/budget-warning.js +63 -0
- package/dist/hooks/registrations/budget-warning.js.map +1 -0
- package/dist/hooks/registrations/index.d.ts +3 -2
- package/dist/hooks/registrations/index.d.ts.map +1 -1
- package/dist/hooks/registrations/index.js +5 -3
- package/dist/hooks/registrations/index.js.map +1 -1
- package/dist/hooks/registrations/learning-capture.d.ts +19 -0
- package/dist/hooks/registrations/learning-capture.d.ts.map +1 -0
- package/dist/hooks/registrations/learning-capture.js +220 -0
- package/dist/hooks/registrations/learning-capture.js.map +1 -0
- package/dist/hooks/registrations/session-start.d.ts.map +1 -1
- package/dist/hooks/registrations/session-start.js +13 -0
- package/dist/hooks/registrations/session-start.js.map +1 -1
- package/dist/hooks/registrations/token-metrics.d.ts +10 -2
- package/dist/hooks/registrations/token-metrics.d.ts.map +1 -1
- package/dist/hooks/registrations/token-metrics.js +18 -4
- package/dist/hooks/registrations/token-metrics.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +56 -0
- package/dist/installer/index.js.map +1 -1
- package/dist/learning/aggregation.d.ts +39 -0
- package/dist/learning/aggregation.d.ts.map +1 -0
- package/dist/learning/aggregation.js +101 -0
- package/dist/learning/aggregation.js.map +1 -0
- package/dist/learning/anomaly.d.ts +30 -0
- package/dist/learning/anomaly.d.ts.map +1 -0
- package/dist/learning/anomaly.js +102 -0
- package/dist/learning/anomaly.js.map +1 -0
- package/dist/learning/baselines.d.ts +44 -0
- package/dist/learning/baselines.d.ts.map +1 -0
- package/dist/learning/baselines.js +126 -0
- package/dist/learning/baselines.js.map +1 -0
- package/dist/learning/efficiency.d.ts +23 -0
- package/dist/learning/efficiency.d.ts.map +1 -0
- package/dist/learning/efficiency.js +67 -0
- package/dist/learning/efficiency.js.map +1 -0
- package/dist/learning/hooks/learned-context.d.ts.map +1 -1
- package/dist/learning/hooks/learned-context.js +46 -0
- package/dist/learning/hooks/learned-context.js.map +1 -1
- package/dist/learning/pricing.d.ts +30 -0
- package/dist/learning/pricing.d.ts.map +1 -0
- package/dist/learning/pricing.js +98 -0
- package/dist/learning/pricing.js.map +1 -0
- package/dist/learning/session-state.d.ts +12 -2
- package/dist/learning/session-state.d.ts.map +1 -1
- package/dist/learning/session-state.js +72 -3
- package/dist/learning/session-state.js.map +1 -1
- package/dist/learning/storage.d.ts +21 -1
- package/dist/learning/storage.d.ts.map +1 -1
- package/dist/learning/storage.js +84 -0
- package/dist/learning/storage.js.map +1 -1
- package/dist/learning/token-estimator.d.ts +41 -0
- package/dist/learning/token-estimator.d.ts.map +1 -0
- package/dist/learning/token-estimator.js +111 -0
- package/dist/learning/token-estimator.js.map +1 -0
- package/dist/learning/types.d.ts +32 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/learning/utils.d.ts +42 -0
- package/dist/learning/utils.d.ts.map +1 -0
- package/dist/learning/utils.js +76 -0
- package/dist/learning/utils.js.map +1 -0
- package/dist/shared/types.d.ts +29 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/dist/hooks/olympus-hooks.cjs +86 -84
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token efficiency calculation functions
|
|
3
|
+
* Pure functions with no side effects for calculating agent efficiency scores
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Calculate efficiency score for an agent
|
|
7
|
+
*
|
|
8
|
+
* @param successRate - Success rate between 0 and 1
|
|
9
|
+
* @param avgTokens - Average tokens per invocation
|
|
10
|
+
* @param baselineTokens - Global baseline for comparison
|
|
11
|
+
* @returns Efficiency score (higher is better, capped at 2.0)
|
|
12
|
+
*/
|
|
13
|
+
export function calculateEfficiencyScore(successRate, avgTokens, baselineTokens) {
|
|
14
|
+
// Handle edge cases
|
|
15
|
+
if (successRate < 0 || successRate > 1) {
|
|
16
|
+
throw new Error(`Invalid success rate: ${successRate}. Must be between 0 and 1.`);
|
|
17
|
+
}
|
|
18
|
+
if (avgTokens < 0 || baselineTokens < 0) {
|
|
19
|
+
throw new Error('Token counts cannot be negative');
|
|
20
|
+
}
|
|
21
|
+
// If no tokens used, return 0 (can't calculate efficiency)
|
|
22
|
+
if (avgTokens === 0) {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
// Normalize tokens: baseline / actual (lower tokens = higher factor)
|
|
26
|
+
const tokenFactor = baselineTokens / Math.max(avgTokens, 1);
|
|
27
|
+
// Efficiency = success rate * token efficiency
|
|
28
|
+
// Cap token factor at 2.0 to prevent unrealistic scores
|
|
29
|
+
const efficiency = successRate * Math.min(tokenFactor, 2);
|
|
30
|
+
return efficiency;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Calculate trend based on recent vs historical averages
|
|
34
|
+
*
|
|
35
|
+
* @param recentAvg - Average tokens for recent sessions (last 10)
|
|
36
|
+
* @param historicalAvg - Average tokens across all history
|
|
37
|
+
* @param sampleCount - Total number of samples
|
|
38
|
+
* @returns Trend indicator
|
|
39
|
+
*/
|
|
40
|
+
export function calculateTrend(recentAvg, historicalAvg, sampleCount) {
|
|
41
|
+
// Need at least 5 samples for meaningful trend
|
|
42
|
+
if (sampleCount < 5) {
|
|
43
|
+
return 'insufficient_data';
|
|
44
|
+
}
|
|
45
|
+
// Handle edge cases
|
|
46
|
+
if (recentAvg < 0 || historicalAvg < 0) {
|
|
47
|
+
throw new Error('Average token counts cannot be negative');
|
|
48
|
+
}
|
|
49
|
+
if (historicalAvg === 0) {
|
|
50
|
+
return 'insufficient_data';
|
|
51
|
+
}
|
|
52
|
+
// Calculate percentage difference
|
|
53
|
+
const percentChange = (recentAvg - historicalAvg) / historicalAvg;
|
|
54
|
+
// Thresholds for trend detection (±10%)
|
|
55
|
+
const IMPROVEMENT_THRESHOLD = -0.10; // 10% reduction is improvement
|
|
56
|
+
const DECLINE_THRESHOLD = 0.10; // 10% increase is decline
|
|
57
|
+
if (percentChange <= IMPROVEMENT_THRESHOLD) {
|
|
58
|
+
return 'improving';
|
|
59
|
+
}
|
|
60
|
+
else if (percentChange >= DECLINE_THRESHOLD) {
|
|
61
|
+
return 'declining';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return 'stable';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=efficiency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency.js","sourceRoot":"","sources":["../../src/learning/efficiency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,SAAiB,EACjB,cAAsB;IAEtB,oBAAoB;IACpB,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,WAAW,4BAA4B,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,2DAA2D;IAC3D,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,qEAAqE;IACrE,MAAM,WAAW,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAE5D,+CAA+C;IAC/C,wDAAwD;IACxD,MAAM,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE1D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,aAAqB,EACrB,WAAmB;IAEnB,+CAA+C;IAC/C,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,oBAAoB;IACpB,IAAI,SAAS,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,kCAAkC;IAClC,MAAM,aAAa,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,aAAa,CAAC;IAElE,wCAAwC;IACxC,MAAM,qBAAqB,GAAG,CAAC,IAAI,CAAC,CAAC,+BAA+B;IACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAM,0BAA0B;IAE/D,IAAI,aAAa,IAAI,qBAAqB,EAAE,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,IAAI,aAAa,IAAI,iBAAiB,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learned-context.d.ts","sourceRoot":"","sources":["../../../src/learning/hooks/learned-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsD,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"learned-context.d.ts","sourceRoot":"","sources":["../../../src/learning/hooks/learned-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsD,cAAc,EAAE,MAAM,aAAa,CAAC;AAOtG,6CAA6C;AAC7C,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmElE;AA6GD,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,CAcvE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
2
|
import { readJsonFile, getLearningDir, getProjectLearningDir } from '../storage.js';
|
|
3
|
+
import { hasMinimumSamples } from '../aggregation.js';
|
|
4
|
+
import { getSessionBaseline } from '../baselines.js';
|
|
3
5
|
const MAX_INJECTION_TOKENS = 500; // Approximate limit
|
|
4
6
|
/** Generate learned context for injection */
|
|
5
7
|
export function generateLearnedContext(projectPath) {
|
|
@@ -25,6 +27,11 @@ export function generateLearnedContext(projectPath) {
|
|
|
25
27
|
if (weakAgents.length > 0) {
|
|
26
28
|
sections.push(formatAgentNotes(weakAgents));
|
|
27
29
|
}
|
|
30
|
+
// Token efficiency section (if we have agent data with token metrics)
|
|
31
|
+
const tokenGuidance = formatTokenEfficiency(agentPerformance);
|
|
32
|
+
if (tokenGuidance) {
|
|
33
|
+
sections.push(tokenGuidance);
|
|
34
|
+
}
|
|
28
35
|
// Only inject if we have meaningful content
|
|
29
36
|
if (sections.length === 0) {
|
|
30
37
|
return '';
|
|
@@ -87,6 +94,45 @@ function formatAgentNotes(agents) {
|
|
|
87
94
|
}
|
|
88
95
|
return lines.join('\n');
|
|
89
96
|
}
|
|
97
|
+
function formatTokenEfficiency(agentPerformance) {
|
|
98
|
+
// Filter agents with sufficient token data
|
|
99
|
+
const agentsWithTokens = Object.values(agentPerformance)
|
|
100
|
+
.filter(a => a.token_efficiency && hasMinimumSamples(a))
|
|
101
|
+
.sort((a, b) => {
|
|
102
|
+
// Sort by efficiency score (higher is better)
|
|
103
|
+
const scoreA = a.token_efficiency?.efficiency_score ?? 0;
|
|
104
|
+
const scoreB = b.token_efficiency?.efficiency_score ?? 0;
|
|
105
|
+
return scoreB - scoreA;
|
|
106
|
+
});
|
|
107
|
+
if (agentsWithTokens.length === 0) {
|
|
108
|
+
return ''; // No token data available
|
|
109
|
+
}
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push('<olympus-efficiency>');
|
|
112
|
+
lines.push('AGENT EFFICIENCY (success%/avg tokens):');
|
|
113
|
+
// Show top 3 most efficient agents
|
|
114
|
+
for (const agent of agentsWithTokens.slice(0, 3)) {
|
|
115
|
+
const successRate = Math.round(agent.success_rate * 100);
|
|
116
|
+
const avgTokens = agent.token_efficiency.avg_tokens_per_success;
|
|
117
|
+
const avgTokensK = avgTokens >= 1000 ? `${(avgTokens / 1000).toFixed(1)}k` : `${Math.round(avgTokens)}`;
|
|
118
|
+
// Determine if this is the preferred agent
|
|
119
|
+
const isPreferred = agent.success_rate >= 0.9 && agent.token_efficiency.efficiency_score > 0.8;
|
|
120
|
+
const label = isPreferred ? ' [PREFERRED]' : '';
|
|
121
|
+
lines.push(`- ${agent.agent_name}: ${successRate}%/${avgTokensK}${label}`);
|
|
122
|
+
}
|
|
123
|
+
// Add session budget info
|
|
124
|
+
const baseline = getSessionBaseline();
|
|
125
|
+
const baselineK = baseline >= 1000 ? `${(baseline / 1000).toFixed(0)}k` : baseline.toString();
|
|
126
|
+
const warnThreshold = Math.round(baseline * 1.5);
|
|
127
|
+
const warnK = warnThreshold >= 1000 ? `${(warnThreshold / 1000).toFixed(0)}k` : warnThreshold.toString();
|
|
128
|
+
lines.push('');
|
|
129
|
+
lines.push(`SESSION BUDGET: ~${baselineK} baseline | warn at ${warnK}`);
|
|
130
|
+
lines.push('PATTERNS: Parallel reads save 40%');
|
|
131
|
+
lines.push('');
|
|
132
|
+
lines.push('Quality remains priority. Use efficiency as tiebreaker.');
|
|
133
|
+
lines.push('</olympus-efficiency>');
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
90
136
|
/** Format discoveries for injection */
|
|
91
137
|
export function formatDiscoveries(discoveries) {
|
|
92
138
|
if (discoveries.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learned-context.js","sourceRoot":"","sources":["../../../src/learning/hooks/learned-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"learned-context.js","sourceRoot":"","sources":["../../../src/learning/hooks/learned-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token pricing configuration for cost estimation
|
|
3
|
+
* No external dependencies - using Node.js built-ins only
|
|
4
|
+
*/
|
|
5
|
+
export interface ModelPricing {
|
|
6
|
+
model_pattern: string;
|
|
7
|
+
input_per_million: number;
|
|
8
|
+
output_per_million: number;
|
|
9
|
+
effective_date: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Default pricing for Claude models (as of 2025-01-01)
|
|
13
|
+
* Prices are per million tokens in USD
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_PRICING: ModelPricing[];
|
|
16
|
+
/**
|
|
17
|
+
* Calculate cost based on token usage and pricing
|
|
18
|
+
*/
|
|
19
|
+
export declare function calculateCost(inputTokens: number, outputTokens: number, modelId: string, pricing?: ModelPricing[]): {
|
|
20
|
+
inputCost: number;
|
|
21
|
+
outputCost: number;
|
|
22
|
+
totalCost: number;
|
|
23
|
+
pricingVersion: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Load custom pricing configuration from file
|
|
27
|
+
* Returns null if file doesn't exist or has errors
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadPricingConfig(configPath?: string): ModelPricing[] | null;
|
|
30
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/learning/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,EAmBzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAY,EAAoB,GACxC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAkCtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,IAAI,CAyC5E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token pricing configuration for cost estimation
|
|
3
|
+
* No external dependencies - using Node.js built-ins only
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default pricing for Claude models (as of 2025-01-01)
|
|
7
|
+
* Prices are per million tokens in USD
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_PRICING = [
|
|
10
|
+
{
|
|
11
|
+
model_pattern: 'claude-opus',
|
|
12
|
+
input_per_million: 15.0,
|
|
13
|
+
output_per_million: 75.0,
|
|
14
|
+
effective_date: '2025-01-01'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
model_pattern: 'claude-sonnet',
|
|
18
|
+
input_per_million: 3.0,
|
|
19
|
+
output_per_million: 15.0,
|
|
20
|
+
effective_date: '2025-01-01'
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
model_pattern: 'claude-haiku',
|
|
24
|
+
input_per_million: 0.25,
|
|
25
|
+
output_per_million: 1.25,
|
|
26
|
+
effective_date: '2025-01-01'
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Calculate cost based on token usage and pricing
|
|
31
|
+
*/
|
|
32
|
+
export function calculateCost(inputTokens, outputTokens, modelId, pricing = DEFAULT_PRICING) {
|
|
33
|
+
// Find matching pricing entry
|
|
34
|
+
const matchedPricing = pricing.find(p => new RegExp(p.model_pattern, 'i').test(modelId));
|
|
35
|
+
if (!matchedPricing) {
|
|
36
|
+
// Default to Sonnet pricing if model not found
|
|
37
|
+
const defaultPricing = pricing.find(p => p.model_pattern === 'claude-sonnet') || {
|
|
38
|
+
input_per_million: 3.0,
|
|
39
|
+
output_per_million: 15.0,
|
|
40
|
+
effective_date: '2025-01-01'
|
|
41
|
+
};
|
|
42
|
+
const inputCost = (inputTokens / 1_000_000) * defaultPricing.input_per_million;
|
|
43
|
+
const outputCost = (outputTokens / 1_000_000) * defaultPricing.output_per_million;
|
|
44
|
+
return {
|
|
45
|
+
inputCost,
|
|
46
|
+
outputCost,
|
|
47
|
+
totalCost: inputCost + outputCost,
|
|
48
|
+
pricingVersion: defaultPricing.effective_date
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const inputCost = (inputTokens / 1_000_000) * matchedPricing.input_per_million;
|
|
52
|
+
const outputCost = (outputTokens / 1_000_000) * matchedPricing.output_per_million;
|
|
53
|
+
return {
|
|
54
|
+
inputCost,
|
|
55
|
+
outputCost,
|
|
56
|
+
totalCost: inputCost + outputCost,
|
|
57
|
+
pricingVersion: matchedPricing.effective_date
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load custom pricing configuration from file
|
|
62
|
+
* Returns null if file doesn't exist or has errors
|
|
63
|
+
*/
|
|
64
|
+
export function loadPricingConfig(configPath) {
|
|
65
|
+
if (!configPath) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const { readFileSync, existsSync } = require('fs');
|
|
70
|
+
if (!existsSync(configPath)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
74
|
+
const parsed = JSON.parse(content);
|
|
75
|
+
// Validate structure
|
|
76
|
+
if (!Array.isArray(parsed)) {
|
|
77
|
+
console.error('[Olympus Pricing] Invalid pricing config: expected array');
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Validate each entry
|
|
81
|
+
const validPricing = parsed.filter((entry) => {
|
|
82
|
+
if (typeof entry !== 'object' || entry === null) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const p = entry;
|
|
86
|
+
return (typeof p.model_pattern === 'string' &&
|
|
87
|
+
typeof p.input_per_million === 'number' &&
|
|
88
|
+
typeof p.output_per_million === 'number' &&
|
|
89
|
+
typeof p.effective_date === 'string');
|
|
90
|
+
});
|
|
91
|
+
return validPricing.length > 0 ? validPricing : null;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error('[Olympus Pricing] Failed to load pricing config:', error);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/learning/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { SessionState, FeedbackCategory } from './types.js';
|
|
1
|
+
import { SessionState, FeedbackCategory, TokenBudget } from './types.js';
|
|
2
2
|
/** Get session state file path */
|
|
3
3
|
export declare function getSessionStatePath(directory: string): string;
|
|
4
4
|
/** Create fresh session state */
|
|
5
|
-
export declare function createSessionState(sessionId?: string): SessionState;
|
|
5
|
+
export declare function createSessionState(sessionId?: string, projectPath?: string): SessionState;
|
|
6
6
|
/** Load or create session state */
|
|
7
7
|
export declare function loadSessionState(directory: string, sessionId?: string): SessionState;
|
|
8
8
|
/** Save session state */
|
|
@@ -15,4 +15,14 @@ export declare function markCompletionClaim(state: SessionState, taskDescription
|
|
|
15
15
|
export declare function clearCompletionClaim(state: SessionState): SessionState;
|
|
16
16
|
/** Check if there's a pending completion claim */
|
|
17
17
|
export declare function hasPendingCompletion(state: SessionState): boolean;
|
|
18
|
+
/** Initialize token budget for session */
|
|
19
|
+
export declare function initializeTokenBudget(state: SessionState, projectPath?: string): SessionState;
|
|
20
|
+
/** Update token budget with new usage */
|
|
21
|
+
export declare function updateTokenBudget(state: SessionState, tokensUsed: number): SessionState;
|
|
22
|
+
/** Mark that warning has been issued */
|
|
23
|
+
export declare function markWarningIssued(state: SessionState): SessionState;
|
|
24
|
+
/** Check if budget warning should be issued */
|
|
25
|
+
export declare function shouldIssueWarning(state: SessionState): boolean;
|
|
26
|
+
/** Get current token budget info */
|
|
27
|
+
export declare function getTokenBudgetInfo(state: SessionState): TokenBudget | null;
|
|
18
28
|
//# sourceMappingURL=session-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQzE,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAkBzF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CA4BpF;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAI7E;AAED,kCAAkC;AAClC,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,YAAY,CAWd;AAED,8BAA8B;AAC9B,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,CAQd;AAED,4DAA4D;AAC5D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAItE;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAOjE;AAED,0CAA0C;AAC1C,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,YAAY,CAad;AAED,yCAAyC;AACzC,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,YAAY,CAed;AAED,wCAAwC;AACxC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAMnE;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAM/D;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAE1E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
2
|
import { readJsonFile, writeJsonFile } from './storage.js';
|
|
3
3
|
import { randomUUID } from 'crypto';
|
|
4
|
+
import { getSessionBaseline } from './baselines.js';
|
|
4
5
|
const MAX_RECENT_PROMPTS = 10;
|
|
5
6
|
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
6
7
|
/** Get session state file path */
|
|
@@ -8,7 +9,8 @@ export function getSessionStatePath(directory) {
|
|
|
8
9
|
return join(directory, '.olympus', 'session-state.json');
|
|
9
10
|
}
|
|
10
11
|
/** Create fresh session state */
|
|
11
|
-
export function createSessionState(sessionId) {
|
|
12
|
+
export function createSessionState(sessionId, projectPath) {
|
|
13
|
+
const baseline = getSessionBaseline(projectPath);
|
|
12
14
|
return {
|
|
13
15
|
session_id: sessionId || randomUUID(),
|
|
14
16
|
started_at: new Date().toISOString(),
|
|
@@ -16,6 +18,13 @@ export function createSessionState(sessionId) {
|
|
|
16
18
|
recent_prompts: [],
|
|
17
19
|
pending_completion: null,
|
|
18
20
|
todo_snapshot: null,
|
|
21
|
+
token_budget: {
|
|
22
|
+
session_baseline: baseline,
|
|
23
|
+
current_usage: 0,
|
|
24
|
+
warning_threshold: 1.5,
|
|
25
|
+
warning_issued: false,
|
|
26
|
+
started_at: new Date().toISOString()
|
|
27
|
+
}
|
|
19
28
|
};
|
|
20
29
|
}
|
|
21
30
|
/** Load or create session state */
|
|
@@ -23,13 +32,24 @@ export function loadSessionState(directory, sessionId) {
|
|
|
23
32
|
const path = getSessionStatePath(directory);
|
|
24
33
|
const state = readJsonFile(path, null);
|
|
25
34
|
if (!state) {
|
|
26
|
-
return createSessionState(sessionId);
|
|
35
|
+
return createSessionState(sessionId, directory);
|
|
27
36
|
}
|
|
28
37
|
// Check for session timeout
|
|
29
38
|
const lastUpdate = new Date(state.last_updated).getTime();
|
|
30
39
|
const now = Date.now();
|
|
31
40
|
if (now - lastUpdate > SESSION_TIMEOUT_MS) {
|
|
32
|
-
return createSessionState(sessionId);
|
|
41
|
+
return createSessionState(sessionId, directory);
|
|
42
|
+
}
|
|
43
|
+
// Initialize token_budget if missing (backward compatibility)
|
|
44
|
+
if (!state.token_budget) {
|
|
45
|
+
const baseline = getSessionBaseline(directory);
|
|
46
|
+
state.token_budget = {
|
|
47
|
+
session_baseline: baseline,
|
|
48
|
+
current_usage: 0,
|
|
49
|
+
warning_threshold: 1.5,
|
|
50
|
+
warning_issued: false,
|
|
51
|
+
started_at: state.started_at
|
|
52
|
+
};
|
|
33
53
|
}
|
|
34
54
|
return state;
|
|
35
55
|
}
|
|
@@ -75,4 +95,53 @@ export function hasPendingCompletion(state) {
|
|
|
75
95
|
const now = Date.now();
|
|
76
96
|
return now - claimedAt < 5 * 60 * 1000;
|
|
77
97
|
}
|
|
98
|
+
/** Initialize token budget for session */
|
|
99
|
+
export function initializeTokenBudget(state, projectPath) {
|
|
100
|
+
const baseline = getSessionBaseline(projectPath);
|
|
101
|
+
state.token_budget = {
|
|
102
|
+
session_baseline: baseline,
|
|
103
|
+
current_usage: 0,
|
|
104
|
+
warning_threshold: 1.5,
|
|
105
|
+
warning_issued: false,
|
|
106
|
+
started_at: new Date().toISOString()
|
|
107
|
+
};
|
|
108
|
+
state.last_updated = new Date().toISOString();
|
|
109
|
+
return state;
|
|
110
|
+
}
|
|
111
|
+
/** Update token budget with new usage */
|
|
112
|
+
export function updateTokenBudget(state, tokensUsed) {
|
|
113
|
+
if (!state.token_budget) {
|
|
114
|
+
state.token_budget = {
|
|
115
|
+
session_baseline: getSessionBaseline(),
|
|
116
|
+
current_usage: 0,
|
|
117
|
+
warning_threshold: 1.5,
|
|
118
|
+
warning_issued: false,
|
|
119
|
+
started_at: new Date().toISOString()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
state.token_budget.current_usage += tokensUsed;
|
|
123
|
+
state.last_updated = new Date().toISOString();
|
|
124
|
+
return state;
|
|
125
|
+
}
|
|
126
|
+
/** Mark that warning has been issued */
|
|
127
|
+
export function markWarningIssued(state) {
|
|
128
|
+
if (state.token_budget) {
|
|
129
|
+
state.token_budget.warning_issued = true;
|
|
130
|
+
state.last_updated = new Date().toISOString();
|
|
131
|
+
}
|
|
132
|
+
return state;
|
|
133
|
+
}
|
|
134
|
+
/** Check if budget warning should be issued */
|
|
135
|
+
export function shouldIssueWarning(state) {
|
|
136
|
+
if (!state.token_budget)
|
|
137
|
+
return false;
|
|
138
|
+
if (state.token_budget.warning_issued)
|
|
139
|
+
return false;
|
|
140
|
+
const threshold = state.token_budget.session_baseline * state.token_budget.warning_threshold;
|
|
141
|
+
return state.token_budget.current_usage >= threshold;
|
|
142
|
+
}
|
|
143
|
+
/** Get current token budget info */
|
|
144
|
+
export function getTokenBudgetInfo(state) {
|
|
145
|
+
return state.token_budget ?? null;
|
|
146
|
+
}
|
|
78
147
|
//# sourceMappingURL=session-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FeedbackEntry } from './types.js';
|
|
1
|
+
import type { FeedbackEntry, AgentPerformance } from './types.js';
|
|
2
2
|
/** Get learning storage directory (cross-platform) */
|
|
3
3
|
export declare function getLearningDir(): string;
|
|
4
4
|
/** Get project-specific learning directory */
|
|
@@ -13,6 +13,26 @@ declare function rotateIfNeeded(filePath: string, maxLines?: number): void;
|
|
|
13
13
|
export declare function appendFeedback(entry: FeedbackEntry): void;
|
|
14
14
|
/** Read feedback log */
|
|
15
15
|
export declare function readFeedbackLog(): FeedbackEntry[];
|
|
16
|
+
/** Save feedback entry (alias for appendFeedback) */
|
|
17
|
+
export declare function saveFeedback(entry: FeedbackEntry): void;
|
|
18
|
+
/** Load feedback entries (alias for readFeedbackLog) */
|
|
19
|
+
export declare function loadFeedback(): FeedbackEntry[];
|
|
20
|
+
/**
|
|
21
|
+
* Update agent performance metrics with token efficiency
|
|
22
|
+
* Recalculates token_efficiency based on feedback entries with token usage
|
|
23
|
+
*/
|
|
24
|
+
export declare function updateAgentPerformance(agentName: string, feedbackEntries: FeedbackEntry[]): AgentPerformance | null;
|
|
25
|
+
/**
|
|
26
|
+
* Get session baseline for token budgeting
|
|
27
|
+
* Default to 10000 tokens if not configured
|
|
28
|
+
*/
|
|
29
|
+
export declare function getSessionBaseline(config?: {
|
|
30
|
+
learning?: {
|
|
31
|
+
tokenMetrics?: {
|
|
32
|
+
sessionBaseline?: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}): number;
|
|
16
36
|
/** Read JSON file with type safety and error handling */
|
|
17
37
|
export declare function readJsonFile<T>(path: string, defaultValue: T): T;
|
|
18
38
|
/** Write JSON file with error handling */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAMnF,sDAAsD;AACtD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,8CAA8C;AAC9C,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7D;AAED,qDAAqD;AACrD,iBAAS,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAwB,GAAG,IAAI,CAiBlF;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQzD;AAED,wBAAwB;AACxB,wBAAgB,eAAe,IAAI,aAAa,EAAE,CASjD;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEvD;AAED,wDAAwD;AACxD,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAE9C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,aAAa,EAAE,GAC/B,gBAAgB,GAAG,IAAI,CA4EzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAElH;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAQhE;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAWhE;AAED,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/learning/storage.js
CHANGED
|
@@ -2,6 +2,7 @@ import { homedir } from 'os';
|
|
|
2
2
|
import { join, resolve, dirname } from 'path';
|
|
3
3
|
import { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync, renameSync } from 'fs';
|
|
4
4
|
import { createHash } from 'crypto';
|
|
5
|
+
import { getTokenUsage, safeTokenTotal } from './utils.js';
|
|
5
6
|
/** Maximum lines before rotating JSONL files */
|
|
6
7
|
const MAX_JSONL_LINES = 10000;
|
|
7
8
|
/** Get learning storage directory (cross-platform) */
|
|
@@ -68,6 +69,89 @@ export function readFeedbackLog() {
|
|
|
68
69
|
.filter(line => line.trim())
|
|
69
70
|
.map(line => JSON.parse(line));
|
|
70
71
|
}
|
|
72
|
+
/** Save feedback entry (alias for appendFeedback) */
|
|
73
|
+
export function saveFeedback(entry) {
|
|
74
|
+
appendFeedback(entry);
|
|
75
|
+
}
|
|
76
|
+
/** Load feedback entries (alias for readFeedbackLog) */
|
|
77
|
+
export function loadFeedback() {
|
|
78
|
+
return readFeedbackLog();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Update agent performance metrics with token efficiency
|
|
82
|
+
* Recalculates token_efficiency based on feedback entries with token usage
|
|
83
|
+
*/
|
|
84
|
+
export function updateAgentPerformance(agentName, feedbackEntries) {
|
|
85
|
+
const agentEntries = feedbackEntries.filter(e => e.agent_used === agentName);
|
|
86
|
+
if (agentEntries.length === 0) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
// Basic performance metrics
|
|
90
|
+
const totalInvocations = agentEntries.length;
|
|
91
|
+
const successCount = agentEntries.filter(e => e.event_type === 'success').length;
|
|
92
|
+
const revisionCount = agentEntries.filter(e => e.event_type === 'revision').length;
|
|
93
|
+
const cancellationCount = agentEntries.filter(e => e.event_type === 'cancellation').length;
|
|
94
|
+
const successRate = totalInvocations > 0 ? successCount / totalInvocations : 0;
|
|
95
|
+
// Token efficiency metrics
|
|
96
|
+
let tokenEfficiency;
|
|
97
|
+
const entriesWithTokens = agentEntries.filter(e => getTokenUsage(e) !== null);
|
|
98
|
+
if (entriesWithTokens.length > 0) {
|
|
99
|
+
const successEntries = entriesWithTokens.filter(e => e.event_type === 'success');
|
|
100
|
+
const failureEntries = entriesWithTokens.filter(e => e.event_type === 'revision' || e.event_type === 'cancellation');
|
|
101
|
+
const totalTokens = entriesWithTokens.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
102
|
+
const successTokens = successEntries.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
103
|
+
const failureTokens = failureEntries.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
104
|
+
const avgTokensPerSuccess = successEntries.length > 0 ? successTokens / successEntries.length : 0;
|
|
105
|
+
const avgTokensPerFailure = failureEntries.length > 0 ? failureTokens / failureEntries.length : 0;
|
|
106
|
+
tokenEfficiency = {
|
|
107
|
+
avg_tokens_per_success: avgTokensPerSuccess,
|
|
108
|
+
avg_tokens_per_failure: avgTokensPerFailure,
|
|
109
|
+
total_tokens: totalTokens,
|
|
110
|
+
invocation_count: entriesWithTokens.length,
|
|
111
|
+
efficiency_score: avgTokensPerSuccess,
|
|
112
|
+
trend: 'insufficient_data'
|
|
113
|
+
};
|
|
114
|
+
// Calculate trend (simple heuristic: compare first half vs second half)
|
|
115
|
+
if (entriesWithTokens.length >= 10) {
|
|
116
|
+
const midpoint = Math.floor(entriesWithTokens.length / 2);
|
|
117
|
+
const firstHalf = entriesWithTokens.slice(0, midpoint);
|
|
118
|
+
const secondHalf = entriesWithTokens.slice(midpoint);
|
|
119
|
+
const firstAvg = firstHalf.reduce((sum, e) => sum + safeTokenTotal(e), 0) / firstHalf.length;
|
|
120
|
+
const secondAvg = secondHalf.reduce((sum, e) => sum + safeTokenTotal(e), 0) / secondHalf.length;
|
|
121
|
+
const difference = secondAvg - firstAvg;
|
|
122
|
+
const threshold = firstAvg * 0.1; // 10% threshold
|
|
123
|
+
if (Math.abs(difference) < threshold) {
|
|
124
|
+
tokenEfficiency.trend = 'stable';
|
|
125
|
+
}
|
|
126
|
+
else if (difference < 0) {
|
|
127
|
+
tokenEfficiency.trend = 'improving'; // Fewer tokens is better
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
tokenEfficiency.trend = 'declining';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
agent_name: agentName,
|
|
136
|
+
total_invocations: totalInvocations,
|
|
137
|
+
success_count: successCount,
|
|
138
|
+
revision_count: revisionCount,
|
|
139
|
+
cancellation_count: cancellationCount,
|
|
140
|
+
success_rate: successRate,
|
|
141
|
+
failure_patterns: [],
|
|
142
|
+
strong_areas: [],
|
|
143
|
+
weak_areas: [],
|
|
144
|
+
last_updated: new Date().toISOString(),
|
|
145
|
+
token_efficiency: tokenEfficiency
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get session baseline for token budgeting
|
|
150
|
+
* Default to 10000 tokens if not configured
|
|
151
|
+
*/
|
|
152
|
+
export function getSessionBaseline(config) {
|
|
153
|
+
return config?.learning?.tokenMetrics?.sessionBaseline ?? 10000;
|
|
154
|
+
}
|
|
71
155
|
/** Read JSON file with type safety and error handling */
|
|
72
156
|
export function readJsonFile(path, defaultValue) {
|
|
73
157
|
if (!existsSync(path))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"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"}
|