context-lens 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +112 -20
  2. package/dist/analysis/server.js +2 -2
  3. package/dist/analysis/server.js.map +1 -1
  4. package/dist/cli-utils.d.ts +5 -0
  5. package/dist/cli-utils.d.ts.map +1 -1
  6. package/dist/cli-utils.js +57 -1
  7. package/dist/cli-utils.js.map +1 -1
  8. package/dist/cli.js +85 -11
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +35 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +113 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core/models.d.ts +6 -38
  15. package/dist/core/models.d.ts.map +1 -1
  16. package/dist/core/models.js +6 -213
  17. package/dist/core/models.js.map +1 -1
  18. package/dist/core/routing.d.ts.map +1 -1
  19. package/dist/core/routing.js +7 -1
  20. package/dist/core/routing.js.map +1 -1
  21. package/dist/core/security.d.ts.map +1 -1
  22. package/dist/core/security.js +23 -0
  23. package/dist/core/security.js.map +1 -1
  24. package/dist/core/waste.d.ts +73 -0
  25. package/dist/core/waste.d.ts.map +1 -0
  26. package/dist/core/waste.js +283 -0
  27. package/dist/core/waste.js.map +1 -0
  28. package/dist/core.d.ts +2 -0
  29. package/dist/core.d.ts.map +1 -1
  30. package/dist/core.js +1 -0
  31. package/dist/core.js.map +1 -1
  32. package/dist/http/headers.d.ts +9 -17
  33. package/dist/http/headers.d.ts.map +1 -1
  34. package/dist/http/headers.js +10 -38
  35. package/dist/http/headers.js.map +1 -1
  36. package/dist/proxy/config.d.ts.map +1 -1
  37. package/dist/proxy/config.js +13 -0
  38. package/dist/proxy/config.js.map +1 -1
  39. package/dist/proxy/server.js +22 -0
  40. package/dist/proxy/server.js.map +1 -1
  41. package/dist/schemas.d.ts +14 -0
  42. package/dist/schemas.d.ts.map +1 -1
  43. package/dist/schemas.js +8 -0
  44. package/dist/schemas.js.map +1 -1
  45. package/dist/server/api.d.ts.map +1 -1
  46. package/dist/server/api.js.map +1 -1
  47. package/dist/server/projection.d.ts.map +1 -1
  48. package/dist/server/projection.js +1 -0
  49. package/dist/server/projection.js.map +1 -1
  50. package/dist/server/store.d.ts.map +1 -1
  51. package/dist/server/store.js +100 -10
  52. package/dist/server/store.js.map +1 -1
  53. package/dist/types.d.ts +13 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/version.generated.d.ts +1 -1
  56. package/dist/version.generated.js +1 -1
  57. package/mitm_addon.py +3 -0
  58. package/package.json +7 -4
  59. package/ui/dist/assets/index-B1EiZYbW.css +1 -0
  60. package/ui/dist/assets/index-DDiXESm5.js +52 -0
  61. package/ui/dist/index.html +2 -2
  62. package/ui/dist/assets/index-DYoafQtJ.css +0 -1
  63. package/ui/dist/assets/index-t5l_d6Oq.js +0 -52
@@ -1 +1 @@
1
- {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/core/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACV,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,aAY5B,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,QAAQ,CAEV;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CA0C9C;AAeD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CA+BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,SAAS,EAAE,SAAS,GACnB,mBAAmB,CAmCrB"}
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/core/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACV,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,aAY5B,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,QAAQ,CAEV;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CA0C9C;AAeD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CA+BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,SAAS,EAAE,SAAS,GACnB,mBAAmB,CA0CrB"}
@@ -157,7 +157,13 @@ export function resolveTargetUrl(parsedUrl, headers, upstreams) {
157
157
  }
158
158
  }
159
159
  else {
160
- targetUrl = upstreams.openai + parsedUrl.pathname + search;
160
+ // Codex Enterprise sets OPENAI_BASE_URL without a /v1 suffix and
161
+ // appends paths like /responses directly. Normalize /responses to
162
+ // /v1/responses so it reaches the correct endpoint on api.openai.com.
163
+ const openaiPath = parsedUrl.pathname === "/responses"
164
+ ? "/v1/responses"
165
+ : parsedUrl.pathname;
166
+ targetUrl = upstreams.openai + openaiPath + search;
161
167
  }
