context-lens 0.6.0 → 0.6.2

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 (81) hide show
  1. package/README.md +74 -4
  2. package/dist/analysis/ingest.d.ts.map +1 -1
  3. package/dist/analysis/ingest.js +4 -3
  4. package/dist/analysis/ingest.js.map +1 -1
  5. package/dist/analysis/server.js +5 -0
  6. package/dist/analysis/server.js.map +1 -1
  7. package/dist/cli-utils.d.ts +5 -0
  8. package/dist/cli-utils.d.ts.map +1 -1
  9. package/dist/cli-utils.js +59 -4
  10. package/dist/cli-utils.js.map +1 -1
  11. package/dist/cli.js +124 -34
  12. package/dist/cli.js.map +1 -1
  13. package/dist/config.d.ts +35 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +113 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/core/models.d.ts +6 -38
  18. package/dist/core/models.d.ts.map +1 -1
  19. package/dist/core/models.js +6 -213
  20. package/dist/core/models.js.map +1 -1
  21. package/dist/core/parse.d.ts.map +1 -1
  22. package/dist/core/parse.js +26 -25
  23. package/dist/core/parse.js.map +1 -1
  24. package/dist/core/routing.d.ts.map +1 -1
  25. package/dist/core/routing.js +7 -1
  26. package/dist/core/routing.js.map +1 -1
  27. package/dist/core/source.d.ts +1 -0
  28. package/dist/core/source.d.ts.map +1 -1
  29. package/dist/core/source.js +9 -1
  30. package/dist/core/source.js.map +1 -1
  31. package/dist/core/tokenizer.d.ts +30 -0
  32. package/dist/core/tokenizer.d.ts.map +1 -0
  33. package/dist/core/tokenizer.js +149 -0
  34. package/dist/core/tokenizer.js.map +1 -0
  35. package/dist/core/tokens.d.ts +11 -5
  36. package/dist/core/tokens.d.ts.map +1 -1
  37. package/dist/core/tokens.js +14 -7
  38. package/dist/core/tokens.js.map +1 -1
  39. package/dist/core.d.ts +2 -1
  40. package/dist/core.d.ts.map +1 -1
  41. package/dist/core.js +2 -1
  42. package/dist/core.js.map +1 -1
  43. package/dist/http/headers.d.ts +9 -17
  44. package/dist/http/headers.d.ts.map +1 -1
  45. package/dist/http/headers.js +10 -38
  46. package/dist/http/headers.js.map +1 -1
  47. package/dist/lhar/composition.d.ts.map +1 -1
  48. package/dist/lhar/composition.js +40 -39
  49. package/dist/lhar/composition.js.map +1 -1
  50. package/dist/lhar/export.js +1 -1
  51. package/dist/lhar/export.js.map +1 -1
  52. package/dist/proxy/config.d.ts.map +1 -1
  53. package/dist/proxy/config.js +13 -0
  54. package/dist/proxy/config.js.map +1 -1
  55. package/dist/proxy/server.js +22 -0
  56. package/dist/proxy/server.js.map +1 -1
  57. package/dist/schemas.d.ts +14 -0
  58. package/dist/schemas.d.ts.map +1 -1
  59. package/dist/schemas.js +8 -0
  60. package/dist/schemas.js.map +1 -1
  61. package/dist/server/api.d.ts.map +1 -1
  62. package/dist/server/api.js.map +1 -1
  63. package/dist/server/projection.d.ts.map +1 -1
  64. package/dist/server/projection.js +1 -0
  65. package/dist/server/projection.js.map +1 -1
  66. package/dist/server/store.d.ts.map +1 -1
  67. package/dist/server/store.js +97 -18
  68. package/dist/server/store.js.map +1 -1
  69. package/dist/server/webui.js +1 -1
  70. package/dist/server/webui.js.map +1 -1
  71. package/dist/types.d.ts +13 -1
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/version.generated.d.ts +1 -1
  74. package/dist/version.generated.js +1 -1
  75. package/mitm_addon.py +19 -10
  76. package/package.json +6 -2
  77. package/ui/dist/assets/index-C2HhFk_P.js +52 -0
  78. package/ui/dist/assets/index-xYrXQJL_.css +1 -0
  79. package/ui/dist/index.html +2 -2
  80. package/ui/dist/assets/index-CC_AtJBy.css +0 -1
  81. package/ui/dist/assets/index-If9FfL3y.js +0 -36
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/core/source.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5D,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;IAC1D,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;CACpE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,OAAO,EAAE,qCAAqC,EAAE,MAAM,EAAE,OAAO,EAAE;IACnE,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpD,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE;IACpD,EAAE,OAAO,EAAE,6CAA6C,EAAE,MAAM,EAAE,IAAI,EAAE;CACzE,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAwB,EACxB,MAAqB,EACrB,OAAgC;IAEhC,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAElD,iCAAiC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IACE,GAAG,CAAC,OAAO,YAAY,MAAM;gBAC3B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAC7B,CAAC;gBACD,OAAO,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC;SACjD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/core/source.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5D,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;IAC1D,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;CACpE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,OAAO,EAAE,qCAAqC,EAAE,MAAM,EAAE,OAAO,EAAE;IACnE,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpD,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE;IACpD,EAAE,OAAO,EAAE,6CAA6C,EAAE,MAAM,EAAE,IAAI,EAAE;CACzE,CAAC;AAEF;;;;;;;;GAQG;AACH,oEAAoE;AACpE,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IACpC,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAC1B,WAAwB,EACxB,MAAqB,EACrB,OAAgC;IAEhC,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAC/D,OAAO,MAAM,CAAC;IAEhB,iCAAiC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IACE,GAAG,CAAC,OAAO,YAAY,MAAM;gBAC3B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAC7B,CAAC;gBACD,OAAO,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC;SACjD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tiktoken-based tokenizer with lazy loading and model-to-encoding mapping.
3
+ *
4
+ * Encoders are cached per encoding name (not per model) since many models
5
+ * share the same encoding. Falls back to chars/4 for unknown encodings.
6
+ */
7
+ /**
8
+ * Initialize the tokenizer by preloading the most commonly used encodings.
9
+ *
10
+ * Call this once at analysis server startup. Non-blocking: if loading fails,
11
+ * the tokenizer falls back to chars/4 estimation.
12
+ */
13
+ export declare function initTokenizer(): Promise<void>;
14
+ /**
15
+ * Count tokens for a string using the appropriate encoding for the model.
16
+ *
17
+ * If the tokenizer hasn't been initialized yet (or loading failed), falls
18
+ * back to chars/4. The model parameter is optional; when omitted, uses
19
+ * cl100k_base.
20
+ *
21
+ * This is synchronous when encoders are preloaded (the normal case after
22
+ * initTokenizer()). The encoder lookup is a Map.get(), and encoding is
23
+ * a pure CPU operation.
24
+ */
25
+ export declare function countTokens(text: string, model?: string): number;
26
+ /**
27
+ * Check if the tokenizer is ready (at least one encoding loaded).
28
+ */
29
+ export declare function isTokenizerReady(): boolean;
30
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwGH;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Tiktoken-based tokenizer with lazy loading and model-to-encoding mapping.
3
+ *
4
+ * Encoders are cached per encoding name (not per model) since many models
5
+ * share the same encoding. Falls back to chars/4 for unknown encodings.
6
+ */
7
+ /**
8
+ * Map model name prefixes to tiktoken encoding names.
9
+ *
10
+ * Order: most specific first (longest prefix match wins).
11
+ *
12
+ * - cl100k_base: GPT-4, GPT-3.5-turbo, Claude (approximation)
13
+ * - o200k_base: GPT-4o, GPT-4.1, GPT-5, o1, o3, o4
14
+ *
15
+ * Anthropic hasn't published their tokenizer, but cl100k_base is a
16
+ * reasonable approximation (~5-10% off). Still much better than chars/4.
17
+ *
18
+ * Gemini models also use a proprietary tokenizer; cl100k_base is used
19
+ * as a best-effort approximation.
20
+ */
21
+ const MODEL_ENCODING_MAP = [
22
+ // OpenAI: o200k_base models
23
+ ["gpt-5", "o200k_base"],
24
+ ["gpt-4.1", "o200k_base"],
25
+ ["gpt-4o", "o200k_base"],
26
+ ["o4-", "o200k_base"],
27
+ ["o3-", "o200k_base"],
28
+ ["o3", "o200k_base"],
29
+ ["o1-", "o200k_base"],
30
+ ["o1", "o200k_base"],
31
+ // OpenAI: cl100k_base models
32
+ ["gpt-4-turbo", "cl100k_base"],
33
+ ["gpt-4", "cl100k_base"],
34
+ ["gpt-3.5", "cl100k_base"],
35
+ // Anthropic: cl100k_base as approximation
36
+ ["claude-", "cl100k_base"],
37
+ // Gemini: cl100k_base as approximation
38
+ ["gemini-", "cl100k_base"],
39
+ ];
40
+ /** Cached encoder instances keyed by encoding name. */
41
+ const encoderCache = new Map();
42
+ /** In-flight loading promises to avoid duplicate loads. */
43
+ const loadingPromises = new Map();
44
+ /** Whether the tokenizer has been initialized (at least one encoding loaded). */
45
+ let initialized = false;
46
+ /**
47
+ * Resolve a model string to an encoding name.
48
+ */
49
+ function getEncodingForModel(model) {
50
+ const lower = model.toLowerCase();
51
+ for (const [prefix, encoding] of MODEL_ENCODING_MAP) {
52
+ if (lower.includes(prefix))
53
+ return encoding;
54
+ }
55
+ // Default fallback: cl100k_base (most widely applicable)
56
+ return "cl100k_base";
57
+ }
58
+ /**
59
+ * Dynamically import the rank data for an encoding name.
60
+ * Returns the Tiktoken constructor args.
61
+ */
62
+ async function loadEncoding(encoding) {
63
+ const { Tiktoken } = await import("js-tiktoken/lite");
64
+ let ranks;
65
+ switch (encoding) {
66
+ case "o200k_base":
67
+ ranks = (await import("js-tiktoken/ranks/o200k_base")).default;
68
+ break;
69
+ case "cl100k_base":
70
+ ranks = (await import("js-tiktoken/ranks/cl100k_base")).default;
71
+ break;
72
+ default:
73
+ // Fallback to cl100k_base for unknown encodings
74
+ ranks = (await import("js-tiktoken/ranks/cl100k_base")).default;
75
+ break;
76
+ }
77
+ return new Tiktoken(ranks);
78
+ }
79
+ /**
80
+ * Get or lazily load an encoder for the given encoding name.
81
+ */
82
+ async function getEncoder(encoding) {
83
+ const cached = encoderCache.get(encoding);
84
+ if (cached)
85
+ return cached;
86
+ // Deduplicate concurrent loads
87
+ let promise = loadingPromises.get(encoding);
88
+ if (!promise) {
89
+ promise = loadEncoding(encoding).then((enc) => {
90
+ encoderCache.set(encoding, enc);
91
+ loadingPromises.delete(encoding);
92
+ initialized = true;
93
+ return enc;
94
+ });
95
+ loadingPromises.set(encoding, promise);
96
+ }
97
+ return promise;
98
+ }
99
+ /**
100
+ * Initialize the tokenizer by preloading the most commonly used encodings.
101
+ *
102
+ * Call this once at analysis server startup. Non-blocking: if loading fails,
103
+ * the tokenizer falls back to chars/4 estimation.
104
+ */
105
+ export async function initTokenizer() {
106
+ try {
107
+ // Preload both encodings in parallel
108
+ await Promise.all([getEncoder("cl100k_base"), getEncoder("o200k_base")]);
109
+ console.log("🔤 Tokenizer initialized (cl100k_base + o200k_base)");
110
+ }
111
+ catch (err) {
112
+ console.warn("Tokenizer init failed, using estimation fallback:", err instanceof Error ? err.message : String(err));
113
+ }
114
+ }
115
+ /**
116
+ * Count tokens for a string using the appropriate encoding for the model.
117
+ *
118
+ * If the tokenizer hasn't been initialized yet (or loading failed), falls
119
+ * back to chars/4. The model parameter is optional; when omitted, uses
120
+ * cl100k_base.
121
+ *
122
+ * This is synchronous when encoders are preloaded (the normal case after
123
+ * initTokenizer()). The encoder lookup is a Map.get(), and encoding is
124
+ * a pure CPU operation.
125
+ */
126
+ export function countTokens(text, model) {
127
+ if (!text)
128
+ return 0;
129
+ const encoding = model ? getEncodingForModel(model) : "cl100k_base";
130
+ const encoder = encoderCache.get(encoding);
131
+ if (encoder) {
132
+ try {
133
+ return encoder.encode(text).length;
134
+ }
135
+ catch {
136
+ // Encoding failure (unlikely): fall back to estimation
137
+ return Math.ceil(text.length / 4);
138
+ }
139
+ }
140
+ // Encoder not loaded yet: fall back to chars/4
141
+ return Math.ceil(text.length / 4);
142
+ }
143
+ /**
144
+ * Check if the tokenizer is ready (at least one encoding loaded).
145
+ */
146
+ export function isTokenizerReady() {
147
+ return initialized;
148
+ }
149
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,19 @@
1
1
  /**
2
- * Lightweight token estimator used throughout Context Lens.
2
+ * Token estimator used throughout Context Lens.
3
3
  *
4
- * Approximates tokens as `ceil(chars / 4)`. For image content blocks,
5
- * uses a fixed per-image estimate instead of stringifying base64 data.
4
+ * When the tiktoken-based tokenizer is initialized (analysis server),
5
+ * uses accurate BPE tokenization for the given model. Falls back to
6
+ * `ceil(chars / 4)` when the tokenizer hasn't loaded yet or for
7
+ * unknown models.
8
+ *
9
+ * For image content blocks, uses a fixed per-image estimate instead
10
+ * of stringifying base64 data.
6
11
  *
7
12
  * @param text - Value to estimate tokens for. Objects are stringified as JSON.
8
- * @returns Estimated token count (>= 0).
13
+ * @param model - Optional model name for encoding selection.
14
+ * @returns Token count (>= 0).
9
15
  */
