@yolk-sdk/agent 0.1.0-canary.68 → 0.1.0-canary.70

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/README.md CHANGED
@@ -172,7 +172,9 @@ Gateway API key or Vercel OIDC token as `apiKey`; `maxCompletionTokens` is sent
172
172
  `VERCEL_OIDC_TOKEN`, and requires integer
173
173
  `AI_GATEWAY_MAX_COMPLETION_TOKENS`. Model ids are opaque `provider/model` strings. Hosts may set
174
174
  `fallbackModels`, provider `routing`, and optional `http-referer` / `x-title` attribution headers.
175
- Required authorization and JSON headers cannot be replaced through `extraHeaders`. Only override
175
+ A request `reasoningEffort` is sent as Gateway `{ reasoning: { effort } }` for any opaque model id;
176
+ hosts remain responsible for offering only efforts supported by the selected model. Required
177
+ authorization and JSON headers cannot be replaced through `extraHeaders`. Only override
176
178
  `chatCompletionsUrl` with a trusted proxy because it receives the bearer credential.
177
179
 
178
180
  Grok subscription access uses `https://cli-chat-proxy.grok.com/v1/responses`, not the xAI developer
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":"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"}
1
+ {"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":"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"}
@@ -304,8 +304,8 @@ const responseToEventStream = (response) => Stream.callback((queue) => Effect.ge
304
304
  yield* Scope.addFinalizer(callbackScope, Effect.gen(function* () {
305
305
  if (!(yield* Ref.get(terminalReached))) yield* closeResponseScope;
306
306
  }));
307
- yield* run().pipe(Effect.catch((error) => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)));
308
- }));
307
+ yield* run();
308
+ }).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
309
309
  const abortSignalError = (signal) => new AgentTransportError({
310
310
  message: "Agent request aborted",
311
311
  cause: signal.reason
@@ -512,7 +512,7 @@ const streamAgentEventStreamUntilTerminal = (request) => {
512
512
  onEvent: request.onEvent
513
513
  }, queue);
514
514
  yield* Queue.end(queue).pipe(Effect.asVoid);
515
- }).pipe(Effect.catch((error) => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))));
515
+ }).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
516
516
  };
517
517
  const streamAgentRunEventStreamUntilTerminal = (request) => {
518
518
  return Stream.callback((queue) => Effect.gen(function* () {
@@ -543,7 +543,7 @@ const streamAgentRunEventStreamUntilTerminal = (request) => {
543
543
  onEvent: request.onEvent
544
544
  }, queue);
545
545
  yield* Queue.end(queue).pipe(Effect.asVoid);
546
- }).pipe(Effect.catch((error) => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))));
546
+ }).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
547
547
  };
548
548
  const streamAgentRunHitlResponseInitialChunk = (request, queue, setStartIndex) => drainAgentEventStream({
549
549
  queue,
@@ -580,7 +580,7 @@ const streamAgentRunHitlResponseEventStreamUntilTerminal = (request) => {
580
580
  onEvent: request.onEvent
581
581
  }, queue);
582
582
  yield* Queue.end(queue).pipe(Effect.asVoid);
583
- }).pipe(Effect.catch((error) => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))));
583
+ }).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
584
584
  };
585
585
  const isAgentEvent = (message) => message._tag !== "SessionSnapshot";
