@osolmaz/pi-workflows 0.15.2 → 0.16.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 (124) hide show
  1. package/README.md +6 -6
  2. package/dist/client/activity.d.ts +2 -0
  3. package/dist/client/activity.js +6 -0
  4. package/dist/client/activity.js.map +1 -0
  5. package/dist/client/client.d.ts +101 -0
  6. package/dist/client/client.js +733 -0
  7. package/dist/client/client.js.map +1 -0
  8. package/dist/client/index.d.ts +3 -0
  9. package/dist/client/index.js +3 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/materialize.d.ts +7 -0
  12. package/dist/client/materialize.js +177 -0
  13. package/dist/client/materialize.js.map +1 -0
  14. package/dist/client/protocol.d.ts +60 -0
  15. package/dist/client/protocol.js +269 -0
  16. package/dist/client/protocol.js.map +1 -0
  17. package/dist/client/resolver.d.ts +23 -0
  18. package/dist/client/resolver.js +2 -0
  19. package/dist/client/resolver.js.map +1 -0
  20. package/dist/client/view.d.ts +118 -0
  21. package/dist/client/view.js +3 -0
  22. package/dist/client/view.js.map +1 -0
  23. package/dist/controllers/sqlite.d.ts +64 -0
  24. package/dist/controllers/sqlite.js +219 -3
  25. package/dist/controllers/sqlite.js.map +1 -1
  26. package/dist/extension/index.d.ts +1 -0
  27. package/dist/extension/index.js +384 -156
  28. package/dist/extension/index.js.map +1 -1
  29. package/dist/extension/session-delivery.d.ts +6 -0
  30. package/dist/extension/session-delivery.js +80 -25
  31. package/dist/extension/session-delivery.js.map +1 -1
  32. package/dist/extension/session-view.d.ts +21 -0
  33. package/dist/extension/session-view.js +127 -0
  34. package/dist/extension/session-view.js.map +1 -0
  35. package/dist/extension/widget.d.ts +2 -1
  36. package/dist/extension/widget.js +15 -7
  37. package/dist/extension/widget.js.map +1 -1
  38. package/dist/host/child-worker-supervisor.js +1 -1
  39. package/dist/host/child-worker-supervisor.js.map +1 -1
  40. package/dist/host/resolver-entry.d.ts +2 -23
  41. package/dist/host/resolver-entry.js +1 -1
  42. package/dist/host/resolver-entry.js.map +1 -1
  43. package/dist/host/runner.d.ts +12 -0
  44. package/dist/host/runner.js +565 -43
  45. package/dist/host/runner.js.map +1 -1
  46. package/dist/host/state.d.ts +8 -3
  47. package/dist/host/state.js +59 -27
  48. package/dist/host/state.js.map +1 -1
  49. package/dist/host/view.d.ts +73 -0
  50. package/dist/host/view.js +871 -0
  51. package/dist/host/view.js.map +1 -0
  52. package/dist/host/worker-protocol.js +1 -1
  53. package/dist/host/worker-protocol.js.map +1 -1
  54. package/dist/state/database.d.ts +1 -0
  55. package/dist/state/database.js +15 -0
  56. package/dist/state/database.js.map +1 -1
  57. package/dist/state/prune.d.ts +3 -1
  58. package/dist/state/prune.js +6 -8
  59. package/dist/state/prune.js.map +1 -1
  60. package/dist/state/schema.js +12 -1
  61. package/dist/state/schema.js.map +1 -1
  62. package/dist/viewer/backup.d.ts +2 -0
  63. package/dist/viewer/backup.js +28 -0
  64. package/dist/viewer/backup.js.map +1 -0
  65. package/dist/viewer/cli.d.ts +4 -0
  66. package/dist/viewer/cli.js +150 -170
  67. package/dist/viewer/cli.js.map +1 -1
  68. package/dist/viewer/tui.d.ts +5 -7
  69. package/dist/viewer/tui.js +188 -108
  70. package/dist/viewer/tui.js.map +1 -1
  71. package/dist/workflows/store.d.ts +62 -1
  72. package/dist/workflows/store.js +350 -44
  73. package/dist/workflows/store.js.map +1 -1
  74. package/docs/2026-09-01-restore-session-delivery-controls-plan.md +139 -0
  75. package/docs/2026-09-01-unified-workflow-client-plan.md +381 -0
  76. package/docs/2026-09-02-installed-live-e2e-plan.md +225 -0
  77. package/docs/SQLITE_STATE.md +13 -11
  78. package/docs/WORKFLOW_HOST.md +81 -64
  79. package/docs/WORKFLOW_STEP_MESSAGES.md +4 -4
  80. package/docs/development.md +2 -1
  81. package/docs/live-replay-protocol.md +70 -132
  82. package/docs/tui-viewer.md +10 -14
  83. package/docs/workflows.md +56 -3
  84. package/herdr-plugin.toml +1 -1
  85. package/package.json +9 -3
  86. package/protocol/client.v1.schema.json +137 -0
  87. package/protocol/fixtures/client-v1.json +23 -0
  88. package/src/client/activity.ts +6 -0
  89. package/src/client/client.ts +935 -0
  90. package/src/client/index.ts +24 -0
  91. package/src/client/materialize.ts +228 -0
  92. package/src/client/protocol.ts +327 -0
  93. package/src/client/resolver.ts +26 -0
  94. package/src/client/view.ts +138 -0
  95. package/src/controllers/sqlite.ts +342 -3
  96. package/src/extension/index.ts +482 -171
  97. package/src/extension/session-delivery.ts +88 -25
  98. package/src/extension/session-view.ts +154 -0
  99. package/src/extension/widget.ts +18 -9
  100. package/src/host/child-worker-supervisor.ts +1 -1
  101. package/src/host/resolver-entry.ts +11 -26
  102. package/src/host/runner.ts +749 -75
  103. package/src/host/state.ts +82 -44
  104. package/src/host/view.ts +1084 -0
  105. package/src/host/worker-protocol.ts +1 -1
  106. package/src/state/database.ts +13 -0
  107. package/src/state/prune.ts +11 -11
  108. package/src/state/schema.ts +12 -1
  109. package/src/viewer/backup.ts +29 -0
  110. package/src/viewer/cli.ts +171 -185
  111. package/src/viewer/tui.ts +196 -124
  112. package/src/workflows/store.ts +500 -45
  113. package/dist/host/client.d.ts +0 -48
  114. package/dist/host/client.js +0 -216
  115. package/dist/host/client.js.map +0 -1
  116. package/dist/host/protocol.d.ts +0 -38
  117. package/dist/host/protocol.js +0 -156
  118. package/dist/host/protocol.js.map +0 -1
  119. package/dist/viewer/watch.d.ts +0 -6
  120. package/dist/viewer/watch.js +0 -46
  121. package/dist/viewer/watch.js.map +0 -1
  122. package/src/host/client.ts +0 -293
  123. package/src/host/protocol.ts +0 -196
  124. package/src/viewer/watch.ts +0 -51
