context-lens 0.3.2 → 0.4.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 +52 -16
- package/dist/analysis/ingest.d.ts +13 -0
- package/dist/analysis/ingest.d.ts.map +1 -0
- package/dist/analysis/ingest.js +75 -0
- package/dist/analysis/ingest.js.map +1 -0
- package/dist/analysis/server.d.ts +10 -0
- package/dist/analysis/server.d.ts.map +1 -0
- package/dist/analysis/server.js +95 -0
- package/dist/analysis/server.js.map +1 -0
- package/dist/analysis/watcher.d.ts +55 -0
- package/dist/analysis/watcher.d.ts.map +1 -0
- package/dist/analysis/watcher.js +170 -0
- package/dist/analysis/watcher.js.map +1 -0
- package/dist/cli-utils.d.ts +16 -0
- package/dist/cli-utils.d.ts.map +1 -1
- package/dist/cli-utils.js +185 -3
- package/dist/cli-utils.js.map +1 -1
- package/dist/cli.js +629 -88
- package/dist/cli.js.map +1 -1
- package/dist/core/conversation.d.ts +8 -1
- package/dist/core/conversation.d.ts.map +1 -1
- package/dist/core/conversation.js +38 -12
- package/dist/core/conversation.js.map +1 -1
- package/dist/core/parse.d.ts.map +1 -1
- package/dist/core/parse.js +17 -1
- package/dist/core/parse.js.map +1 -1
- package/dist/core/session-analysis.d.ts +100 -0
- package/dist/core/session-analysis.d.ts.map +1 -0
- package/dist/core/session-analysis.js +435 -0
- package/dist/core/session-analysis.js.map +1 -0
- package/dist/core/session-format.d.ts +20 -0
- package/dist/core/session-format.d.ts.map +1 -0
- package/dist/core/session-format.js +298 -0
- package/dist/core/session-format.js.map +1 -0
- package/dist/core.d.ts +4 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -1
- package/dist/lhar/reader.d.ts +22 -0
- package/dist/lhar/reader.d.ts.map +1 -0
- package/dist/lhar/reader.js +43 -0
- package/dist/lhar/reader.js.map +1 -0
- package/dist/lhar/record.d.ts.map +1 -1
- package/dist/lhar/record.js +3 -0
- package/dist/lhar/record.js.map +1 -1
- package/dist/lhar/response.d.ts +8 -0
- package/dist/lhar/response.d.ts.map +1 -1
- package/dist/lhar/response.js +44 -0
- package/dist/lhar/response.js.map +1 -1
- package/dist/lhar/tools.d.ts +17 -0
- package/dist/lhar/tools.d.ts.map +1 -0
- package/dist/lhar/tools.js +48 -0
- package/dist/lhar/tools.js.map +1 -0
- package/dist/lhar-types.generated.d.ts +34 -0
- package/dist/lhar-types.generated.d.ts.map +1 -1
- package/dist/lhar.d.ts +4 -1
- package/dist/lhar.d.ts.map +1 -1
- package/dist/lhar.js +5 -1
- package/dist/lhar.js.map +1 -1
- package/dist/proxy/capture.d.ts +40 -0
- package/dist/proxy/capture.d.ts.map +1 -0
- package/dist/proxy/capture.js +56 -0
- package/dist/proxy/capture.js.map +1 -0
- package/dist/proxy/config.d.ts +16 -0
- package/dist/proxy/config.d.ts.map +1 -0
- package/dist/proxy/config.js +34 -0
- package/dist/proxy/config.js.map +1 -0
- package/dist/proxy/forward.d.ts +20 -0
- package/dist/proxy/forward.d.ts.map +1 -0
- package/dist/proxy/forward.js +210 -0
- package/dist/proxy/forward.js.map +1 -0
- package/dist/proxy/headers.d.ts +16 -0
- package/dist/proxy/headers.d.ts.map +1 -0
- package/dist/proxy/headers.js +37 -0
- package/dist/proxy/headers.js.map +1 -0
- package/dist/proxy/routing.d.ts +44 -0
- package/dist/proxy/routing.d.ts.map +1 -0
- package/dist/proxy/routing.js +114 -0
- package/dist/proxy/routing.js.map +1 -0
- package/dist/proxy/server.d.ts +27 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +55 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/schemas.d.ts +328 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +249 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server/api.d.ts +3 -4
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +195 -220
- package/dist/server/api.js.map +1 -1
- package/dist/server/store.d.ts +23 -7
- package/dist/server/store.d.ts.map +1 -1
- package/dist/server/store.js +141 -50
- package/dist/server/store.js.map +1 -1
- package/dist/server/webui.d.ts +5 -2
- package/dist/server/webui.d.ts.map +1 -1
- package/dist/server/webui.js +32 -13
- package/dist/server/webui.js.map +1 -1
- package/dist/server-utils.d.ts +1 -2
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +0 -2
- package/dist/server-utils.js.map +1 -1
- package/dist/types.d.ts +1 -1
- 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 +99 -28
- package/package.json +12 -5
- package/schema/lhar.schema.json +50 -0
- package/dist/server/config.d.ts +0 -13
- package/dist/server/config.d.ts.map +0 -1
- package/dist/server/config.js +0 -36
- package/dist/server/config.js.map +0 -1
- package/dist/server/proxy.d.ts +0 -13
- package/dist/server/proxy.d.ts.map +0 -1
- package/dist/server/proxy.js +0 -218
- package/dist/server/proxy.js.map +0 -1
- package/dist/server/static.d.ts +0 -9
- package/dist/server/static.d.ts.map +0 -1
- package/dist/server/static.js +0 -78
- package/dist/server/static.js.map +0 -1
- package/dist/server.d.ts +0 -3
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -43
- package/dist/server.js.map +0 -1
package/dist/cli-utils.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { VERSION } from "./version.generated.js";
|
|
3
4
|
const __filename = fileURLToPath(import.meta.url);
|
|
4
5
|
const __dirname = dirname(__filename);
|
|
5
6
|
// Known tool config: env vars for the child process, extra CLI args, server env vars, and whether mitmproxy is needed
|
|
@@ -7,6 +8,16 @@ const PROXY_URL = "http://localhost:4040";
|
|
|
7
8
|
const MITM_PORT = 8080;
|
|
8
9
|
const MITM_PROXY_URL = `http://localhost:${MITM_PORT}`;
|
|
9
10
|
const PI_AGENT_DIR_PREFIX = "/tmp/context-lens-pi-agent-";
|
|
11
|
+
const COMMAND_ALIASES = {
|
|
12
|
+
cc: "claude",
|
|
13
|
+
cpi: "pi",
|
|
14
|
+
cx: "codex",
|
|
15
|
+
gm: "gemini",
|
|
16
|
+
};
|
|
17
|
+
const KNOWN_PRIVACY_LEVELS = ["minimal", "standard", "full"];
|
|
18
|
+
function isPrivacyLevel(value) {
|
|
19
|
+
return KNOWN_PRIVACY_LEVELS.includes(value);
|
|
20
|
+
}
|
|
10
21
|
const TOOL_CONFIG = {
|
|
11
22
|
claude: {
|
|
12
23
|
childEnv: { ANTHROPIC_BASE_URL: `${PROXY_URL}/claude` },
|
|
@@ -15,11 +26,16 @@ const TOOL_CONFIG = {
|
|
|
15
26
|
needsMitm: false,
|
|
16
27
|
},
|
|
17
28
|
codex: {
|
|
18
|
-
// Codex
|
|
19
|
-
//
|
|
29
|
+
// Codex (v0.101+) is a Rust binary that connects directly to
|
|
30
|
+
// chatgpt.com over HTTPS. It ignores chatgpt_base_url for subscription
|
|
31
|
+
// mode and does not support OPENAI_BASE_URL (OAuth token lacks scopes).
|
|
32
|
+
//
|
|
33
|
+
// We use mitmproxy as a forward HTTPS proxy to intercept traffic.
|
|
34
|
+
// The mitmproxy addon captures requests and POSTs them to the
|
|
35
|
+
// analysis server's ingest API.
|
|
20
36
|
childEnv: {
|
|
21
37
|
https_proxy: MITM_PROXY_URL,
|
|
22
|
-
SSL_CERT_FILE:
|
|
38
|
+
SSL_CERT_FILE: "", // filled in by cli.ts with mitmproxy CA cert path
|
|
23
39
|
},
|
|
24
40
|
extraArgs: [],
|
|
25
41
|
serverEnv: {},
|
|
@@ -65,12 +81,178 @@ export function getToolConfig(toolName) {
|
|
|
65
81
|
needsMitm: false,
|
|
66
82
|
});
|
|
67
83
|
}
|
|
84
|
+
export function resolveCommandAlias(commandName) {
|
|
85
|
+
return COMMAND_ALIASES[commandName] || commandName;
|
|
86
|
+
}
|
|
87
|
+
export function parseCliArgs(args) {
|
|
88
|
+
let showHelp = false;
|
|
89
|
+
let showVersion = false;
|
|
90
|
+
let noOpen = false;
|
|
91
|
+
let noUi = false;
|
|
92
|
+
let noUpdateCheck = false;
|
|
93
|
+
let privacyLevel;
|
|
94
|
+
let explicitSeparator = false;
|
|
95
|
+
let commandStartIndex = -1;
|
|
96
|
+
for (let i = 0; i < args.length; i++) {
|
|
97
|
+
const arg = args[i];
|
|
98
|
+
if (arg === "--") {
|
|
99
|
+
explicitSeparator = true;
|
|
100
|
+
commandStartIndex = i + 1;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
if (!arg.startsWith("-")) {
|
|
104
|
+
commandStartIndex = i;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
if (arg === "--help" || arg === "-h") {
|
|
108
|
+
showHelp = true;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (arg === "--version" || arg === "-v") {
|
|
112
|
+
showVersion = true;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (arg === "--no-open") {
|
|
116
|
+
noOpen = true;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (arg === "--no-ui") {
|
|
120
|
+
noUi = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (arg === "--no-update-check") {
|
|
124
|
+
noUpdateCheck = true;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (arg === "--privacy") {
|
|
128
|
+
if (i + 1 >= args.length) {
|
|
129
|
+
return {
|
|
130
|
+
showHelp,
|
|
131
|
+
showVersion,
|
|
132
|
+
noOpen,
|
|
133
|
+
noUi,
|
|
134
|
+
noUpdateCheck,
|
|
135
|
+
commandArguments: [],
|
|
136
|
+
error: "Error: Missing value for --privacy. Expected one of: minimal, standard, full",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
privacyLevel = args[i + 1];
|
|
140
|
+
i++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (arg.startsWith("--privacy=")) {
|
|
144
|
+
privacyLevel = arg.split("=", 2)[1];
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
showHelp,
|
|
149
|
+
showVersion,
|
|
150
|
+
noOpen,
|
|
151
|
+
noUi,
|
|
152
|
+
noUpdateCheck,
|
|
153
|
+
commandArguments: [],
|
|
154
|
+
error: `Error: Unknown option '${arg}'. Run 'context-lens --help' for usage.`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (privacyLevel && !isPrivacyLevel(privacyLevel)) {
|
|
158
|
+
return {
|
|
159
|
+
showHelp,
|
|
160
|
+
showVersion,
|
|
161
|
+
noOpen,
|
|
162
|
+
noUi,
|
|
163
|
+
noUpdateCheck,
|
|
164
|
+
commandArguments: [],
|
|
165
|
+
error: `Error: Invalid privacy level '${privacyLevel}'. Must be one of: ${KNOWN_PRIVACY_LEVELS.join(", ")}`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const rawCommand = commandStartIndex >= 0 ? args[commandStartIndex] : undefined;
|
|
169
|
+
const commandName = rawCommand ? resolveCommandAlias(rawCommand) : undefined;
|
|
170
|
+
const commandArguments = commandStartIndex >= 0 ? args.slice(commandStartIndex + 1) : [];
|
|
171
|
+
if (explicitSeparator && !rawCommand && !showHelp && !showVersion) {
|
|
172
|
+
return {
|
|
173
|
+
showHelp,
|
|
174
|
+
showVersion,
|
|
175
|
+
noOpen,
|
|
176
|
+
noUi,
|
|
177
|
+
noUpdateCheck,
|
|
178
|
+
privacyLevel,
|
|
179
|
+
commandArguments: [],
|
|
180
|
+
error: "Error: No command specified after --",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
showHelp,
|
|
185
|
+
showVersion,
|
|
186
|
+
noOpen,
|
|
187
|
+
noUi,
|
|
188
|
+
noUpdateCheck,
|
|
189
|
+
privacyLevel,
|
|
190
|
+
commandName,
|
|
191
|
+
commandArguments,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
export function formatHelpText() {
|
|
195
|
+
return [
|
|
196
|
+
`context-lens v${VERSION}`,
|
|
197
|
+
"",
|
|
198
|
+
"Usage:",
|
|
199
|
+
" context-lens [global-options] [tool-or-command] [args...]",
|
|
200
|
+
" context-lens [global-options] -- [command] [args...]",
|
|
201
|
+
" context-lens [global-options] (no command = standalone mode)",
|
|
202
|
+
" context-lens doctor",
|
|
203
|
+
" context-lens background <start|stop|status> [--no-ui]",
|
|
204
|
+
" context-lens analyze <session.lhar> [options]",
|
|
205
|
+
"",
|
|
206
|
+
"Examples:",
|
|
207
|
+
" context-lens claude",
|
|
208
|
+
" context-lens codex",
|
|
209
|
+
" context-lens gm",
|
|
210
|
+
" context-lens --privacy=minimal aider --model claude-sonnet-4",
|
|
211
|
+
" context-lens -- python my_agent.py",
|
|
212
|
+
" context-lens doctor",
|
|
213
|
+
" context-lens background start --no-ui",
|
|
214
|
+
" context-lens analyze ~/.context-lens/data/claude-abc123.lhar",
|
|
215
|
+
" context-lens analyze session.lhar --json --main-only",
|
|
216
|
+
" context-lens analyze session.lhar --composition=pre-compaction",
|
|
217
|
+
"",
|
|
218
|
+
"Global options:",
|
|
219
|
+
" -h, --help Show this help text",
|
|
220
|
+
" -v, --version Show version",
|
|
221
|
+
" --privacy <level> Set privacy level: minimal|standard|full",
|
|
222
|
+
" --no-open Don't auto-open http://localhost:4041",
|
|
223
|
+
" --no-ui Run proxy only (no analysis/web UI server)",
|
|
224
|
+
" --no-update-check Skip npm update check for this run",
|
|
225
|
+
"",
|
|
226
|
+
"Command aliases:",
|
|
227
|
+
" cc -> claude",
|
|
228
|
+
" cpi -> pi",
|
|
229
|
+
" cx -> codex",
|
|
230
|
+
" gm -> gemini",
|
|
231
|
+
"",
|
|
232
|
+
"Notes:",
|
|
233
|
+
" - No command starts standalone mode (proxy + analysis/web UI by default).",
|
|
234
|
+
" - 'codex' uses mitmproxy for HTTPS interception (requires mitmproxy; install: pipx install mitmproxy).",
|
|
235
|
+
" - 'doctor' is a local diagnostics command.",
|
|
236
|
+
" - 'background' manages detached proxy/web-ui processes.",
|
|
237
|
+
" - 'analyze' reads an .lhar file and prints session statistics.",
|
|
238
|
+
"",
|
|
239
|
+
"Analyze options:",
|
|
240
|
+
" --json Output as JSON instead of formatted text",
|
|
241
|
+
" --no-path Omit the agent path trace",
|
|
242
|
+
" --main-only Only analyze main agent entries",
|
|
243
|
+
" --composition=last Composition of the last entry (default)",
|
|
244
|
+
" --composition=pre-compaction Composition before each compaction",
|
|
245
|
+
" --composition=N Composition at end of user turn N",
|
|
246
|
+
].join("\n");
|
|
247
|
+
}
|
|
68
248
|
// Exported for tests (and to keep cli.ts smaller).
|
|
69
249
|
export const CLI_CONSTANTS = {
|
|
70
250
|
PROXY_URL,
|
|
71
251
|
MITM_PORT,
|
|
72
252
|
MITM_PROXY_URL,
|
|
73
253
|
PI_AGENT_DIR_PREFIX,
|
|
254
|
+
COMMAND_ALIASES,
|
|
255
|
+
KNOWN_PRIVACY_LEVELS,
|
|
74
256
|
// Resolved relative to compiled output (dist/ or dist-test/), matching cli.ts behavior.
|
|
75
257
|
MITM_ADDON_PATH: join(__dirname, "..", "mitm_addon.py"),
|
|
76
258
|
};
|
package/dist/cli-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"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"}
|