Files
llmgw/internal/store/migrations/sqlite/0007_memory.sql
T
2026-09-24 04:04:03 +03:00

46 lines
2.1 KiB
SQL

-- Notes an agent writes for itself and reads back later, across threads.
--
-- Off unless a project turns it on, for the same reason threads are: llmgw
-- stores no message content unless somebody decided it should. NULL means this
-- project keeps no notes. The number is hours, and is required to turn it on,
-- because a store with no expiry is a transcript kept forever by omission.
ALTER TABLE projects ADD COLUMN memory_retention_hours INTEGER;
CREATE TABLE memory_notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
-- Scoped to a project and checked in SQL on every read, like threads.
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
-- A namespace inside the project, so two agents sharing a key do not read
-- each other's notes.
agent_id TEXT NOT NULL,
key TEXT NOT NULL,
text TEXT NOT NULL,
-- Normalised to ",a,b," so a tag matches whole, never as part of another.
tags TEXT NOT NULL DEFAULT '',
created_at INTEGER NOT NULL,
-- Touched on every write, so retention measures how long a note has gone
-- unrefreshed rather than how old it is.
updated_at INTEGER NOT NULL,
UNIQUE (project_id, agent_id, key)
);
CREATE INDEX memory_notes_by_updated ON memory_notes(updated_at);
-- Full-text search over the fields an agent would search by. An external
-- content table, so the text is stored once.
CREATE VIRTUAL TABLE memory_notes_fts USING fts5(
key, text, tags, content = 'memory_notes', content_rowid = 'id'
);
CREATE TRIGGER memory_notes_ai AFTER INSERT ON memory_notes BEGIN
INSERT INTO memory_notes_fts(rowid, key, text, tags) VALUES (new.id, new.key, new.text, new.tags);
END;
CREATE TRIGGER memory_notes_ad AFTER DELETE ON memory_notes BEGIN
INSERT INTO memory_notes_fts(memory_notes_fts, rowid, key, text, tags)
VALUES ('delete', old.id, old.key, old.text, old.tags);
END;
CREATE TRIGGER memory_notes_au AFTER UPDATE ON memory_notes BEGIN
INSERT INTO memory_notes_fts(memory_notes_fts, rowid, key, text, tags)
VALUES ('delete', old.id, old.key, old.text, old.tags);
INSERT INTO memory_notes_fts(rowid, key, text, tags) VALUES (new.id, new.key, new.text, new.tags);
END;