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