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.
Files changed (170) hide show
  1. package/dist/{agent-routing-B2XLNMxq.d.ts → agent-routing-0DR0Tk2v.d.ts} +205 -132
  2. package/dist/agent-routing.d.ts +1 -1
  3. package/dist/agent-routing.js.map +1 -1
  4. package/dist/agent-tool-types.d.ts +28 -22
  5. package/dist/agent-tool-types.js +23 -1
  6. package/dist/agent-tool-types.js.map +1 -1
  7. package/dist/{agent-tools-y7zLfw4Q.js → agent-tools-CdJC-8Dc.js} +72 -9
  8. package/dist/agent-tools-CdJC-8Dc.js.map +1 -0
  9. package/dist/{agent-tools-Dj5Mzlw7.d.ts → agent-tools-YrATZJu2.d.ts} +34 -20
  10. package/dist/agent-tools.d.ts +20 -18
  11. package/dist/agent-tools.js.map +1 -1
  12. package/dist/ai-fm7xx1BK.js +312 -0
  13. package/dist/ai-fm7xx1BK.js.map +1 -0
  14. package/dist/base64-redaction-C1Uu29t5.js +59 -0
  15. package/dist/base64-redaction-C1Uu29t5.js.map +1 -0
  16. package/dist/browser/ai-sdk.d.ts +90 -0
  17. package/dist/browser/ai-sdk.js +51 -0
  18. package/dist/browser/ai-sdk.js.map +1 -0
  19. package/dist/browser/ai.d.ts +4 -4
  20. package/dist/browser/ai.js +1 -347
  21. package/dist/browser/index.d.ts +81 -79
  22. package/dist/browser/index.js +361 -2
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/browser/tanstack-ai.d.ts +96 -1
  25. package/dist/browser/tanstack-ai.js +62 -2
  26. package/dist/browser/tanstack-ai.js.map +1 -1
  27. package/dist/browser-DE3d-RLk.d.ts +275 -0
  28. package/dist/browser-tool-CQ10e6Kj.js +480 -0
  29. package/dist/browser-tool-CQ10e6Kj.js.map +1 -0
  30. package/dist/browser-tool-DuNdlwZ9.d.ts +73 -0
  31. package/dist/capability-B4WbF81e.js.map +1 -1
  32. package/dist/{capability-runner-BUBa6Ake.d.ts → capability-runner-DBAnGr6L.d.ts} +7 -2
  33. package/dist/chat/index.d.ts +340 -234
  34. package/dist/chat/index.js +592 -66
  35. package/dist/chat/index.js.map +1 -1
  36. package/dist/chat/react.d.ts +42 -2
  37. package/dist/chat/react.js +191 -35
  38. package/dist/chat/react.js.map +1 -1
  39. package/dist/chat/transport.d.ts +1 -1
  40. package/dist/chat/transport.js +1 -1
  41. package/dist/chat-sdk/index.d.ts +17 -3
  42. package/dist/chat-sdk/index.js +28 -2
  43. package/dist/chat-sdk/index.js.map +1 -1
  44. package/dist/{client-C9DAjZIY.js → client-4OlMIJx-.js} +102 -29
  45. package/dist/client-4OlMIJx-.js.map +1 -0
  46. package/dist/{client-BxdkCuVy.d.ts → client-je3koD9Z.d.ts} +45 -10
  47. package/dist/client.d.ts +7 -5
  48. package/dist/client.js +2 -2
  49. package/dist/{connector-CptFKzRh.js → connector-58XDGvc3.js} +251 -120
  50. package/dist/connector-58XDGvc3.js.map +1 -0
  51. package/dist/{connector-CkQD4MK3.d.ts → connector-Cl-VqPmA.d.ts} +244 -146
  52. package/dist/context/index.d.ts +29 -0
  53. package/dist/context/index.js +64 -17
  54. package/dist/context/index.js.map +1 -1
  55. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  56. package/dist/{current-agent-C4w86kcN.d.ts → current-agent-vAk_5JMt.d.ts} +4 -4
  57. package/dist/{durable-object-lifecycle-ei7M7lqB.d.ts → durable-object-lifecycle-HhgOMWq9.d.ts} +15 -7
  58. package/dist/harness/pi/index.d.ts +344 -0
  59. package/dist/harness/pi/index.js +873 -0
  60. package/dist/harness/pi/index.js.map +1 -0
  61. package/dist/images-iiTDSyRu.js +1631 -0
  62. package/dist/images-iiTDSyRu.js.map +1 -0
  63. package/dist/{index-Dlgtd3Mj.d.ts → index-BreL0YrQ.d.ts} +2 -2
  64. package/dist/index-kbSUIer3.d.ts +343 -0
  65. package/dist/index.d.ts +46 -44
  66. package/dist/index.js +1 -1
  67. package/dist/internal_context.d.ts +1 -1
  68. package/dist/lifecycle/index.d.ts +3 -3
  69. package/dist/lifecycle/index.js +1 -1
  70. package/dist/{lifecycle-Mm_jQh7r.js → lifecycle-CFu6OV03.js} +39 -10
  71. package/dist/{lifecycle-Mm_jQh7r.js.map → lifecycle-CFu6OV03.js.map} +1 -1
  72. package/dist/mcp/client/index.d.ts +20 -20
  73. package/dist/mcp/client/x402.js +21 -19
  74. package/dist/mcp/client/x402.js.map +1 -1
  75. package/dist/mcp/index.d.ts +35 -35
  76. package/dist/mcp/index.js +1 -1
  77. package/dist/{message-builder-BymO4N_D.js → message-builder-DAl9AhHH.js} +89 -4
  78. package/dist/message-builder-DAl9AhHH.js.map +1 -0
  79. package/dist/models/ai-sdk/index.d.ts +353 -0
  80. package/dist/models/ai-sdk/index.js +2443 -0
  81. package/dist/models/ai-sdk/index.js.map +1 -0
  82. package/dist/models/pi-ai/index.d.ts +313 -0
  83. package/dist/models/pi-ai/index.js +1795 -0
  84. package/dist/models/pi-ai/index.js.map +1 -0
  85. package/dist/observability/ai/index.js +20 -4
  86. package/dist/observability/ai/index.js.map +1 -1
  87. package/dist/{protocol-B0nh6KNf.js → protocol-kHsr-f0X.js} +26 -12
  88. package/dist/{protocol-B0nh6KNf.js.map → protocol-kHsr-f0X.js.map} +1 -1
  89. package/dist/queue/index.d.ts +3 -3
  90. package/dist/queue/index.js +1 -1
  91. package/dist/{queue-BC9F5cUo.js → queue-BB-zfIYF.js} +2 -2
  92. package/dist/{queue-BC9F5cUo.js.map → queue-BB-zfIYF.js.map} +1 -1
  93. package/dist/react.d.ts +6 -6
  94. package/dist/react.js +160 -64
  95. package/dist/react.js.map +1 -1
  96. package/dist/{retries-D9B2UCq3.d.ts → retries-CV6AkXmQ.d.ts} +18 -9
  97. package/dist/retries.d.ts +11 -9
  98. package/dist/retries.js +11 -1
  99. package/dist/retries.js.map +1 -1
  100. package/dist/routing/index.d.ts +2 -2
  101. package/dist/routing/index.js +1 -1
  102. package/dist/{scheduler-D_KHqxBa.js → scheduler-DZ3xQfeK.js} +2 -2
  103. package/dist/{scheduler-D_KHqxBa.js.map → scheduler-DZ3xQfeK.js.map} +1 -1
  104. package/dist/{scheduler-BGq6M5Kd.d.ts → scheduler-RdACNXDP.d.ts} +3 -3
  105. package/dist/schedules/index.d.ts +1 -1
  106. package/dist/schedules/index.js +1 -1
  107. package/dist/serializable.d.ts +1 -1
  108. package/dist/sessions/index.d.ts +70 -3
  109. package/dist/sessions/index.js +276 -67
  110. package/dist/sessions/index.js.map +1 -1
  111. package/dist/skills/index.d.ts +29 -314
  112. package/dist/socket-address.d.ts +16 -0
  113. package/dist/socket-address.js +19 -0
  114. package/dist/socket-address.js.map +1 -0
  115. package/dist/{src-BNU3ZiJM.js → src-BZeu-SCD.js} +423 -115
  116. package/dist/src-BZeu-SCD.js.map +1 -0
  117. package/dist/state/index.d.ts +1 -1
  118. package/dist/state/index.js +1 -1
  119. package/dist/streams/index.d.ts +1 -1
  120. package/dist/streams/index.js +1 -1
  121. package/dist/{streams-BcE8JP2X.d.ts → streams-Cmkj9QfW.d.ts} +4 -2
  122. package/dist/{streams-CCPRV6dt.js → streams-DW-UCOUc.js} +9 -2
  123. package/dist/streams-DW-UCOUc.js.map +1 -0
  124. package/dist/sub-routing.d.ts +12 -12
  125. package/dist/tasks/index.d.ts +1 -1
  126. package/dist/tasks/index.js +1 -1
  127. package/dist/{tasks-D4nLqVSI.js → tasks-68DESxf0.js} +2 -2
  128. package/dist/{tasks-D4nLqVSI.js.map → tasks-68DESxf0.js.map} +1 -1
  129. package/dist/{tasks-V2lCT8ZV.d.ts → tasks-9YxYtByh.d.ts} +2 -2
  130. package/dist/transport-PfFnt-Ld.d.ts +525 -0
  131. package/dist/{types-DCD6BNZH.d.ts → types-BA4anrjI.d.ts} +2 -2
  132. package/dist/voice/index.d.ts +2 -2
  133. package/dist/websockets/index.d.ts +23 -6
  134. package/dist/websockets/index.js +1 -1
  135. package/dist/{websockets-D7IzWbZb.js → websockets-Ci-LZFHH.js} +45 -20
  136. package/dist/{websockets-D7IzWbZb.js.map → websockets-Ci-LZFHH.js.map} +1 -1
  137. package/dist/wire-types-CnMt6_HR.js.map +1 -1
  138. package/dist/wire-types-CrjKvDyi.d.ts +300 -0
  139. package/dist/workflow-types.d.ts +25 -25
  140. package/dist/workflows.d.ts +21 -21
  141. package/dist/workflows.js +1 -1
  142. package/dist/{ws-chat-transport-UNRIS2xl.d.ts → ws-chat-transport-BbT1A5Lc.d.ts} +51 -2
  143. package/dist/{ws-chat-transport-rWwta645.js → ws-chat-transport-cqMKq3IY.js} +143 -16
  144. package/dist/ws-chat-transport-cqMKq3IY.js.map +1 -0
  145. package/docs/agent-tools.md +29 -4
  146. package/docs/browse-the-web.md +87 -5
  147. package/docs/chat-agents.md +124 -16
  148. package/docs/context.md +27 -0
  149. package/docs/durable-execution.md +2 -0
  150. package/docs/harnesses/pi.md +173 -0
  151. package/docs/human-in-the-loop.md +4 -0
  152. package/docs/index.md +3 -0
  153. package/docs/lifecycle.md +20 -4
  154. package/docs/models-pi-ai.md +325 -0
  155. package/docs/models.md +504 -0
  156. package/docs/resumable-streaming.md +2 -0
  157. package/docs/routing.md +13 -13
  158. package/docs/sessions.md +36 -1
  159. package/docs/state.md +1 -0
  160. package/docs/sub-agents.md +9 -0
  161. package/package.json +40 -2
  162. package/dist/agent-tools-y7zLfw4Q.js.map +0 -1
  163. package/dist/browser/ai.js.map +0 -1
  164. package/dist/client-C9DAjZIY.js.map +0 -1
  165. package/dist/client-tools-aIBO0Fk7.d.ts +0 -53
  166. package/dist/connector-CptFKzRh.js.map +0 -1
  167. package/dist/message-builder-BymO4N_D.js.map +0 -1
  168. package/dist/src-BNU3ZiJM.js.map +0 -1
  169. package/dist/streams-CCPRV6dt.js.map +0 -1
  170. 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-BUBa6Ake.js";
