@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 @@
1
+ {"version":3,"file":"agent-harness-event-protocol-CuKubox1.js","names":["PiHarnessJsonValue","key","jsonValueError","path","reason","Error","snapshotJsonValueAtPath","value","ancestors","Set","Number","isFinite","has","add","Array","isArray","snapshot","index","length","Object","hasOwn","push","prototype","getPrototypeOf","Record","keys","propertyValue","undefined","delete","snapshotPiHarnessJsonValue","T","assertJsonValueAtPath","assertPiHarnessJsonValue","freezeJsonValue","visited","child","values","freeze","freezePiHarnessJsonValue","AgentHarnessEvent","AgentMessage","AssistantMessage","AssistantMessageEvent","ToolCall","PiHarnessEventStreamEncoder","encode","event","TEncodedEvent","PiHarnessProjectedEvent","type","PiHarnessFrontendToolCall","Omit","PiHarnessFrontendAssistantContent","Extract","PiHarnessFrontendAssistantMessage","content","PiHarnessFrontendMessage","TMessage","PiHarnessFrontendAgentMessage","PiHarnessFrontendAssistantMessageEvent","TEvent","partial","toolCall","PiHarnessFrontendEventFields","TKey","PiHarnessFrontendEvent","PiHarnessEventStreamDecoder","decode","PiHarnessEventProtocol","createEncoder","createDecoder","eventType","piToolCallArgumentsText","partialJson","undefined","assertPiHarnessJsonValue","freezePiHarnessJsonValue","snapshotPiHarnessJsonValue","PiHarnessSubscribedEvent","Exclude","EncodedValue","kind","id","value","TValue","ProjectedAgentMessage","EncodedMessage","message","StreamedAssistantMessageEvent","ProjectedMessageUpdateEvent","AssistantThinkingContent","ProjectedAssistantMessage","AssistantMessageMetadata","Pick","CompactAssistantMessageEvent","contentIndex","delta","redacted","CompactAssistantMessageMetadataUpdate","usage","stopReason","errorMessage","timestamp","CompactMessageUpdate","update","metadata","PiHarnessCompactEvent","messages","toolResults","toolCallId","toolName","args","partialResult","result","isError","steer","followUp","nextTurn","hadPendingMutations","clearedSteer","clearedFollowUp","nextTurnCount","status","headers","SubscribedEvent","compactionEntry","fromHook","newLeafId","oldLeafId","summaryEntry","NonNullable","operation","attempt","maxAttempts","delayMs","model","previousModel","source","level","previousLevel","toolNames","previousToolNames","activeToolNames","previousActiveToolNames","resources","previousResources","TType","assistantMessageMetadata","compactAssistantMessageMetadataUpdate","previous","next","input","output","cacheRead","cacheWrite","cacheWrite1h","reasoning","totalTokens","cost","total","Object","keys","length","assistantMessageWithMetadataUpdate","streamedMessageUpdateEvent","Error","thinkingContentFromPartial","toolCallFromPartial","thinkingMetadataFields","projectToolCall","thoughtSignature","_thoughtSignature","projectAssistantMessage","api","_api","provider","_provider","_model","responseModel","_responseModel","responseId","_responseId","diagnostics","_diagnostics","map","block","textSignature","_textSignature","text","thinkingSignature","_thinkingSignature","thinking","projectAgentMessage","role","compactAssistantMessageEvent","isPrimitiveOnlyMessageUpdate","streamedAssistantMessageEvent","applyCompactAssistantMessageEvent","toolCallJsonByContentIndex","Map","set","previousJson","get","delete","ValueEncoder","idsByValue","existingId","size","ValueDecoder","valuesById","encoded","has","MessageEncoder","idsByMessage","MessageDecoder","messagesById","PiHarnessEncodedEvent","protocol","version","PiHarnessEncodedEventEmission","PiHarnessEventStreamIdentity","stepKey","executionId","epoch","piHarnessEventStreamKey","assertPiHarnessEncodedEvent","PiHarnessEventEncoder","values","activeAssistantMetadata","compactEvent","encodeEvent","envelope","advanceAssistantMetadata","#advanceAssistantMetadata","assistantMessageEvent","#encodeEvent","piHarnessEventProtocol","PiHarnessEventDecoder","activeAssistantMessage","decodeEvent","#decodeEvent","clear","reconstructedMessage","PiHarnessEventStreamDecoders","decodersByStream","start","identity","finish","streamKey","decoder","JSON","stringify"],"sources":["../../src/pi/harness/json-value.ts","../../src/pi/harness/agent-harness-event-protocol.ts"],"sourcesContent":["export type PiHarnessJsonValue =\n | null\n | boolean\n | number\n | string\n | PiHarnessJsonValue[]\n | { [key: string]: PiHarnessJsonValue };\n\nconst jsonValueError = (path: string, reason: string): Error =>\n new Error(`PI_HARNESS_EVENT_VALUE_NOT_JSON_COMPATIBLE:${path}:${reason}`);\n\nconst snapshotJsonValueAtPath = (\n value: unknown,\n path: string,\n ancestors: Set<object>,\n): PiHarnessJsonValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw jsonValueError(path, \"non-finite-number\");\n }\n return value;\n }\n if (typeof value !== \"object\") {\n throw jsonValueError(path, typeof value);\n }\n if (ancestors.has(value)) {\n throw jsonValueError(path, \"cycle\");\n }\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n const snapshot: PiHarnessJsonValue[] = [];\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.hasOwn(value, index)) {\n throw jsonValueError(`${path}[${index}]`, \"sparse-array-entry\");\n }\n snapshot.push(snapshotJsonValueAtPath(value[index], `${path}[${index}]`, ancestors));\n }\n return snapshot;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw jsonValueError(path, \"non-plain-object\");\n }\n\n const snapshot: Record<string, PiHarnessJsonValue> = {};\n for (const key of Object.keys(value)) {\n const propertyValue = (value as Record<string, unknown>)[key];\n // JSON omits undefined optional object properties. Pi uses these on otherwise valid messages.\n if (propertyValue === undefined) {\n continue;\n }\n snapshot[key] = snapshotJsonValueAtPath(propertyValue, `${path}.${key}`, ancestors);\n }\n return snapshot;\n } finally {\n ancestors.delete(value);\n }\n};\n\n/** Validates and detaches a value at the workflow JSON boundary. */\nexport const snapshotPiHarnessJsonValue = <T>(value: T, path = \"$event\"): T =>\n snapshotJsonValueAtPath(value, path, new Set()) as T;\n\nconst assertJsonValueAtPath = (value: unknown, path: string, ancestors: Set<object>): void => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw jsonValueError(path, \"non-finite-number\");\n }\n return;\n }\n if (typeof value !== \"object\") {\n throw jsonValueError(path, typeof value);\n }\n if (ancestors.has(value)) {\n throw jsonValueError(path, \"cycle\");\n }\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.hasOwn(value, index)) {\n throw jsonValueError(`${path}[${index}]`, \"sparse-array-entry\");\n }\n assertJsonValueAtPath(value[index], `${path}[${index}]`, ancestors);\n }\n return;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw jsonValueError(path, \"non-plain-object\");\n }\n for (const key of Object.keys(value)) {\n const propertyValue = (value as Record<string, unknown>)[key];\n if (propertyValue !== undefined) {\n assertJsonValueAtPath(propertyValue, `${path}.${key}`, ancestors);\n }\n }\n } finally {\n ancestors.delete(value);\n }\n};\n\n/** Validates persisted protocol input without copying it. */\nexport const assertPiHarnessJsonValue = (value: unknown, path = \"$event\"): void => {\n assertJsonValueAtPath(value, path, new Set());\n};\n\nconst freezeJsonValue = (value: unknown, visited: Set<object>): void => {\n if (value === null || typeof value !== \"object\" || visited.has(value)) {\n return;\n }\n visited.add(value);\n for (const child of Array.isArray(value) ? value : Object.values(value)) {\n freezeJsonValue(child, visited);\n }\n Object.freeze(value);\n};\n\n/** Validates and freezes persisted protocol input so interned references remain immutable. */\nexport const freezePiHarnessJsonValue = <T>(value: T, path = \"$event\"): T => {\n assertPiHarnessJsonValue(value, path);\n freezeJsonValue(value, new Set());\n return value;\n};\n","import type { AgentHarnessEvent, AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, AssistantMessageEvent, ToolCall } from \"@earendil-works/pi-ai\";\n\nexport interface PiHarnessEventStreamEncoder<TEncodedEvent> {\n encode(event: AgentHarnessEvent): TEncodedEvent;\n}\n\nexport type PiHarnessProjectedEvent = {\n readonly type: AgentHarnessEvent[\"type\"];\n};\n\nexport type PiHarnessFrontendToolCall = Omit<ToolCall, \"thoughtSignature\">;\n\nexport type PiHarnessFrontendAssistantContent =\n | Omit<Extract<AssistantMessage[\"content\"][number], { type: \"text\" }>, \"textSignature\">\n | Omit<Extract<AssistantMessage[\"content\"][number], { type: \"thinking\" }>, \"thinkingSignature\">\n | PiHarnessFrontendToolCall;\n\nexport type PiHarnessFrontendAssistantMessage = Omit<\n AssistantMessage,\n \"api\" | \"provider\" | \"model\" | \"responseModel\" | \"responseId\" | \"diagnostics\" | \"content\"\n> & {\n readonly content: PiHarnessFrontendAssistantContent[];\n};\n\nexport type PiHarnessFrontendMessage<TMessage> = TMessage extends AssistantMessage\n ? PiHarnessFrontendAssistantMessage\n : TMessage;\n\nexport type PiHarnessFrontendAgentMessage = PiHarnessFrontendMessage<AgentMessage>;\n\ntype PiHarnessFrontendAssistantMessageEvent<TEvent> = TEvent extends {\n partial: AssistantMessage;\n}\n ? Omit<TEvent, \"partial\" | \"toolCall\"> & {\n readonly partial: PiHarnessFrontendAssistantMessage;\n } & (TEvent extends { toolCall: ToolCall }\n ? { readonly toolCall: PiHarnessFrontendToolCall }\n : object)\n : TEvent;\n\ntype PiHarnessFrontendEventFields<TEvent> = {\n readonly [TKey in keyof TEvent]: TKey extends \"message\"\n ? PiHarnessFrontendMessage<TEvent[TKey]>\n : TKey extends\n | \"messages\"\n | \"toolResults\"\n | \"steer\"\n | \"followUp\"\n | \"nextTurn\"\n | \"clearedSteer\"\n | \"clearedFollowUp\"\n ? TEvent[TKey] extends readonly (infer TMessage)[]\n ? PiHarnessFrontendMessage<TMessage>[]\n : TEvent[TKey]\n : TKey extends \"assistantMessageEvent\"\n ? PiHarnessFrontendAssistantMessageEvent<TEvent[TKey]>\n : TEvent[TKey];\n};\n\n/** The frontend projection preserves every event while omitting provider-owned message metadata. */\nexport type PiHarnessFrontendEvent = AgentHarnessEvent extends infer TEvent\n ? TEvent extends PiHarnessProjectedEvent\n ? PiHarnessFrontendEventFields<TEvent>\n : never\n : never;\n\nexport interface PiHarnessEventStreamDecoder<TEncodedEvent> {\n decode(event: TEncodedEvent): PiHarnessFrontendEvent;\n}\n\n/** Projects each AgentHarness event into one frontend-safe event with the same event type. */\nexport interface PiHarnessEventProtocol {\n createEncoder(): PiHarnessEventStreamEncoder<unknown>;\n createDecoder(): PiHarnessEventStreamDecoder<unknown>;\n eventType(event: unknown): PiHarnessFrontendEvent[\"type\"];\n}\n\nexport const piToolCallArgumentsText = (toolCall: ToolCall): string | undefined => {\n const partialJson = (toolCall as ToolCall & { partialJson?: unknown }).partialJson;\n return typeof partialJson === \"string\" ? partialJson : undefined;\n};\n\nimport {\n assertPiHarnessJsonValue,\n freezePiHarnessJsonValue,\n snapshotPiHarnessJsonValue,\n} from \"./json-value\";\n\nexport type PiHarnessSubscribedEvent = Exclude<\n AgentHarnessEvent,\n | { type: \"before_agent_start\" }\n | { type: \"context\" }\n | { type: \"before_provider_request\" }\n | { type: \"before_provider_payload\" }\n | { type: \"tool_call\" }\n | { type: \"tool_result\" }\n | { type: \"session_before_compact\" }\n | { type: \"session_before_tree\" }\n>;\n\ntype EncodedValue<TValue = unknown> =\n | { readonly kind: \"value\"; readonly id: number; readonly value: TValue }\n | { readonly kind: \"reference\"; readonly id: number };\n\ntype ProjectedAgentMessage =\n | Exclude<AgentMessage, AssistantMessage>\n | PiHarnessFrontendAssistantMessage;\n\ntype EncodedMessage =\n | {\n readonly kind: \"message\";\n readonly id: number;\n readonly message: ProjectedAgentMessage;\n }\n | { readonly kind: \"reference\"; readonly id: number };\n\ntype StreamedAssistantMessageEvent = Exclude<\n AssistantMessageEvent,\n { type: \"start\" | \"done\" | \"error\" }\n>;\ntype ProjectedMessageUpdateEvent = Extract<\n PiHarnessFrontendEvent,\n { type: \"message_update\" }\n>[\"assistantMessageEvent\"];\n\ntype AssistantThinkingContent = Extract<AssistantMessage[\"content\"][number], { type: \"thinking\" }>;\ntype ProjectedAssistantMessage = PiHarnessFrontendAssistantMessage;\ntype AssistantMessageMetadata = Pick<\n AssistantMessage,\n \"usage\" | \"stopReason\" | \"errorMessage\" | \"timestamp\"\n>;\n\ntype CompactAssistantMessageEvent =\n | {\n readonly type: \"text_start\";\n readonly contentIndex: number;\n }\n | {\n readonly type: \"text_delta\";\n readonly contentIndex: number;\n readonly delta: string;\n }\n | {\n readonly type: \"text_end\";\n readonly contentIndex: number;\n readonly content: string;\n }\n | {\n readonly type: \"thinking_start\";\n readonly contentIndex: number;\n readonly redacted?: boolean;\n }\n | {\n readonly type: \"thinking_delta\";\n readonly contentIndex: number;\n readonly delta: string;\n readonly redacted?: boolean;\n }\n | {\n readonly type: \"thinking_end\";\n readonly contentIndex: number;\n readonly content: string;\n readonly redacted?: boolean;\n }\n | {\n readonly type: \"toolcall_start\";\n readonly contentIndex: number;\n readonly toolCall: PiHarnessFrontendToolCall;\n }\n | {\n readonly type: \"toolcall_delta\";\n readonly contentIndex: number;\n readonly delta: string;\n }\n | {\n readonly type: \"toolcall_end\";\n readonly contentIndex: number;\n readonly toolCall: PiHarnessFrontendToolCall;\n };\n\ntype CompactAssistantMessageMetadataUpdate = {\n readonly usage?: AssistantMessage[\"usage\"];\n readonly stopReason?: AssistantMessage[\"stopReason\"];\n readonly errorMessage?: string | null;\n readonly timestamp?: number;\n};\n\ntype CompactMessageUpdate = {\n readonly type: \"message_update\";\n readonly update: CompactAssistantMessageEvent;\n readonly metadata?: CompactAssistantMessageMetadataUpdate;\n};\n\nexport type PiHarnessCompactEvent =\n | { readonly type: \"raw\"; readonly event: PiHarnessSubscribedEvent }\n | { readonly type: \"agent_start\" }\n | { readonly type: \"agent_end\"; readonly messages: readonly EncodedMessage[] }\n | { readonly type: \"turn_start\" }\n | {\n readonly type: \"turn_end\";\n readonly message: EncodedMessage;\n readonly toolResults: readonly EncodedMessage[];\n }\n | { readonly type: \"message_start\"; readonly message: EncodedMessage }\n | CompactMessageUpdate\n | { readonly type: \"message_end\"; readonly message: EncodedMessage }\n | {\n readonly type: \"tool_execution_start\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: EncodedValue;\n }\n | {\n readonly type: \"tool_execution_update\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: EncodedValue;\n readonly partialResult: EncodedValue;\n }\n | {\n readonly type: \"tool_execution_end\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly result: EncodedValue;\n readonly isError: boolean;\n }\n | {\n readonly type: \"queue_update\";\n readonly steer: readonly EncodedMessage[];\n readonly followUp: readonly EncodedMessage[];\n readonly nextTurn: readonly EncodedMessage[];\n }\n | { readonly type: \"save_point\"; readonly hadPendingMutations: boolean }\n | {\n readonly type: \"abort\";\n readonly clearedSteer: readonly EncodedMessage[];\n readonly clearedFollowUp: readonly EncodedMessage[];\n }\n | { readonly type: \"settled\"; readonly nextTurnCount: number }\n | {\n readonly type: \"after_provider_response\";\n readonly status: number;\n readonly headers: EncodedValue<SubscribedEvent<\"after_provider_response\">[\"headers\"]>;\n }\n | {\n readonly type: \"session_compact\";\n readonly compactionEntry: EncodedValue<SubscribedEvent<\"session_compact\">[\"compactionEntry\"]>;\n readonly fromHook: boolean;\n }\n | {\n readonly type: \"session_tree\";\n readonly newLeafId: string | null;\n readonly oldLeafId: string | null;\n readonly summaryEntry?: EncodedValue<\n NonNullable<SubscribedEvent<\"session_tree\">[\"summaryEntry\"]>\n >;\n readonly fromHook?: boolean;\n }\n | {\n readonly type: \"retry_scheduled\";\n readonly operation: \"compaction\" | \"branch_summary\";\n readonly attempt: number;\n readonly maxAttempts: number;\n readonly delayMs: number;\n readonly errorMessage: string;\n }\n | {\n readonly type: \"retry_attempt_start\" | \"retry_finished\";\n readonly operation: \"compaction\" | \"branch_summary\";\n }\n | {\n readonly type: \"model_update\";\n readonly model: EncodedValue<SubscribedEvent<\"model_update\">[\"model\"]>;\n readonly previousModel?: EncodedValue<\n NonNullable<SubscribedEvent<\"model_update\">[\"previousModel\"]>\n >;\n readonly source: \"set\" | \"restore\";\n }\n | {\n readonly type: \"thinking_level_update\";\n readonly level: SubscribedEvent<\"thinking_level_update\">[\"level\"];\n readonly previousLevel: SubscribedEvent<\"thinking_level_update\">[\"previousLevel\"];\n }\n | {\n readonly type: \"tools_update\";\n readonly toolNames: readonly string[];\n readonly previousToolNames: readonly string[];\n readonly activeToolNames: readonly string[];\n readonly previousActiveToolNames: readonly string[];\n readonly source: \"set\" | \"restore\";\n }\n | {\n readonly type: \"resources_update\";\n readonly resources: EncodedValue<SubscribedEvent<\"resources_update\">[\"resources\"]>;\n readonly previousResources: EncodedValue<\n SubscribedEvent<\"resources_update\">[\"previousResources\"]\n >;\n };\n\ntype SubscribedEvent<TType extends PiHarnessSubscribedEvent[\"type\"]> = Extract<\n PiHarnessSubscribedEvent,\n { type: TType }\n>;\n\nconst assistantMessageMetadata = ({\n usage,\n stopReason,\n errorMessage,\n timestamp,\n}: AssistantMessage): AssistantMessageMetadata => ({\n usage,\n stopReason,\n errorMessage,\n timestamp,\n});\n\nconst compactAssistantMessageMetadataUpdate = (\n previous: AssistantMessageMetadata,\n next: AssistantMessage,\n): CompactAssistantMessageMetadataUpdate | undefined => {\n const update: CompactAssistantMessageMetadataUpdate = {\n ...(previous.usage.input === next.usage.input &&\n previous.usage.output === next.usage.output &&\n previous.usage.cacheRead === next.usage.cacheRead &&\n previous.usage.cacheWrite === next.usage.cacheWrite &&\n previous.usage.cacheWrite1h === next.usage.cacheWrite1h &&\n previous.usage.reasoning === next.usage.reasoning &&\n previous.usage.totalTokens === next.usage.totalTokens &&\n previous.usage.cost.input === next.usage.cost.input &&\n previous.usage.cost.output === next.usage.cost.output &&\n previous.usage.cost.cacheRead === next.usage.cost.cacheRead &&\n previous.usage.cost.cacheWrite === next.usage.cost.cacheWrite &&\n previous.usage.cost.total === next.usage.cost.total\n ? {}\n : { usage: next.usage }),\n ...(previous.stopReason === next.stopReason ? {} : { stopReason: next.stopReason }),\n ...(previous.errorMessage === next.errorMessage\n ? {}\n : { errorMessage: next.errorMessage ?? null }),\n ...(previous.timestamp === next.timestamp ? {} : { timestamp: next.timestamp }),\n };\n\n return Object.keys(update).length === 0 ? undefined : update;\n};\n\nconst assistantMessageWithMetadataUpdate = (\n message: ProjectedAssistantMessage,\n update: CompactAssistantMessageMetadataUpdate,\n): ProjectedAssistantMessage => ({\n ...message,\n ...(update.usage === undefined ? {} : { usage: update.usage }),\n ...(update.stopReason === undefined ? {} : { stopReason: update.stopReason }),\n ...(update.errorMessage === undefined\n ? {}\n : update.errorMessage === null\n ? { errorMessage: undefined }\n : { errorMessage: update.errorMessage }),\n ...(update.timestamp === undefined ? {} : { timestamp: update.timestamp }),\n});\n\nconst streamedMessageUpdateEvent = (\n event: AssistantMessageEvent,\n): StreamedAssistantMessageEvent => {\n switch (event.type) {\n case \"start\":\n case \"done\":\n case \"error\":\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_NON_STREAMING_MESSAGE_UPDATE\");\n case \"text_start\":\n case \"text_delta\":\n case \"text_end\":\n case \"thinking_start\":\n case \"thinking_delta\":\n case \"thinking_end\":\n case \"toolcall_start\":\n case \"toolcall_delta\":\n case \"toolcall_end\":\n return event;\n }\n\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_MESSAGE_UPDATE\");\n};\n\nconst thinkingContentFromPartial = (\n event: Extract<\n StreamedAssistantMessageEvent,\n { type: \"thinking_start\" | \"thinking_delta\" | \"thinking_end\" }\n >,\n): AssistantThinkingContent => {\n const content = event.partial.content[event.contentIndex];\n if (content?.type !== \"thinking\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_THINKING_UPDATE_WITHOUT_THINKING_BLOCK\");\n }\n return content;\n};\n\nconst toolCallFromPartial = (\n event: Extract<\n StreamedAssistantMessageEvent,\n { type: \"toolcall_start\" | \"toolcall_delta\" | \"toolcall_end\" }\n >,\n): ToolCall => {\n const content = event.partial.content[event.contentIndex];\n if (content?.type !== \"toolCall\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_UPDATE_WITHOUT_TOOL_CALL_BLOCK\");\n }\n return content;\n};\n\nconst thinkingMetadataFields = (\n content: AssistantThinkingContent,\n): Pick<AssistantThinkingContent, \"redacted\"> =>\n content.redacted === undefined ? {} : { redacted: content.redacted };\n\nconst projectToolCall = ({\n thoughtSignature: _thoughtSignature,\n ...toolCall\n}: ToolCall): PiHarnessFrontendToolCall => toolCall;\n\nconst projectAssistantMessage = ({\n api: _api,\n provider: _provider,\n model: _model,\n responseModel: _responseModel,\n responseId: _responseId,\n diagnostics: _diagnostics,\n content,\n ...message\n}: AssistantMessage): ProjectedAssistantMessage => ({\n ...message,\n content: content.map((block) => {\n switch (block.type) {\n case \"text\": {\n const { textSignature: _textSignature, ...text } = block;\n return text;\n }\n case \"thinking\": {\n const { thinkingSignature: _thinkingSignature, ...thinking } = block;\n return thinking;\n }\n case \"toolCall\":\n return projectToolCall(block);\n }\n\n throw new Error(\"PI_HARNESS_FRONTEND_PROTOCOL_UNKNOWN_ASSISTANT_CONTENT\");\n }),\n});\n\nconst projectAgentMessage = (message: AgentMessage): ProjectedAgentMessage =>\n message.role === \"assistant\" ? projectAssistantMessage(message) : message;\n\nconst compactAssistantMessageEvent = (\n event: StreamedAssistantMessageEvent,\n): CompactAssistantMessageEvent => {\n switch (event.type) {\n case \"text_start\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n };\n case \"text_delta\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n delta: event.delta,\n };\n case \"text_end\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n content: event.content,\n };\n case \"thinking_start\": {\n const content = thinkingContentFromPartial(event);\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n ...thinkingMetadataFields(content),\n };\n }\n case \"thinking_delta\": {\n const content = thinkingContentFromPartial(event);\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n delta: event.delta,\n ...thinkingMetadataFields(content),\n };\n }\n case \"thinking_end\": {\n const content = thinkingContentFromPartial(event);\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n content: event.content,\n ...thinkingMetadataFields(content),\n };\n }\n case \"toolcall_start\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n toolCall: projectToolCall(toolCallFromPartial(event)),\n };\n case \"toolcall_delta\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n delta: event.delta,\n };\n case \"toolcall_end\":\n return {\n type: event.type,\n contentIndex: event.contentIndex,\n toolCall: projectToolCall(event.toolCall),\n };\n }\n\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_STREAMING_MESSAGE_UPDATE\");\n};\n\nfunction isPrimitiveOnlyMessageUpdate(event: PiHarnessCompactEvent): event is CompactMessageUpdate {\n if (event.type !== \"message_update\") {\n return false;\n }\n\n // Metadata updates can contain provider-owned usage objects that still require a snapshot.\n if (event.metadata !== undefined) {\n return false;\n }\n\n switch (event.update.type) {\n case \"text_start\":\n case \"text_delta\":\n case \"text_end\":\n case \"thinking_start\":\n case \"thinking_delta\":\n case \"thinking_end\":\n case \"toolcall_delta\":\n return true;\n case \"toolcall_start\":\n case \"toolcall_end\":\n return false;\n }\n\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_COMPACT_MESSAGE_UPDATE\");\n}\n\nconst streamedAssistantMessageEvent = (\n update: CompactAssistantMessageEvent,\n partial: ProjectedAssistantMessage,\n): ProjectedMessageUpdateEvent => {\n switch (update.type) {\n case \"text_start\":\n case \"thinking_start\":\n case \"toolcall_start\":\n return { type: update.type, contentIndex: update.contentIndex, partial };\n case \"text_delta\":\n case \"thinking_delta\":\n case \"toolcall_delta\":\n return {\n type: update.type,\n contentIndex: update.contentIndex,\n delta: update.delta,\n partial,\n };\n case \"text_end\":\n case \"thinking_end\":\n return {\n type: update.type,\n contentIndex: update.contentIndex,\n content: update.content,\n partial,\n };\n case \"toolcall_end\":\n return {\n type: update.type,\n contentIndex: update.contentIndex,\n toolCall: update.toolCall,\n partial,\n };\n }\n\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_COMPACT_MESSAGE_UPDATE\");\n};\n\nconst applyCompactAssistantMessageEvent = (\n message: ProjectedAssistantMessage,\n update: CompactAssistantMessageEvent,\n toolCallJsonByContentIndex: Map<number, string>,\n): void => {\n if (update.contentIndex > message.content.length) {\n throw new Error(`PI_HARNESS_EVENT_PROTOCOL_SPARSE_CONTENT_INDEX:${update.contentIndex}`);\n }\n\n switch (update.type) {\n case \"text_start\":\n message.content[update.contentIndex] = {\n type: \"text\",\n text: \"\",\n };\n return;\n case \"text_delta\": {\n const content = message.content[update.contentIndex];\n if (content?.type !== \"text\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_TEXT_DELTA_WITHOUT_TEXT_BLOCK\");\n }\n message.content[update.contentIndex] = {\n type: \"text\",\n text: content.text + update.delta,\n };\n return;\n }\n case \"text_end\":\n message.content[update.contentIndex] = {\n type: \"text\",\n text: update.content,\n };\n return;\n case \"thinking_start\":\n message.content[update.contentIndex] = {\n type: \"thinking\",\n thinking: \"\",\n ...(update.redacted === undefined ? {} : { redacted: update.redacted }),\n };\n return;\n case \"thinking_delta\": {\n const content = message.content[update.contentIndex];\n if (content?.type !== \"thinking\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_THINKING_DELTA_WITHOUT_THINKING_BLOCK\");\n }\n message.content[update.contentIndex] = {\n type: \"thinking\",\n thinking: content.thinking + update.delta,\n ...(update.redacted === undefined ? {} : { redacted: update.redacted }),\n };\n return;\n }\n case \"thinking_end\":\n message.content[update.contentIndex] = {\n type: \"thinking\",\n thinking: update.content,\n ...(update.redacted === undefined ? {} : { redacted: update.redacted }),\n };\n return;\n case \"toolcall_start\":\n toolCallJsonByContentIndex.set(\n update.contentIndex,\n piToolCallArgumentsText(update.toolCall) ?? \"\",\n );\n message.content[update.contentIndex] = update.toolCall;\n return;\n case \"toolcall_delta\": {\n const content = message.content[update.contentIndex];\n if (content?.type !== \"toolCall\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_DELTA_WITHOUT_TOOL_CALL_BLOCK\");\n }\n const previousJson = toolCallJsonByContentIndex.get(update.contentIndex);\n if (previousJson === undefined) {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_TOOL_CALL_DELTA_WITHOUT_TOOL_CALL_START\");\n }\n const partialJson = previousJson + update.delta;\n toolCallJsonByContentIndex.set(update.contentIndex, partialJson);\n message.content[update.contentIndex] = {\n ...content,\n partialJson,\n } as PiHarnessFrontendToolCall;\n return;\n }\n case \"toolcall_end\":\n toolCallJsonByContentIndex.delete(update.contentIndex);\n message.content[update.contentIndex] = update.toolCall;\n }\n};\n\nclass ValueEncoder {\n readonly #idsByValue = new Map<unknown, number>();\n\n encode<TValue>(value: TValue): EncodedValue<TValue> {\n const existingId = this.#idsByValue.get(value);\n if (existingId !== undefined) {\n return { kind: \"reference\", id: existingId };\n }\n\n const id = this.#idsByValue.size;\n this.#idsByValue.set(value, id);\n return { kind: \"value\", id, value };\n }\n}\n\nclass ValueDecoder {\n readonly #valuesById = new Map<number, unknown>();\n\n decode<TValue>(encoded: EncodedValue<TValue>): TValue {\n if (encoded.kind === \"value\") {\n this.#valuesById.set(encoded.id, encoded.value);\n return encoded.value;\n }\n\n if (!this.#valuesById.has(encoded.id)) {\n throw new Error(`PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_VALUE_REFERENCE:${encoded.id}`);\n }\n return this.#valuesById.get(encoded.id) as TValue;\n }\n}\n\nclass MessageEncoder {\n readonly #idsByMessage = new Map<AgentMessage, number>();\n\n encode(message: AgentMessage): EncodedMessage {\n const existingId = this.#idsByMessage.get(message);\n if (existingId !== undefined) {\n return { kind: \"reference\", id: existingId };\n }\n\n const id = this.#idsByMessage.size;\n this.#idsByMessage.set(message, id);\n return { kind: \"message\", id, message: projectAgentMessage(message) };\n }\n}\n\nclass MessageDecoder {\n readonly #messagesById = new Map<number, ProjectedAgentMessage>();\n\n decode(encoded: EncodedMessage): ProjectedAgentMessage {\n if (encoded.kind === \"message\") {\n this.#messagesById.set(encoded.id, encoded.message);\n return encoded.message;\n }\n\n const message = this.#messagesById.get(encoded.id);\n if (!message) {\n throw new Error(`PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_MESSAGE_REFERENCE:${encoded.id}`);\n }\n return message;\n }\n}\n\nexport type PiHarnessEncodedEvent = {\n readonly protocol: \"pi-harness-event\";\n readonly version: 2;\n readonly event: PiHarnessCompactEvent;\n};\n\nexport type PiHarnessEncodedEventEmission = {\n readonly kind: \"harness-event\";\n readonly event: PiHarnessEncodedEvent;\n};\n\nexport type PiHarnessEventStreamIdentity = {\n readonly stepKey: string;\n readonly executionId: string;\n readonly epoch: string;\n};\n\nconst piHarnessEventStreamKey = ({\n stepKey,\n executionId,\n epoch,\n}: PiHarnessEventStreamIdentity): string => `${stepKey}\\u0000${executionId}\\u0000${epoch}`;\n\nfunction assertPiHarnessEncodedEvent(value: unknown): asserts value is PiHarnessEncodedEvent {\n assertPiHarnessJsonValue(value);\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"protocol\" in value) ||\n value.protocol !== \"pi-harness-event\" ||\n !(\"version\" in value) ||\n value.version !== 2 ||\n !(\"event\" in value) ||\n typeof value.event !== \"object\" ||\n value.event === null ||\n !(\"type\" in value.event) ||\n typeof value.event.type !== \"string\"\n ) {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNSUPPORTED_PROTOCOL\");\n }\n}\n\nexport class PiHarnessEventEncoder {\n readonly #messages = new MessageEncoder();\n readonly #values = new ValueEncoder();\n #activeAssistantMetadata: AssistantMessageMetadata | undefined;\n\n encode(event: PiHarnessSubscribedEvent): PiHarnessEncodedEvent {\n const compactEvent = this.#encodeEvent(event);\n const envelope: PiHarnessEncodedEvent = {\n protocol: \"pi-harness-event\",\n version: 2,\n event: compactEvent,\n };\n const encoded = isPrimitiveOnlyMessageUpdate(compactEvent)\n ? envelope\n : snapshotPiHarnessJsonValue(envelope, `$event.${event.type}`);\n this.#advanceAssistantMetadata(event, compactEvent);\n return encoded;\n }\n\n #advanceAssistantMetadata(\n event: PiHarnessSubscribedEvent,\n compactEvent: PiHarnessCompactEvent,\n ): void {\n if (event.type === \"message_start\") {\n this.#activeAssistantMetadata =\n event.message.role === \"assistant\"\n ? snapshotPiHarnessJsonValue(assistantMessageMetadata(event.message))\n : undefined;\n } else if (event.type === \"message_update\") {\n if (compactEvent.type !== \"message_update\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_INVALID_COMPACT_MESSAGE_UPDATE\");\n }\n if (compactEvent.metadata === undefined) {\n return;\n }\n this.#activeAssistantMetadata = snapshotPiHarnessJsonValue(\n assistantMessageMetadata(\n (event.assistantMessageEvent as StreamedAssistantMessageEvent).partial,\n ),\n );\n } else if (event.type === \"message_end\") {\n this.#activeAssistantMetadata = undefined;\n }\n }\n\n #encodeEvent(event: PiHarnessSubscribedEvent): PiHarnessCompactEvent {\n switch (event.type) {\n case \"agent_start\":\n case \"turn_start\":\n return { type: event.type };\n case \"agent_end\":\n return {\n type: event.type,\n messages: event.messages.map((message) => this.#messages.encode(message)),\n };\n case \"turn_end\":\n return {\n type: event.type,\n message: this.#messages.encode(event.message),\n toolResults: event.toolResults.map((message) => this.#messages.encode(message)),\n };\n case \"message_start\":\n return {\n type: event.type,\n message: this.#messages.encode(event.message),\n };\n case \"message_update\": {\n if (!this.#activeAssistantMetadata) {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_WITHOUT_ASSISTANT_START\");\n }\n if (event.message.role !== \"assistant\") {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_NOT_ASSISTANT\");\n }\n\n const assistantMessageEvent = streamedMessageUpdateEvent(event.assistantMessageEvent);\n const update = compactAssistantMessageEvent(assistantMessageEvent);\n const metadata = compactAssistantMessageMetadataUpdate(\n this.#activeAssistantMetadata,\n assistantMessageEvent.partial,\n );\n\n return {\n type: event.type,\n update,\n ...(metadata ? { metadata } : {}),\n };\n }\n case \"message_end\":\n return {\n type: event.type,\n message: this.#messages.encode(event.message),\n };\n case \"tool_execution_start\":\n return { ...event, args: this.#values.encode(event.args) };\n case \"tool_execution_update\":\n return {\n ...event,\n args: this.#values.encode(event.args),\n partialResult: this.#values.encode(\n snapshotPiHarnessJsonValue(\n event.partialResult,\n \"$event.tool_execution_update.partialResult\",\n ),\n ),\n };\n case \"tool_execution_end\":\n return { ...event, result: this.#values.encode(event.result) };\n case \"queue_update\":\n return {\n type: event.type,\n steer: event.steer.map((message) => this.#messages.encode(message)),\n followUp: event.followUp.map((message) => this.#messages.encode(message)),\n nextTurn: event.nextTurn.map((message) => this.#messages.encode(message)),\n };\n case \"save_point\":\n case \"settled\":\n case \"retry_scheduled\":\n case \"retry_attempt_start\":\n case \"retry_finished\":\n case \"thinking_level_update\":\n case \"tools_update\":\n return event;\n case \"abort\":\n return {\n type: event.type,\n clearedSteer: event.clearedSteer.map((message) => this.#messages.encode(message)),\n clearedFollowUp: event.clearedFollowUp.map((message) => this.#messages.encode(message)),\n };\n case \"after_provider_response\":\n return {\n type: event.type,\n status: event.status,\n headers: this.#values.encode(event.headers),\n };\n case \"session_compact\":\n return {\n type: event.type,\n compactionEntry: this.#values.encode(event.compactionEntry),\n fromHook: event.fromHook,\n };\n case \"session_tree\":\n return {\n type: event.type,\n newLeafId: event.newLeafId,\n oldLeafId: event.oldLeafId,\n ...(event.summaryEntry ? { summaryEntry: this.#values.encode(event.summaryEntry) } : {}),\n ...(event.fromHook === undefined ? {} : { fromHook: event.fromHook }),\n };\n case \"model_update\":\n return {\n type: event.type,\n model: this.#values.encode(event.model),\n ...(event.previousModel\n ? { previousModel: this.#values.encode(event.previousModel) }\n : {}),\n source: event.source,\n };\n case \"resources_update\":\n return {\n type: event.type,\n resources: this.#values.encode(event.resources),\n previousResources: this.#values.encode(event.previousResources),\n };\n default:\n return { type: \"raw\", event };\n }\n }\n}\n\nexport const piHarnessEventProtocol = {\n createEncoder: () => new PiHarnessEventEncoder(),\n createDecoder: () => new PiHarnessEventDecoder(),\n eventType: (value) => {\n assertPiHarnessEncodedEvent(value);\n return value.event.type === \"raw\" ? value.event.event.type : value.event.type;\n },\n} satisfies PiHarnessEventProtocol;\n\nexport class PiHarnessEventDecoder {\n readonly #messages = new MessageDecoder();\n readonly #values = new ValueDecoder();\n readonly #toolCallJsonByContentIndex = new Map<number, string>();\n #activeAssistantMessage: ProjectedAssistantMessage | undefined;\n\n decode(value: unknown): PiHarnessFrontendEvent {\n const encoded = freezePiHarnessJsonValue(value);\n assertPiHarnessEncodedEvent(encoded);\n return this.#decodeEvent(encoded.event);\n }\n\n #decodeEvent(encoded: PiHarnessCompactEvent): PiHarnessFrontendEvent {\n switch (encoded.type) {\n case \"raw\":\n return encoded.event as PiHarnessFrontendEvent;\n case \"agent_start\":\n case \"turn_start\":\n return { type: encoded.type };\n case \"agent_end\":\n return {\n type: encoded.type,\n messages: encoded.messages.map((message) => this.#messages.decode(message)),\n };\n case \"turn_end\":\n return {\n type: encoded.type,\n message: this.#messages.decode(encoded.message),\n toolResults: encoded.toolResults.map((message) =>\n this.#messages.decode(message),\n ) as SubscribedEvent<\"turn_end\">[\"toolResults\"],\n };\n case \"message_start\": {\n const message = this.#messages.decode(encoded.message);\n this.#toolCallJsonByContentIndex.clear();\n this.#activeAssistantMessage = message.role === \"assistant\" ? message : undefined;\n return { type: encoded.type, message };\n }\n case \"message_update\": {\n if (!this.#activeAssistantMessage) {\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_MESSAGE_UPDATE_WITHOUT_ASSISTANT_START\");\n }\n\n const reconstructedMessage = snapshotPiHarnessJsonValue(this.#activeAssistantMessage);\n applyCompactAssistantMessageEvent(\n reconstructedMessage,\n encoded.update,\n this.#toolCallJsonByContentIndex,\n );\n const message = encoded.metadata\n ? assistantMessageWithMetadataUpdate(reconstructedMessage, encoded.metadata)\n : reconstructedMessage;\n this.#activeAssistantMessage = message;\n\n return {\n type: encoded.type,\n message,\n assistantMessageEvent: streamedAssistantMessageEvent(encoded.update, message),\n };\n }\n case \"message_end\": {\n const message = this.#messages.decode(encoded.message);\n this.#toolCallJsonByContentIndex.clear();\n this.#activeAssistantMessage = undefined;\n return { type: encoded.type, message };\n }\n case \"tool_execution_start\":\n return { ...encoded, args: this.#values.decode(encoded.args) };\n case \"tool_execution_update\":\n return {\n ...encoded,\n args: this.#values.decode(encoded.args),\n partialResult: this.#values.decode(encoded.partialResult),\n };\n case \"tool_execution_end\":\n return { ...encoded, result: this.#values.decode(encoded.result) };\n case \"queue_update\":\n return {\n type: encoded.type,\n steer: encoded.steer.map((message) => this.#messages.decode(message)),\n followUp: encoded.followUp.map((message) => this.#messages.decode(message)),\n nextTurn: encoded.nextTurn.map((message) => this.#messages.decode(message)),\n };\n case \"save_point\":\n case \"settled\":\n case \"retry_scheduled\":\n case \"retry_attempt_start\":\n case \"retry_finished\":\n case \"thinking_level_update\":\n return encoded;\n case \"tools_update\":\n return {\n ...encoded,\n toolNames: [...encoded.toolNames],\n previousToolNames: [...encoded.previousToolNames],\n activeToolNames: [...encoded.activeToolNames],\n previousActiveToolNames: [...encoded.previousActiveToolNames],\n };\n case \"abort\":\n return {\n type: encoded.type,\n clearedSteer: encoded.clearedSteer.map((message) => this.#messages.decode(message)),\n clearedFollowUp: encoded.clearedFollowUp.map((message) => this.#messages.decode(message)),\n };\n case \"after_provider_response\":\n return {\n type: encoded.type,\n status: encoded.status,\n headers: this.#values.decode(encoded.headers),\n };\n case \"session_compact\":\n return {\n type: encoded.type,\n compactionEntry: this.#values.decode(encoded.compactionEntry),\n fromHook: encoded.fromHook,\n };\n case \"session_tree\":\n return {\n type: encoded.type,\n newLeafId: encoded.newLeafId,\n oldLeafId: encoded.oldLeafId,\n ...(encoded.summaryEntry\n ? {\n summaryEntry: this.#values.decode(encoded.summaryEntry),\n }\n : {}),\n ...(encoded.fromHook === undefined ? {} : { fromHook: encoded.fromHook }),\n };\n case \"model_update\":\n return {\n type: encoded.type,\n model: this.#values.decode(encoded.model),\n previousModel: encoded.previousModel\n ? this.#values.decode(encoded.previousModel)\n : undefined,\n source: encoded.source,\n };\n case \"resources_update\":\n return {\n type: encoded.type,\n resources: this.#values.decode(encoded.resources),\n previousResources: this.#values.decode(encoded.previousResources),\n };\n }\n\n throw new Error(\"PI_HARNESS_EVENT_PROTOCOL_UNKNOWN_EVENT\");\n }\n}\n\nexport class PiHarnessEventStreamDecoders {\n readonly #decodersByStream = new Map<string, PiHarnessEventDecoder>();\n\n start(identity: PiHarnessEventStreamIdentity): void {\n this.#decodersByStream.set(piHarnessEventStreamKey(identity), new PiHarnessEventDecoder());\n }\n\n finish(identity: PiHarnessEventStreamIdentity): void {\n this.#decodersByStream.delete(piHarnessEventStreamKey(identity));\n }\n\n decode(identity: PiHarnessEventStreamIdentity, event: unknown): PiHarnessFrontendEvent {\n const streamKey = piHarnessEventStreamKey(identity);\n const decoder = this.#decodersByStream.get(streamKey);\n if (!decoder) {\n throw new Error(`Pi harness event stream ${JSON.stringify(streamKey)} was not started.`);\n }\n return decoder.decode(event);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ import { AgentHarnessEvent, AgentMessage } from "@earendil-works/pi-agent-core";
2
+ import { AssistantMessage, ToolCall } from "@earendil-works/pi-ai";
3
+ //#region src/pi/harness/agent-harness-event-protocol.d.ts
4
+ interface PiHarnessEventStreamEncoder<TEncodedEvent> {
5
+ encode(event: AgentHarnessEvent): TEncodedEvent;
6
+ }
7
+ type PiHarnessProjectedEvent = {
8
+ readonly type: AgentHarnessEvent["type"];
9
+ };
10
+ type PiHarnessFrontendToolCall = Omit<ToolCall, "thoughtSignature">;
11
+ type PiHarnessFrontendAssistantContent = Omit<Extract<AssistantMessage["content"][number], {
12
+ type: "text";
13
+ }>, "textSignature"> | Omit<Extract<AssistantMessage["content"][number], {
14
+ type: "thinking";
15
+ }>, "thinkingSignature"> | PiHarnessFrontendToolCall;
16
+ type PiHarnessFrontendAssistantMessage = Omit<AssistantMessage, "api" | "provider" | "model" | "responseModel" | "responseId" | "diagnostics" | "content"> & {
17
+ readonly content: PiHarnessFrontendAssistantContent[];
18
+ };
19
+ type PiHarnessFrontendMessage<TMessage> = TMessage extends AssistantMessage ? PiHarnessFrontendAssistantMessage : TMessage;
20
+ type PiHarnessFrontendAgentMessage = PiHarnessFrontendMessage<AgentMessage>;
21
+ type PiHarnessFrontendAssistantMessageEvent<TEvent> = TEvent extends {
22
+ partial: AssistantMessage;
23
+ } ? Omit<TEvent, "partial" | "toolCall"> & {
24
+ readonly partial: PiHarnessFrontendAssistantMessage;
25
+ } & (TEvent extends {
26
+ toolCall: ToolCall;
27
+ } ? {
28
+ readonly toolCall: PiHarnessFrontendToolCall;
29
+ } : object) : TEvent;
30
+ type PiHarnessFrontendEventFields<TEvent> = { readonly [TKey in keyof TEvent]: TKey extends "message" ? PiHarnessFrontendMessage<TEvent[TKey]> : TKey extends "messages" | "toolResults" | "steer" | "followUp" | "nextTurn" | "clearedSteer" | "clearedFollowUp" ? TEvent[TKey] extends readonly (infer TMessage)[] ? PiHarnessFrontendMessage<TMessage>[] : TEvent[TKey] : TKey extends "assistantMessageEvent" ? PiHarnessFrontendAssistantMessageEvent<TEvent[TKey]> : TEvent[TKey]; };
31
+ /** The frontend projection preserves every event while omitting provider-owned message metadata. */
32
+ type PiHarnessFrontendEvent = AgentHarnessEvent extends (infer TEvent) ? TEvent extends PiHarnessProjectedEvent ? PiHarnessFrontendEventFields<TEvent> : never : never;
33
+ interface PiHarnessEventStreamDecoder<TEncodedEvent> {
34
+ decode(event: TEncodedEvent): PiHarnessFrontendEvent;
35
+ }
36
+ /** Projects each AgentHarness event into one frontend-safe event with the same event type. */
37
+ interface PiHarnessEventProtocol {
38
+ createEncoder(): PiHarnessEventStreamEncoder<unknown>;
39
+ createDecoder(): PiHarnessEventStreamDecoder<unknown>;
40
+ eventType(event: unknown): PiHarnessFrontendEvent["type"];
41
+ }
42
+ declare const piToolCallArgumentsText: (toolCall: ToolCall) => string | undefined;
43
+ type PiHarnessSubscribedEvent = Exclude<AgentHarnessEvent, {
44
+ type: "before_agent_start";
45
+ } | {
46
+ type: "context";
47
+ } | {
48
+ type: "before_provider_request";
49
+ } | {
50
+ type: "before_provider_payload";
51
+ } | {
52
+ type: "tool_call";
53
+ } | {
54
+ type: "tool_result";
55
+ } | {
56
+ type: "session_before_compact";
57
+ } | {
58
+ type: "session_before_tree";
59
+ }>;
60
+ type EncodedValue<TValue = unknown> = {
61
+ readonly kind: "value";
62
+ readonly id: number;
63
+ readonly value: TValue;
64
+ } | {
65
+ readonly kind: "reference";
66
+ readonly id: number;
67
+ };
68
+ type ProjectedAgentMessage = Exclude<AgentMessage, AssistantMessage> | PiHarnessFrontendAssistantMessage;
69
+ type EncodedMessage = {
70
+ readonly kind: "message";
71
+ readonly id: number;
72
+ readonly message: ProjectedAgentMessage;
73
+ } | {
74
+ readonly kind: "reference";
75
+ readonly id: number;
76
+ };
77
+ type CompactAssistantMessageEvent = {
78
+ readonly type: "text_start";
79
+ readonly contentIndex: number;
80
+ } | {
81
+ readonly type: "text_delta";
82
+ readonly contentIndex: number;
83
+ readonly delta: string;
84
+ } | {
85
+ readonly type: "text_end";
86
+ readonly contentIndex: number;
87
+ readonly content: string;
88
+ } | {
89
+ readonly type: "thinking_start";
90
+ readonly contentIndex: number;
91
+ readonly redacted?: boolean;
92
+ } | {
93
+ readonly type: "thinking_delta";
94
+ readonly contentIndex: number;
95
+ readonly delta: string;
96
+ readonly redacted?: boolean;
97
+ } | {
98
+ readonly type: "thinking_end";
99
+ readonly contentIndex: number;
100
+ readonly content: string;
101
+ readonly redacted?: boolean;
102
+ } | {
103
+ readonly type: "toolcall_start";
104
+ readonly contentIndex: number;
105
+ readonly toolCall: PiHarnessFrontendToolCall;
106
+ } | {
107
+ readonly type: "toolcall_delta";
108
+ readonly contentIndex: number;
109
+ readonly delta: string;
110
+ } | {
111
+ readonly type: "toolcall_end";
112
+ readonly contentIndex: number;
113
+ readonly toolCall: PiHarnessFrontendToolCall;
114
+ };
115
+ type CompactAssistantMessageMetadataUpdate = {
116
+ readonly usage?: AssistantMessage["usage"];
117
+ readonly stopReason?: AssistantMessage["stopReason"];
118
+ readonly errorMessage?: string | null;
119
+ readonly timestamp?: number;
120
+ };
121
+ type CompactMessageUpdate = {
122
+ readonly type: "message_update";
123
+ readonly update: CompactAssistantMessageEvent;
124
+ readonly metadata?: CompactAssistantMessageMetadataUpdate;
125
+ };
126
+ type PiHarnessCompactEvent = {
127
+ readonly type: "raw";
128
+ readonly event: PiHarnessSubscribedEvent;
129
+ } | {
130
+ readonly type: "agent_start";
131
+ } | {
132
+ readonly type: "agent_end";
133
+ readonly messages: readonly EncodedMessage[];
134
+ } | {
135
+ readonly type: "turn_start";
136
+ } | {
137
+ readonly type: "turn_end";
138
+ readonly message: EncodedMessage;
139
+ readonly toolResults: readonly EncodedMessage[];
140
+ } | {
141
+ readonly type: "message_start";
142
+ readonly message: EncodedMessage;
143
+ } | CompactMessageUpdate | {
144
+ readonly type: "message_end";
145
+ readonly message: EncodedMessage;
146
+ } | {
147
+ readonly type: "tool_execution_start";
148
+ readonly toolCallId: string;
149
+ readonly toolName: string;
150
+ readonly args: EncodedValue;
151
+ } | {
152
+ readonly type: "tool_execution_update";
153
+ readonly toolCallId: string;
154
+ readonly toolName: string;
155
+ readonly args: EncodedValue;
156
+ readonly partialResult: EncodedValue;
157
+ } | {
158
+ readonly type: "tool_execution_end";
159
+ readonly toolCallId: string;
160
+ readonly toolName: string;
161
+ readonly result: EncodedValue;
162
+ readonly isError: boolean;
163
+ } | {
164
+ readonly type: "queue_update";
165
+ readonly steer: readonly EncodedMessage[];
166
+ readonly followUp: readonly EncodedMessage[];
167
+ readonly nextTurn: readonly EncodedMessage[];
168
+ } | {
169
+ readonly type: "save_point";
170
+ readonly hadPendingMutations: boolean;
171
+ } | {
172
+ readonly type: "abort";
173
+ readonly clearedSteer: readonly EncodedMessage[];
174
+ readonly clearedFollowUp: readonly EncodedMessage[];
175
+ } | {
176
+ readonly type: "settled";
177
+ readonly nextTurnCount: number;
178
+ } | {
179
+ readonly type: "after_provider_response";
180
+ readonly status: number;
181
+ readonly headers: EncodedValue<SubscribedEvent<"after_provider_response">["headers"]>;
182
+ } | {
183
+ readonly type: "session_compact";
184
+ readonly compactionEntry: EncodedValue<SubscribedEvent<"session_compact">["compactionEntry"]>;
185
+ readonly fromHook: boolean;
186
+ } | {
187
+ readonly type: "session_tree";
188
+ readonly newLeafId: string | null;
189
+ readonly oldLeafId: string | null;
190
+ readonly summaryEntry?: EncodedValue<NonNullable<SubscribedEvent<"session_tree">["summaryEntry"]>>;
191
+ readonly fromHook?: boolean;
192
+ } | {
193
+ readonly type: "retry_scheduled";
194
+ readonly operation: "compaction" | "branch_summary";
195
+ readonly attempt: number;
196
+ readonly maxAttempts: number;
197
+ readonly delayMs: number;
198
+ readonly errorMessage: string;
199
+ } | {
200
+ readonly type: "retry_attempt_start" | "retry_finished";
201
+ readonly operation: "compaction" | "branch_summary";
202
+ } | {
203
+ readonly type: "model_update";
204
+ readonly model: EncodedValue<SubscribedEvent<"model_update">["model"]>;
205
+ readonly previousModel?: EncodedValue<NonNullable<SubscribedEvent<"model_update">["previousModel"]>>;
206
+ readonly source: "set" | "restore";
207
+ } | {
208
+ readonly type: "thinking_level_update";
209
+ readonly level: SubscribedEvent<"thinking_level_update">["level"];
210
+ readonly previousLevel: SubscribedEvent<"thinking_level_update">["previousLevel"];
211
+ } | {
212
+ readonly type: "tools_update";
213
+ readonly toolNames: readonly string[];
214
+ readonly previousToolNames: readonly string[];
215
+ readonly activeToolNames: readonly string[];
216
+ readonly previousActiveToolNames: readonly string[];
217
+ readonly source: "set" | "restore";
218
+ } | {
219
+ readonly type: "resources_update";
220
+ readonly resources: EncodedValue<SubscribedEvent<"resources_update">["resources"]>;
221
+ readonly previousResources: EncodedValue<SubscribedEvent<"resources_update">["previousResources"]>;
222
+ };
223
+ type SubscribedEvent<TType extends PiHarnessSubscribedEvent["type"]> = Extract<PiHarnessSubscribedEvent, {
224
+ type: TType;
225
+ }>;
226
+ type PiHarnessEncodedEvent = {
227
+ readonly protocol: "pi-harness-event";
228
+ readonly version: 2;
229
+ readonly event: PiHarnessCompactEvent;
230
+ };
231
+ type PiHarnessEncodedEventEmission = {
232
+ readonly kind: "harness-event";
233
+ readonly event: PiHarnessEncodedEvent;
234
+ };
235
+ type PiHarnessEventStreamIdentity = {
236
+ readonly stepKey: string;
237
+ readonly executionId: string;
238
+ readonly epoch: string;
239
+ };
240
+ declare class PiHarnessEventEncoder {
241
+ #private;
242
+ encode(event: PiHarnessSubscribedEvent): PiHarnessEncodedEvent;
243
+ }
244
+ declare const piHarnessEventProtocol: {
245
+ createEncoder: () => PiHarnessEventEncoder;
246
+ createDecoder: () => PiHarnessEventDecoder;
247
+ eventType: (value: unknown) => "abort" | "agent_start" | "agent_end" | "turn_start" | "turn_end" | "message_start" | "message_update" | "message_end" | "tool_execution_start" | "tool_execution_update" | "tool_execution_end" | "queue_update" | "save_point" | "settled" | "after_provider_response" | "session_compact" | "session_tree" | "retry_scheduled" | "retry_attempt_start" | "retry_finished" | "model_update" | "thinking_level_update" | "tools_update" | "resources_update";
248
+ };
249
+ declare class PiHarnessEventDecoder {
250
+ #private;
251
+ decode(value: unknown): PiHarnessFrontendEvent;
252
+ }
253
+ declare class PiHarnessEventStreamDecoders {
254
+ #private;
255
+ start(identity: PiHarnessEventStreamIdentity): void;
256
+ finish(identity: PiHarnessEventStreamIdentity): void;
257
+ decode(identity: PiHarnessEventStreamIdentity, event: unknown): PiHarnessFrontendEvent;
258
+ }
259
+ //#endregion
260
+ export { PiHarnessProjectedEvent as _, PiHarnessEventEncoder as a, piToolCallArgumentsText as b, PiHarnessEventStreamDecoders as c, PiHarnessFrontendAgentMessage as d, PiHarnessFrontendAssistantContent as f, PiHarnessFrontendToolCall as g, PiHarnessFrontendMessage as h, PiHarnessEventDecoder as i, PiHarnessEventStreamEncoder as l, PiHarnessFrontendEvent as m, PiHarnessEncodedEvent as n, PiHarnessEventProtocol as o, PiHarnessFrontendAssistantMessage as p, PiHarnessEncodedEventEmission as r, PiHarnessEventStreamDecoder as s, PiHarnessCompactEvent as t, PiHarnessEventStreamIdentity as u, PiHarnessSubscribedEvent as v, piHarnessEventProtocol as y };
261
+ //# sourceMappingURL=agent-harness-event-protocol-d6mH_9n3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness-event-protocol-d6mH_9n3.d.ts","names":[],"sources":["../../src/pi/harness/agent-harness-event-protocol.ts"],"mappings":";;;UAGiB,4BAA4B;EAC3C,OAAO,OAAO,oBAAoB;;KAGxB;WACD,MAAM;;KAGL,4BAA4B,KAAK;KAEjC,oCACR,KAAK,QAAQ;EAAuC;uBACpD,KAAK,QAAQ;EAAuC;2BACpD;KAEQ,oCAAoC,KAC9C;WAGS,SAAS;;KAGR,yBAAyB,YAAY,iBAAiB,mBAC9D,oCACA;KAEQ,gCAAgC,yBAAyB;KAEhE,uCAAuC,UAAU;EACpD,SAAS;IAEP,KAAK;WACM,SAAS;KACf;EAAiB,UAAU;;WACf,UAAU;cAE3B;KAEC,6BAA6B,sBACtB,cAAc,SAAS,yBAC7B,yBAAyB,OAAO,SAChC,mHAQE,OAAO,8BAA8B,cACnC,yBAAyB,cACzB,OAAO,QACT,uCACE,uCAAuC,OAAO,SAC9C,OAAO;;KAIL,yBAAyB,iCAAgC,UACjE,eAAe,0BACb,6BAA6B;UAIlB,4BAA4B;EAC3C,OAAO,OAAO,gBAAgB;;;UAIf;EACf,iBAAiB;EACjB,iBAAiB;EACjB,UAAU,iBAAiB;;cAGhB,0BAA2B,UAAU;KAWtC,2BAA2B,QACrC;EACI;;EACA;;EACA;;EACA;;EACA;;EACA;;EACA;;EACA;;KAGD,aAAa;WACH;WAAwB;WAAqB,OAAO;;WACpD;WAA4B;;KAEtC,wBACD,QAAQ,cAAc,oBACtB;KAEC;WAEU;WACA;WACA,SAAS;;WAET;WAA4B;;KAkBtC;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;;WAGA;WACA;WACA;WACA;;WAGA;WACA;WACA,UAAU;;WAGV;WACA;WACA;;WAGA;WACA;WACA,UAAU;;KAGpB;WACM,QAAQ;WACR,aAAa;WACb;WACA;;KAGN;WACM;WACA,QAAQ;WACR,WAAW;;KAGV;WACG;WAAsB,OAAO;;WAC7B;;WACA;WAA4B,mBAAmB;;WAC/C;;WAEA;WACA,SAAS;WACT,sBAAsB;;WAEtB;WAAgC,SAAS;IACpD;WACW;WAA8B,SAAS;;WAEvC;WACA;WACA;WACA,MAAM;;WAGN;WACA;WACA;WACA,MAAM;WACN,eAAe;;WAGf;WACA;WACA;WACA,QAAQ;WACR;;WAGA;WACA,gBAAgB;WAChB,mBAAmB;WACnB,mBAAmB;;WAEnB;WAA6B;;WAE7B;WACA,uBAAuB;WACvB,0BAA0B;;WAE1B;WAA0B;;WAE1B;WACA;WACA,SAAS,aAAa;;WAGtB;WACA,iBAAiB,aAAa;WAC9B;;WAGA;WACA;WACA;WACA,eAAe,aACtB,YAAY;WAEL;;WAGA;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA;;WAGA;WACA,OAAO,aAAa;WACpB,gBAAgB,aACvB,YAAY;WAEL;;WAGA;WACA,OAAO;WACP,eAAe;;WAGf;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA,WAAW,aAAa;WACxB,mBAAmB,aAC1B;;KAIH,gBAAgB,cAAc,oCAAoC,QACrE;EACE,MAAM;;KAqbE;WACD;WACA;WACA,OAAO;;KAGN;WACD;WACA,OAAO;;KAGN;WACD;WACA;WACA;;cA4BE;;EAKX,OAAO,OAAO,2BAA2B;;cAoK9B;uBAAA;uBAAA;;;cASA;;EAMX,OAAO,iBAAiB;;cA+Ib;;EAGX,MAAM,UAAU;EAIhB,OAAO,UAAU;EAIjB,OAAO,UAAU,8BAA8B,iBAAiB"}
@@ -0,0 +1,2 @@
1
+ import { i as createPiFragmentClients, n as PiSessionCommandAck, r as PiSessionCommandInput, t as PiFragmentClientConfig } from "../clients-DYXj19je.js";
2
+ export { PiFragmentClientConfig, PiSessionCommandAck, PiSessionCommandInput, createPiFragmentClients };
@@ -0,0 +1,2 @@
1
+ import { t as createPiFragmentClients } from "../clients-pIAk6ClP.js";
2
+ export { createPiFragmentClients };
@@ -0,0 +1,13 @@
1
+ //#region src/client/pi-workflow-emission-stream.d.ts
2
+ /** Recoverable Pi operation streams backed by workflow step commit boundaries. */
3
+ declare const piWorkflowStepEmissionEphemeralTable: {
4
+ schema: string;
5
+ table: string;
6
+ stream: {
7
+ key: (values: Record<string, unknown>) => string;
8
+ boundary: (values: Record<string, unknown>) => "start" | "item" | "end";
9
+ };
10
+ };
11
+ //#endregion
12
+ export { piWorkflowStepEmissionEphemeralTable };
13
+ //# sourceMappingURL=pi-workflow-emission-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-workflow-emission-stream.d.ts","names":[],"sources":["../../../src/client/pi-workflow-emission-stream.ts"],"mappings":";;cAoCa;;;;kBA5Bc;uBAQK"}
@@ -0,0 +1,29 @@
1
+ import { workflowsSchema } from "@fragno-dev/workflows/schema";
2
+ import { isWorkflowStepCommittedControlPayload } from "@fragno-dev/workflows/step-emission-control";
3
+ //#region src/client/pi-workflow-emission-stream.ts
4
+ const isRecord = (value) => typeof value === "object" && value !== null;
5
+ const streamKey = (values) => {
6
+ const { instanceRef, stepKey, epoch } = values;
7
+ if (instanceRef === void 0 || typeof stepKey !== "string" || typeof epoch !== "string") throw new Error("Pi workflow emission is missing its stream identity.");
8
+ return `${String(instanceRef)}:${stepKey}:${epoch}`;
9
+ };
10
+ const streamBoundary = (values) => {
11
+ const payload = values["payload"];
12
+ if (!isRecord(payload)) return "item";
13
+ const replay = payload["replay"];
14
+ if (payload["kind"] === "harness-operation-start" && isRecord(replay) && replay["protocol"] === "pi-harness-operation" && replay["version"] === 1) return "start";
15
+ return isWorkflowStepCommittedControlPayload(payload) ? "end" : "item";
16
+ };
17
+ /** Recoverable Pi operation streams backed by workflow step commit boundaries. */
18
+ const piWorkflowStepEmissionEphemeralTable = {
19
+ schema: workflowsSchema.name,
20
+ table: "workflow_step_emission",
21
+ stream: {
22
+ key: streamKey,
23
+ boundary: streamBoundary
24
+ }
25
+ };
26
+ //#endregion
27
+ export { piWorkflowStepEmissionEphemeralTable };
28
+
29
+ //# sourceMappingURL=pi-workflow-emission-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-workflow-emission-stream.js","names":["workflowsSchema","isWorkflowStepCommittedControlPayload","LofiEphemeralTable","isRecord","value","Record","streamKey","values","instanceRef","stepKey","epoch","undefined","Error","String","streamBoundary","payload","replay","piWorkflowStepEmissionEphemeralTable","schema","name","table","stream","key","boundary"],"sources":["../../../src/client/pi-workflow-emission-stream.ts"],"sourcesContent":["import { workflowsSchema } from \"@fragno-dev/workflows/schema\";\nimport { isWorkflowStepCommittedControlPayload } from \"@fragno-dev/workflows/step-emission-control\";\n\nimport type { LofiEphemeralTable } from \"@fragno-dev/lofi\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst streamKey = (values: Record<string, unknown>): string => {\n const { instanceRef, stepKey, epoch } = values;\n if (instanceRef === undefined || typeof stepKey !== \"string\" || typeof epoch !== \"string\") {\n throw new Error(\"Pi workflow emission is missing its stream identity.\");\n }\n return `${String(instanceRef)}:${stepKey}:${epoch}`;\n};\n\nconst streamBoundary = (values: Record<string, unknown>): \"start\" | \"item\" | \"end\" => {\n const payload = values[\"payload\"];\n if (!isRecord(payload)) {\n return \"item\";\n }\n\n const replay = payload[\"replay\"];\n if (\n payload[\"kind\"] === \"harness-operation-start\" &&\n isRecord(replay) &&\n replay[\"protocol\"] === \"pi-harness-operation\" &&\n replay[\"version\"] === 1\n ) {\n return \"start\";\n }\n\n return isWorkflowStepCommittedControlPayload(payload) ? \"end\" : \"item\";\n};\n\n/** Recoverable Pi operation streams backed by workflow step commit boundaries. */\nexport const piWorkflowStepEmissionEphemeralTable = {\n schema: workflowsSchema.name,\n table: \"workflow_step_emission\",\n stream: {\n key: streamKey,\n boundary: streamBoundary,\n },\n} satisfies LofiEphemeralTable;\n"],"mappings":";;;AAKA,MAAMG,YAAYC,UAChB,OAAOA,UAAU,YAAYA,UAAU;AAEzC,MAAME,aAAaC,WAA4C;CAC7D,MAAM,EAAEC,aAAaC,SAASC,UAAUH;CACxC,IAAIC,gBAAgBG,KAAAA,KAAa,OAAOF,YAAY,YAAY,OAAOC,UAAU,UAC/E,MAAM,IAAIE,MAAM,sDAAsD;CAExE,OAAO,GAAGC,OAAOL,WAAW,EAAC,GAAIC,QAAO,GAAIC;AAC9C;AAEA,MAAMI,kBAAkBP,WAA8D;CACpF,MAAMQ,UAAUR,OAAO;CACvB,IAAI,CAACJ,SAASY,OAAO,GACnB,OAAO;CAGT,MAAMC,SAASD,QAAQ;CACvB,IACEA,QAAQ,YAAY,6BACpBZ,SAASa,MAAM,KACfA,OAAO,gBAAgB,0BACvBA,OAAO,eAAe,GAEtB,OAAO;CAGT,OAAOf,sCAAsCc,OAAO,IAAI,QAAQ;AAClE;;AAGA,MAAaE,uCAAuC;CAClDC,QAAQlB,gBAAgBmB;CACxBC,OAAO;CACPC,QAAQ;EACNC,KAAKhB;EACLiB,UAAUT;CACZ;AACF"}