veryfront 0.1.63 → 0.1.65

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 (68) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/src/agent/runtime/index.d.ts +1 -0
  3. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  4. package/esm/src/agent/runtime/index.js +10 -2
  5. package/esm/src/channels/control-plane.d.ts +259 -0
  6. package/esm/src/channels/control-plane.d.ts.map +1 -0
  7. package/esm/src/channels/control-plane.js +212 -0
  8. package/esm/src/channels/invoke.d.ts +71 -44
  9. package/esm/src/channels/invoke.d.ts.map +1 -1
  10. package/esm/src/channels/invoke.js +33 -114
  11. package/esm/src/integrations/endpoint-executor.d.ts +1 -0
  12. package/esm/src/integrations/endpoint-executor.d.ts.map +1 -1
  13. package/esm/src/integrations/endpoint-executor.js +44 -0
  14. package/esm/src/internal-agents/ag-ui-sse.d.ts +35 -0
  15. package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -0
  16. package/esm/src/internal-agents/ag-ui-sse.js +263 -0
  17. package/esm/src/internal-agents/control-plane-auth.d.ts +20 -0
  18. package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -0
  19. package/esm/src/internal-agents/control-plane-auth.js +56 -0
  20. package/esm/src/internal-agents/request-body.d.ts +9 -0
  21. package/esm/src/internal-agents/request-body.d.ts.map +1 -0
  22. package/esm/src/internal-agents/request-body.js +28 -0
  23. package/esm/src/internal-agents/run-stream.d.ts +14 -0
  24. package/esm/src/internal-agents/run-stream.d.ts.map +1 -0
  25. package/esm/src/internal-agents/run-stream.js +259 -0
  26. package/esm/src/internal-agents/schema.d.ts +268 -0
  27. package/esm/src/internal-agents/schema.d.ts.map +1 -0
  28. package/esm/src/internal-agents/schema.js +71 -0
  29. package/esm/src/internal-agents/session-manager.d.ts +63 -0
  30. package/esm/src/internal-agents/session-manager.d.ts.map +1 -0
  31. package/esm/src/internal-agents/session-manager.js +258 -0
  32. package/esm/src/platform/adapters/runtime/deno/adapter.d.ts.map +1 -1
  33. package/esm/src/platform/adapters/runtime/deno/adapter.js +4 -13
  34. package/esm/src/platform/compat/process.d.ts.map +1 -1
  35. package/esm/src/platform/compat/process.js +42 -5
  36. package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts +11 -0
  37. package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts.map +1 -0
  38. package/esm/src/server/handlers/request/agent-run-cancel.handler.js +62 -0
  39. package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts +11 -0
  40. package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts.map +1 -0
  41. package/esm/src/server/handlers/request/agent-run-resume.handler.js +77 -0
  42. package/esm/src/server/handlers/request/agent-stream.handler.d.ts +14 -0
  43. package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -0
  44. package/esm/src/server/handlers/request/agent-stream.handler.js +86 -0
  45. package/esm/src/server/handlers/request/internal-agents-list.handler.d.ts +11 -0
  46. package/esm/src/server/handlers/request/internal-agents-list.handler.d.ts.map +1 -0
  47. package/esm/src/server/handlers/request/internal-agents-list.handler.js +73 -0
  48. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  49. package/esm/src/server/runtime-handler/index.js +8 -0
  50. package/package.json +1 -1
  51. package/src/deno.js +1 -1
  52. package/src/src/agent/runtime/index.ts +12 -2
  53. package/src/src/channels/control-plane.ts +332 -0
  54. package/src/src/channels/invoke.ts +44 -164
  55. package/src/src/integrations/endpoint-executor.ts +51 -0
  56. package/src/src/internal-agents/ag-ui-sse.ts +327 -0
  57. package/src/src/internal-agents/control-plane-auth.ts +82 -0
  58. package/src/src/internal-agents/request-body.ts +42 -0
  59. package/src/src/internal-agents/run-stream.ts +354 -0
  60. package/src/src/internal-agents/schema.ts +102 -0
  61. package/src/src/internal-agents/session-manager.ts +358 -0
  62. package/src/src/platform/adapters/runtime/deno/adapter.ts +9 -11
  63. package/src/src/platform/compat/process.ts +56 -3
  64. package/src/src/server/handlers/request/agent-run-cancel.handler.ts +86 -0
  65. package/src/src/server/handlers/request/agent-run-resume.handler.ts +108 -0
  66. package/src/src/server/handlers/request/agent-stream.handler.ts +125 -0
  67. package/src/src/server/handlers/request/internal-agents-list.handler.ts +100 -0
  68. package/src/src/server/runtime-handler/index.ts +8 -0
