@openserv-labs/sdk 1.0.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.
@@ -0,0 +1,369 @@
1
+ import { type AxiosInstance } from 'axios';
2
+ import type { GetFilesParams, UploadFileParams, MarkTaskAsErroredParams, CompleteTaskParams, SendChatMessageParams, GetTaskDetailParams, GetAgentsParams, GetTasksParams, CreateTaskParams, AddLogToTaskParams, RequestHumanAssistanceParams, UpdateTaskStatusParams, ProcessParams } from './types';
3
+ import { actionSchema, doTaskActionSchema, respondChatMessageActionSchema } from './types';
4
+ import type { ChatCompletionMessageParam, ChatCompletion } from 'openai/resources/chat/completions';
5
+ import OpenAI from 'openai';
6
+ import type { z } from 'zod';
7
+ import { Capability } from './capability';
8
+ /**
9
+ * Configuration options for creating a new Agent instance.
10
+ */
11
+ export interface AgentOptions {
12
+ /**
13
+ * The port number for the agent's HTTP server.
14
+ * Defaults to 7378 if not specified.
15
+ */
16
+ port?: number;
17
+ /**
18
+ * The OpenServ API key for authentication.
19
+ * Can also be provided via OPENSERV_API_KEY environment variable.
20
+ */
21
+ apiKey?: string;
22
+ /**
23
+ * The system prompt that defines the agent's behavior and context.
24
+ * Used as the initial system message in OpenAI chat completions.
25
+ */
26
+ systemPrompt: string;
27
+ /**
28
+ * The OpenAI API key for chat completions.
29
+ * Can also be provided via OPENAI_API_KEY environment variable.
30
+ * Required when using the process() method.
31
+ */
32
+ openaiApiKey?: string;
33
+ }
34
+ export declare class Agent {
35
+ private options;
36
+ /**
37
+ * The Express application instance used to handle HTTP requests.
38
+ * This is initialized in the constructor and used to set up middleware and routes.
39
+ * @private
40
+ */
41
+ private app;
42
+ /**
43
+ * The HTTP server instance created from the Express application.
44
+ * This is initialized when start() is called and used to listen for incoming requests.
45
+ * @private
46
+ */
47
+ private server;
48
+ /**
49
+ * The Express router instance used to define API routes.
50
+ * This handles routing for health checks, tool execution, and action handling.
51
+ * @private
52
+ */
53
+ private router;
54
+ /**
55
+ * The port number the server will listen on.
56
+ * Defaults to DEFAULT_PORT (7378) if not specified in options.
57
+ * @private
58
+ */
59
+ private port;
60
+ /**
61
+ * The system prompt used for OpenAI chat completions.
62
+ * This defines the base behavior and context for the agent.
63
+ * @protected
64
+ */
65
+ protected systemPrompt: string;
66
+ /**
67
+ * Array of capabilities (tools) available to the agent.
68
+ * Each capability is an instance of the Capability class with a name, description, schema, and run function.
69
+ * @protected
70
+ */
71
+ protected tools: Array<Capability<any>>;
72
+ /**
73
+ * The OpenServ API key used for authentication.
74
+ * Can be provided in options or via OPENSERV_API_KEY environment variable.
75
+ * @private
76
+ */
77
+ private apiKey;
78
+ /**
79
+ * Axios instance for making requests to the OpenServ API.
80
+ * Pre-configured with base URL and authentication headers.
81
+ * @private
82
+ */
83
+ private apiClient;
84
+ /**
85
+ * Axios instance for making requests to the OpenServ Runtime API.
86
+ * Pre-configured with base URL and authentication headers.
87
+ * @protected
88
+ */
89
+ protected runtimeClient: AxiosInstance;
90
+ /**
91
+ * OpenAI client instance.
92
+ * Lazily initialized when needed using the provided API key.
93
+ * @protected
94
+ */
95
+ protected _openai?: OpenAI;
96
+ /**
97
+ * Getter that converts the agent's tools into OpenAI function calling format.
98
+ * Used when making chat completion requests to OpenAI.
99
+ * @private
100
+ * @returns Array of ChatCompletionTool objects
101
+ */
102
+ private get openAiTools();
103
+ /**
104
+ * Getter that provides access to the OpenAI client instance.
105
+ * Lazily initializes the client with the API key from options or environment.
106
+ * @private
107
+ * @throws {Error} If no OpenAI API key is available
108
+ * @returns {OpenAI} The OpenAI client instance
109
+ */
110
+ private get openai();
111
+ /**
112
+ * Creates a new Agent instance.
113
+ * Sets up the Express application, middleware, and routes.
114
+ * Initializes API clients with appropriate authentication.
115
+ *
116
+ * @param {AgentOptions} options - Configuration options for the agent
117
+ * @throws {Error} If OpenServ API key is not provided in options or environment
118
+ */
119
+ constructor(options: AgentOptions);
120
+ /**
121
+ * Adds a single capability (tool) to the agent.
122
+ * Each capability must have a unique name and defines a function that can be called via the API.
123
+ *
124
+ * @template S - The Zod schema type for the capability's parameters
125
+ * @param {Object} capability - The capability configuration
126
+ * @param {string} capability.name - Unique name for the capability
127
+ * @param {string} capability.description - Description of what the capability does
128
+ * @param {S} capability.schema - Zod schema defining the capability's parameters
129
+ * @param {Function} capability.run - Function that implements the capability's behavior
130
+ * @param {Object} capability.run.params - Parameters for the run function
131
+ * @param {z.infer<S>} capability.run.params.args - Validated arguments matching the schema
132
+ * @param {z.infer<typeof actionSchema>} [capability.run.params.action] - Optional action context
133
+ * @param {ChatCompletionMessageParam[]} capability.run.messages - Chat message history
134
+ * @returns {this} The agent instance for method chaining
135
+ * @throws {Error} If a capability with the same name already exists
136
+ */
137
+ addCapability<S extends z.ZodTypeAny>({ name, description, schema, run }: {
138
+ name: string;
139
+ description: string;
140
+ schema: S;
141
+ run(params: {
142
+ args: z.infer<S>;
143
+ action?: z.infer<typeof actionSchema>;
144
+ }, messages: ChatCompletionMessageParam[]): string | Promise<string>;
145
+ }): this;
146
+ /**
147
+ * Adds multiple capabilities (tools) to the agent at once.
148
+ * Each capability must have a unique name and not conflict with existing capabilities.
149
+ *
150
+ * @template T - Tuple of Zod schema types for the capabilities' parameters
151
+ * @param {Object} capabilities - Array of capability configurations
152
+ * @param {string} capabilities[].name - Unique name for each capability
153
+ * @param {string} capabilities[].description - Description of what each capability does
154
+ * @param {T[number]} capabilities[].schema - Zod schema defining each capability's parameters
155
+ * @param {Function} capabilities[].run - Function that implements each capability's behavior
156
+ * @returns {this} The agent instance for method chaining
157
+ * @throws {Error} If any capability has a name that already exists
158
+ */
159
+ addCapabilities<T extends readonly [z.ZodTypeAny, ...z.ZodTypeAny[]]>(capabilities: {
160
+ [K in keyof T]: {
161
+ name: string;
162
+ description: string;
163
+ schema: T[K];
164
+ run: (params: {
165
+ args: z.infer<T[K]>;
166
+ action?: z.infer<typeof actionSchema>;
167
+ }, messages: ChatCompletionMessageParam[]) => string | Promise<string>;
168
+ };
169
+ }): this;
170
+ /**
171
+ * Gets files in a workspace.
172
+ *
173
+ * @param {GetFilesParams} params - Parameters for the file retrieval
174
+ * @param {number} params.workspaceId - ID of the workspace to get files from
175
+ * @returns {Promise<any>} The files in the workspace
176
+ */
177
+ getFiles(params: GetFilesParams): Promise<any>;
178
+ /**
179
+ * Uploads a file to a workspace.
180
+ *
181
+ * @param {UploadFileParams} params - Parameters for the file upload
182
+ * @param {number} params.workspaceId - ID of the workspace to upload to
183
+ * @param {string} params.path - Path where the file should be stored
184
+ * @param {number[]|number|null} [params.taskIds] - Optional task IDs to associate with the file
185
+ * @param {boolean} [params.skipSummarizer] - Whether to skip file summarization
186
+ * @param {Buffer|string} params.file - The file content to upload
187
+ * @returns {Promise<any>} The uploaded file details
188
+ */
189
+ uploadFile(params: UploadFileParams): Promise<any>;
190
+ /**
191
+ * Marks a task as errored.
192
+ *
193
+ * @param {MarkTaskAsErroredParams} params - Parameters for marking the task as errored
194
+ * @param {number} params.workspaceId - ID of the workspace containing the task
195
+ * @param {number} params.taskId - ID of the task to mark as errored
196
+ * @param {string} params.error - Error message describing what went wrong
197
+ * @returns {Promise<any>} The updated task details
198
+ */
199
+ markTaskAsErrored(params: MarkTaskAsErroredParams): Promise<any>;
200
+ /**
201
+ * Completes a task with the specified output.
202
+ *
203
+ * @param {CompleteTaskParams} params - Parameters for completing the task
204
+ * @param {number} params.workspaceId - ID of the workspace containing the task
205
+ * @param {number} params.taskId - ID of the task to complete
206
+ * @param {string} params.output - Output or result of the completed task
207
+ * @returns {Promise<any>} The completed task details
208
+ */
209
+ completeTask(params: CompleteTaskParams): Promise<any>;
210
+ /**
211
+ * Sends a chat message from the agent.
212
+ *
213
+ * @param {SendChatMessageParams} params - Parameters for sending the chat message
214
+ * @param {number} params.workspaceId - ID of the workspace where the chat is happening
215
+ * @param {number} params.agentId - ID of the agent sending the message
216
+ * @param {string} params.message - Content of the message to send
217
+ * @returns {Promise<any>} The sent message details
218
+ */
219
+ sendChatMessage(params: SendChatMessageParams): Promise<any>;
220
+ /**
221
+ * Gets detailed information about a specific task.
222
+ *
223
+ * @param {GetTaskDetailParams} params - Parameters for getting task details
224
+ * @param {number} params.workspaceId - ID of the workspace containing the task
225
+ * @param {number} params.taskId - ID of the task to get details for
226
+ * @returns {Promise<any>} The detailed task information
227
+ */
228
+ getTaskDetail(params: GetTaskDetailParams): Promise<any>;
229
+ /**
230
+ * Gets a list of agents in a workspace.
231
+ *
232
+ * @param {GetAgentsParams} params - Parameters for getting agents
233
+ * @param {number} params.workspaceId - ID of the workspace to get agents from
234
+ * @returns {Promise<any>} List of agents in the workspace
235
+ */
236
+ getAgents(params: GetAgentsParams): Promise<any>;
237
+ /**
238
+ * Gets a list of tasks in a workspace.
239
+ *
240
+ * @param {GetTasksParams} params - Parameters for getting tasks
241
+ * @param {number} params.workspaceId - ID of the workspace to get tasks from
242
+ * @returns {Promise<any>} List of tasks in the workspace
243
+ */
244
+ getTasks(params: GetTasksParams): Promise<any>;
245
+ /**
246
+ * Creates a new task in a workspace.
247
+ *
248
+ * @param {CreateTaskParams} params - Parameters for creating the task
249
+ * @param {number} params.workspaceId - ID of the workspace to create the task in
250
+ * @param {number} params.assignee - ID of the agent to assign the task to
251
+ * @param {string} params.description - Short description of the task
252
+ * @param {string} params.body - Detailed body/content of the task
253
+ * @param {string} params.input - Input data for the task
254
+ * @param {string} params.expectedOutput - Expected output format or content
255
+ * @param {number[]} params.dependencies - IDs of tasks that this task depends on
256
+ * @returns {Promise<any>} The created task details
257
+ */
258
+ createTask(params: CreateTaskParams): Promise<any>;
259
+ /**
260
+ * Adds a log entry to a task.
261
+ *
262
+ * @param {AddLogToTaskParams} params - Parameters for adding the log
263
+ * @param {number} params.workspaceId - ID of the workspace containing the task
264
+ * @param {number} params.taskId - ID of the task to add the log to
265
+ * @param {'info'|'warning'|'error'} params.severity - Severity level of the log
266
+ * @param {'text'|'openai-message'} params.type - Type of log entry
267
+ * @param {string|object} params.body - Content of the log entry
268
+ * @returns {Promise<any>} The created log entry details
269
+ */
270
+ addLogToTask(params: AddLogToTaskParams): Promise<any>;
271
+ /**
272
+ * Requests human assistance for a task.
273
+ *
274
+ * @param {RequestHumanAssistanceParams} params - Parameters for requesting assistance
275
+ * @param {number} params.workspaceId - ID of the workspace containing the task
276
+ * @param {number} params.taskId - ID of the task needing assistance
277
+ * @param {'text'|'project-manager-plan-review'} params.type - Type of assistance needed
278
+ * @param {string|object} params.question - Question or request for the human
279
+ * @param {object} [params.agentDump] - Optional agent state/context information
280
+ * @returns {Promise<any>} The created assistance request details
281
+ */
282
+ requestHumanAssistance(params: RequestHumanAssistanceParams): Promise<any>;
283
+ /**
284
+ * Updates the status of a task.
285
+ *
286
+ * @param {UpdateTaskStatusParams} params - Parameters for updating the status
287
+ * @param {number} params.workspaceId - ID of the workspace containing the task
288
+ * @param {number} params.taskId - ID of the task to update
289
+ * @param {TaskStatus} params.status - New status for the task
290
+ * @returns {Promise<any>} The updated task details
291
+ */
292
+ updateTaskStatus(params: UpdateTaskStatusParams): Promise<any>;
293
+ /**
294
+ * Processes a conversation with OpenAI, handling tool calls iteratively until completion.
295
+ *
296
+ * @param {ProcessParams} params - Parameters for processing the conversation
297
+ * @param {ChatCompletionMessageParam[]} params.messages - The conversation history
298
+ * @returns {Promise<ChatCompletion>} The final response from OpenAI
299
+ * @throws {Error} If no response is received from OpenAI or max iterations are reached
300
+ */
301
+ process({ messages }: ProcessParams): Promise<ChatCompletion>;
302
+ /**
303
+ * Handle a task execution request
304
+ * This method can be overridden by extending classes to customize task handling
305
+ * @protected
306
+ */
307
+ protected doTask(action: z.infer<typeof doTaskActionSchema>): Promise<void>;
308
+ /**
309
+ * Handle a chat message response request
310
+ * This method can be overridden by extending classes to customize chat handling
311
+ * @protected
312
+ */
313
+ protected respondToChat(action: z.infer<typeof respondChatMessageActionSchema>): Promise<void>;
314
+ /**
315
+ * Handles execution of a specific tool/capability.
316
+ *
317
+ * @param {Object} req - The request object
318
+ * @param {Object} req.params - Request parameters
319
+ * @param {string} req.params.toolName - Name of the tool to execute
320
+ * @param {Object} req.body - Request body
321
+ * @param {z.infer<z.ZodTypeAny>} [req.body.args] - Arguments for the tool
322
+ * @param {z.infer<typeof actionSchema>} [req.body.action] - Action context
323
+ * @returns {Promise<{result: string}>} The result of the tool execution
324
+ * @throws {BadRequest} If tool name is missing or tool is not found
325
+ * @throws {Error} If tool execution fails
326
+ */
327
+ handleToolRoute(req: {
328
+ params: {
329
+ toolName: string;
330
+ };
331
+ body: {
332
+ args?: z.infer<z.ZodTypeAny>;
333
+ action?: z.infer<typeof actionSchema>;
334
+ };
335
+ }): Promise<{
336
+ result: string;
337
+ }>;
338
+ /**
339
+ * Handles the root route for task execution and chat message responses.
340
+ *
341
+ * @param {Object} req - The request object
342
+ * @param {unknown} req.body - Request body to be parsed as an action
343
+ * @returns {Promise<void>}
344
+ * @throws {Error} If action type is invalid
345
+ */
346
+ handleRootRoute(req: {
347
+ body: unknown;
348
+ }): Promise<void>;
349
+ /**
350
+ * Sets up the Express routes for the agent's HTTP server.
351
+ * Configures health check endpoint and routes for tool execution.
352
+ * @private
353
+ */
354
+ private setupRoutes;
355
+ /**
356
+ * Starts the agent's HTTP server.
357
+ *
358
+ * @returns {Promise<void>} Resolves when the server has started
359
+ * @throws {Error} If server fails to start
360
+ */
361
+ start(): Promise<void>;
362
+ /**
363
+ * Stops the agent's HTTP server.
364
+ *
365
+ * @returns {Promise<void>} Resolves when the server has stopped
366
+ */
367
+ stop(): Promise<void>;
368
+ }
369
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AASjD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EACV,0BAA0B,EAE1B,cAAc,EACf,MAAM,mCAAmC,CAAA;AAE1C,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAMzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,KAAK;IAoHJ,OAAO,CAAC,OAAO;IAnH3B;;;;OAIG;IACH,OAAO,CAAC,GAAG,CAAqB;IAEhC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAA2B;IAEzC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAqB;IAEnC;;;;OAIG;IACH,OAAO,CAAC,IAAI,CAAQ;IAEpB;;;;OAIG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAE9B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAK;IAE5C;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAQ;IAEtB;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAe;IAEhC;;;;OAIG;IACH,SAAS,CAAC,aAAa,EAAE,aAAa,CAAA;IAEtC;;;;OAIG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAE1B;;;;;OAKG;IACH,OAAO,KAAK,WAAW,GAStB;IAED;;;;;;OAMG;IACH,OAAO,KAAK,MAAM,GAWjB;IAED;;;;;;;OAOG;gBACiB,OAAO,EAAE,YAAY;IAwCzC;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EACpC,IAAI,EACJ,WAAW,EACX,MAAM,EACN,GAAG,EACJ,EAAE;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,CAAC,CAAA;QACT,GAAG,CACD,MAAM,EAAE;YAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;SAAE,EACnE,QAAQ,EAAE,0BAA0B,EAAE,GACrC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KAC5B,GAAG,IAAI;IASR;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE;SACjF,CAAC,IAAI,MAAM,CAAC,GAAG;YACd,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,EAAE,MAAM,CAAA;YACnB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACZ,GAAG,EAAE,CACH,MAAM,EAAE;gBAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;aAAE,EACtE,QAAQ,EAAE,0BAA0B,EAAE,KACnC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;SAC9B;KACF,GAAG,IAAI;IAOR;;;;;;OAMG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc;IAKrC;;;;;;;;;;OAUG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAyBzC;;;;;;;;OAQG;IACG,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;IAUvD;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB;IAU7C;;;;;;;;OAQG;IACG,eAAe,CAAC,MAAM,EAAE,qBAAqB;IAUnD;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,EAAE,mBAAmB;IAO/C;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,eAAe;IAKvC;;;;;;OAMG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc;IAKrC;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAYzC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB;IAY7C;;;;;;;;;;OAUG;IACG,sBAAsB,CAAC,MAAM,EAAE,4BAA4B;IAYjE;;;;;;;;OAQG;IACG,gBAAgB,CAAC,MAAM,EAAE,sBAAsB;IAUrD;;;;;;;OAOG;IACG,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA6DnE;;;;OAIG;cACa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;IAmCjE;;;;OAIG;cACa,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC;IAmCpF;;;;;;;;;;;;OAYG;IACG,eAAe,CAAC,GAAG,EAAE;QACzB,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;QAC5B,IAAI,EAAE;YACJ,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;SACtC,CAAA;KACF;;;IAoBD;;;;;;;OAOG;IACG,eAAe,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE;IAS5C;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;;;OAKG;IACG,KAAK;IAUX;;;;OAIG;IACG,IAAI;CAOX"}