@osolmaz/pi-workflows 0.1.0 → 0.3.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 (171) hide show
  1. package/README.md +107 -26
  2. package/dist/builtins/monitor.workflow.d.ts +71 -0
  3. package/dist/builtins/monitor.workflow.js +234 -0
  4. package/dist/builtins/monitor.workflow.js.map +1 -0
  5. package/dist/controllers/conditions.d.ts +6 -0
  6. package/dist/controllers/conditions.js +68 -0
  7. package/dist/controllers/conditions.js.map +1 -0
  8. package/dist/controllers/definition.d.ts +6 -0
  9. package/dist/controllers/definition.js +45 -0
  10. package/dist/controllers/definition.js.map +1 -0
  11. package/dist/controllers/effects.d.ts +14 -0
  12. package/dist/controllers/effects.js +104 -0
  13. package/dist/controllers/effects.js.map +1 -0
  14. package/dist/controllers/errors.d.ts +12 -0
  15. package/dist/controllers/errors.js +25 -0
  16. package/dist/controllers/errors.js.map +1 -0
  17. package/dist/controllers/index.d.ts +13 -0
  18. package/dist/controllers/index.js +13 -0
  19. package/dist/controllers/index.js.map +1 -0
  20. package/dist/controllers/json.d.ts +5 -0
  21. package/dist/controllers/json.js +57 -0
  22. package/dist/controllers/json.js.map +1 -0
  23. package/dist/controllers/loader.d.ts +23 -0
  24. package/dist/controllers/loader.js +74 -0
  25. package/dist/controllers/loader.js.map +1 -0
  26. package/dist/controllers/manager.d.ts +58 -0
  27. package/dist/controllers/manager.js +399 -0
  28. package/dist/controllers/manager.js.map +1 -0
  29. package/dist/controllers/results.d.ts +5 -0
  30. package/dist/controllers/results.js +32 -0
  31. package/dist/controllers/results.js.map +1 -0
  32. package/dist/controllers/sqlite.d.ts +212 -0
  33. package/dist/controllers/sqlite.js +1009 -0
  34. package/dist/controllers/sqlite.js.map +1 -0
  35. package/dist/controllers/store.d.ts +112 -0
  36. package/dist/controllers/store.js +32 -0
  37. package/dist/controllers/store.js.map +1 -0
  38. package/dist/controllers/types.d.ts +159 -0
  39. package/dist/controllers/types.js +2 -0
  40. package/dist/controllers/types.js.map +1 -0
  41. package/dist/controllers/workflow-engine-scheduler.d.ts +25 -0
  42. package/dist/controllers/workflow-engine-scheduler.js +93 -0
  43. package/dist/controllers/workflow-engine-scheduler.js.map +1 -0
  44. package/dist/controllers/workflows.d.ts +27 -0
  45. package/dist/controllers/workflows.js +109 -0
  46. package/dist/controllers/workflows.js.map +1 -0
  47. package/dist/extension/controller-host.d.ts +47 -0
  48. package/dist/extension/controller-host.js +110 -0
  49. package/dist/extension/controller-host.js.map +1 -0
  50. package/dist/extension/executor.d.ts +14 -1
  51. package/dist/extension/executor.js +12 -2
  52. package/dist/extension/executor.js.map +1 -1
  53. package/dist/extension/index.d.ts +7 -0
  54. package/dist/extension/index.js +1118 -89
  55. package/dist/extension/index.js.map +1 -1
  56. package/dist/extension/recorder.d.ts +91 -0
  57. package/dist/extension/recorder.js +537 -0
  58. package/dist/extension/recorder.js.map +1 -0
  59. package/dist/extension/session-events.d.ts +134 -0
  60. package/dist/extension/session-events.js +60 -0
  61. package/dist/extension/session-events.js.map +1 -0
  62. package/dist/extension/widget.js +25 -24
  63. package/dist/extension/widget.js.map +1 -1
  64. package/dist/extension/workflow-tool.d.ts +28 -0
  65. package/dist/extension/workflow-tool.js +33 -0
  66. package/dist/extension/workflow-tool.js.map +1 -0
  67. package/dist/host/processes.d.ts +24 -0
  68. package/dist/host/processes.js +114 -0
  69. package/dist/host/processes.js.map +1 -0
  70. package/dist/host/rpc-bridge.d.ts +9 -0
  71. package/dist/host/rpc-bridge.js +39 -0
  72. package/dist/host/rpc-bridge.js.map +1 -0
  73. package/dist/host/rpc-executor.d.ts +38 -0
  74. package/dist/host/rpc-executor.js +254 -0
  75. package/dist/host/rpc-executor.js.map +1 -0
  76. package/dist/host/runner.d.ts +49 -0
  77. package/dist/host/runner.js +350 -0
  78. package/dist/host/runner.js.map +1 -0
  79. package/dist/render/canvas.d.ts +1 -1
  80. package/dist/render/canvas.js +5 -0
  81. package/dist/render/canvas.js.map +1 -1
  82. package/dist/render/graph-render.d.ts +5 -0
  83. package/dist/render/graph-render.js +211 -48
  84. package/dist/render/graph-render.js.map +1 -1
  85. package/dist/viewer/cli.d.ts +7 -3
  86. package/dist/viewer/cli.js +150 -19
  87. package/dist/viewer/cli.js.map +1 -1
  88. package/dist/viewer/render.js +19 -3
  89. package/dist/viewer/render.js.map +1 -1
  90. package/dist/viewer/session-reducer.d.ts +45 -0
  91. package/dist/viewer/session-reducer.js +266 -0
  92. package/dist/viewer/session-reducer.js.map +1 -0
  93. package/dist/workflows/artifacts.d.ts +40 -0
  94. package/dist/workflows/artifacts.js +155 -0
  95. package/dist/workflows/artifacts.js.map +1 -0
  96. package/dist/workflows/engine.d.ts +38 -0
  97. package/dist/workflows/engine.js +281 -20
  98. package/dist/workflows/engine.js.map +1 -1
  99. package/dist/workflows/errors.d.ts +23 -0
  100. package/dist/workflows/errors.js +38 -0
  101. package/dist/workflows/errors.js.map +1 -1
  102. package/dist/workflows/graph.js +0 -5
  103. package/dist/workflows/graph.js.map +1 -1
  104. package/dist/workflows/index.d.ts +3 -2
  105. package/dist/workflows/index.js +2 -1
  106. package/dist/workflows/index.js.map +1 -1
  107. package/dist/workflows/loader.d.ts +5 -3
  108. package/dist/workflows/loader.js +10 -1
  109. package/dist/workflows/loader.js.map +1 -1
  110. package/dist/workflows/schema.js +1 -1
  111. package/dist/workflows/schema.js.map +1 -1
  112. package/dist/workflows/store.d.ts +98 -10
  113. package/dist/workflows/store.js +921 -46
  114. package/dist/workflows/store.js.map +1 -1
  115. package/dist/workflows/types.d.ts +136 -3
  116. package/docs/CONTROLLERS.md +215 -0
  117. package/docs/development.md +51 -24
  118. package/docs/live-replay-protocol.md +155 -0
  119. package/docs/plans/2026-08-04-controller-runtime-plan.md +169 -0
  120. package/docs/plans/2026-08-05-always-on-workflows-plan.md +125 -0
  121. package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +184 -0
  122. package/docs/plans/piw-viewer-experience-implementation-plan.md +674 -0
  123. package/docs/plans/replayable-run-bundles-implementation-plan.md +65 -0
  124. package/docs/plans/session-event-replay-implementation-plan.md +494 -0
  125. package/docs/plans/tui-viewer-implementation-plan.md +64 -0
  126. package/docs/run-bundles.md +359 -55
  127. package/docs/session-event-journal.md +470 -0
  128. package/docs/tui-viewer.md +218 -0
  129. package/docs/workflows.md +131 -11
  130. package/examples/controllers/pull-request.controller.ts +215 -0
  131. package/package.json +11 -2
  132. package/src/builtins/monitor.workflow.ts +278 -0
  133. package/src/controllers/conditions.ts +110 -0
  134. package/src/controllers/definition.ts +65 -0
  135. package/src/controllers/effects.ts +123 -0
  136. package/src/controllers/errors.ts +27 -0
  137. package/src/controllers/index.ts +90 -0
  138. package/src/controllers/json.ts +62 -0
  139. package/src/controllers/loader.ts +104 -0
  140. package/src/controllers/manager.ts +533 -0
  141. package/src/controllers/results.ts +46 -0
  142. package/src/controllers/sqlite.ts +1427 -0
  143. package/src/controllers/store.ts +160 -0
  144. package/src/controllers/types.ts +183 -0
  145. package/src/controllers/workflow-engine-scheduler.ts +145 -0
  146. package/src/controllers/workflows.ts +152 -0
  147. package/src/extension/controller-host.ts +163 -0
  148. package/src/extension/executor.ts +29 -2
  149. package/src/extension/index.ts +1315 -109
  150. package/src/extension/recorder.ts +662 -0
  151. package/src/extension/session-events.ts +119 -0
  152. package/src/extension/widget.ts +26 -24
  153. package/src/extension/workflow-tool.ts +59 -0
  154. package/src/host/processes.ts +119 -0
  155. package/src/host/rpc-bridge.ts +44 -0
  156. package/src/host/rpc-executor.ts +299 -0
  157. package/src/host/runner.ts +406 -0
  158. package/src/render/canvas.ts +19 -1
  159. package/src/render/graph-render.ts +277 -44
  160. package/src/viewer/cli.ts +167 -21
  161. package/src/viewer/render.ts +21 -3
  162. package/src/viewer/session-reducer.ts +347 -0
  163. package/src/workflows/artifacts.ts +188 -0
  164. package/src/workflows/engine.ts +365 -19
  165. package/src/workflows/errors.ts +45 -0
  166. package/src/workflows/graph.ts +0 -5
  167. package/src/workflows/index.ts +15 -0
  168. package/src/workflows/loader.ts +13 -3
  169. package/src/workflows/schema.ts +1 -1
  170. package/src/workflows/store.ts +1157 -48
  171. package/src/workflows/types.ts +151 -3
