@osolmaz/pi-workflows 0.16.0 → 0.16.2

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 (175) hide show
  1. package/README.md +18 -2
  2. package/dist/channels/adapter-entry.d.ts +3 -0
  3. package/dist/channels/adapter-entry.js +203 -0
  4. package/dist/channels/adapter-entry.js.map +1 -0
  5. package/dist/channels/config.d.ts +43 -0
  6. package/dist/channels/config.js +234 -0
  7. package/dist/channels/config.js.map +1 -0
  8. package/dist/channels/protocol.d.ts +94 -0
  9. package/dist/channels/protocol.js +219 -0
  10. package/dist/channels/protocol.js.map +1 -0
  11. package/dist/channels/telegram.d.ts +46 -0
  12. package/dist/channels/telegram.js +285 -0
  13. package/dist/channels/telegram.js.map +1 -0
  14. package/dist/client/client.d.ts +1 -0
  15. package/dist/client/client.js +5 -1
  16. package/dist/client/client.js.map +1 -1
  17. package/dist/client/index.d.ts +1 -1
  18. package/dist/client/protocol.d.ts +1 -1
  19. package/dist/client/protocol.js +11 -5
  20. package/dist/client/protocol.js.map +1 -1
  21. package/dist/client/view.d.ts +48 -16
  22. package/dist/client/view.js +1 -0
  23. package/dist/client/view.js.map +1 -1
  24. package/dist/controllers/index.d.ts +1 -1
  25. package/dist/controllers/index.js.map +1 -1
  26. package/dist/controllers/sqlite.d.ts +20 -165
  27. package/dist/controllers/sqlite.js +178 -436
  28. package/dist/controllers/sqlite.js.map +1 -1
  29. package/dist/extension/index.d.ts +23 -2
  30. package/dist/extension/index.js +637 -534
  31. package/dist/extension/index.js.map +1 -1
  32. package/dist/extension/recorder.d.ts +95 -0
  33. package/dist/extension/recorder.js +530 -0
  34. package/dist/extension/recorder.js.map +1 -0
  35. package/dist/extension/remote-recorder-store.d.ts +25 -0
  36. package/dist/extension/remote-recorder-store.js +81 -0
  37. package/dist/extension/remote-recorder-store.js.map +1 -0
  38. package/dist/extension/session-events.d.ts +134 -0
  39. package/dist/extension/session-events.js +60 -0
  40. package/dist/extension/session-events.js.map +1 -0
  41. package/dist/extension/session-view.d.ts +2 -0
  42. package/dist/extension/session-view.js +60 -2
  43. package/dist/extension/session-view.js.map +1 -1
  44. package/dist/extension/step-message.d.ts +6 -4
  45. package/dist/extension/step-message.js +12 -6
  46. package/dist/extension/step-message.js.map +1 -1
  47. package/dist/extension/widget.d.ts +2 -2
  48. package/dist/extension/widget.js +28 -18
  49. package/dist/extension/widget.js.map +1 -1
  50. package/dist/extension/workflow-message-coordinator.d.ts +28 -0
  51. package/dist/extension/workflow-message-coordinator.js +346 -0
  52. package/dist/extension/workflow-message-coordinator.js.map +1 -0
  53. package/dist/host/channel-effects.d.ts +72 -0
  54. package/dist/host/channel-effects.js +271 -0
  55. package/dist/host/channel-effects.js.map +1 -0
  56. package/dist/host/channel-supervisor.d.ts +21 -0
  57. package/dist/host/channel-supervisor.js +54 -0
  58. package/dist/host/channel-supervisor.js.map +1 -0
  59. package/dist/host/runner.d.ts +50 -8
  60. package/dist/host/runner.js +1632 -341
  61. package/dist/host/runner.js.map +1 -1
  62. package/dist/host/state.d.ts +19 -16
  63. package/dist/host/state.js +251 -63
  64. package/dist/host/state.js.map +1 -1
  65. package/dist/host/view.d.ts +19 -9
  66. package/dist/host/view.js +227 -119
  67. package/dist/host/view.js.map +1 -1
  68. package/dist/host/worker-entry.d.ts +4 -1
  69. package/dist/host/worker-entry.js +23 -24
  70. package/dist/host/worker-entry.js.map +1 -1
  71. package/dist/host/worker-protocol.d.ts +15 -0
  72. package/dist/host/worker-protocol.js.map +1 -1
  73. package/dist/state/prune.js +3 -25
  74. package/dist/state/prune.js.map +1 -1
  75. package/dist/state/schema.js +76 -97
  76. package/dist/state/schema.js.map +1 -1
  77. package/dist/state/workflow-messages.d.ts +98 -0
  78. package/dist/state/workflow-messages.js +366 -0
  79. package/dist/state/workflow-messages.js.map +1 -0
  80. package/dist/viewer/render.js +1 -1
  81. package/dist/viewer/render.js.map +1 -1
  82. package/dist/viewer/tui.d.ts +1 -1
  83. package/dist/viewer/tui.js +65 -8
  84. package/dist/viewer/tui.js.map +1 -1
  85. package/dist/workflows/composition.js +0 -4
  86. package/dist/workflows/composition.js.map +1 -1
  87. package/dist/workflows/definition.js +0 -8
  88. package/dist/workflows/definition.js.map +1 -1
  89. package/dist/workflows/engine.js +4 -5
  90. package/dist/workflows/engine.js.map +1 -1
  91. package/dist/workflows/human-decision.d.ts +2 -0
  92. package/dist/workflows/human-decision.js +8 -2
  93. package/dist/workflows/human-decision.js.map +1 -1
  94. package/dist/workflows/index.d.ts +1 -1
  95. package/dist/workflows/index.js.map +1 -1
  96. package/dist/workflows/schema.js +0 -4
  97. package/dist/workflows/schema.js.map +1 -1
  98. package/dist/workflows/settings.d.ts +1 -8
  99. package/dist/workflows/settings.js.map +1 -1
  100. package/dist/workflows/store.d.ts +20 -19
  101. package/dist/workflows/store.js +163 -354
  102. package/dist/workflows/store.js.map +1 -1
  103. package/dist/workflows/tool-input.d.ts +21 -0
  104. package/dist/workflows/tool-input.js +23 -1
  105. package/dist/workflows/tool-input.js.map +1 -1
  106. package/dist/workflows/types.d.ts +6 -8
  107. package/dist/workflows/workflow-message-content.d.ts +38 -0
  108. package/dist/workflows/workflow-message-content.js +157 -0
  109. package/dist/workflows/workflow-message-content.js.map +1 -0
  110. package/docs/2026-08-18-herdr-piw-plan.md +2 -1
  111. package/docs/2026-08-20-durable-workflow-launch-plan.md +1 -1
  112. package/docs/2026-08-25-workflow-follow-ups.md +26 -50
  113. package/docs/2026-08-30-out-of-process-workflow-host-plan.md +3 -3
  114. package/docs/2026-09-01-restore-session-delivery-controls-plan.md +4 -0
  115. package/docs/2026-09-01-unified-workflow-client-plan.md +5 -1
  116. package/docs/2026-09-02-installed-live-e2e-plan.md +15 -1
  117. package/docs/2026-09-02-unify-workflow-messages-plan.md +562 -0
  118. package/docs/2026-09-04-workflow-run-state-plan.md +363 -0
  119. package/docs/DEFERRED_TURNS.md +66 -294
  120. package/docs/HUMAN_DECISIONS.md +29 -30
  121. package/docs/HUMAN_DECISION_PRESENTATIONS.md +4 -11
  122. package/docs/SQLITE_STATE.md +25 -17
  123. package/docs/WORKFLOW_HOST.md +105 -31
  124. package/docs/WORKFLOW_STEP_MESSAGES.md +166 -75
  125. package/docs/live-replay-protocol.md +8 -4
  126. package/docs/tui-viewer.md +3 -1
  127. package/docs/workflows.md +44 -28
  128. package/herdr-plugin.toml +1 -1
  129. package/package.json +1 -1
  130. package/plugins/herdr/viewer.mjs +14 -5
  131. package/src/channels/adapter-entry.ts +220 -0
  132. package/src/channels/config.ts +296 -0
  133. package/src/channels/protocol.ts +333 -0
  134. package/src/channels/telegram.ts +335 -0
  135. package/src/client/client.ts +6 -2
  136. package/src/client/index.ts +2 -1
  137. package/src/client/protocol.ts +11 -5
  138. package/src/client/view.ts +51 -18
  139. package/src/controllers/index.ts +0 -1
  140. package/src/controllers/sqlite.ts +247 -845
  141. package/src/extension/index.ts +712 -647
  142. package/src/extension/recorder.ts +687 -0
  143. package/src/extension/remote-recorder-store.ts +126 -0
  144. package/src/extension/session-events.ts +119 -0
  145. package/src/extension/session-view.ts +86 -3
  146. package/src/extension/step-message.ts +19 -9
  147. package/src/extension/widget.ts +37 -17
  148. package/src/extension/workflow-message-coordinator.ts +398 -0
  149. package/src/host/channel-effects.ts +465 -0
  150. package/src/host/channel-supervisor.ts +73 -0
  151. package/src/host/runner.ts +2163 -525
  152. package/src/host/state.ts +333 -94
  153. package/src/host/view.ts +254 -122
  154. package/src/host/worker-entry.ts +38 -30
  155. package/src/host/worker-protocol.ts +11 -0
  156. package/src/state/prune.ts +3 -31
  157. package/src/state/schema.ts +76 -97
  158. package/src/state/workflow-messages.ts +599 -0
  159. package/src/viewer/render.ts +1 -5
  160. package/src/viewer/tui.ts +71 -6
  161. package/src/workflows/composition.ts +0 -5
  162. package/src/workflows/definition.ts +0 -8
  163. package/src/workflows/engine.ts +4 -6
  164. package/src/workflows/human-decision.ts +18 -2
  165. package/src/workflows/index.ts +0 -1
  166. package/src/workflows/schema.ts +0 -6
  167. package/src/workflows/settings.ts +1 -20
  168. package/src/workflows/store.ts +237 -489
  169. package/src/workflows/tool-input.ts +36 -1
  170. package/src/workflows/types.ts +6 -8
  171. package/src/workflows/workflow-message-content.ts +197 -0
  172. package/dist/extension/decision-channels.d.ts +0 -134
  173. package/dist/extension/decision-channels.js +0 -1307
  174. package/dist/extension/decision-channels.js.map +0 -1
  175. package/src/extension/decision-channels.ts +0 -1826
