@devflow-tools/memory-engine 0.14.4 → 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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
function normalizeTitle(title) {
|
|
3
|
+
return title.normalize('NFKC').trim().toLocaleLowerCase('en-US').replace(/\s+/g, ' ');
|
|
4
|
+
}
|
|
5
|
+
export function applyV2ToV3Migration(db) {
|
|
6
|
+
db.exec(`
|
|
7
|
+
CREATE TABLE IF NOT EXISTS schema_versions (
|
|
8
|
+
version INTEGER PRIMARY KEY,
|
|
9
|
+
applied_at INTEGER
|
|
10
|
+
);
|
|
11
|
+
`);
|
|
12
|
+
const currentMax = db.prepare(`SELECT COALESCE(MAX(version), 0) as v FROM schema_versions`).get().v;
|
|
13
|
+
db.exec(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS distill_leases (
|
|
15
|
+
batch_id TEXT PRIMARY KEY,
|
|
16
|
+
event_ids TEXT NOT NULL,
|
|
17
|
+
session_ids TEXT NOT NULL,
|
|
18
|
+
event_count INTEGER NOT NULL,
|
|
19
|
+
created_at INTEGER NOT NULL,
|
|
20
|
+
expires_at INTEGER NOT NULL,
|
|
21
|
+
status TEXT NOT NULL CHECK (status IN ('pending','committed','expired'))
|
|
22
|
+
);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_leases_expires ON distill_leases(status, expires_at);
|
|
24
|
+
`);
|
|
25
|
+
if (currentMax < 3) {
|
|
26
|
+
db.prepare(`INSERT INTO schema_versions (version, applied_at) VALUES (3, ?)`).run(Date.now());
|
|
27
|
+
}
|
|
28
|
+
// v3 quality fields are additive for fresh databases and are rebuilt here for
|
|
29
|
+
// v2 databases whose observations still have the retired CHECK constraint.
|
|
30
|
+
const memoryColumns = db.pragma('table_info(memories)');
|
|
31
|
+
if (memoryColumns.length > 0 && !memoryColumns.some(column => column.name === 'last_accessed_at')) {
|
|
32
|
+
db.exec('ALTER TABLE memories ADD COLUMN last_accessed_at INTEGER');
|
|
33
|
+
}
|
|
34
|
+
const observationColumns = db.pragma('table_info(observations)');
|
|
35
|
+
const observationSql = db.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'observations'").get()?.sql ?? '';
|
|
36
|
+
const needsRebuild = observationColumns.length > 0 && (!observationColumns.some(column => column.name === 'source')
|
|
37
|
+
|| !observationColumns.some(column => column.name === 'dedup_key')
|
|
38
|
+
|| observationSql.includes('session_summary'));
|
|
39
|
+
if (needsRebuild) {
|
|
40
|
+
db.pragma('foreign_keys = OFF');
|
|
41
|
+
db.exec(`
|
|
42
|
+
CREATE TABLE observations_v3_new (
|
|
43
|
+
id TEXT PRIMARY KEY,
|
|
44
|
+
session_id TEXT NOT NULL,
|
|
45
|
+
project TEXT NOT NULL DEFAULT '',
|
|
46
|
+
type TEXT NOT NULL,
|
|
47
|
+
title TEXT NOT NULL,
|
|
48
|
+
narrative TEXT NOT NULL DEFAULT '',
|
|
49
|
+
facts TEXT NOT NULL DEFAULT '[]',
|
|
50
|
+
files TEXT NOT NULL DEFAULT '[]',
|
|
51
|
+
tools TEXT NOT NULL DEFAULT '[]',
|
|
52
|
+
concepts TEXT NOT NULL DEFAULT '[]',
|
|
53
|
+
importance INTEGER NOT NULL DEFAULT 5,
|
|
54
|
+
confidence REAL NOT NULL DEFAULT 0.5,
|
|
55
|
+
source TEXT NOT NULL DEFAULT 'distill',
|
|
56
|
+
dedup_key TEXT,
|
|
57
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
58
|
+
updated_at INTEGER NOT NULL,
|
|
59
|
+
source_event_ids TEXT NOT NULL DEFAULT '[]',
|
|
60
|
+
memory_id TEXT,
|
|
61
|
+
embedding BLOB,
|
|
62
|
+
timestamp INTEGER NOT NULL
|
|
63
|
+
);
|
|
64
|
+
INSERT INTO observations_v3_new
|
|
65
|
+
(id, session_id, project, type, title, narrative, facts, files, tools,
|
|
66
|
+
concepts, importance, confidence, source, dedup_key, access_count,
|
|
67
|
+
updated_at, source_event_ids, memory_id, embedding, timestamp)
|
|
68
|
+
SELECT id, session_id, project, type, title, narrative, facts, files, tools,
|
|
69
|
+
concepts, importance, confidence, 'distill', NULL, 0, timestamp,
|
|
70
|
+
source_event_ids, memory_id, embedding, timestamp
|
|
71
|
+
FROM observations;
|
|
72
|
+
DROP TABLE observations;
|
|
73
|
+
ALTER TABLE observations_v3_new RENAME TO observations;
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_observations_session ON observations(session_id);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_observations_project ON observations(project);
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_observations_memory ON observations(memory_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_observations_type ON observations(type);
|
|
78
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_observations_dedup ON observations(dedup_key);
|
|
79
|
+
`);
|
|
80
|
+
db.pragma('foreign_keys = ON');
|
|
81
|
+
}
|
|
82
|
+
else if (observationColumns.length > 0) {
|
|
83
|
+
const addColumn = (name, sql) => {
|
|
84
|
+
if (!observationColumns.some(column => column.name === name))
|
|
85
|
+
db.exec(sql);
|
|
86
|
+
};
|
|
87
|
+
addColumn('source', "ALTER TABLE observations ADD COLUMN source TEXT NOT NULL DEFAULT 'distill'");
|
|
88
|
+
addColumn('dedup_key', 'ALTER TABLE observations ADD COLUMN dedup_key TEXT');
|
|
89
|
+
addColumn('access_count', 'ALTER TABLE observations ADD COLUMN access_count INTEGER NOT NULL DEFAULT 0');
|
|
90
|
+
addColumn('updated_at', 'ALTER TABLE observations ADD COLUMN updated_at INTEGER NOT NULL DEFAULT 0');
|
|
91
|
+
db.exec('UPDATE observations SET updated_at = timestamp WHERE updated_at = 0');
|
|
92
|
+
db.exec('CREATE UNIQUE INDEX IF NOT EXISTS idx_observations_dedup ON observations(dedup_key)');
|
|
93
|
+
}
|
|
94
|
+
const migratedObservationColumns = db.pragma('table_info(observations)');
|
|
95
|
+
if (migratedObservationColumns.some(column => column.name === 'dedup_key')) {
|
|
96
|
+
const tables = new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(row => row.name));
|
|
97
|
+
const rows = db.prepare('SELECT id, type, title FROM observations ORDER BY timestamp DESC, id DESC').all();
|
|
98
|
+
const updateKey = db.prepare('UPDATE observations SET dedup_key = ? WHERE id = ?');
|
|
99
|
+
const deleteDuplicate = db.prepare('DELETE FROM observations WHERE id = ?');
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
db.transaction(() => {
|
|
102
|
+
for (const row of rows) {
|
|
103
|
+
const key = createHash('sha256').update(`${row.type}|${normalizeTitle(row.title)}`).digest('hex');
|
|
104
|
+
if (seen.has(key)) {
|
|
105
|
+
if (tables.has('embeddings')) {
|
|
106
|
+
db.prepare("DELETE FROM embeddings WHERE source_type = 'observation' AND source_id = ?").run(row.id);
|
|
107
|
+
}
|
|
108
|
+
if (tables.has('observation_concepts')) {
|
|
109
|
+
db.prepare('DELETE FROM observation_concepts WHERE observation_id = ?').run(row.id);
|
|
110
|
+
}
|
|
111
|
+
deleteDuplicate.run(row.id);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
seen.add(key);
|
|
115
|
+
updateKey.run(key, row.id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
db.exec('CREATE UNIQUE INDEX IF NOT EXISTS idx_observations_dedup ON observations(dedup_key)');
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=v2-to-v3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-to-v3.js","sourceRoot":"","sources":["../../src/migrations/v2-to-v3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-to-v3.test.d.ts","sourceRoot":"","sources":["../../src/migrations/v2-to-v3.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import { applyV2ToV3Migration } from "./v2-to-v3.js";
|
|
4
|
+
describe("v2-to-v3 migration", () => {
|
|
5
|
+
let db;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
db = new Database(":memory:");
|
|
8
|
+
db.exec(`CREATE TABLE schema_versions (version INTEGER PRIMARY KEY, applied_at INTEGER)`);
|
|
9
|
+
db.prepare(`INSERT INTO schema_versions VALUES (2, ?)`).run(Date.now());
|
|
10
|
+
});
|
|
11
|
+
it("creates distill_leases table with correct schema", () => {
|
|
12
|
+
applyV2ToV3Migration(db);
|
|
13
|
+
const cols = db.prepare(`PRAGMA table_info(distill_leases)`).all();
|
|
14
|
+
const names = cols.map(c => c.name).sort();
|
|
15
|
+
expect(names).toEqual(["batch_id", "created_at", "event_count", "event_ids", "expires_at", "session_ids", "status"]);
|
|
16
|
+
});
|
|
17
|
+
it("creates index on (status, expires_at)", () => {
|
|
18
|
+
applyV2ToV3Migration(db);
|
|
19
|
+
const indexes = db.prepare(`PRAGMA index_list(distill_leases)`).all();
|
|
20
|
+
expect(indexes.some(i => i.name === "idx_leases_expires")).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it("updates schema_versions to 3", () => {
|
|
23
|
+
applyV2ToV3Migration(db);
|
|
24
|
+
const rows = db.prepare(`SELECT version FROM schema_versions ORDER BY version`).all();
|
|
25
|
+
expect(rows.map(r => r.version)).toContain(3);
|
|
26
|
+
});
|
|
27
|
+
it("is idempotent (re-run does not throw or duplicate)", () => {
|
|
28
|
+
applyV2ToV3Migration(db);
|
|
29
|
+
expect(() => applyV2ToV3Migration(db)).not.toThrow();
|
|
30
|
+
const count = db.prepare(`SELECT COUNT(*) as n FROM schema_versions WHERE version = 3`).get().n;
|
|
31
|
+
expect(count).toBe(1);
|
|
32
|
+
});
|
|
33
|
+
it("does not duplicate version 3 if it already exists", () => {
|
|
34
|
+
db.prepare(`INSERT INTO schema_versions VALUES (3, ?)`).run(Date.now());
|
|
35
|
+
expect(() => applyV2ToV3Migration(db)).not.toThrow();
|
|
36
|
+
const count = db.prepare(`SELECT COUNT(*) as n FROM schema_versions WHERE version = 3`).get().n;
|
|
37
|
+
expect(count).toBe(1);
|
|
38
|
+
});
|
|
39
|
+
it("allows inserting a lease row", () => {
|
|
40
|
+
applyV2ToV3Migration(db);
|
|
41
|
+
db.prepare(`
|
|
42
|
+
INSERT INTO distill_leases (batch_id, event_ids, session_ids, event_count, created_at, expires_at, status)
|
|
43
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
44
|
+
`).run("batch1", '["e1","e2"]', '["s1"]', 2, Date.now(), Date.now() + 600_000, "pending");
|
|
45
|
+
const row = db.prepare(`SELECT * FROM distill_leases WHERE batch_id = 'batch1'`).get();
|
|
46
|
+
expect(row).toBeDefined();
|
|
47
|
+
});
|
|
48
|
+
it("rejects invalid lease status", () => {
|
|
49
|
+
applyV2ToV3Migration(db);
|
|
50
|
+
expect(() => db.prepare(`
|
|
51
|
+
INSERT INTO distill_leases (batch_id, event_ids, session_ids, event_count, created_at, expires_at, status)
|
|
52
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
53
|
+
`).run("batch1", "[]", "[]", 0, Date.now(), Date.now(), "open")).toThrow();
|
|
54
|
+
});
|
|
55
|
+
it("rebuilds legacy observations with quality columns and exact dedup", () => {
|
|
56
|
+
db.exec(`
|
|
57
|
+
CREATE TABLE memories (id TEXT PRIMARY KEY);
|
|
58
|
+
CREATE TABLE observations (
|
|
59
|
+
id TEXT PRIMARY KEY, session_id TEXT NOT NULL, project TEXT NOT NULL DEFAULT '',
|
|
60
|
+
type TEXT NOT NULL CHECK(type IN ('session_summary','config_discovery')),
|
|
61
|
+
title TEXT NOT NULL, narrative TEXT NOT NULL DEFAULT '', facts TEXT NOT NULL DEFAULT '[]',
|
|
62
|
+
files TEXT NOT NULL DEFAULT '[]', tools TEXT NOT NULL DEFAULT '[]', concepts TEXT NOT NULL DEFAULT '[]',
|
|
63
|
+
importance INTEGER NOT NULL DEFAULT 5, confidence REAL NOT NULL DEFAULT 0.5,
|
|
64
|
+
source_event_ids TEXT NOT NULL DEFAULT '[]', memory_id TEXT, embedding BLOB, timestamp INTEGER NOT NULL
|
|
65
|
+
);
|
|
66
|
+
INSERT INTO observations (id, session_id, type, title, timestamp) VALUES
|
|
67
|
+
('old-1', 's1', 'config_discovery', 'Workspace Config', 1),
|
|
68
|
+
('old-2', 's2', 'config_discovery', ' workspace config ', 2);
|
|
69
|
+
`);
|
|
70
|
+
applyV2ToV3Migration(db);
|
|
71
|
+
const memoryColumns = db.pragma('table_info(memories)');
|
|
72
|
+
const observationColumns = db.pragma('table_info(observations)');
|
|
73
|
+
expect(memoryColumns.map(column => column.name)).toContain('last_accessed_at');
|
|
74
|
+
expect(observationColumns.map(column => column.name)).toEqual(expect.arrayContaining([
|
|
75
|
+
'source', 'dedup_key', 'access_count', 'updated_at',
|
|
76
|
+
]));
|
|
77
|
+
expect(db.prepare('SELECT COUNT(*) count FROM observations').get()).toMatchObject({ count: 1 });
|
|
78
|
+
expect(db.prepare('SELECT source, dedup_key FROM observations').get()).toMatchObject({
|
|
79
|
+
source: 'distill', dedup_key: expect.stringMatching(/^[a-f0-9]{64}$/),
|
|
80
|
+
});
|
|
81
|
+
expect(() => db.prepare(`
|
|
82
|
+
INSERT INTO observations
|
|
83
|
+
(id, session_id, type, title, updated_at, timestamp)
|
|
84
|
+
VALUES ('new-1', 's3', 'user_preference', 'Use npm run dev', 3, 3)
|
|
85
|
+
`).run()).not.toThrow();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=v2-to-v3.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-to-v3.test.js","sourceRoot":"","sources":["../../src/migrations/v2-to-v3.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,EAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9B,EAAE,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;QAC1F,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAyC,CAAC;QAC1G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAA2B,CAAC;QAC/F,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAA8B,CAAC;QAClH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,EAAkB,CAAC,CAAC,CAAC;QACjH,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,EAAkB,CAAC,CAAC,CAAC;QACjH,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,EAAE,CAAC;QACvF,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;KAaP,CAAC,CAAC;QAEH,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAA4B,CAAC;QACnF,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAA4B,CAAC;QAC5F,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/E,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;YACnF,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY;SACpD,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC;YACnF,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC;SACtE,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIvB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const OBSERVATION_TYPES: readonly ["project_convention", "error_resolution", "config_discovery", "user_preference", "decision_made", "file_relationship", "api_shape"];
|
|
2
|
+
export type ObservationType = (typeof OBSERVATION_TYPES)[number];
|
|
3
|
+
export type ObservationSource = 'distill' | 'explicit_intent' | 'manual';
|
|
4
|
+
export declare function isObservationType(value: unknown): value is ObservationType;
|
|
5
|
+
export declare function normalizeObservationTitle(title: string): string;
|
|
6
|
+
export declare function observationDedupKey(type: ObservationType, title: string): string;
|
|
7
|
+
//# sourceMappingURL=observation-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation-types.d.ts","sourceRoot":"","sources":["../src/observation-types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,+IAQpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAIzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export const OBSERVATION_TYPES = [
|
|
3
|
+
'project_convention',
|
|
4
|
+
'error_resolution',
|
|
5
|
+
'config_discovery',
|
|
6
|
+
'user_preference',
|
|
7
|
+
'decision_made',
|
|
8
|
+
'file_relationship',
|
|
9
|
+
'api_shape',
|
|
10
|
+
];
|
|
11
|
+
const OBSERVATION_TYPE_SET = new Set(OBSERVATION_TYPES);
|
|
12
|
+
export function isObservationType(value) {
|
|
13
|
+
return typeof value === 'string' && OBSERVATION_TYPE_SET.has(value);
|
|
14
|
+
}
|
|
15
|
+
export function normalizeObservationTitle(title) {
|
|
16
|
+
return title
|
|
17
|
+
.normalize('NFKC')
|
|
18
|
+
.trim()
|
|
19
|
+
.toLocaleLowerCase('en-US')
|
|
20
|
+
.replace(/\s+/g, ' ');
|
|
21
|
+
}
|
|
22
|
+
export function observationDedupKey(type, title) {
|
|
23
|
+
return createHash('sha256')
|
|
24
|
+
.update(`${type}|${normalizeObservationTitle(title)}`)
|
|
25
|
+
.digest('hex');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=observation-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation-types.js","sourceRoot":"","sources":["../src/observation-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oBAAoB;IACpB,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,mBAAmB;IACnB,WAAW;CACH,CAAC;AAKX,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,iBAAiB,CAAC,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,KAAK;SACT,SAAS,CAAC,MAAM,CAAC;SACjB,IAAI,EAAE;SACN,iBAAiB,CAAC,OAAO,CAAC;SAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAqB,EAAE,KAAa;IACtE,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,IAAI,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;SACrD,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-validator.d.ts","sourceRoot":"","sources":["../src/project-validator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAwBtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"project-validator.d.ts","sourceRoot":"","sources":["../src/project-validator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAwBtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAI7D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
export function validateProjectRoot(rootPath) {
|
|
4
4
|
const pkgJson = join(rootPath, 'package.json');
|
|
@@ -27,7 +27,6 @@ export function hasForceInitSentinel(rootPath) {
|
|
|
27
27
|
return existsSync(join(rootPath, '.devflow', '.force-init'));
|
|
28
28
|
}
|
|
29
29
|
export function writeForceInitSentinel(rootPath) {
|
|
30
|
-
const { mkdirSync, writeFileSync } = require('node:fs');
|
|
31
30
|
const dir = join(rootPath, '.devflow');
|
|
32
31
|
if (!existsSync(dir))
|
|
33
32
|
mkdirSync(dir, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-validator.js","sourceRoot":"","sources":["../src/project-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"project-validator.js","sourceRoot":"","sources":["../src/project-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,iDAAiD;YACzD,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,4DAA4D;YACpE,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RuleEvent {
|
|
2
|
+
tool: string;
|
|
3
|
+
command?: string;
|
|
4
|
+
exitCode?: number;
|
|
5
|
+
stderr?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RuleMemory {
|
|
8
|
+
category: 'procedural' | 'semantic' | 'failure_lesson' | 'episodic';
|
|
9
|
+
content: string;
|
|
10
|
+
originalText?: string;
|
|
11
|
+
confidence: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function extractRuleMemories(events: RuleEvent[]): RuleMemory[];
|
|
14
|
+
//# sourceMappingURL=rule-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-extractor.d.ts","sourceRoot":"","sources":["../src/rule-extractor.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,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;AA6GD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAMrE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const ERROR_PATTERNS = [
|
|
2
|
+
{ pattern: /ENOENT:\s*no such file or directory/i, shortDesc: 'File not found (ENOENT)' },
|
|
3
|
+
{ pattern: /MODULE_NOT_FOUND/i, shortDesc: 'Module not found' },
|
|
4
|
+
{ pattern: /TypeError:\s*(.+?)(?:\n|$)/i, shortDesc: 'TypeError occurred' },
|
|
5
|
+
{ pattern: /ReferenceError:\s*(.+?)(?:\n|$)/i, shortDesc: 'ReferenceError occurred' },
|
|
6
|
+
{ pattern: /syntax error/i, shortDesc: 'Syntax error in command' },
|
|
7
|
+
{ pattern: /permission denied/i, shortDesc: 'Permission denied' },
|
|
8
|
+
{ pattern: /command not found/i, shortDesc: 'Command not found' },
|
|
9
|
+
{ pattern: /ECONNREFUSED/i, shortDesc: 'Connection refused' },
|
|
10
|
+
{ pattern: /ETIMEDOUT/i, shortDesc: 'Connection timed out' },
|
|
11
|
+
{ pattern: /Cannot find module\s+(['"`])(.+?)\1/i, shortDesc: 'Cannot find module' },
|
|
12
|
+
{ pattern: /FOREIGN KEY constraint failed/i, shortDesc: 'Foreign key constraint violation' },
|
|
13
|
+
{ pattern: /UNIQUE constraint failed/i, shortDesc: 'Unique constraint violation' },
|
|
14
|
+
{ pattern: /out of memory/i, shortDesc: 'Out of memory' },
|
|
15
|
+
];
|
|
16
|
+
function extractFailures(events) {
|
|
17
|
+
const results = [];
|
|
18
|
+
for (const event of events) {
|
|
19
|
+
if (event.tool !== 'Bash' && event.tool !== 'bash_command')
|
|
20
|
+
continue;
|
|
21
|
+
const stderrText = event.stderr ?? '';
|
|
22
|
+
const hasErrorCode = event.exitCode !== undefined && event.exitCode !== null && event.exitCode !== 0;
|
|
23
|
+
const hasErrorKeyword = /error:|failed|traceback|fatal|killed/i.test(event.command ?? '');
|
|
24
|
+
const hasHttpError = /HTTP\s+[45]\d{2}/i.test(stderrText);
|
|
25
|
+
if (!stderrText && !hasErrorCode && !hasErrorKeyword && !hasHttpError)
|
|
26
|
+
continue;
|
|
27
|
+
const searchText = [stderrText, event.command].filter(Boolean).join(' ');
|
|
28
|
+
for (const { pattern, shortDesc } of ERROR_PATTERNS) {
|
|
29
|
+
const match = searchText.match(pattern);
|
|
30
|
+
if (!match)
|
|
31
|
+
continue;
|
|
32
|
+
const detail = (match[1] ?? match[0]).slice(0, 80);
|
|
33
|
+
const content = `Error in \`${event.command ?? event.tool}\`: ${shortDesc} — ${detail}`;
|
|
34
|
+
if (!results.some(result => result.content === content)) {
|
|
35
|
+
results.push({
|
|
36
|
+
category: 'failure_lesson',
|
|
37
|
+
content,
|
|
38
|
+
confidence: hasErrorCode ? 0.85 : 0.5,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
function extractCorrections(events) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (let index = 0; index < events.length; index++) {
|
|
49
|
+
const current = events[index];
|
|
50
|
+
if (!current?.command || current.exitCode === 0)
|
|
51
|
+
continue;
|
|
52
|
+
for (let laterIndex = index + 1; laterIndex < Math.min(index + 6, events.length); laterIndex++) {
|
|
53
|
+
const later = events[laterIndex];
|
|
54
|
+
if (!later?.command || (later.exitCode != null && later.exitCode !== 0))
|
|
55
|
+
continue;
|
|
56
|
+
const currentBase = current.command.split(' ')[0];
|
|
57
|
+
const laterBase = later.command.split(' ')[0];
|
|
58
|
+
if (currentBase === laterBase && later.command !== current.command) {
|
|
59
|
+
const content = `When \`${current.command.slice(0, 60)}\` fails, use \`${later.command.slice(0, 60)}\` instead`;
|
|
60
|
+
if (!results.some(result => result.content === content)) {
|
|
61
|
+
results.push({ category: 'procedural', content, confidence: 0.9 });
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
69
|
+
function extractProjectKnowledge(events) {
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const event of events) {
|
|
72
|
+
if (!event.command)
|
|
73
|
+
continue;
|
|
74
|
+
if (/npm\s+(install|ci)|pnpm\s+(install|add)|yarn\s+add/.test(event.command)) {
|
|
75
|
+
const packageMatch = event.command.match(/(?:install|add)\s+(?:-[\w]+\s+)*(@?[\w@./-]+)/);
|
|
76
|
+
if (packageMatch?.[1]) {
|
|
77
|
+
const content = `Project uses package: ${packageMatch[1]}`;
|
|
78
|
+
if (!results.some(result => result.content === content)) {
|
|
79
|
+
results.push({ category: 'semantic', content, confidence: 0.65 });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (/npx\s+|pnpm\s+exec\s+|pnpm\s+dlx\s+/.test(event.command)) {
|
|
84
|
+
const toolMatch = event.command.match(/(?:npx|pnpm\s+(?:exec|dlx))\s+(.+?)\s*$/);
|
|
85
|
+
if (toolMatch?.[1]) {
|
|
86
|
+
const content = `Project uses tool: ${toolMatch[1].trim()}`;
|
|
87
|
+
if (!results.some(result => result.content === content)) {
|
|
88
|
+
results.push({ category: 'semantic', content, confidence: 0.65 });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const scriptMatch = event.command.match(/npm\s+run\s+(\S+)/);
|
|
93
|
+
if (scriptMatch?.[1]) {
|
|
94
|
+
const content = `Project has npm script: ${scriptMatch[1]}`;
|
|
95
|
+
if (!results.some(result => result.content === content)) {
|
|
96
|
+
results.push({ category: 'semantic', content, confidence: 0.6 });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
export function extractRuleMemories(events) {
|
|
103
|
+
return [
|
|
104
|
+
...extractFailures(events),
|
|
105
|
+
...extractCorrections(events),
|
|
106
|
+
...extractProjectKnowledge(events),
|
|
107
|
+
].filter(candidate => candidate.confidence >= 0.4);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=rule-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-extractor.js","sourceRoot":"","sources":["../src/rule-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { type EventGroup } from './event-grouper.js';
|
|
2
|
+
import { type ObservationType } from './observation-types.js';
|
|
3
|
+
export { OBSERVATION_TYPES } from './observation-types.js';
|
|
4
|
+
export type { ObservationType } from './observation-types.js';
|
|
5
|
+
export declare const DEFAULT_PROMPT_TOKEN_BUDGET = 4000;
|
|
6
|
+
export declare const SUMMARY_SYSTEM = "You are a session summarizer for DevFlow, a developer toolchain AI.\nYour task is to analyze groups of tool-call events from a coding session and extract structured observations.\n\nFor each group, produce ONE observation (omit groups with no meaningful insight).\n\nOutput a JSON array of observations. Each observation:\n- type: exactly one of \"project_convention\" | \"error_resolution\" | \"config_discovery\" | \"user_preference\" | \"decision_made\" | \"file_relationship\" | \"api_shape\"\n- title: short summary (max 80 chars, in English)\n- narrative: 1-2 sentence description of what happened and why it matters\n- facts: array of strings - specific factual statements\n- concepts: array of 1-5 key concepts/topics (lowercase, single words or short phrases)\n- importance: 1-10 (10 = critical fix or key decision, 5 = notable, 1 = trivial)\n- confidence: 0.0-1.0\n\nRules:\n- Focus on WHAT WAS LEARNED, not what was executed\n- Errors + their fixes = high signal (importance 7-10)\n- Config discoveries = medium signal (importance 5-7)\n- Routine operations (ls, cat, cd) = skip\n- Classify only durable, reusable project knowledge. Use project_convention for repository rules,\n user_preference for explicit user choices, file_relationship for meaningful file dependencies,\n and api_shape for interfaces, schemas, or call contracts.\n- If a group cannot be assigned to exactly one of the seven types, omit it. If the whole batch\n has no classifiable project knowledge, return [] rather than a session recap or tool log.\n- Translate non-English content to English\n- Return ONLY the JSON array, no markdown, no explanation\n\nGOOD example:\n[{\"type\":\"project_convention\",\"title\":\"Tests run through the workspace Vitest script\",\"narrative\":\"The repository defines its test entry point as npm test in the package workspace.\",\"facts\":[\"packages/memory-engine/package.json defines test as vitest run\",\"Tests should be invoked through the workspace script\"],\"concepts\":[\"vitest\",\"npm\",\"workspace\"],\"importance\":7,\"confidence\":0.95}]\n\nBAD examples (do not emit these):\n[{\"type\":\"session_summary\",\"title\":\"Worked on the memory engine\",\"narrative\":\"The developer inspected files, ran commands, and made changes.\",\"facts\":[\"Several tools were used\"],\"concepts\":[\"session\"],\"importance\":3,\"confidence\":0.9}]\n[{\"type\":\"user_insight\",\"title\":\"The session had an error\",\"narrative\":\"An error happened and was investigated.\",\"facts\":[\"A command failed\"],\"concepts\":[\"error\"],\"importance\":4,\"confidence\":0.8}]\n[{\"type\":\"file_operation\",\"title\":\"Read and edited files\",\"narrative\":\"The developer read files and then edited them.\",\"facts\":[\"Files were changed\"],\"concepts\":[\"files\"],\"importance\":2,\"confidence\":0.99}]";
|
|
7
|
+
export declare function buildSummaryPrompt(groups: EventGroup[], tokenBudget?: number): string;
|
|
8
|
+
export interface ParsedObservation {
|
|
9
|
+
type: ObservationType;
|
|
10
|
+
title: string;
|
|
11
|
+
narrative?: string;
|
|
12
|
+
facts?: string[];
|
|
13
|
+
concepts?: string[];
|
|
14
|
+
importance?: number;
|
|
15
|
+
confidence?: number;
|
|
8
16
|
}
|
|
9
|
-
export declare function
|
|
17
|
+
export declare function estimatePromptTokens(text: string): number;
|
|
10
18
|
//# sourceMappingURL=session-summarizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-summarizer.d.ts","sourceRoot":"","sources":["../src/session-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"session-summarizer.d.ts","sourceRoot":"","sources":["../src/session-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAGhD,eAAO,MAAM,cAAc,6wFAiCmL,CAAC;AAE/M,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,WAAW,SAA8B,GACxC,MAAM,CAyBR;AAqBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|