@dzhechkov/harness-core 0.7.11 → 0.8.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/.dz-manifest.json +287 -87
- package/README.md +60 -1
- package/dist/amendment-trace.d.ts +12 -1
- package/dist/amendment-trace.d.ts.map +1 -1
- package/dist/amendment-trace.js +22 -4
- package/dist/amendment-trace.js.map +1 -1
- package/dist/book-kb.d.ts.map +1 -1
- package/dist/book-kb.js +17 -0
- package/dist/book-kb.js.map +1 -1
- package/dist/feature-adr-checkpoints.d.ts +61 -0
- package/dist/feature-adr-checkpoints.d.ts.map +1 -1
- package/dist/feature-adr-checkpoints.js +116 -2
- package/dist/feature-adr-checkpoints.js.map +1 -1
- package/dist/feature-adr-routing.d.ts +69 -12
- package/dist/feature-adr-routing.d.ts.map +1 -1
- package/dist/feature-adr-routing.js +117 -7
- package/dist/feature-adr-routing.js.map +1 -1
- package/dist/index.d.ts +23 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/learning-backend.d.ts +39 -0
- package/dist/learning-backend.d.ts.map +1 -1
- package/dist/learning-backend.js +31 -11
- package/dist/learning-backend.js.map +1 -1
- package/dist/lesson-bandit.d.ts +116 -0
- package/dist/lesson-bandit.d.ts.map +1 -0
- package/dist/lesson-bandit.js +235 -0
- package/dist/lesson-bandit.js.map +1 -0
- package/dist/lesson-payoff.d.ts +260 -0
- package/dist/lesson-payoff.d.ts.map +1 -0
- package/dist/lesson-payoff.js +597 -0
- package/dist/lesson-payoff.js.map +1 -0
- package/dist/loop-blobs.generated.js +2 -2
- package/dist/loop-blobs.generated.js.map +1 -1
- package/dist/mutation-gate.d.ts +31 -8
- package/dist/mutation-gate.d.ts.map +1 -1
- package/dist/mutation-gate.js +57 -16
- package/dist/mutation-gate.js.map +1 -1
- package/dist/named-lock.d.ts.map +1 -1
- package/dist/named-lock.js +11 -9
- package/dist/named-lock.js.map +1 -1
- package/dist/native-dep-probe.d.ts +11 -0
- package/dist/native-dep-probe.d.ts.map +1 -0
- package/dist/native-dep-probe.js +100 -0
- package/dist/native-dep-probe.js.map +1 -0
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +82 -1
- package/dist/operations.js.map +1 -1
- package/dist/parser-safe-region.d.ts +47 -0
- package/dist/parser-safe-region.d.ts.map +1 -0
- package/dist/parser-safe-region.js +47 -0
- package/dist/parser-safe-region.js.map +1 -0
- package/dist/patterns.d.ts +21 -0
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +52 -4
- package/dist/patterns.js.map +1 -1
- package/dist/profile.d.ts +202 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +536 -0
- package/dist/profile.js.map +1 -0
- package/dist/project-skills-root.d.ts +44 -0
- package/dist/project-skills-root.d.ts.map +1 -0
- package/dist/project-skills-root.js +62 -0
- package/dist/project-skills-root.js.map +1 -0
- package/dist/publish.d.ts +5 -3
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +46 -8
- package/dist/publish.js.map +1 -1
- package/dist/qe-rounds.d.ts +75 -0
- package/dist/qe-rounds.d.ts.map +1 -0
- package/dist/qe-rounds.js +174 -0
- package/dist/qe-rounds.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +5 -1
- package/dist/registry.js.map +1 -1
- package/dist/run-records.d.ts.map +1 -1
- package/dist/run-records.js +8 -1
- package/dist/run-records.js.map +1 -1
- package/dist/setup.d.ts +35 -4
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +86 -23
- package/dist/setup.js.map +1 -1
- package/dist/sign.d.ts +29 -24
- package/dist/sign.d.ts.map +1 -1
- package/dist/sign.js +183 -61
- package/dist/sign.js.map +1 -1
- package/dist/store-location.d.ts +56 -0
- package/dist/store-location.d.ts.map +1 -0
- package/dist/store-location.js +56 -0
- package/dist/store-location.js.map +1 -0
- package/dist/store-lock.d.ts +1 -0
- package/dist/store-lock.d.ts.map +1 -1
- package/dist/store-lock.js +7 -1
- package/dist/store-lock.js.map +1 -1
- package/dist/store-merge.d.ts +55 -0
- package/dist/store-merge.d.ts.map +1 -0
- package/dist/store-merge.js +77 -0
- package/dist/store-merge.js.map +1 -0
- package/dist/teach-target.d.ts +61 -0
- package/dist/teach-target.d.ts.map +1 -0
- package/dist/teach-target.js +105 -0
- package/dist/teach-target.js.map +1 -0
- package/dist/vector-tier.d.ts +30 -0
- package/dist/vector-tier.d.ts.map +1 -1
- package/dist/vector-tier.js +178 -20
- package/dist/vector-tier.js.map +1 -1
- package/package.json +13 -13
- package/sbom.json +591 -87
- package/src/amendment-trace.ts +34 -4
- package/src/book-kb.ts +17 -0
- package/src/feature-adr-checkpoints.ts +111 -2
- package/src/feature-adr-routing.ts +146 -7
- package/src/index.ts +55 -3
- package/src/learning-backend.ts +62 -11
- package/src/lesson-bandit.ts +279 -0
- package/src/lesson-payoff.ts +728 -0
- package/src/loop-blobs.generated.ts +2 -2
- package/src/mutation-gate.ts +74 -17
- package/src/named-lock.ts +10 -8
- package/src/native-dep-probe.ts +118 -0
- package/src/operations.ts +77 -1
- package/src/parser-safe-region.ts +65 -0
- package/src/patterns.ts +76 -6
- package/src/profile.ts +593 -0
- package/src/project-skills-root.ts +63 -0
- package/src/publish.ts +43 -7
- package/src/qe-rounds.ts +226 -0
- package/src/registry.ts +5 -1
- package/src/run-records.ts +9 -1
- package/src/setup.ts +87 -23
- package/src/sign.ts +180 -60
- package/src/store-location.ts +76 -0
- package/src/store-lock.ts +8 -1
- package/src/store-merge.ts +91 -0
- package/src/teach-target.ts +126 -0
- package/src/vector-tier.ts +236 -21
|
@@ -17,6 +17,11 @@ export interface LearningSample {
|
|
|
17
17
|
readonly kind: LearningSampleKind;
|
|
18
18
|
readonly reward?: number;
|
|
19
19
|
readonly ts: string;
|
|
20
|
+
/** The recall domain this sample happened in, when the caller knows it. Threaded through to the
|
|
21
|
+
* bandit so a confirmation lands in the SAME context bucket the recall read from — without it a
|
|
22
|
+
* `dz recall --domain <x>` hit confirmed later writes to `general`, and `<x>` never sees it, which
|
|
23
|
+
* leaves domain-scoped re-ranking permanently inert (cross-family QE, gpt-5.6-sol). */
|
|
24
|
+
readonly domain?: string;
|
|
20
25
|
}
|
|
21
26
|
export interface TrainingResult {
|
|
22
27
|
readonly trained: boolean;
|
|
@@ -79,6 +84,40 @@ export declare class NativeReinforcementBackend implements LearningSignalBackend
|
|
|
79
84
|
private signal;
|
|
80
85
|
}
|
|
81
86
|
export declare function resolveLearningBackend(projectRoot: string, config?: MemoryLearningConfig): LearningSignalBackend;
|
|
87
|
+
/**
|
|
88
|
+
* One bounded re-rank term in the pipeline {@link applyLearningSignalsWithTerms} applies
|
|
89
|
+
* (feature lesson-bandit-rerank, architecture §6).
|
|
90
|
+
*
|
|
91
|
+
* WHY THIS EXISTS. `memory.learning.deltaRerank` is not a re-rank hook: it is a boolean that
|
|
92
|
+
* switches on ONE computation and selects between exactly two call sites. Reusing it for a second
|
|
93
|
+
* payoff signal would force one of two bad shapes — two independent features behind one switch, or
|
|
94
|
+
* a third `applyLearningSignalsWith…` function (and a fourth after that). A term LIST is the shape
|
|
95
|
+
* that stops growing.
|
|
96
|
+
*/
|
|
97
|
+
export interface RerankTerm {
|
|
98
|
+
/** `'delta'` | `'bandit'` — travels into the observability record. */
|
|
99
|
+
readonly id: string;
|
|
100
|
+
/** Raw per-candidate value, positionally aligned with `hits`/`candidates`. */
|
|
101
|
+
readonly byIndex: readonly number[];
|
|
102
|
+
/** Absolute bound on THIS term's contribution to a score. */
|
|
103
|
+
readonly cap: number;
|
|
104
|
+
/** Default `Math.tanh` (any magnitude → [-1,1]). A pre-bounded term passes identity. */
|
|
105
|
+
readonly squash?: (v: number) => number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The one scoring pipeline: `adjusted = hit.score + cap*signal[i] + Σ_t t.cap * squash(t.byIndex[i])`,
|
|
109
|
+
* stable-sorted with the original index as tie-break.
|
|
110
|
+
*
|
|
111
|
+
* With `terms: []` this is {@link applyLearningSignals} in behaviour; with one `'delta'` term it is
|
|
112
|
+
* {@link applyLearningSignalsWithDelta}. Both remain exported as thin wrappers, so every existing
|
|
113
|
+
* caller and test is untouched — the widening is additive at the API level too.
|
|
114
|
+
*
|
|
115
|
+
* A non-finite raw value contributes 0 and never NaN-poisons the sort (the guard the delta function
|
|
116
|
+
* already carried; generalising it would have been the easiest place to drop it).
|
|
117
|
+
*/
|
|
118
|
+
export declare function applyLearningSignalsWithTerms<H extends {
|
|
119
|
+
readonly score: number;
|
|
120
|
+
}>(hits: readonly H[], backend: LearningSignalBackend, candidates: readonly SignalCandidate[], cap: number, terms?: readonly RerankTerm[]): H[];
|
|
82
121
|
export declare function applyLearningSignals<H extends {
|
|
83
122
|
readonly score: number;
|
|
84
123
|
}>(hits: readonly H[], backend: LearningSignalBackend, candidates: readonly SignalCandidate[], cap: number): H[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning-backend.d.ts","sourceRoot":"","sources":["../src/learning-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,GAAG,cAAc,CAAC;AACpE,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"learning-backend.d.ts","sourceRoot":"","sources":["../src/learning-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/learning-backend.js
CHANGED
|
@@ -60,6 +60,7 @@ export class NativeReinforcementBackend {
|
|
|
60
60
|
ts: sample.ts,
|
|
61
61
|
...(sample.reward !== undefined ? { reward: sample.reward } : {}),
|
|
62
62
|
...(sample.kind === 'recall-hit' ? { exposure: true } : {}),
|
|
63
|
+
...(sample.domain !== undefined ? { domain: sample.domain } : {}),
|
|
63
64
|
});
|
|
64
65
|
if (r.ok)
|
|
65
66
|
flushed += 1;
|
|
@@ -127,13 +128,38 @@ export function resolveLearningBackend(projectRoot, config = readMemoryLearningC
|
|
|
127
128
|
return new NativeReinforcementBackend(projectRoot);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
130
|
-
|
|
131
|
+
/**
|
|
132
|
+
* The one scoring pipeline: `adjusted = hit.score + cap*signal[i] + Σ_t t.cap * squash(t.byIndex[i])`,
|
|
133
|
+
* stable-sorted with the original index as tie-break.
|
|
134
|
+
*
|
|
135
|
+
* With `terms: []` this is {@link applyLearningSignals} in behaviour; with one `'delta'` term it is
|
|
136
|
+
* {@link applyLearningSignalsWithDelta}. Both remain exported as thin wrappers, so every existing
|
|
137
|
+
* caller and test is untouched — the widening is additive at the API level too.
|
|
138
|
+
*
|
|
139
|
+
* A non-finite raw value contributes 0 and never NaN-poisons the sort (the guard the delta function
|
|
140
|
+
* already carried; generalising it would have been the easiest place to drop it).
|
|
141
|
+
*/
|
|
142
|
+
export function applyLearningSignalsWithTerms(hits, backend, candidates, cap, terms = []) {
|
|
131
143
|
const signals = backend.enhance(candidates, { kind: 'recall', cap });
|
|
132
144
|
return hits
|
|
133
|
-
.map((hit, i) =>
|
|
145
|
+
.map((hit, i) => {
|
|
146
|
+
let extra = 0;
|
|
147
|
+
for (const t of terms) {
|
|
148
|
+
const raw = t.byIndex[i];
|
|
149
|
+
if (typeof raw !== 'number' || !Number.isFinite(raw))
|
|
150
|
+
continue;
|
|
151
|
+
const squashed = (t.squash ?? Math.tanh)(raw);
|
|
152
|
+
if (Number.isFinite(squashed))
|
|
153
|
+
extra += t.cap * squashed;
|
|
154
|
+
}
|
|
155
|
+
return { hit, adjusted: hit.score + cap * (signals[i] ?? 0) + extra, i };
|
|
156
|
+
})
|
|
134
157
|
.sort((a, b) => b.adjusted - a.adjusted || a.i - b.i)
|
|
135
158
|
.map((x) => x.hit);
|
|
136
159
|
}
|
|
160
|
+
export function applyLearningSignals(hits, backend, candidates, cap) {
|
|
161
|
+
return applyLearningSignalsWithTerms(hits, backend, candidates, cap, []);
|
|
162
|
+
}
|
|
137
163
|
/**
|
|
138
164
|
* {@link applyLearningSignals} plus a bounded ± SAFLA-delta term (rUv-scout #2 Phase 3). `deltaByIndex[i]`
|
|
139
165
|
* is candidate `i`'s raw payoff SLOPE (0 when it has no slope signal); each is squashed through `tanh`
|
|
@@ -142,14 +168,8 @@ export function applyLearningSignals(hits, backend, candidates, cap) {
|
|
|
142
168
|
* this is byte-identical to {@link applyLearningSignals} (the re-rank is off by default, gated by config).
|
|
143
169
|
*/
|
|
144
170
|
export function applyLearningSignalsWithDelta(hits, backend, candidates, cap, deltaByIndex, deltaCap) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const d = deltaByIndex[i];
|
|
149
|
-
const deltaTerm = typeof d === 'number' && Number.isFinite(d) ? deltaCap * Math.tanh(d) : 0;
|
|
150
|
-
return { hit, adjusted: hit.score + cap * (signals[i] ?? 0) + deltaTerm, i };
|
|
151
|
-
})
|
|
152
|
-
.sort((a, b) => b.adjusted - a.adjusted || a.i - b.i)
|
|
153
|
-
.map((x) => x.hit);
|
|
171
|
+
return applyLearningSignalsWithTerms(hits, backend, candidates, cap, [
|
|
172
|
+
{ id: 'delta', byIndex: deltaByIndex, cap: deltaCap },
|
|
173
|
+
]);
|
|
154
174
|
}
|
|
155
175
|
//# sourceMappingURL=learning-backend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning-backend.js","sourceRoot":"","sources":["../src/learning-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"learning-backend.js","sourceRoot":"","sources":["../src/learning-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAyDhD,MAAM,UAAU,uBAAuB,CAAC,CAAU;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC;SACpG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,OAAO,mBAAmB;IAC9B,OAAO,CAAC,UAAsC;QAC5C,OAAO,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,SAAS,KAAmC,CAAC;IAC7C,KAAK,CAAC,KAAK,KAA8B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,YAAY,KAAuB,CAAC;IACpC,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wCAAwC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnH,CAAC;IACD,KAAK,CAAC,SAAS,KAAgC,CAAC;IAChD,QAAQ;QACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC1H,CAAC;IACD,KAAK,KAAuB,CAAC;CAC9B;AAED,MAAM,OAAO,0BAA0B;IAOlB;IACA;IAPF,OAAO,GAAqB,EAAE,CAAC;IACxC,YAAY,GAAG,CAAC,CAAC;IACjB,WAAW,GAAG,CAAC,CAAC;IAChB,gBAAgB,GAAkB,IAAI,CAAC;IAE/C,YACmB,WAAmB,EACnB,OAAgG,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QADjI,gBAAW,GAAX,WAAW,CAAQ;QACnB,SAAI,GAAJ,IAAI,CAA6H;IACjJ,CAAC;IAEJ,OAAO,CAAC,UAAsC,EAAE,GAAmB;QACjE,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC;YACxC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,MAAsB;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,KAAyB,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,uFAAuF;YACvF,wFAAwF;YACxF,uFAAuF;YACvF,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;gBAC9D,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC;iBAClB,CAAC;gBACJ,MAAM,IAAI,CAAC,CAAC;gBACZ,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC;QAC7B,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnG,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mCAAmC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;IACD,KAAK,CAAC,SAAS,KAA0D,CAAC;IAE1E,QAAQ;QACN,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,QAAQ;YACjB,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAEO,MAAM,CAAC,KAAyB,EAAE,GAAW;QACnD,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACrF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACnE,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,SAA+B,wBAAwB,CAAC,WAAW,CAAC;IAC9H,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC;QACnB,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,KAAK,cAAc;YAC7C,CAAC,CAAC,0FAA0F;YAC5F,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,IAAI,0BAA0B,CAAC,WAAW,EAAE;YACjD,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAuBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAkB,EAClB,OAA8B,EAC9B,UAAsC,EACtC,GAAW,EACX,QAA+B,EAAE;IAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC/D,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAkB,EAClB,OAA8B,EAC9B,UAAsC,EACtC,GAAW;IAEX,OAAO,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAkB,EAClB,OAA8B,EAC9B,UAAsC,EACtC,GAAW,EACX,YAA+B,EAC/B,QAAgB;IAEhB,OAAO,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE;QACnE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE;KACtD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VENDORED — contextual Thompson-Sampling bandit (feature lesson-bandit-rerank, ADR-001 D-1).
|
|
3
|
+
*
|
|
4
|
+
* Upstream: agentdb@3.0.0-alpha.20 — dist/src/backends/rvf/SolverBandit.js
|
|
5
|
+
* Licence: MIT, Copyright (c) 2024-2025 ruv
|
|
6
|
+
* Vendored: 2026-08-26. 215 lines, ZERO imports (both re-verified at copy time:
|
|
7
|
+
* `wc -l` → 215, `grep -cE 'require|^import'` → 0).
|
|
8
|
+
* SHA-256: 0199299fb60ef67afa030182185894c950126038398032349fe3618d910f6d7d
|
|
9
|
+
* (of the upstream .js at copy time; pinned by lesson-bandit-vendor.test.ts)
|
|
10
|
+
* Reason: the path is NOT in agentdb's package.json "exports" map (verified 2026-08-26);
|
|
11
|
+
* a deep import of a private path in a 3.0.0-alpha prerelease can change silently,
|
|
12
|
+
* and a ranking feature that quietly stops ranking looks exactly like one that works.
|
|
13
|
+
*
|
|
14
|
+
* Do not edit logic. Re-vendor from upstream and re-diff instead.
|
|
15
|
+
*
|
|
16
|
+
* WHAT CHANGED relative to the upstream .js, and nothing else:
|
|
17
|
+
* · `class SolverBandit` → `class LessonBandit` (ADR-001 D-1: one name, no alias);
|
|
18
|
+
* · TYPES added (field declarations, method signatures, the three exported interfaces);
|
|
19
|
+
* · `armKeys[0]` → `armKeys[0]!` and `ctx.get(armKey)` → `!` — required by this package's
|
|
20
|
+
* `noUncheckedIndexedAccess`; the emitted arithmetic is unchanged.
|
|
21
|
+
* The Jöhnk / Marsaglia-Tsang samplers, the `a<=1 && b<=1 ⇒ Math.random()` short-circuit, the
|
|
22
|
+
* exploration bonus and the cost EMA are preserved verbatim — the MEASURED API behaviour (200
|
|
23
|
+
* pulls on a 0.85-vs-0.15 pair → 100/100 correct picks) is a property of exactly this arithmetic.
|
|
24
|
+
*
|
|
25
|
+
* THIS FILE MUST STAY IMPORT-FREE (NFR-2 / C-7 / INV-6) — asserted by a repo test.
|
|
26
|
+
*/
|
|
27
|
+
/** Beta posterior + bookkeeping for one `(ContextKey, ArmKey)` pair. */
|
|
28
|
+
export interface ArmStats {
|
|
29
|
+
alpha: number;
|
|
30
|
+
beta: number;
|
|
31
|
+
pulls: number;
|
|
32
|
+
totalReward: number;
|
|
33
|
+
costEma: number;
|
|
34
|
+
}
|
|
35
|
+
/** Engine hyperparameters. This feature passes the vendored defaults through untouched. */
|
|
36
|
+
export interface BanditConfig {
|
|
37
|
+
costWeight: number;
|
|
38
|
+
costDecay: number;
|
|
39
|
+
explorationBonus: number;
|
|
40
|
+
}
|
|
41
|
+
/** The engine's own JSON-safe state. `version` belongs to the vendored copy, never to our envelope. */
|
|
42
|
+
export interface SerializedBanditState {
|
|
43
|
+
version: number;
|
|
44
|
+
config: BanditConfig;
|
|
45
|
+
contexts: Record<string, Record<string, ArmStats>>;
|
|
46
|
+
}
|
|
47
|
+
/** Aggregate counters over every context. */
|
|
48
|
+
export interface BanditAggregateStats {
|
|
49
|
+
contexts: number;
|
|
50
|
+
totalArms: number;
|
|
51
|
+
totalPulls: number;
|
|
52
|
+
totalReward: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Thompson Sampling bandit with contextual arms.
|
|
56
|
+
*
|
|
57
|
+
* Usage:
|
|
58
|
+
* const bandit = new LessonBandit();
|
|
59
|
+
* const arm = bandit.selectArm('code_review', ['skill-a', 'skill-b', 'skill-c']);
|
|
60
|
+
* // ... execute the selected arm ...
|
|
61
|
+
* bandit.recordReward('code_review', arm, 0.85);
|
|
62
|
+
*/
|
|
63
|
+
export declare class LessonBandit {
|
|
64
|
+
private contexts;
|
|
65
|
+
private readonly config;
|
|
66
|
+
constructor(config?: Partial<BanditConfig>);
|
|
67
|
+
/**
|
|
68
|
+
* Select the best arm for a given context using Thompson Sampling.
|
|
69
|
+
*
|
|
70
|
+
* For each candidate arm, samples from its Beta(alpha, beta) distribution
|
|
71
|
+
* and subtracts a cost penalty. Returns the arm with the highest score.
|
|
72
|
+
* Unknown arms get an exploration bonus.
|
|
73
|
+
*/
|
|
74
|
+
selectArm(contextKey: string, armKeys: readonly string[]): string;
|
|
75
|
+
/**
|
|
76
|
+
* Record the outcome of pulling an arm.
|
|
77
|
+
*
|
|
78
|
+
* @param contextKey - The context bucket (e.g., task type)
|
|
79
|
+
* @param armKey - The arm that was pulled (e.g., skill name)
|
|
80
|
+
* @param reward - Success signal in [0, 1]
|
|
81
|
+
* @param cost - Optional cost signal (latency, tokens, etc.)
|
|
82
|
+
*/
|
|
83
|
+
recordReward(contextKey: string, armKey: string, reward: number, cost?: number): void;
|
|
84
|
+
/**
|
|
85
|
+
* Rerank a list of candidates using bandit scores.
|
|
86
|
+
* Returns indices sorted by Thompson-sampled score (best first).
|
|
87
|
+
*/
|
|
88
|
+
rerank(contextKey: string, armKeys: readonly string[]): string[];
|
|
89
|
+
/** Get arm stats for a specific context */
|
|
90
|
+
getArmStats(contextKey: string, armKey: string): ArmStats | null;
|
|
91
|
+
/** Get aggregate statistics */
|
|
92
|
+
getStats(): BanditAggregateStats;
|
|
93
|
+
/** Serialize to JSON-safe state */
|
|
94
|
+
serialize(): SerializedBanditState;
|
|
95
|
+
/**
|
|
96
|
+
* Restore from serialized state.
|
|
97
|
+
*
|
|
98
|
+
* STATIC (C-2). A first draft that called it as an instance method threw `TypeError`; the
|
|
99
|
+
* signature here makes the static call the only one that compiles.
|
|
100
|
+
*/
|
|
101
|
+
static deserialize(state: SerializedBanditState): LessonBandit;
|
|
102
|
+
/** Reset all learned state */
|
|
103
|
+
reset(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Sample from Beta(a, b) using the Jöhnk algorithm.
|
|
106
|
+
* Fast approximation for typical bandit parameters.
|
|
107
|
+
*/
|
|
108
|
+
private sampleBeta;
|
|
109
|
+
/**
|
|
110
|
+
* Sample from Gamma(shape, 1) using Marsaglia & Tsang's method.
|
|
111
|
+
*/
|
|
112
|
+
private sampleGamma;
|
|
113
|
+
/** Box-Muller normal sample */
|
|
114
|
+
private sampleNormal;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=lesson-bandit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-bandit.d.ts","sourceRoot":"","sources":["../src/lesson-bandit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CACpD;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAQ1C;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IA4BjE;;;;;;;OAOG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBrF;;;OAGG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE;IAmBhE,2CAA2C;IAC3C,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIhE,+BAA+B;IAC/B,QAAQ,IAAI,oBAAoB;IAYhC,mCAAmC;IACnC,SAAS,IAAI,qBAAqB;IAWlC;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY;IAY9D,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAMb;;;OAGG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB,+BAA+B;IAC/B,OAAO,CAAC,YAAY;CAKrB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VENDORED — contextual Thompson-Sampling bandit (feature lesson-bandit-rerank, ADR-001 D-1).
|
|
3
|
+
*
|
|
4
|
+
* Upstream: agentdb@3.0.0-alpha.20 — dist/src/backends/rvf/SolverBandit.js
|
|
5
|
+
* Licence: MIT, Copyright (c) 2024-2025 ruv
|
|
6
|
+
* Vendored: 2026-08-26. 215 lines, ZERO imports (both re-verified at copy time:
|
|
7
|
+
* `wc -l` → 215, `grep -cE 'require|^import'` → 0).
|
|
8
|
+
* SHA-256: 0199299fb60ef67afa030182185894c950126038398032349fe3618d910f6d7d
|
|
9
|
+
* (of the upstream .js at copy time; pinned by lesson-bandit-vendor.test.ts)
|
|
10
|
+
* Reason: the path is NOT in agentdb's package.json "exports" map (verified 2026-08-26);
|
|
11
|
+
* a deep import of a private path in a 3.0.0-alpha prerelease can change silently,
|
|
12
|
+
* and a ranking feature that quietly stops ranking looks exactly like one that works.
|
|
13
|
+
*
|
|
14
|
+
* Do not edit logic. Re-vendor from upstream and re-diff instead.
|
|
15
|
+
*
|
|
16
|
+
* WHAT CHANGED relative to the upstream .js, and nothing else:
|
|
17
|
+
* · `class SolverBandit` → `class LessonBandit` (ADR-001 D-1: one name, no alias);
|
|
18
|
+
* · TYPES added (field declarations, method signatures, the three exported interfaces);
|
|
19
|
+
* · `armKeys[0]` → `armKeys[0]!` and `ctx.get(armKey)` → `!` — required by this package's
|
|
20
|
+
* `noUncheckedIndexedAccess`; the emitted arithmetic is unchanged.
|
|
21
|
+
* The Jöhnk / Marsaglia-Tsang samplers, the `a<=1 && b<=1 ⇒ Math.random()` short-circuit, the
|
|
22
|
+
* exploration bonus and the cost EMA are preserved verbatim — the MEASURED API behaviour (200
|
|
23
|
+
* pulls on a 0.85-vs-0.15 pair → 100/100 correct picks) is a property of exactly this arithmetic.
|
|
24
|
+
*
|
|
25
|
+
* THIS FILE MUST STAY IMPORT-FREE (NFR-2 / C-7 / INV-6) — asserted by a repo test.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Thompson Sampling bandit with contextual arms.
|
|
29
|
+
*
|
|
30
|
+
* Usage:
|
|
31
|
+
* const bandit = new LessonBandit();
|
|
32
|
+
* const arm = bandit.selectArm('code_review', ['skill-a', 'skill-b', 'skill-c']);
|
|
33
|
+
* // ... execute the selected arm ...
|
|
34
|
+
* bandit.recordReward('code_review', arm, 0.85);
|
|
35
|
+
*/
|
|
36
|
+
export class LessonBandit {
|
|
37
|
+
contexts = new Map();
|
|
38
|
+
config;
|
|
39
|
+
constructor(config) {
|
|
40
|
+
this.config = {
|
|
41
|
+
costWeight: config?.costWeight ?? 0.01,
|
|
42
|
+
costDecay: config?.costDecay ?? 0.1,
|
|
43
|
+
explorationBonus: config?.explorationBonus ?? 0.1,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Select the best arm for a given context using Thompson Sampling.
|
|
48
|
+
*
|
|
49
|
+
* For each candidate arm, samples from its Beta(alpha, beta) distribution
|
|
50
|
+
* and subtracts a cost penalty. Returns the arm with the highest score.
|
|
51
|
+
* Unknown arms get an exploration bonus.
|
|
52
|
+
*/
|
|
53
|
+
selectArm(contextKey, armKeys) {
|
|
54
|
+
if (armKeys.length === 0)
|
|
55
|
+
throw new Error('No arms provided');
|
|
56
|
+
if (armKeys.length === 1)
|
|
57
|
+
return armKeys[0];
|
|
58
|
+
const ctx = this.contexts.get(contextKey);
|
|
59
|
+
let bestArm = armKeys[0];
|
|
60
|
+
let bestScore = -Infinity;
|
|
61
|
+
for (const arm of armKeys) {
|
|
62
|
+
const stats = ctx?.get(arm);
|
|
63
|
+
let score;
|
|
64
|
+
if (!stats || stats.pulls === 0) {
|
|
65
|
+
// Unknown arm: sample from uniform + exploration bonus
|
|
66
|
+
score = Math.random() + this.config.explorationBonus;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Thompson sample from Beta(alpha, beta)
|
|
70
|
+
const sample = this.sampleBeta(stats.alpha, stats.beta);
|
|
71
|
+
score = sample - stats.costEma * this.config.costWeight;
|
|
72
|
+
}
|
|
73
|
+
if (score > bestScore) {
|
|
74
|
+
bestScore = score;
|
|
75
|
+
bestArm = arm;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return bestArm;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Record the outcome of pulling an arm.
|
|
82
|
+
*
|
|
83
|
+
* @param contextKey - The context bucket (e.g., task type)
|
|
84
|
+
* @param armKey - The arm that was pulled (e.g., skill name)
|
|
85
|
+
* @param reward - Success signal in [0, 1]
|
|
86
|
+
* @param cost - Optional cost signal (latency, tokens, etc.)
|
|
87
|
+
*/
|
|
88
|
+
recordReward(contextKey, armKey, reward, cost) {
|
|
89
|
+
if (!this.contexts.has(contextKey)) {
|
|
90
|
+
this.contexts.set(contextKey, new Map());
|
|
91
|
+
}
|
|
92
|
+
const ctx = this.contexts.get(contextKey);
|
|
93
|
+
if (!ctx.has(armKey)) {
|
|
94
|
+
ctx.set(armKey, { alpha: 1, beta: 1, pulls: 0, totalReward: 0, costEma: 0 });
|
|
95
|
+
}
|
|
96
|
+
const arm = ctx.get(armKey);
|
|
97
|
+
// Update Beta distribution
|
|
98
|
+
const r = Math.max(0, Math.min(1, reward));
|
|
99
|
+
arm.alpha += r;
|
|
100
|
+
arm.beta += (1 - r);
|
|
101
|
+
arm.pulls++;
|
|
102
|
+
arm.totalReward += r;
|
|
103
|
+
// Update cost EMA
|
|
104
|
+
if (cost !== undefined) {
|
|
105
|
+
arm.costEma = arm.costEma * (1 - this.config.costDecay) + cost * this.config.costDecay;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Rerank a list of candidates using bandit scores.
|
|
110
|
+
* Returns indices sorted by Thompson-sampled score (best first).
|
|
111
|
+
*/
|
|
112
|
+
rerank(contextKey, armKeys) {
|
|
113
|
+
if (armKeys.length <= 1)
|
|
114
|
+
return [...armKeys];
|
|
115
|
+
const ctx = this.contexts.get(contextKey);
|
|
116
|
+
const scored = armKeys.map((arm) => {
|
|
117
|
+
const stats = ctx?.get(arm);
|
|
118
|
+
let score;
|
|
119
|
+
if (!stats || stats.pulls === 0) {
|
|
120
|
+
score = Math.random() + this.config.explorationBonus;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
score = this.sampleBeta(stats.alpha, stats.beta) - stats.costEma * this.config.costWeight;
|
|
124
|
+
}
|
|
125
|
+
return { arm, score };
|
|
126
|
+
});
|
|
127
|
+
scored.sort((a, b) => b.score - a.score);
|
|
128
|
+
return scored.map((s) => s.arm);
|
|
129
|
+
}
|
|
130
|
+
/** Get arm stats for a specific context */
|
|
131
|
+
getArmStats(contextKey, armKey) {
|
|
132
|
+
return this.contexts.get(contextKey)?.get(armKey) ?? null;
|
|
133
|
+
}
|
|
134
|
+
/** Get aggregate statistics */
|
|
135
|
+
getStats() {
|
|
136
|
+
let totalArms = 0, totalPulls = 0, totalReward = 0;
|
|
137
|
+
for (const ctx of this.contexts.values()) {
|
|
138
|
+
totalArms += ctx.size;
|
|
139
|
+
for (const arm of ctx.values()) {
|
|
140
|
+
totalPulls += arm.pulls;
|
|
141
|
+
totalReward += arm.totalReward;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { contexts: this.contexts.size, totalArms, totalPulls, totalReward };
|
|
145
|
+
}
|
|
146
|
+
/** Serialize to JSON-safe state */
|
|
147
|
+
serialize() {
|
|
148
|
+
const contexts = {};
|
|
149
|
+
for (const [ctxKey, arms] of this.contexts) {
|
|
150
|
+
contexts[ctxKey] = {};
|
|
151
|
+
for (const [armKey, stats] of arms) {
|
|
152
|
+
contexts[ctxKey][armKey] = { ...stats };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { version: 1, config: { ...this.config }, contexts };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Restore from serialized state.
|
|
159
|
+
*
|
|
160
|
+
* STATIC (C-2). A first draft that called it as an instance method threw `TypeError`; the
|
|
161
|
+
* signature here makes the static call the only one that compiles.
|
|
162
|
+
*/
|
|
163
|
+
static deserialize(state) {
|
|
164
|
+
const bandit = new LessonBandit(state.config);
|
|
165
|
+
for (const [ctxKey, arms] of Object.entries(state.contexts)) {
|
|
166
|
+
const ctx = new Map();
|
|
167
|
+
for (const [armKey, stats] of Object.entries(arms)) {
|
|
168
|
+
ctx.set(armKey, { ...stats });
|
|
169
|
+
}
|
|
170
|
+
bandit.contexts.set(ctxKey, ctx);
|
|
171
|
+
}
|
|
172
|
+
return bandit;
|
|
173
|
+
}
|
|
174
|
+
/** Reset all learned state */
|
|
175
|
+
reset() {
|
|
176
|
+
this.contexts.clear();
|
|
177
|
+
}
|
|
178
|
+
// ─── Private ───
|
|
179
|
+
/**
|
|
180
|
+
* Sample from Beta(a, b) using the Jöhnk algorithm.
|
|
181
|
+
* Fast approximation for typical bandit parameters.
|
|
182
|
+
*/
|
|
183
|
+
sampleBeta(a, b) {
|
|
184
|
+
// For a=1, b=1 (uniform): just return Math.random()
|
|
185
|
+
if (a <= 1 && b <= 1)
|
|
186
|
+
return Math.random();
|
|
187
|
+
// Jöhnk's algorithm for general Beta
|
|
188
|
+
if (a < 1 && b < 1) {
|
|
189
|
+
for (let iter = 0; iter < 1000; iter++) {
|
|
190
|
+
const u = Math.random();
|
|
191
|
+
const v = Math.random();
|
|
192
|
+
const x = Math.pow(u, 1 / a);
|
|
193
|
+
const y = Math.pow(v, 1 / b);
|
|
194
|
+
if (x + y <= 1)
|
|
195
|
+
return x / (x + y);
|
|
196
|
+
}
|
|
197
|
+
return Math.random(); // fallback (extremely unlikely)
|
|
198
|
+
}
|
|
199
|
+
// For larger parameters, use Gamma ratio
|
|
200
|
+
const ga = this.sampleGamma(a);
|
|
201
|
+
const gb = this.sampleGamma(b);
|
|
202
|
+
return ga / (ga + gb);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Sample from Gamma(shape, 1) using Marsaglia & Tsang's method.
|
|
206
|
+
*/
|
|
207
|
+
sampleGamma(shape) {
|
|
208
|
+
if (shape < 1) {
|
|
209
|
+
return this.sampleGamma(shape + 1) * Math.pow(Math.random(), 1 / shape);
|
|
210
|
+
}
|
|
211
|
+
const d = shape - 1 / 3;
|
|
212
|
+
const c = 1 / Math.sqrt(9 * d);
|
|
213
|
+
for (let iter = 0; iter < 1000; iter++) {
|
|
214
|
+
let x, v;
|
|
215
|
+
do {
|
|
216
|
+
x = this.sampleNormal();
|
|
217
|
+
v = 1 + c * x;
|
|
218
|
+
} while (v <= 0);
|
|
219
|
+
v = v * v * v;
|
|
220
|
+
const u = Math.random();
|
|
221
|
+
if (u < 1 - 0.0331 * (x * x) * (x * x))
|
|
222
|
+
return d * v;
|
|
223
|
+
if (Math.log(u) < 0.5 * x * x + d * (1 - v + Math.log(v)))
|
|
224
|
+
return d * v;
|
|
225
|
+
}
|
|
226
|
+
return d; // fallback (extremely unlikely)
|
|
227
|
+
}
|
|
228
|
+
/** Box-Muller normal sample */
|
|
229
|
+
sampleNormal() {
|
|
230
|
+
const u1 = Math.random();
|
|
231
|
+
const u2 = Math.random();
|
|
232
|
+
return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=lesson-bandit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-bandit.js","sourceRoot":"","sources":["../src/lesson-bandit.ts"],"names":[],"mappings":"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"}
|