@dobbyai/mcp-external 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.
Files changed (58) hide show
  1. package/README.md +527 -0
  2. package/dist/connectors/claude-desktop.d.ts +26 -0
  3. package/dist/connectors/claude-desktop.d.ts.map +1 -0
  4. package/dist/connectors/claude-desktop.js +133 -0
  5. package/dist/connectors/claude-desktop.js.map +1 -0
  6. package/dist/connectors/cursor.d.ts +25 -0
  7. package/dist/connectors/cursor.d.ts.map +1 -0
  8. package/dist/connectors/cursor.js +115 -0
  9. package/dist/connectors/cursor.js.map +1 -0
  10. package/dist/connectors/index.d.ts +11 -0
  11. package/dist/connectors/index.d.ts.map +1 -0
  12. package/dist/connectors/index.js +11 -0
  13. package/dist/connectors/index.js.map +1 -0
  14. package/dist/connectors/setup.d.ts +12 -0
  15. package/dist/connectors/setup.d.ts.map +1 -0
  16. package/dist/connectors/setup.js +230 -0
  17. package/dist/connectors/setup.js.map +1 -0
  18. package/dist/connectors/vscode.d.ts +25 -0
  19. package/dist/connectors/vscode.d.ts.map +1 -0
  20. package/dist/connectors/vscode.js +63 -0
  21. package/dist/connectors/vscode.js.map +1 -0
  22. package/dist/connectors/windsurf.d.ts +25 -0
  23. package/dist/connectors/windsurf.d.ts.map +1 -0
  24. package/dist/connectors/windsurf.js +115 -0
  25. package/dist/connectors/windsurf.js.map +1 -0
  26. package/dist/index.d.ts +14 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +185 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/dobby-client.d.ts +195 -0
  31. package/dist/lib/dobby-client.d.ts.map +1 -0
  32. package/dist/lib/dobby-client.js +219 -0
  33. package/dist/lib/dobby-client.js.map +1 -0
  34. package/dist/prompts/index.d.ts +25 -0
  35. package/dist/prompts/index.d.ts.map +1 -0
  36. package/dist/prompts/index.js +208 -0
  37. package/dist/prompts/index.js.map +1 -0
  38. package/dist/resources/index.d.ts +27 -0
  39. package/dist/resources/index.d.ts.map +1 -0
  40. package/dist/resources/index.js +182 -0
  41. package/dist/resources/index.js.map +1 -0
  42. package/dist/tools/approvals.d.ts +104 -0
  43. package/dist/tools/approvals.d.ts.map +1 -0
  44. package/dist/tools/approvals.js +164 -0
  45. package/dist/tools/approvals.js.map +1 -0
  46. package/dist/tools/index.d.ts +260 -0
  47. package/dist/tools/index.d.ts.map +1 -0
  48. package/dist/tools/index.js +215 -0
  49. package/dist/tools/index.js.map +1 -0
  50. package/dist/tools/messages.d.ts +68 -0
  51. package/dist/tools/messages.d.ts.map +1 -0
  52. package/dist/tools/messages.js +105 -0
  53. package/dist/tools/messages.js.map +1 -0
  54. package/dist/tools/tasks.d.ts +180 -0
  55. package/dist/tools/tasks.d.ts.map +1 -0
  56. package/dist/tools/tasks.js +344 -0
  57. package/dist/tools/tasks.js.map +1 -0
  58. package/package.json +62 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Windsurf IDE Connector
