context-lens 0.2.0 → 0.2.1
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 +62 -17
- package/dist/cli-utils.d.ts +1 -1
- package/dist/cli-utils.d.ts.map +1 -1
- package/dist/cli-utils.js +28 -13
- package/dist/cli-utils.js.map +1 -1
- package/dist/cli.js +77 -65
- package/dist/cli.js.map +1 -1
- package/dist/core/conversation.d.ts +54 -0
- package/dist/core/conversation.d.ts.map +1 -0
- package/dist/core/conversation.js +188 -0
- package/dist/core/conversation.js.map +1 -0
- package/dist/core/models.d.ts +30 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +96 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/parse.d.ts +17 -0
- package/dist/core/parse.d.ts.map +1 -0
- package/dist/core/parse.js +349 -0
- package/dist/core/parse.js.map +1 -0
- package/dist/core/routing.d.ts +47 -0
- package/dist/core/routing.d.ts.map +1 -0
- package/dist/core/routing.js +132 -0
- package/dist/core/routing.js.map +1 -0
- package/dist/core/source.d.ts +22 -0
- package/dist/core/source.d.ts.map +1 -0
- package/dist/core/source.js +56 -0
- package/dist/core/source.js.map +1 -0
- package/dist/core/tokens.d.ts +11 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/core/tokens.js +16 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core.d.ts +12 -22
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +12 -471
- package/dist/core.js.map +1 -1
- package/dist/http/headers.d.ts +25 -0
- package/dist/http/headers.d.ts.map +1 -0
- package/dist/http/headers.js +54 -0
- package/dist/http/headers.js.map +1 -0
- package/dist/lhar-types.generated.d.ts +1 -1
- package/dist/lhar.d.ts +4 -4
- package/dist/lhar.d.ts.map +1 -1
- package/dist/lhar.js +190 -106
- package/dist/lhar.js.map +1 -1
- package/dist/server/config.d.ts +12 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +33 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/projection.d.ts +9 -0
- package/dist/server/projection.d.ts.map +1 -0
- package/dist/server/projection.js +39 -0
- package/dist/server/projection.js.map +1 -0
- package/dist/server/proxy.d.ts +13 -0
- package/dist/server/proxy.d.ts.map +1 -0
- package/dist/server/proxy.js +232 -0
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/store.d.ts +33 -0
- package/dist/server/store.d.ts.map +1 -0
- package/dist/server/store.js +350 -0
- package/dist/server/store.js.map +1 -0
- package/dist/server/webui.d.ts +5 -0
- package/dist/server/webui.d.ts.map +1 -0
- package/dist/server/webui.js +170 -0
- package/dist/server/webui.js.map +1 -0
- package/dist/server-utils.d.ts +2 -2
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +12 -21
- package/dist/server-utils.js.map +1 -1
- package/dist/server.js +30 -697
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +50 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/version.generated.d.ts +2 -0
- package/dist/version.generated.d.ts.map +1 -0
- package/dist/version.generated.js +2 -0
- package/dist/version.generated.js.map +1 -0
- package/package.json +18 -6
- package/public/index.html +39 -12
- package/schema/lhar.schema.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAIpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight token estimator used throughout Context Lens.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally simple and model-agnostic: we approximate tokens as `ceil(chars / 4)`.
|
|
5
|
+
* It is good enough for rough context utilization and relative comparisons.
|
|
6
|
+
*
|
|
7
|
+
* @param text - Value to estimate tokens for. Objects are stringified as JSON.
|
|
8
|
+
* @returns Estimated token count (>= 0).
|
|
9
|
+
*/
|
|
10
|
+
export function estimateTokens(text) {
|
|
11
|
+
if (!text)
|
|
12
|
+
return 0;
|
|
13
|
+
const s = typeof text === "object" ? JSON.stringify(text) : String(text);
|
|
14
|
+
return Math.ceil(s.length / 4);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/core.d.ts
CHANGED
|
@@ -1,23 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export declare function extractSource(pathname: string): ExtractSourceResult;
|
|
14
|
-
export declare function resolveTargetUrl(parsedUrl: ParsedUrl, headers: Record<string, string | undefined>, upstreams: Upstreams): ResolveTargetResult;
|
|
15
|
-
export declare function extractReadableText(content: string | null | undefined): string | null;
|
|
16
|
-
export declare function extractWorkingDirectory(contextInfo: ContextInfo): string | null;
|
|
17
|
-
export declare function extractUserPrompt(messages: ParsedMessage[]): string | null;
|
|
18
|
-
export declare function extractSessionId(rawBody: Record<string, any> | null | undefined): string | null;
|
|
19
|
-
export declare function computeAgentKey(contextInfo: ContextInfo): string | null;
|
|
20
|
-
export declare function computeFingerprint(contextInfo: ContextInfo, rawBody: Record<string, any> | null | undefined, responseIdToConvo: Map<string, string>): string | null;
|
|
21
|
-
export declare function extractConversationLabel(contextInfo: ContextInfo): string;
|
|
22
|
-
export declare function detectSource(contextInfo: ContextInfo, source: string | null, headers?: Record<string, string>): string;
|
|
1
|
+
/**
|
|
2
|
+
* Public "core" API for Context Lens.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally a thin facade: other parts of the codebase import from here,
|
|
5
|
+
* while implementations live in `src/core/*` to keep concerns separated.
|
|
6
|
+
*/
|
|
7
|
+
export { computeAgentKey, computeFingerprint, extractConversationLabel, extractReadableText, extractSessionId, extractUserPrompt, extractWorkingDirectory, } from "./core/conversation.js";
|
|
8
|
+
export { estimateCost, getContextLimit, } from "./core/models.js";
|
|
9
|
+
export { parseContextInfo } from "./core/parse.js";
|
|
10
|
+
export { detectApiFormat, detectProvider, extractSource, resolveTargetUrl, } from "./core/routing.js";
|
|
11
|
+
export { detectSource } from "./core/source.js";
|
|
12
|
+
export { estimateTokens } from "./core/tokens.js";
|
|
23
13
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"
|
|
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,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,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,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/core.js
CHANGED
|
@@ -1,472 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'gpt-4o': 128000,
|
|
14
|
-
'gpt-4-turbo': 128000,
|
|
15
|
-
'gpt-4': 8192,
|
|
16
|
-
'gpt-3.5-turbo': 16385,
|
|
17
|
-
'o4-mini': 200000,
|
|
18
|
-
'o3-mini': 200000,
|
|
19
|
-
'o3': 200000,
|
|
20
|
-
'o1-mini': 128000,
|
|
21
|
-
'o1': 200000,
|
|
22
|
-
};
|
|
23
|
-
// Auto-detect source tool from request headers (primary)
|
|
24
|
-
export const HEADER_SIGNATURES = [
|
|
25
|
-
{ header: 'user-agent', pattern: /^claude-cli\//, source: 'claude' },
|
|
26
|
-
{ header: 'user-agent', pattern: /aider/i, source: 'aider' },
|
|
27
|
-
{ header: 'user-agent', pattern: /kimi/i, source: 'kimi' },
|
|
28
|
-
];
|
|
29
|
-
// Auto-detect source tool from system prompt (fallback)
|
|
30
|
-
export const SOURCE_SIGNATURES = [
|
|
31
|
-
{ pattern: 'Act as an expert software developer', source: 'aider' },
|
|
32
|
-
{ pattern: 'You are Claude Code', source: 'claude' },
|
|
33
|
-
{ pattern: 'You are Kimi Code CLI', source: 'kimi' },
|
|
34
|
-
];
|
|
35
|
-
// Known API path segments — not treated as source prefixes
|
|
36
|
-
export const API_PATH_SEGMENTS = new Set([
|
|
37
|
-
'v1', 'responses', 'chat', 'models', 'embeddings', 'backend-api', 'api',
|
|
38
|
-
]);
|
|
39
|
-
// Simple token estimation: chars / 4
|
|
40
|
-
export function estimateTokens(text) {
|
|
41
|
-
if (!text)
|
|
42
|
-
return 0;
|
|
43
|
-
const s = typeof text === 'object' ? JSON.stringify(text) : String(text);
|
|
44
|
-
return Math.ceil(s.length / 4);
|
|
45
|
-
}
|
|
46
|
-
// Detect provider from request
|
|
47
|
-
export function detectProvider(pathname, headers) {
|
|
48
|
-
if (pathname.match(/^\/(api|backend-api)\//))
|
|
49
|
-
return 'chatgpt';
|
|
50
|
-
if (pathname.includes('/v1/messages') || pathname.includes('/v1/complete'))
|
|
51
|
-
return 'anthropic';
|
|
52
|
-
if (headers['anthropic-version'])
|
|
53
|
-
return 'anthropic';
|
|
54
|
-
if (pathname.match(/\/(responses|chat\/completions|models|embeddings)/))
|
|
55
|
-
return 'openai';
|
|
56
|
-
if (headers['authorization']?.startsWith('Bearer sk-'))
|
|
57
|
-
return 'openai';
|
|
58
|
-
return 'unknown';
|
|
59
|
-
}
|
|
60
|
-
// Detect which API format is being used
|
|
61
|
-
export function detectApiFormat(pathname) {
|
|
62
|
-
if (pathname.includes('/v1/messages'))
|
|
63
|
-
return 'anthropic-messages';
|
|
64
|
-
if (pathname.match(/^\/(api|backend-api)\//))
|
|
65
|
-
return 'chatgpt-backend';
|
|
66
|
-
if (pathname.includes('/responses'))
|
|
67
|
-
return 'responses';
|
|
68
|
-
if (pathname.includes('/chat/completions'))
|
|
69
|
-
return 'chat-completions';
|
|
70
|
-
return 'unknown';
|
|
71
|
-
}
|
|
72
|
-
// Parse a single item from the OpenAI Responses API `input` array.
|
|
73
|
-
// Maps typed items (function_call, function_call_output, reasoning, output_text, etc.)
|
|
74
|
-
// to normalized ParsedMessage with proper role and contentBlocks.
|
|
75
|
-
function parseResponsesItem(item) {
|
|
76
|
-
const type = item.type || '';
|
|
77
|
-
// Standard message with role/content (e.g. {"type":"message","role":"user","content":[...]})
|
|
78
|
-
if (item.role) {
|
|
79
|
-
const isSystem = item.role === 'system' || item.role === 'developer';
|
|
80
|
-
let content;
|
|
81
|
-
let contentBlocks = null;
|
|
82
|
-
if (typeof item.content === 'string') {
|
|
83
|
-
content = item.content;
|
|
84
|
-
}
|
|
85
|
-
else if (Array.isArray(item.content)) {
|
|
86
|
-
contentBlocks = item.content;
|
|
87
|
-
content = item.content.map((b) => b.text || '').join('\n');
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
content = JSON.stringify(item.content || item);
|
|
91
|
-
}
|
|
92
|
-
const tokens = estimateTokens(item.content ?? content);
|
|
93
|
-
return { message: { role: item.role, content, contentBlocks, tokens }, tokens, isSystem, content };
|
|
94
|
-
}
|
|
95
|
-
// function_call → assistant tool_use
|
|
96
|
-
if (type === 'function_call' || type === 'custom_tool_call') {
|
|
97
|
-
const name = item.name || 'unknown';
|
|
98
|
-
const args = item.arguments || '';
|
|
99
|
-
const content = name + '(' + (typeof args === 'string' ? args.slice(0, 200) : JSON.stringify(args).slice(0, 200)) + ')';
|
|
100
|
-
const tokens = estimateTokens(item);
|
|
101
|
-
const block = { type: 'tool_use', id: item.call_id || '', name, input: typeof args === 'string' ? {} : (args || {}) };
|
|
102
|
-
return { message: { role: 'assistant', content, contentBlocks: [block], tokens }, tokens, isSystem: false, content };
|
|
103
|
-
}
|
|
104
|
-
// function_call_output → user tool_result
|
|
105
|
-
if (type === 'function_call_output' || type === 'custom_tool_call_output') {
|
|
106
|
-
const output = typeof item.output === 'string' ? item.output : JSON.stringify(item.output || '');
|
|
107
|
-
const tokens = estimateTokens(output);
|
|
108
|
-
const block = { type: 'tool_result', tool_use_id: item.call_id || '', content: output };
|
|
109
|
-
return { message: { role: 'user', content: output, contentBlocks: [block], tokens }, tokens, isSystem: false, content: output };
|
|
110
|
-
}
|
|
111
|
-
// reasoning → assistant thinking
|
|
112
|
-
if (type === 'reasoning') {
|
|
113
|
-
const summary = Array.isArray(item.summary)
|
|
114
|
-
? item.summary.map((s) => s.text || '').join('\n')
|
|
115
|
-
: '';
|
|
116
|
-
const content = summary || '[reasoning]';
|
|
117
|
-
const tokens = estimateTokens(item);
|
|
118
|
-
return { message: { role: 'assistant', content, contentBlocks: [{ type: 'thinking', thinking: content }], tokens }, tokens, isSystem: false, content };
|
|
119
|
-
}
|
|
120
|
-
// output_text → assistant text
|
|
121
|
-
if (type === 'output_text') {
|
|
122
|
-
const text = item.text || '';
|
|
123
|
-
const tokens = estimateTokens(text);
|
|
124
|
-
return { message: { role: 'assistant', content: text, contentBlocks: [{ type: 'text', text }], tokens }, tokens, isSystem: false, content: text };
|
|
125
|
-
}
|
|
126
|
-
// input_text → user text
|
|
127
|
-
if (type === 'input_text') {
|
|
128
|
-
const text = item.text || '';
|
|
129
|
-
const tokens = estimateTokens(text);
|
|
130
|
-
return { message: { role: 'user', content: text, contentBlocks: [{ type: 'text', text }], tokens }, tokens, isSystem: false, content: text };
|
|
131
|
-
}
|
|
132
|
-
// Fallback: serialize the whole item
|
|
133
|
-
const content = JSON.stringify(item);
|
|
134
|
-
const tokens = estimateTokens(content);
|
|
135
|
-
return { message: { role: item.role || 'user', content, tokens }, tokens, isSystem: false, content };
|
|
136
|
-
}
|
|
137
|
-
// Parse request body and extract context info
|
|
138
|
-
export function parseContextInfo(provider, body, apiFormat) {
|
|
139
|
-
const info = {
|
|
140
|
-
provider,
|
|
141
|
-
apiFormat,
|
|
142
|
-
model: body.model || 'unknown',
|
|
143
|
-
systemTokens: 0,
|
|
144
|
-
toolsTokens: 0,
|
|
145
|
-
messagesTokens: 0,
|
|
146
|
-
totalTokens: 0,
|
|
147
|
-
systemPrompts: [],
|
|
148
|
-
tools: [],
|
|
149
|
-
messages: [],
|
|
150
|
-
};
|
|
151
|
-
if (provider === 'anthropic') {
|
|
152
|
-
if (body.system) {
|
|
153
|
-
const systemText = typeof body.system === 'string'
|
|
154
|
-
? body.system
|
|
155
|
-
: Array.isArray(body.system)
|
|
156
|
-
? body.system.map((b) => b.text || '').join('\n')
|
|
157
|
-
: JSON.stringify(body.system);
|
|
158
|
-
info.systemPrompts.push({ content: systemText });
|
|
159
|
-
info.systemTokens = estimateTokens(systemText);
|
|
160
|
-
}
|
|
161
|
-
if (body.tools && Array.isArray(body.tools)) {
|
|
162
|
-
info.tools = body.tools;
|
|
163
|
-
info.toolsTokens = estimateTokens(JSON.stringify(body.tools));
|
|
164
|
-
}
|
|
165
|
-
if (body.messages && Array.isArray(body.messages)) {
|
|
166
|
-
info.messages = body.messages.map((msg) => {
|
|
167
|
-
const contentBlocks = Array.isArray(msg.content) ? msg.content : null;
|
|
168
|
-
return {
|
|
169
|
-
role: msg.role,
|
|
170
|
-
content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
|
|
171
|
-
contentBlocks,
|
|
172
|
-
tokens: estimateTokens(msg.content),
|
|
173
|
-
};
|
|
174
|
-
});
|
|
175
|
-
info.messagesTokens = info.messages.reduce((sum, m) => sum + m.tokens, 0);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else if (apiFormat === 'responses' || provider === 'chatgpt') {
|
|
179
|
-
// System prompts
|
|
180
|
-
if (body.instructions) {
|
|
181
|
-
info.systemPrompts.push({ content: body.instructions });
|
|
182
|
-
info.systemTokens = estimateTokens(body.instructions);
|
|
183
|
-
}
|
|
184
|
-
if (body.system) {
|
|
185
|
-
const systemText = typeof body.system === 'string'
|
|
186
|
-
? body.system
|
|
187
|
-
: Array.isArray(body.system)
|
|
188
|
-
? body.system.map((b) => b.text || '').join('\n')
|
|
189
|
-
: JSON.stringify(body.system);
|
|
190
|
-
info.systemPrompts.push({ content: systemText });
|
|
191
|
-
info.systemTokens += estimateTokens(systemText);
|
|
192
|
-
}
|
|
193
|
-
// Parse input/messages — handle Responses API typed items
|
|
194
|
-
const msgs = body.input || body.messages;
|
|
195
|
-
if (msgs) {
|
|
196
|
-
if (typeof msgs === 'string') {
|
|
197
|
-
info.messages.push({ role: 'user', content: msgs, tokens: estimateTokens(msgs) });
|
|
198
|
-
info.messagesTokens = estimateTokens(msgs);
|
|
199
|
-
}
|
|
200
|
-
else if (Array.isArray(msgs)) {
|
|
201
|
-
msgs.forEach((item) => {
|
|
202
|
-
const parsed = parseResponsesItem(item);
|
|
203
|
-
if (parsed.isSystem) {
|
|
204
|
-
info.systemPrompts.push({ content: parsed.content });
|
|
205
|
-
info.systemTokens += parsed.tokens;
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
info.messages.push(parsed.message);
|
|
209
|
-
info.messagesTokens += parsed.tokens;
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
if (body.tools && Array.isArray(body.tools)) {
|
|
215
|
-
info.tools = body.tools;
|
|
216
|
-
info.toolsTokens = estimateTokens(JSON.stringify(body.tools));
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else if (provider === 'openai') {
|
|
220
|
-
if (body.messages && Array.isArray(body.messages)) {
|
|
221
|
-
body.messages.forEach((msg) => {
|
|
222
|
-
if (msg.role === 'system' || msg.role === 'developer') {
|
|
223
|
-
info.systemPrompts.push({ content: msg.content });
|
|
224
|
-
info.systemTokens += estimateTokens(msg.content);
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
info.messages.push({
|
|
228
|
-
role: msg.role,
|
|
229
|
-
content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
|
|
230
|
-
tokens: estimateTokens(msg.content),
|
|
231
|
-
});
|
|
232
|
-
info.messagesTokens += estimateTokens(msg.content);
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
if (body.tools && Array.isArray(body.tools)) {
|
|
237
|
-
info.tools = body.tools;
|
|
238
|
-
info.toolsTokens = estimateTokens(JSON.stringify(body.tools));
|
|
239
|
-
}
|
|
240
|
-
else if (body.functions && Array.isArray(body.functions)) {
|
|
241
|
-
info.tools = body.functions;
|
|
242
|
-
info.toolsTokens = estimateTokens(JSON.stringify(body.functions));
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
info.totalTokens = info.systemTokens + info.toolsTokens + info.messagesTokens;
|
|
246
|
-
return info;
|
|
247
|
-
}
|
|
248
|
-
// Get context limit for model
|
|
249
|
-
export function getContextLimit(model) {
|
|
250
|
-
for (const [key, limit] of Object.entries(CONTEXT_LIMITS)) {
|
|
251
|
-
if (model.includes(key))
|
|
252
|
-
return limit;
|
|
253
|
-
}
|
|
254
|
-
return 128000; // default fallback
|
|
255
|
-
}
|
|
256
|
-
// Model pricing: [inputPerMTok, outputPerMTok] in USD
|
|
257
|
-
// Keys ordered most-specific-first to avoid substring false matches (e.g. gpt-4o-mini before gpt-4o)
|
|
258
|
-
export const MODEL_PRICING = {
|
|
259
|
-
'claude-opus-4': [15, 75],
|
|
260
|
-
'claude-sonnet-4': [3, 15],
|
|
261
|
-
'claude-haiku-4': [0.80, 4],
|
|
262
|
-
'claude-3-5-sonnet': [3, 15],
|
|
263
|
-
'claude-3-5-haiku': [0.80, 4],
|
|
264
|
-
'claude-3-opus': [15, 75],
|
|
265
|
-
'gpt-4o-mini': [0.15, 0.60],
|
|
266
|
-
'gpt-4o': [2.50, 10],
|
|
267
|
-
'gpt-4-turbo': [10, 30],
|
|
268
|
-
'gpt-4': [30, 60],
|
|
269
|
-
'o4-mini': [1.10, 4.40],
|
|
270
|
-
'o3-mini': [1.10, 4.40],
|
|
271
|
-
'o3': [10, 40],
|
|
272
|
-
'o1-mini': [3, 12],
|
|
273
|
-
'o1': [15, 60],
|
|
274
|
-
};
|
|
275
|
-
export function estimateCost(model, inputTokens, outputTokens) {
|
|
276
|
-
for (const [key, [inp, out]] of Object.entries(MODEL_PRICING)) {
|
|
277
|
-
if (model.includes(key)) {
|
|
278
|
-
return Math.round((inputTokens * inp + outputTokens * out) / 1_000_000 * 1_000_000) / 1_000_000;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
283
|
-
// Extract source tag from URL path
|
|
284
|
-
export function extractSource(pathname) {
|
|
285
|
-
const match = pathname.match(/^\/([^/]+)(\/.*)?$/);
|
|
286
|
-
if (match && match[2] && !API_PATH_SEGMENTS.has(match[1])) {
|
|
287
|
-
// `decodeURIComponent` may introduce `/` via `%2f` (path traversal) or throw on bad encodings.
|
|
288
|
-
// Treat suspicious/invalid tags as "no source tag" and route the request normally.
|
|
289
|
-
let decoded = match[1];
|
|
290
|
-
try {
|
|
291
|
-
decoded = decodeURIComponent(match[1]);
|
|
292
|
-
}
|
|
293
|
-
catch {
|
|
294
|
-
decoded = match[1];
|
|
295
|
-
}
|
|
296
|
-
if (decoded.includes('/') || decoded.includes('\\') || decoded.includes('..')) {
|
|
297
|
-
return { source: null, cleanPath: pathname };
|
|
298
|
-
}
|
|
299
|
-
return { source: decoded, cleanPath: match[2] || '/' };
|
|
300
|
-
}
|
|
301
|
-
return { source: null, cleanPath: pathname };
|
|
302
|
-
}
|
|
303
|
-
// Determine target URL for a request
|
|
304
|
-
export function resolveTargetUrl(parsedUrl, headers, upstreams) {
|
|
305
|
-
const provider = detectProvider(parsedUrl.pathname, headers);
|
|
306
|
-
const search = parsedUrl.search || '';
|
|
307
|
-
let targetUrl = headers['x-target-url'];
|
|
308
|
-
if (!targetUrl) {
|
|
309
|
-
if (provider === 'chatgpt') {
|
|
310
|
-
targetUrl = upstreams.chatgpt + parsedUrl.pathname + search;
|
|
311
|
-
}
|
|
312
|
-
else if (provider === 'anthropic') {
|
|
313
|
-
targetUrl = upstreams.anthropic + parsedUrl.pathname + search;
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
targetUrl = upstreams.openai + parsedUrl.pathname + search;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else if (!targetUrl.startsWith('http')) {
|
|
320
|
-
targetUrl = targetUrl + parsedUrl.pathname + search;
|
|
321
|
-
}
|
|
322
|
-
return { targetUrl, provider };
|
|
323
|
-
}
|
|
324
|
-
// Extract readable text from message content, stripping JSON wrappers and system-reminder blocks
|
|
325
|
-
export function extractReadableText(content) {
|
|
326
|
-
if (!content)
|
|
327
|
-
return null;
|
|
328
|
-
let text = content;
|
|
329
|
-
try {
|
|
330
|
-
const parsed = JSON.parse(text);
|
|
331
|
-
if (Array.isArray(parsed)) {
|
|
332
|
-
const textBlock = parsed.find((b) => (b.type === 'text' && b.text && !b.text.startsWith('<system-reminder>'))
|
|
333
|
-
|| (b.type === 'input_text' && b.text && !b.text.startsWith('#') && !b.text.startsWith('<environment')));
|
|
334
|
-
if (textBlock)
|
|
335
|
-
text = textBlock.text;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
catch { }
|
|
339
|
-
text = text.replace(/\s+/g, ' ').trim();
|
|
340
|
-
return text || null;
|
|
341
|
-
}
|
|
342
|
-
// Extract working directory from system prompt or messages
|
|
343
|
-
export function extractWorkingDirectory(contextInfo) {
|
|
344
|
-
const allText = [
|
|
345
|
-
...(contextInfo.systemPrompts || []).map(sp => sp.content),
|
|
346
|
-
...(contextInfo.messages || []).filter(m => m.role === 'user').map(m => m.content),
|
|
347
|
-
].join('\n');
|
|
348
|
-
// Claude Code: "Primary working directory: /path/to/dir"
|
|
349
|
-
let match = allText.match(/[Pp]rimary working directory[:\s]+[`]?([/~][^\s`\n]+)/);
|
|
350
|
-
if (match)
|
|
351
|
-
return match[1];
|
|
352
|
-
// Codex: "<cwd>/path/to/dir</cwd>"
|
|
353
|
-
match = allText.match(/<cwd>([^<]+)<\/cwd>/);
|
|
354
|
-
if (match)
|
|
355
|
-
return match[1];
|
|
356
|
-
// Generic: "working directory is /path" or "cwd: /path"
|
|
357
|
-
match = allText.match(/working directory (?:is |= ?)[`"]?([/~][^\s`"'\n]+)/i);
|
|
358
|
-
if (match)
|
|
359
|
-
return match[1];
|
|
360
|
-
match = allText.match(/\bcwd[:\s]+[`"]?([/~][^\s`"'\n]+)/);
|
|
361
|
-
if (match)
|
|
362
|
-
return match[1];
|
|
363
|
-
return null;
|
|
364
|
-
}
|
|
365
|
-
// Extract the actual user prompt from a Responses API input array
|
|
366
|
-
export function extractUserPrompt(messages) {
|
|
367
|
-
for (const m of messages) {
|
|
368
|
-
if (m.role !== 'user' || !m.content)
|
|
369
|
-
continue;
|
|
370
|
-
try {
|
|
371
|
-
const parsed = JSON.parse(m.content);
|
|
372
|
-
if (Array.isArray(parsed) && parsed[0] && parsed[0].type === 'input_text') {
|
|
373
|
-
const text = parsed[0].text || '';
|
|
374
|
-
if (text.startsWith('#') || text.startsWith('<environment'))
|
|
375
|
-
continue;
|
|
376
|
-
return m.content;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
catch { }
|
|
380
|
-
}
|
|
381
|
-
return null;
|
|
382
|
-
}
|
|
383
|
-
// Extract session ID from Anthropic metadata.user_id
|
|
384
|
-
export function extractSessionId(rawBody) {
|
|
385
|
-
const userId = rawBody?.metadata?.user_id;
|
|
386
|
-
if (!userId)
|
|
387
|
-
return null;
|
|
388
|
-
const match = userId.match(/session_([a-f0-9-]+)/);
|
|
389
|
-
return match ? match[0] : null;
|
|
390
|
-
}
|
|
391
|
-
// Compute a sub-key to distinguish agents within a session
|
|
392
|
-
export function computeAgentKey(contextInfo) {
|
|
393
|
-
const userMsgs = (contextInfo.messages || []).filter(m => m.role === 'user');
|
|
394
|
-
let realText = '';
|
|
395
|
-
for (const msg of userMsgs) {
|
|
396
|
-
const t = extractReadableText(msg.content);
|
|
397
|
-
if (t) {
|
|
398
|
-
realText = t;
|
|
399
|
-
break;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
if (!realText)
|
|
403
|
-
return null;
|
|
404
|
-
return createHash('sha256').update(realText).digest('hex').slice(0, 12);
|
|
405
|
-
}
|
|
406
|
-
// Compute fingerprint for conversation grouping
|
|
407
|
-
export function computeFingerprint(contextInfo, rawBody, responseIdToConvo) {
|
|
408
|
-
// Anthropic session ID = one group per CLI session
|
|
409
|
-
const sessionId = extractSessionId(rawBody);
|
|
410
|
-
if (sessionId) {
|
|
411
|
-
return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);
|
|
412
|
-
}
|
|
413
|
-
// Responses API chaining: if previous_response_id exists, reuse that conversation
|
|
414
|
-
if (rawBody && rawBody.previous_response_id && responseIdToConvo) {
|
|
415
|
-
const existing = responseIdToConvo.get(rawBody.previous_response_id);
|
|
416
|
-
if (existing)
|
|
417
|
-
return existing;
|
|
418
|
-
}
|
|
419
|
-
const userMsgs = (contextInfo.messages || []).filter(m => m.role === 'user');
|
|
420
|
-
let promptText;
|
|
421
|
-
if (contextInfo.apiFormat === 'responses' && userMsgs.length > 1) {
|
|
422
|
-
promptText = extractUserPrompt(userMsgs) || '';
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
const firstUser = userMsgs[0];
|
|
426
|
-
promptText = firstUser ? firstUser.content : '';
|
|
427
|
-
}
|
|
428
|
-
const systemText = (contextInfo.systemPrompts || []).map(sp => sp.content).join('\n');
|
|
429
|
-
if (!systemText && !promptText)
|
|
430
|
-
return null;
|
|
431
|
-
return createHash('sha256').update(systemText + '\0' + promptText).digest('hex').slice(0, 16);
|
|
432
|
-
}
|
|
433
|
-
// Extract a readable label for a conversation
|
|
434
|
-
export function extractConversationLabel(contextInfo) {
|
|
435
|
-
const userMsgs = (contextInfo.messages || []).filter(m => m.role === 'user');
|
|
436
|
-
if (contextInfo.apiFormat === 'responses' && userMsgs.length > 1) {
|
|
437
|
-
const prompt = extractUserPrompt(userMsgs);
|
|
438
|
-
const text = extractReadableText(prompt);
|
|
439
|
-
if (text)
|
|
440
|
-
return text.length > 80 ? text.slice(0, 77) + '...' : text;
|
|
441
|
-
}
|
|
442
|
-
for (let i = userMsgs.length - 1; i >= 0; i--) {
|
|
443
|
-
const text = extractReadableText(userMsgs[i].content);
|
|
444
|
-
if (text)
|
|
445
|
-
return text.length > 80 ? text.slice(0, 77) + '...' : text;
|
|
446
|
-
}
|
|
447
|
-
return 'Unnamed conversation';
|
|
448
|
-
}
|
|
449
|
-
// Auto-detect source tool from headers (primary) and system prompt (fallback)
|
|
450
|
-
export function detectSource(contextInfo, source, headers) {
|
|
451
|
-
if (source && source !== 'unknown')
|
|
452
|
-
return source;
|
|
453
|
-
// Primary: check request headers
|
|
454
|
-
if (headers) {
|
|
455
|
-
for (const sig of HEADER_SIGNATURES) {
|
|
456
|
-
const val = headers[sig.header];
|
|
457
|
-
if (!val)
|
|
458
|
-
continue;
|
|
459
|
-
if (sig.pattern instanceof RegExp ? sig.pattern.test(val) : val.includes(sig.pattern)) {
|
|
460
|
-
return sig.source;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
// Fallback: check system prompt content
|
|
465
|
-
const systemText = (contextInfo.systemPrompts || []).map(sp => sp.content).join('\n');
|
|
466
|
-
for (const sig of SOURCE_SIGNATURES) {
|
|
467
|
-
if (systemText.includes(sig.pattern))
|
|
468
|
-
return sig.source;
|
|
469
|
-
}
|
|
470
|
-
return source || 'unknown';
|
|
471
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Public "core" API for Context Lens.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally a thin facade: other parts of the codebase import from here,
|
|
5
|
+
* while implementations live in `src/core/*` to keep concerns separated.
|
|
6
|
+
*/
|
|
7
|
+
export { computeAgentKey, computeFingerprint, extractConversationLabel, extractReadableText, extractSessionId, extractUserPrompt, extractWorkingDirectory, } from "./core/conversation.js";
|
|
8
|
+
export { estimateCost, getContextLimit, } from "./core/models.js";
|
|
9
|
+
export { parseContextInfo } from "./core/parse.js";
|
|
10
|
+
export { detectApiFormat, detectProvider, extractSource, resolveTargetUrl, } from "./core/routing.js";
|
|
11
|
+
export { detectSource } from "./core/source.js";
|
|
12
|
+
export { estimateTokens } from "./core/tokens.js";
|
|
472
13
|
//# 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":"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"}
|
|
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,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,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,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared header redaction utilities.
|
|
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".
|
|
8
|
+
*/
|
|
9
|
+
/** Case-insensitive set of header names that must never be persisted/exported. */
|
|
10
|
+
export declare const SENSITIVE_HEADERS: Set<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Remove sensitive headers from a header map.
|
|
13
|
+
*
|
|
14
|
+
* @param headers - Header map (string -> string)
|
|
15
|
+
* @returns A new object with sensitive headers removed.
|
|
16
|
+
*/
|
|
17
|
+
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
|
+
//# sourceMappingURL=headers.d.ts.map
|
|
@@ -0,0 +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"}
|