@llm4ts/runner 2.45.0 → 2.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Connectors.d.ts +1 -1
- package/dist/Connectors.d.ts.map +1 -1
- package/dist/Connectors.js +7 -2
- package/dist/Connectors.js.map +1 -1
- package/dist/Costs.d.ts +8 -4
- package/dist/Costs.d.ts.map +1 -1
- package/dist/Costs.js +32 -13
- package/dist/Costs.js.map +1 -1
- package/dist/Doctor.d.ts +24 -2
- package/dist/Doctor.d.ts.map +1 -1
- package/dist/Doctor.js +32 -12
- package/dist/Doctor.js.map +1 -1
- package/dist/FlowRunner.d.ts +38 -2
- package/dist/FlowRunner.d.ts.map +1 -1
- package/dist/FlowRunner.js +128 -13
- package/dist/FlowRunner.js.map +1 -1
- package/dist/NodeGeminiCliExecutor.js +3 -3
- package/dist/NodeGeminiCliExecutor.js.map +1 -1
- package/dist/RunReaders.d.ts +69 -0
- package/dist/RunReaders.d.ts.map +1 -0
- package/dist/RunReaders.js +277 -0
- package/dist/RunReaders.js.map +1 -0
- package/dist/RunSummary.d.ts +3 -0
- package/dist/RunSummary.d.ts.map +1 -0
- package/dist/RunSummary.js +49 -0
- package/dist/RunSummary.js.map +1 -0
- package/dist/StoryReaders.d.ts +16 -0
- package/dist/StoryReaders.d.ts.map +1 -0
- package/dist/StoryReaders.js +107 -0
- package/dist/StoryReaders.js.map +1 -0
- package/dist/Terminal.d.ts +2 -0
- package/dist/Terminal.d.ts.map +1 -1
- package/dist/Terminal.js +4 -1
- package/dist/Terminal.js.map +1 -1
- package/dist/Watch.d.ts +2 -0
- package/dist/Watch.d.ts.map +1 -1
- package/dist/Watch.js +2 -1
- package/dist/Watch.js.map +1 -1
- package/package.json +6 -3
- package/src/Connectors.ts +8 -2
- package/src/Costs.ts +44 -12
- package/src/Doctor.ts +62 -14
- package/src/FlowRunner.ts +177 -16
- package/src/NodeGeminiCliExecutor.ts +3 -3
- package/src/RunReaders.ts +413 -0
- package/src/RunSummary.ts +62 -0
- package/src/StoryReaders.ts +157 -0
- package/src/Terminal.ts +4 -1
- package/src/Watch.ts +2 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Option from "effect/Option";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { Board, BoardVersion } from "@llm4ts/flow/BoardSync";
|
|
6
|
+
import { loadCostLedger } from "@llm4ts/flow/CostLedger";
|
|
7
|
+
import { buildCostReport, reconcileWithLedger, usageSamplesFromTrace } from "@llm4ts/flow/CostReport";
|
|
8
|
+
import { describeFlowError } from "@llm4ts/flow/FlowError";
|
|
9
|
+
import { FlowEvent } from "@llm4ts/flow/FlowEvents";
|
|
10
|
+
import { RunOutcome } from "@llm4ts/flow/FlowRecorder";
|
|
11
|
+
import { CostsOut, Diagnosis, RunStatus } from "@llm4ts/flow/OperatorSchemas";
|
|
12
|
+
import { loadVersioned } from "@llm4ts/flow/Persistence";
|
|
13
|
+
import { parsePlan } from "@llm4ts/flow/Plan";
|
|
14
|
+
import { readTrace } from "@llm4ts/flow/Replay";
|
|
15
|
+
import { emptyTree, reduceTree, treeInputsOfTrace } from "./AgentTree.js";
|
|
16
|
+
import { summarizeTree } from "./RunSummary.js";
|
|
17
|
+
import { loadTranscript, tailLinesOf } from "./Transcripts.js";
|
|
18
|
+
/**
|
|
19
|
+
* Read-only answers about a run, from the files it writes: how it stands,
|
|
20
|
+
* what happened since a sequence number, why it failed, what it cost. Every
|
|
21
|
+
* reader takes the file store as a parameter, so a test feeds it a memory
|
|
22
|
+
* store and the MCP operator feeds it the real one.
|
|
23
|
+
*/
|
|
24
|
+
export class TraceUnreadable extends Schema.TaggedError()("TraceUnreadable", {
|
|
25
|
+
path: Schema.String,
|
|
26
|
+
message: Schema.String
|
|
27
|
+
}) {
|
|
28
|
+
}
|
|
29
|
+
const decodeEvent = Schema.decodeUnknownOption(Schema.fromJsonString(FlowEvent));
|
|
30
|
+
const isOutcome = Schema.is(RunOutcome);
|
|
31
|
+
const eventOf = (line) => {
|
|
32
|
+
const raw = line.fields.event;
|
|
33
|
+
return typeof raw === "string" ? Option.getOrUndefined(decodeEvent(raw)) : undefined;
|
|
34
|
+
};
|
|
35
|
+
const unreadable = (path) => (error) => TraceUnreadable.make({ path, message: describeFlowError(error) });
|
|
36
|
+
const readLines = (files, path) => readTrace(files, path).pipe(Effect.mapError(unreadable(path)));
|
|
37
|
+
const lastSeq = (lines) => lines[lines.length - 1]?.seq ?? 0;
|
|
38
|
+
/** The trace folded into the watch TUI's tree, seeded from the epic's board when there is one. */
|
|
39
|
+
export const foldTrace = (files, tracePath, boardDir) => Effect.gen(function* () {
|
|
40
|
+
const lines = yield* readLines(files, tracePath);
|
|
41
|
+
const board = boardDir === undefined
|
|
42
|
+
? undefined
|
|
43
|
+
: yield* loadVersioned(files, join(boardDir, "board.json"), BoardVersion, Board).pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
44
|
+
const start = emptyTree(board === undefined
|
|
45
|
+
? {}
|
|
46
|
+
: {
|
|
47
|
+
title: board.title.replace(/^Epic:\s*/u, "epic "),
|
|
48
|
+
stories: board.items.map((item) => ({ id: item.id, status: item.status }))
|
|
49
|
+
});
|
|
50
|
+
const state = treeInputsOfTrace(lines).reduce(reduceTree, start);
|
|
51
|
+
return { lines, state, seq: lastSeq(lines) };
|
|
52
|
+
});
|
|
53
|
+
export const runStatusOf = (fold, run, now) => {
|
|
54
|
+
const { state } = fold;
|
|
55
|
+
const lanes = state.lanes.map((lane) => {
|
|
56
|
+
const stage = lane.stages[lane.stages.length - 1];
|
|
57
|
+
return {
|
|
58
|
+
id: lane.id,
|
|
59
|
+
status: lane.status,
|
|
60
|
+
...(stage === undefined ? {} : { stage }),
|
|
61
|
+
...(lane.executor === undefined ? {} : { executor: lane.executor }),
|
|
62
|
+
...(lane.activity === undefined ? {} : { activity: lane.activity.text }),
|
|
63
|
+
lastEventAgeMs: Math.max(0, Math.round(now - lane.lastEventAt)),
|
|
64
|
+
costUsd: lane.costUsd
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
const unenforceable = fold.lines.flatMap((line) => {
|
|
68
|
+
const event = eventOf(line);
|
|
69
|
+
return event?._tag === "CapabilityUnenforceable" ? [event.detail] : [];
|
|
70
|
+
});
|
|
71
|
+
const end = state.ended === undefined ? now : (state.now ?? now);
|
|
72
|
+
return RunStatus.make({
|
|
73
|
+
runId: run.runId,
|
|
74
|
+
state: run.state,
|
|
75
|
+
...(state.ended !== undefined && isOutcome(state.ended) ? { ended: state.ended } : {}),
|
|
76
|
+
elapsedMs: state.startedAt === undefined ? 0 : Math.max(0, Math.round(end - state.startedAt)),
|
|
77
|
+
lanes,
|
|
78
|
+
stories: state.stories.map((story) => ({ id: story.id, status: story.status })),
|
|
79
|
+
tokens: Math.round(state.tokens),
|
|
80
|
+
costUsd: state.costUsd,
|
|
81
|
+
warnings: [
|
|
82
|
+
...unenforceable,
|
|
83
|
+
...state.exclusions.map((entry) => `${entry.executor} excluded: ${entry.reason}`)
|
|
84
|
+
],
|
|
85
|
+
seq: fold.seq,
|
|
86
|
+
summary: summarizeTree(state, run.flow)
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
export const meaningfulKinds = new Set([
|
|
90
|
+
"StoryStatusChanged",
|
|
91
|
+
"StageFailed",
|
|
92
|
+
"Aborted",
|
|
93
|
+
"CapabilityUnenforceable",
|
|
94
|
+
"ExecutorExcluded",
|
|
95
|
+
"ExecutorHandedOver",
|
|
96
|
+
"StoryJudged",
|
|
97
|
+
"Began",
|
|
98
|
+
"RunEnded"
|
|
99
|
+
]);
|
|
100
|
+
const textOf = (event) => {
|
|
101
|
+
switch (event._tag) {
|
|
102
|
+
case "StoryStatusChanged":
|
|
103
|
+
return { text: `story ${event.id} ${event.status}`, lane: event.id };
|
|
104
|
+
case "StageFailed":
|
|
105
|
+
return {
|
|
106
|
+
text: `${event.stage} failed: ${event.message}`,
|
|
107
|
+
...(event.lane === undefined ? {} : { lane: event.lane })
|
|
108
|
+
};
|
|
109
|
+
case "Aborted":
|
|
110
|
+
return { text: `aborted: ${event.message}` };
|
|
111
|
+
case "CapabilityUnenforceable":
|
|
112
|
+
return { text: `capability unenforceable: ${event.detail}` };
|
|
113
|
+
case "ExecutorExcluded":
|
|
114
|
+
return { text: `${event.executor} excluded: ${event.reason}` };
|
|
115
|
+
case "ExecutorHandedOver":
|
|
116
|
+
return {
|
|
117
|
+
text: `${event.from} handed over ${event.role} (${event.scope}): ${event.reason}`,
|
|
118
|
+
...(event.label === undefined ? {} : { lane: event.label })
|
|
119
|
+
};
|
|
120
|
+
case "StoryJudged":
|
|
121
|
+
return {
|
|
122
|
+
text: `${event.lane} judged round ${event.round}: ${event.cleared ? "cleared" : `${event.issues} issues`}`,
|
|
123
|
+
lane: event.lane
|
|
124
|
+
};
|
|
125
|
+
case "Began":
|
|
126
|
+
return {
|
|
127
|
+
text: `began ${event.kind} ${event.label}`,
|
|
128
|
+
...(event.lane === undefined ? {} : { lane: event.lane })
|
|
129
|
+
};
|
|
130
|
+
default:
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
export const meaningfulEventsAfter = (lines, sinceSeq) => lines.flatMap((line) => {
|
|
135
|
+
if (line.seq <= sinceSeq || !meaningfulKinds.has(line.kind)) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
if (line.kind === "RunEnded") {
|
|
139
|
+
const outcome = line.fields.outcome;
|
|
140
|
+
return [
|
|
141
|
+
{
|
|
142
|
+
seq: line.seq,
|
|
143
|
+
at: line.timestamp,
|
|
144
|
+
kind: line.kind,
|
|
145
|
+
text: `run ${typeof outcome === "string" ? outcome : "completed"}`
|
|
146
|
+
}
|
|
147
|
+
];
|
|
148
|
+
}
|
|
149
|
+
const event = eventOf(line);
|
|
150
|
+
const rendered = event === undefined ? undefined : textOf(event);
|
|
151
|
+
return rendered === undefined
|
|
152
|
+
? []
|
|
153
|
+
: [
|
|
154
|
+
{
|
|
155
|
+
seq: line.seq,
|
|
156
|
+
at: line.timestamp,
|
|
157
|
+
kind: line.kind,
|
|
158
|
+
...(rendered.lane === undefined ? {} : { lane: rendered.lane }),
|
|
159
|
+
text: rendered.text
|
|
160
|
+
}
|
|
161
|
+
];
|
|
162
|
+
});
|
|
163
|
+
export const eventsAfter = (lines, sinceSeq, kinds, limit) => lines
|
|
164
|
+
.filter((line) => line.seq > sinceSeq && (kinds === undefined || kinds.some((kind) => kind === line.kind)))
|
|
165
|
+
.slice(0, Math.max(0, limit));
|
|
166
|
+
const digestTail = 40;
|
|
167
|
+
const tailRows = 30;
|
|
168
|
+
const tailWidth = 120;
|
|
169
|
+
const quiet = (effect) => effect.pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
170
|
+
const capText = (text, remaining) => text.slice(0, Math.max(0, remaining));
|
|
171
|
+
/** The last rows of each log in a directory, within what is left of a character budget. */
|
|
172
|
+
export const tailGateLogs = (sources, directory, budget) => Effect.gen(function* () {
|
|
173
|
+
const tails = [];
|
|
174
|
+
let remaining = budget;
|
|
175
|
+
if (directory !== undefined) {
|
|
176
|
+
for (const name of sources.listFiles(directory)) {
|
|
177
|
+
const path = join(directory, name);
|
|
178
|
+
const text = yield* quiet(sources.files.read(path));
|
|
179
|
+
if (text === undefined || remaining <= 0)
|
|
180
|
+
continue;
|
|
181
|
+
const tail = capText(text.trimEnd().split(/\r?\n/u).slice(-tailRows).join("\n"), remaining);
|
|
182
|
+
remaining -= tail.length;
|
|
183
|
+
tails.push({ path, tail });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return { tails, remaining };
|
|
187
|
+
});
|
|
188
|
+
/** The last rows of one lane's transcript, capped to what is left of a character budget. */
|
|
189
|
+
export const tailTranscript = (sources, directory, lane, budget) => Effect.gen(function* () {
|
|
190
|
+
const out = [];
|
|
191
|
+
if (directory === undefined)
|
|
192
|
+
return out;
|
|
193
|
+
let remaining = budget;
|
|
194
|
+
const transcriptFiles = {
|
|
195
|
+
read: (path) => quiet(sources.files.read(path)),
|
|
196
|
+
list: sources.listFiles
|
|
197
|
+
};
|
|
198
|
+
const entries = yield* loadTranscript(transcriptFiles, directory, { lane });
|
|
199
|
+
const rows = tailLinesOf(entries, { lane }, undefined, tailWidth, tailRows) ?? [];
|
|
200
|
+
for (const row of rows) {
|
|
201
|
+
if (remaining <= 0)
|
|
202
|
+
break;
|
|
203
|
+
const kept = capText(row, remaining);
|
|
204
|
+
remaining -= kept.length;
|
|
205
|
+
out.push(kept);
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
});
|
|
209
|
+
export const runDiagnosisOf = (sources, args) => Effect.gen(function* () {
|
|
210
|
+
const lines = yield* readLines(sources.files, args.tracePath);
|
|
211
|
+
const events = lines.flatMap((line) => {
|
|
212
|
+
const event = eventOf(line);
|
|
213
|
+
return event === undefined ? [] : [event];
|
|
214
|
+
});
|
|
215
|
+
const failed = events.filter((event) => event._tag === "StageFailed" || event._tag === "Aborted");
|
|
216
|
+
const last = failed[failed.length - 1];
|
|
217
|
+
const failure = last === undefined
|
|
218
|
+
? undefined
|
|
219
|
+
: last._tag === "StageFailed"
|
|
220
|
+
? {
|
|
221
|
+
stage: last.stage,
|
|
222
|
+
message: last.message,
|
|
223
|
+
...(last.lane === undefined ? {} : { lane: last.lane })
|
|
224
|
+
}
|
|
225
|
+
: last._tag === "Aborted"
|
|
226
|
+
? { message: last.message }
|
|
227
|
+
: undefined;
|
|
228
|
+
const markdown = args.planPath === undefined ? undefined : yield* quiet(sources.files.read(args.planPath));
|
|
229
|
+
const plan = markdown === undefined ? undefined : yield* quiet(parsePlan(markdown));
|
|
230
|
+
const taskLines = (plan?.tasks ?? []).map((task) => `- [${task.completed ? "x" : " "}] ${task.title}`);
|
|
231
|
+
const recent = events
|
|
232
|
+
.flatMap((event) => event._tag === "Info"
|
|
233
|
+
? [event.message]
|
|
234
|
+
: event._tag === "StageFailed"
|
|
235
|
+
? [`${event.stage} failed: ${event.message}`]
|
|
236
|
+
: [])
|
|
237
|
+
.slice(-digestTail);
|
|
238
|
+
const digest = capText([...taskLines, ...recent].join("\n"), args.budget);
|
|
239
|
+
const remaining = args.budget - digest.length;
|
|
240
|
+
const gateTails = yield* tailGateLogs(sources, args.gateLogDir, remaining);
|
|
241
|
+
const transcript = yield* tailTranscript(sources, args.transcriptsDir, "run", gateTails.remaining);
|
|
242
|
+
return Diagnosis.make({
|
|
243
|
+
runId: args.runId,
|
|
244
|
+
digest,
|
|
245
|
+
...(failure === undefined ? {} : { failure }),
|
|
246
|
+
gateLogTails: gateTails.tails,
|
|
247
|
+
transcriptTail: transcript
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
const ledgerTolerance = 0.005;
|
|
251
|
+
const costOf = (report) => (report.measured.costUsd ?? 0) + (report.estimated.costUsd ?? 0);
|
|
252
|
+
/**
|
|
253
|
+
* One run's costs: its trace folded and topped up from its `costs.jsonl`
|
|
254
|
+
* line (`CostReport.reconcileWithLedger`), so `total` is what the run itself
|
|
255
|
+
* printed even when the trace lost lines; `fromLedger` is how much of it the
|
|
256
|
+
* ledger supplied. `differs` is left for a trace that says more than the
|
|
257
|
+
* ledger, which no line can fill.
|
|
258
|
+
*/
|
|
259
|
+
export const costsOfRun = (files, tracePath, ledgerPath, runId) => Effect.gen(function* () {
|
|
260
|
+
const lines = yield* readLines(files, tracePath);
|
|
261
|
+
const traced = usageSamplesFromTrace(lines);
|
|
262
|
+
const records = yield* loadCostLedger(files, ledgerPath).pipe(Effect.mapError(unreadable(ledgerPath)));
|
|
263
|
+
const record = records.find((candidate) => candidate.runId === runId);
|
|
264
|
+
const reconciled = record === undefined ? traced : reconcileWithLedger(traced, [record]).samples;
|
|
265
|
+
const report = buildCostReport(reconciled);
|
|
266
|
+
const total = costOf(report);
|
|
267
|
+
const fromLedger = total - costOf(buildCostReport(traced));
|
|
268
|
+
const ledger = record?.totalCostUsd;
|
|
269
|
+
return CostsOut.make({
|
|
270
|
+
report,
|
|
271
|
+
total,
|
|
272
|
+
...(ledger === undefined ? {} : { ledger }),
|
|
273
|
+
...(fromLedger > ledgerTolerance ? { fromLedger } : {}),
|
|
274
|
+
differs: ledger !== undefined && Math.abs(total - ledger) > ledgerTolerance
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=RunReaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunReaders.js","sourceRoot":"","sources":["../src/RunReaders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunSummary.d.ts","sourceRoot":"","sources":["../src/RunSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAqCzD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,KAAG,MAwB1E,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One sentence on how a run is going, for a chat agent that asked. Pure over
|
|
3
|
+
* the watch TUI's folded state, so a live run and a replay read the same.
|
|
4
|
+
*/
|
|
5
|
+
const listed = 3;
|
|
6
|
+
const elapsedOf = (state) => {
|
|
7
|
+
const minutes = state.startedAt === undefined || state.now === undefined
|
|
8
|
+
? 0
|
|
9
|
+
: Math.max(0, Math.floor((state.now - state.startedAt) / 60_000));
|
|
10
|
+
return minutes < 60 ? `${minutes} min` : `${Math.floor(minutes / 60)} h ${minutes % 60} min`;
|
|
11
|
+
};
|
|
12
|
+
/** At most three entries; the rest collapse into `+<n>`. */
|
|
13
|
+
const capped = (items, separator) => items.length > listed
|
|
14
|
+
? [...items.slice(0, listed), `+${items.length - listed}`].join(separator)
|
|
15
|
+
: items.join(separator);
|
|
16
|
+
const doing = (lane) => lane?.stages[lane.stages.length - 1] ?? lane?.activity?.text ?? "starting";
|
|
17
|
+
const lastLogOf = (state, id) => {
|
|
18
|
+
for (let index = state.log.length - 1; index >= 0; index--) {
|
|
19
|
+
const entry = state.log[index];
|
|
20
|
+
if (entry !== undefined && entry.who === id)
|
|
21
|
+
return entry.what;
|
|
22
|
+
}
|
|
23
|
+
return "failed";
|
|
24
|
+
};
|
|
25
|
+
const parenthesized = (items, separator) => items.length === 0 ? "" : ` (${capped(items, separator)})`;
|
|
26
|
+
export const summarizeTree = (state, flow) => {
|
|
27
|
+
const ended = state.ended === undefined ? "" : `${state.ended}, `;
|
|
28
|
+
const head = `${ended}${flow ?? state.title}, ${elapsedOf(state)}`;
|
|
29
|
+
const cost = `$${state.costUsd.toFixed(2)}`;
|
|
30
|
+
const board = state.stories.length > 0;
|
|
31
|
+
if (!board && state.lanes.length === 0)
|
|
32
|
+
return `${head}: no stories yet, ${cost}`;
|
|
33
|
+
const ids = (status) => board
|
|
34
|
+
? state.stories.filter((story) => story.status === status).map((story) => story.id)
|
|
35
|
+
: state.lanes
|
|
36
|
+
.filter((lane) => lane.status === (status === "active" ? "running" : status))
|
|
37
|
+
.map((lane) => lane.id);
|
|
38
|
+
const active = ids("active");
|
|
39
|
+
const failed = ids("failed");
|
|
40
|
+
const activeItems = active.map((id) => {
|
|
41
|
+
const lane = state.lanes.find((open) => open.id === id);
|
|
42
|
+
return `${id}, ${lane?.executor ?? "?"}, ${doing(lane)}`;
|
|
43
|
+
});
|
|
44
|
+
const failedItems = failed.map((id) => `${id}: ${lastLogOf(state, id)}`);
|
|
45
|
+
return (`${head}: ${ids("done").length} stories done, ` +
|
|
46
|
+
`${active.length} active${parenthesized(activeItems, "; ")}, ` +
|
|
47
|
+
`${failed.length} failed${parenthesized(failedItems, "; ")}, ${cost}`);
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=RunSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunSummary.js","sourceRoot":"","sources":["../src/RunSummary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { type FlowError } from "@llm4ts/flow/FlowError";
|
|
3
|
+
import { Diagnosis, StoryDetail, UnknownStory } from "@llm4ts/flow/OperatorSchemas";
|
|
4
|
+
import { TraceUnreadable, type RunSources } from "./RunReaders.ts";
|
|
5
|
+
/** A story id is a file-name stem: no separators, no dots-only, nothing that climbs. */
|
|
6
|
+
export declare const isSafeStoryId: (id: string) => boolean;
|
|
7
|
+
export declare const storyDetailOf: (sources: RunSources, stateDir: string, storyId: string) => Effect.Effect<StoryDetail, FlowError | UnknownStory>;
|
|
8
|
+
export declare const storyDiagnosisOf: (sources: RunSources, args: {
|
|
9
|
+
readonly stateDir: string;
|
|
10
|
+
readonly storyId: string;
|
|
11
|
+
readonly runId: string;
|
|
12
|
+
readonly tracePath: string;
|
|
13
|
+
readonly transcriptsDir: string | undefined;
|
|
14
|
+
readonly budget: number;
|
|
15
|
+
}) => Effect.Effect<Diagnosis, FlowError | UnknownStory | TraceUnreadable>;
|
|
16
|
+
//# sourceMappingURL=StoryReaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoryReaders.d.ts","sourceRoot":"","sources":["../src/StoryReaders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AASnF,OAAO,EAAE,eAAe,EAAgC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAUhG,wFAAwF;AACxF,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,OAA0B,CAAA;AA4BrE,eAAO,MAAM,aAAa,GACxB,SAAS,UAAU,EACnB,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,GAAG,YAAY,CAuClD,CAAA;AAEJ,eAAO,MAAM,gBAAgB,GAC3B,SAAS,UAAU,EACnB,MAAM;IACJ,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,KACA,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,eAAe,CAgDlE,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Option from "effect/Option";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { describeFlowError } from "@llm4ts/flow/FlowError";
|
|
6
|
+
import { Diagnosis, StoryDetail, UnknownStory } from "@llm4ts/flow/OperatorSchemas";
|
|
7
|
+
import { loadEpicFiles, loadStoryFiles, renderStoryDigest } from "@llm4ts/flow/Retro";
|
|
8
|
+
import { readTrace } from "@llm4ts/flow/Replay";
|
|
9
|
+
import { makeStoryPlanStore } from "@llm4ts/flow/StoryPlan";
|
|
10
|
+
import { TraceUnreadable, tailGateLogs, tailTranscript } from "./RunReaders.js";
|
|
11
|
+
import { loadTranscript } from "./Transcripts.js";
|
|
12
|
+
/**
|
|
13
|
+
* Read-only answers about one story of an epic run, from the files the story
|
|
14
|
+
* executor keeps under `<stateDir>/stories/<id>.*` and `<stateDir>/board.json`.
|
|
15
|
+
*/
|
|
16
|
+
const safeId = /^[A-Za-z0-9][A-Za-z0-9._-]*$/u;
|
|
17
|
+
/** A story id is a file-name stem: no separators, no dots-only, nothing that climbs. */
|
|
18
|
+
export const isSafeStoryId = (id) => safeId.test(id);
|
|
19
|
+
const decodeJson = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));
|
|
20
|
+
const encodeJson = (value) => JSON.stringify(value);
|
|
21
|
+
const planPathOf = (stateDir) => join(stateDir, "plan.md");
|
|
22
|
+
const unknownStory = (storyId) => UnknownStory.make({ message: `unknown story '${storyId}'` });
|
|
23
|
+
/** The plan's story, or `UnknownStory` for an unsafe id, a missing plan or an id the plan lacks. */
|
|
24
|
+
const storyOf = (sources, stateDir, storyId) => Effect.gen(function* () {
|
|
25
|
+
if (!isSafeStoryId(storyId)) {
|
|
26
|
+
return yield* unknownStory(storyId);
|
|
27
|
+
}
|
|
28
|
+
const plan = yield* makeStoryPlanStore(sources.files).load(planPathOf(stateDir));
|
|
29
|
+
const story = plan?.story(storyId);
|
|
30
|
+
if (plan === undefined || story === undefined) {
|
|
31
|
+
return yield* unknownStory(storyId);
|
|
32
|
+
}
|
|
33
|
+
return { plan, story };
|
|
34
|
+
});
|
|
35
|
+
export const storyDetailOf = (sources, stateDir, storyId) => Effect.gen(function* () {
|
|
36
|
+
const { story } = yield* storyOf(sources, stateDir, storyId);
|
|
37
|
+
const stored = yield* loadStoryFiles(sources.files, stateDir, story);
|
|
38
|
+
const epic = yield* loadEpicFiles(sources.files, stateDir);
|
|
39
|
+
const item = epic.board?.items.find((candidate) => candidate.id === storyId);
|
|
40
|
+
const verdictText = stored.verdict === undefined ? undefined : encodeJson(stored.verdict);
|
|
41
|
+
const verdict = verdictText === undefined ? undefined : Option.getOrUndefined(decodeJson(verdictText));
|
|
42
|
+
const gateDir = join(stateDir, "stories", storyId, "gates");
|
|
43
|
+
return StoryDetail.make({
|
|
44
|
+
id: story.id,
|
|
45
|
+
title: story.title,
|
|
46
|
+
...(stored.state === undefined
|
|
47
|
+
? {}
|
|
48
|
+
: {
|
|
49
|
+
state: {
|
|
50
|
+
status: stored.state.status,
|
|
51
|
+
branch: stored.state.branch,
|
|
52
|
+
worktree: stored.state.worktree,
|
|
53
|
+
...(stored.state.executor === undefined ? {} : { executor: stored.state.executor })
|
|
54
|
+
}
|
|
55
|
+
}),
|
|
56
|
+
...(item === undefined
|
|
57
|
+
? {}
|
|
58
|
+
: {
|
|
59
|
+
board: {
|
|
60
|
+
status: item.status,
|
|
61
|
+
...(item.detail === undefined ? {} : { detail: item.detail })
|
|
62
|
+
}
|
|
63
|
+
}),
|
|
64
|
+
tasks: (stored.plan?.tasks ?? []).map((task) => ({
|
|
65
|
+
title: task.title,
|
|
66
|
+
completed: task.completed
|
|
67
|
+
})),
|
|
68
|
+
...(stored.findings === undefined ? {} : { findings: stored.findings }),
|
|
69
|
+
...(verdict === undefined ? {} : { verdict }),
|
|
70
|
+
gateLogs: sources.listFiles(gateDir).map((name) => join(gateDir, name))
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
export const storyDiagnosisOf = (sources, args) => Effect.gen(function* () {
|
|
74
|
+
const { plan, story } = yield* storyOf(sources, args.stateDir, args.storyId);
|
|
75
|
+
const trace = yield* readTrace(sources.files, args.tracePath).pipe(Effect.mapError((error) => TraceUnreadable.make({ path: args.tracePath, message: describeFlowError(error) })));
|
|
76
|
+
const stored = yield* loadStoryFiles(sources.files, args.stateDir, story);
|
|
77
|
+
const epic = yield* loadEpicFiles(sources.files, args.stateDir);
|
|
78
|
+
const transcriptFiles = {
|
|
79
|
+
read: (path) => Effect.catch(sources.files.read(path), () => Effect.succeed(undefined)),
|
|
80
|
+
list: sources.listFiles
|
|
81
|
+
};
|
|
82
|
+
const entries = args.transcriptsDir === undefined
|
|
83
|
+
? undefined
|
|
84
|
+
: yield* loadTranscript(transcriptFiles, args.transcriptsDir, { lane: story.id });
|
|
85
|
+
const inputs = {
|
|
86
|
+
runId: args.runId,
|
|
87
|
+
plan,
|
|
88
|
+
trace,
|
|
89
|
+
transcripts: entries === undefined ? undefined : new Map([[story.id, entries]]),
|
|
90
|
+
report: epic.report,
|
|
91
|
+
board: epic.board,
|
|
92
|
+
stories: [stored]
|
|
93
|
+
};
|
|
94
|
+
const digest = renderStoryDigest(inputs, story.id, args.budget) ?? "";
|
|
95
|
+
const item = epic.board?.items.find((candidate) => candidate.id === story.id);
|
|
96
|
+
const gates = yield* tailGateLogs(sources, join(args.stateDir, "stories", story.id, "gates"), args.budget - digest.length);
|
|
97
|
+
const transcriptTail = yield* tailTranscript(sources, args.transcriptsDir, story.id, gates.remaining);
|
|
98
|
+
return Diagnosis.make({
|
|
99
|
+
runId: args.runId,
|
|
100
|
+
story: story.id,
|
|
101
|
+
digest,
|
|
102
|
+
...(item?.detail === undefined ? {} : { failure: { message: item.detail, lane: story.id } }),
|
|
103
|
+
gateLogTails: gates.tails,
|
|
104
|
+
transcriptTail
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=StoryReaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoryReaders.js","sourceRoot":"","sources":["../src/StoryReaders.ts"],"names":[],"mappings":"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"}
|
package/dist/Terminal.d.ts
CHANGED
|
@@ -53,6 +53,8 @@ export interface TerminalOutput {
|
|
|
53
53
|
export declare const fitToWidth: (line: string, columns: number | undefined) => string;
|
|
54
54
|
export declare const terminalSupportsColor: (output: TerminalOutput, environment: Readonly<Record<string, string | undefined>>) => boolean;
|
|
55
55
|
export declare const makeLiveTerminalSurface: (write?: ((text: string) => void) | undefined, palette?: TerminalPalette | undefined, tick?: Duration.Input | undefined, columns?: (() => number | undefined) | undefined) => Effect.Effect<TerminalSurface, never, Scope.Scope>;
|
|
56
|
+
/** Re-raise only when no other listener remains to handle the signal. */
|
|
57
|
+
export declare const shouldReraise: (otherListeners: number) => boolean;
|
|
56
58
|
export declare const makeTerminalSurface: (environment?: Readonly<Record<string, string | undefined>>, output?: TerminalOutput) => Effect.Effect<TerminalSurface, never, Scope.Scope>;
|
|
57
59
|
export interface TerminalRunStats {
|
|
58
60
|
readonly stagesCompleted: number;
|
package/dist/Terminal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Terminal.d.ts","sourceRoot":"","sources":["../src/Terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AAEjC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,SAAS,mEAA2D,CAAA;AACjF,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,SAW1D,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,EAAE,OAAO,SAAS,KAAG,OAsCrE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAsC5C,CAAA;AAgBD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC7C,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACxC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACzD,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACzD,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CACvD;AAID,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,KAAG,eAmBtD,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,KAAG,MAWvD,CAAA;AAED,eAAO,MAAM,oBAAoB,iBAA6B,CAAA;AAE9D,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAMpC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,cAAc,EACrB,SAAS,eAAe,EACxB,OAAO,MAAM,KACZ,MAwCF,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,OAAO,SAAS,EAChB,UAAS,eAAsC,EAC/C,YAAW,SAAoB,KAC9B,MA0EF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,MAI7D,CAAA;AAKD,eAAO,MAAM,YAAY,GAAI,QAAQ,aAAa,CAAC,SAAS,CAAC,KAAG,aAAa,CAAC,MAAM,CAanF,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnD,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CACtF;AAED,eAAO,MAAM,wBAAwB,GACnC,QAAO,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkD,KAC1E,eAKD,CAAA;AAQF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAC1C;AAED,mGAAmG;AACnG,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,GAAG,SAAS,KAAG,MAGjC,CAAA;AAEtC,eAAO,MAAM,qBAAqB,GAChC,QAAQ,cAAc,EACtB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,OAAsE,CAAA;AAEzE,eAAO,MAAM,uBAAuB,mBACpB,MAAM,KAAK,IAAI,0GAKd,MAAM,GAAG,SAAS,oEAsEjC,CAAA;
|
|
1
|
+
{"version":3,"file":"Terminal.d.ts","sourceRoot":"","sources":["../src/Terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/Terminal.js
CHANGED
|
@@ -334,6 +334,8 @@ export const makeLiveTerminalSurface = Effect.fn("@llm4ts/runner/Terminal.makeLi
|
|
|
334
334
|
});
|
|
335
335
|
const hideCursor = "\u001b[?25l";
|
|
336
336
|
const showCursor = "\u001b[?25h";
|
|
337
|
+
/** Re-raise only when no other listener remains to handle the signal. */
|
|
338
|
+
export const shouldReraise = (otherListeners) => otherListeners === 0;
|
|
337
339
|
/**
|
|
338
340
|
* While the live status block is on screen, keystrokes must not be echoed:
|
|
339
341
|
* an arrow key (or a trackpad scroll the terminal turns into one) echoes as
|
|
@@ -361,7 +363,8 @@ const quietTerminalInput = (write) => Effect.gen(function* () {
|
|
|
361
363
|
// then let the signal do what it would have done.
|
|
362
364
|
const onSignal = (signal) => {
|
|
363
365
|
restore();
|
|
364
|
-
process.
|
|
366
|
+
if (shouldReraise(process.listenerCount(signal)))
|
|
367
|
+
process.kill(process.pid, signal);
|
|
365
368
|
};
|
|
366
369
|
yield* Effect.sync(() => {
|
|
367
370
|
stty("-echo");
|