agents 0.24.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-routing-B2XLNMxq.d.ts → agent-routing-0DR0Tk2v.d.ts} +205 -132
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-routing.js.map +1 -1
- package/dist/agent-tool-types.d.ts +28 -22
- package/dist/agent-tool-types.js +23 -1
- package/dist/agent-tool-types.js.map +1 -1
- package/dist/{agent-tools-y7zLfw4Q.js → agent-tools-CdJC-8Dc.js} +72 -9
- package/dist/agent-tools-CdJC-8Dc.js.map +1 -0
- package/dist/{agent-tools-Dj5Mzlw7.d.ts → agent-tools-YrATZJu2.d.ts} +34 -20
- package/dist/agent-tools.d.ts +20 -18
- package/dist/agent-tools.js.map +1 -1
- package/dist/ai-fm7xx1BK.js +312 -0
- package/dist/ai-fm7xx1BK.js.map +1 -0
- package/dist/base64-redaction-C1Uu29t5.js +59 -0
- package/dist/base64-redaction-C1Uu29t5.js.map +1 -0
- package/dist/browser/ai-sdk.d.ts +90 -0
- package/dist/browser/ai-sdk.js +51 -0
- package/dist/browser/ai-sdk.js.map +1 -0
- package/dist/browser/ai.d.ts +4 -4
- package/dist/browser/ai.js +1 -347
- package/dist/browser/index.d.ts +81 -79
- package/dist/browser/index.js +361 -2
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/tanstack-ai.d.ts +96 -1
- package/dist/browser/tanstack-ai.js +62 -2
- package/dist/browser/tanstack-ai.js.map +1 -1
- package/dist/browser-DE3d-RLk.d.ts +275 -0
- package/dist/browser-tool-CQ10e6Kj.js +480 -0
- package/dist/browser-tool-CQ10e6Kj.js.map +1 -0
- package/dist/browser-tool-DuNdlwZ9.d.ts +73 -0
- package/dist/capability-B4WbF81e.js.map +1 -1
- package/dist/{capability-runner-BUBa6Ake.d.ts → capability-runner-DBAnGr6L.d.ts} +7 -2
- package/dist/chat/index.d.ts +340 -234
- package/dist/chat/index.js +592 -66
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.d.ts +42 -2
- package/dist/chat/react.js +191 -35
- package/dist/chat/react.js.map +1 -1
- package/dist/chat/transport.d.ts +1 -1
- package/dist/chat/transport.js +1 -1
- package/dist/chat-sdk/index.d.ts +17 -3
- package/dist/chat-sdk/index.js +28 -2
- package/dist/chat-sdk/index.js.map +1 -1
- package/dist/{client-C9DAjZIY.js → client-4OlMIJx-.js} +102 -29
- package/dist/client-4OlMIJx-.js.map +1 -0
- package/dist/{client-BxdkCuVy.d.ts → client-je3koD9Z.d.ts} +45 -10
- package/dist/client.d.ts +7 -5
- package/dist/client.js +2 -2
- package/dist/{connector-CptFKzRh.js → connector-58XDGvc3.js} +251 -120
- package/dist/connector-58XDGvc3.js.map +1 -0
- package/dist/{connector-CkQD4MK3.d.ts → connector-Cl-VqPmA.d.ts} +244 -146
- package/dist/context/index.d.ts +29 -0
- package/dist/context/index.js +64 -17
- package/dist/context/index.js.map +1 -1
- package/dist/current-agent-DhoDkSnH.js.map +1 -1
- package/dist/{current-agent-C4w86kcN.d.ts → current-agent-vAk_5JMt.d.ts} +4 -4
- package/dist/{durable-object-lifecycle-ei7M7lqB.d.ts → durable-object-lifecycle-HhgOMWq9.d.ts} +15 -7
- package/dist/harness/pi/index.d.ts +344 -0
- package/dist/harness/pi/index.js +873 -0
- package/dist/harness/pi/index.js.map +1 -0
- package/dist/images-iiTDSyRu.js +1631 -0
- package/dist/images-iiTDSyRu.js.map +1 -0
- package/dist/{index-Dlgtd3Mj.d.ts → index-BreL0YrQ.d.ts} +2 -2
- package/dist/index-kbSUIer3.d.ts +343 -0
- package/dist/index.d.ts +46 -44
- package/dist/index.js +1 -1
- package/dist/internal_context.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/lifecycle/index.js +1 -1
- package/dist/{lifecycle-Mm_jQh7r.js → lifecycle-CFu6OV03.js} +39 -10
- package/dist/{lifecycle-Mm_jQh7r.js.map → lifecycle-CFu6OV03.js.map} +1 -1
- package/dist/mcp/client/index.d.ts +20 -20
- package/dist/mcp/client/x402.js +21 -19
- package/dist/mcp/client/x402.js.map +1 -1
- package/dist/mcp/index.d.ts +35 -35
- package/dist/mcp/index.js +1 -1
- package/dist/{message-builder-BymO4N_D.js → message-builder-DAl9AhHH.js} +89 -4
- package/dist/message-builder-DAl9AhHH.js.map +1 -0
- package/dist/models/ai-sdk/index.d.ts +353 -0
- package/dist/models/ai-sdk/index.js +2443 -0
- package/dist/models/ai-sdk/index.js.map +1 -0
- package/dist/models/pi-ai/index.d.ts +313 -0
- package/dist/models/pi-ai/index.js +1795 -0
- package/dist/models/pi-ai/index.js.map +1 -0
- package/dist/observability/ai/index.js +20 -4
- package/dist/observability/ai/index.js.map +1 -1
- package/dist/{protocol-B0nh6KNf.js → protocol-kHsr-f0X.js} +26 -12
- package/dist/{protocol-B0nh6KNf.js.map → protocol-kHsr-f0X.js.map} +1 -1
- package/dist/queue/index.d.ts +3 -3
- package/dist/queue/index.js +1 -1
- package/dist/{queue-BC9F5cUo.js → queue-BB-zfIYF.js} +2 -2
- package/dist/{queue-BC9F5cUo.js.map → queue-BB-zfIYF.js.map} +1 -1
- package/dist/react.d.ts +6 -6
- package/dist/react.js +160 -64
- package/dist/react.js.map +1 -1
- package/dist/{retries-D9B2UCq3.d.ts → retries-CV6AkXmQ.d.ts} +18 -9
- package/dist/retries.d.ts +11 -9
- package/dist/retries.js +11 -1
- package/dist/retries.js.map +1 -1
- package/dist/routing/index.d.ts +2 -2
- package/dist/routing/index.js +1 -1
- package/dist/{scheduler-D_KHqxBa.js → scheduler-DZ3xQfeK.js} +2 -2
- package/dist/{scheduler-D_KHqxBa.js.map → scheduler-DZ3xQfeK.js.map} +1 -1
- package/dist/{scheduler-BGq6M5Kd.d.ts → scheduler-RdACNXDP.d.ts} +3 -3
- package/dist/schedules/index.d.ts +1 -1
- package/dist/schedules/index.js +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/sessions/index.d.ts +70 -3
- package/dist/sessions/index.js +276 -67
- package/dist/sessions/index.js.map +1 -1
- package/dist/skills/index.d.ts +29 -314
- package/dist/socket-address.d.ts +16 -0
- package/dist/socket-address.js +19 -0
- package/dist/socket-address.js.map +1 -0
- package/dist/{src-BNU3ZiJM.js → src-BZeu-SCD.js} +423 -115
- package/dist/src-BZeu-SCD.js.map +1 -0
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.js +1 -1
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/{streams-BcE8JP2X.d.ts → streams-Cmkj9QfW.d.ts} +4 -2
- package/dist/{streams-CCPRV6dt.js → streams-DW-UCOUc.js} +9 -2
- package/dist/streams-DW-UCOUc.js.map +1 -0
- package/dist/sub-routing.d.ts +12 -12
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.js +1 -1
- package/dist/{tasks-D4nLqVSI.js → tasks-68DESxf0.js} +2 -2
- package/dist/{tasks-D4nLqVSI.js.map → tasks-68DESxf0.js.map} +1 -1
- package/dist/{tasks-V2lCT8ZV.d.ts → tasks-9YxYtByh.d.ts} +2 -2
- package/dist/transport-PfFnt-Ld.d.ts +525 -0
- package/dist/{types-DCD6BNZH.d.ts → types-BA4anrjI.d.ts} +2 -2
- package/dist/voice/index.d.ts +2 -2
- package/dist/websockets/index.d.ts +23 -6
- package/dist/websockets/index.js +1 -1
- package/dist/{websockets-D7IzWbZb.js → websockets-Ci-LZFHH.js} +45 -20
- package/dist/{websockets-D7IzWbZb.js.map → websockets-Ci-LZFHH.js.map} +1 -1
- package/dist/wire-types-CnMt6_HR.js.map +1 -1
- package/dist/wire-types-CrjKvDyi.d.ts +300 -0
- package/dist/workflow-types.d.ts +25 -25
- package/dist/workflows.d.ts +21 -21
- package/dist/workflows.js +1 -1
- package/dist/{ws-chat-transport-UNRIS2xl.d.ts → ws-chat-transport-BbT1A5Lc.d.ts} +51 -2
- package/dist/{ws-chat-transport-rWwta645.js → ws-chat-transport-cqMKq3IY.js} +143 -16
- package/dist/ws-chat-transport-cqMKq3IY.js.map +1 -0
- package/docs/agent-tools.md +29 -4
- package/docs/browse-the-web.md +87 -5
- package/docs/chat-agents.md +124 -16
- package/docs/context.md +27 -0
- package/docs/durable-execution.md +2 -0
- package/docs/harnesses/pi.md +173 -0
- package/docs/human-in-the-loop.md +4 -0
- package/docs/index.md +3 -0
- package/docs/lifecycle.md +20 -4
- package/docs/models-pi-ai.md +325 -0
- package/docs/models.md +504 -0
- package/docs/resumable-streaming.md +2 -0
- package/docs/routing.md +13 -13
- package/docs/sessions.md +36 -1
- package/docs/state.md +1 -0
- package/docs/sub-agents.md +9 -0
- package/package.json +40 -2
- package/dist/agent-tools-y7zLfw4Q.js.map +0 -1
- package/dist/browser/ai.js.map +0 -1
- package/dist/client-C9DAjZIY.js.map +0 -1
- package/dist/client-tools-aIBO0Fk7.d.ts +0 -53
- package/dist/connector-CptFKzRh.js.map +0 -1
- package/dist/message-builder-BymO4N_D.js.map +0 -1
- package/dist/src-BNU3ZiJM.js.map +0 -1
- package/dist/streams-CCPRV6dt.js.map +0 -1
- package/dist/ws-chat-transport-rWwta645.js.map +0 -1
|
@@ -8,13 +8,13 @@ import {
|
|
|
8
8
|
u as LifecycleRouteAddress,
|
|
9
9
|
v as LifecycleJobOutcome,
|
|
10
10
|
x as Connection
|
|
11
|
-
} from "./capability-runner-
|
|
12
|
-
import { t as RetryOptions } from "./retries-
|
|
11
|
+
} from "./capability-runner-DBAnGr6L.js";
|
|
12
|
+
import { t as RetryOptions } from "./retries-CV6AkXmQ.js";
|
|
13
13
|
import {
|
|
14
14
|
r as LifecycleRouteEnvelope,
|
|
15
15
|
t as Lifecycle
|
|
16
|
-
} from "./durable-object-lifecycle-
|
|
17
|
-
import { n as CurrentAgentContext } from "./current-agent-
|
|
16
|
+
} from "./durable-object-lifecycle-HhgOMWq9.js";
|
|
17
|
+
import { n as CurrentAgentContext } from "./current-agent-vAk_5JMt.js";
|
|
18
18
|
import { t as AgentEmail } from "./internal_context-BlxFEWfn.js";
|
|
19
19
|
import { r as EmailResolver, s as SendEmailOptions } from "./email-7TatiTnl.js";
|
|
20
20
|
import {
|
|
@@ -41,10 +41,10 @@ import {
|
|
|
41
41
|
i as Schedule,
|
|
42
42
|
o as ScheduleOptions,
|
|
43
43
|
t as Scheduler
|
|
44
|
-
} from "./scheduler-
|
|
45
|
-
import { i as QueueItem } from "./types-
|
|
46
|
-
import { l as TaskHandlers, r as Tasks } from "./tasks-
|
|
47
|
-
import { t as State } from "./index-
|
|
44
|
+
} from "./scheduler-RdACNXDP.js";
|
|
45
|
+
import { i as QueueItem } from "./types-BA4anrjI.js";
|
|
46
|
+
import { l as TaskHandlers, r as Tasks } from "./tasks-9YxYtByh.js";
|
|
47
|
+
import { t as State } from "./index-BreL0YrQ.js";
|
|
48
48
|
import { t as CallableMetadata } from "./callable-decorator-DP__HhBA.js";
|
|
49
49
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
50
50
|
import {
|
|
@@ -407,6 +407,11 @@ type RootFacetRpcSurface = {
|
|
|
407
407
|
connectionId: string,
|
|
408
408
|
state: unknown
|
|
409
409
|
): Promise<unknown>;
|
|
410
|
+
_cf_closeSubAgentConnectionsForPrefix(
|
|
411
|
+
prefix: ReadonlyArray<AgentPathStep>,
|
|
412
|
+
code: number,
|
|
413
|
+
reason: string
|
|
414
|
+
): Promise<void>;
|
|
410
415
|
};
|
|
411
416
|
//#endregion
|
|
412
417
|
//#region src/dynamic-agents/bridges.d.ts
|
|
@@ -549,9 +554,6 @@ interface DynamicAgentHostPort {
|
|
|
549
554
|
): boolean;
|
|
550
555
|
hasSubAgent(className: string, name: string): boolean;
|
|
551
556
|
_cf_resolveSubAgent(className: string, name: string): Promise<unknown>;
|
|
552
|
-
_cf_cleanupFacetPrefix(
|
|
553
|
-
ownerPath: ReadonlyArray<AgentPathStep>
|
|
554
|
-
): Promise<void>;
|
|
555
557
|
_cf_routeLifecycle(
|
|
556
558
|
target: LifecycleRouteAddress | undefined,
|
|
557
559
|
envelope: LifecycleRouteEnvelope
|
|
@@ -761,6 +763,12 @@ declare class DynamicAgentsInternal extends LifecycleCapability {
|
|
|
761
763
|
* storage. Transitively deletes the child's own children.
|
|
762
764
|
*/
|
|
763
765
|
delete(className: string, name: string): Promise<void>;
|
|
766
|
+
/** Root-side: close sockets whose `/sub/...` target is under `prefix`. */
|
|
767
|
+
closeConnectionsForPrefix(
|
|
768
|
+
prefix: ReadonlyArray<AgentPathStep>,
|
|
769
|
+
code: number,
|
|
770
|
+
reason: string
|
|
771
|
+
): void;
|
|
764
772
|
/** Drop all facet-side virtual connections (test/rehydration hook). */
|
|
765
773
|
clearVirtualConnections(): void;
|
|
766
774
|
/** Facet-side lookup of a virtual connection by id. */
|
|
@@ -3685,6 +3693,20 @@ declare const AGENT_TOOL_PROGRESS_PART = "data-agent-progress";
|
|
|
3685
3693
|
* re-resolves milestone waiters. See `design/rfc-detached-agent-tools.md`.
|
|
3686
3694
|
*/
|
|
3687
3695
|
declare const AGENT_TOOL_MILESTONE_PART = "data-agent-milestone";
|
|
3696
|
+
/**
|
|
3697
|
+
* Whether a chunk body is a progress or milestone frame. These are broadcast
|
|
3698
|
+
* but never written to the child's chunk store, so they have no stored-chunk
|
|
3699
|
+
* position and must not take part in stored-position numbering or dedupe.
|
|
3700
|
+
*/
|
|
3701
|
+
declare function isAgentToolLifecycleChunk(body: string): boolean;
|
|
3702
|
+
/**
|
|
3703
|
+
* Whether a forwarded chunk has no stored-chunk position: a progress or
|
|
3704
|
+
* milestone frame, or a chunk too large to store. Such chunks carry the next
|
|
3705
|
+
* stored position without consuming it.
|
|
3706
|
+
*/
|
|
3707
|
+
declare function isPositionlessAgentToolChunk(
|
|
3708
|
+
chunk: AgentToolStoredChunk
|
|
3709
|
+
): boolean;
|
|
3688
3710
|
/**
|
|
3689
3711
|
* Ephemeral progress signal a running sub-agent emits with `reportProgress`. The
|
|
3690
3712
|
* well-known fields drive generic UI (a bar + status line) with no per-app
|
|
@@ -3851,7 +3873,17 @@ type RunAgentToolOptions<Input = unknown, Self = Record<string, unknown>> = {
|
|
|
3851
3873
|
* must outlive the spawning turn; cancel it explicitly via `cancelAgentTool`.
|
|
3852
3874
|
*/
|
|
3853
3875
|
detached?: boolean | DetachedAgentToolConfig<Self>;
|
|
3876
|
+
/**
|
|
3877
|
+
* Which child events reach the parent's clients. `"full"` (default) forwards
|
|
3878
|
+
* every streamed chunk. `"terminal"` forwards only lifecycle events: started,
|
|
3879
|
+
* progress and milestone frames, and the terminal event. The child still
|
|
3880
|
+
* persists its whole stream, and the parent still tails it for completion,
|
|
3881
|
+
* cancellation, progress and recovery. Use it for a headless parent with no
|
|
3882
|
+
* client watching the child. Not supported with `detached`.
|
|
3883
|
+
*/
|
|
3884
|
+
eventDelivery?: AgentToolEventDelivery;
|
|
3854
3885
|
};
|
|
3886
|
+
type AgentToolEventDelivery = "full" | "terminal";
|
|
3855
3887
|
/**
|
|
3856
3888
|
* Result of dispatching a detached run. Returns immediately after dispatch
|
|
3857
3889
|
* rather than after completion.
|
|
@@ -3915,6 +3947,12 @@ type AgentToolRunInspection<Output = unknown> = {
|
|
|
3915
3947
|
type AgentToolStoredChunk = {
|
|
3916
3948
|
sequence: number;
|
|
3917
3949
|
body: string;
|
|
3950
|
+
/**
|
|
3951
|
+
* Set when the child broadcast this chunk but could not store it (it exceeds
|
|
3952
|
+
* the stored-chunk size limit). The chunk is never replayed, so it carries
|
|
3953
|
+
* the next stored position without consuming it and dedupes on this id.
|
|
3954
|
+
*/
|
|
3955
|
+
unstoredId?: string;
|
|
3918
3956
|
};
|
|
3919
3957
|
type AgentToolChildAdapter<Input = unknown, Output = unknown> = {
|
|
3920
3958
|
startAgentToolRun(
|
|
@@ -3922,11 +3960,23 @@ type AgentToolChildAdapter<Input = unknown, Output = unknown> = {
|
|
|
3922
3960
|
options: {
|
|
3923
3961
|
runId: string;
|
|
3924
3962
|
signal?: AbortSignal;
|
|
3963
|
+
/**
|
|
3964
|
+
* `"terminal"` means no client is watching this run's chunks, so the
|
|
3965
|
+
* child can skip broadcasting them.
|
|
3966
|
+
*/
|
|
3967
|
+
eventDelivery?: AgentToolEventDelivery;
|
|
3925
3968
|
}
|
|
3926
3969
|
): Promise<AgentToolRunInspection<Output>>;
|
|
3927
3970
|
cancelAgentToolRun(runId: string, reason?: unknown): Promise<void>;
|
|
3928
3971
|
inspectAgentToolRun(
|
|
3929
|
-
runId: string
|
|
3972
|
+
runId: string,
|
|
3973
|
+
options?: {
|
|
3974
|
+
/**
|
|
3975
|
+
* `false` reports the stored row as-is instead of first reconciling
|
|
3976
|
+
* (and possibly sealing) a stale run. Defaults to `true`.
|
|
3977
|
+
*/
|
|
3978
|
+
reconcile?: boolean;
|
|
3979
|
+
}
|
|
3930
3980
|
): Promise<AgentToolRunInspection<Output> | null>;
|
|
3931
3981
|
getAgentToolChunks(
|
|
3932
3982
|
runId: string,
|
|
@@ -3954,7 +4004,8 @@ type AgentToolEvent =
|
|
|
3954
4004
|
| {
|
|
3955
4005
|
kind: "chunk";
|
|
3956
4006
|
runId: string;
|
|
3957
|
-
body: string
|
|
4007
|
+
body: string /** See {@link AgentToolStoredChunk.unstoredId}. */;
|
|
4008
|
+
unstoredId?: string;
|
|
3958
4009
|
}
|
|
3959
4010
|
| {
|
|
3960
4011
|
kind: "finished";
|
|
@@ -4317,9 +4368,9 @@ declare const DEFAULT_AGENT_STATIC_OPTIONS: {
|
|
|
4317
4368
|
/**
|
|
4318
4369
|
* Optional hard wall-clock ceiling (ms) on a single agent-tool re-attach
|
|
4319
4370
|
* (#1630). Caps the total wait even as the no-progress budget re-arms across
|
|
4320
|
-
* stream-closes. Defaults to `Infinity` (no implicit cap),
|
|
4321
|
-
*
|
|
4322
|
-
*
|
|
4371
|
+
* stream-closes. Defaults to `Infinity` (no implicit cap, #1672): a healthy,
|
|
4372
|
+
* still-advancing child is followed for as long as it makes progress — a
|
|
4373
|
+
* hung child is bounded by
|
|
4323
4374
|
* the no-progress budget, and a content-runaway by the child's own
|
|
4324
4375
|
* `maxRecoveryWork` / `shouldKeepRecovering`. Set a finite value to impose a
|
|
4325
4376
|
* wall-clock cap (which also tears the child down on `window-exceeded`).
|
|
@@ -4389,9 +4440,9 @@ interface AgentStaticOptions {
|
|
|
4389
4440
|
/**
|
|
4390
4441
|
* Optional hard wall-clock ceiling in milliseconds on a single agent-tool
|
|
4391
4442
|
* re-attach (#1630). Caps the total wait even as the no-progress budget
|
|
4392
|
-
* re-arms across stream-closes. Default: `Infinity` (no implicit cap
|
|
4393
|
-
*
|
|
4394
|
-
*
|
|
4443
|
+
* re-arms across stream-closes. Default: `Infinity` (no implicit cap,
|
|
4444
|
+
* #1672) — a healthy, still-advancing child is followed for as long as it
|
|
4445
|
+
* makes progress, exactly
|
|
4395
4446
|
* as on the live (never-evicted) path. Set a finite value to impose a
|
|
4396
4447
|
* wall-clock cap (which also tears the child down on `window-exceeded`); `0`
|
|
4397
4448
|
* also disables the ceiling.
|
|
@@ -4461,7 +4512,7 @@ type WorkflowName<E> = WorkflowBinding<E> | (string & {});
|
|
|
4461
4512
|
declare class Agent<
|
|
4462
4513
|
Env extends Cloudflare.Env = Cloudflare.Env,
|
|
4463
4514
|
TState = unknown,
|
|
4464
|
-
Props extends
|
|
4515
|
+
Props extends object = object
|
|
4465
4516
|
> extends DurableObject<Env> {
|
|
4466
4517
|
/**
|
|
4467
4518
|
* Runtime lifecycle and reusable durable capabilities for this Agent.
|
|
@@ -5501,6 +5552,11 @@ declare class Agent<
|
|
|
5501
5552
|
code?: number,
|
|
5502
5553
|
reason?: string
|
|
5503
5554
|
): Promise<void>;
|
|
5555
|
+
_cf_closeSubAgentConnectionsForPrefix(
|
|
5556
|
+
prefix: ReadonlyArray<AgentPathStep>,
|
|
5557
|
+
code: number,
|
|
5558
|
+
reason: string
|
|
5559
|
+
): Promise<void>;
|
|
5504
5560
|
_cf_setSubAgentConnectionState(
|
|
5505
5561
|
connectionId: string,
|
|
5506
5562
|
state: unknown
|
|
@@ -5924,8 +5980,23 @@ declare class Agent<
|
|
|
5924
5980
|
private _stringifyAgentToolOutput;
|
|
5925
5981
|
private _broadcastAgentToolEvent;
|
|
5926
5982
|
private _broadcastAgentToolChunks;
|
|
5983
|
+
private _isTerminalOnlyAgentToolRun;
|
|
5927
5984
|
private _broadcastAgentToolStoredChunks;
|
|
5985
|
+
/**
|
|
5986
|
+
* One budget shared by every step of a bounded recovery read, so a run's
|
|
5987
|
+
* total time stays within `timeoutMs`. Returns the remaining milliseconds,
|
|
5988
|
+
* never below 1 because a non-positive timeout means "unbounded".
|
|
5989
|
+
*/
|
|
5990
|
+
private _agentToolRecoveryDeadline;
|
|
5928
5991
|
private _broadcastAgentToolStoredChunksFromAdapter;
|
|
5992
|
+
/**
|
|
5993
|
+
* Milestones are persisted on the child run rather than in its chunk log, so
|
|
5994
|
+
* replay re-emits them from the child's inspection. The client dedupes them
|
|
5995
|
+
* on the milestone's own sequence, so a milestone already seen live is a no-op.
|
|
5996
|
+
* They carry the next stored-chunk sequence without consuming it, matching
|
|
5997
|
+
* the live path.
|
|
5998
|
+
*/
|
|
5999
|
+
private _broadcastAgentToolMilestones;
|
|
5929
6000
|
private _forwardAgentToolStream;
|
|
5930
6001
|
/**
|
|
5931
6002
|
* Hook invoked by `_forwardAgentToolStream` after a child produces output that
|
|
@@ -6019,9 +6090,9 @@ declare class Agent<
|
|
|
6019
6090
|
* dies and recovers again during deploy churn is still collected. A genuinely
|
|
6020
6091
|
* silent/hung child can never block recovery forever: it seals `interrupted`
|
|
6021
6092
|
* after one `noProgressTimeoutMs` window. `maxWindowMs` is an OPTIONAL hard
|
|
6022
|
-
* wall-clock ceiling (default `Infinity` — uncapped,
|
|
6023
|
-
*
|
|
6024
|
-
*
|
|
6093
|
+
* wall-clock ceiling (default `Infinity` — uncapped, #1672); set it finite
|
|
6094
|
+
* to also bound a child that keeps progressing, which seals
|
|
6095
|
+
* `window-exceeded` and tears the child down.
|
|
6025
6096
|
*
|
|
6026
6097
|
* Returns the terminal `result` (and `completedAt`) when the child reaches a
|
|
6027
6098
|
* terminal status, plus the advanced broadcast `sequence`. Returns
|
|
@@ -6037,6 +6108,8 @@ declare class Agent<
|
|
|
6037
6108
|
private _scheduleAgentToolRunRecovery;
|
|
6038
6109
|
private _agentToolRunRecoveryRunIds;
|
|
6039
6110
|
private _getAgentToolChunksForRecovery;
|
|
6111
|
+
/** Resolve to `undefined` when `promise` rejects or outlasts `timeoutMs`. */
|
|
6112
|
+
private _settleWithinRecoveryTimeout;
|
|
6040
6113
|
/**
|
|
6041
6114
|
* Shared facet resolution — takes a CamelCase class name string
|
|
6042
6115
|
* (matching `ctx.exports`) rather than a class reference. Both
|
|
@@ -6739,7 +6812,7 @@ interface AgentRouteMatch<Env = Cloudflare.Env> {
|
|
|
6739
6812
|
}
|
|
6740
6813
|
interface AgentRouteOptions<
|
|
6741
6814
|
Env = Cloudflare.Env,
|
|
6742
|
-
Props extends
|
|
6815
|
+
Props extends object = object
|
|
6743
6816
|
> {
|
|
6744
6817
|
/** URL prefix before the binding and instance name. Default: `agents`. */
|
|
6745
6818
|
prefix?: string;
|
|
@@ -6782,10 +6855,7 @@ interface AgentRouteOptions<
|
|
|
6782
6855
|
/** Configuration options for {@link routeAgentRequest}. */
|
|
6783
6856
|
type AgentOptions<Env> = AgentRouteOptions<Env>;
|
|
6784
6857
|
/** Options for resolving and starting a named Agent. */
|
|
6785
|
-
type AgentGetOptions<
|
|
6786
|
-
Env,
|
|
6787
|
-
Props extends Record<string, unknown> = Record<string, unknown>
|
|
6788
|
-
> = Pick<
|
|
6858
|
+
type AgentGetOptions<Env, Props extends object = object> = Pick<
|
|
6789
6859
|
AgentRouteOptions<Env, Props>,
|
|
6790
6860
|
"jurisdiction" | "locationHint" | "props" | "routingRetry"
|
|
6791
6861
|
>;
|
|
@@ -6815,7 +6885,7 @@ declare function routeAgentRequest<Env>(
|
|
|
6815
6885
|
declare function getAgentByName<
|
|
6816
6886
|
Env extends Cloudflare.Env = Cloudflare.Env,
|
|
6817
6887
|
T extends Agent<Env> = Agent<Env>,
|
|
6818
|
-
Props extends
|
|
6888
|
+
Props extends object = object
|
|
6819
6889
|
>(
|
|
6820
6890
|
namespace: DurableObjectNamespace<T>,
|
|
6821
6891
|
name: string,
|
|
@@ -6823,143 +6893,146 @@ declare function getAgentByName<
|
|
|
6823
6893
|
): Promise<DurableObjectStub<T>>;
|
|
6824
6894
|
//#endregion
|
|
6825
6895
|
export {
|
|
6826
|
-
|
|
6827
|
-
|
|
6896
|
+
ChatCapableAgentClass as $,
|
|
6897
|
+
RPCServerTransport as $t,
|
|
6828
6898
|
getCurrentAgent as A,
|
|
6829
|
-
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6899
|
+
getSubAgentByName as An,
|
|
6900
|
+
ElicitRequest$1 as At,
|
|
6901
|
+
AgentToolFailure as B,
|
|
6902
|
+
MCPConnectionResult as Bt,
|
|
6833
6903
|
MCPServersState as C,
|
|
6834
|
-
|
|
6835
|
-
|
|
6904
|
+
BuildAgentPathOptions as Cn,
|
|
6905
|
+
WorkflowInfo as Ct,
|
|
6836
6906
|
StartFiberResult as D,
|
|
6837
|
-
|
|
6838
|
-
|
|
6907
|
+
buildAgentUrl as Dn,
|
|
6908
|
+
WorkflowRejectedError as Dt,
|
|
6839
6909
|
StartFiberOptions as E,
|
|
6840
|
-
|
|
6841
|
-
|
|
6910
|
+
buildAgentPath as En,
|
|
6911
|
+
WorkflowQueryCriteria as Et,
|
|
6842
6912
|
AgentToolDisplayMetadata as F,
|
|
6843
|
-
|
|
6844
|
-
|
|
6845
|
-
|
|
6846
|
-
|
|
6847
|
-
|
|
6913
|
+
MCPClientElicitationHandlers as Ft,
|
|
6914
|
+
AgentToolProgressSnapshot as G,
|
|
6915
|
+
MCP_SERVER_ID_MAX_LENGTH as Gt,
|
|
6916
|
+
AgentToolLifecycleResult as H,
|
|
6917
|
+
MCPOAuthCallbackResult as Ht,
|
|
6848
6918
|
AgentToolEvent as I,
|
|
6849
|
-
|
|
6850
|
-
|
|
6851
|
-
|
|
6852
|
-
|
|
6853
|
-
|
|
6854
|
-
|
|
6855
|
-
|
|
6919
|
+
MCPClientManager as It,
|
|
6920
|
+
AgentToolRunPart as J,
|
|
6921
|
+
normalizeServerId as Jt,
|
|
6922
|
+
AgentToolRunInfo as K,
|
|
6923
|
+
RegisterServerOptions as Kt,
|
|
6924
|
+
AgentToolEventDelivery as L,
|
|
6925
|
+
MCPClientManagerOptions as Lt,
|
|
6856
6926
|
AGENT_TOOL_MILESTONE_PART as M,
|
|
6857
|
-
|
|
6927
|
+
routeSubAgentRequest as Mn,
|
|
6928
|
+
MCPAITool as Mt,
|
|
6858
6929
|
AGENT_TOOL_PROGRESS_PART as N,
|
|
6859
|
-
|
|
6930
|
+
withInvocationScope as Nn,
|
|
6931
|
+
MCPAIToolSet as Nt,
|
|
6860
6932
|
StateUpdateMessage as O,
|
|
6861
|
-
|
|
6862
|
-
|
|
6933
|
+
buildSubAgentPath as On,
|
|
6934
|
+
WorkflowStatus as Ot,
|
|
6863
6935
|
AgentToolChildAdapter as P,
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6936
|
+
MCPClientElicitationHandler as Pt,
|
|
6937
|
+
AgentToolTerminalStatus as Q,
|
|
6938
|
+
RPCClientTransportOptions as Qt,
|
|
6939
|
+
AgentToolEventMessage as R,
|
|
6940
|
+
MCPClientOAuthCallbackConfig as Rt,
|
|
6869
6941
|
MCPServerMessage as S,
|
|
6870
|
-
|
|
6871
|
-
|
|
6942
|
+
AgentPathStep as Sn,
|
|
6943
|
+
WorkflowEventPayload as St,
|
|
6872
6944
|
RPCResponse as T,
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6945
|
+
SubAgentPathMatch as Tn,
|
|
6946
|
+
WorkflowProgressCallback as Tt,
|
|
6947
|
+
AgentToolMilestone as U,
|
|
6948
|
+
MCPServerFilter as Ut,
|
|
6949
|
+
AgentToolInterruptedReason as V,
|
|
6950
|
+
MCPDiscoverResult as Vt,
|
|
6951
|
+
AgentToolProgress as W,
|
|
6952
|
+
MCPServerOptions as Wt,
|
|
6953
|
+
AgentToolRunStatus as X,
|
|
6954
|
+
MCPElicitationHandlers as Xt,
|
|
6955
|
+
AgentToolRunState as Y,
|
|
6956
|
+
MCPElicitationHandler as Yt,
|
|
6957
|
+
AgentToolStoredChunk as Z,
|
|
6958
|
+
RPCClientTransport as Zt,
|
|
6887
6959
|
FiberRecoveryContext as _,
|
|
6888
|
-
|
|
6889
|
-
|
|
6960
|
+
WorkerTransportOptions as _n,
|
|
6961
|
+
WorkflowCallbackBase as _t,
|
|
6890
6962
|
routeAgentRequest as a,
|
|
6891
|
-
|
|
6892
|
-
|
|
6963
|
+
McpAgent as an,
|
|
6964
|
+
isPositionlessAgentToolChunk as at,
|
|
6893
6965
|
ListFibersOptions as b,
|
|
6894
|
-
|
|
6895
|
-
|
|
6966
|
+
DynamicAgentClass as bn,
|
|
6967
|
+
WorkflowErrorCallback as bt,
|
|
6896
6968
|
Agent as c,
|
|
6897
|
-
|
|
6898
|
-
|
|
6969
|
+
createMcpHandler$1 as cn,
|
|
6970
|
+
AgentWorkflowOrigin as ct,
|
|
6899
6971
|
AgentStaticOptions as d,
|
|
6900
|
-
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6972
|
+
CreateMcpHandlerOptions$1 as dn,
|
|
6973
|
+
AgentWorkflowStep as dt,
|
|
6974
|
+
RPCServerTransportOptions as en,
|
|
6975
|
+
DetachedAgentToolConfig as et,
|
|
6904
6976
|
DEFAULT_AGENT_STATIC_OPTIONS as f,
|
|
6905
|
-
|
|
6906
|
-
|
|
6977
|
+
LegacyMcpHandler as fn,
|
|
6978
|
+
ApprovalEventPayload as ft,
|
|
6907
6979
|
FiberInspection as g,
|
|
6908
|
-
|
|
6909
|
-
|
|
6980
|
+
WorkerTransport as gn,
|
|
6981
|
+
WorkflowCallback as gt,
|
|
6910
6982
|
FiberContext as h,
|
|
6911
|
-
|
|
6912
|
-
|
|
6983
|
+
TransportState as hn,
|
|
6984
|
+
WaitForApprovalOptions as ht,
|
|
6913
6985
|
getAgentByName as i,
|
|
6914
|
-
|
|
6915
|
-
|
|
6986
|
+
ElicitResult$3 as in,
|
|
6987
|
+
isAgentToolLifecycleChunk as it,
|
|
6916
6988
|
routeAgentEmail as j,
|
|
6917
|
-
|
|
6989
|
+
parseSubAgentPath as jn,
|
|
6990
|
+
ElicitResult$2 as jt,
|
|
6918
6991
|
StreamingResponse as k,
|
|
6919
|
-
|
|
6920
|
-
|
|
6992
|
+
buildSubAgentPathUnchecked as kn,
|
|
6993
|
+
WorkflowTrackingRow as kt,
|
|
6921
6994
|
AgentContext as l,
|
|
6922
|
-
|
|
6923
|
-
|
|
6995
|
+
experimental_createMcpHandler as ln,
|
|
6996
|
+
AgentWorkflowParams as lt,
|
|
6924
6997
|
EmailRoutingOptions as m,
|
|
6925
|
-
|
|
6926
|
-
|
|
6998
|
+
MCPStorageApi as mn,
|
|
6999
|
+
RunWorkflowOptions as mt,
|
|
6927
7000
|
AgentOptions as n,
|
|
6928
|
-
|
|
6929
|
-
|
|
7001
|
+
ElicitRequest$2 as nn,
|
|
7002
|
+
RunAgentToolOptions as nt,
|
|
6930
7003
|
AddMcpServerOptions as o,
|
|
6931
|
-
|
|
6932
|
-
|
|
7004
|
+
ClearableEventStore as on,
|
|
7005
|
+
AgentWorkflowEvent as ot,
|
|
6933
7006
|
DeleteFibersOptions as p,
|
|
6934
|
-
|
|
6935
|
-
|
|
6936
|
-
|
|
6937
|
-
|
|
7007
|
+
createLegacyMcpHandler as pn,
|
|
7008
|
+
DefaultProgress as pt,
|
|
7009
|
+
AgentToolRunInspection as q,
|
|
7010
|
+
getNamespacedData as qt,
|
|
6938
7011
|
RoutingRetryOptions as r,
|
|
6939
|
-
|
|
6940
|
-
|
|
7012
|
+
ElicitRequestSchema as rn,
|
|
7013
|
+
RunAgentToolResult as rt,
|
|
6941
7014
|
AddRpcMcpServerOptions as s,
|
|
6942
|
-
|
|
6943
|
-
|
|
7015
|
+
DurableObjectEventStore as sn,
|
|
7016
|
+
AgentWorkflowInternalParams as st,
|
|
6944
7017
|
AgentGetOptions as t,
|
|
6945
|
-
|
|
6946
|
-
|
|
7018
|
+
RPC_DO_PREFIX as tn,
|
|
7019
|
+
DetachedRunAgentToolResult as tt,
|
|
6947
7020
|
AgentNamespace as u,
|
|
6948
|
-
|
|
6949
|
-
|
|
7021
|
+
CreateLegacyMcpHandlerOptions as un,
|
|
7022
|
+
AgentWorkflowPathStep as ut,
|
|
6950
7023
|
FiberRecoveryResult as v,
|
|
6951
|
-
|
|
6952
|
-
|
|
7024
|
+
SSEEdgeClientTransport as vn,
|
|
7025
|
+
WorkflowCallbackType as vt,
|
|
6953
7026
|
RPCRequest as w,
|
|
6954
|
-
|
|
6955
|
-
|
|
7027
|
+
SUB_PREFIX as wn,
|
|
7028
|
+
WorkflowPage as wt,
|
|
6956
7029
|
MCPServer as x,
|
|
6957
|
-
|
|
6958
|
-
|
|
7030
|
+
DynamicAgentStub as xn,
|
|
7031
|
+
WorkflowEventCallback as xt,
|
|
6959
7032
|
FiberStatus as y,
|
|
6960
|
-
|
|
6961
|
-
|
|
6962
|
-
|
|
6963
|
-
|
|
7033
|
+
StreamableHTTPEdgeClientTransport as yn,
|
|
7034
|
+
WorkflowCompleteCallback as yt,
|
|
7035
|
+
AgentToolEventState as z,
|
|
7036
|
+
MCPClientOAuthResult as zt
|
|
6964
7037
|
};
|
|
6965
|
-
//# sourceMappingURL=agent-routing-
|
|
7038
|
+
//# sourceMappingURL=agent-routing-0DR0Tk2v.d.ts.map
|
package/dist/agent-routing.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-routing.js","names":[],"sources":["../src/agent-routing.ts"],"sourcesContent":["import type { Agent } from \"./index\";\nimport { camelCaseToKebabCase } from \"./utils\";\n\nconst namespaceMapCache = new WeakMap<\n object,\n Record<string, DurableObjectNamespace>\n>();\nconst bindingNameCache = new WeakMap<object, Record<string, string>>();\n\nconst DEFAULT_ROUTING_RETRY_OPTIONS = {\n maxAttempts: 3,\n baseDelayMs: 100,\n maxDelayMs: 800\n};\n\ninterface RoutingRetryEvent {\n error: unknown;\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n name: string;\n className?: string;\n}\n\n/** Retry policy for Agent routing infrastructure failures. */\nexport interface RoutingRetryOptions {\n /** Max number of attempts, including the first. Default: 3. */\n maxAttempts?: number;\n /** Base delay in milliseconds for exponential backoff. Default: 100. */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds. Default: 800. */\n maxDelayMs?: number;\n /** Optional callback invoked before each retry delay. */\n onRetry?: (event: RoutingRetryEvent) => void | Promise<void>;\n}\n\ninterface AgentRouteMatch<Env = Cloudflare.Env> {\n /** The Durable Object environment binding name. */\n className: Extract<keyof Env, string>;\n /** The named Durable Object instance extracted from the URL. */\n name: string;\n}\n\ninterface AgentRouteOptions<\n Env = Cloudflare.Env,\n Props extends Record<string, unknown> = Record<string, unknown>\n> {\n /** URL prefix before the binding and instance name. Default: `agents`. */\n prefix?: string;\n jurisdiction?: DurableObjectJurisdiction;\n locationHint?: DurableObjectLocationHint;\n /** Properties supplied before lifecycle startup. */\n props?: Props;\n /**\n * Whether to enable CORS for matched routes.\n *\n * When `true`, uses default permissive CORS headers:\n * - Access-Control-Allow-Origin: *\n * - Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS\n * - Access-Control-Allow-Headers: *\n * - Access-Control-Max-Age: 86400\n *\n * For credentialed requests, pass explicit headers with a specific origin.\n * When set to a `HeadersInit` value, uses those as the CORS headers instead.\n * CORS preflight requests are handled automatically for matched routes.\n */\n cors?: boolean | HeadersInit;\n /**\n * Retry transient Durable Object infrastructure errors thrown while routing.\n * Enabled by default; pass `false` to disable.\n */\n routingRetry?: false | RoutingRetryOptions;\n onBeforeConnect?: (\n request: Request,\n route: AgentRouteMatch<Env>\n ) => Response | Request | void | Promise<Response | Request | void>;\n onBeforeRequest?: (\n request: Request,\n route: AgentRouteMatch<Env>\n ) =>\n | Response\n | Request\n | void\n | Promise<Response | Request | undefined | void>;\n}\n\n/** Configuration options for {@link routeAgentRequest}. */\nexport type AgentOptions<Env> = AgentRouteOptions<Env>;\n\n/** Options for resolving and starting a named Agent. */\nexport type AgentGetOptions<\n Env,\n Props extends Record<string, unknown> = Record<string, unknown>\n> = Pick<\n AgentRouteOptions<Env, Props>,\n \"jurisdiction\" | \"locationHint\" | \"props\" | \"routingRetry\"\n>;\n\ninterface ResolvedRoutingRetryOptions extends Required<\n Omit<RoutingRetryOptions, \"onRetry\">\n> {\n onRetry?: RoutingRetryOptions[\"onRetry\"];\n}\n\ninterface RoutingRetryContext {\n name: string;\n className?: string;\n}\n\nfunction durableObjectGetOptions(\n options: { locationHint?: DurableObjectLocationHint } | undefined\n) {\n return options?.locationHint\n ? { locationHint: options.locationHint }\n : undefined;\n}\n\nfunction validatePositiveInteger(value: number, name: string): void {\n if (!Number.isFinite(value) || value < 1) {\n throw new Error(`${name} must be >= 1`);\n }\n if (!Number.isInteger(value)) {\n throw new Error(`${name} must be an integer`);\n }\n}\n\nfunction validatePositiveNumber(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be > 0`);\n }\n}\n\nfunction resolveRoutingRetryOptions(\n options: false | RoutingRetryOptions | undefined\n): ResolvedRoutingRetryOptions | null {\n if (options === false) return null;\n\n const resolved = {\n maxAttempts:\n options?.maxAttempts ?? DEFAULT_ROUTING_RETRY_OPTIONS.maxAttempts,\n baseDelayMs:\n options?.baseDelayMs ?? DEFAULT_ROUTING_RETRY_OPTIONS.baseDelayMs,\n maxDelayMs: options?.maxDelayMs ?? DEFAULT_ROUTING_RETRY_OPTIONS.maxDelayMs,\n onRetry: options?.onRetry\n };\n\n validatePositiveInteger(resolved.maxAttempts, \"routingRetry.maxAttempts\");\n validatePositiveNumber(resolved.baseDelayMs, \"routingRetry.baseDelayMs\");\n validatePositiveNumber(resolved.maxDelayMs, \"routingRetry.maxDelayMs\");\n if (resolved.baseDelayMs > resolved.maxDelayMs) {\n throw new Error(\"routingRetry.baseDelayMs must be <= maxDelayMs\");\n }\n\n return resolved;\n}\n\nfunction isRetryableDurableObjectError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n // SAFETY: Cloudflare's retryable and overloaded error flags are optional\n // runtime properties not represented on the base Error type.\n const typed = error as { retryable?: boolean; overloaded?: boolean };\n return typed.retryable === true && typed.overloaded !== true;\n}\n\nfunction routingRetryDelayMs(\n attempt: number,\n options: ResolvedRoutingRetryOptions\n): number {\n const upperBoundMs = Math.min(\n options.maxDelayMs,\n options.baseDelayMs * 2 ** (attempt - 1)\n );\n return Math.floor(Math.random() * upperBoundMs);\n}\n\nasync function retryDurableObjectOperation<T>(\n operation: () => Promise<T>,\n context: RoutingRetryContext,\n retryOptions: false | RoutingRetryOptions | undefined\n): Promise<T> {\n const resolved = resolveRoutingRetryOptions(retryOptions);\n if (!resolved) return await operation();\n\n let attempt = 1;\n while (true) {\n try {\n return await operation();\n } catch (error) {\n const nextAttempt = attempt + 1;\n if (\n nextAttempt > resolved.maxAttempts ||\n !isRetryableDurableObjectError(error)\n ) {\n throw error;\n }\n\n const delayMs = routingRetryDelayMs(attempt, resolved);\n try {\n await resolved.onRetry?.({\n error,\n attempt,\n maxAttempts: resolved.maxAttempts,\n delayMs,\n name: context.name,\n className: context.className\n });\n } catch (callbackError) {\n console.warn(\n \"Durable Object routing retry callback failed:\",\n callbackError\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n attempt = nextAttempt;\n }\n }\n}\n\nfunction encodeLifecycleProps(props: unknown): string {\n const bytes = new TextEncoder().encode(JSON.stringify(props));\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction mutableRequest(request: Request): Request {\n return new Request(request);\n}\n\nfunction cloneRequestForFetch(request: Request): Request {\n // SAFETY: Workers Types v5 preserves an unconstrained `cf` generic from\n // clone(). Cloning does not change the runtime Request representation.\n return request.clone() as Request;\n}\n\nfunction resolveCorsHeaders(\n cors: boolean | HeadersInit | undefined\n): Record<string, string> | null {\n if (cors === true) {\n return {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, HEAD, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\"\n };\n }\n if (cors && typeof cors === \"object\") {\n const headers = new Headers(cors);\n const record: Record<string, string> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n }\n return null;\n}\n\n/**\n * Route `/agents/:binding/:name` HTTP and WebSocket requests to a named\n * Durable Object. The target may extend `Agent` or compose `Lifecycle`\n * directly into a plain `DurableObject`.\n *\n * @param request - Incoming Worker request.\n * @param env - Worker environment containing Durable Object bindings.\n * @param options - Routing options.\n * @returns The matched response, or `null` when the path does not match.\n */\nexport async function routeAgentRequest<Env>(\n request: Request,\n env: Env,\n options?: AgentOptions<Env>\n): Promise<Response | null> {\n // SAFETY: Worker environments are object records. The unconstrained Env\n // generic is retained for compatibility with the previously published API.\n const environment = env as object;\n if (!namespaceMapCache.has(environment)) {\n const namespaceMap: Record<string, DurableObjectNamespace> = {};\n const bindingNames: Record<string, string> = {};\n for (const [key, value] of Object.entries(environment)) {\n if (\n value &&\n typeof value === \"object\" &&\n \"idFromName\" in value &&\n typeof value.idFromName === \"function\"\n ) {\n const kebab = camelCaseToKebabCase(key);\n // SAFETY: The structural idFromName check above identifies a Durable\n // Object namespace at the Worker environment boundary.\n namespaceMap[kebab] = value as DurableObjectNamespace;\n bindingNames[kebab] = key;\n }\n }\n namespaceMapCache.set(environment, namespaceMap);\n bindingNameCache.set(environment, bindingNames);\n }\n\n const map = namespaceMapCache.get(environment) as Record<\n string,\n DurableObjectNamespace\n >;\n const bindingNames = bindingNameCache.get(environment) as Record<\n string,\n string\n >;\n const prefixParts = (options?.prefix || \"agents\").split(\"/\");\n const parts = new URL(request.url).pathname.split(\"/\").filter(Boolean);\n const prefixMatches = prefixParts.every(\n (part, index) => parts[index] === part\n );\n if (!prefixMatches || parts.length < prefixParts.length + 2) return null;\n\n const namespaceName = parts[prefixParts.length];\n const name = parts[prefixParts.length + 1];\n if (!name || !namespaceName) return null;\n\n const boundNamespace = map[namespaceName];\n if (!boundNamespace) {\n console.error(\n `The URL ${request.url} with namespace \"${namespaceName}\" and name \"${name}\" does not match any Durable Object binding.`\n );\n return new Response(\"Invalid request\", { status: 400 });\n }\n\n const corsHeaders = resolveCorsHeaders(options?.cors);\n const isWebSocket =\n request.headers.get(\"Upgrade\")?.toLowerCase() === \"websocket\";\n const withCorsHeaders = (response: Response): Response => {\n if (!corsHeaders || isWebSocket) return response;\n const nextResponse = new Response(response.body, response);\n for (const [key, value] of Object.entries(corsHeaders)) {\n nextResponse.headers.set(key, value);\n }\n return nextResponse;\n };\n\n if (request.method === \"OPTIONS\" && corsHeaders) {\n return new Response(null, { headers: corsHeaders });\n }\n\n const namespace = options?.jurisdiction\n ? boundNamespace.jurisdiction(options.jurisdiction)\n : boundNamespace;\n const id = namespace.idFromName(name);\n const getOptions = durableObjectGetOptions(options);\n request = mutableRequest(request);\n\n // SAFETY: binding names come directly from Object.entries(env), so they are\n // string keys of Env.\n const className = bindingNames[namespaceName] as Extract<keyof Env, string>;\n const route: AgentRouteMatch<Env> = { className, name };\n\n if (isWebSocket) {\n const requestOrResponse = await options?.onBeforeConnect?.(request, route);\n if (requestOrResponse instanceof Request) {\n request = mutableRequest(requestOrResponse);\n } else if (requestOrResponse instanceof Response) {\n return requestOrResponse;\n }\n } else {\n const requestOrResponse = await options?.onBeforeRequest?.(request, route);\n if (requestOrResponse instanceof Request) {\n request = mutableRequest(requestOrResponse);\n } else if (requestOrResponse instanceof Response) {\n return withCorsHeaders(requestOrResponse);\n }\n }\n\n if (options?.props !== undefined) {\n request.headers.set(\n \"x-agents-lifecycle-props\",\n encodeLifecycleProps(options.props)\n );\n }\n\n const response = await retryDurableObjectOperation(\n () => namespace.get(id, getOptions).fetch(cloneRequestForFetch(request)),\n { name, className },\n options?.routingRetry\n );\n return isWebSocket ? response : withCorsHeaders(response);\n}\n\n/**\n * Get a named Agent stub after its lifecycle startup has completed.\n *\n * @param namespace - Agent Durable Object namespace.\n * @param name - Agent instance name.\n * @param options - Placement, startup properties, and retry options.\n * @returns The initialized Agent stub.\n */\nexport async function getAgentByName<\n Env extends Cloudflare.Env = Cloudflare.Env,\n T extends Agent<Env> = Agent<Env>,\n Props extends Record<string, unknown> = Record<string, unknown>\n>(\n namespace: DurableObjectNamespace<T>,\n name: string,\n options?: AgentGetOptions<Env, Props>\n): Promise<DurableObjectStub<T>> {\n const target = options?.jurisdiction\n ? namespace.jurisdiction(options.jurisdiction)\n : namespace;\n const id = target.idFromName(name);\n const stub = target.get(id, durableObjectGetOptions(options));\n\n // SAFETY: Agent exposes this internal initializer specifically for native\n // RPC calls, which bypass the lifecycle-installed fetch handler.\n const lifecycleStub = stub as unknown as {\n __unsafe_ensureInitialized(props?: Props): Promise<void>;\n };\n await retryDurableObjectOperation(\n () => lifecycleStub.__unsafe_ensureInitialized(options?.props),\n { name },\n options?.routingRetry\n );\n\n return stub;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-routing.js","names":[],"sources":["../src/agent-routing.ts"],"sourcesContent":["import type { Agent } from \"./index\";\nimport { camelCaseToKebabCase } from \"./utils\";\n\nconst namespaceMapCache = new WeakMap<\n object,\n Record<string, DurableObjectNamespace>\n>();\nconst bindingNameCache = new WeakMap<object, Record<string, string>>();\n\nconst DEFAULT_ROUTING_RETRY_OPTIONS = {\n maxAttempts: 3,\n baseDelayMs: 100,\n maxDelayMs: 800\n};\n\ninterface RoutingRetryEvent {\n error: unknown;\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n name: string;\n className?: string;\n}\n\n/** Retry policy for Agent routing infrastructure failures. */\nexport interface RoutingRetryOptions {\n /** Max number of attempts, including the first. Default: 3. */\n maxAttempts?: number;\n /** Base delay in milliseconds for exponential backoff. Default: 100. */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds. Default: 800. */\n maxDelayMs?: number;\n /** Optional callback invoked before each retry delay. */\n onRetry?: (event: RoutingRetryEvent) => void | Promise<void>;\n}\n\ninterface AgentRouteMatch<Env = Cloudflare.Env> {\n /** The Durable Object environment binding name. */\n className: Extract<keyof Env, string>;\n /** The named Durable Object instance extracted from the URL. */\n name: string;\n}\n\ninterface AgentRouteOptions<\n Env = Cloudflare.Env,\n Props extends object = object\n> {\n /** URL prefix before the binding and instance name. Default: `agents`. */\n prefix?: string;\n jurisdiction?: DurableObjectJurisdiction;\n locationHint?: DurableObjectLocationHint;\n /** Properties supplied before lifecycle startup. */\n props?: Props;\n /**\n * Whether to enable CORS for matched routes.\n *\n * When `true`, uses default permissive CORS headers:\n * - Access-Control-Allow-Origin: *\n * - Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS\n * - Access-Control-Allow-Headers: *\n * - Access-Control-Max-Age: 86400\n *\n * For credentialed requests, pass explicit headers with a specific origin.\n * When set to a `HeadersInit` value, uses those as the CORS headers instead.\n * CORS preflight requests are handled automatically for matched routes.\n */\n cors?: boolean | HeadersInit;\n /**\n * Retry transient Durable Object infrastructure errors thrown while routing.\n * Enabled by default; pass `false` to disable.\n */\n routingRetry?: false | RoutingRetryOptions;\n onBeforeConnect?: (\n request: Request,\n route: AgentRouteMatch<Env>\n ) => Response | Request | void | Promise<Response | Request | void>;\n onBeforeRequest?: (\n request: Request,\n route: AgentRouteMatch<Env>\n ) =>\n | Response\n | Request\n | void\n | Promise<Response | Request | undefined | void>;\n}\n\n/** Configuration options for {@link routeAgentRequest}. */\nexport type AgentOptions<Env> = AgentRouteOptions<Env>;\n\n/** Options for resolving and starting a named Agent. */\nexport type AgentGetOptions<Env, Props extends object = object> = Pick<\n AgentRouteOptions<Env, Props>,\n \"jurisdiction\" | \"locationHint\" | \"props\" | \"routingRetry\"\n>;\n\ninterface ResolvedRoutingRetryOptions extends Required<\n Omit<RoutingRetryOptions, \"onRetry\">\n> {\n onRetry?: RoutingRetryOptions[\"onRetry\"];\n}\n\ninterface RoutingRetryContext {\n name: string;\n className?: string;\n}\n\nfunction durableObjectGetOptions(\n options: { locationHint?: DurableObjectLocationHint } | undefined\n) {\n return options?.locationHint\n ? { locationHint: options.locationHint }\n : undefined;\n}\n\nfunction validatePositiveInteger(value: number, name: string): void {\n if (!Number.isFinite(value) || value < 1) {\n throw new Error(`${name} must be >= 1`);\n }\n if (!Number.isInteger(value)) {\n throw new Error(`${name} must be an integer`);\n }\n}\n\nfunction validatePositiveNumber(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be > 0`);\n }\n}\n\nfunction resolveRoutingRetryOptions(\n options: false | RoutingRetryOptions | undefined\n): ResolvedRoutingRetryOptions | null {\n if (options === false) return null;\n\n const resolved = {\n maxAttempts:\n options?.maxAttempts ?? DEFAULT_ROUTING_RETRY_OPTIONS.maxAttempts,\n baseDelayMs:\n options?.baseDelayMs ?? DEFAULT_ROUTING_RETRY_OPTIONS.baseDelayMs,\n maxDelayMs: options?.maxDelayMs ?? DEFAULT_ROUTING_RETRY_OPTIONS.maxDelayMs,\n onRetry: options?.onRetry\n };\n\n validatePositiveInteger(resolved.maxAttempts, \"routingRetry.maxAttempts\");\n validatePositiveNumber(resolved.baseDelayMs, \"routingRetry.baseDelayMs\");\n validatePositiveNumber(resolved.maxDelayMs, \"routingRetry.maxDelayMs\");\n if (resolved.baseDelayMs > resolved.maxDelayMs) {\n throw new Error(\"routingRetry.baseDelayMs must be <= maxDelayMs\");\n }\n\n return resolved;\n}\n\nfunction isRetryableDurableObjectError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n // SAFETY: Cloudflare's retryable and overloaded error flags are optional\n // runtime properties not represented on the base Error type.\n const typed = error as { retryable?: boolean; overloaded?: boolean };\n return typed.retryable === true && typed.overloaded !== true;\n}\n\nfunction routingRetryDelayMs(\n attempt: number,\n options: ResolvedRoutingRetryOptions\n): number {\n const upperBoundMs = Math.min(\n options.maxDelayMs,\n options.baseDelayMs * 2 ** (attempt - 1)\n );\n return Math.floor(Math.random() * upperBoundMs);\n}\n\nasync function retryDurableObjectOperation<T>(\n operation: () => Promise<T>,\n context: RoutingRetryContext,\n retryOptions: false | RoutingRetryOptions | undefined\n): Promise<T> {\n const resolved = resolveRoutingRetryOptions(retryOptions);\n if (!resolved) return await operation();\n\n let attempt = 1;\n while (true) {\n try {\n return await operation();\n } catch (error) {\n const nextAttempt = attempt + 1;\n if (\n nextAttempt > resolved.maxAttempts ||\n !isRetryableDurableObjectError(error)\n ) {\n throw error;\n }\n\n const delayMs = routingRetryDelayMs(attempt, resolved);\n try {\n await resolved.onRetry?.({\n error,\n attempt,\n maxAttempts: resolved.maxAttempts,\n delayMs,\n name: context.name,\n className: context.className\n });\n } catch (callbackError) {\n console.warn(\n \"Durable Object routing retry callback failed:\",\n callbackError\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n attempt = nextAttempt;\n }\n }\n}\n\nfunction encodeLifecycleProps(props: unknown): string {\n const bytes = new TextEncoder().encode(JSON.stringify(props));\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction mutableRequest(request: Request): Request {\n return new Request(request);\n}\n\nfunction cloneRequestForFetch(request: Request): Request {\n // SAFETY: Workers Types v5 preserves an unconstrained `cf` generic from\n // clone(). Cloning does not change the runtime Request representation.\n return request.clone() as Request;\n}\n\nfunction resolveCorsHeaders(\n cors: boolean | HeadersInit | undefined\n): Record<string, string> | null {\n if (cors === true) {\n return {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, HEAD, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\"\n };\n }\n if (cors && typeof cors === \"object\") {\n const headers = new Headers(cors);\n const record: Record<string, string> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n }\n return null;\n}\n\n/**\n * Route `/agents/:binding/:name` HTTP and WebSocket requests to a named\n * Durable Object. The target may extend `Agent` or compose `Lifecycle`\n * directly into a plain `DurableObject`.\n *\n * @param request - Incoming Worker request.\n * @param env - Worker environment containing Durable Object bindings.\n * @param options - Routing options.\n * @returns The matched response, or `null` when the path does not match.\n */\nexport async function routeAgentRequest<Env>(\n request: Request,\n env: Env,\n options?: AgentOptions<Env>\n): Promise<Response | null> {\n // SAFETY: Worker environments are object records. The unconstrained Env\n // generic is retained for compatibility with the previously published API.\n const environment = env as object;\n if (!namespaceMapCache.has(environment)) {\n const namespaceMap: Record<string, DurableObjectNamespace> = {};\n const bindingNames: Record<string, string> = {};\n for (const [key, value] of Object.entries(environment)) {\n if (\n value &&\n typeof value === \"object\" &&\n \"idFromName\" in value &&\n typeof value.idFromName === \"function\"\n ) {\n const kebab = camelCaseToKebabCase(key);\n // SAFETY: The structural idFromName check above identifies a Durable\n // Object namespace at the Worker environment boundary.\n namespaceMap[kebab] = value as DurableObjectNamespace;\n bindingNames[kebab] = key;\n }\n }\n namespaceMapCache.set(environment, namespaceMap);\n bindingNameCache.set(environment, bindingNames);\n }\n\n const map = namespaceMapCache.get(environment) as Record<\n string,\n DurableObjectNamespace\n >;\n const bindingNames = bindingNameCache.get(environment) as Record<\n string,\n string\n >;\n const prefixParts = (options?.prefix || \"agents\").split(\"/\");\n const parts = new URL(request.url).pathname.split(\"/\").filter(Boolean);\n const prefixMatches = prefixParts.every(\n (part, index) => parts[index] === part\n );\n if (!prefixMatches || parts.length < prefixParts.length + 2) return null;\n\n const namespaceName = parts[prefixParts.length];\n const name = parts[prefixParts.length + 1];\n if (!name || !namespaceName) return null;\n\n const boundNamespace = map[namespaceName];\n if (!boundNamespace) {\n console.error(\n `The URL ${request.url} with namespace \"${namespaceName}\" and name \"${name}\" does not match any Durable Object binding.`\n );\n return new Response(\"Invalid request\", { status: 400 });\n }\n\n const corsHeaders = resolveCorsHeaders(options?.cors);\n const isWebSocket =\n request.headers.get(\"Upgrade\")?.toLowerCase() === \"websocket\";\n const withCorsHeaders = (response: Response): Response => {\n if (!corsHeaders || isWebSocket) return response;\n const nextResponse = new Response(response.body, response);\n for (const [key, value] of Object.entries(corsHeaders)) {\n nextResponse.headers.set(key, value);\n }\n return nextResponse;\n };\n\n if (request.method === \"OPTIONS\" && corsHeaders) {\n return new Response(null, { headers: corsHeaders });\n }\n\n const namespace = options?.jurisdiction\n ? boundNamespace.jurisdiction(options.jurisdiction)\n : boundNamespace;\n const id = namespace.idFromName(name);\n const getOptions = durableObjectGetOptions(options);\n request = mutableRequest(request);\n\n // SAFETY: binding names come directly from Object.entries(env), so they are\n // string keys of Env.\n const className = bindingNames[namespaceName] as Extract<keyof Env, string>;\n const route: AgentRouteMatch<Env> = { className, name };\n\n if (isWebSocket) {\n const requestOrResponse = await options?.onBeforeConnect?.(request, route);\n if (requestOrResponse instanceof Request) {\n request = mutableRequest(requestOrResponse);\n } else if (requestOrResponse instanceof Response) {\n return requestOrResponse;\n }\n } else {\n const requestOrResponse = await options?.onBeforeRequest?.(request, route);\n if (requestOrResponse instanceof Request) {\n request = mutableRequest(requestOrResponse);\n } else if (requestOrResponse instanceof Response) {\n return withCorsHeaders(requestOrResponse);\n }\n }\n\n if (options?.props !== undefined) {\n request.headers.set(\n \"x-agents-lifecycle-props\",\n encodeLifecycleProps(options.props)\n );\n }\n\n const response = await retryDurableObjectOperation(\n () => namespace.get(id, getOptions).fetch(cloneRequestForFetch(request)),\n { name, className },\n options?.routingRetry\n );\n return isWebSocket ? response : withCorsHeaders(response);\n}\n\n/**\n * Get a named Agent stub after its lifecycle startup has completed.\n *\n * @param namespace - Agent Durable Object namespace.\n * @param name - Agent instance name.\n * @param options - Placement, startup properties, and retry options.\n * @returns The initialized Agent stub.\n */\nexport async function getAgentByName<\n Env extends Cloudflare.Env = Cloudflare.Env,\n T extends Agent<Env> = Agent<Env>,\n Props extends object = object\n>(\n namespace: DurableObjectNamespace<T>,\n name: string,\n options?: AgentGetOptions<Env, Props>\n): Promise<DurableObjectStub<T>> {\n const target = options?.jurisdiction\n ? namespace.jurisdiction(options.jurisdiction)\n : namespace;\n const id = target.idFromName(name);\n const stub = target.get(id, durableObjectGetOptions(options));\n\n // SAFETY: Agent exposes this internal initializer specifically for native\n // RPC calls, which bypass the lifecycle-installed fetch handler.\n const lifecycleStub = stub as unknown as {\n __unsafe_ensureInitialized(props?: Props): Promise<void>;\n };\n await retryDurableObjectOperation(\n () => lifecycleStub.__unsafe_ensureInitialized(options?.props),\n { name },\n options?.routingRetry\n );\n\n return stub;\n}\n"],"mappings":";;AAGA,MAAM,oCAAoB,IAAI,QAG5B;AACF,MAAM,mCAAmB,IAAI,QAAwC;AAErE,MAAM,gCAAgC;CACpC,aAAa;CACb,aAAa;CACb,YAAY;AACd;AA6FA,SAAS,wBACP,SACA;CACA,OAAO,SAAS,eACZ,EAAE,cAAc,QAAQ,aAAa,IACrC,KAAA;AACN;AAEA,SAAS,wBAAwB,OAAe,MAAoB;CAClE,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACrC,MAAM,IAAI,MAAM,GAAG,KAAK,cAAc;CAExC,IAAI,CAAC,OAAO,UAAU,KAAK,GACzB,MAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;AAEhD;AAEA,SAAS,uBAAuB,OAAe,MAAoB;CACjE,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GACtC,MAAM,IAAI,MAAM,GAAG,KAAK,aAAa;AAEzC;AAEA,SAAS,2BACP,SACoC;CACpC,IAAI,YAAY,OAAO,OAAO;CAE9B,MAAM,WAAW;EACf,aACE,SAAS,eAAe,8BAA8B;EACxD,aACE,SAAS,eAAe,8BAA8B;EACxD,YAAY,SAAS,cAAc,8BAA8B;EACjE,SAAS,SAAS;CACpB;CAEA,wBAAwB,SAAS,aAAa,0BAA0B;CACxE,uBAAuB,SAAS,aAAa,0BAA0B;CACvE,uBAAuB,SAAS,YAAY,yBAAyB;CACrE,IAAI,SAAS,cAAc,SAAS,YAClC,MAAM,IAAI,MAAM,gDAAgD;CAGlE,OAAO;AACT;AAEA,SAAS,8BAA8B,OAAyB;CAC9D,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CAGxD,MAAM,QAAQ;CACd,OAAO,MAAM,cAAc,QAAQ,MAAM,eAAe;AAC1D;AAEA,SAAS,oBACP,SACA,SACQ;CACR,MAAM,eAAe,KAAK,IACxB,QAAQ,YACR,QAAQ,cAAc,MAAM,UAAU,EACxC;CACA,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,YAAY;AAChD;AAEA,eAAe,4BACb,WACA,SACA,cACY;CACZ,MAAM,WAAW,2BAA2B,YAAY;CACxD,IAAI,CAAC,UAAU,OAAO,MAAM,UAAU;CAEtC,IAAI,UAAU;CACd,OAAO,MACL,IAAI;EACF,OAAO,MAAM,UAAU;CACzB,SAAS,OAAO;EACd,MAAM,cAAc,UAAU;EAC9B,IACE,cAAc,SAAS,eACvB,CAAC,8BAA8B,KAAK,GAEpC,MAAM;EAGR,MAAM,UAAU,oBAAoB,SAAS,QAAQ;EACrD,IAAI;GACF,MAAM,SAAS,UAAU;IACvB;IACA;IACA,aAAa,SAAS;IACtB;IACA,MAAM,QAAQ;IACd,WAAW,QAAQ;GACrB,CAAC;EACH,SAAS,eAAe;GACtB,QAAQ,KACN,iDACA,aACF;EACF;EACA,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,OAAO,CAAC;EAC3D,UAAU;CACZ;AAEJ;AAEA,SAAS,qBAAqB,OAAwB;CACpD,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,KAAK,CAAC;CAC5D,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAChC,UAAU,OAAO,aAAa,MAAM,EAAE;CAExC,OAAO,KAAK,MAAM;AACpB;AAEA,SAAS,eAAe,SAA2B;CACjD,OAAO,IAAI,QAAQ,OAAO;AAC5B;AAEA,SAAS,qBAAqB,SAA2B;CAGvD,OAAO,QAAQ,MAAM;AACvB;AAEA,SAAS,mBACP,MAC+B;CAC/B,IAAI,SAAS,MACX,OAAO;EACL,+BAA+B;EAC/B,gCAAgC;EAChC,gCAAgC;EAChC,0BAA0B;CAC5B;CAEF,IAAI,QAAQ,OAAO,SAAS,UAAU;EACpC,MAAM,UAAU,IAAI,QAAQ,IAAI;EAChC,MAAM,SAAiC,CAAC;EACxC,QAAQ,SAAS,OAAO,QAAQ;GAC9B,OAAO,OAAO;EAChB,CAAC;EACD,OAAO;CACT;CACA,OAAO;AACT;;;;;;;;;;;AAYA,eAAsB,kBACpB,SACA,KACA,SAC0B;CAG1B,MAAM,cAAc;CACpB,IAAI,CAAC,kBAAkB,IAAI,WAAW,GAAG;EACvC,MAAM,eAAuD,CAAC;EAC9D,MAAM,eAAuC,CAAC;EAC9C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,GACnD,IACE,SACA,OAAO,UAAU,YACjB,gBAAgB,SAChB,OAAO,MAAM,eAAe,YAC5B;GACA,MAAM,QAAQ,qBAAqB,GAAG;GAGtC,aAAa,SAAS;GACtB,aAAa,SAAS;EACxB;EAEF,kBAAkB,IAAI,aAAa,YAAY;EAC/C,iBAAiB,IAAI,aAAa,YAAY;CAChD;CAEA,MAAM,MAAM,kBAAkB,IAAI,WAAW;CAI7C,MAAM,eAAe,iBAAiB,IAAI,WAAW;CAIrD,MAAM,eAAe,SAAS,UAAU,SAAA,CAAU,MAAM,GAAG;CAC3D,MAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;CAIrE,IAAI,CAHkB,YAAY,OAC/B,MAAM,UAAU,MAAM,WAAW,IAEnB,KAAK,MAAM,SAAS,YAAY,SAAS,GAAG,OAAO;CAEpE,MAAM,gBAAgB,MAAM,YAAY;CACxC,MAAM,OAAO,MAAM,YAAY,SAAS;CACxC,IAAI,CAAC,QAAQ,CAAC,eAAe,OAAO;CAEpC,MAAM,iBAAiB,IAAI;CAC3B,IAAI,CAAC,gBAAgB;EACnB,QAAQ,MACN,WAAW,QAAQ,IAAI,mBAAmB,cAAc,cAAc,KAAK,6CAC7E;EACA,OAAO,IAAI,SAAS,mBAAmB,EAAE,QAAQ,IAAI,CAAC;CACxD;CAEA,MAAM,cAAc,mBAAmB,SAAS,IAAI;CACpD,MAAM,cACJ,QAAQ,QAAQ,IAAI,SAAS,CAAC,EAAE,YAAY,MAAM;CACpD,MAAM,mBAAmB,aAAiC;EACxD,IAAI,CAAC,eAAe,aAAa,OAAO;EACxC,MAAM,eAAe,IAAI,SAAS,SAAS,MAAM,QAAQ;EACzD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,GACnD,aAAa,QAAQ,IAAI,KAAK,KAAK;EAErC,OAAO;CACT;CAEA,IAAI,QAAQ,WAAW,aAAa,aAClC,OAAO,IAAI,SAAS,MAAM,EAAE,SAAS,YAAY,CAAC;CAGpD,MAAM,YAAY,SAAS,eACvB,eAAe,aAAa,QAAQ,YAAY,IAChD;CACJ,MAAM,KAAK,UAAU,WAAW,IAAI;CACpC,MAAM,aAAa,wBAAwB,OAAO;CAClD,UAAU,eAAe,OAAO;CAIhC,MAAM,YAAY,aAAa;CAC/B,MAAM,QAA8B;EAAE;EAAW;CAAK;CAEtD,IAAI,aAAa;EACf,MAAM,oBAAoB,MAAM,SAAS,kBAAkB,SAAS,KAAK;EACzE,IAAI,6BAA6B,SAC/B,UAAU,eAAe,iBAAiB;OACrC,IAAI,6BAA6B,UACtC,OAAO;CAEX,OAAO;EACL,MAAM,oBAAoB,MAAM,SAAS,kBAAkB,SAAS,KAAK;EACzE,IAAI,6BAA6B,SAC/B,UAAU,eAAe,iBAAiB;OACrC,IAAI,6BAA6B,UACtC,OAAO,gBAAgB,iBAAiB;CAE5C;CAEA,IAAI,SAAS,UAAU,KAAA,GACrB,QAAQ,QAAQ,IACd,4BACA,qBAAqB,QAAQ,KAAK,CACpC;CAGF,MAAM,WAAW,MAAM,kCACf,UAAU,IAAI,IAAI,UAAU,CAAC,CAAC,MAAM,qBAAqB,OAAO,CAAC,GACvE;EAAE;EAAM;CAAU,GAClB,SAAS,YACX;CACA,OAAO,cAAc,WAAW,gBAAgB,QAAQ;AAC1D;;;;;;;;;AAUA,eAAsB,eAKpB,WACA,MACA,SAC+B;CAC/B,MAAM,SAAS,SAAS,eACpB,UAAU,aAAa,QAAQ,YAAY,IAC3C;CACJ,MAAM,KAAK,OAAO,WAAW,IAAI;CACjC,MAAM,OAAO,OAAO,IAAI,IAAI,wBAAwB,OAAO,CAAC;CAI5D,MAAM,gBAAgB;CAGtB,MAAM,kCACE,cAAc,2BAA2B,SAAS,KAAK,GAC7D,EAAE,KAAK,GACP,SAAS,YACX;CAEA,OAAO;AACT"}
|