@demlik/tea 0.6.0 → 0.8.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 (158) hide show
  1. package/dist/agent/index.d.ts +6 -5
  2. package/dist/agent/index.js +10 -10
  3. package/dist/authed-call/index.d.ts +2 -2
  4. package/dist/authed-call/index.js +7 -7
  5. package/dist/await-terminal/index.d.ts +3 -2
  6. package/dist/await-terminal/index.js +2 -2
  7. package/dist/batch-window/index.d.ts +4 -3
  8. package/dist/batch-window/index.js +3 -3
  9. package/dist/cache/index.d.ts +2 -2
  10. package/dist/cache/index.js +4 -4
  11. package/dist/chart/index.d.ts +217 -0
  12. package/dist/chart/index.js +16 -0
  13. package/dist/chart/index.js.map +1 -0
  14. package/dist/chart/inspect/index.d.ts +85 -0
  15. package/dist/chart/inspect/index.js +5 -0
  16. package/dist/chart/inspect/index.js.map +1 -0
  17. package/dist/chart/inspect/react.d.ts +112 -0
  18. package/dist/chart/inspect/react.js +11 -0
  19. package/dist/chart/inspect/react.js.map +1 -0
  20. package/dist/chart/inspect/styles.css +286 -0
  21. package/dist/chart/lane/index.d.ts +361 -0
  22. package/dist/chart/lane/index.js +9 -0
  23. package/dist/chart/lane/index.js.map +1 -0
  24. package/dist/chart/lane/react.d.ts +83 -0
  25. package/dist/chart/lane/react.js +559 -0
  26. package/dist/chart/lane/react.js.map +1 -0
  27. package/dist/chart/lane/styles.css +498 -0
  28. package/dist/chart/report/index.d.ts +116 -0
  29. package/dist/chart/report/index.js +32 -0
  30. package/dist/chart/report/index.js.map +1 -0
  31. package/dist/{chunk-2UGTDYOK.js → chunk-3JU6657S.js} +3 -3
  32. package/dist/{chunk-2UGTDYOK.js.map → chunk-3JU6657S.js.map} +1 -1
  33. package/dist/{chunk-AZ3NHUPD.js → chunk-4KTWLPL5.js} +3 -3
  34. package/dist/{chunk-AZ3NHUPD.js.map → chunk-4KTWLPL5.js.map} +1 -1
  35. package/dist/{chunk-ZH454CR5.js → chunk-5EHLEUTL.js} +24 -4
  36. package/dist/chunk-5EHLEUTL.js.map +1 -0
  37. package/dist/chunk-5KJKJOFC.js +758 -0
  38. package/dist/chunk-5KJKJOFC.js.map +1 -0
  39. package/dist/{chunk-WF46FABO.js → chunk-7SVIRMC6.js} +3 -3
  40. package/dist/{chunk-WF46FABO.js.map → chunk-7SVIRMC6.js.map} +1 -1
  41. package/dist/{chunk-XMHZ44QC.js → chunk-7V4EVLZA.js} +4 -4
  42. package/dist/{chunk-XMHZ44QC.js.map → chunk-7V4EVLZA.js.map} +1 -1
  43. package/dist/{chunk-IVHQCVFX.js → chunk-A56OR5RF.js} +3 -3
  44. package/dist/{chunk-IVHQCVFX.js.map → chunk-A56OR5RF.js.map} +1 -1
  45. package/dist/{chunk-O7ED34JH.js → chunk-B5VXOFMZ.js} +47 -15
  46. package/dist/chunk-B5VXOFMZ.js.map +1 -0
  47. package/dist/chunk-E6GEDSF4.js +307 -0
  48. package/dist/chunk-E6GEDSF4.js.map +1 -0
  49. package/dist/{chunk-EC6FO42Q.js → chunk-EUF7XOEE.js} +6 -6
  50. package/dist/{chunk-EC6FO42Q.js.map → chunk-EUF7XOEE.js.map} +1 -1
  51. package/dist/{chunk-XOAP3LOT.js → chunk-I5OV65MS.js} +3 -3
  52. package/dist/{chunk-XOAP3LOT.js.map → chunk-I5OV65MS.js.map} +1 -1
  53. package/dist/chunk-JER5O7PQ.js +416 -0
  54. package/dist/chunk-JER5O7PQ.js.map +1 -0
  55. package/dist/{chunk-ASX7PL2K.js → chunk-JGVL3WPL.js} +3 -3
  56. package/dist/{chunk-ASX7PL2K.js.map → chunk-JGVL3WPL.js.map} +1 -1
  57. package/dist/{chunk-S6Y3RNX4.js → chunk-JP5D6GSL.js} +4 -4
  58. package/dist/{chunk-S6Y3RNX4.js.map → chunk-JP5D6GSL.js.map} +1 -1
  59. package/dist/{chunk-ERYY5P6W.js → chunk-ND3DH6KM.js} +3 -3
  60. package/dist/{chunk-ERYY5P6W.js.map → chunk-ND3DH6KM.js.map} +1 -1
  61. package/dist/{chunk-A7USKARI.js → chunk-SUST46KO.js} +3 -3
  62. package/dist/{chunk-A7USKARI.js.map → chunk-SUST46KO.js.map} +1 -1
  63. package/dist/{chunk-2KBEIGYP.js → chunk-TP5UPGLY.js} +3 -3
  64. package/dist/{chunk-2KBEIGYP.js.map → chunk-TP5UPGLY.js.map} +1 -1
  65. package/dist/chunk-UOC2PL46.js +13 -0
  66. package/dist/chunk-UOC2PL46.js.map +1 -0
  67. package/dist/{chunk-66S2KEQQ.js → chunk-WLGO64WC.js} +4 -4
  68. package/dist/{chunk-66S2KEQQ.js.map → chunk-WLGO64WC.js.map} +1 -1
  69. package/dist/chunk-WRAA7GVZ.js +209 -0
  70. package/dist/chunk-WRAA7GVZ.js.map +1 -0
  71. package/dist/chunk-ZCL7SCBK.js +685 -0
  72. package/dist/chunk-ZCL7SCBK.js.map +1 -0
  73. package/dist/chunk-ZD6PNZBK.js +457 -0
  74. package/dist/chunk-ZD6PNZBK.js.map +1 -0
  75. package/dist/{chunk-UV7VCTNC.js → chunk-ZF6WDK2D.js} +7 -7
  76. package/dist/{chunk-UV7VCTNC.js.map → chunk-ZF6WDK2D.js.map} +1 -1
  77. package/dist/{core-CUN5HDKL.d.ts → core-Bjc0bS8j.d.ts} +22 -1
  78. package/dist/deadline/index.d.ts +2 -2
  79. package/dist/deadline/index.js +3 -3
  80. package/dist/devtools/index.js +2 -207
  81. package/dist/devtools/index.js.map +1 -1
  82. package/dist/do/index.d.ts +7 -6
  83. package/dist/do/index.js +10 -10
  84. package/dist/{durable-effects-CXMOi-sp.d.ts → durable-effects-D8SqU_if.d.ts} +1 -1
  85. package/dist/extension/index.d.ts +3 -2
  86. package/dist/extension/index.js +3 -3
  87. package/dist/extension/react.js +3 -3
  88. package/dist/extension/subs/index.d.ts +2 -2
  89. package/dist/fan-out/index.d.ts +3 -2
  90. package/dist/fold-Blbhru48.d.ts +435 -0
  91. package/dist/graph-CcjWZVrd.d.ts +923 -0
  92. package/dist/idempotent-intake/index.d.ts +3 -2
  93. package/dist/index.d.ts +5 -4
  94. package/dist/index.js +2 -2
  95. package/dist/llm-call/index.d.ts +2 -2
  96. package/dist/llm-call/index.js +7 -7
  97. package/dist/{machine-CoWpvp8x.d.ts → machine-0OmPvsy_.d.ts} +1 -1
  98. package/dist/machine-viz/index.d.ts +19 -2
  99. package/dist/machine-viz/index.js +4 -10
  100. package/dist/machine-viz/index.js.map +1 -1
  101. package/dist/mem/index.d.ts +3 -2
  102. package/dist/monitored-run/index.d.ts +4 -3
  103. package/dist/monitored-run/index.js +5 -5
  104. package/dist/node/index.d.ts +3 -2
  105. package/dist/paginated-walk/index.d.ts +2 -2
  106. package/dist/paginated-walk/index.js +7 -7
  107. package/dist/parity/index.d.ts +3 -2
  108. package/dist/parity/index.js +3 -3
  109. package/dist/pbt/arbitraries/index.d.ts +1 -1
  110. package/dist/pbt/index.d.ts +1 -1
  111. package/dist/pbt/index.js +3 -3
  112. package/dist/pbt/runners/index.d.ts +1 -1
  113. package/dist/pbt/runners/index.js +3 -3
  114. package/dist/poller/index.d.ts +28 -7
  115. package/dist/poller/index.js +3 -3
  116. package/dist/poller/index.js.map +1 -1
  117. package/dist/prediction/index.d.ts +1 -1
  118. package/dist/prediction/index.js +2 -2
  119. package/dist/pure/index.d.ts +1 -1
  120. package/dist/pure/index.js +2 -2
  121. package/dist/react/index.d.ts +3 -2
  122. package/dist/react/index.js +2 -2
  123. package/dist/reconciler/index.d.ts +2 -2
  124. package/dist/reconciler/index.js +7 -7
  125. package/dist/recorder/index.d.ts +3 -2
  126. package/dist/reducer-BqyoVyBG.d.ts +447 -0
  127. package/dist/resilient-call/index.d.ts +2 -2
  128. package/dist/resilient-call/index.js +6 -6
  129. package/dist/run-BVeqJDBF.d.ts +713 -0
  130. package/dist/{runtime-types-BD3ZFfdw.d.ts → runtime-types-Bxc637bp.d.ts} +53 -2
  131. package/dist/saga/index.d.ts +3 -2
  132. package/dist/samples-DCt6nF8H.d.ts +59 -0
  133. package/dist/snapshot/index.d.ts +1 -1
  134. package/dist/snapshot/index.js +3 -3
  135. package/dist/subs/index.d.ts +4 -3
  136. package/dist/subs/index.js +3 -3
  137. package/dist/testing/index.d.ts +3 -2
  138. package/dist/testing/index.js +2 -2
  139. package/dist/throttled-input/index.d.ts +2 -2
  140. package/dist/throttled-input/index.js +6 -6
  141. package/dist/token-refresh/index.d.ts +1 -1
  142. package/dist/token-refresh/index.js +3 -3
  143. package/dist/trace-replay/index.d.ts +3 -2
  144. package/dist/trace-replay/index.js +3 -3
  145. package/dist/{types-CjAkI83U.d.ts → types-D7u9DkH7.d.ts} +1 -1
  146. package/dist/with-deadline/index.d.ts +1 -1
  147. package/dist/with-deadline/index.js +2 -2
  148. package/dist/with-resilience/index.d.ts +2 -2
  149. package/dist/with-resilience/index.js +6 -6
  150. package/dist/with-telemetry/index.d.ts +1 -1
  151. package/dist/with-telemetry/index.js +2 -2
  152. package/dist/work-queue/adapter.d.ts +3 -2
  153. package/dist/work-queue/index.d.ts +3 -2
  154. package/dist/work-queue/ops.d.ts +3 -2
  155. package/dist/workflow/index.d.ts +3 -3
  156. package/package.json +31 -1
  157. package/dist/chunk-O7ED34JH.js.map +0 -1
  158. package/dist/chunk-ZH454CR5.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/chart/lane/react.tsx"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["/**\n * @packageDocumentation\n * @demlik/tea/chart/lane/react — a lane, as one page. **Experimental.**\n *\n * ```tsx\n * // the fabrika case: a workflow document and the log it produced\n * <LaneView lane={chartFromWorkflow(document)} log={parseEventsJsonl(jsonl)} />\n *\n * // the same page over a lane that is actually running\n * <LiveLaneView lane={epic} hands={hands} samples={samples} />\n * ```\n *\n * WHY THIS EXISTS. `<ChartInspector>` takes a LIVE MACHINE — a chart plus the\n * code bodies — and runs it. A real fabrika lane is the opposite shape:\n * already-run history, no code bodies anywhere, imported at runtime from a\n * `workflow.json`. So until this component, the one thing a real consumer most\n * wants to look at could only be looked at as markdown. One core serves every\n * surface, and a lane could reach only one of them.\n *\n * TWO SOURCES, ONE PRESENTATION. Both components render the SAME panels from\n * the same model (`laneView` in `./view`), and neither of them branches on\n * which source it has. What the source decides is what is OFFERED, and an\n * unavailable control is drawn as unavailable WITH THE REASON — never silently\n * absent, which is the same rule the refusal rendering has always followed:\n *\n * REPLAY — every control says \"this lane is a workflow document and its event\n * log; the code bodies that would run an edge do not exist here\". The lane\n * moves by its log and by nothing else, and the scrubber runs over that log.\n *\n * LIVE — the controls dispatch. A legal event sends `${task}.${event}`, the\n * addressed form `compile(chart, parts, taskId)` already keys the table by.\n * A refused one is still on screen, refused by the CHART rather than by the\n * source, and saying which mechanism refused it.\n *\n * The same discipline covers the two questions one source cannot answer at all:\n * a live tape carries the ORDER of its msgs and no wall-clock, so the timeline's\n * \"at\" column is an `Unanswerable<\"clock\">` with the reason rather than a column\n * of invented times; and a region whose state keeps no `retries` gets an\n * `Unanswerable<\"retries\">` rather than a confident `0/2`.\n *\n * WHICH OF TWELVE THINGS IS STUCK — first, because for a real epic that is the\n * first question, and a page that answers it fourth is a page that answers it\n * too late. The panel is `inspectLane`'s own `stuck` list, with the phase\n * attached so the answer names a place as well as a task.\n *\n * THE WALL OF DIAGRAMS, AND WHY THERE ISN'T ONE. `report.ts` learned from a real\n * emitted epic that a phase holds eight tasks and six of them sit untouched at\n * their entry state, and that drawing all eight produces a wall nobody reads.\n * That judgement is not relearned here: only the ACTIVE phase expands, and\n * inside it only the tasks that have MOVED (plus, in a TRIPPED phase, the tasks\n * that tripped it — on the screen someone opened about a stopped lane, that task\n * is the whole reason they are here). The one concession the medium earns is\n * that a collapsed task keeps its entire panel — waiting-on, controls, picture —\n * behind a disclosure instead of losing it. The reader who wants the seventh\n * diagram can have it, the reader who wants the answer is not made to scroll\n * past six, and on a LIVE lane a collapsed region is still dispatchable one\n * click of the triangle away.\n *\n * NO NEW DEPENDENCY. The diagram is emitted as `<pre class=\"mermaid\">` for a\n * host renderer, exactly as `<ChartInspector>` does — the text is readable with\n * no renderer at all. Styling follows the same contract: one stylesheet, every\n * class prefixed (`tea-lv-*`), wired to the consumer's design tokens. Import\n * `@demlik/tea/chart/lane/styles.css`.\n */\n\n\"use client\";\n\nimport { useEffect, useMemo, useReducer, useRef, useState } from \"react\";\nimport { type Cmd, type Machine, replay, type Sub } from \"../../index\";\nimport type { Recorder, Trace } from \"../../recorder\";\nimport type { Samples, Unanswerable } from \"../inspect\";\nimport { useInspectorRuntime } from \"../inspect/react\";\nimport type { LogEntry } from \"../report/fold\";\nimport type { ImportedLane } from \"../report/workflow\";\nimport {\n type LaneHandsOf,\n type LaneRunMsg,\n type LaneRunState,\n runLane,\n} from \"./run\";\nimport type { LaneTaskChart, LaneTaskId } from \"./structure\";\nimport {\n type LaneControl,\n type LaneFeed,\n type LanePhaseView,\n type LaneTaskView,\n type LaneViewModel,\n laneView,\n liveFeed,\n type RunningLeaf,\n replayFeed,\n} from \"./view\";\n\n// ── props ─────────────────────────────────────────────────────────────────\n\n/**\n * Everything `<LaneView>` needs, and it is the two files a fabrika lane IS.\n *\n * There is no prop for the phases, the tasks, the states, the standings, the\n * terminal or what anything is waiting on: every one of those is derived from\n * these two, and a prop restating one would be the fact said twice.\n */\nexport interface LaneViewProps {\n /** The lane. `chartFromWorkflow(document)` or `defineLane(spec)` — either door. */\n readonly lane: ImportedLane;\n /** Its event log — `parseEventsJsonl(...)` or `parseHistoryJson(...)`. */\n readonly log: readonly LogEntry[];\n /** Heading. Cosmetic — defaults to the document's own `id`. */\n readonly title?: string;\n /** Appended to the container's class list. */\n readonly className?: string;\n}\n\n/**\n * One sample bag per task, each typed by THAT task's chart.\n *\n * The one thing a lane genuinely cannot derive, and the only reason it is a\n * prop: `ty<T>()` is `{}` at runtime, so a payload's shape is erased before any\n * runtime code could read it. Optional per task, because a task whose events\n * declare no payload has nothing to supply.\n *\n * WHAT A LANE LOSES, said here rather than found out. `defineLane` LOWERS its\n * charts to the runtime-typed form the fold and the drawing share, and that form\n * records which events a state routes and NOT which of them declare a payload.\n * So no control is ever reported as blocked for want of a sample: a msg is built\n * either way, with the sample merged in when one was given. Supply one where a\n * guard reads a payload field, and the guard preview reads the field you meant.\n */\nexport type LaneSamples<L> = {\n readonly [T in LaneTaskId<L>]?: Samples<LaneTaskChart<L, T>>;\n};\n\n/**\n * Everything `<LiveLaneView>` needs — the lane, and the hands `runLane` demands.\n *\n * `hands` is not a restatement of the lane: it is the code the lane deliberately\n * does not own (each region's `parts`, and where each instance BOOTS, which an\n * emitted epic decides per sub-issue). It is the same bag `runLane` takes, so\n * an author passes the one they already built.\n */\nexport interface LiveLaneViewProps<L, H, Ctx> {\n readonly lane: L;\n /** The parts and boot state per task — the same bag `runLane` demands. */\n readonly hands: H;\n /** One payload sample per event that declares one, per task. */\n readonly samples?: LaneSamples<L>;\n /** The runtime ctx. Omit for a lane whose regions read nothing from one. */\n readonly ctx?: Ctx;\n readonly title?: string;\n readonly className?: string;\n}\n\n// ── the components ────────────────────────────────────────────────────────\n\n/**\n * A lane that has already run, looked at: the REPLAY source.\n *\n * The scrubber folds a prefix of the real log, which is not an approximation of\n * the state at step k but the definition of it (`fold.ts`), so dragging it\n * backwards shows exactly what the driver would have printed at that moment.\n * Nothing is dispatchable and every control says why.\n */\nexport function LaneView(props: LaneViewProps) {\n const feed = useMemo(\n () => replayFeed(props.lane, props.log),\n [props.lane, props.log],\n );\n return (\n <LanePanels\n feed={feed}\n title={props.title}\n className={props.className}\n send={null}\n />\n );\n}\n\n/**\n * The same page over a lane that is RUNNING — the LIVE source.\n *\n * It owns a runtime for its lifetime (`runLane`'s `init`/`update`, built into a\n * `Machine` here rather than asked for, so the drawing and the runtime provably\n * come from the same lane) and records it, so the scrubber time-travels by the\n * same pure `replay` `<ChartInspector>`'s does: `init` + `update` only, never\n * `interpret`, so dragging backwards cannot re-fire an effect.\n */\nexport function LiveLaneView<\n L extends ImportedLane,\n const H extends LaneHandsOf<L, H>,\n Ctx = Record<never, never>,\n>(props: LiveLaneViewProps<L, H, Ctx>) {\n const { lane, hands, ctx } = props;\n const [epoch, reset] = useReducer((n: number) => n + 1, 0);\n\n const machine = useMemo(\n () =>\n // The one cast, at the construction boundary — `runLane` returns exactly\n // the `init` and `update` a `Machine` is made of, over the lane's own\n // derivations, and `Machine` wants them under the caller's names.\n ({ ...runLane(lane as never, hands as never) }) as unknown as Machine<\n LaneRunState<L>,\n LaneRunMsg<L> & { readonly type: string },\n Cmd,\n Sub<never>,\n Ctx\n >,\n [lane, hands],\n );\n const { rt, rec } = useInspectorRuntime(machine, ctx as Ctx, epoch);\n\n if (rt === null) {\n return (\n <div className={containerClass(props.className)}>\n <div className=\"tea-lv-boot\">booting…</div>\n </div>\n );\n }\n return (\n <LiveLanePanels\n key={epoch}\n lane={lane as unknown as ImportedLane}\n hands={hands as unknown as Readonly<Record<string, { parts?: object }>>}\n samples={props.samples as unknown as RtLaneSamples | undefined}\n machine={machine}\n runtime={rt}\n rec={rec}\n ctx={ctx as Ctx}\n title={props.title}\n className={props.className}\n onReset={reset}\n />\n );\n}\n\n/** The samples bag, after the type layer has done its work. */\ntype RtLaneSamples = Readonly<\n Record<string, Readonly<Record<string, object>> | undefined>\n>;\n\n/**\n * The live half's body: subscribe, record, and turn the recorded tape into the\n * same {@link LaneFeed} the replay source produces.\n *\n * Split out from `<LiveLaneView>` so the hooks below run only once a runtime\n * exists — the same shape `<ChartInspector>`/`<InspectorView>` uses, and for the\n * same reason: until `ready` resolves there is no total `getState` and nothing\n * honest to render.\n */\nfunction LiveLanePanels<S, M extends { type: string }, K extends Cmd, Ctx>({\n lane,\n hands,\n samples,\n machine,\n runtime,\n rec,\n ctx,\n title,\n className,\n onReset,\n}: {\n readonly lane: ImportedLane;\n readonly hands: Readonly<Record<string, { parts?: object }>>;\n readonly samples: RtLaneSamples | undefined;\n readonly machine: Machine<S, M, K, Sub<never>, Ctx>;\n readonly runtime: {\n getState: () => S;\n subscribe: (f: () => void) => () => void;\n dispatch: (m: M) => void;\n };\n readonly rec: Recorder<S, M>;\n readonly ctx: Ctx;\n readonly title: string | undefined;\n readonly className: string | undefined;\n readonly onReset: () => void;\n}) {\n const [, bump] = useReducer((n: number) => n + 1, 0);\n useEffect(() => runtime.subscribe(bump), [runtime]);\n const live = runtime.getState();\n const trace = safeDump(rec, live);\n // `dump()` allocates a fresh tape every render, so the msgs ARRAY has a new\n // identity each time and keying the memo on it would re-replay the whole run\n // on every render. The tape only ever grows, so its LENGTH is the honest key\n // and the tape itself is read through a ref — the same trick, for the same\n // reason, as `<ChartInspector>`'s cmd capture.\n const tape = useRef(trace);\n tape.current = trace;\n const now = useRef(live);\n now.current = live;\n const total = trace.msgs.length;\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: `total` is not read in the body and is the whole point of the memo — it is the tape's length, the one thing that changes what the feed answers\n const feed = useMemo(\n () =>\n liveFeed(lane, {\n regionsAt: (n) =>\n regionsOf(\n replayPrefix(machine, tape.current, ctx, n, now.current),\n // a fold that threw leaves the live regions as the honest answer\n regionsOf(now.current, {}),\n ),\n msgs: tape.current.msgs,\n optsFor: (task) => ({\n ...(hands[task]?.parts === undefined\n ? {}\n : { parts: hands[task]?.parts as never }),\n ...(samples?.[task] === undefined\n ? {}\n : { samples: samples[task] as never }),\n }),\n }),\n [lane, hands, samples, machine, ctx, total],\n );\n\n return (\n <LanePanels\n feed={feed}\n title={title}\n className={className}\n send={(msg) => runtime.dispatch(msg as unknown as M)}\n onReset={onReset}\n />\n );\n}\n\nfunction containerClass(extra: string | undefined): string {\n return `tea-lv${extra ? ` ${extra}` : \"\"}`;\n}\n\n// ── the one presentation ──────────────────────────────────────────────────\n\n/**\n * WHAT A CLICK DOES HERE — or why nothing does. One value, never a pair.\n *\n * It replaced `send: fn | null` for a reason a rendered page found: `null`\n * meant \"this source has no dispatch\", and there is a SECOND way a click can be\n * unavailable — the reader has scrubbed into the past — that a nullable\n * function has no room for. So the reason travels with the absence, and every\n * component that draws a control gets the sentence for free.\n */\ntype Dispatch =\n | { readonly send: (msg: { readonly type: string }) => void }\n | { readonly blocked: string };\n\n/** The facts a panel needs that are about the PAGE rather than about a task. */\ninterface Page {\n readonly dispatch: Dispatch;\n /**\n * Fold the control wall behind a disclosure.\n *\n * A property of the SOURCE, not of the moment: on a lane read from a log not\n * one of forty-eight boxes can ever be clicked, so they are reference\n * material. A live lane that is merely scrubbed keeps them open — the reader\n * is one button (\"now\") from clicking them, and a wall that vanishes when you\n * drag the timeline reads as a page losing its nerve.\n */\n readonly foldControls: boolean;\n /** The lane has stopped. Nothing on this page is about to happen. */\n readonly ended: boolean;\n}\n\n/**\n * A separator that survives with NO STYLESHEET.\n *\n * Every gap on this page between two adjacent inline spans was a CSS `gap`, so\n * an unstyled host rendered `5674 — NO STYLESHEETreplaytrippeddone`. The\n * package promises a legible page with no design system at all (see the\n * stylesheet's own banner); a separator that only exists in the stylesheet is\n * that promise kept in one of the two cases.\n */\nconst Sep = () => <span className=\"tea-lv-sep\"> · </span>;\n\n/** A view handed no dispatch and no reason — said, rather than left blank. */\nconst NO_SEND = \"this view was given no way to dispatch\";\n\n/**\n * WHERE THE LANE IS, in words a reader owes nothing to learn.\n *\n * `view.status` is `deriveLaneStatus`'s `\"done\" | \"active\"` — the driver's\n * vocabulary, right for a caller branching on it and wrong on a header, where\n * `done` sat next to `tripped` and read as \"it worked\".\n */\nfunction endingWord(view: LaneViewModel): string {\n if (view.terminal === null) return \"still running\";\n return view.tripped.length > 0 ? \"stopped here\" : \"finished\";\n}\n\n/**\n * The panels. ONE component for both sources, and it takes `send` as data:\n * `null` is a source with no dispatch at all, and the reason is already on every\n * control's `send` field, so this component never has to know which source it\n * is looking at.\n */\nfunction LanePanels({\n feed,\n title,\n className,\n send,\n onReset,\n}: {\n readonly feed: LaneFeed;\n readonly title: string | undefined;\n readonly className: string | undefined;\n readonly send: ((msg: { readonly type: string }) => void) | null;\n readonly onReset?: () => void;\n}) {\n // `null` is live (the end of the tape); a number is a step to look at.\n const [at, setAt] = useState<number | null>(null);\n const cursor = at === null ? feed.total : Math.min(at, feed.total);\n const view = laneView(feed, cursor, title);\n\n // A CLICK GOES TO THE PRESENT, AND THE PAGE IS SHOWING THE PAST.\n //\n // The scrubber moves the VIEW; the runtime stays where it is. So while the\n // cursor is behind the tape, a live control's outcome (`→ build`) is computed\n // from the state on screen and its click lands on the state that is actually\n // there — the button both mis-states what it will do and gives no sign it\n // did it. Found by clicking one: the only feedback anywhere was `step 3 of 6`\n // becoming `step 3 of 7`.\n //\n // The reason is a value, so this is the whole fix: the buttons go off and say\n // why, through the same machinery a replay source's controls already use.\n const blocked: string | undefined = view.scrubbed\n ? `you are looking at step ${view.cursor} of ${view.total}. A button dispatches into the lane as it is NOW — press “now” to get them back.`\n : view.noDispatch?.why;\n const page: Page = {\n dispatch:\n send !== null && blocked === undefined\n ? { send }\n : { blocked: blocked ?? NO_SEND },\n foldControls: view.noDispatch !== undefined,\n ended: view.terminal !== null,\n };\n\n return (\n <div className={containerClass(className)} data-source={view.source}>\n <header className=\"tea-lv-head\">\n <span className=\"tea-lv-title\">{view.title}</span>\n <Sep />\n <span className=\"tea-lv-src\" data-source={view.source}>\n {view.source}\n </span>\n <Sep />\n <span className=\"tea-lv-now\" data-lane-status={view.status}>\n {view.terminal === null ? (\n <span className=\"tea-lv-phase\">{view.activePhase ?? \"—\"}</span>\n ) : (\n <span className=\"tea-lv-terminal\">{view.terminal}</span>\n )}\n <Sep />\n {/* NOT `view.status`. That field is fabrika's own `done | active`,\n and printing it raw badged a lane that FROZE as DONE, one span\n away from the word `tripped`. Internal vocabulary that reads as a\n success claim is worse than no badge. */}\n <span className=\"tea-lv-status\">{endingWord(view)}</span>\n </span>\n {view.scrubbed ? (\n <>\n <Sep />\n <span className=\"tea-lv-warn\">\n time-travelling — step {view.cursor} of {view.total}\n </span>\n </>\n ) : null}\n </header>\n\n {/* WHY NOTHING IS DISPATCHABLE — said ONCE, here.\n It used to be said on every control, which is where looking at a real\n rendered lane earned its keep: the sentence is a fact about the SOURCE,\n identical for all of them, and a phase with eight tasks × six events\n repeated it forty-eight times. The rule (\"never a silently missing\n affordance\") is kept — the reason is on screen, above every control it\n explains, and each disabled button still carries it as its title. */}\n {/* WHAT AM I LOOKING AT — one paragraph, in words, before any data.\n A reader who has never seen a lane cannot infer it from chips and\n arrows, and a page that needs explaining out loud is a page that has\n not finished. The counts are derived, so it stays true as it moves. */}\n <p className=\"tea-lv-lede\">\n {/* THE SENTENCE HAS TO BE TRUE AT ONE PHASE TOO. \"A lane is 1 phase\n that run in order\" was a plural verb on a count that can be one, and\n \"in order\" says nothing about a sequence with one item in it. */}\n {view.phases.length === 1 ? (\n <>\n A <b>lane</b> is a run of phases — this one has a single phase.\n </>\n ) : (\n <>\n A <b>lane</b> is {view.phases.length} phases that run one after\n another.\n </>\n )}{\" \"}\n Each phase holds tasks that run <i>at the same time</i>, and every task\n is one state machine — the diagram below it is that machine, with the\n state it is in right now lit up. A phase finishes when all of its tasks\n finish;{\" \"}\n {view.terminal === null ? (\n <>\n right now <b>{view.activePhase}</b> is the one running.\n </>\n ) : (\n <>\n this lane has ended, on <b>{view.terminal}</b>.\n </>\n )}\n </p>\n {/* WHY NOTHING CAN BE CLICKED — one sentence, above every control it\n explains. Read off the MODEL, not scraped back off whichever control\n still happened to carry it: on a finished lane every control is\n refused by the chart, so the scrape returned nothing and the page lost\n its explanation at the exact moment six disabled buttons needed one. */}\n {\"blocked\" in page.dispatch ? (\n <p className=\"tea-lv-unavailable\" data-unavailable=\"dispatch\">\n {page.dispatch.blocked}\n </p>\n ) : null}\n\n {/* 1 — WHICH OF TWELVE THINGS IS STUCK. First, because it is the first\n question anyone asks about an epic that stopped moving. */}\n <StuckPanel view={view} />\n\n {/* 2 — the phases, in order. The lane's own structure: N tasks each,\n running concurrently, and a standing per phase. */}\n {view.phases.map((phase) => (\n <PhasePanel key={phase.name} phase={phase} page={page} />\n ))}\n\n {/* 3 — the timeline, and the scrubber over it. */}\n <TimelinePanel\n view={view}\n onScrub={setAt}\n onLive={() => setAt(null)}\n onReset={onReset}\n />\n </div>\n );\n}\n\nfunction StuckPanel({ view }: { readonly view: LaneViewModel }) {\n return (\n <section className=\"tea-lv-panel tea-lv-stuck\">\n <h3 className=\"tea-lv-h\">\n 1 · is anything blocked?\n <Sep />\n <span className=\"tea-lv-hint\">\n a task nothing can move until someone acts\n </span>\n </h3>\n {view.stuck.length === 0 ? (\n // Said, never left blank: \"nothing is stuck\" is an answer, and an empty\n // panel is the reader wondering whether the question was asked.\n <p className=\"tea-lv-none\">\n nothing is stuck — every task can still move\n </p>\n ) : (\n <ul className=\"tea-lv-stucklist\">\n {view.stuck.map((s) => (\n <li key={s.task} data-stuck={s.reason.kind} data-task={s.task}>\n <b>{s.task}</b> <span className=\"tea-lv-muted\">({s.phase})</span>{\" \"}\n — {stuckLine(s.reason)}\n </li>\n ))}\n </ul>\n )}\n {view.tripped.length === 0 ? null : (\n <p className=\"tea-lv-tripped\">tripped: {view.tripped.join(\", \")}</p>\n )}\n </section>\n );\n}\n\n/** One stuck reason, as a sentence. The four kinds are not the same news. */\nfunction stuckLine(reason: LaneTaskView[\"stuck\"]): string {\n if (reason === null) return \"\";\n switch (reason.kind) {\n case \"tripped\":\n return `landed on the error final \\`${reason.state}\\` — as finished as a shipped task, and lost`;\n case \"dead-end\":\n return `\\`${reason.state}\\` routes no event and is not a final — nobody can move it`;\n case \"budget-spent\":\n return `\\`${reason.state}\\` has spent its retry budget — the next \\`${reason.event}\\` is \\`${reason.landsOn}\\`, not a retry`;\n case \"awaiting-world\":\n // The roles are the consumer's own words, carried through from `from`.\n return `\\`${reason.state}\\` moves only when ${reason.roles.join(\" or \")} sends ${reason.events.map((e) => `\\`${e}\\``).join(\" or \")} — no cmd or sub can arrive here`;\n }\n}\n\n/**\n * HOW MANY TASKS, AND WHAT THEY ARE DOING — which is not always \"running\".\n *\n * \"8 tasks running together\" is the point of a phase and was printed on every\n * phase, including the ones that finished before the reader arrived and the\n * ones that have not started. And \"1 task running together\" is not a sentence.\n * The count is the fact; the verb is the standing's.\n */\nfunction phaseCount(phase: LanePhaseView): string {\n const n = phase.tasks.length;\n const tasks = `${n} task${n === 1 ? \"\" : \"s\"}`;\n switch (phase.standing) {\n case \"active\":\n return n === 1 ? `${tasks}, running` : `${tasks}, running together`;\n case \"complete\":\n return `${tasks}, all finished`;\n case \"tripped\":\n return n === 1\n ? `${tasks}, stopped on an error`\n : `${tasks} — ${phase.tripped.length} stopped on an error`;\n case \"waiting\":\n return `${tasks}, not started`;\n }\n}\n\nfunction PhasePanel({\n phase,\n page,\n}: {\n readonly phase: LanePhaseView;\n readonly page: Page;\n}) {\n const count = phaseCount(phase);\n return (\n <section\n className={`tea-lv-panel tea-lv-phase-${phase.standing}`}\n data-phase={phase.name}\n data-standing={phase.standing}\n >\n <h3 className=\"tea-lv-h\">\n {phase.index === 0 ? \"2 · \" : \"\"}\n {phase.name} <span className=\"tea-lv-standing\">{phase.standing}</span>\n <Sep />\n <span className=\"tea-lv-muted\">{count}</span>\n </h3>\n <ul className=\"tea-lv-chips\">\n {phase.tasks.map((task) => (\n <li\n key={task.task}\n className=\"tea-lv-chip\"\n data-task={task.task}\n data-state={task.state}\n data-end={String(task.endPolarity)}\n >\n <b>{task.task}</b> = {task.state}\n {task.endPolarity === \"error\" ? \" (tripped)\" : \"\"}\n </li>\n ))}\n </ul>\n {/* THE CHIPS ARE THE SUMMARY, so a collapsed task must not repeat them.\n Each collapsed task used to render its own `task = state` disclosure\n directly under a chip row that had just said exactly that — every task\n listed twice, adjacent. Rendering a real phase of eight made it\n obvious and no assertion could.\n\n So: expanded tasks get their panel, and the rest go behind ONE\n disclosure. Nothing is lost — the collapsed panels are still whole and\n still one click away, which on a live lane keeps those regions\n dispatchable — and the phase reads as one line per task either way. */}\n {phase.tasks.map((task) => (\n <TaskPanel\n key={task.task}\n task={task}\n expanded={phase.expanded.includes(task.task)}\n alone={phase.tasks.length === 1}\n page={page}\n />\n ))}\n </section>\n );\n}\n\n/**\n * WHAT THIS TASK IS WAITING ON — in the tense of what has actually happened.\n *\n * The error-final sentence used to promise the trip as future work (\"`pipeline`\n * WILL trip the lane when its siblings finish\") on a page whose header, badge\n * and stuck panel all already said the lane HAD tripped — four surfaces in the\n * past, the fifth in the future. It is future work only while the lane is still\n * running, and only when there are siblings left to wait for.\n */\nfunction waitingLine(\n task: LaneTaskView,\n alone: boolean,\n ended: boolean,\n): string {\n if (task.waitingOn !== null) return task.waitingOn;\n if (task.endPolarity !== \"error\") return \"nothing — this task is final\";\n const landed = `nothing — this task landed on the error final \\`${task.state}\\``;\n if (ended) return `${landed}, which is what stopped the lane`;\n if (alone) return `${landed}, and that trips \\`${task.phase}\\``;\n return `${landed}, and \\`${task.phase}\\` will trip the lane once its siblings finish`;\n}\n\n/**\n * One task. Expanded, or collapsed to a line with its picture behind a\n * disclosure — see the module doc for why the collapse is not a hole.\n */\nfunction TaskPanel({\n task,\n expanded,\n alone,\n page,\n}: {\n readonly task: LaneTaskView;\n readonly expanded: boolean;\n /** The only task in its phase — so it has no siblings to wait for. */\n readonly alone: boolean;\n readonly page: Page;\n}) {\n // THE COLLAPSED DIAGRAM IS NOT MOUNTED UNTIL IT IS OPENED.\n //\n // The editorial rule folds ten of twelve pictures away, and every one of them\n // was still a `<pre class=\"mermaid\">` in the DOM — so a mermaid host rendered\n // all twelve, and because each `<pre>` is keyed by its own text (see below),\n // ONE step of the scrubber remounted and re-rendered all twelve. The first\n // paint of that page timed out a thirty-second screenshot. `toggle` is the\n // event a `<details>` already fires, so the fold now costs what it looks like\n // it costs.\n //\n // THE DIAGRAM ALONE, and not the panel around it. The picture is the whole\n // expense (a mermaid host lays out every node) and the controls are the whole\n // promise — a collapsed region of a LIVE lane stays dispatchable, so its\n // buttons stay in the DOM whether or not anyone opened the triangle.\n const [opened, setOpened] = useState(false);\n const showDiagram = expanded || opened;\n const waiting = waitingLine(task, alone, page.ended);\n\n // THE SAME BODY EITHER WAY, and that is the point of the disclosure: the\n // collapse hides the wall, it does not withhold the task. A live lane's\n // collapsed region is still dispatchable, one click of the triangle away —\n // which is exactly what a comment could not have offered.\n const body = (\n <>\n <p className=\"tea-lv-waiting\">waiting on: {waiting}</p>\n <Budget task={task} />\n {/* THE CONTROL WALL, and why it is folded away on a replay.\n Six events × eight tasks is forty-eight boxes, and on a lane read from\n a log not one of them can be clicked — most of them say only that the\n event is not accepted here. That is true, and it is the answer to a\n question nobody asked while reading history. So on a replay they go\n behind a disclosure; on a LIVE lane, where a click actually moves the\n machine, they stay open. Reachable either way — never absent. */}\n {page.foldControls ? (\n <details className=\"tea-lv-accepts\">\n <summary>\n which events this state accepts (\n {task.controls.filter((c) => !c.refused).length} of{\" \"}\n {task.controls.length})\n </summary>\n <div className=\"tea-lv-controls\">\n {task.controls.map((control) => (\n <Control\n key={control.event}\n control={control}\n dispatch={page.dispatch}\n />\n ))}\n </div>\n </details>\n ) : (\n <div className=\"tea-lv-controls\">\n {task.controls.map((control) => (\n <Control\n key={control.event}\n control={control}\n dispatch={page.dispatch}\n />\n ))}\n </div>\n )}\n {/* KEYED BY THE DIAGRAM ITSELF, so scrubbing replaces the NODE.\n Every mermaid host marks what it has rendered (`data-processed`) and\n skips those nodes. React, updating in place, rewrites only the TEXT —\n the attribute survives, the host skips it forever, and from the second\n frame on the reader sees mermaid source instead of a picture. Found by\n dragging the timeline.\n\n A key derived from the content makes React unmount and remount, so the\n host meets a genuinely new node. One line, and it removes the trap for\n every host rather than documenting it for each. */}\n {showDiagram ? (\n <pre key={task.diagram} className=\"mermaid tea-lv-mermaid\">\n {task.diagram}\n </pre>\n ) : null}\n </>\n );\n\n if (!expanded) {\n return (\n /* The chip row above already says `task = state` for every task in the\n phase. A collapsed disclosure that repeats it lists each task twice,\n adjacent — which reads as a bug and was one, found by rendering a real\n eight-task phase rather than by any assertion. So the summary says what\n the chip cannot: that there is more here, and whether it has begun. */\n <details\n className=\"tea-lv-task tea-lv-collapsed\"\n data-task={task.task}\n onToggle={(e) => setOpened(e.currentTarget.open)}\n >\n <summary>\n <b>{task.task}</b>\n <Sep />\n <span className=\"tea-lv-muted\">\n {/* NOT \"not started\" beside a chip reading `epic_4195 = review`.\n Both were true — that chart's `initial` IS `review` — and on\n screen they contradicted each other. What `moved` actually\n knows is whether the task has left where it began, so that is\n what it says. */}\n {task.moved ? \"details\" : `still at ${task.state}`}\n </span>\n </summary>\n {body}\n </details>\n );\n }\n\n return (\n <div className=\"tea-lv-task\" data-task={task.task} data-expanded=\"true\">\n <h4 className=\"tea-lv-taskh\">\n <b>{task.task}</b> — <span className=\"tea-lv-state\">{task.state}</span>\n {task.endPolarity === \"error\" ? (\n <>\n {\" \"}\n <span className=\"tea-lv-badge\">tripped</span>\n </>\n ) : null}\n {task.was === undefined ? null : (\n <span className=\"tea-lv-muted\"> · resumes to {task.was}</span>\n )}\n </h4>\n {body}\n </div>\n );\n}\n\nfunction Budget({ task }: { readonly task: LaneTaskView }) {\n if (\"answerable\" in task.budget) {\n return (\n <p\n className=\"tea-lv-unavailable\"\n data-unavailable={task.budget.question}\n title={task.budget.why}\n >\n retries: not available — {task.budget.why}\n </p>\n );\n }\n // `0/2` is noise and `2/2` is the difference between \"in review\" and \"one FAIL\n // from frozen\" — `report.ts`'s rule, and the same one applies on a screen.\n if (task.budget.retries === 0) return null;\n return (\n <p className=\"tea-lv-retries\" data-retries={task.budget.retries}>\n retries: {task.budget.retries}/{task.budget.maxRetries}\n {task.budget.retries >= task.budget.maxRetries ? \" — spent\" : \"\"}\n </p>\n );\n}\n\n/**\n * One control. An unavailable one keeps its shape and loses its affordance, and\n * the REASON is the content — never a missing button.\n */\nfunction Control({\n control,\n dispatch,\n}: {\n readonly control: LaneControl;\n readonly dispatch: Dispatch;\n}) {\n const unsendable = \"answerable\" in control.send;\n const msg = unsendable ? undefined : control.send;\n const why = unsendable\n ? (control.send as Unanswerable<\"dispatch\">).why\n : undefined;\n const blocked = \"blocked\" in dispatch ? dispatch.blocked : undefined;\n const sendable = msg !== undefined && blocked === undefined;\n return (\n <div\n className={`tea-lv-ev tea-lv-ev-${control.kind}`}\n data-event={control.event}\n data-task={control.task}\n data-status={control.refused ? \"refused\" : \"legal\"}\n data-sendable={String(sendable)}\n >\n <button\n type=\"button\"\n className=\"tea-lv-btn\"\n disabled={!sendable}\n title={control.why ?? why ?? blocked ?? control.outcome}\n onClick={() => {\n if (msg !== undefined && \"send\" in dispatch) dispatch.send(msg);\n }}\n >\n {control.event}\n </button>\n <span className=\"tea-lv-to\">\n {control.refused ? control.why : control.outcome}\n </span>\n {/* The source-level reason is NOT repeated here — it is stated once above\n every control it explains (see the header). It stays on this button's\n `title`, so the affordance is never silently missing.\n\n A REFUSED control is different and keeps its own reason inline as its\n content: the CHART refused this one, so it is specific to this control\n rather than a fact about the source, and which source is looking at it\n is beside the point. */}\n </div>\n );\n}\n\nfunction TimelinePanel({\n view,\n onScrub,\n onLive,\n onReset,\n}: {\n readonly view: LaneViewModel;\n readonly onScrub: (n: number) => void;\n readonly onLive: () => void;\n readonly onReset: (() => void) | undefined;\n}) {\n const clockless = \"answerable\" in view.clock;\n return (\n <section className=\"tea-lv-panel tea-lv-travel\">\n <h3 className=\"tea-lv-h\">\n 3 · what happened, step by step\n <Sep />\n <span className=\"tea-lv-hint\">\n drag to rewind — everything above moves with it\n </span>\n </h3>\n <div className=\"tea-lv-scrub\">\n <input\n type=\"range\"\n min={0}\n max={view.total}\n value={view.cursor}\n aria-label=\"step\"\n onChange={(e) => onScrub(Number(e.target.value))}\n />\n <span className=\"tea-lv-step\">\n {view.cursor} / {view.total}\n </span>\n <button type=\"button\" onClick={onLive} disabled={!view.scrubbed}>\n now\n </button>\n {onReset === undefined ? null : (\n <button type=\"button\" onClick={onReset}>\n reset\n </button>\n )}\n </div>\n {clockless ? (\n <p\n className=\"tea-lv-unavailable\"\n data-unavailable=\"clock\"\n title={(view.clock as Unanswerable<\"clock\">).why}\n >\n when: not available — {(view.clock as Unanswerable<\"clock\">).why}\n </p>\n ) : null}\n {view.steps.length === 0 ? (\n <p className=\"tea-lv-none\">\n no steps yet — every task is where it booted\n </p>\n ) : (\n <table className=\"tea-lv-steps\">\n <thead>\n <tr>\n <th>#</th>\n {clockless ? null : <th>at</th>}\n <th>task</th>\n <th>event</th>\n <th>from → to</th>\n </tr>\n </thead>\n <tbody>\n {view.steps.map((step) => (\n <tr\n key={step.index}\n data-step={step.index}\n data-refused={step.refused ? \"true\" : undefined}\n >\n <td>{step.index + 1}</td>\n {clockless ? null : (\n <td>{(view.clock as readonly string[])[step.index]}</td>\n )}\n <td>{step.task}</td>\n <td>{step.event}</td>\n {/* A REFUSED MSG IS A STEP AND NOT A WALK. The chart is total,\n so an event nothing routes still lands, still counts and\n still gets a row — and rendered as `review → review` it was\n indistinguishable from a self-loop the chart actually\n declares. It never moved; the row says so. */}\n <td>\n {step.refused ? (\n <>{step.from} — refused, nothing moved</>\n ) : (\n <>\n {step.from} → {step.to}\n </>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </section>\n );\n}\n\n// ── helpers ───────────────────────────────────────────────────────────────\n\n/** A lane run state's regions, read back off whatever shape `replay` returned. */\nfunction regionsOf(\n state: unknown,\n fallback: Readonly<Record<string, RunningLeaf>>,\n): Readonly<Record<string, RunningLeaf>> {\n if (typeof state !== \"object\" || state === null) return fallback;\n const regions = (state as { regions?: unknown }).regions;\n return typeof regions === \"object\" && regions !== null\n ? (regions as Readonly<Record<string, RunningLeaf>>)\n : fallback;\n}\n\n/** The recorder's tape. `dump()` throws before the boot observe has fired. */\nfunction safeDump<S, M extends { type: string }>(\n rec: Recorder<S, M>,\n live: S,\n): Trace<S, M> {\n try {\n return rec.dump();\n } catch {\n return { loaded: null, msgs: [], finalState: live };\n }\n}\n\n/**\n * The lane after the first `n` recorded msgs, by PURE replay — `init` +\n * `update` only, never `interpret`, so scrubbing backwards re-derives history\n * rather than re-performing it.\n */\nfunction replayPrefix<S, M extends { type: string }, K extends Cmd, Ctx>(\n machine: Machine<S, M, K, Sub<never>, Ctx>,\n trace: Trace<S, M>,\n ctx: Ctx,\n n: number,\n live: S,\n): S {\n try {\n return replay(machine, {\n msgs: trace.msgs.slice(0, n),\n ctx,\n loaded: trace.loaded,\n }).state;\n } catch {\n return live;\n }\n}\n"]}
