olympus-ai 3.3.0 → 3.4.1
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/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -0
- package/dist/__tests__/installer.test.js +1 -1
- 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/agents/prometheus.d.ts.map +1 -1
- package/dist/agents/prometheus.js +27 -0
- package/dist/agents/prometheus.js.map +1 -1
- 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 +2 -2
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +202 -15
- 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,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session baseline calculation and storage
|
|
3
|
+
* Tracks expected token usage per session for anomaly detection
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Session baseline data structure
|
|
7
|
+
*/
|
|
8
|
+
export interface SessionBaseline {
|
|
9
|
+
overall_avg: number;
|
|
10
|
+
by_task_type: Record<string, number>;
|
|
11
|
+
by_project: Record<string, number>;
|
|
12
|
+
sample_count: number;
|
|
13
|
+
last_updated: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get session baseline for a project/task type
|
|
17
|
+
* Returns defaults when insufficient data
|
|
18
|
+
*
|
|
19
|
+
* @param projectPath - Optional project path for project-specific baseline
|
|
20
|
+
* @param taskType - Optional task type for task-specific baseline
|
|
21
|
+
* @param baseline - Existing baseline data (optional)
|
|
22
|
+
* @returns Baseline token count
|
|
23
|
+
*/
|
|
24
|
+
export declare function getSessionBaseline(projectPath?: string, taskType?: string, baseline?: SessionBaseline): number;
|
|
25
|
+
/**
|
|
26
|
+
* Update session baseline with new session data
|
|
27
|
+
* Uses incremental averaging to avoid full recalculation
|
|
28
|
+
*
|
|
29
|
+
* @param sessionTokens - Tokens used in this session
|
|
30
|
+
* @param projectPath - Project path for this session
|
|
31
|
+
* @param taskType - Optional task type for this session
|
|
32
|
+
* @param currentBaseline - Current baseline data (or undefined for first session)
|
|
33
|
+
* @returns Updated baseline
|
|
34
|
+
*/
|
|
35
|
+
export declare function updateSessionBaseline(sessionTokens: number, projectPath: string, taskType?: string, currentBaseline?: SessionBaseline): SessionBaseline;
|
|
36
|
+
/**
|
|
37
|
+
* Get warning threshold based on baseline and multiplier
|
|
38
|
+
*
|
|
39
|
+
* @param baseline - Current baseline token count
|
|
40
|
+
* @param multiplier - Warning threshold multiplier (default: 1.5)
|
|
41
|
+
* @returns Warning threshold in tokens
|
|
42
|
+
*/
|
|
43
|
+
export declare function getWarningThreshold(baseline: number, multiplier?: number): number;
|
|
44
|
+
//# sourceMappingURL=baselines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.d.ts","sourceRoot":"","sources":["../../src/learning/baselines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,eAAe,GACzB,MAAM,CAuBR;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,eAAe,GAChC,eAAe,CAqDjB;AAuBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAY,GACvB,MAAM,CAMR"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session baseline calculation and storage
|
|
3
|
+
* Tracks expected token usage per session for anomaly detection
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default baseline when no historical data exists
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_BASELINE_TOKENS = 10000; // 10k tokens
|
|
9
|
+
/**
|
|
10
|
+
* Get session baseline for a project/task type
|
|
11
|
+
* Returns defaults when insufficient data
|
|
12
|
+
*
|
|
13
|
+
* @param projectPath - Optional project path for project-specific baseline
|
|
14
|
+
* @param taskType - Optional task type for task-specific baseline
|
|
15
|
+
* @param baseline - Existing baseline data (optional)
|
|
16
|
+
* @returns Baseline token count
|
|
17
|
+
*/
|
|
18
|
+
export function getSessionBaseline(projectPath, taskType, baseline) {
|
|
19
|
+
// No baseline data - return cold start default
|
|
20
|
+
if (!baseline) {
|
|
21
|
+
return DEFAULT_BASELINE_TOKENS;
|
|
22
|
+
}
|
|
23
|
+
// Insufficient samples - return cold start default
|
|
24
|
+
if (baseline.sample_count < 5) {
|
|
25
|
+
return DEFAULT_BASELINE_TOKENS;
|
|
26
|
+
}
|
|
27
|
+
// Try project-specific baseline first
|
|
28
|
+
if (projectPath && baseline.by_project[projectPath] !== undefined) {
|
|
29
|
+
return baseline.by_project[projectPath];
|
|
30
|
+
}
|
|
31
|
+
// Try task-type baseline next
|
|
32
|
+
if (taskType && baseline.by_task_type[taskType] !== undefined) {
|
|
33
|
+
return baseline.by_task_type[taskType];
|
|
34
|
+
}
|
|
35
|
+
// Fall back to overall average
|
|
36
|
+
return baseline.overall_avg;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Update session baseline with new session data
|
|
40
|
+
* Uses incremental averaging to avoid full recalculation
|
|
41
|
+
*
|
|
42
|
+
* @param sessionTokens - Tokens used in this session
|
|
43
|
+
* @param projectPath - Project path for this session
|
|
44
|
+
* @param taskType - Optional task type for this session
|
|
45
|
+
* @param currentBaseline - Current baseline data (or undefined for first session)
|
|
46
|
+
* @returns Updated baseline
|
|
47
|
+
*/
|
|
48
|
+
export function updateSessionBaseline(sessionTokens, projectPath, taskType, currentBaseline) {
|
|
49
|
+
if (sessionTokens < 0) {
|
|
50
|
+
throw new Error('Session tokens cannot be negative');
|
|
51
|
+
}
|
|
52
|
+
// Initialize baseline if first session
|
|
53
|
+
if (!currentBaseline) {
|
|
54
|
+
return {
|
|
55
|
+
overall_avg: sessionTokens,
|
|
56
|
+
by_task_type: taskType ? { [taskType]: sessionTokens } : {},
|
|
57
|
+
by_project: { [projectPath]: sessionTokens },
|
|
58
|
+
sample_count: 1,
|
|
59
|
+
last_updated: new Date().toISOString()
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Calculate new overall average using incremental approach
|
|
63
|
+
const newSampleCount = currentBaseline.sample_count + 1;
|
|
64
|
+
const newOverallAvg = (currentBaseline.overall_avg * currentBaseline.sample_count + sessionTokens) / newSampleCount;
|
|
65
|
+
// Update project-specific average
|
|
66
|
+
const projectCount = currentBaseline.by_project[projectPath]
|
|
67
|
+
? getProjectCount(currentBaseline, projectPath)
|
|
68
|
+
: 0;
|
|
69
|
+
const newProjectCount = projectCount + 1;
|
|
70
|
+
const currentProjectAvg = currentBaseline.by_project[projectPath] || sessionTokens;
|
|
71
|
+
const newProjectAvg = (currentProjectAvg * projectCount + sessionTokens) / newProjectCount;
|
|
72
|
+
// Update task-type average if provided
|
|
73
|
+
let newTaskTypeAvgs = { ...currentBaseline.by_task_type };
|
|
74
|
+
if (taskType) {
|
|
75
|
+
const taskCount = currentBaseline.by_task_type[taskType]
|
|
76
|
+
? getTaskTypeCount(currentBaseline, taskType)
|
|
77
|
+
: 0;
|
|
78
|
+
const newTaskCount = taskCount + 1;
|
|
79
|
+
const currentTaskAvg = currentBaseline.by_task_type[taskType] || sessionTokens;
|
|
80
|
+
const newTaskAvg = (currentTaskAvg * taskCount + sessionTokens) / newTaskCount;
|
|
81
|
+
newTaskTypeAvgs[taskType] = newTaskAvg;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
overall_avg: newOverallAvg,
|
|
85
|
+
by_task_type: newTaskTypeAvgs,
|
|
86
|
+
by_project: {
|
|
87
|
+
...currentBaseline.by_project,
|
|
88
|
+
[projectPath]: newProjectAvg
|
|
89
|
+
},
|
|
90
|
+
sample_count: newSampleCount,
|
|
91
|
+
last_updated: new Date().toISOString()
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper to get project count (would ideally be tracked separately)
|
|
96
|
+
* For now, we approximate based on overall count and unique projects
|
|
97
|
+
* This is a simplification - in production you'd track counts separately
|
|
98
|
+
*/
|
|
99
|
+
function getProjectCount(baseline, projectPath) {
|
|
100
|
+
// Approximate: assume equal distribution across projects
|
|
101
|
+
// In real implementation, track counts in SessionBaseline
|
|
102
|
+
const projectCount = Object.keys(baseline.by_project).length;
|
|
103
|
+
return Math.max(1, Math.floor(baseline.sample_count / projectCount));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Helper to get task type count
|
|
107
|
+
*/
|
|
108
|
+
function getTaskTypeCount(baseline, taskType) {
|
|
109
|
+
// Approximate: assume equal distribution across task types
|
|
110
|
+
const taskTypeCount = Object.keys(baseline.by_task_type).length;
|
|
111
|
+
return Math.max(1, Math.floor(baseline.sample_count / taskTypeCount));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get warning threshold based on baseline and multiplier
|
|
115
|
+
*
|
|
116
|
+
* @param baseline - Current baseline token count
|
|
117
|
+
* @param multiplier - Warning threshold multiplier (default: 1.5)
|
|
118
|
+
* @returns Warning threshold in tokens
|
|
119
|
+
*/
|
|
120
|
+
export function getWarningThreshold(baseline, multiplier = 1.5) {
|
|
121
|
+
if (baseline < 0 || multiplier < 0) {
|
|
122
|
+
throw new Error('Baseline and multiplier must be non-negative');
|
|
123
|
+
}
|
|
124
|
+
return baseline * multiplier;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=baselines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.js","sourceRoot":"","sources":["../../src/learning/baselines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 declare function calculateEfficiencyScore(successRate: number, avgTokens: number, baselineTokens: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* Calculate trend based on recent vs historical averages
|
|
16
|
+
*
|
|
17
|
+
* @param recentAvg - Average tokens for recent sessions (last 10)
|
|
18
|
+
* @param historicalAvg - Average tokens across all history
|
|
19
|
+
* @param sampleCount - Total number of samples
|
|
20
|
+
* @returns Trend indicator
|
|
21
|
+
*/
|
|
22
|
+
export declare function calculateTrend(recentAvg: number, historicalAvg: number, sampleCount: number): 'improving' | 'stable' | 'declining' | 'insufficient_data';
|
|
23
|
+
//# sourceMappingURL=efficiency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency.d.ts","sourceRoot":"","sources":["../../src/learning/efficiency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,MAAM,CAuBR;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,mBAAmB,CA6B5D"}
|
|
@@ -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"}
|