devteam-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matwal LTD
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,355 @@
1
+ # @devteam/sdk
2
+
3
+ Orchestrate AI agent swarms with Temporal in 10 lines of code.
4
+
5
+ `@devteam/sdk` is the official TypeScript SDK for the DevTeam platform. It provides a high-level client for creating tasks, building execution plans (DAGs), running fan-out parallel workloads, managing human-in-the-loop approvals, deploying workflow templates, and monitoring worker nodes -- all backed by Temporal for durability and exactly-once execution guarantees.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @devteam/sdk
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```typescript
16
+ import { DevTeamClient } from '@devteam/sdk';
17
+
18
+ const client = new DevTeamClient({
19
+ serverUrl: 'https://devteam.marsala.dev',
20
+ apiKey: 'dt_...',
21
+ });
22
+
23
+ // Simple task
24
+ const result = await client.createTask({
25
+ prompt: 'Review this contract for risks',
26
+ model: 'opus',
27
+ queue: 'general-queue',
28
+ });
29
+
30
+ console.log(result.output);
31
+ ```
32
+
33
+ ## Features
34
+
35
+ - **Single tasks** -- Send a prompt to any AI model and get a result
36
+ - **Fan-out parallel** -- Run N tasks concurrently with a configurable concurrency limit
37
+ - **DAG execution** -- Create plans with dependencies and execute them as a directed acyclic graph
38
+ - **Human-in-the-loop** -- Require approval before tasks execute; review and approve/reject from code
39
+ - **Templates** -- Deploy pre-built industry workflows with custom inputs
40
+ - **Monitoring** -- Track task status, view worker health, subscribe to completion events
41
+ - **Type safety** -- Full TypeScript types and Zod runtime validation
42
+ - **Durability** -- Built on Temporal: retries, timeouts, and exactly-once semantics
43
+
44
+ ## API Reference
45
+
46
+ ### Constructor
47
+
48
+ ```typescript
49
+ const client = new DevTeamClient({
50
+ serverUrl: 'https://devteam.marsala.dev', // Required
51
+ apiKey: 'dt_...', // Required
52
+ namespace: 'default', // Optional, default: 'default'
53
+ timeoutMs: 30000, // Optional, default: 30000
54
+ debug: false, // Optional, default: false
55
+ });
56
+ ```
57
+
58
+ ### Create a Single Task
59
+
60
+ ```typescript
61
+ const result = await client.createTask({
62
+ prompt: 'Summarize this quarterly earnings report',
63
+ model: 'sonnet', // 'opus' | 'sonnet' | 'haiku' | 'gpt-4o' | ...
64
+ queue: 'general-queue', // Temporal task queue
65
+ priority: 'high', // 'critical' | 'high' | 'normal' | 'low'
66
+ timeoutSeconds: 120, // Per-task timeout
67
+ requireApproval: false, // Require HITL approval
68
+ metadata: { source: 'earnings' }, // Arbitrary metadata
69
+ attachments: ['./report.pdf'], // Files to include as context
70
+ retry: { // Custom retry policy
71
+ maxAttempts: 3,
72
+ initialIntervalMs: 1000,
73
+ backoffCoefficient: 2,
74
+ },
75
+ });
76
+
77
+ console.log(result.taskId); // 'task-abc123'
78
+ console.log(result.output); // The AI-generated response
79
+ console.log(result.usage); // { inputTokens, outputTokens, totalTokens, costUsd }
80
+ ```
81
+
82
+ ### Fan-Out Parallel Execution
83
+
84
+ Run multiple independent tasks concurrently. The second argument controls how many tasks run at the same time.
85
+
86
+ ```typescript
87
+ const results = await client.executeFanOut([
88
+ { prompt: 'Analyze liability clauses', model: 'sonnet' },
89
+ { prompt: 'Check IP provisions', model: 'sonnet' },
90
+ { prompt: 'Review termination terms', model: 'sonnet' },
91
+ { prompt: 'Assess indemnification risks', model: 'sonnet' },
92
+ { prompt: 'Evaluate non-compete scope', model: 'sonnet' },
93
+ ], 3); // max 3 concurrent
94
+
95
+ for (const result of results) {
96
+ console.log(`${result.taskId}: ${result.status}`);
97
+ }
98
+ ```
99
+
100
+ ### Plan and Execute a DAG
101
+
102
+ The planner decomposes a high-level goal into an ordered set of subtasks with dependencies. `executeDAG` then runs them layer by layer, passing results from completed tasks as context to downstream tasks.
103
+
104
+ ```typescript
105
+ // Step 1: Generate a plan
106
+ const plan = await client.createPlan(
107
+ 'Full due diligence on Series A investment',
108
+ {
109
+ strategy: 'dag', // 'sequential' | 'parallel' | 'dag' | 'auto'
110
+ maxSubtasks: 10,
111
+ defaultModel: 'sonnet',
112
+ requireApproval: true, // Review plan before execution
113
+ },
114
+ );
115
+
116
+ console.log(`Plan: ${plan.subtasks.length} steps`);
117
+ console.log(`Est. cost: $${plan.estimatedCostUsd}`);
118
+ console.log(`Est. time: ${plan.estimatedDurationSeconds}s`);
119
+
120
+ // Step 2: Approve the plan (if requireApproval was set)
121
+ const approvals = await client.getPendingApprovals();
122
+ for (const approval of approvals) {
123
+ await client.approveTask(approval.taskId, 'approve');
124
+ }
125
+
126
+ // Step 3: Execute the DAG
127
+ const dagResult = await client.executeDAG(plan);
128
+
129
+ console.log(`Success: ${dagResult.success}`);
130
+ console.log(`Duration: ${dagResult.totalDurationMs}ms`);
131
+ console.log(`Total tokens: ${dagResult.totalUsage?.totalTokens}`);
132
+ console.log(`Total cost: $${dagResult.totalUsage?.costUsd}`);
133
+
134
+ // Access individual subtask results
135
+ for (const [subtaskId, result] of Object.entries(dagResult.results)) {
136
+ console.log(` ${subtaskId}: ${result.status}`);
137
+ }
138
+ ```
139
+
140
+ ### Human-in-the-Loop Approvals
141
+
142
+ Tasks created with `requireApproval: true` pause before execution and wait for human review.
143
+
144
+ ```typescript
145
+ // Create a task that requires approval
146
+ await client.createTask({
147
+ prompt: 'Send investor update email to all LPs',
148
+ model: 'opus',
149
+ requireApproval: true,
150
+ });
151
+
152
+ // Review pending approvals
153
+ const approvals = await client.getPendingApprovals();
154
+
155
+ for (const approval of approvals) {
156
+ console.log(`Task: ${approval.taskId}`);
157
+ console.log(`Description: ${approval.description}`);
158
+ console.log(`Model: ${approval.model}`);
159
+ console.log(`Priority: ${approval.priority}`);
160
+ console.log(`Requested at: ${approval.requestedAt}`);
161
+ }
162
+
163
+ // Approve
164
+ await client.approveTask(approvals[0].taskId, 'approve');
165
+
166
+ // Reject with feedback
167
+ await client.approveTask(approvals[1].taskId, 'reject', 'Too aggressive tone');
168
+
169
+ // Modify with instructions
170
+ await client.approveTask(approvals[2].taskId, 'modify', 'Use conservative language');
171
+ ```
172
+
173
+ ### Deploy Workflow Templates
174
+
175
+ Templates are pre-built, parameterized workflows for common use cases.
176
+
177
+ ```typescript
178
+ // List available templates
179
+ const templates = await client.listTemplates({
180
+ industry: 'legal',
181
+ category: 'review',
182
+ });
183
+
184
+ for (const t of templates) {
185
+ console.log(`${t.templateId}: ${t.name} (${t.version})`);
186
+ console.log(` Cost: ~$${t.estimatedCostUsd}`);
187
+ console.log(` Duration: ~${t.avgDurationSeconds}s`);
188
+ }
189
+
190
+ // Deploy a template
191
+ const workflowId = await client.deployTemplate('legal-contract-review-v1', {
192
+ contract_file: './contract.pdf',
193
+ jurisdiction: 'US-NY',
194
+ review_depth: 'comprehensive',
195
+ output_format: 'structured',
196
+ });
197
+
198
+ console.log(`Workflow started: ${workflowId}`);
199
+
200
+ // Track progress
201
+ const status = await client.getTaskStatus(workflowId);
202
+ console.log(`Status: ${status.status}, Progress: ${status.progress}%`);
203
+ ```
204
+
205
+ ### Monitor Workers
206
+
207
+ ```typescript
208
+ const workers = await client.getWorkers();
209
+
210
+ for (const worker of workers) {
211
+ console.log(`${worker.nodeName} (${worker.workerId})`);
212
+ console.log(` Queue: ${worker.taskQueue}`);
213
+ console.log(` Online: ${worker.online}`);
214
+ console.log(` Active: ${worker.activeTasks}/${worker.maxConcurrency}`);
215
+ console.log(` Models: ${worker.availableModels.join(', ')}`);
216
+ console.log(` CPU: ${worker.cpuPercent}% | RAM: ${worker.memoryPercent}%`);
217
+ }
218
+ ```
219
+
220
+ ### Subscribe to Task Completions
221
+
222
+ ```typescript
223
+ const unsubscribe = client.onTaskComplete((result) => {
224
+ console.log(`Task ${result.taskId} completed: ${result.status}`);
225
+ if (result.error) {
226
+ console.error(` Error: ${result.error.message}`);
227
+ } else {
228
+ console.log(` Output: ${result.output?.substring(0, 100)}...`);
229
+ }
230
+ });
231
+
232
+ // ... later
233
+ unsubscribe();
234
+
235
+ // Or disconnect everything
236
+ client.disconnect();
237
+ ```
238
+
239
+ ## Advanced Usage
240
+
241
+ ### Workflow Utilities
242
+
243
+ The SDK exports low-level utilities for building custom orchestration logic.
244
+
245
+ ```typescript
246
+ import {
247
+ topologicalSort,
248
+ aggregateUsage,
249
+ parallelLimit,
250
+ withRetry,
251
+ } from '@devteam/sdk';
252
+
253
+ // Topological sort for custom DAG execution
254
+ const layers = topologicalSort(plan.subtasks);
255
+ // layers[0] = tasks with no dependencies (can run in parallel)
256
+ // layers[1] = tasks depending only on layer 0, etc.
257
+
258
+ // Aggregate token usage across results
259
+ const totalUsage = aggregateUsage(results);
260
+
261
+ // Run async operations with concurrency control
262
+ const outputs = await parallelLimit(urls, 5, async (url) => {
263
+ return fetch(url).then((r) => r.json());
264
+ });
265
+
266
+ // Retry with exponential backoff
267
+ const data = await withRetry(
268
+ () => fetch('https://api.example.com/data').then((r) => r.json()),
269
+ { maxAttempts: 3, initialIntervalMs: 500 },
270
+ );
271
+ ```
272
+
273
+ ### Zod Schemas
274
+
275
+ Use the exported Zod schemas for runtime validation in your own code.
276
+
277
+ ```typescript
278
+ import { TaskInputSchema, PlanOptionsSchema } from '@devteam/sdk';
279
+
280
+ // Validate user input
281
+ const parsed = TaskInputSchema.safeParse(userInput);
282
+ if (!parsed.success) {
283
+ console.error('Validation errors:', parsed.error.issues);
284
+ }
285
+ ```
286
+
287
+ ### Error Handling
288
+
289
+ ```typescript
290
+ import { DevTeamError, DevTeamValidationError, DevTeamTimeoutError } from '@devteam/sdk';
291
+
292
+ try {
293
+ const result = await client.createTask({ prompt: 'Hello' });
294
+ } catch (err) {
295
+ if (err instanceof DevTeamValidationError) {
296
+ console.error('Invalid input:', err.message);
297
+ } else if (err instanceof DevTeamTimeoutError) {
298
+ console.error('Request timed out:', err.message);
299
+ } else if (err instanceof DevTeamError) {
300
+ console.error(`API error [${err.code}]: ${err.message}`);
301
+ console.error(`Status: ${err.statusCode}, Request ID: ${err.requestId}`);
302
+ }
303
+ }
304
+ ```
305
+
306
+ ## Type Reference
307
+
308
+ | Type | Description |
309
+ |------|-------------|
310
+ | `DevTeamClientOptions` | Constructor options (serverUrl, apiKey, namespace, etc.) |
311
+ | `TaskInput` | Input for creating a task (prompt, model, queue, etc.) |
312
+ | `TaskResult` | Result of a completed task (output, usage, error, etc.) |
313
+ | `TaskStatus` | Current status with progress and logs |
314
+ | `Plan` | Generated execution plan with subtasks |
315
+ | `PlanOptions` | Options for plan generation (strategy, maxSubtasks, etc.) |
316
+ | `PlanSubtask` | Individual step within a plan |
317
+ | `DAGResult` | Result of executing a full DAG |
318
+ | `Approval` | Pending human approval request |
319
+ | `Template` | Workflow template metadata |
320
+ | `Worker` | Worker node status and capabilities |
321
+ | `ModelId` | Supported model identifiers |
322
+ | `TaskPriority` | Priority levels: critical, high, normal, low |
323
+ | `TaskState` | Task lifecycle states |
324
+ | `TokenUsage` | Token count and cost breakdown |
325
+ | `RetryPolicy` | Per-task retry configuration |
326
+
327
+ ## Architecture
328
+
329
+ ```
330
+ Your Code
331
+ |
332
+ v
333
+ @devteam/sdk (this package)
334
+ |
335
+ v HTTPS + JSON
336
+ DevTeam API Server (devteam.marsala.dev)
337
+ |
338
+ v gRPC
339
+ Temporal Server
340
+ |
341
+ v Task Queues
342
+ Worker Nodes (ASUS GPU, Surface, GR-14, EC2, ...)
343
+ |
344
+ v
345
+ AI Models (Claude, GPT, Gemini, Ollama, ...)
346
+ ```
347
+
348
+ ## Requirements
349
+
350
+ - Node.js >= 18.0.0
351
+ - TypeScript >= 5.0 (recommended)
352
+
353
+ ## License
354
+
355
+ MIT
@@ -0,0 +1,163 @@
1
+ import type { DevTeamClientOptions, TaskInput, TaskResult, Plan, PlanOptions, DAGResult, Approval, Template, TemplateFilter, Worker, TaskStatus, TaskCompleteCallback } from './types.js';
2
+ export declare class DevTeamError extends Error {
3
+ readonly code: string;
4
+ readonly statusCode?: number | undefined;
5
+ readonly requestId?: string | undefined;
6
+ constructor(message: string, code: string, statusCode?: number | undefined, requestId?: string | undefined);
7
+ }
8
+ export declare class DevTeamValidationError extends DevTeamError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class DevTeamTimeoutError extends DevTeamError {
12
+ constructor(message?: string);
13
+ }
14
+ export declare class DevTeamClient {
15
+ private readonly serverUrl;
16
+ private readonly apiKey;
17
+ private readonly namespace;
18
+ private readonly timeoutMs;
19
+ private readonly debug;
20
+ private pollingIntervals;
21
+ constructor(options: DevTeamClientOptions);
22
+ /**
23
+ * Create and execute a single AI agent task.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const result = await client.createTask({
28
+ * prompt: 'Review this contract for risks',
29
+ * model: 'opus',
30
+ * queue: 'general-queue',
31
+ * });
32
+ * console.log(result.output);
33
+ * ```
34
+ */
35
+ createTask(input: TaskInput): Promise<TaskResult>;
36
+ /**
37
+ * Generate an execution plan (DAG of subtasks) for a high-level goal.
38
+ * The planner uses an AI model to decompose the goal into ordered subtasks.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const plan = await client.createPlan('Full legal review of Series A docs', {
43
+ * strategy: 'dag',
44
+ * defaultModel: 'sonnet',
45
+ * });
46
+ * console.log(`Plan has ${plan.subtasks.length} steps`);
47
+ * ```
48
+ */
49
+ createPlan(goal: string, options?: PlanOptions): Promise<Plan>;
50
+ /**
51
+ * Execute a plan as a directed acyclic graph. Subtasks are run in
52
+ * topologically-sorted layers, maximizing parallelism while respecting
53
+ * dependencies.
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const plan = await client.createPlan('Analyze portfolio risk');
58
+ * const dagResult = await client.executeDAG(plan);
59
+ * console.log(`Success: ${dagResult.success}, took ${dagResult.totalDurationMs}ms`);
60
+ * ```
61
+ */
62
+ executeDAG(plan: Plan): Promise<DAGResult>;
63
+ /**
64
+ * Execute multiple independent tasks in parallel with a concurrency limit.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const results = await client.executeFanOut([
69
+ * { prompt: 'Analyze liability clauses', model: 'sonnet' },
70
+ * { prompt: 'Check IP provisions', model: 'sonnet' },
71
+ * { prompt: 'Review termination terms', model: 'sonnet' },
72
+ * ], 3);
73
+ * ```
74
+ */
75
+ executeFanOut(tasks: TaskInput[], maxParallel?: number): Promise<TaskResult[]>;
76
+ /**
77
+ * Submit an approval decision for a task awaiting human review.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * await client.approveTask('task-abc123', 'approve');
82
+ * await client.approveTask('task-def456', 'reject', 'Too aggressive strategy');
83
+ * await client.approveTask('task-ghi789', 'modify', 'Use conservative approach instead');
84
+ * ```
85
+ */
86
+ approveTask(taskId: string, decision: 'approve' | 'reject' | 'modify', feedback?: string): Promise<void>;
87
+ /**
88
+ * Retrieve all tasks currently awaiting human approval.
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const approvals = await client.getPendingApprovals();
93
+ * for (const approval of approvals) {
94
+ * console.log(`${approval.taskId}: ${approval.description}`);
95
+ * }
96
+ * ```
97
+ */
98
+ getPendingApprovals(): Promise<Approval[]>;
99
+ /**
100
+ * Deploy a pre-built workflow template with custom inputs.
101
+ * Returns the workflow ID for tracking.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const workflowId = await client.deployTemplate('legal-contract-review-v1', {
106
+ * contract_file: './contract.pdf',
107
+ * jurisdiction: 'US-NY',
108
+ * });
109
+ * ```
110
+ */
111
+ deployTemplate(templateId: string, inputs: Record<string, unknown>): Promise<string>;
112
+ /**
113
+ * List available workflow templates with optional filtering.
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const templates = await client.listTemplates({ industry: 'legal', category: 'review' });
118
+ * ```
119
+ */
120
+ listTemplates(filter?: TemplateFilter): Promise<Template[]>;
121
+ /**
122
+ * Get the current status of a task, including progress and logs.
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const status = await client.getTaskStatus('task-abc123');
127
+ * console.log(`${status.status} - ${status.progress}%`);
128
+ * ```
129
+ */
130
+ getTaskStatus(taskId: string): Promise<TaskStatus>;
131
+ /**
132
+ * List all registered worker nodes and their current state.
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const workers = await client.getWorkers();
137
+ * const online = workers.filter(w => w.online);
138
+ * console.log(`${online.length}/${workers.length} workers online`);
139
+ * ```
140
+ */
141
+ getWorkers(): Promise<Worker[]>;
142
+ /**
143
+ * Subscribe to task completion events via polling. Returns an unsubscribe
144
+ * function.
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const unsubscribe = client.onTaskComplete((result) => {
149
+ * console.log(`Task ${result.taskId} completed: ${result.status}`);
150
+ * });
151
+ *
152
+ * // Later, stop listening
153
+ * unsubscribe();
154
+ * ```
155
+ */
156
+ onTaskComplete(callback: TaskCompleteCallback): () => void;
157
+ /**
158
+ * Disconnect the client and clean up all background polling.
159
+ */
160
+ disconnect(): void;
161
+ private request;
162
+ }
163
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,MAAM,EACN,UAAU,EACV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAcpB,qBAAa,YAAa,SAAQ,KAAK;aAGnB,IAAI,EAAE,MAAM;aACZ,UAAU,CAAC,EAAE,MAAM;aACnB,SAAS,CAAC,EAAE,MAAM;gBAHlC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,SAAS,CAAC,EAAE,MAAM,YAAA;CAKrC;AAED,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,GAAE,MAA4B;CAIlD;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,gBAAgB,CAAkD;gBAE9D,OAAO,EAAE,oBAAoB;IAoBzC;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBvD;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAwDhD;;;;;;;;;;;OAWG;IACG,aAAa,CACjB,KAAK,EAAE,SAAS,EAAE,EAClB,WAAW,GAAE,MAAU,GACtB,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBxB;;;;;;;;;OASG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,EACzC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAgBhB;;;;;;;;;;OAUG;IACG,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUhD;;;;;;;;;;;OAWG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC;IAqBlB;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAejE;;;;;;;;OAQG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAYxD;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQrC;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAsC1D;;OAEG;IACH,UAAU,IAAI,IAAI;YAWJ,OAAO;CAqFtB"}