@llm4ts/runner 2.23.0 → 2.25.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 (47) hide show
  1. package/dist/AgentTree.d.ts +21 -4
  2. package/dist/AgentTree.d.ts.map +1 -1
  3. package/dist/AgentTree.js +83 -24
  4. package/dist/AgentTree.js.map +1 -1
  5. package/dist/AgentTreeSurface.d.ts +5 -1
  6. package/dist/AgentTreeSurface.d.ts.map +1 -1
  7. package/dist/AgentTreeSurface.js +18 -5
  8. package/dist/AgentTreeSurface.js.map +1 -1
  9. package/dist/Doctor.d.ts +2 -1
  10. package/dist/Doctor.d.ts.map +1 -1
  11. package/dist/Doctor.js +10 -1
  12. package/dist/Doctor.js.map +1 -1
  13. package/dist/FlowArgs.d.ts +1 -1
  14. package/dist/FlowArgs.d.ts.map +1 -1
  15. package/dist/FlowArgs.js +1 -0
  16. package/dist/FlowArgs.js.map +1 -1
  17. package/dist/FlowRunner.d.ts +3 -0
  18. package/dist/FlowRunner.d.ts.map +1 -1
  19. package/dist/FlowRunner.js +47 -18
  20. package/dist/FlowRunner.js.map +1 -1
  21. package/dist/NodeGeminiCliExecutor.d.ts +2 -1
  22. package/dist/NodeGeminiCliExecutor.d.ts.map +1 -1
  23. package/dist/NodeGeminiCliExecutor.js +27 -18
  24. package/dist/NodeGeminiCliExecutor.js.map +1 -1
  25. package/dist/NodeRuntime.d.ts +2 -2
  26. package/dist/Profile.d.ts +2 -3
  27. package/dist/Profile.d.ts.map +1 -1
  28. package/dist/Profile.js +2 -13
  29. package/dist/Profile.js.map +1 -1
  30. package/dist/Transcripts.d.ts +55 -0
  31. package/dist/Transcripts.d.ts.map +1 -0
  32. package/dist/Transcripts.js +200 -0
  33. package/dist/Transcripts.js.map +1 -0
  34. package/dist/Watch.d.ts +5 -0
  35. package/dist/Watch.d.ts.map +1 -1
  36. package/dist/Watch.js +74 -5
  37. package/dist/Watch.js.map +1 -1
  38. package/package.json +4 -3
  39. package/src/AgentTree.ts +130 -27
  40. package/src/AgentTreeSurface.ts +26 -4
  41. package/src/Doctor.ts +22 -2
  42. package/src/FlowArgs.ts +1 -0
  43. package/src/FlowRunner.ts +82 -24
  44. package/src/NodeGeminiCliExecutor.ts +69 -33
  45. package/src/Profile.ts +3 -14
  46. package/src/Transcripts.ts +274 -0
  47. package/src/Watch.ts +126 -5
package/dist/Watch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Watch.js","sourceRoot":"","sources":["../src/Watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Watch.js","sourceRoot":"","sources":["../src/Watch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/runner",
3
- "version": "2.23.0",
3
+ "version": "2.25.0",
4
4
  "description": "Node runner, CLI, terminal, and MCP composition for llm4ts",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,6 +40,7 @@
40
40
  "./ReviewFingerprint": "./dist/ReviewFingerprint.js",
41
41
  "./Terminal": "./dist/Terminal.js",
42
42
  "./TerminalInteraction": "./dist/TerminalInteraction.js",
43
+ "./Transcripts": "./dist/Transcripts.js",
43
44
  "./Watch": "./dist/Watch.js",
44
45
  "./Package": "./dist/Package.js",
45
46
  "./package.json": "./package.json",
@@ -67,8 +68,8 @@
67
68
  "typescript"
68
69
  ],
69
70
  "dependencies": {
70
- "@llm4ts/flow": "2.23.0",
71
- "@llm4ts/core": "2.23.0"
71
+ "@llm4ts/core": "2.25.0",
72
+ "@llm4ts/flow": "2.25.0"
72
73
  },
