ai-obs-cli 0.0.0-stage → 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/README.md +666 -2
- package/bin/ai-obs.js +8 -0
- package/dist/adapters/claude-code/analyze.js +189 -0
- package/dist/adapters/claude-code/analyze.js.map +1 -0
- package/dist/adapters/claude-code/detect.js +60 -0
- package/dist/adapters/claude-code/detect.js.map +1 -0
- package/dist/adapters/claude-code/handlers.js +183 -0
- package/dist/adapters/claude-code/handlers.js.map +1 -0
- package/dist/adapters/claude-code/index.js +55 -0
- package/dist/adapters/claude-code/index.js.map +1 -0
- package/dist/adapters/claude-code/run-links.js +53 -0
- package/dist/adapters/claude-code/run-links.js.map +1 -0
- package/dist/adapters/claude-code/session.js +427 -0
- package/dist/adapters/claude-code/session.js.map +1 -0
- package/dist/adapters/claude-code/settings.js +161 -0
- package/dist/adapters/claude-code/settings.js.map +1 -0
- package/dist/adapters/claude-code/state.js +66 -0
- package/dist/adapters/claude-code/state.js.map +1 -0
- package/dist/adapters/claude-code/subagents.js +246 -0
- package/dist/adapters/claude-code/subagents.js.map +1 -0
- package/dist/adapters/claude-code/transcript.js +309 -0
- package/dist/adapters/claude-code/transcript.js.map +1 -0
- package/dist/adapters/codex/accumulator.js +135 -0
- package/dist/adapters/codex/accumulator.js.map +1 -0
- package/dist/adapters/codex/detect.js +93 -0
- package/dist/adapters/codex/detect.js.map +1 -0
- package/dist/adapters/codex/hooks-config.js +158 -0
- package/dist/adapters/codex/hooks-config.js.map +1 -0
- package/dist/adapters/codex/index.js +270 -0
- package/dist/adapters/codex/index.js.map +1 -0
- package/dist/adapters/codex/locate.js +72 -0
- package/dist/adapters/codex/locate.js.map +1 -0
- package/dist/adapters/codex/records.js +194 -0
- package/dist/adapters/codex/records.js.map +1 -0
- package/dist/adapters/codex/rollout.js +72 -0
- package/dist/adapters/codex/rollout.js.map +1 -0
- package/dist/adapters/codex/session.js +212 -0
- package/dist/adapters/codex/session.js.map +1 -0
- package/dist/adapters/codex/subagents.js +139 -0
- package/dist/adapters/codex/subagents.js.map +1 -0
- package/dist/adapters/codex/summarize.js +84 -0
- package/dist/adapters/codex/summarize.js.map +1 -0
- package/dist/adapters/codex/tools.js +145 -0
- package/dist/adapters/codex/tools.js.map +1 -0
- package/dist/adapters/hook-command.js +94 -0
- package/dist/adapters/hook-command.js.map +1 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/analysis/corrections.js +79 -0
- package/dist/analysis/corrections.js.map +1 -0
- package/dist/analysis/digest.js +16 -0
- package/dist/analysis/digest.js.map +1 -0
- package/dist/analysis/outcome.js +76 -0
- package/dist/analysis/outcome.js.map +1 -0
- package/dist/analysis/phases.js +203 -0
- package/dist/analysis/phases.js.map +1 -0
- package/dist/analysis/summaries.js +350 -0
- package/dist/analysis/summaries.js.map +1 -0
- package/dist/analysis/tokens.js +67 -0
- package/dist/analysis/tokens.js.map +1 -0
- package/dist/analysis/usage.js +229 -0
- package/dist/analysis/usage.js.map +1 -0
- package/dist/cc-cache.js +81 -0
- package/dist/cc-cache.js.map +1 -0
- package/dist/cli.js +128 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/common.js +235 -0
- package/dist/commands/common.js.map +1 -0
- package/dist/commands/doctor.js +193 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/flush.js +131 -0
- package/dist/commands/flush.js.map +1 -0
- package/dist/commands/init.js +119 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.js +171 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/live.js +130 -0
- package/dist/commands/live.js.map +1 -0
- package/dist/commands/login.js +397 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/status.js +155 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/token.js +92 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/commands/uninstall.js +56 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/config.js +305 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +109 -0
- package/dist/context.js.map +1 -0
- package/dist/delivery.js +151 -0
- package/dist/delivery.js.map +1 -0
- package/dist/dotfile.js +187 -0
- package/dist/dotfile.js.map +1 -0
- package/dist/events.js +259 -0
- package/dist/events.js.map +1 -0
- package/dist/fsutil.js +50 -0
- package/dist/fsutil.js.map +1 -0
- package/dist/git.js +139 -0
- package/dist/git.js.map +1 -0
- package/dist/hook.js +147 -0
- package/dist/hook.js.map +1 -0
- package/dist/http.js +35 -0
- package/dist/http.js.map +1 -0
- package/dist/jobs.js +53 -0
- package/dist/jobs.js.map +1 -0
- package/dist/live/claude-code.js +226 -0
- package/dist/live/claude-code.js.map +1 -0
- package/dist/live/codex.js +91 -0
- package/dist/live/codex.js.map +1 -0
- package/dist/live/monitor.js +229 -0
- package/dist/live/monitor.js.map +1 -0
- package/dist/live/render.js +92 -0
- package/dist/live/render.js.map +1 -0
- package/dist/lock.js +93 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.js +36 -0
- package/dist/log.js.map +1 -0
- package/dist/migrate.js +109 -0
- package/dist/migrate.js.map +1 -0
- package/dist/nudge.js +231 -0
- package/dist/nudge.js.map +1 -0
- package/dist/paths.js +73 -0
- package/dist/paths.js.map +1 -0
- package/dist/pk-cache.js +110 -0
- package/dist/pk-cache.js.map +1 -0
- package/dist/prices.js +45 -0
- package/dist/prices.js.map +1 -0
- package/dist/project-key.js +144 -0
- package/dist/project-key.js.map +1 -0
- package/dist/protocol-types.js +30 -0
- package/dist/protocol-types.js.map +1 -0
- package/dist/queue.js +649 -0
- package/dist/queue.js.map +1 -0
- package/dist/routing.js +122 -0
- package/dist/routing.js.map +1 -0
- package/dist/runtime.js +54 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sender.js +559 -0
- package/dist/sender.js.map +1 -0
- package/dist/state.js +59 -0
- package/dist/state.js.map +1 -0
- package/dist/ulid.js +73 -0
- package/dist/ulid.js.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/dist/warnings.js +71 -0
- package/dist/warnings.js.map +1 -0
- package/dist/worker-main.js +14 -0
- package/dist/worker-main.js.map +1 -0
- package/dist/worker.js +295 -0
- package/dist/worker.js.map +1 -0
- package/package.json +25 -4
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { closeSync, fstatSync, openSync, readSync } from 'node:fs';
|
|
2
|
+
const CHUNK = 1 << 20;
|
|
3
|
+
/** Cap per read so one huge rollout cannot stall the worker; the rest is read on the next hook. */
|
|
4
|
+
const MAX_BYTES_PER_READ = 64 << 20;
|
|
5
|
+
export function readNewLines(path, offset) {
|
|
6
|
+
let fd;
|
|
7
|
+
try {
|
|
8
|
+
fd = openSync(path, 'r');
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return { lines: [], offset, reset: false };
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const size = fstatSync(fd).size;
|
|
15
|
+
const reset = size < offset;
|
|
16
|
+
let pos = reset ? 0 : offset;
|
|
17
|
+
const lines = [];
|
|
18
|
+
let carry = Buffer.alloc(0);
|
|
19
|
+
let consumed = pos;
|
|
20
|
+
const buf = Buffer.alloc(CHUNK);
|
|
21
|
+
while (pos < size && pos - offset < MAX_BYTES_PER_READ) {
|
|
22
|
+
const n = readSync(fd, buf, 0, Math.min(CHUNK, size - pos), pos);
|
|
23
|
+
if (n <= 0)
|
|
24
|
+
break;
|
|
25
|
+
pos += n;
|
|
26
|
+
let data = Buffer.concat([carry, buf.subarray(0, n)]);
|
|
27
|
+
let nl = data.indexOf(0x0a);
|
|
28
|
+
while (nl >= 0) {
|
|
29
|
+
const line = data.subarray(0, nl).toString('utf8').trim();
|
|
30
|
+
consumed += nl + 1;
|
|
31
|
+
if (line)
|
|
32
|
+
lines.push(line);
|
|
33
|
+
data = data.subarray(nl + 1);
|
|
34
|
+
nl = data.indexOf(0x0a);
|
|
35
|
+
}
|
|
36
|
+
carry = Buffer.from(data);
|
|
37
|
+
}
|
|
38
|
+
return { lines, offset: consumed, reset };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
closeSync(fd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** First line of a file (the rollout's session_meta), read in chunks up to 8 MB; null when missing. */
|
|
45
|
+
export function readFirstLine(path) {
|
|
46
|
+
let fd;
|
|
47
|
+
try {
|
|
48
|
+
fd = openSync(path, 'r');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const parts = [];
|
|
55
|
+
const buf = Buffer.alloc(64 * 1024);
|
|
56
|
+
for (let pos = 0; pos < 8 << 20;) {
|
|
57
|
+
const n = readSync(fd, buf, 0, buf.length, pos);
|
|
58
|
+
if (n <= 0)
|
|
59
|
+
break;
|
|
60
|
+
const nl = buf.subarray(0, n).indexOf(0x0a);
|
|
61
|
+
parts.push(Buffer.from(buf.subarray(0, nl >= 0 ? nl : n)));
|
|
62
|
+
if (nl >= 0)
|
|
63
|
+
break;
|
|
64
|
+
pos += n;
|
|
65
|
+
}
|
|
66
|
+
return Buffer.concat(parts).toString('utf8');
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
closeSync(fd);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=rollout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollout.js","sourceRoot":"","sources":["../../../src/adapters/codex/rollout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { buildDigest } from '../../analysis/digest.js';
|
|
2
|
+
import { looksLikeCorrection } from '../../analysis/corrections.js';
|
|
3
|
+
import { detectRevert, finalOutcome, outcomeChanged, provisionalOutcome } from '../../analysis/outcome.js';
|
|
4
|
+
import { attributeTime } from '../../analysis/phases.js';
|
|
5
|
+
import { mergeUsage, primaryModel } from '../../analysis/tokens.js';
|
|
6
|
+
import { mcpFromTools } from '../../analysis/usage.js';
|
|
7
|
+
import { sessionEndEvent, sessionStartEvent, turnEvent, turnOutcomeEvent } from '../../events.js';
|
|
8
|
+
import { addUsage, applyItem, newAcc, usageDelta } from './accumulator.js';
|
|
9
|
+
import { isRealPrompt } from './records.js';
|
|
10
|
+
import { toolCounts } from './subagents.js';
|
|
11
|
+
export function newSessionState(sessionId, at) {
|
|
12
|
+
return {
|
|
13
|
+
v: 1, sessionId, rolloutPath: null, offset: 0, meta: null, subagent: false, startedSent: false, ended: false,
|
|
14
|
+
lastTotal: null, model: null, effort: null, open: null, carry: [], prev: null, closed: [], emitted: [], digests: [], lastActivityAt: at,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const MAX_CLOSED = 50;
|
|
18
|
+
const MAX_EMITTED = 5;
|
|
19
|
+
const MAX_DIGESTS = 200;
|
|
20
|
+
// ---------------------------------------------------------------- outcome patches
|
|
21
|
+
/** Final outcome of the previous turn once the next prompt is known (correction heuristic). */
|
|
22
|
+
export function finalizePrev(state, env, follow, at) {
|
|
23
|
+
const prev = state.prev;
|
|
24
|
+
if (!prev || prev.final)
|
|
25
|
+
return;
|
|
26
|
+
const correction = follow.prompt ? looksLikeCorrection(follow.prompt) : false;
|
|
27
|
+
prev.correction = correction;
|
|
28
|
+
prev.final = finalOutcome(prev.provisional, follow.sessionEnded ? { sessionEnded: true } : { correction });
|
|
29
|
+
env.emit([turnOutcomeEvent({ harness: env.harness, turnId: prev.turnId, outcome: prev.final, at: Math.max(at, prev.endedAt) })]);
|
|
30
|
+
}
|
|
31
|
+
/** The turn after `prev` reverted its edits (git checkout/restore/reset, or removed ≥ 80 % of its added lines). */
|
|
32
|
+
function checkRevert(state, env, acc, at) {
|
|
33
|
+
const prev = state.prev;
|
|
34
|
+
if (!prev || prev.revertChecked)
|
|
35
|
+
return;
|
|
36
|
+
prev.revertChecked = true;
|
|
37
|
+
const revert = acc.revertCmd || detectRevert({ added: prev.fpAdded, removed: [] }, { added: [], removed: acc.fpRemoved });
|
|
38
|
+
if (!revert)
|
|
39
|
+
return;
|
|
40
|
+
const base = prev.final ?? prev.provisional;
|
|
41
|
+
const next = finalOutcome(prev.provisional, { correction: prev.correction, revert: true });
|
|
42
|
+
if (outcomeChanged(base, next)) {
|
|
43
|
+
prev.final = next;
|
|
44
|
+
env.emit([turnOutcomeEvent({ harness: env.harness, turnId: prev.turnId, outcome: next, at })]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------- turns
|
|
48
|
+
function turnInputOf(state, acc, endAt) {
|
|
49
|
+
const main = primaryModel(acc.usage);
|
|
50
|
+
return {
|
|
51
|
+
sessionId: state.sessionId,
|
|
52
|
+
turnId: acc.turnId,
|
|
53
|
+
startedAt: acc.startedAt,
|
|
54
|
+
endedAt: endAt,
|
|
55
|
+
model: main?.model ?? acc.model ?? 'unknown',
|
|
56
|
+
effort: main ? main.effort : acc.effort,
|
|
57
|
+
usage: acc.usage,
|
|
58
|
+
phases: attributeTime(acc.timeline, endAt),
|
|
59
|
+
tools: toolCounts(acc.tools),
|
|
60
|
+
skills: acc.skills,
|
|
61
|
+
mcp: mcpFromTools(acc.tools),
|
|
62
|
+
mcpStats: acc.mcpStats,
|
|
63
|
+
filesTouched: acc.files.length,
|
|
64
|
+
linesAdded: acc.linesAdded,
|
|
65
|
+
linesRemoved: acc.linesRemoved,
|
|
66
|
+
outcome: provisionalOutcome({ stopFailure: acc.error, interrupted: acc.interrupted, lastCheck: acc.lastCheck }),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Closes the open turn: emits `turn` (+ sub-agent `run`s), updates prev/outcome bookkeeping. */
|
|
70
|
+
export function closeOpenTurn(state, env, endAt) {
|
|
71
|
+
const acc = state.open;
|
|
72
|
+
if (!acc)
|
|
73
|
+
return;
|
|
74
|
+
state.open = null;
|
|
75
|
+
const end = Math.max(endAt, acc.startedAt);
|
|
76
|
+
if (state.prev && !state.prev.final)
|
|
77
|
+
finalizePrev(state, env, { prompt: acc.prompt }, acc.startedAt);
|
|
78
|
+
checkRevert(state, env, acc, end);
|
|
79
|
+
const input = turnInputOf(state, acc, end);
|
|
80
|
+
const kids = acc.spawned.length ? env.children(acc.turnId, acc.spawned) : { runs: [], usage: {}, missing: [] };
|
|
81
|
+
const childUsage = Object.values(kids.usage);
|
|
82
|
+
env.emit([turnEvent({ harness: env.harness, ...input, usage: mergeUsage(acc.usage, ...childUsage) }), ...kids.runs]);
|
|
83
|
+
state.emitted = [...state.emitted, { input, mainUsage: acc.usage, children: kids.usage, spawned: acc.spawned, rev: 0 }].slice(-MAX_EMITTED);
|
|
84
|
+
state.closed = [...state.closed, acc.turnId].slice(-MAX_CLOSED);
|
|
85
|
+
state.prev = { turnId: acc.turnId, endedAt: end, provisional: input.outcome, final: null, correction: false, revertChecked: false, fpAdded: acc.fpAdded };
|
|
86
|
+
if (acc.prompt) {
|
|
87
|
+
state.digests = [
|
|
88
|
+
...state.digests,
|
|
89
|
+
buildDigest({ turnId: acc.turnId, sessionId: state.sessionId, prompt: acc.prompt, toolNames: acc.toolNames, lastAssistantMessage: acc.lastMessage ?? '' }),
|
|
90
|
+
].slice(-MAX_DIGESTS);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Re-resolves the sub-agents of an already emitted turn (a SubagentStop that arrived after the
|
|
95
|
+
* parent's Stop) and re-sends the turn with the merged usage when anything changed.
|
|
96
|
+
*/
|
|
97
|
+
export function refreshEmittedTurn(state, env, turnId, extraIds) {
|
|
98
|
+
const t = state.emitted.find((e) => e.input.turnId === turnId);
|
|
99
|
+
if (!t)
|
|
100
|
+
return false;
|
|
101
|
+
t.spawned = [...new Set([...t.spawned, ...extraIds])];
|
|
102
|
+
const kids = env.children(turnId, t.spawned);
|
|
103
|
+
const sig = (u) => JSON.stringify(Object.entries(u).sort(([a], [b]) => a.localeCompare(b)));
|
|
104
|
+
if (sig(kids.usage) === sig(t.children))
|
|
105
|
+
return true;
|
|
106
|
+
t.children = kids.usage;
|
|
107
|
+
t.rev += 1;
|
|
108
|
+
env.emit([
|
|
109
|
+
...kids.runs,
|
|
110
|
+
turnEvent({ harness: env.harness, ...t.input, usage: mergeUsage(t.mainUsage, ...Object.values(kids.usage)), idSalt: `rev${t.rev}` }),
|
|
111
|
+
]);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------- rollout items
|
|
115
|
+
/** Feeds rollout items (in file order) into the session. */
|
|
116
|
+
export async function applyItems(state, env, items) {
|
|
117
|
+
for (const item of items) {
|
|
118
|
+
if (state.subagent)
|
|
119
|
+
return;
|
|
120
|
+
state.lastActivityAt = Math.max(state.lastActivityAt, item.at);
|
|
121
|
+
switch (item.kind) {
|
|
122
|
+
case 'meta': {
|
|
123
|
+
if (state.meta)
|
|
124
|
+
break;
|
|
125
|
+
state.meta = item.meta;
|
|
126
|
+
if (item.meta.isSubagent) {
|
|
127
|
+
state.subagent = true;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!state.startedSent) {
|
|
131
|
+
const project = item.meta.cwd ? await env.project(item.meta.cwd) : undefined;
|
|
132
|
+
env.emit([
|
|
133
|
+
sessionStartEvent({ harness: env.harness, sessionId: state.sessionId, at: item.meta.startedAt, harnessVersion: item.meta.cliVersion, ...(project ? { project } : {}) }),
|
|
134
|
+
]);
|
|
135
|
+
state.startedSent = true;
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'turn_started': {
|
|
140
|
+
if (state.closed.includes(item.turnId) || state.open?.turnId === item.turnId)
|
|
141
|
+
break;
|
|
142
|
+
if (state.open) {
|
|
143
|
+
state.open.interrupted = true;
|
|
144
|
+
closeOpenTurn(state, env, item.at);
|
|
145
|
+
}
|
|
146
|
+
state.ended = false;
|
|
147
|
+
const acc = newAcc(item.at, state.model, state.effort);
|
|
148
|
+
state.open = { ...acc, turnId: item.turnId, usage: state.carry };
|
|
149
|
+
state.carry = [];
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case 'turn_context':
|
|
153
|
+
state.model = item.model ?? state.model;
|
|
154
|
+
state.effort = item.effort ?? state.effort;
|
|
155
|
+
if (state.open)
|
|
156
|
+
applyItem(state.open, item);
|
|
157
|
+
break;
|
|
158
|
+
case 'user_prompt':
|
|
159
|
+
if (state.open && state.open.prompt === null && isRealPrompt(item.text)) {
|
|
160
|
+
applyItem(state.open, item);
|
|
161
|
+
finalizePrev(state, env, { prompt: item.text }, item.at);
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
case 'token_count': {
|
|
165
|
+
const d = usageDelta(state.lastTotal, item);
|
|
166
|
+
if (item.total)
|
|
167
|
+
state.lastTotal = item.total;
|
|
168
|
+
if (!d)
|
|
169
|
+
break;
|
|
170
|
+
if (state.open)
|
|
171
|
+
addUsage(state.open, d, state.open.model, state.open.effort);
|
|
172
|
+
else {
|
|
173
|
+
const tmp = newAcc(item.at, state.model, state.effort);
|
|
174
|
+
tmp.usage = state.carry;
|
|
175
|
+
addUsage(tmp, d, state.model, state.effort);
|
|
176
|
+
state.carry = tmp.usage;
|
|
177
|
+
}
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case 'turn_complete':
|
|
181
|
+
case 'turn_aborted': {
|
|
182
|
+
const open = state.open;
|
|
183
|
+
if (!open || (item.turnId && item.turnId !== open.turnId))
|
|
184
|
+
break;
|
|
185
|
+
if (item.kind === 'turn_aborted')
|
|
186
|
+
open.interrupted = true;
|
|
187
|
+
else if (item.lastMessage)
|
|
188
|
+
open.lastMessage = item.lastMessage;
|
|
189
|
+
open.lastAt = Math.max(open.lastAt, item.at);
|
|
190
|
+
closeOpenTurn(state, env, item.at);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
default:
|
|
194
|
+
if (state.open)
|
|
195
|
+
applyItem(state.open, item);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** Ends the session: an unfinished turn is closed as abandoned, the last turn gets its final outcome. */
|
|
200
|
+
export function endSession(state, env, reason, at) {
|
|
201
|
+
if (state.ended || state.subagent)
|
|
202
|
+
return;
|
|
203
|
+
if (state.open) {
|
|
204
|
+
state.open.interrupted = true;
|
|
205
|
+
closeOpenTurn(state, env, Math.max(state.open.lastAt, state.open.startedAt));
|
|
206
|
+
}
|
|
207
|
+
finalizePrev(state, env, { sessionEnded: true }, at);
|
|
208
|
+
if (state.startedSent)
|
|
209
|
+
env.emit([sessionEndEvent({ harness: env.harness, sessionId: state.sessionId, reason, at: Math.max(at, state.lastActivityAt) })]);
|
|
210
|
+
state.ended = true;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/codex/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { provisionalOutcome } from '../../analysis/outcome.js';
|
|
3
|
+
import { attributeTime } from '../../analysis/phases.js';
|
|
4
|
+
import { primaryModel } from '../../analysis/tokens.js';
|
|
5
|
+
import { mcpFromTools } from '../../analysis/usage.js';
|
|
6
|
+
import { countTools, runEvent } from '../../events.js';
|
|
7
|
+
import { addUsage, applyItem, newAcc, usageDelta } from './accumulator.js';
|
|
8
|
+
import { locateRollout } from './locate.js';
|
|
9
|
+
import { parseRolloutLine } from './records.js';
|
|
10
|
+
/** Tool counts by protocol tool key (mcp__* → mcp). */
|
|
11
|
+
export function toolCounts(tools) {
|
|
12
|
+
const out = {};
|
|
13
|
+
for (const [name, n] of Object.entries(tools)) {
|
|
14
|
+
for (const [k, v] of Object.entries(countTools([name])))
|
|
15
|
+
out[k] = (out[k] ?? 0) + v * n;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
export function readRolloutItems(path) {
|
|
20
|
+
let text;
|
|
21
|
+
try {
|
|
22
|
+
text = readFileSync(path, 'utf8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const line of text.split('\n')) {
|
|
29
|
+
if (!line.trim())
|
|
30
|
+
continue;
|
|
31
|
+
const item = parseRolloutLine(line);
|
|
32
|
+
if (item)
|
|
33
|
+
out.push(item);
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A sub-agent thread is its own rollout (session_meta.source = {subagent: {thread_spawn: {…}}}).
|
|
39
|
+
* The WHOLE thread becomes one run: all its turns (a follow-up task included) are summed.
|
|
40
|
+
*/
|
|
41
|
+
export function buildChildThread(items) {
|
|
42
|
+
let meta = null;
|
|
43
|
+
let acc = null;
|
|
44
|
+
let lastTotal = null;
|
|
45
|
+
let model = null;
|
|
46
|
+
let effort = null;
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
if (item.kind === 'meta') {
|
|
49
|
+
meta ??= item.meta;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (item.kind === 'turn_context') {
|
|
53
|
+
model = item.model ?? model;
|
|
54
|
+
effort = item.effort ?? effort;
|
|
55
|
+
}
|
|
56
|
+
if (!acc && (item.kind === 'turn_started' || item.kind === 'turn_context'))
|
|
57
|
+
acc = newAcc(item.at, model, effort);
|
|
58
|
+
if (!acc)
|
|
59
|
+
continue;
|
|
60
|
+
if (item.kind === 'token_count') {
|
|
61
|
+
const d = usageDelta(lastTotal, item);
|
|
62
|
+
if (item.total)
|
|
63
|
+
lastTotal = item.total;
|
|
64
|
+
if (d)
|
|
65
|
+
addUsage(acc, d, model, effort);
|
|
66
|
+
acc.lastAt = Math.max(acc.lastAt, item.at);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (item.kind === 'turn_aborted')
|
|
70
|
+
acc.interrupted = true;
|
|
71
|
+
if (item.kind === 'turn_complete') {
|
|
72
|
+
acc.interrupted = false;
|
|
73
|
+
if (item.lastMessage)
|
|
74
|
+
acc.lastMessage = item.lastMessage;
|
|
75
|
+
acc.lastAt = Math.max(acc.lastAt, item.at);
|
|
76
|
+
acc.timeline.push({ at: item.at, type: 'output' });
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (item.kind === 'turn_started') {
|
|
80
|
+
acc.timeline.push({ at: item.at, type: 'prompt' });
|
|
81
|
+
acc.lastAt = Math.max(acc.lastAt, item.at);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
applyItem(acc, item);
|
|
85
|
+
}
|
|
86
|
+
if (!acc)
|
|
87
|
+
return null;
|
|
88
|
+
return { meta, acc, endedAt: acc.lastAt };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolves sub-agent threads (and, recursively, their own sub-agents) into run events attached to
|
|
92
|
+
* the main turn `rootTurnId`. Direct children of the main agent get parent_run_id = null, depth 1.
|
|
93
|
+
*/
|
|
94
|
+
export function resolveChildren(input) {
|
|
95
|
+
const out = { runs: [], usage: {}, missing: [] };
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const visit = (id, parentRunId, depth) => {
|
|
98
|
+
if (seen.has(id) || depth > (input.maxDepth ?? 5))
|
|
99
|
+
return;
|
|
100
|
+
seen.add(id);
|
|
101
|
+
const path = locateRollout(id, { home: input.home, hint: input.hints?.[id]?.path ?? null });
|
|
102
|
+
const child = path ? buildChildThread(readRolloutItems(path)) : null;
|
|
103
|
+
if (!child) {
|
|
104
|
+
out.missing.push(id);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const { acc, meta } = child;
|
|
108
|
+
const main = primaryModel(acc.usage);
|
|
109
|
+
out.usage[id] = acc.usage;
|
|
110
|
+
out.runs.push(runEvent({
|
|
111
|
+
harness: input.harness,
|
|
112
|
+
turnId: input.rootTurnId,
|
|
113
|
+
runId: id,
|
|
114
|
+
parentRunId,
|
|
115
|
+
agentType: meta?.agentType ?? input.hints?.[id]?.agentType ?? 'default',
|
|
116
|
+
...((meta?.agentType ?? input.hints?.[id]?.agentType) && (meta?.agentType ?? input.hints?.[id]?.agentType) !== 'default'
|
|
117
|
+
? { agentGroup: (meta?.agentType ?? input.hints?.[id]?.agentType) }
|
|
118
|
+
: {}),
|
|
119
|
+
depth,
|
|
120
|
+
startedAt: acc.startedAt,
|
|
121
|
+
endedAt: child.endedAt,
|
|
122
|
+
...(main?.model ?? acc.model ? { model: main?.model ?? acc.model ?? undefined } : {}),
|
|
123
|
+
effort: main ? main.effort : acc.effort,
|
|
124
|
+
usage: acc.usage,
|
|
125
|
+
phases: attributeTime(acc.timeline, child.endedAt),
|
|
126
|
+
tools: toolCounts(acc.tools),
|
|
127
|
+
skills: acc.skills,
|
|
128
|
+
mcp: mcpFromTools(acc.tools),
|
|
129
|
+
mcpStats: acc.mcpStats,
|
|
130
|
+
outcome: provisionalOutcome({ stopFailure: acc.error, interrupted: acc.interrupted, lastCheck: acc.lastCheck }),
|
|
131
|
+
}));
|
|
132
|
+
for (const grandchild of acc.spawned)
|
|
133
|
+
visit(grandchild, id, depth + 1);
|
|
134
|
+
};
|
|
135
|
+
for (const id of input.ids)
|
|
136
|
+
visit(id.toLowerCase(), null, 1);
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=subagents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagents.js","sourceRoot":"","sources":["../../../src/adapters/codex/subagents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { summarizeWithCommand } from '../../analysis/summaries.js';
|
|
3
|
+
import { readJsonFile } from '../../fsutil.js';
|
|
4
|
+
/** Used when models_cache.json names no small model. */
|
|
5
|
+
export const FALLBACK_SUMMARY_MODEL = 'gpt-5.4-mini';
|
|
6
|
+
/**
|
|
7
|
+
* Cheapest model for one-line summaries. AI_OBS_CODEX_SUMMARY_MODEL wins; otherwise the user-visible
|
|
8
|
+
* model in <codex home>/models_cache.json that looks smallest: "mini"/"nano" in the slug, then
|
|
9
|
+
* "affordable"/"cheap", then "fast"/"efficient" in the description; ties → listed later (older).
|
|
10
|
+
*/
|
|
11
|
+
export function pickSummaryModel(codexHomeDir, env = process.env) {
|
|
12
|
+
if (env.AI_OBS_CODEX_SUMMARY_MODEL)
|
|
13
|
+
return env.AI_OBS_CODEX_SUMMARY_MODEL;
|
|
14
|
+
const cache = readJsonFile(join(codexHomeDir, 'models_cache.json'));
|
|
15
|
+
const models = (cache?.models ?? []).filter((m) => m.slug && (m.visibility ?? 'list') === 'list');
|
|
16
|
+
const score = (m) => {
|
|
17
|
+
const slug = m.slug.toLowerCase();
|
|
18
|
+
const d = (m.description ?? '').toLowerCase();
|
|
19
|
+
return (/(^|-)(mini|nano)\b/.test(slug) ? 8 : 0) + (/affordable|cheap|low.cost/.test(d) ? 4 : 0) + (/\b(fast|efficient|lightweight|small)\b/.test(d) ? 2 : 0);
|
|
20
|
+
};
|
|
21
|
+
let best = null;
|
|
22
|
+
let bestScore = 0;
|
|
23
|
+
for (const m of models) {
|
|
24
|
+
const s = score(m);
|
|
25
|
+
if (s > 0 && s >= bestScore) {
|
|
26
|
+
best = m;
|
|
27
|
+
bestScore = s;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return best?.slug ?? FALLBACK_SUMMARY_MODEL;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Headless Codex call for the batched summary prompt (prompt on stdin via "-"):
|
|
34
|
+
* codex exec --ephemeral --skip-git-repo-check --sandbox read-only --ignore-user-config --ignore-rules
|
|
35
|
+
* -c features.hooks=false -c model_reasoning_effort="low" -m <model> -
|
|
36
|
+
* --ignore-user-config keeps the user's MCP servers / plugins from starting (auth still comes from
|
|
37
|
+
* CODEX_HOME); `withUserConfig` drops it (fallback for custom providers). AI_OBS_SUMMARIZING=1 is set
|
|
38
|
+
* by runSummaryCommand, so even if hooks ran they would exit at once.
|
|
39
|
+
*/
|
|
40
|
+
export function summaryArgv(model, opts = {}) {
|
|
41
|
+
return [
|
|
42
|
+
opts.bin ?? 'codex', 'exec', '--ephemeral', '--skip-git-repo-check', '--sandbox', 'read-only',
|
|
43
|
+
...(opts.withUserConfig ? [] : ['--ignore-user-config', '--ignore-rules']),
|
|
44
|
+
'-c', 'features.hooks=false', '-c', 'model_reasoning_effort="low"', '-m', model, '-',
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `codex exec` prints the final agent message on stdout. If it was run with --json (JSONL events),
|
|
49
|
+
* take the last agent message text instead.
|
|
50
|
+
*/
|
|
51
|
+
export function extractCodexText(stdout) {
|
|
52
|
+
const lines = stdout.split('\n').filter((l) => l.trim().startsWith('{"type"'));
|
|
53
|
+
if (!lines.length)
|
|
54
|
+
return stdout;
|
|
55
|
+
let last = '';
|
|
56
|
+
for (const l of lines) {
|
|
57
|
+
try {
|
|
58
|
+
const e = JSON.parse(l);
|
|
59
|
+
if (e.item?.type === 'agent_message' && typeof e.item.text === 'string')
|
|
60
|
+
last = e.item.text;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
/* skip */
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return last || stdout;
|
|
67
|
+
}
|
|
68
|
+
/** One batched headless call; on failure retries once with the user's config (custom provider setups). */
|
|
69
|
+
export async function summarizeWithCodex(digests, opts) {
|
|
70
|
+
const model = pickSummaryModel(opts.codexHome, opts.env);
|
|
71
|
+
const run = (withUserConfig) => summarizeWithCommand(digests, {
|
|
72
|
+
command: (prompt) => ({ argv: summaryArgv(model, { withUserConfig, ...(opts.bin ? { bin: opts.bin } : {}) }), input: prompt }),
|
|
73
|
+
extractText: extractCodexText,
|
|
74
|
+
cwd: opts.cwd,
|
|
75
|
+
...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),
|
|
76
|
+
});
|
|
77
|
+
try {
|
|
78
|
+
return await run(false);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return run(true);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../../src/adapters/codex/summarize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,wDAAwD;AACxD,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAUrD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,GAAG,GAAuC,OAAO,CAAC,GAAG;IAC1G,IAAI,GAAG,CAAC,0BAA0B;QAAE,OAAO,GAAG,CAAC,0BAA0B,CAAC;IAC1E,MAAM,KAAK,GAAG,YAAY,CAA6B,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAChG,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,CAAC,CAAc,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAK,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChK,CAAC,CAAC;IACF,IAAI,IAAI,GAAuB,IAAI,CAAC;IACpC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,CAAC;YACT,SAAS,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,IAAI,IAAI,sBAAsB,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAI,GAA+C,EAAE;IAC9F,OAAO;QACL,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW;QAC7F,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QAC1E,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;KACrF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAgD,CAAC;YACvE,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAED,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAqB,EACrB,IAAoH;IAEpH,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,cAAuB,EAAE,EAAE,CACtC,oBAAoB,CAAC,OAAO,EAAE;QAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC9H,WAAW,EAAE,gBAAgB;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;IACL,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|