@fragno-dev/pi-harness 0.0.0-stage → 0.0.3

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 (140) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +181 -2
  3. package/dist/browser/agent-harness-event-protocol-CuKubox1.js +666 -0
  4. package/dist/browser/agent-harness-event-protocol-CuKubox1.js.map +1 -0
  5. package/dist/browser/agent-harness-event-protocol-d6mH_9n3.d.ts +261 -0
  6. package/dist/browser/agent-harness-event-protocol-d6mH_9n3.d.ts.map +1 -0
  7. package/dist/browser/client/clients.d.ts +2 -0
  8. package/dist/browser/client/clients.js +2 -0
  9. package/dist/browser/client/pi-workflow-emission-stream.d.ts +13 -0
  10. package/dist/browser/client/pi-workflow-emission-stream.d.ts.map +1 -0
  11. package/dist/browser/client/pi-workflow-emission-stream.js +29 -0
  12. package/dist/browser/client/pi-workflow-emission-stream.js.map +1 -0
  13. package/dist/browser/client/react.d.ts +147 -0
  14. package/dist/browser/client/react.d.ts.map +1 -0
  15. package/dist/browser/client/react.js +187 -0
  16. package/dist/browser/client/react.js.map +1 -0
  17. package/dist/browser/client/solid.d.ts +150 -0
  18. package/dist/browser/client/solid.d.ts.map +1 -0
  19. package/dist/browser/client/solid.js +130 -0
  20. package/dist/browser/client/solid.js.map +1 -0
  21. package/dist/browser/client/svelte.d.ts +150 -0
  22. package/dist/browser/client/svelte.d.ts.map +1 -0
  23. package/dist/browser/client/svelte.js +132 -0
  24. package/dist/browser/client/svelte.js.map +1 -0
  25. package/dist/browser/client/vanilla.d.ts +177 -0
  26. package/dist/browser/client/vanilla.d.ts.map +1 -0
  27. package/dist/browser/client/vanilla.js +159 -0
  28. package/dist/browser/client/vanilla.js.map +1 -0
  29. package/dist/browser/client/vue.d.ts +150 -0
  30. package/dist/browser/client/vue.d.ts.map +1 -0
  31. package/dist/browser/client/vue.js +128 -0
  32. package/dist/browser/client/vue.js.map +1 -0
  33. package/dist/browser/client/workflow-lofi-session-projection.d.ts +17 -0
  34. package/dist/browser/client/workflow-lofi-session-projection.d.ts.map +1 -0
  35. package/dist/browser/client/workflow-lofi-session-projection.js +107 -0
  36. package/dist/browser/client/workflow-lofi-session-projection.js.map +1 -0
  37. package/dist/browser/clients-DYXj19je.d.ts +247 -0
  38. package/dist/browser/clients-DYXj19je.d.ts.map +1 -0
  39. package/dist/browser/clients-pIAk6ClP.js +1853 -0
  40. package/dist/browser/clients-pIAk6ClP.js.map +1 -0
  41. package/dist/browser/pi/context-usage.d.ts +20 -0
  42. package/dist/browser/pi/context-usage.d.ts.map +1 -0
  43. package/dist/browser/pi/context-usage.js +84 -0
  44. package/dist/browser/pi/context-usage.js.map +1 -0
  45. package/dist/browser/pi/harness/agent-harness-event-protocol.d.ts +2 -0
  46. package/dist/browser/pi/harness/agent-harness-event-protocol.js +2 -0
  47. package/dist/browser/pi/route-schemas.d.ts +2 -0
  48. package/dist/browser/pi/route-schemas.js +130 -0
  49. package/dist/browser/pi/route-schemas.js.map +1 -0
  50. package/dist/browser/pi/workflow-session-projection.d.ts +2 -0
  51. package/dist/browser/pi/workflow-session-projection.js +2 -0
  52. package/dist/browser/route-schemas-DQB5ZR1E.d.ts +109 -0
  53. package/dist/browser/route-schemas-DQB5ZR1E.d.ts.map +1 -0
  54. package/dist/browser/types-8q4RWFXT.js +23 -0
  55. package/dist/browser/types-8q4RWFXT.js.map +1 -0
  56. package/dist/browser/types-Dk856kV1.d.ts +527 -0
  57. package/dist/browser/types-Dk856kV1.d.ts.map +1 -0
  58. package/dist/browser/workflow-session-projection-CJ4MUkpJ.js +443 -0
  59. package/dist/browser/workflow-session-projection-CJ4MUkpJ.js.map +1 -0
  60. package/dist/browser/workflow-session-projection-Dj_a79GF.d.ts +93 -0
  61. package/dist/browser/workflow-session-projection-Dj_a79GF.d.ts.map +1 -0
  62. package/dist/node/pi/compact-command-outcome-projection.js +41 -0
  63. package/dist/node/pi/compact-command-outcome-projection.js.map +1 -0
  64. package/dist/node/pi/context-usage.d.ts +20 -0
  65. package/dist/node/pi/context-usage.d.ts.map +1 -0
  66. package/dist/node/pi/context-usage.js +84 -0
  67. package/dist/node/pi/context-usage.js.map +1 -0
  68. package/dist/node/pi/definition.d.ts +535 -0
  69. package/dist/node/pi/definition.d.ts.map +1 -0
  70. package/dist/node/pi/definition.js +71 -0
  71. package/dist/node/pi/definition.js.map +1 -0
  72. package/dist/node/pi/factory.d.ts +142 -0
  73. package/dist/node/pi/factory.d.ts.map +1 -0
  74. package/dist/node/pi/factory.js +22 -0
  75. package/dist/node/pi/factory.js.map +1 -0
  76. package/dist/node/pi/harness/agent-harness-event-protocol.d.ts +261 -0
  77. package/dist/node/pi/harness/agent-harness-event-protocol.d.ts.map +1 -0
  78. package/dist/node/pi/harness/agent-harness-event-protocol.js +588 -0
  79. package/dist/node/pi/harness/agent-harness-event-protocol.js.map +1 -0
  80. package/dist/node/pi/harness/json-value.js +82 -0
  81. package/dist/node/pi/harness/json-value.js.map +1 -0
  82. package/dist/node/pi/harness/pi-operation-completed.d.ts +16 -0
  83. package/dist/node/pi/harness/pi-operation-completed.d.ts.map +1 -0
  84. package/dist/node/pi/harness/pi-operation-completed.js +71 -0
  85. package/dist/node/pi/harness/pi-operation-completed.js.map +1 -0
  86. package/dist/node/pi/harness/session-storage.d.ts +62 -0
  87. package/dist/node/pi/harness/session-storage.d.ts.map +1 -0
  88. package/dist/node/pi/harness/session-storage.js +174 -0
  89. package/dist/node/pi/harness/session-storage.js.map +1 -0
  90. package/dist/node/pi/pi-jsonl-export.d.ts +11 -0
  91. package/dist/node/pi/pi-jsonl-export.d.ts.map +1 -0
  92. package/dist/node/pi/pi-jsonl-export.js +31 -0
  93. package/dist/node/pi/pi-jsonl-export.js.map +1 -0
  94. package/dist/node/pi/route-schemas.d.ts +109 -0
  95. package/dist/node/pi/route-schemas.d.ts.map +1 -0
  96. package/dist/node/pi/route-schemas.js +130 -0
  97. package/dist/node/pi/route-schemas.js.map +1 -0
  98. package/dist/node/pi/session-command-protocol.d.ts +14 -0
  99. package/dist/node/pi/session-command-protocol.d.ts.map +1 -0
  100. package/dist/node/pi/session-command-protocol.js +25 -0
  101. package/dist/node/pi/session-command-protocol.js.map +1 -0
  102. package/dist/node/pi/session-entry-projection.js +79 -0
  103. package/dist/node/pi/session-entry-projection.js.map +1 -0
  104. package/dist/node/pi/skills.d.ts +70 -0
  105. package/dist/node/pi/skills.d.ts.map +1 -0
  106. package/dist/node/pi/skills.js +150 -0
  107. package/dist/node/pi/skills.js.map +1 -0
  108. package/dist/node/pi/tools.d.ts +12 -0
  109. package/dist/node/pi/tools.d.ts.map +1 -0
  110. package/dist/node/pi/tools.js +8 -0
  111. package/dist/node/pi/tools.js.map +1 -0
  112. package/dist/node/pi/types.d.ts +165 -0
  113. package/dist/node/pi/types.d.ts.map +1 -0
  114. package/dist/node/pi/types.js +49 -0
  115. package/dist/node/pi/types.js.map +1 -0
  116. package/dist/node/pi/wait-for-command-step.js +46 -0
  117. package/dist/node/pi/wait-for-command-step.js.map +1 -0
  118. package/dist/node/pi/workflow-session-live-projection.js +220 -0
  119. package/dist/node/pi/workflow-session-live-projection.js.map +1 -0
  120. package/dist/node/pi/workflow-session-projection.d.ts +84 -0
  121. package/dist/node/pi/workflow-session-projection.d.ts.map +1 -0
  122. package/dist/node/pi/workflow-session-projection.js +100 -0
  123. package/dist/node/pi/workflow-session-projection.js.map +1 -0
  124. package/dist/node/pi/workflows/interactive-chat-workflow.d.ts +37 -0
  125. package/dist/node/pi/workflows/interactive-chat-workflow.d.ts.map +1 -0
  126. package/dist/node/pi/workflows/interactive-chat-workflow.js +219 -0
  127. package/dist/node/pi/workflows/interactive-chat-workflow.js.map +1 -0
  128. package/dist/node/pi/workflows/workflow-agent-harness.d.ts +142 -0
  129. package/dist/node/pi/workflows/workflow-agent-harness.d.ts.map +1 -0
  130. package/dist/node/pi/workflows/workflow-agent-harness.js +450 -0
  131. package/dist/node/pi/workflows/workflow-agent-harness.js.map +1 -0
  132. package/dist/node/routes.d.ts +631 -0
  133. package/dist/node/routes.d.ts.map +1 -0
  134. package/dist/node/routes.js +355 -0
  135. package/dist/node/routes.js.map +1 -0
  136. package/dist/node/schema.d.ts +5 -0
  137. package/dist/node/schema.d.ts.map +1 -0
  138. package/dist/node/schema.js +7 -0
  139. package/dist/node/schema.js.map +1 -0
  140. package/package.json +175 -3