@@ -0,0 +1,366 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { canonicalJson } from "./json.js";
3
+ export const WORKFLOW_MESSAGE_SCHEMA = "pi-workflows.workflow-message.v1";
4
+ export const WORKFLOW_MESSAGE_CONTENT_SCHEMA = "pi-workflows.workflow-message-content.v1";
5
+ export const WORKFLOW_TURN_SCHEMA = "pi-workflows.workflow-turn.v1";
6
+ /** Durable workflow content that the host requires Pi to add to one origin session. */
7
+ export class WorkflowMessageStore {
8
+ state;
9
+ constructor(state) {
10
+ this.state = state;
11
+ }
12
+ create(options) {
13
+ validateContent(options.content, options.kind);
14
+ const now = options.now ?? Date.now();
15
+ const workflowMessageId = options.workflowMessageId ??
16
+ workflowMessageIdFor(options.kind, options.sourceId, options.idempotencyKey);
17
+ return this.state.transaction(() => {
18
+ const existing = this.get(workflowMessageId);
19
+ if (existing !== undefined) {
20
+ assertSameMessage(existing, options);
21
+ return existing;
22
+ }
23
+ const contentHash = this.state.putJson(options.content, now);
24
+ const order = (this.state.connection
25
+ .prepare(`SELECT COALESCE(MAX(order_number), 0) AS value
26
+ FROM workflow_messages WHERE target_session_id = ?`)
27
+ .get(options.targetSessionId).value ?? 0) + 1;
28
+ this.state.connection
29
+ .prepare(`INSERT INTO workflow_messages(
30
+ workflow_message_id, run_id, target_session_id, kind, source_id, content_hash,
31
+ order_number, status, pi_session_entry_id, created_at, updated_at
32
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', NULL, ?, ?)`)
33
+ .run(workflowMessageId, options.runId, options.targetSessionId, options.kind, options.sourceId, contentHash, order, now, now);
34
+ return this.require(workflowMessageId);
35
+ });
36
+ }
37
+ get(workflowMessageId) {
38
+ const row = this.state.connection
39
+ .prepare(`SELECT workflow_message_id AS workflowMessageId, run_id AS runId,
40
+ target_session_id AS targetSessionId, kind, source_id AS sourceId,
41
+ content_hash AS contentHash, order_number AS orderNumber, status,
42
+ pi_session_entry_id AS piSessionEntryId, created_at AS createdAt,
43
+ updated_at AS updatedAt
44
+ FROM workflow_messages WHERE workflow_message_id = ?`)
45
+ .get(workflowMessageId);
46
+ return isWorkflowMessageRow(row) ? this.mapMessage(row) : undefined;
47
+ }
48
+ require(workflowMessageId) {
49
+ const message = this.get(workflowMessageId);
50
+ if (message === undefined)
51
+ throw new Error(`Workflow message not found: ${workflowMessageId}`);
52
+ return message;
53
+ }
54
+ listSession(targetSessionId) {
55
+ const rows = this.state.connection
56
+ .prepare(`SELECT workflow_message_id AS workflowMessageId, run_id AS runId,
57
+ target_session_id AS targetSessionId, kind, source_id AS sourceId,
58
+ content_hash AS contentHash, order_number AS orderNumber, status,
59
+ pi_session_entry_id AS piSessionEntryId, created_at AS createdAt,
60
+ updated_at AS updatedAt
61
+ FROM workflow_messages WHERE target_session_id = ? ORDER BY order_number`)
62
+ .all(targetSessionId);
63
+ return rows.filter(isWorkflowMessageRow).map((row) => this.mapMessage(row));
64
+ }
65
+ listRun(runId) {
66
+ const rows = this.state.connection
67
+ .prepare(`SELECT workflow_message_id AS workflowMessageId, run_id AS runId,
68
+ target_session_id AS targetSessionId, kind, source_id AS sourceId,
69
+ content_hash AS contentHash, order_number AS orderNumber, status,
70
+ pi_session_entry_id AS piSessionEntryId, created_at AS createdAt,
71
+ updated_at AS updatedAt
72
+ FROM workflow_messages WHERE run_id = ? ORDER BY target_session_id, order_number`)
73
+ .all(runId);
74
+ return rows.filter(isWorkflowMessageRow).map((row) => this.mapMessage(row));
75
+ }
76
+ latestForSource(kind, sourceId) {
77
+ const row = this.state.connection
78
+ .prepare(`SELECT workflow_message_id AS workflowMessageId, run_id AS runId,
79
+ target_session_id AS targetSessionId, kind, source_id AS sourceId,
80
+ content_hash AS contentHash, order_number AS orderNumber, status,
81
+ pi_session_entry_id AS piSessionEntryId, created_at AS createdAt,
82
+ updated_at AS updatedAt
83
+ FROM workflow_messages WHERE kind = ? AND source_id = ?
84
+ ORDER BY created_at DESC, order_number DESC LIMIT 1`)
85
+ .get(kind, sourceId);
86
+ return isWorkflowMessageRow(row) ? this.mapMessage(row) : undefined;
87
+ }
88
+ cancelPendingForSource(sourceId, kind, now = Date.now()) {
89
+ return this.state.transaction(() => this.state.connection
90
+ .prepare(`UPDATE workflow_messages SET status = 'cancelled', updated_at = ?
91
+ WHERE source_id = ? AND status = 'pending'${kind === undefined ? "" : " AND kind = ?"}`)
92
+ .run(...(kind === undefined ? [now, sourceId] : [now, sourceId, kind])).changes);
93
+ }
94
+ adoptBranch(targetSessionId, entries, allowedMessageIds, now = Date.now()) {
95
+ return this.state.transaction(() => {
96
+ const adopted = [];
97
+ for (const entry of entries) {
98
+ if (!allowedMessageIds.has(entry.workflowMessageId)) {
99
+ throw new Error(`Workflow branch report contains an unknown message: ${entry.workflowMessageId}`);
100
+ }
101
+ const current = this.require(entry.workflowMessageId);
102
+ if (current.targetSessionId !== targetSessionId) {
103
+ throw new Error("Workflow branch report targets the wrong origin session");
104
+ }
105
+ if (current.status === "sent" &&
106
+ current.piSessionEntryId !== null &&
107
+ current.piSessionEntryId !== entry.piSessionEntryId) {
108
+ throw new Error("Workflow message has conflicting Pi session entry evidence");
109
+ }
110
+ if (current.status !== "sent") {
111
+ this.state.connection
112
+ .prepare(`UPDATE workflow_messages
113
+ SET status = 'sent', pi_session_entry_id = ?, updated_at = ?
114
+ WHERE workflow_message_id = ? AND status IN ('pending', 'cancelled')`)
115
+ .run(entry.piSessionEntryId, now, entry.workflowMessageId);
116
+ }
117
+ adopted.push(this.require(entry.workflowMessageId));
118
+ }
119
+ return adopted;
120
+ });
121
+ }
122
+ startTurn(options) {
123
+ const now = options.now ?? Date.now();
124
+ const workflowTurnId = options.workflowTurnId ?? `workflow-turn-${randomUUID()}`;
125
+ return this.state.transaction(() => {
126
+ const existing = this.getTurn(workflowTurnId);
127
+ if (existing !== undefined) {
128
+ assertSameTurn(existing, options);
129
+ return existing;
130
+ }
131
+ const message = this.require(options.workflowMessageId);
132
+ if (message.runId !== options.runId || message.targetSessionId !== options.targetSessionId) {
133
+ throw new Error("Workflow turn does not match its message");
134
+ }
135
+ if (message.status !== "sent")
136
+ throw new Error("Workflow turn requires a sent message");
137
+ const open = this.openTurnForMessage(options.workflowMessageId);
138
+ if (open !== undefined) {
139
+ throw new Error(`Workflow message ${options.workflowMessageId} already has open turn ${open.workflowTurnId}`);
140
+ }
141
+ this.state.connection
142
+ .prepare(`INSERT INTO workflow_turns(
143
+ workflow_turn_id, workflow_message_id, run_id, target_session_id, state,
144
+ stop_reason, response_session_entry_id, started_at, ended_at
145
+ ) VALUES (?, ?, ?, ?, 'started', NULL, NULL, ?, NULL)`)
146
+ .run(workflowTurnId, options.workflowMessageId, options.runId, options.targetSessionId, now);
147
+ return this.requireTurn(workflowTurnId);
148
+ });
149
+ }
150
+ endTurn(options) {
151
+ const now = options.now ?? Date.now();
152
+ return this.state.transaction(() => {
153
+ const current = this.requireTurn(options.workflowTurnId);
154
+ assertSameTurn(current, options);
155
+ if (current.state === "ended") {
156
+ if (current.stopReason !== options.stopReason ||
157
+ current.responseSessionEntryId !== (options.responseSessionEntryId ?? null)) {
158
+ throw new Error("Workflow turn end report conflicts with its saved result");
159
+ }
160
+ return current;
161
+ }
162
+ const changed = this.state.connection
163
+ .prepare(`UPDATE workflow_turns SET state = 'ended', stop_reason = ?,
164
+ response_session_entry_id = ?, ended_at = ?
165
+ WHERE workflow_turn_id = ? AND workflow_message_id = ? AND state = 'started'`)
166
+ .run(options.stopReason, options.responseSessionEntryId ?? null, now, options.workflowTurnId, options.workflowMessageId);
167
+ if (changed.changes !== 1)
168
+ throw new Error("Workflow turn changed before its end report");
169
+ return this.requireTurn(options.workflowTurnId);
170
+ });
171
+ }
172
+ settleOpenTurnsForRun(runId, stopReason = "lost", now = Date.now()) {
173
+ return this.state.transaction(() => {
174
+ const open = this.state.connection
175
+ .prepare(`SELECT workflow_turn_id AS workflowTurnId, workflow_message_id AS workflowMessageId,
176
+ run_id AS runId, target_session_id AS targetSessionId, state,
177
+ stop_reason AS stopReason, response_session_entry_id AS responseSessionEntryId,
178
+ started_at AS startedAt, ended_at AS endedAt
179
+ FROM workflow_turns WHERE run_id = ? AND state = 'started' ORDER BY started_at`)
180
+ .all(runId)
181
+ .filter(isWorkflowTurnRow)
182
+ .map(mapTurn);
183
+ this.state.connection
184
+ .prepare(`UPDATE workflow_turns SET state = 'ended', stop_reason = ?, ended_at = ?
185
+ WHERE run_id = ? AND state = 'started'`)
186
+ .run(stopReason, now, runId);
187
+ return open.map((turn) => this.requireTurn(turn.workflowTurnId));
188
+ });
189
+ }
190
+ cancelPendingForRun(runId, now = Date.now(), kinds = ["step", "decision", "followUp"]) {
191
+ if (kinds.length === 0)
192
+ return 0;
193
+ return this.state.transaction(() => this.state.connection
194
+ .prepare(`UPDATE workflow_messages SET status = 'cancelled', updated_at = ?
195
+ WHERE run_id = ? AND status = 'pending'
196
+ AND kind IN (${kinds.map(() => "?").join(", ")})`)
197
+ .run(now, runId, ...kinds).changes);
198
+ }
199
+ getTurn(workflowTurnId) {
200
+ const row = this.state.connection
201
+ .prepare(`SELECT workflow_turn_id AS workflowTurnId, workflow_message_id AS workflowMessageId,
202
+ run_id AS runId, target_session_id AS targetSessionId, state,
203
+ stop_reason AS stopReason, response_session_entry_id AS responseSessionEntryId,
204
+ started_at AS startedAt, ended_at AS endedAt
205
+ FROM workflow_turns WHERE workflow_turn_id = ?`)
206
+ .get(workflowTurnId);
207
+ return isWorkflowTurnRow(row) ? mapTurn(row) : undefined;
208
+ }
209
+ requireTurn(workflowTurnId) {
210
+ const turn = this.getTurn(workflowTurnId);
211
+ if (turn === undefined)
212
+ throw new Error(`Workflow turn not found: ${workflowTurnId}`);
213
+ return turn;
214
+ }
215
+ openTurnForMessage(workflowMessageId) {
216
+ const row = this.state.connection
217
+ .prepare(`SELECT workflow_turn_id AS workflowTurnId, workflow_message_id AS workflowMessageId,
218
+ run_id AS runId, target_session_id AS targetSessionId, state,
219
+ stop_reason AS stopReason, response_session_entry_id AS responseSessionEntryId,
220
+ started_at AS startedAt, ended_at AS endedAt
221
+ FROM workflow_turns WHERE workflow_message_id = ? AND state = 'started'`)
222
+ .get(workflowMessageId);
223
+ return isWorkflowTurnRow(row) ? mapTurn(row) : undefined;
224
+ }
225
+ latestTurnForMessage(workflowMessageId) {
226
+ const row = this.state.connection
227
+ .prepare(`SELECT workflow_turn_id AS workflowTurnId, workflow_message_id AS workflowMessageId,
228
+ run_id AS runId, target_session_id AS targetSessionId, state,
229
+ stop_reason AS stopReason, response_session_entry_id AS responseSessionEntryId,
230
+ started_at AS startedAt, ended_at AS endedAt
231
+ FROM workflow_turns WHERE workflow_message_id = ?
232
+ ORDER BY started_at DESC LIMIT 1`)
233
+ .get(workflowMessageId);
234
+ return isWorkflowTurnRow(row) ? mapTurn(row) : undefined;
235
+ }
236
+ openTurnsForSession(targetSessionId) {
237
+ const rows = this.state.connection
238
+ .prepare(`SELECT workflow_turn_id AS workflowTurnId, workflow_message_id AS workflowMessageId,
239
+ run_id AS runId, target_session_id AS targetSessionId, state,
240
+ stop_reason AS stopReason, response_session_entry_id AS responseSessionEntryId,
241
+ started_at AS startedAt, ended_at AS endedAt
242
+ FROM workflow_turns WHERE target_session_id = ? AND state = 'started'
243
+ ORDER BY started_at`)
244
+ .all(targetSessionId);
245
+ return rows.filter(isWorkflowTurnRow).map(mapTurn);
246
+ }
247
+ mapMessage(row) {
248
+ const content = this.state.readJson(row.contentHash);
249
+ if (!isWorkflowMessageContent(content))
250
+ throw new Error("Stored workflow message content is invalid");
251
+ return {
252
+ schema: WORKFLOW_MESSAGE_SCHEMA,
253
+ workflowMessageId: row.workflowMessageId,
254
+ runId: row.runId,
255
+ targetSessionId: row.targetSessionId,
256
+ kind: row.kind,
257
+ sourceId: row.sourceId,
258
+ contentDigest: row.contentHash.toString("hex"),
259
+ content,
260
+ order: row.orderNumber,
261
+ status: row.status,
262
+ piSessionEntryId: row.piSessionEntryId,
263
+ createdAt: new Date(row.createdAt).toISOString(),
264
+ updatedAt: new Date(row.updatedAt).toISOString(),
265
+ };
266
+ }
267
+ }
268
+ export function workflowMessageIdFor(kind, sourceId, idempotencyKey) {
269
+ const digest = createHash("sha256")
270
+ .update(canonicalJson({ kind, sourceId, idempotencyKey }))
271
+ .digest("hex");
272
+ return `workflow-message-${digest}`;
273
+ }
274
+ export function isWorkflowMessageContent(value) {
275
+ return (isRecord(value) &&
276
+ value.schema === WORKFLOW_MESSAGE_CONTENT_SCHEMA &&
277
+ typeof value.customType === "string" &&
278
+ value.customType.length > 0 &&
279
+ typeof value.content === "string" &&
280
+ typeof value.display === "boolean" &&
281
+ Object.hasOwn(value, "details") &&
282
+ typeof value.triggerTurn === "boolean");
283
+ }
284
+ function validateContent(content, kind) {
285
+ if (!isWorkflowMessageContent(content))
286
+ throw new Error("Workflow message content is invalid");
287
+ const shouldTrigger = kind === "step" || kind === "terminal" || kind === "followUp";
288
+ if (content.triggerTurn !== shouldTrigger) {
289
+ throw new Error(`Workflow message kind ${kind} has invalid turn behavior`);
290
+ }
291
+ canonicalJson(content);
292
+ }
293
+ function assertSameMessage(message, options) {
294
+ const digest = createHash("sha256").update(canonicalJson(options.content)).digest("hex");
295
+ if (message.runId !== options.runId ||
296
+ message.targetSessionId !== options.targetSessionId ||
297
+ message.kind !== options.kind ||
298
+ message.sourceId !== options.sourceId ||
299
+ message.contentDigest !== digest) {
300
+ throw new Error(`Workflow message idempotency conflict: ${message.workflowMessageId}`);
301
+ }
302
+ }
303
+ function assertSameTurn(turn, options) {
304
+ if (turn.workflowMessageId !== options.workflowMessageId ||
305
+ turn.runId !== options.runId ||
306
+ turn.targetSessionId !== options.targetSessionId) {
307
+ throw new Error(`Workflow turn identity conflict: ${turn.workflowTurnId}`);
308
+ }
309
+ }
310
+ function mapTurn(row) {
311
+ return {
312
+ schema: WORKFLOW_TURN_SCHEMA,
313
+ workflowTurnId: row.workflowTurnId,
314
+ workflowMessageId: row.workflowMessageId,
315
+ runId: row.runId,
316
+ targetSessionId: row.targetSessionId,
317
+ state: row.state,
318
+ stopReason: row.stopReason,
319
+ responseSessionEntryId: row.responseSessionEntryId,
320
+ startedAt: new Date(row.startedAt).toISOString(),
321
+ endedAt: row.endedAt === null ? null : new Date(row.endedAt).toISOString(),
322
+ };
323
+ }
324
+ function isWorkflowMessageRow(value) {
325
+ return (isRecord(value) &&
326
+ typeof value.workflowMessageId === "string" &&
327
+ typeof value.runId === "string" &&
328
+ typeof value.targetSessionId === "string" &&
329
+ isWorkflowMessageKind(value.kind) &&
330
+ typeof value.sourceId === "string" &&
331
+ Buffer.isBuffer(value.contentHash) &&
332
+ typeof value.orderNumber === "number" &&
333
+ isWorkflowMessageStatus(value.status) &&
334
+ (value.piSessionEntryId === null || typeof value.piSessionEntryId === "string") &&
335
+ typeof value.createdAt === "number" &&
336
+ typeof value.updatedAt === "number");
337
+ }
338
+ function isWorkflowTurnRow(value) {
339
+ return (isRecord(value) &&
340
+ typeof value.workflowTurnId === "string" &&
341
+ typeof value.workflowMessageId === "string" &&
342
+ typeof value.runId === "string" &&
343
+ typeof value.targetSessionId === "string" &&
344
+ (value.state === "started" || value.state === "ended") &&
345
+ (value.stopReason === null || isWorkflowTurnStopReason(value.stopReason)) &&
346
+ (value.responseSessionEntryId === null || typeof value.responseSessionEntryId === "string") &&
347
+ typeof value.startedAt === "number" &&
348
+ (value.endedAt === null || typeof value.endedAt === "number"));
349
+ }
350
+ function isWorkflowMessageKind(value) {
351
+ return (value === "step" ||
352
+ value === "decision" ||
353
+ value === "notification" ||
354
+ value === "terminal" ||
355
+ value === "followUp");
356
+ }
357
+ function isWorkflowMessageStatus(value) {
358
+ return value === "pending" || value === "sent" || value === "cancelled";
359
+ }
360
+ function isWorkflowTurnStopReason(value) {
361
+ return value === "completed" || value === "aborted" || value === "error" || value === "lost";
362
+ }
363
+ function isRecord(value) {
364
+ return typeof value === "object" && value !== null && !Array.isArray(value);
365
+ }
366
+ //# sourceMappingURL=workflow-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-messages.js","sourceRoot":"","sources":["../../src/state/workflow-messages.ts"],"names":[],"mappings":"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"}
@@ -193,7 +193,7 @@ export function renderRunDetailLines(bundle, size, now = new Date(), scroll = 0,
193
193
  }
