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.
Files changed (126) hide show
  1. package/dist/__tests__/learning/agent-evaluator.test.d.ts +2 -0
  2. package/dist/__tests__/learning/agent-evaluator.test.d.ts.map +1 -0
  3. package/dist/__tests__/learning/agent-evaluator.test.js +29 -0
  4. package/dist/__tests__/learning/agent-evaluator.test.js.map +1 -0
  5. package/dist/__tests__/learning/discovery.test.d.ts +2 -0
  6. package/dist/__tests__/learning/discovery.test.d.ts.map +1 -0
  7. package/dist/__tests__/learning/discovery.test.js +70 -0
  8. package/dist/__tests__/learning/discovery.test.js.map +1 -0
  9. package/dist/__tests__/learning/fixtures/mock-feedback.d.ts +14 -0
  10. package/dist/__tests__/learning/fixtures/mock-feedback.d.ts.map +1 -0
  11. package/dist/__tests__/learning/fixtures/mock-feedback.js +146 -0
  12. package/dist/__tests__/learning/fixtures/mock-feedback.js.map +1 -0
  13. package/dist/__tests__/learning/pattern-extractor.test.d.ts +2 -0
  14. package/dist/__tests__/learning/pattern-extractor.test.d.ts.map +1 -0
  15. package/dist/__tests__/learning/pattern-extractor.test.js +30 -0
  16. package/dist/__tests__/learning/pattern-extractor.test.js.map +1 -0
  17. package/dist/__tests__/learning/revision-detector.test.d.ts +2 -0
  18. package/dist/__tests__/learning/revision-detector.test.d.ts.map +1 -0
  19. package/dist/__tests__/learning/revision-detector.test.js +54 -0
  20. package/dist/__tests__/learning/revision-detector.test.js.map +1 -0
  21. package/dist/cli/index.js +264 -0
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/hooks/agent-usage-reminder/index.d.ts +1 -0
  24. package/dist/hooks/agent-usage-reminder/index.d.ts.map +1 -1
  25. package/dist/hooks/agent-usage-reminder/index.js +107 -0
  26. package/dist/hooks/agent-usage-reminder/index.js.map +1 -1
  27. package/dist/hooks/agent-usage-reminder/index.test.d.ts +5 -0
  28. package/dist/hooks/agent-usage-reminder/index.test.d.ts.map +1 -0
  29. package/dist/hooks/agent-usage-reminder/index.test.js +141 -0
  30. package/dist/hooks/agent-usage-reminder/index.test.js.map +1 -0
  31. package/dist/hooks/bridge.d.ts.map +1 -1
  32. package/dist/hooks/bridge.js +14 -2
  33. package/dist/hooks/bridge.js.map +1 -1
  34. package/dist/hooks/keyword-detector/index.d.ts +1 -1
  35. package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
  36. package/dist/hooks/keyword-detector/index.js +2 -1
  37. package/dist/hooks/keyword-detector/index.js.map +1 -1
  38. package/dist/hooks/olympus-hooks.cjs +162 -67
  39. package/dist/hooks/olympus-state/index.d.ts +69 -0
  40. package/dist/hooks/olympus-state/index.d.ts.map +1 -0
  41. package/dist/hooks/olympus-state/index.js +226 -0
  42. package/dist/hooks/olympus-state/index.js.map +1 -0
  43. package/dist/hooks/persistent-mode/index.d.ts +7 -6
  44. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  45. package/dist/hooks/persistent-mode/index.js +94 -5
  46. package/dist/hooks/persistent-mode/index.js.map +1 -1
  47. package/dist/hooks/registrations/session-start.d.ts.map +1 -1
  48. package/dist/hooks/registrations/session-start.js +26 -0
  49. package/dist/hooks/registrations/session-start.js.map +1 -1
  50. package/dist/hooks/registrations/stop.d.ts.map +1 -1
  51. package/dist/hooks/registrations/stop.js +25 -0
  52. package/dist/hooks/registrations/stop.js.map +1 -1
  53. package/dist/hooks/registrations/user-prompt-submit.d.ts.map +1 -1
  54. package/dist/hooks/registrations/user-prompt-submit.js +34 -0
  55. package/dist/hooks/registrations/user-prompt-submit.js.map +1 -1
  56. package/dist/installer/hooks.d.ts +7 -1
  57. package/dist/installer/hooks.d.ts.map +1 -1
  58. package/dist/installer/hooks.js +61 -2
  59. package/dist/installer/hooks.js.map +1 -1
  60. package/dist/installer/index.d.ts +1 -1
  61. package/dist/installer/index.d.ts.map +1 -1
  62. package/dist/installer/index.js +40 -14
  63. package/dist/installer/index.js.map +1 -1
  64. package/dist/learning/agent-evaluator.d.ts +6 -0
  65. package/dist/learning/agent-evaluator.d.ts.map +1 -0
  66. package/dist/learning/agent-evaluator.js +116 -0
  67. package/dist/learning/agent-evaluator.js.map +1 -0
  68. package/dist/learning/discovery-validator.d.ts +21 -0
  69. package/dist/learning/discovery-validator.d.ts.map +1 -0
  70. package/dist/learning/discovery-validator.js +75 -0
  71. package/dist/learning/discovery-validator.js.map +1 -0
  72. package/dist/learning/discovery.d.ts +20 -0
  73. package/dist/learning/discovery.d.ts.map +1 -0
  74. package/dist/learning/discovery.js +141 -0
  75. package/dist/learning/discovery.js.map +1 -0
  76. package/dist/learning/hooks/cancellation-detector.d.ts +8 -0
  77. package/dist/learning/hooks/cancellation-detector.d.ts.map +1 -0
  78. package/dist/learning/hooks/cancellation-detector.js +64 -0
  79. package/dist/learning/hooks/cancellation-detector.js.map +1 -0
  80. package/dist/learning/hooks/learned-context.d.ts +6 -0
  81. package/dist/learning/hooks/learned-context.d.ts.map +1 -0
  82. package/dist/learning/hooks/learned-context.js +104 -0
  83. package/dist/learning/hooks/learned-context.js.map +1 -0
  84. package/dist/learning/hooks/revision-detector.d.ts +9 -0
  85. package/dist/learning/hooks/revision-detector.d.ts.map +1 -0
  86. package/dist/learning/hooks/revision-detector.js +92 -0
  87. package/dist/learning/hooks/revision-detector.js.map +1 -0
  88. package/dist/learning/hooks/success-detector.d.ts +4 -0
  89. package/dist/learning/hooks/success-detector.d.ts.map +1 -0
  90. package/dist/learning/hooks/success-detector.js +58 -0
  91. package/dist/learning/hooks/success-detector.js.map +1 -0
  92. package/dist/learning/index.d.ts +10 -0
  93. package/dist/learning/index.d.ts.map +1 -0
  94. package/dist/learning/index.js +17 -0
  95. package/dist/learning/index.js.map +1 -0
  96. package/dist/learning/migrate-notepads.d.ts +6 -0
  97. package/dist/learning/migrate-notepads.d.ts.map +1 -0
  98. package/dist/learning/migrate-notepads.js +77 -0
  99. package/dist/learning/migrate-notepads.js.map +1 -0
  100. package/dist/learning/pattern-extractor.d.ts +6 -0
  101. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  102. package/dist/learning/pattern-extractor.js +106 -0
  103. package/dist/learning/pattern-extractor.js.map +1 -0
  104. package/dist/learning/preference-learner.d.ts +6 -0
  105. package/dist/learning/preference-learner.d.ts.map +1 -0
  106. package/dist/learning/preference-learner.js +96 -0
  107. package/dist/learning/preference-learner.js.map +1 -0
  108. package/dist/learning/prompt-patcher.d.ts +24 -0
  109. package/dist/learning/prompt-patcher.d.ts.map +1 -0
  110. package/dist/learning/prompt-patcher.js +120 -0
  111. package/dist/learning/prompt-patcher.js.map +1 -0
  112. package/dist/learning/session-state.d.ts +18 -0
  113. package/dist/learning/session-state.d.ts.map +1 -0
  114. package/dist/learning/session-state.js +78 -0
  115. package/dist/learning/session-state.js.map +1 -0
  116. package/dist/learning/storage.d.ts +18 -0
  117. package/dist/learning/storage.d.ts.map +1 -0
  118. package/dist/learning/storage.js +74 -0
  119. package/dist/learning/storage.js.map +1 -0
  120. package/dist/learning/types.d.ts +138 -0
  121. package/dist/learning/types.d.ts.map +1 -0
  122. package/dist/learning/types.js +6 -0
  123. package/dist/learning/types.js.map +1 -0
  124. package/dist/shared/types.d.ts +12 -0
  125. package/dist/shared/types.d.ts.map +1 -1
  126. 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,4 @@
1
+ import { HookInput } from '../types.js';
2
+ /** Detect if this prompt indicates task success */
3
+ export declare function handleSuccessDetection(input: HookInput): Promise<void>;
4
+ //# sourceMappingURL=success-detector.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Migrate existing notepad content to discoveries.
3
+ * This is a one-time migration utility.
4
+ */
5
+ export declare function migrateNotepads(projectPath: string): Promise<number>;
6
+ //# sourceMappingURL=migrate-notepads.d.ts.map
@@ -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"}