@@ -0,0 +1,666 @@
1
+ //#region src/pi/harness/json-value.ts
2
+ const jsonValueError = (path, reason) => /* @__PURE__ */ new Error(`PI_HARNESS_EVENT_VALUE_NOT_JSON_COMPATIBLE:${path}:${reason}`);
3
+ const snapshotJsonValueAtPath = (value, path, ancestors) => {
4
+ if (value === null || typeof value === "string" || typeof value === "boolean") return value;
5
+ if (typeof value === "number") {
6
+ if (!Number.isFinite(value)) throw jsonValueError(path, "non-finite-number");
7
+ return value;
8
+ }
9
+ if (typeof value !== "object") throw jsonValueError(path, typeof value);
10
+ if (ancestors.has(value)) throw jsonValueError(path, "cycle");
11
+ ancestors.add(value);
12
+ try {
13
+ if (Array.isArray(value)) {
14
+ const snapshot = [];
15
+ for (let index = 0; index < value.length; index += 1) {
16
+ if (!Object.hasOwn(value, index)) throw jsonValueError(`${path}[${index}]`, "sparse-array-entry");
17
+ snapshot.push(snapshotJsonValueAtPath(value[index], `${path}[${index}]`, ancestors));
18
+ }
19
+ return snapshot;
20
+ }
21
+ const prototype = Object.getPrototypeOf(value);
22
+ if (prototype !== Object.prototype && prototype !== null) throw jsonValueError(path, "non-plain-object");
23
+ const snapshot = {};
24
+ for (const key of Object.keys(value)) {
25
+ const propertyValue = value[key];
26
+ if (propertyValue === void 0) continue;
27
+ snapshot[key] = snapshotJsonValueAtPath(propertyValue, `${path}.${key}`, ancestors);
28
+ }
29
+ return snapshot;
30
+ } finally {
31
+ ancestors.delete(value);
32
+ }
33
+ };
34
+ /** Validates and detaches a value at the workflow JSON boundary. */
35
+ const snapshotPiHarnessJsonValue = (value, path = "$event") => snapshotJsonValueAtPath(value, path, /* @__PURE__ */ new Set());
36
+ const assertJsonValueAtPath = (value, path, ancestors) => {
37
+ if (value === null || typeof value === "string" || typeof value === "boolean") return;
38
+ if (typeof value === "number") {
39
+ if (!Number.isFinite(value)) throw jsonValueError(path, "non-finite-number");
40
+ return;
41
+ }
42
+ if (typeof value !== "object") throw jsonValueError(path, typeof value);
43
+ if (ancestors.has(value)) throw jsonValueError(path, "cycle");
44
+ ancestors.add(value);
45
+ try {
46
+ if (Array.isArray(value)) {
47
+ for (let index = 0; index < value.length; index += 1) {
48
+ if (!Object.hasOwn(value, index)) throw jsonValueError(`${path}[${index}]`, "sparse-array-entry");
49
+ assertJsonValueAtPath(value[index], `${path}[${index}]`, ancestors);
50
+ }
51
+ return;
52
+ }
53
+ const prototype = Object.getPrototypeOf(value);
54
+ if (prototype !== Object.prototype && prototype !== null) throw jsonValueError(path, "non-plain-object");
55
+ for (const key of Object.keys(value)) {
56
+ const propertyValue = value[key];
57
+ if (propertyValue !== void 0) assertJsonValueAtPath(propertyValue, `${path}.${key}`, ancestors);
58
+ }
59
+ } finally {
60
+ ancestors.delete(value);
61
+ }
62
+ };
63
+ /** Validates persisted protocol input without copying it. */
64
+ const assertPiHarnessJsonValue = (value, path = "$event") => {
65
+ assertJsonValueAtPath(value, path, /* @__PURE__ */ new Set());
66
+ };
67
+ const freezeJsonValue = (value, visited) => {
68
+ if (value === null || typeof value !== "object" || visited.has(value)) return;
69
+ visited.add(value);
70
+ for (const child of Array.isArray(value) ? value : Object.values(value)) freezeJsonValue(child, visited);
71
+ Object.freeze(value);
72
+ };
73
+ /** Validates and freezes persisted protocol input so interned references remain immutable. */
74
+ const freezePiHarnessJsonValue = (value, path = "$event") => {
75
+ assertPiHarnessJsonValue(value, path);
76
+ freezeJsonValue(value, /* @__PURE__ */ new Set());
77
+ return value;
78
+ };
79
+ //#endregion
80
+ //#region src/pi/harness/agent-harness-event-protocol.ts
81
+ const piToolCallArgumentsText = (toolCall) => {
82
+ const partialJson = toolCall.partialJson;
83
+ return typeof partialJson === "string" ? partialJson : void 0;
84
+ };
85
+ const assistantMessageMetadata = ({ usage, stopReason, errorMessage, timestamp }) => ({
86
+ usage,
87
+ stopReason,
88
+ errorMessage,
89
+ timestamp
90
+ });
91
+ const compactAssistantMessageMetadataUpdate = (previous, next) => {
92
+ const update = {
93
+ ...previous.usage.input === next.usage.input && previous.usage.output === next.usage.output && previous.usage.cacheRead === next.usage.cacheRead && previous.usage.cacheWrite === next.usage.cacheWrite && previous.usage.cacheWrite1h === next.usage.cacheWrite1h && previous.usage.reasoning === next.usage.reasoning && previous.usage.totalTokens === next.usage.totalTokens && previous.usage.cost.input === next.usage.cost.input && previous.usage.cost.output === next.usage.cost.output && previous.usage.cost.cacheRead === next.usage.cost.cacheRead && previous.usage.cost.cacheWrite === next.usage.cost.cacheWrite && previous.usage.cost.total === next.usage.cost.total ? {} : { usage: next.usage },
94
+ ...previous.stopReason === next.stopReason ? {} : { stopReason: next.stopReason },
95
+ ...previous.errorMessage === next.errorMessage ? {} : { errorMessage: next.errorMessage ?? null },
96
+ ...previous.timestamp === next.timestamp ? {} : { timestamp: next.timestamp }
97
+ };
98
+ return Object.keys(update).length === 0 ? void 0 : update;
99
+ };
100
+ const assistantMessageWithMetadataUpdate = (message, update) => ({
101
+ ...message,
102
+ ...update.usage === void 0 ? {} : { usage: update.usage },
103
+ ...update.stopReason === void 0 ? {} : { stopReason: update.stopReason },
104
+ ...update.errorMessage === void 0 ? {} : update.errorMessage === null ? { errorMessage: void 0 } : { errorMessage: update.errorMessage },
105
+ ...update.timestamp === void 0 ? {} : { timestamp: update.timestamp }
106
+ });
107
+ const streamedMessageUpdateEvent = (event) => {
108
+ switch (event.type) {
109
+ case "start":
110
+ case "done":
111
+ case "error": throw new Error("PI_HARNESS_EVENT_PROTOCOL_NON_STREAMING_MESSAGE_UPDATE");
112
+ case "text_start":
113
+ case "text_delta":
114
+ case "text_end":
115
+ case "thinking_start":
116
+ case "thinking_delta":
117
+ case "thinking_end":
118
+ case "toolcall_start":
119
+ case "toolcall_delta":
120
+ case "toolcall_end": return event;
121
+ }
122
+ throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_MESSAGE_UPDATE");
123
+ };
124
+ const thinkingContentFromPartial = (event) => {
125
+ const content = event.partial.content[event.contentIndex];
126
+ if (content?.type !== "thinking") throw new Error("PI_HARNESS_EVENT_PROTOCOL_THINKING_UPDATE_WITHOUT_THINKING_BLOCK");
127
+ return content;
128
+ };
129
+ const toolCallFromPartial = (event) => {
130
+ const content = event.partial.content[event.contentIndex];
131
+ if (content?.type !== "toolCall") throw new Error("PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_UPDATE_WITHOUT_TOOL_CALL_BLOCK");
132
+ return content;
133
+ };
134
+ const thinkingMetadataFields = (content) => content.redacted === void 0 ? {} : { redacted: content.redacted };
135
+ const projectToolCall = ({ thoughtSignature: _thoughtSignature, ...toolCall }) => toolCall;
136
+ const projectAssistantMessage = ({ api: _api, provider: _provider, model: _model, responseModel: _responseModel, responseId: _responseId, diagnostics: _diagnostics, content, ...message }) => ({
137
+ ...message,
138
+ content: content.map((block) => {
139
+ switch (block.type) {
140
+ case "text": {
141
+ const { textSignature: _textSignature, ...text } = block;
142
+ return text;
143
+ }
144
+ case "thinking": {
145
+ const { thinkingSignature: _thinkingSignature, ...thinking } = block;
146
+ return thinking;
147
+ }
148
+ case "toolCall": return projectToolCall(block);
149
+ }
150
+ throw new Error("PI_HARNESS_FRONTEND_PROTOCOL_UNKNOWN_ASSISTANT_CONTENT");
151
+ })
152
+ });
153
+ const projectAgentMessage = (message) => message.role === "assistant" ? projectAssistantMessage(message) : message;
154
+ const compactAssistantMessageEvent = (event) => {
155
+ switch (event.type) {
156
+ case "text_start": return {
157
+ type: event.type,
158
+ contentIndex: event.contentIndex
159
+ };
160
+ case "text_delta": return {
161
+ type: event.type,
162
+ contentIndex: event.contentIndex,
163
+ delta: event.delta
164
+ };
165
+ case "text_end": return {
166
+ type: event.type,
167
+ contentIndex: event.contentIndex,
168
+ content: event.content
169
+ };
170
+ case "thinking_start": {
171
+ const content = thinkingContentFromPartial(event);
172
+ return {
173
+ type: event.type,
174
+ contentIndex: event.contentIndex,
175
+ ...thinkingMetadataFields(content)
176
+ };
177
+ }
178
+ case "thinking_delta": {
179
+ const content = thinkingContentFromPartial(event);
180
+ return {
181
+ type: event.type,
182
+ contentIndex: event.contentIndex,
183
+ delta: event.delta,
184
+ ...thinkingMetadataFields(content)
185
+ };
186
+ }
187
+ case "thinking_end": {
188
+ const content = thinkingContentFromPartial(event);
189
+ return {
190
+ type: event.type,
191
+ contentIndex: event.contentIndex,
192
+ content: event.content,
193
+ ...thinkingMetadataFields(content)
194
+ };
195
+ }
196
+ case "toolcall_start": return {
197
+ type: event.type,
198
+ contentIndex: event.contentIndex,
199
+ toolCall: projectToolCall(toolCallFromPartial(event))
200
+ };
201
+ case "toolcall_delta": return {
202
+ type: event.type,
203
+ contentIndex: event.contentIndex,
204
+ delta: event.delta
205
+ };
206
+ case "toolcall_end": return {
207
+ type: event.type,
208
+ contentIndex: event.contentIndex,
209
+ toolCall: projectToolCall(event.toolCall)
210
+ };
211
+ }
212
+ throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_STREAMING_MESSAGE_UPDATE");
213
+ };
214
+ function isPrimitiveOnlyMessageUpdate(event) {
215
+ if (event.type !== "message_update") return false;
216
+ if (event.metadata !== void 0) return false;
217
+ switch (event.update.type) {
218
+ case "text_start":
219
+ case "text_delta":
220
+ case "text_end":
221
+ case "thinking_start":
222
+ case "thinking_delta":
223
+ case "thinking_end":
224
+ case "toolcall_delta": return true;
225
+ case "toolcall_start":
226
+ case "toolcall_end": return false;
227
+ }
228
+ throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_COMPACT_MESSAGE_UPDATE");
229
+ }
230
+ const streamedAssistantMessageEvent = (update, partial) => {
231
+ switch (update.type) {
232
+ case "text_start":
233
+ case "thinking_start":
234
+ case "toolcall_start": return {
235
+ type: update.type,
236
+ contentIndex: update.contentIndex,
237
+ partial
238
+ };
239
+ case "text_delta":
240
+ case "thinking_delta":
241
+ case "toolcall_delta": return {
242
+ type: update.type,
243
+ contentIndex: update.contentIndex,
244
+ delta: update.delta,
245
+ partial
246
+ };
247
+ case "text_end":
248
+ case "thinking_end": return {
249
+ type: update.type,
250
+ contentIndex: update.contentIndex,
251
+ content: update.content,
252
+ partial
253
+ };
254
+ case "toolcall_end": return {
255
+ type: update.type,
256
+ contentIndex: update.contentIndex,
257
+ toolCall: update.toolCall,
258
+ partial
259
+ };
260
+ }
261
+ throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_COMPACT_MESSAGE_UPDATE");
262
+ };
263
+ const applyCompactAssistantMessageEvent = (message, update, toolCallJsonByContentIndex) => {
264
+ if (update.contentIndex > message.content.length) throw new Error(`PI_HARNESS_EVENT_PROTOCOL_SPARSE_CONTENT_INDEX:${update.contentIndex}`);
265
+ switch (update.type) {
266
+ case "text_start":
267
+ message.content[update.contentIndex] = {
268
+ type: "text",
269
+ text: ""
270
+ };
271
+ return;
272
+ case "text_delta": {
273
+ const content = message.content[update.contentIndex];
274
+ if (content?.type !== "text") throw new Error("PI_HARNESS_EVENT_PROTOCOL_TEXT_DELTA_WITHOUT_TEXT_BLOCK");
275
+ message.content[update.contentIndex] = {
276
+ type: "text",
277
+ text: content.text + update.delta
278
+ };
279
+ return;
280
+ }
281
+ case "text_end":
282
+ message.content[update.contentIndex] = {
283
+ type: "text",
284
+ text: update.content
285
+ };
286
+ return;
287
+ case "thinking_start":
288
+ message.content[update.contentIndex] = {
289
+ type: "thinking",
290
+ thinking: "",
291
+ ...update.redacted === void 0 ? {} : { redacted: update.redacted }
292
+ };
293
+ return;
294
+ case "thinking_delta": {
295
+ const content = message.content[update.contentIndex];
296
+ if (content?.type !== "thinking") throw new Error("PI_HARNESS_EVENT_PROTOCOL_THINKING_DELTA_WITHOUT_THINKING_BLOCK");
297
+ message.content[update.contentIndex] = {
298
+ type: "thinking",
299
+ thinking: content.thinking + update.delta,
300
+ ...update.redacted === void 0 ? {} : { redacted: update.redacted }
301
+ };
302
+ return;
303
+ }
304
+ case "thinking_end":
305
+ message.content[update.contentIndex] = {
306
+ type: "thinking",
307
+ thinking: update.content,
308
+ ...update.redacted === void 0 ? {} : { redacted: update.redacted }
309
+ };
310
+ return;
311
+ case "toolcall_start":
312
+ toolCallJsonByContentIndex.set(update.contentIndex, piToolCallArgumentsText(update.toolCall) ?? "");
313
+ message.content[update.contentIndex] = update.toolCall;
314
+ return;
315
+ case "toolcall_delta": {
316
+ const content = message.content[update.contentIndex];
317
+ if (content?.type !== "toolCall") throw new Error("PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_DELTA_WITHOUT_TOOL_CALL_BLOCK");
318
+ const previousJson = toolCallJsonByContentIndex.get(update.contentIndex);
319
+ if (previousJson === void 0) throw new Error("PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_DELTA_WITHOUT_TOOL_CALL_START");
320
+ const partialJson = previousJson + update.delta;
321
+ toolCallJsonByContentIndex.set(update.contentIndex, partialJson);
322
+ message.content[update.contentIndex] = {
323
+ ...content,
324
+ partialJson
325
+ };
326
+ return;
327
+ }
328
+ case "toolcall_end":
329
+ toolCallJsonByContentIndex.delete(update.contentIndex);
330
+ message.content[update.contentIndex] = update.toolCall;
331
+ }
332
+ };
333
+ var ValueEncoder = class {
334
+ #idsByValue = /* @__PURE__ */ new Map();
335
+ encode(value) {
336
+ const existingId = this.#idsByValue.get(value);
337
+ if (existingId !== void 0) return {
338
+ kind: "reference",
339
+ id: existingId
340
+ };
341
+ const id = this.#idsByValue.size;
342
+ this.#idsByValue.set(value, id);
343
+ return {
344
+ kind: "value",
345
+ id,
346
+ value
347
+ };
348
+ }
349
+ };
350
+ var ValueDecoder = class {
351
+ #valuesById = /* @__PURE__ */ new Map();
352
+ decode(encoded) {
353
+ if (encoded.kind === "value") {
354
+ this.#valuesById.set(encoded.id, encoded.value);
355
+ return encoded.value;
356
+ }
357
+ if (!this.#valuesById.has(encoded.id)) throw new Error(`PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_VALUE_REFERENCE:${encoded.id}`);
358
+ return this.#valuesById.get(encoded.id);
359
+ }
360
+ };
361
+ var MessageEncoder = class {
362
+ #idsByMessage = /* @__PURE__ */ new Map();
363
+ encode(message) {
364
+ const existingId = this.#idsByMessage.get(message);
365
+ if (existingId !== void 0) return {
366
+ kind: "reference",
367
+ id: existingId
368
+ };
369
+ const id = this.#idsByMessage.size;
370
+ this.#idsByMessage.set(message, id);
371
+ return {
372
+ kind: "message",
373
+ id,
374
+ message: projectAgentMessage(message)
375
+ };
376
+ }
377
+ };
378
+ var MessageDecoder = class {
379
+ #messagesById = /* @__PURE__ */ new Map();
380
+ decode(encoded) {
381
+ if (encoded.kind === "message") {
382
+ this.#messagesById.set(encoded.id, encoded.message);
383
+ return encoded.message;
384
+ }
385
+ const message = this.#messagesById.get(encoded.id);
386
+ if (!message) throw new Error(`PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_MESSAGE_REFERENCE:${encoded.id}`);
387
+ return message;
388
+ }
389
+ };
390
+ const piHarnessEventStreamKey = ({ stepKey, executionId, epoch }) => `${stepKey}\u0000${executionId}\u0000${epoch}`;
391
+ function assertPiHarnessEncodedEvent(value) {
392
+ assertPiHarnessJsonValue(value);
393
+ if (typeof value !== "object" || value === null || !("protocol" in value) || value.protocol !== "pi-harness-event" || !("version" in value) || value.version !== 2 || !("event" in value) || typeof value.event !== "object" || value.event === null || !("type" in value.event) || typeof value.event.type !== "string") throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNSUPPORTED_PROTOCOL");
394
+ }
395
+ var PiHarnessEventEncoder = class {
396
+ #messages = new MessageEncoder();
397
+ #values = new ValueEncoder();
398
+ #activeAssistantMetadata;
399
+ encode(event) {
400
+ const compactEvent = this.#encodeEvent(event);
401
+ const envelope = {
402
+ protocol: "pi-harness-event",
403
+ version: 2,
404
+ event: compactEvent
405
+ };
406
+ const encoded = isPrimitiveOnlyMessageUpdate(compactEvent) ? envelope : snapshotPiHarnessJsonValue(envelope, `$event.${event.type}`);
407
+ this.#advanceAssistantMetadata(event, compactEvent);
408
+ return encoded;
409
+ }
410
+ #advanceAssistantMetadata(event, compactEvent) {
411
+ if (event.type === "message_start") this.#activeAssistantMetadata = event.message.role === "assistant" ? snapshotPiHarnessJsonValue(assistantMessageMetadata(event.message)) : void 0;
412
+ else if (event.type === "message_update") {
413
+ if (compactEvent.type !== "message_update") throw new Error("PI_HARNESS_EVENT_PROTOCOL_INVALID_COMPACT_MESSAGE_UPDATE");
414
+ if (compactEvent.metadata === void 0) return;
415
+ this.#activeAssistantMetadata = snapshotPiHarnessJsonValue(assistantMessageMetadata(event.assistantMessageEvent.partial));
416
+ } else if (event.type === "message_end") this.#activeAssistantMetadata = void 0;
417
+ }
418
+ #encodeEvent(event) {
419
+ switch (event.type) {
420
+ case "agent_start":
421
+ case "turn_start": return { type: event.type };
422
+ case "agent_end": return {
423
+ type: event.type,
424
+ messages: event.messages.map((message) => this.#messages.encode(message))
425
+ };
426
+ case "turn_end": return {
427
+ type: event.type,
428
+ message: this.#messages.encode(event.message),
429
+ toolResults: event.toolResults.map((message) => this.#messages.encode(message))
430
+ };
431
+ case "message_start": return {
432
+ type: event.type,
433
+ message: this.#messages.encode(event.message)
434
+ };
435
+ case "message_update": {
436
+ if (!this.#activeAssistantMetadata) throw new Error("PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_WITHOUT_ASSISTANT_START");
437
+ if (event.message.role !== "assistant") throw new Error("PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_NOT_ASSISTANT");
438
+ const assistantMessageEvent = streamedMessageUpdateEvent(event.assistantMessageEvent);
439
+ const update = compactAssistantMessageEvent(assistantMessageEvent);
440
+ const metadata = compactAssistantMessageMetadataUpdate(this.#activeAssistantMetadata, assistantMessageEvent.partial);
441
+ return {
442
+ type: event.type,
443
+ update,
444
+ ...metadata ? { metadata } : {}
445
+ };
446
+ }
447
+ case "message_end": return {
448
+ type: event.type,
449
+ message: this.#messages.encode(event.message)
450
+ };
451
+ case "tool_execution_start": return {
452
+ ...event,
453
+ args: this.#values.encode(event.args)
454
+ };
455
+ case "tool_execution_update": return {
456
+ ...event,
457
+ args: this.#values.encode(event.args),
458
+ partialResult: this.#values.encode(snapshotPiHarnessJsonValue(event.partialResult, "$event.tool_execution_update.partialResult"))
459
+ };
460
+ case "tool_execution_end": return {
461
+ ...event,
462
+ result: this.#values.encode(event.result)
463
+ };
464
+ case "queue_update": return {
465
+ type: event.type,
466
+ steer: event.steer.map((message) => this.#messages.encode(message)),
467
+ followUp: event.followUp.map((message) => this.#messages.encode(message)),
468
+ nextTurn: event.nextTurn.map((message) => this.#messages.encode(message))
469
+ };
470
+ case "save_point":
471
+ case "settled":
472
+ case "retry_scheduled":
473
+ case "retry_attempt_start":
474
+ case "retry_finished":
475
+ case "thinking_level_update":
476
+ case "tools_update": return event;
477
+ case "abort": return {
478
+ type: event.type,
479
+ clearedSteer: event.clearedSteer.map((message) => this.#messages.encode(message)),
480
+ clearedFollowUp: event.clearedFollowUp.map((message) => this.#messages.encode(message))
481
+ };
482
+ case "after_provider_response": return {
483
+ type: event.type,
484
+ status: event.status,
485
+ headers: this.#values.encode(event.headers)
486
+ };
487
+ case "session_compact": return {
488
+ type: event.type,
489
+ compactionEntry: this.#values.encode(event.compactionEntry),
490
+ fromHook: event.fromHook
491
+ };
492
+ case "session_tree": return {
493
+ type: event.type,
494
+ newLeafId: event.newLeafId,
495
+ oldLeafId: event.oldLeafId,
496
+ ...event.summaryEntry ? { summaryEntry: this.#values.encode(event.summaryEntry) } : {},
497
+ ...event.fromHook === void 0 ? {} : { fromHook: event.fromHook }
498
+ };
499
+ case "model_update": return {
500
+ type: event.type,
501
+ model: this.#values.encode(event.model),
502
+ ...event.previousModel ? { previousModel: this.#values.encode(event.previousModel) } : {},
503
+ source: event.source
504
+ };
505
+ case "resources_update": return {
506
+ type: event.type,
507
+ resources: this.#values.encode(event.resources),
508
+ previousResources: this.#values.encode(event.previousResources)
509
+ };
510
+ default: return {
511
+ type: "raw",
512
+ event
513
+ };
514
+ }
515
+ }
516
+ };
517
+ const piHarnessEventProtocol = {
518
+ createEncoder: () => new PiHarnessEventEncoder(),
519
+ createDecoder: () => new PiHarnessEventDecoder(),
520
+ eventType: (value) => {
521
+ assertPiHarnessEncodedEvent(value);
522
+ return value.event.type === "raw" ? value.event.event.type : value.event.type;
523
+ }
524
+ };
525
+ var PiHarnessEventDecoder = class {
526
+ #messages = new MessageDecoder();
527
+ #values = new ValueDecoder();
528
+ #toolCallJsonByContentIndex = /* @__PURE__ */ new Map();
529
+ #activeAssistantMessage;
530
+ decode(value) {
531
+ const encoded = freezePiHarnessJsonValue(value);
532
+ assertPiHarnessEncodedEvent(encoded);
533
+ return this.#decodeEvent(encoded.event);
534
+ }
535
+ #decodeEvent(encoded) {
536
+ switch (encoded.type) {
537
+ case "raw": return encoded.event;
538
+ case "agent_start":
539
+ case "turn_start": return { type: encoded.type };
540
+ case "agent_end": return {
541
+ type: encoded.type,
542
+ messages: encoded.messages.map((message) => this.#messages.decode(message))
543
+ };
544
+ case "turn_end": return {
545
+ type: encoded.type,
546
+ message: this.#messages.decode(encoded.message),
547
+ toolResults: encoded.toolResults.map((message) => this.#messages.decode(message))
548
+ };
549
+ case "message_start": {
550
+ const message = this.#messages.decode(encoded.message);
551
+ this.#toolCallJsonByContentIndex.clear();
552
+ this.#activeAssistantMessage = message.role === "assistant" ? message : void 0;
553
+ return {
554
+ type: encoded.type,
555
+ message
556
+ };
557
+ }
558
+ case "message_update": {
559
+ if (!this.#activeAssistantMessage) throw new Error("PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_WITHOUT_ASSISTANT_START");
560
+ const reconstructedMessage = snapshotPiHarnessJsonValue(this.#activeAssistantMessage);
561
+ applyCompactAssistantMessageEvent(reconstructedMessage, encoded.update, this.#toolCallJsonByContentIndex);
562
+ const message = encoded.metadata ? assistantMessageWithMetadataUpdate(reconstructedMessage, encoded.metadata) : reconstructedMessage;
563
+ this.#activeAssistantMessage = message;
564
+ return {
565
+ type: encoded.type,
566
+ message,
567
+ assistantMessageEvent: streamedAssistantMessageEvent(encoded.update, message)
568
+ };
569
+ }
570
+ case "message_end": {
571
+ const message = this.#messages.decode(encoded.message);
572
+ this.#toolCallJsonByContentIndex.clear();
573
+ this.#activeAssistantMessage = void 0;
574
+ return {
575
+ type: encoded.type,
576
+ message
577
+ };
578
+ }
579
+ case "tool_execution_start": return {
580
+ ...encoded,
581
+ args: this.#values.decode(encoded.args)
582
+ };
583
+ case "tool_execution_update": return {
584
+ ...encoded,
585
+ args: this.#values.decode(encoded.args),
586
+ partialResult: this.#values.decode(encoded.partialResult)
587
+ };
588
+ case "tool_execution_end": return {
589
+ ...encoded,
590
+ result: this.#values.decode(encoded.result)
591
+ };
592
+ case "queue_update": return {
593
+ type: encoded.type,
594
+ steer: encoded.steer.map((message) => this.#messages.decode(message)),
595
+ followUp: encoded.followUp.map((message) => this.#messages.decode(message)),
596
+ nextTurn: encoded.nextTurn.map((message) => this.#messages.decode(message))
597
+ };
598
+ case "save_point":
599
+ case "settled":
600
+ case "retry_scheduled":
601
+ case "retry_attempt_start":
602
+ case "retry_finished":
603
+ case "thinking_level_update": return encoded;
604
+ case "tools_update": return {
605
+ ...encoded,
606
+ toolNames: [...encoded.toolNames],
607
+ previousToolNames: [...encoded.previousToolNames],
608
+ activeToolNames: [...encoded.activeToolNames],
609
+ previousActiveToolNames: [...encoded.previousActiveToolNames]
610
+ };
611
+ case "abort": return {
612
+ type: encoded.type,
613
+ clearedSteer: encoded.clearedSteer.map((message) => this.#messages.decode(message)),
614
+ clearedFollowUp: encoded.clearedFollowUp.map((message) => this.#messages.decode(message))
615
+ };
616
+ case "after_provider_response": return {
617
+ type: encoded.type,
618
+ status: encoded.status,
619
+ headers: this.#values.decode(encoded.headers)
620
+ };
621
+ case "session_compact": return {
622
+ type: encoded.type,
623
+ compactionEntry: this.#values.decode(encoded.compactionEntry),
624
+ fromHook: encoded.fromHook
625
+ };
626
+ case "session_tree": return {
627
+ type: encoded.type,
628
+ newLeafId: encoded.newLeafId,
629
+ oldLeafId: encoded.oldLeafId,
630
+ ...encoded.summaryEntry ? { summaryEntry: this.#values.decode(encoded.summaryEntry) } : {},
631
+ ...encoded.fromHook === void 0 ? {} : { fromHook: encoded.fromHook }
632
+ };
633
+ case "model_update": return {
634
+ type: encoded.type,
635
+ model: this.#values.decode(encoded.model),
636
+ previousModel: encoded.previousModel ? this.#values.decode(encoded.previousModel) : void 0,
637
+ source: encoded.source
638
+ };
639
+ case "resources_update": return {
640
+ type: encoded.type,
641
+ resources: this.#values.decode(encoded.resources),
642
+ previousResources: this.#values.decode(encoded.previousResources)
643
+ };
644
+ }
645
+ throw new Error("PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_EVENT");
646
+ }
647
+ };
648
+ var PiHarnessEventStreamDecoders = class {
649
+ #decodersByStream = /* @__PURE__ */ new Map();
650
+ start(identity) {
651
+ this.#decodersByStream.set(piHarnessEventStreamKey(identity), new PiHarnessEventDecoder());
652
+ }
653
+ finish(identity) {
654
+ this.#decodersByStream.delete(piHarnessEventStreamKey(identity));
655
+ }
656
+ decode(identity, event) {
657
+ const streamKey = piHarnessEventStreamKey(identity);
658
+ const decoder = this.#decodersByStream.get(streamKey);
659
+ if (!decoder) throw new Error(`Pi harness event stream ${JSON.stringify(streamKey)} was not started.`);
660
+ return decoder.decode(event);
661
+ }
662
+ };
663
+ //#endregion
664
+ export { piToolCallArgumentsText as a, piHarnessEventProtocol as i, PiHarnessEventEncoder as n, PiHarnessEventStreamDecoders as r, PiHarnessEventDecoder as t };
665
+
666
+ //# sourceMappingURL=agent-harness-event-protocol-CuKubox1.js.map