agents 0.22.0 → 0.23.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 (186) hide show
  1. package/README.md +20 -1
  2. package/dist/{agent-routing-CnkaHb-v.d.ts → agent-routing-DE5zmCQ8.d.ts} +1038 -394
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +26 -26
  5. package/dist/{agent-tools-C0XJqWzB.d.ts → agent-tools-DtXMTDGM.d.ts} +7 -7
  6. package/dist/agent-tools.d.ts +21 -21
  7. package/dist/browser/ai.js +4 -1
  8. package/dist/browser/ai.js.map +1 -1
  9. package/dist/browser/tanstack-ai.js.map +1 -1
  10. package/dist/callable-decorator-DP__HhBA.d.ts +72 -0
  11. package/dist/callable-decorator.d.ts +18 -0
  12. package/dist/callable-decorator.js +71 -0
  13. package/dist/callable-decorator.js.map +1 -0
  14. package/dist/capability-BjSKYpzg.js.map +1 -1
  15. package/dist/capability-runner-Be_-PLR1.d.ts +459 -0
  16. package/dist/channel-Bnm4S7T2.d.ts +491 -0
  17. package/dist/channels/ai-sdk.d.ts +46 -0
  18. package/dist/channels/ai-sdk.js +120 -0
  19. package/dist/channels/ai-sdk.js.map +1 -0
  20. package/dist/channels/email.d.ts +95 -0
  21. package/dist/channels/email.js +323 -0
  22. package/dist/channels/email.js.map +1 -0
  23. package/dist/channels/index.d.ts +233 -0
  24. package/dist/channels/index.js +608 -0
  25. package/dist/channels/index.js.map +1 -0
  26. package/dist/channels/slack.d.ts +140 -0
  27. package/dist/channels/slack.js +614 -0
  28. package/dist/channels/slack.js.map +1 -0
  29. package/dist/channels/tanstack-ai.d.ts +39 -0
  30. package/dist/channels/tanstack-ai.js +17 -0
  31. package/dist/channels/tanstack-ai.js.map +1 -0
  32. package/dist/channels/telegram.d.ts +106 -0
  33. package/dist/channels/telegram.js +427 -0
  34. package/dist/channels/telegram.js.map +1 -0
  35. package/dist/channels/voice.d.ts +45 -0
  36. package/dist/channels/voice.js +122 -0
  37. package/dist/channels/voice.js.map +1 -0
  38. package/dist/chat/index.d.ts +2325 -2019
  39. package/dist/chat/index.js +888 -518
  40. package/dist/chat/index.js.map +1 -1
  41. package/dist/chat-sdk/index.d.ts +7 -7
  42. package/dist/chat-sdk/index.js +1 -1
  43. package/dist/client.d.ts +1 -1
  44. package/dist/context/index.d.ts +216 -0
  45. package/dist/context/index.js +454 -0
  46. package/dist/context/index.js.map +1 -0
  47. package/dist/{current-agent-CuMErtly.d.ts → current-agent-Da_C9a3b.d.ts} +90 -107
  48. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  49. package/dist/{diagnostics-CaBjfz4J.js → diagnostics-BzvaX2UT.js} +5 -1
  50. package/dist/diagnostics-BzvaX2UT.js.map +1 -0
  51. package/dist/diagnostics-C4jcz3VK.js +360 -0
  52. package/dist/diagnostics-C4jcz3VK.js.map +1 -0
  53. package/dist/index-BB0kqhIz.d.ts +101 -0
  54. package/dist/index-BVVgDSdq.d.ts +1 -0
  55. package/dist/index-XDkuQ7zm.d.ts +89 -0
  56. package/dist/{index-DcSAZKsB.d.ts → index-YSKgfgg9.d.ts} +3 -1
  57. package/dist/index.d.ts +91 -82
  58. package/dist/index.js +3 -2
  59. package/dist/ingress-BfetZbMO.js +83 -0
  60. package/dist/ingress-BfetZbMO.js.map +1 -0
  61. package/dist/internal-CYlgHl1l.js +59 -0
  62. package/dist/internal-CYlgHl1l.js.map +1 -0
  63. package/dist/internal_context.d.ts +1 -1
  64. package/dist/lifecycle/index.d.ts +35 -17
  65. package/dist/lifecycle/index.js +1 -1
  66. package/dist/lifecycle-CMRGjZdw.js +1299 -0
  67. package/dist/lifecycle-CMRGjZdw.js.map +1 -0
  68. package/dist/mcp/client/index.d.ts +20 -20
  69. package/dist/mcp/index.d.ts +35 -35
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/observability/index.d.ts +1 -1
  72. package/dist/observability/index.js +1 -1
  73. package/dist/react.d.ts +4 -4
  74. package/dist/{retries-CAvxtG9d.d.ts → retries-D9Ds-1lz.d.ts} +17 -6
  75. package/dist/retries.d.ts +8 -6
  76. package/dist/retries.js +13 -1
  77. package/dist/retries.js.map +1 -1
  78. package/dist/routing/index.d.ts +137 -0
  79. package/dist/routing/index.js +244 -0
  80. package/dist/routing/index.js.map +1 -0
  81. package/dist/sanitize-D9TujEK8.js +79 -0
  82. package/dist/sanitize-D9TujEK8.js.map +1 -0
  83. package/dist/scheduler-DD9NdYbF.js +665 -0
  84. package/dist/scheduler-DD9NdYbF.js.map +1 -0
  85. package/dist/{scheduler-DQoTGoAW.d.ts → scheduler-Dwh85ZGl.d.ts} +21 -22
  86. package/dist/schedules/index.d.ts +1 -1
  87. package/dist/schedules/index.js +1 -1
  88. package/dist/sentence-chunker-BAidJ4DA.d.ts +68 -0
  89. package/dist/serializable.d.ts +1 -1
  90. package/dist/sessions/index.d.ts +441 -0
  91. package/dist/sessions/index.js +2063 -0
  92. package/dist/sessions/index.js.map +1 -0
  93. package/dist/skills/index.d.ts +99 -0
  94. package/dist/skills/index.js +254 -5
  95. package/dist/skills/index.js.map +1 -1
  96. package/dist/{src-5W6JNKVb.js → src-DlSHshb2.js} +1460 -1110
  97. package/dist/src-DlSHshb2.js.map +1 -0
  98. package/dist/streams/index.d.ts +120 -0
  99. package/dist/streams/index.js +107 -0
  100. package/dist/streams/index.js.map +1 -0
  101. package/dist/streams-D6tJ0NN9.d.ts +370 -0
  102. package/dist/streams-DZKgAj9b.js +709 -0
  103. package/dist/streams-DZKgAj9b.js.map +1 -0
  104. package/dist/sub-routing.d.ts +12 -12
  105. package/dist/surface-bZZJqBka.js +17 -0
  106. package/dist/surface-bZZJqBka.js.map +1 -0
  107. package/dist/tasks/index.d.ts +64 -0
  108. package/dist/tasks/index.js +2 -0
  109. package/dist/tasks-BRJ5zgya.d.ts +517 -0
  110. package/dist/tasks-ylZgBjhj.js +1656 -0
  111. package/dist/tasks-ylZgBjhj.js.map +1 -0
  112. package/dist/text-segment-joiner-BtAFQSA_.js +57 -0
  113. package/dist/text-segment-joiner-BtAFQSA_.js.map +1 -0
  114. package/dist/text-stream-CpdiKrJB.js +272 -0
  115. package/dist/text-stream-CpdiKrJB.js.map +1 -0
  116. package/dist/tokens-nHAKcN6M.js +52 -0
  117. package/dist/tokens-nHAKcN6M.js.map +1 -0
  118. package/dist/tool-schema-CBjGPrsQ.js +31 -0
  119. package/dist/tool-schema-CBjGPrsQ.js.map +1 -0
  120. package/dist/types-B7LojTe4.d.ts +202 -0
  121. package/dist/types-_Faxb570.d.ts +439 -0
  122. package/dist/voice/client.d.ts +226 -0
  123. package/dist/voice/client.js +932 -0
  124. package/dist/voice/client.js.map +1 -0
  125. package/dist/voice/errors.d.ts +43 -0
  126. package/dist/voice/errors.js +41 -0
  127. package/dist/voice/errors.js.map +1 -0
  128. package/dist/voice/index.d.ts +271 -0
  129. package/dist/voice/index.js +1812 -0
  130. package/dist/voice/index.js.map +1 -0
  131. package/dist/voice/react.d.ts +167 -0
  132. package/dist/voice/react.js +234 -0
  133. package/dist/voice/react.js.map +1 -0
  134. package/dist/voice/sfu.d.ts +71 -0
  135. package/dist/voice/sfu.js +157 -0
  136. package/dist/voice/sfu.js.map +1 -0
  137. package/dist/voice/text.d.ts +6 -0
  138. package/dist/voice/text.js +2 -0
  139. package/dist/voice/types.d.ts +58 -0
  140. package/dist/voice/types.js +18 -0
  141. package/dist/voice/types.js.map +1 -0
  142. package/dist/voice/workers-ai.d.ts +136 -0
  143. package/dist/voice/workers-ai.js +568 -0
  144. package/dist/voice/workers-ai.js.map +1 -0
  145. package/dist/websockets/index.d.ts +192 -0
  146. package/dist/websockets/index.js +2 -0
  147. package/dist/websockets-DUfRHPRq.js +502 -0
  148. package/dist/websockets-DUfRHPRq.js.map +1 -0
  149. package/dist/workflow-types.d.ts +25 -25
  150. package/dist/workflows.d.ts +21 -21
  151. package/dist/workflows.js +1 -1
  152. package/docs/agent-class.md +2 -2
  153. package/docs/agent-tools.md +2 -1
  154. package/docs/channels.md +323 -0
  155. package/docs/chat-agents.md +6 -13
  156. package/docs/context.md +131 -0
  157. package/docs/index.md +15 -12
  158. package/docs/lifecycle.md +102 -55
  159. package/docs/long-running-agents.md +2 -2
  160. package/docs/mcp-servers.md +5 -1
  161. package/docs/resumable-streaming.md +1 -1
  162. package/docs/routing.md +105 -0
  163. package/docs/sessions.md +237 -871
  164. package/docs/streams.md +213 -0
  165. package/docs/sub-agents.md +184 -124
  166. package/docs/tasks.md +246 -0
  167. package/docs/voice.md +745 -0
  168. package/package.json +115 -13
  169. package/dist/capability-runner-CvHGZqUu.d.ts +0 -150
  170. package/dist/compaction-helpers-iiKMr2TQ.js +0 -340
  171. package/dist/compaction-helpers-iiKMr2TQ.js.map +0 -1
  172. package/dist/compaction-helpers-wUz6M3us.d.ts +0 -621
  173. package/dist/diagnostics-CaBjfz4J.js.map +0 -1
  174. package/dist/durable-object-lifecycle-D6nNQJJd.js +0 -862
  175. package/dist/durable-object-lifecycle-D6nNQJJd.js.map +0 -1
  176. package/dist/experimental/memory/session/index.d.ts +0 -671
  177. package/dist/experimental/memory/session/index.js +0 -2379
  178. package/dist/experimental/memory/session/index.js.map +0 -1
  179. package/dist/experimental/memory/utils/index.d.ts +0 -96
  180. package/dist/experimental/memory/utils/index.js +0 -79
  181. package/dist/experimental/memory/utils/index.js.map +0 -1
  182. package/dist/scheduler-CR9RHGos.js +0 -857
  183. package/dist/scheduler-CR9RHGos.js.map +0 -1
  184. package/dist/src-5W6JNKVb.js.map +0 -1
  185. package/dist/tool-output-truncation-CNnnGZQ3.js +0 -98
  186. package/dist/tool-output-truncation-CNnnGZQ3.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ import { t as isChannelMessageSurface } from "../surface-bZZJqBka.js";