586
586
  const streamCloudflareAgentEventStream = (request) => applyAbortSignal(Stream.callback((queue) => Effect.gen(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Effect,\n Exit,\n Pull,\n Queue,\n Ref,\n Result,\n Scope,\n Stream,\n type Layer\n} 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 isTerminalAgentEvent\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 startIndex?: number\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunHitlResponseEventsRequest = {\n readonly endpoint: string\n readonly hitlResponses: ReadonlyArray<HitlResponse>\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentEventHandler = (event: AgentEventType, count: number) => void\n\nexport type AgentRunIdleReconnectOptions = {\n readonly idleTimeoutMs: number\n readonly maxAttempts?: number\n}\n\nexport type AgentRunContinuationOptions = {\n readonly continuationLimit?: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}\n\nexport type StreamAgentEventsUntilTerminalRequest = StreamAgentEventsRequest &\n AgentRunContinuationOptions & {\n readonly runEndpoint?: (runId: string) => string\n readonly onRunId?: (runId: string) => void\n }\n\nexport type StreamAgentRunEventsUntilTerminalRequest = StreamAgentRunEventsRequest &\n AgentRunContinuationOptions\n\nexport type StreamAgentRunHitlResponseEventsUntilTerminalRequest =\n StreamAgentRunHitlResponseEventsRequest & AgentRunContinuationOptions\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'\nconst defaultRunContinuationLimit = 120\nconst defaultIdleReconnectMaxAttempts = 12\nconst relativeEndpointBase = 'http://yolk.local'\n\nconst headerValue = (headers: Readonly<Record<string, string | undefined>>, name: string) => {\n const direct = headers[name]\n\n if (direct !== undefined) {\n return direct\n }\n\n const normalizedName = name.toLowerCase()\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === normalizedName) {\n return value\n }\n }\n\n return undefined\n}\n\nconst nonEmptyHeaderValue = (\n headers: Readonly<Record<string, string | undefined>>,\n name: string\n) => {\n const value = headerValue(headers, name)?.trim()\n\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nconst safeIntegerPattern = /^-?(0|[1-9]\\d*)$/\n\nconst parseSafeInteger = (raw: string) => {\n const value = raw.trim()\n\n if (!safeIntegerPattern.test(value)) {\n return undefined\n }\n\n const parsed = Number.parseInt(value, 10)\n\n return Number.isSafeInteger(parsed) ? parsed : undefined\n}\n\nexport const agentRunIdFromHeaders = (headers: Readonly<Record<string, string | undefined>>) =>\n nonEmptyHeaderValue(headers, 'x-workflow-run-id')\n\nexport const agentRunStreamTailIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const raw = nonEmptyHeaderValue(headers, 'x-workflow-stream-tail-index')\n if (raw === undefined) return undefined\n\n const parsed = parseSafeInteger(raw)\n\n return parsed !== undefined && parsed >= -1 ? parsed : undefined\n}\n\nexport const agentRunStreamStartIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const tailIndex = agentRunStreamTailIndexFromHeaders(headers)\n\n return tailIndex === undefined ? undefined : tailIndex + 1\n}\n\nexport const agentRunEndpointWithStartIndex = (endpoint: string, startIndex?: number) => {\n if (startIndex === undefined) return endpoint\n\n validateAgentRunStartIndex(startIndex)\n\n const parsed = parseEndpointOrThrow(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n}\n\ntype ParsedEndpoint = {\n readonly url: URL\n readonly absolute: boolean\n readonly leadingSlash: boolean\n}\n\nconst absoluteUrlPattern = /^[A-Za-z][A-Za-z\\d+.-]*:/\n\nconst invalidAgentRunEndpointError = (endpoint: string) =>\n new AgentTransportError({\n message: 'Invalid agent run endpoint',\n cause: endpoint\n })\n\nconst parseEndpoint = (endpoint: string): ParsedEndpoint | undefined =>\n Result.try(() => ({\n url: new URL(endpoint, relativeEndpointBase),\n absolute: absoluteUrlPattern.test(endpoint),\n leadingSlash: endpoint.startsWith('/')\n })).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: parsed => parsed\n })\n )\n\nconst parseEndpointOrThrow = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n if (parsed !== undefined) {\n return parsed\n }\n\n throw invalidAgentRunEndpointError(endpoint)\n}\n\nconst parseEndpointEffect = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n return parsed === undefined\n ? Effect.fail(invalidAgentRunEndpointError(endpoint))\n : Effect.succeed(parsed)\n}\n\nconst serializeEndpoint = (endpoint: ParsedEndpoint) => {\n if (endpoint.absolute) {\n return endpoint.url.toString()\n }\n\n const serialized = `${endpoint.url.pathname}${endpoint.url.search}${endpoint.url.hash}`\n\n return endpoint.leadingSlash ? serialized : serialized.slice(1)\n}\n\nconst appendEncodedPathSegment = (endpoint: string, segment: string) => {\n const parsed = parseEndpointOrThrow(endpoint)\n\n const basePath = parsed.url.pathname.endsWith('/')\n ? parsed.url.pathname.slice(0, -1)\n : parsed.url.pathname\n\n parsed.url.pathname = `${basePath}/${encodeURIComponent(segment)}`\n\n return serializeEndpoint(parsed)\n}\n\nconst defaultAgentRunEndpoint = (endpoint: string | undefined, runId: string) =>\n appendEncodedPathSegment(endpoint ?? defaultEndpoint, runId)\n\nconst invalidAgentRunContinuationLimitError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run continuation limit',\n cause: limit\n })\n\nconst agentRunContinuationLimitEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultRunContinuationLimit)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidAgentRunContinuationLimitError(limit))\n}\n\nconst invalidIdleReconnectMaxAttemptsError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect max attempts',\n cause: limit\n })\n\nconst idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultIdleReconnectMaxAttempts)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))\n}\n\nconst validateAgentRunIdleReconnectEffect = (\n options: AgentRunIdleReconnectOptions | undefined\n) => {\n if (options === undefined) return Effect.void\n\n if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect timeout',\n cause: options.idleTimeoutMs\n })\n )\n }\n\n return idleReconnectMaxAttemptsEffect(options.maxAttempts).pipe(Effect.asVoid)\n}\n\nconst validateAgentRunStartIndex = (startIndex: number | undefined) => {\n if (startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)) {\n return\n }\n\n throw invalidAgentRunStartIndexError(startIndex)\n}\n\nconst invalidAgentRunStartIndexError = (startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run stream start index',\n cause: startIndex\n })\n\nconst validateAgentRunStartIndexEffect = (startIndex: number | undefined) =>\n startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)\n ? Effect.void\n : Effect.fail(invalidAgentRunStartIndexError(startIndex))\n\nconst agentRunEndpointWithStartIndexEffect = (endpoint: string, startIndex: number | undefined) =>\n Effect.gen(function* () {\n if (startIndex === undefined) return endpoint\n\n yield* validateAgentRunStartIndexEffect(startIndex)\n\n const parsed = yield* parseEndpointEffect(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n })\n\nconst nextAgentRunStartIndex = (startIndex: number | undefined, count: number) =>\n (startIndex ?? 0) + count\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 makeHttpRunHitlResponseRequest = (request: StreamAgentRunHitlResponseEventsRequest) =>\n encodeJsonString(\n { hitlResponses: request.hitlResponses },\n 'Could not serialize agent run HITL response'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint).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(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\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 endpoint = yield* agentRunEndpointWithStartIndexEffect(request.endpoint, request.startIndex)\n\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(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(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\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 requestAgentRunHitlResponse = (request: StreamAgentRunHitlResponseEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRunHitlResponseRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run HITL request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run HITL request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nexport const cancelAgentRun = (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 responseToLineStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0)\n )\n\nconst closeScope = (scope: Scope.Scope) => Scope.close(scope, Exit.succeed(undefined))\n\n// Protocol-terminal events finish the consumer stream, but HTTP bodies must still\n// drain to EOF so server runtimes do not observe client-side response aborts.\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const callbackScope = yield* Scope.Scope\n // Own the response stream in a scope that can outlive the consumer after a\n // terminal event; before terminal, consumer cancellation closes it.\n const responseScope = yield* Scope.make()\n const responseScopeClosed = yield* Ref.make(false)\n const terminalReached = yield* Ref.make(false)\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\n const closeResponseScope = Effect.gen(function* () {\n const closed = yield* Ref.get(responseScopeClosed)\n\n if (!closed) {\n yield* Ref.set(responseScopeClosed, true)\n yield* closeScope(responseScope)\n }\n })\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n const drainResponse = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: () => drainResponse(),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.void\n })\n const startTerminalDrain = Effect.gen(function* () {\n yield* Ref.set(terminalReached, true)\n yield* endQueue\n yield* drainResponse().pipe(\n Effect.catch(() => Effect.void),\n Effect.ensuring(closeResponseScope),\n Effect.forkDetach({ startImmediately: true }),\n Effect.asVoid\n )\n })\n const emitLines = (lines: ReadonlyArray<string>): Effect.Effect<void, AgentTransportError> =>\n Effect.gen(function* () {\n for (const line of lines) {\n const event = yield* parseAgentEventLine(line)\n\n yield* Queue.offer(queue, event)\n\n if (isTerminalAgentEvent(event)) {\n yield* startTerminalDrain\n return\n }\n }\n\n yield* run()\n })\n const run = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: emitLines,\n onFailure: failQueue,\n onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))\n })\n\n yield* Scope.addFinalizer(\n callbackScope,\n Effect.gen(function* () {\n const terminal = yield* Ref.get(terminalReached)\n\n if (!terminal) {\n yield* closeResponseScope\n }\n })\n )\n\n yield* run().pipe(\n Effect.catch(error => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n )\n })\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunHitlResponseEventStream = (\n request: StreamAgentRunHitlResponseEventsRequest\n) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunHitlResponse(request)).pipe(\n Stream.flatMap(responseToEventStream)\n ),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (request: SubmitToolApprovalResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\ntype AgentEventChunkResult = {\n readonly count: number\n readonly terminal: boolean\n readonly idle: boolean\n}\n\ntype AgentEventPullResult =\n | { readonly _tag: 'Events'; readonly events: Iterable<AgentEventType> }\n | { readonly _tag: 'Done' }\n | { readonly _tag: 'Idle' }\n\ntype AgentRunContinuationInput = AgentRunContinuationOptions & {\n readonly endpoint: string | undefined\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly terminal: boolean\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nconst missingAgentRunContinuationEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run continuation failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst exhaustedAgentRunContinuationLimitError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run continuation limit reached before a terminal event',\n cause: { limit }\n })\n\nconst noProgressAgentRunContinuationError = (endpoint: string, startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Agent run continuation made no progress before a terminal event',\n cause: { endpoint, startIndex }\n })\n\nconst noProgressAgentRunContinuationDelayMs = 250\n\nconst idleReconnectLimitReachedError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run idle reconnect limit reached before a terminal event',\n cause: { limit }\n })\n\nconst missingIdleReconnectRunEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run idle reconnect failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst waitForAgentRunContinuationProgress = (signal: AbortSignal | undefined) => {\n const sleep = Effect.sleep(`${noProgressAgentRunContinuationDelayMs} millis`)\n\n return signal === undefined ? sleep : sleep.pipe(Effect.raceFirst(abortSignalEffect(signal)))\n}\n\nconst missingAgentRunTailIndexError = () =>\n new AgentTransportError({\n message: 'Agent run HITL response missing x-workflow-stream-tail-index',\n cause: 'missing_tail_index'\n })\n\nconst pullAgentEventChunk = <A extends Iterable<AgentEventType>>(\n pull: Pull.Pull<A, AgentTransportError, void, never>,\n idleReconnect: AgentRunIdleReconnectOptions | undefined\n) => {\n const pullEvents: Effect.Effect<AgentEventPullResult, AgentTransportError, never> =\n Pull.matchEffect(pull, {\n onSuccess: events => Effect.succeed({ _tag: 'Events', events }),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed({ _tag: 'Done' })\n })\n\n if (idleReconnect === undefined) return pullEvents\n\n return pullEvents.pipe(\n Effect.raceFirst(\n Effect.sleep(`${idleReconnect.idleTimeoutMs} millis`).pipe(\n Effect.map((): AgentEventPullResult => ({ _tag: 'Idle' }))\n )\n )\n )\n}\n\nconst drainAgentEventStream = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly stream: Stream.Stream<AgentEventType, AgentTransportError, never>\n readonly countOffset: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n const scope = yield* Scope.make()\n const pull = yield* Channel.toPullScoped(Stream.toChannel(input.stream), scope)\n const run = (state: {\n readonly count: number\n readonly terminal: boolean\n }): Effect.Effect<AgentEventChunkResult, AgentTransportError, never> =>\n Effect.gen(function* () {\n const pulled = yield* pullAgentEventChunk(pull, input.idleReconnect)\n\n switch (pulled._tag) {\n case 'Idle':\n return { count: state.count, terminal: state.terminal, idle: true }\n case 'Done':\n return { count: state.count, terminal: state.terminal, idle: false }\n case 'Events': {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of pulled.events) {\n count += 1\n terminal = terminal || isTerminalAgentEvent(event)\n yield* Effect.sync(() => input.onEvent?.(event, input.countOffset + count))\n yield* Queue.offer(input.queue, event)\n\n if (terminal) return { count, terminal, idle: false }\n }\n\n return yield* run({ count, terminal })\n }\n }\n })\n\n return yield* run({ count: 0, terminal: false }).pipe(Effect.ensuring(closeScope(scope)))\n })\n\nconst streamAgentRunContinuationChunk = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly endpoint: string\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly signal: AbortSignal | undefined\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n readonly onEvent?: StreamAgentEventHandler\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue: input.queue,\n stream: streamAgentRunEventStream({\n endpoint: input.endpoint,\n startIndex: input.startIndex,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse\n }),\n countOffset: input.countOffset,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\nconst streamAgentRunContinuations = (\n input: AgentRunContinuationInput,\n queue: Queue.Enqueue<AgentEventType>\n): Effect.Effect<void, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n let totalCount = input.countOffset\n let terminal = input.terminal\n let startIndex = input.startIndex\n const limit = yield* agentRunContinuationLimitEffect(input.continuationLimit)\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n let idleReconnects = 0\n\n if (terminal) {\n return\n }\n\n if (input.endpoint === undefined) {\n return yield* Effect.fail(missingAgentRunContinuationEndpointError())\n }\n\n let continuation = 0\n while (continuation < limit) {\n const endpoint = input.endpoint\n const chunkStartIndex = startIndex\n\n const chunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint,\n startIndex: chunkStartIndex,\n countOffset: totalCount,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\n if (chunk.idle) {\n if (idleReconnectLimit !== undefined && idleReconnects >= idleReconnectLimit) {\n return yield* Effect.fail(idleReconnectLimitReachedError(idleReconnectLimit))\n }\n\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n idleReconnects += 1\n continue\n }\n\n continuation += 1\n\n if (chunk.count === 0 && !chunk.terminal) {\n if (continuation >= limit) {\n return yield* Effect.fail(noProgressAgentRunContinuationError(endpoint, startIndex))\n }\n\n yield* waitForAgentRunContinuationProgress(input.signal)\n continue\n }\n\n terminal = chunk.terminal\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n\n if (terminal) {\n return\n }\n }\n\n return yield* Effect.fail(exhaustedAgentRunContinuationLimitError(limit))\n })\n\nexport const streamAgentEventStreamUntilTerminal = (\n request: StreamAgentEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let runEndpoint: string | undefined\n let startIndex: number | undefined\n const firstChunk = yield* drainAgentEventStream({\n queue,\n stream: streamAgentEventStream({\n ...request,\n onResponse: response => {\n startIndex = agentRunStreamStartIndexFromHeaders(response.headers)\n const runId = agentRunIdFromHeaders(response.headers)\n if (runId !== undefined) {\n runEndpoint =\n request.runEndpoint?.(runId) ?? defaultAgentRunEndpoint(request.endpoint, runId)\n request.onRunId?.(runId)\n }\n\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n if (firstChunk.idle && runEndpoint === undefined) {\n return yield* Effect.fail(missingIdleReconnectRunEndpointError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: runEndpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\n\nexport const streamAgentRunEventStreamUntilTerminal = (\n request: StreamAgentRunEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n yield* validateAgentRunStartIndexEffect(request.startIndex)\n const firstChunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint: request.endpoint,\n startIndex: request.startIndex,\n countOffset: 0,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(request.startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\n\nconst streamAgentRunHitlResponseInitialChunk = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest,\n queue: Queue.Enqueue<AgentEventType>,\n setStartIndex: (startIndex: number | undefined) => void\n): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue,\n stream: streamAgentRunHitlResponseEventStream({\n ...request,\n onResponse: response => {\n setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\nexport const streamAgentRunHitlResponseEventStreamUntilTerminal = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let startIndex: number | undefined\n const firstChunk = yield* streamAgentRunHitlResponseInitialChunk(\n request,\n queue,\n nextStartIndex => {\n startIndex = nextStartIndex\n }\n )\n\n if (!firstChunk.terminal && startIndex === undefined) {\n return yield* Effect.fail(missingAgentRunTailIndexError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\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 Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\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.gen(function* () {\n yield* Queue.offer(queue, message)\n\n if (isTerminalAgentEvent(message)) {\n yield* Effect.sync(() => {\n settled = true\n socket.close(1000, 'done')\n })\n yield* Queue.end(queue).pipe(Effect.asVoid)\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 const collectAgentEvents = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Effect,\n Exit,\n Pull,\n Queue,\n Ref,\n Result,\n Scope,\n Stream,\n type Layer\n} 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 isTerminalAgentEvent\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 startIndex?: number\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunHitlResponseEventsRequest = {\n readonly endpoint: string\n readonly hitlResponses: ReadonlyArray<HitlResponse>\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentEventHandler = (event: AgentEventType, count: number) => void\n\nexport type AgentRunIdleReconnectOptions = {\n readonly idleTimeoutMs: number\n readonly maxAttempts?: number\n}\n\nexport type AgentRunContinuationOptions = {\n readonly continuationLimit?: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}\n\nexport type StreamAgentEventsUntilTerminalRequest = StreamAgentEventsRequest &\n AgentRunContinuationOptions & {\n readonly runEndpoint?: (runId: string) => string\n readonly onRunId?: (runId: string) => void\n }\n\nexport type StreamAgentRunEventsUntilTerminalRequest = StreamAgentRunEventsRequest &\n AgentRunContinuationOptions\n\nexport type StreamAgentRunHitlResponseEventsUntilTerminalRequest =\n StreamAgentRunHitlResponseEventsRequest & AgentRunContinuationOptions\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'\nconst defaultRunContinuationLimit = 120\nconst defaultIdleReconnectMaxAttempts = 12\nconst relativeEndpointBase = 'http://yolk.local'\n\nconst headerValue = (headers: Readonly<Record<string, string | undefined>>, name: string) => {\n const direct = headers[name]\n\n if (direct !== undefined) {\n return direct\n }\n\n const normalizedName = name.toLowerCase()\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === normalizedName) {\n return value\n }\n }\n\n return undefined\n}\n\nconst nonEmptyHeaderValue = (\n headers: Readonly<Record<string, string | undefined>>,\n name: string\n) => {\n const value = headerValue(headers, name)?.trim()\n\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nconst safeIntegerPattern = /^-?(0|[1-9]\\d*)$/\n\nconst parseSafeInteger = (raw: string) => {\n const value = raw.trim()\n\n if (!safeIntegerPattern.test(value)) {\n return undefined\n }\n\n const parsed = Number.parseInt(value, 10)\n\n return Number.isSafeInteger(parsed) ? parsed : undefined\n}\n\nexport const agentRunIdFromHeaders = (headers: Readonly<Record<string, string | undefined>>) =>\n nonEmptyHeaderValue(headers, 'x-workflow-run-id')\n\nexport const agentRunStreamTailIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const raw = nonEmptyHeaderValue(headers, 'x-workflow-stream-tail-index')\n if (raw === undefined) return undefined\n\n const parsed = parseSafeInteger(raw)\n\n return parsed !== undefined && parsed >= -1 ? parsed : undefined\n}\n\nexport const agentRunStreamStartIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const tailIndex = agentRunStreamTailIndexFromHeaders(headers)\n\n return tailIndex === undefined ? undefined : tailIndex + 1\n}\n\nexport const agentRunEndpointWithStartIndex = (endpoint: string, startIndex?: number) => {\n if (startIndex === undefined) return endpoint\n\n validateAgentRunStartIndex(startIndex)\n\n const parsed = parseEndpointOrThrow(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n}\n\ntype ParsedEndpoint = {\n readonly url: URL\n readonly absolute: boolean\n readonly leadingSlash: boolean\n}\n\nconst absoluteUrlPattern = /^[A-Za-z][A-Za-z\\d+.-]*:/\n\nconst invalidAgentRunEndpointError = (endpoint: string) =>\n new AgentTransportError({\n message: 'Invalid agent run endpoint',\n cause: endpoint\n })\n\nconst parseEndpoint = (endpoint: string): ParsedEndpoint | undefined =>\n Result.try(() => ({\n url: new URL(endpoint, relativeEndpointBase),\n absolute: absoluteUrlPattern.test(endpoint),\n leadingSlash: endpoint.startsWith('/')\n })).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: parsed => parsed\n })\n )\n\nconst parseEndpointOrThrow = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n if (parsed !== undefined) {\n return parsed\n }\n\n throw invalidAgentRunEndpointError(endpoint)\n}\n\nconst parseEndpointEffect = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n return parsed === undefined\n ? Effect.fail(invalidAgentRunEndpointError(endpoint))\n : Effect.succeed(parsed)\n}\n\nconst serializeEndpoint = (endpoint: ParsedEndpoint) => {\n if (endpoint.absolute) {\n return endpoint.url.toString()\n }\n\n const serialized = `${endpoint.url.pathname}${endpoint.url.search}${endpoint.url.hash}`\n\n return endpoint.leadingSlash ? serialized : serialized.slice(1)\n}\n\nconst appendEncodedPathSegment = (endpoint: string, segment: string) => {\n const parsed = parseEndpointOrThrow(endpoint)\n\n const basePath = parsed.url.pathname.endsWith('/')\n ? parsed.url.pathname.slice(0, -1)\n : parsed.url.pathname\n\n parsed.url.pathname = `${basePath}/${encodeURIComponent(segment)}`\n\n return serializeEndpoint(parsed)\n}\n\nconst defaultAgentRunEndpoint = (endpoint: string | undefined, runId: string) =>\n appendEncodedPathSegment(endpoint ?? defaultEndpoint, runId)\n\nconst invalidAgentRunContinuationLimitError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run continuation limit',\n cause: limit\n })\n\nconst agentRunContinuationLimitEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultRunContinuationLimit)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidAgentRunContinuationLimitError(limit))\n}\n\nconst invalidIdleReconnectMaxAttemptsError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect max attempts',\n cause: limit\n })\n\nconst idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultIdleReconnectMaxAttempts)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))\n}\n\nconst validateAgentRunIdleReconnectEffect = (options: AgentRunIdleReconnectOptions | undefined) => {\n if (options === undefined) return Effect.void\n\n if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect timeout',\n cause: options.idleTimeoutMs\n })\n )\n }\n\n return idleReconnectMaxAttemptsEffect(options.maxAttempts).pipe(Effect.asVoid)\n}\n\nconst validateAgentRunStartIndex = (startIndex: number | undefined) => {\n if (startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)) {\n return\n }\n\n throw invalidAgentRunStartIndexError(startIndex)\n}\n\nconst invalidAgentRunStartIndexError = (startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run stream start index',\n cause: startIndex\n })\n\nconst validateAgentRunStartIndexEffect = (startIndex: number | undefined) =>\n startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)\n ? Effect.void\n : Effect.fail(invalidAgentRunStartIndexError(startIndex))\n\nconst agentRunEndpointWithStartIndexEffect = (endpoint: string, startIndex: number | undefined) =>\n Effect.gen(function* () {\n if (startIndex === undefined) return endpoint\n\n yield* validateAgentRunStartIndexEffect(startIndex)\n\n const parsed = yield* parseEndpointEffect(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n })\n\nconst nextAgentRunStartIndex = (startIndex: number | undefined, count: number) =>\n (startIndex ?? 0) + count\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 makeHttpRunHitlResponseRequest = (request: StreamAgentRunHitlResponseEventsRequest) =>\n encodeJsonString(\n { hitlResponses: request.hitlResponses },\n 'Could not serialize agent run HITL response'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint).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(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\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 endpoint = yield* agentRunEndpointWithStartIndexEffect(\n request.endpoint,\n request.startIndex\n )\n\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(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(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\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 requestAgentRunHitlResponse = (request: StreamAgentRunHitlResponseEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRunHitlResponseRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run HITL request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run HITL request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nexport const cancelAgentRun = (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 responseToLineStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0)\n )\n\nconst closeScope = (scope: Scope.Scope) => Scope.close(scope, Exit.succeed(undefined))\n\n// Protocol-terminal events finish the consumer stream, but HTTP bodies must still\n// drain to EOF so server runtimes do not observe client-side response aborts.\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const callbackScope = yield* Scope.Scope\n // Own the response stream in a scope that can outlive the consumer after a\n // terminal event; before terminal, consumer cancellation closes it.\n const responseScope = yield* Scope.make()\n const responseScopeClosed = yield* Ref.make(false)\n const terminalReached = yield* Ref.make(false)\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\n const closeResponseScope = Effect.gen(function* () {\n const closed = yield* Ref.get(responseScopeClosed)\n\n if (!closed) {\n yield* Ref.set(responseScopeClosed, true)\n yield* closeScope(responseScope)\n }\n })\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n const drainResponse = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: () => drainResponse(),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.void\n })\n const startTerminalDrain = Effect.gen(function* () {\n yield* Ref.set(terminalReached, true)\n yield* endQueue\n yield* drainResponse().pipe(\n Effect.catch(() => Effect.void),\n Effect.ensuring(closeResponseScope),\n Effect.forkDetach({ startImmediately: true }),\n Effect.asVoid\n )\n })\n const emitLines = (lines: ReadonlyArray<string>): Effect.Effect<void, AgentTransportError> =>\n Effect.gen(function* () {\n for (const line of lines) {\n const event = yield* parseAgentEventLine(line)\n\n yield* Queue.offer(queue, event)\n\n if (isTerminalAgentEvent(event)) {\n yield* startTerminalDrain\n return\n }\n }\n\n yield* run()\n })\n const run = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: emitLines,\n onFailure: failQueue,\n onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))\n })\n\n yield* Scope.addFinalizer(\n callbackScope,\n Effect.gen(function* () {\n const terminal = yield* Ref.get(terminalReached)\n\n if (!terminal) {\n yield* closeResponseScope\n }\n })\n )\n\n yield* run()\n }).pipe(\n // Callback producers must settle their queue on defects too, without turning\n // programmer failures into recoverable AgentTransportErrors.\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunHitlResponseEventStream = (\n request: StreamAgentRunHitlResponseEventsRequest\n) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunHitlResponse(request)).pipe(\n Stream.flatMap(responseToEventStream)\n ),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (request: SubmitToolApprovalResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\ntype AgentEventChunkResult = {\n readonly count: number\n readonly terminal: boolean\n readonly idle: boolean\n}\n\ntype AgentEventPullResult =\n | { readonly _tag: 'Events'; readonly events: Iterable<AgentEventType> }\n | { readonly _tag: 'Done' }\n | { readonly _tag: 'Idle' }\n\ntype AgentRunContinuationInput = AgentRunContinuationOptions & {\n readonly endpoint: string | undefined\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly terminal: boolean\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nconst missingAgentRunContinuationEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run continuation failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst exhaustedAgentRunContinuationLimitError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run continuation limit reached before a terminal event',\n cause: { limit }\n })\n\nconst noProgressAgentRunContinuationError = (endpoint: string, startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Agent run continuation made no progress before a terminal event',\n cause: { endpoint, startIndex }\n })\n\nconst noProgressAgentRunContinuationDelayMs = 250\n\nconst idleReconnectLimitReachedError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run idle reconnect limit reached before a terminal event',\n cause: { limit }\n })\n\nconst missingIdleReconnectRunEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run idle reconnect failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst waitForAgentRunContinuationProgress = (signal: AbortSignal | undefined) => {\n const sleep = Effect.sleep(`${noProgressAgentRunContinuationDelayMs} millis`)\n\n return signal === undefined ? sleep : sleep.pipe(Effect.raceFirst(abortSignalEffect(signal)))\n}\n\nconst missingAgentRunTailIndexError = () =>\n new AgentTransportError({\n message: 'Agent run HITL response missing x-workflow-stream-tail-index',\n cause: 'missing_tail_index'\n })\n\nconst pullAgentEventChunk = <A extends Iterable<AgentEventType>>(\n pull: Pull.Pull<A, AgentTransportError, void, never>,\n idleReconnect: AgentRunIdleReconnectOptions | undefined\n) => {\n const pullEvents: Effect.Effect<AgentEventPullResult, AgentTransportError, never> =\n Pull.matchEffect(pull, {\n onSuccess: events => Effect.succeed({ _tag: 'Events', events }),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed({ _tag: 'Done' })\n })\n\n if (idleReconnect === undefined) return pullEvents\n\n return pullEvents.pipe(\n Effect.raceFirst(\n Effect.sleep(`${idleReconnect.idleTimeoutMs} millis`).pipe(\n Effect.map((): AgentEventPullResult => ({ _tag: 'Idle' }))\n )\n )\n )\n}\n\nconst drainAgentEventStream = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly stream: Stream.Stream<AgentEventType, AgentTransportError, never>\n readonly countOffset: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n const scope = yield* Scope.make()\n const pull = yield* Channel.toPullScoped(Stream.toChannel(input.stream), scope)\n const run = (state: {\n readonly count: number\n readonly terminal: boolean\n }): Effect.Effect<AgentEventChunkResult, AgentTransportError, never> =>\n Effect.gen(function* () {\n const pulled = yield* pullAgentEventChunk(pull, input.idleReconnect)\n\n switch (pulled._tag) {\n case 'Idle':\n return { count: state.count, terminal: state.terminal, idle: true }\n case 'Done':\n return { count: state.count, terminal: state.terminal, idle: false }\n case 'Events': {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of pulled.events) {\n count += 1\n terminal = terminal || isTerminalAgentEvent(event)\n yield* Effect.sync(() => input.onEvent?.(event, input.countOffset + count))\n yield* Queue.offer(input.queue, event)\n\n if (terminal) return { count, terminal, idle: false }\n }\n\n return yield* run({ count, terminal })\n }\n }\n })\n\n return yield* run({ count: 0, terminal: false }).pipe(Effect.ensuring(closeScope(scope)))\n })\n\nconst streamAgentRunContinuationChunk = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly endpoint: string\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly signal: AbortSignal | undefined\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n readonly onEvent?: StreamAgentEventHandler\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue: input.queue,\n stream: streamAgentRunEventStream({\n endpoint: input.endpoint,\n startIndex: input.startIndex,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse\n }),\n countOffset: input.countOffset,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\nconst streamAgentRunContinuations = (\n input: AgentRunContinuationInput,\n queue: Queue.Enqueue<AgentEventType>\n): Effect.Effect<void, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n let totalCount = input.countOffset\n let terminal = input.terminal\n let startIndex = input.startIndex\n const limit = yield* agentRunContinuationLimitEffect(input.continuationLimit)\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n let idleReconnects = 0\n\n if (terminal) {\n return\n }\n\n if (input.endpoint === undefined) {\n return yield* Effect.fail(missingAgentRunContinuationEndpointError())\n }\n\n let continuation = 0\n while (continuation < limit) {\n const endpoint = input.endpoint\n const chunkStartIndex = startIndex\n\n const chunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint,\n startIndex: chunkStartIndex,\n countOffset: totalCount,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\n if (chunk.idle) {\n if (idleReconnectLimit !== undefined && idleReconnects >= idleReconnectLimit) {\n return yield* Effect.fail(idleReconnectLimitReachedError(idleReconnectLimit))\n }\n\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n idleReconnects += 1\n continue\n }\n\n continuation += 1\n\n if (chunk.count === 0 && !chunk.terminal) {\n if (continuation >= limit) {\n return yield* Effect.fail(noProgressAgentRunContinuationError(endpoint, startIndex))\n }\n\n yield* waitForAgentRunContinuationProgress(input.signal)\n continue\n }\n\n terminal = chunk.terminal\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n\n if (terminal) {\n return\n }\n }\n\n return yield* Effect.fail(exhaustedAgentRunContinuationLimitError(limit))\n })\n\nexport const streamAgentEventStreamUntilTerminal = (\n request: StreamAgentEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let runEndpoint: string | undefined\n let startIndex: number | undefined\n const firstChunk = yield* drainAgentEventStream({\n queue,\n stream: streamAgentEventStream({\n ...request,\n onResponse: response => {\n startIndex = agentRunStreamStartIndexFromHeaders(response.headers)\n const runId = agentRunIdFromHeaders(response.headers)\n if (runId !== undefined) {\n runEndpoint =\n request.runEndpoint?.(runId) ?? defaultAgentRunEndpoint(request.endpoint, runId)\n request.onRunId?.(runId)\n }\n\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n if (firstChunk.idle && runEndpoint === undefined) {\n return yield* Effect.fail(missingIdleReconnectRunEndpointError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: runEndpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\n\nexport const streamAgentRunEventStreamUntilTerminal = (\n request: StreamAgentRunEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n yield* validateAgentRunStartIndexEffect(request.startIndex)\n const firstChunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint: request.endpoint,\n startIndex: request.startIndex,\n countOffset: 0,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(request.startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\n\nconst streamAgentRunHitlResponseInitialChunk = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest,\n queue: Queue.Enqueue<AgentEventType>,\n setStartIndex: (startIndex: number | undefined) => void\n): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue,\n stream: streamAgentRunHitlResponseEventStream({\n ...request,\n onResponse: response => {\n setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\nexport const streamAgentRunHitlResponseEventStreamUntilTerminal = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let startIndex: number | undefined\n const firstChunk = yield* streamAgentRunHitlResponseInitialChunk(\n request,\n queue,\n nextStartIndex => {\n startIndex = nextStartIndex\n }\n )\n\n if (!firstChunk.terminal && startIndex === undefined) {\n return yield* Effect.fail(missingAgentRunTailIndexError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\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 Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\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.gen(function* () {\n yield* Queue.offer(queue, message)\n\n if (isTerminalAgentEvent(message)) {\n yield* Effect.sync(() => {\n settled = true\n socket.close(1000, 'done')\n })\n yield* Queue.end(queue).pipe(Effect.asVoid)\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 const collectAgentEvents = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Effect, Layer, Redacted } from "effect";
2
+ import { AgentReasoningEffort } from "@yolk-sdk/agent/protocol";
2
3
  import { HttpClient } from "effect/unstable/http";
3
4
  import { LLMError, LLMProvider, LLMRequest } from "@yolk-sdk/agent/loop";
4
5
 
@@ -11,8 +12,9 @@ type OpenAiProviderConfig = {
11
12
  readonly chatCompletionsUrl?: string;
12
13
  readonly maxCompletionTokens: number; /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */
13
14
  readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens';
14
- readonly extraHeaders?: Readonly<Record<string, string>>; /** Adds compatible endpoint extensions; canonical model/messages/limit/stream fields win. */
15
- readonly extraBody?: Readonly<Record<string, unknown>>; /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */
15
+ readonly extraHeaders?: Readonly<Record<string, string>>; /** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */
16
+ readonly extraBody?: Readonly<Record<string, unknown>>; /** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */
17
+ readonly reasoningEffortFormat?: 'reasoning-object'; /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */
16
18
  readonly providerIdentity?: OpenAiProviderIdentity;
17
19
  readonly apiKey: Redacted.Redacted<string>;
18
20
  };
@@ -64,6 +66,9 @@ type OpenAiRequestBody = {
64
66
  readonly max_completion_tokens?: number;
65
67
  readonly max_tokens?: number;
66
68
  readonly stream: false;
69
+ readonly reasoning?: {
70
+ readonly effort: AgentReasoningEffort;
71
+ };
67
72
  readonly tools?: ReadonlyArray<OpenAiTool>;
68
73
  readonly parallel_tool_calls?: true;
69
74
  };
@@ -71,6 +76,7 @@ type OpenAiRequestBodyConfig = {
71
76
  readonly maxCompletionTokens: number;
72
77
  readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens';
73
78
  readonly extraBody?: Readonly<Record<string, unknown>>;
79
+ readonly reasoningEffortFormat?: 'reasoning-object';
74
80
  readonly providerName?: string;
75
81
  };
76
82
  declare const toOpenAiRequestBody: (request: LLMRequest, config: OpenAiRequestBodyConfig) => Effect.Effect<OpenAiRequestBody, LLMError>;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.mts","names":[],"sources":["../../../src/providers/openai/provider.ts"],"mappings":";;;;;KA6CK,sBAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,oBAAA;EAAA,SACD,kBAAA;EAAA,SACA,mBAAA,UAFC;EAAA,SAID,oBAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA,mBAAA;EAAA,SAExB,SAAA,GAAY,QAAA,CAAS,MAAA,oBAAA;EAAA,SAErB,gBAAA,GAAmB,sBAAA;EAAA,SACnB,MAAA,EAAQ,QAAA,CAAS,QAAA;AAAA;AAAA,KAGvB,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAA;IAAA,SACE,GAAA;EAAA;AAAA;AAAA,KAIR,iBAAA,YAA6B,aAAA,CAAc,qBAAA,GAAwB,sBAAA;AAAA,KAEnE,cAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,SAAA;EAAA;AAAA;AAAA,KAIR,aAAA;EAAA,SACU,IAAA;EAAA,SAAyB,OAAA;AAAA;EAAA,SACzB,IAAA;EAAA,SAAuB,OAAA,EAAS,iBAAA;AAAA;EAAA,SAEhC,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,aAAA,CAAc,cAAA;AAAA;EAAA,SAE3B,IAAA;EAAA,SAAuB,YAAA;EAAA,SAA+B,OAAA;AAAA;AAAA,KAEhE,UAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA;AAAA;AAAA,KAIR,iBAAA;EAAA,SACM,KAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,aAAA;EAAA,SACxB,qBAAA;EAAA,SACA,UAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,UAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,KAGN,uBAAA;EAAA,SACM,mBAAA;EAAA,SACA,oBAAA;EAAA,SACA,SAAA,GAAY,QAAQ,CAAC,MAAA;EAAA,SACrB,YAAA;AAAA;AAAA,cA8QE,mBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA,EAAQ,uBAAA,KACP,MAAA,CAAO,MAAA,CAAO,iBAAA,EAAmB,QAAA;AAAA,cAwOvB,uBAAA,GAA2B,MAAA,EAAQ,oBAAA,KAAoB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA;AAAA,cAevD,mBAAA,EAAmB,KAAA,CAAA,KAAA,CAAA,WAAA,EAAA,QAAA"}
1
+ {"version":3,"file":"provider.d.mts","names":[],"sources":["../../../src/providers/openai/provider.ts"],"mappings":";;;;;;KA8CK,sBAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,oBAAA;EAAA,SACD,kBAAA;EAAA,SACA,mBAAA,UAFC;EAAA,SAID,oBAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA,mBAAA;EAAA,SAExB,SAAA,GAAY,QAAA,CAAS,MAAA,oBAAA;EAAA,SAErB,qBAAA,uBAEmB;EAAA,SAAnB,gBAAA,GAAmB,sBAAA;EAAA,SACnB,MAAA,EAAQ,QAAA,CAAS,QAAA;AAAA;AAAA,KAGvB,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAA;IAAA,SACE,GAAA;EAAA;AAAA;AAAA,KAIR,iBAAA,YAA6B,aAAA,CAAc,qBAAA,GAAwB,sBAAA;AAAA,KAEnE,cAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,SAAA;EAAA;AAAA;AAAA,KAIR,aAAA;EAAA,SACU,IAAA;EAAA,SAAyB,OAAA;AAAA;EAAA,SACzB,IAAA;EAAA,SAAuB,OAAA,EAAS,iBAAA;AAAA;EAAA,SAEhC,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,aAAA,CAAc,cAAA;AAAA;EAAA,SAE3B,IAAA;EAAA,SAAuB,YAAA;EAAA,SAA+B,OAAA;AAAA;AAAA,KAEhE,UAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA;AAAA;AAAA,KAIR,iBAAA;EAAA,SACM,KAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,aAAA;EAAA,SACxB,qBAAA;EAAA,SACA,UAAA;EAAA,SACA,MAAA;EAAA,SACA,SAAA;IAAA,SACE,MAAA,EAAQ,oBAAA;EAAA;EAAA,SAEV,KAAA,GAAQ,aAAA,CAAc,UAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,KAGN,uBAAA;EAAA,SACM,mBAAA;EAAA,SACA,oBAAA;EAAA,SACA,SAAA,GAAY,QAAQ,CAAC,MAAA;EAAA,SACrB,qBAAA;EAAA,SACA,YAAA;AAAA;AAAA,cA8QE,mBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA,EAAQ,uBAAA,KACP,MAAA,CAAO,MAAA,CAAO,iBAAA,EAAmB,QAAA;AAAA,cAgPvB,uBAAA,GAA2B,MAAA,EAAQ,oBAAA,KAAoB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA;AAAA,cAevD,mBAAA,EAAmB,KAAA,CAAA,KAAA,CAAA,WAAA,EAAA,QAAA"}
@@ -161,8 +161,10 @@ const toOpenAiRequestBody = (request, config) => Effect.gen(function* () {
161
161
  content: request.systemPrompt
162
162
  }, ...yield* Effect.forEach(request.messages, (message) => toOpenAiMessage(message, providerName))];
163
163
  const completionTokenLimit = config.completionTokenField === "max_tokens" ? { max_tokens: config.maxCompletionTokens } : { max_completion_tokens: config.maxCompletionTokens };
164
+ const reasoning = config.reasoningEffortFormat === "reasoning-object" && request.reasoningEffort !== void 0 ? { reasoning: { effort: request.reasoningEffort } } : {};
164
165
  const body = {
165
166
  ...config.extraBody,
167
+ ...reasoning,
166
168
  model: request.model,
167
169
  messages,
168
170
  ...completionTokenLimit,
@@ -233,7 +235,8 @@ const sendOpenAiRequest = (config, request, client) => Effect.gen(function* () {
233
235
  maxCompletionTokens: config.maxCompletionTokens,
234
236
  providerName: providerIdentity.name,
235
237
  ...config.completionTokenField === void 0 ? {} : { completionTokenField: config.completionTokenField },
236
- ...config.extraBody === void 0 ? {} : { extraBody: config.extraBody }
238
+ ...config.extraBody === void 0 ? {} : { extraBody: config.extraBody },
239
+ ...config.reasoningEffortFormat === void 0 ? {} : { reasoningEffortFormat: config.reasoningEffortFormat }
237
240
  })), `Could not serialize ${providerIdentity.name} request`);
238
241
  const httpRequest = HttpClientRequest.post(config.chatCompletionsUrl ?? "https://api.openai.com/v1/chat/completions").pipe(HttpClientRequest.setHeaders({
239
242
  ...config.extraHeaders,
@@ -1 +1 @@
1
- {"version":3,"file":"provider.mjs","names":["LLMTextDelta"],"sources":["../../../src/providers/openai/provider.ts"],"sourcesContent":["import { Config, Context, Effect, Layer, Option, Redacted, Stream } 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 ToolCall,\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n attachmentSourceText,\n attachmentSourceUrl,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type Content,\n type ContentPart,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\ntype OpenAiProviderIdentity = {\n readonly id: string\n readonly name: string\n}\n\nexport type OpenAiProviderConfig = {\n readonly chatCompletionsUrl?: string\n readonly maxCompletionTokens: number\n /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Adds compatible endpoint extensions; canonical model/messages/limit/stream fields win. */\n readonly extraBody?: Readonly<Record<string, unknown>>\n /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */\n readonly providerIdentity?: OpenAiProviderIdentity\n readonly apiKey: Redacted.Redacted<string>\n}\n\ntype OpenAiTextContentPart = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype OpenAiImageContentPart = {\n readonly type: 'image_url'\n readonly image_url: {\n readonly url: string\n }\n}\n\ntype OpenAiUserContent = string | ReadonlyArray<OpenAiTextContentPart | OpenAiImageContentPart>\n\ntype OpenAiToolCall = {\n readonly id: string\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly arguments: string\n }\n}\n\ntype OpenAiMessage =\n | { readonly role: 'system'; readonly content: string }\n | { readonly role: 'user'; readonly content: OpenAiUserContent }\n | {\n readonly role: 'assistant'\n readonly content: string | null\n readonly tool_calls?: ReadonlyArray<OpenAiToolCall>\n }\n | { readonly role: 'tool'; readonly tool_call_id: string; readonly content: string }\n\ntype OpenAiTool = {\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly description: string\n readonly parameters: unknown\n }\n}\n\ntype OpenAiRequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<OpenAiMessage>\n readonly max_completion_tokens?: number\n readonly max_tokens?: number\n readonly stream: false\n readonly tools?: ReadonlyArray<OpenAiTool>\n readonly parallel_tool_calls?: true\n}\n\ntype OpenAiRequestBodyConfig = {\n readonly maxCompletionTokens: number\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraBody?: Readonly<Record<string, unknown>>\n readonly providerName?: string\n}\n\nconst defaultOpenAiProviderIdentity: OpenAiProviderIdentity = {\n id: 'openai',\n name: 'OpenAI'\n}\n\nclass OpenAiFunctionResponse extends Schema.Class<OpenAiFunctionResponse>('OpenAiFunctionResponse')(\n {\n name: Schema.String,\n arguments: Schema.String\n }\n) {}\n\nclass OpenAiToolCallResponse extends Schema.Class<OpenAiToolCallResponse>('OpenAiToolCallResponse')(\n {\n id: Schema.String,\n type: Schema.Literals(['function']),\n function: OpenAiFunctionResponse\n }\n) {}\n\nclass OpenAiMessageResponse extends Schema.Class<OpenAiMessageResponse>('OpenAiMessageResponse')({\n content: Schema.NullOr(Schema.String),\n tool_calls: Schema.optional(Schema.Array(OpenAiToolCallResponse))\n}) {}\n\nclass OpenAiChoiceResponse extends Schema.Class<OpenAiChoiceResponse>('OpenAiChoiceResponse')({\n message: OpenAiMessageResponse,\n finish_reason: Schema.optional(Schema.NullOr(Schema.String))\n}) {}\n\nclass OpenAiPromptTokensDetails extends Schema.Class<OpenAiPromptTokensDetails>(\n 'OpenAiPromptTokensDetails'\n)({\n cached_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiCompletionTokensDetails extends Schema.Class<OpenAiCompletionTokensDetails>(\n 'OpenAiCompletionTokensDetails'\n)({\n reasoning_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiUsageResponse extends Schema.Class<OpenAiUsageResponse>('OpenAiUsageResponse')({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n prompt_tokens_details: Schema.optional(OpenAiPromptTokensDetails),\n completion_tokens_details: Schema.optional(OpenAiCompletionTokensDetails)\n}) {}\n\nclass OpenAiChatCompletionResponse extends Schema.Class<OpenAiChatCompletionResponse>(\n 'OpenAiChatCompletionResponse'\n)({\n choices: Schema.Array(OpenAiChoiceResponse),\n usage: Schema.optional(OpenAiUsageResponse)\n}) {}\n\nclass OpenAiConfig extends Context.Service<OpenAiConfig, OpenAiProviderConfig>()(\n '@app/OpenAiConfig'\n) {}\n\nconst OpenAiConfigLayer = Layer.effect(\n OpenAiConfig,\n Effect.gen(function* () {\n const apiKey = yield* Config.redacted('OPENAI_API_KEY')\n const maxCompletionTokens = yield* Config.int('OPENAI_MAX_COMPLETION_TOKENS')\n return { apiKey, maxCompletionTokens }\n }).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'OpenAI provider environment configuration missing',\n retryable: false\n })\n )\n )\n)\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string, providerName: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the ${providerName} provider yet`,\n retryable: false\n })\n\nconst textDocumentToOpenAiPart = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>,\n providerName: string\n) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text', providerName)),\n Effect.flatMap(\n Option.match({\n onNone: () =>\n Effect.fail(unsupportedContentError('Unresolved document source', providerName)),\n onSome: text => {\n const block: OpenAiTextContentPart = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToUserPart = (\n part: ContentPart,\n providerName: string\n): Effect.Effect<OpenAiTextContentPart | OpenAiImageContentPart, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return Option.match(attachmentSourceUrl(part.source, part.mimeType), {\n onNone: () => Effect.fail(unsupportedContentError('Unresolved image source', providerName)),\n onSome: url => Effect.succeed({ type: 'image_url', image_url: { url } })\n })\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToOpenAiPart(part, providerName)\n : Effect.fail(unsupportedContentError('Document', providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio', providerName))\n }\n}\n\nconst contentToUserContent = (\n content: Content,\n providerName: string\n): Effect.Effect<OpenAiUserContent, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToUserPart(part, providerName))\n\nconst contentPartToText = (\n part: ContentPart,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`, providerName))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`, providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`, providerName))\n }\n}\n\nconst contentToText = (\n content: Content,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner, providerName)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst serializeToolArguments = (params: unknown, providerName: string) =>\n encodeJsonString(params, `Could not serialize ${providerName} tool arguments`)\n\nconst toolCallToOpenAiToolCall = (\n call: ToolCall,\n providerName: string\n): Effect.Effect<OpenAiToolCall, LLMError> =>\n Effect.gen(function* () {\n return {\n id: call.id,\n type: 'function',\n function: {\n name: call.name,\n arguments: yield* serializeToolArguments(call.params, providerName)\n }\n }\n })\n\nconst toOpenAiMessage = (\n message: AgentMessage,\n providerName: string\n): Effect.Effect<OpenAiMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToUserContent(\n prependMessageContextToContent(message.content, messageContextText(message)),\n providerName\n )\n }\n case 'Assistant': {\n const content = prependMessageContextToContent(\n assistantContent(message),\n messageContextText(message)\n )\n const toolCalls = yield* Effect.forEach(assistantHostToolCalls(message), call =>\n toolCallToOpenAiToolCall(call, providerName)\n )\n\n if (toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName),\n tool_calls: toolCalls\n }\n }\n\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName)\n }\n }\n case 'ToolResult':\n return {\n role: 'tool',\n tool_call_id: message.toolCallId,\n content: yield* contentToText(\n prependMessageContextToContent(message.content, messageContextText(message)),\n 'Tool result',\n providerName\n )\n }\n }\n })\n\nconst toOpenAiTool = (tool: ToolDef): OpenAiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n})\n\nexport const toOpenAiRequestBody = (\n request: LLMRequest,\n config: OpenAiRequestBodyConfig\n): Effect.Effect<OpenAiRequestBody, LLMError> =>\n Effect.gen(function* () {\n const providerName = config.providerName ?? defaultOpenAiProviderIdentity.name\n\n if (!Number.isSafeInteger(config.maxCompletionTokens) || config.maxCompletionTokens <= 0) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'validation_error',\n message: `${providerName} maxCompletionTokens must be a positive safe integer`,\n retryable: false\n })\n )\n }\n\n yield* validateProviderTranscript(request.messages)\n const systemMessage: OpenAiMessage = { role: 'system', content: request.systemPrompt }\n const requestMessages = yield* Effect.forEach(request.messages, message =>\n toOpenAiMessage(message, providerName)\n )\n const messages = [systemMessage, ...requestMessages]\n\n const completionTokenLimit =\n config.completionTokenField === 'max_tokens'\n ? { max_tokens: config.maxCompletionTokens }\n : { max_completion_tokens: config.maxCompletionTokens }\n const body: OpenAiRequestBody = {\n ...config.extraBody,\n model: request.model,\n messages,\n ...completionTokenLimit,\n stream: false\n }\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toOpenAiTool),\n parallel_tool_calls: true\n }\n })\n\nconst parseToolArguments = (raw: string, providerName: string) =>\n decodeJsonString(raw, `Invalid ${providerName} tool arguments JSON`)\n\nconst toLlmEvents = (\n choice: OpenAiChoiceResponse,\n providerIdentity: OpenAiProviderIdentity\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (choice.finish_reason === 'length' || choice.finish_reason === 'content_filter') {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response stopped with ${choice.finish_reason}`,\n retryable: false,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: 'invalid_response',\n providerCode: choice.finish_reason\n })\n })\n )\n }\n\n const content = choice.message.content ?? ''\n const textEvents = content.length > 0 ? [LLMTextDelta.make({ text: content })] : []\n const toolCallEvents = yield* Effect.forEach(choice.message.tool_calls ?? [], call =>\n parseToolArguments(call.function.arguments, providerIdentity.name).pipe(\n Effect.map(params =>\n LLMToolCall.make({\n call: ToolCall.make({\n id: call.id,\n name: call.function.name,\n params\n })\n })\n )\n )\n )\n\n if (toolCallEvents.length > 0) {\n return [...textEvents, ...toolCallEvents, LLMDone.make({ stopReason: 'tool_use' })]\n }\n\n return [...textEvents, LLMDone.make({ stopReason: 'stop' })]\n })\n\nconst toAgentUsage = (usage: OpenAiUsageResponse) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.prompt_tokens,\n uncached: usage.prompt_tokens - (usage.prompt_tokens_details?.cached_tokens ?? 0),\n cacheRead: usage.prompt_tokens_details?.cached_tokens\n }),\n output: AgentOutputUsage.make({\n total: usage.completion_tokens,\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n text: usage.completion_tokens - (usage.completion_tokens_details?.reasoning_tokens ?? 0)\n })\n })\n\nconst toHttpClientLlmError =\n (providerIdentity: OpenAiProviderIdentity, retryable: boolean) =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${providerIdentity.name} request failed: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: retryable ? 'network' : 'unknown'\n })\n })\n\nconst parseOpenAiResponseJson = (\n response: HttpClientResponse.HttpClientResponse,\n providerName: string\n): Effect.Effect<unknown, LLMError> =>\n response.json.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Could not parse ${providerName} response JSON: ${error.message}`,\n retryable: false\n })\n )\n )\n\nconst sendOpenAiRequest = (\n config: OpenAiProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const providerIdentity = config.providerIdentity ?? defaultOpenAiProviderIdentity\n const body = yield* toOpenAiRequestBody(request, {\n maxCompletionTokens: config.maxCompletionTokens,\n providerName: providerIdentity.name,\n ...(config.completionTokenField === undefined\n ? {}\n : { completionTokenField: config.completionTokenField }),\n ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody })\n })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n `Could not serialize ${providerIdentity.name} request`\n )\n\n const httpRequest = HttpClientRequest.post(\n config.chatCompletionsUrl ?? 'https://api.openai.com/v1/chat/completions'\n ).pipe(\n HttpClientRequest.setHeaders({\n ...config.extraHeaders,\n accept: 'application/json',\n authorization: `Bearer ${Redacted.value(config.apiKey)}`,\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError(providerIdentity, true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read ${providerIdentity.name} error body: ${error.message}`,\n retryable: false\n })\n )\n )\n\n const provider = classifyProviderFailure({\n provider: providerIdentity.id,\n status: response.status,\n headers: response.headers,\n body: errorText\n })\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message: `${providerIdentity.name} returned ${response.status}`,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n const json = yield* parseOpenAiResponseJson(response, providerIdentity.name)\n const parsed = yield* Schema.decodeUnknownEffect(OpenAiChatCompletionResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid ${providerIdentity.name} response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n const choice = parsed.choices[0]\n\n if (choice === undefined) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response contained no choices`,\n retryable: false\n })\n )\n }\n\n const events = yield* toLlmEvents(choice, providerIdentity)\n\n if (parsed.usage === undefined) {\n return events\n }\n\n return [...events, LLMUsage.make({ usage: toAgentUsage(parsed.usage) })]\n }).pipe(\n Effect.withSpan(`${config.providerIdentity?.id ?? defaultOpenAiProviderIdentity.id}.stream`)\n )\n\nexport const makeOpenAiProviderLayer = (config: OpenAiProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n )\n\nexport const OpenAiProviderLayer = Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const config = yield* OpenAiConfig\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n).pipe(Layer.provide(Layer.mergeAll(OpenAiConfigLayer, FetchHttpClient.layer)))\n"],"mappings":"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"}
1
+ {"version":3,"file":"provider.mjs","names":["LLMTextDelta"],"sources":["../../../src/providers/openai/provider.ts"],"sourcesContent":["import { Config, Context, Effect, Layer, Option, Redacted, Stream } 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 ToolCall,\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n attachmentSourceText,\n attachmentSourceUrl,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type AgentReasoningEffort,\n type Content,\n type ContentPart,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\ntype OpenAiProviderIdentity = {\n readonly id: string\n readonly name: string\n}\n\nexport type OpenAiProviderConfig = {\n readonly chatCompletionsUrl?: string\n readonly maxCompletionTokens: number\n /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */\n readonly extraBody?: Readonly<Record<string, unknown>>\n /** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */\n readonly reasoningEffortFormat?: 'reasoning-object'\n /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */\n readonly providerIdentity?: OpenAiProviderIdentity\n readonly apiKey: Redacted.Redacted<string>\n}\n\ntype OpenAiTextContentPart = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype OpenAiImageContentPart = {\n readonly type: 'image_url'\n readonly image_url: {\n readonly url: string\n }\n}\n\ntype OpenAiUserContent = string | ReadonlyArray<OpenAiTextContentPart | OpenAiImageContentPart>\n\ntype OpenAiToolCall = {\n readonly id: string\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly arguments: string\n }\n}\n\ntype OpenAiMessage =\n | { readonly role: 'system'; readonly content: string }\n | { readonly role: 'user'; readonly content: OpenAiUserContent }\n | {\n readonly role: 'assistant'\n readonly content: string | null\n readonly tool_calls?: ReadonlyArray<OpenAiToolCall>\n }\n | { readonly role: 'tool'; readonly tool_call_id: string; readonly content: string }\n\ntype OpenAiTool = {\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly description: string\n readonly parameters: unknown\n }\n}\n\ntype OpenAiRequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<OpenAiMessage>\n readonly max_completion_tokens?: number\n readonly max_tokens?: number\n readonly stream: false\n readonly reasoning?: {\n readonly effort: AgentReasoningEffort\n }\n readonly tools?: ReadonlyArray<OpenAiTool>\n readonly parallel_tool_calls?: true\n}\n\ntype OpenAiRequestBodyConfig = {\n readonly maxCompletionTokens: number\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraBody?: Readonly<Record<string, unknown>>\n readonly reasoningEffortFormat?: 'reasoning-object'\n readonly providerName?: string\n}\n\nconst defaultOpenAiProviderIdentity: OpenAiProviderIdentity = {\n id: 'openai',\n name: 'OpenAI'\n}\n\nclass OpenAiFunctionResponse extends Schema.Class<OpenAiFunctionResponse>('OpenAiFunctionResponse')(\n {\n name: Schema.String,\n arguments: Schema.String\n }\n) {}\n\nclass OpenAiToolCallResponse extends Schema.Class<OpenAiToolCallResponse>('OpenAiToolCallResponse')(\n {\n id: Schema.String,\n type: Schema.Literals(['function']),\n function: OpenAiFunctionResponse\n }\n) {}\n\nclass OpenAiMessageResponse extends Schema.Class<OpenAiMessageResponse>('OpenAiMessageResponse')({\n content: Schema.NullOr(Schema.String),\n tool_calls: Schema.optional(Schema.Array(OpenAiToolCallResponse))\n}) {}\n\nclass OpenAiChoiceResponse extends Schema.Class<OpenAiChoiceResponse>('OpenAiChoiceResponse')({\n message: OpenAiMessageResponse,\n finish_reason: Schema.optional(Schema.NullOr(Schema.String))\n}) {}\n\nclass OpenAiPromptTokensDetails extends Schema.Class<OpenAiPromptTokensDetails>(\n 'OpenAiPromptTokensDetails'\n)({\n cached_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiCompletionTokensDetails extends Schema.Class<OpenAiCompletionTokensDetails>(\n 'OpenAiCompletionTokensDetails'\n)({\n reasoning_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiUsageResponse extends Schema.Class<OpenAiUsageResponse>('OpenAiUsageResponse')({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n prompt_tokens_details: Schema.optional(OpenAiPromptTokensDetails),\n completion_tokens_details: Schema.optional(OpenAiCompletionTokensDetails)\n}) {}\n\nclass OpenAiChatCompletionResponse extends Schema.Class<OpenAiChatCompletionResponse>(\n 'OpenAiChatCompletionResponse'\n)({\n choices: Schema.Array(OpenAiChoiceResponse),\n usage: Schema.optional(OpenAiUsageResponse)\n}) {}\n\nclass OpenAiConfig extends Context.Service<OpenAiConfig, OpenAiProviderConfig>()(\n '@app/OpenAiConfig'\n) {}\n\nconst OpenAiConfigLayer = Layer.effect(\n OpenAiConfig,\n Effect.gen(function* () {\n const apiKey = yield* Config.redacted('OPENAI_API_KEY')\n const maxCompletionTokens = yield* Config.int('OPENAI_MAX_COMPLETION_TOKENS')\n return { apiKey, maxCompletionTokens }\n }).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'OpenAI provider environment configuration missing',\n retryable: false\n })\n )\n )\n)\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string, providerName: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the ${providerName} provider yet`,\n retryable: false\n })\n\nconst textDocumentToOpenAiPart = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>,\n providerName: string\n) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text', providerName)),\n Effect.flatMap(\n Option.match({\n onNone: () =>\n Effect.fail(unsupportedContentError('Unresolved document source', providerName)),\n onSome: text => {\n const block: OpenAiTextContentPart = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToUserPart = (\n part: ContentPart,\n providerName: string\n): Effect.Effect<OpenAiTextContentPart | OpenAiImageContentPart, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return Option.match(attachmentSourceUrl(part.source, part.mimeType), {\n onNone: () => Effect.fail(unsupportedContentError('Unresolved image source', providerName)),\n onSome: url => Effect.succeed({ type: 'image_url', image_url: { url } })\n })\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToOpenAiPart(part, providerName)\n : Effect.fail(unsupportedContentError('Document', providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio', providerName))\n }\n}\n\nconst contentToUserContent = (\n content: Content,\n providerName: string\n): Effect.Effect<OpenAiUserContent, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToUserPart(part, providerName))\n\nconst contentPartToText = (\n part: ContentPart,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`, providerName))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`, providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`, providerName))\n }\n}\n\nconst contentToText = (\n content: Content,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner, providerName)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst serializeToolArguments = (params: unknown, providerName: string) =>\n encodeJsonString(params, `Could not serialize ${providerName} tool arguments`)\n\nconst toolCallToOpenAiToolCall = (\n call: ToolCall,\n providerName: string\n): Effect.Effect<OpenAiToolCall, LLMError> =>\n Effect.gen(function* () {\n return {\n id: call.id,\n type: 'function',\n function: {\n name: call.name,\n arguments: yield* serializeToolArguments(call.params, providerName)\n }\n }\n })\n\nconst toOpenAiMessage = (\n message: AgentMessage,\n providerName: string\n): Effect.Effect<OpenAiMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToUserContent(\n prependMessageContextToContent(message.content, messageContextText(message)),\n providerName\n )\n }\n case 'Assistant': {\n const content = prependMessageContextToContent(\n assistantContent(message),\n messageContextText(message)\n )\n const toolCalls = yield* Effect.forEach(assistantHostToolCalls(message), call =>\n toolCallToOpenAiToolCall(call, providerName)\n )\n\n if (toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName),\n tool_calls: toolCalls\n }\n }\n\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName)\n }\n }\n case 'ToolResult':\n return {\n role: 'tool',\n tool_call_id: message.toolCallId,\n content: yield* contentToText(\n prependMessageContextToContent(message.content, messageContextText(message)),\n 'Tool result',\n providerName\n )\n }\n }\n })\n\nconst toOpenAiTool = (tool: ToolDef): OpenAiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n})\n\nexport const toOpenAiRequestBody = (\n request: LLMRequest,\n config: OpenAiRequestBodyConfig\n): Effect.Effect<OpenAiRequestBody, LLMError> =>\n Effect.gen(function* () {\n const providerName = config.providerName ?? defaultOpenAiProviderIdentity.name\n\n if (!Number.isSafeInteger(config.maxCompletionTokens) || config.maxCompletionTokens <= 0) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'validation_error',\n message: `${providerName} maxCompletionTokens must be a positive safe integer`,\n retryable: false\n })\n )\n }\n\n yield* validateProviderTranscript(request.messages)\n const systemMessage: OpenAiMessage = { role: 'system', content: request.systemPrompt }\n const requestMessages = yield* Effect.forEach(request.messages, message =>\n toOpenAiMessage(message, providerName)\n )\n const messages = [systemMessage, ...requestMessages]\n\n const completionTokenLimit =\n config.completionTokenField === 'max_tokens'\n ? { max_tokens: config.maxCompletionTokens }\n : { max_completion_tokens: config.maxCompletionTokens }\n const reasoning =\n config.reasoningEffortFormat === 'reasoning-object' && request.reasoningEffort !== undefined\n ? { reasoning: { effort: request.reasoningEffort } }\n : {}\n const body: OpenAiRequestBody = {\n ...config.extraBody,\n ...reasoning,\n model: request.model,\n messages,\n ...completionTokenLimit,\n stream: false\n }\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toOpenAiTool),\n parallel_tool_calls: true\n }\n })\n\nconst parseToolArguments = (raw: string, providerName: string) =>\n decodeJsonString(raw, `Invalid ${providerName} tool arguments JSON`)\n\nconst toLlmEvents = (\n choice: OpenAiChoiceResponse,\n providerIdentity: OpenAiProviderIdentity\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (choice.finish_reason === 'length' || choice.finish_reason === 'content_filter') {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response stopped with ${choice.finish_reason}`,\n retryable: false,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: 'invalid_response',\n providerCode: choice.finish_reason\n })\n })\n )\n }\n\n const content = choice.message.content ?? ''\n const textEvents = content.length > 0 ? [LLMTextDelta.make({ text: content })] : []\n const toolCallEvents = yield* Effect.forEach(choice.message.tool_calls ?? [], call =>\n parseToolArguments(call.function.arguments, providerIdentity.name).pipe(\n Effect.map(params =>\n LLMToolCall.make({\n call: ToolCall.make({\n id: call.id,\n name: call.function.name,\n params\n })\n })\n )\n )\n )\n\n if (toolCallEvents.length > 0) {\n return [...textEvents, ...toolCallEvents, LLMDone.make({ stopReason: 'tool_use' })]\n }\n\n return [...textEvents, LLMDone.make({ stopReason: 'stop' })]\n })\n\nconst toAgentUsage = (usage: OpenAiUsageResponse) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.prompt_tokens,\n uncached: usage.prompt_tokens - (usage.prompt_tokens_details?.cached_tokens ?? 0),\n cacheRead: usage.prompt_tokens_details?.cached_tokens\n }),\n output: AgentOutputUsage.make({\n total: usage.completion_tokens,\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n text: usage.completion_tokens - (usage.completion_tokens_details?.reasoning_tokens ?? 0)\n })\n })\n\nconst toHttpClientLlmError =\n (providerIdentity: OpenAiProviderIdentity, retryable: boolean) =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${providerIdentity.name} request failed: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: retryable ? 'network' : 'unknown'\n })\n })\n\nconst parseOpenAiResponseJson = (\n response: HttpClientResponse.HttpClientResponse,\n providerName: string\n): Effect.Effect<unknown, LLMError> =>\n response.json.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Could not parse ${providerName} response JSON: ${error.message}`,\n retryable: false\n })\n )\n )\n\nconst sendOpenAiRequest = (\n config: OpenAiProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const providerIdentity = config.providerIdentity ?? defaultOpenAiProviderIdentity\n const body = yield* toOpenAiRequestBody(request, {\n maxCompletionTokens: config.maxCompletionTokens,\n providerName: providerIdentity.name,\n ...(config.completionTokenField === undefined\n ? {}\n : { completionTokenField: config.completionTokenField }),\n ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody }),\n ...(config.reasoningEffortFormat === undefined\n ? {}\n : { reasoningEffortFormat: config.reasoningEffortFormat })\n })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n `Could not serialize ${providerIdentity.name} request`\n )\n\n const httpRequest = HttpClientRequest.post(\n config.chatCompletionsUrl ?? 'https://api.openai.com/v1/chat/completions'\n ).pipe(\n HttpClientRequest.setHeaders({\n ...config.extraHeaders,\n accept: 'application/json',\n authorization: `Bearer ${Redacted.value(config.apiKey)}`,\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError(providerIdentity, true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read ${providerIdentity.name} error body: ${error.message}`,\n retryable: false\n })\n )\n )\n\n const provider = classifyProviderFailure({\n provider: providerIdentity.id,\n status: response.status,\n headers: response.headers,\n body: errorText\n })\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message: `${providerIdentity.name} returned ${response.status}`,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n const json = yield* parseOpenAiResponseJson(response, providerIdentity.name)\n const parsed = yield* Schema.decodeUnknownEffect(OpenAiChatCompletionResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid ${providerIdentity.name} response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n const choice = parsed.choices[0]\n\n if (choice === undefined) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response contained no choices`,\n retryable: false\n })\n )\n }\n\n const events = yield* toLlmEvents(choice, providerIdentity)\n\n if (parsed.usage === undefined) {\n return events\n }\n\n return [...events, LLMUsage.make({ usage: toAgentUsage(parsed.usage) })]\n }).pipe(\n Effect.withSpan(`${config.providerIdentity?.id ?? defaultOpenAiProviderIdentity.id}.stream`)\n )\n\nexport const makeOpenAiProviderLayer = (config: OpenAiProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n )\n\nexport const OpenAiProviderLayer = Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const config = yield* OpenAiConfig\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n).pipe(Layer.provide(Layer.mergeAll(OpenAiConfigLayer, FetchHttpClient.layer)))\n"],"mappings":";;;;;;;;AAiIA,MAAM,gCAAwD;CAC5D,IAAI;CACJ,MAAM;AACR;AAEA,IAAM,yBAAN,cAAqC,OAAO,MAA8B,wBAAwB,EAChG;CACE,MAAM,OAAO;CACb,WAAW,OAAO;AACpB,CACF,EAAE,CAAC;AAEH,IAAM,yBAAN,cAAqC,OAAO,MAA8B,wBAAwB,EAChG;CACE,IAAI,OAAO;CACX,MAAM,OAAO,SAAS,CAAC,UAAU,CAAC;CAClC,UAAU;AACZ,CACF,EAAE,CAAC;AAEH,IAAM,wBAAN,cAAoC,OAAO,MAA6B,uBAAuB,EAAE;CAC/F,SAAS,OAAO,OAAO,OAAO,MAAM;CACpC,YAAY,OAAO,SAAS,OAAO,MAAM,sBAAsB,CAAC;AAClE,CAAC,EAAE,CAAC;AAEJ,IAAM,uBAAN,cAAmC,OAAO,MAA4B,sBAAsB,EAAE;CAC5F,SAAS;CACT,eAAe,OAAO,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC;AAC7D,CAAC,EAAE,CAAC;AAEJ,IAAM,4BAAN,cAAwC,OAAO,MAC7C,2BACF,EAAE,EACA,eAAe,OAAO,SAAS,OAAO,MAAM,EAC9C,CAAC,EAAE,CAAC;AAEJ,IAAM,gCAAN,cAA4C,OAAO,MACjD,+BACF,EAAE,EACA,kBAAkB,OAAO,SAAS,OAAO,MAAM,EACjD,CAAC,EAAE,CAAC;AAEJ,IAAM,sBAAN,cAAkC,OAAO,MAA2B,qBAAqB,EAAE;CACzF,eAAe,OAAO;CACtB,mBAAmB,OAAO;CAC1B,uBAAuB,OAAO,SAAS,yBAAyB;CAChE,2BAA2B,OAAO,SAAS,6BAA6B;AAC1E,CAAC,EAAE,CAAC;AAEJ,IAAM,+BAAN,cAA2C,OAAO,MAChD,8BACF,EAAE;CACA,SAAS,OAAO,MAAM,oBAAoB;CAC1C,OAAO,OAAO,SAAS,mBAAmB;AAC5C,CAAC,EAAE,CAAC;AAEJ,IAAM,eAAN,cAA2B,QAAQ,QAA4C,EAC7E,mBACF,EAAE,CAAC;AAEH,MAAM,oBAAoB,MAAM,OAC9B,cACA,OAAO,IAAI,aAAa;CAGtB,OAAO;EAAE,QAAA,OAFa,OAAO,SAAS,gBAAgB;EAErC,qBAAA,OADkB,OAAO,IAAI,8BAA8B;CACvC;AACvC,CAAC,EAAE,KACD,OAAO,eAEH,IAAI,SAAS;CACX,OAAO;CACP,SAAS;CACT,WAAW;AACb,CAAC,CACL,CACF,CACF;AAEA,MAAM,oBAAoB,UACxB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,MAAM,oBAAoB,OAAgB,YACxC,OAAO,oBAAoB,OAAO,qBAAqB,EAAE,KAAK,EAAE,KAC9D,OAAO,UACL,UACE,IAAI,SAAS;CACX,OAAO;CACP,SAAS,GAAG,QAAQ,IAAI,iBAAiB,KAAK;CAC9C,WAAW;AACb,CAAC,CACL,CACF;AAEF,MAAM,oBAAoB,KAAa,YACrC,OAAO,oBAAoB,OAAO,qBAAqB,EAAE,GAAG,EAAE,KAC5D,OAAO,UACL,UACE,IAAI,SAAS;CACX,OAAO;CACP,SAAS,GAAG,QAAQ,IAAI,iBAAiB,KAAK;CAC9C,WAAW;AACb,CAAC,CACL,CACF;AAEF,MAAM,2BAA2B,aAAqB,iBACpD,IAAI,SAAS;CACX,OAAO;CACP,SAAS,GAAG,YAAY,mCAAmC,aAAa;CACxE,WAAW;AACb,CAAC;AAEH,MAAM,4BACJ,MACA,iBAEA,qBAAqB,KAAK,MAAM,EAAE,KAChC,OAAO,eAAe,wBAAwB,yBAAyB,YAAY,CAAC,GACpF,OAAO,QACL,OAAO,MAAM;CACX,cACE,OAAO,KAAK,wBAAwB,8BAA8B,YAAY,CAAC;CACjF,SAAQ,SAAQ;EACd,MAAM,QAA+B;GACnC,MAAM;GACN,MAAM,aAAa,KAAK,SAAS,KAAK,SAAS,MAAM;EACvD;EAEA,OAAO,OAAO,QAAQ,KAAK;CAC7B;AACF,CAAC,CACH,CACF;AAEF,MAAM,yBACJ,MACA,iBAC4E;CAC5E,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,OAAO,QAAQ;GAAE,MAAM;GAAQ,MAAM,KAAK;EAAK,CAAC;EACzD,KAAK,SACH,OAAO,OAAO,MAAM,oBAAoB,KAAK,QAAQ,KAAK,QAAQ,GAAG;GACnE,cAAc,OAAO,KAAK,wBAAwB,2BAA2B,YAAY,CAAC;GAC1F,SAAQ,QAAO,OAAO,QAAQ;IAAE,MAAM;IAAa,WAAW,EAAE,IAAI;GAAE,CAAC;EACzE,CAAC;EACH,KAAK,YACH,OAAO,uBAAuB,KAAK,QAAQ,IACvC,yBAAyB,MAAM,YAAY,IAC3C,OAAO,KAAK,wBAAwB,YAAY,YAAY,CAAC;EACnE,KAAK,SACH,OAAO,OAAO,KAAK,wBAAwB,SAAS,YAAY,CAAC;CACrE;AACF;AAEA,MAAM,wBACJ,SACA,iBAEA,OAAO,YAAY,WACf,OAAO,QAAQ,OAAO,IACtB,OAAO,QAAQ,UAAS,SAAQ,sBAAsB,MAAM,YAAY,CAAC;AAE/E,MAAM,qBACJ,MACA,OACA,iBACoC;CACpC,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,OAAO,QAAQ,KAAK,IAAI;EACjC,KAAK,SACH,OAAO,OAAO,KAAK,wBAAwB,GAAG,MAAM,SAAS,YAAY,CAAC;EAC5E,KAAK,YACH,OAAO,OAAO,KAAK,wBAAwB,GAAG,MAAM,YAAY,YAAY,CAAC;EAC/E,KAAK,SACH,OAAO,OAAO,KAAK,wBAAwB,GAAG,MAAM,SAAS,YAAY,CAAC;CAC9E;AACF;AAEA,MAAM,iBACJ,SACA,OACA,iBAEA,OAAO,YAAY,WACf,OAAO,QAAQ,OAAO,IACtB,OAAO,QAAQ,UAAS,SAAQ,kBAAkB,MAAM,OAAO,YAAY,CAAC,EAAE,KAC5E,OAAO,KAAI,cAAa,UAAU,KAAK,IAAI,CAAC,CAC9C;AAEN,MAAM,0BAA0B,QAAiB,iBAC/C,iBAAiB,QAAQ,uBAAuB,aAAa,gBAAgB;AAE/E,MAAM,4BACJ,MACA,iBAEA,OAAO,IAAI,aAAa;CACtB,OAAO;EACL,IAAI,KAAK;EACT,MAAM;EACN,UAAU;GACR,MAAM,KAAK;GACX,WAAW,OAAO,uBAAuB,KAAK,QAAQ,YAAY;EACpE;CACF;AACF,CAAC;AAEH,MAAM,mBACJ,SACA,iBAEA,OAAO,IAAI,aAAa;CACtB,QAAQ,QAAQ,MAAhB;EACE,KAAK,QACH,OAAO;GACL,MAAM;GACN,SAAS,OAAO,qBACd,+BAA+B,QAAQ,SAAS,mBAAmB,OAAO,CAAC,GAC3E,YACF;EACF;EACF,KAAK,aAAa;GAChB,MAAM,UAAU,+BACd,iBAAiB,OAAO,GACxB,mBAAmB,OAAO,CAC5B;GACA,MAAM,YAAY,OAAO,OAAO,QAAQ,uBAAuB,OAAO,IAAG,SACvE,yBAAyB,MAAM,YAAY,CAC7C;GAEA,IAAI,UAAU,SAAS,GACrB,OAAO;IACL,MAAM;IACN,SAAS,OAAO,cAAc,SAAS,aAAa,YAAY;IAChE,YAAY;GACd;GAGF,OAAO;IACL,MAAM;IACN,SAAS,OAAO,cAAc,SAAS,aAAa,YAAY;GAClE;EACF;EACA,KAAK,cACH,OAAO;GACL,MAAM;GACN,cAAc,QAAQ;GACtB,SAAS,OAAO,cACd,+BAA+B,QAAQ,SAAS,mBAAmB,OAAO,CAAC,GAC3E,eACA,YACF;EACF;CACJ;AACF,CAAC;AAEH,MAAM,gBAAgB,UAA+B;CACnD,MAAM;CACN,UAAU;EACR,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,YAAY,KAAK;CACnB;AACF;AAEA,MAAa,uBACX,SACA,WAEA,OAAO,IAAI,aAAa;CACtB,MAAM,eAAe,OAAO,gBAAgB,8BAA8B;CAE1E,IAAI,CAAC,OAAO,cAAc,OAAO,mBAAmB,KAAK,OAAO,uBAAuB,GACrF,OAAO,OAAO,OAAO,KACnB,IAAI,SAAS;EACX,OAAO;EACP,SAAS,GAAG,aAAa;EACzB,WAAW;CACb,CAAC,CACH;CAGF,OAAO,2BAA2B,QAAQ,QAAQ;CAKlD,MAAM,WAAW,CAAC;EAJqB,MAAM;EAAU,SAAS,QAAQ;CAI1C,GAAG,GAAG,OAHL,OAAO,QAAQ,QAAQ,WAAU,YAC9D,gBAAgB,SAAS,YAAY,CACvC,CACmD;CAEnD,MAAM,uBACJ,OAAO,yBAAyB,eAC5B,EAAE,YAAY,OAAO,oBAAoB,IACzC,EAAE,uBAAuB,OAAO,oBAAoB;CAC1D,MAAM,YACJ,OAAO,0BAA0B,sBAAsB,QAAQ,oBAAoB,KAAA,IAC/E,EAAE,WAAW,EAAE,QAAQ,QAAQ,gBAAgB,EAAE,IACjD,CAAC;CACP,MAAM,OAA0B;EAC9B,GAAG,OAAO;EACV,GAAG;EACH,OAAO,QAAQ;EACf;EACA,GAAG;EACH,QAAQ;CACV;CAEA,IAAI,QAAQ,MAAM,WAAW,GAC3B,OAAO;CAGT,OAAO;EACL,GAAG;EACH,OAAO,QAAQ,MAAM,IAAI,YAAY;EACrC,qBAAqB;CACvB;AACF,CAAC;AAEH,MAAM,sBAAsB,KAAa,iBACvC,iBAAiB,KAAK,WAAW,aAAa,qBAAqB;AAErE,MAAM,eACJ,QACA,qBAEA,OAAO,IAAI,aAAa;CACtB,IAAI,OAAO,kBAAkB,YAAY,OAAO,kBAAkB,kBAChE,OAAO,OAAO,OAAO,KACnB,IAAI,SAAS;EACX,OAAO;EACP,SAAS,GAAG,iBAAiB,KAAK,yBAAyB,OAAO;EAClE,WAAW;EACX,UAAU,kBAAkB;GAC1B,UAAU,iBAAiB;GAC3B,MAAM;GACN,cAAc,OAAO;EACvB,CAAC;CACH,CAAC,CACH;CAGF,MAAM,UAAU,OAAO,QAAQ,WAAW;CAC1C,MAAM,aAAa,QAAQ,SAAS,IAAI,CAACA,eAAa,KAAK,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC;CAClF,MAAM,iBAAiB,OAAO,OAAO,QAAQ,OAAO,QAAQ,cAAc,CAAC,IAAG,SAC5E,mBAAmB,KAAK,SAAS,WAAW,iBAAiB,IAAI,EAAE,KACjE,OAAO,KAAI,WACT,YAAY,KAAK,EACf,MAAM,SAAS,KAAK;EAClB,IAAI,KAAK;EACT,MAAM,KAAK,SAAS;EACpB;CACF,CAAC,EACH,CAAC,CACH,CACF,CACF;CAEA,IAAI,eAAe,SAAS,GAC1B,OAAO;EAAC,GAAG;EAAY,GAAG;EAAgB,QAAQ,KAAK,EAAE,YAAY,WAAW,CAAC;CAAC;CAGpF,OAAO,CAAC,GAAG,YAAY,QAAQ,KAAK,EAAE,YAAY,OAAO,CAAC,CAAC;AAC7D,CAAC;AAEH,MAAM,gBAAgB,UACpB,WAAW,KAAK;CACd,OAAO,gBAAgB,KAAK;EAC1B,OAAO,MAAM;EACb,UAAU,MAAM,iBAAiB,MAAM,uBAAuB,iBAAiB;EAC/E,WAAW,MAAM,uBAAuB;CAC1C,CAAC;CACD,QAAQ,iBAAiB,KAAK;EAC5B,OAAO,MAAM;EACb,WAAW,MAAM,2BAA2B;EAC5C,MAAM,MAAM,qBAAqB,MAAM,2BAA2B,oBAAoB;CACxF,CAAC;AACH,CAAC;AAEH,MAAM,wBACH,kBAA0C,eAC1C,UACC,IAAI,SAAS;CACX,OAAO;CACP,SAAS,GAAG,iBAAiB,KAAK,mBAAmB,MAAM;CAC3D;CACA,UAAU,kBAAkB;EAC1B,UAAU,iBAAiB;EAC3B,MAAM,YAAY,YAAY;CAChC,CAAC;AACH,CAAC;AAEL,MAAM,2BACJ,UACA,iBAEA,SAAS,KAAK,KACZ,OAAO,UACL,UACE,IAAI,SAAS;CACX,OAAO;CACP,SAAS,mBAAmB,aAAa,kBAAkB,MAAM;CACjE,WAAW;AACb,CAAC,CACL,CACF;AAEF,MAAM,qBACJ,QACA,SACA,WAEA,OAAO,IAAI,aAAa;CACtB,MAAM,mBAAmB,OAAO,oBAAoB;CAcpD,MAAM,iBAAiB,OAAO,iBAC5B,0BAA0B,OAdR,oBAAoB,SAAS;EAC/C,qBAAqB,OAAO;EAC5B,cAAc,iBAAiB;EAC/B,GAAI,OAAO,yBAAyB,KAAA,IAChC,CAAC,IACD,EAAE,sBAAsB,OAAO,qBAAqB;EACxD,GAAI,OAAO,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;EACxE,GAAI,OAAO,0BAA0B,KAAA,IACjC,CAAC,IACD,EAAE,uBAAuB,OAAO,sBAAsB;CAC5D,CAAC,CAI+B,GAC9B,uBAAuB,iBAAiB,KAAK,SAC/C;CAEA,MAAM,cAAc,kBAAkB,KACpC,OAAO,sBAAsB,4CAC/B,EAAE,KACA,kBAAkB,WAAW;EAC3B,GAAG,OAAO;EACV,QAAQ;EACR,eAAe,UAAU,SAAS,MAAM,OAAO,MAAM;EACrD,gBAAgB;CAClB,CAAC,GACD,kBAAkB,SAAS,gBAAgB,kBAAkB,CAC/D;CACA,MAAM,WAAW,OAAO,OACrB,QAAQ,WAAW,EACnB,KAAK,OAAO,SAAS,qBAAqB,kBAAkB,IAAI,CAAC,CAAC;CAErE,IAAI,SAAS,SAAS,OAAO,SAAS,UAAU,KAAK;EACnD,MAAM,YAAY,OAAO,SAAS,KAAK,KACrC,OAAO,UACL,UACE,IAAI,SAAS;GACX,OAAO;GACP,SAAS,kBAAkB,iBAAiB,KAAK,eAAe,MAAM;GACtE,WAAW;EACb,CAAC,CACL,CACF;EAEA,MAAM,WAAW,wBAAwB;GACvC,UAAU,iBAAiB;GAC3B,QAAQ,SAAS;GACjB,SAAS,SAAS;GAClB,MAAM;EACR,CAAC;EAED,OAAO,OAAO,OAAO,KACnB,IAAI,SAAS;GACX,OAAO,qBAAqB,SAAS,IAAI;GACzC,SAAS,GAAG,iBAAiB,KAAK,YAAY,SAAS;GACvD,WAAW,yBAAyB,SAAS,IAAI;GACjD;EACF,CAAC,CACH;CACF;CAEA,MAAM,OAAO,OAAO,wBAAwB,UAAU,iBAAiB,IAAI;CAC3E,MAAM,SAAS,OAAO,OAAO,oBAAoB,4BAA4B,EAAE,IAAI,EAAE,KACnF,OAAO,UACL,UACE,IAAI,SAAS;EACX,OAAO;EACP,SAAS,WAAW,iBAAiB,KAAK,aAAa,iBAAiB,KAAK;EAC7E,WAAW;CACb,CAAC,CACL,CACF;CACA,MAAM,SAAS,OAAO,QAAQ;CAE9B,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,OAAO,KACnB,IAAI,SAAS;EACX,OAAO;EACP,SAAS,GAAG,iBAAiB,KAAK;EAClC,WAAW;CACb,CAAC,CACH;CAGF,MAAM,SAAS,OAAO,YAAY,QAAQ,gBAAgB;CAE1D,IAAI,OAAO,UAAU,KAAA,GACnB,OAAO;CAGT,OAAO,CAAC,GAAG,QAAQ,SAAS,KAAK,EAAE,OAAO,aAAa,OAAO,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC,EAAE,KACD,OAAO,SAAS,GAAG,OAAO,kBAAkB,MAAM,8BAA8B,GAAG,QAAQ,CAC7F;AAEF,MAAa,2BAA2B,WACtC,MAAM,OACJ,aACA,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,WAAW;CAEjC,OAAO,YAAY,GAAG,EACpB,SAAQ,YACN,OAAO,WAAW,kBAAkB,QAAQ,SAAS,MAAM,CAAC,EAAE,KAC5D,OAAO,SAAQ,WAAU,OAAO,aAAa,MAAM,CAAC,CACtD,EACJ,CAAC;AACH,CAAC,CACH;AAEF,MAAa,sBAAsB,MAAM,OACvC,aACA,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO;CACtB,MAAM,SAAS,OAAO,WAAW;CAEjC,OAAO,YAAY,GAAG,EACpB,SAAQ,YACN,OAAO,WAAW,kBAAkB,QAAQ,SAAS,MAAM,CAAC,EAAE,KAC5D,OAAO,SAAQ,WAAU,OAAO,aAAa,MAAM,CAAC,CACtD,EACJ,CAAC;AACH,CAAC,CACH,EAAE,KAAK,MAAM,QAAQ,MAAM,SAAS,mBAAmB,gBAAgB,KAAK,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-gateway-provider.d.mts","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"mappings":";;;;cAKa,yBAAA;AAAA,cACA,iCAAA;AAAA,KAED,2BAAA;AAAA,KAEA,6BAAA;EAAA,SACD,KAAA,GAAQ,aAAA;EAAA,SACR,IAAA,GAAO,aAAA;EAAA,SACP,IAAA,GAAO,2BAAA;AAAA;AAAA,KAGN,6BAAA;8EAED,MAAA,EAAQ,QAAA,CAAS,QAAA;EAAA,SACjB,mBAAA;EAAA,SACA,cAAA,GAAiB,aAAA;EAAA,SACjB,OAAA,GAAU,6BAAA;EAAA,SACV,YAAA,GAAe,QAAA,CAAS,MAAA,mBAdI;EAAA,SAgB5B,kBAAA;AAAA;AAAA,cAaE,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,gCAAA,WAAA,mDAAA,UAAA;AAAA,cA6BzE,4BAAA,EAA4B,KAAA,CAAA,KAAA,gCAAA,WAAA,EAAA,QAAA"}
1
+ {"version":3,"file":"ai-gateway-provider.d.mts","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"mappings":";;;;cAKa,yBAAA;AAAA,cACA,iCAAA;AAAA,KAED,2BAAA;AAAA,KAEA,6BAAA;EAAA,SACD,KAAA,GAAQ,aAAA;EAAA,SACR,IAAA,GAAO,aAAA;EAAA,SACP,IAAA,GAAO,2BAAA;AAAA;AAAA,KAGN,6BAAA;8EAED,MAAA,EAAQ,QAAA,CAAS,QAAA;EAAA,SACjB,mBAAA;EAAA,SACA,cAAA,GAAiB,aAAA;EAAA,SACjB,OAAA,GAAU,6BAAA;EAAA,SACV,YAAA,GAAe,QAAA,CAAS,MAAA,mBAdI;EAAA,SAgB5B,kBAAA;AAAA;AAAA,cAaE,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,gCAAA,WAAA,mDAAA,UAAA;AAAA,cA8BzE,4BAAA,EAA4B,KAAA,CAAA,KAAA,gCAAA,WAAA,EAAA,QAAA"}
@@ -17,6 +17,7 @@ const makeVercelAiGatewayProviderLayer = (config) => makeOpenAiProviderLayer({
17
17
  apiKey: config.apiKey,
18
18
  maxCompletionTokens: config.maxCompletionTokens,
19
19
  completionTokenField: "max_tokens",
20
+ reasoningEffortFormat: "reasoning-object",
20
21
  chatCompletionsUrl: config.chatCompletionsUrl ?? "https://ai-gateway.vercel.sh/v1/chat/completions",
21
22
  providerIdentity: vercelAiGatewayProviderIdentity,
22
23
  extraBody: gatewayExtraBody(config),
@@ -1 +1 @@
1
- {"version":3,"file":"ai-gateway-provider.mjs","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"sourcesContent":["import { Config, Effect, Layer, type Redacted } from 'effect'\nimport { FetchHttpClient } from 'effect/unstable/http'\nimport { LLMError } from '@yolk-sdk/agent/loop'\nimport { makeOpenAiProviderLayer } from '../openai/provider.ts'\n\nexport const vercelAiGatewayProviderId = 'vercel_ai_gateway'\nexport const vercelAiGatewayChatCompletionsUrl = 'https://ai-gateway.vercel.sh/v1/chat/completions'\n\nexport type VercelAiGatewayProviderSort = 'cost' | 'ttft' | 'tps'\n\nexport type VercelAiGatewayRoutingOptions = {\n readonly order?: ReadonlyArray<string>\n readonly only?: ReadonlyArray<string>\n readonly sort?: VercelAiGatewayProviderSort\n}\n\nexport type VercelAiGatewayProviderConfig = {\n /** Accepts either an AI Gateway API key or a Vercel OIDC token. */\n readonly apiKey: Redacted.Redacted<string>\n readonly maxCompletionTokens: number\n readonly fallbackModels?: ReadonlyArray<string>\n readonly routing?: VercelAiGatewayRoutingOptions\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Override only with a trusted proxy because the bearer credential is sent to this URL. */\n readonly chatCompletionsUrl?: string\n}\n\nconst vercelAiGatewayProviderIdentity = {\n id: vercelAiGatewayProviderId,\n name: 'Vercel AI Gateway'\n}\n\nconst gatewayExtraBody = (config: VercelAiGatewayProviderConfig) => ({\n ...(config.fallbackModels === undefined ? {} : { models: config.fallbackModels }),\n ...(config.routing === undefined ? {} : { providerOptions: { gateway: config.routing } })\n})\n\nexport const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProviderConfig) =>\n makeOpenAiProviderLayer({\n apiKey: config.apiKey,\n maxCompletionTokens: config.maxCompletionTokens,\n completionTokenField: 'max_tokens',\n chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,\n providerIdentity: vercelAiGatewayProviderIdentity,\n extraBody: gatewayExtraBody(config),\n ...(config.extraHeaders === undefined ? {} : { extraHeaders: config.extraHeaders })\n })\n\nconst vercelAiGatewayEnvironmentConfig = Effect.gen(function* () {\n const apiKey = yield* Config.redacted('AI_GATEWAY_API_KEY').pipe(\n Config.orElse(() => Config.redacted('VERCEL_OIDC_TOKEN'))\n )\n const maxCompletionTokens = yield* Config.int('AI_GATEWAY_MAX_COMPLETION_TOKENS')\n\n return { apiKey, maxCompletionTokens }\n}).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'Vercel AI Gateway environment configuration missing',\n retryable: false\n })\n )\n)\n\nexport const VercelAiGatewayProviderLayer = Layer.unwrap(\n vercelAiGatewayEnvironmentConfig.pipe(Effect.map(makeVercelAiGatewayProviderLayer))\n).pipe(Layer.provide(FetchHttpClient.layer))\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B;AACzC,MAAa,oCAAoC;AAqBjD,MAAM,kCAAkC;CACtC,IAAI;CACJ,MAAM;AACR;AAEA,MAAM,oBAAoB,YAA2C;CACnE,GAAI,OAAO,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,eAAe;CAC/E,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,SAAS,OAAO,QAAQ,EAAE;AACzF;AAEA,MAAa,oCAAoC,WAC/C,wBAAwB;CACtB,QAAQ,OAAO;CACf,qBAAqB,OAAO;CAC5B,sBAAsB;CACtB,oBAAoB,OAAO,sBAAA;CAC3B,kBAAkB;CAClB,WAAW,iBAAiB,MAAM;CAClC,GAAI,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;AACnF,CAAC;AAEH,MAAM,mCAAmC,OAAO,IAAI,aAAa;CAM/D,OAAO;EAAE,QAAA,OALa,OAAO,SAAS,oBAAoB,EAAE,KAC1D,OAAO,aAAa,OAAO,SAAS,mBAAmB,CAAC,CAC1D;EAGiB,qBAAA,OAFkB,OAAO,IAAI,kCAAkC;CAE3C;AACvC,CAAC,EAAE,KACD,OAAO,eAEH,IAAI,SAAS;CACX,OAAO;CACP,SAAS;CACT,WAAW;AACb,CAAC,CACL,CACF;AAEA,MAAa,+BAA+B,MAAM,OAChD,iCAAiC,KAAK,OAAO,IAAI,gCAAgC,CAAC,CACpF,EAAE,KAAK,MAAM,QAAQ,gBAAgB,KAAK,CAAC"}
1
+ {"version":3,"file":"ai-gateway-provider.mjs","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"sourcesContent":["import { Config, Effect, Layer, type Redacted } from 'effect'\nimport { FetchHttpClient } from 'effect/unstable/http'\nimport { LLMError } from '@yolk-sdk/agent/loop'\nimport { makeOpenAiProviderLayer } from '../openai/provider.ts'\n\nexport const vercelAiGatewayProviderId = 'vercel_ai_gateway'\nexport const vercelAiGatewayChatCompletionsUrl = 'https://ai-gateway.vercel.sh/v1/chat/completions'\n\nexport type VercelAiGatewayProviderSort = 'cost' | 'ttft' | 'tps'\n\nexport type VercelAiGatewayRoutingOptions = {\n readonly order?: ReadonlyArray<string>\n readonly only?: ReadonlyArray<string>\n readonly sort?: VercelAiGatewayProviderSort\n}\n\nexport type VercelAiGatewayProviderConfig = {\n /** Accepts either an AI Gateway API key or a Vercel OIDC token. */\n readonly apiKey: Redacted.Redacted<string>\n readonly maxCompletionTokens: number\n readonly fallbackModels?: ReadonlyArray<string>\n readonly routing?: VercelAiGatewayRoutingOptions\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Override only with a trusted proxy because the bearer credential is sent to this URL. */\n readonly chatCompletionsUrl?: string\n}\n\nconst vercelAiGatewayProviderIdentity = {\n id: vercelAiGatewayProviderId,\n name: 'Vercel AI Gateway'\n}\n\nconst gatewayExtraBody = (config: VercelAiGatewayProviderConfig) => ({\n ...(config.fallbackModels === undefined ? {} : { models: config.fallbackModels }),\n ...(config.routing === undefined ? {} : { providerOptions: { gateway: config.routing } })\n})\n\nexport const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProviderConfig) =>\n makeOpenAiProviderLayer({\n apiKey: config.apiKey,\n maxCompletionTokens: config.maxCompletionTokens,\n completionTokenField: 'max_tokens',\n reasoningEffortFormat: 'reasoning-object',\n chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,\n providerIdentity: vercelAiGatewayProviderIdentity,\n extraBody: gatewayExtraBody(config),\n ...(config.extraHeaders === undefined ? {} : { extraHeaders: config.extraHeaders })\n })\n\nconst vercelAiGatewayEnvironmentConfig = Effect.gen(function* () {\n const apiKey = yield* Config.redacted('AI_GATEWAY_API_KEY').pipe(\n Config.orElse(() => Config.redacted('VERCEL_OIDC_TOKEN'))\n )\n const maxCompletionTokens = yield* Config.int('AI_GATEWAY_MAX_COMPLETION_TOKENS')\n\n return { apiKey, maxCompletionTokens }\n}).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'Vercel AI Gateway environment configuration missing',\n retryable: false\n })\n )\n)\n\nexport const VercelAiGatewayProviderLayer = Layer.unwrap(\n vercelAiGatewayEnvironmentConfig.pipe(Effect.map(makeVercelAiGatewayProviderLayer))\n).pipe(Layer.provide(FetchHttpClient.layer))\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B;AACzC,MAAa,oCAAoC;AAqBjD,MAAM,kCAAkC;CACtC,IAAI;CACJ,MAAM;AACR;AAEA,MAAM,oBAAoB,YAA2C;CACnE,GAAI,OAAO,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,eAAe;CAC/E,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,SAAS,OAAO,QAAQ,EAAE;AACzF;AAEA,MAAa,oCAAoC,WAC/C,wBAAwB;CACtB,QAAQ,OAAO;CACf,qBAAqB,OAAO;CAC5B,sBAAsB;CACtB,uBAAuB;CACvB,oBAAoB,OAAO,sBAAA;CAC3B,kBAAkB;CAClB,WAAW,iBAAiB,MAAM;CAClC,GAAI,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;AACnF,CAAC;AAEH,MAAM,mCAAmC,OAAO,IAAI,aAAa;CAM/D,OAAO;EAAE,QAAA,OALa,OAAO,SAAS,oBAAoB,EAAE,KAC1D,OAAO,aAAa,OAAO,SAAS,mBAAmB,CAAC,CAC1D;EAGiB,qBAAA,OAFkB,OAAO,IAAI,kCAAkC;CAE3C;AACvC,CAAC,EAAE,KACD,OAAO,eAEH,IAAI,SAAS;CACX,OAAO;CACP,SAAS;CACT,WAAW;AACb,CAAC,CACL,CACF;AAEA,MAAa,+BAA+B,MAAM,OAChD,iCAAiC,KAAK,OAAO,IAAI,gCAAgC,CAAC,CACpF,EAAE,KAAK,MAAM,QAAQ,gBAAgB,KAAK,CAAC"}
@@ -40,8 +40,8 @@ declare const parseCommandMarkdown: (input: ParseCommandInput) => Effect.Effect<
40
40
  fileRefs?: boolean | undefined;
41
41
  access?: "read" | "write" | "destructive" | undefined;
42
42
  arguments?: readonly {
43
- readonly required: boolean;
44
43
  readonly name: string;
44
+ readonly required: boolean;
45
45
  readonly description?: string | undefined;
46
46
  }[] | undefined;
47
47
  name: string;
@@ -17,24 +17,24 @@ declare const mergeSkillsets: (sources: ReadonlyArray<SkillsetSource>) => Effect
17
17
  skills: {
18
18
  readonly name: string;
19
19
  readonly description: string;
20
- readonly content: string;
21
20
  readonly location: string;
21
+ readonly content: string;
22
22
  readonly source?: string | undefined;
23
23
  }[];
24
24
  commands: {
25
25
  readonly name: string;
26
- readonly hints: readonly string[];
27
26
  readonly template: string;
27
+ readonly hints: readonly string[];
28
28
  readonly description?: string | undefined;
29
- readonly source?: string | undefined;
30
- readonly location?: string | undefined;
31
29
  readonly arguments?: readonly {
32
- readonly required: boolean;
33
30
  readonly name: string;
31
+ readonly required: boolean;
34
32
  readonly description?: string | undefined;
35
33
  }[] | undefined;
36
34
  readonly access?: "read" | "write" | "destructive" | undefined;
37
35
  readonly fileRefs?: boolean | undefined;
36
+ readonly location?: string | undefined;
37
+ readonly source?: string | undefined;
38
38
  }[];
39
39
  }, SkillsetError, never>;