12
- import { t as RetryOptions } from "./retries-D9B2UCq3.js";
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-ei7M7lqB.js";
17
- import { n as CurrentAgentContext } from "./current-agent-C4w86kcN.js";
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-BGq6M5Kd.js";
45
- import { i as QueueItem } from "./types-DCD6BNZH.js";
46
- import { l as TaskHandlers, r as Tasks } from "./tasks-V2lCT8ZV.js";
47
- import { t as State } from "./index-Dlgtd3Mj.js";
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), mirroring
4321
- * chat-recovery's `maxRecoveryWork` (#1672): a healthy, still-advancing child
4322
- * is followed for as long as it makes progress — a hung child is bounded by
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
- * mirroring chat-recovery's `maxRecoveryWork` (#1672) — a healthy,
4394
- * still-advancing child is followed for as long as it makes progress, exactly
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 Record<string, unknown> = Record<string, unknown>
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, mirroring #1672's
6023
- * `maxRecoveryWork`); set it finite to also bound a child that keeps
6024
- * progressing, which seals `window-exceeded` and tears the child down.
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 Record<string, unknown> = Record<string, unknown>
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 Record<string, unknown> = Record<string, unknown>
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
- DetachedAgentToolConfig as $,
6827
- ElicitRequest$2 as $t,
6896
+ ChatCapableAgentClass as $,
6897
+ RPCServerTransport as $t,
6828
6898
  getCurrentAgent as A,
