@pcircle/memesh 4.5.1 → 4.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.
- package/.claude-plugin/marketplace.json +5 -3
- package/.claude-plugin/plugin.json +6 -4
- package/AGENTS.md +95 -0
- package/README.de.md +129 -35
- package/README.md +161 -34
- package/README.zh-TW.md +130 -35
- package/dashboard/dist/index.html +10 -10
- package/dist/cli/view-live.js +3 -3
- package/dist/core/auto-tagger.d.ts.map +1 -1
- package/dist/core/auto-tagger.js +4 -9
- package/dist/core/auto-tagger.js.map +1 -1
- package/dist/core/briefing.d.ts +8 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +91 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/capture-flag.d.ts +5 -0
- package/dist/core/capture-flag.d.ts.map +1 -0
- package/dist/core/capture-flag.js +10 -0
- package/dist/core/capture-flag.js.map +1 -0
- package/dist/core/conflict-candidates.d.ts +20 -0
- package/dist/core/conflict-candidates.d.ts.map +1 -0
- package/dist/core/conflict-candidates.js +79 -0
- package/dist/core/conflict-candidates.js.map +1 -0
- package/dist/core/conflict-judge.d.ts +47 -0
- package/dist/core/conflict-judge.d.ts.map +1 -0
- package/dist/core/conflict-judge.js +189 -0
- package/dist/core/conflict-judge.js.map +1 -0
- package/dist/core/digest-validator.d.ts.map +1 -1
- package/dist/core/digest-validator.js +3 -5
- package/dist/core/digest-validator.js.map +1 -1
- package/dist/core/doctor.d.ts +2 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +34 -56
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +5 -2
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +108 -25
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/embedder.d.ts +5 -4
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +16 -8
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/failure-analyzer.d.ts.map +1 -1
- package/dist/core/failure-analyzer.js +7 -12
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/install-channel.d.ts +1 -1
- package/dist/core/install-channel.d.ts.map +1 -1
- package/dist/core/install-channel.js +16 -5
- package/dist/core/install-channel.js.map +1 -1
- package/dist/core/install-hooks.d.ts +5 -0
- package/dist/core/install-hooks.d.ts.map +1 -1
- package/dist/core/install-hooks.js +0 -0
- package/dist/core/install-hooks.js.map +1 -1
- package/dist/core/json-utils.d.ts +1 -0
- package/dist/core/json-utils.d.ts.map +1 -1
- package/dist/core/json-utils.js +19 -10
- package/dist/core/json-utils.js.map +1 -1
- package/dist/core/kg-backfill.d.ts +0 -1
- package/dist/core/kg-backfill.d.ts.map +1 -1
- package/dist/core/kg-backfill.js +0 -3
- package/dist/core/kg-backfill.js.map +1 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +14 -21
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/memory-tool.d.ts.map +1 -1
- package/dist/core/memory-tool.js +4 -4
- package/dist/core/memory-tool.js.map +1 -1
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +22 -13
- package/dist/core/operations.js.map +1 -1
- package/dist/core/prompt-safety.d.ts +1 -0
- package/dist/core/prompt-safety.d.ts.map +1 -1
- package/dist/core/prompt-safety.js +7 -0
- package/dist/core/prompt-safety.js.map +1 -1
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +31 -0
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/setup.d.ts +29 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +127 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/task-state-store.d.ts +17 -0
- package/dist/core/task-state-store.d.ts.map +1 -0
- package/dist/core/task-state-store.js +45 -0
- package/dist/core/task-state-store.js.map +1 -0
- package/dist/core/task-state.d.ts +19 -0
- package/dist/core/task-state.d.ts.map +1 -0
- package/dist/core/task-state.js +91 -0
- package/dist/core/task-state.js.map +1 -0
- package/dist/core/time-utils.d.ts +2 -0
- package/dist/core/time-utils.d.ts.map +1 -0
- package/dist/core/time-utils.js +14 -0
- package/dist/core/time-utils.js.map +1 -0
- package/dist/core/title.d.ts +5 -0
- package/dist/core/title.d.ts.map +1 -0
- package/dist/core/title.js +14 -0
- package/dist/core/title.js.map +1 -0
- package/dist/core/transcript-source.d.ts.map +1 -1
- package/dist/core/transcript-source.js +2 -3
- package/dist/core/transcript-source.js.map +1 -1
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/work-topology.d.ts +33 -0
- package/dist/core/work-topology.d.ts.map +1 -0
- package/dist/core/work-topology.js +183 -0
- package/dist/core/work-topology.js.map +1 -0
- package/dist/db.d.ts +2 -7
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +144 -284
- package/dist/db.js.map +1 -1
- package/dist/knowledge-graph.d.ts +1 -0
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +50 -40
- package/dist/knowledge-graph.js.map +1 -1
- package/dist/skills-manifest.json +48 -18
- package/dist/storage/conflicts.d.ts.map +1 -1
- package/dist/storage/conflicts.js +2 -7
- package/dist/storage/conflicts.js.map +1 -1
- package/dist/storage/fts-index.d.ts +4 -2
- package/dist/storage/fts-index.d.ts.map +1 -1
- package/dist/storage/fts-index.js +16 -4
- package/dist/storage/fts-index.js.map +1 -1
- package/dist/storage/schema.d.ts +20 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +274 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/transports/cli/cli.d.ts +1 -4
- package/dist/transports/cli/cli.d.ts.map +1 -1
- package/dist/transports/cli/cli.js +382 -6
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +208 -307
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +46 -0
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +57 -2
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +21 -10
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +26 -8
- package/dist/transports/schemas.js.map +1 -1
- package/llms-install.md +138 -0
- package/package.json +14 -9
- package/scripts/hooks/_generated/capture-flag.js +17 -0
- package/scripts/hooks/_generated/fts-index.js +16 -4
- package/scripts/hooks/_generated/schema.js +281 -0
- package/scripts/hooks/_generated/task-state.js +98 -0
- package/scripts/hooks/_generated/time-utils.js +21 -0
- package/scripts/hooks/_generated/title.js +21 -0
- package/scripts/hooks/_generated/work-topology.js +190 -0
- package/scripts/hooks/_shared.js +122 -478
- package/scripts/hooks/post-commit.js +4 -1
- package/scripts/hooks/pre-compact.js +13 -1
- package/scripts/hooks/pre-edit-recall.js +5 -3
- package/scripts/hooks/session-start.js +135 -59
- package/scripts/hooks/session-summary.js +59 -24
- package/skills/memesh/SKILL.md +97 -76
- package/README.es.md +0 -467
- package/README.fr.md +0 -459
- package/README.ja.md +0 -467
- package/README.ko.md +0 -467
- package/README.pt.md +0 -459
- package/README.th.md +0 -460
- package/README.vi.md +0 -459
- package/README.zh-CN.md +0 -466
- package/dist/cli/view.d.ts +0 -3
- package/dist/cli/view.d.ts.map +0 -1
- package/dist/cli/view.js +0 -523
- package/dist/cli/view.js.map +0 -1
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { insertFtsRow } from './fts-index.js';
|
|
2
|
+
import { parseSqliteUtcMs } from '../core/time-utils.js';
|
|
3
|
+
export const SCHEMA_SQL = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
name TEXT NOT NULL UNIQUE,
|
|
7
|
+
type TEXT NOT NULL,
|
|
8
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
+
metadata JSON
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
13
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
+
entity_id INTEGER NOT NULL,
|
|
15
|
+
content TEXT NOT NULL,
|
|
16
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
17
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS relations (
|
|
21
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
22
|
+
from_entity_id INTEGER NOT NULL,
|
|
23
|
+
to_entity_id INTEGER NOT NULL,
|
|
24
|
+
relation_type TEXT NOT NULL,
|
|
25
|
+
metadata JSON,
|
|
26
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
27
|
+
FOREIGN KEY (from_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
28
|
+
FOREIGN KEY (to_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
29
|
+
UNIQUE(from_entity_id, to_entity_id, relation_type)
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
CREATE TABLE IF NOT EXISTS tags (
|
|
33
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
34
|
+
entity_id INTEGER NOT NULL,
|
|
35
|
+
tag TEXT NOT NULL,
|
|
36
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_tags_entity ON tags(entity_id);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);
|
|
41
|
+
-- The tags dedup DELETE + idx_tags_entity_tag_unique creation live in
|
|
42
|
+
-- ensureTagsUniqueIndex(), AFTER this exec — the DELETE is a one-time
|
|
43
|
+
-- migration, and a DML statement in this string made every open start a
|
|
44
|
+
-- write transaction even when it deleted nothing (same reader-breaking
|
|
45
|
+
-- pattern as the hook_runs_since note below).
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_entities_type_created ON entities(type, created_at);
|
|
50
|
+
|
|
51
|
+
-- Migration markers and small bits of persistent state (index segmentation
|
|
52
|
+
-- version, embedding dimension, pending-reindex flags, backfill markers).
|
|
53
|
+
--
|
|
54
|
+
-- This used to be created ad hoc by each helper that needed it — four inline
|
|
55
|
+
-- CREATE TABLE IF NOT EXISTS copies in src/db.ts, none of them visible to
|
|
56
|
+
-- schema checks. A column added to one copy would not have been caught. It
|
|
57
|
+
-- also meant the hook-side schema had no metadata table at all, so hooks
|
|
58
|
+
-- could not participate in migrations even in principle.
|
|
59
|
+
CREATE TABLE IF NOT EXISTS memesh_metadata (
|
|
60
|
+
key TEXT PRIMARY KEY,
|
|
61
|
+
value TEXT NOT NULL
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- Proof that a capture hook actually RAN. Nothing else in this schema can
|
|
65
|
+
-- give it: every other signal is "a row was written", and "the hook ran and
|
|
66
|
+
-- found nothing worth saving" is the healthy case that produces no row at
|
|
67
|
+
-- all. So a quiet day and a dead capture loop were byte-identical in the
|
|
68
|
+
-- database, and the one doctor message that had to cover both cried wolf on
|
|
69
|
+
-- the first and stayed silent on the second.
|
|
70
|
+
--
|
|
71
|
+
-- Written by the three hooks that hold a read-write handle (Stop, PreCompact,
|
|
72
|
+
-- PostToolUse), each calling recordHookRun() at its own SUCCESSFUL exit —
|
|
73
|
+
-- after capture, not at open. Stamping at open certified the wrong thing: a
|
|
74
|
+
-- hook that opened the database and then died mid-capture looked alive for a
|
|
75
|
+
-- day. "Successful" is precise: a completed capture, or a well-formed
|
|
76
|
+
-- payload the hook correctly decided not to capture (dedup, low-signal
|
|
77
|
+
-- session). A malformed payload (schema-flip shapes) and a write that did
|
|
78
|
+
-- not land both leave no stamp — either would make the heartbeat mask the
|
|
79
|
+
-- exact dropout it exists to expose. The recall-side hooks open read-only
|
|
80
|
+
-- and deliberately do not appear here: their liveness answers a different
|
|
81
|
+
-- question, and giving them a write handle would put a lock acquisition on
|
|
82
|
+
-- the SessionStart hot path.
|
|
83
|
+
--
|
|
84
|
+
-- One row per hook, upserted. It does not grow.
|
|
85
|
+
CREATE TABLE IF NOT EXISTS hook_runs (
|
|
86
|
+
hook TEXT PRIMARY KEY,
|
|
87
|
+
last_run_at TIMESTAMP NOT NULL,
|
|
88
|
+
run_count INTEGER NOT NULL DEFAULT 0
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
-- The 'hook_runs_since' metadata key (when this database first became able
|
|
92
|
+
-- to record hook runs) is stamped by ensureHookRunsSince() AFTER this exec,
|
|
93
|
+
-- NOT here. It used to be an INSERT OR IGNORE in this string, and that made
|
|
94
|
+
-- every open — including opens that only ever read — start a write
|
|
95
|
+
-- transaction: an INSERT statement takes the WAL writer lock even when
|
|
96
|
+
-- OR IGNORE ends up changing nothing. Two states regressed from "reads work"
|
|
97
|
+
-- to "open throws": a peer holding the writer lock past busy_timeout, and a
|
|
98
|
+
-- read-only database FILE (measured: "attempt to write a readonly database"
|
|
99
|
+
-- killed recall along with capture). The helper SELECTs first and writes
|
|
100
|
+
-- only when the key is genuinely absent — once per database lifetime.
|
|
101
|
+
`;
|
|
102
|
+
export const FTS_SQL = `
|
|
103
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5(
|
|
104
|
+
name, observations, content='',
|
|
105
|
+
tokenize='unicode61 remove_diacritics 1'
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
-- Term -> document-count view over the index above. Stores nothing of its own;
|
|
109
|
+
-- it exists so search() can drop query terms that appear in most of the corpus,
|
|
110
|
+
-- which are the ones BM25 already scores near zero. See dropUbiquitousTerms().
|
|
111
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS fts_vocab USING fts5vocab(entities_fts, 'row');
|
|
112
|
+
`;
|
|
113
|
+
export function safeAlter(db, sql) {
|
|
114
|
+
try {
|
|
115
|
+
db.exec(sql);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
119
|
+
if (!/duplicate column name/i.test(msg))
|
|
120
|
+
throw e;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function migrateEntitiesSchema(db) {
|
|
124
|
+
const entityColumns = new Set(db.prepare("PRAGMA table_info(entities)").all().map((c) => c.name));
|
|
125
|
+
if (!entityColumns.has('status')) {
|
|
126
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN status TEXT NOT NULL DEFAULT 'active'");
|
|
127
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)");
|
|
128
|
+
}
|
|
129
|
+
if (!entityColumns.has('access_count')) {
|
|
130
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN access_count INTEGER DEFAULT 0");
|
|
131
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN last_accessed_at TIMESTAMP");
|
|
132
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN confidence REAL DEFAULT 1.0");
|
|
133
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN valid_from TIMESTAMP");
|
|
134
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN valid_until TIMESTAMP");
|
|
135
|
+
}
|
|
136
|
+
if (!entityColumns.has('namespace')) {
|
|
137
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN namespace TEXT DEFAULT 'personal'");
|
|
138
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_entities_namespace ON entities(namespace)");
|
|
139
|
+
}
|
|
140
|
+
if (!entityColumns.has('recall_hits')) {
|
|
141
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN recall_hits INTEGER DEFAULT 0");
|
|
142
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN recall_misses INTEGER DEFAULT 0");
|
|
143
|
+
}
|
|
144
|
+
if (!entityColumns.has('title')) {
|
|
145
|
+
safeAlter(db, "ALTER TABLE entities ADD COLUMN title TEXT");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export function ensureTagsUniqueIndex(db) {
|
|
149
|
+
try {
|
|
150
|
+
const present = db
|
|
151
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'index' AND name = 'idx_tags_entity_tag_unique'")
|
|
152
|
+
.get();
|
|
153
|
+
if (present)
|
|
154
|
+
return;
|
|
155
|
+
db.exec('BEGIN IMMEDIATE; ' +
|
|
156
|
+
'DELETE FROM tags WHERE id NOT IN (SELECT MIN(id) FROM tags GROUP BY entity_id, tag); ' +
|
|
157
|
+
'CREATE UNIQUE INDEX IF NOT EXISTS idx_tags_entity_tag_unique ON tags(entity_id, tag); ' +
|
|
158
|
+
'COMMIT;');
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
try {
|
|
162
|
+
db.exec('ROLLBACK');
|
|
163
|
+
}
|
|
164
|
+
catch { }
|
|
165
|
+
try {
|
|
166
|
+
process.stderr.write(`MeMesh: could not create the tags unique index (${err instanceof Error ? err.message : String(err)}). ` +
|
|
167
|
+
`Reads are unaffected; the next open retries the dedup and index together.\n`);
|
|
168
|
+
}
|
|
169
|
+
catch { }
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export function ensureHookRunsSince(db) {
|
|
173
|
+
try {
|
|
174
|
+
const row = db
|
|
175
|
+
.prepare("SELECT value FROM memesh_metadata WHERE key = 'hook_runs_since'")
|
|
176
|
+
.get();
|
|
177
|
+
if (row) {
|
|
178
|
+
const then = parseSqliteUtcMs(row.value ?? '');
|
|
179
|
+
if (then !== null && then <= Date.now() + 5 * 60 * 1000)
|
|
180
|
+
return;
|
|
181
|
+
db
|
|
182
|
+
.prepare("UPDATE memesh_metadata SET value = datetime('now') WHERE key = 'hook_runs_since'")
|
|
183
|
+
.run();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
db
|
|
187
|
+
.prepare("INSERT OR IGNORE INTO memesh_metadata (key, value) VALUES ('hook_runs_since', datetime('now'))")
|
|
188
|
+
.run();
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
try {
|
|
192
|
+
process.stderr.write(`MeMesh: could not stamp hook_runs_since (${err instanceof Error ? err.message : String(err)}). ` +
|
|
193
|
+
`Reads are unaffected; doctor's hook-activity tracking starts once the database is writable.\n`);
|
|
194
|
+
}
|
|
195
|
+
catch { }
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function isTransientDbError(err) {
|
|
199
|
+
const code = err?.code ?? '';
|
|
200
|
+
const msg = err?.message ?? '';
|
|
201
|
+
return (/SQLITE_BUSY|SQLITE_LOCKED|SQLITE_PROTOCOL/.test(code) ||
|
|
202
|
+
/database is locked|database table is locked|locking protocol/i.test(msg));
|
|
203
|
+
}
|
|
204
|
+
export const MIGRATION_RETRY_BACKOFF_MS = 24 * 60 * 60 * 1000;
|
|
205
|
+
export function runOnceMigration(db, opts) {
|
|
206
|
+
const { key, version, describe, migrate } = opts;
|
|
207
|
+
const attemptKey = `${key}_last_attempt`;
|
|
208
|
+
const readMarker = (k) => db.prepare('SELECT value FROM memesh_metadata WHERE key = ?').get(k)?.value;
|
|
209
|
+
const stored = readMarker(key);
|
|
210
|
+
if (stored && parseInt(stored, 10) >= version)
|
|
211
|
+
return false;
|
|
212
|
+
const lastAttempt = readMarker(attemptKey);
|
|
213
|
+
if (lastAttempt && Date.now() - parseInt(lastAttempt, 10) < MIGRATION_RETRY_BACKOFF_MS) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
db.transaction(() => {
|
|
218
|
+
const current = readMarker(key);
|
|
219
|
+
if (current && parseInt(current, 10) >= version)
|
|
220
|
+
return;
|
|
221
|
+
migrate(db, current ? parseInt(current, 10) : 0);
|
|
222
|
+
db.prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)').run(key, String(version));
|
|
223
|
+
db.prepare('DELETE FROM memesh_metadata WHERE key = ?').run(attemptKey);
|
|
224
|
+
}).immediate();
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
if (isTransientDbError(err)) {
|
|
229
|
+
process.stderr.write(`MeMesh: ${describe} deferred (${err instanceof Error ? err.message : String(err)}). ` +
|
|
230
|
+
`Another process holds the database; it will run on the next start.\n`);
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
db.prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)').run(attemptKey, String(Date.now()));
|
|
235
|
+
}
|
|
236
|
+
catch { }
|
|
237
|
+
process.stderr.write(`MeMesh: ${describe} failed (${err instanceof Error ? err.message : String(err)}). ` +
|
|
238
|
+
`Your memories are unaffected — this rebuilds a derived index. ` +
|
|
239
|
+
`It will retry in 24h, or run 'memesh reindex --fts' to retry now.\n`);
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export const FTS_SEGMENTATION_VERSION = 3;
|
|
244
|
+
export const FTS_REBUILD_PAGE_SIZE = 500;
|
|
245
|
+
export function rebuildFtsIndex(db) {
|
|
246
|
+
db.exec("INSERT INTO entities_fts (entities_fts) VALUES('delete-all')");
|
|
247
|
+
const page = db.prepare(`SELECT e.id, e.name, e.title, COALESCE(group_concat(o.content, ' ' ORDER BY o.id), '') AS obs
|
|
248
|
+
FROM entities e
|
|
249
|
+
LEFT JOIN observations o ON o.entity_id = e.id
|
|
250
|
+
WHERE e.status = 'active' AND e.id > ?
|
|
251
|
+
GROUP BY e.id
|
|
252
|
+
ORDER BY e.id
|
|
253
|
+
LIMIT ?`);
|
|
254
|
+
let afterId = 0;
|
|
255
|
+
for (;;) {
|
|
256
|
+
const rows = page.all(afterId, FTS_REBUILD_PAGE_SIZE);
|
|
257
|
+
if (rows.length === 0)
|
|
258
|
+
break;
|
|
259
|
+
for (const row of rows)
|
|
260
|
+
insertFtsRow(db, row.id, row.name, row.obs, row.title);
|
|
261
|
+
afterId = rows[rows.length - 1].id;
|
|
262
|
+
if (rows.length < FTS_REBUILD_PAGE_SIZE)
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export function ensureFtsSegmentation(db) {
|
|
267
|
+
runOnceMigration(db, {
|
|
268
|
+
key: 'fts_segmentation_version',
|
|
269
|
+
version: FTS_SEGMENTATION_VERSION,
|
|
270
|
+
describe: 'search index rebuild',
|
|
271
|
+
migrate: rebuildFtsIndex,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/transports/cli/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/transports/cli/cli.ts"],"names":[],"mappings":""}
|