3
+ *
4
+ * Generates and installs configuration for Windsurf (Codeium's IDE).
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ // ============================================
10
+ // Config Paths
11
+ // ============================================
12
+ function getConfigPath() {
13
+ const platform = os.platform();
14
+ if (platform === 'darwin') {
15
+ return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');
16
+ }
17
+ else if (platform === 'win32') {
18
+ return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');
19
+ }
20
+ else {
21
+ // Linux
22
+ return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');
23
+ }
24
+ }
25
+ export function generateWindsurfConfig(credentials) {
26
+ return {
27
+ mcpServers: {
28
+ dobby: {
29
+ command: 'npx',
30
+ args: ['-y', '@dobbyai/mcp-external'],
31
+ env: {
32
+ DOBBY_API_URL: credentials.apiUrl,
33
+ DOBBY_API_KEY: credentials.apiKey,
34
+ DOBBY_TENANT_ID: credentials.tenantId,
35
+ },
36
+ },
37
+ },
38
+ };
39
+ }
40
+ // ============================================
41
+ // Config Installation
42
+ // ============================================
43
+ export async function installWindsurfConfig(newConfig) {
44
+ try {
45
+ const configPath = getConfigPath();
46
+ const configDir = path.dirname(configPath);
47
+ // Create directory if it doesn't exist
48
+ if (!fs.existsSync(configDir)) {
49
+ fs.mkdirSync(configDir, { recursive: true });
50
+ }
51
+ // Read existing config or create empty
52
+ let existingConfig = {};
53
+ if (fs.existsSync(configPath)) {
54
+ const content = fs.readFileSync(configPath, 'utf-8');
55
+ existingConfig = JSON.parse(content);
56
+ }
57
+ // Merge configs
58
+ const mergedConfig = {
59
+ ...existingConfig,
60
+ mcpServers: {
61
+ ...existingConfig.mcpServers,
62
+ ...newConfig.mcpServers,
63
+ },
64
+ };
65
+ // Write config
66
+ fs.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));
67
+ return true;
68
+ }
69
+ catch (error) {
70
+ console.error('Failed to install Windsurf config:', error);
71
+ return false;
72
+ }
73
+ }
74
+ // ============================================
75
+ // CLI Entry Point
76
+ // ============================================
77
+ // CLI Entry - ESM compatible
78
+ const isMain = process.argv[1]?.includes('windsurf');
79
+ if (isMain) {
80
+ const args = process.argv.slice(2);
81
+ if (args.includes('--setup')) {
82
+ const apiUrl = process.env.DOBBY_API_URL || 'https://app.dobby.ai';
83
+ const apiKey = process.env.DOBBY_API_KEY;
84
+ const tenantId = process.env.DOBBY_TENANT_ID;
85
+ if (!apiKey || !tenantId) {
86
+ console.error('Error: DOBBY_API_KEY and DOBBY_TENANT_ID are required');
87
+ process.exit(1);
88
+ }
89
+ const config = generateWindsurfConfig({ apiUrl, apiKey, tenantId });
90
+ const success = await installWindsurfConfig(config);
91
+ if (success) {
92
+ console.log('✅ Windsurf configured for Dobby');
93
+ console.log(' Restart Windsurf to apply changes.');
94
+ }
95
+ else {
96
+ console.error('❌ Failed to configure Windsurf');
97
+ }
98
+ }
99
+ else if (args.includes('--show')) {
100
+ const config = generateWindsurfConfig({
101
+ apiUrl: process.env.DOBBY_API_URL || 'https://app.dobby.ai',
102
+ apiKey: process.env.DOBBY_API_KEY || '<YOUR_API_KEY>',
103
+ tenantId: process.env.DOBBY_TENANT_ID || '<YOUR_TENANT_ID>',
104
+ });
105
+ console.log(JSON.stringify(config, null, 2));
106
+ }
107
+ else {
108
+ console.log('Windsurf Connector for Dobby');
109
+ console.log('');
110
+ console.log('Usage:');
111
+ console.log(' --setup Install config (requires DOBBY_API_KEY, DOBBY_TENANT_ID)');
112
+ console.log(' --show Show config template');
113
+ }
114
+ }
115
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/connectors/windsurf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Dobby MCP Server
4
+ *
5
+ * Model Context Protocol server for Dobby AI Platform.
6
+ * Enables access from Claude Desktop, Cursor, Windsurf, and other MCP clients.
7
+ *
8
+ * Usage:
9
+ * npx @dobbyai/mcp-external # STDIO mode (default)
10
+ * npx @dobbyai/mcp-external --transport http # HTTP mode
11
+ * npx @dobbyai/mcp-external --setup # Interactive setup
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
package/dist/index.js ADDED
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Dobby MCP Server
4
+ *
5
+ * Model Context Protocol server for Dobby AI Platform.
6
+ * Enables access from Claude Desktop, Cursor, Windsurf, and other MCP clients.
7
+ *
8
+ * Usage:
9
+ * npx @dobbyai/mcp-external # STDIO mode (default)
10
+ * npx @dobbyai/mcp-external --transport http # HTTP mode
11
+ * npx @dobbyai/mcp-external --setup # Interactive setup
12
+ */
13
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
14
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
15
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
16
+ import { Command } from 'commander';
17
+ import dotenv from 'dotenv';
18
+ import { createDobbyClient } from './lib/dobby-client.js';
19
+ import { allTools, handleToolCall } from './tools/index.js';
20
+ import { resourceDefinitions, resourceTemplates, handleResourceRead } from './resources/index.js';
21
+ import { promptDefinitions, handlePromptGet } from './prompts/index.js';
22
+ // Load environment variables
23
+ dotenv.config();
24
+ // ============================================
25
+ // CLI Setup
26
+ // ============================================
27
+ const program = new Command();
28
+ program
29
+ .name('dobby-mcp')
30
+ .description('Dobby MCP Server - Connect to Dobby from any MCP client')
31
+ .version('1.0.0')
32
+ .option('-t, --transport <type>', 'Transport type: stdio or http', 'stdio')
33
+ .option('-p, --port <number>', 'HTTP server port (for http transport)', '3001')
34
+ .option('--api-url <url>', 'Dobby API URL', process.env.DOBBY_API_URL)
35
+ .option('--api-key <key>', 'Dobby API Key', process.env.DOBBY_API_KEY)
36
+ .option('--tenant-id <id>', 'Dobby Tenant ID', process.env.DOBBY_TENANT_ID)
37
+ .option('--setup', 'Run interactive setup')
38
+ .parse();
39
+ const options = program.opts();
40
+ // ============================================
41
+ // Server Setup
42
+ // ============================================
43
+ async function createServer() {
44
+ // Create Dobby client
45
+ const client = createDobbyClient({
46
+ apiUrl: options.apiUrl,
47
+ apiKey: options.apiKey,
48
+ tenantId: options.tenantId,
49
+ });
50
+ // Create MCP server
51
+ const server = new Server({
52
+ name: 'dobby-mcp-server',
53
+ version: '1.0.0',
54
+ }, {
55
+ capabilities: {
56
+ tools: {},
57
+ resources: {},
58
+ prompts: {},
59
+ },
60
+ });
61
+ // User context (can be expanded with actual auth)
62
+ const userContext = {
63
+ userId: process.env.DOBBY_USER_ID || 'mcp-user',
64
+ userName: process.env.DOBBY_USER_NAME || 'MCP User',
65
+ };
66
+ // ============================================
67
+ // Tools Handler
68
+ // ============================================
69
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
70
+ return {
71
+ tools: Object.values(allTools).map((tool) => ({
72
+ name: tool.name,
73
+ description: tool.description,
74
+ inputSchema: tool.inputSchema,
75
+ })),
76
+ };
77
+ });
78
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
79
+ const { name, arguments: args } = request.params;
80
+ try {
81
+ const result = await handleToolCall(name, args || {}, {
82
+ client,
83
+ userId: userContext.userId,
84
+ userName: userContext.userName,
85
+ });
86
+ return result;
87
+ }
88
+ catch (error) {
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: `Error: ${error.message}`,
94
+ },
95
+ ],
96
+ isError: true,
97
+ };
98
+ }
99
+ });
100
+ // ============================================
101
+ // Resources Handler
102
+ // ============================================
103
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
104
+ return {
105
+ resources: resourceDefinitions,
106
+ resourceTemplates: resourceTemplates,
107
+ };
108
+ });
109
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
110
+ const { uri } = request.params;
111
+ try {
112
+ return await handleResourceRead(uri, client);
113
+ }
114
+ catch (error) {
115
+ throw new Error(`Failed to read resource ${uri}: ${error.message}`);
116
+ }
117
+ });
118
+ // ============================================
119
+ // Prompts Handler
120
+ // ============================================
121
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
122
+ return {
123
+ prompts: promptDefinitions,
124
+ };
125
+ });
126
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
127
+ const { name, arguments: args } = request.params;
128
+ try {
129
+ return handlePromptGet(name, args || {});
130
+ }
131
+ catch (error) {
132
+ throw new Error(`Failed to get prompt ${name}: ${error.message}`);
133
+ }
134
+ });
135
+ return { server, client };
136
+ }
137
+ // ============================================
138
+ // Main Entry Point
139
+ // ============================================
140
+ async function main() {
141
+ // Handle setup mode
142
+ if (options.setup) {
143
+ const { runInteractiveSetup } = await import('./connectors/setup.js');
144
+ await runInteractiveSetup();
145
+ return;
146
+ }
147
+ console.error('Starting Dobby MCP Server...');
148
+ console.error(`Transport: ${options.transport}`);
149
+ try {
150
+ const { server, client } = await createServer();
151
+ // Verify connection
152
+ const healthy = await client.checkHealth();
153
+ if (!healthy) {
154
+ console.error('Warning: Could not connect to Dobby API');
155
+ }
156
+ else {
157
+ console.error('Connected to Dobby API');
158
+ }
159
+ if (options.transport === 'stdio') {
160
+ // STDIO transport (for Claude Desktop, Cursor, etc.)
161
+ const transport = new StdioServerTransport();
162
+ await server.connect(transport);
163
+ console.error('Dobby MCP Server running on STDIO');
164
+ }
165
+ else if (options.transport === 'http') {
166
+ // HTTP transport (for remote clients)
167
+ console.error(`HTTP transport on port ${options.port} - Not yet implemented`);
168
+ console.error('Use STDIO transport for now');
169
+ process.exit(1);
170
+ }
171
+ else {
172
+ console.error(`Unknown transport: ${options.transport}`);
173
+ process.exit(1);
174
+ }
175
+ }
176
+ catch (error) {
177
+ console.error('Failed to start server:', error.message);
178
+ process.exit(1);
179
+ }
180
+ }
181
+ main().catch((error) => {
182
+ console.error('Fatal error:', error);
183
+ process.exit(1);
184
+ });
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Dobby API Client
3
+ *
4
+ * Client for communicating with the Dobby API from the MCP server.
5
+ */
6
+ import { z } from 'zod';
7
+ export interface DobbyClientConfig {
8
+ apiUrl: string;
9
+ apiKey: string;
10
+ tenantId: string;
11
+ }
12
+ export declare const TaskSchema: z.ZodObject<{
13
+ task_id: z.ZodString;
14
+ tenant_id: z.ZodString;
15
+ title: z.ZodString;
16
+ description: z.ZodNullable<z.ZodString>;
17
+ status: z.ZodEnum<["pending", "in_progress", "completed", "failed", "cancelled"]>;
18
+ priority: z.ZodNullable<z.ZodEnum<["high", "medium", "low"]>>;
19
+ created_at: z.ZodString;
20
+ updated_at: z.ZodString;
21
+ pr_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
22
+ branch_name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ result_summary: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ task_id: string;
26
+ tenant_id: string;
27
+ title: string;
28
+ description: string | null;
29
+ status: "pending" | "in_progress" | "completed" | "failed" | "cancelled";
30
+ priority: "high" | "medium" | "low" | null;
31
+ created_at: string;
32
+ updated_at: string;
33
+ pr_url?: string | null | undefined;
34
+ branch_name?: string | null | undefined;
35
+ result_summary?: string | null | undefined;
36
+ }, {
37
+ task_id: string;
38
+ tenant_id: string;
39
+ title: string;
40
+ description: string | null;
41
+ status: "pending" | "in_progress" | "completed" | "failed" | "cancelled";
42
+ priority: "high" | "medium" | "low" | null;
43
+ created_at: string;
44
+ updated_at: string;
45
+ pr_url?: string | null | undefined;
46
+ branch_name?: string | null | undefined;
47
+ result_summary?: string | null | undefined;
48
+ }>;
49
+ export type Task = z.infer<typeof TaskSchema>;
50
+ export declare const MessageSchema: z.ZodObject<{
51
+ id: z.ZodString;
52
+ task_id: z.ZodString;
53
+ sender: z.ZodObject<{
54
+ type: z.ZodEnum<["user", "agent", "system"]>;
55
+ id: z.ZodString;
56
+ name: z.ZodString;
57
+ }, "strip", z.ZodTypeAny, {
58
+ type: "user" | "agent" | "system";
59
+ id: string;
60
+ name: string;
61
+ }, {
62
+ type: "user" | "agent" | "system";
63
+ id: string;
64
+ name: string;
65
+ }>;
66
+ message: z.ZodObject<{
67
+ type: z.ZodString;
68
+ content: z.ZodString;
69
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ type: string;
72
+ content: string;
73
+ metadata?: Record<string, any> | undefined;
74
+ }, {
75
+ type: string;
76
+ content: string;
77
+ metadata?: Record<string, any> | undefined;
78
+ }>;
79
+ created_at: z.ZodString;
80
+ }, "strip", z.ZodTypeAny, {
81
+ task_id: string;
82
+ message: {
83
+ type: string;
84
+ content: string;
85
+ metadata?: Record<string, any> | undefined;
86
+ };
87
+ created_at: string;
88
+ id: string;
89
+ sender: {
90
+ type: "user" | "agent" | "system";
91
+ id: string;
92
+ name: string;
93
+ };
94
+ }, {
95
+ task_id: string;
96
+ message: {
97
+ type: string;
98
+ content: string;
99
+ metadata?: Record<string, any> | undefined;
100
+ };
101
+ created_at: string;
102
+ id: string;
103
+ sender: {
104
+ type: "user" | "agent" | "system";
105
+ id: string;
106
+ name: string;
107
+ };
108
+ }>;
109
+ export type Message = z.infer<typeof MessageSchema>;
110
+ export declare const ApprovalSchema: z.ZodObject<{
111
+ id: z.ZodString;
112
+ task_id: z.ZodString;
113
+ approval_type: z.ZodString;
114
+ description: z.ZodString;
115
+ status: z.ZodEnum<["pending", "approved", "rejected"]>;
116
+ requested_by: z.ZodString;
117
+ created_at: z.ZodString;
118
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
119
+ }, "strip", z.ZodTypeAny, {
120
+ task_id: string;
121
+ description: string;
122
+ status: "pending" | "approved" | "rejected";
123
+ created_at: string;
124
+ id: string;
125
+ approval_type: string;
126
+ requested_by: string;
127
+ metadata?: Record<string, any> | undefined;
128
+ }, {
129
+ task_id: string;
130
+ description: string;
131
+ status: "pending" | "approved" | "rejected";
132
+ created_at: string;
133
+ id: string;
134
+ approval_type: string;
135
+ requested_by: string;
136
+ metadata?: Record<string, any> | undefined;
137
+ }>;
138
+ export type Approval = z.infer<typeof ApprovalSchema>;
139
+ export declare class DobbyClient {
140
+ private config;
141
+ constructor(config: DobbyClientConfig);
142
+ private fetch;
143
+ listTasks(options?: {
144
+ status?: string;
145
+ priority?: string;
146
+ limit?: number;
147
+ }): Promise<Task[]>;
148
+ getTask(taskId: string): Promise<Task | null>;
149
+ createTask(data: {
150
+ title: string;
151
+ description?: string;
152
+ priority?: 'high' | 'medium' | 'low';
153
+ link_to_task_id?: string;
154
+ }): Promise<{
155
+ task_id: string;
156
+ }>;
157
+ updateTask(taskId: string, updates: {
158
+ status?: string;
159
+ priority?: string;
160
+ }): Promise<void>;
161
+ getMessages(taskId: string, options?: {
162
+ limit?: number;
163
+ after?: string;
164
+ }): Promise<Message[]>;
165
+ sendMessage(taskId: string, data: {
166
+ content: string;
167
+ sender_id: string;
168
+ sender_name: string;
169
+ message_type?: string;
170
+ }): Promise<Message>;
171
+ getPendingApprovals(): Promise<Approval[]>;
172
+ approveTask(approvalId: string, note?: string): Promise<{
173
+ success: boolean;
174
+ message?: string;
175
+ }>;
176
+ rejectTask(approvalId: string, reason?: string): Promise<{
177
+ success: boolean;
178
+ message?: string;
179
+ }>;
180
+ getTaskTimeline(taskId: string): Promise<Array<{
181
+ event_id: string;
182
+ event_type: string;
183
+ agent_name: string | null;
184
+ agent_type: string | null;
185
+ details: Record<string, any>;
186
+ created_at: string;
187
+ }>>;
188
+ cancelTaskExecution(taskId: string): Promise<{
189
+ success: boolean;
190
+ message?: string;
191
+ }>;
192
+ checkHealth(): Promise<boolean>;
193
+ }
194
+ export declare function createDobbyClient(config?: Partial<DobbyClientConfig>): DobbyClient;
195
+ //# sourceMappingURL=dobby-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dobby-client.d.ts","sourceRoot":"","sources":["../../src/lib/dobby-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcxB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;EASzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMtD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;YAIvB,KAAK;IA2Bb,SAAS,CAAC,OAAO,GAAE;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAgBlB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW7C,UAAU,CAAC,IAAI,EAAE;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACrC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAe1B,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,IAAI,CAAC;IAeV,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,OAAO,CAAC,OAAO,EAAE,CAAC;IAef,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,OAAO,CAAC;IAoBb,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAQ1C,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB5C,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqB5C,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QACnD,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IAYG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAYpF,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAgBlF"}