@yolk-sdk/agent 0.1.0-canary.96 → 0.1.0-canary.97
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 +36 -11
- package/dist/classification/schema.mjs +2 -2
- package/dist/classification/schema.mjs.map +1 -1
- package/dist/client/transport.d.mts +1 -1
- package/dist/client/transport.mjs +1 -1
- package/dist/client/transport.mjs.map +1 -1
- package/dist/compaction/retry.d.mts +30 -30
- package/dist/compaction/retry.d.mts.map +1 -1
- package/dist/compaction/window.d.mts +39 -39
- package/dist/compaction/window.d.mts.map +1 -1
- package/dist/loop/run.d.mts.map +1 -1
- package/dist/loop/run.mjs +11 -6
- package/dist/loop/run.mjs.map +1 -1
- package/dist/protocol/tool-argument-hints.d.mts +12 -0
- package/dist/protocol/tool-argument-hints.d.mts.map +1 -0
- package/dist/protocol/tool-argument-hints.mjs +60 -0
- package/dist/protocol/tool-argument-hints.mjs.map +1 -0
- package/dist/providers/anthropic/claude-provider.d.mts +1 -1
- package/dist/providers/anthropic/claude-provider.mjs.map +1 -1
- package/dist/providers/anthropic/conformance/cases.d.mts +1 -1
- package/dist/providers/anthropic/conformance/cases.mjs +1 -1
- package/dist/providers/anthropic/conformance/cases.mjs.map +1 -1
- package/dist/providers/anthropic/conformance/claude-usage-cases.d.mts +1 -1
- package/dist/providers/anthropic/conformance/claude-usage-cases.mjs.map +1 -1
- package/dist/providers/anthropic/usage.d.mts +1 -1
- package/dist/providers/anthropic/usage.mjs +1 -1
- package/dist/providers/anthropic/usage.mjs.map +1 -1
- package/dist/providers/anthropic-messages-provider-internal.d.mts +1 -1
- package/dist/providers/anthropic-messages-provider-internal.mjs +1 -1
- package/dist/providers/anthropic-messages-provider-internal.mjs.map +1 -1
- package/dist/providers/anthropic-provider-internal.d.mts +1 -1
- package/dist/providers/anthropic-provider-internal.mjs +1 -1
- package/dist/providers/anthropic-provider-internal.mjs.map +1 -1
- package/dist/providers/openai/codex-provider.d.mts +2 -2
- package/dist/providers/openai/codex-provider.d.mts.map +1 -1
- package/dist/providers/openai/codex-provider.mjs.map +1 -1
- package/dist/providers/openai/codex-usage.d.mts +1 -1
- package/dist/providers/openai/codex-usage.mjs +1 -1
- package/dist/providers/openai/codex-usage.mjs.map +1 -1
- package/dist/providers/openai/conformance/cases.d.mts +1 -1
- package/dist/providers/openai/conformance/cases.mjs.map +1 -1
- package/dist/providers/openai/conformance/codex-cases.d.mts +1 -1
- package/dist/providers/openai/conformance/codex-cases.mjs.map +1 -1
- package/dist/providers/openai/conformance/codex-usage-cases.d.mts +1 -1
- package/dist/providers/openai/conformance/codex-usage-cases.mjs.map +1 -1
- package/dist/providers/openai/conformance/responses-cases-internal.d.mts +1 -1
- package/dist/providers/openai/conformance/responses-cases-internal.mjs +1 -1
- package/dist/providers/openai/conformance/responses-cases-internal.mjs.map +1 -1
- package/dist/providers/openai/conformance/subscription-usage-cases-internal.d.mts +1 -1
- package/dist/providers/openai/conformance/subscription-usage-cases-internal.mjs +1 -1
- package/dist/providers/openai/conformance/subscription-usage-cases-internal.mjs.map +1 -1
- package/dist/providers/openai/provider.d.mts +1 -1
- package/dist/providers/openai/provider.d.mts.map +1 -1
- package/dist/providers/openai/provider.mjs +4 -3
- package/dist/providers/openai/provider.mjs.map +1 -1
- package/dist/providers/openai/speech.d.mts +1 -1
- package/dist/providers/openai/speech.mjs +1 -1
- package/dist/providers/openai/speech.mjs.map +1 -1
- package/dist/providers/openai-responses-provider-internal.d.mts +1 -1
- package/dist/providers/openai-responses-provider-internal.mjs +1 -1
- package/dist/providers/openai-responses-provider-internal.mjs.map +1 -1
- package/dist/providers/opencode/conformance/cases.d.mts +1 -1
- package/dist/providers/opencode/conformance/cases.mjs +1 -1
- package/dist/providers/opencode/conformance/cases.mjs.map +1 -1
- package/dist/providers/opencode/go-provider.d.mts +1 -1
- package/dist/providers/opencode/go-provider.mjs.map +1 -1
- package/dist/providers/opencode/usage.d.mts +1 -1
- package/dist/providers/opencode/usage.mjs +1 -1
- package/dist/providers/opencode/usage.mjs.map +1 -1
- package/dist/providers/subscription-usage-internal.d.mts +1 -1
- package/dist/providers/subscription-usage-internal.mjs +1 -1
- package/dist/providers/subscription-usage-internal.mjs.map +1 -1
- package/dist/providers/vercel/ai-gateway-classifier.d.mts +1 -1
- package/dist/providers/vercel/ai-gateway-classifier.mjs +1 -1
- package/dist/providers/vercel/ai-gateway-classifier.mjs.map +1 -1
- package/dist/providers/vercel/ai-gateway-provider.d.mts +1 -1
- package/dist/providers/vercel/ai-gateway-provider.d.mts.map +1 -1
- package/dist/providers/vercel/ai-gateway-provider.mjs +1 -1
- package/dist/providers/vercel/ai-gateway-provider.mjs.map +1 -1
- package/dist/providers/vercel/conformance/cases.d.mts +1 -1
- package/dist/providers/vercel/conformance/cases.mjs.map +1 -1
- package/dist/providers/vercel/conformance/classifier-cases.d.mts +1 -1
- package/dist/providers/vercel/conformance/classifier-cases.mjs.map +1 -1
- package/dist/providers/xai/conformance/cases.d.mts +1 -1
- package/dist/providers/xai/conformance/cases.mjs.map +1 -1
- package/dist/providers/xai/conformance/usage-cases.d.mts +1 -1
- package/dist/providers/xai/conformance/usage-cases.mjs.map +1 -1
- package/dist/providers/xai/grok-provider.d.mts +2 -2
- package/dist/providers/xai/grok-provider.d.mts.map +1 -1
- package/dist/providers/xai/grok-provider.mjs.map +1 -1
- package/dist/providers/xai/usage.d.mts +1 -1
- package/dist/providers/xai/usage.mjs +1 -1
- package/dist/providers/xai/usage.mjs.map +1 -1
- package/dist/react/chat-messages.d.mts +21 -21
- package/dist/react/chat-messages.d.mts.map +1 -1
- package/dist/skillset/merge.d.mts +2 -2
- package/dist/skillset/name.d.mts +2 -2
- package/dist/skillset/name.d.mts.map +1 -1
- package/dist/tools/arguments.d.mts +40 -0
- package/dist/tools/arguments.d.mts.map +1 -0
- package/dist/tools/arguments.mjs +364 -0
- package/dist/tools/arguments.mjs.map +1 -0
- package/dist/tools/background.d.mts +2 -1
- package/dist/tools/background.d.mts.map +1 -1
- package/dist/tools/background.mjs +2 -2
- package/dist/tools/background.mjs.map +1 -1
- package/dist/tools/index.d.mts +3 -1
- package/dist/tools/index.mjs +3 -1
- package/dist/tools/input.d.mts.map +1 -1
- package/dist/tools/input.mjs +3 -1
- package/dist/tools/input.mjs.map +1 -1
- package/dist/tools/interaction.d.mts.map +1 -1
- package/dist/tools/interaction.mjs +31 -4
- package/dist/tools/interaction.mjs.map +1 -1
- package/dist/tools/question.d.mts.map +1 -1
- package/dist/tools/question.mjs +2 -1
- package/dist/tools/question.mjs.map +1 -1
- package/dist/tools/registry.d.mts +3 -1
- package/dist/tools/registry.d.mts.map +1 -1
- package/dist/tools/registry.mjs +20 -14
- package/dist/tools/registry.mjs.map +1 -1
- package/dist/tools/subagent.d.mts.map +1 -1
- package/dist/tools/subagent.mjs +2 -1
- package/dist/tools/subagent.mjs.map +1 -1
- package/dist/voice/speech.d.mts.map +1 -1
- package/dist/voice/speech.mjs +3 -2
- package/dist/voice/speech.mjs.map +1 -1
- package/dist/voice/websocket.d.mts +1 -1
- package/dist/voice/websocket.mjs +1 -1
- package/dist/voice/websocket.mjs.map +1 -1
- package/package.json +3 -3
- package/src/classification/schema.ts +2 -2
- package/src/client/transport.ts +2 -2
- package/src/loop/run.ts +24 -8
- package/src/protocol/tool-argument-hints.ts +113 -0
- package/src/providers/anthropic/claude-provider.ts +1 -1
- package/src/providers/anthropic/conformance/cases.ts +1 -1
- package/src/providers/anthropic/conformance/claude-usage-cases.ts +1 -1
- package/src/providers/anthropic/usage.ts +1 -1
- package/src/providers/anthropic-messages-provider-internal.ts +1 -1
- package/src/providers/anthropic-provider-internal.ts +1 -1
- package/src/providers/openai/codex-provider.ts +1 -1
- package/src/providers/openai/codex-usage.ts +1 -1
- package/src/providers/openai/conformance/cases.ts +1 -1
- package/src/providers/openai/conformance/codex-cases.ts +1 -1
- package/src/providers/openai/conformance/codex-usage-cases.ts +1 -1
- package/src/providers/openai/conformance/responses-cases-internal.ts +1 -1
- package/src/providers/openai/conformance/subscription-usage-cases-internal.ts +1 -1
- package/src/providers/openai/provider.ts +3 -5
- package/src/providers/openai/speech.ts +1 -1
- package/src/providers/openai-responses-provider-internal.ts +1 -1
- package/src/providers/opencode/conformance/cases.ts +1 -1
- package/src/providers/opencode/go-provider.ts +1 -1
- package/src/providers/opencode/usage.ts +1 -1
- package/src/providers/subscription-usage-internal.ts +1 -1
- package/src/providers/vercel/ai-gateway-classifier.ts +1 -1
- package/src/providers/vercel/ai-gateway-provider.ts +1 -1
- package/src/providers/vercel/conformance/cases.ts +1 -1
- package/src/providers/vercel/conformance/classifier-cases.ts +1 -1
- package/src/providers/xai/conformance/cases.ts +1 -1
- package/src/providers/xai/conformance/usage-cases.ts +1 -1
- package/src/providers/xai/grok-provider.ts +1 -1
- package/src/providers/xai/usage.ts +1 -1
- package/src/tools/README.md +3 -0
- package/src/tools/arguments.ts +743 -0
- package/src/tools/background.ts +3 -1
- package/src/tools/index.ts +4 -0
- package/src/tools/input.ts +6 -3
- package/src/tools/interaction.ts +73 -8
- package/src/tools/question.ts +5 -1
- package/src/tools/registry.ts +56 -21
- package/src/tools/subagent.ts +5 -1
- package/src/voice/speech.ts +3 -2
- package/src/voice/websocket.ts +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Root export is intentionally empty. Import feature APIs from explicit subpaths.
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
pnpm add @yolk-sdk/agent@canary effect@4.0.0
|
|
10
|
+
pnpm add @yolk-sdk/agent@canary effect@4.0.0
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Add `react` if you use `@yolk-sdk/agent/react` or `@yolk-sdk/agent/voice/react`.
|
|
@@ -15,7 +15,7 @@ Add `react` if you use `@yolk-sdk/agent/react` or `@yolk-sdk/agent/voice/react`.
|
|
|
15
15
|
Running the experimental `@yolk-sdk/agent/providers/*/conformance` cases? Also add `@yolk-sdk/conformance@canary` (usually as a dev dependency); the cases run through `@yolk-sdk/conformance/runner`.
|
|
16
16
|
|
|
17
17
|
Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
|
|
18
|
-
Use the SDK's matching Effect version (`4.0.0
|
|
18
|
+
Use the SDK's matching Effect version (`4.0.0`) in host code.
|
|
19
19
|
Published package metadata requires Node.js 22+.
|
|
20
20
|
|
|
21
21
|
## Subpaths
|
|
@@ -97,7 +97,9 @@ import {
|
|
|
97
97
|
modelVisibleToolError,
|
|
98
98
|
modelVisibleToolErrorStructuredContent,
|
|
99
99
|
makeQuestionToolModule,
|
|
100
|
-
|
|
100
|
+
omitNullOptionalToolArguments,
|
|
101
|
+
resolveTools,
|
|
102
|
+
withToolArgumentsErrorHint
|
|
101
103
|
} from '@yolk-sdk/agent/tools'
|
|
102
104
|
import {
|
|
103
105
|
AgentChatAction,
|
|
@@ -221,7 +223,7 @@ Server-side configuration fragment (the host supplies credentials and model poli
|
|
|
221
223
|
|
|
222
224
|
```ts
|
|
223
225
|
import { Layer, Redacted } from 'effect'
|
|
224
|
-
import { FetchHttpClient } from 'effect/
|
|
226
|
+
import { FetchHttpClient } from 'effect/http'
|
|
225
227
|
import { makeOpenCodeGoProviderLayer } from '@yolk-sdk/agent/providers/opencode/go-provider'
|
|
226
228
|
|
|
227
229
|
const GoLayer = makeOpenCodeGoProviderLayer({
|
|
@@ -249,7 +251,7 @@ Read Go subscription allowance separately from per-request token usage (server-s
|
|
|
249
251
|
|
|
250
252
|
```ts
|
|
251
253
|
import { Effect, Redacted } from 'effect'
|
|
252
|
-
import { FetchHttpClient } from 'effect/
|
|
254
|
+
import { FetchHttpClient } from 'effect/http'
|
|
253
255
|
import { fetchOpenCodeGoSubscriptionUsage } from '@yolk-sdk/agent/providers/opencode/usage'
|
|
254
256
|
|
|
255
257
|
const usageEffect = fetchOpenCodeGoSubscriptionUsage(Redacted.make(hostOpenCodeGoApiKey), {
|
|
@@ -302,7 +304,8 @@ for unions, refinements, and tuples. The Claude adapter therefore projects tool
|
|
|
302
304
|
provider-compatible object schema without `anyOf`, `oneOf`, `allOf`, or tuple-only `prefixItems`.
|
|
303
305
|
When a constraint cannot be represented faithfully, the projection widens the model-facing schema
|
|
304
306
|
rather than excluding a valid call. Tool execution remains safe because `makeTool` validates the
|
|
305
|
-
returned arguments against the original Effect Schema before invoking the
|
|
307
|
+
returned arguments against the original Effect Schema (through its JSON codec) before invoking the
|
|
308
|
+
executor.
|
|
306
309
|
|
|
307
310
|
Before projection, `toAnthropicClaudeRequestBody` and the Claude provider decode `ToolDef.parameters`
|
|
308
311
|
and `ToolCall.params` as `Schema.Json`. Non-JSON values fail as non-retryable `LLMError` with
|
|
@@ -326,7 +329,28 @@ remain opaque. Background wrapping preserves boolean `true`/`false` as the argum
|
|
|
326
329
|
reference/resource restrictions still apply at activation. `makeTool` may add root `type: "object"`
|
|
327
330
|
to typeless `anyOf`/`oneOf` unions whose members are all object schemas, as required by strict
|
|
328
331
|
OpenAI-compatible upstreams; primitives, unknown, and already-typed roots are unchanged, and call
|
|
329
|
-
validation still
|
|
332
|
+
validation still decodes through the original Effect Schema's JSON codec. Effect 4.0.0 exports
|
|
333
|
+
`Schema.isPattern` to JSON Schema only for `u`-flag regexes (optionally with `d`, `g`, or `y`);
|
|
334
|
+
add `u` to keep model-visible `pattern` hints.
|
|
335
|
+
|
|
336
|
+
### Tool arguments: `null` and unknown keys
|
|
337
|
+
|
|
338
|
+
Tool arguments are accepted exactly as advertised: unambiguous `null`s are normalized, and keys
|
|
339
|
+
that would be silently lost are rejected. `ToolDef.parameters` describes the schema's canonical JSON codec, so `Schema.optional(X)` is
|
|
340
|
+
advertised as `X | null`. `makeTool` (validate and execute), `makeInputTool`/`makeInteractionTool`
|
|
341
|
+
call params, and the loop `question` decode model arguments with `Schema.toCodecJson(parameters)`:
|
|
342
|
+
`null` on `Schema.optional(X)` decodes as absent and `withDecodingDefault` still applies,
|
|
343
|
+
`Schema.optional(Schema.NullOr(X))` keeps `null`, and required non-nullable fields still reject it.
|
|
344
|
+
`undefined`-valued keys from in-process callers count as absent.
|
|
345
|
+
Non-finite numbers (the codec's `"NaN"`/`"Infinity"` strings) are validation errors. Objects are
|
|
346
|
+
advertised closed (`additionalProperties: false`), so unknown keys at any depth are model-visible
|
|
347
|
+
validation errors instead of being stripped (also through closed-input declarations whose JSON codec
|
|
348
|
+
bypasses their own parser). Their error message names each unknown key and lists the allowed keys at that path; this includes
|
|
349
|
+
a `null` on another union member's field.
|
|
350
|
+
`resolveTools` also drops `null` where the advertised schema declares a property optional without
|
|
351
|
+
admitting `null` (for example `Schema.optionalKey(X)`, the subagent `model`, or raw MCP schemas)
|
|
352
|
+
before any registration sees the call; `omitNullOptionalToolArguments` (`@yolk-sdk/agent/tools`) exposes that step for hosts
|
|
353
|
+
that dispatch registrations themselves. User-submitted input/interaction responses are unchanged.
|
|
330
354
|
|
|
331
355
|
### OpenAI Chat Completions, Responses, and extraBody
|
|
332
356
|
|
|
@@ -419,7 +443,7 @@ Effect `HttpClient`:
|
|
|
419
443
|
|
|
420
444
|
```ts
|
|
421
445
|
import { Effect } from 'effect'
|
|
422
|
-
import { FetchHttpClient } from 'effect/
|
|
446
|
+
import { FetchHttpClient } from 'effect/http'
|
|
423
447
|
import { fetchOpenAiCodexSubscriptionUsage } from '@yolk-sdk/agent/providers/openai/codex-usage'
|
|
424
448
|
|
|
425
449
|
const snapshot = await fetchOpenAiCodexSubscriptionUsage(hostOAuthAccessToken).pipe(
|
|
@@ -775,7 +799,7 @@ as the chat provider:
|
|
|
775
799
|
|
|
776
800
|
```ts
|
|
777
801
|
import { Effect, Redacted } from 'effect'
|
|
778
|
-
import { FetchHttpClient } from 'effect/
|
|
802
|
+
import { FetchHttpClient } from 'effect/http'
|
|
779
803
|
import { classify } from '@yolk-sdk/agent/classification'
|
|
780
804
|
import { makeVercelAiGatewayClassifierLayer } from '@yolk-sdk/agent/providers/vercel/ai-gateway-classifier'
|
|
781
805
|
|
|
@@ -920,9 +944,10 @@ see the message and continue. The result includes structured content with `type`
|
|
|
920
944
|
`reason`, `message`, and optional `details` for UI/runtime handling.
|
|
921
945
|
|
|
922
946
|
Optional `makeTool({ invalidParamsMessage })` receives the `Schema.SchemaError` produced by
|
|
923
|
-
|
|
947
|
+
decoding `parameters` through its JSON codec (validate and execute). The decode error is passed
|
|
924
948
|
through unwrapped. Default text is `Invalid ${name} arguments: ${String(error)}`, which keeps the
|
|
925
|
-
`SchemaError(...)` wrapper
|
|
949
|
+
`SchemaError(...)` wrapper, followed by one line per object (path and allowed-key set) naming its unknown keys and
|
|
950
|
+
listing the allowed keys. Custom callbacks can append the same hint with `withToolArgumentsErrorHint(message, error)`. In Effect 4, `SchemaError` extends native `Error`, but the
|
|
926
951
|
wrapper remains part of this tool-message contract; do not default to `.message`.
|
|
927
952
|
Existing `(error: unknown) => string` callbacks remain assignable.
|
|
928
953
|
|
|
@@ -23,13 +23,13 @@ const BooleanClassifierQuestion = Schema.Struct({
|
|
|
23
23
|
const ChoiceClassifierQuestion = Schema.Struct({
|
|
24
24
|
type: Schema.Literal("choice"),
|
|
25
25
|
instructions: Schema.NonEmptyString,
|
|
26
|
-
criteria: Schema.Record(Schema.NonEmptyString, ClassifierCriterion).check(Schema.
|
|
26
|
+
criteria: Schema.Record(Schema.NonEmptyString, ClassifierCriterion).check(Schema.isBetweenProperties(2, 255))
|
|
27
27
|
});
|
|
28
28
|
/** Ordinal levels, lowest first: `criteria` describes each level (2 to 10 levels). */
|
|
29
29
|
const ScoreClassifierQuestion = Schema.Struct({
|
|
30
30
|
type: Schema.Literal("score"),
|
|
31
31
|
instructions: Schema.NonEmptyString,
|
|
32
|
-
criteria: Schema.NonEmptyArray(ClassifierCriterion).check(Schema.
|
|
32
|
+
criteria: Schema.NonEmptyArray(ClassifierCriterion).check(Schema.isBetweenLength(2, 10))
|
|
33
33
|
});
|
|
34
34
|
const ClassifierQuestion = Schema.Union([
|
|
35
35
|
BooleanClassifierQuestion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","names":[],"sources":["../../src/classification/schema.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\n\n/** Most named options one `choice` question may offer. */\nexport const maxClassifierChoiceOptions = 255\n\n/** Fewest named options one `choice` question must offer. */\nexport const minClassifierChoiceOptions = 2\n\n/** Fewest ordinal levels one `score` question must offer. */\nexport const minClassifierScoreLevels = 2\n\n/** Most ordinal levels one `score` question may offer. */\nexport const maxClassifierScoreLevels = 10\n\n/** What a criterion describes: a plain-language description or any JSON value. */\nexport const ClassifierCriterion = Schema.Json\n\nexport type ClassifierCriterion = typeof ClassifierCriterion.Type\n\n/** A yes/no question. `criteria` optionally describes what `true` and `false` mean. */\nexport const BooleanClassifierQuestion = Schema.Struct({\n type: Schema.Literal('boolean'),\n instructions: Schema.NonEmptyString,\n criteria: Schema.optionalKey(Schema.Struct({ true: Schema.String, false: Schema.String }))\n})\n\nexport type BooleanClassifierQuestion = typeof BooleanClassifierQuestion.Type\n\n/** One of named options: `criteria` maps each option key to what it means (2 to 255 options). */\nexport const ChoiceClassifierQuestion = Schema.Struct({\n type: Schema.Literal('choice'),\n instructions: Schema.NonEmptyString,\n criteria: Schema.Record(Schema.NonEmptyString, ClassifierCriterion).check(\n Schema.
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":[],"sources":["../../src/classification/schema.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\n\n/** Most named options one `choice` question may offer. */\nexport const maxClassifierChoiceOptions = 255\n\n/** Fewest named options one `choice` question must offer. */\nexport const minClassifierChoiceOptions = 2\n\n/** Fewest ordinal levels one `score` question must offer. */\nexport const minClassifierScoreLevels = 2\n\n/** Most ordinal levels one `score` question may offer. */\nexport const maxClassifierScoreLevels = 10\n\n/** What a criterion describes: a plain-language description or any JSON value. */\nexport const ClassifierCriterion = Schema.Json\n\nexport type ClassifierCriterion = typeof ClassifierCriterion.Type\n\n/** A yes/no question. `criteria` optionally describes what `true` and `false` mean. */\nexport const BooleanClassifierQuestion = Schema.Struct({\n type: Schema.Literal('boolean'),\n instructions: Schema.NonEmptyString,\n criteria: Schema.optionalKey(Schema.Struct({ true: Schema.String, false: Schema.String }))\n})\n\nexport type BooleanClassifierQuestion = typeof BooleanClassifierQuestion.Type\n\n/** One of named options: `criteria` maps each option key to what it means (2 to 255 options). */\nexport const ChoiceClassifierQuestion = Schema.Struct({\n type: Schema.Literal('choice'),\n instructions: Schema.NonEmptyString,\n criteria: Schema.Record(Schema.NonEmptyString, ClassifierCriterion).check(\n Schema.isBetweenProperties(minClassifierChoiceOptions, maxClassifierChoiceOptions)\n )\n})\n\nexport type ChoiceClassifierQuestion = typeof ChoiceClassifierQuestion.Type\n\n/** Ordinal levels, lowest first: `criteria` describes each level (2 to 10 levels). */\nexport const ScoreClassifierQuestion = Schema.Struct({\n type: Schema.Literal('score'),\n instructions: Schema.NonEmptyString,\n criteria: Schema.NonEmptyArray(ClassifierCriterion).check(\n Schema.isBetweenLength(minClassifierScoreLevels, maxClassifierScoreLevels)\n )\n})\n\nexport type ScoreClassifierQuestion = typeof ScoreClassifierQuestion.Type\n\nexport const ClassifierQuestion = Schema.Union([\n BooleanClassifierQuestion,\n ChoiceClassifierQuestion,\n ScoreClassifierQuestion\n])\n\nexport type ClassifierQuestion = typeof ClassifierQuestion.Type\n\nexport type ClassifierQuestionType = ClassifierQuestion['type']\n\n/** Named questions answered together about one state; at least one. */\nexport const ClassifierQuestions = Schema.Record(Schema.NonEmptyString, ClassifierQuestion).check(\n Schema.isMinProperties(1)\n)\n\nexport type ClassifierQuestions = typeof ClassifierQuestions.Type\n\n/** The one value a classification is about: a string, a JSON object, or a JSON array. */\nexport const ClassifierState = Schema.Union([\n Schema.String,\n Schema.JsonObject,\n Schema.Array(Schema.Json)\n])\n\nexport type ClassifierState = typeof ClassifierState.Type\n\n/** A finite probability in `[0, 1]`, kept exactly as the provider returned it. */\nexport const ClassifierProbability = Schema.Finite.check(\n Schema.isBetween({ minimum: 0, maximum: 1 })\n)\n\n/** Probabilities by option key (choice) or level (score); never renormalized. */\nexport const ClassifierProbabilities = Schema.Record(Schema.String, ClassifierProbability)\n\nexport type ClassifierProbabilities = typeof ClassifierProbabilities.Type\n\nexport const BooleanClassifierAnswer = Schema.Struct({\n type: Schema.Literal('boolean'),\n /** Probability that the answer is `true`. */\n probability: ClassifierProbability\n})\n\nexport type BooleanClassifierAnswer = typeof BooleanClassifierAnswer.Type\n\nexport const ChoiceClassifierAnswer = Schema.Struct({\n type: Schema.Literal('choice'),\n /** The chosen option key; always one of the question's `criteria` keys. */\n choice: Schema.String,\n probabilities: ClassifierProbabilities,\n confidence: Schema.optionalKey(ClassifierProbability)\n})\n\nexport type ChoiceClassifierAnswer = typeof ChoiceClassifierAnswer.Type\n\nexport const ScoreClassifierAnswer = Schema.Struct({\n type: Schema.Literal('score'),\n /** The chosen level, as the provider returned it. */\n score: Schema.Finite,\n probabilities: ClassifierProbabilities,\n confidence: Schema.optionalKey(ClassifierProbability)\n})\n\nexport type ScoreClassifierAnswer = typeof ScoreClassifierAnswer.Type\n\nexport const ClassifierAnswer = Schema.Union([\n BooleanClassifierAnswer,\n ChoiceClassifierAnswer,\n ScoreClassifierAnswer\n])\n\nexport type ClassifierAnswer = typeof ClassifierAnswer.Type\n\nconst TokenCount = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\n\n/** Billed usage of one classification; recorded even when its answers fail to decode. */\nexport const ClassificationUsage = Schema.Struct({\n inputTokens: TokenCount,\n outputTokens: TokenCount,\n /** Provider-reported cost in US dollars, when the provider reports one. */\n costUsd: Schema.optionalKey(Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0)))\n})\n\nexport type ClassificationUsage = typeof ClassificationUsage.Type\n\n/** One classification: a state and the named questions to answer about it. */\nexport const ClassificationRequest = Schema.Struct({\n state: ClassifierState,\n questions: ClassifierQuestions,\n /** Provider-specific options, passed through unchanged (for example `{ gateway: { ... } }`). */\n providerOptions: Schema.optionalKey(Schema.JsonObject)\n})\n\nexport type ClassificationRequest = typeof ClassificationRequest.Type\n\nexport const ClassificationResult = Schema.Struct({\n /** The model that answered, as the provider reported it. */\n model: Schema.NonEmptyString,\n /** One answer per question id, with the question's type. */\n answers: Schema.Record(Schema.String, ClassifierAnswer),\n usage: Schema.optionalKey(ClassificationUsage),\n providerMetadata: Schema.optionalKey(Schema.JsonObject)\n})\n\nexport type ClassificationResult = typeof ClassificationResult.Type\n"],"mappings":";;;AAGA,MAAa,6BAA6B;;AAG1C,MAAa,6BAA6B;;AAG1C,MAAa,2BAA2B;;AAGxC,MAAa,2BAA2B;;AAGxC,MAAa,sBAAsB,OAAO;;AAK1C,MAAa,4BAA4B,OAAO,OAAO;CACrD,MAAM,OAAO,QAAQ,SAAS;CAC9B,cAAc,OAAO;CACrB,UAAU,OAAO,YAAY,OAAO,OAAO;EAAE,MAAM,OAAO;EAAQ,OAAO,OAAO;CAAO,CAAC,CAAC;AAC3F,CAAC;;AAKD,MAAa,2BAA2B,OAAO,OAAO;CACpD,MAAM,OAAO,QAAQ,QAAQ;CAC7B,cAAc,OAAO;CACrB,UAAU,OAAO,OAAO,OAAO,gBAAgB,mBAAmB,EAAE,MAClE,OAAO,oBAAA,GAAA,GAA0E,CACnF;AACF,CAAC;;AAKD,MAAa,0BAA0B,OAAO,OAAO;CACnD,MAAM,OAAO,QAAQ,OAAO;CAC5B,cAAc,OAAO;CACrB,UAAU,OAAO,cAAc,mBAAmB,EAAE,MAClD,OAAO,gBAAA,GAAA,EAAkE,CAC3E;AACF,CAAC;AAID,MAAa,qBAAqB,OAAO,MAAM;CAC7C;CACA;CACA;AACF,CAAC;;AAOD,MAAa,sBAAsB,OAAO,OAAO,OAAO,gBAAgB,kBAAkB,EAAE,MAC1F,OAAO,gBAAgB,CAAC,CAC1B;;AAKA,MAAa,kBAAkB,OAAO,MAAM;CAC1C,OAAO;CACP,OAAO;CACP,OAAO,MAAM,OAAO,IAAI;AAC1B,CAAC;;AAKD,MAAa,wBAAwB,OAAO,OAAO,MACjD,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAE,CAAC,CAC7C;;AAGA,MAAa,0BAA0B,OAAO,OAAO,OAAO,QAAQ,qBAAqB;AAIzF,MAAa,0BAA0B,OAAO,OAAO;CACnD,MAAM,OAAO,QAAQ,SAAS;;CAE9B,aAAa;AACf,CAAC;AAID,MAAa,yBAAyB,OAAO,OAAO;CAClD,MAAM,OAAO,QAAQ,QAAQ;;CAE7B,QAAQ,OAAO;CACf,eAAe;CACf,YAAY,OAAO,YAAY,qBAAqB;AACtD,CAAC;AAID,MAAa,wBAAwB,OAAO,OAAO;CACjD,MAAM,OAAO,QAAQ,OAAO;;CAE5B,OAAO,OAAO;CACd,eAAe;CACf,YAAY,OAAO,YAAY,qBAAqB;AACtD,CAAC;AAID,MAAa,mBAAmB,OAAO,MAAM;CAC3C;CACA;CACA;AACF,CAAC;AAID,MAAM,aAAa,OAAO,IAAI,MAAM,OAAO,uBAAuB,CAAC,CAAC;;AAGpE,MAAa,sBAAsB,OAAO,OAAO;CAC/C,aAAa;CACb,cAAc;;CAEd,SAAS,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,uBAAuB,CAAC,CAAC,CAAC;AACnF,CAAC;;AAKD,MAAa,wBAAwB,OAAO,OAAO;CACjD,OAAO;CACP,WAAW;;CAEX,iBAAiB,OAAO,YAAY,OAAO,UAAU;AACvD,CAAC;AAID,MAAa,uBAAuB,OAAO,OAAO;;CAEhD,OAAO,OAAO;;CAEd,SAAS,OAAO,OAAO,OAAO,QAAQ,gBAAgB;CACtD,OAAO,OAAO,YAAY,mBAAmB;CAC7C,kBAAkB,OAAO,YAAY,OAAO,UAAU;AACxD,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { AgentTranscript } from "./state.mjs";
|
|
|
2
2
|
import { Cause, Effect, Layer, Stream } from "effect";
|
|
3
3
|
import * as Schema$1 from "effect/Schema";
|
|
4
4
|
import { AgentEvent, AgentReasoningEffort, HitlResponse, InputResponse, InteractionResponse, QuestionResponse, ToolApprovalResponse } from "@yolk-sdk/agent/protocol";
|
|
5
|
-
import { HttpClient } from "effect/
|
|
5
|
+
import { HttpClient } from "effect/http";
|
|
6
6
|
|
|
7
7
|
//#region src/client/transport.d.ts
|
|
8
8
|
declare const AgentTransportError_base: Schema$1.Class<AgentTransportError, Schema$1.TaggedStruct<"AgentTransportError", {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Cause, Channel, Data, Effect, Exit, Match, Predicate, Pull, Queue, Ref, Result, Scope, Stream } from "effect";
|
|
2
2
|
import * as Schema$1 from "effect/Schema";
|
|
3
3
|
import { AgentEvent, AgentWebSocketServerMessage, InputResponseInput, InteractionResponseInput, QuestionResponseInput, ToolApprovalResponseInput, UserInput, isTerminalAgentEvent } from "@yolk-sdk/agent/protocol";
|
|
4
|
-
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/
|
|
4
|
+
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/http";
|
|
5
5
|
//#region src/client/transport.ts
|
|
6
6
|
var AgentTransportError = class extends Schema$1.TaggedError()("AgentTransportError", {
|
|
7
7
|
message: Schema$1.String,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.mjs","names":["Schema"],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Data,\n Effect,\n Exit,\n Match,\n Predicate,\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 InputResponseInput,\n InteractionResponseInput,\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 AgentWebSocketClientMessage,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n InputResponse,\n InteractionResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedError<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 SubmitInputResponseRequest = StreamAgentEventsRequest & {\n readonly response: InputResponse\n}\n\nexport type SubmitInteractionResponseRequest = StreamAgentEventsRequest & {\n readonly response: InteractionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\n\nconst defaultRunContinuationLimit = 120\n\nconst defaultIdleReconnectMaxAttempts = 12\n\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\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: Schema.SchemaError) =>\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\ntype AgentHttpEventsRequestJson = Pick<\n StreamAgentEventsRequest,\n 'sessionId' | 'messages' | 'hitlResponses' | 'model' | 'reasoningEffort'\n>\n\ntype AgentHttpHitlResponseRequestJson = Pick<\n StreamAgentRunHitlResponseEventsRequest,\n 'hitlResponses'\n>\n\ntype TransportJsonStringInput =\n | AgentWebSocketClientMessage\n | AgentHttpEventsRequestJson\n | AgentHttpHitlResponseRequestJson\n\nconst encodeJsonString = (value: TransportJsonStringInput, message: string) =>\n Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown))(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.fromJsonString(Schema.Unknown))(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* Schema.decodeUnknownEffect(AgentEvent)(parsed).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\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* Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(parsed).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage =>\n Predicate.isTagged(message, '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 const clientInput: AgentWebSocketClientMessage = Match.value(hitlResponse).pipe(\n Match.tag('ToolApprovalResponse', approval =>\n ToolApprovalResponseInput.make({\n response: approval,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('QuestionResponse', answer =>\n QuestionResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('InputResponse', answer =>\n InputResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('InteractionResponse', answer =>\n InteractionResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.exhaustive\n )\n\n return yield* encodeJsonString(clientInput, 'Could not serialize WebSocket HITL response')\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\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\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\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\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\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\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\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\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\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\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n\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\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\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\n return\n }\n }\n\n yield* run()\n })\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\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\nexport const streamInputResponseEventStream = (request: SubmitInputResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamInteractionResponseEventStream = (request: SubmitInteractionResponseRequest) =>\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\nconst AgentEventPullResult = Data.taggedEnum<AgentEventPullResult>()\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(AgentEventPullResult.Events({ events })),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed(AgentEventPullResult.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 => AgentEventPullResult.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\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 return yield* Match.value(pulled).pipe(\n Match.tag('Idle', () =>\n Effect.succeed({ count: state.count, terminal: state.terminal, idle: true })\n ),\n Match.tag('Done', () =>\n Effect.succeed({ count: state.count, terminal: state.terminal, idle: false })\n ),\n Match.tag('Events', current =>\n Effect.gen(function* () {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of current.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) {\n return { count, terminal, idle: false }\n }\n }\n\n return yield* run({ count, terminal })\n })\n ),\n Match.exhaustive\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\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n\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\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\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\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\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\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 !Predicate.isTagged(message, '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\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n\n const failQueue = (error: AgentTransportError) =>\n Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n\n const handleMessage = (event: MessageEvent) => {\n if (!Predicate.isString(event.data)) {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (Predicate.isTagged(message, '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\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\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":";;;;;AAiDA,IAAa,sBAAb,cAAyCA,SAAO,YAAiC,EAC/E,uBACA;CACE,SAASA,SAAO;CAChB,OAAOA,SAAO;AAChB,CACF,EAAE,CAAC;AA0FH,MAAM,kBAAkB;AAExB,MAAM,8BAA8B;AAEpC,MAAM,kCAAkC;AAExC,MAAM,uBAAuB;AAE7B,MAAM,eAAe,SAAuD,SAAiB;CAC3F,MAAM,SAAS,QAAQ;CAEvB,IAAI,WAAW,KAAA,GACb,OAAO;CAGT,MAAM,iBAAiB,KAAK,YAAY;CAExC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,IAAI,IAAI,YAAY,MAAM,gBACxB,OAAO;AAKb;AAEA,MAAM,uBACJ,SACA,SACG;CACH,MAAM,QAAQ,YAAY,SAAS,IAAI,GAAG,KAAK;CAE/C,OAAO,UAAU,KAAA,KAAa,MAAM,WAAW,IAAI,KAAA,IAAY;AACjE;AAEA,MAAM,qBAAqB;AAE3B,MAAM,oBAAoB,QAAgB;CACxC,MAAM,QAAQ,IAAI,KAAK;CAEvB,IAAI,CAAC,mBAAmB,KAAK,KAAK,GAChC;CAGF,MAAM,SAAS,OAAO,SAAS,OAAO,EAAE;CAExC,OAAO,OAAO,cAAc,MAAM,IAAI,SAAS,KAAA;AACjD;AAEA,MAAa,yBAAyB,YACpC,oBAAoB,SAAS,mBAAmB;AAElD,MAAa,sCACX,YACG;CACH,MAAM,MAAM,oBAAoB,SAAS,8BAA8B;CAEvE,IAAI,QAAQ,KAAA,GAAW,OAAO,KAAA;CAE9B,MAAM,SAAS,iBAAiB,GAAG;CAEnC,OAAO,WAAW,KAAA,KAAa,UAAU,KAAK,SAAS,KAAA;AACzD;AAEA,MAAa,uCACX,YACG;CACH,MAAM,YAAY,mCAAmC,OAAO;CAE5D,OAAO,cAAc,KAAA,IAAY,KAAA,IAAY,YAAY;AAC3D;AAEA,MAAa,kCAAkC,UAAkB,eAAwB;CACvF,IAAI,eAAe,KAAA,GAAW,OAAO;CAErC,2BAA2B,UAAU;CAErC,MAAM,SAAS,qBAAqB,QAAQ;CAC5C,OAAO,IAAI,aAAa,IAAI,cAAc,OAAO,UAAU,CAAC;CAE5D,OAAO,kBAAkB,MAAM;AACjC;AAQA,MAAM,qBAAqB;AAE3B,MAAM,gCAAgC,aACpC,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,iBAAiB,aACrB,OAAO,WAAW;CAChB,KAAK,IAAI,IAAI,UAAU,oBAAoB;CAC3C,UAAU,mBAAmB,KAAK,QAAQ;CAC1C,cAAc,SAAS,WAAW,GAAG;AACvC,EAAE,EAAE,KACF,OAAO,MAAM;CACX,iBAAiB,KAAA;CACjB,YAAW,WAAU;AACvB,CAAC,CACH;AAEF,MAAM,wBAAwB,aAAqB;CACjD,MAAM,SAAS,cAAc,QAAQ;CAErC,IAAI,WAAW,KAAA,GACb,OAAO;CAGT,MAAM,6BAA6B,QAAQ;AAC7C;AAEA,MAAM,uBAAuB,aAAqB;CAChD,MAAM,SAAS,cAAc,QAAQ;CAErC,OAAO,WAAW,KAAA,IACd,OAAO,KAAK,6BAA6B,QAAQ,CAAC,IAClD,OAAO,QAAQ,MAAM;AAC3B;AAEA,MAAM,qBAAqB,aAA6B;CACtD,IAAI,SAAS,UACX,OAAO,SAAS,IAAI,SAAS;CAG/B,MAAM,aAAa,GAAG,SAAS,IAAI,WAAW,SAAS,IAAI,SAAS,SAAS,IAAI;CAEjF,OAAO,SAAS,eAAe,aAAa,WAAW,MAAM,CAAC;AAChE;AAEA,MAAM,4BAA4B,UAAkB,YAAoB;CACtE,MAAM,SAAS,qBAAqB,QAAQ;CAE5C,MAAM,WAAW,OAAO,IAAI,SAAS,SAAS,GAAG,IAC7C,OAAO,IAAI,SAAS,MAAM,GAAG,EAAE,IAC/B,OAAO,IAAI;CAEf,OAAO,IAAI,WAAW,GAAG,SAAS,GAAG,mBAAmB,OAAO;CAE/D,OAAO,kBAAkB,MAAM;AACjC;AAEA,MAAM,2BAA2B,UAA8B,UAC7D,yBAAyB,YAAY,iBAAiB,KAAK;AAE7D,MAAM,yCAAyC,UAC7C,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,mCAAmC,UAA8B;CACrE,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO,QAAQ,2BAA2B;CAE1E,OAAO,OAAO,cAAc,KAAK,KAAK,SAAS,IAC3C,OAAO,QAAQ,KAAK,IACpB,OAAO,KAAK,sCAAsC,KAAK,CAAC;AAC9D;AAEA,MAAM,wCAAwC,UAC5C,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,kCAAkC,UAA8B;CACpE,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO,QAAQ,+BAA+B;CAE9E,OAAO,OAAO,cAAc,KAAK,KAAK,SAAS,IAC3C,OAAO,QAAQ,KAAK,IACpB,OAAO,KAAK,qCAAqC,KAAK,CAAC;AAC7D;AAEA,MAAM,uCAAuC,YAAsD;CACjG,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO;CAEzC,IAAI,CAAC,OAAO,cAAc,QAAQ,aAAa,KAAK,QAAQ,iBAAiB,GAC3E,OAAO,OAAO,KACZ,IAAI,oBAAoB;EACtB,SAAS;EACT,OAAO,QAAQ;CACjB,CAAC,CACH;CAGF,OAAO,+BAA+B,QAAQ,WAAW,EAAE,KAAK,OAAO,MAAM;AAC/E;AAEA,MAAM,8BAA8B,eAAmC;CACrE,IAAI,eAAe,KAAA,KAAc,OAAO,cAAc,UAAU,KAAK,cAAc,GACjF;CAGF,MAAM,+BAA+B,UAAU;AACjD;AAEA,MAAM,kCAAkC,eACtC,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,oCAAoC,eACxC,eAAe,KAAA,KAAc,OAAO,cAAc,UAAU,KAAK,cAAc,IAC3E,OAAO,OACP,OAAO,KAAK,+BAA+B,UAAU,CAAC;AAE5D,MAAM,wCAAwC,UAAkB,eAC9D,OAAO,IAAI,aAAa;CACtB,IAAI,eAAe,KAAA,GAAW,OAAO;CAErC,OAAO,iCAAiC,UAAU;CAElD,MAAM,SAAS,OAAO,oBAAoB,QAAQ;CAClD,OAAO,IAAI,aAAa,IAAI,cAAc,OAAO,UAAU,CAAC;CAE5D,OAAO,kBAAkB,MAAM;AACjC,CAAC;AAEH,MAAM,0BAA0B,YAAgC,WAC7D,cAAc,KAAK;AAEtB,MAAM,oBAAoB,UACxB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,MAAM,oBAAoB,SAAiB,UACzC,IAAI,oBAAoB;CACtB;CACA;AACF,CAAC;AAEH,MAAM,8BAA8B,aAAqB,UACvD,iBAAiB,GAAG,QAAQ,IAAI,MAAM,WAAW,KAAK;AAiBxD,MAAM,oBAAoB,OAAiC,YACzDA,SAAO,oBAAoBA,SAAO,eAAeA,SAAO,OAAO,CAAC,EAAE,KAAK,EAAE,KACvE,OAAO,UACL,UACE,IAAI,oBAAoB;CACtB,SAAS,GAAG,QAAQ,IAAI,iBAAiB,KAAK;CAC9C,OAAO;AACT,CAAC,CACL,CACF;AAEF,MAAM,oBAAoB,KAAa,YACrCA,SAAO,oBAAoBA,SAAO,eAAeA,SAAO,OAAO,CAAC,EAAE,GAAG,EAAE,KACrE,OAAO,UACL,UACE,IAAI,oBAAoB;CACtB,SAAS,GAAG,QAAQ,IAAI,iBAAiB,KAAK;CAC9C,OAAO;AACT,CAAC,CACL,CACF;AAEF,MAAM,uBAAuB,SAC3B,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,iBAAiB,MAAM,qBAAqB;CAElE,OAAO,OAAOA,SAAO,oBAAoB,UAAU,EAAE,MAAM,EAAE,KAC3D,OAAO,UACL,UACE,IAAI,oBAAoB;EACtB,SAAS,wBAAwB,iBAAiB,KAAK;EACvD,OAAO;CACT,CAAC,CACL,CACF;AACF,CAAC;AAEH,MAAM,+BACJ,QAEA,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,iBAAiB,KAAK,2BAA2B;CAEvE,OAAO,OAAOA,SAAO,oBAAoB,2BAA2B,EAAE,MAAM,EAAE,KAC5E,OAAO,UACL,UACE,IAAI,oBAAoB;EACtB,SAAS,oCAAoC,iBAAiB,KAAK;EACnE,OAAO;CACT,CAAC,CACL,CACF;AACF,CAAC;AAEH,MAAM,iBAAiB,YACrB,UAAU,SAAS,SAAS,MAAM;AAEpC,MAAM,mBACJ,aACoD;CAEpD,MAAM,UADW,SAAS,MAAM,EAAE,QACX,EAAE,KAAK,aAAa;CAE3C,IAAI,YAAY,KAAA,GACd,OAAO,OAAO,KACZ,IAAI,oBAAoB;EACtB,SAAS;EACT,OAAO;CACT,CAAC,CACH;CAGF,OAAO,OAAO,QAAQ,OAAO;AAC/B;AAEA,MAAM,uBACJ,SACA,qBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,eAAe,QAAQ,gBAAgB;CAE7C,IAAI,QAAQ,kBAAkB,KAAA,KAAa,QAAQ,cAAc,SAAS,GACxE,OAAO,OAAO,OAAO,KACnB,IAAI,oBAAoB;EACtB,SAAS;EACT,OAAO,QAAQ;CACjB,CAAC,CACH;CAGF,IAAI,iBAAiB,KAAA,GAAW;EAC9B,MAAM,UAAU,OAAO,gBAAgB,QAAQ,QAAQ;EAEvD,OAAO,OAAO,iBACZ,UAAU,KAAK;GACb;GACA;GACA,OAAO,QAAQ;GACf,iBAAiB,QAAQ;EAC3B,CAAC,GACD,0CACF;CACF;CAsCA,OAAO,OAAO,iBApCmC,MAAM,MAAM,YAAY,EAAE,KACzE,MAAM,IAAI,yBAAwB,aAChC,0BAA0B,KAAK;EAC7B,UAAU;EACV;EACA,OAAO,QAAQ;EACf,iBAAiB,QAAQ;CAC3B,CAAC,CACH,GACA,MAAM,IAAI,qBAAoB,WAC5B,sBAAsB,KAAK;EACzB,UAAU;EACV;EACA,OAAO,QAAQ;EACf,iBAAiB,QAAQ;CAC3B,CAAC,CACH,GACA,MAAM,IAAI,kBAAiB,WACzB,mBAAmB,KAAK;EACtB,UAAU;EACV;EACA,OAAO,QAAQ;EACf,iBAAiB,QAAQ;CAC3B,CAAC,CACH,GACA,MAAM,IAAI,wBAAuB,WAC/B,yBAAyB,KAAK;EAC5B,UAAU;EACV;EACA,OAAO,QAAQ;EACf,iBAAiB,QAAQ;CAC3B,CAAC,CACH,GACA,MAAM,UAGiC,GAAG,6CAA6C;AAC3F,CAAC;AAEH,MAAM,wBAAwB,aAC5B,SAAS,KAAK,KACZ,OAAO,SAAS,2BAA2B,iCAAiC,CAAC,GAC7E,OAAO,KAAI,SAAS,KAAK,SAAS,IAAI,OAAO,uBAAuB,SAAS,QAAS,CACxF;AAEF,MAAM,mBAAmB,YACvB,iBACE;CACE,WAAW,QAAQ;CACnB,UAAU,QAAQ;CAClB,eAAe,QAAQ;CACvB,OAAO,QAAQ;CACf,iBAAiB,QAAQ;AAC3B,GACA,mCACF,EAAE,KACA,OAAO,KAAI,SACT,kBAAkB,KAAK,QAAQ,YAAY,eAAe,EAAE,KAC1D,kBAAkB,WAAW;CAC3B,QAAQ;CACR,gBAAgB;AAClB,CAAC,GACD,kBAAkB,SAAS,MAAM,kBAAkB,CACrD,CACF,CACF;AAEF,MAAM,kCAAkC,YACtC,iBACE,EAAE,eAAe,QAAQ,cAAc,GACvC,6CACF,EAAE,KACA,OAAO,KAAI,SACT,kBAAkB,KAAK,QAAQ,QAAQ,EAAE,KACvC,kBAAkB,WAAW;CAC3B,QAAQ;CACR,gBAAgB;AAClB,CAAC,GACD,kBAAkB,SAAS,MAAM,kBAAkB,CACrD,CACF,CACF;AAEF,MAAM,wBAAwB,YAC5B,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,WAAW;CACjC,MAAM,cAAc,OAAO,gBAAgB,OAAO;CAElD,MAAM,WAAW,OAAO,OACrB,QAAQ,WAAW,EACnB,KAAK,OAAO,SAAS,2BAA2B,sBAAsB,CAAC,CAAC;CAE3E,IAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;EACnD,OAAO,OAAO,WACZ,QAAQ,aAAa;GAAE,QAAQ,SAAS;GAAQ,SAAS,SAAS;EAAQ,CAAC,CAC7E;EAEA,OAAO;CACT;CAEA,MAAM,UAAU,OAAO,qBAAqB,QAAQ;CAEpD,OAAO,OAAO,OAAO,KACnB,IAAI,oBAAoB;EACtB,SAAS,yBAAyB,SAAS,OAAO,KAAK;EACvD,OAAO,SAAS;CAClB,CAAC,CACH;AACF,CAAC;AAEH,MAAM,2BAA2B,YAC/B,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,qCACtB,QAAQ,UACR,QAAQ,UACV;CAIA,MAAM,WAAW,QAAO,OAFF,WAAW,YAG9B,QACC,kBAAkB,IAAI,QAAQ,EAAE,KAC9B,kBAAkB,WAAW,EAAE,QAAQ,uBAAuB,CAAC,CACjE,CACF,EACC,KAAK,OAAO,SAAS,2BAA2B,0BAA0B,CAAC,CAAC;CAE/E,IAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;EACnD,OAAO,OAAO,WACZ,QAAQ,aAAa;GAAE,QAAQ,SAAS;GAAQ,SAAS,SAAS;EAAQ,CAAC,CAC7E;EAEA,OAAO;CACT;CAEA,MAAM,UAAU,OAAO,qBAAqB,QAAQ;CAEpD,OAAO,OAAO,OAAO,KACnB,IAAI,oBAAoB;EACtB,SAAS,6BAA6B,SAAS,OAAO,KAAK;EAC3D,OAAO,SAAS;CAClB,CAAC,CACH;AACF,CAAC;AAEH,MAAM,+BAA+B,YACnC,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,WAAW;CACjC,MAAM,cAAc,OAAO,+BAA+B,OAAO;CAEjE,MAAM,WAAW,OAAO,OACrB,QAAQ,WAAW,EACnB,KAAK,OAAO,SAAS,2BAA2B,+BAA+B,CAAC,CAAC;CAEpF,IAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;EACnD,OAAO,OAAO,WACZ,QAAQ,aAAa;GAAE,QAAQ,SAAS;GAAQ,SAAS,SAAS;EAAQ,CAAC,CAC7E;EAEA,OAAO;CACT;CAEA,MAAM,UAAU,OAAO,qBAAqB,QAAQ;CAEpD,OAAO,OAAO,OAAO,KACnB,IAAI,oBAAoB;EACtB,SAAS,kCAAkC,SAAS,OAAO,KAAK;EAChE,OAAO,SAAS;CAClB,CAAC,CACH;AACF,CAAC;AAEH,MAAa,kBAAkB,YAC7B,OAAO,IAAI,aAAa;CAGtB,MAAM,WAAW,QAAO,OAFF,WAAW,YAG9B,QAAQ,kBAAkB,OAAO,QAAQ,QAAQ,CAAC,EAClD,KAAK,OAAO,SAAS,2BAA2B,yBAAyB,CAAC,CAAC;CAE9E,IAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAC9C;CAGF,MAAM,UAAU,OAAO,qBAAqB,QAAQ;CAEpD,OAAO,OAAO,OAAO,KACnB,IAAI,oBAAoB;EACtB,SAAS,4BAA4B,SAAS,OAAO,KAAK;EAC1D,OAAO,SAAS;CAClB,CAAC,CACH;AACF,CAAC,EAAE,KAAK,OAAO,QAAQ,QAAQ,mBAAmB,gBAAgB,KAAK,CAAC;AAE1E,MAAM,wBAAwB,aAC5B,SAAS,OAAO,KACd,OAAO,SAAS,2BAA2B,oCAAoC,CAAC,GAChF,OAAO,YACP,OAAO,YACP,OAAO,KAAI,SAAQ,KAAK,KAAK,CAAC,GAC9B,OAAO,QAAO,SAAQ,KAAK,SAAS,CAAC,CACvC;AAEF,MAAM,cAAc,UAAuB,MAAM,MAAM,OAAO,KAAK,QAAQ,KAAA,CAAS,CAAC;AAIrF,MAAM,yBAAyB,aAC7B,OAAO,UAA8C,UACnD,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO,MAAM;CAGnC,MAAM,gBAAgB,OAAO,MAAM,KAAK;CACxC,MAAM,sBAAsB,OAAO,IAAI,KAAK,KAAK;CACjD,MAAM,kBAAkB,OAAO,IAAI,KAAK,KAAK;CAE7C,MAAM,OAAO,OAAO,QAAQ,aAC1B,OAAO,UAAU,qBAAqB,QAAQ,CAAC,GAC/C,aACF;CAEA,MAAM,qBAAqB,OAAO,IAAI,aAAa;EAGjD,IAAI,EAAC,OAFiB,IAAI,IAAI,mBAAmB,IAEpC;GACX,OAAO,IAAI,IAAI,qBAAqB,IAAI;GACxC,OAAO,WAAW,aAAa;EACjC;CACF,CAAC;CAED,MAAM,WAAW,MAAM,IAAI,KAAK,EAAE,KAAK,OAAO,MAAM;CAEpD,MAAM,aAAa,UACjB,MAAM,UAAU,OAAO,KAAK,EAAE,KAAK,OAAO,QAAQ,kBAAkB,GAAG,OAAO,MAAM;CAEtF,MAAM,sBACJ,KAAK,YAAY,MAAM;EACrB,iBAAiB,cAAc;EAC/B,YAAW,UAAS,OAAO,UAAU,KAAK;EAC1C,cAAc,OAAO;CACvB,CAAC;CAEH,MAAM,qBAAqB,OAAO,IAAI,aAAa;EACjD,OAAO,IAAI,IAAI,iBAAiB,IAAI;EACpC,OAAO;EACP,OAAO,cAAc,EAAE,KACrB,OAAO,YAAY,OAAO,IAAI,GAC9B,OAAO,SAAS,kBAAkB,GAClC,OAAO,WAAW,EAAE,kBAAkB,KAAK,CAAC,GAC5C,OAAO,MACT;CACF,CAAC;CAED,MAAM,aAAa,UACjB,OAAO,IAAI,aAAa;EACtB,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,QAAQ,OAAO,oBAAoB,IAAI;GAE7C,OAAO,MAAM,MAAM,OAAO,KAAK;GAE/B,IAAI,qBAAqB,KAAK,GAAG;IAC/B,OAAO;IAEP;GACF;EACF;EAEA,OAAO,IAAI;CACb,CAAC;CAEH,MAAM,YACJ,KAAK,YAAY,MAAM;EACrB,WAAW;EACX,WAAW;EACX,cAAc,SAAS,KAAK,OAAO,QAAQ,kBAAkB,CAAC;CAChE,CAAC;CAEH,OAAO,MAAM,aACX,eACA,OAAO,IAAI,aAAa;EAGtB,IAAI,EAAC,OAFmB,IAAI,IAAI,eAAe,IAG7C,OAAO;CAEX,CAAC,CACH;CAEA,OAAO,IAAI;AACb,CAAC,EAAE,KAGD,OAAO,QAAO,SACZ,KAAK,UAAU,IAAI,IAAI,MAAM,UAAU,OAAO,KAAK,KAAK,EAAE,KAAK,OAAO,MAAM,IAAI,OAAO,IACzF,CACF,CACF;AAEF,MAAM,oBAAoB,WACxB,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO,OAAO;AAChB,CAAC;AAEH,MAAM,qBAAqB,WACzB,OAAO,UAAqC,WAAU;CACpD,IAAI,OAAO,SAAS;EAClB,OAAO,OAAO,KAAK,iBAAiB,MAAM,CAAC,CAAC;EAE5C,OAAO,OAAO;CAChB;CAEA,MAAM,iBAAiB,OAAO,OAAO,KAAK,iBAAiB,MAAM,CAAC,CAAC;CACnE,OAAO,iBAAiB,SAAS,UAAU,EAAE,MAAM,KAAK,CAAC;CAEzD,OAAO,OAAO,WAAW,OAAO,oBAAoB,SAAS,QAAQ,CAAC;AACxE,CAAC;AAEH,MAAM,oBACJ,QACA,WACI,WAAW,KAAA,IAAY,SAAS,OAAO,KAAK,OAAO,cAAc,kBAAkB,MAAM,CAAC,CAAC;AAEjG,MAAa,0BAA0B,YACrC,iBACE,OAAO,WAAW,qBAAqB,OAAO,CAAC,EAAE,KAAK,OAAO,QAAQ,qBAAqB,CAAC,GAC3F,QAAQ,MACV,EAAE,KAAK,OAAO,QAAQ,QAAQ,mBAAmB,gBAAgB,KAAK,CAAC;AAEzE,MAAa,6BAA6B,YACxC,iBACE,OAAO,WAAW,wBAAwB,OAAO,CAAC,EAAE,KAAK,OAAO,QAAQ,qBAAqB,CAAC,GAC9F,QAAQ,MACV,EAAE,KAAK,OAAO,QAAQ,QAAQ,mBAAmB,gBAAgB,KAAK,CAAC;AAEzE,MAAa,yCACX,YAEA,iBACE,OAAO,WAAW,4BAA4B,OAAO,CAAC,EAAE,KACtD,OAAO,QAAQ,qBAAqB,CACtC,GACA,QAAQ,MACV,EAAE,KAAK,OAAO,QAAQ,QAAQ,mBAAmB,gBAAgB,KAAK,CAAC;AAEzE,MAAa,yCAAyC,YACpD,uBAAuB;CAAE,GAAG;CAAS,eAAe,CAAC,QAAQ,QAAQ;AAAE,CAAC;AAE1E,MAAa,qCAAqC,YAChD,uBAAuB;CAAE,GAAG;CAAS,eAAe,CAAC,QAAQ,QAAQ;AAAE,CAAC;AAE1E,MAAa,kCAAkC,YAC7C,uBAAuB;CAAE,GAAG;CAAS,eAAe,CAAC,QAAQ,QAAQ;AAAE,CAAC;AAE1E,MAAa,wCAAwC,YACnD,uBAAuB;CAAE,GAAG;CAAS,eAAe,CAAC,QAAQ,QAAQ;AAAE,CAAC;AAa1E,MAAM,uBAAuB,KAAK,WAAiC;AAYnE,MAAM,iDACJ,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,2CAA2C,UAC/C,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO,EAAE,MAAM;AACjB,CAAC;AAEH,MAAM,uCAAuC,UAAkB,eAC7D,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;EAAE;EAAU;CAAW;AAChC,CAAC;AAEH,MAAM,wCAAwC;AAE9C,MAAM,kCAAkC,UACtC,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO,EAAE,MAAM;AACjB,CAAC;AAEH,MAAM,6CACJ,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,uCAAuC,WAAoC;CAC/E,MAAM,QAAQ,OAAO,MAAM,GAAG,sCAAsC,QAAQ;CAE5E,OAAO,WAAW,KAAA,IAAY,QAAQ,MAAM,KAAK,OAAO,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAC9F;AAEA,MAAM,sCACJ,IAAI,oBAAoB;CACtB,SAAS;CACT,OAAO;AACT,CAAC;AAEH,MAAM,uBACJ,MACA,kBACG;CACH,MAAM,aACJ,KAAK,YAAY,MAAM;EACrB,YAAW,WAAU,OAAO,QAAQ,qBAAqB,OAAO,EAAE,OAAO,CAAC,CAAC;EAC3E,YAAW,UAAS,OAAO,UAAU,KAAK;EAC1C,cAAc,OAAO,QAAQ,qBAAqB,KAAK,CAAC;CAC1D,CAAC;CAEH,IAAI,kBAAkB,KAAA,GAAW,OAAO;CAExC,OAAO,WAAW,KAChB,OAAO,UACL,OAAO,MAAM,GAAG,cAAc,cAAc,QAAQ,EAAE,KACpD,OAAO,UAAgC,qBAAqB,KAAK,CAAC,CACpE,CACF,CACF;AACF;AAEA,MAAM,yBAAyB,UAO7B,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO,MAAM,KAAK;CAChC,MAAM,OAAO,OAAO,QAAQ,aAAa,OAAO,UAAU,MAAM,MAAM,GAAG,KAAK;CAE9E,MAAM,OAAO,UAIX,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,oBAAoB,MAAM,MAAM,aAAa;EAEnE,OAAO,OAAO,MAAM,MAAM,MAAM,EAAE,KAChC,MAAM,IAAI,cACR,OAAO,QAAQ;GAAE,OAAO,MAAM;GAAO,UAAU,MAAM;GAAU,MAAM;EAAK,CAAC,CAC7E,GACA,MAAM,IAAI,cACR,OAAO,QAAQ;GAAE,OAAO,MAAM;GAAO,UAAU,MAAM;GAAU,MAAM;EAAM,CAAC,CAC9E,GACA,MAAM,IAAI,WAAU,YAClB,OAAO,IAAI,aAAa;GACtB,IAAI,QAAQ,MAAM;GAClB,IAAI,WAAW,MAAM;GAErB,KAAK,MAAM,SAAS,QAAQ,QAAQ;IAClC,SAAS;IACT,WAAW,YAAY,qBAAqB,KAAK;IACjD,OAAO,OAAO,WAAW,MAAM,UAAU,OAAO,MAAM,cAAc,KAAK,CAAC;IAC1E,OAAO,MAAM,MAAM,MAAM,OAAO,KAAK;IAErC,IAAI,UACF,OAAO;KAAE;KAAO;KAAU,MAAM;IAAM;GAE1C;GAEA,OAAO,OAAO,IAAI;IAAE;IAAO;GAAS,CAAC;EACvC,CAAC,CACH,GACA,MAAM,UACR;CACF,CAAC;CAEH,OAAO,OAAO,IAAI;EAAE,OAAO;EAAG,UAAU;CAAM,CAAC,EAAE,KAAK,OAAO,SAAS,WAAW,KAAK,CAAC,CAAC;AAC1F,CAAC;AAEH,MAAM,mCAAmC,UAWvC,sBAAsB;CACpB,OAAO,MAAM;CACb,QAAQ,0BAA0B;EAChC,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,QAAQ,MAAM;EACd,iBAAiB,MAAM;EACvB,YAAY,MAAM;CACpB,CAAC;CACD,aAAa,MAAM;CACnB,eAAe,MAAM;CACrB,SAAS,MAAM;AACjB,CAAC;AAEH,MAAM,+BACJ,OACA,UAEA,OAAO,IAAI,aAAa;CACtB,IAAI,aAAa,MAAM;CACvB,IAAI,WAAW,MAAM;CACrB,IAAI,aAAa,MAAM;CACvB,MAAM,QAAQ,OAAO,gCAAgC,MAAM,iBAAiB;CAE5E,MAAM,qBACJ,MAAM,kBAAkB,KAAA,IACpB,KAAA,IACA,OAAO,+BAA+B,MAAM,cAAc,WAAW;CAE3E,IAAI,iBAAiB;CAErB,IAAI,UACF;CAGF,IAAI,MAAM,aAAa,KAAA,GACrB,OAAO,OAAO,OAAO,KAAK,yCAAyC,CAAC;CAGtE,IAAI,eAAe;CAEnB,OAAO,eAAe,OAAO;EAC3B,MAAM,WAAW,MAAM;EACvB,MAAM,kBAAkB;EAExB,MAAM,QAAQ,OAAO,gCAAgC;GACnD;GACA;GACA,YAAY;GACZ,aAAa;GACb,QAAQ,MAAM;GACd,iBAAiB,MAAM;GACvB,YAAY,MAAM;GAClB,eAAe,MAAM;GACrB,SAAS,MAAM;EACjB,CAAC;EAED,IAAI,MAAM,MAAM;GACd,IAAI,uBAAuB,KAAA,KAAa,kBAAkB,oBACxD,OAAO,OAAO,OAAO,KAAK,+BAA+B,kBAAkB,CAAC;GAG9E,aAAa,uBAAuB,iBAAiB,MAAM,KAAK;GAChE,cAAc,MAAM;GACpB,kBAAkB;GAClB;EACF;EAEA,gBAAgB;EAEhB,IAAI,MAAM,UAAU,KAAK,CAAC,MAAM,UAAU;GACxC,IAAI,gBAAgB,OAClB,OAAO,OAAO,OAAO,KAAK,oCAAoC,UAAU,UAAU,CAAC;GAGrF,OAAO,oCAAoC,MAAM,MAAM;GACvD;EACF;EAEA,WAAW,MAAM;EACjB,aAAa,uBAAuB,iBAAiB,MAAM,KAAK;EAChE,cAAc,MAAM;EAEpB,IAAI,UACF;CAEJ;CAEA,OAAO,OAAO,OAAO,KAAK,wCAAwC,KAAK,CAAC;AAC1E,CAAC;AAEH,MAAa,uCACX,YACG;CACH,OAAO,OAAO,UAA8C,UAC1D,OAAO,IAAI,aAAa;EACtB,OAAO,gCAAgC,QAAQ,iBAAiB,EAAE,KAAK,OAAO,MAAM;EACpF,OAAO,oCAAoC,QAAQ,aAAa;EAChE,IAAI;EACJ,IAAI;EAEJ,MAAM,aAAa,OAAO,sBAAsB;GAC9C;GACA,QAAQ,uBAAuB;IAC7B,GAAG;IACH,aAAY,aAAY;KACtB,aAAa,oCAAoC,SAAS,OAAO;KACjE,MAAM,QAAQ,sBAAsB,SAAS,OAAO;KAEpD,IAAI,UAAU,KAAA,GAAW;MACvB,cACE,QAAQ,cAAc,KAAK,KAAK,wBAAwB,QAAQ,UAAU,KAAK;MACjF,QAAQ,UAAU,KAAK;KACzB;KAEA,QAAQ,aAAa,QAAQ;IAC/B;GACF,CAAC;GACD,aAAa;GACb,eAAe,QAAQ;GACvB,SAAS,QAAQ;EACnB,CAAC;EAED,IAAI,WAAW,QAAQ,gBAAgB,KAAA,GACrC,OAAO,OAAO,OAAO,KAAK,qCAAqC,CAAC;EAGlE,OAAO,4BACL;GACE,UAAU;GACV,YAAY,uBAAuB,YAAY,WAAW,KAAK;GAC/D,aAAa,WAAW;GACxB,UAAU,WAAW;GACrB,mBAAmB,QAAQ;GAC3B,eAAe,QAAQ;GACvB,QAAQ,QAAQ;GAChB,iBAAiB,QAAQ;GACzB,YAAY,QAAQ;GACpB,SAAS,QAAQ;EACnB,GACA,KACF;EACA,OAAO,MAAM,IAAI,KAAK,EAAE,KAAK,OAAO,MAAM;CAC5C,CAAC,EAAE,KACD,OAAO,QAAO,SACZ,KAAK,UAAU,IAAI,IAAI,MAAM,UAAU,OAAO,KAAK,KAAK,EAAE,KAAK,OAAO,MAAM,IAAI,OAAO,IACzF,CACF,CACF;AACF;AAEA,MAAa,0CACX,YACG;CACH,OAAO,OAAO,UAA8C,UAC1D,OAAO,IAAI,aAAa;EACtB,OAAO,gCAAgC,QAAQ,iBAAiB,EAAE,KAAK,OAAO,MAAM;EACpF,OAAO,oCAAoC,QAAQ,aAAa;EAChE,OAAO,iCAAiC,QAAQ,UAAU;EAE1D,MAAM,aAAa,OAAO,gCAAgC;GACxD;GACA,UAAU,QAAQ;GAClB,YAAY,QAAQ;GACpB,aAAa;GACb,QAAQ,QAAQ;GAChB,iBAAiB,QAAQ;GACzB,YAAY,QAAQ;GACpB,eAAe,QAAQ;GACvB,SAAS,QAAQ;EACnB,CAAC;EAED,OAAO,4BACL;GACE,UAAU,QAAQ;GAClB,YAAY,uBAAuB,QAAQ,YAAY,WAAW,KAAK;GACvE,aAAa,WAAW;GACxB,UAAU,WAAW;GACrB,mBAAmB,QAAQ;GAC3B,eAAe,QAAQ;GACvB,QAAQ,QAAQ;GAChB,iBAAiB,QAAQ;GACzB,YAAY,QAAQ;GACpB,SAAS,QAAQ;EACnB,GACA,KACF;EACA,OAAO,MAAM,IAAI,KAAK,EAAE,KAAK,OAAO,MAAM;CAC5C,CAAC,EAAE,KACD,OAAO,QAAO,SACZ,KAAK,UAAU,IAAI,IAAI,MAAM,UAAU,OAAO,KAAK,KAAK,EAAE,KAAK,OAAO,MAAM,IAAI,OAAO,IACzF,CACF,CACF;AACF;AAEA,MAAM,0CACJ,SACA,OACA,kBAEA,sBAAsB;CACpB;CACA,QAAQ,sCAAsC;EAC5C,GAAG;EACH,aAAY,aAAY;GACtB,cAAc,oCAAoC,SAAS,OAAO,CAAC;GACnE,QAAQ,aAAa,QAAQ;EAC/B;CACF,CAAC;CACD,aAAa;CACb,eAAe,QAAQ;CACvB,SAAS,QAAQ;AACnB,CAAC;AAEH,MAAa,sDACX,YACG;CACH,OAAO,OAAO,UAA8C,UAC1D,OAAO,IAAI,aAAa;EACtB,OAAO,gCAAgC,QAAQ,iBAAiB,EAAE,KAAK,OAAO,MAAM;EACpF,OAAO,oCAAoC,QAAQ,aAAa;EAChE,IAAI;EAEJ,MAAM,aAAa,OAAO,uCACxB,SACA,QACA,mBAAkB;GAChB,aAAa;EACf,CACF;EAEA,IAAI,CAAC,WAAW,YAAY,eAAe,KAAA,GACzC,OAAO,OAAO,OAAO,KAAK,8BAA8B,CAAC;EAG3D,OAAO,4BACL;GACE,UAAU,QAAQ;GAClB,YAAY,uBAAuB,YAAY,WAAW,KAAK;GAC/D,aAAa,WAAW;GACxB,UAAU,WAAW;GACrB,mBAAmB,QAAQ;GAC3B,eAAe,QAAQ;GACvB,QAAQ,QAAQ;GAChB,iBAAiB,QAAQ;GACzB,YAAY,QAAQ;GACpB,SAAS,QAAQ;EACnB,GACA,KACF;EACA,OAAO,MAAM,IAAI,KAAK,EAAE,KAAK,OAAO,MAAM;CAC5C,CAAC,EAAE,KACD,OAAO,QAAO,SACZ,KAAK,UAAU,IAAI,IAAI,MAAM,UAAU,OAAO,KAAK,KAAK,EAAE,KAAK,OAAO,MAAM,IAAI,OAAO,IACzF,CACF,CACF;AACF;AAEA,MAAM,gBAAgB,YACpB,CAAC,UAAU,SAAS,SAAS,iBAAiB;AAEhD,MAAa,oCAAoC,YAC/C,iBACE,OAAO,UAA8C,UACnD,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,IAAI,UAAU,QAAQ,YAAY;CACjD,IAAI,YAAY;CAChB,IAAI,UAAU;CAEd,MAAM,cAAc,OAAO,WAAW;EACpC,IAAI,OAAO,eAAe,UAAU,QAAQ,OAAO,eAAe,UAAU,YAC1E,OAAO,MAAM,KAAM,MAAM;CAE7B,CAAC;CAED,MAAM,aAAa,UACjB,OAAO,QAAQ,MAAM,UAAU,OAAO,MAAM,KAAK,KAAK,CAAC,EAAE,KAAK,OAAO,MAAM,CAAC;CAE9E,MAAM,iBAAiB,UAAwB;EAC7C,IAAI,CAAC,UAAU,SAAS,MAAM,IAAI,GAAG;GACnC,UAAU,iBAAiB,wCAAwC,MAAM,IAAI,CAAC;GAE9E;EACF;EAEA,OAAO,QACL,4BAA4B,MAAM,IAAI,EAAE,KACtC,OAAO,SAAQ,YAAW;GACxB,IAAI,UAAU,SAAS,SAAS,iBAAiB,GAC/C,OAAO,YACH,OAAO,OACP,oBAAoB,SAAS,QAAQ,QAAQ,EAAE,KAC7C,OAAO,SAAQ,SAAQ,OAAO,WAAW,OAAO,KAAK,IAAI,CAAC,CAAC,GAC3D,OAAO,UACL,OAAO,WAAW;IAChB,YAAY;GACd,CAAC,CACH,CACF;GAGN,IAAI,CAAC,aAAa,OAAO,GACvB,OAAO,OAAO;GAGhB,OAAO,OAAO,IAAI,aAAa;IAC7B,OAAO,MAAM,MAAM,OAAO,OAAO;IAEjC,IAAI,qBAAqB,OAAO,GAAG;KACjC,OAAO,OAAO,WAAW;MACvB,UAAU;MACV,OAAO,MAAM,KAAM,MAAM;KAC3B,CAAC;KACD,OAAO,MAAM,IAAI,KAAK,EAAE,KAAK,OAAO,MAAM;IAC5C;GACF,CAAC;EACH,CAAC,GACD,OAAO,OAAM,UAAS,OAAO,WAAW,UAAU,KAAK,CAAC,CAAC,CAC3D,CACF;CACF;CAEA,MAAM,oBAAoB;EACxB,UAAU,iBAAiB,0BAA0B,QAAQ,YAAY,CAAC;CAC5E;CAEA,MAAM,oBAAoB;EACxB,IAAI,CAAC,SACH,UAAU,iBAAiB,0BAA0B,QAAQ,YAAY,CAAC;CAE9E;CAEA,OAAO,OAAO,eACZ,OAAO,WAAW;EAChB,OAAO,iBAAiB,WAAW,aAAa;EAChD,OAAO,iBAAiB,SAAS,WAAW;EAC5C,OAAO,iBAAiB,SAAS,WAAW;CAC9C,CAAC,SAEC,OAAO,WAAW;EAChB,OAAO,oBAAoB,WAAW,aAAa;EACnD,OAAO,oBAAoB,SAAS,WAAW;EAC/C,OAAO,oBAAoB,SAAS,WAAW;CACjD,CAAC,EAAE,KAAK,OAAO,QAAQ,WAAW,CAAC,CACvC;AACF,CAAC,CACH,GACA,QAAQ,MACV;AAEF,MAAa,sBAAsB,YACjC,uBAAuB,OAAO,EAAE,KAAK,OAAO,UAAU"}
|
|
1
|
+
{"version":3,"file":"transport.mjs","names":["Schema"],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Data,\n Effect,\n Exit,\n Match,\n Predicate,\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/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentEvent,\n AgentWebSocketServerMessage,\n InputResponseInput,\n InteractionResponseInput,\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 AgentWebSocketClientMessage,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n InputResponse,\n InteractionResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedError<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 SubmitInputResponseRequest = StreamAgentEventsRequest & {\n readonly response: InputResponse\n}\n\nexport type SubmitInteractionResponseRequest = StreamAgentEventsRequest & {\n readonly response: InteractionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\n\nconst defaultRunContinuationLimit = 120\n\nconst defaultIdleReconnectMaxAttempts = 12\n\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\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: Schema.SchemaError) =>\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\ntype AgentHttpEventsRequestJson = Pick<\n StreamAgentEventsRequest,\n 'sessionId' | 'messages' | 'hitlResponses' | 'model' | 'reasoningEffort'\n>\n\ntype AgentHttpHitlResponseRequestJson = Pick<\n StreamAgentRunHitlResponseEventsRequest,\n 'hitlResponses'\n>\n\ntype TransportJsonStringInput =\n | AgentWebSocketClientMessage\n | AgentHttpEventsRequestJson\n | AgentHttpHitlResponseRequestJson\n\nconst encodeJsonString = (value: TransportJsonStringInput, message: string) =>\n Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown))(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.fromJsonString(Schema.Unknown))(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* Schema.decodeUnknownEffect(AgentEvent)(parsed).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\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* Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(parsed).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage =>\n Predicate.isTagged(message, '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 const clientInput: AgentWebSocketClientMessage = Match.value(hitlResponse).pipe(\n Match.tag('ToolApprovalResponse', approval =>\n ToolApprovalResponseInput.make({\n response: approval,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('QuestionResponse', answer =>\n QuestionResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('InputResponse', answer =>\n InputResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.tag('InteractionResponse', answer =>\n InteractionResponseInput.make({\n response: answer,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n ),\n Match.exhaustive\n )\n\n return yield* encodeJsonString(clientInput, 'Could not serialize WebSocket HITL response')\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\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\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\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\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\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\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\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.Closeable) => 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\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\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\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n\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\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\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\n return\n }\n }\n\n yield* run()\n })\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\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\nexport const streamInputResponseEventStream = (request: SubmitInputResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamInteractionResponseEventStream = (request: SubmitInteractionResponseRequest) =>\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\nconst AgentEventPullResult = Data.taggedEnum<AgentEventPullResult>()\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(AgentEventPullResult.Events({ events })),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed(AgentEventPullResult.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 => AgentEventPullResult.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\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 return yield* Match.value(pulled).pipe(\n Match.tag('Idle', () =>\n Effect.succeed({ count: state.count, terminal: state.terminal, idle: true })\n ),\n Match.tag('Done', () =>\n Effect.succeed({ count: state.count, terminal: state.terminal, idle: false })\n ),\n Match.tag('Events', current =>\n Effect.gen(function* () {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of current.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) {\n return { count, terminal, idle: false }\n }\n }\n\n return yield* run({ count, terminal })\n })\n ),\n Match.exhaustive\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\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n\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\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\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\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\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\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 !Predicate.isTagged(message, '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\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n\n const failQueue = (error: AgentTransportError) =>\n Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n\n const handleMessage = (event: MessageEvent) => {\n if (!Predicate.isString(event.data)) {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (Predicate.isTagged(message, '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\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\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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"}
|