10
- export declare function estimateTokens(text: unknown): number;
16
+ export declare function estimateTokens(text: unknown, model?: string): number;
11
17
  /**
12
18
  * Rescale all token sub-fields in a ContextInfo so they are internally
13
19
  * consistent with an authoritative total (typically from API usage data).
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AA8DA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAqBpD;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChC,EACD,aAAa,EAAE,MAAM,GACpB,IAAI,CAyCN"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAgEA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBpE;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChC,EACD,aAAa,EAAE,MAAM,GACpB,IAAI,CAyCN"}
@@ -1,3 +1,4 @@
1
+ import { countTokens } from "./tokenizer.js";
1
2
  /**
2
3
  * Approximate token cost for a single image.
3
4
  *
@@ -56,20 +57,26 @@ function stripImageData(val) {
56
57
  return obj;
57
58
  }
58
59
  /**
59
- * Lightweight token estimator used throughout Context Lens.
60
+ * Token estimator used throughout Context Lens.
60
61
  *
61
- * Approximates tokens as `ceil(chars / 4)`. For image content blocks,
62
- * uses a fixed per-image estimate instead of stringifying base64 data.
62
+ * When the tiktoken-based tokenizer is initialized (analysis server),
63
+ * uses accurate BPE tokenization for the given model. Falls back to
64
+ * `ceil(chars / 4)` when the tokenizer hasn't loaded yet or for
65
+ * unknown models.
66
+ *
67
+ * For image content blocks, uses a fixed per-image estimate instead
68
+ * of stringifying base64 data.
63
69
  *
64
70
  * @param text - Value to estimate tokens for. Objects are stringified as JSON.
65
- * @returns Estimated token count (>= 0).
71
+ * @param model - Optional model name for encoding selection.
72
+ * @returns Token count (>= 0).
66
73
  */
