@oratis/lisa 0.3.1 → 0.5.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/advisor/detectors.d.ts +25 -0
- package/dist/advisor/detectors.d.ts.map +1 -0
- package/dist/advisor/detectors.js +161 -0
- package/dist/advisor/detectors.js.map +1 -0
- package/dist/advisor/engine.d.ts +41 -0
- package/dist/advisor/engine.d.ts.map +1 -0
- package/dist/advisor/engine.js +156 -0
- package/dist/advisor/engine.js.map +1 -0
- package/dist/advisor/types.d.ts +68 -0
- package/dist/advisor/types.d.ts.map +1 -0
- package/dist/advisor/types.js +19 -0
- package/dist/advisor/types.js.map +1 -0
- package/dist/integrations/claude-code/observer.d.ts +19 -0
- package/dist/integrations/claude-code/observer.d.ts.map +1 -0
- package/dist/integrations/claude-code/observer.js +59 -0
- package/dist/integrations/claude-code/observer.js.map +1 -0
- package/dist/integrations/claude-code/parser.d.ts +2 -0
- package/dist/integrations/claude-code/parser.d.ts.map +1 -1
- package/dist/integrations/claude-code/parser.js +153 -0
- package/dist/integrations/claude-code/parser.js.map +1 -1
- package/dist/integrations/claude-code/watcher.d.ts +9 -0
- package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
- package/dist/integrations/claude-code/watcher.js +25 -4
- package/dist/integrations/claude-code/watcher.js.map +1 -1
- package/dist/integrations/codex/observer.d.ts +48 -0
- package/dist/integrations/codex/observer.d.ts.map +1 -0
- package/dist/integrations/codex/observer.js +213 -0
- package/dist/integrations/codex/observer.js.map +1 -0
- package/dist/integrations/current-hub.d.ts +13 -0
- package/dist/integrations/current-hub.d.ts.map +1 -0
- package/dist/integrations/current-hub.js +17 -0
- package/dist/integrations/current-hub.js.map +1 -0
- package/dist/integrations/hub.d.ts +45 -0
- package/dist/integrations/hub.d.ts.map +1 -0
- package/dist/integrations/hub.js +110 -0
- package/dist/integrations/hub.js.map +1 -0
- package/dist/integrations/registry.d.ts +15 -0
- package/dist/integrations/registry.d.ts.map +1 -0
- package/dist/integrations/registry.js +38 -0
- package/dist/integrations/registry.js.map +1 -0
- package/dist/integrations/types.d.ts +90 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +12 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/tools/advise_now.d.ts +11 -0
- package/dist/tools/advise_now.d.ts.map +1 -0
- package/dist/tools/advise_now.js +34 -0
- package/dist/tools/advise_now.js.map +1 -0
- package/dist/tools/dispatch_agent.d.ts +38 -0
- package/dist/tools/dispatch_agent.d.ts.map +1 -0
- package/dist/tools/dispatch_agent.js +145 -0
- package/dist/tools/dispatch_agent.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/vision/capture.d.ts +44 -0
- package/dist/vision/capture.d.ts.map +1 -0
- package/dist/vision/capture.js +86 -0
- package/dist/vision/capture.js.map +1 -0
- package/dist/web/island.d.ts +1 -1
- package/dist/web/island.d.ts.map +1 -1
- package/dist/web/island.js +43 -0
- package/dist/web/island.js.map +1 -1
- package/dist/web/lisa-html.d.ts +1 -1
- package/dist/web/lisa-html.d.ts.map +1 -1
- package/dist/web/lisa-html.js +61 -4
- package/dist/web/lisa-html.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +112 -17
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -221,4 +221,157 @@ function readNestedStopReason(e) {
|
|
|
221
221
|
}
|
|
222
222
|
return undefined;
|
|
223
223
|
}
|
|
224
|
+
// ── O2 (Tier 2): structural activity extraction ─────────────────────────────
|
|
225
|
+
//
|
|
226
|
+
// PRIVACY BOUNDARY (tested in parser.test.ts): this function reads ONLY
|
|
227
|
+
// structural metadata from the jsonl:
|
|
228
|
+
// - tool NAMES (tool_use block `.name`)
|
|
229
|
+
// - file PATHS (tool_use `.input.file_path` / `.path` / `.notebook_path`)
|
|
230
|
+
// - command argv[0] (first token of a Bash tool's `.input.command`)
|
|
231
|
+
// - error flags (`is_error`, `hookErrors`)
|
|
232
|
+
// - git branch (top-level `.gitBranch`)
|
|
233
|
+
// - token counts (`.message.usage`)
|
|
234
|
+
// It NEVER extracts or returns: any text block, user prompts, assistant
|
|
235
|
+
// replies, Write/Edit content (`new_string`/`old_string`/`content`), full
|
|
236
|
+
// Bash commands beyond argv[0], Grep patterns, or todo text. The privacy
|
|
237
|
+
// test asserts a unique secret planted in all of those never appears in the
|
|
238
|
+
// output. Keeps the "60-second audit" property of the metadata parser.
|
|
239
|
+
const ACTIVITY_TAIL_BYTES = 64 * 1024;
|
|
240
|
+
const MAX_TOOLS = 6;
|
|
241
|
+
const MAX_FILES = 10;
|
|
242
|
+
const PATH_KEYS = ["file_path", "path", "notebook_path"];
|
|
243
|
+
export async function parseSessionActivity(filePath) {
|
|
244
|
+
let size;
|
|
245
|
+
try {
|
|
246
|
+
const st = await fsp.stat(filePath);
|
|
247
|
+
if (!st.isFile() || st.size === 0)
|
|
248
|
+
return undefined;
|
|
249
|
+
size = st.size;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
let tail;
|
|
255
|
+
try {
|
|
256
|
+
const fd = await fsp.open(filePath, "r");
|
|
257
|
+
try {
|
|
258
|
+
const length = Math.min(ACTIVITY_TAIL_BYTES, size);
|
|
259
|
+
const buf = Buffer.alloc(length);
|
|
260
|
+
await fd.read(buf, 0, length, size - length);
|
|
261
|
+
tail = buf.toString("utf8");
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
await fd.close();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const lines = tail.split("\n").filter(Boolean);
|
|
271
|
+
if (size > ACTIVITY_TAIL_BYTES && lines.length > 0)
|
|
272
|
+
lines.shift();
|
|
273
|
+
let turnCount = 0;
|
|
274
|
+
const toolsInOrder = [];
|
|
275
|
+
const files = [];
|
|
276
|
+
let lastCommandName;
|
|
277
|
+
let lastError;
|
|
278
|
+
let gitBranch;
|
|
279
|
+
let inTok = 0;
|
|
280
|
+
let outTok = 0;
|
|
281
|
+
for (const line of lines) {
|
|
282
|
+
let e;
|
|
283
|
+
try {
|
|
284
|
+
e = JSON.parse(line);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (!e || typeof e !== "object")
|
|
290
|
+
continue;
|
|
291
|
+
const obj = e;
|
|
292
|
+
const type = readString(obj.type);
|
|
293
|
+
if (type && META_TYPES.has(type))
|
|
294
|
+
continue;
|
|
295
|
+
if (!gitBranch)
|
|
296
|
+
gitBranch = readString(obj.gitBranch);
|
|
297
|
+
if (type === "assistant" || type === "user")
|
|
298
|
+
turnCount++;
|
|
299
|
+
if (obj.is_error === true || obj.error === true)
|
|
300
|
+
lastError = "tool error";
|
|
301
|
+
if (typeof obj.hookErrors === "number" && obj.hookErrors > 0) {
|
|
302
|
+
lastError = `${obj.hookErrors} hook error(s)`;
|
|
303
|
+
}
|
|
304
|
+
const msg = obj.message;
|
|
305
|
+
if (!msg || typeof msg !== "object")
|
|
306
|
+
continue;
|
|
307
|
+
const m = msg;
|
|
308
|
+
const usage = m.usage;
|
|
309
|
+
if (usage && typeof usage === "object") {
|
|
310
|
+
const u = usage;
|
|
311
|
+
inTok += toNum(u.input_tokens);
|
|
312
|
+
outTok += toNum(u.output_tokens);
|
|
313
|
+
}
|
|
314
|
+
const content = m.content;
|
|
315
|
+
if (!Array.isArray(content))
|
|
316
|
+
continue;
|
|
317
|
+
for (const block of content) {
|
|
318
|
+
if (!block || typeof block !== "object")
|
|
319
|
+
continue;
|
|
320
|
+
const b = block;
|
|
321
|
+
// ONLY tool_use blocks. "text" blocks (prompts/replies) are skipped
|
|
322
|
+
// entirely — we never read their `.text`.
|
|
323
|
+
if (b.type !== "tool_use")
|
|
324
|
+
continue;
|
|
325
|
+
const name = readString(b.name);
|
|
326
|
+
if (!name)
|
|
327
|
+
continue;
|
|
328
|
+
toolsInOrder.push(name);
|
|
329
|
+
const input = b.input;
|
|
330
|
+
if (!input || typeof input !== "object")
|
|
331
|
+
continue;
|
|
332
|
+
const inp = input;
|
|
333
|
+
for (const k of PATH_KEYS) {
|
|
334
|
+
const p = inp[k];
|
|
335
|
+
if (typeof p === "string" && p) {
|
|
336
|
+
files.push(p);
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (name.toLowerCase() === "bash") {
|
|
341
|
+
const cmd = inp.command;
|
|
342
|
+
if (typeof cmd === "string" && cmd.trim()) {
|
|
343
|
+
// argv[0] ONLY — never the full command line.
|
|
344
|
+
lastCommandName = cmd.trim().split(/\s+/)[0];
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (turnCount === 0 && toolsInOrder.length === 0)
|
|
350
|
+
return undefined;
|
|
351
|
+
return {
|
|
352
|
+
turnCount,
|
|
353
|
+
lastTools: toolsInOrder.slice(-MAX_TOOLS),
|
|
354
|
+
filesTouched: dedupeKeepRecent(files, MAX_FILES),
|
|
355
|
+
lastCommandName,
|
|
356
|
+
lastError,
|
|
357
|
+
gitBranch,
|
|
358
|
+
tokens: inTok || outTok ? { input: inTok, output: outTok } : undefined,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function toNum(v) {
|
|
362
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
363
|
+
}
|
|
364
|
+
/** Dedupe paths keeping each one's most-recent position; cap to `max`. */
|
|
365
|
+
function dedupeKeepRecent(items, max) {
|
|
366
|
+
const seen = new Set();
|
|
367
|
+
const out = [];
|
|
368
|
+
for (let i = items.length - 1; i >= 0; i--) {
|
|
369
|
+
const it = items[i];
|
|
370
|
+
if (!seen.has(it)) {
|
|
371
|
+
seen.add(it);
|
|
372
|
+
out.unshift(it);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return out.slice(-max);
|
|
376
|
+
}
|
|
224
377
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,GAAG,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { EventEmitter } from "node:events";
|
|
38
38
|
import { type ClaudeSessionState } from "./parser.js";
|
|
39
|
+
import type { SessionActivity } from "../types.js";
|
|
39
40
|
/**
|
|
40
41
|
* One row in the in-memory session map. We hold mtime + size only —
|
|
41
42
|
* never any jsonl content.
|
|
@@ -61,6 +62,12 @@ export interface ClaudeSessionInfo {
|
|
|
61
62
|
* command". Undefined if the jsonl didn't record it.
|
|
62
63
|
*/
|
|
63
64
|
cwd?: string;
|
|
65
|
+
/**
|
|
66
|
+
* O2 (Tier-2): structural activity (tool names, files touched, last
|
|
67
|
+
* command, error, tokens). Populated when visibility ≥ "activity".
|
|
68
|
+
* Privacy: structural metadata only — never conversation content.
|
|
69
|
+
*/
|
|
70
|
+
activity?: SessionActivity;
|
|
64
71
|
}
|
|
65
72
|
export interface ClaudeSessionUpdate {
|
|
66
73
|
event: "new" | "message" | "state_changed";
|
|
@@ -80,9 +87,11 @@ export declare class ClaudeCodeWatcher extends EventEmitter {
|
|
|
80
87
|
private repollTimer;
|
|
81
88
|
private pendingChanges;
|
|
82
89
|
private readonly log;
|
|
90
|
+
private readonly computeActivity;
|
|
83
91
|
private started;
|
|
84
92
|
constructor(opts?: {
|
|
85
93
|
log?: Log;
|
|
94
|
+
computeActivity?: boolean;
|
|
86
95
|
});
|
|
87
96
|
/** Begin watching. Idempotent. Survives ~/.claude/projects not existing yet. */
|
|
88
97
|
start(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAA2C,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkCnD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjC,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;IAS/D,gFAAgF;IAC1E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,IAAI,IAAI;IAWZ,kEAAkE;IAClE,UAAU,IAAI,iBAAiB,EAAE;YAUnB,WAAW;YA8BX,cAAc;YAgBd,aAAa;IA8B3B,OAAO,CAAC,aAAa;IAQrB;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAcP,IAAI;IAoClB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,QAAQ;IA4DhB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;YAUT,YAAY;CAuB3B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,eAAO,MAAM,mBAAmB,QAAe,CAAC"}
|
|
@@ -39,7 +39,7 @@ import fsp from "node:fs/promises";
|
|
|
39
39
|
import path from "node:path";
|
|
40
40
|
import os from "node:os";
|
|
41
41
|
import { EventEmitter } from "node:events";
|
|
42
|
-
import { parseSessionState } from "./parser.js";
|
|
42
|
+
import { parseSessionState, parseSessionActivity } from "./parser.js";
|
|
43
43
|
const CLAUDE_HOME = process.env.CLAUDE_HOME ?? path.join(os.homedir(), ".claude");
|
|
44
44
|
const PROJECTS_DIR = path.join(CLAUDE_HOME, "projects");
|
|
45
45
|
const DEBOUNCE_MS = 200;
|
|
@@ -76,10 +76,14 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
76
76
|
repollTimer = null;
|
|
77
77
|
pendingChanges = new Map();
|
|
78
78
|
log;
|
|
79
|
+
computeActivity;
|
|
79
80
|
started = false;
|
|
80
81
|
constructor(opts = {}) {
|
|
81
82
|
super();
|
|
82
83
|
this.log = opts.log ?? (() => { });
|
|
84
|
+
// O2: only extract Tier-2 structural activity when asked (visibility ≥
|
|
85
|
+
// "activity"). Default off preserves the metadata-only behavior.
|
|
86
|
+
this.computeActivity = opts.computeActivity ?? false;
|
|
83
87
|
this.setMaxListeners(32);
|
|
84
88
|
}
|
|
85
89
|
/** Begin watching. Idempotent. Survives ~/.claude/projects not existing yet. */
|
|
@@ -151,7 +155,10 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
151
155
|
if (!st.isFile())
|
|
152
156
|
return;
|
|
153
157
|
const parsed = await parseSessionState(filePath);
|
|
154
|
-
const
|
|
158
|
+
const activity = this.computeActivity
|
|
159
|
+
? await parseSessionActivity(filePath)
|
|
160
|
+
: undefined;
|
|
161
|
+
const info = this.makeInfo(filePath, st.mtimeMs, st.size, parsed.state, parsed.reason, parsed.cwd, activity);
|
|
155
162
|
this.sessions.set(filePath, info);
|
|
156
163
|
}
|
|
157
164
|
catch {
|
|
@@ -225,7 +232,10 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
225
232
|
return;
|
|
226
233
|
const prev = this.sessions.get(fullPath);
|
|
227
234
|
const parsed = await parseSessionState(fullPath);
|
|
228
|
-
const
|
|
235
|
+
const activity = this.computeActivity
|
|
236
|
+
? await parseSessionActivity(fullPath)
|
|
237
|
+
: undefined;
|
|
238
|
+
const info = this.makeInfo(fullPath, st.mtimeMs, st.size, parsed.state, parsed.reason, parsed.cwd, activity);
|
|
229
239
|
this.sessions.set(fullPath, info);
|
|
230
240
|
if (!prev) {
|
|
231
241
|
this.emitUpdate("new", info);
|
|
@@ -256,7 +266,7 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
256
266
|
};
|
|
257
267
|
this.emit("update", payload);
|
|
258
268
|
}
|
|
259
|
-
makeInfo(filePath, mtimeMs, size, state, stateReason, cwd) {
|
|
269
|
+
makeInfo(filePath, mtimeMs, size, state, stateReason, cwd, activity) {
|
|
260
270
|
const sessionId = path.basename(filePath, ".jsonl");
|
|
261
271
|
const projectEncoded = path.basename(path.dirname(filePath));
|
|
262
272
|
// Staleness heuristic: any "working" session whose jsonl hasn't
|
|
@@ -285,6 +295,16 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
285
295
|
finalState = "waiting";
|
|
286
296
|
finalReason = stateReason === "tool_use" ? "permission" : "idle";
|
|
287
297
|
}
|
|
298
|
+
// When the session is blocked on a permission decision, surface which
|
|
299
|
+
// tool it's waiting on (the most recent tool name) — drives the advisor's
|
|
300
|
+
// "Codex wants to run X — approve?" prompts.
|
|
301
|
+
let finalActivity = activity;
|
|
302
|
+
if (finalActivity && finalReason === "permission" && finalActivity.lastTools.length) {
|
|
303
|
+
finalActivity = {
|
|
304
|
+
...finalActivity,
|
|
305
|
+
pendingPermission: finalActivity.lastTools[finalActivity.lastTools.length - 1],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
288
308
|
return {
|
|
289
309
|
projectEncoded,
|
|
290
310
|
projectLabel: decodeProjectLabel(projectEncoded),
|
|
@@ -294,6 +314,7 @@ export class ClaudeCodeWatcher extends EventEmitter {
|
|
|
294
314
|
state: finalState,
|
|
295
315
|
stateReason: finalReason,
|
|
296
316
|
cwd,
|
|
317
|
+
activity: finalActivity,
|
|
297
318
|
};
|
|
298
319
|
}
|
|
299
320
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAA2B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex CLI observer — proves the integration registry generalizes
|
|
3
|
+
* beyond Claude Code.
|
|
4
|
+
*
|
|
5
|
+
* Codex persists each session as JSONL at
|
|
6
|
+
* $CODEX_HOME/sessions/YYYY/MM/DD/rollout-*.jsonl (CODEX_HOME ~ ~/.codex)
|
|
7
|
+
* — the same file-tailing shape as Claude Code, so this adapter mirrors that
|
|
8
|
+
* watcher's structure: scan + fs.watch the sessions tree, derive state from
|
|
9
|
+
* each file's tail, normalize to AgentSession.
|
|
10
|
+
*
|
|
11
|
+
* PRIVACY: identical contract to claude-code — only structural metadata
|
|
12
|
+
* (entry `type`/`role`, error flags, file mtime). Never message content.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: Codex's exact rollout schema varies by version; the state parse is
|
|
15
|
+
* deliberately tolerant (unknown shapes → "unknown") and the integration is
|
|
16
|
+
* DISABLED by default (opt in via ~/.lisa/agents.json). It graceful-no-ops
|
|
17
|
+
* when $CODEX_HOME/sessions is absent.
|
|
18
|
+
*/
|
|
19
|
+
import { EventEmitter } from "node:events";
|
|
20
|
+
import type { AgentIntegrationConfig, AgentObserver, AgentSession, AgentSessionState } from "../types.js";
|
|
21
|
+
export declare class CodexObserver extends EventEmitter implements AgentObserver {
|
|
22
|
+
readonly agent = "codex";
|
|
23
|
+
private sessionsRoot;
|
|
24
|
+
private sessions;
|
|
25
|
+
private watcher;
|
|
26
|
+
private pending;
|
|
27
|
+
private emitFn;
|
|
28
|
+
constructor(cfg: AgentIntegrationConfig);
|
|
29
|
+
start(emit: (s: AgentSession) => void): Promise<void>;
|
|
30
|
+
list(): AgentSession[];
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
private scan;
|
|
33
|
+
private attach;
|
|
34
|
+
private record;
|
|
35
|
+
}
|
|
36
|
+
/** Recursively collect rollout-*.jsonl under root. Empty array if absent. */
|
|
37
|
+
export declare function walkRollouts(root: string): Promise<string[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Tolerant state derivation from a Codex rollout tail. Codex schema differs
|
|
40
|
+
* by version; we look for the last entry's role/type and any error flag.
|
|
41
|
+
* Unknown shapes → "unknown". Structural fields only.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseCodexState(filePath: string): Promise<{
|
|
44
|
+
state: AgentSessionState;
|
|
45
|
+
reason: string;
|
|
46
|
+
cwd?: string;
|
|
47
|
+
}>;
|
|
48
|
+
//# sourceMappingURL=observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/integrations/codex/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAgBrB,qBAAa,aAAc,SAAQ,YAAa,YAAW,aAAa;IACtE,QAAQ,CAAC,KAAK,WAAW;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAA4C;gBAE9C,GAAG,EAAE,sBAAsB;IAQjC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,IAAI,IAAI,YAAY,EAAE;IAShB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,IAAI;IAKlB,OAAO,CAAC,MAAM;YAiCA,MAAM;CAiBrB;AAcD,6EAA6E;AAC7E,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBlE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDrE"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex CLI observer — proves the integration registry generalizes
|
|
3
|
+
* beyond Claude Code.
|
|
4
|
+
*
|
|
5
|
+
* Codex persists each session as JSONL at
|
|
6
|
+
* $CODEX_HOME/sessions/YYYY/MM/DD/rollout-*.jsonl (CODEX_HOME ~ ~/.codex)
|
|
7
|
+
* — the same file-tailing shape as Claude Code, so this adapter mirrors that
|
|
8
|
+
* watcher's structure: scan + fs.watch the sessions tree, derive state from
|
|
9
|
+
* each file's tail, normalize to AgentSession.
|
|
10
|
+
*
|
|
11
|
+
* PRIVACY: identical contract to claude-code — only structural metadata
|
|
12
|
+
* (entry `type`/`role`, error flags, file mtime). Never message content.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: Codex's exact rollout schema varies by version; the state parse is
|
|
15
|
+
* deliberately tolerant (unknown shapes → "unknown") and the integration is
|
|
16
|
+
* DISABLED by default (opt in via ~/.lisa/agents.json). It graceful-no-ops
|
|
17
|
+
* when $CODEX_HOME/sessions is absent.
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import fsp from "node:fs/promises";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import os from "node:os";
|
|
23
|
+
import { EventEmitter } from "node:events";
|
|
24
|
+
import { registerIntegration } from "../registry.js";
|
|
25
|
+
const ACTIVE_WINDOW_MS = 30 * 60_000;
|
|
26
|
+
const MAX_LISTED = 10;
|
|
27
|
+
const DEBOUNCE_MS = 300;
|
|
28
|
+
const TAIL_BYTES = 32 * 1024;
|
|
29
|
+
export class CodexObserver extends EventEmitter {
|
|
30
|
+
agent = "codex";
|
|
31
|
+
sessionsRoot;
|
|
32
|
+
sessions = new Map();
|
|
33
|
+
watcher = null;
|
|
34
|
+
pending = new Map();
|
|
35
|
+
emitFn = null;
|
|
36
|
+
constructor(cfg) {
|
|
37
|
+
super();
|
|
38
|
+
const home = cfg.home
|
|
39
|
+
? cfg.home.replace(/^~/, os.homedir())
|
|
40
|
+
: process.env.CODEX_HOME ?? path.join(os.homedir(), ".codex");
|
|
41
|
+
this.sessionsRoot = path.join(home, "sessions");
|
|
42
|
+
}
|
|
43
|
+
async start(emit) {
|
|
44
|
+
this.emitFn = emit;
|
|
45
|
+
await this.scan();
|
|
46
|
+
this.attach();
|
|
47
|
+
}
|
|
48
|
+
list() {
|
|
49
|
+
const cutoff = Date.now() - ACTIVE_WINDOW_MS;
|
|
50
|
+
return [...this.sessions.values()]
|
|
51
|
+
.filter((s) => s.lastMtime >= cutoff)
|
|
52
|
+
.sort((a, b) => b.lastMtime - a.lastMtime)
|
|
53
|
+
.slice(0, MAX_LISTED)
|
|
54
|
+
.map(toAgentSession);
|
|
55
|
+
}
|
|
56
|
+
async stop() {
|
|
57
|
+
this.watcher?.close();
|
|
58
|
+
this.watcher = null;
|
|
59
|
+
for (const t of this.pending.values())
|
|
60
|
+
clearTimeout(t);
|
|
61
|
+
this.pending.clear();
|
|
62
|
+
}
|
|
63
|
+
// ── internals ──
|
|
64
|
+
async scan() {
|
|
65
|
+
const files = await walkRollouts(this.sessionsRoot);
|
|
66
|
+
for (const f of files)
|
|
67
|
+
await this.record(f);
|
|
68
|
+
}
|
|
69
|
+
attach() {
|
|
70
|
+
try {
|
|
71
|
+
this.watcher = fs.watch(this.sessionsRoot, { recursive: true, persistent: false }, (_e, filename) => {
|
|
72
|
+
if (!filename)
|
|
73
|
+
return;
|
|
74
|
+
const base = path.basename(filename);
|
|
75
|
+
if (!base.startsWith("rollout-") || !base.endsWith(".jsonl"))
|
|
76
|
+
return;
|
|
77
|
+
const full = path.join(this.sessionsRoot, filename);
|
|
78
|
+
const prev = this.pending.get(full);
|
|
79
|
+
if (prev)
|
|
80
|
+
clearTimeout(prev);
|
|
81
|
+
this.pending.set(full, setTimeout(() => {
|
|
82
|
+
this.pending.delete(full);
|
|
83
|
+
void this.record(full).then(() => {
|
|
84
|
+
const info = this.sessions.get(full);
|
|
85
|
+
if (info && this.emitFn)
|
|
86
|
+
this.emitFn(toAgentSession(info));
|
|
87
|
+
});
|
|
88
|
+
}, DEBOUNCE_MS));
|
|
89
|
+
});
|
|
90
|
+
this.watcher.on("error", () => {
|
|
91
|
+
this.watcher?.close();
|
|
92
|
+
this.watcher = null;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// sessions dir absent / unwatchable → graceful no-op (Codex not installed)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async record(full) {
|
|
100
|
+
try {
|
|
101
|
+
const st = await fsp.stat(full);
|
|
102
|
+
if (!st.isFile())
|
|
103
|
+
return;
|
|
104
|
+
const { state, reason, cwd } = await parseCodexState(full);
|
|
105
|
+
this.sessions.set(full, {
|
|
106
|
+
sessionId: path.basename(full, ".jsonl").replace(/^rollout-/, ""),
|
|
107
|
+
project: cwd ? path.basename(cwd) : path.basename(path.dirname(full)),
|
|
108
|
+
cwd,
|
|
109
|
+
lastMtime: st.mtimeMs,
|
|
110
|
+
state,
|
|
111
|
+
stateReason: reason,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
this.sessions.delete(full);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function toAgentSession(i) {
|
|
120
|
+
return {
|
|
121
|
+
agent: "codex",
|
|
122
|
+
sessionId: i.sessionId,
|
|
123
|
+
project: i.project,
|
|
124
|
+
cwd: i.cwd,
|
|
125
|
+
state: i.state,
|
|
126
|
+
stateReason: i.stateReason,
|
|
127
|
+
lastMtime: i.lastMtime,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Recursively collect rollout-*.jsonl under root. Empty array if absent. */
|
|
131
|
+
export async function walkRollouts(root) {
|
|
132
|
+
const out = [];
|
|
133
|
+
async function rec(dir) {
|
|
134
|
+
let entries;
|
|
135
|
+
try {
|
|
136
|
+
entries = await fsp.readdir(dir, { withFileTypes: true });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
for (const e of entries) {
|
|
142
|
+
const full = path.join(dir, e.name);
|
|
143
|
+
if (e.isDirectory())
|
|
144
|
+
await rec(full);
|
|
145
|
+
else if (e.name.startsWith("rollout-") && e.name.endsWith(".jsonl"))
|
|
146
|
+
out.push(full);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
await rec(root);
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Tolerant state derivation from a Codex rollout tail. Codex schema differs
|
|
154
|
+
* by version; we look for the last entry's role/type and any error flag.
|
|
155
|
+
* Unknown shapes → "unknown". Structural fields only.
|
|
156
|
+
*/
|
|
157
|
+
export async function parseCodexState(filePath) {
|
|
158
|
+
let tail;
|
|
159
|
+
let size;
|
|
160
|
+
try {
|
|
161
|
+
const st = await fsp.stat(filePath);
|
|
162
|
+
size = st.size;
|
|
163
|
+
if (size === 0)
|
|
164
|
+
return { state: "unknown", reason: "empty" };
|
|
165
|
+
const fd = await fsp.open(filePath, "r");
|
|
166
|
+
try {
|
|
167
|
+
const len = Math.min(TAIL_BYTES, size);
|
|
168
|
+
const buf = Buffer.alloc(len);
|
|
169
|
+
await fd.read(buf, 0, len, size - len);
|
|
170
|
+
tail = buf.toString("utf8");
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
await fd.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return { state: "unknown", reason: "read-failed" };
|
|
178
|
+
}
|
|
179
|
+
const lines = tail.split("\n").filter(Boolean);
|
|
180
|
+
if (size > TAIL_BYTES && lines.length)
|
|
181
|
+
lines.shift();
|
|
182
|
+
let cwd;
|
|
183
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
184
|
+
let e;
|
|
185
|
+
try {
|
|
186
|
+
e = JSON.parse(lines[i]);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (!cwd && typeof e.cwd === "string")
|
|
192
|
+
cwd = e.cwd;
|
|
193
|
+
if (e.is_error === true || e.error === true)
|
|
194
|
+
return { state: "error", reason: "is_error", cwd };
|
|
195
|
+
const type = typeof e.type === "string" ? e.type : undefined;
|
|
196
|
+
const role = typeof e.role === "string"
|
|
197
|
+
? e.role
|
|
198
|
+
: typeof e.message?.role === "string"
|
|
199
|
+
? (e.message.role)
|
|
200
|
+
: undefined;
|
|
201
|
+
// Heuristic: last meaningful entry from the assistant → it just spoke
|
|
202
|
+
// (waiting for the user); from the user / a tool call → working.
|
|
203
|
+
if (role === "assistant" || type === "assistant" || type === "response") {
|
|
204
|
+
return { state: "waiting", reason: "assistant", cwd };
|
|
205
|
+
}
|
|
206
|
+
if (role === "user" || type === "user" || type === "function_call" || type === "tool_use") {
|
|
207
|
+
return { state: "working", reason: type ?? role ?? "user", cwd };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return { state: "unknown", reason: "no-decision", cwd };
|
|
211
|
+
}
|
|
212
|
+
registerIntegration("codex", (cfg) => new CodexObserver(cfg));
|
|
213
|
+
//# sourceMappingURL=observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/integrations/codex/observer.ts"],"names":[],"mappings":"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"}
|