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,427 @@
|
|
|
1
|
+
import { buildDigest } from '../../analysis/digest.js';
|
|
2
|
+
import { looksLikeCorrection } from '../../analysis/corrections.js';
|
|
3
|
+
import { detectRevert, finalOutcome, provisionalOutcome } from '../../analysis/outcome.js';
|
|
4
|
+
import { mergeUsage, primaryModel } from '../../analysis/tokens.js';
|
|
5
|
+
import { normalizeRunLinks, sessionTitleEvent, turnEvent, turnOutcomeEvent, withRunLinks } from '../../events.js';
|
|
6
|
+
import { analyzeEntries, isWorkflowKey, mergeAgg } from './analyze.js';
|
|
7
|
+
import { computeRunLinks } from './run-links.js';
|
|
8
|
+
import { agentsOfToolUses, buildRun, listAgents, workflowOver } from './subagents.js';
|
|
9
|
+
import { hasRevertCommand, readTranscript } from './transcript.js';
|
|
10
|
+
/** Collects events for one hook; `flush()` returns them in emission order. */
|
|
11
|
+
export class Emitter {
|
|
12
|
+
harness;
|
|
13
|
+
state;
|
|
14
|
+
events = [];
|
|
15
|
+
agents = null;
|
|
16
|
+
constructor(harness, state) {
|
|
17
|
+
this.harness = harness;
|
|
18
|
+
this.state = state;
|
|
19
|
+
}
|
|
20
|
+
/** Sub-agent metas, read once per hook. */
|
|
21
|
+
agentMetas() {
|
|
22
|
+
this.agents ??= listAgents(this.state.transcriptPath);
|
|
23
|
+
return this.agents;
|
|
24
|
+
}
|
|
25
|
+
over = new Map();
|
|
26
|
+
/** Whether a Workflow run has finished (status file), read once per hook. */
|
|
27
|
+
workflowOver(workflowId) {
|
|
28
|
+
let v = this.over.get(workflowId);
|
|
29
|
+
if (v === undefined) {
|
|
30
|
+
v = workflowOver(this.state.transcriptPath, workflowId);
|
|
31
|
+
this.over.set(workflowId, v);
|
|
32
|
+
}
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Returns the prompts of the segments read, in transcript order. */
|
|
37
|
+
export function processTranscript(em, opts) {
|
|
38
|
+
const st = em.state;
|
|
39
|
+
const read = readTranscript(st.transcriptPath, st.offset, st.sessionId);
|
|
40
|
+
noteTitles(st, read.titles);
|
|
41
|
+
const pre = [];
|
|
42
|
+
const segments = [];
|
|
43
|
+
for (const l of read.lines)
|
|
44
|
+
addLine(l, pre, segments);
|
|
45
|
+
const prev = st.turns.at(-1);
|
|
46
|
+
if (prev && pre.length)
|
|
47
|
+
continueTurn(em, prev, pre, opts);
|
|
48
|
+
let done = 0;
|
|
49
|
+
for (let i = 0; i < segments.length; i++) {
|
|
50
|
+
const seg = segments[i];
|
|
51
|
+
const isLast = i === segments.length - 1;
|
|
52
|
+
const active = seg.entries.some((e) => e.k === 'assistant');
|
|
53
|
+
if (isLast && !endsHere(seg, active, opts))
|
|
54
|
+
break;
|
|
55
|
+
done = i + 1;
|
|
56
|
+
if (active)
|
|
57
|
+
finalizeTurn(em, seg, Boolean(opts.stopFailure) && isLast && opts.mode === 'stop', opts.mode === 'end');
|
|
58
|
+
}
|
|
59
|
+
st.offset = done < segments.length ? segments[done].start : read.end;
|
|
60
|
+
return { prompts: segments.map((s) => ({ uuid: s.prompt.uuid, at: s.prompt.at, promptId: s.prompt.promptId })) };
|
|
61
|
+
}
|
|
62
|
+
/** Keeps the latest title of each kind read from the transcript (ADR-0026). */
|
|
63
|
+
function noteTitles(st, titles) {
|
|
64
|
+
if (!titles.custom && !titles.ai)
|
|
65
|
+
return;
|
|
66
|
+
st.title = { ...st.title, ...titles };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The session's title (ADR-0026) when it differs from the one last sent: the `/rename` title wins over the
|
|
70
|
+
* generated one, the latest of each kind wins. Marks it as sent.
|
|
71
|
+
*/
|
|
72
|
+
export function emitSessionTitle(em) {
|
|
73
|
+
const t = em.state.title;
|
|
74
|
+
const source = t?.custom ? 'custom' : t?.ai ? 'ai' : null;
|
|
75
|
+
const title = source ? t?.[source] : undefined;
|
|
76
|
+
if (!t || !source || !title)
|
|
77
|
+
return;
|
|
78
|
+
const sent = `${source}\n${title}`;
|
|
79
|
+
if (t.sent === sent)
|
|
80
|
+
return;
|
|
81
|
+
const ev = sessionTitleEvent({ harness: em.harness, sessionId: em.state.sessionId, title, source });
|
|
82
|
+
if (ev)
|
|
83
|
+
em.events.push(ev);
|
|
84
|
+
t.sent = sent;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A prompt starts a new segment, except a message Claude Code injects itself (task notification)
|
|
88
|
+
* into a turn that is still running (no end-of-turn record since its prompt): that is part of the turn.
|
|
89
|
+
*/
|
|
90
|
+
export function addLine(l, pre, segments) {
|
|
91
|
+
const cur = segments.at(-1);
|
|
92
|
+
if (l.entry.k !== 'prompt') {
|
|
93
|
+
(cur?.entries ?? pre).push(l.entry);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const running = cur && cur.entries.some((e) => e.k === 'assistant') && !cur.entries.some((e) => e.k === 'stop' || e.k === 'interrupt');
|
|
97
|
+
if (!l.entry.human && running)
|
|
98
|
+
return;
|
|
99
|
+
segments.push({ start: l.start, prompt: l.entry, entries: [l.entry] });
|
|
100
|
+
}
|
|
101
|
+
/** Whether the last (not yet followed by a prompt) segment is a finished turn. */
|
|
102
|
+
function endsHere(seg, active, opts) {
|
|
103
|
+
if (opts.mode === 'end')
|
|
104
|
+
return true;
|
|
105
|
+
// The prompt this UserPromptSubmit announced is running (a late worker may already see its replies); its Stop ends it.
|
|
106
|
+
if (opts.mode === 'prompt' && opts.ownPrompt?.({ uuid: seg.prompt.uuid, at: seg.prompt.at, promptId: seg.prompt.promptId }))
|
|
107
|
+
return false;
|
|
108
|
+
// A prompt typed after the hook fired belongs to the next turn; an empty segment has not run yet.
|
|
109
|
+
return active && seg.prompt.at < opts.receivedAt;
|
|
110
|
+
}
|
|
111
|
+
function finalizeTurn(em, seg, stopFailure, sessionEnding) {
|
|
112
|
+
const st = em.state;
|
|
113
|
+
const agg = analyzeEntries(seg.entries);
|
|
114
|
+
const revertCommand = hasRevertCommand(seg.entries);
|
|
115
|
+
followUpTurns(em, {
|
|
116
|
+
human: seg.prompt.human,
|
|
117
|
+
correction: seg.prompt.human && looksLikeCorrection(seg.prompt.text),
|
|
118
|
+
revertOf: (t) => t.agg.linesAdded + t.agg.linesRemoved > 0 && (revertCommand || detectRevert(t.agg.fp, agg.fp)),
|
|
119
|
+
}, seg.prompt.at);
|
|
120
|
+
const turn = {
|
|
121
|
+
turnId: seg.prompt.uuid,
|
|
122
|
+
sessionId: st.sessionId,
|
|
123
|
+
agg,
|
|
124
|
+
runUsage: [],
|
|
125
|
+
rev: 0,
|
|
126
|
+
provisional: provisionalOutcome({ stopFailure, interrupted: agg.interrupted, lastCheck: agg.lastCheck }),
|
|
127
|
+
stopFailure,
|
|
128
|
+
final: false,
|
|
129
|
+
correction: false,
|
|
130
|
+
reverted: false,
|
|
131
|
+
human: seg.prompt.human,
|
|
132
|
+
emitted: [],
|
|
133
|
+
};
|
|
134
|
+
const runs = collectRuns(em, turn, sessionEnding);
|
|
135
|
+
emitTurn(em, turn);
|
|
136
|
+
em.events.push(...runs);
|
|
137
|
+
st.turns.push(turn);
|
|
138
|
+
st.digests.push(buildDigest({ turnId: turn.turnId, sessionId: st.sessionId, prompt: seg.prompt.text, toolNames: agg.toolNames, lastAssistantMessage: agg.lastMessage }));
|
|
139
|
+
}
|
|
140
|
+
/** Activity after a Stop without a new prompt (a Stop hook made Claude continue): extends that turn. */
|
|
141
|
+
function continueTurn(em, turn, entries, opts) {
|
|
142
|
+
const more = analyzeEntries(entries, { startAt: turn.agg.endedAt, skipResponseIds: new Set(turn.agg.responseIds) });
|
|
143
|
+
if (!more.active)
|
|
144
|
+
return;
|
|
145
|
+
turn.agg = mergeAgg(turn.agg, more);
|
|
146
|
+
if (opts.stopFailure && opts.mode === 'stop')
|
|
147
|
+
turn.stopFailure = true;
|
|
148
|
+
turn.provisional = provisionalOutcome({ stopFailure: turn.stopFailure, interrupted: turn.agg.interrupted, lastCheck: turn.agg.lastCheck });
|
|
149
|
+
const runs = collectRuns(em, turn, opts.mode === 'end');
|
|
150
|
+
turn.rev++;
|
|
151
|
+
emitTurn(em, turn);
|
|
152
|
+
em.events.push(...runs);
|
|
153
|
+
}
|
|
154
|
+
/** Index of the most recent human-initiated turn (turns from before the `human` flag count as human). */
|
|
155
|
+
function lastHumanTurn(turns) {
|
|
156
|
+
for (let i = turns.length - 1; i >= 0; i--)
|
|
157
|
+
if (turns[i].human !== false)
|
|
158
|
+
return i;
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Settles the stored turns once the next prompt is known. The follow-up is about the most recent
|
|
163
|
+
* human-initiated turn AND the task-notification turns that came after it (they continue its work,
|
|
164
|
+
* e.g. background agents or a Workflow reporting back): a correction or revert fails them, a plain
|
|
165
|
+
* human prompt finalizes them. Older turns still waiting (none normally) are finalized without a
|
|
166
|
+
* signal. A task-notification prompt only carries a revert signal; otherwise it settles nothing.
|
|
167
|
+
*/
|
|
168
|
+
export function followUpTurns(em, f, at) {
|
|
169
|
+
const turns = em.state.turns;
|
|
170
|
+
const group = lastHumanTurn(turns);
|
|
171
|
+
turns.forEach((t, i) => {
|
|
172
|
+
if (i >= group)
|
|
173
|
+
applyFollowUp(em, t, { human: f.human, correction: f.correction, revert: f.revertOf(t) }, at);
|
|
174
|
+
else
|
|
175
|
+
applyFollowUp(em, t, { human: f.human, correction: false, revert: false }, at);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Settles one turn once the next prompt is known: a human prompt finalizes it (correction or not); a
|
|
180
|
+
* revert in the next turn fails it even after it was finalized. Prompts Claude Code starts on its own
|
|
181
|
+
* (task notifications) say nothing about it. Callers go through `followUpTurns`.
|
|
182
|
+
*/
|
|
183
|
+
export function applyFollowUp(em, prev, f, at) {
|
|
184
|
+
if (!prev.final) {
|
|
185
|
+
if (!f.human && !f.revert)
|
|
186
|
+
return;
|
|
187
|
+
prev.correction = f.correction;
|
|
188
|
+
prev.reverted = f.revert;
|
|
189
|
+
prev.final = true;
|
|
190
|
+
pushOutcome(em, prev, finalOutcome(prev.provisional, { correction: f.correction, revert: f.revert }), at);
|
|
191
|
+
}
|
|
192
|
+
else if (f.revert && !prev.reverted) {
|
|
193
|
+
prev.reverted = true;
|
|
194
|
+
pushOutcome(em, prev, finalOutcome(prev.provisional, { correction: prev.correction, revert: true }), at);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The session ended: every turn still waiting for a follow-up (the last one, and the human turn whose
|
|
199
|
+
* task-notification turns came after it) becomes final (`unknown` stays `unknown`).
|
|
200
|
+
*/
|
|
201
|
+
export function settleLastTurn(em, at) {
|
|
202
|
+
settleTurns(em, em.state.turns, at);
|
|
203
|
+
}
|
|
204
|
+
/** Final outcome for turns no follow-up will ever reach (session over, or dropped from state). */
|
|
205
|
+
export function settleTurns(em, turns, at) {
|
|
206
|
+
for (const t of turns) {
|
|
207
|
+
if (t.final)
|
|
208
|
+
continue;
|
|
209
|
+
t.final = true;
|
|
210
|
+
pushOutcome(em, t, finalOutcome(t.provisional, { sessionEnded: true }), at);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function pushOutcome(em, t, outcome, at) {
|
|
214
|
+
em.events.push(turnOutcomeEvent({ harness: em.harness, turnId: t.turnId, outcome, at }));
|
|
215
|
+
}
|
|
216
|
+
/** The turn event; the whole turn's usage (main agent + counted sub-agents). Re-sends get a new id. */
|
|
217
|
+
export function emitTurn(em, t) {
|
|
218
|
+
const main = primaryModel(t.agg.usage);
|
|
219
|
+
const usage = mergeUsage(t.agg.usage, t.runUsage);
|
|
220
|
+
const primary = main ?? primaryModel(usage);
|
|
221
|
+
em.events.push(turnEvent({
|
|
222
|
+
harness: em.harness,
|
|
223
|
+
sessionId: t.sessionId,
|
|
224
|
+
turnId: t.turnId,
|
|
225
|
+
startedAt: t.agg.startedAt,
|
|
226
|
+
endedAt: t.agg.endedAt,
|
|
227
|
+
model: primary?.model ?? 'unknown',
|
|
228
|
+
effort: primary?.effort ?? null,
|
|
229
|
+
usage,
|
|
230
|
+
phases: t.agg.phases,
|
|
231
|
+
tools: t.agg.tools,
|
|
232
|
+
skills: t.agg.skills,
|
|
233
|
+
mcp: t.agg.mcp,
|
|
234
|
+
mcpStats: t.agg.mcpStats,
|
|
235
|
+
filesTouched: t.agg.fileKeys.length,
|
|
236
|
+
linesAdded: t.agg.linesAdded,
|
|
237
|
+
linesRemoved: t.agg.linesRemoved,
|
|
238
|
+
outcome: t.provisional,
|
|
239
|
+
...(t.rev ? { idSalt: `rev${t.rev}` } : {}),
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Run events for the turn's finished sub-agents (and their nested sub-agents) not sent yet; their
|
|
244
|
+
* usage is added to the turn. Background sub-agents still running are picked up by SubagentStop.
|
|
245
|
+
* Once they are built, each gets its incoming links, computed over every run of the turn known so far
|
|
246
|
+
* (sent in an earlier pass or built now; see `run-links.ts`).
|
|
247
|
+
*/
|
|
248
|
+
export function collectRuns(em, turn, all) {
|
|
249
|
+
const calls = turn.agg.agentCalls;
|
|
250
|
+
const ids = Object.keys(calls);
|
|
251
|
+
if (!ids.length)
|
|
252
|
+
return [];
|
|
253
|
+
const st = em.state;
|
|
254
|
+
const metas = em.agentMetas();
|
|
255
|
+
const done = new Set(st.doneAgents);
|
|
256
|
+
const failed = new Set(st.failedAgents ?? []);
|
|
257
|
+
// The turn's own list is authoritative (never trimmed while the turn is kept); the session-wide
|
|
258
|
+
// list is capped and only covers turns saved before per-turn lists existed.
|
|
259
|
+
const emitted = new Set([...st.emittedAgents, ...(turn.emitted ?? [])]);
|
|
260
|
+
// State from an older collector: the runs it sent are unknown here, so links would skip them.
|
|
261
|
+
const linkable = !(turn.emitted?.length && !turn.runSpans);
|
|
262
|
+
const out = [];
|
|
263
|
+
const build = (meta, idSalt) => {
|
|
264
|
+
const a = failed.has(meta.agentId) && !meta.failed ? { ...meta, failed: true } : meta;
|
|
265
|
+
const root = rootOf(a, metas);
|
|
266
|
+
const call = root.toolUseId ? calls[root.toolUseId] : undefined;
|
|
267
|
+
const hint = a.parentAgentId ? null : (call?.type ?? null);
|
|
268
|
+
return { a, root, call, run: () => buildRun(a, metas, { harness: em.harness, turnId: turn.turnId, agentTypeHint: hint, ...(idSalt ? { idSalt } : {}) }) };
|
|
269
|
+
};
|
|
270
|
+
for (const meta of agentsOfToolUses(metas, ids)) {
|
|
271
|
+
if (emitted.has(meta.agentId))
|
|
272
|
+
continue;
|
|
273
|
+
const { a, root, call, run: make } = build(meta);
|
|
274
|
+
const wfDone = isWorkflowKey(root.toolUseId) && root.workflowId !== null && em.workflowOver(root.workflowId);
|
|
275
|
+
if (!(all || done.has(a.agentId) || call?.completed || a.finished || wfDone))
|
|
276
|
+
continue;
|
|
277
|
+
const run = make();
|
|
278
|
+
if (!run)
|
|
279
|
+
continue;
|
|
280
|
+
out.push(run.event);
|
|
281
|
+
turn.runUsage = mergeUsage(turn.runUsage, run.usage);
|
|
282
|
+
st.emittedAgents.push(a.agentId);
|
|
283
|
+
(turn.emitted ??= []).push(a.agentId);
|
|
284
|
+
emitted.add(a.agentId);
|
|
285
|
+
if (a.agentId === root.agentId && call && !isWorkflowKey(root.toolUseId))
|
|
286
|
+
call.completed = true;
|
|
287
|
+
}
|
|
288
|
+
// A Workflow call covers many agents: it is complete once the whole workflow is over.
|
|
289
|
+
for (const [key, call] of Object.entries(calls)) {
|
|
290
|
+
if (isWorkflowKey(key) && !call.completed && em.workflowOver(key.slice(3)))
|
|
291
|
+
call.completed = true;
|
|
292
|
+
}
|
|
293
|
+
if (all)
|
|
294
|
+
for (const c of Object.values(calls))
|
|
295
|
+
c.completed = true;
|
|
296
|
+
if (!linkable)
|
|
297
|
+
return out;
|
|
298
|
+
// Re-send of a run sent earlier whose incoming links changed: same content (its usage is already
|
|
299
|
+
// counted), new event id (`relink<rev>`), so ingest replaces its links instead of dropping a duplicate.
|
|
300
|
+
const resend = (runId) => {
|
|
301
|
+
const meta = metas.get(runId);
|
|
302
|
+
return meta ? (build(meta, `relink${turn.rev}`).run()?.event ?? null) : null;
|
|
303
|
+
};
|
|
304
|
+
return attachLinks(turn, out, resend);
|
|
305
|
+
}
|
|
306
|
+
const spanOf = (e) => [
|
|
307
|
+
e.run_id,
|
|
308
|
+
e.parent_run_id,
|
|
309
|
+
e.orchestration_id ?? null,
|
|
310
|
+
e.flow_key ?? null,
|
|
311
|
+
Date.parse(e.started_at),
|
|
312
|
+
Date.parse(e.ended_at),
|
|
313
|
+
];
|
|
314
|
+
/** A run's incoming links as sent on the wire, order-free ('' = none). */
|
|
315
|
+
const linksSig = (runId, links) => normalizeRunLinks(runId, links)
|
|
316
|
+
.map((l) => `${l.kind}|${l.from_run_id}`)
|
|
317
|
+
.sort()
|
|
318
|
+
.join(',');
|
|
319
|
+
/**
|
|
320
|
+
* Adds the incoming links to the newly built runs and remembers their spans on the turn. Links follow
|
|
321
|
+
* start order, not the order runs finish in: a run built now can become the source of a link INTO a run
|
|
322
|
+
* sent earlier (two same-item workflow agents finishing out of order; a sibling sent late by the
|
|
323
|
+
* session-end flush). Such a sent run whose links changed is re-sent (`resend`) with its new links.
|
|
324
|
+
*/
|
|
325
|
+
function attachLinks(turn, built, resend) {
|
|
326
|
+
if (!built.length)
|
|
327
|
+
return built;
|
|
328
|
+
const prev = turn.runSpans ?? [];
|
|
329
|
+
const links = computeRunLinks([...prev, ...built.map(spanOf)].map(([runId, parentRunId, orchestrationId, flowKey, startedMs, endedMs]) => ({
|
|
330
|
+
runId,
|
|
331
|
+
parentRunId,
|
|
332
|
+
orchestrationId,
|
|
333
|
+
flowKey,
|
|
334
|
+
startedMs,
|
|
335
|
+
endedMs,
|
|
336
|
+
})));
|
|
337
|
+
const out = built.map((e) => withRunLinks(e, links.get(e.run_id)));
|
|
338
|
+
const spans = [];
|
|
339
|
+
for (const span of prev) {
|
|
340
|
+
const [runId, , , , , , sent = ''] = span;
|
|
341
|
+
const sig = linksSig(runId, links.get(runId));
|
|
342
|
+
const again = sig === sent ? null : resend(runId);
|
|
343
|
+
if (again)
|
|
344
|
+
out.push(withRunLinks(again, links.get(runId)));
|
|
345
|
+
spans.push(again ? [...span.slice(0, 6), sig] : span);
|
|
346
|
+
}
|
|
347
|
+
for (const e of built)
|
|
348
|
+
spans.push([...spanOf(e), linksSig(e.run_id, links.get(e.run_id))]);
|
|
349
|
+
turn.runSpans = spans;
|
|
350
|
+
return out;
|
|
351
|
+
}
|
|
352
|
+
function rootOf(a, metas) {
|
|
353
|
+
let cur = a;
|
|
354
|
+
const seen = new Set();
|
|
355
|
+
while (cur.parentAgentId && !seen.has(cur.agentId)) {
|
|
356
|
+
seen.add(cur.agentId);
|
|
357
|
+
const p = metas.get(cur.parentAgentId);
|
|
358
|
+
if (!p)
|
|
359
|
+
break;
|
|
360
|
+
cur = p;
|
|
361
|
+
}
|
|
362
|
+
return cur;
|
|
363
|
+
}
|
|
364
|
+
/** SubagentStop: a sub-agent finished. If its turn was already sent, send the run and re-send the turn. */
|
|
365
|
+
export function subagentFinished(em, agentId) {
|
|
366
|
+
const st = em.state;
|
|
367
|
+
if (!st.doneAgents.includes(agentId))
|
|
368
|
+
st.doneAgents.push(agentId);
|
|
369
|
+
if (st.emittedAgents.includes(agentId))
|
|
370
|
+
return;
|
|
371
|
+
const metas = em.agentMetas();
|
|
372
|
+
const a = metas.get(agentId);
|
|
373
|
+
if (!a)
|
|
374
|
+
return;
|
|
375
|
+
const root = rootOf(a, metas);
|
|
376
|
+
const turn = st.turns.find((t) => root.toolUseId && t.agg.agentCalls[root.toolUseId]);
|
|
377
|
+
if (!turn)
|
|
378
|
+
return; // turn not finalized yet: included at its Stop
|
|
379
|
+
const runs = collectRuns(em, turn, false);
|
|
380
|
+
if (!runs.length)
|
|
381
|
+
return;
|
|
382
|
+
turn.rev++;
|
|
383
|
+
emitTurn(em, turn);
|
|
384
|
+
em.events.push(...runs);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* StopFailure fired inside a sub-agent (payload has `agent_id`): that agent's run ended with an API
|
|
388
|
+
* error. It is not the main turn's end: the run is marked `failed` (stop_failure) and sent like a
|
|
389
|
+
* finished sub-agent.
|
|
390
|
+
*/
|
|
391
|
+
export function subagentFailed(em, agentId) {
|
|
392
|
+
const st = em.state;
|
|
393
|
+
st.failedAgents ??= [];
|
|
394
|
+
if (!st.failedAgents.includes(agentId))
|
|
395
|
+
st.failedAgents.push(agentId);
|
|
396
|
+
subagentFinished(em, agentId);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Workflow runs outlive the turn that launched them (they run in the background). After every hook,
|
|
400
|
+
* send the runs of agents that finished since, and re-send their turn with the added usage.
|
|
401
|
+
*/
|
|
402
|
+
export function collectWorkflowRuns(em) {
|
|
403
|
+
for (const turn of em.state.turns) {
|
|
404
|
+
if (!Object.entries(turn.agg.agentCalls).some(([k, c]) => isWorkflowKey(k) && !c.completed))
|
|
405
|
+
continue;
|
|
406
|
+
const runs = collectRuns(em, turn, false);
|
|
407
|
+
if (!runs.length)
|
|
408
|
+
continue;
|
|
409
|
+
turn.rev++;
|
|
410
|
+
emitTurn(em, turn);
|
|
411
|
+
em.events.push(...runs);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/** Session over: send runs of sub-agents that never reported, as far as their transcripts go. */
|
|
415
|
+
export function flushOpenRuns(em) {
|
|
416
|
+
for (const turn of em.state.turns) {
|
|
417
|
+
if (!Object.values(turn.agg.agentCalls).some((c) => !c.completed))
|
|
418
|
+
continue;
|
|
419
|
+
const runs = collectRuns(em, turn, true);
|
|
420
|
+
if (!runs.length)
|
|
421
|
+
continue;
|
|
422
|
+
turn.rev++;
|
|
423
|
+
emitTurn(em, turn);
|
|
424
|
+
em.events.push(...runs);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/claude-code/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { writeFileAtomic } from '../../fsutil.js';
|
|
5
|
+
import { isAiObsHookCommand } from '../hook-command.js';
|
|
6
|
+
/**
|
|
7
|
+
* Claude Code hook config in settings.json:
|
|
8
|
+
* { "hooks": { "<Event>": [ { "matcher"?: "…", "hooks": [ { "type": "command", "command": "…" } ] } ] } }
|
|
9
|
+
* We add one matcher-less group per event holding our command, and recognize our entries with
|
|
10
|
+
* isAiObsHookCommand(). Everything else in the file is kept as is.
|
|
11
|
+
*/
|
|
12
|
+
export const HOOK_EVENTS = ['SessionStart', 'UserPromptSubmit', 'Stop', 'StopFailure', 'SubagentStop', 'SessionEnd'];
|
|
13
|
+
/** SessionStart can print the token nudge and may run git; a stall must not hold session start for the 60 s default (C26). */
|
|
14
|
+
export const SESSION_START_TIMEOUT_S = 5;
|
|
15
|
+
/** ~/.claude, or $CLAUDE_CONFIG_DIR when set. */
|
|
16
|
+
export function claudeDir(env = process.env) {
|
|
17
|
+
return env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
|
|
18
|
+
}
|
|
19
|
+
export function settingsPath(scope, opts) {
|
|
20
|
+
if (scope === 'project') {
|
|
21
|
+
if (!opts.projectDir)
|
|
22
|
+
throw new Error('project scope needs a project directory');
|
|
23
|
+
return join(opts.projectDir, '.claude', 'settings.json');
|
|
24
|
+
}
|
|
25
|
+
return join(opts.claudeDir ?? claudeDir(), 'settings.json');
|
|
26
|
+
}
|
|
27
|
+
const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
28
|
+
/** Reads settings.json; {} when missing; throws on invalid JSON (never overwrite a file we cannot parse). */
|
|
29
|
+
export function readSettings(path) {
|
|
30
|
+
if (!existsSync(path))
|
|
31
|
+
return {};
|
|
32
|
+
const text = readFileSync(path, 'utf8');
|
|
33
|
+
if (!text.trim())
|
|
34
|
+
return {};
|
|
35
|
+
const parsed = JSON.parse(text);
|
|
36
|
+
if (!isObj(parsed))
|
|
37
|
+
throw new Error(`${path} is not a JSON object`);
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
/** Writes only when the content changed; keeps the file mode and leaves `<file>.ai-obs.bak` as a one-step undo. */
|
|
41
|
+
function writeSettings(path, settings, before, newFileMode = 0o600) {
|
|
42
|
+
const text = `${JSON.stringify(settings, null, 2)}\n`;
|
|
43
|
+
if (text === before)
|
|
44
|
+
return;
|
|
45
|
+
let mode = newFileMode;
|
|
46
|
+
if (before !== null) {
|
|
47
|
+
mode = statSync(path).mode & 0o777;
|
|
48
|
+
copyFileSync(path, `${path}.ai-obs.bak`);
|
|
49
|
+
}
|
|
50
|
+
writeFileAtomic(path, text, mode);
|
|
51
|
+
}
|
|
52
|
+
const entryIsOurs = (h) => isAiObsHookCommand(typeof h.command === 'string' ? h.command : null) || (Array.isArray(h.args) && isAiObsHookCommand([String(h.command ?? ''), ...h.args.map(String)]));
|
|
53
|
+
/** Removes our entries from one event's groups; drops groups that only held our entries. */
|
|
54
|
+
function withoutOurs(groups) {
|
|
55
|
+
if (!Array.isArray(groups))
|
|
56
|
+
return [];
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const g of groups) {
|
|
59
|
+
if (!isObj(g)) {
|
|
60
|
+
out.push(g);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const hooks = Array.isArray(g.hooks) ? g.hooks : null;
|
|
64
|
+
if (!hooks) {
|
|
65
|
+
out.push(g);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const kept = hooks.filter((h) => !(isObj(h) && entryIsOurs(h)));
|
|
69
|
+
if (kept.length === hooks.length)
|
|
70
|
+
out.push(g);
|
|
71
|
+
else if (kept.length)
|
|
72
|
+
out.push({ ...g, hooks: kept });
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Writes (or refreshes) our hook entries for every event. Idempotent. `newFileMode`: 0600 for the
|
|
78
|
+
* user file, 0644 for a project file (meant to be shared).
|
|
79
|
+
*/
|
|
80
|
+
export function installHooksAt(path, hookCommand, newFileMode = 0o600) {
|
|
81
|
+
const before = existsSync(path) ? readFileSync(path, 'utf8') : null;
|
|
82
|
+
const settings = readSettings(path);
|
|
83
|
+
const hooks = isObj(settings.hooks) ? { ...settings.hooks } : {};
|
|
84
|
+
for (const event of HOOK_EVENTS) {
|
|
85
|
+
const groups = withoutOurs(hooks[event]);
|
|
86
|
+
groups.push({ hooks: [{ type: 'command', command: hookCommand(event).shell, ...(event === 'SessionStart' ? { timeout: SESSION_START_TIMEOUT_S } : {}) }] });
|
|
87
|
+
hooks[event] = groups;
|
|
88
|
+
}
|
|
89
|
+
settings.hooks = hooks;
|
|
90
|
+
writeSettings(path, settings, before, newFileMode);
|
|
91
|
+
}
|
|
92
|
+
/** Removes only our entries; leaves the file untouched when there are none. */
|
|
93
|
+
export function uninstallHooksAt(path) {
|
|
94
|
+
if (!existsSync(path))
|
|
95
|
+
return;
|
|
96
|
+
const before = readFileSync(path, 'utf8');
|
|
97
|
+
const settings = readSettings(path);
|
|
98
|
+
if (!isObj(settings.hooks))
|
|
99
|
+
return;
|
|
100
|
+
const hooks = { ...settings.hooks };
|
|
101
|
+
for (const [event, groups] of Object.entries(hooks)) {
|
|
102
|
+
if (!Array.isArray(groups))
|
|
103
|
+
continue;
|
|
104
|
+
const kept = withoutOurs(groups);
|
|
105
|
+
if (kept.length)
|
|
106
|
+
hooks[event] = kept;
|
|
107
|
+
else
|
|
108
|
+
delete hooks[event];
|
|
109
|
+
}
|
|
110
|
+
if (Object.keys(hooks).length)
|
|
111
|
+
settings.hooks = hooks;
|
|
112
|
+
else
|
|
113
|
+
delete settings.hooks;
|
|
114
|
+
writeSettings(path, settings, before);
|
|
115
|
+
}
|
|
116
|
+
/** True when every event has our hook. */
|
|
117
|
+
export function hooksInstalledAt(path) {
|
|
118
|
+
let settings;
|
|
119
|
+
try {
|
|
120
|
+
settings = readSettings(path);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const hooks = isObj(settings.hooks) ? settings.hooks : {};
|
|
126
|
+
return HOOK_EVENTS.every((event) => {
|
|
127
|
+
const groups = hooks[event];
|
|
128
|
+
return Array.isArray(groups) && groups.some((g) => isObj(g) && Array.isArray(g.hooks) && g.hooks.some((h) => isObj(h) && entryIsOurs(h)));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** `disableAllHooks: true` turns every hook off. */
|
|
132
|
+
export function hooksDisabledAt(path) {
|
|
133
|
+
try {
|
|
134
|
+
return readSettings(path).disableAllHooks === true;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Shell commands of our hook entries in this settings file (empty when missing or unreadable). */
|
|
141
|
+
export function ourCommandsAt(path) {
|
|
142
|
+
try {
|
|
143
|
+
const hooks = readSettings(path).hooks;
|
|
144
|
+
if (!isObj(hooks))
|
|
145
|
+
return [];
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const groups of Object.values(hooks)) {
|
|
148
|
+
for (const g of Array.isArray(groups) ? groups : []) {
|
|
149
|
+
for (const h of isObj(g) && Array.isArray(g.hooks) ? g.hooks : []) {
|
|
150
|
+
if (isObj(h) && entryIsOurs(h))
|
|
151
|
+
out.push(Array.isArray(h.args) ? [String(h.command ?? ''), ...h.args.map(String)].join(' ') : String(h.command));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/adapters/claude-code/settings.ts"],"names":[],"mappings":"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"}
|