@@ -0,0 +1,537 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { SESSION_BINDING_SCHEMA, SESSION_CAPTURE_SCHEMA, SESSION_EVENT_MAX_BYTES, SESSION_EVENT_SCHEMA, } from "../workflows/store.js";
3
+ import { messageRole, normalizeAssistantEvent, toolCallIdFromAssistantEvent, toolFinishedPayload, toolStartedPayload, turnFinishedPayload, } from "./session-events.js";
4
+ const FLUSH_INTERVAL_MS = 25;
5
+ const FINISH_TURN_TIMEOUT_MS = 30_000;
6
+ const FLUSH_MAX_RECORDS = 256;
7
+ const FLUSH_MAX_BYTES = 256 * 1024;
8
+ const QUEUE_MAX_RECORDS = 8_192;
9
+ const QUEUE_MAX_BYTES = 16 * 1024 * 1024;
10
+ function objectKey(value) {
11
+ return typeof value === "object" && value !== null ? value : null;
12
+ }
13
+ function stableMessageKey(value) {
14
+ if (typeof value !== "object" || value === null) {
15
+ return null;
16
+ }
17
+ const message = value;
18
+ if (typeof message.id === "string" && message.id.length > 0) {
19
+ return `id:${message.id}`;
20
+ }
21
+ if ((typeof message.timestamp === "number" || typeof message.timestamp === "string") &&
22
+ typeof message.role === "string") {
23
+ return `timestamp:${message.role}:${message.timestamp}`;
24
+ }
25
+ return null;
26
+ }
27
+ function entryRole(entry) {
28
+ const message = entry.message;
29
+ return messageRole(message);
30
+ }
31
+ function failureMessage(error) {
32
+ return error instanceof Error ? error.message : String(error);
33
+ }
34
+ /**
35
+ * Records both settled Pi entries and normalized temporal events into one run
36
+ * bundle. The hot event path only stamps and queues records; filesystem work
37
+ * runs on a separate ordered append chain.
38
+ */
39
+ export class SessionRecorder {
40
+ store;
41
+ runDir;
42
+ runId;
43
+ /**
44
+ * Capture segment for this recorder. Undefined writes the legacy flat
45
+ * stream; a second recorder attaching to the same bundle (resume or
46
+ * handoff) writes a segment instead so the first capture stays intact.
47
+ */
48
+ segmentId;
49
+ cursor = null;
50
+ recorded = [];
51
+ unclaimedEntries = [];
52
+ bound = false;
53
+ acceptingEntries = true;
54
+ acceptingEvents = true;
55
+ entryChain = Promise.resolve();
56
+ stopPromise = null;
57
+ nextEventSeq = 1;
58
+ nextTurnId = 1;
59
+ nextMessageId = 1;
60
+ currentAttempt = null;
61
+ currentTurn = null;
62
+ currentMessage = null;
63
+ lastFinishedAttempt = null;
64
+ finishPromise = null;
65
+ resolveFinish = null;
66
+ finishTimer = null;
67
+ messageOwners = new WeakMap();
68
+ stableMessageOwners = new Map();
69
+ toolOwners = new Map();
70
+ turnToolCallIds = new Map();
71
+ eventQueue = [];
72
+ pendingMessageEnds = [];
73
+ outstandingRecords = 0;
74
+ outstandingBytes = 0;
75
+ flushTimer = null;
76
+ flushPromise = null;
77
+ captureFailure = null;
78
+ constructor(store, runDir, runId) {
79
+ this.store = store;
80
+ this.runDir = runDir;
81
+ this.runId = runId;
82
+ }
83
+ async bind(ctx) {
84
+ if (this.bound) {
85
+ return;
86
+ }
87
+ this.bound = true;
88
+ this.cursor = ctx.sessionManager.getLeafId();
89
+ const sessionFile = ctx.sessionManager.getSessionFile();
90
+ // A bundle that already has a binding belongs to an earlier capture
91
+ // attempt; this recorder writes its own segment under session/segments.
92
+ if (await this.store.hasSessionBinding(this.runDir)) {
93
+ this.segmentId = randomUUID();
94
+ }
95
+ await this.store.writeSessionBinding(this.runDir, {
96
+ schema: SESSION_BINDING_SCHEMA,
97
+ runId: this.runId,
98
+ piSessionId: ctx.sessionManager.getSessionId(),
99
+ ...(sessionFile !== undefined ? { piSessionFile: sessionFile } : {}),
100
+ cwd: ctx.cwd,
101
+ boundAt: new Date().toISOString(),
102
+ }, this.segmentId);
103
+ await this.store.writeSessionCapture(this.runDir, {
104
+ schema: SESSION_CAPTURE_SCHEMA,
105
+ eventSchema: SESSION_EVENT_SCHEMA,
106
+ status: "recording",
107
+ eventCount: 0,
108
+ entryCount: 0,
109
+ lastEventSeq: 0,
110
+ }, this.segmentId);
111
+ }
112
+ /** Fix the owner before the executor delivers an agent-step prompt. */
113
+ beginAttempt(contract) {
114
+ this.currentAttempt = { nodeId: contract.nodeId, attemptId: contract.attemptId };
115
+ }
116
+ /** Release ownership of the turn that Pi has fully settled. */
117
+ settleAttempt() {
118
+ const finished = this.lastFinishedAttempt;
119
+ this.lastFinishedAttempt = null;
120
+ if (this.currentTurn === null &&
121
+ (finished === null ||
122
+ (this.currentAttempt?.nodeId === finished.nodeId &&
123
+ this.currentAttempt.attemptId === finished.attemptId))) {
124
+ this.currentAttempt = null;
125
+ }
126
+ }
127
+ handleTurnStart(event) {
128
+ const owner = this.currentAttempt;
129
+ if (!owner) {
130
+ return;
131
+ }
132
+ const turn = {
133
+ ...owner,
134
+ turnId: `t${this.nextTurnId}`,
135
+ turnIndex: event.turnIndex,
136
+ };
137
+ this.nextTurnId += 1;
138
+ this.currentTurn = turn;
139
+ this.turnToolCallIds.set(turn.turnId, []);
140
+ this.enqueue(turn, "turn_started", { turnIndex: event.turnIndex });
141
+ }
142
+ async handleTurnEnd(event, ctx) {
143
+ const turn = this.currentTurn;
144
+ if (!turn) {
145
+ return;
146
+ }
147
+ const message = this.ownerForMessage(event.message);
148
+ try {
149
+ await this.synchronize(ctx);
150
+ this.enqueue(turn, "turn_finished", turnFinishedPayload(event, message?.messageId, this.turnToolCallIds.get(turn.turnId) ?? []));
151
+ }
152
+ catch (error) {
153
+ this.failCapture("entry_write_failed", failureMessage(error));
154
+ }
155
+ this.currentTurn = null;
156
+ this.currentMessage = null;
157
+ this.lastFinishedAttempt = { nodeId: turn.nodeId, attemptId: turn.attemptId };
158
+ if (this.finishPromise) {
159
+ await this.stop();
160
+ }
161
+ }
162
+ async handleMessageStart(event, ctx) {
163
+ const turn = this.currentTurn;
164
+ if (!turn) {
165
+ return;
166
+ }
167
+ await this.synchronize(ctx);
168
+ const owner = {
169
+ ...turn,
170
+ messageId: `m${this.nextMessageId}`,
171
+ role: messageRole(event.message),
172
+ };
173
+ this.nextMessageId += 1;
174
+ const key = objectKey(event.message);
175
+ if (key) {
176
+ this.messageOwners.set(key, owner);
177
+ }
178
+ const stableKey = stableMessageKey(event.message);
179
+ if (stableKey) {
180
+ this.stableMessageOwners.set(stableKey, owner);
181
+ }
182
+ this.currentMessage = owner;
183
+ this.enqueue(owner, "message_started", { role: owner.role });
184
+ }
185
+ handleMessageUpdate(event) {
186
+ const owner = this.ownerForMessage(event.message);
187
+ if (!owner) {
188
+ return;
189
+ }
190
+ const normalized = normalizeAssistantEvent(event.assistantMessageEvent);
191
+ const toolCallId = toolCallIdFromAssistantEvent(normalized);
192
+ if (toolCallId) {
193
+ this.toolOwners.set(toolCallId, owner);
194
+ const ids = this.turnToolCallIds.get(owner.turnId) ?? [];
195
+ if (!ids.includes(toolCallId)) {
196
+ ids.push(toolCallId);
197
+ this.turnToolCallIds.set(owner.turnId, ids);
198
+ }
199
+ }
200
+ this.enqueue(owner, "assistant_event", normalized);
201
+ }
202
+ handleMessageEnd(event) {
203
+ const owner = this.ownerForMessage(event.message);
204
+ if (!owner) {
205
+ return;
206
+ }
207
+ // Pi appends the final session entry after message_end handlers return.
208
+ // Keep this record and every later event queued until a documented hook
209
+ // with synchronized session state can attach the exact entry id.
210
+ this.clearFlushTimer();
211
+ const queued = this.enqueue(owner, "message_finished", { role: owner.role, settled: false }, undefined, {}, true);
212
+ if (queued) {
213
+ this.pendingMessageEnds.push({ queued, role: owner.role, message: event.message });
214
+ this.clearFlushTimer();
215
+ }
216
+ if (this.currentMessage?.messageId === owner.messageId) {
217
+ this.currentMessage = null;
218
+ }
219
+ }
220
+ handleToolStart(event) {
221
+ const owner = this.toolOwners.get(event.toolCallId) ?? this.currentMessage;
222
+ if (!owner) {
223
+ return;
224
+ }
225
+ this.toolOwners.set(event.toolCallId, owner);
226
+ this.enqueue(owner, "tool_execution_started", toolStartedPayload(event), undefined, {
227
+ toolCallId: event.toolCallId,
228
+ });
229
+ }
230
+ handleToolUpdate(event) {
231
+ const owner = this.toolOwners.get(event.toolCallId);
232
+ if (!owner) {
233
+ return;
234
+ }
235
+ this.enqueue(owner, "tool_execution_updated", {}, undefined, {
236
+ toolCallId: event.toolCallId,
237
+ });
238
+ }
239
+ handleToolEnd(event) {
240
+ const owner = this.toolOwners.get(event.toolCallId);
241
+ if (!owner) {
242
+ return;
243
+ }
244
+ this.enqueue(owner, "tool_execution_finished", toolFinishedPayload(event), undefined, {
245
+ toolCallId: event.toolCallId,
246
+ });
247
+ }
248
+ /** Flush new entries on the current branch into the bundle. */
249
+ record(ctx) {
250
+ if (!this.bound || !this.acceptingEntries) {
251
+ return Promise.resolve([]);
252
+ }
253
+ const task = this.entryChain.then(async () => {
254
+ const branch = ctx.sessionManager.getBranch();
255
+ let startIndex = 0;
256
+ if (this.cursor !== null) {
257
+ const cursorIndex = branch.findIndex((entry) => entry.id === this.cursor);
258
+ if (cursorIndex === -1) {
259
+ this.cursor = branch.at(-1)?.id ?? this.cursor;
260
+ return [];
261
+ }
262
+ startIndex = cursorIndex + 1;
263
+ }
264
+ const appended = [];
265
+ for (const entry of branch.slice(startIndex)) {
266
+ await this.store.appendSessionEntry(this.runDir, entry, this.segmentId);
267
+ const recorded = { id: entry.id, entry, claimed: false };
268
+ appended.push(recorded);
269
+ this.unclaimedEntries.push(recorded);
270
+ this.recorded.push(entry.id);
271
+ this.cursor = entry.id;
272
+ }
273
+ return appended;
274
+ });
275
+ this.entryChain = task.catch((error) => {
276
+ this.failCapture("entry_write_failed", failureMessage(error));
277
+ });
278
+ return task;
279
+ }
280
+ /** Record durable entries, then release deferred message-end events in order. */
281
+ async synchronize(ctx) {
282
+ if (this.pendingMessageEnds.length === 0) {
283
+ return;
284
+ }
285
+ await this.record(ctx);
286
+ for (const pending of this.pendingMessageEnds.splice(0)) {
287
+ const entryId = this.claimEntry(pending.role, pending.message);
288
+ pending.queued.record.payload = entryId
289
+ ? { role: pending.role, settled: true, entryId }
290
+ : { role: pending.role, settled: false };
291
+ const bytes = Buffer.byteLength(JSON.stringify(pending.queued.record), "utf8") + 1;
292
+ this.outstandingBytes += bytes - pending.queued.bytes;
293
+ pending.queued.bytes = bytes;
294
+ }
295
+ if (this.eventQueue.length >= FLUSH_MAX_RECORDS || this.queuedBytes() >= FLUSH_MAX_BYTES) {
296
+ this.startFlush();
297
+ }
298
+ else {
299
+ this.scheduleFlush();
300
+ }
301
+ }
302
+ /**
303
+ * Finalize immediately when no Pi turn is active. Otherwise wait for
304
+ * `turn_end`, which is the last documented lifecycle boundary needed to
305
+ * include the workflow tool result and any following assistant output.
306
+ */
307
+ async finish() {
308
+ if (this.stopPromise || this.currentTurn === null) {
309
+ return await this.stop();
310
+ }
311
+ if (!this.finishPromise) {
312
+ this.finishPromise = new Promise((resolve) => {
313
+ this.resolveFinish = resolve;
314
+ });
315
+ this.finishTimer = setTimeout(() => {
316
+ this.failCapture("turn_settle_timeout", `active Pi turn did not finish within ${FINISH_TURN_TIMEOUT_MS}ms`);
317
+ void this.stop();
318
+ }, FINISH_TURN_TIMEOUT_MS);
319
+ this.finishTimer.unref?.();
320
+ }
321
+ return await this.finishPromise;
322
+ }
323
+ async stop() {
324
+ if (this.stopPromise) {
325
+ return await this.stopPromise;
326
+ }
327
+ if (this.currentTurn !== null) {
328
+ this.failCapture("turn_interrupted", "session capture stopped before the active Pi turn finished");
329
+ }
330
+ this.acceptingEntries = false;
331
+ this.acceptingEvents = false;
332
+ // If Pi closes before another synchronized hook, preserve the message-end
333
+ // receipts as explicitly unsettled rather than hanging finalization.
334
+ this.pendingMessageEnds.splice(0);
335
+ this.clearFlushTimer();
336
+ this.stopPromise = (async () => {
337
+ try {
338
+ await this.flushAllEvents();
339
+ await this.entryChain;
340
+ const counts = await this.store.sessionCounts(this.runDir, this.segmentId);
341
+ await this.store.writeSessionCapture(this.runDir, {
342
+ schema: SESSION_CAPTURE_SCHEMA,
343
+ eventSchema: SESSION_EVENT_SCHEMA,
344
+ status: this.captureFailure ? "failed" : "complete",
345
+ ...counts,
346
+ ...(this.captureFailure ? { failure: this.captureFailure } : {}),
347
+ }, this.segmentId);
348
+ }
349
+ catch (error) {
350
+ // Capture is observational. A finalization failure must never reject
351
+ // the workflow's terminal persistence hook.
352
+ this.failCapture("capture_finalize_failed", failureMessage(error));
353
+ try {
354
+ const counts = await this.store.sessionCounts(this.runDir, this.segmentId);
355
+ await this.store.writeSessionCapture(this.runDir, {
356
+ schema: SESSION_CAPTURE_SCHEMA,
357
+ eventSchema: SESSION_EVENT_SCHEMA,
358
+ status: "failed",
359
+ ...counts,
360
+ failure: this.captureFailure ?? {
361
+ failedAt: new Date().toISOString(),
362
+ code: "capture_finalize_failed",
363
+ message: failureMessage(error),
364
+ },
365
+ }, this.segmentId);
366
+ }
367
+ catch {
368
+ // The viewer will report the missing/invalid capture file.
369
+ }
370
+ }
371
+ finally {
372
+ if (this.finishTimer) {
373
+ clearTimeout(this.finishTimer);
374
+ this.finishTimer = null;
375
+ }
376
+ this.resolveFinish?.();
377
+ this.resolveFinish = null;
378
+ }
379
+ })();
380
+ return await this.stopPromise;
381
+ }
382
+ mark() {
383
+ return this.recorded.length;
384
+ }
385
+ rangeSince(mark) {
386
+ if (this.recorded.length <= mark) {
387
+ return undefined;
388
+ }
389
+ return {
390
+ firstEntryId: this.recorded[mark],
391
+ lastEntryId: this.recorded.at(-1),
392
+ };
393
+ }
394
+ ownerForMessage(message) {
395
+ const key = objectKey(message);
396
+ const stableKey = stableMessageKey(message);
397
+ return ((key ? this.messageOwners.get(key) : undefined) ??
398
+ (stableKey ? this.stableMessageOwners.get(stableKey) : undefined) ??
399
+ this.currentMessage);
400
+ }
401
+ claimEntry(role, message) {
402
+ const messageKey = stableMessageKey(message);
403
+ const entry = this.unclaimedEntries.find((candidate) => {
404
+ if (candidate.claimed || entryRole(candidate.entry) !== role) {
405
+ return false;
406
+ }
407
+ return messageKey === null || stableMessageKey(candidate.entry.message) === messageKey;
408
+ });
409
+ if (!entry) {
410
+ return undefined;
411
+ }
412
+ entry.claimed = true;
413
+ return entry.id;
414
+ }
415
+ enqueue(owner, type, payload, at = new Date().toISOString(), extra = {}, deferFlush = false) {
416
+ if (!this.bound || !this.acceptingEvents || this.captureFailure) {
417
+ return null;
418
+ }
419
+ const messageId = "messageId" in owner ? owner.messageId : undefined;
420
+ const record = {
421
+ seq: this.nextEventSeq,
422
+ at,
423
+ nodeId: owner.nodeId,
424
+ attemptId: owner.attemptId,
425
+ turnId: owner.turnId,
426
+ ...(messageId === undefined ? {} : { messageId }),
427
+ ...(extra.toolCallId === undefined ? {} : { toolCallId: extra.toolCallId }),
428
+ type,
429
+ payload,
430
+ };
431
+ const bytes = Buffer.byteLength(JSON.stringify(record), "utf8") + 1;
432
+ const externalizable = type === "tool_execution_started" ||
433
+ type === "tool_execution_finished" ||
434
+ (type === "assistant_event" && payload.type === "toolcall_end");
435
+ if (bytes > SESSION_EVENT_MAX_BYTES && !externalizable) {
436
+ this.failCapture("event_too_large", `session event exceeded ${SESSION_EVENT_MAX_BYTES} bytes`);
437
+ return null;
438
+ }
439
+ if (this.outstandingRecords + 1 > QUEUE_MAX_RECORDS ||
440
+ this.outstandingBytes + bytes > QUEUE_MAX_BYTES) {
441
+ this.failCapture("event_queue_overflow", "session event queue limit exceeded");
442
+ return null;
443
+ }
444
+ this.nextEventSeq += 1;
445
+ const queued = { record, bytes };
446
+ this.eventQueue.push(queued);
447
+ this.outstandingRecords += 1;
448
+ this.outstandingBytes += bytes;
449
+ if (!deferFlush) {
450
+ if (this.eventQueue.length >= FLUSH_MAX_RECORDS || this.queuedBytes() >= FLUSH_MAX_BYTES) {
451
+ this.startFlush();
452
+ }
453
+ else {
454
+ this.scheduleFlush();
455
+ }
456
+ }
457
+ return queued;
458
+ }
459
+ queuedBytes() {
460
+ return this.eventQueue.reduce((sum, queued) => sum + queued.bytes, 0);
461
+ }
462
+ scheduleFlush() {
463
+ if (this.pendingMessageEnds.length > 0 || this.flushTimer || this.flushPromise) {
464
+ return;
465
+ }
466
+ this.flushTimer = setTimeout(() => {
467
+ this.flushTimer = null;
468
+ this.startFlush();
469
+ }, FLUSH_INTERVAL_MS);
470
+ this.flushTimer.unref?.();
471
+ }
472
+ startFlush() {
473
+ if (this.pendingMessageEnds.length > 0 || this.flushPromise || this.eventQueue.length === 0) {
474
+ return;
475
+ }
476
+ this.clearFlushTimer();
477
+ const batch = [];
478
+ let bytes = 0;
479
+ while (this.eventQueue.length > 0 && batch.length < FLUSH_MAX_RECORDS) {
480
+ const next = this.eventQueue[0];
481
+ if (batch.length > 0 && bytes + next.bytes > FLUSH_MAX_BYTES) {
482
+ break;
483
+ }
484
+ batch.push(this.eventQueue.shift());
485
+ bytes += next.bytes;
486
+ }
487
+ this.flushPromise = this.store
488
+ .appendSessionEventBatch(this.runDir, batch.map((queued) => queued.record), this.segmentId)
489
+ .catch((error) => {
490
+ const message = failureMessage(error);
491
+ this.failCapture(message.includes(`exceeded ${SESSION_EVENT_MAX_BYTES} bytes`)
492
+ ? "event_too_large"
493
+ : "event_write_failed", message);
494
+ for (const queued of this.eventQueue.splice(0)) {
495
+ this.outstandingRecords -= 1;
496
+ this.outstandingBytes -= queued.bytes;
497
+ }
498
+ })
499
+ .finally(() => {
500
+ for (const queued of batch) {
501
+ this.outstandingRecords -= 1;
502
+ this.outstandingBytes -= queued.bytes;
503
+ }
504
+ this.flushPromise = null;
505
+ if (this.eventQueue.length > 0 && this.captureFailure?.code !== "event_write_failed") {
506
+ this.startFlush();
507
+ }
508
+ });
509
+ }
510
+ async flushAllEvents() {
511
+ this.clearFlushTimer();
512
+ while (this.eventQueue.length > 0 || this.flushPromise) {
513
+ if (!this.flushPromise) {
514
+ this.startFlush();
515
+ }
516
+ await this.flushPromise;
517
+ }
518
+ }
519
+ clearFlushTimer() {
520
+ if (this.flushTimer) {
521
+ clearTimeout(this.flushTimer);
522
+ this.flushTimer = null;
523
+ }
524
+ }
525
+ failCapture(code, message) {
526
+ if (this.captureFailure) {
527
+ return;
528
+ }
529
+ this.captureFailure = {
530
+ failedAt: new Date().toISOString(),
531
+ code,
532
+ message,
533
+ };
534
+ this.acceptingEvents = false;
535
+ }
536
+ }
537
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/extension/recorder.ts"],"names":[],"mappings":"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"}