@mneme-ai/core 2.5.0 → 2.7.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/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/metron/code_audit.d.ts +55 -0
- package/dist/metron/code_audit.d.ts.map +1 -0
- package/dist/metron/code_audit.js +132 -0
- package/dist/metron/code_audit.js.map +1 -0
- package/dist/metron/code_audit.test.d.ts +2 -0
- package/dist/metron/code_audit.test.d.ts.map +1 -0
- package/dist/metron/code_audit.test.js +81 -0
- package/dist/metron/code_audit.test.js.map +1 -0
- package/dist/metron/index.d.ts +95 -0
- package/dist/metron/index.d.ts.map +1 -0
- package/dist/metron/index.js +393 -0
- package/dist/metron/index.js.map +1 -0
- package/dist/metron/metron.test.d.ts +2 -0
- package/dist/metron/metron.test.d.ts.map +1 -0
- package/dist/metron/metron.test.js +123 -0
- package/dist/metron/metron.test.js.map +1 -0
- package/dist/metron/update_notifier.d.ts +56 -0
- package/dist/metron/update_notifier.d.ts.map +1 -0
- package/dist/metron/update_notifier.js +143 -0
- package/dist/metron/update_notifier.js.map +1 -0
- package/dist/truth_kernel/index.d.ts +92 -0
- package/dist/truth_kernel/index.d.ts.map +1 -0
- package/dist/truth_kernel/index.js +203 -0
- package/dist/truth_kernel/index.js.map +1 -0
- package/dist/truth_kernel/truth_kernel.test.d.ts +2 -0
- package/dist/truth_kernel/truth_kernel.test.d.ts.map +1 -0
- package/dist/truth_kernel/truth_kernel.test.js +126 -0
- package/dist/truth_kernel/truth_kernel.test.js.map +1 -0
- package/dist/wormhole/auto_wire.d.ts +68 -0
- package/dist/wormhole/auto_wire.d.ts.map +1 -0
- package/dist/wormhole/auto_wire.js +186 -0
- package/dist/wormhole/auto_wire.js.map +1 -0
- package/dist/wormhole/index.d.ts +112 -0
- package/dist/wormhole/index.d.ts.map +1 -0
- package/dist/wormhole/index.js +151 -0
- package/dist/wormhole/index.js.map +1 -0
- package/dist/wormhole/wormhole.test.d.ts +2 -0
- package/dist/wormhole/wormhole.test.d.ts.map +1 -0
- package/dist/wormhole/wormhole.test.js +154 -0
- package/dist/wormhole/wormhole.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { sendViaWormhole, ingestTrial, formatWormholePulseLine } from "./index.js";
|
|
3
|
+
function fakeChannel(id, opts = { probe: "available" }) {
|
|
4
|
+
return {
|
|
5
|
+
id,
|
|
6
|
+
preference: opts.preference,
|
|
7
|
+
probe: () => opts.probe,
|
|
8
|
+
send: async () => {
|
|
9
|
+
if (opts.sendDelay)
|
|
10
|
+
await new Promise((r) => setTimeout(r, opts.sendDelay));
|
|
11
|
+
if (opts.sendOk === false)
|
|
12
|
+
return { ok: false, reason: opts.reason ?? "fake-fail" };
|
|
13
|
+
return { ok: true, receipt: `delivered-via-${id}` };
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe("v2.6 WORMHOLE · negotiation", () => {
|
|
18
|
+
it("single available channel wins immediately", async () => {
|
|
19
|
+
const r = await sendViaWormhole({
|
|
20
|
+
payload: "hello",
|
|
21
|
+
channels: [fakeChannel("lan", { probe: "available" })],
|
|
22
|
+
});
|
|
23
|
+
expect(r.winner).toBe("lan");
|
|
24
|
+
expect(r.receipt).toBe("delivered-via-lan");
|
|
25
|
+
});
|
|
26
|
+
it("unavailable channels are filtered before send", async () => {
|
|
27
|
+
const r = await sendViaWormhole({
|
|
28
|
+
payload: "hello",
|
|
29
|
+
channels: [
|
|
30
|
+
fakeChannel("lan", { probe: "unavailable" }),
|
|
31
|
+
fakeChannel("paste", { probe: "available" }),
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
expect(r.winner).toBe("paste");
|
|
35
|
+
const lanTrial = r.trials.find((t) => t.channel === "lan");
|
|
36
|
+
expect(lanTrial?.outcome).toBe("unavailable");
|
|
37
|
+
});
|
|
38
|
+
it("needs-pairing channels are excluded", async () => {
|
|
39
|
+
const r = await sendViaWormhole({
|
|
40
|
+
payload: "hello",
|
|
41
|
+
channels: [
|
|
42
|
+
fakeChannel("aura", { probe: "needs-pairing" }),
|
|
43
|
+
fakeChannel("paste", { probe: "available" }),
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
expect(r.winner).toBe("paste");
|
|
47
|
+
const auraTrial = r.trials.find((t) => t.channel === "aura");
|
|
48
|
+
expect(auraTrial?.outcome).toBe("needs-pairing");
|
|
49
|
+
});
|
|
50
|
+
it("no live channels → NO-CHANNEL winner null", async () => {
|
|
51
|
+
const r = await sendViaWormhole({
|
|
52
|
+
payload: "hello",
|
|
53
|
+
channels: [fakeChannel("a", { probe: "unavailable" }), fakeChannel("b", { probe: "unavailable" })],
|
|
54
|
+
});
|
|
55
|
+
expect(r.winner).toBeNull();
|
|
56
|
+
expect(r.receipt).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
it("send failure on one channel allows another to win", async () => {
|
|
59
|
+
const r = await sendViaWormhole({
|
|
60
|
+
payload: "hello",
|
|
61
|
+
channels: [
|
|
62
|
+
fakeChannel("flaky", { probe: "available", sendOk: false, reason: "503" }),
|
|
63
|
+
fakeChannel("solid", { probe: "available" }),
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
expect(r.winner).toBe("solid");
|
|
67
|
+
const flakyTrial = r.trials.find((t) => t.channel === "flaky");
|
|
68
|
+
expect(flakyTrial?.outcome).toBe("failed");
|
|
69
|
+
expect(flakyTrial?.reason).toBe("503");
|
|
70
|
+
});
|
|
71
|
+
it("send timeout marks channel as failed", async () => {
|
|
72
|
+
const r = await sendViaWormhole({
|
|
73
|
+
payload: "hello",
|
|
74
|
+
channels: [
|
|
75
|
+
fakeChannel("slow", { probe: "available", sendDelay: 200 }),
|
|
76
|
+
fakeChannel("fast", { probe: "available" }),
|
|
77
|
+
],
|
|
78
|
+
sendTimeoutMs: 50,
|
|
79
|
+
concurrency: 2,
|
|
80
|
+
});
|
|
81
|
+
expect(r.winner).toBe("fast");
|
|
82
|
+
const slowTrial = r.trials.find((t) => t.channel === "slow");
|
|
83
|
+
expect(slowTrial?.reason).toContain("timeout");
|
|
84
|
+
});
|
|
85
|
+
it("higher preference channel runs first when scores tied", async () => {
|
|
86
|
+
const r = await sendViaWormhole({
|
|
87
|
+
payload: "hello",
|
|
88
|
+
channels: [
|
|
89
|
+
fakeChannel("low", { probe: "available", preference: 0.1 }),
|
|
90
|
+
fakeChannel("high", { probe: "available", preference: 10 }),
|
|
91
|
+
],
|
|
92
|
+
concurrency: 1,
|
|
93
|
+
});
|
|
94
|
+
expect(r.winner).toBe("high");
|
|
95
|
+
});
|
|
96
|
+
it("empty channel list → NO-CHANNEL", async () => {
|
|
97
|
+
const r = await sendViaWormhole({ payload: "x", channels: [] });
|
|
98
|
+
expect(r.winner).toBeNull();
|
|
99
|
+
expect(r.trials.length).toBe(0);
|
|
100
|
+
});
|
|
101
|
+
it("scoresAtNegotiation reports per-channel scores", async () => {
|
|
102
|
+
const r = await sendViaWormhole({
|
|
103
|
+
payload: "x",
|
|
104
|
+
channels: [fakeChannel("a"), fakeChannel("b")],
|
|
105
|
+
});
|
|
106
|
+
expect(r.scoresAtNegotiation["a"]).toBeGreaterThan(0);
|
|
107
|
+
expect(r.scoresAtNegotiation["b"]).toBeGreaterThan(0);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe("v2.6 WORMHOLE · EWMA stats", () => {
|
|
111
|
+
it("first success → ewmaSuccess = 1", () => {
|
|
112
|
+
const s = ingestTrial(undefined, { channel: "a", outcome: "succeeded", ms: 100, ts: 0 });
|
|
113
|
+
expect(s.ewmaSuccess).toBe(1);
|
|
114
|
+
expect(s.succeeded).toBe(1);
|
|
115
|
+
expect(s.trials).toBe(1);
|
|
116
|
+
});
|
|
117
|
+
it("first failure → ewmaSuccess = 0", () => {
|
|
118
|
+
const s = ingestTrial(undefined, { channel: "a", outcome: "failed", ms: 100, ts: 0 });
|
|
119
|
+
expect(s.ewmaSuccess).toBe(0);
|
|
120
|
+
expect(s.succeeded).toBe(0);
|
|
121
|
+
expect(s.trials).toBe(1);
|
|
122
|
+
});
|
|
123
|
+
it("repeated successes converge ewmaSuccess to 1", () => {
|
|
124
|
+
let s = ingestTrial(undefined, { channel: "a", outcome: "failed", ms: 100, ts: 0 });
|
|
125
|
+
for (let i = 0; i < 60; i++) {
|
|
126
|
+
s = ingestTrial(s, { channel: "a", outcome: "succeeded", ms: 100, ts: i });
|
|
127
|
+
}
|
|
128
|
+
expect(s.ewmaSuccess).toBeGreaterThan(0.85);
|
|
129
|
+
expect(s.trials).toBe(61);
|
|
130
|
+
expect(s.succeeded).toBe(60);
|
|
131
|
+
});
|
|
132
|
+
it("recent failures pull ewmaSuccess down even after long success streak", () => {
|
|
133
|
+
let s = ingestTrial(undefined, { channel: "a", outcome: "succeeded", ms: 100, ts: 0 });
|
|
134
|
+
for (let i = 0; i < 30; i++)
|
|
135
|
+
s = ingestTrial(s, { channel: "a", outcome: "succeeded", ms: 100, ts: i });
|
|
136
|
+
const before = s.ewmaSuccess;
|
|
137
|
+
for (let i = 0; i < 30; i++)
|
|
138
|
+
s = ingestTrial(s, { channel: "a", outcome: "failed", ms: 100, ts: i });
|
|
139
|
+
expect(s.ewmaSuccess).toBeLessThan(before);
|
|
140
|
+
expect(s.ewmaSuccess).toBeLessThan(0.5);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("v2.6 WORMHOLE · pulse", () => {
|
|
144
|
+
it("formatWormholePulseLine OK case", async () => {
|
|
145
|
+
const r = await sendViaWormhole({ payload: "x", channels: [fakeChannel("a")] });
|
|
146
|
+
expect(formatWormholePulseLine(r)).toContain("OK");
|
|
147
|
+
expect(formatWormholePulseLine(r)).toContain("winner=a");
|
|
148
|
+
});
|
|
149
|
+
it("formatWormholePulseLine NO-CHANNEL case", async () => {
|
|
150
|
+
const r = await sendViaWormhole({ payload: "x", channels: [fakeChannel("a", { probe: "unavailable" })] });
|
|
151
|
+
expect(formatWormholePulseLine(r)).toContain("NO-CHANNEL");
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=wormhole.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wormhole.test.js","sourceRoot":"","sources":["../../src/wormhole/wormhole.test.ts"],"names":[],"mappings":"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"}
|