olympus-ai 3.2.3 → 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.
Files changed (212) 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__/ascent-checkpoint.test.d.ts +2 -0
  5. package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
  6. package/dist/__tests__/ascent-checkpoint.test.js +261 -0
  7. package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
  8. package/dist/__tests__/config-ascent.test.d.ts +2 -0
  9. package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
  10. package/dist/__tests__/config-ascent.test.js +134 -0
  11. package/dist/__tests__/config-ascent.test.js.map +1 -0
  12. package/dist/__tests__/hook-blocking.test.d.ts +8 -0
  13. package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
  14. package/dist/__tests__/hook-blocking.test.js +277 -0
  15. package/dist/__tests__/hook-blocking.test.js.map +1 -0
  16. package/dist/__tests__/installer.test.js +1 -1
  17. package/dist/__tests__/learning/aggregation.test.d.ts +2 -0
  18. package/dist/__tests__/learning/aggregation.test.d.ts.map +1 -0
  19. package/dist/__tests__/learning/aggregation.test.js +282 -0
  20. package/dist/__tests__/learning/aggregation.test.js.map +1 -0
  21. package/dist/__tests__/learning/anomaly.test.d.ts +2 -0
  22. package/dist/__tests__/learning/anomaly.test.d.ts.map +1 -0
  23. package/dist/__tests__/learning/anomaly.test.js +107 -0
  24. package/dist/__tests__/learning/anomaly.test.js.map +1 -0
  25. package/dist/__tests__/learning/baselines.test.d.ts +2 -0
  26. package/dist/__tests__/learning/baselines.test.d.ts.map +1 -0
  27. package/dist/__tests__/learning/baselines.test.js +155 -0
  28. package/dist/__tests__/learning/baselines.test.js.map +1 -0
  29. package/dist/__tests__/learning/efficiency.test.d.ts +2 -0
  30. package/dist/__tests__/learning/efficiency.test.d.ts.map +1 -0
  31. package/dist/__tests__/learning/efficiency.test.js +94 -0
  32. package/dist/__tests__/learning/efficiency.test.js.map +1 -0
  33. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts +6 -0
  34. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts.map +1 -0
  35. package/dist/__tests__/learning/feedback-loop-injection.test.js +288 -0
  36. package/dist/__tests__/learning/feedback-loop-injection.test.js.map +1 -0
  37. package/dist/__tests__/learning/learning-capture-integration.test.d.ts +6 -0
  38. package/dist/__tests__/learning/learning-capture-integration.test.d.ts.map +1 -0
  39. package/dist/__tests__/learning/learning-capture-integration.test.js +151 -0
  40. package/dist/__tests__/learning/learning-capture-integration.test.js.map +1 -0
  41. package/dist/__tests__/learning/token-metrics.test.d.ts +2 -0
  42. package/dist/__tests__/learning/token-metrics.test.d.ts.map +1 -0
  43. package/dist/__tests__/learning/token-metrics.test.js +308 -0
  44. package/dist/__tests__/learning/token-metrics.test.js.map +1 -0
  45. package/dist/__tests__/metrics-cli.test.d.ts +5 -0
  46. package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
  47. package/dist/__tests__/metrics-cli.test.js +24 -0
  48. package/dist/__tests__/metrics-cli.test.js.map +1 -0
  49. package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
  50. package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
  51. package/dist/__tests__/skill-auto-detection.test.js +255 -0
  52. package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
  53. package/dist/__tests__/token-estimator.test.d.ts +5 -0
  54. package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
  55. package/dist/__tests__/token-estimator.test.js +192 -0
  56. package/dist/__tests__/token-estimator.test.js.map +1 -0
  57. package/dist/__tests__/token-tracking-integration.test.d.ts +8 -0
  58. package/dist/__tests__/token-tracking-integration.test.d.ts.map +1 -0
  59. package/dist/__tests__/token-tracking-integration.test.js +669 -0
  60. package/dist/__tests__/token-tracking-integration.test.js.map +1 -0
  61. package/dist/agents/definitions.d.ts.map +1 -1
  62. package/dist/agents/definitions.js +83 -1
  63. package/dist/agents/definitions.js.map +1 -1
  64. package/dist/agents/document-writer.d.ts.map +1 -1
  65. package/dist/agents/document-writer.js +38 -0
  66. package/dist/agents/document-writer.js.map +1 -1
  67. package/dist/agents/frontend-engineer.d.ts.map +1 -1
  68. package/dist/agents/frontend-engineer.js +16 -0
  69. package/dist/agents/frontend-engineer.js.map +1 -1
  70. package/dist/agents/olympian.d.ts.map +1 -1
  71. package/dist/agents/olympian.js +15 -0
  72. package/dist/agents/olympian.js.map +1 -1
  73. package/dist/cli/commands/metrics.d.ts +39 -0
  74. package/dist/cli/commands/metrics.d.ts.map +1 -0
  75. package/dist/cli/commands/metrics.js +52 -0
  76. package/dist/cli/commands/metrics.js.map +1 -0
  77. package/dist/cli/index.js +235 -1
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/config/loader.d.ts.map +1 -1
  80. package/dist/config/loader.js +30 -0
  81. package/dist/config/loader.js.map +1 -1
  82. package/dist/features/ascent-checkpoint/index.d.ts +48 -0
  83. package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
  84. package/dist/features/ascent-checkpoint/index.js +144 -0
  85. package/dist/features/ascent-checkpoint/index.js.map +1 -0
  86. package/dist/features/hook-logging/index.d.ts +37 -0
  87. package/dist/features/hook-logging/index.d.ts.map +1 -0
  88. package/dist/features/hook-logging/index.js +120 -0
  89. package/dist/features/hook-logging/index.js.map +1 -0
  90. package/dist/features/hook-logging/index.test.d.ts +5 -0
  91. package/dist/features/hook-logging/index.test.d.ts.map +1 -0
  92. package/dist/features/hook-logging/index.test.js +268 -0
  93. package/dist/features/hook-logging/index.test.js.map +1 -0
  94. package/dist/features/index.d.ts +3 -0
  95. package/dist/features/index.d.ts.map +1 -1
  96. package/dist/features/index.js +8 -0
  97. package/dist/features/index.js.map +1 -1
  98. package/dist/features/magic-keywords.d.ts +51 -0
  99. package/dist/features/magic-keywords.d.ts.map +1 -1
  100. package/dist/features/magic-keywords.js +172 -0
  101. package/dist/features/magic-keywords.js.map +1 -1
  102. package/dist/features/session-state/index.d.ts +50 -0
  103. package/dist/features/session-state/index.d.ts.map +1 -0
  104. package/dist/features/session-state/index.js +64 -0
  105. package/dist/features/session-state/index.js.map +1 -0
  106. package/dist/features/session-state/index.test.d.ts +5 -0
  107. package/dist/features/session-state/index.test.d.ts.map +1 -0
  108. package/dist/features/session-state/index.test.js +221 -0
  109. package/dist/features/session-state/index.test.js.map +1 -0
  110. package/dist/features/token-metrics/index.d.ts +6 -0
  111. package/dist/features/token-metrics/index.d.ts.map +1 -0
  112. package/dist/features/token-metrics/index.js +5 -0
  113. package/dist/features/token-metrics/index.js.map +1 -0
  114. package/dist/features/token-metrics/storage.d.ts +16 -0
  115. package/dist/features/token-metrics/storage.d.ts.map +1 -0
  116. package/dist/features/token-metrics/storage.js +144 -0
  117. package/dist/features/token-metrics/storage.js.map +1 -0
  118. package/dist/features/token-metrics/token-estimator.d.ts +66 -0
  119. package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
  120. package/dist/features/token-metrics/token-estimator.js +230 -0
  121. package/dist/features/token-metrics/token-estimator.js.map +1 -0
  122. package/dist/features/token-metrics/types.d.ts +63 -0
  123. package/dist/features/token-metrics/types.d.ts.map +1 -0
  124. package/dist/features/token-metrics/types.js +5 -0
  125. package/dist/features/token-metrics/types.js.map +1 -0
  126. package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
  127. package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
  128. package/dist/hooks/olympus-orchestrator/constants.js +41 -0
  129. package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
  130. package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
  131. package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
  132. package/dist/hooks/olympus-orchestrator/index.js +108 -14
  133. package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
  134. package/dist/hooks/registrations/budget-warning.d.ts +8 -0
  135. package/dist/hooks/registrations/budget-warning.d.ts.map +1 -0
  136. package/dist/hooks/registrations/budget-warning.js +63 -0
  137. package/dist/hooks/registrations/budget-warning.js.map +1 -0
  138. package/dist/hooks/registrations/index.d.ts +3 -1
  139. package/dist/hooks/registrations/index.d.ts.map +1 -1
  140. package/dist/hooks/registrations/index.js +5 -1
  141. package/dist/hooks/registrations/index.js.map +1 -1
  142. package/dist/hooks/registrations/learning-capture.d.ts +19 -0
  143. package/dist/hooks/registrations/learning-capture.d.ts.map +1 -0
  144. package/dist/hooks/registrations/learning-capture.js +220 -0
  145. package/dist/hooks/registrations/learning-capture.js.map +1 -0
  146. package/dist/hooks/registrations/session-start.d.ts.map +1 -1
  147. package/dist/hooks/registrations/session-start.js +13 -0
  148. package/dist/hooks/registrations/session-start.js.map +1 -1
  149. package/dist/hooks/registrations/token-metrics.d.ts +19 -0
  150. package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
  151. package/dist/hooks/registrations/token-metrics.js +133 -0
  152. package/dist/hooks/registrations/token-metrics.js.map +1 -0
  153. package/dist/installer/index.d.ts +2 -2
  154. package/dist/installer/index.d.ts.map +1 -1
  155. package/dist/installer/index.js +390 -9
  156. package/dist/installer/index.js.map +1 -1
  157. package/dist/learning/aggregation.d.ts +39 -0
  158. package/dist/learning/aggregation.d.ts.map +1 -0
  159. package/dist/learning/aggregation.js +101 -0
  160. package/dist/learning/aggregation.js.map +1 -0
  161. package/dist/learning/anomaly.d.ts +30 -0
  162. package/dist/learning/anomaly.d.ts.map +1 -0
  163. package/dist/learning/anomaly.js +102 -0
  164. package/dist/learning/anomaly.js.map +1 -0
  165. package/dist/learning/baselines.d.ts +44 -0
  166. package/dist/learning/baselines.d.ts.map +1 -0
  167. package/dist/learning/baselines.js +126 -0
  168. package/dist/learning/baselines.js.map +1 -0
  169. package/dist/learning/efficiency.d.ts +23 -0
  170. package/dist/learning/efficiency.d.ts.map +1 -0
  171. package/dist/learning/efficiency.js +67 -0
  172. package/dist/learning/efficiency.js.map +1 -0
  173. package/dist/learning/hooks/learned-context.d.ts.map +1 -1
  174. package/dist/learning/hooks/learned-context.js +46 -0
  175. package/dist/learning/hooks/learned-context.js.map +1 -1
  176. package/dist/learning/pricing.d.ts +30 -0
  177. package/dist/learning/pricing.d.ts.map +1 -0
  178. package/dist/learning/pricing.js +98 -0
  179. package/dist/learning/pricing.js.map +1 -0
  180. package/dist/learning/session-state.d.ts +12 -2
  181. package/dist/learning/session-state.d.ts.map +1 -1
  182. package/dist/learning/session-state.js +72 -3
  183. package/dist/learning/session-state.js.map +1 -1
  184. package/dist/learning/storage.d.ts +21 -1
  185. package/dist/learning/storage.d.ts.map +1 -1
  186. package/dist/learning/storage.js +84 -0
  187. package/dist/learning/storage.js.map +1 -1
  188. package/dist/learning/token-estimator.d.ts +41 -0
  189. package/dist/learning/token-estimator.d.ts.map +1 -0
  190. package/dist/learning/token-estimator.js +111 -0
  191. package/dist/learning/token-estimator.js.map +1 -0
  192. package/dist/learning/types.d.ts +32 -0
  193. package/dist/learning/types.d.ts.map +1 -1
  194. package/dist/learning/utils.d.ts +42 -0
  195. package/dist/learning/utils.d.ts.map +1 -0
  196. package/dist/learning/utils.js +76 -0
  197. package/dist/learning/utils.js.map +1 -0
  198. package/dist/shared/types.d.ts +45 -0
  199. package/dist/shared/types.d.ts.map +1 -1
  200. package/package.json +3 -3
  201. package/scripts/.olympus/token-metrics.jsonl +1 -0
  202. package/scripts/dist/hooks/olympus-hooks.cjs +128 -127
  203. package/scripts/esbuild.hooks.mjs +1 -1
  204. package/.claude/CLAUDE.md +0 -66
  205. package/scripts/generate-logo-hybrid-v2.mjs +0 -213
  206. package/scripts/generate-logo-hybrid.mjs +0 -209
  207. package/scripts/generate-logo-infinity.mjs +0 -239
  208. package/scripts/generate-logo-mythology.mjs +0 -190
  209. package/scripts/generate-logo-orchestration.mjs +0 -228
  210. package/scripts/generate-logo-recraft.mjs +0 -147
  211. package/scripts/generate-logo-simple.mjs +0 -154
  212. package/scripts/generate-logo.mjs +0 -117
