@mneme-ai/core 0.22.2 → 0.24.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/htc/abstract.d.ts +41 -0
- package/dist/htc/abstract.d.ts.map +1 -0
- package/dist/htc/abstract.js +97 -0
- package/dist/htc/abstract.js.map +1 -0
- package/dist/htc/abstract.test.d.ts +2 -0
- package/dist/htc/abstract.test.d.ts.map +1 -0
- package/dist/htc/abstract.test.js +169 -0
- package/dist/htc/abstract.test.js.map +1 -0
- package/dist/htc/clusters.d.ts +38 -0
- package/dist/htc/clusters.d.ts.map +1 -0
- package/dist/htc/clusters.js +103 -0
- package/dist/htc/clusters.js.map +1 -0
- package/dist/htc/clusters.test.d.ts +2 -0
- package/dist/htc/clusters.test.d.ts.map +1 -0
- package/dist/htc/clusters.test.js +128 -0
- package/dist/htc/clusters.test.js.map +1 -0
- package/dist/htc/index.d.ts +16 -0
- package/dist/htc/index.d.ts.map +1 -0
- package/dist/htc/index.js +16 -0
- package/dist/htc/index.js.map +1 -0
- package/dist/htc/memoir.d.ts +27 -0
- package/dist/htc/memoir.d.ts.map +1 -0
- package/dist/htc/memoir.js +50 -0
- package/dist/htc/memoir.js.map +1 -0
- package/dist/htc/memoir.test.d.ts +2 -0
- package/dist/htc/memoir.test.d.ts.map +1 -0
- package/dist/htc/memoir.test.js +87 -0
- package/dist/htc/memoir.test.js.map +1 -0
- package/dist/htc/storage.d.ts +24 -0
- package/dist/htc/storage.d.ts.map +1 -0
- package/dist/htc/storage.js +170 -0
- package/dist/htc/storage.js.map +1 -0
- package/dist/htc/storage.test.d.ts +2 -0
- package/dist/htc/storage.test.d.ts.map +1 -0
- package/dist/htc/storage.test.js +327 -0
- package/dist/htc/storage.test.js.map +1 -0
- package/dist/htc/types.d.ts +86 -0
- package/dist/htc/types.d.ts.map +1 -0
- package/dist/htc/types.js +22 -0
- package/dist/htc/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/retrieve/ddtree.d.ts +67 -0
- package/dist/retrieve/ddtree.d.ts.map +1 -0
- package/dist/retrieve/ddtree.js +156 -0
- package/dist/retrieve/ddtree.js.map +1 -0
- package/dist/retrieve/ddtree.test.d.ts +2 -0
- package/dist/retrieve/ddtree.test.d.ts.map +1 -0
- package/dist/retrieve/ddtree.test.js +181 -0
- package/dist/retrieve/ddtree.test.js.map +1 -0
- package/dist/retrieve/index.d.ts +3 -0
- package/dist/retrieve/index.d.ts.map +1 -1
- package/dist/retrieve/index.js +3 -0
- package/dist/retrieve/index.js.map +1 -1
- package/dist/retrieve/leviathan.d.ts +68 -0
- package/dist/retrieve/leviathan.d.ts.map +1 -0
- package/dist/retrieve/leviathan.js +192 -0
- package/dist/retrieve/leviathan.js.map +1 -0
- package/dist/retrieve/leviathan.test.d.ts +2 -0
- package/dist/retrieve/leviathan.test.d.ts.map +1 -0
- package/dist/retrieve/leviathan.test.js +124 -0
- package/dist/retrieve/leviathan.test.js.map +1 -0
- package/dist/retrieve/search.d.ts +7 -0
- package/dist/retrieve/search.d.ts.map +1 -1
- package/dist/retrieve/search.js +31 -3
- package/dist/retrieve/search.js.map +1 -1
- package/dist/retrieve/stream.d.ts +93 -0
- package/dist/retrieve/stream.d.ts.map +1 -0
- package/dist/retrieve/stream.js +52 -0
- package/dist/retrieve/stream.js.map +1 -0
- package/dist/retrieve/stream.test.d.ts +2 -0
- package/dist/retrieve/stream.test.d.ts.map +1 -0
- package/dist/retrieve/stream.test.js +118 -0
- package/dist/retrieve/stream.test.js.map +1 -0
- package/dist/retrieve/synthesize.d.ts +7 -0
- package/dist/retrieve/synthesize.d.ts.map +1 -1
- package/dist/retrieve/synthesize.js +48 -2
- package/dist/retrieve/synthesize.js.map +1 -1
- package/dist/store/schema.d.ts +3 -2
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +42 -1
- package/dist/store/schema.js.map +1 -1
- package/dist/store/sqlite.test.js +1 -1
- package/dist/util/constraint-pruner.d.ts +76 -0
- package/dist/util/constraint-pruner.d.ts.map +1 -0
- package/dist/util/constraint-pruner.js +89 -0
- package/dist/util/constraint-pruner.js.map +1 -0
- package/dist/util/constraint-pruner.test.d.ts +2 -0
- package/dist/util/constraint-pruner.test.d.ts.map +1 -0
- package/dist/util/constraint-pruner.test.js +101 -0
- package/dist/util/constraint-pruner.test.js.map +1 -0
- package/dist/util/index.d.ts +1 -0
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +1 -0
- package/dist/util/index.js.map +1 -1
- package/dist/wisdom/index.d.ts +2 -0
- package/dist/wisdom/index.d.ts.map +1 -1
- package/dist/wisdom/index.js +2 -0
- package/dist/wisdom/index.js.map +1 -1
- package/dist/wisdom/mutant-adapt.d.ts +69 -0
- package/dist/wisdom/mutant-adapt.d.ts.map +1 -0
- package/dist/wisdom/mutant-adapt.js +216 -0
- package/dist/wisdom/mutant-adapt.js.map +1 -0
- package/dist/wisdom/mutant-adapt.test.d.ts +2 -0
- package/dist/wisdom/mutant-adapt.test.d.ts.map +1 -0
- package/dist/wisdom/mutant-adapt.test.js +184 -0
- package/dist/wisdom/mutant-adapt.test.js.map +1 -0
- package/dist/wisdom/session.d.ts +60 -0
- package/dist/wisdom/session.d.ts.map +1 -0
- package/dist/wisdom/session.js +193 -0
- package/dist/wisdom/session.js.map +1 -0
- package/dist/wisdom/session.test.d.ts +2 -0
- package/dist/wisdom/session.test.d.ts.map +1 -0
- package/dist/wisdom/session.test.js +161 -0
- package/dist/wisdom/session.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { AlwaysAcceptPruner, CompositePruner, } from "./constraint-pruner.js";
|
|
3
|
+
/** Helper: pruner that always returns the verdict you tell it to. */
|
|
4
|
+
function fixed(name, out) {
|
|
5
|
+
return {
|
|
6
|
+
name,
|
|
7
|
+
description: `fixed pruner returning ${out.verdict}`,
|
|
8
|
+
validate: (_input) => out,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const sampleInput = {
|
|
12
|
+
candidate: "candidate-x",
|
|
13
|
+
pathState: 0,
|
|
14
|
+
};
|
|
15
|
+
describe("AlwaysAcceptPruner", () => {
|
|
16
|
+
it("returns accept for any input", () => {
|
|
17
|
+
const p = new AlwaysAcceptPruner();
|
|
18
|
+
expect(p.validate(sampleInput).verdict).toBe("accept");
|
|
19
|
+
});
|
|
20
|
+
it("has a populated name and description", () => {
|
|
21
|
+
const p = new AlwaysAcceptPruner();
|
|
22
|
+
expect(p.name).toBe("AlwaysAcceptPruner");
|
|
23
|
+
expect(p.description.length).toBeGreaterThan(0);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("CompositePruner — composition rules", () => {
|
|
27
|
+
it("[accept, accept] → accept", () => {
|
|
28
|
+
const c = new CompositePruner([
|
|
29
|
+
fixed("p1", { verdict: "accept", reason: "ok-1" }),
|
|
30
|
+
fixed("p2", { verdict: "accept", reason: "ok-2" }),
|
|
31
|
+
]);
|
|
32
|
+
const out = c.validate(sampleInput);
|
|
33
|
+
expect(out.verdict).toBe("accept");
|
|
34
|
+
expect(out.reason).toContain("2");
|
|
35
|
+
});
|
|
36
|
+
it("[accept, reject] → reject (first reject wins, severity preserved)", () => {
|
|
37
|
+
const c = new CompositePruner([
|
|
38
|
+
fixed("p1", { verdict: "accept", reason: "ok" }),
|
|
39
|
+
fixed("p2", {
|
|
40
|
+
verdict: "reject",
|
|
41
|
+
reason: "bad",
|
|
42
|
+
severity: "high",
|
|
43
|
+
}),
|
|
44
|
+
]);
|
|
45
|
+
const out = c.validate(sampleInput);
|
|
46
|
+
expect(out.verdict).toBe("reject");
|
|
47
|
+
expect(out.reason).toBe("bad");
|
|
48
|
+
expect(out.severity).toBe("high");
|
|
49
|
+
});
|
|
50
|
+
it("[uncertain, accept] → accept (uncertain does NOT short-circuit)", () => {
|
|
51
|
+
const c = new CompositePruner([
|
|
52
|
+
fixed("p1", { verdict: "uncertain", reason: "dunno" }),
|
|
53
|
+
fixed("p2", { verdict: "accept", reason: "ok" }),
|
|
54
|
+
]);
|
|
55
|
+
expect(c.validate(sampleInput).verdict).toBe("accept");
|
|
56
|
+
});
|
|
57
|
+
it("[uncertain, uncertain] → uncertain (returns last uncertain reason)", () => {
|
|
58
|
+
const c = new CompositePruner([
|
|
59
|
+
fixed("p1", { verdict: "uncertain", reason: "first-doubt" }),
|
|
60
|
+
fixed("p2", { verdict: "uncertain", reason: "second-doubt" }),
|
|
61
|
+
]);
|
|
62
|
+
const out = c.validate(sampleInput);
|
|
63
|
+
expect(out.verdict).toBe("uncertain");
|
|
64
|
+
expect(out.reason).toBe("second-doubt");
|
|
65
|
+
});
|
|
66
|
+
it("[reject, ...anything] short-circuits — later pruners are not invoked", () => {
|
|
67
|
+
let calls = 0;
|
|
68
|
+
const probe = {
|
|
69
|
+
name: "probe",
|
|
70
|
+
description: "counts calls",
|
|
71
|
+
validate: () => {
|
|
72
|
+
calls++;
|
|
73
|
+
return { verdict: "accept", reason: "ok" };
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
const c = new CompositePruner([
|
|
77
|
+
fixed("p1", { verdict: "reject", reason: "stop", severity: "critical" }),
|
|
78
|
+
probe,
|
|
79
|
+
]);
|
|
80
|
+
const out = c.validate(sampleInput);
|
|
81
|
+
expect(out.verdict).toBe("reject");
|
|
82
|
+
expect(out.severity).toBe("critical");
|
|
83
|
+
expect(calls).toBe(0);
|
|
84
|
+
});
|
|
85
|
+
it("empty composite returns accept", () => {
|
|
86
|
+
const c = new CompositePruner([]);
|
|
87
|
+
const out = c.validate(sampleInput);
|
|
88
|
+
expect(out.verdict).toBe("accept");
|
|
89
|
+
expect(out.reason).toContain("no pruners");
|
|
90
|
+
});
|
|
91
|
+
it("populates name + description, including child names", () => {
|
|
92
|
+
const c = new CompositePruner([
|
|
93
|
+
fixed("alpha", { verdict: "accept", reason: "ok" }),
|
|
94
|
+
fixed("beta", { verdict: "accept", reason: "ok" }),
|
|
95
|
+
], "MyComposite");
|
|
96
|
+
expect(c.name).toBe("MyComposite");
|
|
97
|
+
expect(c.description).toContain("alpha");
|
|
98
|
+
expect(c.description).toContain("beta");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=constraint-pruner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint-pruner.test.js","sourceRoot":"","sources":["../../src/util/constraint-pruner.test.ts"],"names":[],"mappings":"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"}
|
package/dist/util/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { Commit } from "../types.js";
|
|
|
6
6
|
import type { MnemeStore } from "../store/sqlite.js";
|
|
7
7
|
export * from "./redact.js";
|
|
8
8
|
export * from "./noise.js";
|
|
9
|
+
export * from "./constraint-pruner.js";
|
|
9
10
|
/** Load every commit from the store, oldest first, with its file list. */
|
|
10
11
|
export declare function loadAllCommits(s: MnemeStore): Commit[];
|
|
11
12
|
/** Load every file change in the repo (across all commits). */
|
package/dist/util/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AAEvC,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAKtD;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,aAAa,EAAE,UAAU,EAAE,CAapF;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,UAAU,EACb,IAAI,EAAE,MAAM,GACX,OAAO,aAAa,EAAE,UAAU,EAAE,CAapC;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,UAAU,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,EAAE,CAcV;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAkB7E;AAED,uFAAuF;AACvF,wBAAsB,SAAS,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAclE"}
|
package/dist/util/index.js
CHANGED
package/dist/util/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"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"}
|
package/dist/wisdom/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wisdom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wisdom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
|
package/dist/wisdom/index.js
CHANGED
package/dist/wisdom/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wisdom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wisdom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutant-adapt — auto-adapt Mneme's behavior based on what's worked.
|
|
3
|
+
*
|
|
4
|
+
* Where the calibrator tunes a fixed set of search knobs against feedback,
|
|
5
|
+
* this module tracks success/failure across *any* labeled axis: provider,
|
|
6
|
+
* model, scoring config, intent classifier — anything caller wants to tag.
|
|
7
|
+
* Over time, `recommend()` returns whichever axis in a given group has the
|
|
8
|
+
* best success rate weighted by recency.
|
|
9
|
+
*
|
|
10
|
+
* Design choices:
|
|
11
|
+
* - Axis names are free-form strings. Callers convene on prefix conventions
|
|
12
|
+
* ("provider:groq", "model:qwen2.5:3b", "weights:rrf-k=60"). The grouping
|
|
13
|
+
* is just substring-startsWith, so naming is the API.
|
|
14
|
+
* - `decayState` is *pure* — it returns a new state. The caller chooses when
|
|
15
|
+
* to persist. This keeps the file write batched at most once per command.
|
|
16
|
+
* - Stats older than 7 days get halved by decay. This isn't a half-life; it's
|
|
17
|
+
* a one-shot demotion. Callers can run decay before every recommendation
|
|
18
|
+
* for a softer running average, or once per day for a sharper recency bias.
|
|
19
|
+
*/
|
|
20
|
+
export interface AxisStat {
|
|
21
|
+
axis: string;
|
|
22
|
+
successCount: number;
|
|
23
|
+
failureCount: number;
|
|
24
|
+
/** Last success ISO timestamp. */
|
|
25
|
+
lastSuccessAt?: string;
|
|
26
|
+
/** Avg latency (ms). */
|
|
27
|
+
avgLatencyMs?: number;
|
|
28
|
+
/** Most recent failure reason — useful for diagnostics. */
|
|
29
|
+
lastFailureReason?: string;
|
|
30
|
+
/** Last update ISO timestamp — used by decayState. */
|
|
31
|
+
lastUpdatedAt?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface MutantState {
|
|
34
|
+
axes: Record<string, AxisStat>;
|
|
35
|
+
/** Last time mutant adapted recommendations. */
|
|
36
|
+
lastAdaptedAt?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface AxisRecommendation {
|
|
39
|
+
bestAxis: string;
|
|
40
|
+
successRate: number;
|
|
41
|
+
reason: string;
|
|
42
|
+
}
|
|
43
|
+
/** Read state from .mneme/mutant.json. Returns empty state if missing/corrupt. */
|
|
44
|
+
export declare function readMutantState(repoRoot: string): MutantState;
|
|
45
|
+
/** Record a success for an axis. Bumps successCount, updates timestamps + latency. */
|
|
46
|
+
export declare function recordSuccess(repoRoot: string, axis: string, latencyMs?: number): void;
|
|
47
|
+
/** Record a failure for an axis. Bumps failureCount + records reason. */
|
|
48
|
+
export declare function recordFailure(repoRoot: string, axis: string, reason: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Compute a recommendation: which axis (within a group) has the best
|
|
51
|
+
* success rate × recency? Returns null if no data.
|
|
52
|
+
*
|
|
53
|
+
* Tiebreakers (in order):
|
|
54
|
+
* 1. Highest success rate.
|
|
55
|
+
* 2. Highest absolute success count (more samples = more confidence).
|
|
56
|
+
* 3. Most recent success.
|
|
57
|
+
*
|
|
58
|
+
* Pure function — does not read or write files.
|
|
59
|
+
*/
|
|
60
|
+
export declare function recommend(state: MutantState, axisGroupPrefix: string): AxisRecommendation | null;
|
|
61
|
+
/**
|
|
62
|
+
* Decay old stats so the system can adapt to current realities.
|
|
63
|
+
* Halves counts on axes whose lastUpdatedAt is older than 7 days.
|
|
64
|
+
* Pure function — caller decides when to persist.
|
|
65
|
+
*/
|
|
66
|
+
export declare function decayState(state: MutantState, nowMs?: number): MutantState;
|
|
67
|
+
/** Persist a state object (e.g. after a caller-driven decayState call). */
|
|
68
|
+
export declare function writeMutantState(repoRoot: string, state: MutantState): void;
|
|
69
|
+
//# sourceMappingURL=mutant-adapt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutant-adapt.d.ts","sourceRoot":"","sources":["../../src/wisdom/mutant-adapt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAaD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAsC7D;AAmCD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBtF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAuChG;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,GAAE,MAAmB,GAAG,WAAW,CAkBtF;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAE3E"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutant-adapt — auto-adapt Mneme's behavior based on what's worked.
|
|
3
|
+
*
|
|
4
|
+
* Where the calibrator tunes a fixed set of search knobs against feedback,
|
|
5
|
+
* this module tracks success/failure across *any* labeled axis: provider,
|
|
6
|
+
* model, scoring config, intent classifier — anything caller wants to tag.
|
|
7
|
+
* Over time, `recommend()` returns whichever axis in a given group has the
|
|
8
|
+
* best success rate weighted by recency.
|
|
9
|
+
*
|
|
10
|
+
* Design choices:
|
|
11
|
+
* - Axis names are free-form strings. Callers convene on prefix conventions
|
|
12
|
+
* ("provider:groq", "model:qwen2.5:3b", "weights:rrf-k=60"). The grouping
|
|
13
|
+
* is just substring-startsWith, so naming is the API.
|
|
14
|
+
* - `decayState` is *pure* — it returns a new state. The caller chooses when
|
|
15
|
+
* to persist. This keeps the file write batched at most once per command.
|
|
16
|
+
* - Stats older than 7 days get halved by decay. This isn't a half-life; it's
|
|
17
|
+
* a one-shot demotion. Callers can run decay before every recommendation
|
|
18
|
+
* for a softer running average, or once per day for a sharper recency bias.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
/** ms in 7 days — anything older than this gets halved by decayState. */
|
|
23
|
+
const DECAY_AFTER_MS = 7 * 24 * 60 * 60 * 1000;
|
|
24
|
+
function statePath(repoRoot) {
|
|
25
|
+
return join(repoRoot, ".mneme", "mutant.json");
|
|
26
|
+
}
|
|
27
|
+
function emptyState() {
|
|
28
|
+
return { axes: {} };
|
|
29
|
+
}
|
|
30
|
+
/** Read state from .mneme/mutant.json. Returns empty state if missing/corrupt. */
|
|
31
|
+
export function readMutantState(repoRoot) {
|
|
32
|
+
const path = statePath(repoRoot);
|
|
33
|
+
if (!existsSync(path))
|
|
34
|
+
return emptyState();
|
|
35
|
+
let raw;
|
|
36
|
+
try {
|
|
37
|
+
raw = readFileSync(path, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return emptyState();
|
|
41
|
+
}
|
|
42
|
+
let parsed;
|
|
43
|
+
try {
|
|
44
|
+
parsed = JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return emptyState();
|
|
48
|
+
}
|
|
49
|
+
if (!parsed || typeof parsed !== "object")
|
|
50
|
+
return emptyState();
|
|
51
|
+
const s = parsed;
|
|
52
|
+
if (!s.axes || typeof s.axes !== "object")
|
|
53
|
+
return emptyState();
|
|
54
|
+
// Defensive: drop malformed axis records rather than throw.
|
|
55
|
+
const axes = {};
|
|
56
|
+
for (const [key, val] of Object.entries(s.axes)) {
|
|
57
|
+
if (!val || typeof val !== "object")
|
|
58
|
+
continue;
|
|
59
|
+
const a = val;
|
|
60
|
+
if (typeof a.axis !== "string")
|
|
61
|
+
continue;
|
|
62
|
+
axes[key] = {
|
|
63
|
+
axis: a.axis,
|
|
64
|
+
successCount: typeof a.successCount === "number" ? a.successCount : 0,
|
|
65
|
+
failureCount: typeof a.failureCount === "number" ? a.failureCount : 0,
|
|
66
|
+
lastSuccessAt: typeof a.lastSuccessAt === "string" ? a.lastSuccessAt : undefined,
|
|
67
|
+
avgLatencyMs: typeof a.avgLatencyMs === "number" ? a.avgLatencyMs : undefined,
|
|
68
|
+
lastFailureReason: typeof a.lastFailureReason === "string" ? a.lastFailureReason : undefined,
|
|
69
|
+
lastUpdatedAt: typeof a.lastUpdatedAt === "string" ? a.lastUpdatedAt : undefined,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
axes,
|
|
74
|
+
lastAdaptedAt: typeof s.lastAdaptedAt === "string" ? s.lastAdaptedAt : undefined,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function atomicWrite(path, contents) {
|
|
78
|
+
const dir = dirname(path);
|
|
79
|
+
if (!existsSync(dir)) {
|
|
80
|
+
try {
|
|
81
|
+
mkdirSync(dir, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const tmp = `${path}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}`;
|
|
88
|
+
try {
|
|
89
|
+
writeFileSync(tmp, contents, "utf8");
|
|
90
|
+
renameSync(tmp, path);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
try {
|
|
94
|
+
rmSync(tmp, { force: true });
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
/* ignore */
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function persist(repoRoot, state) {
|
|
102
|
+
atomicWrite(statePath(repoRoot), JSON.stringify(state, null, 2));
|
|
103
|
+
}
|
|
104
|
+
function getOrInit(state, axis) {
|
|
105
|
+
if (!state.axes[axis]) {
|
|
106
|
+
state.axes[axis] = { axis, successCount: 0, failureCount: 0 };
|
|
107
|
+
}
|
|
108
|
+
return state.axes[axis];
|
|
109
|
+
}
|
|
110
|
+
/** Record a success for an axis. Bumps successCount, updates timestamps + latency. */
|
|
111
|
+
export function recordSuccess(repoRoot, axis, latencyMs) {
|
|
112
|
+
const state = readMutantState(repoRoot);
|
|
113
|
+
const stat = getOrInit(state, axis);
|
|
114
|
+
stat.successCount += 1;
|
|
115
|
+
const nowIso = new Date().toISOString();
|
|
116
|
+
stat.lastSuccessAt = nowIso;
|
|
117
|
+
stat.lastUpdatedAt = nowIso;
|
|
118
|
+
if (typeof latencyMs === "number" && latencyMs >= 0) {
|
|
119
|
+
// Running average — weighted by total success count so a single outlier
|
|
120
|
+
// doesn't wreck the signal once we have a sample.
|
|
121
|
+
const prev = stat.avgLatencyMs;
|
|
122
|
+
if (prev === undefined) {
|
|
123
|
+
stat.avgLatencyMs = latencyMs;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
stat.avgLatencyMs = prev + (latencyMs - prev) / stat.successCount;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
persist(repoRoot, state);
|
|
130
|
+
}
|
|
131
|
+
/** Record a failure for an axis. Bumps failureCount + records reason. */
|
|
132
|
+
export function recordFailure(repoRoot, axis, reason) {
|
|
133
|
+
const state = readMutantState(repoRoot);
|
|
134
|
+
const stat = getOrInit(state, axis);
|
|
135
|
+
stat.failureCount += 1;
|
|
136
|
+
stat.lastFailureReason = reason;
|
|
137
|
+
stat.lastUpdatedAt = new Date().toISOString();
|
|
138
|
+
persist(repoRoot, state);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Compute a recommendation: which axis (within a group) has the best
|
|
142
|
+
* success rate × recency? Returns null if no data.
|
|
143
|
+
*
|
|
144
|
+
* Tiebreakers (in order):
|
|
145
|
+
* 1. Highest success rate.
|
|
146
|
+
* 2. Highest absolute success count (more samples = more confidence).
|
|
147
|
+
* 3. Most recent success.
|
|
148
|
+
*
|
|
149
|
+
* Pure function — does not read or write files.
|
|
150
|
+
*/
|
|
151
|
+
export function recommend(state, axisGroupPrefix) {
|
|
152
|
+
const candidates = Object.values(state.axes).filter((a) => a.axis.startsWith(axisGroupPrefix) && a.successCount + a.failureCount > 0);
|
|
153
|
+
if (candidates.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
let best = null;
|
|
156
|
+
let bestRate = -1;
|
|
157
|
+
for (const c of candidates) {
|
|
158
|
+
const total = c.successCount + c.failureCount;
|
|
159
|
+
const rate = c.successCount / total;
|
|
160
|
+
if (best === null) {
|
|
161
|
+
best = c;
|
|
162
|
+
bestRate = rate;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const bestTotal = best.successCount + best.failureCount;
|
|
166
|
+
if (rate > bestRate ||
|
|
167
|
+
(rate === bestRate && c.successCount > best.successCount) ||
|
|
168
|
+
(rate === bestRate &&
|
|
169
|
+
c.successCount === best.successCount &&
|
|
170
|
+
(c.lastSuccessAt ?? "") > (best.lastSuccessAt ?? ""))) {
|
|
171
|
+
best = c;
|
|
172
|
+
bestRate = rate;
|
|
173
|
+
// bestTotal is computed for symmetry but unused — left explicit to
|
|
174
|
+
// document the comparison contract.
|
|
175
|
+
void bestTotal;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!best)
|
|
179
|
+
return null;
|
|
180
|
+
const total = best.successCount + best.failureCount;
|
|
181
|
+
return {
|
|
182
|
+
bestAxis: best.axis,
|
|
183
|
+
successRate: bestRate,
|
|
184
|
+
reason: `${best.successCount}/${total} successful${best.lastSuccessAt ? `, last success ${best.lastSuccessAt}` : ""}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Decay old stats so the system can adapt to current realities.
|
|
189
|
+
* Halves counts on axes whose lastUpdatedAt is older than 7 days.
|
|
190
|
+
* Pure function — caller decides when to persist.
|
|
191
|
+
*/
|
|
192
|
+
export function decayState(state, nowMs = Date.now()) {
|
|
193
|
+
const next = { axes: {}, lastAdaptedAt: state.lastAdaptedAt };
|
|
194
|
+
for (const [key, stat] of Object.entries(state.axes)) {
|
|
195
|
+
const updatedAt = stat.lastUpdatedAt ? Date.parse(stat.lastUpdatedAt) : NaN;
|
|
196
|
+
const isStale = !Number.isNaN(updatedAt) && nowMs - updatedAt > DECAY_AFTER_MS;
|
|
197
|
+
if (isStale) {
|
|
198
|
+
next.axes[key] = {
|
|
199
|
+
...stat,
|
|
200
|
+
// Math.floor preserves the "halve and round down" contract — 1 success
|
|
201
|
+
// decays to 0, not 0.5, so a never-revisited axis eventually drops out.
|
|
202
|
+
successCount: Math.floor(stat.successCount / 2),
|
|
203
|
+
failureCount: Math.floor(stat.failureCount / 2),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
next.axes[key] = { ...stat };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return next;
|
|
211
|
+
}
|
|
212
|
+
/** Persist a state object (e.g. after a caller-driven decayState call). */
|
|
213
|
+
export function writeMutantState(repoRoot, state) {
|
|
214
|
+
persist(repoRoot, state);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=mutant-adapt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutant-adapt.js","sourceRoot":"","sources":["../../src/wisdom/mutant-adapt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutant-adapt.test.d.ts","sourceRoot":"","sources":["../../src/wisdom/mutant-adapt.test.ts"],"names":[],"mappings":""}
|