@llm4ts/runner 2.45.0 → 2.47.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 (49) hide show
  1. package/dist/Connectors.d.ts +1 -1
  2. package/dist/Connectors.d.ts.map +1 -1
  3. package/dist/Connectors.js +7 -2
  4. package/dist/Connectors.js.map +1 -1
  5. package/dist/Costs.d.ts +8 -4
  6. package/dist/Costs.d.ts.map +1 -1
  7. package/dist/Costs.js +32 -13
  8. package/dist/Costs.js.map +1 -1
  9. package/dist/Doctor.d.ts +24 -2
  10. package/dist/Doctor.d.ts.map +1 -1
  11. package/dist/Doctor.js +32 -12
  12. package/dist/Doctor.js.map +1 -1
  13. package/dist/FlowRunner.d.ts +38 -2
  14. package/dist/FlowRunner.d.ts.map +1 -1
  15. package/dist/FlowRunner.js +128 -13
  16. package/dist/FlowRunner.js.map +1 -1
  17. package/dist/NodeGeminiCliExecutor.js +3 -3
  18. package/dist/NodeGeminiCliExecutor.js.map +1 -1
  19. package/dist/RunReaders.d.ts +69 -0
  20. package/dist/RunReaders.d.ts.map +1 -0
  21. package/dist/RunReaders.js +283 -0
  22. package/dist/RunReaders.js.map +1 -0
  23. package/dist/RunSummary.d.ts +3 -0
  24. package/dist/RunSummary.d.ts.map +1 -0
  25. package/dist/RunSummary.js +49 -0
  26. package/dist/RunSummary.js.map +1 -0
  27. package/dist/StoryReaders.d.ts +16 -0
  28. package/dist/StoryReaders.d.ts.map +1 -0
  29. package/dist/StoryReaders.js +107 -0
  30. package/dist/StoryReaders.js.map +1 -0
  31. package/dist/Terminal.d.ts +2 -0
  32. package/dist/Terminal.d.ts.map +1 -1
  33. package/dist/Terminal.js +8 -1
  34. package/dist/Terminal.js.map +1 -1
  35. package/dist/Watch.d.ts +2 -0
  36. package/dist/Watch.d.ts.map +1 -1
  37. package/dist/Watch.js +2 -1
  38. package/dist/Watch.js.map +1 -1
  39. package/package.json +6 -3
  40. package/src/Connectors.ts +8 -2
  41. package/src/Costs.ts +44 -12
  42. package/src/Doctor.ts +62 -14
  43. package/src/FlowRunner.ts +177 -16
  44. package/src/NodeGeminiCliExecutor.ts +3 -3
  45. package/src/RunReaders.ts +419 -0
  46. package/src/RunSummary.ts +62 -0
  47. package/src/StoryReaders.ts +157 -0
  48. package/src/Terminal.ts +10 -1
  49. package/src/Watch.ts +2 -1
