context-lens 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-utils.d.ts +6 -5
- package/dist/cli-utils.d.ts.map +1 -1
- package/dist/cli-utils.js +25 -22
- package/dist/cli-utils.js.map +1 -1
- package/dist/cli.js +133 -50
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -1
- package/dist/core/conversation.d.ts +3 -2
- package/dist/core/conversation.d.ts.map +1 -1
- package/dist/core/conversation.js +9 -3
- package/dist/core/conversation.js.map +1 -1
- package/dist/core/parse.d.ts.map +1 -1
- package/dist/core/parse.js +57 -5
- package/dist/core/parse.js.map +1 -1
- package/dist/core/security.d.ts.map +1 -1
- package/dist/core/security.js +15 -1
- package/dist/core/security.js.map +1 -1
- package/dist/importers/claude-code.d.ts +19 -0
- package/dist/importers/claude-code.d.ts.map +1 -0
- package/dist/importers/claude-code.js +166 -0
- package/dist/importers/claude-code.js.map +1 -0
- package/dist/importers/codex.d.ts +22 -0
- package/dist/importers/codex.d.ts.map +1 -0
- package/dist/importers/codex.js +172 -0
- package/dist/importers/codex.js.map +1 -0
- package/dist/importers/index.d.ts +12 -0
- package/dist/importers/index.d.ts.map +1 -0
- package/dist/importers/index.js +153 -0
- package/dist/importers/index.js.map +1 -0
- package/dist/importers/types.d.ts +51 -0
- package/dist/importers/types.d.ts.map +1 -0
- package/dist/importers/types.js +8 -0
- package/dist/importers/types.js.map +1 -0
- package/dist/lhar/composition.d.ts.map +1 -1
- package/dist/lhar/composition.js +13 -0
- package/dist/lhar/composition.js.map +1 -1
- package/dist/lhar/response.d.ts.map +1 -1
- package/dist/lhar/response.js +17 -1
- package/dist/lhar/response.js.map +1 -1
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +72 -0
- package/dist/server/api.js.map +1 -1
- package/dist/server/store.d.ts +3 -0
- package/dist/server/store.d.ts.map +1 -1
- package/dist/server/store.js +12 -2
- package/dist/server/store.js.map +1 -1
- package/dist/types.d.ts +16 -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 +107 -4
- package/package.json +4 -4
- package/ui/dist/assets/index-BlAdJWw0.css +1 -0
- package/ui/dist/assets/index-DO3TMDY3.js +58 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-CZq91bC_.js +0 -52
- package/ui/dist/assets/index-DSyD9xgM.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importer for Claude Code (claude CLI) session files.
|
|
3
|
+
*
|
|
4
|
+
* Session files live at:
|
|
5
|
+
* ~/.claude/projects/<encoded-dir>/<sessionId>.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Each line is a JSON object with type "user" | "assistant" | "system" |
|
|
8
|
+
* "progress" | "queue-operation" | "file-history-snapshot".
|
|
9
|
+
*
|
|
10
|
+
* Only "user" and "assistant" lines carry message content.
|
|
11
|
+
* "assistant" lines carry exact usage in message.usage.
|
|
12
|
+
*
|
|
13
|
+
* The turns form a tree via parentUuid. We walk the longest chain
|
|
14
|
+
* (most assistant turns) to get the main conversation thread.
|
|
15
|
+
*/
|
|
16
|
+
import type { ImportedSession } from "./types.js";
|
|
17
|
+
export declare function discoverClaudeCodeSessions(baseDir?: string): string[];
|
|
18
|
+
export declare function parseClaudeCodeSession(filePath: string): ImportedSession | null;
|
|
19
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/importers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,YAAY,CAAC;AA+GpB,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,MAA2B,GACnC,MAAM,EAAE,CAaV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GACf,eAAe,GAAG,IAAI,CAiDxB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importer for Claude Code (claude CLI) session files.
|
|
3
|
+
*
|
|
4
|
+
* Session files live at:
|
|
5
|
+
* ~/.claude/projects/<encoded-dir>/<sessionId>.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Each line is a JSON object with type "user" | "assistant" | "system" |
|
|
8
|
+
* "progress" | "queue-operation" | "file-history-snapshot".
|
|
9
|
+
*
|
|
10
|
+
* Only "user" and "assistant" lines carry message content.
|
|
11
|
+
* "assistant" lines carry exact usage in message.usage.
|
|
12
|
+
*
|
|
13
|
+
* The turns form a tree via parentUuid. We walk the longest chain
|
|
14
|
+
* (most assistant turns) to get the main conversation thread.
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import os from "node:os";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
function defaultClaudeDir() {
|
|
20
|
+
return path.join(os.homedir(), ".claude", "projects");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Walk the tree formed by parentUuid links and return the longest
|
|
24
|
+
* linear chain of uuids ending at a leaf (no children).
|
|
25
|
+
*/
|
|
26
|
+
function longestChain(lines) {
|
|
27
|
+
const byUuid = new Map();
|
|
28
|
+
const children = new Map();
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
byUuid.set(line.uuid, line);
|
|
31
|
+
if (line.parentUuid) {
|
|
32
|
+
const kids = children.get(line.parentUuid) ?? [];
|
|
33
|
+
kids.push(line.uuid);
|
|
34
|
+
children.set(line.parentUuid, kids);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Find roots (no parent, or parent not in set)
|
|
38
|
+
const roots = lines.filter((l) => !l.parentUuid || !byUuid.has(l.parentUuid));
|
|
39
|
+
// DFS to find longest path (by assistant-turn count)
|
|
40
|
+
let best = [];
|
|
41
|
+
function dfs(uuid, current) {
|
|
42
|
+
const node = byUuid.get(uuid);
|
|
43
|
+
if (!node)
|
|
44
|
+
return;
|
|
45
|
+
const next = [...current, node];
|
|
46
|
+
const kids = children.get(uuid) ?? [];
|
|
47
|
+
if (kids.length === 0) {
|
|
48
|
+
const assistantCount = next.filter((n) => n.type === "assistant").length;
|
|
49
|
+
const bestCount = best.filter((n) => n.type === "assistant").length;
|
|
50
|
+
if (assistantCount > bestCount)
|
|
51
|
+
best = next;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
for (const kid of kids)
|
|
55
|
+
dfs(kid, next);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const root of roots)
|
|
59
|
+
dfs(root.uuid, []);
|
|
60
|
+
return best;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert a chain of Claude Code lines into ImportedTurns.
|
|
64
|
+
*
|
|
65
|
+
* Each turn corresponds to one assistant response. The messages array
|
|
66
|
+
* for that turn contains all user+assistant messages up to that point,
|
|
67
|
+
* which is what the analysis pipeline expects (full context window snapshot).
|
|
68
|
+
*/
|
|
69
|
+
function chainToTurns(chain) {
|
|
70
|
+
const turns = [];
|
|
71
|
+
const accumulated = [];
|
|
72
|
+
for (const line of chain) {
|
|
73
|
+
if (line.type !== "user" && line.type !== "assistant")
|
|
74
|
+
continue;
|
|
75
|
+
if (!line.message)
|
|
76
|
+
continue;
|
|
77
|
+
// Skip injected skill/system content (isMeta lines)
|
|
78
|
+
if (line.isMeta)
|
|
79
|
+
continue;
|
|
80
|
+
const role = line.message.role;
|
|
81
|
+
accumulated.push({ role, content: line.message.content });
|
|
82
|
+
if (line.type === "assistant") {
|
|
83
|
+
const usage = line.message.usage;
|
|
84
|
+
turns.push({
|
|
85
|
+
timestamp: line.timestamp,
|
|
86
|
+
messages: [...accumulated],
|
|
87
|
+
inputTokens: usage?.input_tokens ?? null,
|
|
88
|
+
outputTokens: usage?.output_tokens ?? null,
|
|
89
|
+
cacheReadTokens: usage?.cache_read_input_tokens ?? null,
|
|
90
|
+
cacheWriteTokens: usage?.cache_creation_input_tokens ?? null,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return turns;
|
|
95
|
+
}
|
|
96
|
+
export function discoverClaudeCodeSessions(baseDir = defaultClaudeDir()) {
|
|
97
|
+
if (!fs.existsSync(baseDir))
|
|
98
|
+
return [];
|
|
99
|
+
const files = [];
|
|
100
|
+
for (const project of fs.readdirSync(baseDir)) {
|
|
101
|
+
const projectDir = path.join(baseDir, project);
|
|
102
|
+
if (!fs.statSync(projectDir).isDirectory())
|
|
103
|
+
continue;
|
|
104
|
+
for (const file of fs.readdirSync(projectDir)) {
|
|
105
|
+
if (file.endsWith(".jsonl")) {
|
|
106
|
+
files.push(path.join(projectDir, file));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return files;
|
|
111
|
+
}
|
|
112
|
+
export function parseClaudeCodeSession(filePath) {
|
|
113
|
+
let raw;
|
|
114
|
+
try {
|
|
115
|
+
raw = fs.readFileSync(filePath, "utf8");
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const lines = [];
|
|
121
|
+
let sessionId = null;
|
|
122
|
+
let cwd = null;
|
|
123
|
+
let gitBranch = null;
|
|
124
|
+
let model = "claude";
|
|
125
|
+
for (const line of raw.split("\n")) {
|
|
126
|
+
if (!line.trim())
|
|
127
|
+
continue;
|
|
128
|
+
try {
|
|
129
|
+
const parsed = JSON.parse(line);
|
|
130
|
+
if (!parsed.type || !parsed.uuid)
|
|
131
|
+
continue;
|
|
132
|
+
if (parsed.type === "user" || parsed.type === "assistant") {
|
|
133
|
+
lines.push(parsed);
|
|
134
|
+
if (!sessionId && parsed.sessionId)
|
|
135
|
+
sessionId = parsed.sessionId;
|
|
136
|
+
if (!cwd && parsed.cwd)
|
|
137
|
+
cwd = parsed.cwd;
|
|
138
|
+
if (!gitBranch && parsed.gitBranch)
|
|
139
|
+
gitBranch = parsed.gitBranch;
|
|
140
|
+
if (parsed.type === "assistant" && parsed.message?.model) {
|
|
141
|
+
model = parsed.message.model;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// skip malformed lines
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (lines.length === 0 || !sessionId)
|
|
150
|
+
return null;
|
|
151
|
+
const chain = longestChain(lines);
|
|
152
|
+
const turns = chainToTurns(chain);
|
|
153
|
+
if (turns.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
return {
|
|
156
|
+
sessionId,
|
|
157
|
+
source: "claude-code",
|
|
158
|
+
model,
|
|
159
|
+
provider: "anthropic",
|
|
160
|
+
apiFormat: "anthropic-messages",
|
|
161
|
+
cwd,
|
|
162
|
+
gitBranch,
|
|
163
|
+
turns,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/importers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importer for OpenAI Codex CLI session files.
|
|
3
|
+
*
|
|
4
|
+
* Session files live at:
|
|
5
|
+
* ~/.codex/sessions/<year>/<month>/<day>/<id>.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Each line has a "type" field:
|
|
8
|
+
* - "session_meta" — session metadata (id, cwd, model, git)
|
|
9
|
+
* - "response_item" — individual items in the Responses API input/output
|
|
10
|
+
* (message, function_call, function_call_output,
|
|
11
|
+
* reasoning, custom_tool_call, ghost_snapshot, ...)
|
|
12
|
+
* - "event_msg" — events including "token_count" with per-turn usage
|
|
13
|
+
* - "turn_context" — model + cwd snapshot at start of each turn
|
|
14
|
+
*
|
|
15
|
+
* Strategy: collect all response_items in order, then group them into turns
|
|
16
|
+
* by splitting on each assistant "message" item. Per-turn usage comes from
|
|
17
|
+
* the "token_count" event_msg that follows each turn (last_token_usage).
|
|
18
|
+
*/
|
|
19
|
+
import type { ImportedSession } from "./types.js";
|
|
20
|
+
export declare function discoverCodexSessions(baseDir?: string): string[];
|
|
21
|
+
export declare function parseCodexSession(filePath: string): ImportedSession | null;
|
|
22
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/importers/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,MAA0B,GAClC,MAAM,EAAE,CAkBV;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA2I1E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importer for OpenAI Codex CLI session files.
|
|
3
|
+
*
|
|
4
|
+
* Session files live at:
|
|
5
|
+
* ~/.codex/sessions/<year>/<month>/<day>/<id>.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Each line has a "type" field:
|
|
8
|
+
* - "session_meta" — session metadata (id, cwd, model, git)
|
|
9
|
+
* - "response_item" — individual items in the Responses API input/output
|
|
10
|
+
* (message, function_call, function_call_output,
|
|
11
|
+
* reasoning, custom_tool_call, ghost_snapshot, ...)
|
|
12
|
+
* - "event_msg" — events including "token_count" with per-turn usage
|
|
13
|
+
* - "turn_context" — model + cwd snapshot at start of each turn
|
|
14
|
+
*
|
|
15
|
+
* Strategy: collect all response_items in order, then group them into turns
|
|
16
|
+
* by splitting on each assistant "message" item. Per-turn usage comes from
|
|
17
|
+
* the "token_count" event_msg that follows each turn (last_token_usage).
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import os from "node:os";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
function defaultCodexDir() {
|
|
23
|
+
return path.join(os.homedir(), ".codex", "sessions");
|
|
24
|
+
}
|
|
25
|
+
export function discoverCodexSessions(baseDir = defaultCodexDir()) {
|
|
26
|
+
if (!fs.existsSync(baseDir))
|
|
27
|
+
return [];
|
|
28
|
+
const files = [];
|
|
29
|
+
function walk(dir) {
|
|
30
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
31
|
+
const full = path.join(dir, entry);
|
|
32
|
+
const stat = fs.statSync(full);
|
|
33
|
+
if (stat.isDirectory()) {
|
|
34
|
+
walk(full);
|
|
35
|
+
}
|
|
36
|
+
else if (entry.endsWith(".jsonl")) {
|
|
37
|
+
files.push(full);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
walk(baseDir);
|
|
42
|
+
return files;
|
|
43
|
+
}
|
|
44
|
+
export function parseCodexSession(filePath) {
|
|
45
|
+
let raw;
|
|
46
|
+
try {
|
|
47
|
+
raw = fs.readFileSync(filePath, "utf8");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const lines = [];
|
|
53
|
+
for (const line of raw.split("\n")) {
|
|
54
|
+
if (!line.trim())
|
|
55
|
+
continue;
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(line);
|
|
58
|
+
if (parsed.type && parsed.payload)
|
|
59
|
+
lines.push(parsed);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// skip malformed lines
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (lines.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
// Extract session metadata
|
|
68
|
+
const metaLine = lines.find((l) => l.type === "session_meta");
|
|
69
|
+
if (!metaLine)
|
|
70
|
+
return null;
|
|
71
|
+
const meta = metaLine.payload;
|
|
72
|
+
const sessionId = meta.id;
|
|
73
|
+
if (!sessionId)
|
|
74
|
+
return null;
|
|
75
|
+
const cwd = meta.cwd ?? null;
|
|
76
|
+
const gitBranch = meta.git?.branch ??
|
|
77
|
+
null;
|
|
78
|
+
// Find model from turn_context lines
|
|
79
|
+
let model = "gpt-4o";
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
if (line.type === "turn_context" && line.payload.model) {
|
|
82
|
+
model = line.payload.model;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Collect response_items and token_count events in order
|
|
87
|
+
const responseItems = [];
|
|
88
|
+
const tokenCounts = [];
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
if (line.type === "response_item") {
|
|
91
|
+
responseItems.push({ timestamp: line.timestamp, payload: line.payload });
|
|
92
|
+
}
|
|
93
|
+
else if (line.type === "event_msg") {
|
|
94
|
+
const p = line.payload;
|
|
95
|
+
if (p.type === "token_count" &&
|
|
96
|
+
p.info &&
|
|
97
|
+
typeof p.info === "object" &&
|
|
98
|
+
p.info.last_token_usage) {
|
|
99
|
+
const info = p.info;
|
|
100
|
+
tokenCounts.push({
|
|
101
|
+
timestamp: line.timestamp,
|
|
102
|
+
last: info.last_token_usage,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (responseItems.length === 0)
|
|
108
|
+
return null;
|
|
109
|
+
// Group response_items into turns.
|
|
110
|
+
// A new turn starts when we see an assistant "message" item.
|
|
111
|
+
// Everything before the first assistant message is the initial user context.
|
|
112
|
+
const turns = [];
|
|
113
|
+
let currentItems = [];
|
|
114
|
+
let currentTimestamp = responseItems[0]?.timestamp ?? new Date().toISOString();
|
|
115
|
+
let tokenCountIndex = 0;
|
|
116
|
+
// Accumulated messages across all turns (context window snapshot per turn)
|
|
117
|
+
const accumulated = [];
|
|
118
|
+
for (const item of responseItems) {
|
|
119
|
+
const p = item.payload;
|
|
120
|
+
const pType = p.type;
|
|
121
|
+
const pRole = p.role;
|
|
122
|
+
if (pRole === "assistant" && pType === "message") {
|
|
123
|
+
// End of a turn — flush accumulated + current assistant message
|
|
124
|
+
accumulated.push({ role: "assistant", content: p.content });
|
|
125
|
+
currentItems.push(p);
|
|
126
|
+
// Find the next token_count event after this timestamp
|
|
127
|
+
let usage = null;
|
|
128
|
+
while (tokenCountIndex < tokenCounts.length) {
|
|
129
|
+
const tc = tokenCounts[tokenCountIndex];
|
|
130
|
+
if (tc.timestamp >= item.timestamp) {
|
|
131
|
+
usage = tc.last;
|
|
132
|
+
tokenCountIndex++;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
tokenCountIndex++;
|
|
136
|
+
}
|
|
137
|
+
turns.push({
|
|
138
|
+
timestamp: item.timestamp,
|
|
139
|
+
messages: [...accumulated],
|
|
140
|
+
inputTokens: usage?.input_tokens ?? null,
|
|
141
|
+
outputTokens: usage?.output_tokens ?? null,
|
|
142
|
+
cacheReadTokens: usage?.cached_input_tokens ?? null,
|
|
143
|
+
cacheWriteTokens: null,
|
|
144
|
+
});
|
|
145
|
+
currentItems = [];
|
|
146
|
+
currentTimestamp = item.timestamp;
|
|
147
|
+
}
|
|
148
|
+
else if (pRole === "user" && pType === "message") {
|
|
149
|
+
accumulated.push({ role: "user", content: p.content });
|
|
150
|
+
currentItems.push(p);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// function_call, function_call_output, reasoning, custom_tool_call, etc.
|
|
154
|
+
// These are assistant-side items — add to accumulated as assistant content
|
|
155
|
+
// so tool calls are visible in the analysis
|
|
156
|
+
currentItems.push(p);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (turns.length === 0)
|
|
160
|
+
return null;
|
|
161
|
+
return {
|
|
162
|
+
sessionId,
|
|
163
|
+
source: "codex",
|
|
164
|
+
model,
|
|
165
|
+
provider: "openai",
|
|
166
|
+
apiFormat: "responses",
|
|
167
|
+
cwd,
|
|
168
|
+
gitBranch,
|
|
169
|
+
turns,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/importers/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI session importer — entry point.
|
|
3
|
+
*
|
|
4
|
+
* Discovers and imports sessions from all supported tools into
|
|
5
|
+
* the context-lens store. Tracks which sessions have already been
|
|
6
|
+
* imported via a Set of sessionIds stored on the Store itself to
|
|
7
|
+
* avoid duplicating entries on repeated scans.
|
|
8
|
+
*/
|
|
9
|
+
import type { Store } from "../server/store.js";
|
|
10
|
+
import type { ImportSummary } from "./types.js";
|
|
11
|
+
export declare function importSessions(store: Store): ImportSummary[];
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/importers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAMhD,OAAO,KAAK,EAAiC,aAAa,EAAE,MAAM,YAAY,CAAC;AA8F/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,EAAE,CA2E5D"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI session importer — entry point.
|
|
3
|
+
*
|
|
4
|
+
* Discovers and imports sessions from all supported tools into
|
|
5
|
+
* the context-lens store. Tracks which sessions have already been
|
|
6
|
+
* imported via a Set of sessionIds stored on the Store itself to
|
|
7
|
+
* avoid duplicating entries on repeated scans.
|
|
8
|
+
*/
|
|
9
|
+
import { ingestCapture } from "../analysis/ingest.js";
|
|
10
|
+
import { discoverClaudeCodeSessions, parseClaudeCodeSession, } from "./claude-code.js";
|
|
11
|
+
import { discoverCodexSessions, parseCodexSession } from "./codex.js";
|
|
12
|
+
/**
|
|
13
|
+
* Convert one ImportedTurn into a CaptureData-like object and ingest it.
|
|
14
|
+
*
|
|
15
|
+
* We reconstruct a synthetic Anthropic/OpenAI request body from the
|
|
16
|
+
* messages accumulated up to that turn, then feed it through the
|
|
17
|
+
* existing ingestCapture pipeline.
|
|
18
|
+
*/
|
|
19
|
+
function ingestTurn(store, session, turn) {
|
|
20
|
+
// Build a synthetic request body that parseContextInfo can handle.
|
|
21
|
+
// For Anthropic format: { model, messages, system? }
|
|
22
|
+
// For OpenAI Responses format: { model, input: [...] }
|
|
23
|
+
let requestBody;
|
|
24
|
+
if (session.apiFormat === "anthropic-messages") {
|
|
25
|
+
const systemMessages = turn.messages.filter((m) => m.role === "system");
|
|
26
|
+
const nonSystem = turn.messages.filter((m) => m.role !== "system");
|
|
27
|
+
requestBody = {
|
|
28
|
+
model: session.model,
|
|
29
|
+
messages: nonSystem,
|
|
30
|
+
...(systemMessages.length > 0
|
|
31
|
+
? { system: systemMessages.map((m) => m.content).join("\n") }
|
|
32
|
+
: {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Responses API format (codex)
|
|
37
|
+
requestBody = {
|
|
38
|
+
model: session.model,
|
|
39
|
+
input: turn.messages.map((m) => ({
|
|
40
|
+
type: "message",
|
|
41
|
+
role: m.role,
|
|
42
|
+
content: m.content,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Build a synthetic response body with token usage so the store
|
|
47
|
+
// can record accurate cost without needing to re-estimate.
|
|
48
|
+
const responseBody = session.provider === "anthropic"
|
|
49
|
+
? {
|
|
50
|
+
type: "message",
|
|
51
|
+
role: "assistant",
|
|
52
|
+
model: session.model,
|
|
53
|
+
usage: {
|
|
54
|
+
input_tokens: turn.inputTokens ?? 0,
|
|
55
|
+
output_tokens: turn.outputTokens ?? 0,
|
|
56
|
+
cache_read_input_tokens: turn.cacheReadTokens ?? 0,
|
|
57
|
+
cache_creation_input_tokens: turn.cacheWriteTokens ?? 0,
|
|
58
|
+
},
|
|
59
|
+
content: [],
|
|
60
|
+
stop_reason: "end_turn",
|
|
61
|
+
}
|
|
62
|
+
: {
|
|
63
|
+
object: "response",
|
|
64
|
+
model: session.model,
|
|
65
|
+
usage: {
|
|
66
|
+
input_tokens: turn.inputTokens ?? 0,
|
|
67
|
+
output_tokens: turn.outputTokens ?? 0,
|
|
68
|
+
total_tokens: (turn.inputTokens ?? 0) + (turn.outputTokens ?? 0),
|
|
69
|
+
},
|
|
70
|
+
output: [],
|
|
71
|
+
status: "completed",
|
|
72
|
+
};
|
|
73
|
+
ingestCapture(store, {
|
|
74
|
+
provider: session.provider,
|
|
75
|
+
apiFormat: session.apiFormat,
|
|
76
|
+
source: session.source,
|
|
77
|
+
path: session.apiFormat === "anthropic-messages"
|
|
78
|
+
? "/v1/messages"
|
|
79
|
+
: "/responses",
|
|
80
|
+
method: "POST",
|
|
81
|
+
timestamp: turn.timestamp,
|
|
82
|
+
requestBody: requestBody,
|
|
83
|
+
responseBody: JSON.stringify(responseBody),
|
|
84
|
+
responseStatus: 200,
|
|
85
|
+
responseIsStreaming: false,
|
|
86
|
+
targetUrl: "",
|
|
87
|
+
requestHeaders: {},
|
|
88
|
+
responseHeaders: {},
|
|
89
|
+
timings: { send_ms: 0, wait_ms: 0, receive_ms: 0, total_ms: 0 },
|
|
90
|
+
requestBytes: 0,
|
|
91
|
+
responseBytes: 0,
|
|
92
|
+
sessionId: session.sessionId,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function importSessions(store) {
|
|
96
|
+
const summaries = [];
|
|
97
|
+
const importers = [
|
|
98
|
+
{
|
|
99
|
+
source: "claude-code",
|
|
100
|
+
discover: discoverClaudeCodeSessions,
|
|
101
|
+
parse: parseClaudeCodeSession,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
source: "codex",
|
|
105
|
+
discover: discoverCodexSessions,
|
|
106
|
+
parse: parseCodexSession,
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
for (const importer of importers) {
|
|
110
|
+
const summary = {
|
|
111
|
+
source: importer.source,
|
|
112
|
+
found: 0,
|
|
113
|
+
imported: 0,
|
|
114
|
+
skipped: 0,
|
|
115
|
+
errors: 0,
|
|
116
|
+
};
|
|
117
|
+
let files;
|
|
118
|
+
try {
|
|
119
|
+
files = importer.discover();
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
summaries.push(summary);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
summary.found = files.length;
|
|
126
|
+
for (const file of files) {
|
|
127
|
+
try {
|
|
128
|
+
const session = importer.parse(file);
|
|
129
|
+
if (!session || session.turns.length === 0) {
|
|
130
|
+
summary.skipped++;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (store.hasImportedSession(session.sessionId)) {
|
|
134
|
+
summary.skipped++;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
for (const turn of session.turns) {
|
|
138
|
+
ingestTurn(store, session, turn);
|
|
139
|
+
}
|
|
140
|
+
store.markSessionImported(session.sessionId);
|
|
141
|
+
summary.imported++;
|
|
142
|
+
console.log(` 📂 Imported [${session.source}] ${session.sessionId.slice(0, 8)}… (${session.turns.length} turns) from ${session.cwd ?? "unknown"}`);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
summary.errors++;
|
|
146
|
+
console.error(` ⚠️ Import error [${importer.source}] ${file}:`, err instanceof Error ? err.message : String(err));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
summaries.push(summary);
|
|
150
|
+
}
|
|
151
|
+
return summaries;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/importers/index.ts"],"names":[],"mappings":"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"}
|