claude-memory-layer 1.0.9 → 1.0.10
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/.history/package_20260202121115.json +49 -0
- package/dist/cli/index.js +107 -3
- package/dist/cli/index.js.map +2 -2
- package/dist/core/index.js +78 -0
- package/dist/core/index.js.map +2 -2
- package/dist/hooks/post-tool-use.js +107 -3
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/session-end.js +107 -3
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +107 -3
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +107 -3
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +140 -70
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/server/api/index.js +107 -3
- package/dist/server/api/index.js.map +2 -2
- package/dist/server/index.js +107 -3
- package/dist/server/index.js.map +2 -2
- package/dist/services/memory-service.js +124 -3
- package/dist/services/memory-service.js.map +2 -2
- package/package.json +1 -1
- package/src/core/sqlite-event-store.ts +98 -0
- package/src/hooks/user-prompt-submit.ts +34 -60
- package/src/services/memory-service.ts +71 -4
package/dist/core/index.js
CHANGED
|
@@ -1607,6 +1607,28 @@ var SQLiteEventStore = class {
|
|
|
1607
1607
|
CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence);
|
|
1608
1608
|
CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at);
|
|
1609
1609
|
CREATE INDEX IF NOT EXISTS idx_embedding_outbox_status ON embedding_outbox(status);
|
|
1610
|
+
|
|
1611
|
+
-- FTS5 Full-Text Search for fast keyword search
|
|
1612
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(
|
|
1613
|
+
content,
|
|
1614
|
+
event_id UNINDEXED,
|
|
1615
|
+
content='events',
|
|
1616
|
+
content_rowid='rowid'
|
|
1617
|
+
);
|
|
1618
|
+
|
|
1619
|
+
-- Triggers to keep FTS in sync with events table
|
|
1620
|
+
CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN
|
|
1621
|
+
INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);
|
|
1622
|
+
END;
|
|
1623
|
+
|
|
1624
|
+
CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN
|
|
1625
|
+
INSERT INTO events_fts(events_fts, rowid, content, event_id) VALUES('delete', OLD.rowid, OLD.content, OLD.id);
|
|
1626
|
+
END;
|
|
1627
|
+
|
|
1628
|
+
CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN
|
|
1629
|
+
INSERT INTO events_fts(events_fts, rowid, content, event_id) VALUES('delete', OLD.rowid, OLD.content, OLD.id);
|
|
1630
|
+
INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);
|
|
1631
|
+
END;
|
|
1610
1632
|
`);
|
|
1611
1633
|
const tableInfo = sqliteAll(this.db, "PRAGMA table_info(events)", []);
|
|
1612
1634
|
const columnNames = tableInfo.map((col) => col.name);
|
|
@@ -2047,6 +2069,62 @@ var SQLiteEventStore = class {
|
|
|
2047
2069
|
);
|
|
2048
2070
|
return rows.map((row) => this.rowToEvent(row));
|
|
2049
2071
|
}
|
|
2072
|
+
/**
|
|
2073
|
+
* Fast keyword search using FTS5
|
|
2074
|
+
* Returns events matching the search query, ranked by relevance
|
|
2075
|
+
*/
|
|
2076
|
+
async keywordSearch(query, limit = 10) {
|
|
2077
|
+
await this.initialize();
|
|
2078
|
+
const searchTerms = query.replace(/['"(){}[\]^~*?:\\/-]/g, " ").split(/\s+/).filter((term) => term.length > 1).map((term) => `"${term}"*`).join(" OR ");
|
|
2079
|
+
if (!searchTerms) {
|
|
2080
|
+
return [];
|
|
2081
|
+
}
|
|
2082
|
+
try {
|
|
2083
|
+
const rows = sqliteAll(
|
|
2084
|
+
this.db,
|
|
2085
|
+
`SELECT e.*, fts.rank
|
|
2086
|
+
FROM events_fts fts
|
|
2087
|
+
JOIN events e ON e.id = fts.event_id
|
|
2088
|
+
WHERE events_fts MATCH ?
|
|
2089
|
+
ORDER BY fts.rank
|
|
2090
|
+
LIMIT ?`,
|
|
2091
|
+
[searchTerms, limit]
|
|
2092
|
+
);
|
|
2093
|
+
return rows.map((row) => ({
|
|
2094
|
+
event: this.rowToEvent(row),
|
|
2095
|
+
rank: row.rank
|
|
2096
|
+
}));
|
|
2097
|
+
} catch (error) {
|
|
2098
|
+
const likePattern = `%${query}%`;
|
|
2099
|
+
const rows = sqliteAll(
|
|
2100
|
+
this.db,
|
|
2101
|
+
`SELECT *, 0 as rank FROM events
|
|
2102
|
+
WHERE content LIKE ?
|
|
2103
|
+
ORDER BY timestamp DESC
|
|
2104
|
+
LIMIT ?`,
|
|
2105
|
+
[likePattern, limit]
|
|
2106
|
+
);
|
|
2107
|
+
return rows.map((row) => ({
|
|
2108
|
+
event: this.rowToEvent(row),
|
|
2109
|
+
rank: 0
|
|
2110
|
+
}));
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
/**
|
|
2114
|
+
* Rebuild FTS index from existing events
|
|
2115
|
+
* Call this once after upgrading to FTS5
|
|
2116
|
+
*/
|
|
2117
|
+
async rebuildFtsIndex() {
|
|
2118
|
+
await this.initialize();
|
|
2119
|
+
const countRow = sqliteGet(this.db, "SELECT COUNT(*) as count FROM events", []);
|
|
2120
|
+
const totalEvents = countRow?.count ?? 0;
|
|
2121
|
+
sqliteExec(this.db, `
|
|
2122
|
+
DELETE FROM events_fts;
|
|
2123
|
+
INSERT INTO events_fts(rowid, content, event_id)
|
|
2124
|
+
SELECT rowid, content, id FROM events;
|
|
2125
|
+
`);
|
|
2126
|
+
return totalEvents;
|
|
2127
|
+
}
|
|
2050
2128
|
/**
|
|
2051
2129
|
* Get database instance for direct access
|
|
2052
2130
|
*/
|