agentfootprint 6.22.0 → 6.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/AGENTS.md +17 -0
- package/CLAUDE.md +17 -0
- package/README.md +58 -0
- package/dist/core/Agent.js +109 -18
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +19 -4
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/Agent.js +109 -18
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.js +19 -4
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/influence-core/cache.js +149 -0
- package/dist/esm/lib/influence-core/cache.js.map +1 -0
- package/dist/esm/lib/influence-core/index.js +32 -0
- package/dist/esm/lib/influence-core/index.js.map +1 -0
- package/dist/esm/lib/influence-core/margin.js +110 -0
- package/dist/esm/lib/influence-core/margin.js.map +1 -0
- package/dist/esm/lib/influence-core/signals.js +232 -0
- package/dist/esm/lib/influence-core/signals.js.map +1 -0
- package/dist/esm/lib/influence-core/similarity.js +79 -0
- package/dist/esm/lib/influence-core/similarity.js.map +1 -0
- package/dist/esm/lib/influence-core/types.js +35 -0
- package/dist/esm/lib/influence-core/types.js.map +1 -0
- package/dist/esm/lib/trace-toolpack/bounded.js +76 -0
- package/dist/esm/lib/trace-toolpack/bounded.js.map +1 -0
- package/dist/esm/lib/trace-toolpack/index.js +10 -0
- package/dist/esm/lib/trace-toolpack/index.js.map +1 -0
- package/dist/esm/lib/trace-toolpack/traceToolpack.js +699 -0
- package/dist/esm/lib/trace-toolpack/traceToolpack.js.map +1 -0
- package/dist/esm/lib/trace-toolpack/types.js +24 -0
- package/dist/esm/lib/trace-toolpack/types.js.map +1 -0
- package/dist/esm/observe.js +12 -0
- package/dist/esm/observe.js.map +1 -1
- package/dist/esm/recorders/core/typedEmit.js +26 -0
- package/dist/esm/recorders/core/typedEmit.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/influence-core/cache.js +155 -0
- package/dist/lib/influence-core/cache.js.map +1 -0
- package/dist/lib/influence-core/index.js +50 -0
- package/dist/lib/influence-core/index.js.map +1 -0
- package/dist/lib/influence-core/margin.js +114 -0
- package/dist/lib/influence-core/margin.js.map +1 -0
- package/dist/lib/influence-core/signals.js +242 -0
- package/dist/lib/influence-core/signals.js.map +1 -0
- package/dist/lib/influence-core/similarity.js +83 -0
- package/dist/lib/influence-core/similarity.js.map +1 -0
- package/dist/lib/influence-core/types.js +38 -0
- package/dist/lib/influence-core/types.js.map +1 -0
- package/dist/lib/trace-toolpack/bounded.js +86 -0
- package/dist/lib/trace-toolpack/bounded.js.map +1 -0
- package/dist/lib/trace-toolpack/index.js +16 -0
- package/dist/lib/trace-toolpack/index.js.map +1 -0
- package/dist/lib/trace-toolpack/traceToolpack.js +704 -0
- package/dist/lib/trace-toolpack/traceToolpack.js.map +1 -0
- package/dist/lib/trace-toolpack/types.js +28 -0
- package/dist/lib/trace-toolpack/types.js.map +1 -0
- package/dist/observe.js +31 -1
- package/dist/observe.js.map +1 -1
- package/dist/recorders/core/typedEmit.js +26 -0
- package/dist/recorders/core/typedEmit.js.map +1 -1
- package/dist/types/core/Agent.d.ts +40 -3
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +61 -1
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/influence-core/cache.d.ts +95 -0
- package/dist/types/lib/influence-core/cache.d.ts.map +1 -0
- package/dist/types/lib/influence-core/index.d.ts +33 -0
- package/dist/types/lib/influence-core/index.d.ts.map +1 -0
- package/dist/types/lib/influence-core/margin.d.ts +34 -0
- package/dist/types/lib/influence-core/margin.d.ts.map +1 -0
- package/dist/types/lib/influence-core/signals.d.ts +104 -0
- package/dist/types/lib/influence-core/signals.d.ts.map +1 -0
- package/dist/types/lib/influence-core/similarity.d.ts +26 -0
- package/dist/types/lib/influence-core/similarity.d.ts.map +1 -0
- package/dist/types/lib/influence-core/types.d.ts +158 -0
- package/dist/types/lib/influence-core/types.d.ts.map +1 -0
- package/dist/types/lib/trace-toolpack/bounded.d.ts +48 -0
- package/dist/types/lib/trace-toolpack/bounded.d.ts.map +1 -0
- package/dist/types/lib/trace-toolpack/index.d.ts +10 -0
- package/dist/types/lib/trace-toolpack/index.d.ts.map +1 -0
- package/dist/types/lib/trace-toolpack/traceToolpack.d.ts +70 -0
- package/dist/types/lib/trace-toolpack/traceToolpack.d.ts.map +1 -0
- package/dist/types/lib/trace-toolpack/types.d.ts +60 -0
- package/dist/types/lib/trace-toolpack/types.d.ts.map +1 -0
- package/dist/types/observe.d.ts +2 -0
- package/dist/types/observe.d.ts.map +1 -1
- package/dist/types/recorders/core/typedEmit.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreInfluence = exports.compositeScore = exports.adaptWeights = exports.structuralProximity = exports.persistence = exports.averageRelevancy = exports.finalAnswerSimilarity = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* FDL influence signals — the four-signal composite from the Visible
|
|
6
|
+
* Reasoning paper (Eq. 1–6), extracted verbatim as RFC-003 block D6.
|
|
7
|
+
*
|
|
8
|
+
* Pattern: pure scorer functions + one async orchestrator. Vector-level
|
|
9
|
+
* functions are deterministic and embedder-free; only
|
|
10
|
+
* `scoreInfluence` touches the injected `Embedder`.
|
|
11
|
+
* Role: `src/lib/influence-core/` leaf. Consumers: the FDL paper
|
|
12
|
+
* pipeline (stage 5, computeInfluenceScores), RFC-003 D7's
|
|
13
|
+
* LLM-edge weigher, and — one level up — RFC-002's margin
|
|
14
|
+
* scoring shares the same geometry via `margin.ts`.
|
|
15
|
+
*
|
|
16
|
+
* ## Honest claim per signal (RFC-002 §2 discipline)
|
|
17
|
+
*
|
|
18
|
+
* Every signal is embedding GEOMETRY — a deterministic proxy, not a
|
|
19
|
+
* window into the model:
|
|
20
|
+
*
|
|
21
|
+
* - FA "the tool's output is semantically close to the final
|
|
22
|
+
* answer" — NOT "the answer was derived from it".
|
|
23
|
+
* - AVG "the tool's output stayed semantically close to the
|
|
24
|
+
* reasoning steps" — NOT "the model kept consulting it".
|
|
25
|
+
* - PERSIST "many reasoning steps are similar to it above T" — breadth
|
|
26
|
+
* of apparent reference, NOT counted citations.
|
|
27
|
+
* - DEPTH pure structure (1/(1+ancestors)) — directness of position
|
|
28
|
+
* in the trace, knows nothing about content at all.
|
|
29
|
+
*
|
|
30
|
+
* The composite S(d) means "high semantic alignment with the answer",
|
|
31
|
+
* never "this source contributed X% of the answer" (paper §5.2: scores
|
|
32
|
+
* are per-item, not additive, not causal attribution). Same inputs →
|
|
33
|
+
* same scores, unlike LLM-as-judge.
|
|
34
|
+
*/
|
|
35
|
+
const cosine_js_1 = require("../../memory/embedding/cosine.js");
|
|
36
|
+
const types_js_1 = require("./types.js");
|
|
37
|
+
/**
|
|
38
|
+
* FA — Final Answer Similarity (paper Eq. 1).
|
|
39
|
+
*
|
|
40
|
+
* `FA(d) = sim(e_d, e_f)` — cosine between the evidence embedding and
|
|
41
|
+
* the final-answer embedding. The strongest prior: verbatim or
|
|
42
|
+
* paraphrased reuse of a tool result scores high. Proxy: semantic
|
|
43
|
+
* overlap, not provenance.
|
|
44
|
+
*/
|
|
45
|
+
function finalAnswerSimilarity(evidenceVec, finalAnswerVec) {
|
|
46
|
+
return (0, cosine_js_1.cosineSimilarity)(evidenceVec, finalAnswerVec);
|
|
47
|
+
}
|
|
48
|
+
exports.finalAnswerSimilarity = finalAnswerSimilarity;
|
|
49
|
+
/**
|
|
50
|
+
* AVG — Average Relevancy (paper Eq. 2).
|
|
51
|
+
*
|
|
52
|
+
* Mean cosine between the evidence and each LLM reasoning ancestor;
|
|
53
|
+
* 0 when there are no ancestors (structurally zero — see
|
|
54
|
+
* `adaptWeights`). Proxy: consistent semantic closeness across the
|
|
55
|
+
* chain, not actual consultation.
|
|
56
|
+
*/
|
|
57
|
+
function averageRelevancy(evidenceVec, ancestorVecs) {
|
|
58
|
+
const n = ancestorVecs.length;
|
|
59
|
+
if (n === 0)
|
|
60
|
+
return 0;
|
|
61
|
+
let sum = 0;
|
|
62
|
+
for (const ancestorVec of ancestorVecs) {
|
|
63
|
+
sum += (0, cosine_js_1.cosineSimilarity)(evidenceVec, ancestorVec);
|
|
64
|
+
}
|
|
65
|
+
return sum / n;
|
|
66
|
+
}
|
|
67
|
+
exports.averageRelevancy = averageRelevancy;
|
|
68
|
+
/**
|
|
69
|
+
* PERSIST — Persistence (paper Eq. 3).
|
|
70
|
+
*
|
|
71
|
+
* Fraction of ancestors whose similarity to the evidence EXCEEDS the
|
|
72
|
+
* threshold T (strict `>`, default 0.30); 0 when there are no
|
|
73
|
+
* ancestors. Unlike AVG it measures BREADTH: referenced in 4 of 5
|
|
74
|
+
* steps (0.8) beats referenced intensely in 1. Proxy: similarity
|
|
75
|
+
* above a tunable bar, not counted citations.
|
|
76
|
+
*/
|
|
77
|
+
function persistence(evidenceVec, ancestorVecs, threshold = types_js_1.DEFAULT_PERSISTENCE_THRESHOLD) {
|
|
78
|
+
const n = ancestorVecs.length;
|
|
79
|
+
if (n === 0)
|
|
80
|
+
return 0;
|
|
81
|
+
let above = 0;
|
|
82
|
+
for (const ancestorVec of ancestorVecs) {
|
|
83
|
+
if ((0, cosine_js_1.cosineSimilarity)(evidenceVec, ancestorVec) > threshold)
|
|
84
|
+
above += 1;
|
|
85
|
+
}
|
|
86
|
+
return above / n;
|
|
87
|
+
}
|
|
88
|
+
exports.persistence = persistence;
|
|
89
|
+
/**
|
|
90
|
+
* DEPTH — Structural Proximity (paper Eq. 4).
|
|
91
|
+
*
|
|
92
|
+
* `DEPTH(d) = 1 / (1 + n)` where n counts LLM reasoning ancestors
|
|
93
|
+
* ONLY (not pipeline plumbing — callers decide what counts as an
|
|
94
|
+
* ancestor when building `EvidenceInput.ancestorTexts`). Direct
|
|
95
|
+
* evidence with no intermediaries gets exactly 1.0. The only
|
|
96
|
+
* content-blind signal: pure trace structure.
|
|
97
|
+
*/
|
|
98
|
+
function structuralProximity(ancestorCount) {
|
|
99
|
+
if (!Number.isInteger(ancestorCount) || ancestorCount < 0) {
|
|
100
|
+
throw new Error(`structuralProximity: ancestorCount must be a non-negative integer (got ${ancestorCount})`);
|
|
101
|
+
}
|
|
102
|
+
return 1 / (1 + ancestorCount);
|
|
103
|
+
}
|
|
104
|
+
exports.structuralProximity = structuralProximity;
|
|
105
|
+
/**
|
|
106
|
+
* Adaptive weight redistribution (paper Eq. 6, §5.3).
|
|
107
|
+
*
|
|
108
|
+
* When an item has NO LLM ancestors, AVG and PERSIST are structurally
|
|
109
|
+
* zero — not because the evidence was uninfluential, but because there
|
|
110
|
+
* is nothing to measure against. Without adaptation its score is
|
|
111
|
+
* capped at α+δ (≈0.50 under defaults). Eq. 6 moves the β+γ mass onto
|
|
112
|
+
* FA and DEPTH preserving their ratio:
|
|
113
|
+
*
|
|
114
|
+
* α′ = α + (β+γ)·α/(α+δ), δ′ = δ + (β+γ)·δ/(α+δ), β′ = γ′ = 0
|
|
115
|
+
*
|
|
116
|
+
* Defaults → α′=0.80, δ′=0.20 (the 4:1 FA:DEPTH ratio kept).
|
|
117
|
+
* Per-evidence-item: in a multi-tool pipeline some items adapt while
|
|
118
|
+
* others keep standard weights; `adapted` says which (surface it — the
|
|
119
|
+
* paper's UI marks adapted items).
|
|
120
|
+
*
|
|
121
|
+
* Degenerate guard: if α+δ = 0 there is no defined ratio to preserve —
|
|
122
|
+
* weights return unchanged with `adapted: false`, and the composite is
|
|
123
|
+
* honestly 0 for a no-ancestor item.
|
|
124
|
+
*/
|
|
125
|
+
function adaptWeights(weights, ancestorCount) {
|
|
126
|
+
if (ancestorCount > 0)
|
|
127
|
+
return { weights, adapted: false };
|
|
128
|
+
const base = weights.fa + weights.depth;
|
|
129
|
+
if (base === 0)
|
|
130
|
+
return { weights, adapted: false };
|
|
131
|
+
const mass = weights.avg + weights.persist;
|
|
132
|
+
return {
|
|
133
|
+
weights: {
|
|
134
|
+
fa: weights.fa + (mass * weights.fa) / base,
|
|
135
|
+
avg: 0,
|
|
136
|
+
persist: 0,
|
|
137
|
+
depth: weights.depth + (mass * weights.depth) / base,
|
|
138
|
+
},
|
|
139
|
+
adapted: mass > 0,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
exports.adaptWeights = adaptWeights;
|
|
143
|
+
/**
|
|
144
|
+
* Composite score S(d) (paper Eq. 5).
|
|
145
|
+
*
|
|
146
|
+
* `S = α·FA + β·AVG + γ·PERSIST + δ·DEPTH` under the given weights —
|
|
147
|
+
* pass the EFFECTIVE weights from `adaptWeights` for no-ancestor
|
|
148
|
+
* items. With weights summing to 1, S ∈ [−(α+β), 1] (FA/AVG are
|
|
149
|
+
* cosines and may go negative; PERSIST/DEPTH are non-negative).
|
|
150
|
+
*/
|
|
151
|
+
function compositeScore(signals, weights) {
|
|
152
|
+
return (weights.fa * signals.fa +
|
|
153
|
+
weights.avg * signals.avg +
|
|
154
|
+
weights.persist * signals.persist +
|
|
155
|
+
weights.depth * signals.depth);
|
|
156
|
+
}
|
|
157
|
+
exports.compositeScore = compositeScore;
|
|
158
|
+
/**
|
|
159
|
+
* Score every evidence item on the four FDL signals and rank by
|
|
160
|
+
* composite, descending (paper pipeline stages 4–6 in one call:
|
|
161
|
+
* embed → score → rank). Ties keep input order (stable sort).
|
|
162
|
+
*
|
|
163
|
+
* Deterministic for a deterministic embedder: same inputs → same
|
|
164
|
+
* scores. All texts are embedded in ONE deduplicated batch — with an
|
|
165
|
+
* `EmbeddingCache` injected, repeat calls embed nothing.
|
|
166
|
+
*
|
|
167
|
+
* Honest claim: ranked semantic-alignment proxies. NOT causal
|
|
168
|
+
* attribution — see module docs.
|
|
169
|
+
*/
|
|
170
|
+
async function scoreInfluence(args) {
|
|
171
|
+
const weights = args.weights ?? types_js_1.DEFAULT_INFLUENCE_WEIGHTS;
|
|
172
|
+
assertValidWeights(weights);
|
|
173
|
+
const threshold = args.persistenceThreshold ?? types_js_1.DEFAULT_PERSISTENCE_THRESHOLD;
|
|
174
|
+
assertUniqueIds(args.evidence);
|
|
175
|
+
// ONE deduplicated embedding pass over every distinct text.
|
|
176
|
+
const texts = new Set([args.finalAnswerText]);
|
|
177
|
+
for (const item of args.evidence) {
|
|
178
|
+
texts.add(item.text);
|
|
179
|
+
for (const ancestor of item.ancestorTexts)
|
|
180
|
+
texts.add(ancestor);
|
|
181
|
+
}
|
|
182
|
+
const vectorByText = await embedAll(args.embedder, [...texts], args.signal);
|
|
183
|
+
const finalVec = vectorByText.get(args.finalAnswerText);
|
|
184
|
+
const scored = args.evidence.map((item) => {
|
|
185
|
+
const evidenceVec = vectorByText.get(item.text);
|
|
186
|
+
const ancestorVecs = item.ancestorTexts.map((t) => vectorByText.get(t));
|
|
187
|
+
const signals = {
|
|
188
|
+
fa: finalAnswerSimilarity(evidenceVec, finalVec),
|
|
189
|
+
avg: averageRelevancy(evidenceVec, ancestorVecs),
|
|
190
|
+
persist: persistence(evidenceVec, ancestorVecs, threshold),
|
|
191
|
+
depth: structuralProximity(ancestorVecs.length),
|
|
192
|
+
};
|
|
193
|
+
const effective = adaptWeights(weights, ancestorVecs.length);
|
|
194
|
+
return {
|
|
195
|
+
id: item.id,
|
|
196
|
+
signals,
|
|
197
|
+
weights: effective.weights,
|
|
198
|
+
adapted: effective.adapted,
|
|
199
|
+
score: compositeScore(signals, effective.weights),
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
// Stable sort — equal scores keep evidence input order.
|
|
203
|
+
return scored.sort((a, b) => b.score - a.score);
|
|
204
|
+
}
|
|
205
|
+
exports.scoreInfluence = scoreInfluence;
|
|
206
|
+
/** Embed distinct texts via batch API when available, else sequentially. */
|
|
207
|
+
async function embedAll(embedder, texts, signal) {
|
|
208
|
+
const vectors = embedder.embedBatch
|
|
209
|
+
? await embedder.embedBatch({ texts, ...(signal ? { signal } : {}) })
|
|
210
|
+
: await sequentialEmbed(embedder, texts, signal);
|
|
211
|
+
const byText = new Map();
|
|
212
|
+
for (let i = 0; i < texts.length; i++)
|
|
213
|
+
byText.set(texts[i], vectors[i]);
|
|
214
|
+
return byText;
|
|
215
|
+
}
|
|
216
|
+
async function sequentialEmbed(embedder, texts, signal) {
|
|
217
|
+
const out = [];
|
|
218
|
+
for (const text of texts) {
|
|
219
|
+
out.push(await embedder.embed({ text, ...(signal ? { signal } : {}) }));
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
function assertValidWeights(weights) {
|
|
224
|
+
for (const [name, value] of Object.entries(weights)) {
|
|
225
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
226
|
+
throw new Error(`scoreInfluence: weight '${name}' must be a finite non-negative number (got ${value})`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (weights.fa + weights.avg + weights.persist + weights.depth === 0) {
|
|
230
|
+
throw new Error('scoreInfluence: all weights are zero — the composite would always be 0');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function assertUniqueIds(evidence) {
|
|
234
|
+
const seen = new Set();
|
|
235
|
+
for (const item of evidence) {
|
|
236
|
+
if (seen.has(item.id)) {
|
|
237
|
+
throw new Error(`scoreInfluence: duplicate evidence id '${item.id}' — ids must be unique`);
|
|
238
|
+
}
|
|
239
|
+
seen.add(item.id);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/lib/influence-core/signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pairwiseSimilarity = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* pairwiseSimilarity — pairwise cosine over a set of texts
|
|
6
|
+
* (RFC-002 C1's core: tool descriptions → matrix + ranked pairs).
|
|
7
|
+
*
|
|
8
|
+
* Pattern: pure async function, embedder-injected. No thresholds, no
|
|
9
|
+
* verdicts, no lint rules — those are C1's `analyzeToolCatalog`
|
|
10
|
+
* policy layer ON TOP of this geometry. The core stays
|
|
11
|
+
* reusable for any "how confusable are these texts" question.
|
|
12
|
+
* Role: `src/lib/influence-core/` leaf. No agent/runtime imports.
|
|
13
|
+
*
|
|
14
|
+
* Honest claim: similarity is embedding geometry over the DESCRIPTIONS
|
|
15
|
+
* — a confusability HEURISTIC, not a measurement of the model's actual
|
|
16
|
+
* selection function (RFC-002 §2; tier 3 validates the proxy via
|
|
17
|
+
* choice-entropy sampling).
|
|
18
|
+
*/
|
|
19
|
+
const cosine_js_1 = require("../../memory/embedding/cosine.js");
|
|
20
|
+
/**
|
|
21
|
+
* Embed every item once (deduplicated batch) and compute the full
|
|
22
|
+
* cosine matrix plus ranked upper-triangle pairs (descending; ties
|
|
23
|
+
* keep input pair order).
|
|
24
|
+
*
|
|
25
|
+
* Invariants (pinned by property tests):
|
|
26
|
+
* - `matrix[i][j] === matrix[j][i]` — computed once, mirrored.
|
|
27
|
+
* - `matrix[i][i] === 1` EXACTLY — set by definition, so
|
|
28
|
+
* self-similarity is an invariant rather than a float artifact
|
|
29
|
+
* (and duplicate texts at different ids still compare via cosine).
|
|
30
|
+
* - N items → N·(N−1)/2 pairs.
|
|
31
|
+
*/
|
|
32
|
+
async function pairwiseSimilarity(args) {
|
|
33
|
+
const { items, embedder } = args;
|
|
34
|
+
assertUniqueIds(items);
|
|
35
|
+
const ids = items.map((item) => item.id);
|
|
36
|
+
if (items.length === 0)
|
|
37
|
+
return { ids, matrix: [], pairs: [] };
|
|
38
|
+
// Deduplicated embedding pass (identical descriptions embed once).
|
|
39
|
+
const distinct = [...new Set(items.map((item) => item.text))];
|
|
40
|
+
const vectors = embedder.embedBatch
|
|
41
|
+
? await embedder.embedBatch({
|
|
42
|
+
texts: distinct,
|
|
43
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
44
|
+
})
|
|
45
|
+
: await sequentialEmbed(embedder, distinct, args.signal);
|
|
46
|
+
const vectorByText = new Map();
|
|
47
|
+
for (let i = 0; i < distinct.length; i++)
|
|
48
|
+
vectorByText.set(distinct[i], vectors[i]);
|
|
49
|
+
const itemVecs = items.map((item) => vectorByText.get(item.text));
|
|
50
|
+
// Upper triangle once, mirrored; diagonal exactly 1 by definition.
|
|
51
|
+
const matrix = items.map(() => new Array(items.length).fill(0));
|
|
52
|
+
const pairs = [];
|
|
53
|
+
for (let i = 0; i < items.length; i++) {
|
|
54
|
+
matrix[i][i] = 1;
|
|
55
|
+
for (let j = i + 1; j < items.length; j++) {
|
|
56
|
+
const similarity = (0, cosine_js_1.cosineSimilarity)(itemVecs[i], itemVecs[j]);
|
|
57
|
+
matrix[i][j] = similarity;
|
|
58
|
+
matrix[j][i] = similarity;
|
|
59
|
+
pairs.push({ a: ids[i], b: ids[j], similarity });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Stable sort — ties keep (i, j) input order.
|
|
63
|
+
pairs.sort((p, q) => q.similarity - p.similarity);
|
|
64
|
+
return { ids, matrix, pairs };
|
|
65
|
+
}
|
|
66
|
+
exports.pairwiseSimilarity = pairwiseSimilarity;
|
|
67
|
+
async function sequentialEmbed(embedder, texts, signal) {
|
|
68
|
+
const out = [];
|
|
69
|
+
for (const text of texts) {
|
|
70
|
+
out.push(await embedder.embed({ text, ...(signal ? { signal } : {}) }));
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function assertUniqueIds(items) {
|
|
75
|
+
const seen = new Set();
|
|
76
|
+
for (const item of items) {
|
|
77
|
+
if (seen.has(item.id)) {
|
|
78
|
+
throw new Error(`pairwiseSimilarity: duplicate item id '${item.id}' — ids must be unique`);
|
|
79
|
+
}
|
|
80
|
+
seen.add(item.id);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../src/lib/influence-core/similarity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* influence-core types — the ONE embedding-based scoring contract.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: Strategy seam (plug-and-play meta-pattern) — the frame and
|
|
6
|
+
* rule engine are the library's; the `Embedder` is consumer-
|
|
7
|
+
* injected, exactly like NarrativeFormatter / reliability /
|
|
8
|
+
* permission / commentary strategies.
|
|
9
|
+
* Role: `src/lib/` leaf module. Shared by the FDL paper pipeline
|
|
10
|
+
* (Visible Reasoning, Eq. 1–6), RFC-002's tool-catalog lint +
|
|
11
|
+
* margin recorder (C1/C4/C5), and RFC-003 Part B's LLM-edge
|
|
12
|
+
* weigher (D7). Extracted as RFC-003 block D6 so all three
|
|
13
|
+
* consumers share one scoring engine and one embedding cache.
|
|
14
|
+
*
|
|
15
|
+
* ## Honest claim (RFC-002 §2, the FDL discipline)
|
|
16
|
+
*
|
|
17
|
+
* Every score produced under these types is a PROXY computed from
|
|
18
|
+
* embedding geometry — cosine similarity over consumer-injected
|
|
19
|
+
* embeddings. None of it reads model internals. Scores mean "high
|
|
20
|
+
* semantic alignment", never "the model chose/answered BECAUSE".
|
|
21
|
+
* Scores are not additive across items and are not causal attribution
|
|
22
|
+
* — counterfactual ablation (RFC-003 stage 4) is where causal claims
|
|
23
|
+
* live.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DEFAULT_MARGIN_THRESHOLD = exports.DEFAULT_PERSISTENCE_THRESHOLD = exports.DEFAULT_INFLUENCE_WEIGHTS = void 0;
|
|
27
|
+
/** Paper defaults: α=0.40, β=0.30, γ=0.20, δ=0.10 (sum to 1.0). */
|
|
28
|
+
exports.DEFAULT_INFLUENCE_WEIGHTS = Object.freeze({
|
|
29
|
+
fa: 0.4,
|
|
30
|
+
avg: 0.3,
|
|
31
|
+
persist: 0.2,
|
|
32
|
+
depth: 0.1,
|
|
33
|
+
});
|
|
34
|
+
/** Paper default for the PERSIST threshold T (Eq. 3). */
|
|
35
|
+
exports.DEFAULT_PERSISTENCE_THRESHOLD = 0.3;
|
|
36
|
+
/** RFC-002 §4 default: margins below this flag the choice as `narrow`. */
|
|
37
|
+
exports.DEFAULT_MARGIN_THRESHOLD = 0.05;
|
|
38
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/influence-core/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AA0BH,mEAAmE;AACtD,QAAA,yBAAyB,GAAqB,MAAM,CAAC,MAAM,CAAC;IACvE,EAAE,EAAE,GAAG;IACP,GAAG,EAAE,GAAG;IACR,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;CACX,CAAC,CAAC;AAEH,yDAAyD;AAC5C,QAAA,6BAA6B,GAAG,GAAG,CAAC;AAEjD,0EAA0E;AAC7D,QAAA,wBAAwB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bounded serialization helpers for the trace toolpack.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: pure functions — no state, no events.
|
|
6
|
+
* Role: The token-economics layer. EVERY value the toolpack serves goes
|
|
7
|
+
* through these: previews are capped, truncation is EXPLICIT
|
|
8
|
+
* (never silent), and nested-path keys round-trip between the
|
|
9
|
+
* engine's DELIM encoding and LLM-friendly dot notation.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.clampParam = exports.renderPreview = exports.boundedPreview = exports.safeStringify = exports.displayText = exports.normalizeKey = exports.displayKey = exports.FP_PATH_DELIM = void 0;
|
|
13
|
+
/**
|
|
14
|
+
* footprintjs's canonical nested-path delimiter (ASCII unit separator,
|
|
15
|
+
* `src/lib/memory/utils.ts`). Internal to the engine — the toolpack
|
|
16
|
+
* translates it to/from dot notation so the LLM never sees a control char.
|
|
17
|
+
*/
|
|
18
|
+
exports.FP_PATH_DELIM = '\u001F';
|
|
19
|
+
/** Engine path → LLM-friendly dotted display form. */
|
|
20
|
+
function displayKey(path) {
|
|
21
|
+
return path.includes(exports.FP_PATH_DELIM) ? path.split(exports.FP_PATH_DELIM).join('.') : path;
|
|
22
|
+
}
|
|
23
|
+
exports.displayKey = displayKey;
|
|
24
|
+
/**
|
|
25
|
+
* LLM-supplied key → engine path. Exact keys pass through; a dotted key
|
|
26
|
+
* that doesn't exist verbatim but matches a known DELIM-joined path is
|
|
27
|
+
* translated back. `knownPaths` is the set of every path seen in the
|
|
28
|
+
* commit log's trace entries.
|
|
29
|
+
*/
|
|
30
|
+
function normalizeKey(key, knownPaths) {
|
|
31
|
+
if (knownPaths.has(key))
|
|
32
|
+
return key;
|
|
33
|
+
if (key.includes('.')) {
|
|
34
|
+
const delimForm = key.split('.').join(exports.FP_PATH_DELIM);
|
|
35
|
+
if (knownPaths.has(delimForm))
|
|
36
|
+
return delimForm;
|
|
37
|
+
}
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
exports.normalizeKey = normalizeKey;
|
|
41
|
+
/** Replace every DELIM in an already-formatted text block with '.' for display. */
|
|
42
|
+
function displayText(text) {
|
|
43
|
+
return text.split(exports.FP_PATH_DELIM).join('.');
|
|
44
|
+
}
|
|
45
|
+
exports.displayText = displayText;
|
|
46
|
+
/**
|
|
47
|
+
* Serialize a value to compact JSON, total-function style: cycles, BigInt
|
|
48
|
+
* and other non-JSON values degrade to a tagged placeholder instead of
|
|
49
|
+
* throwing — a debugger tool must never crash on the evidence it serves.
|
|
50
|
+
*/
|
|
51
|
+
function safeStringify(value) {
|
|
52
|
+
if (value === undefined)
|
|
53
|
+
return 'undefined';
|
|
54
|
+
try {
|
|
55
|
+
const json = JSON.stringify(value);
|
|
56
|
+
return json === undefined ? String(value) : json;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return '[unserializable value]';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.safeStringify = safeStringify;
|
|
63
|
+
/** Serialize + cap at `maxChars`. Truncation is reported, never silent. */
|
|
64
|
+
function boundedPreview(value, maxChars) {
|
|
65
|
+
const full = safeStringify(value);
|
|
66
|
+
if (full.length <= maxChars) {
|
|
67
|
+
return { text: full, totalChars: full.length, truncated: false };
|
|
68
|
+
}
|
|
69
|
+
return { text: `${full.slice(0, maxChars)}…`, totalChars: full.length, truncated: true };
|
|
70
|
+
}
|
|
71
|
+
exports.boundedPreview = boundedPreview;
|
|
72
|
+
/** Render a preview with its honesty suffix when truncated. */
|
|
73
|
+
function renderPreview(preview, fetchHint) {
|
|
74
|
+
if (!preview.truncated)
|
|
75
|
+
return preview.text;
|
|
76
|
+
const hint = fetchHint ? ` — ${fetchHint}` : '';
|
|
77
|
+
return `${preview.text} (${preview.totalChars} chars total${hint})`;
|
|
78
|
+
}
|
|
79
|
+
exports.renderPreview = renderPreview;
|
|
80
|
+
/** Clamp an LLM-supplied numeric param into [min, hardCap], with a default. */
|
|
81
|
+
function clampParam(requested, fallback, min, hardCap) {
|
|
82
|
+
const value = typeof requested === 'number' && Number.isFinite(requested) ? requested : fallback;
|
|
83
|
+
return Math.max(min, Math.min(Math.floor(value), hardCap));
|
|
84
|
+
}
|
|
85
|
+
exports.clampParam = clampParam;
|
|
86
|
+
//# sourceMappingURL=bounded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded.js","sourceRoot":"","sources":["../../../src/lib/trace-toolpack/bounded.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* trace-toolpack — RFC-003 Part C: the introspection toolpack.
|
|
4
|
+
*
|
|
5
|
+
* footprintjs trace evidence exposed as TOOLS an LLM calls: a debugging
|
|
6
|
+
* model navigates a COMPLETED run's evidence by runtimeStageIds instead of
|
|
7
|
+
* reading dumps. Bounded, honest (⚠ markers), redaction-respecting.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TOOLPACK_HARD_CAPS = exports.traceToolpack = exports.callTraceTool = void 0;
|
|
11
|
+
var traceToolpack_js_1 = require("./traceToolpack.js");
|
|
12
|
+
Object.defineProperty(exports, "callTraceTool", { enumerable: true, get: function () { return traceToolpack_js_1.callTraceTool; } });
|
|
13
|
+
Object.defineProperty(exports, "traceToolpack", { enumerable: true, get: function () { return traceToolpack_js_1.traceToolpack; } });
|
|
14
|
+
var types_js_1 = require("./types.js");
|
|
15
|
+
Object.defineProperty(exports, "TOOLPACK_HARD_CAPS", { enumerable: true, get: function () { return types_js_1.TOOLPACK_HARD_CAPS; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/trace-toolpack/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,uDAAkE;AAAzD,iHAAA,aAAa,OAAA;AAAE,iHAAA,aAAa,OAAA;AACrC,uCAIoB;AAHlB,8GAAA,kBAAkB,OAAA"}
|