@yolk-sdk/agent 0.0.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/client/index.d.mts +3 -0
  4. package/dist/client/index.mjs +3 -0
  5. package/dist/client/state.d.mts +99 -0
  6. package/dist/client/state.d.mts.map +1 -0
  7. package/dist/client/state.mjs +245 -0
  8. package/dist/client/state.mjs.map +1 -0
  9. package/dist/client/transport.d.mts +67 -0
  10. package/dist/client/transport.d.mts.map +1 -0
  11. package/dist/client/transport.mjs +219 -0
  12. package/dist/client/transport.mjs.map +1 -0
  13. package/dist/index.d.mts +1 -0
  14. package/dist/index.mjs +1 -0
  15. package/dist/loop/accumulator.d.mts +11 -0
  16. package/dist/loop/accumulator.d.mts.map +1 -0
  17. package/dist/loop/accumulator.mjs +40 -0
  18. package/dist/loop/accumulator.mjs.map +1 -0
  19. package/dist/loop/error.d.mts +36 -0
  20. package/dist/loop/error.d.mts.map +1 -0
  21. package/dist/loop/error.mjs +84 -0
  22. package/dist/loop/error.mjs.map +1 -0
  23. package/dist/loop/index.d.mts +9 -0
  24. package/dist/loop/index.mjs +9 -0
  25. package/dist/loop/llm-event.d.mts +44 -0
  26. package/dist/loop/llm-event.d.mts.map +1 -0
  27. package/dist/loop/llm-event.mjs +34 -0
  28. package/dist/loop/llm-event.mjs.map +1 -0
  29. package/dist/loop/run.d.mts +37 -0
  30. package/dist/loop/run.d.mts.map +1 -0
  31. package/dist/loop/run.mjs +624 -0
  32. package/dist/loop/run.mjs.map +1 -0
  33. package/dist/loop/services/context-transformer.d.mts +18 -0
  34. package/dist/loop/services/context-transformer.d.mts.map +1 -0
  35. package/dist/loop/services/context-transformer.mjs +12 -0
  36. package/dist/loop/services/context-transformer.mjs.map +1 -0
  37. package/dist/loop/services/llm-provider.d.mts +20 -0
  38. package/dist/loop/services/llm-provider.d.mts.map +1 -0
  39. package/dist/loop/services/llm-provider.mjs +7 -0
  40. package/dist/loop/services/llm-provider.mjs.map +1 -0
  41. package/dist/loop/services/loop-config.d.mts +17 -0
  42. package/dist/loop/services/loop-config.d.mts.map +1 -0
  43. package/dist/loop/services/loop-config.mjs +15 -0
  44. package/dist/loop/services/loop-config.mjs.map +1 -0
  45. package/dist/loop/services/tool-executor.d.mts +12 -0
  46. package/dist/loop/services/tool-executor.d.mts.map +1 -0
  47. package/dist/loop/services/tool-executor.mjs +7 -0
  48. package/dist/loop/services/tool-executor.mjs.map +1 -0
  49. package/dist/loop/testing/faux-provider.d.mts +31 -0
  50. package/dist/loop/testing/faux-provider.d.mts.map +1 -0
  51. package/dist/loop/testing/faux-provider.mjs +47 -0
  52. package/dist/loop/testing/faux-provider.mjs.map +1 -0
  53. package/dist/loop/testing/index.d.mts +3 -0
  54. package/dist/loop/testing/index.mjs +3 -0
  55. package/dist/loop/testing/test-tool-executor.d.mts +10 -0
  56. package/dist/loop/testing/test-tool-executor.d.mts.map +1 -0
  57. package/dist/loop/testing/test-tool-executor.mjs +21 -0
  58. package/dist/loop/testing/test-tool-executor.mjs.map +1 -0
  59. package/dist/protocol/capability.d.mts +20 -0
  60. package/dist/protocol/capability.d.mts.map +1 -0
  61. package/dist/protocol/capability.mjs +34 -0
  62. package/dist/protocol/capability.mjs.map +1 -0
  63. package/dist/protocol/content.d.mts +31 -0
  64. package/dist/protocol/content.d.mts.map +1 -0
  65. package/dist/protocol/content.mjs +52 -0
  66. package/dist/protocol/content.mjs.map +1 -0
  67. package/dist/protocol/event.d.mts +228 -0
  68. package/dist/protocol/event.d.mts.map +1 -0
  69. package/dist/protocol/event.mjs +217 -0
  70. package/dist/protocol/event.mjs.map +1 -0
  71. package/dist/protocol/index.d.mts +14 -0
  72. package/dist/protocol/index.d.mts.map +1 -0
  73. package/dist/protocol/index.mjs +9 -0
  74. package/dist/protocol/message.d.mts +53 -0
  75. package/dist/protocol/message.d.mts.map +1 -0
  76. package/dist/protocol/message.mjs +49 -0
  77. package/dist/protocol/message.mjs.map +1 -0
  78. package/dist/protocol/reasoning.d.mts +8 -0
  79. package/dist/protocol/reasoning.d.mts.map +1 -0
  80. package/dist/protocol/reasoning.mjs +13 -0
  81. package/dist/protocol/reasoning.mjs.map +1 -0
  82. package/dist/protocol/session.d.mts +39 -0
  83. package/dist/protocol/session.d.mts.map +1 -0
  84. package/dist/protocol/session.mjs +38 -0
  85. package/dist/protocol/session.mjs.map +1 -0
  86. package/dist/protocol/tool.d.mts +101 -0
  87. package/dist/protocol/tool.d.mts.map +1 -0
  88. package/dist/protocol/tool.mjs +102 -0
  89. package/dist/protocol/tool.mjs.map +1 -0
  90. package/dist/protocol/usage.d.mts +26 -0
  91. package/dist/protocol/usage.d.mts.map +1 -0
  92. package/dist/protocol/usage.mjs +40 -0
  93. package/dist/protocol/usage.mjs.map +1 -0
  94. package/dist/runtime/error.d.mts +29 -0
  95. package/dist/runtime/error.d.mts.map +1 -0
  96. package/dist/runtime/error.mjs +46 -0
  97. package/dist/runtime/error.mjs.map +1 -0
  98. package/dist/runtime/index.d.mts +9 -0
  99. package/dist/runtime/index.d.mts.map +1 -0
  100. package/dist/runtime/index.mjs +4 -0
  101. package/dist/runtime/run-runtime.d.mts +47 -0
  102. package/dist/runtime/run-runtime.d.mts.map +1 -0
  103. package/dist/runtime/run-runtime.mjs +112 -0
  104. package/dist/runtime/run-runtime.mjs.map +1 -0
  105. package/dist/runtime/session-event-store.d.mts +75 -0
  106. package/dist/runtime/session-event-store.d.mts.map +1 -0
  107. package/dist/runtime/session-event-store.mjs +124 -0
  108. package/dist/runtime/session-event-store.mjs.map +1 -0
  109. package/dist/tools/index.d.mts +4 -0
  110. package/dist/tools/index.mjs +4 -0
  111. package/dist/tools/question.d.mts +21 -0
  112. package/dist/tools/question.d.mts.map +1 -0
  113. package/dist/tools/question.mjs +41 -0
  114. package/dist/tools/question.mjs.map +1 -0
  115. package/dist/tools/registry.d.mts +61 -0
  116. package/dist/tools/registry.d.mts.map +1 -0
  117. package/dist/tools/registry.mjs +113 -0
  118. package/dist/tools/registry.mjs.map +1 -0
  119. package/dist/tools/task.d.mts +34 -0
  120. package/dist/tools/task.d.mts.map +1 -0
  121. package/dist/tools/task.mjs +81 -0
  122. package/dist/tools/task.mjs.map +1 -0
  123. package/package.json +86 -0
  124. package/src/client/README.md +23 -0
  125. package/src/client/index.ts +43 -0
  126. package/src/client/state.ts +380 -0
  127. package/src/client/transport.ts +517 -0
  128. package/src/index.ts +2 -0
  129. package/src/loop/README.md +23 -0
  130. package/src/loop/accumulator.ts +71 -0
  131. package/src/loop/error.ts +105 -0
  132. package/src/loop/index.ts +35 -0
  133. package/src/loop/llm-event.ts +52 -0
  134. package/src/loop/run.ts +1237 -0
  135. package/src/loop/services/context-transformer.ts +24 -0
  136. package/src/loop/services/llm-provider.ts +20 -0
  137. package/src/loop/services/loop-config.ts +20 -0
  138. package/src/loop/services/tool-executor.ts +11 -0
  139. package/src/loop/testing/faux-provider.ts +94 -0
  140. package/src/loop/testing/index.ts +3 -0
  141. package/src/loop/testing/test-tool-executor.ts +28 -0
  142. package/src/protocol/README.md +24 -0
  143. package/src/protocol/capability.ts +29 -0
  144. package/src/protocol/content.ts +76 -0
  145. package/src/protocol/event.ts +286 -0
  146. package/src/protocol/index.ts +109 -0
  147. package/src/protocol/message.ts +86 -0
  148. package/src/protocol/reasoning.ts +4 -0
  149. package/src/protocol/session.ts +47 -0
  150. package/src/protocol/tool.ts +154 -0
  151. package/src/protocol/usage.ts +48 -0
  152. package/src/runtime/README.md +44 -0
  153. package/src/runtime/error.ts +70 -0
  154. package/src/runtime/index.ts +43 -0
  155. package/src/runtime/run-runtime.ts +307 -0
  156. package/src/runtime/session-event-store.ts +254 -0
  157. package/src/tools/README.md +22 -0
  158. package/src/tools/index.ts +29 -0
  159. package/src/tools/question.ts +58 -0
  160. package/src/tools/registry.ts +228 -0
  161. package/src/tools/task.ts +132 -0
