@devflow-tools/memory-engine 0.15.0 → 0.16.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/README.md +27 -26
- package/dist/consolidator.d.ts.map +1 -1
- package/dist/consolidator.js +31 -146
- package/dist/consolidator.js.map +1 -1
- package/dist/embedding-provider.d.ts +21 -1
- package/dist/embedding-provider.d.ts.map +1 -1
- package/dist/embedding-provider.js +157 -24
- package/dist/embedding-provider.js.map +1 -1
- package/dist/event-grouper.d.ts.map +1 -1
- package/dist/event-grouper.js +43 -1
- package/dist/event-grouper.js.map +1 -1
- package/dist/hybrid-search.d.ts +1 -1
- package/dist/hybrid-search.d.ts.map +1 -1
- package/dist/hybrid-search.js +44 -43
- package/dist/hybrid-search.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/lease-store.d.ts +33 -0
- package/dist/lease-store.d.ts.map +1 -0
- package/dist/lease-store.js +178 -0
- package/dist/lease-store.js.map +1 -0
- package/dist/lease-store.test.d.ts +2 -0
- package/dist/lease-store.test.d.ts.map +1 -0
- package/dist/lease-store.test.js +167 -0
- package/dist/lease-store.test.js.map +1 -0
- package/dist/memory-engine.d.ts +12 -18
- package/dist/memory-engine.d.ts.map +1 -1
- package/dist/memory-engine.js +220 -148
- package/dist/memory-engine.js.map +1 -1
- package/dist/memory-gate.d.ts +64 -39
- package/dist/memory-gate.d.ts.map +1 -1
- package/dist/memory-gate.js +379 -45
- package/dist/memory-gate.js.map +1 -1
- package/dist/memory-store.d.ts +36 -1
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/memory-store.js +142 -21
- package/dist/memory-store.js.map +1 -1
- package/dist/migrations/v2-to-v3.d.ts +3 -0
- package/dist/migrations/v2-to-v3.d.ts.map +1 -0
- package/dist/migrations/v2-to-v3.js +122 -0
- package/dist/migrations/v2-to-v3.js.map +1 -0
- package/dist/migrations/v2-to-v3.test.d.ts +2 -0
- package/dist/migrations/v2-to-v3.test.d.ts.map +1 -0
- package/dist/migrations/v2-to-v3.test.js +88 -0
- package/dist/migrations/v2-to-v3.test.js.map +1 -0
- package/dist/observation-types.d.ts +7 -0
- package/dist/observation-types.d.ts.map +1 -0
- package/dist/observation-types.js +27 -0
- package/dist/observation-types.js.map +1 -0
- package/dist/project-validator.d.ts.map +1 -1
- package/dist/project-validator.js +1 -2
- package/dist/project-validator.js.map +1 -1
- package/dist/rule-extractor.d.ts +14 -0
- package/dist/rule-extractor.d.ts.map +1 -0
- package/dist/rule-extractor.js +109 -0
- package/dist/rule-extractor.js.map +1 -0
- package/dist/session-summarizer.d.ts +16 -8
- package/dist/session-summarizer.d.ts.map +1 -1
- package/dist/session-summarizer.js +171 -160
- package/dist/session-summarizer.js.map +1 -1
- package/dist/{signal-detector.d.ts → signal-analyzer.d.ts} +6 -2
- package/dist/signal-analyzer.d.ts.map +1 -0
- package/dist/{signal-detector.js → signal-analyzer.js} +34 -3
- package/dist/signal-analyzer.js.map +1 -0
- package/dist/signal-buffer.d.ts +3 -0
- package/dist/signal-buffer.d.ts.map +1 -1
- package/dist/signal-buffer.js.map +1 -1
- package/package.json +6 -6
- package/dist/extractor.d.ts +0 -39
- package/dist/extractor.d.ts.map +0 -1
- package/dist/extractor.js +0 -275
- package/dist/extractor.js.map +0 -1
- package/dist/l2-evaluator.d.ts +0 -31
- package/dist/l2-evaluator.d.ts.map +0 -1
- package/dist/l2-evaluator.js +0 -103
- package/dist/l2-evaluator.js.map +0 -1
- package/dist/llm-provider.d.ts +0 -9
- package/dist/llm-provider.d.ts.map +0 -1
- package/dist/llm-provider.js +0 -37
- package/dist/llm-provider.js.map +0 -1
- package/dist/ollama-checker.d.ts +0 -10
- package/dist/ollama-checker.d.ts.map +0 -1
- package/dist/ollama-checker.js +0 -43
- package/dist/ollama-checker.js.map +0 -1
- package/dist/signal-detector.d.ts.map +0 -1
- package/dist/signal-detector.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/memory-engine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
"clean": "rm -rf dist"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@devflow-tools/
|
|
21
|
-
"@devflow-tools/sdk": "0.15.0",
|
|
20
|
+
"@devflow-tools/sdk": "0.16.0",
|
|
22
21
|
"@xenova/transformers": "^2.17.0",
|
|
23
22
|
"better-sqlite3": "^12.0.0",
|
|
24
|
-
"sqlite-vec": "^0.1.9"
|
|
23
|
+
"sqlite-vec": "^0.1.9",
|
|
24
|
+
"ulidx": "^2.4.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@devflow-tools/knowledge-engine": "0.
|
|
27
|
+
"@devflow-tools/knowledge-engine": "0.16.0",
|
|
28
28
|
"typescript": "^5.5.0",
|
|
29
29
|
"vitest": "^2.0.0"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"dist"
|
|
33
33
|
],
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "2f52776bda72517354d44453756cccb9e8de9afa"
|
|
35
35
|
}
|
package/dist/extractor.d.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { SessionEntry, MemoryCandidate, LLMClient } from "@devflow-tools/sdk";
|
|
2
|
-
import { type OllamaStatus } from './ollama-checker.js';
|
|
3
|
-
interface TelemetryEvent {
|
|
4
|
-
type?: string;
|
|
5
|
-
kind?: string;
|
|
6
|
-
toolName?: string;
|
|
7
|
-
mcpToolName?: string;
|
|
8
|
-
errorMessage?: string;
|
|
9
|
-
error?: string;
|
|
10
|
-
command?: string;
|
|
11
|
-
filePath?: string;
|
|
12
|
-
prompt?: string;
|
|
13
|
-
response?: string;
|
|
14
|
-
timestamp?: number;
|
|
15
|
-
}
|
|
16
|
-
export interface ExtractedMemory {
|
|
17
|
-
category: 'procedural' | 'semantic' | 'failure_lesson' | 'episodic';
|
|
18
|
-
content: string;
|
|
19
|
-
originalText?: string;
|
|
20
|
-
confidence: number;
|
|
21
|
-
}
|
|
22
|
-
export declare function extractMemories(events: TelemetryEvent[], ollamaStatus?: OllamaStatus): Promise<ExtractedMemory[]>;
|
|
23
|
-
interface ToolCallEvent {
|
|
24
|
-
tool: string;
|
|
25
|
-
command?: string;
|
|
26
|
-
exitCode?: number;
|
|
27
|
-
stderr?: string;
|
|
28
|
-
}
|
|
29
|
-
export declare function extractFromEvents(events: ToolCallEvent[]): ExtractedMemory[];
|
|
30
|
-
export declare function extractCandidates(sessionId: string, entries: SessionEntry[]): MemoryCandidate[];
|
|
31
|
-
export declare function setExtractionLLMClient(client: LLMClient): void;
|
|
32
|
-
export declare function isExtractionAvailable(): boolean;
|
|
33
|
-
export declare function extractViaClaudeAPI(events: Array<Record<string, unknown>>, sessionId: string): Promise<Array<{
|
|
34
|
-
category: string;
|
|
35
|
-
content: string;
|
|
36
|
-
confidence: number;
|
|
37
|
-
}>>;
|
|
38
|
-
export {};
|
|
39
|
-
//# sourceMappingURL=extractor.d.ts.map
|
package/dist/extractor.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzF,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EAAE,EACxB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,eAAe,EAAE,CAAC,CAc5B;AAoBD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8GD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,EAAE,CAI5E;AAsBD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EAAE,GACtB,eAAe,EAAE,CAoBnB;AAsBD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE9D;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAiB3E"}
|
package/dist/extractor.js
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { checkOllama, generateWithOllama } from './ollama-checker.js';
|
|
2
|
-
// L2 fallback patterns
|
|
3
|
-
const CORRECTION_PATTERNS = [
|
|
4
|
-
{
|
|
5
|
-
pattern: /(?:error|failed|fix|retry|correct|use|pass|provide)\s+([\s\S]{10,200}?)(?:\.\s|$)/i,
|
|
6
|
-
category: 'procedural',
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
pattern: /(?:discovered|found|this project uses|note:)\s+([\s\S]{10,200}?)(?:\.\s|$)/i,
|
|
10
|
-
category: 'semantic',
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
pattern: /(?:don't|never|should not|must not)\s+([\s\S]{10,200}?)(?:\.\s|$)/i,
|
|
14
|
-
category: 'failure_lesson',
|
|
15
|
-
},
|
|
16
|
-
];
|
|
17
|
-
async function extractWithOllama(events) {
|
|
18
|
-
const eventText = events.map(e => {
|
|
19
|
-
const tool = e.toolName ?? e.mcpToolName ?? e.type ?? 'unknown';
|
|
20
|
-
const error = e.errorMessage ?? e.error ?? '';
|
|
21
|
-
const response = e.response ?? '';
|
|
22
|
-
return `[${tool}] ${response} ${error ? `ERROR: ${error}` : ''}`.trim();
|
|
23
|
-
}).join('\n---\n');
|
|
24
|
-
const system = `You are a memory extraction system. Analyze the agent's conversation logs and extract memories that will help avoid repeating mistakes.
|
|
25
|
-
|
|
26
|
-
For each significant finding, output a JSON object with:
|
|
27
|
-
- "category": one of "procedural", "semantic", "failure_lesson", "episodic"
|
|
28
|
-
- "content": the memory text in English (translate Chinese input — accurate English improves search quality)
|
|
29
|
-
- "confidence": 0.0 to 1.0
|
|
30
|
-
|
|
31
|
-
Return ONLY a JSON array, no other text. Example:
|
|
32
|
-
[{"category":"procedural","content":"react_diagnose_bug requires stackTrace as string","confidence":0.9}]`;
|
|
33
|
-
try {
|
|
34
|
-
const text = await generateWithOllama(eventText.slice(0, 8000), system);
|
|
35
|
-
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
36
|
-
if (!jsonMatch)
|
|
37
|
-
return [];
|
|
38
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
39
|
-
return parsed.filter(e => e.content && e.category && e.confidence >= 0);
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return [];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function extractWithRules(events) {
|
|
46
|
-
const results = [];
|
|
47
|
-
for (const event of events) {
|
|
48
|
-
const text = [event.errorMessage, event.error, event.response, event.prompt].filter(Boolean).join(' ');
|
|
49
|
-
if (!text)
|
|
50
|
-
continue;
|
|
51
|
-
for (const { pattern, category } of CORRECTION_PATTERNS) {
|
|
52
|
-
const match = text.match(pattern);
|
|
53
|
-
if (match?.[1]) {
|
|
54
|
-
const content = match[1].trim();
|
|
55
|
-
if (content.length >= 10 && !results.some(r => r.content === content)) {
|
|
56
|
-
results.push({ content, category, confidence: 0.5 });
|
|
57
|
-
}
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return results;
|
|
63
|
-
}
|
|
64
|
-
export async function extractMemories(events, ollamaStatus) {
|
|
65
|
-
const status = ollamaStatus ?? await checkOllama();
|
|
66
|
-
let extracted = [];
|
|
67
|
-
if (status.installed && status.running && status.modelAvailable) {
|
|
68
|
-
extracted = await extractWithOllama(events);
|
|
69
|
-
}
|
|
70
|
-
if (extracted.length === 0) {
|
|
71
|
-
extracted = extractWithRules(events);
|
|
72
|
-
}
|
|
73
|
-
const MIN_CONFIDENCE = 0.4;
|
|
74
|
-
return extracted.filter(c => c.confidence >= MIN_CONFIDENCE);
|
|
75
|
-
}
|
|
76
|
-
// --- L1: Error keyword patterns for real-time extraction ---
|
|
77
|
-
const L1_ERROR_PATTERNS = [
|
|
78
|
-
{ pattern: /ENOENT:\s*no such file or directory/i, shortDesc: 'File not found (ENOENT)' },
|
|
79
|
-
{ pattern: /MODULE_NOT_FOUND/i, shortDesc: 'Module not found' },
|
|
80
|
-
{ pattern: /TypeError:\s*(.+?)(?:\n|$)/i, shortDesc: 'TypeError occurred' },
|
|
81
|
-
{ pattern: /ReferenceError:\s*(.+?)(?:\n|$)/i, shortDesc: 'ReferenceError occurred' },
|
|
82
|
-
{ pattern: /syntax error/i, shortDesc: 'Syntax error in command' },
|
|
83
|
-
{ pattern: /permission denied/i, shortDesc: 'Permission denied' },
|
|
84
|
-
{ pattern: /command not found/i, shortDesc: 'Command not found' },
|
|
85
|
-
{ pattern: /ECONNREFUSED/i, shortDesc: 'Connection refused' },
|
|
86
|
-
{ pattern: /ETIMEDOUT/i, shortDesc: 'Connection timed out' },
|
|
87
|
-
{ pattern: /Cannot find module\s+(['"`])(.+?)\1/i, shortDesc: 'Cannot find module' },
|
|
88
|
-
{ pattern: /FOREIGN KEY constraint failed/i, shortDesc: 'Foreign key constraint violation' },
|
|
89
|
-
{ pattern: /UNIQUE constraint failed/i, shortDesc: 'Unique constraint violation' },
|
|
90
|
-
{ pattern: /out of memory/i, shortDesc: 'Out of memory' },
|
|
91
|
-
];
|
|
92
|
-
function extractL1Errors(events) {
|
|
93
|
-
const results = [];
|
|
94
|
-
for (const event of events) {
|
|
95
|
-
// Skip non-Bash tools — they don't have meaningful exit codes/stderr
|
|
96
|
-
if (event.tool !== 'Bash' && event.tool !== 'bash_command')
|
|
97
|
-
continue;
|
|
98
|
-
// Multi-signal: stderr, exitCode, command keywords, HTTP status
|
|
99
|
-
const stderrText = event.stderr ?? '';
|
|
100
|
-
const hasErrorCode = event.exitCode !== undefined && event.exitCode !== null && event.exitCode !== 0;
|
|
101
|
-
const cmdLower = (event.command ?? '').toLowerCase();
|
|
102
|
-
const hasErrorKeyword = /error:|failed|traceback|fatal|killed/i.test(cmdLower);
|
|
103
|
-
const hasHttpError = /HTTP\s+[45]\d{2}/i.test(stderrText);
|
|
104
|
-
if (!stderrText && !hasErrorCode && !hasErrorKeyword && !hasHttpError)
|
|
105
|
-
continue;
|
|
106
|
-
const searchText = [stderrText, event.command].filter(Boolean).join(' ');
|
|
107
|
-
for (const { pattern, shortDesc } of L1_ERROR_PATTERNS) {
|
|
108
|
-
const match = searchText.match(pattern);
|
|
109
|
-
if (match) {
|
|
110
|
-
const detail = (match[1] ?? match[0]).slice(0, 80);
|
|
111
|
-
const content = `Error in \`${event.command ?? event.tool}\`: ${shortDesc} — ${detail}`;
|
|
112
|
-
if (!results.some(r => r.content === content)) {
|
|
113
|
-
results.push({
|
|
114
|
-
category: 'failure_lesson',
|
|
115
|
-
content,
|
|
116
|
-
confidence: hasErrorCode ? 0.85 : 0.5,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return results;
|
|
124
|
-
}
|
|
125
|
-
// L2: Command-result association — failure followed by success within 5 events
|
|
126
|
-
function extractL2Corrections(events) {
|
|
127
|
-
const results = [];
|
|
128
|
-
for (let i = 0; i < events.length; i++) {
|
|
129
|
-
const current = events[i];
|
|
130
|
-
if (!current?.command)
|
|
131
|
-
continue;
|
|
132
|
-
// Skip only confirmed success (exitCode === 0); NULL exitCode = unknown, don't skip
|
|
133
|
-
if (current.exitCode === 0)
|
|
134
|
-
continue;
|
|
135
|
-
for (let j = i + 1; j < Math.min(i + 6, events.length); j++) {
|
|
136
|
-
const later = events[j];
|
|
137
|
-
if (!later?.command)
|
|
138
|
-
continue;
|
|
139
|
-
// Skip only confirmed failures (exitCode !== 0 && !== null)
|
|
140
|
-
if (later.exitCode != null && later.exitCode !== 0)
|
|
141
|
-
continue;
|
|
142
|
-
const curBase = current.command.split(' ')[0];
|
|
143
|
-
const laterBase = later.command.split(' ')[0];
|
|
144
|
-
if (curBase === laterBase && later.command !== current.command) {
|
|
145
|
-
const content = `When \`${current.command.slice(0, 60)}\` fails, use \`${later.command.slice(0, 60)}\` instead`;
|
|
146
|
-
if (!results.some(r => r.content === content)) {
|
|
147
|
-
results.push({ category: 'procedural', content, confidence: 0.9 });
|
|
148
|
-
}
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return results;
|
|
154
|
-
}
|
|
155
|
-
// L3: Project knowledge from tool call patterns (even successful ones)
|
|
156
|
-
function extractL3Knowledge(events) {
|
|
157
|
-
const results = [];
|
|
158
|
-
for (const event of events) {
|
|
159
|
-
if (!event.command)
|
|
160
|
-
continue;
|
|
161
|
-
// install/npm commands revealing dependencies
|
|
162
|
-
if (event.command.match(/npm\s+(install|ci)|pnpm\s+(install|add)|yarn\s+add/)) {
|
|
163
|
-
const pkgMatch = event.command.match(/(?:install|add)\s+(?:-[\w]+\s+)*(@?[\w@./-]+)/);
|
|
164
|
-
if (pkgMatch?.[1]) {
|
|
165
|
-
const content = `Project uses package: ${pkgMatch[1]}`;
|
|
166
|
-
if (!results.some(r => r.content === content)) {
|
|
167
|
-
results.push({ category: 'semantic', content, confidence: 0.65 });
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// npx/dlx/pnpm exec revealing tooling
|
|
172
|
-
if (event.command.match(/npx\s+|pnpm\s+exec\s+|pnpm\s+dlx\s+/)) {
|
|
173
|
-
const toolMatch = event.command.match(/(?:npx|pnpm\s+(?:exec|dlx))\s+(.+?)\s*$/);
|
|
174
|
-
if (toolMatch?.[1]) {
|
|
175
|
-
const tool = toolMatch[1].trim();
|
|
176
|
-
const content = `Project uses tool: ${tool}`;
|
|
177
|
-
if (!results.some(r => r.content === content)) {
|
|
178
|
-
results.push({ category: 'semantic', content, confidence: 0.65 });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// npm scripts pattern
|
|
183
|
-
const scriptMatch = event.command.match(/npm\s+run\s+(\S+)/);
|
|
184
|
-
if (scriptMatch?.[1]) {
|
|
185
|
-
const content = `Project has npm script: ${scriptMatch[1]}`;
|
|
186
|
-
if (!results.some(r => r.content === content)) {
|
|
187
|
-
results.push({ category: 'semantic', content, confidence: 0.6 });
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return results;
|
|
192
|
-
}
|
|
193
|
-
export function extractFromEvents(events) {
|
|
194
|
-
const MIN_CONFIDENCE = 0.4;
|
|
195
|
-
return [...extractL1Errors(events), ...extractL2Corrections(events), ...extractL3Knowledge(events)]
|
|
196
|
-
.filter(c => c.confidence >= MIN_CONFIDENCE);
|
|
197
|
-
}
|
|
198
|
-
// --- Legacy extractor (backward compat) ---
|
|
199
|
-
const PATTERNS = [
|
|
200
|
-
{
|
|
201
|
-
pattern: /(?:Using|Used|Use)\s+(?:@?[A-Z][a-zA-Z]*\s+)?([A-Z][a-zA-Z]+)\s+(?:for|as|in)/,
|
|
202
|
-
type: "project",
|
|
203
|
-
extractKey: (m) => `stack:${m[1].toLowerCase()}`,
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
pattern: /follow(?:ed|ing|s)?\s+(?:the\s+)?([A-Za-z\s]+)\s+(?:pattern|convention)/i,
|
|
207
|
-
type: "project",
|
|
208
|
-
extractKey: (m) => `convention:${m[1].trim().toLowerCase().replace(/\s+/g, "-")}`,
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
pattern: /prefer(?:s|red)?\s+(?:to\s+)?(?:use\s+)?([A-Za-z]+)/i,
|
|
212
|
-
type: "project",
|
|
213
|
-
extractKey: (m) => `pref:${m[1].toLowerCase()}`,
|
|
214
|
-
},
|
|
215
|
-
];
|
|
216
|
-
export function extractCandidates(sessionId, entries) {
|
|
217
|
-
const candidates = [];
|
|
218
|
-
for (const entry of entries) {
|
|
219
|
-
for (const { pattern, type, extractKey } of PATTERNS) {
|
|
220
|
-
const match = entry.summary.match(pattern);
|
|
221
|
-
if (match) {
|
|
222
|
-
candidates.push({
|
|
223
|
-
id: `candidate:${sessionId}:${candidates.length}`,
|
|
224
|
-
type,
|
|
225
|
-
content: { key: extractKey(match), value: entry.summary },
|
|
226
|
-
confidence: 0.7,
|
|
227
|
-
source: sessionId,
|
|
228
|
-
});
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return candidates;
|
|
234
|
-
}
|
|
235
|
-
const MEMORY_EXTRACTION_PROMPT = `You are a memory extraction system. Given a list of tool calls
|
|
236
|
-
from a coding session, extract 3-8 structured memories. Each memory should
|
|
237
|
-
capture a meaningful observation, lesson, pattern, or decision.
|
|
238
|
-
|
|
239
|
-
For each memory, output JSON with:
|
|
240
|
-
- category: "procedural" | "failure_lesson" | "semantic" | "project_knowledge"
|
|
241
|
-
- content: one concise sentence
|
|
242
|
-
- confidence: 0.0-1.0
|
|
243
|
-
|
|
244
|
-
Rules:
|
|
245
|
-
- Ignore trivial operations (ls, cat, grep, echo, cd, pwd, etc.)
|
|
246
|
-
- Aggregate repeated similar calls into one memory
|
|
247
|
-
- Focus on what was LEARNED or CHANGED, not what was executed
|
|
248
|
-
- Prioritize errors and their fixes (high signal)
|
|
249
|
-
- Project tool usage patterns (e.g. "This project uses vitest for testing")
|
|
250
|
-
|
|
251
|
-
Respond with ONLY a JSON array.`;
|
|
252
|
-
let extractionClient = null;
|
|
253
|
-
export function setExtractionLLMClient(client) {
|
|
254
|
-
extractionClient = client;
|
|
255
|
-
}
|
|
256
|
-
export function isExtractionAvailable() {
|
|
257
|
-
return extractionClient?.isAvailable ?? false;
|
|
258
|
-
}
|
|
259
|
-
export async function extractViaClaudeAPI(events, sessionId) {
|
|
260
|
-
if (!extractionClient?.isAvailable) {
|
|
261
|
-
return [];
|
|
262
|
-
}
|
|
263
|
-
const response = await extractionClient.chat({
|
|
264
|
-
systemPrompt: MEMORY_EXTRACTION_PROMPT,
|
|
265
|
-
messages: [{
|
|
266
|
-
role: 'user',
|
|
267
|
-
content: `Session: ${sessionId}\nTool calls:\n${JSON.stringify(events, null, 2)}`,
|
|
268
|
-
}],
|
|
269
|
-
maxTokens: 1024,
|
|
270
|
-
});
|
|
271
|
-
const text = response.content;
|
|
272
|
-
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) ?? [null, text];
|
|
273
|
-
return JSON.parse(jsonMatch[1].trim());
|
|
274
|
-
}
|
|
275
|
-
//# sourceMappingURL=extractor.js.map
|
package/dist/extractor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/l2-evaluator.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { LLMClient } from '@devflow-tools/sdk';
|
|
2
|
-
export interface L2Candidate {
|
|
3
|
-
eventId: string;
|
|
4
|
-
toolName: string;
|
|
5
|
-
command?: string;
|
|
6
|
-
stderr?: string;
|
|
7
|
-
userMessage?: string;
|
|
8
|
-
l1Score: number;
|
|
9
|
-
dialogScore: number;
|
|
10
|
-
cumulativeScore: number;
|
|
11
|
-
}
|
|
12
|
-
export interface L2Decision {
|
|
13
|
-
eventId: string;
|
|
14
|
-
decision: 'keep' | 'discard' | 'merge';
|
|
15
|
-
mergeTargetId?: string;
|
|
16
|
-
category: 'failure_lesson' | 'project_knowledge' | 'procedural' | 'semantic' | 'mcp_correction';
|
|
17
|
-
content: string;
|
|
18
|
-
confidence: number;
|
|
19
|
-
}
|
|
20
|
-
export declare class L2Evaluator {
|
|
21
|
-
private llmClient;
|
|
22
|
-
setLLMClient(client: LLMClient): void;
|
|
23
|
-
get isAvailable(): boolean;
|
|
24
|
-
evaluate(candidates: L2Candidate[], sessionId: string): Promise<L2Decision[]>;
|
|
25
|
-
private callLLM;
|
|
26
|
-
/** Rule-based fallback when LLM is unavailable. */
|
|
27
|
-
private ruleFallback;
|
|
28
|
-
}
|
|
29
|
-
export declare function getL2Evaluator(): L2Evaluator;
|
|
30
|
-
export declare function setL2LLMClient(client: LLMClient): void;
|
|
31
|
-
//# sourceMappingURL=l2-evaluator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"l2-evaluator.d.ts","sourceRoot":"","sources":["../src/l2-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAChG,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0BD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA0B;IAE3C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIrC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAkBrE,OAAO;IA6BrB,mDAAmD;IACnD,OAAO,CAAC,YAAY;CAmBrB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEtD"}
|
package/dist/l2-evaluator.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
const L2_EVALUATION_PROMPT = `You are a memory curator for a developer tool. Evaluate whether each event should be saved as a permanent memory.
|
|
2
|
-
|
|
3
|
-
Judgment dimensions:
|
|
4
|
-
1. Reusability: How likely is this exact scenario to recur? (1-5)
|
|
5
|
-
2. Long-tail value: Would this still be useful 30 days later? (1-5)
|
|
6
|
-
3. Specificity: Is this project-specific knowledge, or generic programming knowledge? (1-5)
|
|
7
|
-
4. Actionability: Can someone act on this memory? (1-5)
|
|
8
|
-
|
|
9
|
-
Decision rules:
|
|
10
|
-
- Reusability >= 4 AND Long-tail >= 4 → keep
|
|
11
|
-
- Specificity >= 3 AND Actionability >= 4 → keep
|
|
12
|
-
- Otherwise → discard
|
|
13
|
-
- If very similar to an existing approved memory → merge (pick the better one)
|
|
14
|
-
|
|
15
|
-
Categories:
|
|
16
|
-
- "failure_lesson": Error patterns and their fixes
|
|
17
|
-
- "project_knowledge": Project-specific config, tooling, or conventions
|
|
18
|
-
- "procedural": Multi-step procedures and workflows
|
|
19
|
-
- "semantic": Facts about the codebase
|
|
20
|
-
- "mcp_correction": Corrections to MCP tool behavior
|
|
21
|
-
|
|
22
|
-
Output ONLY a JSON array, no other text. Each element:
|
|
23
|
-
{"eventId":"...","decision":"keep|discard|merge","mergeTargetId":"...","category":"...","content":"one concise sentence","confidence":0.0-1.0}`;
|
|
24
|
-
export class L2Evaluator {
|
|
25
|
-
llmClient = null;
|
|
26
|
-
setLLMClient(client) {
|
|
27
|
-
this.llmClient = client;
|
|
28
|
-
}
|
|
29
|
-
get isAvailable() {
|
|
30
|
-
return this.llmClient?.isAvailable ?? false;
|
|
31
|
-
}
|
|
32
|
-
async evaluate(candidates, sessionId) {
|
|
33
|
-
if (!this.llmClient?.isAvailable || candidates.length === 0) {
|
|
34
|
-
return this.ruleFallback(candidates);
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
const result = await Promise.race([
|
|
38
|
-
this.callLLM(candidates, sessionId),
|
|
39
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('L2 evaluation timeout')), 30_000)),
|
|
40
|
-
]);
|
|
41
|
-
return result;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return this.ruleFallback(candidates);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async callLLM(candidates, sessionId) {
|
|
48
|
-
const eventsJson = candidates.map(c => ({
|
|
49
|
-
eventId: c.eventId,
|
|
50
|
-
tool: c.toolName,
|
|
51
|
-
command: c.command,
|
|
52
|
-
error: c.stderr?.slice(0, 200),
|
|
53
|
-
userMessage: c.userMessage?.slice(0, 200),
|
|
54
|
-
scores: { l1: c.l1Score, dialog: c.dialogScore },
|
|
55
|
-
}));
|
|
56
|
-
const response = await this.llmClient.chat({
|
|
57
|
-
systemPrompt: L2_EVALUATION_PROMPT,
|
|
58
|
-
messages: [{
|
|
59
|
-
role: 'user',
|
|
60
|
-
content: `Session: ${sessionId}\nEvents to evaluate:\n${JSON.stringify(eventsJson, null, 2)}`,
|
|
61
|
-
}],
|
|
62
|
-
maxTokens: 2048,
|
|
63
|
-
});
|
|
64
|
-
const text = response.content;
|
|
65
|
-
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) ?? [null, text];
|
|
66
|
-
try {
|
|
67
|
-
const decisions = JSON.parse(jsonMatch[1].trim());
|
|
68
|
-
return decisions.filter(d => d.eventId && d.decision);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/** Rule-based fallback when LLM is unavailable. */
|
|
75
|
-
ruleFallback(candidates) {
|
|
76
|
-
return candidates
|
|
77
|
-
.filter(c => {
|
|
78
|
-
// Keep events with clear error patterns
|
|
79
|
-
const hasError = /error|fail|exception|timeout|refused|denied/i.test([c.stderr, c.command].filter(Boolean).join(' '));
|
|
80
|
-
return hasError && c.cumulativeScore >= 0.4;
|
|
81
|
-
})
|
|
82
|
-
.map(c => ({
|
|
83
|
-
eventId: c.eventId,
|
|
84
|
-
decision: 'keep',
|
|
85
|
-
category: 'failure_lesson',
|
|
86
|
-
content: c.stderr
|
|
87
|
-
? `Error with \`${c.command ?? c.toolName}\`: ${c.stderr.slice(0, 120)}`
|
|
88
|
-
: `Issue with \`${c.command ?? c.toolName}\``,
|
|
89
|
-
confidence: 0.55,
|
|
90
|
-
}));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/** Singleton — shared across MemoryGate instances in the same process. */
|
|
94
|
-
let instance = null;
|
|
95
|
-
export function getL2Evaluator() {
|
|
96
|
-
if (!instance)
|
|
97
|
-
instance = new L2Evaluator();
|
|
98
|
-
return instance;
|
|
99
|
-
}
|
|
100
|
-
export function setL2LLMClient(client) {
|
|
101
|
-
getL2Evaluator().setLLMClient(client);
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=l2-evaluator.js.map
|
package/dist/l2-evaluator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"l2-evaluator.js","sourceRoot":"","sources":["../src/l2-evaluator.ts"],"names":[],"mappings":"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"}
|
package/dist/llm-provider.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { LLMClient } from '@devflow-tools/sdk';
|
|
2
|
-
export interface LLMResponse {
|
|
3
|
-
content: string;
|
|
4
|
-
provider: string;
|
|
5
|
-
latencyMs: number;
|
|
6
|
-
}
|
|
7
|
-
export declare function setLLMClient(client: LLMClient): void;
|
|
8
|
-
export declare function callLLM(systemPrompt: string, userMessage: string): Promise<LLMResponse>;
|
|
9
|
-
//# sourceMappingURL=llm-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAgCtB"}
|
package/dist/llm-provider.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
let llmClient = null;
|
|
2
|
-
export function setLLMClient(client) {
|
|
3
|
-
llmClient = client;
|
|
4
|
-
}
|
|
5
|
-
export async function callLLM(systemPrompt, userMessage) {
|
|
6
|
-
const start = Date.now();
|
|
7
|
-
if (llmClient?.isAvailable) {
|
|
8
|
-
try {
|
|
9
|
-
const response = await llmClient.chat({
|
|
10
|
-
systemPrompt,
|
|
11
|
-
messages: [{ role: 'user', content: userMessage }],
|
|
12
|
-
maxTokens: 2048,
|
|
13
|
-
});
|
|
14
|
-
console.log('[LLMProvider] Used LLM client', {
|
|
15
|
-
provider: llmClient.name,
|
|
16
|
-
latencyMs: Date.now() - start,
|
|
17
|
-
});
|
|
18
|
-
return {
|
|
19
|
-
content: response.content,
|
|
20
|
-
provider: llmClient.name,
|
|
21
|
-
latencyMs: Date.now() - start,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
console.warn('[LLMProvider] LLM client failed, using rule fallback', {
|
|
26
|
-
error: err.message,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
console.log('[LLMProvider] Using rule fallback (no LLM available)');
|
|
31
|
-
return {
|
|
32
|
-
content: 'No LLM available',
|
|
33
|
-
provider: 'rules',
|
|
34
|
-
latencyMs: Date.now() - start,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=llm-provider.js.map
|
package/dist/llm-provider.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"AAQA,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,SAAS,GAAG,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,YAAoB,EACpB,WAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;gBACpC,YAAY;gBACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAClD,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE;gBAC3C,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC9B,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE;gBACnE,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO;QACL,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC9B,CAAC;AACJ,CAAC"}
|
package/dist/ollama-checker.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface OllamaStatus {
|
|
2
|
-
installed: boolean;
|
|
3
|
-
running: boolean;
|
|
4
|
-
modelAvailable: boolean;
|
|
5
|
-
modelName: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function checkOllama(modelName?: string): Promise<OllamaStatus>;
|
|
8
|
-
export declare function getOllamaInfoMessage(status: OllamaStatus): string | null;
|
|
9
|
-
export declare function generateWithOllama(prompt: string, system?: string, modelName?: string): Promise<string>;
|
|
10
|
-
//# sourceMappingURL=ollama-checker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-checker.d.ts","sourceRoot":"","sources":["../src/ollama-checker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAsB,WAAW,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB1F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAKxE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5H"}
|
package/dist/ollama-checker.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
const DEFAULT_MODEL = 'llama3.2';
|
|
3
|
-
export async function checkOllama(modelName = DEFAULT_MODEL) {
|
|
4
|
-
const status = { installed: false, running: false, modelAvailable: false, modelName };
|
|
5
|
-
try {
|
|
6
|
-
execSync('which ollama', { stdio: 'pipe' });
|
|
7
|
-
status.installed = true;
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return status;
|
|
11
|
-
}
|
|
12
|
-
try {
|
|
13
|
-
const resp = await fetch('http://localhost:11434/api/tags');
|
|
14
|
-
if (resp.ok) {
|
|
15
|
-
status.running = true;
|
|
16
|
-
const data = await resp.json();
|
|
17
|
-
status.modelAvailable = (data.models ?? []).some(m => m.name.startsWith(modelName));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
catch { /* server not running */ }
|
|
21
|
-
return status;
|
|
22
|
-
}
|
|
23
|
-
export function getOllamaInfoMessage(status) {
|
|
24
|
-
if (!status.installed)
|
|
25
|
-
return 'Ollama not installed. Install from https://ollama.com/download then run: ollama pull llama3.2';
|
|
26
|
-
if (!status.running)
|
|
27
|
-
return 'Ollama installed but not running. Start it with: ollama serve';
|
|
28
|
-
if (!status.modelAvailable)
|
|
29
|
-
return `Model ${status.modelName} not pulled. Run: ollama pull ${status.modelName}`;
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
export async function generateWithOllama(prompt, system, modelName = DEFAULT_MODEL) {
|
|
33
|
-
const resp = await fetch('http://localhost:11434/api/generate', {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: { 'Content-Type': 'application/json' },
|
|
36
|
-
body: JSON.stringify({ model: modelName, prompt, system, stream: false }),
|
|
37
|
-
});
|
|
38
|
-
if (!resp.ok)
|
|
39
|
-
throw new Error(`Ollama generate failed: ${resp.status} ${await resp.text()}`);
|
|
40
|
-
const data = await resp.json();
|
|
41
|
-
return data.response;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=ollama-checker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-checker.js","sourceRoot":"","sources":["../src/ollama-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS9C,MAAM,aAAa,GAAG,UAAU,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,YAAoB,aAAa;IACjE,MAAM,MAAM,GAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpG,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAA0C,CAAC;YACvE,MAAM,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,+FAA+F,CAAC;IAC9H,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,+DAA+D,CAAC;IAC5F,IAAI,CAAC,MAAM,CAAC,cAAc;QAAE,OAAO,SAAS,MAAM,CAAC,SAAS,iCAAiC,MAAM,CAAC,SAAS,EAAE,CAAC;IAChH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAe,EAAE,YAAoB,aAAa;IACzG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KAC1E,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAA0B,CAAC;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signal-detector.d.ts","sourceRoot":"","sources":["../src/signal-detector.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,sQAMf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,eAAe,CAAkD;IAEzE,KAAK,IAAI,IAAI;IAQb,MAAM,CACJ,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,SAAS,EAAE,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,MAAM,EAAE;IAiBX,OAAO,CAAC,WAAW;IA2FnB,OAAO,CAAC,YAAY;IAgEpB,OAAO,CAAC,eAAe;IAoDvB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,eAAe;CAgBxB"}
|