@@ -1,142 +1,222 @@
1
- import { WorkflowRunStore } from "../workflows/store.js";
2
- import { maxDetailScroll, renderRunDetailLines, renderRunListLines, } from "./render.js";
3
- import { watchStateDatabase } from "./watch.js";
1
+ import { materializeRunView } from "../client/materialize.js";
2
+ import { sanitizeText } from "../render/ansi.js";
4
3
  const ALT_SCREEN_ON = "\u001b[?1049h\u001b[?25l";
5
4
  const ALT_SCREEN_OFF = "\u001b[?25h\u001b[?1049l";
6
5
  const CLEAR = "\u001b[2J\u001b[H";
7
- function viewportSize() {
8
- return {
9
- width: process.stdout.columns ?? 80,
10
- height: process.stdout.rows ?? 24,
11
- };
12
- }
13
- /**
14
- * Interactive live viewer. Watches the SQLite database and re-renders after
15
- * committed run changes. Returns when the user quits.
16
- */
6
+ /** Interactive client view. All durable reads stay in the workflow host. */
17
7
  export async function runViewer(options) {
18
- const store = new WorkflowRunStore(options.databasePath, { readOnly: true });
19
- let mode = { view: "list" };
20
- let bundles = [];
21
- let selectedIndex = 0;
22
- let detailScroll = 0;
23
- /** Replay position; null follows the latest step live. */
24
- let selectedStep = null;
25
- let detailStepCount = 0;
26
- if (options.runId) {
27
- bundles = store.listRuns();
28
- const match = bundles.find((bundle) => bundle.state.runId === options.runId);
29
- if (!match) {
30
- throw new Error(`Run not found: ${options.runId}`);
31
- }
32
- mode = { view: "detail", runId: match.runId };
33
- }
34
- const draw = async () => {
35
- bundles = store.listRuns();
36
- selectedIndex = Math.min(selectedIndex, Math.max(0, bundles.length - 1));
37
- const size = viewportSize();
38
- const lines = mode.view === "list"
39
- ? renderRunListLines(bundles, selectedIndex, size)
40
- : await renderDetail(mode.runId, size);
41
- process.stdout.write(CLEAR + lines.join("\n"));
8
+ let value = options.runId === undefined ? [] : null;
9
+ let selected = 0;
10
+ let scroll = 0;
11
+ let mode = options.runId === undefined ? "runs" : "run";
12
+ let unsubscribe;
13
+ let runMaterializationGeneration = 0;
14
+ const draw = () => {
15
+ const width = process.stdout.columns ?? 100;
16
+ const height = Math.max(1, (process.stdout.rows ?? 24) - 1);
17
+ const lines = renderClientView(value, width, height, mode === "runs" ? selected : undefined, scroll);
18
+ process.stdout.write(`${CLEAR}${lines.join("\n")}`);
42
19
  };
43
- const renderDetail = async (runId, size) => {
44
- const bundle = store.readRun(runId, { includeTrace: true });
45
- if (!bundle) {
46
- return ["SQLite run state disappeared. Press q to go back."];
47
- }
48
- detailStepCount = bundle.state.steps.length;
49
- if (selectedStep !== null && selectedStep >= detailStepCount - 1) {
50
- // Scrubbed to (or past) the end: snap back to following live updates.
51
- selectedStep = null;
52
- }
53
- detailScroll = Math.min(detailScroll, maxDetailScroll(bundle, size, selectedStep));
54
- return renderRunDetailLines(bundle, size, new Date(), detailScroll, selectedStep);
20
+ const watchRuns = async () => {
21
+ runMaterializationGeneration += 1;
22
+ await unsubscribe?.();
23
+ mode = "runs";
24
+ scroll = 0;
25
+ unsubscribe = await options.client.watchRuns((event) => {
26
+ value = event.payload;
27
+ selected = Math.min(selected, Math.max(0, arrayLength(value) - 1));
28
+ draw();
29
+ });
30
+ };
31
+ const watchRun = async (runId) => {
32
+ runMaterializationGeneration += 1;
33
+ await unsubscribe?.();
34
+ mode = "run";
35
+ scroll = 0;
36
+ unsubscribe = await options.client.watchRun(runId, (event) => {
37
+ const generation = ++runMaterializationGeneration;
38
+ value = event.payload;
39
+ draw();
40
+ void materializeRunView(options.client, event.payload)
41
+ .then((materialized) => {
42
+ if (generation !== runMaterializationGeneration || mode !== "run")
43
+ return;
44
+ value = materialized;
45
+ draw();
46
+ })
47
+ .catch(() => {
48
+ // A newer revision event retries the complete view from its own stable snapshot.
49
+ });
50
+ });
55
51
  };
56
52
  process.stdout.write(ALT_SCREEN_ON);
57
- const stopWatching = watchStateDatabase(options.databasePath, () => {
58
- void draw();
59
- });
60
- const ticker = setInterval(() => {
61
- void draw();
62
- }, options.tickMs ?? 1_000);
63
53
  const rawModeSupported = process.stdin.isTTY === true;
64
- if (rawModeSupported) {
65
- process.stdin.setRawMode(true);
66
- }
67
- process.stdin.resume();
68
54
  try {
55
+ if (options.runId === undefined)
56
+ await watchRuns();
57
+ else
58
+ await watchRun(options.runId);
59
+ draw();
60
+ if (rawModeSupported)
61
+ process.stdin.setRawMode(true);
62
+ process.stdin.resume();
69
63
  await new Promise((resolve) => {
70
64
  const onKey = (data) => {
71
65
  const key = data.toString("utf8");
72
- if (key === "q" || key === "\u0003" || key === "\u001b") {
73
- if (mode.view === "detail" && key === "q") {
74
- mode = { view: "list" };
75
- void draw();
76
- return;
77
- }
66
+ if (key === "\u0003" || key === "\u001b") {
78
67
  resolve();
79
68
  return;
80
69
  }
81
- handleNavigationKey(key);
82
- };
83
- const handleNavigationKey = (key) => {
84
- if (mode.view !== "list") {
85
- if (key === "r") {
86
- void draw();
87
- }
88
- else if (key === "\u001b[A" || key === "k") {
89
- detailScroll = Math.max(0, detailScroll - 1);
90
- void draw();
70
+ if (key === "q") {
71
+ if (mode === "run" && options.runId === undefined)
72
+ void watchRuns();
73
+ else
74
+ resolve();
75
+ return;
76
+ }
77
+ if (mode === "run") {
78
+ const page = Math.max(1, (process.stdout.rows ?? 24) - 2);
79
+ if (key === "\u001b[A" || key === "k") {
80
+ scroll = Math.max(0, scroll - 1);
81
+ draw();
91
82
  }
92
83
  else if (key === "\u001b[B" || key === "j") {
93
- // Clamped against the content height in renderDetail.
94
- detailScroll += 1;
95
- void draw();
84
+ scroll += 1;
85
+ draw();
96
86
  }
97
- else if (key === "\u001b[D" || key === "h") {
98
- const current = selectedStep ?? detailStepCount - 1;
99
- selectedStep = Math.max(0, current - 1);
100
- void draw();
87
+ else if (key === "\u001b[5~") {
88
+ scroll = Math.max(0, scroll - page);
89
+ draw();
101
90
  }
102
- else if (key === "\u001b[C" || key === "l") {
103
- // renderDetail snaps back to live once this reaches the end.
104
- selectedStep = selectedStep === null ? null : selectedStep + 1;
105
- void draw();
91
+ else if (key === "\u001b[6~") {
92
+ scroll += page;
93
+ draw();
106
94
  }
107
- return;
108
- }
109
- if (key === "\u001b[A" || key === "k") {
110
- selectedIndex = Math.max(0, selectedIndex - 1);
111
- void draw();
112
95
  }
113
- else if (key === "\u001b[B" || key === "j") {
114
- selectedIndex = Math.min(Math.max(0, bundles.length - 1), selectedIndex + 1);
115
- void draw();
116
- }
117
- else if (key === "\r" || key === "\n") {
118
- const selected = bundles[selectedIndex];
119
- if (selected) {
120
- mode = { view: "detail", runId: selected.runId };
121
- detailScroll = 0;
122
- selectedStep = null;
123
- void draw();
96
+ else if (mode === "runs") {
97
+ if (key === "\u001b[A" || key === "k") {
98
+ selected = Math.max(0, selected - 1);
99
+ draw();
100
+ }
101
+ else if (key === "\u001b[B" || key === "j") {
102
+ selected = Math.min(Math.max(0, arrayLength(value) - 1), selected + 1);
103
+ draw();
104
+ }
105
+ else if (key === "\r" || key === "\n") {
106
+ const runId = selectedRunId(value, selected);
107
+ if (runId !== undefined)
108
+ void watchRun(runId);
124
109
  }
125
110
  }
126
111
  };
127
112
  process.stdin.on("data", onKey);
128
- void draw();
129
113
  });
130
114
  }
131
115
  finally {
132
- clearInterval(ticker);
133
- stopWatching();
134
- store.close();
135
- if (rawModeSupported) {
116
+ runMaterializationGeneration += 1;
117
+ await unsubscribe?.();
118
+ if (rawModeSupported)
136
119
  process.stdin.setRawMode(false);
137
- }
138
120
  process.stdin.pause();
139
121
  process.stdout.write(ALT_SCREEN_OFF);
140
122
  }
141
123
  }
124
+ export function renderClientView(value, width, height, selected, scroll) {
125
+ if (Array.isArray(value)) {
126
+ if (value.length === 0)
127
+ return ["No workflow runs found."];
128
+ const selectedIndex = selected ?? 0;
129
+ const start = Math.min(Math.max(0, selectedIndex - height + 1), Math.max(0, value.length - height));
130
+ return value.slice(start, start + height).map((item, offset) => {
131
+ const index = start + offset;
132
+ const prefix = index === selected ? "> " : " ";
133
+ return truncate(`${prefix}${summary(item)}`, width);
134
+ });
135
+ }
136
+ const lines = renderRun(value);
137
+ const start = Math.min(scroll, Math.max(0, lines.length - height));
138
+ return lines.slice(start, start + height).map((line) => truncate(line, width));
139
+ }
140
+ function renderRun(value) {
141
+ if (!isRecord(value) || value.schema !== "pi-workflows.run-view.v1") {
142
+ return JSON.stringify(value, null, 2).split("\n");
143
+ }
144
+ const manifest = isRecord(value.manifest) ? value.manifest : {};
145
+ const state = isRecord(value.state) ? value.state : {};
146
+ const display = isRecord(value.display) ? value.display : {};
147
+ const workflowName = typeof manifest.workflowName === "string"
148
+ ? sanitizeText(manifest.workflowName)
149
+ : typeof state.workflowName === "string"
150
+ ? sanitizeText(state.workflowName)
151
+ : "unknown";
152
+ const runId = typeof value.runId === "string" ? sanitizeText(value.runId) : "unknown";
153
+ const status = typeof display.status === "string" ? display.status : "unknown";
154
+ const lines = [
155
+ `workflow ${workflowName}`,
156
+ `${statusGlyph(status)} ${sanitizeText(status)} · run ${runId}`,
157
+ ];
158
+ if (typeof display.reason === "string")
159
+ lines.push(`reason: ${sanitizeText(display.reason)}`);
160
+ const steps = Array.isArray(state.steps) ? state.steps : [];
161
+ if (steps.length > 0) {
162
+ lines.push("", "steps");
163
+ for (const step of steps) {
164
+ if (!isRecord(step))
165
+ continue;
166
+ const nodeId = typeof step.nodeId === "string" ? sanitizeText(step.nodeId) : "unknown";
167
+ const outcome = typeof step.outcome === "string" ? step.outcome : "unknown";
168
+ lines.push(` ${stepGlyph(outcome)} ${nodeId} · ${sanitizeText(outcome)}`);
169
+ }
170
+ }
171
+ if (status === "completed" && Object.hasOwn(state, "finalOutput")) {
172
+ lines.push("", `output ${JSON.stringify(state.finalOutput)}`);
173
+ }
174
+ else if (typeof state.error === "string") {
175
+ lines.push("", `error: ${sanitizeText(state.error)}`);
176
+ }
177
+ return lines;
178
+ }
179
+ function summary(value) {
180
+ if (!isRecord(value))
181
+ return JSON.stringify(value);
182
+ const status = isRecord(value.display) ? value.display.status : undefined;
183
+ const name = typeof value.workflowName === "string" ? value.workflowName : "workflow";
184
+ const runId = typeof value.runId === "string" ? value.runId : "unknown";
185
+ return `${typeof status === "string" ? sanitizeText(status) : "unknown"} ${sanitizeText(name)} ${sanitizeText(runId)}`;
186
+ }
187
+ function statusGlyph(status) {
188
+ if (status === "completed")
189
+ return "✓";
190
+ if (status === "failed" || status === "timed_out" || status === "cancelled")
191
+ return "✗";
192
+ if (status === "paused")
193
+ return "‖";
194
+ if (status === "waiting")
195
+ return "○";
196
+ if (status === "queued")
197
+ return "…";
198
+ if (status === "ambiguous")
199
+ return "!";
200
+ return "●";
201
+ }
202
+ function stepGlyph(outcome) {
203
+ return outcome === "ok" ? "✓" : outcome === "failed" || outcome === "timed_out" ? "✗" : "○";
204
+ }
205
+ function selectedRunId(value, index) {
206
+ if (!Array.isArray(value))
207
+ return undefined;
208
+ const item = value[index];
209
+ return isRecord(item) && typeof item.runId === "string" ? item.runId : undefined;
210
+ }
211
+ function arrayLength(value) {
212
+ return Array.isArray(value) ? value.length : 0;
213
+ }
214
+ function truncate(value, width) {
215
+ if (value.length <= width)
216
+ return value;
217
+ return width <= 1 ? value.slice(0, width) : `${value.slice(0, width - 1)}…`;
218
+ }
219
+ function isRecord(value) {
220
+ return typeof value === "object" && value !== null && !Array.isArray(value);
221
+ }
142
222
  //# sourceMappingURL=tui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/viewer/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/viewer/tui.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { StateDatabase } from "../state/database.js";
2
2
  import { type JsonValue } from "../state/json.js";
3
3
  import { type LeaseClaim, type MutationActor, type OwnerType } from "../state/mutation.js";
4
4
  import { type InitialWorkflowSettingsScope, type WorkflowFollowUpQueueRecord, type WorkflowFollowUpRecord, type WorkflowQueueFollowUpRequest, type WorkflowRemoveFollowUpRequest, type WorkflowSettingsChangeRequest, type WorkflowSettingsChangeResult, type WorkflowSettingsDefinition, type WorkflowSettingsScopeRecord } from "./settings.js";
5
- import type { WorkflowDefinition, WorkflowDefinitionSnapshot, WorkflowEffectRecovery, WorkflowEffectReservation, HumanDecisionRequest, ResolvedHumanDecision, WorkflowRunState, WorkflowSessionBinding, WorkflowSessionCapture, WorkflowSessionEntryRecord, WorkflowSessionEventRecord, WorkflowTraceEvent, WorkflowTraceEventDraft, WorkflowUpdateInput, WorkflowUpdateRecord } from "./types.js";
5
+ import type { WorkflowDefinition, WorkflowDefinitionSnapshot, WorkflowEffectRecovery, WorkflowEffectReservation, HumanDecisionRequest, ResolvedHumanDecision, WorkflowRunState, WorkflowStepRecord, WorkflowSessionBinding, WorkflowSessionCapture, WorkflowSessionEntryRecord, WorkflowSessionEventRecord, WorkflowTraceEvent, WorkflowTraceEventDraft, WorkflowUpdateInput, WorkflowUpdateRecord } from "./types.js";
6
6
  export declare const RUN_STATE_SCHEMA: "pi-workflows.run-state.v1";
7
7
  export declare const DEFINITION_SNAPSHOT_SCHEMA: "pi-workflows.definition-snapshot.v1";
8
8
  export declare const SESSION_BINDING_SCHEMA: "pi-workflows.session-binding.v1";
@@ -20,6 +20,11 @@ export type RunWriteAuthority = {
20
20
  /** Duration used when a protected write renews this exact live claim. */
21
21
  leaseMs?: number;
22
22
  };
23
+ export type WorkflowRunDisplayState = {
24
+ status: WorkflowRunState["status"];
25
+ paused: boolean;
26
+ error: string | null;
27
+ };
23
28
  export type WorkflowRunStoreOptions = {
24
29
  authorityProvider?: (runId: string) => RunWriteAuthority | undefined;
25
30
  /** Host-owned projection updates that must commit with each run snapshot. */
@@ -99,6 +104,44 @@ export type LoadedWorkflowRun = {
99
104
  settingsScopes?: WorkflowSettingsScopeRecord[];
100
105
  followUpQueue?: WorkflowFollowUpQueueRecord | null;
101
106
  };
107
+ export type WorkflowRunViewCounts = {
108
+ steps: number;
109
+ trace: number;
110
+ sessionEntries: number;
111
+ sessionEvents: number;
112
+ settings: number;
113
+ followUps: number;
114
+ updates: number;
115
+ };
116
+ export type WorkflowRunViewRange = {
117
+ start: number;
118
+ limit: number;
119
+ };
120
+ export type WorkflowRunViewRead = {
121
+ runId: string;
122
+ state: WorkflowRunState;
123
+ snapshot: WorkflowDefinitionSnapshot;
124
+ traceEvents: WorkflowTraceEvent[];
125
+ sessionBinding: WorkflowSessionBinding | null;
126
+ sessionEntries: WorkflowSessionEntryRecord[];
127
+ sessionEvents: WorkflowSessionEventRecord[];
128
+ sessionCapture: WorkflowSessionCapture | null;
129
+ sessionIntegrity: SessionCaptureIntegrity;
130
+ settingsScopes: WorkflowSettingsScopeRecord[];
131
+ followUpQueue: WorkflowFollowUpQueueRecord | null;
132
+ graphSteps: WorkflowStepRecord[];
133
+ takenTransitions: string[];
134
+ };
135
+ export type WorkflowRunViewReadOptions = {
136
+ steps: WorkflowRunViewRange;
137
+ trace: WorkflowRunViewRange;
138
+ sessionEntries: WorkflowRunViewRange;
139
+ sessionEvents: WorkflowRunViewRange;
140
+ settings: WorkflowRunViewRange;
141
+ followUps: WorkflowRunViewRange;
142
+ updates: WorkflowRunViewRange;
143
+ graphCursor: number;
144
+ };
102
145
  export type ReadWorkflowRunOptions = {
103
146
  includeTrace?: boolean;
104
147
  };
@@ -150,6 +193,7 @@ export declare class WorkflowRunStore {
150
193
  getSettingsScopeAtChange(scopeId: string, changeNumber: number): WorkflowSettingsScopeRecord | undefined;
151
194
  listSettingsScopes(runId: string): WorkflowSettingsScopeRecord[];
152
195
  private settingsScopesForRunView;
196
+ private readSettingsScopeRange;
153
197
  findSettingsScope(runId: string, mountPath: string, invocation: number): WorkflowSettingsScopeRecord | undefined;
154
198
  changeSettings<TSettings, TInput = unknown>(definition: WorkflowSettingsDefinition<TSettings, TInput>, request: WorkflowSettingsChangeRequest): Promise<WorkflowSettingsChangeResult>;
155
199
  queueFollowUp(request: WorkflowQueueFollowUpRequest): {
@@ -159,6 +203,7 @@ export declare class WorkflowRunStore {
159
203
  removeFollowUp(request: WorkflowRemoveFollowUpRequest): WorkflowFollowUpRecord;
160
204
  originSessionId(runId: string): string | undefined;
161
205
  readFollowUpQueue(runId: string): WorkflowFollowUpQueueRecord | undefined;
206
+ private readFollowUpQueueRange;
162
207
  listPendingPresentations(targetSessionId: string): string[];
163
208
  settleFollowUpPresentation(options: {
164
209
  runId: string;
@@ -204,6 +249,16 @@ export declare class WorkflowRunStore {
204
249
  lastEventSeq: number;
205
250
  }>;
206
251
  readRun(runId: string, options?: ReadWorkflowRunOptions): LoadedWorkflowRun | null;
252
+ readRunViewCounts(runId: string): WorkflowRunViewCounts | null;
253
+ readRunView(runId: string, options: WorkflowRunViewReadOptions): WorkflowRunViewRead | null;
254
+ traceCursorForStep(runId: string, stepCursor: number, traceTotal: number): number;
255
+ persistViewContent(runId: string, content: Buffer, mediaType: string): string;
256
+ readContentBlob(runId: string, digest: string, mediaType: string): {
257
+ mediaType: string;
258
+ content: Buffer;
259
+ } | undefined;
260
+ readDisplayState(runId: string): WorkflowRunDisplayState | null;
261
+ readSessionReplayCheckpoint(runId: string, throughSequence: number): JsonValue | null;
207
262
  listRuns(options?: ReadWorkflowRunOptions): LoadedWorkflowRun[];
208
263
  readLastTraceEvent(runId: string): WorkflowTraceEvent | null;
209
264
  private contextFor;
@@ -252,12 +307,18 @@ export declare class WorkflowRunStore {
252
307
  private readRunRow;
253
308
  private requireRunRow;
254
309
  private readRunState;
310
+ private buildRunState;
255
311
  private readSteps;
312
+ private readStepRange;
313
+ private readLatestSteps;
314
+ private readTakenTransitions;
315
+ private mapStepRows;
256
316
  private readRunSources;
257
317
  private carriedStepCount;
258
318
  private readActiveAttempt;
259
319
  private readHumanDecisionReceipt;
260
320
  private readUpdates;
321
+ private readCurrentUpdates;
261
322
  private readJsonAs;
262
323
  private readText;
263
324
  private readDefinition;