@@ -0,0 +1,219 @@
1
+ import { Cause, Effect, Queue, Stream } from "effect";
2
+ import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
3
+ import * as Schema from "effect/Schema";
4
+ import { AgentEvent, AgentWebSocketServerMessage, QuestionResponseInput, ToolApprovalResponseInput, UserInput } from "@yolk-sdk/agent/protocol";
5
+ //#region src/client/transport.ts
6
+ var AgentTransportError = class extends Schema.TaggedErrorClass()("AgentTransportError", {
7
+ message: Schema.String,
8
+ cause: Schema.Unknown
9
+ }) {};
10
+ const defaultEndpoint = "/api/agent";
11
+ const unknownToMessage = (error) => error instanceof Error ? error.message : String(error);
12
+ const toTransportError = (message, cause) => new AgentTransportError({
13
+ message,
14
+ cause
15
+ });
16
+ const toHttpClientTransportError = (message) => (error) => toTransportError(`${message}: ${error.message}`, error);
17
+ const decodeAgentEvent = (value) => Schema.decodeUnknownEffect(AgentEvent)(value).pipe(Effect.mapError((error) => new AgentTransportError({
18
+ message: `Invalid agent event: ${unknownToMessage(error)}`,
19
+ cause: error
20
+ })));
21
+ const decodeWebSocketServerMessage = (value) => Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(value).pipe(Effect.mapError((error) => new AgentTransportError({
22
+ message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,
23
+ cause: error
24
+ })));
25
+ const encodeJsonString = (value, message) => Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(Effect.mapError((error) => new AgentTransportError({
26
+ message: `${message}: ${unknownToMessage(error)}`,
27
+ cause: error
28
+ })));
29
+ const decodeJsonString = (raw, message) => Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(Effect.mapError((error) => new AgentTransportError({
30
+ message: `${message}: ${unknownToMessage(error)}`,
31
+ cause: error
32
+ })));
33
+ const parseAgentEventLine = (line) => Effect.gen(function* () {
34
+ return yield* decodeAgentEvent(yield* decodeJsonString(line, "Invalid NDJSON line"));
35
+ });
36
+ const parseWebSocketServerMessage = (raw) => Effect.gen(function* () {
37
+ return yield* decodeWebSocketServerMessage(yield* decodeJsonString(raw, "Invalid WebSocket message"));
38
+ });
39
+ const isUserMessage = (message) => message._tag === "User";
40
+ const lastUserMessage = (messages) => {
41
+ const message = messages.slice().reverse().find(isUserMessage);
42
+ if (message === void 0) return Effect.fail(new AgentTransportError({
43
+ message: "Cloudflare WebSocket transport requires a user message",
44
+ cause: messages
45
+ }));
46
+ return Effect.succeed(message);
47
+ };
48
+ const makeClientInputJson = (request, expectedRevision) => Effect.gen(function* () {
49
+ const hitlResponse = request.hitlResponses?.[0];
50
+ if (request.hitlResponses !== void 0 && request.hitlResponses.length > 1) return yield* Effect.fail(new AgentTransportError({
51
+ message: "Cloudflare WebSocket transport supports one HITL response at a time",
52
+ cause: request.hitlResponses
53
+ }));
54
+ if (hitlResponse === void 0) {
55
+ const message = yield* lastUserMessage(request.messages);
56
+ return yield* encodeJsonString(UserInput.make({
57
+ message,
58
+ expectedRevision,
59
+ model: request.model,
60
+ reasoningEffort: request.reasoningEffort
61
+ }), "Could not serialize WebSocket user input");
62
+ }
63
+ return yield* encodeJsonString(hitlResponse._tag === "ToolApprovalResponse" ? ToolApprovalResponseInput.make({
64
+ response: hitlResponse,
65
+ expectedRevision,
66
+ model: request.model,
67
+ reasoningEffort: request.reasoningEffort
68
+ }) : QuestionResponseInput.make({
69
+ response: hitlResponse,
70
+ expectedRevision,
71
+ model: request.model,
72
+ reasoningEffort: request.reasoningEffort
73
+ }), "Could not serialize WebSocket HITL response");
74
+ });
75
+ const responseErrorMessage = (response) => response.text.pipe(Effect.mapError(toHttpClientTransportError("Could not read agent error body")), Effect.map((text) => text.length > 0 ? text : `Request failed with ${response.status}`));
76
+ const makeHttpRequest = (request) => encodeJsonString({
77
+ sessionId: request.sessionId,
78
+ messages: request.messages,
79
+ hitlResponses: request.hitlResponses,
80
+ model: request.model,
81
+ reasoningEffort: request.reasoningEffort
82
+ }, "Could not serialize agent request").pipe(Effect.map((body) => HttpClientRequest.post(request.endpoint ?? defaultEndpoint).pipe(HttpClientRequest.setHeaders({
83
+ accept: "application/x-ndjson",
84
+ "content-type": "application/json"
85
+ }), HttpClientRequest.bodyText(body, "application/json"))));
86
+ const requestAgentResponse = (request) => Effect.gen(function* () {
87
+ const client = yield* HttpClient.HttpClient;
88
+ const httpRequest = yield* makeHttpRequest(request);
89
+ const response = yield* client.execute(httpRequest).pipe(Effect.mapError(toHttpClientTransportError("Agent request failed")));
90
+ if (response.status >= 200 && response.status < 300) {
91
+ yield* Effect.sync(() => request.onResponse?.({
92
+ status: response.status,
93
+ headers: response.headers
94
+ }));
95
+ return response;
96
+ }
97
+ const message = yield* responseErrorMessage(response);
98
+ return yield* Effect.fail(new AgentTransportError({
99
+ message: `Agent request failed (${response.status}): ${message}`,
100
+ cause: response.status
101
+ }));
102
+ });
103
+ const requestAgentRunResponse = (request) => Effect.gen(function* () {
104
+ const response = yield* (yield* HttpClient.HttpClient).execute(HttpClientRequest.get(request.endpoint).pipe(HttpClientRequest.setHeaders({ accept: "application/x-ndjson" }))).pipe(Effect.mapError(toHttpClientTransportError("Agent run request failed")));
105
+ if (response.status >= 200 && response.status < 300) {
106
+ yield* Effect.sync(() => request.onResponse?.({
107
+ status: response.status,
108
+ headers: response.headers
109
+ }));
110
+ return response;
111
+ }
112
+ const message = yield* responseErrorMessage(response);
113
+ return yield* Effect.fail(new AgentTransportError({
114
+ message: `Agent run request failed (${response.status}): ${message}`,
115
+ cause: response.status
116
+ }));
117
+ });
118
+ const cancelAgentRunEffect = (request) => Effect.gen(function* () {
119
+ const response = yield* (yield* HttpClient.HttpClient).execute(HttpClientRequest.delete(request.endpoint)).pipe(Effect.mapError(toHttpClientTransportError("Agent run cancel failed")));
120
+ if (response.status >= 200 && response.status < 300) return;
121
+ const message = yield* responseErrorMessage(response);
122
+ return yield* Effect.fail(new AgentTransportError({
123
+ message: `Agent run cancel failed (${response.status}): ${message}`,
124
+ cause: response.status
125
+ }));
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"));
128
+ const abortSignalError = (signal) => new AgentTransportError({
129
+ message: "Agent request aborted",
130
+ cause: signal.reason
131
+ });
132
+ const abortSignalEffect = (signal) => Effect.callback((resume) => {
133
+ if (signal.aborted) {
134
+ resume(Effect.fail(abortSignalError(signal)));
135
+ return Effect.void;
136
+ }
137
+ const listener = () => resume(Effect.fail(abortSignalError(signal)));
138
+ signal.addEventListener("abort", listener, { once: true });
139
+ return Effect.sync(() => signal.removeEventListener("abort", listener));
140
+ });
141
+ const applyAbortSignal = (stream, signal) => signal === void 0 ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal)));
142
+ const streamAgentEventStream = (request) => applyAbortSignal(Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)), request.signal).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer));
143
+ const streamAgentRunEventStream = (request) => applyAbortSignal(Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)), request.signal).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer));
144
+ const streamToolApprovalResponseEventStream = (request) => streamAgentEventStream({
145
+ ...request,
146
+ hitlResponses: [request.response]
147
+ });
148
+ const streamQuestionResponseEventStream = (request) => streamAgentEventStream({
149
+ ...request,
150
+ hitlResponses: [request.response]
151
+ });
152
+ const isAgentEvent = (message) => message._tag !== "SessionSnapshot";
153
+ const streamCloudflareAgentEventStream = (request) => applyAbortSignal(Stream.callback((queue) => Effect.gen(function* () {
154
+ const socket = new WebSocket(request.webSocketUrl);
155
+ let sentInput = false;
156
+ let settled = false;
157
+ const closeSocket = Effect.sync(() => {
158
+ if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) socket.close(1e3, "done");
159
+ });
160
+ const failQueue = (error) => Queue.failCauseUnsafe(queue, Cause.fail(error));
161
+ const endQueue = () => Queue.endUnsafe(queue);
162
+ const handleMessage = (event) => {
163
+ if (typeof event.data !== "string") {
164
+ failQueue(toTransportError("Agent WebSocket returned binary data", event.data));
165
+ return;
166
+ }
167
+ Effect.runFork(parseWebSocketServerMessage(event.data).pipe(Effect.flatMap((message) => {
168
+ if (message._tag === "SessionSnapshot") return sentInput ? Effect.void : makeClientInputJson(request, message.revision).pipe(Effect.flatMap((body) => Effect.sync(() => socket.send(body))), Effect.tap(() => Effect.sync(() => {
169
+ sentInput = true;
170
+ })));
171
+ if (!isAgentEvent(message)) return Effect.void;
172
+ return Effect.sync(() => {
173
+ Queue.offerUnsafe(queue, message);
174
+ if (message._tag === "AgentEnd" || message._tag === "AgentError" || message._tag === "AgentAwaitingInput") {
175
+ settled = true;
176
+ endQueue();
177
+ socket.close(1e3, "done");
178
+ }
179
+ });
180
+ }), Effect.catch((error) => Effect.sync(() => failQueue(error)))));
181
+ };
182
+ const handleError = () => {
183
+ failQueue(toTransportError("Agent WebSocket failed", request.webSocketUrl));
184
+ };
185
+ const handleClose = () => {
186
+ if (!settled) failQueue(toTransportError("Agent WebSocket closed", request.webSocketUrl));
187
+ };
188
+ yield* Effect.acquireRelease(Effect.sync(() => {
189
+ socket.addEventListener("message", handleMessage);
190
+ socket.addEventListener("error", handleError);
191
+ socket.addEventListener("close", handleClose);
192
+ }), () => Effect.sync(() => {
193
+ socket.removeEventListener("message", handleMessage);
194
+ socket.removeEventListener("error", handleError);
195
+ socket.removeEventListener("close", handleClose);
196
+ }).pipe(Effect.andThen(closeSocket)));
197
+ })), request.signal);
198
+ async function* streamCloudflareAgentEvents(request) {
199
+ for await (const event of Stream.toAsyncIterable(streamCloudflareAgentEventStream(request))) yield event;
200
+ }
201
+ async function* streamAgentEvents(request) {
202
+ for await (const event of Stream.toAsyncIterable(streamAgentEventStream(request))) yield event;
203
+ }
204
+ async function* streamAgentRunEvents(request) {
205
+ for await (const event of Stream.toAsyncIterable(streamAgentRunEventStream(request))) yield event;
206
+ }
207
+ async function* submitToolApprovalResponse(request) {
208
+ for await (const event of Stream.toAsyncIterable(streamToolApprovalResponseEventStream(request))) yield event;
209
+ }
210
+ async function* submitQuestionResponse(request) {
211
+ for await (const event of Stream.toAsyncIterable(streamQuestionResponseEventStream(request))) yield event;
212
+ }
213
+ const cancelAgentRun = (request) => Effect.runPromise(cancelAgentRunEffect(request));
214
+ const collectAgentEventsEffect = (request) => streamAgentEventStream(request).pipe(Stream.runCollect);
215
+ const collectAgentEvents = async (request) => Array.from(await Effect.runPromise(collectAgentEventsEffect(request)));
216
+ //#endregion
217
+ export { AgentTransportError, cancelAgentRun, collectAgentEvents, collectAgentEventsEffect, streamAgentEventStream, streamAgentEvents, streamAgentRunEventStream, streamAgentRunEvents, streamCloudflareAgentEventStream, streamCloudflareAgentEvents, streamQuestionResponseEventStream, streamToolApprovalResponseEventStream, submitQuestionResponse, submitToolApprovalResponse };
218
+
219
+ //# sourceMappingURL=transport.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1 @@
1
+ export { };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { LLMEvent } from "./llm-event.mjs";
2
+ import { AssistantAgentMessage } from "@yolk-sdk/agent/protocol";
3
+
4
+ //#region src/loop/accumulator.d.ts
5
+ declare const collectText: (events: ReadonlyArray<LLMEvent>) => string;
6
+ declare const collectReasoning: (events: ReadonlyArray<LLMEvent>) => string;
7
+ declare const collectToolCalls: (events: ReadonlyArray<LLMEvent>) => import("@yolk-sdk/agent/protocol").ToolCall[];
8
+ declare const accumulateAssistantMessage: (events: ReadonlyArray<LLMEvent>) => AssistantAgentMessage;
9
+ //#endregion
10
+ export { accumulateAssistantMessage, collectReasoning, collectText, collectToolCalls };
11
+ //# sourceMappingURL=accumulator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accumulator.d.mts","names":[],"sources":["../../src/loop/accumulator.ts"],"mappings":";;;;cAYa,WAAA,GAAe,MAAA,EAAQ,aAAa,CAAC,QAAA;AAAA,cAGrC,gBAAA,GAAoB,MAAA,EAAQ,aAAa,CAAC,QAAA;AAAA,cAM1C,gBAAA,GAAoB,MAAA,EAAQ,aAAa,CAAC,QAAA,yCAAS,QAAA;AAAA,cA6CnD,0BAAA,GAA8B,MAAA,EAAQ,aAAA,CAAc,QAAA,MAAS,qBAAA"}
@@ -0,0 +1,40 @@
1
+ import { AssistantAgentMessage, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, ProviderToolCallPart, ProviderToolResultPart, appendTextToContent } from "@yolk-sdk/agent/protocol";
2
+ //#region src/loop/accumulator.ts
3
+ const collectText = (events) => events.reduce((text, event) => event._tag === "TextDelta" ? `${text}${event.text}` : text, "");
4
+ const collectReasoning = (events) => events.reduce((text, event) => event._tag === "ReasoningDelta" ? `${text}${event.text}` : text, "");
5
+ const collectToolCalls = (events) => events.flatMap((event) => event._tag === "ToolCall" ? [event.call] : []);
6
+ const appendTextPart = (parts, text) => {
7
+ const last = parts.at(-1);
8
+ return last?._tag === "Text" ? [...parts.slice(0, -1), AssistantTextPart.make({ content: appendTextToContent(last.content, text) })] : [...parts, AssistantTextPart.make({ content: text })];
9
+ };
10
+ const appendReasoningPart = (parts, text) => {
11
+ const last = parts.at(-1);
12
+ return last?._tag === "Reasoning" ? [...parts.slice(0, -1), AssistantReasoningPart.make({ text: `${last.text}${text}` })] : [...parts, AssistantReasoningPart.make({ text })];
13
+ };
14
+ const accumulateAssistantParts = (events) => events.reduce((parts, event) => {
15
+ switch (event._tag) {
16
+ case "TextDelta": return appendTextPart(parts, event.text);
17
+ case "ReasoningDelta": return appendReasoningPart(parts, event.text);
18
+ case "ToolCall": return [...parts, HostToolCallPart.make({ call: event.call })];
19
+ case "ProviderToolResult": return [
20
+ ...parts,
21
+ ProviderToolCallPart.make({ call: event.call }),
22
+ ProviderToolResultPart.make({
23
+ toolCallId: event.call.id,
24
+ result: event.result
25
+ })
26
+ ];
27
+ case "Done":
28
+ case "ToolInputDelta":
29
+ case "ToolInputStart":
30
+ case "Usage": return parts;
31
+ }
32
+ }, []);
33
+ const accumulateAssistantMessage = (events) => {
34
+ const parts = accumulateAssistantParts(events);
35
+ return AssistantAgentMessage.make({ parts });
36
+ };
37
+ //#endregion
38
+ export { accumulateAssistantMessage, collectReasoning, collectText, collectToolCalls };
39
+
40
+ //# sourceMappingURL=accumulator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accumulator.mjs","names":[],"sources":["../../src/loop/accumulator.ts"],"sourcesContent":["import {\n AssistantAgentMessage,\n AssistantReasoningPart,\n AssistantTextPart,\n appendTextToContent,\n HostToolCallPart,\n ProviderToolCallPart,\n ProviderToolResultPart,\n type AssistantPart\n} from '@yolk-sdk/agent/protocol'\nimport type { LLMEvent } from './llm-event.ts'\n\nexport const collectText = (events: ReadonlyArray<LLMEvent>) =>\n events.reduce((text, event) => (event._tag === 'TextDelta' ? `${text}${event.text}` : text), '')\n\nexport const collectReasoning = (events: ReadonlyArray<LLMEvent>) =>\n events.reduce(\n (text, event) => (event._tag === 'ReasoningDelta' ? `${text}${event.text}` : text),\n ''\n )\n\nexport const collectToolCalls = (events: ReadonlyArray<LLMEvent>) =>\n events.flatMap(event => (event._tag === 'ToolCall' ? [event.call] : []))\n\nconst appendTextPart = (parts: ReadonlyArray<AssistantPart>, text: string) => {\n const last = parts.at(-1)\n\n return last?._tag === 'Text'\n ? [\n ...parts.slice(0, -1),\n AssistantTextPart.make({ content: appendTextToContent(last.content, text) })\n ]\n : [...parts, AssistantTextPart.make({ content: text })]\n}\n\nconst appendReasoningPart = (parts: ReadonlyArray<AssistantPart>, text: string) => {\n const last = parts.at(-1)\n\n return last?._tag === 'Reasoning'\n ? [...parts.slice(0, -1), AssistantReasoningPart.make({ text: `${last.text}${text}` })]\n : [...parts, AssistantReasoningPart.make({ text })]\n}\n\nconst accumulateAssistantParts = (events: ReadonlyArray<LLMEvent>) =>\n events.reduce<ReadonlyArray<AssistantPart>>((parts, event) => {\n switch (event._tag) {\n case 'TextDelta':\n return appendTextPart(parts, event.text)\n case 'ReasoningDelta':\n return appendReasoningPart(parts, event.text)\n case 'ToolCall':\n return [...parts, HostToolCallPart.make({ call: event.call })]\n case 'ProviderToolResult':\n return [\n ...parts,\n ProviderToolCallPart.make({ call: event.call }),\n ProviderToolResultPart.make({ toolCallId: event.call.id, result: event.result })\n ]\n case 'Done':\n case 'ToolInputDelta':\n case 'ToolInputStart':\n case 'Usage':\n return parts\n }\n }, [])\n\nexport const accumulateAssistantMessage = (events: ReadonlyArray<LLMEvent>) => {\n const parts = accumulateAssistantParts(events)\n\n return AssistantAgentMessage.make({ parts })\n}\n"],"mappings":";;AAYA,MAAa,eAAe,WAC1B,OAAO,QAAQ,MAAM,UAAW,MAAM,SAAS,cAAc,GAAG,OAAO,MAAM,SAAS,MAAO,EAAE;AAEjG,MAAa,oBAAoB,WAC/B,OAAO,QACJ,MAAM,UAAW,MAAM,SAAS,mBAAmB,GAAG,OAAO,MAAM,SAAS,MAC7E,EACF;AAEF,MAAa,oBAAoB,WAC/B,OAAO,SAAQ,UAAU,MAAM,SAAS,aAAa,CAAC,MAAM,IAAI,IAAI,CAAC,CAAE;AAEzE,MAAM,kBAAkB,OAAqC,SAAiB;CAC5E,MAAM,OAAO,MAAM,GAAG,EAAE;CAExB,OAAO,MAAM,SAAS,SAClB,CACE,GAAG,MAAM,MAAM,GAAG,EAAE,GACpB,kBAAkB,KAAK,EAAE,SAAS,oBAAoB,KAAK,SAAS,IAAI,EAAE,CAAC,CAC7E,IACA,CAAC,GAAG,OAAO,kBAAkB,KAAK,EAAE,SAAS,KAAK,CAAC,CAAC;AAC1D;AAEA,MAAM,uBAAuB,OAAqC,SAAiB;CACjF,MAAM,OAAO,MAAM,GAAG,EAAE;CAExB,OAAO,MAAM,SAAS,cAClB,CAAC,GAAG,MAAM,MAAM,GAAG,EAAE,GAAG,uBAAuB,KAAK,EAAE,MAAM,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,IACpF,CAAC,GAAG,OAAO,uBAAuB,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD;AAEA,MAAM,4BAA4B,WAChC,OAAO,QAAsC,OAAO,UAAU;CAC5D,QAAQ,MAAM,MAAd;EACE,KAAK,aACH,OAAO,eAAe,OAAO,MAAM,IAAI;EACzC,KAAK,kBACH,OAAO,oBAAoB,OAAO,MAAM,IAAI;EAC9C,KAAK,YACH,OAAO,CAAC,GAAG,OAAO,iBAAiB,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;EAC/D,KAAK,sBACH,OAAO;GACL,GAAG;GACH,qBAAqB,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC;GAC9C,uBAAuB,KAAK;IAAE,YAAY,MAAM,KAAK;IAAI,QAAQ,MAAM;GAAO,CAAC;EACjF;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;CACX;AACF,GAAG,CAAC,CAAC;AAEP,MAAa,8BAA8B,WAAoC;CAC7E,MAAM,QAAQ,yBAAyB,MAAM;CAE7C,OAAO,sBAAsB,KAAK,EAAE,MAAM,CAAC;AAC7C"}
@@ -0,0 +1,36 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { AgentError } from "@yolk-sdk/agent/protocol";
3
+
4
+ //#region src/loop/error.d.ts
5
+ declare const LLMError_base: Schema.Class<LLMError, Schema.TaggedStruct<"LLMError", {
6
+ readonly cause: Schema.Literals<readonly ["validation_error", "provider_error", "rate_limit", "context_overflow", "invalid_response"]>;
7
+ readonly message: Schema.String;
8
+ readonly retryable: Schema.Boolean;
9
+ }>, import("effect/Cause").YieldableError>;
10
+ declare class LLMError extends LLMError_base {}
11
+ declare const FauxExhaustedError_base: Schema.Class<FauxExhaustedError, Schema.TaggedStruct<"FauxExhaustedError", {
12
+ readonly message: Schema.String;
13
+ }>, import("effect/Cause").YieldableError>;
14
+ declare class FauxExhaustedError extends FauxExhaustedError_base {}
15
+ declare const ToolError_base: Schema.Class<ToolError, Schema.TaggedStruct<"ToolError", {
16
+ readonly tool: Schema.String;
17
+ readonly message: Schema.String;
18
+ readonly cause: Schema.Literals<readonly ["validation", "invalid_input", "execution", "timeout", "permission", "denied", "not_found", "unavailable"]>;
19
+ }>, import("effect/Cause").YieldableError>;
20
+ declare class ToolError extends ToolError_base {}
21
+ declare const ContextTransformError_base: Schema.Class<ContextTransformError, Schema.TaggedStruct<"ContextTransformError", {
22
+ readonly cause: Schema.Literals<readonly ["context_overflow", "invalid_response"]>;
23
+ readonly message: Schema.String;
24
+ readonly retryable: Schema.Boolean;
25
+ }>, import("effect/Cause").YieldableError>;
26
+ declare class ContextTransformError extends ContextTransformError_base {}
27
+ declare const AbortError_base: Schema.Class<AbortError, Schema.TaggedStruct<"AbortError", {
28
+ readonly reason: Schema.Literals<readonly ["user", "system", "max_turns"]>;
29
+ }>, import("effect/Cause").YieldableError>;
30
+ declare class AbortError extends AbortError_base {}
31
+ type LLMProviderError = LLMError | FauxExhaustedError | AbortError;
32
+ type AgentLoopError = LLMProviderError | ToolError | ContextTransformError;
33
+ declare const agentLoopErrorToAgentError: (error: AgentLoopError) => AgentError;
34
+ //#endregion
35
+ export { AbortError, AgentLoopError, ContextTransformError, FauxExhaustedError, LLMError, LLMProviderError, ToolError, agentLoopErrorToAgentError };
36
+ //# sourceMappingURL=error.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.mts","names":[],"sources":["../../src/loop/error.ts"],"mappings":";;;;cAC0E,aAAA;;;;;cAE7D,QAAA,SAAiB,aAU5B;AAAA,cAAG,uBAAA;;;cAEQ,kBAAA,SAA2B,uBAKvC;AAAA,cAAG,cAAA;;;;;cAES,SAAA,SAAkB,cAa7B;AAAA,cAAG,0BAAA;;;;;cAEQ,qBAAA,SAA8B,0BAO1C;AAAA,cAAG,eAAA;;;cAES,UAAA,SAAmB,eAE9B;AAAA,KAEU,gBAAA,GAAmB,QAAA,GAAW,kBAAA,GAAqB,UAAA;AAAA,KAEnD,cAAA,GAAiB,gBAAA,GAAmB,SAAA,GAAY,qBAAA;AAAA,cAmB/C,0BAAA,GAA8B,KAAA,EAAO,cAAA,KAAiB,UAiClE"}
@@ -0,0 +1,84 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { AgentError } from "@yolk-sdk/agent/protocol";
3
+ //#region src/loop/error.ts
4
+ var LLMError = class extends Schema.TaggedErrorClass()("LLMError", {
5
+ cause: Schema.Literals([
6
+ "validation_error",
7
+ "provider_error",
8
+ "rate_limit",
9
+ "context_overflow",
10
+ "invalid_response"
11
+ ]),
12
+ message: Schema.String,
13
+ retryable: Schema.Boolean
14
+ }) {};
15
+ var FauxExhaustedError = class extends Schema.TaggedErrorClass()("FauxExhaustedError", { message: Schema.String }) {};
16
+ var ToolError = class extends Schema.TaggedErrorClass()("ToolError", {
17
+ tool: Schema.String,
18
+ message: Schema.String,
19
+ cause: Schema.Literals([
20
+ "validation",
21
+ "invalid_input",
22
+ "execution",
23
+ "timeout",
24
+ "permission",
25
+ "denied",
26
+ "not_found",
27
+ "unavailable"
28
+ ])
29
+ }) {};
30
+ var ContextTransformError = class extends Schema.TaggedErrorClass()("ContextTransformError", {
31
+ cause: Schema.Literals(["context_overflow", "invalid_response"]),
32
+ message: Schema.String,
33
+ retryable: Schema.Boolean
34
+ }) {};
35
+ var AbortError = class extends Schema.TaggedErrorClass()("AbortError", { reason: Schema.Literals([
36
+ "user",
37
+ "system",
38
+ "max_turns"
39
+ ]) }) {};
40
+ const toolErrorCode = (error) => {
41
+ switch (error.cause) {
42
+ case "validation":
43
+ case "invalid_input": return "validation_error";
44
+ case "timeout": return "tool_timeout";
45
+ case "permission":
46
+ case "denied": return "tool_denied";
47
+ case "execution":
48
+ case "not_found":
49
+ case "unavailable": return "tool_error";
50
+ }
51
+ };
52
+ const agentLoopErrorToAgentError = (error) => {
53
+ switch (error._tag) {
54
+ case "LLMError": return AgentError.make({
55
+ code: error.cause,
56
+ message: error.message,
57
+ retryable: error.retryable
58
+ });
59
+ case "ToolError": return AgentError.make({
60
+ code: toolErrorCode(error),
61
+ message: error.message,
62
+ retryable: error.cause === "timeout"
63
+ });
64
+ case "ContextTransformError": return AgentError.make({
65
+ code: error.cause,
66
+ message: error.message,
67
+ retryable: error.retryable
68
+ });
69
+ case "AbortError": return AgentError.make({
70
+ code: "aborted",
71
+ message: `Agent run aborted: ${error.reason}`,
72
+ retryable: error.reason === "system"
73
+ });
74
+ case "FauxExhaustedError": return AgentError.make({
75
+ code: "provider_error",
76
+ message: error.message,
77
+ retryable: false
78
+ });
79
+ }
80
+ };
81
+ //#endregion
82
+ export { AbortError, ContextTransformError, FauxExhaustedError, LLMError, ToolError, agentLoopErrorToAgentError };
83
+
84
+ //# sourceMappingURL=error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.mjs","names":[],"sources":["../../src/loop/error.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { AgentError, type AgentErrorCode } from '@yolk-sdk/agent/protocol'\n\nexport class LLMError extends Schema.TaggedErrorClass<LLMError>()('LLMError', {\n cause: Schema.Literals([\n 'validation_error',\n 'provider_error',\n 'rate_limit',\n 'context_overflow',\n 'invalid_response'\n ]),\n message: Schema.String,\n retryable: Schema.Boolean\n}) {}\n\nexport class FauxExhaustedError extends Schema.TaggedErrorClass<FauxExhaustedError>()(\n 'FauxExhaustedError',\n {\n message: Schema.String\n }\n) {}\n\nexport class ToolError extends Schema.TaggedErrorClass<ToolError>()('ToolError', {\n tool: Schema.String,\n message: Schema.String,\n cause: Schema.Literals([\n 'validation',\n 'invalid_input',\n 'execution',\n 'timeout',\n 'permission',\n 'denied',\n 'not_found',\n 'unavailable'\n ])\n}) {}\n\nexport class ContextTransformError extends Schema.TaggedErrorClass<ContextTransformError>()(\n 'ContextTransformError',\n {\n cause: Schema.Literals(['context_overflow', 'invalid_response']),\n message: Schema.String,\n retryable: Schema.Boolean\n }\n) {}\n\nexport class AbortError extends Schema.TaggedErrorClass<AbortError>()('AbortError', {\n reason: Schema.Literals(['user', 'system', 'max_turns'])\n}) {}\n\nexport type LLMProviderError = LLMError | FauxExhaustedError | AbortError\n\nexport type AgentLoopError = LLMProviderError | ToolError | ContextTransformError\n\nconst toolErrorCode = (error: ToolError): AgentErrorCode => {\n switch (error.cause) {\n case 'validation':\n case 'invalid_input':\n return 'validation_error'\n case 'timeout':\n return 'tool_timeout'\n case 'permission':\n case 'denied':\n return 'tool_denied'\n case 'execution':\n case 'not_found':\n case 'unavailable':\n return 'tool_error'\n }\n}\n\nexport const agentLoopErrorToAgentError = (error: AgentLoopError): AgentError => {\n switch (error._tag) {\n case 'LLMError':\n return AgentError.make({\n code: error.cause,\n message: error.message,\n retryable: error.retryable\n })\n case 'ToolError':\n return AgentError.make({\n code: toolErrorCode(error),\n message: error.message,\n retryable: error.cause === 'timeout'\n })\n case 'ContextTransformError':\n return AgentError.make({\n code: error.cause,\n message: error.message,\n retryable: error.retryable\n })\n case 'AbortError':\n return AgentError.make({\n code: 'aborted',\n message: `Agent run aborted: ${error.reason}`,\n retryable: error.reason === 'system'\n })\n case 'FauxExhaustedError':\n return AgentError.make({\n code: 'provider_error',\n message: error.message,\n retryable: false\n })\n }\n}\n"],"mappings":";;;AAGA,IAAa,WAAb,cAA8B,OAAO,iBAA2B,EAAE,YAAY;CAC5E,OAAO,OAAO,SAAS;EACrB;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,SAAS,OAAO;CAChB,WAAW,OAAO;AACpB,CAAC,EAAE,CAAC;AAEJ,IAAa,qBAAb,cAAwC,OAAO,iBAAqC,EAClF,sBACA,EACE,SAAS,OAAO,OAClB,CACF,EAAE,CAAC;AAEH,IAAa,YAAb,cAA+B,OAAO,iBAA4B,EAAE,aAAa;CAC/E,MAAM,OAAO;CACb,SAAS,OAAO;CAChB,OAAO,OAAO,SAAS;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH,CAAC,EAAE,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,iBAAwC,EACxF,yBACA;CACE,OAAO,OAAO,SAAS,CAAC,oBAAoB,kBAAkB,CAAC;CAC/D,SAAS,OAAO;CAChB,WAAW,OAAO;AACpB,CACF,EAAE,CAAC;AAEH,IAAa,aAAb,cAAgC,OAAO,iBAA6B,EAAE,cAAc,EAClF,QAAQ,OAAO,SAAS;CAAC;CAAQ;CAAU;AAAW,CAAC,EACzD,CAAC,EAAE,CAAC;AAMJ,MAAM,iBAAiB,UAAqC;CAC1D,QAAQ,MAAM,OAAd;EACE,KAAK;EACL,KAAK,iBACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;CACX;AACF;AAEA,MAAa,8BAA8B,UAAsC;CAC/E,QAAQ,MAAM,MAAd;EACE,KAAK,YACH,OAAO,WAAW,KAAK;GACrB,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,WAAW,MAAM;EACnB,CAAC;EACH,KAAK,aACH,OAAO,WAAW,KAAK;GACrB,MAAM,cAAc,KAAK;GACzB,SAAS,MAAM;GACf,WAAW,MAAM,UAAU;EAC7B,CAAC;EACH,KAAK,yBACH,OAAO,WAAW,KAAK;GACrB,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,WAAW,MAAM;EACnB,CAAC;EACH,KAAK,cACH,OAAO,WAAW,KAAK;GACrB,MAAM;GACN,SAAS,sBAAsB,MAAM;GACrC,WAAW,MAAM,WAAW;EAC9B,CAAC;EACH,KAAK,sBACH,OAAO,WAAW,KAAK;GACrB,MAAM;GACN,SAAS,MAAM;GACf,WAAW;EACb,CAAC;CACL;AACF"}
@@ -0,0 +1,9 @@
1
+ import { LLMDone, LLMEvent, LLMProviderToolResult, LLMReasoningDelta, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage } from "./llm-event.mjs";
2
+ import { accumulateAssistantMessage, collectReasoning, collectText, collectToolCalls } from "./accumulator.mjs";
3
+ import { AbortError, AgentLoopError, ContextTransformError, FauxExhaustedError, LLMError, LLMProviderError, ToolError, agentLoopErrorToAgentError } from "./error.mjs";
4
+ import { ContextTransformResult, ContextTransformer } from "./services/context-transformer.mjs";
5
+ import { LLMProvider, LLMRequest } from "./services/llm-provider.mjs";
6
+ import { LoopConfig, LoopConfigShape } from "./services/loop-config.mjs";
7
+ import { ToolExecutor } from "./services/tool-executor.mjs";
8
+ import { AgentLoopRunId, ModelTurnConfig, RunConfig, ToolBatchConfig, run, runModelTurn, runToolBatch } from "./run.mjs";
9
+ export { AbortError, type AgentLoopError, type AgentLoopRunId, ContextTransformError, type ContextTransformResult, ContextTransformer, FauxExhaustedError, LLMDone, LLMError, LLMEvent, LLMProvider, type LLMProviderError, LLMProviderToolResult, LLMReasoningDelta, type LLMRequest, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage, LoopConfig, type LoopConfigShape, type ModelTurnConfig, type RunConfig, type ToolBatchConfig, ToolError, ToolExecutor, accumulateAssistantMessage, agentLoopErrorToAgentError, collectReasoning, collectText, collectToolCalls, run, runModelTurn, runToolBatch };
@@ -0,0 +1,9 @@
1
+ import { accumulateAssistantMessage, collectReasoning, collectText, collectToolCalls } from "./accumulator.mjs";
2
+ import { AbortError, ContextTransformError, FauxExhaustedError, LLMError, ToolError, agentLoopErrorToAgentError } from "./error.mjs";
3
+ import { LLMDone, LLMEvent, LLMProviderToolResult, LLMReasoningDelta, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage } from "./llm-event.mjs";
4
+ import { ContextTransformer } from "./services/context-transformer.mjs";
5
+ import { LLMProvider } from "./services/llm-provider.mjs";
6
+ import { LoopConfig } from "./services/loop-config.mjs";
7
+ import { ToolExecutor } from "./services/tool-executor.mjs";
8
+ import { run, runModelTurn, runToolBatch } from "./run.mjs";
9
+ export { AbortError, ContextTransformError, ContextTransformer, FauxExhaustedError, LLMDone, LLMError, LLMEvent, LLMProvider, LLMProviderToolResult, LLMReasoningDelta, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage, LoopConfig, ToolError, ToolExecutor, accumulateAssistantMessage, agentLoopErrorToAgentError, collectReasoning, collectText, collectToolCalls, run, runModelTurn, runToolBatch };
@@ -0,0 +1,44 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { AgentUsage, ToolCall, ToolResult } from "@yolk-sdk/agent/protocol";
3
+
4
+ //#region src/loop/llm-event.d.ts
5
+ declare const LLMTextDelta_base: Schema.Class<LLMTextDelta, Schema.TaggedStruct<"TextDelta", {
6
+ readonly text: Schema.String;
7
+ }>, {}>;
8
+ declare class LLMTextDelta extends LLMTextDelta_base {}
9
+ declare const LLMReasoningDelta_base: Schema.Class<LLMReasoningDelta, Schema.TaggedStruct<"ReasoningDelta", {
10
+ readonly text: Schema.String;
11
+ }>, {}>;
12
+ declare class LLMReasoningDelta extends LLMReasoningDelta_base {}
13
+ declare const LLMDone_base: Schema.Class<LLMDone, Schema.TaggedStruct<"Done", {
14
+ readonly stopReason: Schema.Literals<readonly ["stop", "tool_use"]>;
15
+ }>, {}>;
16
+ declare class LLMDone extends LLMDone_base {}
17
+ declare const LLMToolCall_base: Schema.Class<LLMToolCall, Schema.TaggedStruct<"ToolCall", {
18
+ readonly call: typeof ToolCall;
19
+ }>, {}>;
20
+ declare class LLMToolCall extends LLMToolCall_base {}
21
+ declare const LLMToolInputStart_base: Schema.Class<LLMToolInputStart, Schema.TaggedStruct<"ToolInputStart", {
22
+ readonly id: Schema.String;
23
+ readonly name: Schema.optional<Schema.String>;
24
+ }>, {}>;
25
+ declare class LLMToolInputStart extends LLMToolInputStart_base {}
26
+ declare const LLMToolInputDelta_base: Schema.Class<LLMToolInputDelta, Schema.TaggedStruct<"ToolInputDelta", {
27
+ readonly id: Schema.String;
28
+ readonly delta: Schema.String;
29
+ }>, {}>;
30
+ declare class LLMToolInputDelta extends LLMToolInputDelta_base {}
31
+ declare const LLMProviderToolResult_base: Schema.Class<LLMProviderToolResult, Schema.TaggedStruct<"ProviderToolResult", {
32
+ readonly call: typeof ToolCall;
33
+ readonly result: typeof ToolResult;
34
+ }>, {}>;
35
+ declare class LLMProviderToolResult extends LLMProviderToolResult_base {}
36
+ declare const LLMUsage_base: Schema.Class<LLMUsage, Schema.TaggedStruct<"Usage", {
37
+ readonly usage: typeof AgentUsage;
38
+ }>, {}>;
39
+ declare class LLMUsage extends LLMUsage_base {}
40
+ declare const LLMEvent: Schema.Union<readonly [typeof LLMTextDelta, typeof LLMReasoningDelta, typeof LLMDone, typeof LLMToolCall, typeof LLMToolInputStart, typeof LLMToolInputDelta, typeof LLMProviderToolResult, typeof LLMUsage]>;
41
+ type LLMEvent = typeof LLMEvent.Type;
42
+ //#endregion
43
+ export { LLMDone, LLMEvent, LLMProviderToolResult, LLMReasoningDelta, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage };
44
+ //# sourceMappingURL=llm-event.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-event.d.mts","names":[],"sources":["../../src/loop/llm-event.ts"],"mappings":";;;;cAC2E,iBAAA;;;cAE9D,YAAA,SAAqB,iBAEhC;AAAA,cAAG,sBAAA;;;cAEQ,iBAAA,SAA0B,sBAErC;AAAA,cAAG,YAAA;;;cAEQ,OAAA,SAAgB,YAE3B;AAAA,cAAG,gBAAA;;;cAEQ,WAAA,SAAoB,gBAE/B;AAAA,cAAG,sBAAA;;;;cAEQ,iBAAA,SAA0B,sBAGrC;AAAA,cAAG,sBAAA;;;;cAEQ,iBAAA,SAA0B,sBAGrC;AAAA,cAAG,0BAAA;;;;cAEQ,qBAAA,SAA8B,0BAM1C;AAAA,cAAG,aAAA;;;cAES,QAAA,SAAiB,aAE5B;AAAA,cAEW,QAAA,EAAQ,MAAA,CAAA,KAAA,kBAAA,YAAA,SAAA,iBAAA,SAAA,OAAA,SAAA,WAAA,SAAA,iBAAA,SAAA,iBAAA,SAAA,qBAAA,SAAA,QAAA;AAAA,KAUT,QAAA,UAAkB,QAAA,CAAS,IAAI"}
@@ -0,0 +1,34 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { AgentUsage, ToolCall, ToolResult } from "@yolk-sdk/agent/protocol";
3
+ //#region src/loop/llm-event.ts
4
+ var LLMTextDelta = class extends Schema.TaggedClass()("TextDelta", { text: Schema.String }) {};
5
+ var LLMReasoningDelta = class extends Schema.TaggedClass()("ReasoningDelta", { text: Schema.String }) {};
6
+ var LLMDone = class extends Schema.TaggedClass()("Done", { stopReason: Schema.Literals(["stop", "tool_use"]) }) {};
7
+ var LLMToolCall = class extends Schema.TaggedClass()("ToolCall", { call: ToolCall }) {};
8
+ var LLMToolInputStart = class extends Schema.TaggedClass()("ToolInputStart", {
9
+ id: Schema.String,
10
+ name: Schema.optional(Schema.String)
11
+ }) {};
12
+ var LLMToolInputDelta = class extends Schema.TaggedClass()("ToolInputDelta", {
13
+ id: Schema.String,
14
+ delta: Schema.String
15
+ }) {};
16
+ var LLMProviderToolResult = class extends Schema.TaggedClass()("ProviderToolResult", {
17
+ call: ToolCall,
18
+ result: ToolResult
19
+ }) {};
20
+ var LLMUsage = class extends Schema.TaggedClass()("Usage", { usage: AgentUsage }) {};
21
+ const LLMEvent = Schema.Union([
22
+ LLMTextDelta,
23
+ LLMReasoningDelta,
24
+ LLMDone,
25
+ LLMToolCall,
26
+ LLMToolInputStart,
27
+ LLMToolInputDelta,
28
+ LLMProviderToolResult,
29
+ LLMUsage
30
+ ]);
31
+ //#endregion
32
+ export { LLMDone, LLMEvent, LLMProviderToolResult, LLMReasoningDelta, LLMTextDelta, LLMToolCall, LLMToolInputDelta, LLMToolInputStart, LLMUsage };
33
+
34
+ //# sourceMappingURL=llm-event.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-event.mjs","names":[],"sources":["../../src/loop/llm-event.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { AgentUsage, ToolCall, ToolResult } from '@yolk-sdk/agent/protocol'\n\nexport class LLMTextDelta extends Schema.TaggedClass<LLMTextDelta>()('TextDelta', {\n text: Schema.String\n}) {}\n\nexport class LLMReasoningDelta extends Schema.TaggedClass<LLMReasoningDelta>()('ReasoningDelta', {\n text: Schema.String\n}) {}\n\nexport class LLMDone extends Schema.TaggedClass<LLMDone>()('Done', {\n stopReason: Schema.Literals(['stop', 'tool_use'])\n}) {}\n\nexport class LLMToolCall extends Schema.TaggedClass<LLMToolCall>()('ToolCall', {\n call: ToolCall\n}) {}\n\nexport class LLMToolInputStart extends Schema.TaggedClass<LLMToolInputStart>()('ToolInputStart', {\n id: Schema.String,\n name: Schema.optional(Schema.String)\n}) {}\n\nexport class LLMToolInputDelta extends Schema.TaggedClass<LLMToolInputDelta>()('ToolInputDelta', {\n id: Schema.String,\n delta: Schema.String\n}) {}\n\nexport class LLMProviderToolResult extends Schema.TaggedClass<LLMProviderToolResult>()(\n 'ProviderToolResult',\n {\n call: ToolCall,\n result: ToolResult\n }\n) {}\n\nexport class LLMUsage extends Schema.TaggedClass<LLMUsage>()('Usage', {\n usage: AgentUsage\n}) {}\n\nexport const LLMEvent = Schema.Union([\n LLMTextDelta,\n LLMReasoningDelta,\n LLMDone,\n LLMToolCall,\n LLMToolInputStart,\n LLMToolInputDelta,\n LLMProviderToolResult,\n LLMUsage\n])\nexport type LLMEvent = typeof LLMEvent.Type\n"],"mappings":";;;AAGA,IAAa,eAAb,cAAkC,OAAO,YAA0B,EAAE,aAAa,EAChF,MAAM,OAAO,OACf,CAAC,EAAE,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,YAA+B,EAAE,kBAAkB,EAC/F,MAAM,OAAO,OACf,CAAC,EAAE,CAAC;AAEJ,IAAa,UAAb,cAA6B,OAAO,YAAqB,EAAE,QAAQ,EACjE,YAAY,OAAO,SAAS,CAAC,QAAQ,UAAU,CAAC,EAClD,CAAC,EAAE,CAAC;AAEJ,IAAa,cAAb,cAAiC,OAAO,YAAyB,EAAE,YAAY,EAC7E,MAAM,SACR,CAAC,EAAE,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,YAA+B,EAAE,kBAAkB;CAC/F,IAAI,OAAO;CACX,MAAM,OAAO,SAAS,OAAO,MAAM;AACrC,CAAC,EAAE,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,YAA+B,EAAE,kBAAkB;CAC/F,IAAI,OAAO;CACX,OAAO,OAAO;AAChB,CAAC,EAAE,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,YAAmC,EACnF,sBACA;CACE,MAAM;CACN,QAAQ;AACV,CACF,EAAE,CAAC;AAEH,IAAa,WAAb,cAA8B,OAAO,YAAsB,EAAE,SAAS,EACpE,OAAO,WACT,CAAC,EAAE,CAAC;AAEJ,MAAa,WAAW,OAAO,MAAM;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC"}