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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
2
|
import { readJsonFile, writeJsonFile } from './storage.js';
|
|
3
3
|
import { randomUUID } from 'crypto';
|
|
4
|
+
import { getSessionBaseline } from './baselines.js';
|
|
4
5
|
const MAX_RECENT_PROMPTS = 10;
|
|
5
6
|
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
6
7
|
/** Get session state file path */
|
|
@@ -8,7 +9,8 @@ export function getSessionStatePath(directory) {
|
|
|
8
9
|
return join(directory, '.olympus', 'session-state.json');
|
|
9
10
|
}
|
|
10
11
|
/** Create fresh session state */
|
|
11
|
-
export function createSessionState(sessionId) {
|
|
12
|
+
export function createSessionState(sessionId, projectPath) {
|
|
13
|
+
const baseline = getSessionBaseline(projectPath);
|
|
12
14
|
return {
|
|
13
15
|
session_id: sessionId || randomUUID(),
|
|
14
16
|
started_at: new Date().toISOString(),
|
|
@@ -16,6 +18,13 @@ export function createSessionState(sessionId) {
|
|
|
16
18
|
recent_prompts: [],
|
|
17
19
|
pending_completion: null,
|
|
18
20
|
todo_snapshot: null,
|
|
21
|
+
token_budget: {
|
|
22
|
+
session_baseline: baseline,
|
|
23
|
+
current_usage: 0,
|
|
24
|
+
warning_threshold: 1.5,
|
|
25
|
+
warning_issued: false,
|
|
26
|
+
started_at: new Date().toISOString()
|
|
27
|
+
}
|
|
19
28
|
};
|
|
20
29
|
}
|
|
21
30
|
/** Load or create session state */
|
|
@@ -23,13 +32,24 @@ export function loadSessionState(directory, sessionId) {
|
|
|
23
32
|
const path = getSessionStatePath(directory);
|
|
24
33
|
const state = readJsonFile(path, null);
|
|
25
34
|
if (!state) {
|
|
26
|
-
return createSessionState(sessionId);
|
|
35
|
+
return createSessionState(sessionId, directory);
|
|
27
36
|
}
|
|
28
37
|
// Check for session timeout
|
|
29
38
|
const lastUpdate = new Date(state.last_updated).getTime();
|
|
30
39
|
const now = Date.now();
|
|
31
40
|
if (now - lastUpdate > SESSION_TIMEOUT_MS) {
|
|
32
|
-
return createSessionState(sessionId);
|
|
41
|
+
return createSessionState(sessionId, directory);
|
|
42
|
+
}
|
|
43
|
+
// Initialize token_budget if missing (backward compatibility)
|
|
44
|
+
if (!state.token_budget) {
|
|
45
|
+
const baseline = getSessionBaseline(directory);
|
|
46
|
+
state.token_budget = {
|
|
47
|
+
session_baseline: baseline,
|
|
48
|
+
current_usage: 0,
|
|
49
|
+
warning_threshold: 1.5,
|
|
50
|
+
warning_issued: false,
|
|
51
|
+
started_at: state.started_at
|
|
52
|
+
};
|
|
33
53
|
}
|
|
34
54
|
return state;
|
|
35
55
|
}
|
|
@@ -75,4 +95,53 @@ export function hasPendingCompletion(state) {
|
|
|
75
95
|
const now = Date.now();
|
|
76
96
|
return now - claimedAt < 5 * 60 * 1000;
|
|
77
97
|
}
|
|
98
|
+
/** Initialize token budget for session */
|
|
99
|
+
export function initializeTokenBudget(state, projectPath) {
|
|
100
|
+
const baseline = getSessionBaseline(projectPath);
|
|
101
|
+
state.token_budget = {
|
|
102
|
+
session_baseline: baseline,
|
|
103
|
+
current_usage: 0,
|
|
104
|
+
warning_threshold: 1.5,
|
|
105
|
+
warning_issued: false,
|
|
106
|
+
started_at: new Date().toISOString()
|
|
107
|
+
};
|
|
108
|
+
state.last_updated = new Date().toISOString();
|
|
109
|
+
return state;
|
|
110
|
+
}
|
|
111
|
+
/** Update token budget with new usage */
|
|
112
|
+
export function updateTokenBudget(state, tokensUsed) {
|
|
113
|
+
if (!state.token_budget) {
|
|
114
|
+
state.token_budget = {
|
|
115
|
+
session_baseline: getSessionBaseline(),
|
|
116
|
+
current_usage: 0,
|
|
117
|
+
warning_threshold: 1.5,
|
|
118
|
+
warning_issued: false,
|
|
119
|
+
started_at: new Date().toISOString()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
state.token_budget.current_usage += tokensUsed;
|
|
123
|
+
state.last_updated = new Date().toISOString();
|
|
124
|
+
return state;
|
|
125
|
+
}
|
|
126
|
+
/** Mark that warning has been issued */
|
|
127
|
+
export function markWarningIssued(state) {
|
|
128
|
+
if (state.token_budget) {
|
|
129
|
+
state.token_budget.warning_issued = true;
|
|
130
|
+
state.last_updated = new Date().toISOString();
|
|
131
|
+
}
|
|
132
|
+
return state;
|
|
133
|
+
}
|
|
134
|
+
/** Check if budget warning should be issued */
|
|
135
|
+
export function shouldIssueWarning(state) {
|
|
136
|
+
if (!state.token_budget)
|
|
137
|
+
return false;
|
|
138
|
+
if (state.token_budget.warning_issued)
|
|
139
|
+
return false;
|
|
140
|
+
const threshold = state.token_budget.session_baseline * state.token_budget.warning_threshold;
|
|
141
|
+
return state.token_budget.current_usage >= threshold;
|
|
142
|
+
}
|
|
143
|
+
/** Get current token budget info */
|
|
144
|
+
export function getTokenBudgetInfo(state) {
|
|
145
|
+
return state.token_budget ?? null;
|
|
146
|
+
}
|
|
78
147
|
//# sourceMappingURL=session-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/learning/session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FeedbackEntry } from './types.js';
|
|
1
|
+
import type { FeedbackEntry, AgentPerformance } from './types.js';
|
|
2
2
|
/** Get learning storage directory (cross-platform) */
|
|
3
3
|
export declare function getLearningDir(): string;
|
|
4
4
|
/** Get project-specific learning directory */
|
|
@@ -13,6 +13,26 @@ declare function rotateIfNeeded(filePath: string, maxLines?: number): void;
|
|
|
13
13
|
export declare function appendFeedback(entry: FeedbackEntry): void;
|
|
14
14
|
/** Read feedback log */
|
|
15
15
|
export declare function readFeedbackLog(): FeedbackEntry[];
|
|
16
|
+
/** Save feedback entry (alias for appendFeedback) */
|
|
17
|
+
export declare function saveFeedback(entry: FeedbackEntry): void;
|
|
18
|
+
/** Load feedback entries (alias for readFeedbackLog) */
|
|
19
|
+
export declare function loadFeedback(): FeedbackEntry[];
|
|
20
|
+
/**
|
|
21
|
+
* Update agent performance metrics with token efficiency
|
|
22
|
+
* Recalculates token_efficiency based on feedback entries with token usage
|
|
23
|
+
*/
|
|
24
|
+
export declare function updateAgentPerformance(agentName: string, feedbackEntries: FeedbackEntry[]): AgentPerformance | null;
|
|
25
|
+
/**
|
|
26
|
+
* Get session baseline for token budgeting
|
|
27
|
+
* Default to 10000 tokens if not configured
|
|
28
|
+
*/
|
|
29
|
+
export declare function getSessionBaseline(config?: {
|
|
30
|
+
learning?: {
|
|
31
|
+
tokenMetrics?: {
|
|
32
|
+
sessionBaseline?: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}): number;
|
|
16
36
|
/** Read JSON file with type safety and error handling */
|
|
17
37
|
export declare function readJsonFile<T>(path: string, defaultValue: T): T;
|
|
18
38
|
/** Write JSON file with error handling */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAMnF,sDAAsD;AACtD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,8CAA8C;AAC9C,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7D;AAED,qDAAqD;AACrD,iBAAS,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAwB,GAAG,IAAI,CAiBlF;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQzD;AAED,wBAAwB;AACxB,wBAAgB,eAAe,IAAI,aAAa,EAAE,CASjD;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEvD;AAED,wDAAwD;AACxD,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAE9C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,aAAa,EAAE,GAC/B,gBAAgB,GAAG,IAAI,CA4EzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAElH;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAQhE;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAWhE;AAED,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/learning/storage.js
CHANGED
|
@@ -2,6 +2,7 @@ import { homedir } from 'os';
|
|
|
2
2
|
import { join, resolve, dirname } from 'path';
|
|
3
3
|
import { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync, renameSync } from 'fs';
|
|
4
4
|
import { createHash } from 'crypto';
|
|
5
|
+
import { getTokenUsage, safeTokenTotal } from './utils.js';
|
|
5
6
|
/** Maximum lines before rotating JSONL files */
|
|
6
7
|
const MAX_JSONL_LINES = 10000;
|
|
7
8
|
/** Get learning storage directory (cross-platform) */
|
|
@@ -68,6 +69,89 @@ export function readFeedbackLog() {
|
|
|
68
69
|
.filter(line => line.trim())
|
|
69
70
|
.map(line => JSON.parse(line));
|
|
70
71
|
}
|
|
72
|
+
/** Save feedback entry (alias for appendFeedback) */
|
|
73
|
+
export function saveFeedback(entry) {
|
|
74
|
+
appendFeedback(entry);
|
|
75
|
+
}
|
|
76
|
+
/** Load feedback entries (alias for readFeedbackLog) */
|
|
77
|
+
export function loadFeedback() {
|
|
78
|
+
return readFeedbackLog();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Update agent performance metrics with token efficiency
|
|
82
|
+
* Recalculates token_efficiency based on feedback entries with token usage
|
|
83
|
+
*/
|
|
84
|
+
export function updateAgentPerformance(agentName, feedbackEntries) {
|
|
85
|
+
const agentEntries = feedbackEntries.filter(e => e.agent_used === agentName);
|
|
86
|
+
if (agentEntries.length === 0) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
// Basic performance metrics
|
|
90
|
+
const totalInvocations = agentEntries.length;
|
|
91
|
+
const successCount = agentEntries.filter(e => e.event_type === 'success').length;
|
|
92
|
+
const revisionCount = agentEntries.filter(e => e.event_type === 'revision').length;
|
|
93
|
+
const cancellationCount = agentEntries.filter(e => e.event_type === 'cancellation').length;
|
|
94
|
+
const successRate = totalInvocations > 0 ? successCount / totalInvocations : 0;
|
|
95
|
+
// Token efficiency metrics
|
|
96
|
+
let tokenEfficiency;
|
|
97
|
+
const entriesWithTokens = agentEntries.filter(e => getTokenUsage(e) !== null);
|
|
98
|
+
if (entriesWithTokens.length > 0) {
|
|
99
|
+
const successEntries = entriesWithTokens.filter(e => e.event_type === 'success');
|
|
100
|
+
const failureEntries = entriesWithTokens.filter(e => e.event_type === 'revision' || e.event_type === 'cancellation');
|
|
101
|
+
const totalTokens = entriesWithTokens.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
102
|
+
const successTokens = successEntries.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
103
|
+
const failureTokens = failureEntries.reduce((sum, e) => sum + safeTokenTotal(e), 0);
|
|
104
|
+
const avgTokensPerSuccess = successEntries.length > 0 ? successTokens / successEntries.length : 0;
|
|
105
|
+
const avgTokensPerFailure = failureEntries.length > 0 ? failureTokens / failureEntries.length : 0;
|
|
106
|
+
tokenEfficiency = {
|
|
107
|
+
avg_tokens_per_success: avgTokensPerSuccess,
|
|
108
|
+
avg_tokens_per_failure: avgTokensPerFailure,
|
|
109
|
+
total_tokens: totalTokens,
|
|
110
|
+
invocation_count: entriesWithTokens.length,
|
|
111
|
+
efficiency_score: avgTokensPerSuccess,
|
|
112
|
+
trend: 'insufficient_data'
|
|
113
|
+
};
|
|
114
|
+
// Calculate trend (simple heuristic: compare first half vs second half)
|
|
115
|
+
if (entriesWithTokens.length >= 10) {
|
|
116
|
+
const midpoint = Math.floor(entriesWithTokens.length / 2);
|
|
117
|
+
const firstHalf = entriesWithTokens.slice(0, midpoint);
|
|
118
|
+
const secondHalf = entriesWithTokens.slice(midpoint);
|
|
119
|
+
const firstAvg = firstHalf.reduce((sum, e) => sum + safeTokenTotal(e), 0) / firstHalf.length;
|
|
120
|
+
const secondAvg = secondHalf.reduce((sum, e) => sum + safeTokenTotal(e), 0) / secondHalf.length;
|
|
121
|
+
const difference = secondAvg - firstAvg;
|
|
122
|
+
const threshold = firstAvg * 0.1; // 10% threshold
|
|
123
|
+
if (Math.abs(difference) < threshold) {
|
|
124
|
+
tokenEfficiency.trend = 'stable';
|
|
125
|
+
}
|
|
126
|
+
else if (difference < 0) {
|
|
127
|
+
tokenEfficiency.trend = 'improving'; // Fewer tokens is better
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
tokenEfficiency.trend = 'declining';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
agent_name: agentName,
|
|
136
|
+
total_invocations: totalInvocations,
|
|
137
|
+
success_count: successCount,
|
|
138
|
+
revision_count: revisionCount,
|
|
139
|
+
cancellation_count: cancellationCount,
|
|
140
|
+
success_rate: successRate,
|
|
141
|
+
failure_patterns: [],
|
|
142
|
+
strong_areas: [],
|
|
143
|
+
weak_areas: [],
|
|
144
|
+
last_updated: new Date().toISOString(),
|
|
145
|
+
token_efficiency: tokenEfficiency
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get session baseline for token budgeting
|
|
150
|
+
* Default to 10000 tokens if not configured
|
|
151
|
+
*/
|
|
152
|
+
export function getSessionBaseline(config) {
|
|
153
|
+
return config?.learning?.tokenMetrics?.sessionBaseline ?? 10000;
|
|
154
|
+
}
|
|
71
155
|
/** Read JSON file with type safety and error handling */
|
|
72
156
|
export function readJsonFile(path, defaultValue) {
|
|
73
157
|
if (!existsSync(path))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation utilities for Olympus learning system
|
|
3
|
+
*
|
|
4
|
+
* Uses gpt-tokenizer for accurate token counting with fallback to character-based estimation.
|
|
5
|
+
* Token counts are approximations for tracking trends, not exact billing calculations.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Main token estimation function
|
|
9
|
+
*
|
|
10
|
+
* @param text - Text to estimate tokens for
|
|
11
|
+
* @returns Estimated token count
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const tokens = await estimateTokens("Hello, world!");
|
|
16
|
+
* console.log(tokens); // ~4 tokens
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function estimateTokens(text: string): Promise<number>;
|
|
20
|
+
/**
|
|
21
|
+
* Estimate tokens from tool output (handles various result formats)
|
|
22
|
+
*
|
|
23
|
+
* @param output - Tool output object (from Claude Code SDK)
|
|
24
|
+
* @returns Estimated token count
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const readResult = { content: "file contents..." };
|
|
29
|
+
* const tokens = await estimateTokensFromToolOutput(readResult);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function estimateTokensFromToolOutput(output: unknown): Promise<number>;
|
|
33
|
+
/**
|
|
34
|
+
* Synchronous version of estimateTokens using only character-based estimation
|
|
35
|
+
* Useful when async operations aren't possible
|
|
36
|
+
*
|
|
37
|
+
* @param text - Text to estimate tokens for
|
|
38
|
+
* @returns Estimated token count (character-based)
|
|
39
|
+
*/
|
|
40
|
+
export declare function estimateTokensSync(text: string): number;
|
|
41
|
+
//# sourceMappingURL=token-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/learning/token-estimator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBlE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation utilities for Olympus learning system
|
|
3
|
+
*
|
|
4
|
+
* Uses gpt-tokenizer for accurate token counting with fallback to character-based estimation.
|
|
5
|
+
* Token counts are approximations for tracking trends, not exact billing calculations.
|
|
6
|
+
*/
|
|
7
|
+
let encode = null;
|
|
8
|
+
let tokenizerInitialized = false;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the GPT tokenizer (lazy-loaded)
|
|
11
|
+
*/
|
|
12
|
+
async function initTokenizer() {
|
|
13
|
+
if (tokenizerInitialized)
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
// Dynamic import for gpt-tokenizer
|
|
17
|
+
const { encode: gptEncode } = await import('gpt-tokenizer');
|
|
18
|
+
encode = gptEncode;
|
|
19
|
+
tokenizerInitialized = true;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
// Tokenizer unavailable, will fall back to character counting
|
|
23
|
+
tokenizerInitialized = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Estimate token count using character-based heuristic
|
|
28
|
+
* Claude/GPT-4 average: ~1 token per 4 characters
|
|
29
|
+
*/
|
|
30
|
+
function estimateTokensByCharacters(text) {
|
|
31
|
+
return Math.ceil(text.length / 4);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Main token estimation function
|
|
35
|
+
*
|
|
36
|
+
* @param text - Text to estimate tokens for
|
|
37
|
+
* @returns Estimated token count
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const tokens = await estimateTokens("Hello, world!");
|
|
42
|
+
* console.log(tokens); // ~4 tokens
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export async function estimateTokens(text) {
|
|
46
|
+
if (!text || text.length === 0) {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
await initTokenizer();
|
|
50
|
+
try {
|
|
51
|
+
if (encode) {
|
|
52
|
+
const tokens = encode(text);
|
|
53
|
+
return tokens.length;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Fall through to character-based estimation
|
|
58
|
+
}
|
|
59
|
+
return estimateTokensByCharacters(text);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Estimate tokens from tool output (handles various result formats)
|
|
63
|
+
*
|
|
64
|
+
* @param output - Tool output object (from Claude Code SDK)
|
|
65
|
+
* @returns Estimated token count
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* const readResult = { content: "file contents..." };
|
|
70
|
+
* const tokens = await estimateTokensFromToolOutput(readResult);
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export async function estimateTokensFromToolOutput(output) {
|
|
74
|
+
if (!output) {
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
// Handle common tool output formats
|
|
78
|
+
if (typeof output === 'object' && output !== null) {
|
|
79
|
+
// Check for common content fields
|
|
80
|
+
const obj = output;
|
|
81
|
+
if ('content' in obj && typeof obj.content === 'string') {
|
|
82
|
+
return estimateTokens(obj.content);
|
|
83
|
+
}
|
|
84
|
+
if ('output' in obj && typeof obj.output === 'string') {
|
|
85
|
+
return estimateTokens(obj.output);
|
|
86
|
+
}
|
|
87
|
+
if ('text' in obj && typeof obj.text === 'string') {
|
|
88
|
+
return estimateTokens(obj.text);
|
|
89
|
+
}
|
|
90
|
+
if ('result' in obj && typeof obj.result === 'string') {
|
|
91
|
+
return estimateTokens(obj.result);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Fallback: stringify entire object
|
|
95
|
+
const text = typeof output === 'string' ? output : JSON.stringify(output);
|
|
96
|
+
return estimateTokens(text);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Synchronous version of estimateTokens using only character-based estimation
|
|
100
|
+
* Useful when async operations aren't possible
|
|
101
|
+
*
|
|
102
|
+
* @param text - Text to estimate tokens for
|
|
103
|
+
* @returns Estimated token count (character-based)
|
|
104
|
+
*/
|
|
105
|
+
export function estimateTokensSync(text) {
|
|
106
|
+
if (!text || text.length === 0) {
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
return estimateTokensByCharacters(text);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../src/learning/token-estimator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,IAAI,MAAM,GAAwC,IAAI,CAAC;AACvD,IAAI,oBAAoB,GAAG,KAAK,CAAC;AAEjC;;GAEG;AACH,KAAK,UAAU,aAAa;IAC1B,IAAI,oBAAoB;QAAE,OAAO;IAEjC,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC5D,MAAM,GAAG,SAAS,CAAC;QACnB,oBAAoB,GAAG,IAAI,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8DAA8D;QAC9D,oBAAoB,GAAG,IAAI,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6CAA6C;IAC/C,CAAC;IAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,MAAe;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC;IAED,oCAAoC;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,kCAAkC;QAClC,MAAM,GAAG,GAAG,MAAiC,CAAC;QAE9C,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxD,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1E,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/learning/types.d.ts
CHANGED
|
@@ -15,6 +15,13 @@ export interface HookInput {
|
|
|
15
15
|
* Session state maintained across hook invocations
|
|
16
16
|
* Stored in .olympus/session-state.json
|
|
17
17
|
*/
|
|
18
|
+
export interface TokenBudget {
|
|
19
|
+
session_baseline: number;
|
|
20
|
+
current_usage: number;
|
|
21
|
+
warning_threshold: number;
|
|
22
|
+
warning_issued: boolean;
|
|
23
|
+
started_at: string;
|
|
24
|
+
}
|
|
18
25
|
export interface SessionState {
|
|
19
26
|
session_id: string;
|
|
20
27
|
started_at: string;
|
|
@@ -34,8 +41,22 @@ export interface SessionState {
|
|
|
34
41
|
completed: number;
|
|
35
42
|
pending: number;
|
|
36
43
|
} | null;
|
|
44
|
+
token_budget?: TokenBudget;
|
|
37
45
|
}
|
|
38
46
|
export type FeedbackCategory = 'correction' | 'rejection' | 'clarification' | 'enhancement' | 'praise' | 'explicit_preference';
|
|
47
|
+
export interface TokenUsage {
|
|
48
|
+
input_tokens: number;
|
|
49
|
+
output_tokens: number;
|
|
50
|
+
total_tokens: number;
|
|
51
|
+
estimated: boolean;
|
|
52
|
+
model?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface CostEstimate {
|
|
55
|
+
input_cost: number;
|
|
56
|
+
output_cost: number;
|
|
57
|
+
total_cost: number;
|
|
58
|
+
pricing_version: string;
|
|
59
|
+
}
|
|
39
60
|
export interface FeedbackEntry {
|
|
40
61
|
id: string;
|
|
41
62
|
timestamp: string;
|
|
@@ -49,6 +70,8 @@ export interface FeedbackEntry {
|
|
|
49
70
|
feedback_category: FeedbackCategory;
|
|
50
71
|
extracted_lesson?: string;
|
|
51
72
|
confidence: number;
|
|
73
|
+
token_usage?: TokenUsage;
|
|
74
|
+
cost_estimate?: CostEstimate;
|
|
52
75
|
}
|
|
53
76
|
export interface UserPreferences {
|
|
54
77
|
verbosity: 'concise' | 'detailed' | 'unknown';
|
|
@@ -64,6 +87,14 @@ export interface UserPreferences {
|
|
|
64
87
|
}>;
|
|
65
88
|
last_updated: string;
|
|
66
89
|
}
|
|
90
|
+
export interface TokenEfficiency {
|
|
91
|
+
avg_tokens_per_success: number;
|
|
92
|
+
avg_tokens_per_failure: number;
|
|
93
|
+
total_tokens: number;
|
|
94
|
+
invocation_count: number;
|
|
95
|
+
efficiency_score: number;
|
|
96
|
+
trend: 'improving' | 'declining' | 'stable' | 'insufficient_data';
|
|
97
|
+
}
|
|
67
98
|
export interface AgentPerformance {
|
|
68
99
|
agent_name: string;
|
|
69
100
|
total_invocations: number;
|
|
@@ -79,6 +110,7 @@ export interface AgentPerformance {
|
|
|
79
110
|
strong_areas: string[];
|
|
80
111
|
weak_areas: string[];
|
|
81
112
|
last_updated: string;
|
|
113
|
+
token_efficiency?: TokenEfficiency;
|
|
82
114
|
}
|
|
83
115
|
export interface ProjectPatterns {
|
|
84
116
|
project_hash: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/learning/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAGrB,cAAc,EAAE,KAAK,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;KACtC,CAAC,CAAC;IAGH,kBAAkB,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC;IAGT,aAAa,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/learning/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guards and safe accessor utilities for learning system
|
|
3
|
+
* No external dependencies - using Node.js built-ins only
|
|
4
|
+
*/
|
|
5
|
+
import type { FeedbackEntry, AgentPerformance, TokenUsage } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Safely extract token usage from feedback entry
|
|
8
|
+
* Returns null if token_usage is undefined or invalid
|
|
9
|
+
*/
|
|
10
|
+
export declare function getTokenUsage(entry: FeedbackEntry): TokenUsage | null;
|
|
11
|
+
/**
|
|
12
|
+
* Safely extract efficiency score from agent performance
|
|
13
|
+
* Returns 0 if token_efficiency is undefined
|
|
14
|
+
*/
|
|
15
|
+
export declare function getEfficiencyScore(perf: AgentPerformance): number;
|
|
16
|
+
/**
|
|
17
|
+
* Check if agent performance has minimum sample size for reliable metrics
|
|
18
|
+
* Default minimum is 5 invocations
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasMinimumSamples(perf: AgentPerformance, minimum?: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Safely get total tokens from feedback entry
|
|
23
|
+
* Returns 0 if token_usage is undefined or invalid
|
|
24
|
+
*/
|
|
25
|
+
export declare function safeTokenTotal(entry: FeedbackEntry): number;
|
|
26
|
+
/**
|
|
27
|
+
* Type guard: check if value is a valid TokenUsage object
|
|
28
|
+
*/
|
|
29
|
+
export declare function isTokenUsage(value: unknown): value is TokenUsage;
|
|
30
|
+
/**
|
|
31
|
+
* Type guard: check if feedback entry has token metrics
|
|
32
|
+
*/
|
|
33
|
+
export declare function hasTokenMetrics(entry: FeedbackEntry): entry is FeedbackEntry & {
|
|
34
|
+
token_usage: TokenUsage;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Type guard: check if agent performance has efficiency metrics
|
|
38
|
+
*/
|
|
39
|
+
export declare function hasEfficiencyMetrics(perf: AgentPerformance): perf is AgentPerformance & {
|
|
40
|
+
token_efficiency: NonNullable<AgentPerformance['token_efficiency']>;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/learning/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9E;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,IAAI,CAkBrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAMjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAMtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAYhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,aAAa,GAAG;IAC9E,WAAW,EAAE,UAAU,CAAC;CACzB,CAEA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,IAAI,gBAAgB,GAAG;IACvF,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;CACrE,CAEA"}
|