6829
- withInvocationScope as An,
6830
- MCPAIToolSet as At,
6831
- AgentToolInterruptedReason as B,
6832
- MCPServerFilter as Bt,
6899
+ getSubAgentByName as An,
6900
+ ElicitRequest$1 as At,
6901
+ AgentToolFailure as B,
6902
+ MCPConnectionResult as Bt,
6833
6903
  MCPServersState as C,
6834
- buildAgentPath as Cn,
6835
- WorkflowQueryCriteria as Ct,
6904
+ BuildAgentPathOptions as Cn,
6905
+ WorkflowInfo as Ct,
6836
6906
  StartFiberResult as D,
6837
- getSubAgentByName as Dn,
6838
- ElicitRequest$1 as Dt,
6907
+ buildAgentUrl as Dn,
6908
+ WorkflowRejectedError as Dt,
6839
6909
  StartFiberOptions as E,
6840
- buildSubAgentPathUnchecked as En,
6841
- WorkflowTrackingRow as Et,
6910
+ buildAgentPath as En,
6911
+ WorkflowQueryCriteria as Et,
6842
6912
  AgentToolDisplayMetadata as F,
6843
- MCPClientOAuthCallbackConfig as Ft,
6844
- AgentToolRunInfo as G,
6845
- normalizeServerId as Gt,
6846
- AgentToolMilestone as H,
6847
- MCP_SERVER_ID_MAX_LENGTH as Ht,
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
- MCPClientOAuthResult as It,
6850
- AgentToolRunState as J,
6851
- RPCClientTransport as Jt,
6852
- AgentToolRunInspection as K,
6853
- MCPElicitationHandler as Kt,
6854
- AgentToolEventMessage as L,
6855
- MCPConnectionResult as Lt,
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
- MCPClientElicitationHandlers as Mt,
6927
+ routeSubAgentRequest as Mn,
6928
+ MCPAITool as Mt,
6858
6929
  AGENT_TOOL_PROGRESS_PART as N,