40
40
  //#endregion
@@ -3,8 +3,8 @@ import { Effect } from "effect";
3
3
 
4
4
  //#region src/skillset/name.d.ts
5
5
  declare const isValidSkillsetName: (name: string) => boolean;
6
- declare const validateSkillsetName: (name: string) => Effect.Effect<never, SkillsetError, never> | Effect.Effect<string, never, never>;
7
- declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<never, SkillsetError, never> | Effect.Effect<string, never, never>;
6
+ declare const validateSkillsetName: (name: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
7
+ declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
8
8
  //#endregion
9
9
  export { isValidSkillsetName, validateDirectoryName, validateSkillsetName };
10
10
  //# sourceMappingURL=name.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,QAAA,aAAA,WAAA,MAAA,CAAA,MAAA;AAAA,cAUpC,qBAAA,GAAyB,QAAA,UAAkB,MAAA,aAAc,MAAA,CAAA,MAAA,QAAA,aAAA,WAAA,MAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA;AAAA,cAUpC,qBAAA,GAAyB,QAAA,UAAkB,MAAA,aAAc,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolk-sdk/agent",
3
- "version": "0.1.0-canary.68",
3
+ "version": "0.1.0-canary.70",
4
4
  "description": "Agent protocol, loop, runtime, Effect-native client, compaction, tools, React, providers, OAuth, skillset, and voice primitives.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -195,7 +195,7 @@
195
195
  "provenance": true
196
196
  },
