heyiam 0.1.2 → 0.1.3
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/app/dist/assets/index-Cv-3KLuW.js +14 -0
- package/app/dist/index.html +1 -1
- package/dist/analyzer.d.ts +4 -0
- package/dist/analyzer.js +1 -0
- package/dist/analyzer.js.map +1 -1
- package/dist/bridge.js +23 -3
- package/dist/bridge.js.map +1 -1
- package/dist/llm/triage.d.ts +3 -2
- package/dist/llm/triage.js +56 -46
- package/dist/llm/triage.js.map +1 -1
- package/dist/parsers/codex.d.ts +8 -0
- package/dist/parsers/codex.js +301 -0
- package/dist/parsers/codex.js.map +1 -0
- package/dist/parsers/cursor.d.ts +89 -0
- package/dist/parsers/cursor.js +531 -0
- package/dist/parsers/cursor.js.map +1 -0
- package/dist/parsers/gemini.d.ts +28 -0
- package/dist/parsers/gemini.js +209 -0
- package/dist/parsers/gemini.js.map +1 -0
- package/dist/parsers/index.d.ts +30 -9
- package/dist/parsers/index.js +266 -12
- package/dist/parsers/index.js.map +1 -1
- package/dist/parsers/types.d.ts +2 -0
- package/dist/parsers/types.js +8 -1
- package/dist/parsers/types.js.map +1 -1
- package/dist/server.js +83 -6
- package/dist/server.js.map +1 -1
- package/package.json +10 -2
- package/app/dist/assets/index-CROJdbHw.js +0 -14
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
// -- Parsing --
|
|
5
|
+
function parseLines(raw) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
for (const line of raw.split("\n")) {
|
|
8
|
+
const trimmed = line.trim();
|
|
9
|
+
if (!trimmed)
|
|
10
|
+
continue;
|
|
11
|
+
try {
|
|
12
|
+
lines.push(JSON.parse(trimmed));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// skip malformed
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return lines;
|
|
19
|
+
}
|
|
20
|
+
function getSessionMeta(lines) {
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
if (line.type === "session_meta") {
|
|
23
|
+
return line.payload;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const TOOL_NAME_MAP = {
|
|
29
|
+
exec_command: "Bash",
|
|
30
|
+
apply_patch: "Edit",
|
|
31
|
+
};
|
|
32
|
+
function extractToolCalls(lines) {
|
|
33
|
+
const calls = [];
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
if (line.type !== "response_item")
|
|
36
|
+
continue;
|
|
37
|
+
const p = line.payload;
|
|
38
|
+
if (p.type === "function_call") {
|
|
39
|
+
const fc = p;
|
|
40
|
+
let input = {};
|
|
41
|
+
try {
|
|
42
|
+
input = JSON.parse(fc.arguments);
|
|
43
|
+
}
|
|
44
|
+
catch { /* raw string arg like apply_patch */ }
|
|
45
|
+
const name = TOOL_NAME_MAP[fc.name] ?? fc.name;
|
|
46
|
+
calls.push({ id: fc.call_id, name, input });
|
|
47
|
+
}
|
|
48
|
+
else if (p.type === "custom_tool_call") {
|
|
49
|
+
const ct = p;
|
|
50
|
+
const name = TOOL_NAME_MAP[ct.name] ?? ct.name;
|
|
51
|
+
calls.push({ id: ct.call_id, name, input: { patch: ct.input } });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return calls;
|
|
55
|
+
}
|
|
56
|
+
function extractFilesTouched(toolCalls, cwd) {
|
|
57
|
+
const files = new Set();
|
|
58
|
+
for (const call of toolCalls) {
|
|
59
|
+
if (call.name === "Bash") {
|
|
60
|
+
const cmd = call.input.cmd;
|
|
61
|
+
const workdir = call.input.workdir;
|
|
62
|
+
if (workdir)
|
|
63
|
+
files.add(workdir);
|
|
64
|
+
if (cmd) {
|
|
65
|
+
// Extract file paths from common read patterns: cat, sed, rg, etc.
|
|
66
|
+
const pathMatches = cmd.match(/(?:cat|sed\s+-n\s+'[^']*'\s+|nl\s+|wc\s+-l\s+)(\S+)/g);
|
|
67
|
+
if (pathMatches) {
|
|
68
|
+
for (const m of pathMatches) {
|
|
69
|
+
const parts = m.split(/\s+/);
|
|
70
|
+
const filePath = parts[parts.length - 1];
|
|
71
|
+
if (filePath && !filePath.startsWith("-"))
|
|
72
|
+
files.add(filePath);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (call.name === "Edit") {
|
|
78
|
+
// apply_patch: extract file paths from patch content
|
|
79
|
+
const patch = call.input.patch;
|
|
80
|
+
if (patch) {
|
|
81
|
+
const fileMatches = patch.matchAll(/\*\*\* (?:Update|Add|Delete) File: (.+)/g);
|
|
82
|
+
for (const m of fileMatches) {
|
|
83
|
+
files.add(m[1]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return [...files].sort();
|
|
89
|
+
}
|
|
90
|
+
function countTurns(lines) {
|
|
91
|
+
let turns = 0;
|
|
92
|
+
for (const line of lines) {
|
|
93
|
+
if (line.type === "event_msg") {
|
|
94
|
+
const p = line.payload;
|
|
95
|
+
if (p.type === "task_started")
|
|
96
|
+
turns++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return Math.max(turns, 1);
|
|
100
|
+
}
|
|
101
|
+
const IDLE_THRESHOLD_MS = 5 * 60 * 1000;
|
|
102
|
+
function computeDuration(lines) {
|
|
103
|
+
const timestamps = [];
|
|
104
|
+
let startStr = null;
|
|
105
|
+
let endStr = null;
|
|
106
|
+
for (const line of lines) {
|
|
107
|
+
if (!line.timestamp)
|
|
108
|
+
continue;
|
|
109
|
+
if (!startStr)
|
|
110
|
+
startStr = line.timestamp;
|
|
111
|
+
endStr = line.timestamp;
|
|
112
|
+
timestamps.push(new Date(line.timestamp).getTime());
|
|
113
|
+
}
|
|
114
|
+
if (timestamps.length < 2 || !startStr || !endStr) {
|
|
115
|
+
return { duration_ms: 0, wall_clock_ms: 0, start_time: startStr, end_time: endStr };
|
|
116
|
+
}
|
|
117
|
+
const wallClock = timestamps[timestamps.length - 1] - timestamps[0];
|
|
118
|
+
let activeMs = 0;
|
|
119
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
120
|
+
const gap = timestamps[i] - timestamps[i - 1];
|
|
121
|
+
if (gap < IDLE_THRESHOLD_MS)
|
|
122
|
+
activeMs += gap;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
duration_ms: Math.max(activeMs, 0),
|
|
126
|
+
wall_clock_ms: Math.max(wallClock, 0),
|
|
127
|
+
start_time: startStr,
|
|
128
|
+
end_time: endStr,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function computeLocStats(toolCalls) {
|
|
132
|
+
let totalAdded = 0;
|
|
133
|
+
let totalRemoved = 0;
|
|
134
|
+
const filesChanged = new Set();
|
|
135
|
+
for (const call of toolCalls) {
|
|
136
|
+
if (call.name !== "Edit")
|
|
137
|
+
continue;
|
|
138
|
+
const patch = call.input.patch;
|
|
139
|
+
if (!patch)
|
|
140
|
+
continue;
|
|
141
|
+
// Parse apply_patch format for file changes
|
|
142
|
+
const fileMatches = patch.matchAll(/\*\*\* (?:Update|Add|Delete) File: (.+)/g);
|
|
143
|
+
for (const m of fileMatches) {
|
|
144
|
+
filesChanged.add(m[1]);
|
|
145
|
+
}
|
|
146
|
+
for (const line of patch.split("\n")) {
|
|
147
|
+
if (line.startsWith("+") && !line.startsWith("+++"))
|
|
148
|
+
totalAdded++;
|
|
149
|
+
if (line.startsWith("-") && !line.startsWith("---"))
|
|
150
|
+
totalRemoved++;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
loc_added: totalAdded,
|
|
155
|
+
loc_removed: totalRemoved,
|
|
156
|
+
loc_net: totalAdded - totalRemoved,
|
|
157
|
+
files_changed: [...filesChanged].sort(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function toRawEntries(lines, sessionId, cwd) {
|
|
161
|
+
return lines.map((line, i) => {
|
|
162
|
+
const p = line.payload;
|
|
163
|
+
let entryType = "system";
|
|
164
|
+
let message;
|
|
165
|
+
if (line.type === "response_item" && p.type === "message") {
|
|
166
|
+
const mp = p;
|
|
167
|
+
entryType = mp.role === "user" ? "user" : mp.role === "assistant" ? "assistant" : "system";
|
|
168
|
+
const textContent = mp.content
|
|
169
|
+
?.filter((b) => b.type === "input_text" || b.type === "output_text")
|
|
170
|
+
.map((b) => b.text ?? "")
|
|
171
|
+
.join("\n");
|
|
172
|
+
message = { role: mp.role, content: textContent || undefined };
|
|
173
|
+
}
|
|
174
|
+
else if (line.type === "response_item" && (p.type === "function_call" || p.type === "custom_tool_call")) {
|
|
175
|
+
entryType = "assistant";
|
|
176
|
+
}
|
|
177
|
+
else if (line.type === "event_msg" && p.type === "user_message") {
|
|
178
|
+
entryType = "user";
|
|
179
|
+
message = { role: "user", content: p.message };
|
|
180
|
+
}
|
|
181
|
+
else if (line.type === "event_msg" && p.type === "agent_message") {
|
|
182
|
+
entryType = "assistant";
|
|
183
|
+
message = { role: "assistant", content: p.message };
|
|
184
|
+
}
|
|
185
|
+
else if (line.type === "session_meta") {
|
|
186
|
+
entryType = "system";
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
type: entryType,
|
|
190
|
+
uuid: `codex-${sessionId}-${i}`,
|
|
191
|
+
timestamp: line.timestamp,
|
|
192
|
+
sessionId,
|
|
193
|
+
message,
|
|
194
|
+
cwd,
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// -- Parser interface --
|
|
199
|
+
async function detect(path) {
|
|
200
|
+
if (!path.endsWith(".jsonl"))
|
|
201
|
+
return false;
|
|
202
|
+
try {
|
|
203
|
+
const raw = await readFile(path, "utf-8");
|
|
204
|
+
const firstLine = raw.split("\n")[0];
|
|
205
|
+
if (!firstLine)
|
|
206
|
+
return false;
|
|
207
|
+
const entry = JSON.parse(firstLine);
|
|
208
|
+
if (entry.type !== "session_meta")
|
|
209
|
+
return false;
|
|
210
|
+
const payload = entry.payload;
|
|
211
|
+
return !!(payload?.cwd && (payload?.cli_version || payload?.originator));
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async function parse(path) {
|
|
218
|
+
const raw = await readFile(path, "utf-8");
|
|
219
|
+
const lines = parseLines(raw);
|
|
220
|
+
const meta = getSessionMeta(lines);
|
|
221
|
+
const sessionId = meta?.id ?? "unknown";
|
|
222
|
+
const cwd = meta?.cwd;
|
|
223
|
+
const toolCalls = extractToolCalls(lines);
|
|
224
|
+
const filesTouched = extractFilesTouched(toolCalls, cwd);
|
|
225
|
+
const turns = countTurns(lines);
|
|
226
|
+
const { duration_ms, wall_clock_ms, start_time, end_time } = computeDuration(lines);
|
|
227
|
+
const loc_stats = computeLocStats(toolCalls);
|
|
228
|
+
const raw_entries = toRawEntries(lines, sessionId, cwd);
|
|
229
|
+
return {
|
|
230
|
+
source: "codex",
|
|
231
|
+
turns,
|
|
232
|
+
tool_calls: toolCalls,
|
|
233
|
+
files_touched: filesTouched,
|
|
234
|
+
duration_ms,
|
|
235
|
+
wall_clock_ms,
|
|
236
|
+
loc_stats,
|
|
237
|
+
raw_entries,
|
|
238
|
+
start_time,
|
|
239
|
+
end_time,
|
|
240
|
+
cwd,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export const codexParser = {
|
|
244
|
+
name: "codex",
|
|
245
|
+
detect,
|
|
246
|
+
parse,
|
|
247
|
+
};
|
|
248
|
+
async function readFirstLine(filePath) {
|
|
249
|
+
try {
|
|
250
|
+
const raw = await readFile(filePath, "utf-8");
|
|
251
|
+
const nl = raw.indexOf("\n");
|
|
252
|
+
return nl === -1 ? raw : raw.slice(0, nl);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async function walkDir(dir, pattern, results) {
|
|
259
|
+
let entries;
|
|
260
|
+
try {
|
|
261
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
for (const entry of entries) {
|
|
267
|
+
const full = join(dir, entry.name);
|
|
268
|
+
if (entry.isDirectory()) {
|
|
269
|
+
await walkDir(full, pattern, results);
|
|
270
|
+
}
|
|
271
|
+
else if (pattern.test(entry.name)) {
|
|
272
|
+
results.push(full);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export async function discoverCodexSessions() {
|
|
277
|
+
const sessionsDir = join(homedir(), ".codex", "sessions");
|
|
278
|
+
const files = [];
|
|
279
|
+
await walkDir(sessionsDir, /^rollout-.*\.jsonl$/, files);
|
|
280
|
+
const results = [];
|
|
281
|
+
for (const filePath of files) {
|
|
282
|
+
const firstLine = await readFirstLine(filePath);
|
|
283
|
+
if (!firstLine)
|
|
284
|
+
continue;
|
|
285
|
+
try {
|
|
286
|
+
const entry = JSON.parse(firstLine);
|
|
287
|
+
if (entry.type !== "session_meta" || !entry.payload?.cwd)
|
|
288
|
+
continue;
|
|
289
|
+
results.push({
|
|
290
|
+
path: filePath,
|
|
291
|
+
sessionId: entry.payload.id,
|
|
292
|
+
cwd: entry.payload.cwd,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return results;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/parsers/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { SessionParser, SessionAnalysis } from "./types.js";
|
|
2
|
+
/** A single "bubble" (message) in a Cursor composer conversation */
|
|
3
|
+
interface CursorBubble {
|
|
4
|
+
_v?: number;
|
|
5
|
+
type: number;
|
|
6
|
+
bubbleId: string;
|
|
7
|
+
text: string;
|
|
8
|
+
createdAt?: string;
|
|
9
|
+
isAgentic?: boolean;
|
|
10
|
+
unifiedMode?: number;
|
|
11
|
+
tokenCount?: {
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
};
|
|
15
|
+
toolFormerData?: CursorToolFormerData;
|
|
16
|
+
codeBlocks?: CursorCodeBlock[];
|
|
17
|
+
thinking?: {
|
|
18
|
+
text: string;
|
|
19
|
+
};
|
|
20
|
+
context?: CursorContext;
|
|
21
|
+
supportedTools?: number[];
|
|
22
|
+
}
|
|
23
|
+
interface CursorToolFormerData {
|
|
24
|
+
tool?: number;
|
|
25
|
+
toolCallId?: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
rawArgs?: string;
|
|
28
|
+
params?: string;
|
|
29
|
+
result?: string;
|
|
30
|
+
status?: string;
|
|
31
|
+
modelCallId?: string;
|
|
32
|
+
additionalData?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
interface CursorCodeBlock {
|
|
35
|
+
uri?: {
|
|
36
|
+
path?: string;
|
|
37
|
+
_fsPath?: string;
|
|
38
|
+
};
|
|
39
|
+
content?: string;
|
|
40
|
+
codeblockId?: string;
|
|
41
|
+
}
|
|
42
|
+
interface CursorContext {
|
|
43
|
+
fileSelections?: Array<{
|
|
44
|
+
uri?: {
|
|
45
|
+
path?: string;
|
|
46
|
+
};
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
export interface CursorWorkspace {
|
|
50
|
+
workspaceId: string;
|
|
51
|
+
dbPath: string;
|
|
52
|
+
projectDir: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Scan Cursor's workspaceStorage to find all workspaces and their project directories.
|
|
56
|
+
*/
|
|
57
|
+
export declare function discoverCursorWorkspaces(): Promise<CursorWorkspace[]>;
|
|
58
|
+
export interface CursorConversation {
|
|
59
|
+
composerId: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
createdAt: number;
|
|
62
|
+
lastUpdatedAt?: number;
|
|
63
|
+
mode?: string;
|
|
64
|
+
totalLinesAdded?: number;
|
|
65
|
+
totalLinesRemoved?: number;
|
|
66
|
+
workspace: CursorWorkspace;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List all composer conversations in a workspace's state DB.
|
|
70
|
+
*/
|
|
71
|
+
export declare function listConversations(workspace: CursorWorkspace): CursorConversation[];
|
|
72
|
+
/**
|
|
73
|
+
* Read all bubbles for a conversation from the global state DB.
|
|
74
|
+
*/
|
|
75
|
+
export declare function readBubbles(conversationId: string, globalDbPath?: string): CursorBubble[];
|
|
76
|
+
/**
|
|
77
|
+
* Parse a Cursor conversation into a SessionAnalysis.
|
|
78
|
+
* The "path" for Cursor is a synthetic string: "cursor://{globalDbPath}#{conversationId}"
|
|
79
|
+
*/
|
|
80
|
+
export interface CursorParseHints {
|
|
81
|
+
name?: string;
|
|
82
|
+
createdAt?: number;
|
|
83
|
+
lastUpdatedAt?: number;
|
|
84
|
+
totalLinesAdded?: number;
|
|
85
|
+
totalLinesRemoved?: number;
|
|
86
|
+
}
|
|
87
|
+
export declare function parseCursorConversation(conversationId: string, globalDbPath?: string, hints?: CursorParseHints): Promise<SessionAnalysis>;
|
|
88
|
+
export declare const cursorParser: SessionParser;
|
|
89
|
+
export {};
|