@@ -0,0 +1,268 @@
1
+ import { z } from "zod";
2
+ export declare const RunIdSchema: z.ZodString;
3
+ export declare const AgentIdSchema: z.ZodString;
4
+ export declare const StudioToolNameSchema: z.ZodString;
5
+ export declare const RuntimeInjectedToolSchema: z.ZodObject<{
6
+ name: z.ZodString;
7
+ description: z.ZodOptional<z.ZodString>;
8
+ parameters: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ name: string;
11
+ description?: string | undefined;
12
+ parameters?: Record<string, unknown> | undefined;
13
+ }, {
14
+ name: string;
15
+ description?: string | undefined;
16
+ parameters?: Record<string, unknown> | undefined;
17
+ }>;
18
+ export declare const RuntimeContextItemSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
19
+ type: z.ZodLiteral<"text">;
20
+ title: z.ZodOptional<z.ZodString>;
21
+ text: z.ZodString;
22
+ }, "strip", z.ZodTypeAny, {
23
+ type: "text";
24
+ text: string;
25
+ title?: string | undefined;
26
+ }, {
27
+ type: "text";
28
+ text: string;
29
+ title?: string | undefined;
30
+ }>, z.ZodObject<{
31
+ type: z.ZodLiteral<"json">;
32
+ title: z.ZodOptional<z.ZodString>;
33
+ data: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnknown>, Record<string, unknown>, Record<string, unknown>>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ type: "json";
36
+ data: Record<string, unknown>;
37
+ title?: string | undefined;
38
+ }, {
39
+ type: "json";
40
+ data: Record<string, unknown>;
41
+ title?: string | undefined;
42
+ }>, z.ZodObject<{
43
+ type: z.ZodLiteral<"resource">;
44
+ title: z.ZodOptional<z.ZodString>;
45
+ uri: z.ZodString;
46
+ mimeType: z.ZodOptional<z.ZodString>;
47
+ text: z.ZodOptional<z.ZodString>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ type: "resource";
50
+ uri: string;
51
+ title?: string | undefined;
52
+ text?: string | undefined;
53
+ mimeType?: string | undefined;
54
+ }, {
55
+ type: "resource";
56
+ uri: string;
57
+ title?: string | undefined;
58
+ text?: string | undefined;
59
+ mimeType?: string | undefined;
60
+ }>]>;
61
+ export declare const RuntimeRunAgentInputSchema: z.ZodObject<{
62
+ agentId: z.ZodString;
63
+ threadId: z.ZodString;
64
+ runId: z.ZodString;
65
+ messages: z.ZodArray<z.ZodObject<{
66
+ id: z.ZodString;
67
+ role: z.ZodEnum<["user", "assistant", "system", "tool"]>;
68
+ parts: z.ZodDefault<z.ZodArray<z.ZodObject<{
69
+ type: z.ZodString;
70
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
71
+ type: z.ZodString;
72
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
73
+ type: z.ZodString;
74
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
75
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
76
+ createdAt: z.ZodOptional<z.ZodString>;
77
+ }, "strip", z.ZodTypeAny, {
78
+ id: string;
79
+ role: "tool" | "user" | "assistant" | "system";
80
+ parts: z.objectOutputType<{
81
+ type: z.ZodString;
82
+ }, z.ZodTypeAny, "passthrough">[];
83
+ metadata?: Record<string, unknown> | undefined;
84
+ createdAt?: string | undefined;
85
+ }, {
86
+ id: string;
87
+ role: "tool" | "user" | "assistant" | "system";
88
+ metadata?: Record<string, unknown> | undefined;
89
+ createdAt?: string | undefined;
90
+ parts?: z.objectInputType<{
91
+ type: z.ZodString;
92
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
93
+ }>, "many">;
94
+ tools: z.ZodDefault<z.ZodArray<z.ZodObject<{
95
+ name: z.ZodString;
96
+ description: z.ZodOptional<z.ZodString>;
97
+ parameters: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ name: string;
100
+ description?: string | undefined;
101
+ parameters?: Record<string, unknown> | undefined;
102
+ }, {
103
+ name: string;
104
+ description?: string | undefined;
105
+ parameters?: Record<string, unknown> | undefined;
106
+ }>, "many">>;
107
+ context: z.ZodEffects<z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
108
+ type: z.ZodLiteral<"text">;
109
+ title: z.ZodOptional<z.ZodString>;
110
+ text: z.ZodString;
111
+ }, "strip", z.ZodTypeAny, {
112
+ type: "text";
113
+ text: string;
114
+ title?: string | undefined;
115
+ }, {
116
+ type: "text";
117
+ text: string;
118
+ title?: string | undefined;
119
+ }>, z.ZodObject<{
120
+ type: z.ZodLiteral<"json">;
121
+ title: z.ZodOptional<z.ZodString>;
122
+ data: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnknown>, Record<string, unknown>, Record<string, unknown>>;
123
+ }, "strip", z.ZodTypeAny, {
124
+ type: "json";
125
+ data: Record<string, unknown>;
126
+ title?: string | undefined;
127
+ }, {
128
+ type: "json";
129
+ data: Record<string, unknown>;
130
+ title?: string | undefined;
131
+ }>, z.ZodObject<{
132
+ type: z.ZodLiteral<"resource">;
133
+ title: z.ZodOptional<z.ZodString>;
134
+ uri: z.ZodString;
135
+ mimeType: z.ZodOptional<z.ZodString>;
136
+ text: z.ZodOptional<z.ZodString>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ type: "resource";
139
+ uri: string;
140
+ title?: string | undefined;
141
+ text?: string | undefined;
142
+ mimeType?: string | undefined;
143
+ }, {
144
+ type: "resource";
145
+ uri: string;
146
+ title?: string | undefined;
147
+ text?: string | undefined;
148
+ mimeType?: string | undefined;
149
+ }>]>, "many">>, ({
150
+ type: "text";
151
+ text: string;
152
+ title?: string | undefined;
153
+ } | {
154
+ type: "json";
155
+ data: Record<string, unknown>;
156
+ title?: string | undefined;
157
+ } | {
158
+ type: "resource";
159
+ uri: string;
160
+ title?: string | undefined;
161
+ text?: string | undefined;
162
+ mimeType?: string | undefined;
163
+ })[], ({
164
+ type: "text";
165
+ text: string;
166
+ title?: string | undefined;
167
+ } | {
168
+ type: "json";
169
+ data: Record<string, unknown>;
170
+ title?: string | undefined;
171
+ } | {
172
+ type: "resource";
173
+ uri: string;
174
+ title?: string | undefined;
175
+ text?: string | undefined;
176
+ mimeType?: string | undefined;
177
+ })[] | undefined>;
178
+ forwardedProps: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
179
+ }, "strip", z.ZodTypeAny, {
180
+ context: ({
181
+ type: "text";
182
+ text: string;
183
+ title?: string | undefined;
184
+ } | {
185
+ type: "json";
186
+ data: Record<string, unknown>;
187
+ title?: string | undefined;
188
+ } | {
189
+ type: "resource";
190
+ uri: string;
191
+ title?: string | undefined;
192
+ text?: string | undefined;
193
+ mimeType?: string | undefined;
194
+ })[];
195
+ tools: {
196
+ name: string;
197
+ description?: string | undefined;
198
+ parameters?: Record<string, unknown> | undefined;
199
+ }[];
200
+ agentId: string;
201
+ messages: {
202
+ id: string;
203
+ role: "tool" | "user" | "assistant" | "system";
204
+ parts: z.objectOutputType<{
205
+ type: z.ZodString;
206
+ }, z.ZodTypeAny, "passthrough">[];
207
+ metadata?: Record<string, unknown> | undefined;
208
+ createdAt?: string | undefined;
209
+ }[];
210
+ runId: string;
211
+ threadId: string;
212
+ forwardedProps?: Record<string, unknown> | undefined;
213
+ }, {
214
+ agentId: string;
215
+ messages: {
216
+ id: string;
217
+ role: "tool" | "user" | "assistant" | "system";
218
+ metadata?: Record<string, unknown> | undefined;
219
+ createdAt?: string | undefined;
220
+ parts?: z.objectInputType<{
221
+ type: z.ZodString;
222
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
223
+ }[];
224
+ runId: string;
225
+ threadId: string;
226
+ context?: ({
227
+ type: "text";
228
+ text: string;
229
+ title?: string | undefined;
230
+ } | {
231
+ type: "json";
232
+ data: Record<string, unknown>;
233
+ title?: string | undefined;
234
+ } | {
235
+ type: "resource";
236
+ uri: string;
237
+ title?: string | undefined;
238
+ text?: string | undefined;
239
+ mimeType?: string | undefined;
240
+ })[] | undefined;
241
+ tools?: {
242
+ name: string;
243
+ description?: string | undefined;
244
+ parameters?: Record<string, unknown> | undefined;
245
+ }[] | undefined;
246
+ forwardedProps?: Record<string, unknown> | undefined;
247
+ }>;
248
+ export declare const ResumeSignalSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
249
+ type: z.ZodLiteral<"tool_result">;
250
+ toolCallId: z.ZodString;
251
+ result: z.ZodEffects<z.ZodUnknown, unknown, unknown>;
252
+ isError: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
253
+ }, "strip", z.ZodTypeAny, {
254
+ type: "tool_result";
255
+ toolCallId: string;
256
+ isError: boolean;
257
+ result?: unknown;
258
+ }, {
259
+ type: "tool_result";
260
+ toolCallId: string;
261
+ result?: unknown;
262
+ isError?: boolean | undefined;
263
+ }>]>;
264
+ export type RuntimeInjectedTool = z.infer<typeof RuntimeInjectedToolSchema>;
265
+ export type RuntimeContextItem = z.infer<typeof RuntimeContextItemSchema>;
266
+ export type RuntimeRunAgentInput = z.infer<typeof RuntimeRunAgentInputSchema>;
267
+ export type ResumeSignal = z.infer<typeof ResumeSignalSchema>;
268
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,WAAW,aAAqD,CAAC;AAE9E,eAAO,MAAM,aAAa,aAAqD,CAAC;AAEhF,eAAO,MAAM,oBAAoB,aAI2C,CAAC;AAE7E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAOpC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqBnC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBrC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;IAU7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ const AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
3
+ const MAX_TOOL_PARAMETERS_BYTES = 16_384;
4
+ const MAX_CONTEXT_ITEM_BYTES = 16_384;
5
+ const MAX_CONTEXT_TOTAL_BYTES = 65_536;
6
+ const MAX_FORWARDED_PROPS_BYTES = 65_536;
7
+ const MAX_TOOL_RESULT_BYTES = 65_536;
8
+ const MAX_RUNTIME_MESSAGES = 100;
9
+ const encoder = new TextEncoder();
10
+ function isWithinJsonSizeLimit(value, maxBytes) {
11
+ try {
12
+ return encoder.encode(JSON.stringify(value)).byteLength <= maxBytes;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export const RunIdSchema = z.string().min(1).max(128).regex(AGENT_ID_PATTERN);
19
+ export const AgentIdSchema = z.string().min(1).max(128).regex(AGENT_ID_PATTERN);
20
+ export const StudioToolNameSchema = z
21
+ .string()
22
+ .min(1)
23
+ .max(128)
24
+ .regex(/^studio_[a-zA-Z0-9_]+$/, "Tool names must use the studio_ prefix");
25
+ export const RuntimeInjectedToolSchema = z.object({
26
+ name: StudioToolNameSchema,
27
+ description: z.string().max(1024).optional(),
28
+ parameters: z.record(z.unknown()).optional().refine((value) => value === undefined || isWithinJsonSizeLimit(value, MAX_TOOL_PARAMETERS_BYTES), { message: "Tool parameters must be less than 16 KB" }),
29
+ });
30
+ export const RuntimeContextItemSchema = z.discriminatedUnion("type", [
31
+ z.object({
32
+ type: z.literal("text"),
33
+ title: z.string().max(256).optional(),
34
+ text: z.string().max(MAX_CONTEXT_ITEM_BYTES),
35
+ }),
36
+ z.object({
37
+ type: z.literal("json"),
38
+ title: z.string().max(256).optional(),
39
+ data: z.record(z.unknown()).refine((value) => isWithinJsonSizeLimit(value, MAX_CONTEXT_ITEM_BYTES), { message: "JSON context item must be less than 16 KB" }),
40
+ }),
41
+ z.object({
42
+ type: z.literal("resource"),
43
+ title: z.string().max(256).optional(),
44
+ uri: z.string().max(2048),
45
+ mimeType: z.string().max(256).optional(),
46
+ text: z.string().max(MAX_CONTEXT_ITEM_BYTES).optional(),
47
+ }),
48
+ ]);
49
+ export const RuntimeRunAgentInputSchema = z.object({
50
+ agentId: AgentIdSchema,
51
+ threadId: z.string().uuid(),
52
+ runId: RunIdSchema,
53
+ messages: z.array(z.object({
54
+ id: z.string().min(1),
55
+ role: z.enum(["user", "assistant", "system", "tool"]),
56
+ parts: z.array(z.object({ type: z.string().min(1) }).passthrough()).default([]),
57
+ metadata: z.record(z.unknown()).optional(),
58
+ createdAt: z.string().optional(),
59
+ })).max(MAX_RUNTIME_MESSAGES),
60
+ tools: z.array(RuntimeInjectedToolSchema).max(50).default([]),
61
+ context: z.array(RuntimeContextItemSchema).max(10).default([]).refine((value) => isWithinJsonSizeLimit(value, MAX_CONTEXT_TOTAL_BYTES), { message: "context must be less than 64 KB total" }),
62
+ forwardedProps: z.record(z.unknown()).optional().refine((value) => value === undefined || isWithinJsonSizeLimit(value, MAX_FORWARDED_PROPS_BYTES), { message: "forwardedProps must be less than 64 KB" }),
63
+ });
64
+ export const ResumeSignalSchema = z.discriminatedUnion("type", [
65
+ z.object({
66
+ type: z.literal("tool_result"),
67
+ toolCallId: z.string().min(1).max(128),
68
+ result: z.unknown().refine((value) => isWithinJsonSizeLimit(value, MAX_TOOL_RESULT_BYTES), { message: "Tool result must be less than 64 KB" }),
69
+ isError: z.boolean().optional().default(false),
70
+ }),
71
+ ]);
@@ -0,0 +1,63 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ export declare class AgentRunCancelledError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ export declare class AgentRunAlreadyExistsError extends Error {
6
+ constructor(runId: string);
7
+ }
8
+ export declare class RunNotActiveError extends Error {
9
+ constructor(runId: string);
10
+ }
11
+ export declare class ToolResultNotWaitingError extends Error {
12
+ constructor(runId: string, toolCallId: string);
13
+ }
14
+ export declare class ToolResultConflictError extends Error {
15
+ constructor(runId: string, toolCallId: string);
16
+ }
17
+ type SessionStatus = "running" | "waiting" | "completed" | "cancelled" | "failed";
18
+ export interface SubmitToolResultOutcome {
19
+ accepted: true;
20
+ duplicate?: true;
21
+ }
22
+ export declare class AgentRunSessionManager {
23
+ private readonly options;
24
+ private readonly sessions;
25
+ constructor(options?: {
26
+ waitingForToolTtlMs?: number;
27
+ sessionTtlMs?: number | null;
28
+ maxConcurrentSessions?: number;
29
+ setTimeoutFn?: typeof dntShim.setTimeout;
30
+ clearTimeoutFn?: typeof clearTimeout;
31
+ });
32
+ private get waitingForToolTtlMs();
33
+ private get sessionTtlMs();
34
+ private get setTimeoutFn();
35
+ private get clearTimeoutFn();
36
+ private clearWaitingTimeout;
37
+ private clearSessionTimeout;
38
+ private scheduleSessionTimeout;
39
+ private scheduleWaitingTimeout;
40
+ private touchSession;
41
+ private get maxConcurrentSessions();
42
+ startRun(input: {
43
+ runId: string;
44
+ threadId: string;
45
+ }): AbortSignal;
46
+ waitForToolResult(runId: string, toolCallId: string): Promise<{
47
+ result: unknown;
48
+ isError: boolean;
49
+ }>;
50
+ submitToolResult(runId: string, input: {
51
+ toolCallId: string;
52
+ result: unknown;
53
+ isError?: boolean;
54
+ }): SubmitToolResultOutcome;
55
+ cancelRun(runId: string): boolean;
56
+ completeRun(runId: string): void;
57
+ failRun(runId: string): void;
58
+ getRunStatus(runId: string): SessionStatus | null;
59
+ reset(): void;
60
+ }
61
+ export declare const agentRunSessionManager: AgentRunSessionManager;
62
+ export {};
63
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAyB/C,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,SAAkB;CAItC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,KAAK,EAAE,MAAM;CAI1B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,KAAK,EAAE,MAAM;CAI1B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAI9C;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAI9C;AAMD,KAAK,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AA0BlF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,qBAAa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;gBAG5C,OAAO,GAAE;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,YAAY,CAAC,EAAE,OAAO,OAAO,CAAC,UAAU,CAAC;QACzC,cAAc,CAAC,EAAE,OAAO,YAAY,CAAC;KACjC;IAGR,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,YAAY;IAQpB,OAAO,KAAK,qBAAqB,GAEhC;IAED,QAAQ,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;IA4B3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAsDF,gBAAgB,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAChE,uBAAuB;IAuC1B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAuBjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUhC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAIjD,KAAK,IAAI,IAAI;CAOd;AAED,eAAO,MAAM,sBAAsB,wBAEjC,CAAC"}
@@ -0,0 +1,258 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ function stableJsonStringify(value, depth = 0) {
3
+ if (depth > 64) {
4
+ return JSON.stringify(value);
5
+ }
6
+ if (value === null || typeof value !== "object") {
7
+ return JSON.stringify(value);
8
+ }
9
+ if (Array.isArray(value)) {
10
+ return `[${value.map((item) => stableJsonStringify(item, depth + 1)).join(",")}]`;
11
+ }
12
+ const entries = Object.entries(value)
13
+ .sort(([left], [right]) => left.localeCompare(right))
14
+ .map(([key, item]) => `${JSON.stringify(key)}:${stableJsonStringify(item, depth + 1)}`);
15
+ return `{${entries.join(",")}}`;
16
+ }
17
+ function createToolResultKey(result, isError) {
18
+ return `${isError ? "1" : "0"}:${stableJsonStringify(result)}`;
19
+ }
20
+ export class AgentRunCancelledError extends Error {
21
+ constructor(message = "Run cancelled") {
22
+ super(message);
23
+ this.name = "AgentRunCancelledError";
24
+ }
25
+ }
26
+ export class AgentRunAlreadyExistsError extends Error {
27
+ constructor(runId) {
28
+ super(`Run "${runId}" is already active`);
29
+ this.name = "AgentRunAlreadyExistsError";
30
+ }
31
+ }
32
+ export class RunNotActiveError extends Error {
33
+ constructor(runId) {
34
+ super(`Run "${runId}" is not active`);
35
+ this.name = "RunNotActiveError";
36
+ }
37
+ }
38
+ export class ToolResultNotWaitingError extends Error {
39
+ constructor(runId, toolCallId) {
40
+ super(`Run "${runId}" is not waiting for tool call "${toolCallId}"`);
41
+ this.name = "ToolResultNotWaitingError";
42
+ }
43
+ }
44
+ export class ToolResultConflictError extends Error {
45
+ constructor(runId, toolCallId) {
46
+ super(`Conflicting tool result for run "${runId}" and tool call "${toolCallId}"`);
47
+ this.name = "ToolResultConflictError";
48
+ }
49
+ }
50
+ const DEFAULT_WAITING_FOR_TOOL_TTL_MS = 5 * 60 * 1000;
51
+ const DEFAULT_SESSION_TTL_MS = 15 * 60 * 1000;
52
+ const DEFAULT_MAX_CONCURRENT_SESSIONS = 100;
53
+ export class AgentRunSessionManager {
54
+ options;
55
+ sessions = new Map();
56
+ constructor(options = {}) {
57
+ this.options = options;
58
+ }
59
+ get waitingForToolTtlMs() {
60
+ return this.options.waitingForToolTtlMs ?? DEFAULT_WAITING_FOR_TOOL_TTL_MS;
61
+ }
62
+ get sessionTtlMs() {
63
+ return this.options.sessionTtlMs ?? null;
64
+ }
65
+ get setTimeoutFn() {
66
+ return this.options.setTimeoutFn ?? dntShim.dntGlobalThis.setTimeout.bind(dntShim.dntGlobalThis);
67
+ }
68
+ get clearTimeoutFn() {
69
+ return this.options.clearTimeoutFn ?? globalThis.clearTimeout.bind(dntShim.dntGlobalThis);
70
+ }
71
+ clearWaitingTimeout(session) {
72
+ if (session.waitingTimeoutId === null) {
73
+ return;
74
+ }
75
+ this.clearTimeoutFn(session.waitingTimeoutId);
76
+ session.waitingTimeoutId = null;
77
+ }
78
+ clearSessionTimeout(session) {
79
+ if (session.sessionTimeoutId === null) {
80
+ return;
81
+ }
82
+ this.clearTimeoutFn(session.sessionTimeoutId);
83
+ session.sessionTimeoutId = null;
84
+ }
85
+ scheduleSessionTimeout(session) {
86
+ if (this.sessionTtlMs === null) {
87
+ return;
88
+ }
89
+ this.clearSessionTimeout(session);
90
+ session.sessionTimeoutId = this.setTimeoutFn(() => {
91
+ this.cancelRun(session.runId);
92
+ }, this.sessionTtlMs);
93
+ }
94
+ scheduleWaitingTimeout(session) {
95
+ this.clearWaitingTimeout(session);
96
+ session.waitingTimeoutId = this.setTimeoutFn(() => {
97
+ this.cancelRun(session.runId);
98
+ }, this.waitingForToolTtlMs);
99
+ }
100
+ touchSession(session) {
101
+ if (session.status === "running" || session.status === "waiting") {
102
+ this.scheduleSessionTimeout(session);
103
+ }
104
+ }
105
+ get maxConcurrentSessions() {
106
+ return this.options.maxConcurrentSessions ?? DEFAULT_MAX_CONCURRENT_SESSIONS;
107
+ }
108
+ startRun(input) {
109
+ const existing = this.sessions.get(input.runId);
110
+ if (existing && (existing.status === "running" || existing.status === "waiting")) {
111
+ throw new AgentRunAlreadyExistsError(input.runId);
112
+ }
113
+ if (this.sessions.size >= this.maxConcurrentSessions) {
114
+ throw new Error(`Maximum concurrent sessions (${this.maxConcurrentSessions}) reached`);
115
+ }
116
+ const session = {
117
+ runId: input.runId,
118
+ threadId: input.threadId,
119
+ status: "running",
120
+ abortController: new AbortController(),
121
+ waitingTool: null,
122
+ submittedResults: new Map(),
123
+ waitingTimeoutId: null,
124
+ sessionTimeoutId: null,
125
+ };
126
+ this.sessions.set(input.runId, session);
127
+ this.touchSession(session);
128
+ return session.abortController.signal;
129
+ }
130
+ async waitForToolResult(runId, toolCallId) {
131
+ const session = this.sessions.get(runId);
132
+ if (!session || session.status === "completed" || session.status === "failed") {
133
+ throw new RunNotActiveError(runId);
134
+ }
135
+ if (session.abortController.signal.aborted || session.status === "cancelled") {
136
+ throw new AgentRunCancelledError();
137
+ }
138
+ const existingResult = session.submittedResults.get(toolCallId);
139
+ if (existingResult) {
140
+ session.status = "running";
141
+ this.touchSession(session);
142
+ return { result: existingResult.result, isError: existingResult.isError };
143
+ }
144
+ if (session.waitingTool && session.waitingTool.toolCallId !== toolCallId) {
145
+ throw new ToolResultNotWaitingError(runId, toolCallId);
146
+ }
147
+ session.status = "waiting";
148
+ this.scheduleWaitingTimeout(session);
149
+ this.touchSession(session);
150
+ return await new Promise((resolve, reject) => {
151
+ const abortHandler = () => {
152
+ this.clearWaitingTimeout(session);
153
+ session.waitingTool = null;
154
+ session.status = "cancelled";
155
+ reject(new AgentRunCancelledError());
156
+ };
157
+ session.abortController.signal.addEventListener("abort", abortHandler, { once: true });
158
+ session.waitingTool = {
159
+ toolCallId,
160
+ resolve: (value) => {
161
+ session.abortController.signal.removeEventListener("abort", abortHandler);
162
+ this.clearWaitingTimeout(session);
163
+ session.waitingTool = null;
164
+ session.status = "running";
165
+ this.touchSession(session);
166
+ resolve({ result: value.result, isError: value.isError });
167
+ },
168
+ reject: (reason) => {
169
+ session.abortController.signal.removeEventListener("abort", abortHandler);
170
+ this.clearWaitingTimeout(session);
171
+ session.waitingTool = null;
172
+ reject(reason);
173
+ },
174
+ };
175
+ });
176
+ }
177
+ submitToolResult(runId, input) {
178
+ const session = this.sessions.get(runId);
179
+ if (!session) {
180
+ throw new RunNotActiveError(runId);
181
+ }
182
+ const normalized = {
183
+ toolCallId: input.toolCallId,
184
+ result: input.result,
185
+ isError: Boolean(input.isError),
186
+ key: createToolResultKey(input.result, Boolean(input.isError)),
187
+ };
188
+ const existingResult = session.submittedResults.get(input.toolCallId);
189
+ if (existingResult) {
190
+ if (existingResult.key === normalized.key) {
191
+ return { accepted: true, duplicate: true };
192
+ }
193
+ throw new ToolResultConflictError(runId, input.toolCallId);
194
+ }
195
+ if (session.status === "completed" || session.status === "failed" ||
196
+ session.status === "cancelled") {
197
+ throw new RunNotActiveError(runId);
198
+ }
199
+ if (!session.waitingTool || session.waitingTool.toolCallId !== input.toolCallId) {
200
+ throw new ToolResultNotWaitingError(runId, input.toolCallId);
201
+ }
202
+ session.submittedResults.set(input.toolCallId, normalized);
203
+ this.touchSession(session);
204
+ session.waitingTool.resolve(normalized);
205
+ return { accepted: true };
206
+ }
207
+ cancelRun(runId) {
208
+ const session = this.sessions.get(runId);
209
+ if (!session) {
210
+ return false;
211
+ }
212
+ if (session.status === "completed" || session.status === "failed" ||
213
+ session.status === "cancelled") {
214
+ return false;
215
+ }
216
+ session.status = "cancelled";
217
+ this.clearWaitingTimeout(session);
218
+ this.clearSessionTimeout(session);
219
+ session.abortController.abort(new AgentRunCancelledError());
220
+ session.waitingTool?.reject(new AgentRunCancelledError());
221
+ session.waitingTool = null;
222
+ this.sessions.delete(runId);
223
+ return true;
224
+ }
225
+ completeRun(runId) {
226
+ const session = this.sessions.get(runId);
227
+ if (!session)
228
+ return;
229
+ session.status = "completed";
230
+ this.clearWaitingTimeout(session);
231
+ this.clearSessionTimeout(session);
232
+ session.waitingTool = null;
233
+ this.sessions.delete(runId);
234
+ }
235
+ failRun(runId) {
236
+ const session = this.sessions.get(runId);
237
+ if (!session)
238
+ return;
239
+ session.status = "failed";
240
+ this.clearWaitingTimeout(session);
241
+ this.clearSessionTimeout(session);
242
+ session.waitingTool = null;
243
+ this.sessions.delete(runId);
244
+ }
245
+ getRunStatus(runId) {
246
+ return this.sessions.get(runId)?.status ?? null;
247
+ }
248
+ reset() {
249
+ for (const session of this.sessions.values()) {
250
+ this.clearWaitingTimeout(session);
251
+ this.clearSessionTimeout(session);
252
+ }
253
+ this.sessions.clear();
254
+ }
255
+ }
256
+ export const agentRunSessionManager = new AgentRunSessionManager({
257
+ sessionTtlMs: DEFAULT_SESSION_TTL_MS,
258
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAoHvB,cAAM,qBAAsB,YAAW,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAY/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW;CAuErE;AAED,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAInC;AAED,cAAM,iBAAkB,YAAW,aAAa;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,gBAAgB;CAS7D;AAED,cAAM,gBAAiB,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAejE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAanC;AAwBD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,EAAE,wBAA+B;IAC1C,QAAQ,CAAC,GAAG,yBAAgC;IAC5C,QAAQ,CAAC,MAAM,oBAA2B;IAC1C,QAAQ,CAAC,KAAK,mBAA0B;IAExC,QAAQ,CAAC,YAAY;;;;;;;;;;MAUnB;IAEF,OAAO,CAAC,YAAY,CAA2B;IAE/C,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,EACnF,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAuEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAyHvB,cAAM,qBAAsB,YAAW,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAY/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW;CAuErE;AAED,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGnC;AAED,cAAM,iBAAkB,YAAW,aAAa;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,gBAAgB;CAS7D;AAED,cAAM,gBAAiB,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAejE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAanC;AAwBD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,EAAE,wBAA+B;IAC1C,QAAQ,CAAC,GAAG,yBAAgC;IAC5C,QAAQ,CAAC,MAAM,oBAA2B;IAC1C,QAAQ,CAAC,KAAK,mBAA0B;IAExC,QAAQ,CAAC,YAAY;;;;;;;;;;MAUnB;IAEF,OAAO,CAAC,YAAY,CAA2B;IAE/C,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,EACnF,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAuEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}