6859
- MCPClientManager as Nt,
6930
+ withInvocationScope as Nn,
6931
+ MCPAIToolSet as Nt,
6860
6932
  StateUpdateMessage as O,
6861
- parseSubAgentPath as On,
6862
- ElicitResult$2 as Ot,
6933
+ buildSubAgentPath as On,
6934
+ WorkflowStatus as Ot,
6863
6935
  AgentToolChildAdapter as P,
6864
- MCPClientManagerOptions as Pt,
6865
- ChatCapableAgentClass as Q,
6866
- RPC_DO_PREFIX as Qt,
6867
- AgentToolEventState as R,
6868
- MCPDiscoverResult as Rt,
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
- SubAgentPathMatch as Sn,
6871
- WorkflowProgressCallback as St,
6942
+ AgentPathStep as Sn,
6943
+ WorkflowEventPayload as St,
6872
6944
  RPCResponse as T,
6873
- buildSubAgentPath as Tn,
6874
- WorkflowStatus as Tt,
6875
- AgentToolProgress as U,
6876
- RegisterServerOptions as Ut,
6877
- AgentToolLifecycleResult as V,
6878
- MCPServerOptions as Vt,
6879
- AgentToolProgressSnapshot as W,
6880
- getNamespacedData as Wt,
6881
- AgentToolStoredChunk as X,
6882
- RPCServerTransport as Xt,
6883
- AgentToolRunStatus as Y,
6884
- RPCClientTransportOptions as Yt,
6885
- AgentToolTerminalStatus as Z,
6886
- RPCServerTransportOptions as Zt,
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
- DynamicAgentClass as _n,
6889
- WorkflowErrorCallback as _t,
6960
+ WorkerTransportOptions as _n,
6961
+ WorkflowCallbackBase as _t,
6890
6962
  routeAgentRequest as a,
