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.
Files changed (155) hide show
  1. package/README.md +666 -2
  2. package/bin/ai-obs.js +8 -0
  3. package/dist/adapters/claude-code/analyze.js +189 -0
  4. package/dist/adapters/claude-code/analyze.js.map +1 -0
  5. package/dist/adapters/claude-code/detect.js +60 -0
  6. package/dist/adapters/claude-code/detect.js.map +1 -0
  7. package/dist/adapters/claude-code/handlers.js +183 -0
  8. package/dist/adapters/claude-code/handlers.js.map +1 -0
  9. package/dist/adapters/claude-code/index.js +55 -0
  10. package/dist/adapters/claude-code/index.js.map +1 -0
  11. package/dist/adapters/claude-code/run-links.js +53 -0
  12. package/dist/adapters/claude-code/run-links.js.map +1 -0
  13. package/dist/adapters/claude-code/session.js +427 -0
  14. package/dist/adapters/claude-code/session.js.map +1 -0
  15. package/dist/adapters/claude-code/settings.js +161 -0
  16. package/dist/adapters/claude-code/settings.js.map +1 -0
  17. package/dist/adapters/claude-code/state.js +66 -0
  18. package/dist/adapters/claude-code/state.js.map +1 -0
  19. package/dist/adapters/claude-code/subagents.js +246 -0
  20. package/dist/adapters/claude-code/subagents.js.map +1 -0
  21. package/dist/adapters/claude-code/transcript.js +309 -0
  22. package/dist/adapters/claude-code/transcript.js.map +1 -0
  23. package/dist/adapters/codex/accumulator.js +135 -0
  24. package/dist/adapters/codex/accumulator.js.map +1 -0
  25. package/dist/adapters/codex/detect.js +93 -0
  26. package/dist/adapters/codex/detect.js.map +1 -0
  27. package/dist/adapters/codex/hooks-config.js +158 -0
  28. package/dist/adapters/codex/hooks-config.js.map +1 -0
  29. package/dist/adapters/codex/index.js +270 -0
  30. package/dist/adapters/codex/index.js.map +1 -0
  31. package/dist/adapters/codex/locate.js +72 -0
  32. package/dist/adapters/codex/locate.js.map +1 -0
  33. package/dist/adapters/codex/records.js +194 -0
  34. package/dist/adapters/codex/records.js.map +1 -0
  35. package/dist/adapters/codex/rollout.js +72 -0
  36. package/dist/adapters/codex/rollout.js.map +1 -0
  37. package/dist/adapters/codex/session.js +212 -0
  38. package/dist/adapters/codex/session.js.map +1 -0
  39. package/dist/adapters/codex/subagents.js +139 -0
  40. package/dist/adapters/codex/subagents.js.map +1 -0
  41. package/dist/adapters/codex/summarize.js +84 -0
  42. package/dist/adapters/codex/summarize.js.map +1 -0
  43. package/dist/adapters/codex/tools.js +145 -0
  44. package/dist/adapters/codex/tools.js.map +1 -0
  45. package/dist/adapters/hook-command.js +94 -0
  46. package/dist/adapters/hook-command.js.map +1 -0
  47. package/dist/adapters/index.js +12 -0
  48. package/dist/adapters/index.js.map +1 -0
  49. package/dist/adapters/types.js +2 -0
  50. package/dist/adapters/types.js.map +1 -0
  51. package/dist/analysis/corrections.js +79 -0
  52. package/dist/analysis/corrections.js.map +1 -0
  53. package/dist/analysis/digest.js +16 -0
  54. package/dist/analysis/digest.js.map +1 -0
  55. package/dist/analysis/outcome.js +76 -0
  56. package/dist/analysis/outcome.js.map +1 -0
  57. package/dist/analysis/phases.js +203 -0
  58. package/dist/analysis/phases.js.map +1 -0
  59. package/dist/analysis/summaries.js +350 -0
  60. package/dist/analysis/summaries.js.map +1 -0
  61. package/dist/analysis/tokens.js +67 -0
  62. package/dist/analysis/tokens.js.map +1 -0
  63. package/dist/analysis/usage.js +229 -0
  64. package/dist/analysis/usage.js.map +1 -0
  65. package/dist/cc-cache.js +81 -0
  66. package/dist/cc-cache.js.map +1 -0
  67. package/dist/cli.js +128 -0
  68. package/dist/cli.js.map +1 -0
  69. package/dist/commands/common.js +235 -0
  70. package/dist/commands/common.js.map +1 -0
  71. package/dist/commands/doctor.js +193 -0
  72. package/dist/commands/doctor.js.map +1 -0
  73. package/dist/commands/flush.js +131 -0
  74. package/dist/commands/flush.js.map +1 -0
  75. package/dist/commands/init.js +119 -0
  76. package/dist/commands/init.js.map +1 -0
  77. package/dist/commands/link.js +171 -0
  78. package/dist/commands/link.js.map +1 -0
  79. package/dist/commands/live.js +130 -0
  80. package/dist/commands/live.js.map +1 -0
  81. package/dist/commands/login.js +397 -0
  82. package/dist/commands/login.js.map +1 -0
  83. package/dist/commands/status.js +155 -0
  84. package/dist/commands/status.js.map +1 -0
  85. package/dist/commands/token.js +92 -0
  86. package/dist/commands/token.js.map +1 -0
  87. package/dist/commands/uninstall.js +56 -0
  88. package/dist/commands/uninstall.js.map +1 -0
  89. package/dist/config.js +305 -0
  90. package/dist/config.js.map +1 -0
  91. package/dist/context.js +109 -0
  92. package/dist/context.js.map +1 -0
  93. package/dist/delivery.js +151 -0
  94. package/dist/delivery.js.map +1 -0
  95. package/dist/dotfile.js +187 -0
  96. package/dist/dotfile.js.map +1 -0
  97. package/dist/events.js +259 -0
  98. package/dist/events.js.map +1 -0
  99. package/dist/fsutil.js +50 -0
  100. package/dist/fsutil.js.map +1 -0
  101. package/dist/git.js +139 -0
  102. package/dist/git.js.map +1 -0
  103. package/dist/hook.js +147 -0
  104. package/dist/hook.js.map +1 -0
  105. package/dist/http.js +35 -0
  106. package/dist/http.js.map +1 -0
  107. package/dist/jobs.js +53 -0
  108. package/dist/jobs.js.map +1 -0
  109. package/dist/live/claude-code.js +226 -0
  110. package/dist/live/claude-code.js.map +1 -0
  111. package/dist/live/codex.js +91 -0
  112. package/dist/live/codex.js.map +1 -0
  113. package/dist/live/monitor.js +229 -0
  114. package/dist/live/monitor.js.map +1 -0
  115. package/dist/live/render.js +92 -0
  116. package/dist/live/render.js.map +1 -0
  117. package/dist/lock.js +93 -0
  118. package/dist/lock.js.map +1 -0
  119. package/dist/log.js +36 -0
  120. package/dist/log.js.map +1 -0
  121. package/dist/migrate.js +109 -0
  122. package/dist/migrate.js.map +1 -0
  123. package/dist/nudge.js +231 -0
  124. package/dist/nudge.js.map +1 -0
  125. package/dist/paths.js +73 -0
  126. package/dist/paths.js.map +1 -0
  127. package/dist/pk-cache.js +110 -0
  128. package/dist/pk-cache.js.map +1 -0
  129. package/dist/prices.js +45 -0
  130. package/dist/prices.js.map +1 -0
  131. package/dist/project-key.js +144 -0
  132. package/dist/project-key.js.map +1 -0
  133. package/dist/protocol-types.js +30 -0
  134. package/dist/protocol-types.js.map +1 -0
  135. package/dist/queue.js +649 -0
  136. package/dist/queue.js.map +1 -0
  137. package/dist/routing.js +122 -0
  138. package/dist/routing.js.map +1 -0
  139. package/dist/runtime.js +54 -0
  140. package/dist/runtime.js.map +1 -0
  141. package/dist/sender.js +559 -0
  142. package/dist/sender.js.map +1 -0
  143. package/dist/state.js +59 -0
  144. package/dist/state.js.map +1 -0
  145. package/dist/ulid.js +73 -0
  146. package/dist/ulid.js.map +1 -0
  147. package/dist/version.js +26 -0
  148. package/dist/version.js.map +1 -0
  149. package/dist/warnings.js +71 -0
  150. package/dist/warnings.js.map +1 -0
  151. package/dist/worker-main.js +14 -0
  152. package/dist/worker-main.js.map +1 -0
  153. package/dist/worker.js +295 -0
  154. package/dist/worker.js.map +1 -0
  155. 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":"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"}