67
- export function estimateTokens(text) {
74
+ export function estimateTokens(text, model) {
68
75
  if (!text)
69
76
  return 0;
70
77
  // Fast path: plain strings never contain image data
71
78
  if (typeof text === "string") {
72
- return Math.ceil(text.length / 4);
79
+ return countTokens(text, model);
73
80
  }
74
81
  // Single image block
75
82
  if (isImageBlock(text)) {
@@ -78,7 +85,7 @@ export function estimateTokens(text) {
78
85
  // Object/array: strip image data, then stringify the rest
79
86
  const cleaned = stripImageData(text);
80
87
  const s = JSON.stringify(cleaned);
81
- const baseTokens = Math.ceil(s.length / 4);
88
+ const baseTokens = countTokens(s, model);
82
89
  // Count image blocks and add fixed estimate for each
83
90
  const imageCount = countImages(text);
84
91
  return baseTokens + imageCount * IMAGE_TOKEN_ESTIMATE;
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -14,6 +14,7 @@ export type { AgentPathStep, AnalyzeOptions, CacheStats, CompactionEvent, Growth
14
14
  export { analyzeSession, buildAgentPaths, findCompactions, findGrowthBlocks, identifyUserTurns, } from "./core/session-analysis.js";
15
15
  export type { FormatOptions } from "./core/session-format.js";
16
16
  export { fmtCost, fmtDuration, fmtTokens, formatSessionAnalysis, shortModel, } from "./core/session-format.js";
17
- export { detectSource } from "./core/source.js";
17
+ export { detectSource, PROVIDER_NAMES } from "./core/source.js";
18
+ export { initTokenizer, isTokenizerReady } from "./core/tokenizer.js";
18
19
  export { estimateTokens, rescaleContextTokens } from "./core/tokens.js";
19
20
  //# 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,MAAM,kBAAkB,CAAC;AAChD,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"}
package/dist/core.js CHANGED
@@ -12,6 +12,7 @@ export { detectApiFormat, detectProvider, extractSource, resolveTargetUrl, } fro
12
12
  export { scanSecurity } from "./core/security.js";
13
13
  export { analyzeSession, buildAgentPaths, findCompactions, findGrowthBlocks, identifyUserTurns, } from "./core/session-analysis.js";
14
14
  export { fmtCost, fmtDuration, fmtTokens, formatSessionAnalysis, shortModel, } from "./core/session-format.js";
15
- export { detectSource } from "./core/source.js";
15
+ export { detectSource, PROVIDER_NAMES } from "./core/source.js";
16
+ export { initTokenizer, isTokenizerReady } from "./core/tokenizer.js";
16
17
  export { estimateTokens, rescaleContextTokens } from "./core/tokens.js";
17
18
  //# 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,MAAM,kBAAkB,CAAC;AAChD,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"}
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/lhar/composition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GACvC,gBAAgB,EAAE,CAwEpB;AA8KD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,aAAa,EAAE,MAAM,GACpB,IAAI,CAgCN"}
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/lhar/composition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GACvC,gBAAgB,EAAE,CA4EpB;AAiLD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,aAAa,EAAE,MAAM,GACpB,IAAI,CAgCN"}