6891
- createMcpHandler$1 as an,
6892
- AgentWorkflowOrigin as at,
6963
+ McpAgent as an,
6964
+ isPositionlessAgentToolChunk as at,
6893
6965
  ListFibersOptions as b,
6894
- BuildAgentPathOptions as bn,
6895
- WorkflowInfo as bt,
6966
+ DynamicAgentClass as bn,
6967
+ WorkflowErrorCallback as bt,
6896
6968
  Agent as c,
6897
- CreateMcpHandlerOptions$1 as cn,
6898
- AgentWorkflowStep as ct,
6969
+ createMcpHandler$1 as cn,
6970
+ AgentWorkflowOrigin as ct,
6899
6971
  AgentStaticOptions as d,
6900
- MCPStorageApi as dn,
6901
- RunWorkflowOptions as dt,
6902
- ElicitRequestSchema as en,
6903
- DetachedRunAgentToolResult as et,
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
- TransportState as fn,
6906
- WaitForApprovalOptions as ft,
6977
+ LegacyMcpHandler as fn,
6978
+ ApprovalEventPayload as ft,
6907
6979
  FiberInspection as g,
6908
- StreamableHTTPEdgeClientTransport as gn,
6909
- WorkflowCompleteCallback as gt,
6980
+ WorkerTransport as gn,
6981
+ WorkflowCallback as gt,
6910
6982
  FiberContext as h,
6911
- SSEEdgeClientTransport as hn,
6912
- WorkflowCallbackType as ht,
6983
+ TransportState as hn,
6984
+ WaitForApprovalOptions as ht,
6913
6985
  getAgentByName as i,
6914
- DurableObjectEventStore as in,
6915
- AgentWorkflowInternalParams as it,
6986
+ ElicitResult$3 as in,
6987
+ isAgentToolLifecycleChunk as it,
6916
6988
  routeAgentEmail as j,
6917
- MCPClientElicitationHandler as jt,
6989
+ parseSubAgentPath as jn,
6990
+ ElicitResult$2 as jt,
6918
6991
  StreamingResponse as k,
6919
- routeSubAgentRequest as kn,
6920
- MCPAITool as kt,
6992
+ buildSubAgentPathUnchecked as kn,
6993
+ WorkflowTrackingRow as kt,
6921
6994
  AgentContext as l,
6922
- LegacyMcpHandler as ln,
6923
- ApprovalEventPayload as lt,
6995
+ experimental_createMcpHandler as ln,
6996
+ AgentWorkflowParams as lt,
6924
6997
  EmailRoutingOptions as m,
