agentfootprint 6.23.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.
Files changed (67) hide show
  1. package/dist/esm/lib/influence-core/cache.js +149 -0
  2. package/dist/esm/lib/influence-core/cache.js.map +1 -0
  3. package/dist/esm/lib/influence-core/index.js +32 -0
  4. package/dist/esm/lib/influence-core/index.js.map +1 -0
  5. package/dist/esm/lib/influence-core/margin.js +110 -0
  6. package/dist/esm/lib/influence-core/margin.js.map +1 -0
  7. package/dist/esm/lib/influence-core/signals.js +232 -0
  8. package/dist/esm/lib/influence-core/signals.js.map +1 -0
  9. package/dist/esm/lib/influence-core/similarity.js +79 -0
  10. package/dist/esm/lib/influence-core/similarity.js.map +1 -0
  11. package/dist/esm/lib/influence-core/types.js +35 -0
  12. package/dist/esm/lib/influence-core/types.js.map +1 -0
  13. package/dist/esm/lib/trace-toolpack/bounded.js +76 -0
  14. package/dist/esm/lib/trace-toolpack/bounded.js.map +1 -0
  15. package/dist/esm/lib/trace-toolpack/index.js +10 -0
  16. package/dist/esm/lib/trace-toolpack/index.js.map +1 -0
  17. package/dist/esm/lib/trace-toolpack/traceToolpack.js +699 -0
  18. package/dist/esm/lib/trace-toolpack/traceToolpack.js.map +1 -0
  19. package/dist/esm/lib/trace-toolpack/types.js +24 -0
  20. package/dist/esm/lib/trace-toolpack/types.js.map +1 -0
  21. package/dist/esm/observe.js +12 -0
  22. package/dist/esm/observe.js.map +1 -1
  23. package/dist/lib/influence-core/cache.js +155 -0
  24. package/dist/lib/influence-core/cache.js.map +1 -0
  25. package/dist/lib/influence-core/index.js +50 -0
  26. package/dist/lib/influence-core/index.js.map +1 -0
  27. package/dist/lib/influence-core/margin.js +114 -0
  28. package/dist/lib/influence-core/margin.js.map +1 -0
  29. package/dist/lib/influence-core/signals.js +242 -0
  30. package/dist/lib/influence-core/signals.js.map +1 -0
  31. package/dist/lib/influence-core/similarity.js +83 -0
  32. package/dist/lib/influence-core/similarity.js.map +1 -0
  33. package/dist/lib/influence-core/types.js +38 -0
  34. package/dist/lib/influence-core/types.js.map +1 -0
  35. package/dist/lib/trace-toolpack/bounded.js +86 -0
  36. package/dist/lib/trace-toolpack/bounded.js.map +1 -0
  37. package/dist/lib/trace-toolpack/index.js +16 -0
  38. package/dist/lib/trace-toolpack/index.js.map +1 -0
  39. package/dist/lib/trace-toolpack/traceToolpack.js +704 -0
  40. package/dist/lib/trace-toolpack/traceToolpack.js.map +1 -0
  41. package/dist/lib/trace-toolpack/types.js +28 -0
  42. package/dist/lib/trace-toolpack/types.js.map +1 -0
  43. package/dist/observe.js +31 -1
  44. package/dist/observe.js.map +1 -1
  45. package/dist/types/lib/influence-core/cache.d.ts +95 -0
  46. package/dist/types/lib/influence-core/cache.d.ts.map +1 -0
  47. package/dist/types/lib/influence-core/index.d.ts +33 -0
  48. package/dist/types/lib/influence-core/index.d.ts.map +1 -0
  49. package/dist/types/lib/influence-core/margin.d.ts +34 -0
  50. package/dist/types/lib/influence-core/margin.d.ts.map +1 -0
  51. package/dist/types/lib/influence-core/signals.d.ts +104 -0
  52. package/dist/types/lib/influence-core/signals.d.ts.map +1 -0
  53. package/dist/types/lib/influence-core/similarity.d.ts +26 -0
  54. package/dist/types/lib/influence-core/similarity.d.ts.map +1 -0
  55. package/dist/types/lib/influence-core/types.d.ts +158 -0
  56. package/dist/types/lib/influence-core/types.d.ts.map +1 -0
  57. package/dist/types/lib/trace-toolpack/bounded.d.ts +48 -0
  58. package/dist/types/lib/trace-toolpack/bounded.d.ts.map +1 -0
  59. package/dist/types/lib/trace-toolpack/index.d.ts +10 -0
  60. package/dist/types/lib/trace-toolpack/index.d.ts.map +1 -0
  61. package/dist/types/lib/trace-toolpack/traceToolpack.d.ts +70 -0
  62. package/dist/types/lib/trace-toolpack/traceToolpack.d.ts.map +1 -0
  63. package/dist/types/lib/trace-toolpack/types.d.ts +60 -0
  64. package/dist/types/lib/trace-toolpack/types.d.ts.map +1 -0
  65. package/dist/types/observe.d.ts +2 -0
  66. package/dist/types/observe.d.ts.map +1 -1
  67. 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"}