context-lens 0.6.1 → 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.
- package/README.md +70 -2
- package/dist/cli-utils.d.ts +5 -0
- package/dist/cli-utils.d.ts.map +1 -1
- package/dist/cli-utils.js +57 -1
- package/dist/cli-utils.js.map +1 -1
- package/dist/cli.js +42 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +113 -0
- package/dist/config.js.map +1 -0
- package/dist/core/models.d.ts +6 -38
- package/dist/core/models.d.ts.map +1 -1
- package/dist/core/models.js +6 -213
- package/dist/core/models.js.map +1 -1
- package/dist/core/routing.d.ts.map +1 -1
- package/dist/core/routing.js +7 -1
- package/dist/core/routing.js.map +1 -1
- package/dist/http/headers.d.ts +9 -17
- package/dist/http/headers.d.ts.map +1 -1
- package/dist/http/headers.js +10 -38
- package/dist/http/headers.js.map +1 -1
- package/dist/proxy/config.d.ts.map +1 -1
- package/dist/proxy/config.js +13 -0
- package/dist/proxy/config.js.map +1 -1
- package/dist/proxy/server.js +22 -0
- package/dist/proxy/server.js.map +1 -1
- package/dist/schemas.d.ts +14 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +8 -0
- package/dist/schemas.js.map +1 -1
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js.map +1 -1
- package/dist/server/projection.d.ts.map +1 -1
- package/dist/server/projection.js +1 -0
- package/dist/server/projection.js.map +1 -1
- package/dist/server/store.d.ts.map +1 -1
- package/dist/server/store.js +80 -7
- package/dist/server/store.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/mitm_addon.py +3 -0
- package/package.json +5 -2
- package/ui/dist/assets/{index-t5l_d6Oq.js → index-C2HhFk_P.js} +20 -20
- package/ui/dist/assets/index-xYrXQJL_.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-DYoafQtJ.css +0 -1
package/dist/config.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Lens user configuration.
|
|
3
|
+
*
|
|
4
|
+
* Loaded from ~/.context-lens/config.toml on startup.
|
|
5
|
+
* All settings can be overridden with CLI flags.
|
|
6
|
+
*
|
|
7
|
+
* Precedence: defaults → config file → CLI flags
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { parse } from "smol-toml";
|
|
13
|
+
const DEFAULTS = {
|
|
14
|
+
proxy: {
|
|
15
|
+
port: 4040,
|
|
16
|
+
redact: undefined,
|
|
17
|
+
rehydrate: false,
|
|
18
|
+
},
|
|
19
|
+
ui: {
|
|
20
|
+
port: 4041,
|
|
21
|
+
noOpen: false,
|
|
22
|
+
},
|
|
23
|
+
privacy: {
|
|
24
|
+
level: undefined,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export function getConfigPath() {
|
|
28
|
+
return join(homedir(), ".context-lens", "config.toml");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load and parse the user config file.
|
|
32
|
+
*
|
|
33
|
+
* Returns merged defaults + file values. Missing keys fall back to defaults.
|
|
34
|
+
* Parse errors are logged and defaults are returned.
|
|
35
|
+
*/
|
|
36
|
+
export function loadConfig() {
|
|
37
|
+
const configPath = getConfigPath();
|
|
38
|
+
if (!fs.existsSync(configPath)) {
|
|
39
|
+
return structuredClone(DEFAULTS);
|
|
40
|
+
}
|
|
41
|
+
let raw;
|
|
42
|
+
try {
|
|
43
|
+
const text = fs.readFileSync(configPath, "utf8");
|
|
44
|
+
raw = parse(text);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.warn(`Warning: Could not parse config file ${configPath}:`, err instanceof Error ? err.message : String(err));
|
|
48
|
+
return structuredClone(DEFAULTS);
|
|
49
|
+
}
|
|
50
|
+
return mergeConfig(raw);
|
|
51
|
+
}
|
|
52
|
+
const VALID_REDACT = new Set(["secrets", "pii", "strict"]);
|
|
53
|
+
const VALID_PRIVACY = new Set(["minimal", "standard", "full"]);
|
|
54
|
+
function section(value) {
|
|
55
|
+
return typeof value === "object" && value !== null
|
|
56
|
+
? value
|
|
57
|
+
: null;
|
|
58
|
+
}
|
|
59
|
+
function mergeConfig(raw) {
|
|
60
|
+
const cfg = structuredClone(DEFAULTS);
|
|
61
|
+
if (typeof raw !== "object" || raw === null)
|
|
62
|
+
return cfg;
|
|
63
|
+
const r = raw;
|
|
64
|
+
const proxy = section(r.proxy);
|
|
65
|
+
if (proxy) {
|
|
66
|
+
if (typeof proxy.port === "number")
|
|
67
|
+
cfg.proxy.port = proxy.port;
|
|
68
|
+
if (typeof proxy.redact === "string" && VALID_REDACT.has(proxy.redact)) {
|
|
69
|
+
cfg.proxy.redact = proxy.redact;
|
|
70
|
+
}
|
|
71
|
+
if (typeof proxy.rehydrate === "boolean") {
|
|
72
|
+
cfg.proxy.rehydrate = proxy.rehydrate;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const ui = section(r.ui);
|
|
76
|
+
if (ui) {
|
|
77
|
+
if (typeof ui.port === "number")
|
|
78
|
+
cfg.ui.port = ui.port;
|
|
79
|
+
if (typeof ui.no_open === "boolean")
|
|
80
|
+
cfg.ui.noOpen = ui.no_open;
|
|
81
|
+
}
|
|
82
|
+
const privacy = section(r.privacy);
|
|
83
|
+
if (privacy) {
|
|
84
|
+
if (typeof privacy.level === "string" && VALID_PRIVACY.has(privacy.level)) {
|
|
85
|
+
cfg.privacy.level =
|
|
86
|
+
privacy.level;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return cfg;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate a commented example config file.
|
|
93
|
+
*/
|
|
94
|
+
export function exampleConfig() {
|
|
95
|
+
return [
|
|
96
|
+
"# Context Lens configuration",
|
|
97
|
+
"# Location: ~/.context-lens/config.toml",
|
|
98
|
+
"# All settings can be overridden with CLI flags.",
|
|
99
|
+
"",
|
|
100
|
+
"[proxy]",
|
|
101
|
+
"# port = 4040",
|
|
102
|
+
'# redact = "secrets" # secrets | pii | strict',
|
|
103
|
+
"# rehydrate = false",
|
|
104
|
+
"",
|
|
105
|
+
"[ui]",
|
|
106
|
+
"# port = 4041",
|
|
107
|
+
"# no_open = false",
|
|
108
|
+
"",
|
|
109
|
+
"[privacy]",
|
|
110
|
+
'# level = "standard" # minimal | standard | full',
|
|
111
|
+
].join("\n");
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/models.d.ts
CHANGED
|
@@ -1,42 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Model metadata re-exported from @contextio/core.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Context-lens inherits pricing, context limits, and cost estimation
|
|
5
|
+
* from the shared contextio package. This file is the single import
|
|
6
|
+
* point so the rest of the codebase doesn't import from @contextio/core
|
|
7
|
+
* directly.
|
|
5
8
|
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Resolve an approximate context window size for a given model string.
|
|
9
|
-
*
|
|
10
|
-
* @param model - Model identifier (often includes version suffixes).
|
|
11
|
-
* @returns Context limit in tokens.
|
|
12
|
-
*/
|
|
13
|
-
export declare function getContextLimit(model: string): number;
|
|
14
|
-
/**
|
|
15
|
-
* Model pricing: `[inputPerMTok, outputPerMTok]` in USD.
|
|
16
|
-
*
|
|
17
|
-
* Keys ordered most-specific-first to avoid substring false matches
|
|
18
|
-
* (e.g. `gpt-4o-mini` before `gpt-4o`, `o3-mini` before `o3`).
|
|
19
|
-
*
|
|
20
|
-
* Prices sourced from OpenRouter (openrouter.ai/api/v1/models) and reflect
|
|
21
|
-
* standard per-token rates as of early 2026. Keys are matched as substrings
|
|
22
|
-
* of the incoming model string, so they work for both direct-API model IDs
|
|
23
|
-
* (e.g. `gemini-2.5-pro`) and OpenRouter-prefixed IDs
|
|
24
|
-
* (e.g. `google/gemini-2.5-pro`).
|
|
25
|
-
*/
|
|
26
|
-
export declare const MODEL_PRICING: Record<string, [number, number]>;
|
|
27
|
-
/**
|
|
28
|
-
* Estimate cost in USD for a request/response token pair using `MODEL_PRICING`.
|
|
29
|
-
*
|
|
30
|
-
* Cache pricing varies by provider:
|
|
31
|
-
* - Anthropic: cache reads at 10% of base input, writes at 25%
|
|
32
|
-
* - Gemini: cached content at 25% of base input, no write cost
|
|
33
|
-
*
|
|
34
|
-
* @param model - Model identifier (substring matched against known keys).
|
|
35
|
-
* @param inputTokens - Input/prompt tokens (non-cached).
|
|
36
|
-
* @param outputTokens - Output/completion tokens.
|
|
37
|
-
* @param cacheReadTokens - Cache read tokens.
|
|
38
|
-
* @param cacheWriteTokens - Cache write tokens.
|
|
39
|
-
* @returns Cost in USD, rounded to 6 decimals; `null` if the model is unknown.
|
|
40
|
-
*/
|
|
41
|
-
export declare function estimateCost(model: string, inputTokens: number, outputTokens: number, cacheReadTokens?: number, cacheWriteTokens?: number): number | null;
|
|
9
|
+
export { CONTEXT_LIMITS, estimateCost, getContextLimit, getKnownModels, MODEL_PRICING, } from "@contextio/core";
|
|
42
10
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
package/dist/core/models.js
CHANGED
|
@@ -1,217 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Model metadata re-exported from @contextio/core.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Context-lens inherits pricing, context limits, and cost estimation
|
|
5
|
+
* from the shared contextio package. This file is the single import
|
|
6
|
+
* point so the rest of the codebase doesn't import from @contextio/core
|
|
7
|
+
* directly.
|
|
5
8
|
*/
|
|
6
|
-
export
|
|
7
|
-
// Anthropic
|
|
8
|
-
"claude-opus-4.6": 1000000,
|
|
9
|
-
"claude-opus-4.5": 200000,
|
|
10
|
-
"claude-opus-4.1": 200000,
|
|
11
|
-
"claude-opus-4": 200000,
|
|
12
|
-
"claude-sonnet-4.6": 1000000,
|
|
13
|
-
"claude-sonnet-4.5": 1000000,
|
|
14
|
-
"claude-sonnet-4": 1000000,
|
|
15
|
-
"claude-haiku-4.5": 200000,
|
|
16
|
-
"claude-haiku-4": 200000,
|
|
17
|
-
"claude-3-7-sonnet": 200000,
|
|
18
|
-
"claude-3-5-sonnet": 200000,
|
|
19
|
-
"claude-3-5-haiku": 200000,
|
|
20
|
-
"claude-3-haiku": 200000,
|
|
21
|
-
"claude-3-opus": 200000,
|
|
22
|
-
// OpenAI — specific variants before generic slugs
|
|
23
|
-
"gpt-5.2-pro": 400000,
|
|
24
|
-
"gpt-5.2-codex": 400000,
|
|
25
|
-
"gpt-5.2-chat": 128000,
|
|
26
|
-
"gpt-5.2": 400000,
|
|
27
|
-
"gpt-5.1-codex-max": 400000,
|
|
28
|
-
"gpt-5.1-codex-mini": 400000,
|
|
29
|
-
"gpt-5.1-codex": 400000,
|
|
30
|
-
"gpt-5.1-chat": 128000,
|
|
31
|
-
"gpt-5.1": 400000,
|
|
32
|
-
"gpt-5.3-codex": 400000,
|
|
33
|
-
"gpt-5-pro": 400000,
|
|
34
|
-
"gpt-5-codex": 400000,
|
|
35
|
-
"gpt-5-chat": 128000,
|
|
36
|
-
"gpt-5-mini": 400000,
|
|
37
|
-
"gpt-5-nano": 400000,
|
|
38
|
-
"gpt-5": 400000,
|
|
39
|
-
"gpt-4.1-mini": 1047576,
|
|
40
|
-
"gpt-4.1-nano": 1047576,
|
|
41
|
-
"gpt-4.1": 1047576,
|
|
42
|
-
"gpt-4o-mini": 128000,
|
|
43
|
-
"gpt-4o": 128000,
|
|
44
|
-
"gpt-4-turbo": 128000,
|
|
45
|
-
"gpt-4": 8192,
|
|
46
|
-
"gpt-3.5-turbo": 16385,
|
|
47
|
-
"o4-mini-deep-research": 200000,
|
|
48
|
-
"o4-mini-high": 200000,
|
|
49
|
-
"o4-mini": 200000,
|
|
50
|
-
"o3-deep-research": 200000,
|
|
51
|
-
"o3-pro": 200000,
|
|
52
|
-
"o3-mini-high": 200000,
|
|
53
|
-
"o3-mini": 200000,
|
|
54
|
-
o3: 200000,
|
|
55
|
-
"o1-pro": 200000,
|
|
56
|
-
"o1-mini": 128000,
|
|
57
|
-
o1: 200000,
|
|
58
|
-
// Google Gemini — specific before generic
|
|
59
|
-
"gemini-3.1-pro-preview": 1048576,
|
|
60
|
-
"gemini-3-pro-preview": 1048576,
|
|
61
|
-
"gemini-3-flash-preview": 1048576,
|
|
62
|
-
"gemini-2.5-pro-preview": 1048576,
|
|
63
|
-
"gemini-2.5-pro": 1048576,
|
|
64
|
-
"gemini-2.5-flash-lite": 1048576,
|
|
65
|
-
"gemini-2.5-flash": 1048576,
|
|
66
|
-
"gemini-2.0-flash-lite": 1048576,
|
|
67
|
-
"gemini-2.0-flash": 1048576,
|
|
68
|
-
"gemini-1.5-pro": 2097152,
|
|
69
|
-
"gemini-1.5-flash": 1048576,
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Resolve an approximate context window size for a given model string.
|
|
73
|
-
*
|
|
74
|
-
* @param model - Model identifier (often includes version suffixes).
|
|
75
|
-
* @returns Context limit in tokens.
|
|
76
|
-
*/
|
|
77
|
-
export function getContextLimit(model) {
|
|
78
|
-
for (const [key, limit] of Object.entries(CONTEXT_LIMITS)) {
|
|
79
|
-
if (model.includes(key))
|
|
80
|
-
return limit;
|
|
81
|
-
}
|
|
82
|
-
return 128000; // default fallback
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Model pricing: `[inputPerMTok, outputPerMTok]` in USD.
|
|
86
|
-
*
|
|
87
|
-
* Keys ordered most-specific-first to avoid substring false matches
|
|
88
|
-
* (e.g. `gpt-4o-mini` before `gpt-4o`, `o3-mini` before `o3`).
|
|
89
|
-
*
|
|
90
|
-
* Prices sourced from OpenRouter (openrouter.ai/api/v1/models) and reflect
|
|
91
|
-
* standard per-token rates as of early 2026. Keys are matched as substrings
|
|
92
|
-
* of the incoming model string, so they work for both direct-API model IDs
|
|
93
|
-
* (e.g. `gemini-2.5-pro`) and OpenRouter-prefixed IDs
|
|
94
|
-
* (e.g. `google/gemini-2.5-pro`).
|
|
95
|
-
*/
|
|
96
|
-
export const MODEL_PRICING = {
|
|
97
|
-
// Anthropic — specific point-releases before generic slugs
|
|
98
|
-
"claude-opus-4.6": [5, 25],
|
|
99
|
-
"claude-opus-4.5": [5, 25],
|
|
100
|
-
"claude-opus-4.1": [15, 75],
|
|
101
|
-
"claude-opus-4": [15, 75],
|
|
102
|
-
"claude-sonnet-4.6": [3, 15],
|
|
103
|
-
"claude-sonnet-4.5": [3, 15],
|
|
104
|
-
"claude-sonnet-4": [3, 15],
|
|
105
|
-
"claude-haiku-4.5": [1, 5],
|
|
106
|
-
"claude-haiku-4": [0.8, 4],
|
|
107
|
-
"claude-3-7-sonnet": [3, 15],
|
|
108
|
-
"claude-3-5-sonnet": [3, 15],
|
|
109
|
-
"claude-3-5-haiku": [0.8, 4],
|
|
110
|
-
"claude-3-haiku": [0.25, 1.25],
|
|
111
|
-
"claude-3-opus": [15, 75],
|
|
112
|
-
// OpenAI — specific variants before generic slugs
|
|
113
|
-
"gpt-5.2-pro": [21, 168],
|
|
114
|
-
"gpt-5.2-codex": [1.75, 14],
|
|
115
|
-
"gpt-5.2-chat": [1.75, 14],
|
|
116
|
-
"gpt-5.2": [1.75, 14],
|
|
117
|
-
"gpt-5.1-codex-max": [1.25, 10],
|
|
118
|
-
"gpt-5.1-codex-mini": [0.25, 2],
|
|
119
|
-
"gpt-5.1-codex": [1.25, 10],
|
|
120
|
-
"gpt-5.1-chat": [1.25, 10],
|
|
121
|
-
"gpt-5.1": [1.25, 10],
|
|
122
|
-
// Codex subscription estimates
|
|
123
|
-
"gpt-5.3-codex": [1.75, 14],
|
|
124
|
-
"gpt-5-pro": [15, 120],
|
|
125
|
-
"gpt-5-codex": [1.25, 10],
|
|
126
|
-
"gpt-5-chat": [1.25, 10],
|
|
127
|
-
"gpt-5-mini": [0.25, 2],
|
|
128
|
-
"gpt-5-nano": [0.05, 0.4],
|
|
129
|
-
"gpt-5": [1.25, 10],
|
|
130
|
-
"gpt-4.1-mini": [0.4, 1.6],
|
|
131
|
-
"gpt-4.1-nano": [0.1, 0.4],
|
|
132
|
-
"gpt-4.1": [2.0, 8.0],
|
|
133
|
-
"gpt-4o-mini": [0.15, 0.6],
|
|
134
|
-
"gpt-4o": [2.5, 10],
|
|
135
|
-
"gpt-4-turbo": [10, 30],
|
|
136
|
-
"gpt-4": [30, 60],
|
|
137
|
-
"gpt-3.5-turbo": [0.5, 1.5],
|
|
138
|
-
"o4-mini-deep-research": [2, 8],
|
|
139
|
-
"o4-mini-high": [1.1, 4.4],
|
|
140
|
-
"o4-mini": [1.1, 4.4],
|
|
141
|
-
"o3-deep-research": [10, 40],
|
|
142
|
-
"o3-pro": [20, 80],
|
|
143
|
-
"o3-mini-high": [1.1, 4.4],
|
|
144
|
-
"o3-mini": [1.1, 4.4],
|
|
145
|
-
o3: [2, 8],
|
|
146
|
-
"o1-pro": [150, 600],
|
|
147
|
-
"o1-mini": [3, 12],
|
|
148
|
-
o1: [15, 60],
|
|
149
|
-
// Google Gemini — specific before generic
|
|
150
|
-
"gemini-3.1-pro-preview": [2, 12],
|
|
151
|
-
"gemini-3-pro-preview": [2, 12],
|
|
152
|
-
"gemini-3-flash-preview": [0.5, 3],
|
|
153
|
-
"gemini-2.5-pro-preview": [1.25, 10],
|
|
154
|
-
"gemini-2.5-pro": [1.25, 10],
|
|
155
|
-
"gemini-2.5-flash-lite": [0.1, 0.4],
|
|
156
|
-
"gemini-2.5-flash": [0.3, 2.5],
|
|
157
|
-
"gemini-2.0-flash-lite": [0.075, 0.3],
|
|
158
|
-
"gemini-2.0-flash": [0.1, 0.4],
|
|
159
|
-
"gemini-1.5-pro": [1.25, 5],
|
|
160
|
-
"gemini-1.5-flash": [0.075, 0.3],
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* Cache pricing multipliers by provider prefix.
|
|
164
|
-
*
|
|
165
|
-
* Each entry maps a model key prefix to `[readMultiplier, writeMultiplier]`
|
|
166
|
-
* relative to the base input price. For example, Anthropic charges 10% of
|
|
167
|
-
* the base input rate for cache reads and 25% for cache writes.
|
|
168
|
-
*
|
|
169
|
-
* Gemini charges 25% of base input for cached content (reads). Gemini has
|
|
170
|
-
* no separate "cache write" billing; context caching cost is handled
|
|
171
|
-
* outside the per-request pricing.
|
|
172
|
-
*/
|
|
173
|
-
const CACHE_PRICING = {
|
|
174
|
-
"claude-": [0.1, 0.25],
|
|
175
|
-
"gemini-": [0.25, 0],
|
|
176
|
-
};
|
|
177
|
-
/**
|
|
178
|
-
* Look up cache pricing multipliers for a model key.
|
|
179
|
-
*/
|
|
180
|
-
function getCacheMultipliers(modelKey) {
|
|
181
|
-
for (const [prefix, multipliers] of Object.entries(CACHE_PRICING)) {
|
|
182
|
-
if (modelKey.startsWith(prefix))
|
|
183
|
-
return multipliers;
|
|
184
|
-
}
|
|
185
|
-
return [0, 0];
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Estimate cost in USD for a request/response token pair using `MODEL_PRICING`.
|
|
189
|
-
*
|
|
190
|
-
* Cache pricing varies by provider:
|
|
191
|
-
* - Anthropic: cache reads at 10% of base input, writes at 25%
|
|
192
|
-
* - Gemini: cached content at 25% of base input, no write cost
|
|
193
|
-
*
|
|
194
|
-
* @param model - Model identifier (substring matched against known keys).
|
|
195
|
-
* @param inputTokens - Input/prompt tokens (non-cached).
|
|
196
|
-
* @param outputTokens - Output/completion tokens.
|
|
197
|
-
* @param cacheReadTokens - Cache read tokens.
|
|
198
|
-
* @param cacheWriteTokens - Cache write tokens.
|
|
199
|
-
* @returns Cost in USD, rounded to 6 decimals; `null` if the model is unknown.
|
|
200
|
-
*/
|
|
201
|
-
export function estimateCost(model, inputTokens, outputTokens, cacheReadTokens = 0, cacheWriteTokens = 0) {
|
|
202
|
-
for (const [key, [inp, out]] of Object.entries(MODEL_PRICING)) {
|
|
203
|
-
if (model.includes(key)) {
|
|
204
|
-
const [readMul, writeMul] = getCacheMultipliers(key);
|
|
205
|
-
const cacheReadCost = cacheReadTokens * inp * readMul;
|
|
206
|
-
const cacheWriteCost = cacheWriteTokens * inp * writeMul;
|
|
207
|
-
return (Math.round(((inputTokens * inp +
|
|
208
|
-
outputTokens * out +
|
|
209
|
-
cacheReadCost +
|
|
210
|
-
cacheWriteCost) /
|
|
211
|
-
1_000_000) *
|
|
212
|
-
1_000_000) / 1_000_000);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
9
|
+
export { CONTEXT_LIMITS, estimateCost, getContextLimit, getKnownModels, MODEL_PRICING, } from "@contextio/core";
|
|
217
10
|
//# sourceMappingURL=models.js.map
|
package/dist/core/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -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,
|
|
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"}
|
package/dist/core/routing.js
CHANGED
|
@@ -157,7 +157,13 @@ export function resolveTargetUrl(parsedUrl, headers, upstreams) {
|
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
else {
|
|
160
|
-
|
|
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")) {
|
package/dist/core/routing.js.map
CHANGED
|
@@ -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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"}
|
package/dist/http/headers.d.ts
CHANGED
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Header redaction utilities for captures and LHAR export.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
15
|
-
*
|
|
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,
|
|
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"}
|
package/dist/http/headers.js
CHANGED
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Header redaction utilities for captures and LHAR export.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
*
|
|
27
|
-
*
|
|
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
|
package/dist/http/headers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,
|
|
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":"config.d.ts","sourceRoot":"","sources":["../../src/proxy/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,eAAe,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/proxy/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,eAAe,IAAI,WAAW,CAuD7C"}
|
package/dist/proxy/config.js
CHANGED
|
@@ -21,7 +21,20 @@ export function loadProxyConfig() {
|
|
|
21
21
|
const bindHost = process.env.CONTEXT_LENS_BIND_HOST || "127.0.0.1";
|
|
22
22
|
const port = parseInt(process.env.CONTEXT_LENS_PROXY_PORT || "4040", 10);
|
|
23
23
|
// Do not honor `x-target-url` unless explicitly enabled.
|
|
24
|
+
// Intended for Docker multi-container setups where the analysis server
|
|
25
|
+
// sends captures back through the proxy at a known upstream URL.
|
|
26
|
+
//
|
|
27
|
+
// WARNING: combining this with a non-loopback bind host lets any client
|
|
28
|
+
// on the network redirect proxy traffic to arbitrary URLs (SSRF). Only
|
|
29
|
+
// set both when the proxy is on a private Docker bridge with no external
|
|
30
|
+
// exposure.
|
|
24
31
|
const allowTargetOverride = process.env.CONTEXT_LENS_ALLOW_TARGET_OVERRIDE === "1";
|
|
32
|
+
const loopbackHosts = ["127.0.0.1", "::1", "localhost"];
|
|
33
|
+
if (allowTargetOverride && !loopbackHosts.includes(bindHost)) {
|
|
34
|
+
console.warn("Warning: CONTEXT_LENS_ALLOW_TARGET_OVERRIDE=1 is set with a non-loopback " +
|
|
35
|
+
`bind host (${bindHost}). Any client that can reach the proxy can redirect ` +
|
|
36
|
+
"requests to arbitrary URLs. Only use this on a private Docker bridge network.");
|
|
37
|
+
}
|
|
25
38
|
const captureDir = process.env.CONTEXT_LENS_CAPTURE_DIR ||
|
|
26
39
|
join(homedir(), ".context-lens", "captures");
|
|
27
40
|
const ingestUrl = process.env.CONTEXT_LENS_INGEST_URL || null;
|
package/dist/proxy/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/proxy/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAc;QAC3B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB;QACnE,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,2BAA2B;QACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,qBAAqB;QAClE,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,2CAA2C;QAC7C,gBAAgB,EACd,OAAO,CAAC,GAAG,CAAC,+BAA+B;YAC3C,qCAAqC;QACvC,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,+CAA+C;KAClD,CAAC;IAEF,uDAAuD;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,WAAW,CAAC;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAEzE,yDAAyD;IACzD,MAAM,mBAAmB,GACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,GAAG,CAAC;IAEzD,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC;IAE9D,OAAO;QACL,SAAS;QACT,QAAQ;QACR,IAAI;QACJ,mBAAmB;QACnB,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/proxy/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAc;QAC3B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB;QACnE,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,2BAA2B;QACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,qBAAqB;QAClE,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,2CAA2C;QAC7C,gBAAgB,EACd,OAAO,CAAC,GAAG,CAAC,+BAA+B;YAC3C,qCAAqC;QACvC,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,+CAA+C;KAClD,CAAC;IAEF,uDAAuD;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,WAAW,CAAC;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAEzE,yDAAyD;IACzD,uEAAuE;IACvE,iEAAiE;IACjE,EAAE;IACF,wEAAwE;IACxE,uEAAuE;IACvE,yEAAyE;IACzE,YAAY;IACZ,MAAM,mBAAmB,GACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,GAAG,CAAC;IAEzD,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,IAAI,mBAAmB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CACV,2EAA2E;YACzE,cAAc,QAAQ,sDAAsD;YAC5E,+EAA+E,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC;IAE9D,OAAO;QACL,SAAS;QACT,QAAQ;QACR,IAAI;QACJ,mBAAmB;QACnB,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC"}
|
package/dist/proxy/server.js
CHANGED
|
@@ -15,6 +15,25 @@
|
|
|
15
15
|
import { createProxy } from "@contextio/proxy";
|
|
16
16
|
import { createCaptureIngestor, createCaptureWriter } from "./capture.js";
|
|
17
17
|
import { loadProxyConfig } from "./config.js";
|
|
18
|
+
async function loadRedactPlugin() {
|
|
19
|
+
const preset = process.env.CONTEXT_LENS_REDACT;
|
|
20
|
+
if (!preset)
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const { createRedactPlugin } = await import("@contextio/redact");
|
|
24
|
+
const reversible = process.env.CONTEXT_LENS_REHYDRATE === "1";
|
|
25
|
+
const plugin = createRedactPlugin({
|
|
26
|
+
preset: preset,
|
|
27
|
+
reversible,
|
|
28
|
+
});
|
|
29
|
+
console.log(`🔒 Redaction enabled (preset: ${preset}, ${reversible ? "reversible" : "one-way"})`);
|
|
30
|
+
return plugin;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error("Failed to load redact plugin:", err instanceof Error ? err.message : String(err));
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
18
37
|
async function loadPluginsFromEnv() {
|
|
19
38
|
const pluginsEnv = process.env.CONTEXT_LENS_PROXY_PLUGINS;
|
|
20
39
|
if (!pluginsEnv)
|
|
@@ -57,6 +76,9 @@ async function loadPluginsFromEnv() {
|
|
|
57
76
|
async function main() {
|
|
58
77
|
const config = loadProxyConfig();
|
|
59
78
|
const plugins = await loadPluginsFromEnv();
|
|
79
|
+
const redactPlugin = await loadRedactPlugin();
|
|
80
|
+
if (redactPlugin)
|
|
81
|
+
plugins.unshift(redactPlugin);
|
|
60
82
|
// Add a capture plugin that either writes to disk or POSTs to ingest URL.
|
|
61
83
|
let onCapture;
|
|
62
84
|
if (config.ingestUrl) {
|