6925
- WorkerTransportOptions as mn,
6926
- WorkflowCallbackBase as mt,
6998
+ MCPStorageApi as mn,
6999
+ RunWorkflowOptions as mt,
6927
7000
  AgentOptions as n,
6928
- McpAgent as nn,
6929
- RunAgentToolResult as nt,
7001
+ ElicitRequest$2 as nn,
7002
+ RunAgentToolOptions as nt,
6930
7003
  AddMcpServerOptions as o,
6931
- experimental_createMcpHandler as on,
6932
- AgentWorkflowParams as ot,
7004
+ ClearableEventStore as on,
7005
+ AgentWorkflowEvent as ot,
6933
7006
  DeleteFibersOptions as p,
6934
- WorkerTransport as pn,
6935
- WorkflowCallback as pt,
6936
- AgentToolRunPart as q,
6937
- MCPElicitationHandlers as qt,
7007
+ createLegacyMcpHandler as pn,
7008
+ DefaultProgress as pt,
7009
+ AgentToolRunInspection as q,
7010
+ getNamespacedData as qt,
6938
7011
  RoutingRetryOptions as r,
6939
- ClearableEventStore as rn,
6940
- AgentWorkflowEvent as rt,
7012
+ ElicitRequestSchema as rn,
7013
+ RunAgentToolResult as rt,
6941
7014
  AddRpcMcpServerOptions as s,
6942
- CreateLegacyMcpHandlerOptions as sn,
6943
- AgentWorkflowPathStep as st,
7015
+ DurableObjectEventStore as sn,
7016
+ AgentWorkflowInternalParams as st,
6944
7017
  AgentGetOptions as t,
6945
- ElicitResult$3 as tn,
6946
- RunAgentToolOptions as tt,
7018
+ RPC_DO_PREFIX as tn,
7019
+ DetachedRunAgentToolResult as tt,
6947
7020
  AgentNamespace as u,
6948
- createLegacyMcpHandler as un,
6949
- DefaultProgress as ut,
7021
+ CreateLegacyMcpHandlerOptions as un,
7022
+ AgentWorkflowPathStep as ut,
6950
7023
  FiberRecoveryResult as v,
6951
- DynamicAgentStub as vn,
6952
- WorkflowEventCallback as vt,
7024
+ SSEEdgeClientTransport as vn,
7025
+ WorkflowCallbackType as vt,
6953
7026
  RPCRequest as w,
6954
- buildAgentUrl as wn,
6955
- WorkflowRejectedError as wt,
7027
+ SUB_PREFIX as wn,
7028
+ WorkflowPage as wt,
6956
7029
  MCPServer as x,
6957
- SUB_PREFIX as xn,
6958
- WorkflowPage as xt,
7030
+ DynamicAgentStub as xn,
7031
+ WorkflowEventCallback as xt,
6959
7032
  FiberStatus as y,
6960
- AgentPathStep as yn,
6961
- WorkflowEventPayload as yt,
6962
- AgentToolFailure as z,
6963
- MCPOAuthCallbackResult as zt
7033
+ StreamableHTTPEdgeClientTransport as yn,
7034
+ WorkflowCompleteCallback as yt,
7035
+ AgentToolEventState as z,
7036
+ MCPClientOAuthResult as zt
6964
7037
  };
6965
- //# sourceMappingURL=agent-routing-B2XLNMxq.d.ts.map
7038
+ //# sourceMappingURL=agent-routing-0DR0Tk2v.d.ts.map
@@ -4,7 +4,7 @@ import {
4
4
  n as AgentOptions,
5
5
  r as RoutingRetryOptions,
6
6
  t as AgentGetOptions
7
- } from "./agent-routing-B2XLNMxq.js";
7
+ } from "./agent-routing-0DR0Tk2v.js";
8
8
  export {
9
9
  AgentGetOptions,
10
10
  AgentOptions,
@@ -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"}