194
194
  if ((bundle.followUpQueue?.followUps.length ?? 0) > 0) {
195
195
  lines.push("");
196
- lines.push(ansi.bold(`follow-ups · presentation ${bundle.followUpQueue?.presentationState ?? "unknown"}`));
196
+ lines.push(ansi.bold("follow-ups"));
197
197
  for (const followUp of bundle.followUpQueue?.followUps ?? []) {
198
198
  lines.push(fitWidth(` ${followUp.order}. ${followUp.state} · ${followUp.followUpId} · ${sanitizeText(followUp.source)}`, size.width));
199
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/viewer/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/viewer/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAOxC,MAAM,aAAa,GAAwD;IACzE,OAAO,EAAE,IAAI,CAAC,IAAI;IAClB,OAAO,EAAE,IAAI,CAAC,MAAM;IACpB,SAAS,EAAE,IAAI,CAAC,KAAK;IACrB,MAAM,EAAE,IAAI,CAAC,GAAG;IAChB,SAAS,EAAE,IAAI,CAAC,GAAG;IACnB,SAAS,EAAE,IAAI,CAAC,MAAM;CACvB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAyB;IACnD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,QAAiB,EAAE,SAAiB;IACxD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC;IACvB,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvE,6EAA6E;IAC7E,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;SACxC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAC;IACV,OAAO,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC;AAChG,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAChC,OAA4B,EAC5B,aAAqB,EACrB,IAAkB,EAClB,GAAG,GAAS,IAAI,IAAI,EAAE;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EACpD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CACtC,CAAC;IACF,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,GAAG,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,CAC3F,GAAG,KAAK,CAAC,KAAK,MAAM,OAAO,EAAE,CAC9B,EAAE,EACH,IAAI,CAAC,KAAK,CACX,CACF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACf,IAAwB,EACxB,KAAa,EACb,iBAAyB,EACzB,KAAa;IAEb,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,KAAK,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClE,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,KAAK,SAAS;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GACZ,IAAI,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC3F,OAAO,QAAQ,CACb,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,OAAO,EAAE,EAC1H,KAAK,CACN,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,SAAS,cAAc,CACrB,MAAyB,EACzB,MAAc,EACd,KAAa,EACb,GAAS;IAET,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,GAAG,CAAC;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;QACjC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB;YAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;YACxC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;SAAM,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACtC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;QAC5D,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,QAAQ,CAAC;QAC7D,MAAM,GAAG,IAAI,CAAC,MAAM,CAClB,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,wBAAwB,YAAY,CAAC,eAAe,IAAI,UAAU,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CACjK,KAAK,CAAC,OAAO,CACd;iBACE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBAC3C,IAAI,CACH,KAAK,CACN,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CACpF,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;QACrC,MAAM,QAAQ,GACZ,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM;YACzE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,GAAG,IAAI,CAAC,GAAG,CACf,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CACpH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CAAC,IAAwB,EAAE,KAAa;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC5D,KAAK,MAAM,OAAO,IAAI,wBAAwB,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,+BAA+B,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAC3F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACjE,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,IAAI,CAAC,GAAG,CACN,cAAc,IAAI,CAAC,oBAAoB,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,EAAE,CAC9I,EACD,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG;YACd,IAAI,CAAC,MAAM,CAAC,UAAU;YACtB,IAAI,CAAC,MAAM,CAAC,OAAO;YACnB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;SAC3E;aACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC;aACnD,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAI,KAA8B,CAAC,MAAM,CAAC;IACtD,OAAO,MAAM,KAAK,wCAAwC;QACxD,CAAC,CAAE,KAA8B;QACjC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAyB,EACzB,IAAkB,EAClB,GAAG,GAAS,IAAI,IAAI,EAAE,EACtB,MAAM,GAAG,CAAC,EACV,iBAAiB,GAAkB,IAAI;IAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAG,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAC7F,CAAC;IACF,MAAM,QAAQ,GACZ,iBAAiB,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAC9C,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,KAAK,CAAC,KAAK,cAAc,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,EAC7H,IAAI,CAAC,KAAK,CACX,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACvF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAC3B,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,kEAAkE;QAClE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GACnB,MAAM,CAAC,WAAW,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC;QACtE,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,IAAI,CAAC,GAAG,CACN,GAAG,WAAW,KAAK,KAAK,CAAC,QAAQ,CAAC,WAAW,cAAc,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,yBAAyB,MAAM,EAAE,EAAE,IAAI,SAAS,EAAE,CAC/I,EACD,IAAI,CAAC,KAAK,CACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,KAAK,YAAY,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EACvI,IAAI,CAAC,KAAK,CACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,KAAK,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,UAAU,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EACpG,IAAI,CAAC,KAAK,CACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,IAAI,CAAC,iBAAiB,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,OAAO,GAAG,CAAC,CACpF,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,QAAQ,CACN,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,EAC3E,IAAI,CAAC,KAAK,CACX,CACF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,MAAyB,EACzB,IAAkB,EAClB,iBAAiB,GAAkB,IAAI;IAEvC,MAAM,KAAK,GAAG,oBAAoB,CAChC,MAAM,EACN,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,EACtD,IAAI,IAAI,EAAE,EACV,CAAC,EACD,iBAAiB,CAClB,CAAC,MAAM,CAAC;IACT,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -6,4 +6,4 @@ export type ViewerOptions = {
6
6
  };
7
7
  /** Interactive client view. All durable reads stay in the workflow host. */
8
8
  export declare function runViewer(options: ViewerOptions): Promise<void>;
9
- export declare function renderClientView(value: JsonValue, width: number, height: number, selected: number | undefined, scroll: number): string[];
9
+ export declare function renderClientView(value: JsonValue, width: number, height: number, selected: number | undefined, scroll: number, now?: Date, selectedStepIndex?: number | null): string[];
@@ -1,5 +1,6 @@
1
1
  import { materializeRunView } from "../client/materialize.js";
2
2
  import { sanitizeText } from "../render/ansi.js";
3
+ import { formatDuration } from "../render/format.js";
3
4
  const ALT_SCREEN_ON = "\u001b[?1049h\u001b[?25l";
4
5
  const ALT_SCREEN_OFF = "\u001b[?25h\u001b[?1049l";
5
6
  const CLEAR = "\u001b[2J\u001b[H";
@@ -8,13 +9,14 @@ export async function runViewer(options) {
8
9
  let value = options.runId === undefined ? [] : null;
9
10
  let selected = 0;
10
11
  let scroll = 0;
12
+ let selectedStepIndex = null;
11
13
  let mode = options.runId === undefined ? "runs" : "run";
12
14
  let unsubscribe;
13
15
  let runMaterializationGeneration = 0;
14
16
  const draw = () => {
15
17
  const width = process.stdout.columns ?? 100;
16
18
  const height = Math.max(1, (process.stdout.rows ?? 24) - 1);
17
- const lines = renderClientView(value, width, height, mode === "runs" ? selected : undefined, scroll);
19
+ const lines = renderClientView(value, width, height, mode === "runs" ? selected : undefined, scroll, new Date(), selectedStepIndex);
18
20
  process.stdout.write(`${CLEAR}${lines.join("\n")}`);
19
21
  };
20
22
  const watchRuns = async () => {
@@ -22,6 +24,7 @@ export async function runViewer(options) {
22
24
  await unsubscribe?.();
23
25
  mode = "runs";
24
26
  scroll = 0;
27
+ selectedStepIndex = null;
25
28
  unsubscribe = await options.client.watchRuns((event) => {
26
29
  value = event.payload;
27
30
  selected = Math.min(selected, Math.max(0, arrayLength(value) - 1));
@@ -33,6 +36,7 @@ export async function runViewer(options) {
33
36
  await unsubscribe?.();
34
37
  mode = "run";
35
38
  scroll = 0;
39
+ selectedStepIndex = null;
36
40
  unsubscribe = await options.client.watchRun(runId, (event) => {
37
41
  const generation = ++runMaterializationGeneration;
38
42
  value = event.payload;
@@ -60,6 +64,8 @@ export async function runViewer(options) {
60
64
  if (rawModeSupported)
61
65
  process.stdin.setRawMode(true);
62
66
  process.stdin.resume();
67
+ const redrawTimer = setInterval(draw, 1_000);
68
+ redrawTimer.unref?.();
63
69
  await new Promise((resolve) => {
64
70
  const onKey = (data) => {
65
71
  const key = data.toString("utf8");
@@ -92,6 +98,33 @@ export async function runViewer(options) {
92
98
  scroll += page;
93
99
  draw();
94
100
  }
101
+ else if (key === "[") {
102
+ const total = runStepCount(value);
103
+ if (total > 0) {
104
+ selectedStepIndex = Math.max(0, (selectedStepIndex ?? total - 1) - 1);
105
+ scroll = 0;
106
+ draw();
107
+ }
108
+ }
109
+ else if (key === "]") {
110
+ const total = runStepCount(value);
111
+ if (total > 0) {
112
+ const next = (selectedStepIndex ?? total - 1) + 1;
113
+ selectedStepIndex = next >= total - 1 ? null : next;
114
+ scroll = 0;
115
+ draw();
116
+ }
117
+ }
118
+ else if (key === "\u001b[F" || key === "G" || key === "L") {
119
+ selectedStepIndex = null;
120
+ scroll = 0;
121
+ draw();
122
+ }
123
+ else if (key === "\u001b[H" || key === "g") {
124
+ selectedStepIndex = runStepCount(value) > 0 ? 0 : null;
125
+ scroll = 0;
126
+ draw();
127
+ }
95
128
  }
96
129
  else if (mode === "runs") {
97
130
  if (key === "\u001b[A" || key === "k") {
@@ -111,6 +144,7 @@ export async function runViewer(options) {
111
144
  };
112
145
  process.stdin.on("data", onKey);
113
146
  });
147
+ clearInterval(redrawTimer);
114
148
  }
115
149
  finally {
116
150
  runMaterializationGeneration += 1;
@@ -121,7 +155,7 @@ export async function runViewer(options) {
121
155
  process.stdout.write(ALT_SCREEN_OFF);
122
156
  }
123
157
  }
124
- export function renderClientView(value, width, height, selected, scroll) {
158
+ export function renderClientView(value, width, height, selected, scroll, now = new Date(), selectedStepIndex = null) {
125
159
  if (Array.isArray(value)) {
126
160
  if (value.length === 0)
127
161
  return ["No workflow runs found."];
@@ -133,11 +167,11 @@ export function renderClientView(value, width, height, selected, scroll) {
133
167
  return truncate(`${prefix}${summary(item)}`, width);
134
168
  });
135
169
  }
136
- const lines = renderRun(value);
170
+ const lines = renderRun(value, now, selectedStepIndex);
137
171
  const start = Math.min(scroll, Math.max(0, lines.length - height));
138
172
  return lines.slice(start, start + height).map((line) => truncate(line, width));
139
173
  }
140
- function renderRun(value) {
174
+ function renderRun(value, now, selectedStepIndex) {
141
175
  if (!isRecord(value) || value.schema !== "pi-workflows.run-view.v1") {
142
176
  return JSON.stringify(value, null, 2).split("\n");
143
177
  }
@@ -151,21 +185,39 @@ function renderRun(value) {
151
185
  : "unknown";
152
186
  const runId = typeof value.runId === "string" ? sanitizeText(value.runId) : "unknown";
153
187
  const status = typeof display.status === "string" ? display.status : "unknown";
188
+ const steps = Array.isArray(state.steps) ? state.steps : [];
189
+ const selected = steps.length === 0
190
+ ? -1
191
+ : Math.min(Math.max(0, selectedStepIndex ?? steps.length - 1), steps.length - 1);
192
+ const startedAt = typeof manifest.startedAt === "string" ? Date.parse(manifest.startedAt) : NaN;
193
+ const finishedAt = typeof manifest.finishedAt === "string" ? Date.parse(manifest.finishedAt) : NaN;
194
+ const elapsed = Number.isFinite(startedAt)
195
+ ? ` · elapsed ${formatDuration(Math.max(0, (Number.isFinite(finishedAt) ? finishedAt : now.getTime()) - startedAt))}`
196
+ : "";
197
+ const position = selectedStepIndex === null || selected < 0 ? "" : ` · step ${selected + 1}/${steps.length}`;
154
198
  const lines = [
155
199
  `workflow ${workflowName}`,
156
- `${statusGlyph(status)} ${sanitizeText(status)} · run ${runId}`,
200
+ `${statusGlyph(status)} ${sanitizeText(status)} · run ${runId}${elapsed}${position}`,
157
201
  ];
158
202
  if (typeof display.reason === "string")
159
203
  lines.push(`reason: ${sanitizeText(display.reason)}`);
160
- const steps = Array.isArray(state.steps) ? state.steps : [];
161
204
  if (steps.length > 0) {
162
205
  lines.push("", "steps");
163
- for (const step of steps) {
206
+ for (const [index, step] of steps.entries()) {
164
207
  if (!isRecord(step))
165
208
  continue;
166
209
  const nodeId = typeof step.nodeId === "string" ? sanitizeText(step.nodeId) : "unknown";
167
210
  const outcome = typeof step.outcome === "string" ? step.outcome : "unknown";
168
- lines.push(` ${stepGlyph(outcome)} ${nodeId} · ${sanitizeText(outcome)}`);
211
+ lines.push(`${index === selected ? ">" : " "} ${stepGlyph(outcome)} ${nodeId} · ${sanitizeText(outcome)}`);
212
+ }
213
+ const inspected = steps[selected];
214
+ if (isRecord(inspected)) {
215
+ const nodeId = typeof inspected.nodeId === "string" ? sanitizeText(inspected.nodeId) : "unknown";
216
+ const output = Object.hasOwn(inspected, "error") ? inspected.error : inspected.output;
217
+ lines.push("", `step output — ${nodeId}`);
218
+ lines.push(...JSON.stringify(output ?? null, null, 2)
219
+ .split("\n")
220
+ .map((line) => ` ${sanitizeText(line)}`));
169
221
  }
170
222
  }
171
223
  if (status === "completed" && Object.hasOwn(state, "finalOutput")) {
@@ -208,6 +260,11 @@ function selectedRunId(value, index) {
208
260
  const item = value[index];
209
261
  return isRecord(item) && typeof item.runId === "string" ? item.runId : undefined;
210
262
  }
263
+ function runStepCount(value) {
264
+ if (!isRecord(value) || !isRecord(value.state) || !Array.isArray(value.state.steps))
265
+ return 0;
266
+ return value.state.steps.length;
267
+ }
211
268
  function arrayLength(value) {
212
269
  return Array.isArray(value) ? value.length : 0;
213
270
  }