@mono-agent/memory 0.4.1
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 +61 -0
- package/dist/bujo/capture.d.ts +20 -0
- package/dist/bujo/capture.d.ts.map +1 -0
- package/dist/bujo/capture.js +77 -0
- package/dist/bujo/capture.js.map +1 -0
- package/dist/bujo/cli-env.d.ts +11 -0
- package/dist/bujo/cli-env.d.ts.map +1 -0
- package/dist/bujo/cli-env.js +30 -0
- package/dist/bujo/cli-env.js.map +1 -0
- package/dist/bujo/cli.d.ts +3 -0
- package/dist/bujo/cli.d.ts.map +1 -0
- package/dist/bujo/cli.js +98 -0
- package/dist/bujo/cli.js.map +1 -0
- package/dist/bujo/consolidate.d.ts +15 -0
- package/dist/bujo/consolidate.d.ts.map +1 -0
- package/dist/bujo/consolidate.js +61 -0
- package/dist/bujo/consolidate.js.map +1 -0
- package/dist/bujo/daily.d.ts +17 -0
- package/dist/bujo/daily.d.ts.map +1 -0
- package/dist/bujo/daily.js +47 -0
- package/dist/bujo/daily.js.map +1 -0
- package/dist/bujo/distill.d.ts +10 -0
- package/dist/bujo/distill.d.ts.map +1 -0
- package/dist/bujo/distill.js +50 -0
- package/dist/bujo/distill.js.map +1 -0
- package/dist/bujo/entities.d.ts +24 -0
- package/dist/bujo/entities.d.ts.map +1 -0
- package/dist/bujo/entities.js +80 -0
- package/dist/bujo/entities.js.map +1 -0
- package/dist/bujo/grammar.d.ts +18 -0
- package/dist/bujo/grammar.d.ts.map +1 -0
- package/dist/bujo/grammar.js +147 -0
- package/dist/bujo/grammar.js.map +1 -0
- package/dist/bujo/graph.d.ts +17 -0
- package/dist/bujo/graph.d.ts.map +1 -0
- package/dist/bujo/graph.js +96 -0
- package/dist/bujo/graph.js.map +1 -0
- package/dist/bujo/ids.d.ts +9 -0
- package/dist/bujo/ids.d.ts.map +1 -0
- package/dist/bujo/ids.js +23 -0
- package/dist/bujo/ids.js.map +1 -0
- package/dist/bujo/index.d.ts +26 -0
- package/dist/bujo/index.d.ts.map +1 -0
- package/dist/bujo/index.js +20 -0
- package/dist/bujo/index.js.map +1 -0
- package/dist/bujo/json.d.ts +3 -0
- package/dist/bujo/json.d.ts.map +1 -0
- package/dist/bujo/json.js +58 -0
- package/dist/bujo/json.js.map +1 -0
- package/dist/bujo/llm.d.ts +14 -0
- package/dist/bujo/llm.d.ts.map +1 -0
- package/dist/bujo/llm.js +2 -0
- package/dist/bujo/llm.js.map +1 -0
- package/dist/bujo/migrate.d.ts +12 -0
- package/dist/bujo/migrate.d.ts.map +1 -0
- package/dist/bujo/migrate.js +136 -0
- package/dist/bujo/migrate.js.map +1 -0
- package/dist/bujo/model-error.d.ts +16 -0
- package/dist/bujo/model-error.d.ts.map +1 -0
- package/dist/bujo/model-error.js +20 -0
- package/dist/bujo/model-error.js.map +1 -0
- package/dist/bujo/ollama-llm.d.ts +7 -0
- package/dist/bujo/ollama-llm.d.ts.map +1 -0
- package/dist/bujo/ollama-llm.js +43 -0
- package/dist/bujo/ollama-llm.js.map +1 -0
- package/dist/bujo/projections.d.ts +8 -0
- package/dist/bujo/projections.d.ts.map +1 -0
- package/dist/bujo/projections.js +53 -0
- package/dist/bujo/projections.js.map +1 -0
- package/dist/bujo/rebuild.d.ts +12 -0
- package/dist/bujo/rebuild.d.ts.map +1 -0
- package/dist/bujo/rebuild.js +73 -0
- package/dist/bujo/rebuild.js.map +1 -0
- package/dist/bujo/recall.d.ts +7 -0
- package/dist/bujo/recall.d.ts.map +1 -0
- package/dist/bujo/recall.js +33 -0
- package/dist/bujo/recall.js.map +1 -0
- package/dist/bujo/reconcile.d.ts +37 -0
- package/dist/bujo/reconcile.d.ts.map +1 -0
- package/dist/bujo/reconcile.js +190 -0
- package/dist/bujo/reconcile.js.map +1 -0
- package/dist/bujo/reflect.d.ts +30 -0
- package/dist/bujo/reflect.d.ts.map +1 -0
- package/dist/bujo/reflect.js +100 -0
- package/dist/bujo/reflect.js.map +1 -0
- package/dist/bujo/store.d.ts +77 -0
- package/dist/bujo/store.d.ts.map +1 -0
- package/dist/bujo/store.js +222 -0
- package/dist/bujo/store.js.map +1 -0
- package/dist/bujo/types.d.ts +39 -0
- package/dist/bujo/types.d.ts.map +1 -0
- package/dist/bujo/types.js +2 -0
- package/dist/bujo/types.js.map +1 -0
- package/dist/search/chunks.d.ts +14 -0
- package/dist/search/chunks.d.ts.map +1 -0
- package/dist/search/chunks.js +75 -0
- package/dist/search/chunks.js.map +1 -0
- package/dist/search/circuit-breaker.d.ts +34 -0
- package/dist/search/circuit-breaker.d.ts.map +1 -0
- package/dist/search/circuit-breaker.js +89 -0
- package/dist/search/circuit-breaker.js.map +1 -0
- package/dist/search/embeddings.d.ts +44 -0
- package/dist/search/embeddings.d.ts.map +1 -0
- package/dist/search/embeddings.js +141 -0
- package/dist/search/embeddings.js.map +1 -0
- package/dist/search/index.d.ts +8 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +5 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/types.d.ts +41 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/search/vector-index.d.ts +28 -0
- package/dist/search/vector-index.d.ts.map +1 -0
- package/dist/search/vector-index.js +214 -0
- package/dist/search/vector-index.js.map +1 -0
- package/dist/store/contract.d.ts +2 -0
- package/dist/store/contract.d.ts.map +1 -0
- package/dist/store/contract.js +2 -0
- package/dist/store/contract.js.map +1 -0
- package/dist/store/db.d.ts +84 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +471 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/fts.d.ts +3 -0
- package/dist/store/fts.d.ts.map +1 -0
- package/dist/store/fts.js +6 -0
- package/dist/store/fts.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +3 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/ranking.d.ts +16 -0
- package/dist/store/ranking.d.ts.map +1 -0
- package/dist/store/ranking.js +32 -0
- package/dist/store/ranking.js.map +1 -0
- package/dist/store/schema.d.ts +3 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +61 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/types.d.ts +102 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +25 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/vec.d.ts +12 -0
- package/dist/store/vec.d.ts.map +1 -0
- package/dist/store/vec.js +20 -0
- package/dist/store/vec.js.map +1 -0
- package/package.json +45 -0
package/dist/store/db.js
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import BetterSqlite3, {} from "better-sqlite3";
|
|
4
|
+
import { ftsQuery } from "./fts.js";
|
|
5
|
+
import { rrfFuse, reScore } from "./ranking.js";
|
|
6
|
+
import { migrations } from "./schema.js";
|
|
7
|
+
import { loadVec, toBlob } from "./vec.js";
|
|
8
|
+
import { DEFAULT_DECAY_GAMMA, DEFAULT_RRF_K, DEFAULT_VEC_DIM, DEFAULT_WEIGHTS, MEMORY_STATUSES, MEMORY_TYPES, } from "./types.js";
|
|
9
|
+
export class MemoryDb {
|
|
10
|
+
db;
|
|
11
|
+
embeddings;
|
|
12
|
+
dim;
|
|
13
|
+
k;
|
|
14
|
+
weights;
|
|
15
|
+
decayGamma;
|
|
16
|
+
clock;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
// Validate dim only when explicitly provided; absent → default 768 for the vec table DDL.
|
|
19
|
+
if (options.dim !== undefined && (!Number.isInteger(options.dim) || options.dim <= 0)) {
|
|
20
|
+
throw new Error("MemoryDb: dim must be a positive integer.");
|
|
21
|
+
}
|
|
22
|
+
const vecDim = options.dim ?? DEFAULT_VEC_DIM;
|
|
23
|
+
if (options.path !== ":memory:") {
|
|
24
|
+
mkdirSync(dirname(options.path), { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
this.db = new BetterSqlite3(options.path);
|
|
27
|
+
this.db.pragma("journal_mode = WAL");
|
|
28
|
+
// WAL gives concurrent readers + a single writer. better-sqlite3 (v11) already defaults
|
|
29
|
+
// busy_timeout to 5000ms, so a second connection (e.g. the bundled recall-tool child opening
|
|
30
|
+
// the same db next to the live in-app store) retries on a locked db instead of throwing
|
|
31
|
+
// SQLITE_BUSY. open.test.ts pins this
|
|
32
|
+
// invariant — if an upgrade ever drops the default, the test fails and we set it explicitly here.
|
|
33
|
+
loadVec(this.db);
|
|
34
|
+
for (const statement of migrations(vecDim)) {
|
|
35
|
+
this.db.exec(statement);
|
|
36
|
+
}
|
|
37
|
+
this.embeddings = options.embeddings;
|
|
38
|
+
this.dim = vecDim;
|
|
39
|
+
this.k = options.k ?? DEFAULT_RRF_K;
|
|
40
|
+
this.weights = { ...DEFAULT_WEIGHTS, ...options.weights };
|
|
41
|
+
this.decayGamma = options.decayGamma ?? DEFAULT_DECAY_GAMMA;
|
|
42
|
+
this.clock = options.clock ?? (() => new Date());
|
|
43
|
+
}
|
|
44
|
+
vecVersion() {
|
|
45
|
+
const row = this.db.prepare("SELECT vec_version() AS v").get();
|
|
46
|
+
return row?.v ?? "";
|
|
47
|
+
}
|
|
48
|
+
/** Configured busy_timeout in ms — how long a blocked writer waits before SQLITE_BUSY. */
|
|
49
|
+
busyTimeoutMs() {
|
|
50
|
+
return Number(this.db.pragma("busy_timeout", { simple: true }));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Guard that an embedding vector matches the configured `dim` before it reaches sqlite-vec.
|
|
54
|
+
* Surfaces a clear error (e.g. when the embedding model changed but `dim` was left stale) instead
|
|
55
|
+
* of the opaque sqlite-vec failure on INSERT/MATCH.
|
|
56
|
+
*/
|
|
57
|
+
assertVectorDim(vector, context) {
|
|
58
|
+
if (vector.length !== this.dim) {
|
|
59
|
+
throw new Error(`memory-store: embedding dimension mismatch in ${context} — expected ${this.dim}, got ${vector.length}. ` +
|
|
60
|
+
"Ensure the embedding model matches the configured `dim`.");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async upsert(record) {
|
|
64
|
+
// Only embed when a provider is configured; lite tier skips vec entirely.
|
|
65
|
+
const vector = this.embeddings !== undefined
|
|
66
|
+
? await (async () => {
|
|
67
|
+
const [v] = await this.embeddings.embed([`search_document: ${record.text}`]);
|
|
68
|
+
if (v === undefined) {
|
|
69
|
+
throw new Error("memory-store: embedding provider returned no vector for upsert.");
|
|
70
|
+
}
|
|
71
|
+
this.assertVectorDim(v, "upsert");
|
|
72
|
+
return v;
|
|
73
|
+
})()
|
|
74
|
+
: undefined;
|
|
75
|
+
const tx = this.db.transaction(() => {
|
|
76
|
+
// seq is computed inside the tx so concurrent upserts of new ids cannot collide on MAX(seq)+1.
|
|
77
|
+
const seq = this.nextSeq(record.id);
|
|
78
|
+
this.db.prepare(`INSERT INTO memories (
|
|
79
|
+
id, seq, type, status, text, salience, is_insight, created_at, last_accessed_at,
|
|
80
|
+
access_count, valid_from, valid_to, superseded_by, superseded_at, due_at, collection,
|
|
81
|
+
source_session, source_file, source_line, embedding_model, dim, tags
|
|
82
|
+
) VALUES (
|
|
83
|
+
@id, @seq, @type, @status, @text, @salience, @is_insight, @created_at, @last_accessed_at,
|
|
84
|
+
@access_count, @valid_from, @valid_to, @superseded_by, @superseded_at, @due_at, @collection,
|
|
85
|
+
@source_session, @source_file, @source_line, @embedding_model, @dim, @tags
|
|
86
|
+
)
|
|
87
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
88
|
+
type=excluded.type, status=excluded.status, text=excluded.text, salience=excluded.salience,
|
|
89
|
+
is_insight=excluded.is_insight, last_accessed_at=excluded.last_accessed_at,
|
|
90
|
+
access_count=excluded.access_count, valid_from=excluded.valid_from, valid_to=excluded.valid_to,
|
|
91
|
+
superseded_by=excluded.superseded_by, superseded_at=excluded.superseded_at, due_at=excluded.due_at,
|
|
92
|
+
collection=excluded.collection, source_session=excluded.source_session, source_file=excluded.source_file,
|
|
93
|
+
source_line=excluded.source_line, embedding_model=excluded.embedding_model, dim=excluded.dim,
|
|
94
|
+
tags=excluded.tags`).run(this.toRow(record, seq));
|
|
95
|
+
this.db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(record.id);
|
|
96
|
+
this.db.prepare(`INSERT INTO memories_fts (id, text) VALUES (?, ?)`).run(record.id, record.text);
|
|
97
|
+
if (vector !== undefined) {
|
|
98
|
+
// NOTE (from Task 2 spike): sqlite-vec vec0 rejects float64-bound rowids — bind as BigInt.
|
|
99
|
+
this.db.prepare(`DELETE FROM memories_vec WHERE rowid = ?`).run(BigInt(seq));
|
|
100
|
+
this.db.prepare(`INSERT INTO memories_vec (rowid, embedding) VALUES (?, ?)`).run(BigInt(seq), toBlob(vector));
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
tx();
|
|
104
|
+
}
|
|
105
|
+
get(id) {
|
|
106
|
+
const row = this.db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
|
|
107
|
+
return row === undefined ? undefined : this.fromRow(row);
|
|
108
|
+
}
|
|
109
|
+
count() {
|
|
110
|
+
return this.db.prepare(`SELECT COUNT(*) AS n FROM memories`).get().n;
|
|
111
|
+
}
|
|
112
|
+
stats(options = {}) {
|
|
113
|
+
const topEntitiesLimit = normalizeNonNegativeInteger(options.topEntitiesLimit ?? 10, "memory-store: stats topEntitiesLimit must be a non-negative integer.");
|
|
114
|
+
const countsByStatus = Object.fromEntries(MEMORY_STATUSES.map((status) => [status, 0]));
|
|
115
|
+
const countsByType = Object.fromEntries(MEMORY_TYPES.map((type) => [type, 0]));
|
|
116
|
+
const totalMemories = this.db.prepare(`SELECT COUNT(*) AS n FROM memories`).get().n;
|
|
117
|
+
const liveMemories = this.db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE status NOT IN ('invalidated','dropped')`).get().n;
|
|
118
|
+
const statusRows = this.db.prepare(`SELECT status, COUNT(*) AS n FROM memories GROUP BY status`).all();
|
|
119
|
+
for (const row of statusRows)
|
|
120
|
+
countsByStatus[row.status] = row.n;
|
|
121
|
+
const typeRows = this.db.prepare(`SELECT type, COUNT(*) AS n FROM memories GROUP BY type`).all();
|
|
122
|
+
for (const row of typeRows)
|
|
123
|
+
countsByType[row.type] = row.n;
|
|
124
|
+
const latestCreatedRow = this.db.prepare(`SELECT * FROM memories ORDER BY created_at DESC, id ASC LIMIT 1`).get();
|
|
125
|
+
const latestAccessedRow = this.db.prepare(`SELECT * FROM memories WHERE last_accessed_at IS NOT NULL ORDER BY last_accessed_at DESC, created_at DESC, id ASC LIMIT 1`).get();
|
|
126
|
+
const entityRows = this.db.prepare(`SELECT * FROM entities ORDER BY COALESCE(updated_at, created_at) DESC, created_at DESC, name ASC, id ASC LIMIT ?`).all(topEntitiesLimit);
|
|
127
|
+
return {
|
|
128
|
+
totalMemories,
|
|
129
|
+
liveMemories,
|
|
130
|
+
countsByStatus,
|
|
131
|
+
countsByType,
|
|
132
|
+
...(latestCreatedRow !== undefined && { latestCreatedMemory: this.fromRow(latestCreatedRow) }),
|
|
133
|
+
...(latestAccessedRow !== undefined && { latestAccessedMemory: this.fromRow(latestAccessedRow) }),
|
|
134
|
+
topEntities: entityRows.map((row) => this.entityFromRow(row)),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async recall(query, options = {}) {
|
|
138
|
+
const topK = options.topK ?? 8;
|
|
139
|
+
const candidates = options.candidates ?? Math.max(topK * 4, 20);
|
|
140
|
+
const now = options.now ?? this.clock();
|
|
141
|
+
const ftsIds = this.keywordCandidates(query, candidates);
|
|
142
|
+
const vecIds = this.embeddings !== undefined
|
|
143
|
+
? await this.vectorCandidates(query, candidates)
|
|
144
|
+
: [];
|
|
145
|
+
// When embeddings are absent, fuse only the FTS list (RRF of one list still re-ranks correctly).
|
|
146
|
+
const fused = rrfFuse([vecIds, ftsIds], this.k);
|
|
147
|
+
if (fused.length === 0)
|
|
148
|
+
return [];
|
|
149
|
+
const byId = new Map(fused.map((f) => [f.id, f.rrfScore]));
|
|
150
|
+
const placeholders = fused.map(() => "?").join(",");
|
|
151
|
+
const rows = this.db
|
|
152
|
+
.prepare(`SELECT * FROM memories WHERE id IN (${placeholders})`)
|
|
153
|
+
.all(...fused.map((f) => f.id));
|
|
154
|
+
const scored = [];
|
|
155
|
+
for (const row of rows) {
|
|
156
|
+
const record = this.fromRow(row);
|
|
157
|
+
if (!options.includeInvalid && (record.status === "invalidated" || record.status === "dropped"))
|
|
158
|
+
continue;
|
|
159
|
+
if (!options.includeInvalid && record.validTo !== undefined && new Date(record.validTo) < now)
|
|
160
|
+
continue;
|
|
161
|
+
const score = reScore({
|
|
162
|
+
rrfScore: byId.get(record.id) ?? 0,
|
|
163
|
+
salience: record.salience,
|
|
164
|
+
isInsight: record.isInsight,
|
|
165
|
+
...(record.lastAccessedAt !== undefined && { lastAccessedAt: record.lastAccessedAt }),
|
|
166
|
+
}, this.weights, this.decayGamma, now);
|
|
167
|
+
scored.push({ record, score });
|
|
168
|
+
}
|
|
169
|
+
scored.sort((a, b) => b.score - a.score);
|
|
170
|
+
const top = scored.slice(0, topK);
|
|
171
|
+
if (options.trackAccess === false) {
|
|
172
|
+
return top;
|
|
173
|
+
}
|
|
174
|
+
this.bumpAccess(top.map((h) => h.record.id), now);
|
|
175
|
+
return top.map((h) => ({ ...h, record: { ...h.record, accessCount: h.record.accessCount + 1, lastAccessedAt: now.toISOString() } }));
|
|
176
|
+
}
|
|
177
|
+
async vectorCandidates(query, limit) {
|
|
178
|
+
if (this.embeddings === undefined)
|
|
179
|
+
return [];
|
|
180
|
+
const [vector] = await this.embeddings.embed([`search_query: ${query}`]);
|
|
181
|
+
if (vector === undefined)
|
|
182
|
+
return [];
|
|
183
|
+
this.assertVectorDim(vector, "recall");
|
|
184
|
+
const rows = this.db
|
|
185
|
+
.prepare(`SELECT m.id AS id FROM memories_vec v JOIN memories m ON m.seq = v.rowid WHERE v.embedding MATCH ? AND k = ? ORDER BY v.distance`)
|
|
186
|
+
.all(toBlob(vector), limit);
|
|
187
|
+
return rows.map((r) => r.id);
|
|
188
|
+
}
|
|
189
|
+
keywordCandidates(query, limit) {
|
|
190
|
+
const match = ftsQuery(query);
|
|
191
|
+
if (match.length === 0)
|
|
192
|
+
return [];
|
|
193
|
+
const rows = this.db
|
|
194
|
+
.prepare(`SELECT id FROM memories_fts WHERE memories_fts MATCH ? ORDER BY bm25(memories_fts) LIMIT ?`)
|
|
195
|
+
.all(match, limit);
|
|
196
|
+
return rows.map((r) => r.id);
|
|
197
|
+
}
|
|
198
|
+
async supersede(oldId, replacement) {
|
|
199
|
+
if (oldId === replacement.id) {
|
|
200
|
+
throw new Error("memory-store: supersede requires a replacement with a distinct id.");
|
|
201
|
+
}
|
|
202
|
+
if (this.get(oldId) === undefined) {
|
|
203
|
+
throw new Error(`memory-store: cannot supersede unknown memory "${oldId}".`);
|
|
204
|
+
}
|
|
205
|
+
const now = this.clock().toISOString();
|
|
206
|
+
await this.upsert(replacement);
|
|
207
|
+
this.markSuperseded(oldId, replacement.id, now);
|
|
208
|
+
}
|
|
209
|
+
markSuperseded(oldId, replacementId, at = this.clock().toISOString()) {
|
|
210
|
+
if (oldId === replacementId) {
|
|
211
|
+
throw new Error("memory-store: supersede requires a replacement with a distinct id.");
|
|
212
|
+
}
|
|
213
|
+
if (this.get(oldId) === undefined) {
|
|
214
|
+
throw new Error(`memory-store: cannot supersede unknown memory "${oldId}".`);
|
|
215
|
+
}
|
|
216
|
+
if (this.get(replacementId) === undefined) {
|
|
217
|
+
throw new Error(`memory-store: cannot supersede with unknown replacement "${replacementId}".`);
|
|
218
|
+
}
|
|
219
|
+
const tx = this.db.transaction(() => {
|
|
220
|
+
this.db.prepare(`UPDATE memories SET status = 'invalidated', superseded_by = ?, superseded_at = ?, valid_to = ? WHERE id = ?`).run(replacementId, at, at, oldId);
|
|
221
|
+
this.db.prepare(`INSERT OR IGNORE INTO edges (src, dst, kind, weight, created_at) VALUES (?, ?, 'supersedes', 1.0, ?)`).run(oldId, replacementId, at);
|
|
222
|
+
});
|
|
223
|
+
tx();
|
|
224
|
+
}
|
|
225
|
+
edges(src) {
|
|
226
|
+
return this.db.prepare(`SELECT src, dst, kind, weight FROM edges WHERE src = ?`).all(src);
|
|
227
|
+
}
|
|
228
|
+
addEdge(src, dst, kind, weight = 1.0) {
|
|
229
|
+
this.db.prepare(`INSERT INTO edges (src, dst, kind, weight, created_at) VALUES (?, ?, ?, ?, ?)
|
|
230
|
+
ON CONFLICT(src, dst, kind) DO UPDATE SET weight = excluded.weight`).run(src, dst, kind, weight, this.clock().toISOString());
|
|
231
|
+
}
|
|
232
|
+
expand(seedIds, hops = 1) {
|
|
233
|
+
const seeds = new Set(seedIds);
|
|
234
|
+
let frontier = new Set(seedIds);
|
|
235
|
+
const reached = new Set();
|
|
236
|
+
for (let hop = 0; hop < hops; hop += 1) {
|
|
237
|
+
const next = new Set();
|
|
238
|
+
for (const id of frontier) {
|
|
239
|
+
const rows = this.db
|
|
240
|
+
.prepare(`SELECT dst FROM edges WHERE src = ? AND kind IN ('thread','about')`)
|
|
241
|
+
.all(id);
|
|
242
|
+
for (const { dst } of rows) {
|
|
243
|
+
if (!seeds.has(dst) && !reached.has(dst)) {
|
|
244
|
+
next.add(dst);
|
|
245
|
+
reached.add(dst);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
frontier = next;
|
|
250
|
+
}
|
|
251
|
+
const ids = [...reached];
|
|
252
|
+
if (ids.length === 0)
|
|
253
|
+
return [];
|
|
254
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
255
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE id IN (${placeholders})`).all(...ids);
|
|
256
|
+
return rows.map((row) => this.fromRow(row));
|
|
257
|
+
}
|
|
258
|
+
async findSimilar(text, k = 5) {
|
|
259
|
+
if (this.embeddings === undefined)
|
|
260
|
+
return [];
|
|
261
|
+
// Deliberately the `search_document:` prefix (not `search_query:` like recall): dedup/reconciliation
|
|
262
|
+
// compares a candidate memory to stored memories document-to-document, not query-to-document.
|
|
263
|
+
const [vector] = await this.embeddings.embed([`search_document: ${text}`]);
|
|
264
|
+
if (vector === undefined)
|
|
265
|
+
return [];
|
|
266
|
+
this.assertVectorDim(vector, "findSimilar");
|
|
267
|
+
const rows = this.db
|
|
268
|
+
.prepare(`SELECT m.id AS id, v.distance AS distance FROM memories_vec v JOIN memories m ON m.seq = v.rowid WHERE v.embedding MATCH ? AND k = ? ORDER BY v.distance`)
|
|
269
|
+
.all(toBlob(vector), k + 8); // over-fetch, filter, then trim
|
|
270
|
+
const out = [];
|
|
271
|
+
for (const row of rows) {
|
|
272
|
+
const record = this.get(row.id);
|
|
273
|
+
if (record === undefined)
|
|
274
|
+
continue;
|
|
275
|
+
if (record.status === "invalidated" || record.status === "dropped")
|
|
276
|
+
continue;
|
|
277
|
+
out.push({ record, distance: row.distance });
|
|
278
|
+
if (out.length >= k)
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Wipe the index and rebuild it from the supplied records (used by rebuild-from-files). No LLM.
|
|
285
|
+
* Wipes ALL index tables — including entities/entity_relations — so the caller is responsible for
|
|
286
|
+
* repopulating the entity graph afterwards (memory-bujo's rebuildFromMarkdown re-ingests graph.jsonl).
|
|
287
|
+
* Not atomic across records: the wipe is transactional, but if a re-upsert throws mid-way the index
|
|
288
|
+
* is left partially rebuilt. Since the index is rebuildable from canonical files, callers should
|
|
289
|
+
* treat a thrown rebuild as "index dirty — re-run" rather than relying on all-or-nothing semantics.
|
|
290
|
+
*/
|
|
291
|
+
async rebuild(records) {
|
|
292
|
+
const tx = this.db.transaction(() => {
|
|
293
|
+
this.db.exec(`DELETE FROM memories; DELETE FROM memories_fts; DELETE FROM memories_vec; DELETE FROM edges; DELETE FROM entities; DELETE FROM entity_relations;`);
|
|
294
|
+
});
|
|
295
|
+
tx();
|
|
296
|
+
for (const record of records) {
|
|
297
|
+
await this.upsert(record);
|
|
298
|
+
}
|
|
299
|
+
return { indexed: records.length };
|
|
300
|
+
}
|
|
301
|
+
bumpAccess(ids, now) {
|
|
302
|
+
if (ids.length === 0)
|
|
303
|
+
return;
|
|
304
|
+
const stmt = this.db.prepare(`UPDATE memories SET access_count = access_count + 1, last_accessed_at = ? WHERE id = ?`);
|
|
305
|
+
const tx = this.db.transaction(() => {
|
|
306
|
+
for (const id of ids)
|
|
307
|
+
stmt.run(now.toISOString(), id);
|
|
308
|
+
});
|
|
309
|
+
tx();
|
|
310
|
+
}
|
|
311
|
+
nextSeq(id) {
|
|
312
|
+
const existing = this.db.prepare(`SELECT seq FROM memories WHERE id = ?`).get(id);
|
|
313
|
+
if (existing !== undefined)
|
|
314
|
+
return existing.seq;
|
|
315
|
+
const max = this.db.prepare(`SELECT COALESCE(MAX(seq), 0) AS m FROM memories`).get();
|
|
316
|
+
return max.m + 1;
|
|
317
|
+
}
|
|
318
|
+
toRow(record, seq) {
|
|
319
|
+
return {
|
|
320
|
+
id: record.id,
|
|
321
|
+
seq,
|
|
322
|
+
type: record.type,
|
|
323
|
+
status: record.status,
|
|
324
|
+
text: record.text,
|
|
325
|
+
salience: record.salience,
|
|
326
|
+
is_insight: record.isInsight ? 1 : 0,
|
|
327
|
+
created_at: record.createdAt,
|
|
328
|
+
last_accessed_at: record.lastAccessedAt ?? null,
|
|
329
|
+
access_count: record.accessCount,
|
|
330
|
+
valid_from: record.validFrom ?? null,
|
|
331
|
+
valid_to: record.validTo ?? null,
|
|
332
|
+
superseded_by: record.supersededBy ?? null,
|
|
333
|
+
superseded_at: record.supersededAt ?? null,
|
|
334
|
+
due_at: record.dueAt ?? null,
|
|
335
|
+
collection: record.collection ?? null,
|
|
336
|
+
source_session: record.source.session ?? null,
|
|
337
|
+
source_file: record.source.file ?? null,
|
|
338
|
+
source_line: record.source.line ?? null,
|
|
339
|
+
embedding_model: record.embeddingModel ?? this.embeddings?.id ?? null,
|
|
340
|
+
dim: record.dim ?? this.dim,
|
|
341
|
+
tags: JSON.stringify(record.tags),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
fromRow(row) {
|
|
345
|
+
const str = (v) => String(v);
|
|
346
|
+
return {
|
|
347
|
+
id: str(row.id),
|
|
348
|
+
type: row.type,
|
|
349
|
+
status: row.status,
|
|
350
|
+
text: str(row.text),
|
|
351
|
+
salience: Number(row.salience),
|
|
352
|
+
isInsight: Number(row.is_insight) === 1,
|
|
353
|
+
createdAt: str(row.created_at),
|
|
354
|
+
...(row.last_accessed_at != null && { lastAccessedAt: str(row.last_accessed_at) }),
|
|
355
|
+
accessCount: Number(row.access_count),
|
|
356
|
+
...(row.valid_from != null && { validFrom: str(row.valid_from) }),
|
|
357
|
+
...(row.valid_to != null && { validTo: str(row.valid_to) }),
|
|
358
|
+
...(row.superseded_by != null && { supersededBy: str(row.superseded_by) }),
|
|
359
|
+
...(row.superseded_at != null && { supersededAt: str(row.superseded_at) }),
|
|
360
|
+
...(row.due_at != null && { dueAt: str(row.due_at) }),
|
|
361
|
+
...(row.collection != null && { collection: str(row.collection) }),
|
|
362
|
+
source: {
|
|
363
|
+
...(row.source_session != null && { session: str(row.source_session) }),
|
|
364
|
+
...(row.source_file != null && { file: str(row.source_file) }),
|
|
365
|
+
...(row.source_line != null && { line: Number(row.source_line) }),
|
|
366
|
+
},
|
|
367
|
+
...(row.embedding_model != null && { embeddingModel: str(row.embedding_model) }),
|
|
368
|
+
...(row.dim != null && { dim: Number(row.dim) }),
|
|
369
|
+
tags: JSON.parse(str(row.tags ?? "[]")),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
upsertEntity(entity) {
|
|
373
|
+
this.db.prepare(`INSERT INTO entities (id, name, type, summary, created_at, updated_at)
|
|
374
|
+
VALUES (@id, @name, @type, @summary, @created_at, @updated_at)
|
|
375
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
376
|
+
name = excluded.name,
|
|
377
|
+
type = COALESCE(excluded.type, entities.type),
|
|
378
|
+
summary = COALESCE(excluded.summary, entities.summary),
|
|
379
|
+
updated_at = COALESCE(excluded.updated_at, entities.updated_at)`).run({
|
|
380
|
+
id: entity.id,
|
|
381
|
+
name: entity.name,
|
|
382
|
+
type: entity.type ?? null,
|
|
383
|
+
summary: entity.summary ?? null,
|
|
384
|
+
created_at: entity.createdAt,
|
|
385
|
+
updated_at: entity.updatedAt ?? null,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
getEntity(id) {
|
|
389
|
+
const row = this.db.prepare(`SELECT * FROM entities WHERE id = ?`).get(id);
|
|
390
|
+
return row === undefined ? undefined : this.entityFromRow(row);
|
|
391
|
+
}
|
|
392
|
+
countEntities() {
|
|
393
|
+
return this.db.prepare(`SELECT COUNT(*) AS n FROM entities`).get().n;
|
|
394
|
+
}
|
|
395
|
+
/** All entities ordered by name, for index projections. */
|
|
396
|
+
listEntities(limit = 50) {
|
|
397
|
+
const rows = this.db.prepare(`SELECT * FROM entities ORDER BY name LIMIT ?`).all(limit);
|
|
398
|
+
return rows.map((r) => this.entityFromRow(r));
|
|
399
|
+
}
|
|
400
|
+
addEntityRelation(src, dst, relation) {
|
|
401
|
+
this.db.prepare(`INSERT OR IGNORE INTO entity_relations (src, dst, relation, created_at) VALUES (?, ?, ?, ?)`).run(src, dst, relation, this.clock().toISOString());
|
|
402
|
+
}
|
|
403
|
+
relationsFor(src) {
|
|
404
|
+
const rows = this.db
|
|
405
|
+
.prepare(`SELECT src, dst, relation, created_at FROM entity_relations WHERE src = ?`)
|
|
406
|
+
.all(src);
|
|
407
|
+
return rows.map((r) => ({ src: r.src, dst: r.dst, relation: r.relation, createdAt: r.created_at }));
|
|
408
|
+
}
|
|
409
|
+
entityFromRow(row) {
|
|
410
|
+
const str = (v) => String(v);
|
|
411
|
+
return {
|
|
412
|
+
id: str(row.id),
|
|
413
|
+
name: str(row.name),
|
|
414
|
+
...(row.type != null && { type: str(row.type) }),
|
|
415
|
+
...(row.summary != null && { summary: str(row.summary) }),
|
|
416
|
+
createdAt: str(row.created_at),
|
|
417
|
+
...(row.updated_at != null && { updatedAt: str(row.updated_at) }),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
/** Open memories with a due date at/under `now`, soonest first (the future-log queue). */
|
|
421
|
+
dueItems(now, limit = 50) {
|
|
422
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE status IN ('open','scheduled') AND due_at IS NOT NULL AND due_at <= ? ORDER BY due_at LIMIT ?`).all(now.toISOString(), limit);
|
|
423
|
+
return rows.map((r) => this.fromRow(r));
|
|
424
|
+
}
|
|
425
|
+
/** Live, low-salience, old, infrequently-accessed open memories — migration candidates. */
|
|
426
|
+
agingOpen(now, opts = {}) {
|
|
427
|
+
const olderThan = new Date(now.getTime() - (opts.olderThanDays ?? 30) * 86_400_000).toISOString();
|
|
428
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE status = 'open' AND created_at <= ? AND salience <= ? ORDER BY salience ASC, created_at ASC LIMIT ?`).all(olderThan, opts.maxSalience ?? 0.4, opts.limit ?? 50);
|
|
429
|
+
return rows.map((r) => this.fromRow(r));
|
|
430
|
+
}
|
|
431
|
+
/** Highest-salience live memories (for promotion / always-in-context / index). */
|
|
432
|
+
topSalient(limit = 20) {
|
|
433
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE status NOT IN ('invalidated','dropped') ORDER BY salience DESC, created_at DESC LIMIT ?`).all(limit);
|
|
434
|
+
return rows.map((r) => this.fromRow(r));
|
|
435
|
+
}
|
|
436
|
+
/** Decay salience toward `floor` by time since last access (half-life in days). Returns count adjusted.
|
|
437
|
+
* Frequently-accessed memories (recent last_accessed_at) decay little; stale ones fade toward floor. */
|
|
438
|
+
applyDecay(now, opts = {}) {
|
|
439
|
+
const halfLife = opts.halfLifeDays ?? 30;
|
|
440
|
+
const floor = opts.floor ?? 0.05;
|
|
441
|
+
const rows = this.db.prepare(`SELECT id, salience, COALESCE(last_accessed_at, created_at) AS ref FROM memories WHERE status NOT IN ('invalidated','dropped')`).all();
|
|
442
|
+
const stmt = this.db.prepare(`UPDATE memories SET salience = ? WHERE id = ?`);
|
|
443
|
+
let decayed = 0;
|
|
444
|
+
const tx = this.db.transaction(() => {
|
|
445
|
+
for (const r of rows) {
|
|
446
|
+
const days = Math.max(0, (now.getTime() - new Date(r.ref).getTime()) / 86_400_000);
|
|
447
|
+
const factor = 0.5 ** (days / halfLife);
|
|
448
|
+
const next = Math.max(floor, r.salience * factor);
|
|
449
|
+
if (Math.abs(next - r.salience) > 1e-9) {
|
|
450
|
+
stmt.run(next, r.id);
|
|
451
|
+
decayed += 1;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
tx();
|
|
456
|
+
return { decayed };
|
|
457
|
+
}
|
|
458
|
+
close() {
|
|
459
|
+
this.db.close();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
export function openMemoryDb(options) {
|
|
463
|
+
return new MemoryDb(options);
|
|
464
|
+
}
|
|
465
|
+
function normalizeNonNegativeInteger(value, message) {
|
|
466
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
467
|
+
throw new Error(message);
|
|
468
|
+
}
|
|
469
|
+
return value;
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/store/fts.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/store/fts.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC5D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { MemoryDb, openMemoryDb } from "./db.js";
|
|
2
|
+
export type { EntityRecord, EntityRelationRecord, MemoryCountByStatus, MemoryCountByType, MemoryDbOptions, MemoryEdgeKind, MemoryRecord, MemorySource, MemoryStatus, MemoryStoreStats, MemoryStoreStatsOptions, MemoryType, RecallHit, RecallOptions, RecallWeights, SimilarHit, } from "./types.js";
|
|
3
|
+
export { DEFAULT_VEC_DIM, MEMORY_STATUSES, MEMORY_TYPES } from "./types.js";
|
|
4
|
+
export type { MemoryBlock, MemoryStore, MemoryWriteResult } from "@mono-agent/agent-contracts";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjD,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmBjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RecallWeights } from "./types.js";
|
|
2
|
+
export interface FusedItem {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly rrfScore: number;
|
|
5
|
+
}
|
|
6
|
+
/** Reciprocal Rank Fusion across any number of ranked id lists (best-first). */
|
|
7
|
+
export declare function rrfFuse(lists: readonly (readonly string[])[], k: number): FusedItem[];
|
|
8
|
+
export interface ReScoreInput {
|
|
9
|
+
readonly rrfScore: number;
|
|
10
|
+
readonly salience: number;
|
|
11
|
+
readonly isInsight: boolean;
|
|
12
|
+
readonly lastAccessedAt?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Final relevance: RRF + recency decay + salience + insight, weighted. */
|
|
15
|
+
export declare function reScore(input: ReScoreInput, weights: RecallWeights, decayGamma: number, now: Date): number;
|
|
16
|
+
//# sourceMappingURL=ranking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../src/store/ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAUrF;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAQ1G"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Reciprocal Rank Fusion across any number of ranked id lists (best-first). */
|
|
2
|
+
export function rrfFuse(lists, k) {
|
|
3
|
+
const scores = new Map();
|
|
4
|
+
for (const list of lists) {
|
|
5
|
+
list.forEach((id, index) => {
|
|
6
|
+
scores.set(id, (scores.get(id) ?? 0) + 1 / (k + index + 1));
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
return [...scores.entries()]
|
|
10
|
+
.map(([id, rrfScore]) => ({ id, rrfScore }))
|
|
11
|
+
.sort((a, b) => b.rrfScore - a.rrfScore);
|
|
12
|
+
}
|
|
13
|
+
/** Final relevance: RRF + recency decay + salience + insight, weighted. */
|
|
14
|
+
export function reScore(input, weights, decayGamma, now) {
|
|
15
|
+
const recency = recencyDecay(input.lastAccessedAt, decayGamma, now);
|
|
16
|
+
return (weights.rrf * input.rrfScore +
|
|
17
|
+
weights.recency * recency +
|
|
18
|
+
weights.salience * input.salience +
|
|
19
|
+
weights.insight * (input.isInsight ? 1 : 0));
|
|
20
|
+
}
|
|
21
|
+
function recencyDecay(lastAccessedAt, gamma, now) {
|
|
22
|
+
if (lastAccessedAt === undefined)
|
|
23
|
+
return 0;
|
|
24
|
+
const ts = new Date(lastAccessedAt).getTime();
|
|
25
|
+
// A malformed timestamp parses to NaN; left unguarded it would make reScore return NaN and
|
|
26
|
+
// destabilise sorting. Treat it as no recency contribution.
|
|
27
|
+
if (Number.isNaN(ts))
|
|
28
|
+
return 0;
|
|
29
|
+
const days = Math.max(0, (now.getTime() - ts) / 86_400_000);
|
|
30
|
+
return gamma ** days;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ranking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../src/store/ranking.ts"],"names":[],"mappings":"AAOA,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,KAAqC,EAAE,CAAS;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YACzB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AASD,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,KAAmB,EAAE,OAAsB,EAAE,UAAkB,EAAE,GAAS;IAChG,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,CACL,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ;QAC5B,OAAO,CAAC,OAAO,GAAG,OAAO;QACzB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;QACjC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,cAAkC,EAAE,KAAa,EAAE,GAAS;IAChF,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,2FAA2F;IAC3F,4DAA4D;IAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;IAC5D,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAsDzD"}
|