197
197
  "dependencies": {
198
- "effect": "4.0.0-beta.65"
198
+ "effect": "4.0.0-beta.80"
199
199
  },
200
200
  "peerDependencies": {
201
201
  "react": ">=19"
@@ -303,9 +303,7 @@ const idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {
303
303
  : Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))
304
304
  }
305
305
 
306
- const validateAgentRunIdleReconnectEffect = (
307
- options: AgentRunIdleReconnectOptions | undefined
308
- ) => {
306
+ const validateAgentRunIdleReconnectEffect = (options: AgentRunIdleReconnectOptions | undefined) => {
309
307
  if (options === undefined) return Effect.void
310
308
 
311
309
  if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {
@@ -565,7 +563,10 @@ const requestAgentResponse = (request: StreamAgentEventsRequest) =>
565
563
 
566
564
  const requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>
567
565
  Effect.gen(function* () {
568
- const endpoint = yield* agentRunEndpointWithStartIndexEffect(request.endpoint, request.startIndex)
566
+ const endpoint = yield* agentRunEndpointWithStartIndexEffect(
567
+ request.endpoint,
568
+ request.startIndex
569
+ )
569
570
 
570
571
  const client = yield* HttpClient.HttpClient
571
572
  const response = yield* client
@@ -725,10 +726,14 @@ const responseToEventStream = (response: HttpClientResponse.HttpClientResponse)
725
726
  })
726
727
  )
727
728
 
728
- yield* run().pipe(
729
- Effect.catch(error => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))
729
+ yield* run()
730
+ }).pipe(
731
+ // Callback producers must settle their queue on defects too, without turning
732
+ // programmer failures into recoverable AgentTransportErrors.
733
+ Effect.onExit(exit =>
734
+ Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
730
735
  )
731
- })
736
+ )
732
737
  )
