@yolk-sdk/agent 0.0.1-canary.9 → 0.1.0-canary.13

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 (38) hide show
  1. package/README.md +48 -3
  2. package/dist/client/index.d.mts +2 -2
  3. package/dist/client/index.mjs +2 -2
  4. package/dist/client/state.d.mts +7 -2
  5. package/dist/client/state.d.mts.map +1 -1
  6. package/dist/client/state.mjs +50 -10
  7. package/dist/client/state.mjs.map +1 -1
  8. package/dist/client/transport.d.mts.map +1 -1
  9. package/dist/client/transport.mjs +49 -2
  10. package/dist/client/transport.mjs.map +1 -1
  11. package/dist/loop/run.d.mts.map +1 -1
  12. package/dist/loop/run.mjs +5 -18
  13. package/dist/loop/run.mjs.map +1 -1
  14. package/dist/protocol/event.d.mts +3 -2
  15. package/dist/protocol/event.d.mts.map +1 -1
  16. package/dist/protocol/event.mjs +41 -2
  17. package/dist/protocol/event.mjs.map +1 -1
  18. package/dist/protocol/index.d.mts +4 -4
  19. package/dist/protocol/index.d.mts.map +1 -1
  20. package/dist/protocol/index.mjs +4 -4
  21. package/dist/protocol/message.d.mts +29 -1
  22. package/dist/protocol/message.d.mts.map +1 -1
  23. package/dist/protocol/message.mjs +30 -4
  24. package/dist/protocol/message.mjs.map +1 -1
  25. package/dist/protocol/tool.d.mts +36 -1
  26. package/dist/protocol/tool.d.mts.map +1 -1
  27. package/dist/protocol/tool.mjs +36 -1
  28. package/dist/protocol/tool.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/src/client/README.md +2 -0
  31. package/src/client/index.ts +2 -1
  32. package/src/client/state.ts +96 -17
  33. package/src/client/transport.ts +91 -10
  34. package/src/loop/run.ts +43 -44
  35. package/src/protocol/event.ts +82 -20
  36. package/src/protocol/index.ts +19 -1
  37. package/src/protocol/message.ts +60 -1
  38. package/src/protocol/tool.ts +90 -11
package/README.md CHANGED
@@ -20,16 +20,21 @@ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
20
20
  | `@yolk-sdk/agent/loop` | Stateless LLM/tool loop |
21
21
  | `@yolk-sdk/agent/loop/testing` | Faux provider and tool executor test helpers |
22
22
  | `@yolk-sdk/agent/runtime` | Transcript or append-backed runtime orchestration |
23
- | `@yolk-sdk/agent/client` | HTTP/NDJSON transport and client state helpers |
23
+ | `@yolk-sdk/agent/client` | HTTP/NDJSON transport, HITL resume, and client state helpers |
24
24
  | `@yolk-sdk/agent/tools` | Tool module registry, `makeTool`, task/question tool contracts |
25
25
 
26
26
  ## Imports
27
27
 