162
168
  }
163
169
  else if (!targetUrl.startsWith("http")) {
@@ -1 +1 @@
1
- {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/core/routing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/core/routing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAGX,cAAc,EAEf,MAAM,aAAa,CAAC;AA2PrB;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CAkBrE"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,WAAW,EAGX,cAAc,EAEf,MAAM,aAAa,CAAC;AAkRrB;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CAkBrE"}
@@ -1,3 +1,4 @@
1
+ import { CREDENTIAL_PATTERNS } from "@contextio/core";
1
2
  const TIER1_PATTERNS = [
2
3
  // Role hijacking
3
4
  {
@@ -200,6 +201,28 @@ function scanMessage(msg, messageIndex, allMessages) {
200
201
  length: 1,
201
202
  });
202
203
  }
204
+ // --- Tier 3: Credential detection ---
205
+ // Scans all non-system messages (including user messages), so secrets
206
+ // typed directly in chat are caught, not just tool results.
207
+ // The match text is replaced with a redacted placeholder so the actual
208
+ // key value is never stored in state or shown in the UI.
209
+ for (const rule of CREDENTIAL_PATTERNS) {
210
+ rule.pattern.lastIndex = 0;
211
+ const m = rule.pattern.exec(content);
212
+ if (m) {
213
+ const redactedMatch = `[${rule.label} detected — value redacted]`;
214
+ alerts.push({
215
+ messageIndex,
216
+ role: msg.role,
217
+ toolName,
218
+ severity: "high",
219
+ pattern: rule.id,
220
+ match: redactedMatch,
221
+ offset: m.index,
222
+ length: m[0].length,
223
+ });
224
+ }
225
+ }
203
226
  return alerts;
204
227
  }