733
738
 
734
739
  const abortSignalError = (signal: AbortSignal) =>
@@ -1063,8 +1068,8 @@ export const streamAgentEventStreamUntilTerminal = (
1063
1068
  )
1064
1069
  yield* Queue.end(queue).pipe(Effect.asVoid)
1065
1070
  }).pipe(
1066
- Effect.catch((error: AgentTransportError) =>
1067
- Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)
1071
+ Effect.onExit(exit =>
1072
+ Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
1068
1073
  )
1069
1074
  )
1070
1075
  )
@@ -1107,8 +1112,8 @@ export const streamAgentRunEventStreamUntilTerminal = (
1107
1112
  )
1108
1113
  yield* Queue.end(queue).pipe(Effect.asVoid)
1109
1114
  }).pipe(
1110
- Effect.catch((error: AgentTransportError) =>
1111
- Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)
1115
+ Effect.onExit(exit =>
1116
+ Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
1112
1117
  )
1113
1118
  )
1114
1119
  )
@@ -1122,12 +1127,12 @@ const streamAgentRunHitlResponseInitialChunk = (
1122
1127
  drainAgentEventStream({
1123
1128
  queue,
1124
1129
  stream: streamAgentRunHitlResponseEventStream({
1125
- ...request,
1126
- onResponse: response => {
1127
- setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))
1128
- request.onResponse?.(response)
1129
- }
1130
- }),
1130
+ ...request,
1131
+ onResponse: response => {
1132
+ setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))
1133
+ request.onResponse?.(response)
1134
+ }
1135
+ }),
1131
1136
  countOffset: 0,