73
74
  "peerDependencies": {
74
75
  "effect": "4.0.0"
package/src/AgentTree.ts CHANGED
@@ -663,33 +663,57 @@ export type TreeMode = "lanes" | "executors"
663
663
  /** What the reader chose to look at; the run's state is separate. */
664
664
  export interface TreeView {
665
665
  readonly mode: TreeMode
666
- /** The selected lane's story id. */
666
+ /** The selected lane's story id, or in the executors view the executor. */
667
667
  readonly selected: string | undefined
668
668
  readonly expanded: boolean
669
669
  readonly fullLog: boolean
670
+ /** The transcript tail of the selection is open (`t`). */
671
+ readonly tail: boolean
672
+ /** Only this role's calls in the tail; all when undefined (`r` cycles). */
673
+ readonly tailRole: string | undefined
674
+ /** How many lines the tail is scrolled back from its end (page up/down). */
675
+ readonly tailBack: number
670
676
  }
671
677
 
672
678
  export const initialView: TreeView = {
673
679
  mode: "lanes",
674
680
  selected: undefined,
675
681
  expanded: false,
676
- fullLog: false
682
+ fullLog: false,
683
+ tail: false,
684
+ tailRole: undefined,
685
+ tailBack: 0
677
686
  }
678
687
 
679
688
  const runningLanes = (state: TreeState): ReadonlyArray<TreeLane> =>
680
689
  state.lanes.filter((lane) => lane.status === "running")
681
690
 
691
+ const tailRoles: ReadonlyArray<string | undefined> = [undefined, "coder", "reviewer", "judge"]
692
+ const tailPage = 10
693
+
694
+ /** Whose transcript the tail shows: the selected story, or the selected executor. */
695
+ export const tailTargetOf = (
696
+ view: TreeView
697
+ ): { readonly lane: string } | { readonly executor: string } | undefined =>
698
+ view.selected === undefined
699
+ ? undefined
700
+ : view.mode === "lanes"
701
+ ? { lane: view.selected }
702
+ : { executor: view.selected }
703
+
682
704
  /**
683
- * The view after a key: arrows or 1–9 select a running lane, enter expands
684
- * it, escape collapses, `e` switches lanes and executors, `l` the full log,
685
- * `q` quits. Keys it does not know return the same view.
705
+ * The view after a key: arrows or 1–9 select a running lane (an executor in
706
+ * the executors view), enter expands it, `t` tails its transcript, `r`
707
+ * cycles the tail's role, escape closes, `e` switches lanes and executors,
708
+ * `l` the full log, `q` quits. Keys it does not know return the same view.
686
709
  */
687
710
  export const onTreeKey = (view: TreeView, key: string, state: TreeState): TreeView | "quit" => {
688
- const running = runningLanes(state)
689
- const index = running.findIndex((lane) => lane.id === view.selected)
711
+ const choices =
712
+ view.mode === "lanes" ? runningLanes(state).map((lane) => lane.id) : state.executors
713
+ const index = choices.findIndex((id) => id === view.selected)
690
714
  const select = (next: number): TreeView => {
691
- const lane = running[Math.max(0, Math.min(running.length - 1, next))]
692
- return lane === undefined ? view : { ...view, selected: lane.id }
715
+ const id = choices[Math.max(0, Math.min(choices.length - 1, next))]
716
+ return id === undefined ? view : { ...view, selected: id }
693
717
  }
694
718
  switch (key) {
695
719
  case "q":
@@ -701,11 +725,34 @@ export const onTreeKey = (view: TreeView, key: string, state: TreeState): TreeVi
701
725
  case "left":
702
726
  return select(index < 0 ? 0 : index - 1)
703
727
  case "enter":
704
- return view.selected === undefined ? view : { ...view, expanded: !view.expanded }
728
+ return view.selected === undefined || view.mode !== "lanes"
729
+ ? view
730
+ : { ...view, expanded: !view.expanded }
731
+ case "t":
732
+ return view.selected === undefined
733
+ ? view
734
+ : { ...view, tail: !view.tail, expanded: false, tailBack: 0 }
735
+ case "pageup":
736
+ return view.tail ? { ...view, tailBack: view.tailBack + tailPage } : view
737
+ case "pagedown":
738
+ return view.tail ? { ...view, tailBack: Math.max(0, view.tailBack - tailPage) } : view
739
+ case "r":
740
+ return view.tail
741
+ ? {
742
+ ...view,
743
+ tailRole: tailRoles[(tailRoles.indexOf(view.tailRole) + 1) % tailRoles.length]
744
+ }
745
+ : view
705
746
  case "escape":
706
- return { ...view, expanded: false }
747
+ return { ...view, expanded: false, tail: false, tailBack: 0 }
707
748
  case "e":
708
- return { ...view, mode: view.mode === "lanes" ? "executors" : "lanes" }
749
+ return {
750
+ ...view,
751
+ mode: view.mode === "lanes" ? "executors" : "lanes",
752
+ selected: undefined,
753
+ expanded: false,
754
+ tail: false
755
+ }
709
756
  case "l":
710
757
  return { ...view, fullLog: !view.fullLog }
711
758
  default:
@@ -719,6 +766,8 @@ export interface TreeRenderOptions {
719
766
  readonly view: TreeView
720
767
  /** The terminal's rows; the frame fits them (see `renderTree`). */
721
768
  readonly height?: number
769
+ /** The open tail's lines, read by the host; absent when the run has no transcript. */
770
+ readonly tail?: ReadonlyArray<string>
722
771
  }
723
772
 
724
773
  const railWidth = 26
@@ -854,11 +903,16 @@ const heldBy = (state: TreeState, executor: string): ReadonlyArray<string> => {
854
903
  .map((lane) => `coder · ${lane.id}`)
855
904
  }
856
905
 
857
- const executorBox = (state: TreeState, executor: string, width: number): Array<Line> => {
906
+ const executorBox = (
907
+ state: TreeState,
908
+ executor: string,
909
+ width: number,
910
+ selected: boolean
911
+ ): Array<Line> => {
858
912
  const held = heldBy(state, executor)
859
913
  const out = state.exclusions.find((exclusion) => exclusion.executor === executor)
860
914
  return box(width, "running", [
861
- [span(executor, "bold")],
915
+ [span(selected ? `▸ ${executor}` : executor, "bold")],
862
916
  ...(held.length === 0
863
917
  ? [[span("no lease", "dim")]]
864
918
  : held.slice(0, 3).map((lease): Line => [span(lease)])),
@@ -942,7 +996,36 @@ const judgmentOf = (state: TreeState, width: number): Array<Line> => {
942
996
  )
943
997
  }
944
998
 
945
- const mainOf = (state: TreeState, width: number, view: TreeView): Array<Line> => {
999
+ /** The transcript tail of the selection, in place of the boxes. */
1000
+ const tailOf = (
1001
+ view: TreeView,
1002
+ tail: ReadonlyArray<string> | undefined,
1003
+ width: number
1004
+ ): Array<Line> =>
1005
+ box(
1006
+ width,
1007
+ "running",
1008
+ tail === undefined || tail.length === 0
1009
+ ? [
1010
+ [
1011
+ span(
1012
+ tail === undefined
1013
+ ? "no transcript for this run — start it with llm4ts run … --transcript"
1014
+ : "nothing said yet",
1015
+ "dim"
1016
+ )
1017
+ ]
1018
+ ]
1019
+ : tail.map((line): Line => [span(line)]),
1020
+ `tail · ${view.selected ?? ""} · ${view.tailRole ?? "all"}`
1021
+ )
1022
+
1023
+ const mainOf = (
1024
+ state: TreeState,
1025
+ width: number,
1026
+ view: TreeView,
1027
+ tail: ReadonlyArray<string> | undefined
1028
+ ): Array<Line> => {
946
1029
  const running = state.lanes.filter((lane) => lane.status === "running")
947
1030
  const orchestratorWidth = Math.min(46, width)
948
1031
  const stage = state.stages.at(-1) ?? (running.length > 0 ? "implement stories" : "idle")
@@ -962,17 +1045,21 @@ const mainOf = (state: TreeState, width: number, view: TreeView): Array<Line> =>
962
1045
  const shown = running.slice(0, maxLaneBoxes)
963
1046
  const executors = state.executors.slice(0, maxLaneBoxes + 1)
964
1047
  const lanes =
965
- view.expanded && selected !== undefined
966
- ? expandedLane(selected, width, state.now)
967
- : view.mode === "executors"
968
- ? executors.length === 0
969
- ? [centre([span("no executors yet", "dim")], width)]
970
- : columnsOf(executors, width, (executor, each) => executorBox(state, executor, each))
971
- : shown.length === 0
972
- ? [centre([span("no stories in flight", "dim")], width)]
973
- : columnsOf(shown, width, (lane, each) =>
974
- laneBox(lane, each, state.now, lane.id === view.selected, state.idleAfterMs)
975
- )
1048
+ view.tail && view.selected !== undefined
1049
+ ? tailOf(view, tail, width)
1050
+ : view.expanded && selected !== undefined
1051
+ ? expandedLane(selected, width, state.now)
1052
+ : view.mode === "executors"
1053
+ ? executors.length === 0
1054
+ ? [centre([span("no executors yet", "dim")], width)]
1055
+ : columnsOf(executors, width, (executor, each) =>
1056
+ executorBox(state, executor, each, executor === view.selected)
1057
+ )
1058
+ : shown.length === 0
1059
+ ? [centre([span("no stories in flight", "dim")], width)]
1060
+ : columnsOf(shown, width, (lane, each) =>
1061
+ laneBox(lane, each, state.now, lane.id === view.selected, state.idleAfterMs)
1062
+ )
976
1063
  return [
977
1064
  ...orchestrator.map((line) => centre(line, width)),
978
1065
  centre([span("•", "orchestrator")], width),
@@ -1027,7 +1114,10 @@ const frameOf = (
1027
1114
  ),
1028
1115
  [span("═".repeat(width), "dim")],
1029
1116
  [],
1030
- ...beside([railOf(state), mainOf(state, mainWidth, options.view)], [railWidth, mainWidth]),
1117
+ ...beside(
1118
+ [railOf(state), mainOf(state, mainWidth, options.view, options.tail)],
1119
+ [railWidth, mainWidth]
1120
+ ),
1031
1121
  ...(logCount === "none"
1032
1122
  ? []
1033
1123
  : [[], ...box(width, "log", logOf(state, logCount), "session log")]),
@@ -1078,3 +1168,16 @@ const fitToRows = (
1078
1168
  rows === undefined || rows < 4 || lines.length <= rows
1079
1169
  ? lines
1080
1170
  : [...lines.slice(0, rows - 2), ...lines.slice(-2)]
1171
+
1172
+ /** `20s`, `4m00s`, `1h02m`. */
1173
+ export const duration = (ms: number): string => {
1174
+ const seconds = Math.round(ms / 1_000)
1175
+ if (seconds < 60) {
1176
+ return `${seconds}s`
1177
+ }
1178
+ const minutes = Math.floor(seconds / 60)
1179
+ if (minutes < 60) {
1180
+ return `${minutes}m${String(seconds % 60).padStart(2, "0")}s`
1181
+ }
1182
+ return `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, "0")}m`
1183
+ }
@@ -12,8 +12,10 @@ import {
12
12
  onTreeKey,
13
13
  reduceTree,
14
14
  renderTree,
15
+ tailTargetOf,
15
16
  type TreeView
16
17
  } from "./AgentTree.ts"
18
+ import { loadTranscript, tailLinesOf, type TranscriptFiles } from "./Transcripts.ts"
17
19
  import type { TerminalSurface } from "./Terminal.ts"
18
20
 
19
21
  /**
@@ -92,13 +94,16 @@ export const makeScreenPainter: Effect.Effect<ScreenPainter> = Effect.map(
92
94
  export const enterScreen = "\u001b[?1049h\u001b[?25l\u001b[?7l"
93
95
  export const leaveScreen = "\u001b[?7h\u001b[?25h\u001b[?1049l"
94
96
  const redrawEvery = "100 millis"
97
+ const tailRows = 16
95
98
 
96
99
  export const makeAgentTreeHost = Effect.fn("@llm4ts/runner/AgentTreeSurface.make")(function* (
97
100
  hub: FlowEventHub,
98
101
  classic: TerminalSurface,
99
102
  output: AgentTreeOutput,
100
103
  keys: Stream.Stream<string>,
101
- idleAfterMs?: number
104
+ idleAfterMs?: number,
105
+ /** The run's transcript (`--transcript`), for the tail pane. */
106
+ transcripts?: { readonly directory: string; readonly files: TranscriptFiles }
102
107
  ): Effect.fn.Return<AgentTreeHost, never, Scope.Scope> {
103
108
  const state = yield* Ref.make(emptyTree(idleAfterMs === undefined ? {} : { idleAfterMs }))
104
109
  const view = yield* Ref.make<TreeView>(initialView)
@@ -118,11 +123,26 @@ export const makeAgentTreeHost = Effect.fn("@llm4ts/runner/AgentTreeSurface.make
118
123
 
119
124
  const render = (rows: number | undefined): Effect.Effect<ReadonlyArray<string>> =>
120
125
  Effect.gen(function* () {
126
+ const current = yield* Ref.get(view)
127
+ const width = Math.max(90, output.columns() ?? 90)
128
+ const target = tailTargetOf(current)
129
+ const tail =
130
+ !current.tail || target === undefined || transcripts === undefined
131
+ ? undefined
132
+ : tailLinesOf(
133
+ yield* loadTranscript(transcripts.files, transcripts.directory, target),
134
+ target,
135
+ current.tailRole,
136
+ width - 32,
137
+ tailRows,
138
+ current.tailBack
139
+ )
121
140
  return renderTree(yield* Ref.get(state), {
122
- width: Math.max(90, output.columns() ?? 90),
141
+ width,
123
142
  colour: output.colour,
124
- view: yield* Ref.get(view),
125
- ...(rows === undefined ? {} : { height: rows })
143
+ view: current,
144
+ ...(rows === undefined ? {} : { height: rows }),
145
+ ...(tail === undefined ? {} : { tail })
126
146
  })
127
147
  })
128
148
  /** The full screen fits the terminal; the last frame left behind is whole. */
@@ -201,6 +221,8 @@ const keyNames: Readonly<Record<string, string>> = {
201
221
  "\u001b[B": "down",
202
222
  "\u001b[C": "right",
203
223
  "\u001b[D": "left",
224
+ "\u001b[5~": "pageup",
225
+ "\u001b[6~": "pagedown",
204
226
  "\r": "enter",
205
227
  "\n": "enter",
206
228
  "\u001b": "escape"
package/src/Doctor.ts CHANGED
@@ -2,7 +2,10 @@ import * as Effect from "effect/Effect"
2
2
  import type { HealthStatus } from "@llm4ts/core/Models"
3
3
  import { ConnectorIds } from "@llm4ts/core/Models"
4
4
  import type { ConnectorRegistryShape } from "@llm4ts/core/ConnectorRegistry"
5
+ import { nodePreflightReport, type NodePreflightReport } from "@llm4ts/flow/NodePreflight"
5
6
  import { nodeFlowRunnerDependencies } from "./FlowRunner.ts"
7
+ import { nodePlainFileStore } from "./NodePlainFileStore.ts"
8
+ import { nodeProcessExecutor } from "./NodeProcessExecutor.ts"
6
9
  import {
7
10
  defaultReadPiModelsJson as readPiModels,
8
11
  geminiBridgePort as bridgePort,
@@ -209,9 +212,17 @@ export const geminiBridgePrerequisites = (
209
212
  export const makeDoctorProgram = (
210
213
  registry: ConnectorRegistryShape = nodeFlowRunnerDependencies().registry,
211
214
  environment: Readonly<Record<string, string | undefined>> = process.env,
212
- readPiModelsJson: () => string | undefined = readPiModels
215
+ readPiModelsJson: () => string | undefined = readPiModels,
216
+ // The Node the gates would run on against the application's pin, for the
217
+ // directory doctor runs in (the same check every gated flow makes first).
218
+ nodeCheck: Effect.Effect<NodePreflightReport> = nodePreflightReport(
219
+ nodeProcessExecutor,
220
+ nodePlainFileStore,
221
+ process.cwd(),
222
+ environment
223
+ )
213
224
  ): Effect.Effect<string> =>
214
- Effect.map(registry.healthCheckAll, (statuses) => {
225
+ Effect.map(Effect.all([registry.healthCheckAll, nodeCheck]), ([statuses, node]) => {
215
226
  const lines: Array<string> = []
216
227
  lines.push("llm4ts doctor")
217
228
  lines.push("")
@@ -226,6 +237,15 @@ export const makeDoctorProgram = (
226
237
  const value = environment[key]
227
238
  lines.push(` ${value === undefined || value.length === 0 ? "✖" : "✔"} ${key}`)
228
239
  }
240
+ lines.push("")
241
+ lines.push("gates:")
242
+ lines.push(
243
+ ...wrap(
244
+ `${node._tag === "Mismatch" || node._tag === "NoNode" ? "✖" : "✔"} ${node.summary}`,
245
+ 78,
246
+ " "
247
+ )
248
+ )
229
249
 
230
250
  // Connector prerequisites the environment must carry BEFORE a run: shown
231
251
  // when the connector is selected or the machine has its CLI, because that
package/src/FlowArgs.ts CHANGED
@@ -33,6 +33,7 @@ environment:
33
33
  LLM4TS_CODER coding agent: claude|codex|gemini|pi|agy|grok|cursor|opencode (default: claude)
34
34
  LLM4TS_VERBOSITY terminal verbosity: quiet|normal|verbose
35
35
  LLM4TS_UI tree: the full-screen agent tree (ADR 0022; q returns to the classic view)
36
+ LLM4TS_TRANSCRIPT on: record each seat's input and output under .llm4ts/transcripts/
36
37
  OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY
37
38
  credentials for API providers
38
39
 
package/src/FlowRunner.ts CHANGED
@@ -59,6 +59,8 @@ import {
59
59
  import { FlowContext, type ContextOptions, type FlowContextShape } from "@llm4ts/flow/FlowContext"
60
60
  import { makeFlowRecorder, type RunOutcome } from "@llm4ts/flow/FlowRecorder"
61
61
  import { timedJudgment, timedSeat, withTimedRole } from "@llm4ts/flow/Timing"
62
+ import { transcriptSeat, type TranscriptSink } from "@llm4ts/flow/Transcript"
63
+ import { nodeTranscriptFiles, nodeTranscriptSink, transcriptsWanted } from "./Transcripts.ts"
62
64
  import { idleAfterFrom } from "./AgentTree.ts"
63
65
  import { makeAgentTreeHost, nodeTreeKeys } from "./AgentTreeSurface.ts"
64
66
  import { makeJudgmentLog, type JudgmentLogShape } from "@llm4ts/flow/JudgmentLog"
@@ -93,7 +95,7 @@ import { nodeGeminiCliExecutor } from "./NodeGeminiCliExecutor.ts"
93
95
  import { nodePlainFileStore } from "./NodePlainFileStore.ts"
94
96
  import { nodeProcessExecutor } from "./NodeProcessExecutor.ts"
95
97
  import { nodeTemporaryFiles } from "./NodeTemporaryFiles.ts"
96
- import { prepareConnector } from "./Connectors.ts"
98
+ import { asReadOnly, prepareConnector } from "./Connectors.ts"
97
99
  import {
98
100
  consumeTerminalEvents,
99
101
  formatDurationMs,
@@ -116,6 +118,8 @@ export interface FlowRunnerDependencies {
116
118
  readonly readPiModelsJson?: () => string | undefined
117
119
  /** For the hosted TypeSafe judgment backend; defaults to the Node client. */
118
120
  readonly http?: HttpClientShape
121
+ /** Where `--transcript` writes, given its directory; files on disk by default. */
122
+ readonly transcriptSink?: (directory: string) => TranscriptSink
119
123
  }
120
124
 
121
125
  export interface NodeConnectorDependencies {
@@ -285,6 +289,28 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
285
289
  ): Effect.fn.Return<FlowRunnerBundle, FlowError, Scope.Scope> {
286
290
  const events = yield* makeFlowEventHub()
287
291
  const runId = options.runId ?? `run-${(yield* Clock.currentTimeMillis).toString()}`
292
+ // `llm4ts run --transcript`: what each seat is told and answers, per story,
293
+ // in its own files — never in the trace.
294
+ const transcriptOn =
295
+ transcriptsWanted(options.environment ?? process.env) && options.persistRun !== false
296
+ const transcripts = transcriptOn
297
+ ? (dependencies.transcriptSink ?? nodeTranscriptSink)(
298
+ join(options.workDir, ".llm4ts", "transcripts", runId)
299
+ )
300
+ : undefined
301
+ const recorded = (
302
+ service: LlmServiceShape,
303
+ lane: string | undefined,
304
+ role: string,
305
+ executor?: Effect.Effect<string | undefined>
306
+ ): LlmServiceShape =>
307
+ transcripts === undefined
308
+ ? service
309
+ : transcriptSeat(service, transcripts, {
310
+ role,
311
+ ...(lane === undefined ? {} : { lane }),
312
+ ...(executor === undefined ? {} : { executor })
313
+ })
288
314
  const judgmentLog =
289
315
  options.judgmentLog === true
290
316
  ? yield* makeJudgmentLog({ files: dependencies.files, root: options.workDir, runId })
@@ -422,6 +448,7 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
422
448
  readonly coder: LlmServiceShape & { readonly capabilities: ConnectorCapabilities }
423
449
  readonly reasoning: LlmServiceShape
424
450
  readonly reviewers: ReadonlyArray<LlmServiceShape>
451
+ readonly judge: LlmServiceShape
425
452
  readonly judgment: JudgmentShape
426
453
  },
427
454
  FlowError,
@@ -435,14 +462,18 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
435
462
  const reviewers = yield* Effect.forEach(options.reviewers ?? [], (configuration) =>
436
463
  resolveSeat(prepareConnector(bridged(configuration), workDir, environment))
437
464
  )
438
- // The judgment seat defaults to the reasoning seat's service itself, so
439
- // an unconfigured run resolves nothing extra.
465
+ // The judgment seat is the reasoner with its tools taken away: a judge
466
+ // reads, it does not act. Over an API reasoner (no tools to take) it is
467
+ // the reasoning seat's service itself, so such a run resolves nothing extra.
468
+ const judgmentConfig =
469
+ options.judgment ??
470
+ (reasoning instanceof CliConnectorConfig ? asReadOnly(reasoning) : undefined)
440
471
  const judgmentSeat =
441
- options.judgment === undefined
472
+ judgmentConfig === undefined
442
473
  ? reasoningService
443
- : yield* resolveSeat(prepareConnector(bridged(options.judgment), workDir, environment))
444
- const judgment = yield* judgmentFor(judgmentSeat, options.judgment ?? reasoning, environment)
445
- return { coder, reasoning: reasoningService, reviewers, judgment }
474
+ : yield* resolveSeat(prepareConnector(bridged(judgmentConfig), workDir, environment))
475
+ const judgment = yield* judgmentFor(judgmentSeat, judgmentConfig ?? reasoning, environment)
476
+ return { coder, reasoning: reasoningService, reviewers, judge: judgmentSeat, judgment }
446
477
  })
447
478
  const contextAt = (
448
479
  workDir: string,
@@ -450,20 +481,28 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
450
481
  readonly coder: LlmServiceShape & { readonly capabilities: ConnectorCapabilities }
451
482
  readonly reasoning: LlmServiceShape
452
483
  readonly reviewers: ReadonlyArray<LlmServiceShape>
484
+ readonly judge: LlmServiceShape
453
485
  readonly judgment: JudgmentShape
454
486
  },
455
487
  rebind: boolean,
456
- laneEvents: FlowEventsShape = events
488
+ laneEvents: FlowEventsShape = events,
489
+ lane?: string
457
490
  ): FlowContextShape =>
458
491
  FlowContext.of({
459
492
  // Every call is timed on the lane's events, under its role.
460
- reasoning: timedSeat(seats.reasoning, laneEvents, "reasoning"),
461
- coder: { ...seats.coder, ...timedSeat(seats.coder, laneEvents, "coder") },
493
+ reasoning: recorded(timedSeat(seats.reasoning, laneEvents, "reasoning"), lane, "reasoning"),
494
+ coder: {
495
+ ...seats.coder,
496
+ ...recorded(timedSeat(seats.coder, laneEvents, "coder"), lane, "coder")
497
+ },
462
498
  judgment: timedJudgment(seats.judgment, laneEvents),
499
+ judge: recorded(timedSeat(seats.judge, laneEvents, "judgment"), lane, "judgment"),
463
500
  git: makeGitTool(dependencies.process, workDir, laneEvents),
464
501
  hosting: makeGitHubTool(dependencies.process, workDir, laneEvents),
465
502
  events: laneEvents,
466
- reviewers: seats.reviewers.map((reviewer) => timedSeat(reviewer, laneEvents, "reviewer")),
503
+ reviewers: seats.reviewers.map((reviewer) =>
504
+ recorded(timedSeat(reviewer, laneEvents, "reviewer"), lane, "reviewer")
505
+ ),
467
506
  coderCapabilities: seats.coder.capabilities,
468
507
  userPrompt: options.userPrompt,
469
508
  workDir,
@@ -480,7 +519,8 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
480
519
  false,
481
520
  contextOptions?.label === undefined
482
521
  ? events
483
- : withLane(events, { lane: contextOptions.label, workDir: directory })
522
+ : withLane(events, { lane: contextOptions.label, workDir: directory }),
523
+ contextOptions?.label
484
524
  )
485
525
  )
486
526
  }
@@ -618,17 +658,22 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
618
658
  held: HeldCoder,
619
659
  workDir: string,
620
660
  label: string,
621
- laneEvents: FlowEventsShape
661
+ laneEvents: FlowEventsShape,
662
+ lane: string | undefined
622
663
  ): RosterView => ({
623
664
  forRole: (role) =>
624
- timedSeat(
625
- rosterSeat(roster, source, role, workDir, {
626
- events: laneEvents,
627
- avoid: Effect.map(held.executor, (id) => (id === undefined ? [] : [id])),
628
- borrow: held.lease,
629
- label
630
- }),
631
- laneEvents,
665
+ recorded(
666
+ timedSeat(
667
+ rosterSeat(roster, source, role, workDir, {
668
+ events: laneEvents,
669
+ avoid: Effect.map(held.executor, (id) => (id === undefined ? [] : [id])),
670
+ borrow: held.lease,
671
+ label
672
+ }),
673
+ laneEvents,
674
+ role
675
+ ),
676
+ lane,
632
677
  role
633
678
  ),
634
679
  available: roster.available,
@@ -644,7 +689,8 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
644
689
  laneEvents: FlowEventsShape
645
690
  ): Effect.Effect<FlowContextShape, FlowError> =>
646
691
  Effect.gen(function* () {
647
- const view = viewFor(held, workDir, label, laneEvents)
692
+ const lane = rebind ? undefined : label
693
+ const view = viewFor(held, workDir, label, laneEvents, lane)
648
694
  const judgmentSeat =
649
695
  options.judgment === undefined
650
696
  ? view.forRole("judge")
@@ -662,8 +708,14 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
662
708
  : timedJudgment(judged, laneEvents)
663
709
  return FlowContext.of({
664
710
  reasoning: view.forRole(rebind ? "planner" : "reviewer"),
665
- coder: timedSeat(held.service, laneEvents, "coder"),
711
+ coder: recorded(
712
+ timedSeat(held.service, laneEvents, "coder"),
713
+ lane,
714
+ "coder",
715
+ held.executor
716
+ ),
666
717
  judgment,
718
+ judge: judgmentSeat,
667
719
  git: makeGitTool(dependencies.process, workDir, laneEvents),
668
720
  hosting: makeGitHubTool(dependencies.process, workDir, laneEvents),
669
721
  events: laneEvents,
@@ -781,7 +833,13 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
781
833
  colour: true
782
834
  },
783
835
  nodeTreeKeys("interrupt"),
784
- idleAfterFrom(environment)
836
+ idleAfterFrom(environment),
837
+ transcriptsWanted(environment)
838
+ ? {
839
+ directory: join(options.workDir, ".llm4ts", "transcripts", bundle.runId),
840
+ files: nodeTranscriptFiles
841
+ }
842
+ : undefined
785
843
  )
786
844
  : undefined
787
845
  const surface = tree?.surface ?? classic