@@ -0,0 +1,283 @@
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
+ "CriterionChecked",
100
+ "Parked"
101
+ ]);
102
+ const textOf = (event) => {
103
+ switch (event._tag) {
104
+ case "StoryStatusChanged":
105
+ return { text: `story ${event.id} ${event.status}`, lane: event.id };
106
+ case "CriterionChecked":
107
+ return { text: `criterion ${event.tag} ${event.status}`, lane: event.story };
108
+ case "Parked":
109
+ return { text: `parked ${event.item}: ${event.reason}`, lane: event.story };
110
+ case "StageFailed":
111
+ return {
112
+ text: `${event.stage} failed: ${event.message}`,
113
+ ...(event.lane === undefined ? {} : { lane: event.lane })
114
+ };
115
+ case "Aborted":
116
+ return { text: `aborted: ${event.message}` };
117
+ case "CapabilityUnenforceable":
118
+ return { text: `capability unenforceable: ${event.detail}` };
119
+ case "ExecutorExcluded":
120
+ return { text: `${event.executor} excluded: ${event.reason}` };
121
+ case "ExecutorHandedOver":
122
+ return {
123
+ text: `${event.from} handed over ${event.role} (${event.scope}): ${event.reason}`,
124
+ ...(event.label === undefined ? {} : { lane: event.label })
125
+ };
126
+ case "StoryJudged":
127
+ return {
128
+ text: `${event.lane} judged round ${event.round}: ${event.cleared ? "cleared" : `${event.issues} issues`}`,
129
+ lane: event.lane
130
+ };
131
+ case "Began":
132
+ return {
133
+ text: `began ${event.kind} ${event.label}`,
134
+ ...(event.lane === undefined ? {} : { lane: event.lane })
135
+ };
136
+ default:
137
+ return undefined;
138
+ }
139
+ };
140
+ export const meaningfulEventsAfter = (lines, sinceSeq) => lines.flatMap((line) => {
141
+ if (line.seq <= sinceSeq || !meaningfulKinds.has(line.kind)) {
142
+ return [];
143
+ }
144
+ if (line.kind === "RunEnded") {
145
+ const outcome = line.fields.outcome;
146
+ return [
147
+ {
148
+ seq: line.seq,
149
+ at: line.timestamp,
150
+ kind: line.kind,
151
+ text: `run ${typeof outcome === "string" ? outcome : "completed"}`
152
+ }
153
+ ];
154
+ }
155
+ const event = eventOf(line);
156
+ const rendered = event === undefined ? undefined : textOf(event);
157
+ return rendered === undefined
158
+ ? []
159
+ : [
160
+ {
161
+ seq: line.seq,
162
+ at: line.timestamp,
163
+ kind: line.kind,
164
+ ...(rendered.lane === undefined ? {} : { lane: rendered.lane }),
165
+ text: rendered.text
166
+ }
167
+ ];
168
+ });
169
+ export const eventsAfter = (lines, sinceSeq, kinds, limit) => lines
170
+ .filter((line) => line.seq > sinceSeq && (kinds === undefined || kinds.some((kind) => kind === line.kind)))
171
+ .slice(0, Math.max(0, limit));
172
+ const digestTail = 40;
173
+ const tailRows = 30;
174
+ const tailWidth = 120;
175
+ const quiet = (effect) => effect.pipe(Effect.catch(() => Effect.succeed(undefined)));
176
+ const capText = (text, remaining) => text.slice(0, Math.max(0, remaining));
177
+ /** The last rows of each log in a directory, within what is left of a character budget. */
178
+ export const tailGateLogs = (sources, directory, budget) => Effect.gen(function* () {
179
+ const tails = [];
180
+ let remaining = budget;
181
+ if (directory !== undefined) {
182
+ for (const name of sources.listFiles(directory)) {
183
+ const path = join(directory, name);
184
+ const text = yield* quiet(sources.files.read(path));
185
+ if (text === undefined || remaining <= 0)
186
+ continue;
187
+ const tail = capText(text.trimEnd().split(/\r?\n/u).slice(-tailRows).join("\n"), remaining);
188
+ remaining -= tail.length;
189
+ tails.push({ path, tail });
190
+ }
191
+ }
192
+ return { tails, remaining };
193
+ });
194
+ /** The last rows of one lane's transcript, capped to what is left of a character budget. */
195
+ export const tailTranscript = (sources, directory, lane, budget) => Effect.gen(function* () {
196
+ const out = [];
197
+ if (directory === undefined)
198
+ return out;
199
+ let remaining = budget;
200
+ const transcriptFiles = {
201
+ read: (path) => quiet(sources.files.read(path)),
202
+ list: sources.listFiles
203
+ };
204
+ const entries = yield* loadTranscript(transcriptFiles, directory, { lane });
205
+ const rows = tailLinesOf(entries, { lane }, undefined, tailWidth, tailRows) ?? [];
206
+ for (const row of rows) {
207
+ if (remaining <= 0)
208
+ break;
209
+ const kept = capText(row, remaining);
210
+ remaining -= kept.length;
211
+ out.push(kept);
212
+ }
213
+ return out;
214
+ });
215
+ export const runDiagnosisOf = (sources, args) => Effect.gen(function* () {
216
+ const lines = yield* readLines(sources.files, args.tracePath);
217
+ const events = lines.flatMap((line) => {
218
+ const event = eventOf(line);
219
+ return event === undefined ? [] : [event];
220
+ });
221
+ const failed = events.filter((event) => event._tag === "StageFailed" || event._tag === "Aborted");
222
+ const last = failed[failed.length - 1];
223
+ const failure = last === undefined
224
+ ? undefined
225
+ : last._tag === "StageFailed"
226
+ ? {
227
+ stage: last.stage,
228
+ message: last.message,
229
+ ...(last.lane === undefined ? {} : { lane: last.lane })
230
+ }
231
+ : last._tag === "Aborted"
232
+ ? { message: last.message }
233
+ : undefined;
234
+ const markdown = args.planPath === undefined ? undefined : yield* quiet(sources.files.read(args.planPath));
235
+ const plan = markdown === undefined ? undefined : yield* quiet(parsePlan(markdown));
236
+ const taskLines = (plan?.tasks ?? []).map((task) => `- [${task.completed ? "x" : " "}] ${task.title}`);
237
+ const recent = events
238
+ .flatMap((event) => event._tag === "Info"
239
+ ? [event.message]
240
+ : event._tag === "StageFailed"
241
+ ? [`${event.stage} failed: ${event.message}`]
242
+ : [])
243
+ .slice(-digestTail);
244
+ const digest = capText([...taskLines, ...recent].join("\n"), args.budget);
245
+ const remaining = args.budget - digest.length;
246
+ const gateTails = yield* tailGateLogs(sources, args.gateLogDir, remaining);
247
+ const transcript = yield* tailTranscript(sources, args.transcriptsDir, "run", gateTails.remaining);
248
+ return Diagnosis.make({
249
+ runId: args.runId,
250
+ digest,
251
+ ...(failure === undefined ? {} : { failure }),
252
+ gateLogTails: gateTails.tails,
253
+ transcriptTail: transcript
254
+ });
255
+ });
256
+ const ledgerTolerance = 0.005;
257
+ const costOf = (report) => (report.measured.costUsd ?? 0) + (report.estimated.costUsd ?? 0);
258
+ /**
259
+ * One run's costs: its trace folded and topped up from its `costs.jsonl`
260
+ * line (`CostReport.reconcileWithLedger`), so `total` is what the run itself
261
+ * printed even when the trace lost lines; `fromLedger` is how much of it the
262
+ * ledger supplied. `differs` is left for a trace that says more than the
263
+ * ledger, which no line can fill.
264
+ */
265
+ export const costsOfRun = (files, tracePath, ledgerPath, runId) => Effect.gen(function* () {
266
+ const lines = yield* readLines(files, tracePath);
267
+ const traced = usageSamplesFromTrace(lines);
268
+ const records = yield* loadCostLedger(files, ledgerPath).pipe(Effect.mapError(unreadable(ledgerPath)));
269
+ const record = records.find((candidate) => candidate.runId === runId);
270
+ const reconciled = record === undefined ? traced : reconcileWithLedger(traced, [record]).samples;
271
+ const report = buildCostReport(reconciled);
272
+ const total = costOf(report);
273
+ const fromLedger = total - costOf(buildCostReport(traced));
274
+ const ledger = record?.totalCostUsd;
275
+ return CostsOut.make({
276
+ report,
277
+ total,
278
+ ...(ledger === undefined ? {} : { ledger }),
279
+ ...(fromLedger > ledgerTolerance ? { fromLedger } : {}),
280
+ differs: ledger !== undefined && Math.abs(total - ledger) > ledgerTolerance
281
+ });
282
+ });
283
+ //# 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,3 @@
1
+ import type { TreeState } from "./AgentTree.ts";
2
+ export declare const summarizeTree: (state: TreeState, flow: string | undefined) => string;
3
+ //# sourceMappingURL=RunSummary.d.ts.map
@@ -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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"}
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"Terminal.d.ts","sourceRoot":"","sources":["../src/Terminal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Terminal.d.ts","sourceRoot":"","sources":["../src/Terminal.ts"],"names":[],"mappings":"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"}
package/dist/Terminal.js CHANGED
@@ -218,6 +218,10 @@ export const terminalLine = (event, palette = plainTerminalPalette, verbosity =
218
218
  return palette.fail(`aborted: ${safe(event.message)}`);
219
219
  case "Info":
220
220
  return palette.info(safe(event.message));
221
+ case "CriterionChecked":
222
+ return palette.info(`criterion ${safe(event.tag)}: ${event.status}`);
223
+ case "Parked":
224
+ return palette.info(`parked${event.mvp ? " (MVP)" : ""}: ${safe(event.story)} — ${safe(event.item)} (${safe(event.reason)})`);
221
225
  case "ToolUse":
222
226
  return palette.toolCall(safe(event.tool), safe(event.args));
223
227
  case "AssistantMessage":
@@ -334,6 +338,8 @@ export const makeLiveTerminalSurface = Effect.fn("@llm4ts/runner/Terminal.makeLi
334
338
  });
335
339
  const hideCursor = "\u001b[?25l";
336
340
  const showCursor = "\u001b[?25h";
341
+ /** Re-raise only when no other listener remains to handle the signal. */
342
+ export const shouldReraise = (otherListeners) => otherListeners === 0;
337
343
  /**
338
344
  * While the live status block is on screen, keystrokes must not be echoed:
339
345
  * an arrow key (or a trackpad scroll the terminal turns into one) echoes as
@@ -361,7 +367,8 @@ const quietTerminalInput = (write) => Effect.gen(function* () {
361
367
  // then let the signal do what it would have done.
362
368
  const onSignal = (signal) => {
363
369
  restore();
364
- process.kill(process.pid, signal);
370
+ if (shouldReraise(process.listenerCount(signal)))
371
+ process.kill(process.pid, signal);
365
372
  };
366
373
  yield* Effect.sync(() => {
367
374
  stty("-echo");