1132
1137
  idleReconnect: request.idleReconnect,
1133
1138
  onEvent: request.onEvent
@@ -1170,8 +1175,8 @@ export const streamAgentRunHitlResponseEventStreamUntilTerminal = (
1170
1175
  )
1171
1176
  yield* Queue.end(queue).pipe(Effect.asVoid)
1172
1177
  }).pipe(
1173
- Effect.catch((error: AgentTransportError) =>
1174
- Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)
1178
+ Effect.onExit(exit =>
1179
+ Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
1175
1180
  )
1176
1181
  )
1177
1182
  )
@@ -21,6 +21,7 @@ import {
21
21
  replaceLoneSurrogatesDeep,
22
22
  prependMessageContextToContent,
23
23
  type AgentMessage,
24
+ type AgentReasoningEffort,
24
25
  type Content,
25
26
  type ContentPart,
26
27
  type ToolDef
@@ -54,8 +55,10 @@ export type OpenAiProviderConfig = {
54
55
  /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */
55
56
  readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'
56
57
  readonly extraHeaders?: Readonly<Record<string, string>>
57
- /** Adds compatible endpoint extensions; canonical model/messages/limit/stream fields win. */
58
+ /** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */
58
59
  readonly extraBody?: Readonly<Record<string, unknown>>
60
+ /** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */
61
+ readonly reasoningEffortFormat?: 'reasoning-object'
59
62
  /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */
60
63
  readonly providerIdentity?: OpenAiProviderIdentity
61
64
  readonly apiKey: Redacted.Redacted<string>
@@ -109,6 +112,9 @@ type OpenAiRequestBody = {
109
112
  readonly max_completion_tokens?: number
110
113
  readonly max_tokens?: number
111
114
  readonly stream: false
115
+ readonly reasoning?: {
116
+ readonly effort: AgentReasoningEffort
117
+ }
112
118
  readonly tools?: ReadonlyArray<OpenAiTool>
113
119
  readonly parallel_tool_calls?: true
114
120
  }
@@ -117,6 +123,7 @@ type OpenAiRequestBodyConfig = {
117
123
  readonly maxCompletionTokens: number
118
124
  readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'
119
125
  readonly extraBody?: Readonly<Record<string, unknown>>
126
+ readonly reasoningEffortFormat?: 'reasoning-object'
120
127
  readonly providerName?: string
121
128
  }
122
129
 
@@ -415,8 +422,13 @@ export const toOpenAiRequestBody = (
415
422
  config.completionTokenField === 'max_tokens'
416
423
  ? { max_tokens: config.maxCompletionTokens }
417
424
  : { max_completion_tokens: config.maxCompletionTokens }
425
+ const reasoning =
426
+ config.reasoningEffortFormat === 'reasoning-object' && request.reasoningEffort !== undefined
427
+ ? { reasoning: { effort: request.reasoningEffort } }
428
+ : {}
418
429
  const body: OpenAiRequestBody = {
419
430
  ...config.extraBody,
431
+ ...reasoning,
420
432
  model: request.model,
421
433
  messages,
422
434
  ...completionTokenLimit,
@@ -535,7 +547,10 @@ const sendOpenAiRequest = (
535
547
  ...(config.completionTokenField === undefined
536
548
  ? {}
537
549
  : { completionTokenField: config.completionTokenField }),
538
- ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody })
550
+ ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody }),
551
+ ...(config.reasoningEffortFormat === undefined
552
+ ? {}
553
+ : { reasoningEffortFormat: config.reasoningEffortFormat })
539
554
  })
540
555
  // Replayed transcripts can carry lone surrogates; harden the lowered
541
556
  // body so one bad historical string cannot poison every model call.
@@ -40,6 +40,7 @@ export const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProvider
40
40
  apiKey: config.apiKey,
41
41
  maxCompletionTokens: config.maxCompletionTokens,
42
42
  completionTokenField: 'max_tokens',
43
+ reasoningEffortFormat: 'reasoning-object',
43
44
  chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,
44
45
  providerIdentity: vercelAiGatewayProviderIdentity,
45
46
  extraBody: gatewayExtraBody(config),