@@ -0,0 +1,308 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getTokenUsage, getEfficiencyScore, hasMinimumSamples, safeTokenTotal, hasTokenMetrics } from '../../learning/utils.js';
3
+ import { calculateCost, DEFAULT_PRICING } from '../../learning/pricing.js';
4
+ import { updateAgentPerformance, getSessionBaseline } from '../../learning/storage.js';
5
+ describe('Token Metrics - Types and Utils', () => {
6
+ it('should safely extract token usage from feedback entry', () => {
7
+ const entry = {
8
+ id: 'test-1',
9
+ timestamp: '2024-01-01T00:00:00Z',
10
+ session_id: 'session-1',
11
+ project_path: '/test',
12
+ event_type: 'success',
13
+ user_message: 'Good job',
14
+ feedback_category: 'praise',
15
+ confidence: 0.9,
16
+ token_usage: {
17
+ input_tokens: 1000,
18
+ output_tokens: 500,
19
+ total_tokens: 1500,
20
+ estimated: false,
21
+ model: 'claude-sonnet-4-5'
22
+ }
23
+ };
24
+ const tokenUsage = getTokenUsage(entry);
25
+ expect(tokenUsage).not.toBeNull();
26
+ expect(tokenUsage?.total_tokens).toBe(1500);
27
+ expect(tokenUsage?.estimated).toBe(false);
28
+ });
29
+ it('should return null for entry without token usage', () => {
30
+ const entry = {
31
+ id: 'test-2',
32
+ timestamp: '2024-01-01T00:00:00Z',
33
+ session_id: 'session-1',
34
+ project_path: '/test',
35
+ event_type: 'success',
36
+ user_message: 'Good',
37
+ feedback_category: 'praise',
38
+ confidence: 0.9
39
+ };
40
+ const tokenUsage = getTokenUsage(entry);
41
+ expect(tokenUsage).toBeNull();
42
+ });
43
+ it('should safely get total tokens with safeTokenTotal', () => {
44
+ const withTokens = {
45
+ id: 'test-3',
46
+ timestamp: '2024-01-01T00:00:00Z',
47
+ session_id: 'session-1',
48
+ project_path: '/test',
49
+ event_type: 'success',
50
+ user_message: 'Good',
51
+ feedback_category: 'praise',
52
+ confidence: 0.9,
53
+ token_usage: {
54
+ input_tokens: 1000,
55
+ output_tokens: 500,
56
+ total_tokens: 1500,
57
+ estimated: false
58
+ }
59
+ };
60
+ const withoutTokens = {
61
+ id: 'test-4',
62
+ timestamp: '2024-01-01T00:00:00Z',
63
+ session_id: 'session-1',
64
+ project_path: '/test',
65
+ event_type: 'success',
66
+ user_message: 'Good',
67
+ feedback_category: 'praise',
68
+ confidence: 0.9
69
+ };
70
+ expect(safeTokenTotal(withTokens)).toBe(1500);
71
+ expect(safeTokenTotal(withoutTokens)).toBe(0);
72
+ });
73
+ it('should check if entry has token metrics with type guard', () => {
74
+ const withTokens = {
75
+ id: 'test-5',
76
+ timestamp: '2024-01-01T00:00:00Z',
77
+ session_id: 'session-1',
78
+ project_path: '/test',
79
+ event_type: 'success',
80
+ user_message: 'Good',
81
+ feedback_category: 'praise',
82
+ confidence: 0.9,
83
+ token_usage: {
84
+ input_tokens: 1000,
85
+ output_tokens: 500,
86
+ total_tokens: 1500,
87
+ estimated: false
88
+ }
89
+ };
90
+ expect(hasTokenMetrics(withTokens)).toBe(true);
91
+ });
92
+ it('should get efficiency score from agent performance', () => {
93
+ const perf = {
94
+ agent_name: 'test-agent',
95
+ total_invocations: 10,
96
+ success_count: 8,
97
+ revision_count: 2,
98
+ cancellation_count: 0,
99
+ success_rate: 0.8,
100
+ failure_patterns: [],
101
+ strong_areas: [],
102
+ weak_areas: [],
103
+ last_updated: '2024-01-01T00:00:00Z',
104
+ token_efficiency: {
105
+ avg_tokens_per_success: 1200,
106
+ avg_tokens_per_failure: 2000,
107
+ total_tokens: 10000,
108
+ invocation_count: 10,
109
+ efficiency_score: 1200,
110
+ trend: 'improving'
111
+ }
112
+ };
113
+ expect(getEfficiencyScore(perf)).toBe(1200);
114
+ });
115
+ it('should check minimum samples requirement', () => {
116
+ const withEnoughSamples = {
117
+ agent_name: 'test-agent',
118
+ total_invocations: 10,
119
+ success_count: 8,
120
+ revision_count: 2,
121
+ cancellation_count: 0,
122
+ success_rate: 0.8,
123
+ failure_patterns: [],
124
+ strong_areas: [],
125
+ weak_areas: [],
126
+ last_updated: '2024-01-01T00:00:00Z',
127
+ token_efficiency: {
128
+ avg_tokens_per_success: 1200,
129
+ avg_tokens_per_failure: 2000,
130
+ total_tokens: 10000,
131
+ invocation_count: 10,
132
+ efficiency_score: 1200,
133
+ trend: 'improving'
134
+ }
135
+ };
136
+ const withFewSamples = {
137
+ ...withEnoughSamples,
138
+ token_efficiency: {
139
+ ...withEnoughSamples.token_efficiency,
140
+ invocation_count: 3
141
+ }
142
+ };
143
+ expect(hasMinimumSamples(withEnoughSamples, 5)).toBe(true);
144
+ expect(hasMinimumSamples(withFewSamples, 5)).toBe(false);
145
+ });
146
+ });
147
+ describe('Token Metrics - Pricing', () => {
148
+ it('should calculate cost for Opus model', () => {
149
+ const result = calculateCost(1_000_000, 1_000_000, 'claude-opus-4-5');
150
+ expect(result.inputCost).toBe(15.0);
151
+ expect(result.outputCost).toBe(75.0);
152
+ expect(result.totalCost).toBe(90.0);
153
+ expect(result.pricingVersion).toBe('2025-01-01');
154
+ });
155
+ it('should calculate cost for Sonnet model', () => {
156
+ const result = calculateCost(1_000_000, 1_000_000, 'claude-sonnet-4-5');
157
+ expect(result.inputCost).toBe(3.0);
158
+ expect(result.outputCost).toBe(15.0);
159
+ expect(result.totalCost).toBe(18.0);
160
+ });
161
+ it('should calculate cost for Haiku model', () => {
162
+ const result = calculateCost(1_000_000, 1_000_000, 'claude-haiku-4-5');
163
+ expect(result.inputCost).toBe(0.25);
164
+ expect(result.outputCost).toBe(1.25);
165
+ expect(result.totalCost).toBe(1.5);
166
+ });
167
+ it('should handle fractional token counts', () => {
168
+ const result = calculateCost(500_000, 250_000, 'claude-sonnet-4-5');
169
+ expect(result.inputCost).toBe(1.5);
170
+ expect(result.outputCost).toBe(3.75);
171
+ expect(result.totalCost).toBe(5.25);
172
+ });
173
+ it('should default to Sonnet pricing for unknown models', () => {
174
+ const result = calculateCost(1_000_000, 1_000_000, 'unknown-model');
175
+ expect(result.inputCost).toBe(3.0);
176
+ expect(result.outputCost).toBe(15.0);
177
+ expect(result.totalCost).toBe(18.0);
178
+ });
179
+ it('should have valid default pricing structure', () => {
180
+ expect(DEFAULT_PRICING).toHaveLength(3);
181
+ expect(DEFAULT_PRICING[0].model_pattern).toBe('claude-opus');
182
+ expect(DEFAULT_PRICING[1].model_pattern).toBe('claude-sonnet');
183
+ expect(DEFAULT_PRICING[2].model_pattern).toBe('claude-haiku');
184
+ });
185
+ });
186
+ describe('Token Metrics - Agent Performance Update', () => {
187
+ it('should calculate token efficiency from feedback entries', () => {
188
+ const feedbackEntries = [
189
+ {
190
+ id: 'entry-1',
191
+ timestamp: '2024-01-01T00:00:00Z',
192
+ session_id: 'session-1',
193
+ project_path: '/test',
194
+ event_type: 'success',
195
+ agent_used: 'test-agent',
196
+ user_message: 'Good',
197
+ feedback_category: 'praise',
198
+ confidence: 0.9,
199
+ token_usage: {
200
+ input_tokens: 800,
201
+ output_tokens: 400,
202
+ total_tokens: 1200,
203
+ estimated: false
204
+ }
205
+ },
206
+ {
207
+ id: 'entry-2',
208
+ timestamp: '2024-01-01T00:01:00Z',
209
+ session_id: 'session-1',
210
+ project_path: '/test',
211
+ event_type: 'success',
212
+ agent_used: 'test-agent',
213
+ user_message: 'Good',
214
+ feedback_category: 'praise',
215
+ confidence: 0.9,
216
+ token_usage: {
217
+ input_tokens: 1000,
218
+ output_tokens: 500,
219
+ total_tokens: 1500,
220
+ estimated: false
221
+ }
222
+ },
223
+ {
224
+ id: 'entry-3',
225
+ timestamp: '2024-01-01T00:02:00Z',
226
+ session_id: 'session-1',
227
+ project_path: '/test',
228
+ event_type: 'revision',
229
+ agent_used: 'test-agent',
230
+ user_message: 'Wrong',
231
+ feedback_category: 'correction',
232
+ confidence: 0.9,
233
+ token_usage: {
234
+ input_tokens: 1500,
235
+ output_tokens: 1000,
236
+ total_tokens: 2500,
237
+ estimated: false
238
+ }
239
+ }
240
+ ];
241
+ const perf = updateAgentPerformance('test-agent', feedbackEntries);
242
+ expect(perf).not.toBeNull();
243
+ expect(perf.total_invocations).toBe(3);
244
+ expect(perf.success_count).toBe(2);
245
+ expect(perf.revision_count).toBe(1);
246
+ expect(perf.token_efficiency).toBeDefined();
247
+ expect(perf.token_efficiency.total_tokens).toBe(5200);
248
+ expect(perf.token_efficiency.invocation_count).toBe(3);
249
+ expect(perf.token_efficiency.avg_tokens_per_success).toBe(1350); // (1200 + 1500) / 2
250
+ expect(perf.token_efficiency.avg_tokens_per_failure).toBe(2500); // 2500 / 1
251
+ });
252
+ it('should handle entries without token usage', () => {
253
+ const feedbackEntries = [
254
+ {
255
+ id: 'entry-1',
256
+ timestamp: '2024-01-01T00:00:00Z',
257
+ session_id: 'session-1',
258
+ project_path: '/test',
259
+ event_type: 'success',
260
+ agent_used: 'test-agent',
261
+ user_message: 'Good',
262
+ feedback_category: 'praise',
263
+ confidence: 0.9
264
+ },
265
+ {
266
+ id: 'entry-2',
267
+ timestamp: '2024-01-01T00:01:00Z',
268
+ session_id: 'session-1',
269
+ project_path: '/test',
270
+ event_type: 'success',
271
+ agent_used: 'test-agent',
272
+ user_message: 'Good',
273
+ feedback_category: 'praise',
274
+ confidence: 0.9
275
+ }
276
+ ];
277
+ const perf = updateAgentPerformance('test-agent', feedbackEntries);
278
+ expect(perf).not.toBeNull();
279
+ expect(perf.total_invocations).toBe(2);
280
+ expect(perf.token_efficiency).toBeUndefined();
281
+ });
282
+ it('should return null for agent with no entries', () => {
283
+ const perf = updateAgentPerformance('nonexistent-agent', []);
284
+ expect(perf).toBeNull();
285
+ });
286
+ });
287
+ describe('Token Metrics - Session Baseline', () => {
288
+ it('should return default session baseline', () => {
289
+ const baseline = getSessionBaseline();
290
+ expect(baseline).toBe(10000);
291
+ });
292
+ it('should return configured session baseline', () => {
293
+ const config = {
294
+ learning: {
295
+ tokenMetrics: {
296
+ sessionBaseline: 20000
297
+ }
298
+ }
299
+ };
300
+ const baseline = getSessionBaseline(config);
301
+ expect(baseline).toBe(20000);
302
+ });
303
+ it('should handle undefined config', () => {
304
+ const baseline = getSessionBaseline(undefined);
305
+ expect(baseline).toBe(10000);
306
+ });
307
+ });
308
+ //# sourceMappingURL=token-metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics.test.js","sourceRoot":"","sources":["../../../src/__tests__/learning/token-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Token Metrics CLI Commands Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=metrics-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/metrics-cli.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Token Metrics CLI Commands Tests
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { logTokenMetric } from '../features/token-metrics/storage.js';
8
+ describe('Token Metrics CLI Commands', () => {
9
+ it('logTokenMetric creates entry', async () => {
10
+ // Create sample metrics in current directory
11
+ const entry = {
12
+ timestamp: new Date().toISOString(),
13
+ session_id: 'test-session',
14
+ event_type: 'prompt',
15
+ input_tokens: 100,
16
+ output_tokens: 50,
17
+ project_path: process.cwd()
18
+ };
19
+ await logTokenMetric(entry);
20
+ const metricsPath = join(process.cwd(), '.olympus', 'token-metrics.jsonl');
21
+ expect(existsSync(metricsPath)).toBe(true);
22
+ });
23
+ });
24
+ //# sourceMappingURL=metrics-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/metrics-cli.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,6CAA6C;QAC7C,MAAM,KAAK,GAAsB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,GAAG;YACjB,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE;SAC5B,CAAC;QAEF,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;QAC3E,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-auto-detection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-auto-detection.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skill-auto-detection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,255 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectFrontendUiUx, detectGitMaster, detectAscent, detectSkills } from '../features/magic-keywords.js';
3
+ describe('Skill Auto-Detection', () => {
4
+ describe('detectFrontendUiUx', () => {
5
+ it('should detect frontend work with component + styling', () => {
6
+ expect(detectFrontendUiUx('Create a button component with custom styling')).toBe(true);
7
+ });
8
+ it('should detect UI work with multiple element keywords', () => {
9
+ expect(detectFrontendUiUx('Build a modal dialog with a form input')).toBe(true);
10
+ });
11
+ it('should detect design work with ui + responsive', () => {
12
+ expect(detectFrontendUiUx('Make the ui responsive for mobile devices')).toBe(true);
13
+ });
14
+ it('should NOT detect with single keyword', () => {
15
+ expect(detectFrontendUiUx('Update the button')).toBe(false);
16
+ });
17
+ it('should NOT detect with negative signals (api)', () => {
18
+ expect(detectFrontendUiUx('Create a button component that calls the api')).toBe(false);
19
+ });
20
+ it('should NOT detect with negative signals (backend)', () => {
21
+ expect(detectFrontendUiUx('Design a form that sends data to the backend')).toBe(false);
22
+ });
23
+ it('should NOT detect with negative signals (database)', () => {
24
+ expect(detectFrontendUiUx('Create a modal to display database records')).toBe(false);
25
+ });
26
+ it('should NOT detect with negative signals (server)', () => {
27
+ expect(detectFrontendUiUx('Build a component that connects to the server')).toBe(false);
28
+ });
29
+ it('should NOT detect with negative signals (endpoint)', () => {
30
+ expect(detectFrontendUiUx('Create UI that calls an endpoint')).toBe(false);
31
+ });
32
+ it('should NOT detect with negative signals (query)', () => {
33
+ expect(detectFrontendUiUx('Design a form with database query logic')).toBe(false);
34
+ });
35
+ it('should NOT detect with negative signals (migration)', () => {
36
+ expect(detectFrontendUiUx('Update the UI and run database migration')).toBe(false);
37
+ });
38
+ it('should detect with Tailwind + layout', () => {
39
+ expect(detectFrontendUiUx('Style the layout using Tailwind CSS')).toBe(true);
40
+ });
41
+ it('should detect with navbar + menu', () => {
42
+ expect(detectFrontendUiUx('Create a navbar with dropdown menu')).toBe(true);
43
+ });
44
+ it('should detect with animate + theme', () => {
45
+ expect(detectFrontendUiUx('Add animate effects and apply the theme')).toBe(true);
46
+ });
47
+ it('should detect with card + design', () => {
48
+ expect(detectFrontendUiUx('Design a card component for the dashboard')).toBe(true);
49
+ });
50
+ it('should ignore keywords in code blocks', () => {
51
+ expect(detectFrontendUiUx('Update the file:\n```js\nconst button = "component";\nconst ui = "design";\n```')).toBe(false);
52
+ });
53
+ it('should be case-insensitive', () => {
54
+ expect(detectFrontendUiUx('Create a BUTTON COMPONENT with custom STYLING')).toBe(true);
55
+ });
56
+ });
57
+ describe('detectGitMaster', () => {
58
+ it('should detect refactor keyword', () => {
59
+ expect(detectGitMaster('Refactor the authentication module')).toBe(true);
60
+ });
61
+ it('should detect rename keyword', () => {
62
+ expect(detectGitMaster('Rename the utils folder to helpers')).toBe(true);
63
+ });
64
+ it('should detect reorganize keyword', () => {
65
+ expect(detectGitMaster('Reorganize the project structure')).toBe(true);
66
+ });
67
+ it('should detect migrate keyword', () => {
68
+ expect(detectGitMaster('Migrate to TypeScript')).toBe(true);
69
+ });
70
+ it('should detect restructure keyword', () => {
71
+ expect(detectGitMaster('Restructure the codebase for better organization')).toBe(true);
72
+ });
73
+ it('should detect "move files" phrase', () => {
74
+ expect(detectGitMaster('Move files from src to lib')).toBe(true);
75
+ });
76
+ it('should detect "move file" singular', () => {
77
+ expect(detectGitMaster('Move file to new location')).toBe(true);
78
+ });
79
+ it('should NOT detect unrelated keywords', () => {
80
+ expect(detectGitMaster('Create a new feature')).toBe(false);
81
+ });
82
+ it('should NOT detect keywords in code blocks', () => {
83
+ expect(detectGitMaster('Update code:\n```js\nfunction refactor() {}\n```')).toBe(false);
84
+ });
85
+ it('should be case-insensitive', () => {
86
+ expect(detectGitMaster('REFACTOR the module')).toBe(true);
87
+ });
88
+ });
89
+ describe('detectAscent', () => {
90
+ it('should detect "must complete"', () => {
91
+ expect(detectAscent('You must complete this task')).toBe(true);
92
+ });
93
+ it('should detect "don\'t stop"', () => {
94
+ expect(detectAscent('Don\'t stop until it works')).toBe(true);
95
+ });
96
+ it('should detect "dont stop" (no apostrophe)', () => {
97
+ expect(detectAscent('Dont stop working on this')).toBe(true);
98
+ });
99
+ it('should detect "finish this"', () => {
100
+ expect(detectAscent('Please finish this task')).toBe(true);
101
+ });
102
+ it('should detect "finish it"', () => {
103
+ expect(detectAscent('Finish it completely')).toBe(true);
104
+ });
105
+ it('should detect "finish everything"', () => {
106
+ expect(detectAscent('Finish everything on the list')).toBe(true);
107
+ });
108
+ it('should detect "complete all"', () => {
109
+ expect(detectAscent('Complete all the tasks')).toBe(true);
110
+ });
111
+ it('should detect "complete everything"', () => {
112
+ expect(detectAscent('Complete everything before stopping')).toBe(true);
113
+ });
114
+ it('should detect "until done"', () => {
115
+ expect(detectAscent('Keep working until done')).toBe(true);
116
+ });
117
+ it('should detect "until complete"', () => {
118
+ expect(detectAscent('Continue until complete')).toBe(true);
119
+ });
120
+ it('should detect "until finished"', () => {
121
+ expect(detectAscent('Work until finished')).toBe(true);
122
+ });
123
+ it('should detect "keep going"', () => {
124
+ expect(detectAscent('Keep going until it\'s done')).toBe(true);
125
+ });
126
+ it('should detect "don\'t give up"', () => {
127
+ expect(detectAscent('Don\'t give up on this')).toBe(true);
128
+ });
129
+ it('should detect "dont give up" (no apostrophe)', () => {
130
+ expect(detectAscent('Dont give up')).toBe(true);
131
+ });
132
+ it('should NOT detect "try" (negative pattern)', () => {
133
+ expect(detectAscent('Try to implement this feature')).toBe(false);
134
+ });
135
+ it('should NOT detect "attempt" (negative pattern)', () => {
136
+ expect(detectAscent('Attempt to fix the bug')).toBe(false);
137
+ });
138
+ it('should NOT detect "explore" (negative pattern)', () => {
139
+ expect(detectAscent('Explore the codebase')).toBe(false);
140
+ });
141
+ it('should NOT detect "investigate" (negative pattern)', () => {
142
+ expect(detectAscent('Investigate the issue')).toBe(false);
143
+ });
144
+ it('should NOT detect "check if" (negative pattern)', () => {
145
+ expect(detectAscent('Check if this works')).toBe(false);
146
+ });
147
+ it('should NOT detect "see if" (negative pattern)', () => {
148
+ expect(detectAscent('See if you can fix it')).toBe(false);
149
+ });
150
+ it('should NOT detect unrelated text', () => {
151
+ expect(detectAscent('Create a new feature')).toBe(false);
152
+ });
153
+ it('should NOT detect keywords in code blocks', () => {
154
+ expect(detectAscent('Code:\n```js\nconst msg = "must complete";\n```')).toBe(false);
155
+ });
156
+ it('should be case-insensitive', () => {
157
+ expect(detectAscent('MUST COMPLETE this task')).toBe(true);
158
+ });
159
+ });
160
+ describe('detectSkills', () => {
161
+ it('should detect multiple skills at once', () => {
162
+ const skills = detectSkills('Refactor the button component with new styling and don\'t stop until done');
163
+ expect(skills).toContain('frontend-ui-ux');
164
+ expect(skills).toContain('git-master');
165
+ expect(skills).toContain('ascent');
166
+ expect(skills).toHaveLength(3);
167
+ });
168
+ it('should detect only frontend-ui-ux', () => {
169
+ const skills = detectSkills('Create a modal dialog with form inputs');
170
+ expect(skills).toEqual(['frontend-ui-ux']);
171
+ });
172
+ it('should detect only git-master', () => {
173
+ const skills = detectSkills('Reorganize the folder structure');
174
+ expect(skills).toEqual(['git-master']);
175
+ });
176
+ it('should detect only ascent', () => {
177
+ const skills = detectSkills('Complete all tasks until finished');
178
+ expect(skills).toEqual(['ascent']);
179
+ });
180
+ it('should detect no skills for generic request', () => {
181
+ const skills = detectSkills('Add a new function to utils.ts');
182
+ expect(skills).toEqual([]);
183
+ });
184
+ it('should detect frontend-ui-ux + ascent', () => {
185
+ const skills = detectSkills('Design a beautiful navbar and keep going until perfect');
186
+ expect(skills).toContain('frontend-ui-ux');
187
+ expect(skills).toContain('ascent');
188
+ expect(skills).toHaveLength(2);
189
+ });
190
+ it('should detect git-master + ascent', () => {
191
+ const skills = detectSkills('Refactor the entire codebase and must complete it');
192
+ expect(skills).toContain('git-master');
193
+ expect(skills).toContain('ascent');
194
+ expect(skills).toHaveLength(2);
195
+ });
196
+ it('should respect negative signals (no frontend when backend present)', () => {
197
+ const skills = detectSkills('Create a button component that calls the api endpoint and refactor the code');
198
+ // Should detect git-master but NOT frontend-ui-ux (due to api/endpoint)
199
+ expect(skills).not.toContain('frontend-ui-ux');
200
+ expect(skills).toContain('git-master');
201
+ });
202
+ it('should respect negative patterns for ascent', () => {
203
+ const skills = detectSkills('Try to refactor the code and finish this');
204
+ // Should detect git-master, but NOT ascent (due to "try")
205
+ expect(skills).toContain('git-master');
206
+ expect(skills).not.toContain('ascent');
207
+ });
208
+ it('should return empty array for ambiguous text', () => {
209
+ const skills = detectSkills('Update the file');
210
+ expect(skills).toEqual([]);
211
+ });
212
+ });
213
+ describe('Edge Cases', () => {
214
+ it('should handle empty string', () => {
215
+ expect(detectFrontendUiUx('')).toBe(false);
216
+ expect(detectGitMaster('')).toBe(false);
217
+ expect(detectAscent('')).toBe(false);
218
+ expect(detectSkills('')).toEqual([]);
219
+ });
220
+ it('should handle whitespace-only string', () => {
221
+ expect(detectFrontendUiUx(' \n\t ')).toBe(false);
222
+ expect(detectGitMaster(' \n\t ')).toBe(false);
223
+ expect(detectAscent(' \n\t ')).toBe(false);
224
+ expect(detectSkills(' \n\t ')).toEqual([]);
225
+ });
226
+ it('should handle strings with only code blocks', () => {
227
+ const codeOnly = '```js\nconst button = "component";\nconst ui = "design";\n```';
228
+ expect(detectFrontendUiUx(codeOnly)).toBe(false);
229
+ expect(detectGitMaster(codeOnly)).toBe(false);
230
+ expect(detectAscent(codeOnly)).toBe(false);
231
+ expect(detectSkills(codeOnly)).toEqual([]);
232
+ });
233
+ it('should handle multiple code blocks with text', () => {
234
+ const mixed = 'Create a button ```code here``` and modal ```more code``` with styling';
235
+ expect(detectFrontendUiUx(mixed)).toBe(true);
236
+ });
237
+ it('should handle partial word matches correctly ("trying" does not match "try")', () => {
238
+ // "trying" contains "try" but word boundaries prevent false match
239
+ // "finish this" IS a positive signal, and "trying" doesn't negate it
240
+ // This correctly detects ascent because "finish this" is present
241
+ expect(detectAscent('Finish this by trying harder')).toBe(true);
242
+ });
243
+ it('should reject when "try" appears as complete word', () => {
244
+ // "try" as a complete word should prevent ascent detection
245
+ expect(detectAscent('Try to finish this')).toBe(false);
246
+ });
247
+ it('should handle contractions with and without apostrophes', () => {
248
+ expect(detectAscent('Don\'t stop')).toBe(true);
249
+ expect(detectAscent('Dont stop')).toBe(true);
250
+ expect(detectAscent('Don\'t give up')).toBe(true);
251
+ expect(detectAscent('Dont give up')).toBe(true);
252
+ });
253
+ });
254
+ });
255
+ //# sourceMappingURL=skill-auto-detection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-auto-detection.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-auto-detection.test.ts"],"names":[],"mappings":"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"}