mumpix 1.0.20 → 1.1.3
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/CHANGELOG.md +82 -11
- package/README.md +278 -8
- package/bin/mumpix.js +1 -405
- package/examples/agent-memory.js +1 -1
- package/examples/basic.js +1 -1
- package/examples/behavioral-primitives.js +50 -0
- package/examples/recall-quality-suite.js +156 -0
- package/examples/verified-mode.js +1 -1
- package/package.json +24 -13
- package/scripts/bench-semantic.cjs +76 -0
- package/scripts/test-license-modes.cjs +87 -0
- package/scripts/test-phase0.cjs +137 -0
- package/scripts/test-semantic.cjs +411 -0
- package/src/brp/index.js +1 -0
- package/src/collapse/index.js +1 -0
- package/src/core/MumpixDB.js +264 -323
- package/src/core/audit.js +1 -173
- package/src/core/auth.js +1 -232
- package/src/core/inverted-index.js +249 -0
- package/src/core/license.js +1 -267
- package/src/core/ml-dsa.mjs +1 -25
- package/src/core/ml-kem.mjs +1 -32
- package/src/core/recall.js +226 -112
- package/src/core/semantic-sidecar.js +312 -0
- package/src/core/store.js +365 -288
- package/src/core/wal-writer.js +83 -0
- package/src/index.js +20 -34
- package/src/integrations/developer-sdk.js +1 -165
- package/src/integrations/langchain-official.js +1 -0
- package/src/integrations/langchain.js +1 -131
- package/src/integrations/llamaindex-official.js +1 -0
- package/src/integrations/llamaindex.js +1 -86
- package/src/integrations/vector-sidecar.js +325 -0
- package/src/rlp/index.js +1 -0
- package/src/temporal/engine.js +1 -1894
- package/src/temporal/indexes.js +1 -178
- package/src/temporal/operators.js +1 -186
- package/scripts/postinstall-auth.js +0 -101
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const { spawn } = require("child_process");
|
|
8
|
+
const { Mumpix } = require("../src/index");
|
|
9
|
+
|
|
10
|
+
const DIM = 16;
|
|
11
|
+
const FOLD = {
|
|
12
|
+
realtime: "websocket",
|
|
13
|
+
socket: "websocket",
|
|
14
|
+
login: "auth",
|
|
15
|
+
check: "middleware",
|
|
16
|
+
skip: "bypass",
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
function fnv1a(text) {
|
|
20
|
+
let hash = 0x811c9dc5;
|
|
21
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
22
|
+
hash ^= text.charCodeAt(i);
|
|
23
|
+
hash = Math.imul(hash, 0x01000193);
|
|
24
|
+
}
|
|
25
|
+
return hash >>> 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class TestEmbedder {
|
|
29
|
+
constructor(id = "test-embedder-v1") {
|
|
30
|
+
this.id = id;
|
|
31
|
+
this.dim = DIM;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async embed(texts) {
|
|
35
|
+
return texts.map((text) => {
|
|
36
|
+
const vector = new Float32Array(DIM);
|
|
37
|
+
for (const raw of String(text).toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)) {
|
|
38
|
+
const token = FOLD[raw] || raw;
|
|
39
|
+
const hash = fnv1a(token);
|
|
40
|
+
vector[hash % DIM] += (hash >>> 16) & 1 ? 1 : -1;
|
|
41
|
+
}
|
|
42
|
+
const norm = Math.hypot(...vector) || 1;
|
|
43
|
+
for (let i = 0; i < DIM; i += 1) vector[i] /= norm;
|
|
44
|
+
return vector;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function clean(filePath) {
|
|
50
|
+
for (const suffix of ["", ".wal", ".lock", ".idx", ".vectors.json", ".vectors.jsonl"]) {
|
|
51
|
+
fs.rmSync(`${filePath}${suffix}`, { force: true, recursive: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function testBasicSemanticRecall() {
|
|
56
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mumpix-semantic-test-"));
|
|
57
|
+
const filePath = path.join(dir, "semantic.mumpix");
|
|
58
|
+
clean(filePath);
|
|
59
|
+
|
|
60
|
+
const db = await Mumpix.open(filePath, {
|
|
61
|
+
recall: "semantic",
|
|
62
|
+
embedder: new TestEmbedder(),
|
|
63
|
+
semanticFloor: 0.35,
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
await db.remember("websocket upgrade requests bypass express middleware auth");
|
|
67
|
+
assert.strictEqual(
|
|
68
|
+
await db.recall("realtime socket connections skip the login check"),
|
|
69
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
70
|
+
);
|
|
71
|
+
const liveHits = await db.recallMany("realtime socket connections skip the login check", 1);
|
|
72
|
+
assert.strictEqual(liveHits.length, 1);
|
|
73
|
+
assert.strictEqual(liveHits[0].id, 1);
|
|
74
|
+
assert.strictEqual(
|
|
75
|
+
liveHits[0].content,
|
|
76
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
77
|
+
);
|
|
78
|
+
assert.strictEqual(Number.isFinite(liveHits[0].score), true);
|
|
79
|
+
assert.strictEqual(await db.recall("purple elephant tax return kazoo"), null);
|
|
80
|
+
} finally {
|
|
81
|
+
await db.close();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const sidecarPath = `${filePath}.vectors.json`;
|
|
85
|
+
const sidecar = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
86
|
+
assert.strictEqual(sidecar.embedder_id, "test-embedder-v1");
|
|
87
|
+
assert.strictEqual(sidecar.entries.length, 1);
|
|
88
|
+
assert.strictEqual(sidecar.entries[0].seq, 1);
|
|
89
|
+
assert.strictEqual(sidecar.entries[0].id, 1);
|
|
90
|
+
assert.strictEqual(sidecar.entries[0].record_id, 1);
|
|
91
|
+
assert.strictEqual(fs.existsSync(`${sidecarPath}l`), false);
|
|
92
|
+
|
|
93
|
+
const reopened = await Mumpix.open(filePath, {
|
|
94
|
+
recall: "semantic",
|
|
95
|
+
embedder: new TestEmbedder(),
|
|
96
|
+
semanticFloor: 0.35,
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
assert.strictEqual(
|
|
100
|
+
await reopened.recall("realtime socket connections skip the login check"),
|
|
101
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
102
|
+
);
|
|
103
|
+
const reopenedHits = await reopened.recallMany(
|
|
104
|
+
"realtime socket connections skip the login check",
|
|
105
|
+
1
|
|
106
|
+
);
|
|
107
|
+
assert.strictEqual(reopenedHits.length, 1);
|
|
108
|
+
assert.strictEqual(reopenedHits[0].id, 1);
|
|
109
|
+
} finally {
|
|
110
|
+
await reopened.close();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const changed = await Mumpix.open(filePath, {
|
|
114
|
+
recall: "semantic",
|
|
115
|
+
embedder: new TestEmbedder("test-embedder-v2"),
|
|
116
|
+
semanticFloor: 0.35,
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
assert.strictEqual(
|
|
120
|
+
await changed.recall("realtime socket connections skip the login check"),
|
|
121
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
122
|
+
);
|
|
123
|
+
} finally {
|
|
124
|
+
await changed.close();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const changedSidecar = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
128
|
+
assert.strictEqual(changedSidecar.embedder_id, "test-embedder-v2");
|
|
129
|
+
assert.strictEqual(changedSidecar.entries.length, 1);
|
|
130
|
+
|
|
131
|
+
let missingError = null;
|
|
132
|
+
try {
|
|
133
|
+
await Mumpix.open(path.join(dir, "missing-embedder.mumpix"), { recall: "semantic" });
|
|
134
|
+
} catch (err) {
|
|
135
|
+
missingError = err;
|
|
136
|
+
}
|
|
137
|
+
assert.ok(missingError, "semantic recall without an embedder must fail loudly");
|
|
138
|
+
assert.match(String(missingError.message), /mumpix-embed/);
|
|
139
|
+
|
|
140
|
+
clean(filePath);
|
|
141
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function testSemanticReconcileRepairsMissingVectors() {
|
|
145
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mumpix-semantic-reconcile-"));
|
|
146
|
+
const filePath = path.join(dir, "semantic.mumpix");
|
|
147
|
+
clean(filePath);
|
|
148
|
+
|
|
149
|
+
const db = await Mumpix.open(filePath, {
|
|
150
|
+
recall: "semantic",
|
|
151
|
+
embedder: new TestEmbedder(),
|
|
152
|
+
semanticFloor: 0.35,
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
await db.remember("websocket upgrade requests bypass express middleware auth");
|
|
156
|
+
} finally {
|
|
157
|
+
await db.close();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const sidecarPath = `${filePath}.vectors.json`;
|
|
161
|
+
const sidecar = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
162
|
+
sidecar.entries = [];
|
|
163
|
+
fs.writeFileSync(sidecarPath, JSON.stringify(sidecar), "utf8");
|
|
164
|
+
|
|
165
|
+
const reopened = await Mumpix.open(filePath, {
|
|
166
|
+
recall: "semantic",
|
|
167
|
+
embedder: new TestEmbedder(),
|
|
168
|
+
semanticFloor: 0.35,
|
|
169
|
+
});
|
|
170
|
+
try {
|
|
171
|
+
assert.strictEqual(
|
|
172
|
+
await reopened.recall("realtime socket connections skip the login check"),
|
|
173
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
174
|
+
);
|
|
175
|
+
} finally {
|
|
176
|
+
await reopened.close();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const repaired = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
180
|
+
assert.strictEqual(repaired.entries.length, 1);
|
|
181
|
+
assert.strictEqual(repaired.entries[0].seq, 1);
|
|
182
|
+
|
|
183
|
+
clean(filePath);
|
|
184
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function testSemanticReconcileDropsTornJournalTail() {
|
|
188
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mumpix-semantic-torn-"));
|
|
189
|
+
const filePath = path.join(dir, "semantic.mumpix");
|
|
190
|
+
clean(filePath);
|
|
191
|
+
|
|
192
|
+
const db = await Mumpix.open(filePath, {
|
|
193
|
+
recall: "semantic",
|
|
194
|
+
embedder: new TestEmbedder(),
|
|
195
|
+
semanticFloor: 0.35,
|
|
196
|
+
});
|
|
197
|
+
try {
|
|
198
|
+
await db.remember("websocket upgrade requests bypass express middleware auth");
|
|
199
|
+
} finally {
|
|
200
|
+
await db.close();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const sidecarPath = `${filePath}.vectors.json`;
|
|
204
|
+
const sidecar = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
205
|
+
sidecar.entries = [];
|
|
206
|
+
fs.writeFileSync(sidecarPath, JSON.stringify(sidecar), "utf8");
|
|
207
|
+
fs.writeFileSync(`${sidecarPath}l`, "{\"op\":\"upsert\",\"entry\":", "utf8");
|
|
208
|
+
|
|
209
|
+
const reopened = await Mumpix.open(filePath, {
|
|
210
|
+
recall: "semantic",
|
|
211
|
+
embedder: new TestEmbedder(),
|
|
212
|
+
semanticFloor: 0.35,
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
assert.strictEqual(
|
|
216
|
+
await reopened.recall("realtime socket connections skip the login check"),
|
|
217
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
218
|
+
);
|
|
219
|
+
} finally {
|
|
220
|
+
await reopened.close();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const repaired = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
224
|
+
assert.strictEqual(repaired.entries.length, 1);
|
|
225
|
+
assert.strictEqual(fs.existsSync(`${sidecarPath}l`), false);
|
|
226
|
+
|
|
227
|
+
clean(filePath);
|
|
228
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async function testPlainOpenDefersSemanticReconcile() {
|
|
232
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mumpix-semantic-defer-"));
|
|
233
|
+
const filePath = path.join(dir, "semantic.mumpix");
|
|
234
|
+
clean(filePath);
|
|
235
|
+
|
|
236
|
+
const db = await Mumpix.open(filePath, {
|
|
237
|
+
recall: "semantic",
|
|
238
|
+
embedder: new TestEmbedder(),
|
|
239
|
+
semanticFloor: 0.35,
|
|
240
|
+
});
|
|
241
|
+
try {
|
|
242
|
+
await db.remember("websocket upgrade requests bypass express middleware auth");
|
|
243
|
+
} finally {
|
|
244
|
+
await db.close();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const sidecarPath = `${filePath}.vectors.json`;
|
|
248
|
+
const sidecar = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
249
|
+
sidecar.entries = [];
|
|
250
|
+
fs.writeFileSync(sidecarPath, JSON.stringify(sidecar), "utf8");
|
|
251
|
+
|
|
252
|
+
const plain = await Mumpix.open(filePath);
|
|
253
|
+
try {
|
|
254
|
+
assert.strictEqual(
|
|
255
|
+
await plain.recall("websocket auth middleware"),
|
|
256
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
257
|
+
);
|
|
258
|
+
} finally {
|
|
259
|
+
await plain.close();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const deferred = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
263
|
+
assert.strictEqual(deferred.entries.length, 0);
|
|
264
|
+
|
|
265
|
+
const semantic = await Mumpix.open(filePath, {
|
|
266
|
+
recall: "semantic",
|
|
267
|
+
embedder: new TestEmbedder(),
|
|
268
|
+
semanticFloor: 0.35,
|
|
269
|
+
});
|
|
270
|
+
try {
|
|
271
|
+
assert.strictEqual(
|
|
272
|
+
await semantic.recall("realtime socket connections skip the login check"),
|
|
273
|
+
"websocket upgrade requests bypass express middleware auth"
|
|
274
|
+
);
|
|
275
|
+
} finally {
|
|
276
|
+
await semantic.close();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const repaired = JSON.parse(fs.readFileSync(sidecarPath, "utf8"));
|
|
280
|
+
assert.strictEqual(repaired.entries.length, 1);
|
|
281
|
+
assert.strictEqual(repaired.entries[0].seq, 1);
|
|
282
|
+
|
|
283
|
+
clean(filePath);
|
|
284
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
async function testSemanticSigkillReconcilesSidecar() {
|
|
288
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mumpix-semantic-sigkill-"));
|
|
289
|
+
const filePath = path.join(dir, "semantic.mumpix");
|
|
290
|
+
clean(filePath);
|
|
291
|
+
|
|
292
|
+
const childCode = `
|
|
293
|
+
const { Mumpix } = require(${JSON.stringify(path.resolve(__dirname, "../src/index"))});
|
|
294
|
+
class SlowEmbedder {
|
|
295
|
+
constructor() { this.id = "slow-test-embedder-v1"; this.dim = ${DIM}; }
|
|
296
|
+
async embed(texts) {
|
|
297
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
298
|
+
return texts.map((text) => {
|
|
299
|
+
const vector = new Float32Array(${DIM});
|
|
300
|
+
for (const raw of String(text).toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)) {
|
|
301
|
+
const token = ${JSON.stringify(FOLD)}[raw] || raw;
|
|
302
|
+
let hash = 0x811c9dc5;
|
|
303
|
+
for (let i = 0; i < token.length; i += 1) {
|
|
304
|
+
hash ^= token.charCodeAt(i);
|
|
305
|
+
hash = Math.imul(hash, 0x01000193);
|
|
306
|
+
}
|
|
307
|
+
vector[(hash >>> 0) % ${DIM}] += (hash >>> 16) & 1 ? 1 : -1;
|
|
308
|
+
}
|
|
309
|
+
const norm = Math.hypot(...vector) || 1;
|
|
310
|
+
for (let i = 0; i < ${DIM}; i += 1) vector[i] /= norm;
|
|
311
|
+
return vector;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
(async () => {
|
|
316
|
+
const db = await Mumpix.open(${JSON.stringify(filePath)}, {
|
|
317
|
+
recall: "semantic",
|
|
318
|
+
embedder: new SlowEmbedder(),
|
|
319
|
+
semanticFloor: 0.35,
|
|
320
|
+
});
|
|
321
|
+
for (let i = 0; i < 200; i += 1) {
|
|
322
|
+
await db.remember("websocket upgrade requests bypass express middleware auth " + i);
|
|
323
|
+
if (i === 10 && process.send) process.send({ ready: true });
|
|
324
|
+
}
|
|
325
|
+
if (process.send) process.send({ done: true });
|
|
326
|
+
setInterval(() => {}, 1000);
|
|
327
|
+
})().catch((err) => {
|
|
328
|
+
if (process.send) process.send({ error: err.message });
|
|
329
|
+
process.exit(1);
|
|
330
|
+
});
|
|
331
|
+
`;
|
|
332
|
+
|
|
333
|
+
const child = spawn(process.execPath, ["-e", childCode], {
|
|
334
|
+
stdio: ["ignore", "ignore", "ignore", "ipc"],
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
await new Promise((resolve, reject) => {
|
|
339
|
+
const timeout = setTimeout(() => reject(new Error("semantic child did not start")), 5000);
|
|
340
|
+
child.on("message", (message) => {
|
|
341
|
+
if (message && message.error) {
|
|
342
|
+
clearTimeout(timeout);
|
|
343
|
+
reject(new Error(message.error));
|
|
344
|
+
} else if (message && message.ready) {
|
|
345
|
+
clearTimeout(timeout);
|
|
346
|
+
resolve();
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
child.once("exit", (code, signal) => {
|
|
350
|
+
clearTimeout(timeout);
|
|
351
|
+
reject(new Error(`child exited before ready: code=${code} signal=${signal}`));
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
child.kill("SIGKILL");
|
|
356
|
+
await new Promise((resolve) => child.once("exit", resolve));
|
|
357
|
+
|
|
358
|
+
const fileRecordsBeforeReplay = fs
|
|
359
|
+
.readFileSync(filePath, "utf8")
|
|
360
|
+
.split("\n")
|
|
361
|
+
.filter((line) => line.trim()).length - 1;
|
|
362
|
+
assert(fileRecordsBeforeReplay > 0, "SIGKILL fixture should leave records in the ledger");
|
|
363
|
+
|
|
364
|
+
const reopened = await Mumpix.open(filePath, {
|
|
365
|
+
recall: "semantic",
|
|
366
|
+
embedder: new TestEmbedder("slow-test-embedder-v1"),
|
|
367
|
+
semanticFloor: 0.35,
|
|
368
|
+
});
|
|
369
|
+
try {
|
|
370
|
+
const records = await reopened.list();
|
|
371
|
+
assert.ok(
|
|
372
|
+
records.length >= fileRecordsBeforeReplay,
|
|
373
|
+
"reopen should preserve main-file records and may replay additional durable WAL records"
|
|
374
|
+
);
|
|
375
|
+
const recalled = await reopened.recall("realtime socket connections skip the login check");
|
|
376
|
+
assert.ok(
|
|
377
|
+
records.some((record) => record.content === recalled),
|
|
378
|
+
"semantic recall should return a surviving ledger record after SIGKILL"
|
|
379
|
+
);
|
|
380
|
+
} finally {
|
|
381
|
+
await reopened.close();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const sidecar = JSON.parse(fs.readFileSync(`${filePath}.vectors.json`, "utf8"));
|
|
385
|
+
const reopenedCount = fs
|
|
386
|
+
.readFileSync(filePath, "utf8")
|
|
387
|
+
.split("\n")
|
|
388
|
+
.filter((line) => line.trim()).length - 1;
|
|
389
|
+
assert.strictEqual(sidecar.entries.length, reopenedCount);
|
|
390
|
+
assert.strictEqual(
|
|
391
|
+
Math.max(...sidecar.entries.map((entry) => entry.seq)),
|
|
392
|
+
reopenedCount
|
|
393
|
+
);
|
|
394
|
+
} finally {
|
|
395
|
+
if (!child.killed) child.kill("SIGKILL");
|
|
396
|
+
clean(filePath);
|
|
397
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
(async () => {
|
|
402
|
+
await testBasicSemanticRecall();
|
|
403
|
+
await testSemanticReconcileRepairsMissingVectors();
|
|
404
|
+
await testSemanticReconcileDropsTornJournalTail();
|
|
405
|
+
await testPlainOpenDefersSemanticReconcile();
|
|
406
|
+
await testSemanticSigkillReconcilesSidecar();
|
|
407
|
+
console.log("semantic recall tests passed");
|
|
408
|
+
})().catch((err) => {
|
|
409
|
+
console.error(err && err.stack ? err.stack : err);
|
|
410
|
+
process.exit(1);
|
|
411
|
+
});
|
package/src/brp/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("crypto"),r=["active","probationary","archived","fossilized"],t=["DO","PREFER"],n=["fresh_promotion","refined_from","trigger_refresh"],o=["navigate","read-dom","input-text","click-element","extract-kv","wait-for-state","scroll-page","compress-context","read-local-state"];function i(r="brp"){const t=e.randomUUID?e.randomUUID():e.randomBytes(16).toString("hex");return`${r}_${String(t).replace(/-/g,"").slice(0,16)}`}function a(e){return String(e||"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function s(e){if(e&&"object"==typeof e)return e;if("string"!=typeof e||!e.trim())throw new Error("executable_payload is empty or null.");try{return JSON.parse(e)}catch{throw new Error("executable_payload failed JSON parse.")}}class c{constructor(e=o){this._verbs=new Map;for(const r of e)this.register(r)}register(e,r=null){const t=String(e||"").trim();if(!t)throw new Error("verb name is required");return this._verbs.set(t,r||!0),this}has(e){return this._verbs.has(String(e||"").trim())}list(){return Array.from(this._verbs.keys()).sort()}}function u(e,r={}){const n=r.verbRegistry||new c(r.verbs||o),i=s(e);if(!i||"object"!=typeof i)throw new Error("executable_payload must parse to an object.");if(!t.includes(i.intent))throw new Error("executable_payload intent must be DO or PREFER.");if("DO"===i.intent){if(!Array.isArray(i.sequence)||0===i.sequence.length)throw new Error("DO payload has empty sequence.");for(const e of i.sequence){if(!e||"object"!=typeof e)throw new Error("DO payload step must be an object.");if(!n.has(e.verb))throw new Error(`Unknown verb: ${e.verb}`);if(null!=e.args&&("object"!=typeof e.args||Array.isArray(e.args)))throw new Error(`DO payload step args must be an object for verb: ${e.verb}`)}}if("PREFER"===i.intent){if("string"!=typeof i.injected_context||!i.injected_context.trim())throw new Error("PREFER payload requires injected_context.");if(null!=i.negative_constraints&&!Array.isArray(i.negative_constraints))throw new Error("PREFER negative_constraints must be an array when present.")}return i}function g(e,t={}){try{if(!e||"object"!=typeof e)throw new Error("BRP candidate must be an object.");if(!e.domain)throw new Error("BRP must declare a domain.");if(!e.trigger_signature)throw new Error("BRP must declare a trigger_signature.");const n=u(e.executable_payload,t);if(e.status&&!r.includes(e.status))throw new Error(`Unknown BRP status: ${e.status}`);return{ok:!0,payload:n,payload_type:n.intent,warnings:[]}}catch(e){return{ok:!1,error:e.message,warnings:[]}}}function _(e,r={}){const t=r.domain?String(r.domain):null,n=r.statuses||["active","probationary"];return e.filter(e=>(!t||e.domain===t)&&(!(n&&!n.includes(e.status))&&(!r.payload_type||e.payload_type===r.payload_type)))}function d(e,r){const t=new Set(a(r));if(!t.size)return 0;const n=a(`${e.trigger_signature} ${e.domain} ${e.payload_type}`);let o=0;for(const e of n)t.has(e)&&(o+=1);return o+(Number(e.trigger_confidence||0)+Number(e.sequence_confidence||0))/2}module.exports={CORE_ACTION_VERBS:o,GENE_STATUSES:r,PAYLOAD_TYPES:t,PROVENANCE_TYPES:n,VerbRegistry:c,parseExecutablePayload:s,validatePayload:u,validateBRP:g,normalizeBRP:function(e,r={}){const t=g(e,r);if(!t.ok)throw new Error(t.error);const o=(new Date).toISOString(),a=t.payload;return{brp_id:e.brp_id||i("brp"),domain:String(e.domain),status:e.status||"active",trigger_signature:String(e.trigger_signature),trigger_embedding:Array.isArray(e.trigger_embedding)?e.trigger_embedding.map(Number):[],preconditions:e.preconditions&&"object"==typeof e.preconditions?{...e.preconditions}:{},executable_payload:"string"==typeof e.executable_payload?e.executable_payload:JSON.stringify(e.executable_payload),payload_type:a.intent,sequence_execution_count:Number(e.sequence_execution_count||0),sequence_confidence:Number.isFinite(Number(e.sequence_confidence))?Number(e.sequence_confidence):1,trigger_match_count:Number(e.trigger_match_count||0),trigger_confidence:Number.isFinite(Number(e.trigger_confidence))?Number(e.trigger_confidence):.5,trigger_version:Number(e.trigger_version||1),break_even_crossed:Boolean(e.break_even_crossed),created_at:e.created_at||o,status_changed_at:e.status_changed_at||o,...e.retirement_reason?{retirement_reason:String(e.retirement_reason)}:{},provenance:n.includes(e.provenance)?e.provenance:"fresh_promotion"}},updateSplitConfidence:function(e,r={}){const t={...e};r.triggerMatched&&(t.trigger_match_count=Number(t.trigger_match_count||0)+1,t.trigger_confidence=Math.min(1,Number(t.trigger_confidence||0)+.05)),r.triggerDrift&&(t.trigger_confidence=Math.max(0,Number(t.trigger_confidence||0)-.15),t.trigger_version=Number(t.trigger_version||1)+1),r.sequenceExecuted&&(t.sequence_execution_count=Number(t.sequence_execution_count||0)+1,t.sequence_confidence=Math.min(1,Number(t.sequence_confidence||0)+.03)),r.sequenceFailed&&(t.sequence_confidence=Math.max(0,Number(t.sequence_confidence||0)-.2));const n=Number.isFinite(Number(r.breakEvenThreshold))?Number(r.breakEvenThreshold):3;return t.break_even_crossed=Number(t.sequence_execution_count||0)>=n,t},transitionStatus:function(e,t,n=""){if(!r.includes(t))throw new Error(`Unknown BRP status: ${t}`);return{...e,status:t,status_changed_at:(new Date).toISOString(),...n?{retirement_reason:String(n)}:{}}},structuralPrefilter:_,twoStageMatch:function(e,r={},t={}){const n=_(e,r),o=r.text||r.trigger_signature||"",i=Number(t.k||r.k||5);return n.map(e=>({brp:e,score:d(e,o)})).sort((e,r)=>r.score-e.score).slice(0,i)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function e(e){return"number"==typeof e?e:e&&"object"==typeof e&&Number(e.token_cost??e.tokens??e.cost??0)||0}function r(r=[]){if(!Array.isArray(r))throw new TypeError("graphCost() expects an array of stages or costs");return r.reduce((r,t)=>r+e(t),0)}function t(e=[],t={}){const o=Number.isFinite(Number(t.cycleCost))?Number(t.cycleCost):r(e),s=Number.isFinite(Number(t.retrievalCost))?Number(t.retrievalCost):150;return Math.max(0,o-s)}function o(e,r){const t=Number(e),o=Number(r);if(!Number.isFinite(t)||t<0)throw new TypeError("promotionCost must be a non-negative number");if(!Number.isFinite(o)||o<=0)throw new TypeError("cycleCost must be a positive number");return t/o}function s(e,r){const t=Number(e),o=Number(r);return!Number.isFinite(t)||!Number.isFinite(o)||o<=0?null:(t-o)/o}module.exports={DEFAULT_RETRIEVAL_COST:150,stageCost:e,graphCost:r,collapseSavings:t,breakEvenReuseThreshold:o,beta:s,analyzeCollapse:function(e={}){const i=e.stages||[],n=Number.isFinite(Number(e.cycleCost))?Number(e.cycleCost):r(i),u=Number.isFinite(Number(e.retrievalCost))?Number(e.retrievalCost):150,b=Number.isFinite(Number(e.promotionCost))?Number(e.promotionCost):3*n,m=o(b,n||1),a=t([],{cycleCost:n,retrievalCost:u}),c=Number(e.hits||1);return{cycleCost:n,promotionCost:b,retrievalCost:u,savingsPerHit:a,hits:c,totalSavings:a*c,breakEvenReuseThreshold:m,beta:s(b,n),breakEvenCrossed:c>=m}}};
|