@@ -0,0 +1,498 @@
1
+ /*
2
+ * @demlik/tea/chart/lane — visual defaults for <LaneView> / <LiveLaneView>.
3
+ *
4
+ * Same strategy as `@demlik/tea/chart/inspect/styles.css`, deliberately: every
5
+ * class is prefixed (here `.tea-lv-*`) so it cannot collide with host styles,
6
+ * and every colour is a consumer design token (shadcn slots + Radix accents) so
7
+ * the page inherits whatever theme is active. Override by re-declaring the
8
+ * --tea-lv-* vars on .tea-lv, or pass your own `className`.
9
+ *
10
+ * STANDALONE. Unlike the chart inspector's sheet, this one is not a companion
11
+ * to devtools' — the lane page renders no devtools component. One import.
12
+ *
13
+ * ONE DECLARATION PER SELECTOR, and it is a rule rather than a preference.
14
+ * This file was written in two passes — colour first, then a "SHAPE" block that
15
+ * re-declared `.tea-lv`, `.tea-lv-head`, `.tea-lv-panel`, `.tea-lv-stuck`,
16
+ * `.tea-lv-mermaid`, `.tea-lv-steps` and others wholesale, with `.tea-lv-btn`
17
+ * appearing five times. Half the first pass was dead by cascade, which means
18
+ * half of any edit to it did nothing and the only way to find out was to look.
19
+ * Every selector below appears once, in the order the page reads.
20
+ *
21
+ * The palette says the two things the page is FOR:
22
+ *
23
+ * standing complete → --teal-11 a phase that is behind us
24
+ * active → --foreground the one that is running, and reads loudest
25
+ * tripped → --crimson-11 the phase that ends the lane
26
+ * waiting → --muted-foreground it has not started, and says so quietly
27
+ *
28
+ * unavailable --muted-foreground, italic, ALWAYS with its reason as text.
29
+ * Never `display: none`: a control that cannot be sent keeps its
30
+ * shape and loses its affordance, so the reader sees a thing that
31
+ * is off rather than a thing that is missing.
32
+ */
33
+
34
+ .tea-lv {
35
+ /*
36
+ * EVERY TOKEN HAS A FALLBACK, and that is not a detail.
37
+ *
38
+ * These slots are shadcn's and Radix's, which is right for a consumer that
39
+ * has them — the page then wears whatever theme is already on. But a
40
+ * consumer that does NOT have them used to get a sheet where every colour
41
+ * resolved to nothing: unstyled text, no borders, no hierarchy. Rendering
42
+ * this page in a bare harness is what showed it, and it would have shipped.
43
+ *
44
+ * So each `var()` carries a default that stands on its own. The package is
45
+ * usable with no design system at all, better with one, and nobody has to
46
+ * adopt ours to read a lane.
47
+ */
48
+ --tea-lv-fg: var(--foreground, #e6edf3);
49
+ --tea-lv-muted: var(--muted-foreground, #8b949e);
50
+ --tea-lv-border: var(--border, #30363d);
51
+ --tea-lv-bg: var(--card, #0d1117);
52
+ --tea-lv-raised: var(--muted, #161b22);
53
+ --tea-lv-accent: var(--teal-11, #2dd4bf);
54
+ --tea-lv-warn: var(--amber-11, #d29922);
55
+ --tea-lv-bad: var(--crimson-11, #f85149);
56
+ --tea-lv-r: var(--radius, 6px);
57
+
58
+ font-family: var(
59
+ --font-mono,
60
+ "JetBrains Mono",
61
+ ui-monospace,
62
+ "SF Mono",
63
+ Menlo,
64
+ Consolas,
65
+ monospace
66
+ );
67
+ font-size: 12px;
68
+ line-height: 1.55;
69
+ color: var(--tea-lv-fg);
70
+ background: var(--tea-lv-bg);
71
+ border: 1px solid var(--tea-lv-border);
72
+ border-radius: var(--tea-lv-r);
73
+ padding: 1.25rem;
74
+ display: flex;
75
+ flex-direction: column;
76
+ /* Room between the answers: the page is a stack of them, and where one ends
77
+ * has to be visible without reading. */
78
+ gap: 1.6rem;
79
+ }
80
+
81
+ .tea-lv-boot {
82
+ color: var(--tea-lv-muted);
83
+ font-style: italic;
84
+ padding: 16px;
85
+ }
86
+
87
+ /* The separator between two inline spans. It is in the MARKUP because it has
88
+ * to survive with no stylesheet at all — a `gap` that only this file supplies
89
+ * rendered `5674 — NO STYLESHEETreplaytrippeddone` on a bare host. Here it is
90
+ * merely quiet. */
91
+ .tea-lv-sep {
92
+ color: var(--tea-lv-border);
93
+ }
94
+
95
+ /* ── header: the lane's name, its source, and where it is — one band ─────── */
96
+ .tea-lv-head {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 0.75rem;
100
+ flex-wrap: wrap;
101
+ padding-bottom: 0.75rem;
102
+ border-bottom: 1px solid var(--tea-lv-border);
103
+ }
104
+ .tea-lv-title {
105
+ font-size: 15px;
106
+ font-weight: 700;
107
+ letter-spacing: -0.01em;
108
+ }
109
+ /* WHICH SOURCE, WHERE IT IS, AND WHAT ENDED — the pills. The page is honest
110
+ * about what it is looking at, because "no control works" reads very
111
+ * differently once you know why. */
112
+ .tea-lv-src,
113
+ .tea-lv-standing,
114
+ .tea-lv-status,
115
+ .tea-lv-badge {
116
+ font-size: 10px;
117
+ font-weight: 600;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.08em;
120
+ padding: 0.15rem 0.45rem;
121
+ border-radius: 999px;
122
+ border: 1px solid var(--tea-lv-border);
123
+ background: var(--tea-lv-raised);
124
+ color: var(--tea-lv-muted);
125
+ }
126
+ .tea-lv-src[data-source="live"] {
127
+ color: var(--tea-lv-accent);
128
+ border-color: var(--tea-lv-accent);
129
+ }
130
+ .tea-lv-now {
131
+ display: inline-flex;
132
+ gap: 6px;
133
+ align-items: center;
134
+ }
135
+ .tea-lv-phase,
136
+ .tea-lv-terminal {
137
+ font-weight: 700;
138
+ color: var(--tea-lv-fg);
139
+ }
140
+ .tea-lv-warn {
141
+ color: var(--tea-lv-warn);
142
+ }
143
+ .tea-lv-muted {
144
+ color: var(--tea-lv-muted);
145
+ }
146
+
147
+ /* ── the lede ────────────────────────────────────────────────────────────── */
148
+ /* Prose, not monospace — it is the one part of the page that is English rather
149
+ * than data, and setting it apart is what makes a reader start there instead of
150
+ * drowning in chips. */
151
+ .tea-lv-lede {
152
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
153
+ font-size: 13.5px;
154
+ line-height: 1.65;
155
+ max-width: 68ch;
156
+ margin: 0;
157
+ color: var(--tea-lv-muted);
158
+ }
159
+ .tea-lv-lede b {
160
+ color: var(--tea-lv-fg);
161
+ }
162
+
163
+ /* ── panels ─────────────────────────────────────────────────────────────── */
164
+ /* Each panel is a card, and it is as wide as the page, always. Without the
165
+ * stretch a phase whose card holds only chips shrinks to its content and sits
166
+ * centred, so two phases of one lane render at two widths and read as two
167
+ * different things. */
168
+ .tea-lv-panel {
169
+ border: 1px solid var(--tea-lv-border);
170
+ border-radius: var(--tea-lv-r);
171
+ background: var(--tea-lv-raised);
172
+ padding: 0.9rem 1rem;
173
+ align-self: stretch;
174
+ width: 100%;
175
+ min-width: 0;
176
+ box-sizing: border-box;
177
+ }
178
+ /* A heading says WHICH QUESTION its panel answers; the hint says how to read
179
+ * the answer. Numbered, so the page has an order rather than a pile. */
180
+ .tea-lv-h {
181
+ margin: 0 0 0.6rem;
182
+ font-size: 11px;
183
+ font-weight: 600;
184
+ text-transform: uppercase;
185
+ letter-spacing: 0.09em;
186
+ color: var(--tea-lv-muted);
187
+ display: flex;
188
+ align-items: center;
189
+ flex-wrap: wrap;
190
+ gap: 0.5rem;
191
+ }
192
+ .tea-lv-hint {
193
+ font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
194
+ text-transform: none;
195
+ letter-spacing: 0;
196
+ font-size: 11.5px;
197
+ opacity: 0.75;
198
+ }
199
+ .tea-lv-none {
200
+ margin: 0;
201
+ color: var(--tea-lv-muted);
202
+ font-style: italic;
203
+ }
204
+
205
+ /* ── what is stuck — the first panel, and it reads loudest, because it is why
206
+ * the page was opened ─────────────────────────────────────────────────── */
207
+ .tea-lv-stuck {
208
+ border-left: 3px solid var(--tea-lv-warn);
209
+ }
210
+ .tea-lv-stuck .tea-lv-h {
211
+ color: var(--tea-lv-warn);
212
+ }
213
+ .tea-lv-stuck:has([data-stuck]) {
214
+ border-left-color: var(--tea-lv-bad);
215
+ }
216
+ .tea-lv-stucklist {
217
+ margin: 0;
218
+ padding-left: 1.1rem;
219
+ display: flex;
220
+ flex-direction: column;
221
+ gap: 0.2rem;
222
+ }
223
+ .tea-lv-stucklist [data-stuck="budget-spent"] {
224
+ color: var(--tea-lv-warn);
225
+ }
226
+ .tea-lv-stucklist [data-stuck="tripped"],
227
+ .tea-lv-stucklist [data-stuck="dead-end"] {
228
+ color: var(--tea-lv-bad);
229
+ }
230
+ .tea-lv-tripped {
231
+ margin: 8px 0 0;
232
+ color: var(--tea-lv-bad);
233
+ }
234
+
235
+ /* ── one phase ──────────────────────────────────────────────────────────── */
236
+ .tea-lv-phase-complete .tea-lv-standing {
237
+ color: var(--tea-lv-accent);
238
+ }
239
+ .tea-lv-phase-active {
240
+ border-color: var(--tea-lv-accent);
241
+ }
242
+ .tea-lv-phase-active .tea-lv-standing {
243
+ color: var(--tea-lv-fg);
244
+ }
245
+ .tea-lv-phase-tripped {
246
+ border-color: var(--tea-lv-bad);
247
+ }
248
+ .tea-lv-phase-tripped .tea-lv-standing {
249
+ color: var(--tea-lv-bad);
250
+ }
251
+ .tea-lv-phase-waiting {
252
+ opacity: 0.75;
253
+ }
254
+ .tea-lv-phase-waiting .tea-lv-standing {
255
+ color: var(--tea-lv-muted);
256
+ }
257
+
258
+ /* Every task of the phase, at a glance — the answer to "which of twelve". */
259
+ .tea-lv-chips {
260
+ list-style: none;
261
+ margin: 0 0 0.75rem;
262
+ padding: 0;
263
+ display: flex;
264
+ flex-wrap: wrap;
265
+ gap: 0.4rem;
266
+ }
267
+ .tea-lv-chip {
268
+ padding: 0.2rem 0.5rem;
269
+ border: 1px solid var(--tea-lv-border);
270
+ border-radius: var(--tea-lv-r);
271
+ background: var(--tea-lv-bg);
272
+ color: var(--tea-lv-muted);
273
+ }
274
+ .tea-lv-chip[data-end="error"] {
275
+ border-color: var(--tea-lv-bad);
276
+ color: var(--tea-lv-bad);
277
+ }
278
+ .tea-lv-chip[data-end="true"] {
279
+ border-color: var(--tea-lv-accent);
280
+ color: var(--tea-lv-accent);
281
+ }
282
+
283
+ /* ── one task ───────────────────────────────────────────────────────────── */
284
+ .tea-lv-task {
285
+ border-top: 1px solid var(--tea-lv-border);
286
+ padding-top: 0.75rem;
287
+ margin-top: 0.75rem;
288
+ min-width: 0;
289
+ }
290
+ /* The collapsed form: a line, with the picture one click away. A comment cannot
291
+ * offer this, which is the whole reason the screen does. */
292
+ .tea-lv-collapsed > summary {
293
+ cursor: pointer;
294
+ color: var(--tea-lv-muted);
295
+ }
296
+ .tea-lv-taskh {
297
+ margin: 0 0 0.3rem;
298
+ font-size: 13px;
299
+ font-weight: 400;
300
+ }
301
+ .tea-lv-state {
302
+ color: var(--tea-lv-accent);
303
+ font-weight: 600;
304
+ }
305
+ .tea-lv-badge {
306
+ border-color: var(--tea-lv-bad);
307
+ color: var(--tea-lv-bad);
308
+ }
309
+ .tea-lv-waiting {
310
+ margin: 0.2rem 0 0.6rem;
311
+ padding: 0.45rem 0.6rem;
312
+ color: var(--tea-lv-fg);
313
+ border-left: 2px solid var(--tea-lv-accent);
314
+ background: var(--tea-lv-bg);
315
+ border-radius: 0 var(--tea-lv-r) var(--tea-lv-r) 0;
316
+ }
317
+ .tea-lv-retries {
318
+ margin: 0 0 4px;
319
+ color: var(--tea-lv-warn);
320
+ }
321
+
322
+ /* ── controls ───────────────────────────────────────────────────────────── */
323
+ /* A grid, so six events do not become six ragged columns. */
324
+ .tea-lv-controls {
325
+ display: grid;
326
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
327
+ gap: 0.5rem;
328
+ margin: 0.5rem 0 0.9rem;
329
+ }
330
+ .tea-lv-ev {
331
+ border: 1px solid var(--tea-lv-border);
332
+ border-radius: var(--tea-lv-r);
333
+ padding: 0.5rem 0.6rem;
334
+ background: var(--tea-lv-bg);
335
+ display: flex;
336
+ flex-direction: column;
337
+ gap: 0.25rem;
338
+ min-width: 0;
339
+ }
340
+ .tea-lv-ev[data-status="refused"] {
341
+ opacity: 0.62;
342
+ border-style: dashed;
343
+ }
344
+ /*
345
+ * THE THING YOU CAN CLICK LOOKS LIKE THE THING YOU CAN CLICK.
346
+ *
347
+ * It had drifted to the exact inverse: the sheet's later pass set `border: 0;
348
+ * background: none` on every `.tea-lv-btn`, so the two live events rendered as
349
+ * plain text while the four dead ones kept a dotted box from the earlier pass.
350
+ * The only affordances on the page looked like labels. So the button is a
351
+ * button while it can be pressed, and loses the chrome — not the text, never
352
+ * the text — when it cannot.
353
+ */
354
+ .tea-lv-btn {
355
+ font: inherit;
356
+ font-weight: 700;
357
+ text-align: left;
358
+ padding: 0.2rem 0.5rem;
359
+ border: 1px solid var(--tea-lv-border);
360
+ border-radius: var(--tea-lv-r);
361
+ background: var(--tea-lv-raised);
362
+ color: var(--tea-lv-fg);
363
+ cursor: pointer;
364
+ }
365
+ .tea-lv-ev[data-sendable="true"] .tea-lv-btn {
366
+ border-color: var(--tea-lv-accent);
367
+ color: var(--tea-lv-accent);
368
+ }
369
+ .tea-lv-btn:hover:not(:disabled) {
370
+ border-color: var(--tea-lv-accent);
371
+ color: var(--tea-lv-accent);
372
+ }
373
+ .tea-lv-btn:disabled {
374
+ cursor: not-allowed;
375
+ padding-left: 0;
376
+ border-color: transparent;
377
+ background: none;
378
+ color: var(--tea-lv-muted);
379
+ }
380
+ .tea-lv-to {
381
+ color: var(--tea-lv-muted);
382
+ }
383
+ /* The refusal palette, identical to the chart inspector's, because it is the
384
+ * same fact: a refused event keeps its shape and loses its affordance. */
385
+ .tea-lv-ev-end .tea-lv-btn,
386
+ .tea-lv-ev-undeclared .tea-lv-btn {
387
+ color: var(--tea-lv-bad);
388
+ text-decoration: line-through;
389
+ }
390
+ .tea-lv-ev-ignored .tea-lv-btn {
391
+ color: var(--tea-lv-warn);
392
+ text-decoration: line-through;
393
+ }
394
+ .tea-lv-ev-out-of-scope .tea-lv-btn,
395
+ .tea-lv-ev-no-edge .tea-lv-btn {
396
+ color: var(--tea-lv-muted);
397
+ text-decoration: line-through;
398
+ }
399
+ /* The folded control wall. Quiet by default: on a lane read from a log it is
400
+ * reference material, not the story. */
401
+ .tea-lv-accepts > summary {
402
+ cursor: pointer;
403
+ color: var(--tea-lv-muted);
404
+ font-size: 11px;
405
+ margin: 0.35rem 0;
406
+ }
407
+ .tea-lv-accepts[open] > summary {
408
+ margin-bottom: 0.6rem;
409
+ }
410
+
411
+ /* WHY IT IS NOT ON OFFER — text, never a hidden element. */
412
+ .tea-lv-unavailable {
413
+ margin: 0;
414
+ color: var(--tea-lv-muted);
415
+ font-style: italic;
416
+ }
417
+
418
+ /* ── the diagram: give it air, and let a wide one scroll rather than overflow */
419
+ .tea-lv-mermaid {
420
+ margin: 0;
421
+ padding: 0.75rem;
422
+ border: 1px solid var(--tea-lv-border);
423
+ border-radius: var(--tea-lv-r);
424
+ background: var(--tea-lv-bg);
425
+ color: var(--tea-lv-muted);
426
+ line-height: 1.5;
427
+ overflow-x: auto;
428
+ }
429
+
430
+ /* ── the timeline and its scrubber ──────────────────────────────────────── */
431
+ .tea-lv-travel {
432
+ display: flex;
433
+ align-items: center;
434
+ gap: 0.75rem;
435
+ flex-wrap: wrap;
436
+ }
437
+ .tea-lv-scrub {
438
+ flex: 1 1 260px;
439
+ display: flex;
440
+ align-items: center;
441
+ gap: 10px;
442
+ flex-wrap: wrap;
443
+ accent-color: var(--tea-lv-accent);
444
+ }
445
+ .tea-lv-scrub input[type="range"] {
446
+ flex: 1 1 160px;
447
+ min-width: 120px;
448
+ accent-color: var(--tea-lv-accent);
449
+ }
450
+ .tea-lv-step {
451
+ color: var(--tea-lv-muted);
452
+ white-space: nowrap;
453
+ }
454
+ .tea-lv-scrub button {
455
+ font: inherit;
456
+ padding: 2px 10px;
457
+ border: 1px solid var(--tea-lv-border);
458
+ border-radius: var(--tea-lv-r);
459
+ background: transparent;
460
+ color: var(--tea-lv-fg);
461
+ cursor: pointer;
462
+ }
463
+ .tea-lv-scrub button:disabled {
464
+ cursor: not-allowed;
465
+ opacity: 0.5;
466
+ }
467
+ /* A long lane's table scrolls inside the card, not the page. */
468
+ .tea-lv-steps {
469
+ width: 100%;
470
+ border-collapse: collapse;
471
+ display: block;
472
+ overflow-x: auto;
473
+ max-height: 280px;
474
+ overflow-y: auto;
475
+ }
476
+ .tea-lv-steps th,
477
+ .tea-lv-steps td {
478
+ text-align: left;
479
+ padding: 0.25rem 0.6rem 0.25rem 0;
480
+ border-bottom: 1px solid var(--tea-lv-border);
481
+ white-space: nowrap;
482
+ color: var(--tea-lv-muted);
483
+ }
484
+ .tea-lv-steps th {
485
+ font-weight: 400;
486
+ font-size: 10px;
487
+ text-transform: uppercase;
488
+ letter-spacing: 0.08em;
489
+ }
490
+ .tea-lv-steps td:first-child {
491
+ color: var(--tea-lv-fg);
492
+ }
493
+ /* A msg the chart routed nowhere is a step and not a walk — the row says so in
494
+ * words, and reads as the non-event it was. */
495
+ .tea-lv-steps tr[data-refused] td {
496
+ font-style: italic;
497
+ opacity: 0.7;
498
+ }