@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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/client/index.d.mts +3 -0
- package/dist/client/index.mjs +3 -0
- package/dist/client/state.d.mts +99 -0
- package/dist/client/state.d.mts.map +1 -0
- package/dist/client/state.mjs +245 -0
- package/dist/client/state.mjs.map +1 -0
- package/dist/client/transport.d.mts +67 -0
- package/dist/client/transport.d.mts.map +1 -0
- package/dist/client/transport.mjs +219 -0
- package/dist/client/transport.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +1 -0
- package/dist/loop/accumulator.d.mts +11 -0
- package/dist/loop/accumulator.d.mts.map +1 -0
- package/dist/loop/accumulator.mjs +40 -0
- package/dist/loop/accumulator.mjs.map +1 -0
- package/dist/loop/error.d.mts +36 -0
- package/dist/loop/error.d.mts.map +1 -0
- package/dist/loop/error.mjs +84 -0
- package/dist/loop/error.mjs.map +1 -0
- package/dist/loop/index.d.mts +9 -0
- package/dist/loop/index.mjs +9 -0
- package/dist/loop/llm-event.d.mts +44 -0
- package/dist/loop/llm-event.d.mts.map +1 -0
- package/dist/loop/llm-event.mjs +34 -0
- package/dist/loop/llm-event.mjs.map +1 -0
- package/dist/loop/run.d.mts +37 -0
- package/dist/loop/run.d.mts.map +1 -0
- package/dist/loop/run.mjs +624 -0
- package/dist/loop/run.mjs.map +1 -0
- package/dist/loop/services/context-transformer.d.mts +18 -0
- package/dist/loop/services/context-transformer.d.mts.map +1 -0
- package/dist/loop/services/context-transformer.mjs +12 -0
- package/dist/loop/services/context-transformer.mjs.map +1 -0
- package/dist/loop/services/llm-provider.d.mts +20 -0
- package/dist/loop/services/llm-provider.d.mts.map +1 -0
- package/dist/loop/services/llm-provider.mjs +7 -0
- package/dist/loop/services/llm-provider.mjs.map +1 -0
- package/dist/loop/services/loop-config.d.mts +17 -0
- package/dist/loop/services/loop-config.d.mts.map +1 -0
- package/dist/loop/services/loop-config.mjs +15 -0
- package/dist/loop/services/loop-config.mjs.map +1 -0
- package/dist/loop/services/tool-executor.d.mts +12 -0
- package/dist/loop/services/tool-executor.d.mts.map +1 -0
- package/dist/loop/services/tool-executor.mjs +7 -0
- package/dist/loop/services/tool-executor.mjs.map +1 -0
- package/dist/loop/testing/faux-provider.d.mts +31 -0
- package/dist/loop/testing/faux-provider.d.mts.map +1 -0
- package/dist/loop/testing/faux-provider.mjs +47 -0
- package/dist/loop/testing/faux-provider.mjs.map +1 -0
- package/dist/loop/testing/index.d.mts +3 -0
- package/dist/loop/testing/index.mjs +3 -0
- package/dist/loop/testing/test-tool-executor.d.mts +10 -0
- package/dist/loop/testing/test-tool-executor.d.mts.map +1 -0
- package/dist/loop/testing/test-tool-executor.mjs +21 -0
- package/dist/loop/testing/test-tool-executor.mjs.map +1 -0
- package/dist/protocol/capability.d.mts +20 -0
- package/dist/protocol/capability.d.mts.map +1 -0
- package/dist/protocol/capability.mjs +34 -0
- package/dist/protocol/capability.mjs.map +1 -0
- package/dist/protocol/content.d.mts +31 -0
- package/dist/protocol/content.d.mts.map +1 -0
- package/dist/protocol/content.mjs +52 -0
- package/dist/protocol/content.mjs.map +1 -0
- package/dist/protocol/event.d.mts +228 -0
- package/dist/protocol/event.d.mts.map +1 -0
- package/dist/protocol/event.mjs +217 -0
- package/dist/protocol/event.mjs.map +1 -0
- package/dist/protocol/index.d.mts +14 -0
- package/dist/protocol/index.d.mts.map +1 -0
- package/dist/protocol/index.mjs +9 -0
- package/dist/protocol/message.d.mts +53 -0
- package/dist/protocol/message.d.mts.map +1 -0
- package/dist/protocol/message.mjs +49 -0
- package/dist/protocol/message.mjs.map +1 -0
- package/dist/protocol/reasoning.d.mts +8 -0
- package/dist/protocol/reasoning.d.mts.map +1 -0
- package/dist/protocol/reasoning.mjs +13 -0
- package/dist/protocol/reasoning.mjs.map +1 -0
- package/dist/protocol/session.d.mts +39 -0
- package/dist/protocol/session.d.mts.map +1 -0
- package/dist/protocol/session.mjs +38 -0
- package/dist/protocol/session.mjs.map +1 -0
- package/dist/protocol/tool.d.mts +101 -0
- package/dist/protocol/tool.d.mts.map +1 -0
- package/dist/protocol/tool.mjs +102 -0
- package/dist/protocol/tool.mjs.map +1 -0
- package/dist/protocol/usage.d.mts +26 -0
- package/dist/protocol/usage.d.mts.map +1 -0
- package/dist/protocol/usage.mjs +40 -0
- package/dist/protocol/usage.mjs.map +1 -0
- package/dist/runtime/error.d.mts +29 -0
- package/dist/runtime/error.d.mts.map +1 -0
- package/dist/runtime/error.mjs +46 -0
- package/dist/runtime/error.mjs.map +1 -0
- package/dist/runtime/index.d.mts +9 -0
- package/dist/runtime/index.d.mts.map +1 -0
- package/dist/runtime/index.mjs +4 -0
- package/dist/runtime/run-runtime.d.mts +47 -0
- package/dist/runtime/run-runtime.d.mts.map +1 -0
- package/dist/runtime/run-runtime.mjs +112 -0
- package/dist/runtime/run-runtime.mjs.map +1 -0
- package/dist/runtime/session-event-store.d.mts +75 -0
- package/dist/runtime/session-event-store.d.mts.map +1 -0
- package/dist/runtime/session-event-store.mjs +124 -0
- package/dist/runtime/session-event-store.mjs.map +1 -0
- package/dist/tools/index.d.mts +4 -0
- package/dist/tools/index.mjs +4 -0
- package/dist/tools/question.d.mts +21 -0
- package/dist/tools/question.d.mts.map +1 -0
- package/dist/tools/question.mjs +41 -0
- package/dist/tools/question.mjs.map +1 -0
- package/dist/tools/registry.d.mts +61 -0
- package/dist/tools/registry.d.mts.map +1 -0
- package/dist/tools/registry.mjs +113 -0
- package/dist/tools/registry.mjs.map +1 -0
- package/dist/tools/task.d.mts +34 -0
- package/dist/tools/task.d.mts.map +1 -0
- package/dist/tools/task.mjs +81 -0
- package/dist/tools/task.mjs.map +1 -0
- package/package.json +86 -0
- package/src/client/README.md +23 -0
- package/src/client/index.ts +43 -0
- package/src/client/state.ts +380 -0
- package/src/client/transport.ts +517 -0
- package/src/index.ts +2 -0
- package/src/loop/README.md +23 -0
- package/src/loop/accumulator.ts +71 -0
- package/src/loop/error.ts +105 -0
- package/src/loop/index.ts +35 -0
- package/src/loop/llm-event.ts +52 -0
- package/src/loop/run.ts +1237 -0
- package/src/loop/services/context-transformer.ts +24 -0
- package/src/loop/services/llm-provider.ts +20 -0
- package/src/loop/services/loop-config.ts +20 -0
- package/src/loop/services/tool-executor.ts +11 -0
- package/src/loop/testing/faux-provider.ts +94 -0
- package/src/loop/testing/index.ts +3 -0
- package/src/loop/testing/test-tool-executor.ts +28 -0
- package/src/protocol/README.md +24 -0
- package/src/protocol/capability.ts +29 -0
- package/src/protocol/content.ts +76 -0
- package/src/protocol/event.ts +286 -0
- package/src/protocol/index.ts +109 -0
- package/src/protocol/message.ts +86 -0
- package/src/protocol/reasoning.ts +4 -0
- package/src/protocol/session.ts +47 -0
- package/src/protocol/tool.ts +154 -0
- package/src/protocol/usage.ts +48 -0
- package/src/runtime/README.md +44 -0
- package/src/runtime/error.ts +70 -0
- package/src/runtime/index.ts +43 -0
- package/src/runtime/run-runtime.ts +307 -0
- package/src/runtime/session-event-store.ts +254 -0
- package/src/tools/README.md +22 -0
- package/src/tools/index.ts +29 -0
- package/src/tools/question.ts +58 -0
- package/src/tools/registry.ts +228 -0
- 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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"}
|
package/dist/index.d.mts
ADDED
|
@@ -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"}
|