olympus-ai 2.5.2 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/learning/agent-evaluator.test.d.ts +2 -0
- package/dist/__tests__/learning/agent-evaluator.test.d.ts.map +1 -0
- package/dist/__tests__/learning/agent-evaluator.test.js +29 -0
- package/dist/__tests__/learning/agent-evaluator.test.js.map +1 -0
- package/dist/__tests__/learning/discovery.test.d.ts +2 -0
- package/dist/__tests__/learning/discovery.test.d.ts.map +1 -0
- package/dist/__tests__/learning/discovery.test.js +70 -0
- package/dist/__tests__/learning/discovery.test.js.map +1 -0
- package/dist/__tests__/learning/fixtures/mock-feedback.d.ts +14 -0
- package/dist/__tests__/learning/fixtures/mock-feedback.d.ts.map +1 -0
- package/dist/__tests__/learning/fixtures/mock-feedback.js +146 -0
- package/dist/__tests__/learning/fixtures/mock-feedback.js.map +1 -0
- package/dist/__tests__/learning/pattern-extractor.test.d.ts +2 -0
- package/dist/__tests__/learning/pattern-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/learning/pattern-extractor.test.js +30 -0
- package/dist/__tests__/learning/pattern-extractor.test.js.map +1 -0
- package/dist/__tests__/learning/revision-detector.test.d.ts +2 -0
- package/dist/__tests__/learning/revision-detector.test.d.ts.map +1 -0
- package/dist/__tests__/learning/revision-detector.test.js +54 -0
- package/dist/__tests__/learning/revision-detector.test.js.map +1 -0
- package/dist/cli/index.js +264 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/agent-usage-reminder/index.d.ts +1 -0
- package/dist/hooks/agent-usage-reminder/index.d.ts.map +1 -1
- package/dist/hooks/agent-usage-reminder/index.js +107 -0
- package/dist/hooks/agent-usage-reminder/index.js.map +1 -1
- package/dist/hooks/agent-usage-reminder/index.test.d.ts +5 -0
- package/dist/hooks/agent-usage-reminder/index.test.d.ts.map +1 -0
- package/dist/hooks/agent-usage-reminder/index.test.js +141 -0
- package/dist/hooks/agent-usage-reminder/index.test.js.map +1 -0
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +14 -2
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/keyword-detector/index.d.ts +1 -1
- package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
- package/dist/hooks/keyword-detector/index.js +2 -1
- package/dist/hooks/keyword-detector/index.js.map +1 -1
- package/dist/hooks/olympus-hooks.cjs +162 -67
- package/dist/hooks/olympus-state/index.d.ts +69 -0
- package/dist/hooks/olympus-state/index.d.ts.map +1 -0
- package/dist/hooks/olympus-state/index.js +226 -0
- package/dist/hooks/olympus-state/index.js.map +1 -0
- package/dist/hooks/persistent-mode/index.d.ts +7 -6
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +94 -5
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/registrations/session-start.d.ts.map +1 -1
- package/dist/hooks/registrations/session-start.js +26 -0
- package/dist/hooks/registrations/session-start.js.map +1 -1
- package/dist/hooks/registrations/stop.d.ts.map +1 -1
- package/dist/hooks/registrations/stop.js +25 -0
- package/dist/hooks/registrations/stop.js.map +1 -1
- package/dist/hooks/registrations/user-prompt-submit.d.ts.map +1 -1
- package/dist/hooks/registrations/user-prompt-submit.js +34 -0
- package/dist/hooks/registrations/user-prompt-submit.js.map +1 -1
- package/dist/installer/hooks.d.ts +7 -1
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +61 -2
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +40 -14
- package/dist/installer/index.js.map +1 -1
- package/dist/learning/agent-evaluator.d.ts +6 -0
- package/dist/learning/agent-evaluator.d.ts.map +1 -0
- package/dist/learning/agent-evaluator.js +116 -0
- package/dist/learning/agent-evaluator.js.map +1 -0
- package/dist/learning/discovery-validator.d.ts +21 -0
- package/dist/learning/discovery-validator.d.ts.map +1 -0
- package/dist/learning/discovery-validator.js +75 -0
- package/dist/learning/discovery-validator.js.map +1 -0
- package/dist/learning/discovery.d.ts +20 -0
- package/dist/learning/discovery.d.ts.map +1 -0
- package/dist/learning/discovery.js +141 -0
- package/dist/learning/discovery.js.map +1 -0
- package/dist/learning/hooks/cancellation-detector.d.ts +8 -0
- package/dist/learning/hooks/cancellation-detector.d.ts.map +1 -0
- package/dist/learning/hooks/cancellation-detector.js +64 -0
- package/dist/learning/hooks/cancellation-detector.js.map +1 -0
- package/dist/learning/hooks/learned-context.d.ts +6 -0
- package/dist/learning/hooks/learned-context.d.ts.map +1 -0
- package/dist/learning/hooks/learned-context.js +104 -0
- package/dist/learning/hooks/learned-context.js.map +1 -0
- package/dist/learning/hooks/revision-detector.d.ts +9 -0
- package/dist/learning/hooks/revision-detector.d.ts.map +1 -0
- package/dist/learning/hooks/revision-detector.js +92 -0
- package/dist/learning/hooks/revision-detector.js.map +1 -0
- package/dist/learning/hooks/success-detector.d.ts +4 -0
- package/dist/learning/hooks/success-detector.d.ts.map +1 -0
- package/dist/learning/hooks/success-detector.js +58 -0
- package/dist/learning/hooks/success-detector.js.map +1 -0
- package/dist/learning/index.d.ts +10 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +17 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/migrate-notepads.d.ts +6 -0
- package/dist/learning/migrate-notepads.d.ts.map +1 -0
- package/dist/learning/migrate-notepads.js +77 -0
- package/dist/learning/migrate-notepads.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +6 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +106 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/preference-learner.d.ts +6 -0
- package/dist/learning/preference-learner.d.ts.map +1 -0
- package/dist/learning/preference-learner.js +96 -0
- package/dist/learning/preference-learner.js.map +1 -0
- package/dist/learning/prompt-patcher.d.ts +24 -0
- package/dist/learning/prompt-patcher.d.ts.map +1 -0
- package/dist/learning/prompt-patcher.js +120 -0
- package/dist/learning/prompt-patcher.js.map +1 -0
- package/dist/learning/session-state.d.ts +18 -0
- package/dist/learning/session-state.d.ts.map +1 -0
- package/dist/learning/session-state.js +78 -0
- package/dist/learning/session-state.js.map +1 -0
- package/dist/learning/storage.d.ts +18 -0
- package/dist/learning/storage.d.ts.map +1 -0
- package/dist/learning/storage.js +74 -0
- package/dist/learning/storage.js.map +1 -0
- package/dist/learning/types.d.ts +138 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/learning/types.js +6 -0
- package/dist/learning/types.js.map +1 -0
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-validator.js","sourceRoot":"","sources":["../../src/learning/discovery-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentDiscovery, DiscoverySummary } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Record a discovery made by an agent during work.
|
|
4
|
+
* This is the primary API for agents to capture learnings.
|
|
5
|
+
*/
|
|
6
|
+
export declare function recordDiscovery(discovery: Omit<AgentDiscovery, 'id' | 'timestamp' | 'verified' | 'verification_count' | 'last_useful'>): AgentDiscovery;
|
|
7
|
+
/**
|
|
8
|
+
* Read all discoveries for a project (includes global discoveries).
|
|
9
|
+
*/
|
|
10
|
+
export declare function readDiscoveries(projectPath: string): DiscoverySummary;
|
|
11
|
+
/**
|
|
12
|
+
* Mark a discovery as useful (increments verification_count).
|
|
13
|
+
*/
|
|
14
|
+
export declare function markDiscoveryUseful(discoveryId: string, projectPath: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get discoveries relevant for context injection.
|
|
17
|
+
* Returns top discoveries filtered by recency and usefulness.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDiscoveriesForInjection(projectPath: string, maxCount?: number): AgentDiscovery[];
|
|
20
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/learning/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAqB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtF;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,GAAG,UAAU,GAAG,oBAAoB,GAAG,aAAa,CAAC,GACtG,cAAc,CAqBhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAkCrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAwClF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAW,GACpB,cAAc,EAAE,CAuBlB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { join, dirname } from 'path';
|
|
2
|
+
import { appendFileSync, readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
4
|
+
import { getLearningDir, getProjectLearningDir, ensureLearningDirs } from './storage.js';
|
|
5
|
+
/**
|
|
6
|
+
* Record a discovery made by an agent during work.
|
|
7
|
+
* This is the primary API for agents to capture learnings.
|
|
8
|
+
*/
|
|
9
|
+
export function recordDiscovery(discovery) {
|
|
10
|
+
const entry = {
|
|
11
|
+
...discovery,
|
|
12
|
+
id: randomUUID(),
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
verified: false,
|
|
15
|
+
verification_count: 0,
|
|
16
|
+
last_useful: new Date().toISOString(),
|
|
17
|
+
};
|
|
18
|
+
// Determine storage location
|
|
19
|
+
const storageDir = entry.scope === 'global'
|
|
20
|
+
? getLearningDir()
|
|
21
|
+
: getProjectLearningDir(entry.project_path);
|
|
22
|
+
ensureLearningDirs(entry.project_path);
|
|
23
|
+
const filePath = join(storageDir, 'discoveries.jsonl');
|
|
24
|
+
appendFileSync(filePath, JSON.stringify(entry) + '\n', 'utf-8');
|
|
25
|
+
return entry;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read all discoveries for a project (includes global discoveries).
|
|
29
|
+
*/
|
|
30
|
+
export function readDiscoveries(projectPath) {
|
|
31
|
+
const globalPath = join(getLearningDir(), 'discoveries.jsonl');
|
|
32
|
+
const projectDir = getProjectLearningDir(projectPath);
|
|
33
|
+
const projectDiscoveriesPath = join(projectDir, 'discoveries.jsonl');
|
|
34
|
+
const globalDiscoveries = readDiscoveryFile(globalPath);
|
|
35
|
+
const projectDiscoveries = readDiscoveryFile(projectDiscoveriesPath);
|
|
36
|
+
// Calculate statistics
|
|
37
|
+
const all = [...globalDiscoveries, ...projectDiscoveries];
|
|
38
|
+
const categories = {
|
|
39
|
+
technical_insight: 0,
|
|
40
|
+
workaround: 0,
|
|
41
|
+
pattern: 0,
|
|
42
|
+
gotcha: 0,
|
|
43
|
+
performance: 0,
|
|
44
|
+
dependency: 0,
|
|
45
|
+
configuration: 0,
|
|
46
|
+
};
|
|
47
|
+
for (const d of all) {
|
|
48
|
+
categories[d.category]++;
|
|
49
|
+
}
|
|
50
|
+
// Sort by verification count for most_useful
|
|
51
|
+
const sorted = [...all].sort((a, b) => b.verification_count - a.verification_count);
|
|
52
|
+
return {
|
|
53
|
+
project_discoveries: projectDiscoveries,
|
|
54
|
+
global_discoveries: globalDiscoveries,
|
|
55
|
+
total_discoveries: all.length,
|
|
56
|
+
categories,
|
|
57
|
+
most_useful: sorted.slice(0, 5),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Mark a discovery as useful (increments verification_count).
|
|
62
|
+
*/
|
|
63
|
+
export function markDiscoveryUseful(discoveryId, projectPath) {
|
|
64
|
+
const globalPath = join(getLearningDir(), 'discoveries.jsonl');
|
|
65
|
+
const projectLearningPath = join(projectPath, '.olympus', 'learning', 'discoveries.jsonl');
|
|
66
|
+
// Helper to update discoveries in a JSONL file
|
|
67
|
+
const updateFile = (filePath) => {
|
|
68
|
+
if (!existsSync(filePath))
|
|
69
|
+
return false;
|
|
70
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
71
|
+
const lines = content.trim().split('\n').filter(l => l.trim());
|
|
72
|
+
let found = false;
|
|
73
|
+
const updated = lines.map(line => {
|
|
74
|
+
try {
|
|
75
|
+
const discovery = JSON.parse(line);
|
|
76
|
+
if (discovery.id === discoveryId) {
|
|
77
|
+
found = true;
|
|
78
|
+
discovery.verification_count = (discovery.verification_count || 0) + 1;
|
|
79
|
+
discovery.last_useful = new Date().toISOString();
|
|
80
|
+
}
|
|
81
|
+
return JSON.stringify(discovery);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return line; // Keep malformed lines as-is
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (found) {
|
|
88
|
+
const dir = dirname(filePath);
|
|
89
|
+
if (!existsSync(dir)) {
|
|
90
|
+
mkdirSync(dir, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
writeFileSync(filePath, updated.join('\n') + '\n', 'utf-8');
|
|
93
|
+
}
|
|
94
|
+
return found;
|
|
95
|
+
};
|
|
96
|
+
// Try project-specific first, then global
|
|
97
|
+
if (!updateFile(projectLearningPath)) {
|
|
98
|
+
updateFile(globalPath);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get discoveries relevant for context injection.
|
|
103
|
+
* Returns top discoveries filtered by recency and usefulness.
|
|
104
|
+
*/
|
|
105
|
+
export function getDiscoveriesForInjection(projectPath, maxCount = 10) {
|
|
106
|
+
const summary = readDiscoveries(projectPath);
|
|
107
|
+
const all = [...summary.project_discoveries, ...summary.global_discoveries];
|
|
108
|
+
// Filter out expired discoveries
|
|
109
|
+
const now = new Date();
|
|
110
|
+
const active = all.filter(d => {
|
|
111
|
+
if (!d.expires_at)
|
|
112
|
+
return true;
|
|
113
|
+
return new Date(d.expires_at) > now;
|
|
114
|
+
});
|
|
115
|
+
// Score by: verification_count * recency_factor
|
|
116
|
+
const scored = active.map(d => {
|
|
117
|
+
const age = (now.getTime() - new Date(d.timestamp).getTime()) / (1000 * 60 * 60 * 24);
|
|
118
|
+
const recencyFactor = Math.max(0.1, 1 - (age / 90)); // Decay over 90 days
|
|
119
|
+
const score = (d.verification_count + 1) * recencyFactor * d.confidence;
|
|
120
|
+
return { discovery: d, score };
|
|
121
|
+
});
|
|
122
|
+
// Sort by score descending
|
|
123
|
+
scored.sort((a, b) => b.score - a.score);
|
|
124
|
+
return scored.slice(0, maxCount).map(s => s.discovery);
|
|
125
|
+
}
|
|
126
|
+
function readDiscoveryFile(filePath) {
|
|
127
|
+
if (!existsSync(filePath))
|
|
128
|
+
return [];
|
|
129
|
+
try {
|
|
130
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
131
|
+
return content
|
|
132
|
+
.split('\n')
|
|
133
|
+
.filter(line => line.trim())
|
|
134
|
+
.map(line => JSON.parse(line));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error(`[Olympus Learning] Failed to read discoveries: ${error}`);
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/learning/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HookInput } from '../types.js';
|
|
2
|
+
interface StopHookInput extends HookInput {
|
|
3
|
+
reason?: string;
|
|
4
|
+
}
|
|
5
|
+
/** Detect if this is a user-initiated cancellation */
|
|
6
|
+
export declare function handleCancellationDetection(input: StopHookInput): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=cancellation-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellation-detector.d.ts","sourceRoot":"","sources":["../../../src/learning/hooks/cancellation-detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AAKvD,UAAU,aAAc,SAAQ,SAAS;IAEvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6BD,sDAAsD;AACtD,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { loadSessionState, saveSessionState } from '../session-state.js';
|
|
5
|
+
import { appendFeedback } from '../storage.js';
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
/** Count incomplete todos from Claude's todo directory */
|
|
8
|
+
function countIncompleteTodos() {
|
|
9
|
+
const todosDir = join(homedir(), '.claude', 'todos');
|
|
10
|
+
if (!existsSync(todosDir))
|
|
11
|
+
return 0;
|
|
12
|
+
let count = 0;
|
|
13
|
+
try {
|
|
14
|
+
const files = readdirSync(todosDir).filter(f => f.endsWith('.json'));
|
|
15
|
+
for (const file of files) {
|
|
16
|
+
try {
|
|
17
|
+
const content = readFileSync(join(todosDir, file), 'utf-8');
|
|
18
|
+
const todos = JSON.parse(content);
|
|
19
|
+
if (Array.isArray(todos)) {
|
|
20
|
+
count += todos.filter(t => t.status !== 'completed' && t.status !== 'cancelled').length;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Skip unparseable files
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Directory read error
|
|
30
|
+
}
|
|
31
|
+
return count;
|
|
32
|
+
}
|
|
33
|
+
/** Detect if this is a user-initiated cancellation */
|
|
34
|
+
export async function handleCancellationDetection(input) {
|
|
35
|
+
const { directory, sessionId } = input;
|
|
36
|
+
if (!directory)
|
|
37
|
+
return;
|
|
38
|
+
// Load session state
|
|
39
|
+
const state = loadSessionState(directory, sessionId);
|
|
40
|
+
// Check for incomplete todos
|
|
41
|
+
const incompleteTodos = countIncompleteTodos();
|
|
42
|
+
// If there are incomplete todos and there was a pending completion,
|
|
43
|
+
// this might be a user cancellation
|
|
44
|
+
if (incompleteTodos > 0 && state.pending_completion) {
|
|
45
|
+
const feedbackEntry = {
|
|
46
|
+
id: randomUUID(),
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
session_id: state.session_id,
|
|
49
|
+
project_path: directory,
|
|
50
|
+
event_type: 'cancellation',
|
|
51
|
+
original_task: state.pending_completion.task_description,
|
|
52
|
+
agent_used: state.pending_completion.agent_used,
|
|
53
|
+
user_message: `[Stopped with ${incompleteTodos} incomplete todos]`,
|
|
54
|
+
feedback_category: 'rejection',
|
|
55
|
+
confidence: 0.7, // Medium confidence - could be legitimate stop
|
|
56
|
+
};
|
|
57
|
+
appendFeedback(feedbackEntry);
|
|
58
|
+
}
|
|
59
|
+
// Clear session state on stop
|
|
60
|
+
state.pending_completion = null;
|
|
61
|
+
state.todo_snapshot = { total: 0, completed: 0, pending: incompleteTodos };
|
|
62
|
+
saveSessionState(directory, state);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=cancellation-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellation-detector.js","sourceRoot":"","sources":["../../../src/learning/hooks/cancellation-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentDiscovery } from '../types.js';
|
|
2
|
+
/** Generate learned context for injection */
|
|
3
|
+
export declare function generateLearnedContext(projectPath: string): string;
|
|
4
|
+
/** Format discoveries for injection */
|
|
5
|
+
export declare function formatDiscoveries(discoveries: AgentDiscovery[]): string;
|
|
6
|
+
//# sourceMappingURL=learned-context.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { readJsonFile, getLearningDir, getProjectLearningDir } from '../storage.js';
|
|
3
|
+
const MAX_INJECTION_TOKENS = 500; // Approximate limit
|
|
4
|
+
/** Generate learned context for injection */
|
|
5
|
+
export function generateLearnedContext(projectPath) {
|
|
6
|
+
const globalPrefs = readJsonFile(join(getLearningDir(), 'user-preferences.json'), null);
|
|
7
|
+
const projectPatterns = readJsonFile(join(getProjectLearningDir(projectPath), 'patterns.json'), null);
|
|
8
|
+
const agentPerformance = readJsonFile(join(getLearningDir(), 'agent-performance.json'), {});
|
|
9
|
+
const sections = [];
|
|
10
|
+
// User preferences
|
|
11
|
+
if (globalPrefs && hasContent(globalPrefs)) {
|
|
12
|
+
sections.push(formatPreferences(globalPrefs));
|
|
13
|
+
}
|
|
14
|
+
// Project conventions
|
|
15
|
+
if (projectPatterns && projectPatterns.conventions.length > 0) {
|
|
16
|
+
sections.push(formatProjectPatterns(projectPatterns));
|
|
17
|
+
}
|
|
18
|
+
// Recent corrections (from recurring_corrections)
|
|
19
|
+
if (globalPrefs?.recurring_corrections && globalPrefs.recurring_corrections.length > 0) {
|
|
20
|
+
sections.push(formatCorrections(globalPrefs.recurring_corrections.slice(0, 5)));
|
|
21
|
+
}
|
|
22
|
+
// Agent notes (only weak areas)
|
|
23
|
+
const weakAgents = Object.values(agentPerformance)
|
|
24
|
+
.filter(a => a.weak_areas.length > 0);
|
|
25
|
+
if (weakAgents.length > 0) {
|
|
26
|
+
sections.push(formatAgentNotes(weakAgents));
|
|
27
|
+
}
|
|
28
|
+
// Only inject if we have meaningful content
|
|
29
|
+
if (sections.length === 0) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
const content = `<learned-context>
|
|
33
|
+
|
|
34
|
+
${sections.join('\n\n')}
|
|
35
|
+
|
|
36
|
+
</learned-context>
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
`;
|
|
41
|
+
// Truncate if too long (rough token estimate: 1 token ≈ 4 chars)
|
|
42
|
+
if (content.length > MAX_INJECTION_TOKENS * 4) {
|
|
43
|
+
return content.substring(0, MAX_INJECTION_TOKENS * 4) + '\n...</learned-context>\n\n---\n\n';
|
|
44
|
+
}
|
|
45
|
+
return content;
|
|
46
|
+
}
|
|
47
|
+
function hasContent(prefs) {
|
|
48
|
+
return (prefs.verbosity !== 'unknown' ||
|
|
49
|
+
prefs.autonomy !== 'unknown' ||
|
|
50
|
+
prefs.explicit_rules.length > 0 ||
|
|
51
|
+
prefs.inferred_preferences.length > 0);
|
|
52
|
+
}
|
|
53
|
+
function formatPreferences(prefs) {
|
|
54
|
+
const lines = ['## User Preferences'];
|
|
55
|
+
if (prefs.verbosity !== 'unknown') {
|
|
56
|
+
lines.push(`- Verbosity: ${prefs.verbosity}`);
|
|
57
|
+
}
|
|
58
|
+
if (prefs.autonomy !== 'unknown') {
|
|
59
|
+
lines.push(`- Autonomy: ${prefs.autonomy}`);
|
|
60
|
+
}
|
|
61
|
+
for (const rule of prefs.explicit_rules.slice(0, 5)) {
|
|
62
|
+
lines.push(`- ${rule}`);
|
|
63
|
+
}
|
|
64
|
+
return lines.join('\n');
|
|
65
|
+
}
|
|
66
|
+
function formatProjectPatterns(patterns) {
|
|
67
|
+
const lines = ['## Project Conventions'];
|
|
68
|
+
for (const conv of patterns.conventions.slice(0, 5)) {
|
|
69
|
+
lines.push(`- ${conv}`);
|
|
70
|
+
}
|
|
71
|
+
if (patterns.tech_stack.length > 0) {
|
|
72
|
+
lines.push(`- Tech: ${patterns.tech_stack.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
function formatCorrections(corrections) {
|
|
77
|
+
const lines = ['## Avoid These Mistakes'];
|
|
78
|
+
for (const c of corrections) {
|
|
79
|
+
lines.push(`- ${c.pattern} (${c.count}x)`);
|
|
80
|
+
}
|
|
81
|
+
return lines.join('\n');
|
|
82
|
+
}
|
|
83
|
+
function formatAgentNotes(agents) {
|
|
84
|
+
const lines = ['## Agent Notes'];
|
|
85
|
+
for (const agent of agents.slice(0, 3)) {
|
|
86
|
+
lines.push(`- ${agent.agent_name}: struggles with ${agent.weak_areas.join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
return lines.join('\n');
|
|
89
|
+
}
|
|
90
|
+
/** Format discoveries for injection */
|
|
91
|
+
export function formatDiscoveries(discoveries) {
|
|
92
|
+
if (discoveries.length === 0)
|
|
93
|
+
return '';
|
|
94
|
+
const lines = ['## Agent Discoveries'];
|
|
95
|
+
lines.push('');
|
|
96
|
+
lines.push('These insights were discovered during previous work:');
|
|
97
|
+
lines.push('');
|
|
98
|
+
for (const d of discoveries.slice(0, 5)) {
|
|
99
|
+
lines.push(`- **${d.category}**: ${d.summary}`);
|
|
100
|
+
lines.push(` ${d.details.substring(0, 200)}`);
|
|
101
|
+
}
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=learned-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned-context.js","sourceRoot":"","sources":["../../../src/learning/hooks/learned-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HookInput, FeedbackCategory } from '../types.js';
|
|
2
|
+
/** Detect feedback category from user message */
|
|
3
|
+
export declare function detectFeedbackCategory(prompt: string): {
|
|
4
|
+
category: FeedbackCategory;
|
|
5
|
+
confidence: number;
|
|
6
|
+
} | null;
|
|
7
|
+
/** Main hook handler */
|
|
8
|
+
export declare function handleRevisionDetection(input: HookInput): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=revision-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-detector.d.ts","sourceRoot":"","sources":["../../../src/learning/hooks/revision-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AA8CzE,iDAAiD;AACjD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmB3D;AAED,wBAAwB;AACxB,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC7E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { loadSessionState, saveSessionState, addPromptToSession, hasPendingCompletion } from '../session-state.js';
|
|
2
|
+
import { appendFeedback } from '../storage.js';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
4
|
+
// Pattern definitions with associated confidence scores
|
|
5
|
+
const REVISION_PATTERNS = {
|
|
6
|
+
correction: [
|
|
7
|
+
{ regex: /no[,.]?\s*(that's|thats)?\s*(not|wrong)/i, confidence: 0.9 },
|
|
8
|
+
{ regex: /that's\s*(incorrect|not right|not what)/i, confidence: 0.9 },
|
|
9
|
+
{ regex: /you\s*(misunderstood|got it wrong)/i, confidence: 0.85 },
|
|
10
|
+
{ regex: /actually,?\s*(I|it|the)/i, confidence: 0.6 },
|
|
11
|
+
],
|
|
12
|
+
rejection: [
|
|
13
|
+
{ regex: /\b(stop|cancel|abort|halt)\b/i, confidence: 0.95 },
|
|
14
|
+
{ regex: /don't\s*(do|want|need)\s*(that|this)/i, confidence: 0.85 },
|
|
15
|
+
{ regex: /never\s*mind/i, confidence: 0.9 },
|
|
16
|
+
{ regex: /forget\s*(it|that|about)/i, confidence: 0.8 },
|
|
17
|
+
],
|
|
18
|
+
clarification: [
|
|
19
|
+
{ regex: /I\s*(meant|wanted|asked for)/i, confidence: 0.85 },
|
|
20
|
+
{ regex: /what I\s*(mean|want|need)/i, confidence: 0.8 },
|
|
21
|
+
{ regex: /to clarify/i, confidence: 0.9 },
|
|
22
|
+
{ regex: /let me\s*(rephrase|explain|be clearer)/i, confidence: 0.85 },
|
|
23
|
+
],
|
|
24
|
+
explicit_preference: [
|
|
25
|
+
{ regex: /always\s+(use|do|include|add|prefer)/i, confidence: 0.95 },
|
|
26
|
+
{ regex: /never\s+(use|do|include|add)/i, confidence: 0.95 },
|
|
27
|
+
{ regex: /I\s*(prefer|like|want)\s*(you to)?/i, confidence: 0.7 },
|
|
28
|
+
{ regex: /from now on/i, confidence: 0.9 },
|
|
29
|
+
{ regex: /in the future,?\s*(please|always)/i, confidence: 0.85 },
|
|
30
|
+
],
|
|
31
|
+
praise: [
|
|
32
|
+
{ regex: /\bperfect\b/i, confidence: 0.9 },
|
|
33
|
+
{ regex: /exactly(\s+what I (wanted|needed))?/i, confidence: 0.85 },
|
|
34
|
+
{ regex: /great(\s+job)?/i, confidence: 0.7 },
|
|
35
|
+
{ regex: /\bthanks?\b/i, confidence: 0.5 }, // Lower confidence - could be polite rejection
|
|
36
|
+
{ regex: /looks?\s+good/i, confidence: 0.75 },
|
|
37
|
+
],
|
|
38
|
+
enhancement: [
|
|
39
|
+
{ regex: /also\s+(add|include|do)/i, confidence: 0.7 },
|
|
40
|
+
{ regex: /can you (also|additionally)/i, confidence: 0.7 },
|
|
41
|
+
{ regex: /one more thing/i, confidence: 0.75 },
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
/** Detect feedback category from user message */
|
|
45
|
+
export function detectFeedbackCategory(prompt) {
|
|
46
|
+
// Remove code blocks to prevent false positives
|
|
47
|
+
const cleanPrompt = prompt
|
|
48
|
+
.replace(/```[\s\S]*?```/g, '')
|
|
49
|
+
.replace(/`[^`]+`/g, '');
|
|
50
|
+
let bestMatch = null;
|
|
51
|
+
for (const [category, patterns] of Object.entries(REVISION_PATTERNS)) {
|
|
52
|
+
for (const { regex, confidence } of patterns) {
|
|
53
|
+
if (regex.test(cleanPrompt)) {
|
|
54
|
+
if (!bestMatch || confidence > bestMatch.confidence) {
|
|
55
|
+
bestMatch = { category: category, confidence };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return bestMatch;
|
|
61
|
+
}
|
|
62
|
+
/** Main hook handler */
|
|
63
|
+
export async function handleRevisionDetection(input) {
|
|
64
|
+
const { prompt, directory, sessionId } = input;
|
|
65
|
+
if (!prompt || !directory)
|
|
66
|
+
return;
|
|
67
|
+
// Load session state
|
|
68
|
+
const state = loadSessionState(directory, sessionId);
|
|
69
|
+
// Detect feedback category
|
|
70
|
+
const detected = detectFeedbackCategory(prompt);
|
|
71
|
+
// Update session state with this prompt
|
|
72
|
+
const updatedState = addPromptToSession(state, prompt, detected?.category);
|
|
73
|
+
// If feedback detected and there was a pending completion, log it
|
|
74
|
+
if (detected && hasPendingCompletion(state)) {
|
|
75
|
+
const feedbackEntry = {
|
|
76
|
+
id: randomUUID(),
|
|
77
|
+
timestamp: new Date().toISOString(),
|
|
78
|
+
session_id: state.session_id,
|
|
79
|
+
project_path: directory,
|
|
80
|
+
event_type: detected.category === 'explicit_preference' ? 'explicit_preference' : 'revision',
|
|
81
|
+
original_task: state.pending_completion?.task_description,
|
|
82
|
+
agent_used: state.pending_completion?.agent_used,
|
|
83
|
+
user_message: prompt,
|
|
84
|
+
feedback_category: detected.category,
|
|
85
|
+
confidence: detected.confidence,
|
|
86
|
+
};
|
|
87
|
+
appendFeedback(feedbackEntry);
|
|
88
|
+
}
|
|
89
|
+
// Save updated state
|
|
90
|
+
saveSessionState(directory, updatedState);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=revision-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-detector.js","sourceRoot":"","sources":["../../../src/learning/hooks/revision-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"success-detector.d.ts","sourceRoot":"","sources":["../../../src/learning/hooks/success-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AAMvD,mDAAmD;AACnD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC5E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { loadSessionState, saveSessionState, hasPendingCompletion, clearCompletionClaim } from '../session-state.js';
|
|
2
|
+
import { appendFeedback } from '../storage.js';
|
|
3
|
+
import { detectFeedbackCategory } from './revision-detector.js';
|
|
4
|
+
import { randomUUID } from 'crypto';
|
|
5
|
+
/** Detect if this prompt indicates task success */
|
|
6
|
+
export async function handleSuccessDetection(input) {
|
|
7
|
+
const { prompt, directory, sessionId } = input;
|
|
8
|
+
if (!prompt || !directory)
|
|
9
|
+
return;
|
|
10
|
+
const state = loadSessionState(directory, sessionId);
|
|
11
|
+
// Only check for success if there's a pending completion
|
|
12
|
+
if (!hasPendingCompletion(state))
|
|
13
|
+
return;
|
|
14
|
+
const detected = detectFeedbackCategory(prompt);
|
|
15
|
+
// Success indicators:
|
|
16
|
+
// 1. Explicit praise
|
|
17
|
+
// 2. New, unrelated task (topic change)
|
|
18
|
+
// 3. Simple acknowledgment + moving on
|
|
19
|
+
const isPraise = detected?.category === 'praise' && detected.confidence > 0.7;
|
|
20
|
+
const isNewTask = isTopicChange(prompt, state.pending_completion?.task_description || '');
|
|
21
|
+
if (isPraise || isNewTask) {
|
|
22
|
+
const feedbackEntry = {
|
|
23
|
+
id: randomUUID(),
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
session_id: state.session_id,
|
|
26
|
+
project_path: directory,
|
|
27
|
+
event_type: 'success',
|
|
28
|
+
original_task: state.pending_completion?.task_description,
|
|
29
|
+
agent_used: state.pending_completion?.agent_used,
|
|
30
|
+
user_message: prompt,
|
|
31
|
+
feedback_category: isPraise ? 'praise' : 'enhancement',
|
|
32
|
+
confidence: isPraise ? detected.confidence : 0.6,
|
|
33
|
+
};
|
|
34
|
+
appendFeedback(feedbackEntry);
|
|
35
|
+
// Clear the completion claim
|
|
36
|
+
const updatedState = clearCompletionClaim(state);
|
|
37
|
+
saveSessionState(directory, updatedState);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Simple topic change detection using keyword overlap */
|
|
41
|
+
function isTopicChange(newPrompt, previousTask) {
|
|
42
|
+
const extractKeywords = (text) => {
|
|
43
|
+
return new Set(text.toLowerCase()
|
|
44
|
+
.replace(/[^\w\s]/g, '')
|
|
45
|
+
.split(/\s+/)
|
|
46
|
+
.filter(w => w.length > 3) // Skip short words
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
const newKeywords = extractKeywords(newPrompt);
|
|
50
|
+
const oldKeywords = extractKeywords(previousTask);
|
|
51
|
+
// Calculate Jaccard similarity
|
|
52
|
+
const intersection = new Set([...newKeywords].filter(x => oldKeywords.has(x)));
|
|
53
|
+
const union = new Set([...newKeywords, ...oldKeywords]);
|
|
54
|
+
const similarity = union.size > 0 ? intersection.size / union.size : 0;
|
|
55
|
+
// If similarity is low, it's likely a new topic
|
|
56
|
+
return similarity < 0.2;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=success-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"success-detector.js","sourceRoot":"","sources":["../../../src/learning/hooks/success-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './storage.js';
|
|
3
|
+
export * from './session-state.js';
|
|
4
|
+
export * from './pattern-extractor.js';
|
|
5
|
+
export * from './preference-learner.js';
|
|
6
|
+
export * from './agent-evaluator.js';
|
|
7
|
+
export * from './prompt-patcher.js';
|
|
8
|
+
export * from './discovery.js';
|
|
9
|
+
export * from './discovery-validator.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Olympus Learning System
|
|
2
|
+
// Barrel export - add exports as modules are created
|
|
3
|
+
// Storage & Types (Task 1.1)
|
|
4
|
+
export * from './types.js';
|
|
5
|
+
export * from './storage.js';
|
|
6
|
+
// Session State (Task 1.2)
|
|
7
|
+
export * from './session-state.js';
|
|
8
|
+
// Analysis (Phase 2)
|
|
9
|
+
export * from './pattern-extractor.js';
|
|
10
|
+
export * from './preference-learner.js';
|
|
11
|
+
export * from './agent-evaluator.js';
|
|
12
|
+
// Prompt Patching (Phase 3)
|
|
13
|
+
export * from './prompt-patcher.js';
|
|
14
|
+
// Discovery System (Phase 6)
|
|
15
|
+
export * from './discovery.js';
|
|
16
|
+
export * from './discovery-validator.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,qDAAqD;AAErD,6BAA6B;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAE7B,2BAA2B;AAC3B,cAAc,oBAAoB,CAAC;AAEnC,qBAAqB;AACrB,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,4BAA4B;AAC5B,cAAc,qBAAqB,CAAC;AAEpC,6BAA6B;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-notepads.d.ts","sourceRoot":"","sources":["../../src/learning/migrate-notepads.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC1E"}
|