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.
Files changed (116) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +2 -0
  4. package/dist/__tests__/installer.test.js +1 -1
  5. package/dist/__tests__/learning/aggregation.test.d.ts +2 -0
  6. package/dist/__tests__/learning/aggregation.test.d.ts.map +1 -0
  7. package/dist/__tests__/learning/aggregation.test.js +282 -0
  8. package/dist/__tests__/learning/aggregation.test.js.map +1 -0
  9. package/dist/__tests__/learning/anomaly.test.d.ts +2 -0
  10. package/dist/__tests__/learning/anomaly.test.d.ts.map +1 -0
  11. package/dist/__tests__/learning/anomaly.test.js +107 -0
  12. package/dist/__tests__/learning/anomaly.test.js.map +1 -0
  13. package/dist/__tests__/learning/baselines.test.d.ts +2 -0
  14. package/dist/__tests__/learning/baselines.test.d.ts.map +1 -0
  15. package/dist/__tests__/learning/baselines.test.js +155 -0
  16. package/dist/__tests__/learning/baselines.test.js.map +1 -0
  17. package/dist/__tests__/learning/efficiency.test.d.ts +2 -0
  18. package/dist/__tests__/learning/efficiency.test.d.ts.map +1 -0
  19. package/dist/__tests__/learning/efficiency.test.js +94 -0
  20. package/dist/__tests__/learning/efficiency.test.js.map +1 -0
  21. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts +6 -0
  22. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts.map +1 -0
  23. package/dist/__tests__/learning/feedback-loop-injection.test.js +288 -0
  24. package/dist/__tests__/learning/feedback-loop-injection.test.js.map +1 -0
  25. package/dist/__tests__/learning/learning-capture-integration.test.d.ts +6 -0
  26. package/dist/__tests__/learning/learning-capture-integration.test.d.ts.map +1 -0
  27. package/dist/__tests__/learning/learning-capture-integration.test.js +151 -0
  28. package/dist/__tests__/learning/learning-capture-integration.test.js.map +1 -0
  29. package/dist/__tests__/learning/token-metrics.test.d.ts +2 -0
  30. package/dist/__tests__/learning/token-metrics.test.d.ts.map +1 -0
  31. package/dist/__tests__/learning/token-metrics.test.js +308 -0
  32. package/dist/__tests__/learning/token-metrics.test.js.map +1 -0
  33. package/dist/__tests__/token-tracking-integration.test.d.ts +8 -0
  34. package/dist/__tests__/token-tracking-integration.test.d.ts.map +1 -0
  35. package/dist/__tests__/token-tracking-integration.test.js +669 -0
  36. package/dist/__tests__/token-tracking-integration.test.js.map +1 -0
  37. package/dist/agents/prometheus.d.ts.map +1 -1
  38. package/dist/agents/prometheus.js +27 -0
  39. package/dist/agents/prometheus.js.map +1 -1
  40. package/dist/cli/commands/metrics.d.ts +10 -2
  41. package/dist/cli/commands/metrics.d.ts.map +1 -1
  42. package/dist/cli/commands/metrics.js +25 -239
  43. package/dist/cli/commands/metrics.js.map +1 -1
  44. package/dist/cli/index.js +196 -1
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/config/loader.d.ts.map +1 -1
  47. package/dist/config/loader.js +14 -0
  48. package/dist/config/loader.js.map +1 -1
  49. package/dist/hooks/registrations/budget-warning.d.ts +8 -0
  50. package/dist/hooks/registrations/budget-warning.d.ts.map +1 -0
  51. package/dist/hooks/registrations/budget-warning.js +63 -0
  52. package/dist/hooks/registrations/budget-warning.js.map +1 -0
  53. package/dist/hooks/registrations/index.d.ts +3 -2
  54. package/dist/hooks/registrations/index.d.ts.map +1 -1
  55. package/dist/hooks/registrations/index.js +5 -3
  56. package/dist/hooks/registrations/index.js.map +1 -1
  57. package/dist/hooks/registrations/learning-capture.d.ts +19 -0
  58. package/dist/hooks/registrations/learning-capture.d.ts.map +1 -0
  59. package/dist/hooks/registrations/learning-capture.js +220 -0
  60. package/dist/hooks/registrations/learning-capture.js.map +1 -0
  61. package/dist/hooks/registrations/session-start.d.ts.map +1 -1
  62. package/dist/hooks/registrations/session-start.js +13 -0
  63. package/dist/hooks/registrations/session-start.js.map +1 -1
  64. package/dist/hooks/registrations/token-metrics.d.ts +10 -2
  65. package/dist/hooks/registrations/token-metrics.d.ts.map +1 -1
  66. package/dist/hooks/registrations/token-metrics.js +18 -4
  67. package/dist/hooks/registrations/token-metrics.js.map +1 -1
  68. package/dist/installer/index.d.ts +2 -2
  69. package/dist/installer/index.d.ts.map +1 -1
  70. package/dist/installer/index.js +202 -15
  71. package/dist/installer/index.js.map +1 -1
  72. package/dist/learning/aggregation.d.ts +39 -0
  73. package/dist/learning/aggregation.d.ts.map +1 -0
  74. package/dist/learning/aggregation.js +101 -0
  75. package/dist/learning/aggregation.js.map +1 -0
  76. package/dist/learning/anomaly.d.ts +30 -0
  77. package/dist/learning/anomaly.d.ts.map +1 -0
  78. package/dist/learning/anomaly.js +102 -0
  79. package/dist/learning/anomaly.js.map +1 -0
  80. package/dist/learning/baselines.d.ts +44 -0
  81. package/dist/learning/baselines.d.ts.map +1 -0
  82. package/dist/learning/baselines.js +126 -0
  83. package/dist/learning/baselines.js.map +1 -0
  84. package/dist/learning/efficiency.d.ts +23 -0
  85. package/dist/learning/efficiency.d.ts.map +1 -0
  86. package/dist/learning/efficiency.js +67 -0
  87. package/dist/learning/efficiency.js.map +1 -0
  88. package/dist/learning/hooks/learned-context.d.ts.map +1 -1
  89. package/dist/learning/hooks/learned-context.js +46 -0
  90. package/dist/learning/hooks/learned-context.js.map +1 -1
  91. package/dist/learning/pricing.d.ts +30 -0
  92. package/dist/learning/pricing.d.ts.map +1 -0
  93. package/dist/learning/pricing.js +98 -0
  94. package/dist/learning/pricing.js.map +1 -0
  95. package/dist/learning/session-state.d.ts +12 -2
  96. package/dist/learning/session-state.d.ts.map +1 -1
  97. package/dist/learning/session-state.js +72 -3
  98. package/dist/learning/session-state.js.map +1 -1
  99. package/dist/learning/storage.d.ts +21 -1
  100. package/dist/learning/storage.d.ts.map +1 -1
  101. package/dist/learning/storage.js +84 -0
  102. package/dist/learning/storage.js.map +1 -1
  103. package/dist/learning/token-estimator.d.ts +41 -0
  104. package/dist/learning/token-estimator.d.ts.map +1 -0
  105. package/dist/learning/token-estimator.js +111 -0
  106. package/dist/learning/token-estimator.js.map +1 -0
  107. package/dist/learning/types.d.ts +32 -0
  108. package/dist/learning/types.d.ts.map +1 -1
  109. package/dist/learning/utils.d.ts +42 -0
  110. package/dist/learning/utils.d.ts.map +1 -0
  111. package/dist/learning/utils.js +76 -0
  112. package/dist/learning/utils.js.map +1 -0
  113. package/dist/shared/types.d.ts +29 -0
  114. package/dist/shared/types.d.ts.map +1 -1
  115. package/package.json +1 -1
  116. 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;AAKtG,6CAA6C;AAC7C,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA6DlE;AA6DD,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,CAcvE"}
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":"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"}
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;AAO5D,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CASnE;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAgBpF;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"}
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"}