205
228
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Context window waste analysis.
3
+ *
4
+ * Measures how many tokens across a session were "wasted" — paid for but
5
+ * contributing little or nothing to useful output. Waste compounds: a single
6
+ * unused tool definition paid on every turn costs far more than its per-turn
7
+ * size suggests.
8
+ *
9
+ * Waste categories
10
+ * ─────────────────
11
+ * unused_tools Tool definitions that were never called in the session. Every
12
+ * turn carries the full definition payload regardless.
13
+ *
14
+ * oversized_results Tool results that exceed a reasonable size threshold.
15
+ * Large file reads, search dumps, command output blobs that
16
+ * could have been truncated or summarised before passing to
17
+ * the model.
18
+ *
19
+ * repeated_system The system prompt is re-sent on every turn. Not avoidable
20
+ * in most APIs, but quantified here as fixed overhead so users
21
+ * can see what "always on" costs.
22
+ *
23
+ * thinking_spill Extended thinking/reasoning tokens that accumulated beyond a
24
+ * moderate share of context. Thinking is often useful, but when
25
+ * it dominates (>40% of tokens) the marginal value is unclear.
26
+ *
27
+ * The "compounding" angle: unlike a one-off cost, waste that appears on turn 1
28
+ * also appears on turns 2..N until the next compaction. The analysis accumulates
29
+ * waste across every turn individually so the true billing impact is visible.
30
+ */
31
+ import type { ProjectedEntry } from "../types.js";
32
+ export interface WasteCategory {
33
+ /** Machine key */
34
+ id: "unused_tools" | "oversized_results" | "repeated_system" | "thinking_spill";
35
+ /** Human label */
36
+ label: string;
37
+ /** Total wasted tokens across all turns */
38
+ tokens: number;
39
+ /** Estimated USD cost of the wasted tokens */
40
+ costUsd: number | null;
41
+ /** Per-turn breakdown: [turnIndex, wastedTokens] */
42
+ perTurn: Array<[number, number]>;
43
+ /** Short plain-language description of what this is */
44
+ description: string;
45
+ }
46
+ export interface WasteAnalysis {
47
+ /** Total input tokens billed across all entries (excluding error responses) */
48
+ totalInputTokens: number;
49
+ /** Total estimated cost of input tokens */
50
+ totalInputCostUsd: number | null;
51
+ /** Total waste tokens across all categories and turns */
52
+ totalWasteTokens: number;
53
+ /** Total estimated cost of wasted tokens */
54
+ totalWasteCostUsd: number | null;
55
+ /** Waste as a fraction of total input tokens (0–1) */
56
+ wasteRatio: number;
57
+ /** Per-category breakdown */
58
+ categories: WasteCategory[];
59
+ /** Tool names that were defined but never called in the session */
60
+ unusedToolNames: string[];
61
+ /** Number of turns analysed (error responses excluded) */
62
+ turnCount: number;
63
+ /** Number of compaction events detected during the session */
64
+ compactionCount: number;
65
+ }
66
+ /**
67
+ * Compute waste analysis for a set of projected entries (a conversation).
68
+ *
69
+ * Only successful (non-error) entries are included. Entries are assumed to be
70
+ * ordered chronologically.
71
+ */
72
+ export declare function computeWasteAnalysis(entries: ProjectedEntry[]): WasteAnalysis;
73
+ //# sourceMappingURL=waste.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waste.d.ts","sourceRoot":"","sources":["../../src/core/waste.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AAOpE,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EACE,cAAc,GACd,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,CAAC;IACrB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oDAAoD;IACpD,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjC,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,gBAAgB,EAAE,MAAM,CAAC;IACzB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,mEAAmE;IACnE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;CACzB;AAkMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,aAAa,CAqH7E"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Context window waste analysis.
3
+ *
4
+ * Measures how many tokens across a session were "wasted" — paid for but
5
+ * contributing little or nothing to useful output. Waste compounds: a single
6
+ * unused tool definition paid on every turn costs far more than its per-turn
7
+ * size suggests.
8
+ *
9
+ * Waste categories
10
+ * ─────────────────
11
+ * unused_tools Tool definitions that were never called in the session. Every
12
+ * turn carries the full definition payload regardless.
13
+ *
14
+ * oversized_results Tool results that exceed a reasonable size threshold.
15
+ * Large file reads, search dumps, command output blobs that
16
+ * could have been truncated or summarised before passing to
17
+ * the model.
18
+ *
19
+ * repeated_system The system prompt is re-sent on every turn. Not avoidable
20
+ * in most APIs, but quantified here as fixed overhead so users
21
+ * can see what "always on" costs.
22
+ *
23
+ * thinking_spill Extended thinking/reasoning tokens that accumulated beyond a
24
+ * moderate share of context. Thinking is often useful, but when
25
+ * it dominates (>40% of tokens) the marginal value is unclear.
26
+ *
27
+ * The "compounding" angle: unlike a one-off cost, waste that appears on turn 1
28
+ * also appears on turns 2..N until the next compaction. The analysis accumulates
29
+ * waste across every turn individually so the true billing impact is visible.
30
+ */
31
+ import { estimateCost } from "./models.js";
32
+ // ---------------------------------------------------------------------------
33
+ // Constants
34
+ // ---------------------------------------------------------------------------
35
+ /**
36
+ * Tool result size above which a result is considered "oversized".
37
+ * Below this threshold, tool results are expected and efficient.
38
+ */
39
+ const OVERSIZED_RESULT_THRESHOLD = 8_000;
40
+ /**
41
+ * Fraction of context at which thinking tokens start to be counted as waste.
42
+ * Below this, thinking is considered worthwhile.
43
+ */
44
+ const THINKING_SPILL_THRESHOLD = 0.4;
45
+ // ---------------------------------------------------------------------------
46
+ // Helpers
47
+ // ---------------------------------------------------------------------------
48
+ function categoryTokens(composition, cat) {
49
+ return composition.find((c) => c.category === cat)?.tokens ?? 0;
50
+ }
51
+ function totalTokens(composition) {
52
+ return composition.reduce((s, c) => s + c.tokens, 0);
53
+ }
54
+ function isSuccessEntry(e) {
55
+ return e.httpStatus === null || (e.httpStatus >= 200 && e.httpStatus < 300);
56
+ }
57
+ /**
58
+ * Collect tool names defined in an entry's contextInfo.
59
+ */
60
+ function definedToolNames(e) {
61
+ const names = new Set();
62
+ for (const t of e.contextInfo.tools ?? []) {
63
+ const name = "name" in t
64
+ ? t.name
65
+ : "function" in t
66
+ ? t.function.name
67
+ : null;
68
+ if (name)
69
+ names.add(name);
70
+ }
71
+ return names;
72
+ }
73
+ /**
74
+ * Collect tool names actually called in an entry's messages (tool_use blocks).
75
+ */
76
+ function calledToolNames(e) {
77
+ const names = new Set();
78
+ for (const m of e.contextInfo.messages ?? []) {
79
+ if (!m.contentBlocks)
80
+ continue;
81
+ for (const b of m.contentBlocks) {
82
+ const block = b;
83
+ if (block.type === "tool_use" && typeof block.name === "string") {
84
+ names.add(block.name);
85
+ }
86
+ }
87
+ }
88
+ return names;
89
+ }
90
+ /**
91
+ * Estimate cost for a token count using an entry's model, treating them as
92
+ * input tokens (waste is always on the input side).
93
+ */
94
+ function wasteTokenCost(tokens, model) {
95
+ return estimateCost(model, tokens, 0, 0, 0);
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // Per-category analysers
99
+ // ---------------------------------------------------------------------------
100
+ /**
101
+ * Unused tool definition waste.
102
+ *
103
+ * Tool definitions are bundled on every turn regardless of whether they are
104
+ * ever called. If a tool is never called in the entire session, its definition
105
+ * tokens are wasted on every turn.
106
+ *
107
+ * We compute the unused fraction per turn: (unusedDefs / totalDefs) *
108
+ * toolDefinitionTokens. This is conservative — if half the tools are unused
109
+ * the unused half's share of definition tokens is counted as waste.
110
+ */
111
+ function analyseUnusedTools(entries, sessionCalledTools) {
112
+ const perTurn = [];
113
+ let unusedNames = [];
114
+ let namesComputed = false;
115
+ for (let i = 0; i < entries.length; i++) {
116
+ const e = entries[i];
117
+ const defined = definedToolNames(e);
118
+ if (defined.size === 0) {
119
+ perTurn.push([i, 0]);
120
+ continue;
121
+ }
122
+ const unused = [...defined].filter((n) => !sessionCalledTools.has(n));
123
+ if (!namesComputed) {
124
+ unusedNames = unused;
125
+ namesComputed = true;
126
+ }
127
+ const unusedFraction = unused.length / defined.size;
128
+ const defTokens = categoryTokens(e.composition, "tool_definitions");
129
+ const waste = Math.round(defTokens * unusedFraction);
130
+ perTurn.push([i, waste]);
131
+ }
132
+ return { perTurn, unusedNames };
133
+ }
134
+ /**
135
+ * Oversized tool result waste.
136
+ *
137
+ * Tool results above OVERSIZED_RESULT_THRESHOLD tokens are likely bloated.
138
+ * We count the tokens above the threshold as waste.
139
+ *
140
+ * Note: we only have per-turn total tool_results tokens from composition, not
141
+ * per-result breakdowns (that would require message-level analysis). We use
142
+ * the excess above the threshold as a conservative lower bound.
143
+ */
144
+ function analyseOversizedResults(entries) {
145
+ return entries.map((e, i) => {
146
+ const resultTokens = categoryTokens(e.composition, "tool_results");
147
+ const waste = Math.max(0, resultTokens - OVERSIZED_RESULT_THRESHOLD);
148
+ return [i, waste];
149
+ });
150
+ }
151
+ /**
152
+ * Repeated system prompt overhead.
153
+ *
154
+ * The system prompt is re-sent verbatim on every turn. This is not avoidable
155
+ * with most APIs (prompt caching reduces billing cost but the tokens still
156
+ * count toward context). We track it as overhead so users can see what it
157
+ * contributes cumulatively.
158
+ *
159
+ * We count system prompt tokens on every turn *after* turn 0, because the
160
+ * first turn is where the system prompt is genuinely needed. Subsequent
161
+ * repetitions are structural overhead.
162
+ */
163
+ function analyseRepeatedSystem(entries) {
164
+ return entries.map((e, i) => {
165
+ if (i === 0)
166
+ return [i, 0];
167
+ const sysTokens = categoryTokens(e.composition, "system_prompt") +
168
+ categoryTokens(e.composition, "system_injections");
169
+ return [i, sysTokens];
170
+ });
171
+ }
172
+ /**
173
+ * Thinking token spill.
174
+ *
175
+ * Thinking blocks beyond 40% of context are counted as spill. At that ratio
176
+ * the thinking cost likely exceeds the value it adds (pure heuristic).
177
+ */
178
+ function analyseThinkingSpill(entries) {
179
+ return entries.map((e, i) => {
180
+ const total = totalTokens(e.composition);
181
+ if (total === 0)
182
+ return [i, 0];
183
+ const thinkTokens = categoryTokens(e.composition, "thinking");
184
+ const thinkFraction = thinkTokens / total;
185
+ if (thinkFraction <= THINKING_SPILL_THRESHOLD)
186
+ return [i, 0];
187
+ const spill = Math.round(thinkTokens - total * THINKING_SPILL_THRESHOLD);
188
+ return [i, spill];
189
+ });
190
+ }
191
+ // ---------------------------------------------------------------------------
192
+ // Main export
193
+ // ---------------------------------------------------------------------------
194
+ /**
195
+ * Compute waste analysis for a set of projected entries (a conversation).
196
+ *
197
+ * Only successful (non-error) entries are included. Entries are assumed to be
198
+ * ordered chronologically.
199
+ */
200
+ export function computeWasteAnalysis(entries) {
201
+ const good = entries.filter(isSuccessEntry);
202
+ if (good.length === 0) {
203
+ return {
204
+ totalInputTokens: 0,
205
+ totalInputCostUsd: null,
206
+ totalWasteTokens: 0,
207
+ totalWasteCostUsd: null,
208
+ wasteRatio: 0,
209
+ categories: [],
210
+ unusedToolNames: [],
211
+ turnCount: 0,
212
+ compactionCount: 0,
213
+ };
214
+ }
215
+ // Detect compactions: a compaction is a turn where context shrank vs the
216
+ // previous turn's total (after accounting for the same model/agent chain).
217
+ let compactionCount = 0;
218
+ for (let i = 1; i < good.length; i++) {
219
+ const prev = totalTokens(good[i - 1].composition);
220
+ const cur = totalTokens(good[i].composition);
221
+ if (prev > 0 && cur < prev * 0.7)
222
+ compactionCount++;
223
+ }
224
+ // Collect all tool names called anywhere in the session (for unused tool calc)
225
+ const sessionCalledTools = new Set();
226
+ for (const e of good) {
227
+ for (const name of calledToolNames(e))
228
+ sessionCalledTools.add(name);
229
+ }
230
+ // Total input tokens and cost across all good entries
231
+ let totalInputTokens = 0;
232
+ let totalInputCostUsd = 0;
233
+ for (const e of good) {
234
+ // Use full context size so the denominator matches composition-based waste
235
+ // calculations. usage.inputTokens is the non-cached portion only and would
236
+ // produce a wildly inflated waste ratio for cache-heavy sessions.
237
+ totalInputTokens += e.contextInfo.totalTokens;
238
+ if (e.costUsd !== null) {
239
+ if (totalInputCostUsd !== null)
240
+ totalInputCostUsd += e.costUsd;
241
+ }
242
+ else {
243
+ totalInputCostUsd = null;
244
+ }
245
+ }
246
+ // Run per-category analysers
247
+ const { perTurn: unusedPerTurn, unusedNames } = analyseUnusedTools(good, sessionCalledTools);
248
+ const oversizedPerTurn = analyseOversizedResults(good);
249
+ const systemPerTurn = analyseRepeatedSystem(good);
250
+ const thinkingPerTurn = analyseThinkingSpill(good);
251
+ // Build category objects
252
+ const model = good[0].contextInfo.model;
253
+ function buildCategory(id, label, description, perTurn) {
254
+ const tokens = perTurn.reduce((s, [, t]) => s + t, 0);
255
+ const cost = tokens > 0 ? wasteTokenCost(tokens, model) : 0;
256
+ return { id, label, description, tokens, costUsd: cost, perTurn };
257
+ }
258
+ const categories = [
259
+ buildCategory("unused_tools", "Unused tool definitions", `Tool definitions sent on every turn but never called in this session.`, unusedPerTurn),
260
+ buildCategory("oversized_results", "Oversized tool results", `Tool results exceeding ${(OVERSIZED_RESULT_THRESHOLD / 1000).toFixed(0)}K tokens — likely file dumps or large search results that could be truncated.`, oversizedPerTurn),
261
+ buildCategory("repeated_system", "Repeated system prompt", "System prompt re-sent verbatim on every turn after the first (unavoidable overhead, but quantified here).", systemPerTurn),
262
+ buildCategory("thinking_spill", "Excess thinking tokens", `Thinking/reasoning tokens above ${THINKING_SPILL_THRESHOLD * 100}% of context — marginal value unclear.`, thinkingPerTurn),
263
+ ].filter((c) => c.tokens > 0);
264
+ const totalWasteTokens = categories.reduce((s, c) => s + c.tokens, 0);
265
+ const totalWasteCostUsd = categories.reduce((s, c) => {
266
+ if (s === null || c.costUsd === null)
267
+ return null;
268
+ return s + c.costUsd;
269
+ }, 0);
270
+ const wasteRatio = totalInputTokens > 0 ? totalWasteTokens / totalInputTokens : 0;
271
+ return {
272
+ totalInputTokens,
273
+ totalInputCostUsd,
274
+ totalWasteTokens,
275
+ totalWasteCostUsd,
276
+ wasteRatio,
277
+ categories,
278
+ unusedToolNames: unusedNames,
279
+ turnCount: good.length,
280
+ compactionCount,
281
+ };
282
+ }
283
+ //# sourceMappingURL=waste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waste.js","sourceRoot":"","sources":["../../src/core/waste.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -17,4 +17,6 @@ export { fmtCost, fmtDuration, fmtTokens, formatSessionAnalysis, shortModel, } f
17
17
  export { detectSource, PROVIDER_NAMES } from "./core/source.js";
18
18
  export { initTokenizer, isTokenizerReady } from "./core/tokenizer.js";
19
19
  export { estimateTokens, rescaleContextTokens } from "./core/tokens.js";
20
+ export type { WasteAnalysis, WasteCategory } from "./core/waste.js";
21
+ export { computeWasteAnalysis } from "./core/waste.js";
20
22
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,GACT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,OAAO,EACP,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,UAAU,GACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,GACT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,OAAO,EACP,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,UAAU,GACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/core.js CHANGED
@@ -15,4 +15,5 @@ export { fmtCost, fmtDuration, fmtTokens, formatSessionAnalysis, shortModel, } f
15
15
  export { detectSource, PROVIDER_NAMES } from "./core/source.js";
16
16
  export { initTokenizer, isTokenizerReady } from "./core/tokenizer.js";
17
17
  export { estimateTokens, rescaleContextTokens } from "./core/tokens.js";
18
+ export { computeWasteAnalysis } from "./core/waste.js";
18
19
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,OAAO,EACP,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,UAAU,GACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,OAAO,EACP,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,UAAU,GACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,25 +1,17 @@
1
1
  /**
2
- * Shared header redaction utilities.
2
+ * Header redaction utilities for captures and LHAR export.
3
3
  *
4
- * Context Lens captures and exports some headers for debugging and provenance,
5
- * but must never persist secrets (API keys, cookies, auth challenges, etc.).
6
- *
7
- * Keep this as the single source of truth to avoid drift between "capture" and "export".
4
+ * `selectHeaders` and `SENSITIVE_HEADERS` are re-exported from @contextio/core
5
+ * (single source of truth). `redactHeaders` is context-lens-specific: it
6
+ * strips sensitive headers from an already-string-valued map (used in LHAR
7
+ * export where multi-value arrays are not possible).
8
8
  */
9
- /** Case-insensitive set of header names that must never be persisted/exported. */
10
- export declare const SENSITIVE_HEADERS: Set<string>;
9
+ export { SENSITIVE_HEADERS, selectHeaders } from "@contextio/core";
11
10
  /**
12
- * Remove sensitive headers from a header map.
11
+ * Remove sensitive headers from a string-valued header map.
13
12
  *
14
- * @param headers - Header map (string -> string)
15
- * @returns A new object with sensitive headers removed.
13
+ * Unlike `selectHeaders`, this does not filter non-string values
14
+ * it assumes all values are already strings (as in LHAR export).
16
15
  */
17
16
  export declare function redactHeaders(headers: Record<string, string>): Record<string, string>;
18
- /**
19
- * Select a safe subset of request/response headers for capture.
20
- *
21
- * - Drops sensitive headers (see `SENSITIVE_HEADERS`)
22
- * - Keeps only string-valued headers (Node can represent multi-valued headers as arrays)
23
- */
24
- export declare function selectHeaders(headers: Record<string, any>): Record<string, string>;
25
17
  //# sourceMappingURL=headers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,aAY5B,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAInE;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}
@@ -1,30 +1,18 @@
1
1
  /**
2
- * Shared header redaction utilities.
2
+ * Header redaction utilities for captures and LHAR export.
3
3
  *
4
- * Context Lens captures and exports some headers for debugging and provenance,
5
- * but must never persist secrets (API keys, cookies, auth challenges, etc.).
6
- *
7
- * Keep this as the single source of truth to avoid drift between "capture" and "export".
4
+ * `selectHeaders` and `SENSITIVE_HEADERS` are re-exported from @contextio/core
5
+ * (single source of truth). `redactHeaders` is context-lens-specific: it
6
+ * strips sensitive headers from an already-string-valued map (used in LHAR
7
+ * export where multi-value arrays are not possible).
8
8
  */
9
- /** Case-insensitive set of header names that must never be persisted/exported. */
10
- export const SENSITIVE_HEADERS = new Set([
11
- "authorization",
12
- "x-api-key",
13
- "cookie",
14
- "set-cookie",
15
- "x-target-url",
16
- "proxy-authorization",
17
- "x-auth-token",
18
- "x-forwarded-authorization",
19
- "www-authenticate",
20
- "proxy-authenticate",
21
- "x-goog-api-key",
22
- ]);
9
+ export { SENSITIVE_HEADERS, selectHeaders } from "@contextio/core";
10
+ import { SENSITIVE_HEADERS } from "@contextio/core";
23
11
  /**
24
- * Remove sensitive headers from a header map.
12
+ * Remove sensitive headers from a string-valued header map.
25
13
  *
26
- * @param headers - Header map (string -> string)
27
- * @returns A new object with sensitive headers removed.
14
+ * Unlike `selectHeaders`, this does not filter non-string values
15
+ * it assumes all values are already strings (as in LHAR export).
28
16
  */
29
17
  export function redactHeaders(headers) {
30
18
  const result = {};
@@ -35,20 +23,4 @@ export function redactHeaders(headers) {
35
23
  }
36
24
  return result;
37
25
  }
38
- /**
39
- * Select a safe subset of request/response headers for capture.
40
- *
41
- * - Drops sensitive headers (see `SENSITIVE_HEADERS`)
42
- * - Keeps only string-valued headers (Node can represent multi-valued headers as arrays)
43
- */
44
- export function selectHeaders(headers) {
45
- const result = {};
46
- for (const [key, val] of Object.entries(headers)) {
47
- if (SENSITIVE_HEADERS.has(key.toLowerCase()))
48
- continue;
49
- if (typeof val === "string")
50
- result[key] = val;
51
- }
52
- return result;
53
- }
54
26
  //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,eAAe;IACf,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,cAAc;IACd,qBAAqB;IACrB,cAAc;IACd,2BAA2B;IAC3B,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;CACjB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACvD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA4B;IAE5B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACvD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACvD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}