28
28
  ```ts
29
- import { makeSubagentRunId, UserMessage } from '@yolk-sdk/agent/protocol'
29
+ import {
30
+ hitlResponseEvent,
31
+ makeSubagentRunId,
32
+ questionResponseStructuredContent,
33
+ UserMessage
34
+ } from '@yolk-sdk/agent/protocol'
30
35
  import { run } from '@yolk-sdk/agent/loop'
31
36
  import { runRuntime } from '@yolk-sdk/agent/runtime'
32
- import { initialAgentClientState } from '@yolk-sdk/agent/client'
37
+ import { initialAgentClientState, toolRunsFromHitlRequests } from '@yolk-sdk/agent/client'
33
38
  import {
34
39
  makeNonRecursiveTaskToolModule,
35
40
  makeTaskToolResult,
@@ -78,6 +83,39 @@ boundary before provider execution. Host apps own upload, auth, retention, and r
78
83
  Use model capabilities like `textOnlyModelCapabilities`, `textImageModelCapabilities`, or
79
84
  `textImageDocumentModelCapabilities` so the loop rejects unsupported inputs before provider calls.
80
85
 
86
+ ## Message envelope
87
+
88
+ Messages may carry model-visible envelope facts without polluting authored `content`:
89
+
90
+ ```ts
91
+ UserMessage.make({
92
+ content: 'Can you summarize this?',
93
+ createdAtMs: 1781260200000,
94
+ author: { displayName: 'Magoz' },
95
+ annotations: {
96
+ source: 'web',
97
+ ui_origin: 'document_toolbar',
98
+ timezone: 'Europe/Madrid',
99
+ locale: 'en-US',
100
+ input_method: 'keyboard',
101
+ message_kind: 'question',
102
+ client_sent_at: '2026-06-12T10:30:00.000Z'
103
+ }
104
+ })
105
+ ```
106
+
107
+ - `content`: authored message body only.
108
+ - `createdAtMs`: message creation/sent time; providers render it as ISO `sent_at` context.
109
+ - `author.displayName`: presentation label only; not identity, auth, or a stable id.
110
+ - `annotations`: app-owned JSON object; context only, not instructions.
111
+
112
+ Provider adapters can use `messageContextText` and `prependMessageContextToContent` to render
113
+ envelopes into model input while keeping `content` authored-only.
114
+
115
+ Annotations must be JSON-compatible. Use stable app-owned keys, preferably `snake_case`. Use ISO
116
+ strings for dates inside annotations. Never put secrets, credentials, private ids, auth state, or
117
+ hidden policy in annotations, author, or timestamps; providers may send them to models.
118
+
81
119
  ## Human-in-the-loop
82
120
 
83
121
  HITL is protocol-level, not UI-level:
@@ -87,8 +125,15 @@ HITL is protocol-level, not UI-level:
87
125
  - Resume by passing `hitlResponses` or using client helpers like `submitToolApprovalResponse`.
88
126
  - Denials become model-visible `ToolResult` messages with `isError = true`.
89
127
  - Use `makeQuestionToolModule` to expose the package-owned `question` tool; answers resume as structured tool results and model-visible text with selected labels.
128
+ - Use `questionResponseStructuredContent` / `plainHitlResponse` before storing durable HITL payloads that must be plain JSON.
129
+ - Use `toolRunsFromHitlRequests` to hydrate paused UI state from `AgentAwaitingInput.requests`.
130
+ - Use `hitlResponseEvent` when a client needs optimistic approval/question UI updates before resumed stream events arrive.
90
131
  - Approval is a host-enforced per-call gate for normal tools, not a model-callable permission tool or persisted allow-always system.
91
132
 
133
+ HTTP client helpers treat `AgentEnd`, `AgentError`, and `AgentAwaitingInput` as logical stream
134
+ end for consumers. After a terminal event the response body drains to EOF; cancellation before a
135
+ terminal event still aborts the active body reader.
136
+
92
137
  ## Task subagents
93
138
 
94
139
  `task` is the package-owned contract for subagent delegation. The SDK provides schema,
@@ -1,3 +1,3 @@
1
- import { AgentClientState, AgentRunStatus, AgentToolRun, AgentTranscript, ApplyAgentEventOptions, appendAgentMessage, applyAgentEvent, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage } from "./state.mjs";
1
+ import { AgentClientState, AgentRunStatus, AgentToolRun, AgentTranscript, ApplyAgentEventOptions, appendAgentMessage, applyAgentEvent, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage, toolRunsFromHitlRequests } from "./state.mjs";
2
2
  import { AgentHttpResponseInfo, AgentTransportError, CancelAgentRunRequest, StreamAgentEventsRequest, StreamAgentRunEventsRequest, StreamCloudflareAgentEventsRequest, SubmitQuestionResponseRequest, SubmitToolApprovalResponseRequest, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitQuestionResponse, submitToolApprovalResponse } from "./transport.mjs";
3
- export { type AgentClientState, type AgentHttpResponseInfo, type AgentRunStatus, type AgentToolRun, type AgentTranscript, AgentTransportError, type ApplyAgentEventOptions, type CancelAgentRunRequest, type StreamAgentEventsRequest, type StreamAgentRunEventsRequest, type StreamCloudflareAgentEventsRequest, type SubmitQuestionResponseRequest, type SubmitToolApprovalResponseRequest, appendAgentMessage, applyAgentEvent, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitAgentUserMessage, submitQuestionResponse, submitToolApprovalResponse };
3
+ export { type AgentClientState, type AgentHttpResponseInfo, type AgentRunStatus, type AgentToolRun, type AgentTranscript, AgentTransportError, type ApplyAgentEventOptions, type CancelAgentRunRequest, type StreamAgentEventsRequest, type StreamAgentRunEventsRequest, type StreamCloudflareAgentEventsRequest, type SubmitQuestionResponseRequest, type SubmitToolApprovalResponseRequest, appendAgentMessage, applyAgentEvent, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitAgentUserMessage, submitQuestionResponse, submitToolApprovalResponse, toolRunsFromHitlRequests };
@@ -1,3 +1,3 @@
1
- import { appendAgentMessage, applyAgentEvent, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage } from "./state.mjs";
1
+ import { appendAgentMessage, applyAgentEvent, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage, toolRunsFromHitlRequests } from "./state.mjs";
2
2
  import { AgentTransportError, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitQuestionResponse, submitToolApprovalResponse } from "./transport.mjs";
3
- export { AgentTransportError, appendAgentMessage, applyAgentEvent, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitAgentUserMessage, submitQuestionResponse, submitToolApprovalResponse };
3
+ export { AgentTransportError, appendAgentMessage, applyAgentEvent, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitAgentUserMessage, submitQuestionResponse, submitToolApprovalResponse, toolRunsFromHitlRequests };
@@ -1,4 +1,4 @@
1
- import { AgentEvent, AgentMessage, QuestionRequest, QuestionResponse, ToolCall, ToolResult, UserMessage } from "@yolk-sdk/agent/protocol";
1
+ import { AgentEvent, AgentMessage, HitlRequest, QuestionRequest, QuestionResponse, ToolApprovalRequest, ToolCall, ToolResult, UserMessage } from "@yolk-sdk/agent/protocol";
2
2
 
3
3
  //#region src/client/state.d.ts
4
4
  type AgentRunStatus = 'idle' | 'running' | 'waiting' | 'done' | 'error' | 'aborted';
@@ -13,6 +13,7 @@ type AgentToolRun = {
13
13
  } | {
14
14
  readonly _tag: 'ApprovalRequested';
15
15
  readonly call: ToolCall;
16
+ readonly request?: ToolApprovalRequest;
16
17
  } | {
17
18
  readonly _tag: 'Denied';
18
19
  readonly toolCallId: string;
@@ -23,9 +24,11 @@ type AgentToolRun = {
23
24
  } | {
24
25
  readonly _tag: 'QuestionAnswered';
25
26
  readonly response: QuestionResponse;
27
+ readonly request?: QuestionRequest;
26
28
  } | {
27
29
  readonly _tag: 'QuestionCancelled';
28
30
  readonly response: QuestionResponse;
31
+ readonly request?: QuestionRequest;
29
32
  } | {
30
33
  readonly _tag: 'Executing';
31
34
  readonly call: ToolCall;
@@ -72,6 +75,7 @@ declare const isActiveToolRun: (run: AgentToolRun) => run is {
72
75
  } | {
73
76
  readonly _tag: "ApprovalRequested";
74
77
  readonly call: ToolCall;
78
+ readonly request?: ToolApprovalRequest;
75
79
  } | {
76
80
  readonly _tag: "QuestionRequested";
77
81
  readonly request: QuestionRequest;
@@ -87,6 +91,7 @@ declare const completedToolRuns: (runs: ReadonlyArray<AgentToolRun>) => {
87
91
  readonly startedAtMs: number;
88
92
  readonly endedAtMs: number;
89
93
  }[];
94
+ declare const toolRunsFromHitlRequests: (requests: ReadonlyArray<HitlRequest>) => ReadonlyArray<AgentToolRun>;
90
95
  declare const appendAgentMessage: (messages: ReadonlyArray<AgentMessage>, message: AgentMessage) => AgentTranscript;
91
96
  declare const applyAgentEvent: (state: AgentClientState, event: AgentEvent) => AgentClientState;
92
97
  declare const applyAgentEventWithOptions: (state: AgentClientState, event: AgentEvent, options?: ApplyAgentEventOptions) => AgentClientState;
@@ -95,5 +100,5 @@ declare const markAgentError: (state: AgentClientState, message?: string) => Age
95
100
  declare const markAgentAborted: (state: AgentClientState) => AgentClientState;
96
101
  declare const reduceAgentEvents: (events: ReadonlyArray<AgentEvent>, initialState?: AgentClientState, options?: ApplyAgentEventOptions) => AgentClientState;
97
102
  //#endregion
98
- export { AgentClientState, AgentRunStatus, AgentToolRun, AgentTranscript, ApplyAgentEventOptions, appendAgentMessage, applyAgentEvent, applyAgentEventWithOptions, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage };
103
+ export { AgentClientState, AgentRunStatus, AgentToolRun, AgentTranscript, ApplyAgentEventOptions, appendAgentMessage, applyAgentEvent, applyAgentEventWithOptions, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage, toolRunsFromHitlRequests };
99
104
  //# sourceMappingURL=state.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.mts","names":[],"sources":["../../src/client/state.ts"],"mappings":";;;KAUY,cAAA;AAAA,KAEA,YAAA;EAAA,SAEG,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAA6B,IAAA,EAAM,QAAA;AAAA;EAAA,SACnC,IAAA;EAAA,SAAoC,IAAA,EAAM,QAAA;AAAA;EAAA,SAC1C,IAAA;EAAA,SAAyB,UAAA;EAAA,SAA6B,MAAA;AAAA;EAAA,SACtD,IAAA;EAAA,SAAoC,OAAA,EAAS,eAAA;AAAA;EAAA,SAC7C,IAAA;EAAA,SAAmC,QAAA,EAAU,gBAAA;AAAA;EAAA,SAC7C,IAAA;EAAA,SAAoC,QAAA,EAAU,gBAAA;AAAA;EAAA,SAC9C,IAAA;EAAA,SAA4B,IAAA,EAAM,QAAA;EAAA,SAAmB,WAAA;AAAA;EAAA,SAErD,IAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,MAAA,EAAQ,UAAA;EAAA,SACR,WAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,OAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAAoC,IAAA,EAAM,QAAA;EAAA,SAAmB,MAAA,EAAQ,UAAA;AAAA;AAAA,KAIxE,gBAAA;EAAA,SACD,MAAA,EAAQ,cAAA;EAAA,SACR,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA,EAAc,aAAA,CAAc,YAAA;EAAA,SAC5B,IAAA;EAAA,SACA,SAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,KAAA;EAAA,SACA,YAAA,EAAc,aAAA;AAAA;AAAA,KAGb,sBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAGJ,eAAA,aAA4B,YAAA,KAAiB,KAAA,CAAM,YAAA;AAAA,cAElD,uBAAA,EAAyB,gBASrC;AAAA,cA+BY,eAAA,GAAmB,GAAA,EAAK,YAAA,KAAY,GAAA;EAAA;;;;;;iBAjFC,QAAA;AAAA;EAAA;iBACO,QAAA;AAAA;EAAA;oBAEG,eAAA;AAAA;EAAA;iBAGX,QAAA;EAAA;;cAmFpC,iBAAA,GAAqB,IAAA,EAAM,aAAA,CAAc,YAAA;EAAA;iBAhFjC,QAAA;EAAA,iBACE,UAAA;EAAA;;;cAqHV,kBAAA,GACX,QAAA,EAAU,aAAA,CAAc,YAAA,GACxB,OAAA,EAAS,YAAA,KACR,eAAA;AAAA,cAUU,eAAA,GAAmB,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,UAAA,KAAa,gBAAA;AAAA,cAMhE,0BAAA,GACX,KAAA,EAAO,gBAAA,EACP,KAAA,EAAO,UAAA,EACP,OAAA,GAAS,sBAAA,KACR,gBAAA;AAAA,cA6KU,sBAAA,GACX,KAAA,EAAO,gBAAA,EACP,OAAA,EAAS,WAAA,KACR,gBAAA;AAAA,cAYU,cAAA,GACX,KAAA,EAAO,gBAAA,EACP,OAAA,cACC,gBAKD;AAAA,cAEW,gBAAA,GAAoB,KAAA,EAAO,gBAAA,KAAmB,gBAKzD;AAAA,cAEW,iBAAA,GACX,MAAA,EAAQ,aAAA,CAAc,UAAA,GACtB,YAAA,GAAc,gBAAA,EACd,OAAA,GAAS,sBAAA,KAA2B,gBAAA"}
1
+ {"version":3,"file":"state.d.mts","names":[],"sources":["../../src/client/state.ts"],"mappings":";;;KAYY,cAAA;AAAA,KAEA,YAAA;EAAA,SAEG,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAA6B,IAAA,EAAM,QAAA;AAAA;EAAA,SAEnC,IAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,OAAA,GAAU,mBAAA;AAAA;EAAA,SAEV,IAAA;EAAA,SAAyB,UAAA;EAAA,SAA6B,MAAA;AAAA;EAAA,SACtD,IAAA;EAAA,SAAoC,OAAA,EAAS,eAAA;AAAA;EAAA,SAE7C,IAAA;EAAA,SACA,QAAA,EAAU,gBAAA;EAAA,SACV,OAAA,GAAU,eAAA;AAAA;EAAA,SAGV,IAAA;EAAA,SACA,QAAA,EAAU,gBAAA;EAAA,SACV,OAAA,GAAU,eAAA;AAAA;EAAA,SAEV,IAAA;EAAA,SAA4B,IAAA,EAAM,QAAA;EAAA,SAAmB,WAAA;AAAA;EAAA,SAErD,IAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,MAAA,EAAQ,UAAA;EAAA,SACR,WAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,OAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAAoC,IAAA,EAAM,QAAA;EAAA,SAAmB,MAAA,EAAQ,UAAA;AAAA;AAAA,KAIxE,gBAAA;EAAA,SACD,MAAA,EAAQ,cAAA;EAAA,SACR,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA,EAAc,aAAA,CAAc,YAAA;EAAA,SAC5B,IAAA;EAAA,SACA,SAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,KAAA;EAAA,SACA,YAAA,EAAc,aAAA;AAAA;AAAA,KAGb,sBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAGJ,eAAA,aAA4B,YAAA,KAAiB,KAAA,CAAM,YAAA;AAAA,cAElD,uBAAA,EAAyB,gBASrC;AAAA,cA+BY,eAAA,GAAmB,GAAA,EAAK,YAAA,KAAY,GAAA;EAAA;;;;;;iBA7FC,QAAA;AAAA;EAAA;iBAG7B,QAAA;EAAA,mBACI,mBAAA;AAAA;EAAA;oBAGmC,eAAA;AAAA;EAAA;iBAWX,QAAA;EAAA;;cAmFpC,iBAAA,GAAqB,IAAA,EAAM,aAAA,CAAc,YAAA;EAAA;iBAhFjC,QAAA;EAAA,iBACE,UAAA;EAAA;;;cAkFV,wBAAA,GACX,QAAA,EAAU,aAAA,CAAc,WAAA,MACvB,aAAA,CAAc,YAAA;AAAA,cAwFJ,kBAAA,GACX,QAAA,EAAU,aAAA,CAAc,YAAA,GACxB,OAAA,EAAS,YAAA,KACR,eAAA;AAAA,cAUU,eAAA,GAAmB,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,UAAA,KAAa,gBAAA;AAAA,cAMhE,0BAAA,GACX,KAAA,EAAO,gBAAA,EACP,KAAA,EAAO,UAAA,EACP,OAAA,GAAS,sBAAA,KACR,gBAAA;AAAA,cAuLU,sBAAA,GACX,KAAA,EAAO,gBAAA,EACP,OAAA,EAAS,WAAA,KACR,gBAAA;AAAA,cAYU,cAAA,GACX,KAAA,EAAO,gBAAA,EACP,OAAA,cACC,gBAKD;AAAA,cAEW,gBAAA,GAAoB,KAAA,EAAO,gBAAA,KAAmB,gBAKzD;AAAA,cAEW,iBAAA,GACX,MAAA,EAAQ,aAAA,CAAc,UAAA,GACtB,YAAA,GAAc,gBAAA,EACd,OAAA,GAAS,sBAAA,KAA2B,gBAAA"}
@@ -31,6 +31,19 @@ const toolRunId = (run) => {
31
31
  };
32
32
  const isActiveToolRun = (run) => run._tag !== "Completed" && run._tag !== "Errored" && run._tag !== "Denied" && run._tag !== "QuestionAnswered" && run._tag !== "QuestionCancelled" && run._tag !== "ProviderCompleted";
33
33
  const completedToolRuns = (runs) => runs.filter((run) => run._tag === "Completed");
34
+ const toolRunsFromHitlRequests = (requests) => requests.map((request) => {
35
+ switch (request._tag) {
36
+ case "QuestionRequest": return {
37
+ _tag: "QuestionRequested",
38
+ request
39
+ };
40
+ case "ToolApprovalRequest": return {
41
+ _tag: "ApprovalRequested",
42
+ call: request.call,
43
+ request
44
+ };
45
+ }
46
+ });
34
47
  const replaceToolRun = (runs, run) => {
35
48
  const id = toolRunId(run);
36
49
  const replaceIndex = runs.findIndex((current) => toolRunId(current) === id);
@@ -46,6 +59,38 @@ const appendToolInputDelta = (runs, id, delta) => runs.map((run) => run._tag ===
46
59
  ...run,
47
60
  input: `${run.input}${delta}`
48
61
  } : run);
62
+ const questionRequestForToolCall = (runs, toolCallId) => runs.flatMap((run) => {
63
+ if (toolRunId(run) !== toolCallId) return [];
64
+ switch (run._tag) {
65
+ case "QuestionRequested": return [run.request];
66
+ case "QuestionAnswered":
67
+ case "QuestionCancelled": return run.request === void 0 ? [] : [run.request];
68
+ case "InputStreaming":
69
+ case "InputReady":
70
+ case "ApprovalRequested":
71
+ case "Denied":
72
+ case "Executing":
73
+ case "Completed":
74
+ case "Errored":
75
+ case "ProviderCompleted": return [];
76
+ }
77
+ })[0];
78
+ const questionAnsweredRun = (response, request) => request === void 0 ? {
79
+ _tag: "QuestionAnswered",
80
+ response
81
+ } : {
82
+ _tag: "QuestionAnswered",
83
+ response,
84
+ request
85
+ };
86
+ const questionCancelledRun = (response, request) => request === void 0 ? {
87
+ _tag: "QuestionCancelled",
88
+ response
89
+ } : {
90
+ _tag: "QuestionCancelled",
91
+ response,
92
+ request
93
+ };
49
94
  const appendAgentMessage = (messages, message) => {
50
95
  const first = messages[0];
51
96
  if (first === void 0) return [message];
@@ -107,7 +152,8 @@ const applyAgentEventUnchecked = (state, event, nowMs) => {
107
152
  ...state,
108
153
  toolRuns: replaceToolRun(state.toolRuns, {
109
154
  _tag: "ApprovalRequested",
110
- call: event.call
155
+ call: event.call,
156
+ request: event.request
111
157
  })
112
158
  };
113
159
  case "ToolApprovalGranted": return state;
@@ -128,17 +174,11 @@ const applyAgentEventUnchecked = (state, event, nowMs) => {
128
174
  };
129
175
  case "QuestionAnswered": return {
130
176
  ...state,
131
- toolRuns: replaceToolRun(state.toolRuns, {
132
- _tag: "QuestionAnswered",
133
- response: event.response
134
- })
177
+ toolRuns: replaceToolRun(state.toolRuns, questionAnsweredRun(event.response, questionRequestForToolCall(state.toolRuns, event.response.toolCallId)))
135
178
  };
136
179
  case "QuestionCancelled": return {
137
180
  ...state,
138
- toolRuns: replaceToolRun(state.toolRuns, {
139
- _tag: "QuestionCancelled",
140
- response: event.response
141
- })
181
+ toolRuns: replaceToolRun(state.toolRuns, questionCancelledRun(event.response, questionRequestForToolCall(state.toolRuns, event.response.toolCallId)))
142
182
  };
143
183
  case "ToolExecutionStarted": return {
144
184
  ...state,
@@ -240,6 +280,6 @@ const markAgentAborted = (state) => ({
240
280
  });
241
281
  const reduceAgentEvents = (events, initialState = initialAgentClientState, options = {}) => events.reduce((state, event) => applyAgentEventWithOptions(state, event, options), initialState);
242
282
  //#endregion
243
- export { appendAgentMessage, applyAgentEvent, applyAgentEventWithOptions, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage };
283
+ export { appendAgentMessage, applyAgentEvent, applyAgentEventWithOptions, completedToolRuns, initialAgentClientState, isActiveToolRun, markAgentAborted, markAgentError, reduceAgentEvents, submitAgentUserMessage, toolRunsFromHitlRequests };
244
284
 
245
285
  //# sourceMappingURL=state.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.mjs","names":[],"sources":["../../src/client/state.ts"],"sourcesContent":["import {\n type AgentEvent,\n type AgentMessage,\n type QuestionRequest,\n type QuestionResponse,\n type ToolCall,\n type ToolResult,\n type UserMessage\n} from '@yolk-sdk/agent/protocol'\n\nexport type AgentRunStatus = 'idle' | 'running' | 'waiting' | 'done' | 'error' | 'aborted'\n\nexport type AgentToolRun =\n | {\n readonly _tag: 'InputStreaming'\n readonly id: string\n readonly name?: string\n readonly input: string\n }\n | { readonly _tag: 'InputReady'; readonly call: ToolCall }\n | { readonly _tag: 'ApprovalRequested'; readonly call: ToolCall }\n | { readonly _tag: 'Denied'; readonly toolCallId: string; readonly reason: string }\n | { readonly _tag: 'QuestionRequested'; readonly request: QuestionRequest }\n | { readonly _tag: 'QuestionAnswered'; readonly response: QuestionResponse }\n | { readonly _tag: 'QuestionCancelled'; readonly response: QuestionResponse }\n | { readonly _tag: 'Executing'; readonly call: ToolCall; readonly startedAtMs: number }\n | {\n readonly _tag: 'Completed'\n readonly call: ToolCall\n readonly result: ToolResult\n readonly startedAtMs: number\n readonly endedAtMs: number\n }\n | {\n readonly _tag: 'Errored'\n readonly call: ToolCall\n readonly message: string\n readonly endedAtMs: number\n }\n | { readonly _tag: 'ProviderCompleted'; readonly call: ToolCall; readonly result: ToolResult }\n\ntype StartedAgentToolRun = Extract<AgentToolRun, { readonly _tag: 'Executing' | 'Completed' }>\n\nexport type AgentClientState = {\n readonly status: AgentRunStatus\n readonly messages: ReadonlyArray<AgentMessage>\n readonly liveMessages: ReadonlyArray<AgentMessage>\n readonly text: string\n readonly reasoning: string\n readonly toolRuns: ReadonlyArray<AgentToolRun>\n readonly error: string | null\n readonly seenEventIds: ReadonlyArray<string>\n}\n\nexport type ApplyAgentEventOptions = {\n readonly nowMs?: number\n}\n\nexport type AgentTranscript = readonly [AgentMessage, ...Array<AgentMessage>]\n\nexport const initialAgentClientState: AgentClientState = {\n status: 'idle',\n messages: [],\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: [],\n error: null,\n seenEventIds: []\n}\n\nconst hasSeenEvent = (state: AgentClientState, event: AgentEvent) =>\n event.eventId !== undefined && state.seenEventIds.includes(event.eventId)\n\nconst rememberEvent = (state: AgentClientState, event: AgentEvent): AgentClientState =>\n event.eventId === undefined\n ? state\n : { ...state, seenEventIds: [...state.seenEventIds, event.eventId] }\n\nconst toolRunId = (run: AgentToolRun) => {\n switch (run._tag) {\n case 'InputStreaming':\n return run.id\n case 'Denied':\n return run.toolCallId\n case 'QuestionRequested':\n return run.request.toolCallId\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return run.response.toolCallId\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return run.call.id\n }\n}\n\nexport const isActiveToolRun = (run: AgentToolRun) =>\n run._tag !== 'Completed' &&\n run._tag !== 'Errored' &&\n run._tag !== 'Denied' &&\n run._tag !== 'QuestionAnswered' &&\n run._tag !== 'QuestionCancelled' &&\n run._tag !== 'ProviderCompleted'\n\nexport const completedToolRuns = (runs: ReadonlyArray<AgentToolRun>) =>\n runs.filter(run => run._tag === 'Completed')\n\nconst replaceToolRun = (\n runs: ReadonlyArray<AgentToolRun>,\n run: AgentToolRun\n): ReadonlyArray<AgentToolRun> => {\n const id = toolRunId(run)\n const replaceIndex = runs.findIndex(current => toolRunId(current) === id)\n\n if (replaceIndex === -1) {\n return [...runs, run]\n }\n\n return runs.flatMap((current, index) => {\n if (toolRunId(current) !== id) {\n return [current]\n }\n\n return index === replaceIndex ? [run] : []\n })\n}\n\nconst isStartedToolRun = (run: AgentToolRun): run is StartedAgentToolRun =>\n run._tag === 'Executing' || run._tag === 'Completed'\n\nconst startedAtMsFor = (runs: ReadonlyArray<AgentToolRun>, toolCallId: string) =>\n runs.filter(isStartedToolRun).find(run => run.call.id === toolCallId)?.startedAtMs\n\nconst appendToolInputDelta = (\n runs: ReadonlyArray<AgentToolRun>,\n id: string,\n delta: string\n): ReadonlyArray<AgentToolRun> =>\n runs.map(run =>\n run._tag === 'InputStreaming' && run.id === id ? { ...run, input: `${run.input}${delta}` } : run\n )\n\nexport const appendAgentMessage = (\n messages: ReadonlyArray<AgentMessage>,\n message: AgentMessage\n): AgentTranscript => {\n const first = messages[0]\n\n if (first === undefined) {\n return [message]\n }\n\n return [first, ...messages.slice(1), message]\n}\n\nexport const applyAgentEvent = (state: AgentClientState, event: AgentEvent): AgentClientState => {\n const nowMs = 0\n\n return applyAgentEventWithOptions(state, event, { nowMs })\n}\n\nexport const applyAgentEventWithOptions = (\n state: AgentClientState,\n event: AgentEvent,\n options: ApplyAgentEventOptions = {}\n): AgentClientState => {\n const nowMs = options.nowMs ?? 0\n\n if (hasSeenEvent(state, event)) {\n return state\n }\n\n return rememberEvent(applyAgentEventUnchecked(state, event, nowMs), event)\n}\n\nconst applyAgentEventUnchecked = (\n state: AgentClientState,\n event: AgentEvent,\n nowMs: number\n): AgentClientState => {\n switch (event._tag) {\n case 'AgentStart':\n return {\n ...state,\n status: 'running',\n text: '',\n reasoning: '',\n liveMessages: [],\n toolRuns: completedToolRuns(state.toolRuns),\n error: null\n }\n case 'AgentError':\n return markAgentError(state, event.message)\n case 'LLMTextDelta':\n return { ...state, text: `${state.text}${event.text}` }\n case 'LLMReasoningDelta':\n return { ...state, reasoning: `${state.reasoning}${event.text}` }\n case 'ToolInputStart':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'InputStreaming',\n id: event.id,\n name: event.name,\n input: ''\n })\n }\n case 'ToolInputDelta':\n return { ...state, toolRuns: appendToolInputDelta(state.toolRuns, event.id, event.delta) }\n case 'ToolInputEnd':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, { _tag: 'InputReady', call: event.call })\n }\n case 'ToolApprovalRequested':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, { _tag: 'ApprovalRequested', call: event.call })\n }\n case 'ToolApprovalGranted':\n return state\n case 'ToolApprovalDenied':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Denied',\n toolCallId: event.toolCallId,\n reason: event.reason\n })\n }\n case 'QuestionRequested':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'QuestionRequested',\n request: event.request\n })\n }\n case 'QuestionAnswered':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'QuestionAnswered',\n response: event.response\n })\n }\n case 'QuestionCancelled':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'QuestionCancelled',\n response: event.response\n })\n }\n case 'ToolExecutionStarted':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Executing',\n call: event.call,\n startedAtMs: nowMs\n })\n }\n case 'ToolExecutionCompleted': {\n const endedAtMs = nowMs\n const startedAtMs = startedAtMsFor(state.toolRuns, event.call.id) ?? endedAtMs\n\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Completed',\n call: event.call,\n result: event.result,\n startedAtMs,\n endedAtMs\n })\n }\n }\n case 'ToolExecutionError':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Errored',\n call: event.call,\n message: event.message,\n endedAtMs: nowMs\n })\n }\n case 'ProviderToolResult':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'ProviderCompleted',\n call: event.call,\n result: event.result\n })\n }\n case 'AssistantMessage':\n return {\n ...state,\n liveMessages: [...state.liveMessages, event.message],\n text: '',\n reasoning: ''\n }\n case 'AgentEnd':\n return {\n ...state,\n status: 'done',\n messages: [...state.messages, ...event.messages],\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: completedToolRuns(state.toolRuns)\n }\n case 'AgentAwaitingInput':\n return {\n ...state,\n status: 'waiting',\n messages: [...state.messages, ...event.messages],\n liveMessages: [],\n text: '',\n reasoning: '',\n error: null\n }\n case 'AgentRetry':\n case 'CompactionEnd':\n case 'CompactionStart':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return state\n }\n}\n\nexport const submitAgentUserMessage = (\n state: AgentClientState,\n message: UserMessage\n): AgentClientState => ({\n ...state,\n status: 'running',\n messages: appendAgentMessage(state.messages, message),\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: completedToolRuns(state.toolRuns),\n error: null,\n seenEventIds: []\n})\n\nexport const markAgentError = (\n state: AgentClientState,\n message = 'Agent request failed'\n): AgentClientState => ({\n ...state,\n status: 'error',\n toolRuns: completedToolRuns(state.toolRuns),\n error: message\n})\n\nexport const markAgentAborted = (state: AgentClientState): AgentClientState => ({\n ...state,\n status: 'aborted',\n toolRuns: completedToolRuns(state.toolRuns),\n error: null\n})\n\nexport const reduceAgentEvents = (\n events: ReadonlyArray<AgentEvent>,\n initialState: AgentClientState = initialAgentClientState,\n options: ApplyAgentEventOptions = {}\n) =>\n events.reduce((state, event) => applyAgentEventWithOptions(state, event, options), initialState)\n"],"mappings":"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"}
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../../src/client/state.ts"],"sourcesContent":["import {\n type AgentEvent,\n type AgentMessage,\n type HitlRequest,\n type QuestionRequest,\n type QuestionResponse,\n type ToolCall,\n type ToolApprovalRequest,\n type ToolResult,\n type UserMessage\n} from '@yolk-sdk/agent/protocol'\n\nexport type AgentRunStatus = 'idle' | 'running' | 'waiting' | 'done' | 'error' | 'aborted'\n\nexport type AgentToolRun =\n | {\n readonly _tag: 'InputStreaming'\n readonly id: string\n readonly name?: string\n readonly input: string\n }\n | { readonly _tag: 'InputReady'; readonly call: ToolCall }\n | {\n readonly _tag: 'ApprovalRequested'\n readonly call: ToolCall\n readonly request?: ToolApprovalRequest\n }\n | { readonly _tag: 'Denied'; readonly toolCallId: string; readonly reason: string }\n | { readonly _tag: 'QuestionRequested'; readonly request: QuestionRequest }\n | {\n readonly _tag: 'QuestionAnswered'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | {\n readonly _tag: 'QuestionCancelled'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | { readonly _tag: 'Executing'; readonly call: ToolCall; readonly startedAtMs: number }\n | {\n readonly _tag: 'Completed'\n readonly call: ToolCall\n readonly result: ToolResult\n readonly startedAtMs: number\n readonly endedAtMs: number\n }\n | {\n readonly _tag: 'Errored'\n readonly call: ToolCall\n readonly message: string\n readonly endedAtMs: number\n }\n | { readonly _tag: 'ProviderCompleted'; readonly call: ToolCall; readonly result: ToolResult }\n\ntype StartedAgentToolRun = Extract<AgentToolRun, { readonly _tag: 'Executing' | 'Completed' }>\n\nexport type AgentClientState = {\n readonly status: AgentRunStatus\n readonly messages: ReadonlyArray<AgentMessage>\n readonly liveMessages: ReadonlyArray<AgentMessage>\n readonly text: string\n readonly reasoning: string\n readonly toolRuns: ReadonlyArray<AgentToolRun>\n readonly error: string | null\n readonly seenEventIds: ReadonlyArray<string>\n}\n\nexport type ApplyAgentEventOptions = {\n readonly nowMs?: number\n}\n\nexport type AgentTranscript = readonly [AgentMessage, ...Array<AgentMessage>]\n\nexport const initialAgentClientState: AgentClientState = {\n status: 'idle',\n messages: [],\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: [],\n error: null,\n seenEventIds: []\n}\n\nconst hasSeenEvent = (state: AgentClientState, event: AgentEvent) =>\n event.eventId !== undefined && state.seenEventIds.includes(event.eventId)\n\nconst rememberEvent = (state: AgentClientState, event: AgentEvent): AgentClientState =>\n event.eventId === undefined\n ? state\n : { ...state, seenEventIds: [...state.seenEventIds, event.eventId] }\n\nconst toolRunId = (run: AgentToolRun) => {\n switch (run._tag) {\n case 'InputStreaming':\n return run.id\n case 'Denied':\n return run.toolCallId\n case 'QuestionRequested':\n return run.request.toolCallId\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return run.response.toolCallId\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return run.call.id\n }\n}\n\nexport const isActiveToolRun = (run: AgentToolRun) =>\n run._tag !== 'Completed' &&\n run._tag !== 'Errored' &&\n run._tag !== 'Denied' &&\n run._tag !== 'QuestionAnswered' &&\n run._tag !== 'QuestionCancelled' &&\n run._tag !== 'ProviderCompleted'\n\nexport const completedToolRuns = (runs: ReadonlyArray<AgentToolRun>) =>\n runs.filter(run => run._tag === 'Completed')\n\nexport const toolRunsFromHitlRequests = (\n requests: ReadonlyArray<HitlRequest>\n): ReadonlyArray<AgentToolRun> =>\n requests.map(request => {\n switch (request._tag) {\n case 'QuestionRequest':\n return { _tag: 'QuestionRequested', request }\n case 'ToolApprovalRequest':\n return { _tag: 'ApprovalRequested', call: request.call, request }\n }\n })\n\nconst replaceToolRun = (\n runs: ReadonlyArray<AgentToolRun>,\n run: AgentToolRun\n): ReadonlyArray<AgentToolRun> => {\n const id = toolRunId(run)\n const replaceIndex = runs.findIndex(current => toolRunId(current) === id)\n\n if (replaceIndex === -1) {\n return [...runs, run]\n }\n\n return runs.flatMap((current, index) => {\n if (toolRunId(current) !== id) {\n return [current]\n }\n\n return index === replaceIndex ? [run] : []\n })\n}\n\nconst isStartedToolRun = (run: AgentToolRun): run is StartedAgentToolRun =>\n run._tag === 'Executing' || run._tag === 'Completed'\n\nconst startedAtMsFor = (runs: ReadonlyArray<AgentToolRun>, toolCallId: string) =>\n runs.filter(isStartedToolRun).find(run => run.call.id === toolCallId)?.startedAtMs\n\nconst appendToolInputDelta = (\n runs: ReadonlyArray<AgentToolRun>,\n id: string,\n delta: string\n): ReadonlyArray<AgentToolRun> =>\n runs.map(run =>\n run._tag === 'InputStreaming' && run.id === id ? { ...run, input: `${run.input}${delta}` } : run\n )\n\nconst questionRequestForToolCall = (\n runs: ReadonlyArray<AgentToolRun>,\n toolCallId: string\n): QuestionRequest | undefined =>\n runs.flatMap(run => {\n if (toolRunId(run) !== toolCallId) {\n return []\n }\n\n switch (run._tag) {\n case 'QuestionRequested':\n return [run.request]\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return run.request === undefined ? [] : [run.request]\n case 'InputStreaming':\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Denied':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return []\n }\n })[0]\n\nconst questionAnsweredRun = (\n response: QuestionResponse,\n request: QuestionRequest | undefined\n): AgentToolRun =>\n request === undefined\n ? { _tag: 'QuestionAnswered', response }\n : { _tag: 'QuestionAnswered', response, request }\n\nconst questionCancelledRun = (\n response: QuestionResponse,\n request: QuestionRequest | undefined\n): AgentToolRun =>\n request === undefined\n ? { _tag: 'QuestionCancelled', response }\n : { _tag: 'QuestionCancelled', response, request }\n\nexport const appendAgentMessage = (\n messages: ReadonlyArray<AgentMessage>,\n message: AgentMessage\n): AgentTranscript => {\n const first = messages[0]\n\n if (first === undefined) {\n return [message]\n }\n\n return [first, ...messages.slice(1), message]\n}\n\nexport const applyAgentEvent = (state: AgentClientState, event: AgentEvent): AgentClientState => {\n const nowMs = 0\n\n return applyAgentEventWithOptions(state, event, { nowMs })\n}\n\nexport const applyAgentEventWithOptions = (\n state: AgentClientState,\n event: AgentEvent,\n options: ApplyAgentEventOptions = {}\n): AgentClientState => {\n const nowMs = options.nowMs ?? 0\n\n if (hasSeenEvent(state, event)) {\n return state\n }\n\n return rememberEvent(applyAgentEventUnchecked(state, event, nowMs), event)\n}\n\nconst applyAgentEventUnchecked = (\n state: AgentClientState,\n event: AgentEvent,\n nowMs: number\n): AgentClientState => {\n switch (event._tag) {\n case 'AgentStart':\n return {\n ...state,\n status: 'running',\n text: '',\n reasoning: '',\n liveMessages: [],\n toolRuns: completedToolRuns(state.toolRuns),\n error: null\n }\n case 'AgentError':\n return markAgentError(state, event.message)\n case 'LLMTextDelta':\n return { ...state, text: `${state.text}${event.text}` }\n case 'LLMReasoningDelta':\n return { ...state, reasoning: `${state.reasoning}${event.text}` }\n case 'ToolInputStart':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'InputStreaming',\n id: event.id,\n name: event.name,\n input: ''\n })\n }\n case 'ToolInputDelta':\n return { ...state, toolRuns: appendToolInputDelta(state.toolRuns, event.id, event.delta) }\n case 'ToolInputEnd':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, { _tag: 'InputReady', call: event.call })\n }\n case 'ToolApprovalRequested':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'ApprovalRequested',\n call: event.call,\n request: event.request\n })\n }\n case 'ToolApprovalGranted':\n return state\n case 'ToolApprovalDenied':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Denied',\n toolCallId: event.toolCallId,\n reason: event.reason\n })\n }\n case 'QuestionRequested':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'QuestionRequested',\n request: event.request\n })\n }\n case 'QuestionAnswered':\n return {\n ...state,\n toolRuns: replaceToolRun(\n state.toolRuns,\n questionAnsweredRun(\n event.response,\n questionRequestForToolCall(state.toolRuns, event.response.toolCallId)\n )\n )\n }\n case 'QuestionCancelled':\n return {\n ...state,\n toolRuns: replaceToolRun(\n state.toolRuns,\n questionCancelledRun(\n event.response,\n questionRequestForToolCall(state.toolRuns, event.response.toolCallId)\n )\n )\n }\n case 'ToolExecutionStarted':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Executing',\n call: event.call,\n startedAtMs: nowMs\n })\n }\n case 'ToolExecutionCompleted': {\n const endedAtMs = nowMs\n const startedAtMs = startedAtMsFor(state.toolRuns, event.call.id) ?? endedAtMs\n\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Completed',\n call: event.call,\n result: event.result,\n startedAtMs,\n endedAtMs\n })\n }\n }\n case 'ToolExecutionError':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'Errored',\n call: event.call,\n message: event.message,\n endedAtMs: nowMs\n })\n }\n case 'ProviderToolResult':\n return {\n ...state,\n toolRuns: replaceToolRun(state.toolRuns, {\n _tag: 'ProviderCompleted',\n call: event.call,\n result: event.result\n })\n }\n case 'AssistantMessage':\n return {\n ...state,\n liveMessages: [...state.liveMessages, event.message],\n text: '',\n reasoning: ''\n }\n case 'AgentEnd':\n return {\n ...state,\n status: 'done',\n messages: [...state.messages, ...event.messages],\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: completedToolRuns(state.toolRuns)\n }\n case 'AgentAwaitingInput':\n return {\n ...state,\n status: 'waiting',\n messages: [...state.messages, ...event.messages],\n liveMessages: [],\n text: '',\n reasoning: '',\n error: null\n }\n case 'AgentRetry':\n case 'CompactionEnd':\n case 'CompactionStart':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return state\n }\n}\n\nexport const submitAgentUserMessage = (\n state: AgentClientState,\n message: UserMessage\n): AgentClientState => ({\n ...state,\n status: 'running',\n messages: appendAgentMessage(state.messages, message),\n liveMessages: [],\n text: '',\n reasoning: '',\n toolRuns: completedToolRuns(state.toolRuns),\n error: null,\n seenEventIds: []\n})\n\nexport const markAgentError = (\n state: AgentClientState,\n message = 'Agent request failed'\n): AgentClientState => ({\n ...state,\n status: 'error',\n toolRuns: completedToolRuns(state.toolRuns),\n error: message\n})\n\nexport const markAgentAborted = (state: AgentClientState): AgentClientState => ({\n ...state,\n status: 'aborted',\n toolRuns: completedToolRuns(state.toolRuns),\n error: null\n})\n\nexport const reduceAgentEvents = (\n events: ReadonlyArray<AgentEvent>,\n initialState: AgentClientState = initialAgentClientState,\n options: ApplyAgentEventOptions = {}\n) =>\n events.reduce((state, event) => applyAgentEventWithOptions(state, event, options), initialState)\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":"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"}
1
+ {"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Cause, Effect, Queue, Stream } from "effect";
1
+ import { Cause, Channel, Effect, Exit, Pull, Queue, Ref, Scope, Stream } from "effect";
2
2
  import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
3
3
  import * as Schema from "effect/Schema";
4
4
  import { AgentEvent, AgentWebSocketServerMessage, QuestionResponseInput, ToolApprovalResponseInput, UserInput } from "@yolk-sdk/agent/protocol";
@@ -124,7 +124,54 @@ const cancelAgentRunEffect = (request) => Effect.gen(function* () {
124
124
  cause: response.status
125
125
  }));
126
126
  }).pipe(Effect.provide(request.httpClientLayer ?? FetchHttpClient.layer));
127
- const responseToEventStream = (response) => response.stream.pipe(Stream.mapError(toHttpClientTransportError("Could not read agent response body")), Stream.decodeText, Stream.splitLines, Stream.map((line) => line.trim()), Stream.filter((line) => line.length > 0), Stream.mapEffect(parseAgentEventLine), Stream.takeUntil((event) => event._tag === "AgentEnd" || event._tag === "AgentError" || event._tag === "AgentAwaitingInput"));
127
+ const isTerminalAgentEvent = (event) => event._tag === "AgentEnd" || event._tag === "AgentError" || event._tag === "AgentAwaitingInput";
128
+ const responseToLineStream = (response) => response.stream.pipe(Stream.mapError(toHttpClientTransportError("Could not read agent response body")), Stream.decodeText, Stream.splitLines, Stream.map((line) => line.trim()), Stream.filter((line) => line.length > 0));
129
+ const closeScope = (scope) => Scope.close(scope, Exit.succeed(void 0));
130
+ const responseToEventStream = (response) => Stream.callback((queue) => Effect.gen(function* () {
131
+ const callbackScope = yield* Scope.Scope;
132
+ const responseScope = yield* Scope.make();
133
+ const responseScopeClosed = yield* Ref.make(false);
134
+ const terminalReached = yield* Ref.make(false);
135
+ const pull = yield* Channel.toPullScoped(Stream.toChannel(responseToLineStream(response)), responseScope);
136
+ const closeResponseScope = Effect.gen(function* () {
137
+ if (!(yield* Ref.get(responseScopeClosed))) {
138
+ yield* Ref.set(responseScopeClosed, true);
139
+ yield* closeScope(responseScope);
140
+ }
141
+ });
142
+ const endQueue = Queue.end(queue).pipe(Effect.asVoid);
143
+ const failQueue = (cause) => Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid);
144
+ const drainResponse = () => Pull.matchEffect(pull, {
145
+ onSuccess: () => drainResponse(),
146
+ onFailure: (cause) => Effect.failCause(cause),
147
+ onDone: () => Effect.void
148
+ });
149
+ const startTerminalDrain = Effect.gen(function* () {
150
+ yield* Ref.set(terminalReached, true);
151
+ yield* endQueue;
152
+ yield* drainResponse().pipe(Effect.catch(() => Effect.void), Effect.ensuring(closeResponseScope), Effect.forkDetach({ startImmediately: true }), Effect.asVoid);
153
+ });
154
+ const emitLines = (lines) => Effect.gen(function* () {
155
+ for (const line of lines) {
156
+ const event = yield* parseAgentEventLine(line);
157
+ yield* Queue.offer(queue, event);
158
+ if (isTerminalAgentEvent(event)) {
159
+ yield* startTerminalDrain;
160
+ return;
161
+ }
162
+ }
163
+ yield* run();
164
+ });
165
+ const run = () => Pull.matchEffect(pull, {
166
+ onSuccess: emitLines,
167
+ onFailure: failQueue,
168
+ onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))
169
+ });
170
+ yield* Scope.addFinalizer(callbackScope, Effect.gen(function* () {
171
+ if (!(yield* Ref.get(terminalReached))) yield* closeResponseScope;
172
+ }));
173
+ yield* run().pipe(Effect.catch((error) => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)));
174
+ }));
128
175
  const abortSignalError = (signal) => new AgentTransportError({
129
176
  message: "Agent request aborted",
130
177
  cause: signal.reason
@@ -1 +1 @@
1
- {"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import { Cause, Effect, Queue, Stream, type Layer } from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentEvent,\n AgentWebSocketServerMessage,\n QuestionResponseInput,\n ToolApprovalResponseInput,\n UserInput\n} from '@yolk-sdk/agent/protocol'\nimport type {\n AgentEvent as AgentEventType,\n AgentMessage,\n AgentReasoningEffort,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedErrorClass<AgentTransportError>()(\n 'AgentTransportError',\n {\n message: Schema.String,\n cause: Schema.Unknown\n }\n) {}\n\nexport type StreamAgentEventsRequest = {\n readonly endpoint?: string\n readonly sessionId: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunEventsRequest = {\n readonly endpoint: string\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type CancelAgentRunRequest = {\n readonly endpoint: string\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n}\n\nexport type SubmitToolApprovalResponseRequest = StreamAgentEventsRequest & {\n readonly response: ToolApprovalResponse\n}\n\nexport type SubmitQuestionResponseRequest = StreamAgentEventsRequest & {\n readonly response: QuestionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst toTransportError = (message: string, cause: unknown) =>\n new AgentTransportError({\n message,\n cause\n })\n\nconst toHttpClientTransportError = (message: string) => (error: HttpClientError.HttpClientError) =>\n toTransportError(`${message}: ${error.message}`, error)\n\nconst decodeAgentEvent = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentEvent)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeWebSocketServerMessage = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst parseAgentEventLine = (line: string) =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(line, 'Invalid NDJSON line')\n\n return yield* decodeAgentEvent(parsed)\n })\n\nconst parseWebSocketServerMessage = (\n raw: string\n): Effect.Effect<AgentWebSocketServerMessageType, AgentTransportError> =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(raw, 'Invalid WebSocket message')\n\n return yield* decodeWebSocketServerMessage(parsed)\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage => message._tag === 'User'\n\nconst lastUserMessage = (\n messages: AgentTranscript\n): Effect.Effect<UserMessage, AgentTransportError> => {\n const reversed = messages.slice().reverse()\n const message = reversed.find(isUserMessage)\n\n if (message === undefined) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport requires a user message',\n cause: messages\n })\n )\n }\n\n return Effect.succeed(message)\n}\n\nconst makeClientInputJson = (\n request: StreamCloudflareAgentEventsRequest,\n expectedRevision: number\n): Effect.Effect<string, AgentTransportError> =>\n Effect.gen(function* () {\n const hitlResponse = request.hitlResponses?.[0]\n\n if (request.hitlResponses !== undefined && request.hitlResponses.length > 1) {\n return yield* Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport supports one HITL response at a time',\n cause: request.hitlResponses\n })\n )\n }\n\n if (hitlResponse === undefined) {\n const message = yield* lastUserMessage(request.messages)\n\n return yield* encodeJsonString(\n UserInput.make({\n message,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket user input'\n )\n }\n\n return yield* encodeJsonString(\n hitlResponse._tag === 'ToolApprovalResponse'\n ? ToolApprovalResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n : QuestionResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket HITL response'\n )\n })\n\nconst responseErrorMessage = (response: HttpClientResponse.HttpClientResponse) =>\n response.text.pipe(\n Effect.mapError(toHttpClientTransportError('Could not read agent error body')),\n Effect.map(text => (text.length > 0 ? text : `Request failed with ${response.status}`))\n )\n\nconst makeHttpRequest = (request: StreamAgentEventsRequest) =>\n encodeJsonString(\n {\n sessionId: request.sessionId,\n messages: request.messages,\n hitlResponses: request.hitlResponses,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n },\n 'Could not serialize agent request'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint ?? defaultEndpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst requestAgentResponse = (request: StreamAgentEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() => request.onResponse?.({ status: response.status, headers: response.headers }))\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(request.endpoint).pipe(\n HttpClientRequest.setHeaders({ accept: 'application/x-ndjson' })\n )\n )\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() => request.onResponse?.({ status: response.status, headers: response.headers }))\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst cancelAgentRunEffect = (request: CancelAgentRunRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(HttpClientRequest.delete(request.endpoint))\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run cancel failed')))\n\n if (response.status >= 200 && response.status < 300) {\n return\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run cancel failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n }).pipe(Effect.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0),\n Stream.mapEffect(parseAgentEventLine),\n Stream.takeUntil(\n event =>\n event._tag === 'AgentEnd' ||\n event._tag === 'AgentError' ||\n event._tag === 'AgentAwaitingInput'\n )\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (\n request: SubmitToolApprovalResponseRequest\n) => streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nconst isAgentEvent = (message: AgentWebSocketServerMessageType): message is AgentEventType =>\n message._tag !== 'SessionSnapshot'\n\nexport const streamCloudflareAgentEventStream = (request: StreamCloudflareAgentEventsRequest) =>\n applyAbortSignal(\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const socket = new WebSocket(request.webSocketUrl)\n let sentInput = false\n let settled = false\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n const failQueue = (error: AgentTransportError) =>\n Queue.failCauseUnsafe(queue, Cause.fail(error))\n const endQueue = () => Queue.endUnsafe(queue)\n const handleMessage = (event: MessageEvent) => {\n if (typeof event.data !== 'string') {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (message._tag === 'SessionSnapshot') {\n return sentInput\n ? Effect.void\n : makeClientInputJson(request, message.revision).pipe(\n Effect.flatMap(body => Effect.sync(() => socket.send(body))),\n Effect.tap(() =>\n Effect.sync(() => {\n sentInput = true\n })\n )\n )\n }\n\n if (!isAgentEvent(message)) {\n return Effect.void\n }\n\n return Effect.sync(() => {\n Queue.offerUnsafe(queue, message)\n if (\n message._tag === 'AgentEnd' ||\n message._tag === 'AgentError' ||\n message._tag === 'AgentAwaitingInput'\n ) {\n settled = true\n endQueue()\n socket.close(1000, 'done')\n }\n })\n }),\n Effect.catch(error => Effect.sync(() => failQueue(error)))\n )\n )\n }\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\n const handleClose = () => {\n if (!settled) {\n failQueue(toTransportError('Agent WebSocket closed', request.webSocketUrl))\n }\n }\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n socket.addEventListener('message', handleMessage)\n socket.addEventListener('error', handleError)\n socket.addEventListener('close', handleClose)\n }),\n () =>\n Effect.sync(() => {\n socket.removeEventListener('message', handleMessage)\n socket.removeEventListener('error', handleError)\n socket.removeEventListener('close', handleClose)\n }).pipe(Effect.andThen(closeSocket))\n )\n })\n ),\n request.signal\n )\n\nexport async function* streamCloudflareAgentEvents(\n request: StreamCloudflareAgentEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamCloudflareAgentEventStream(request))) {\n yield event\n }\n}\n\nexport async function* streamAgentEvents(\n request: StreamAgentEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamAgentEventStream(request))) {\n yield event\n }\n}\n\nexport async function* streamAgentRunEvents(\n request: StreamAgentRunEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamAgentRunEventStream(request))) {\n yield event\n }\n}\n\nexport async function* submitToolApprovalResponse(\n request: SubmitToolApprovalResponseRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamToolApprovalResponseEventStream(request))) {\n yield event\n }\n}\n\nexport async function* submitQuestionResponse(\n request: SubmitQuestionResponseRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamQuestionResponseEventStream(request))) {\n yield event\n }\n}\n\nexport const cancelAgentRun = (request: CancelAgentRunRequest) =>\n Effect.runPromise(cancelAgentRunEffect(request))\n\nexport const collectAgentEventsEffect = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n\nexport const collectAgentEvents = async (request: StreamAgentEventsRequest) =>\n Array.from(await Effect.runPromise(collectAgentEventsEffect(request)))\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import { Cause, Channel, Effect, Exit, Pull, Queue, Ref, Scope, Stream, type Layer } from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentEvent,\n AgentWebSocketServerMessage,\n QuestionResponseInput,\n ToolApprovalResponseInput,\n UserInput\n} from '@yolk-sdk/agent/protocol'\nimport type {\n AgentEvent as AgentEventType,\n AgentMessage,\n AgentReasoningEffort,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedErrorClass<AgentTransportError>()(\n 'AgentTransportError',\n {\n message: Schema.String,\n cause: Schema.Unknown\n }\n) {}\n\nexport type StreamAgentEventsRequest = {\n readonly endpoint?: string\n readonly sessionId: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunEventsRequest = {\n readonly endpoint: string\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type CancelAgentRunRequest = {\n readonly endpoint: string\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n}\n\nexport type SubmitToolApprovalResponseRequest = StreamAgentEventsRequest & {\n readonly response: ToolApprovalResponse\n}\n\nexport type SubmitQuestionResponseRequest = StreamAgentEventsRequest & {\n readonly response: QuestionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst toTransportError = (message: string, cause: unknown) =>\n new AgentTransportError({\n message,\n cause\n })\n\nconst toHttpClientTransportError = (message: string) => (error: HttpClientError.HttpClientError) =>\n toTransportError(`${message}: ${error.message}`, error)\n\nconst decodeAgentEvent = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentEvent)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeWebSocketServerMessage = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst parseAgentEventLine = (line: string) =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(line, 'Invalid NDJSON line')\n\n return yield* decodeAgentEvent(parsed)\n })\n\nconst parseWebSocketServerMessage = (\n raw: string\n): Effect.Effect<AgentWebSocketServerMessageType, AgentTransportError> =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(raw, 'Invalid WebSocket message')\n\n return yield* decodeWebSocketServerMessage(parsed)\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage => message._tag === 'User'\n\nconst lastUserMessage = (\n messages: AgentTranscript\n): Effect.Effect<UserMessage, AgentTransportError> => {\n const reversed = messages.slice().reverse()\n const message = reversed.find(isUserMessage)\n\n if (message === undefined) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport requires a user message',\n cause: messages\n })\n )\n }\n\n return Effect.succeed(message)\n}\n\nconst makeClientInputJson = (\n request: StreamCloudflareAgentEventsRequest,\n expectedRevision: number\n): Effect.Effect<string, AgentTransportError> =>\n Effect.gen(function* () {\n const hitlResponse = request.hitlResponses?.[0]\n\n if (request.hitlResponses !== undefined && request.hitlResponses.length > 1) {\n return yield* Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport supports one HITL response at a time',\n cause: request.hitlResponses\n })\n )\n }\n\n if (hitlResponse === undefined) {\n const message = yield* lastUserMessage(request.messages)\n\n return yield* encodeJsonString(\n UserInput.make({\n message,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket user input'\n )\n }\n\n return yield* encodeJsonString(\n hitlResponse._tag === 'ToolApprovalResponse'\n ? ToolApprovalResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n : QuestionResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket HITL response'\n )\n })\n\nconst responseErrorMessage = (response: HttpClientResponse.HttpClientResponse) =>\n response.text.pipe(\n Effect.mapError(toHttpClientTransportError('Could not read agent error body')),\n Effect.map(text => (text.length > 0 ? text : `Request failed with ${response.status}`))\n )\n\nconst makeHttpRequest = (request: StreamAgentEventsRequest) =>\n encodeJsonString(\n {\n sessionId: request.sessionId,\n messages: request.messages,\n hitlResponses: request.hitlResponses,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n },\n 'Could not serialize agent request'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint ?? defaultEndpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst requestAgentResponse = (request: StreamAgentEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() => request.onResponse?.({ status: response.status, headers: response.headers }))\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(request.endpoint).pipe(\n HttpClientRequest.setHeaders({ accept: 'application/x-ndjson' })\n )\n )\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() => request.onResponse?.({ status: response.status, headers: response.headers }))\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst cancelAgentRunEffect = (request: CancelAgentRunRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(HttpClientRequest.delete(request.endpoint))\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run cancel failed')))\n\n if (response.status >= 200 && response.status < 300) {\n return\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run cancel failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n }).pipe(Effect.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nconst isTerminalAgentEvent = (event: AgentEventType) =>\n event._tag === 'AgentEnd' ||\n event._tag === 'AgentError' ||\n event._tag === 'AgentAwaitingInput'\n\nconst responseToLineStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0)\n )\n\nconst closeScope = (scope: Scope.Scope) => Scope.close(scope, Exit.succeed(undefined))\n\n// Protocol-terminal events finish the consumer stream, but HTTP bodies must still\n// drain to EOF so server runtimes do not observe client-side response aborts.\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const callbackScope = yield* Scope.Scope\n // Own the response stream in a scope that can outlive the consumer after a\n // terminal event; before terminal, consumer cancellation closes it.\n const responseScope = yield* Scope.make()\n const responseScopeClosed = yield* Ref.make(false)\n const terminalReached = yield* Ref.make(false)\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\n const closeResponseScope = Effect.gen(function* () {\n const closed = yield* Ref.get(responseScopeClosed)\n\n if (!closed) {\n yield* Ref.set(responseScopeClosed, true)\n yield* closeScope(responseScope)\n }\n })\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n const drainResponse = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: () => drainResponse(),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.void\n })\n const startTerminalDrain = Effect.gen(function* () {\n yield* Ref.set(terminalReached, true)\n yield* endQueue\n yield* drainResponse().pipe(\n Effect.catch(() => Effect.void),\n Effect.ensuring(closeResponseScope),\n Effect.forkDetach({ startImmediately: true }),\n Effect.asVoid\n )\n })\n const emitLines = (lines: ReadonlyArray<string>): Effect.Effect<void, AgentTransportError> =>\n Effect.gen(function* () {\n for (const line of lines) {\n const event = yield* parseAgentEventLine(line)\n\n yield* Queue.offer(queue, event)\n\n if (isTerminalAgentEvent(event)) {\n yield* startTerminalDrain\n return\n }\n }\n\n yield* run()\n })\n const run = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: emitLines,\n onFailure: failQueue,\n onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))\n })\n\n yield* Scope.addFinalizer(\n callbackScope,\n Effect.gen(function* () {\n const terminal = yield* Ref.get(terminalReached)\n\n if (!terminal) {\n yield* closeResponseScope\n }\n })\n )\n\n yield* run().pipe(\n Effect.catch(error => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n )\n })\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (\n request: SubmitToolApprovalResponseRequest\n) => streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nconst isAgentEvent = (message: AgentWebSocketServerMessageType): message is AgentEventType =>\n message._tag !== 'SessionSnapshot'\n\nexport const streamCloudflareAgentEventStream = (request: StreamCloudflareAgentEventsRequest) =>\n applyAbortSignal(\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const socket = new WebSocket(request.webSocketUrl)\n let sentInput = false\n let settled = false\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n const failQueue = (error: AgentTransportError) =>\n Queue.failCauseUnsafe(queue, Cause.fail(error))\n const endQueue = () => Queue.endUnsafe(queue)\n const handleMessage = (event: MessageEvent) => {\n if (typeof event.data !== 'string') {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (message._tag === 'SessionSnapshot') {\n return sentInput\n ? Effect.void\n : makeClientInputJson(request, message.revision).pipe(\n Effect.flatMap(body => Effect.sync(() => socket.send(body))),\n Effect.tap(() =>\n Effect.sync(() => {\n sentInput = true\n })\n )\n )\n }\n\n if (!isAgentEvent(message)) {\n return Effect.void\n }\n\n return Effect.sync(() => {\n Queue.offerUnsafe(queue, message)\n if (\n message._tag === 'AgentEnd' ||\n message._tag === 'AgentError' ||\n message._tag === 'AgentAwaitingInput'\n ) {\n settled = true\n endQueue()\n socket.close(1000, 'done')\n }\n })\n }),\n Effect.catch(error => Effect.sync(() => failQueue(error)))\n )\n )\n }\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\n const handleClose = () => {\n if (!settled) {\n failQueue(toTransportError('Agent WebSocket closed', request.webSocketUrl))\n }\n }\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n socket.addEventListener('message', handleMessage)\n socket.addEventListener('error', handleError)\n socket.addEventListener('close', handleClose)\n }),\n () =>\n Effect.sync(() => {\n socket.removeEventListener('message', handleMessage)\n socket.removeEventListener('error', handleError)\n socket.removeEventListener('close', handleClose)\n }).pipe(Effect.andThen(closeSocket))\n )\n })\n ),\n request.signal\n )\n\nexport async function* streamCloudflareAgentEvents(\n request: StreamCloudflareAgentEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamCloudflareAgentEventStream(request))) {\n yield event\n }\n}\n\nexport async function* streamAgentEvents(\n request: StreamAgentEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamAgentEventStream(request))) {\n yield event\n }\n}\n\nexport async function* streamAgentRunEvents(\n request: StreamAgentRunEventsRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamAgentRunEventStream(request))) {\n yield event\n }\n}\n\nexport async function* submitToolApprovalResponse(\n request: SubmitToolApprovalResponseRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamToolApprovalResponseEventStream(request))) {\n yield event\n }\n}\n\nexport async function* submitQuestionResponse(\n request: SubmitQuestionResponseRequest\n): AsyncGenerator<AgentEventType, void, void> {\n for await (const event of Stream.toAsyncIterable(streamQuestionResponseEventStream(request))) {\n yield event\n }\n}\n\nexport const cancelAgentRun = (request: CancelAgentRunRequest) =>\n Effect.runPromise(cancelAgentRunEffect(request))\n\nexport const collectAgentEventsEffect = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n\nexport const collectAgentEvents = async (request: StreamAgentEventsRequest) =>\n Array.from(await Effect.runPromise(collectAgentEventsEffect(request)))\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;KAsEY,cAAA;AAAA,KAEA,SAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,OAAA;EAAA,SACrB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,YAAA,GAAe,sBAAA;AAAA;AAAA,KAGd,eAAA,GAAkB,SAAS;EAAA,SAC5B,IAAI;AAAA;AAAA,KAGH,eAAA;EAAA,SACD,KAAA,EAAO,aAAA,CAAc,QAAA;EAAA,SACrB,KAAA,GAAQ,aAAA,CAAc,OAAA;EAAA,SACtB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,aAAA,CAAc,YAAA;EAAA,SAChC,IAAA;EAAA,SACA,KAAA,GAAQ,UAAA;AAAA;AAAA,cAqhCN,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,kBAAA,GAAqB,WAAA,GAAc,UAAA;AAAA,cAuBnE,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,UAAA,GAAa,YAAA;AAAA,cA4C7C,GAAA,GACX,MAAA,EAAQ,SAAA,KACP,MAAA,CAAO,MAAA,CACR,UAAA,EACA,cAAA,EACA,kBAAA,GAAqB,WAAA,GAAc,UAAA,GAAa,YAAA"}
1
+ {"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;KAoEY,cAAA;AAAA,KAEA,SAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,OAAA;EAAA,SACrB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,YAAA,GAAe,sBAAA;AAAA;AAAA,KAGd,eAAA,GAAkB,SAAS;EAAA,SAC5B,IAAI;AAAA;AAAA,KAGH,eAAA;EAAA,SACD,KAAA,EAAO,aAAA,CAAc,QAAA;EAAA,SACrB,KAAA,GAAQ,aAAA,CAAc,OAAA;EAAA,SACtB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,aAAA,CAAc,YAAA;EAAA,SAChC,IAAA;EAAA,SACA,KAAA,GAAQ,UAAA;AAAA;AAAA,cAqhCN,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,kBAAA,GAAqB,WAAA,GAAc,UAAA;AAAA,cAuBnE,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,UAAA,GAAa,YAAA;AAAA,cA6C7C,GAAA,GACX,MAAA,EAAQ,SAAA,KACP,MAAA,CAAO,MAAA,CACR,UAAA,EACA,cAAA,EACA,kBAAA,GAAqB,WAAA,GAAc,UAAA,GAAa,YAAA"}