2
+ import "../voice/types.js";
3
+ //#region src/channels/adapters/voice.ts
4
+ const DEFAULT_SAMPLE_RATE = 16e3;
5
+ function validSurface(surface) {
6
+ if (!isChannelMessageSurface(surface) || surface.version !== 1 || surface.address === null || typeof surface.address !== "object" || Array.isArray(surface.address)) return false;
7
+ return surface.address.connection === "current";
8
+ }
9
+ function unavailable() {
10
+ return {
11
+ status: "failed",
12
+ retryable: true,
13
+ error: {
14
+ code: "BROWSER_VOICE_UNAVAILABLE",
15
+ message: "No browser voice surface is connected"
16
+ }
17
+ };
18
+ }
19
+ function synthesisFailure(error) {
20
+ return {
21
+ status: "failed",
22
+ retryable: true,
23
+ error: {
24
+ code: "BROWSER_VOICE_TTS_FAILED",
25
+ message: error instanceof Error ? error.message : "The text-to-speech provider did not return audio"
26
+ }
27
+ };
28
+ }
29
+ function deliveryFailure(error, contentDeliveryStarted) {
30
+ if (!contentDeliveryStarted) {
31
+ const connectionClosed = error instanceof TypeError && error.message.includes("WebSocket send() after close");
32
+ return {
33
+ status: "failed",
34
+ retryable: true,
35
+ error: {
36
+ code: connectionClosed ? "BROWSER_VOICE_CONNECTION_CLOSED" : "BROWSER_VOICE_DELIVERY_FAILED",
37
+ message: connectionClosed ? "The browser voice surface disconnected before delivery" : error instanceof Error ? error.message : "Browser voice delivery failed before sending content"
38
+ }
39
+ };
40
+ }
41
+ return {
42
+ status: "uncertain",
43
+ error: {
44
+ code: "BROWSER_VOICE_DELIVERY_ERROR",
45
+ message: error instanceof Error ? error.message : "Browser voice delivery failed with an unknown outcome"
46
+ }
47
+ };
48
+ }
49
+ function sendJSON(connection, message) {
50
+ connection.send(JSON.stringify(message));
51
+ }
52
+ /**
53
+ * Create an output-only channel that synthesizes one message and sends its
54
+ * encoded audio to one browser using the Cloudflare Voice wire protocol.
55
+ *
56
+ * The browser should connect with `VoiceClient` or `useVoiceAgent()`. No
57
+ * `withVoice()` mixin, microphone, or speech-to-text provider is required.
58
+ */
59
+ function browserVoice(options) {
60
+ const audioFormat = options.audioFormat ?? "mp3";
61
+ const sampleRate = options.sampleRate ?? DEFAULT_SAMPLE_RATE;
62
+ const toSpeechText = options.toSpeechText ?? ((message) => message.markdown);
63
+ return {
64
+ isAvailable() {
65
+ return options.getConnection() !== void 0;
66
+ },
67
+ async deliver(surface, message) {
68
+ if (!validSurface(surface)) return {
69
+ status: "failed",
70
+ retryable: false,
71
+ error: {
72
+ code: "BROWSER_VOICE_SURFACE_INVALID",
73
+ message: `Browser voice cannot parse the address for Channel "${surface.channelKey}"`
74
+ }
75
+ };
76
+ const connection = options.getConnection();
77
+ if (!connection) return unavailable();
78
+ let audio;
79
+ const speechText = toSpeechText(message);
80
+ try {
81
+ audio = await options.tts.synthesize(speechText);
82
+ } catch (error) {
83
+ return synthesisFailure(error);
84
+ }
85
+ if (!audio) return synthesisFailure();
86
+ let contentDeliveryStarted = false;
87
+ try {
88
+ sendJSON(connection, {
89
+ type: "welcome",
90
+ protocol_version: 1
91
+ });
92
+ sendJSON(connection, {
93
+ type: "audio_config",
94
+ format: audioFormat,
95
+ sampleRate
96
+ });
97
+ sendJSON(connection, {
98
+ type: "status",
99
+ status: "speaking"
100
+ });
101
+ sendJSON(connection, {
102
+ type: "transcript",
103
+ role: "assistant",
104
+ text: speechText
105
+ });
106
+ contentDeliveryStarted = true;
107
+ connection.send(audio);
108
+ sendJSON(connection, {
109
+ type: "status",
110
+ status: "idle"
111
+ });
112
+ return { status: "delivered" };
113
+ } catch (error) {
114
+ return deliveryFailure(error, contentDeliveryStarted);
115
+ }
116
+ }
117
+ };
118
+ }
119
+ //#endregion
120
+ export { browserVoice };
121
+
122
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","names":[],"sources":["../../src/channels/adapters/voice.ts"],"sourcesContent":["import {\n VOICE_PROTOCOL_VERSION,\n type TTSProvider,\n type VoiceAudioFormat,\n type VoiceServerMessage\n} from \"../../voice/types\";\nimport type {\n Channel,\n ChannelMessage,\n DeliveryFailure,\n DeliveryResult\n} from \"../channel\";\nimport {\n isChannelMessageSurface,\n type ChannelMessageSurface\n} from \"../surface\";\n\nexport type BrowserVoiceSurface = ChannelMessageSurface<\n string,\n { connection: \"current\" }\n>;\n\n/** The subset of an Agent WebSocket connection needed for audio delivery. */\nexport type BrowserVoiceConnection = {\n id: string;\n send(message: string | ArrayBuffer | ArrayBufferView): void;\n};\n\n/** Configuration for an output-only browser voice channel. */\nexport type BrowserVoiceChannelOptions = {\n /** Text-to-speech provider used to synthesize each outbound message. */\n tts: TTSProvider;\n /** Return the browser voice surface to use, or undefined when unavailable. */\n getConnection: () => BrowserVoiceConnection | undefined;\n /** Encoded audio format returned by the TTS provider. @default \"mp3\" */\n audioFormat?: VoiceAudioFormat;\n /** Sample rate for raw PCM audio. Ignored by encoded formats. @default 16000 */\n sampleRate?: number;\n /** Project the canonical Markdown message into text suitable for speech. */\n toSpeechText?: (message: ChannelMessage) => string;\n};\n\nconst DEFAULT_SAMPLE_RATE = 16_000;\n\nfunction validSurface(surface: ChannelMessageSurface): boolean {\n if (\n !isChannelMessageSurface(surface) ||\n surface.version !== 1 ||\n surface.address === null ||\n typeof surface.address !== \"object\" ||\n Array.isArray(surface.address)\n ) {\n return false;\n }\n return (surface.address as Record<string, unknown>).connection === \"current\";\n}\n\nfunction unavailable(): DeliveryResult {\n return {\n status: \"failed\",\n retryable: true,\n error: {\n code: \"BROWSER_VOICE_UNAVAILABLE\",\n message: \"No browser voice surface is connected\"\n }\n };\n}\n\nfunction synthesisFailure(error?: unknown): DeliveryResult {\n const failure: DeliveryFailure = {\n code: \"BROWSER_VOICE_TTS_FAILED\",\n message:\n error instanceof Error\n ? error.message\n : \"The text-to-speech provider did not return audio\"\n };\n return { status: \"failed\", retryable: true, error: failure };\n}\n\nfunction deliveryFailure(\n error: unknown,\n contentDeliveryStarted: boolean\n): DeliveryResult {\n if (!contentDeliveryStarted) {\n const connectionClosed =\n error instanceof TypeError &&\n error.message.includes(\"WebSocket send() after close\");\n return {\n status: \"failed\",\n retryable: true,\n error: {\n code: connectionClosed\n ? \"BROWSER_VOICE_CONNECTION_CLOSED\"\n : \"BROWSER_VOICE_DELIVERY_FAILED\",\n message: connectionClosed\n ? \"The browser voice surface disconnected before delivery\"\n : error instanceof Error\n ? error.message\n : \"Browser voice delivery failed before sending content\"\n }\n };\n }\n\n return {\n status: \"uncertain\",\n error: {\n code: \"BROWSER_VOICE_DELIVERY_ERROR\",\n message:\n error instanceof Error\n ? error.message\n : \"Browser voice delivery failed with an unknown outcome\"\n }\n };\n}\n\nfunction sendJSON(\n connection: BrowserVoiceConnection,\n message: VoiceServerMessage\n): void {\n connection.send(JSON.stringify(message));\n}\n\n/**\n * Create an output-only channel that synthesizes one message and sends its\n * encoded audio to one browser using the Cloudflare Voice wire protocol.\n *\n * The browser should connect with `VoiceClient` or `useVoiceAgent()`. No\n * `withVoice()` mixin, microphone, or speech-to-text provider is required.\n */\nexport function browserVoice(options: BrowserVoiceChannelOptions): Channel {\n const audioFormat = options.audioFormat ?? \"mp3\";\n const sampleRate = options.sampleRate ?? DEFAULT_SAMPLE_RATE;\n const toSpeechText = options.toSpeechText ?? ((message) => message.markdown);\n\n return {\n isAvailable() {\n return options.getConnection() !== undefined;\n },\n\n async deliver(surface, message) {\n if (!validSurface(surface)) {\n return {\n status: \"failed\",\n retryable: false,\n error: {\n code: \"BROWSER_VOICE_SURFACE_INVALID\",\n message: `Browser voice cannot parse the address for Channel \"${surface.channelKey}\"`\n }\n };\n }\n const connection = options.getConnection();\n if (!connection) return unavailable();\n\n let audio: ArrayBuffer | null;\n const speechText = toSpeechText(message);\n try {\n audio = await options.tts.synthesize(speechText);\n } catch (error) {\n return synthesisFailure(error);\n }\n if (!audio) return synthesisFailure();\n\n let contentDeliveryStarted = false;\n try {\n sendJSON(connection, {\n type: \"welcome\",\n protocol_version: VOICE_PROTOCOL_VERSION\n });\n sendJSON(connection, {\n type: \"audio_config\",\n format: audioFormat,\n sampleRate\n });\n sendJSON(connection, { type: \"status\", status: \"speaking\" });\n sendJSON(connection, {\n type: \"transcript\",\n role: \"assistant\",\n text: speechText\n });\n contentDeliveryStarted = true;\n connection.send(audio);\n sendJSON(connection, { type: \"status\", status: \"idle\" });\n return { status: \"delivered\" };\n } catch (error) {\n return deliveryFailure(error, contentDeliveryStarted);\n }\n }\n };\n}\n"],"mappings":";;;AA0CA,MAAM,sBAAsB;AAE5B,SAAS,aAAa,SAAyC;CAC7D,IACE,CAAC,wBAAwB,OAAO,KAChC,QAAQ,YAAY,KACpB,QAAQ,YAAY,QACpB,OAAO,QAAQ,YAAY,YAC3B,MAAM,QAAQ,QAAQ,OAAO,GAE7B,OAAO;CAET,OAAQ,QAAQ,QAAoC,eAAe;AACrE;AAEA,SAAS,cAA8B;CACrC,OAAO;EACL,QAAQ;EACR,WAAW;EACX,OAAO;GACL,MAAM;GACN,SAAS;EACX;CACF;AACF;AAEA,SAAS,iBAAiB,OAAiC;CAQzD,OAAO;EAAE,QAAQ;EAAU,WAAW;EAAM,OAAO;GANjD,MAAM;GACN,SACE,iBAAiB,QACb,MAAM,UACN;EAEiD;CAAE;AAC7D;AAEA,SAAS,gBACP,OACA,wBACgB;CAChB,IAAI,CAAC,wBAAwB;EAC3B,MAAM,mBACJ,iBAAiB,aACjB,MAAM,QAAQ,SAAS,8BAA8B;EACvD,OAAO;GACL,QAAQ;GACR,WAAW;GACX,OAAO;IACL,MAAM,mBACF,oCACA;IACJ,SAAS,mBACL,2DACA,iBAAiB,QACf,MAAM,UACN;GACR;EACF;CACF;CAEA,OAAO;EACL,QAAQ;EACR,OAAO;GACL,MAAM;GACN,SACE,iBAAiB,QACb,MAAM,UACN;EACR;CACF;AACF;AAEA,SAAS,SACP,YACA,SACM;CACN,WAAW,KAAK,KAAK,UAAU,OAAO,CAAC;AACzC;;;;;;;;AASA,SAAgB,aAAa,SAA8C;CACzE,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,eAAe,QAAQ,kBAAkB,YAAY,QAAQ;CAEnE,OAAO;EACL,cAAc;GACZ,OAAO,QAAQ,cAAc,MAAM,KAAA;EACrC;EAEA,MAAM,QAAQ,SAAS,SAAS;GAC9B,IAAI,CAAC,aAAa,OAAO,GACvB,OAAO;IACL,QAAQ;IACR,WAAW;IACX,OAAO;KACL,MAAM;KACN,SAAS,uDAAuD,QAAQ,WAAW;IACrF;GACF;GAEF,MAAM,aAAa,QAAQ,cAAc;GACzC,IAAI,CAAC,YAAY,OAAO,YAAY;GAEpC,IAAI;GACJ,MAAM,aAAa,aAAa,OAAO;GACvC,IAAI;IACF,QAAQ,MAAM,QAAQ,IAAI,WAAW,UAAU;GACjD,SAAS,OAAO;IACd,OAAO,iBAAiB,KAAK;GAC/B;GACA,IAAI,CAAC,OAAO,OAAO,iBAAiB;GAEpC,IAAI,yBAAyB;GAC7B,IAAI;IACF,SAAS,YAAY;KACnB,MAAM;KACN,kBAAA;IACF,CAAC;IACD,SAAS,YAAY;KACnB,MAAM;KACN,QAAQ;KACR;IACF,CAAC;IACD,SAAS,YAAY;KAAE,MAAM;KAAU,QAAQ;IAAW,CAAC;IAC3D,SAAS,YAAY;KACnB,MAAM;KACN,MAAM;KACN,MAAM;IACR,CAAC;IACD,yBAAyB;IACzB,WAAW,KAAK,KAAK;IACrB,SAAS,YAAY;KAAE,MAAM;KAAU,QAAQ;IAAO,CAAC;IACvD,OAAO,EAAE,QAAQ,YAAY;GAC/B,SAAS,OAAO;IACd,OAAO,gBAAgB,OAAO,sBAAsB;GACtD;EACF;CACF;AACF"}